From 0a987be1c7aac340333299c90751b10db77619fe Mon Sep 17 00:00:00 2001 From: Franco Barpp Gomes Date: Thu, 1 Feb 2024 11:38:00 -0300 Subject: [PATCH] Set up node project (#10) * chore: Set up node project based on incredible-squaring-avs * test: Add mocks * test: Add unit tests * test: Add integration tests * test: Add anvil test scripts and states * feat: Update bindings and add clean up to binding generation script * docs: Fix QuorumThresholdPercentage in docs * test: Add unit and integration test workflows * test: Print error on advanceChain error * test: Install npm dependencies in integration test workflow * fix: Fix utils setup contracts path * fix: Temporarily change quorum threshold denominator to 100 eigensdk currently hardcodes the denominator to 100 * test: Add contracts unit tests workflow * fix: Fix contracts path on bindings generation script * refactor: Rename cstaskmanager to taskmanager * feat: Update contract bindings --- .github/workflows/contracts-tests.yml | 36 + .github/workflows/integration-tests.yml | 38 + .github/workflows/unit-tests.yml | 19 + .gitignore | 31 +- Cargo.lock | 24 +- Makefile | 100 + aggregator/aggregator.go | 222 ++ aggregator/aggregator_test.go | 104 + aggregator/cmd/main.go | 64 + aggregator/mocks/chain.go | 75 + aggregator/rpc_server.go | 71 + aggregator/rpc_server_test.go | 93 + aggregator/types/types.go | 24 + cli/actions/deposit_into_strategy.go | 54 + cli/actions/print_operator_status.go | 42 + cli/actions/register_operator_with_avs.go | 56 + .../register_operator_with_eigenlayer.go | 43 + cli/main.go | 67 + config-files/aggregator-docker-compose.yaml | 6 + config-files/aggregator.yaml | 6 + config-files/challenger.yaml | 4 + .../operator-docker-compose.anvil.yaml | 49 + config-files/operator.anvil.yaml | 43 + contracts/bindings/ERC20Mock/binding.go | 688 ++++ .../bindings/SFFLRegistryRollup/binding.go | 963 +++++ .../bindings/SFFLServiceManager/binding.go | 1066 +++++ contracts/bindings/SFFLTaskManager/binding.go | 2724 +++++++++++++ contracts/evm/src/eth/SFFLTaskManager.sol | 4 +- contracts/evm/src/rollup/utils/Operators.sol | 2 +- contracts/evm/test/SFFLRegistryRollup.t.sol | 10 +- contracts/generate-go-bindings.sh | 31 + core/chainio/avs_reader.go | 76 + core/chainio/avs_subscriber.go | 80 + core/chainio/avs_writer.go | 148 + core/chainio/bindings.go | 65 + core/chainio/gen.go | 5 + core/chainio/mocks/avs_reader.go | 214 ++ core/chainio/mocks/avs_subscriber.go | 84 + core/chainio/mocks/avs_writer.go | 137 + core/config/config.go | 189 + core/utils.go | 83 + go.mod | 114 + go.sum | 594 +++ .../provisioning/dashboards/AVSs/sffl.json | 326 ++ .../dashboards/dashboard_provider.yml | 17 + .../dashboards/system/monitor_prometheus.json | 3412 +++++++++++++++++ .../provisioning/datasources/datasource.yml | 12 + metrics/metrics.go | 52 + metrics/noopmetrics.go | 19 + operator/cmd/main.go | 63 + operator/gen.go | 3 + operator/mocks/rpc_client.go | 51 + operator/operator.go | 340 ++ operator/operator_test.go | 116 + operator/registration.go | 183 + operator/registration_test.go | 54 + operator/rpc_client.go | 77 + plugin/cmd/main.go | 240 ++ prometheus/prometheus.yml | 27 + tests/anvil/README.md | 21 + ...s-and-eigenlayer-deployed-anvil-state.json | 1 + .../data/eigenlayer-deployed-anvil-state.json | 1 + tests/anvil/data/genesis.json | 49 + tests/anvil/deploy-avs-save-anvil-state.sh | 27 + .../deploy-eigenlayer-save-anvil-state.sh | 20 + tests/anvil/operator-registration.sh | 3 + ...rt-anvil-chain-with-el-and-avs-deployed.sh | 25 + tests/integration/integration_test.go | 246 ++ tests/keys/test.bls.key.json | 1 + tests/keys/test.ecdsa.key.json | 1 + tests/utils.go | 42 + types/avs_config.go | 20 + 72 files changed, 13984 insertions(+), 13 deletions(-) create mode 100644 .github/workflows/contracts-tests.yml create mode 100644 .github/workflows/integration-tests.yml create mode 100644 .github/workflows/unit-tests.yml create mode 100644 Makefile create mode 100644 aggregator/aggregator.go create mode 100644 aggregator/aggregator_test.go create mode 100644 aggregator/cmd/main.go create mode 100644 aggregator/mocks/chain.go create mode 100644 aggregator/rpc_server.go create mode 100644 aggregator/rpc_server_test.go create mode 100644 aggregator/types/types.go create mode 100644 cli/actions/deposit_into_strategy.go create mode 100644 cli/actions/print_operator_status.go create mode 100644 cli/actions/register_operator_with_avs.go create mode 100644 cli/actions/register_operator_with_eigenlayer.go create mode 100644 cli/main.go create mode 100644 config-files/aggregator-docker-compose.yaml create mode 100644 config-files/aggregator.yaml create mode 100644 config-files/challenger.yaml create mode 100644 config-files/operator-docker-compose.anvil.yaml create mode 100644 config-files/operator.anvil.yaml create mode 100644 contracts/bindings/ERC20Mock/binding.go create mode 100644 contracts/bindings/SFFLRegistryRollup/binding.go create mode 100644 contracts/bindings/SFFLServiceManager/binding.go create mode 100644 contracts/bindings/SFFLTaskManager/binding.go create mode 100644 contracts/generate-go-bindings.sh create mode 100644 core/chainio/avs_reader.go create mode 100644 core/chainio/avs_subscriber.go create mode 100644 core/chainio/avs_writer.go create mode 100644 core/chainio/bindings.go create mode 100644 core/chainio/gen.go create mode 100644 core/chainio/mocks/avs_reader.go create mode 100644 core/chainio/mocks/avs_subscriber.go create mode 100644 core/chainio/mocks/avs_writer.go create mode 100644 core/config/config.go create mode 100644 core/utils.go create mode 100644 go.mod create mode 100644 go.sum create mode 100644 grafana/provisioning/dashboards/AVSs/sffl.json create mode 100644 grafana/provisioning/dashboards/dashboard_provider.yml create mode 100644 grafana/provisioning/dashboards/system/monitor_prometheus.json create mode 100644 grafana/provisioning/datasources/datasource.yml create mode 100644 metrics/metrics.go create mode 100644 metrics/noopmetrics.go create mode 100644 operator/cmd/main.go create mode 100644 operator/gen.go create mode 100644 operator/mocks/rpc_client.go create mode 100644 operator/operator.go create mode 100644 operator/operator_test.go create mode 100644 operator/registration.go create mode 100644 operator/registration_test.go create mode 100644 operator/rpc_client.go create mode 100644 plugin/cmd/main.go create mode 100644 prometheus/prometheus.yml create mode 100644 tests/anvil/README.md create mode 100644 tests/anvil/data/avs-and-eigenlayer-deployed-anvil-state.json create mode 100644 tests/anvil/data/eigenlayer-deployed-anvil-state.json create mode 100644 tests/anvil/data/genesis.json create mode 100644 tests/anvil/deploy-avs-save-anvil-state.sh create mode 100755 tests/anvil/deploy-eigenlayer-save-anvil-state.sh create mode 100644 tests/anvil/operator-registration.sh create mode 100755 tests/anvil/start-anvil-chain-with-el-and-avs-deployed.sh create mode 100644 tests/integration/integration_test.go create mode 100644 tests/keys/test.bls.key.json create mode 100644 tests/keys/test.ecdsa.key.json create mode 100644 tests/utils.go create mode 100644 types/avs_config.go diff --git a/.github/workflows/contracts-tests.yml b/.github/workflows/contracts-tests.yml new file mode 100644 index 00000000..11af5031 --- /dev/null +++ b/.github/workflows/contracts-tests.yml @@ -0,0 +1,36 @@ +name: contracts-forge-tests + +on: + push: + branches: + - main + pull_request: + +jobs: + Test: + name: Contracts Forge Test + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + + - name: Install Node.js + uses: actions/setup-node@v3 + with: + node-version: '20.x' + + - name: Install npm dependencies + run: npm ci + working-directory: ./contracts/evm + + - name: Install Foundry + uses: foundry-rs/foundry-toolchain@v1 + with: + version: nightly + + - name: Install forge dependencies + run: forge install + working-directory: ./contracts/evm + + - name: Run tests + run: forge test -vvv --no-match-contract FFI + working-directory: ./contracts/evm diff --git a/.github/workflows/integration-tests.yml b/.github/workflows/integration-tests.yml new file mode 100644 index 00000000..5fa88c46 --- /dev/null +++ b/.github/workflows/integration-tests.yml @@ -0,0 +1,38 @@ + +name: integration-tests + +on: + push: + branches: + - master + pull_request: + +jobs: + Test: + name: Integration Test + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + - uses: actions/setup-go@v4 + with: + go-version: '1.21' + + - name: Install Node.js + uses: actions/setup-node@v3 + with: + node-version: '20.x' + + - name: Install npm dependencies + run: npm ci + working-directory: ./contracts/evm + + - name: Install Foundry + uses: foundry-rs/foundry-toolchain@v1 + with: + version: nightly + - name: Install forge dependencies + run: forge install + working-directory: ./contracts/evm + + - name: Test + run: make tests-integration \ No newline at end of file diff --git a/.github/workflows/unit-tests.yml b/.github/workflows/unit-tests.yml new file mode 100644 index 00000000..e3ff4e0b --- /dev/null +++ b/.github/workflows/unit-tests.yml @@ -0,0 +1,19 @@ +name: unit-tests + +on: + push: + branches: + - main + pull_request: + +jobs: + Test: + name: Unit Test + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + - uses: actions/setup-go@v4 + with: + go-version: '1.21' + - name: Test + run: make tests-unit diff --git a/.gitignore b/.gitignore index 92ae7f38..0fa41cb8 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,34 @@ +# If you prefer the allow list template instead of the deny list, see community template: +# https://github.com/github/gitignore/blob/main/community/Golang/Go.AllowList.gitignore +# +# Binaries for programs and plugins +*.exe +*.exe~ +*.dll +*.so +*.dylib + +# Test binary, built with `go test -c` +*.test + +# Output of the go coverage tool, specifically when used with LiteIDE +*.out + +# Dependency directories (remove the comment below to include it) +# vendor/ + +# Go workspace file +go.work +coverage.html + +# log files +logs.txt + # compilation artifacts target # IDE -.idea \ No newline at end of file +.idea + +# just for example +id_rsa diff --git a/Cargo.lock b/Cargo.lock index 5cd5e1bc..ece02950 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -906,6 +906,17 @@ dependencies = [ "tracing", ] +[[package]] +name = "bls-utils" +version = "0.1.0" +dependencies = [ + "clap 4.4.11", + "rand 0.8.5", + "serde", + "serde_json", + "zeropool-bn", +] + [[package]] name = "borsh" version = "0.9.3" @@ -5684,9 +5695,9 @@ checksum = "388a1df253eca08550bef6c72392cfe7c30914bf41df5269b68cbd6ff8f570a3" [[package]] name = "serde" -version = "1.0.193" +version = "1.0.196" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "25dd9975e68d0cb5aa1120c288333fc98731bd1dd12f561e468ea4728c042b89" +checksum = "870026e60fa08c69f064aa766c10f10b1d62db9ccd4d0abb206472bee0ce3b32" dependencies = [ "serde_derive", ] @@ -5724,9 +5735,9 @@ dependencies = [ [[package]] name = "serde_derive" -version = "1.0.193" +version = "1.0.196" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43576ca501357b9b071ac53cdc7da8ef0cbd9493d8df094cd821777ea6e894d3" +checksum = "33c85360c95e7d137454dc81d9a4ed2b8efd8fbe19cee57357b32b9771fccb67" dependencies = [ "proc-macro2", "quote", @@ -7700,9 +7711,9 @@ dependencies = [ [[package]] name = "zeroize" -version = "1.3.0" +version = "1.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4756f7db3f7b5574938c3eb1c117038b8e07f95ee6718c0efad4ac21508f1efd" +checksum = "525b4ec142c6b68a2d10f01f7bbf6755599ca3f81ea53b8431b7dd348f5fdb2d" [[package]] name = "zeropool-bn" @@ -7710,6 +7721,7 @@ version = "0.5.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "71e61de68ede9ffdd69c01664f65a178c5188b73f78faa21f0936016a888ff7c" dependencies = [ + "borsh 0.9.3", "byteorder", "crunchy", "lazy_static", diff --git a/Makefile b/Makefile new file mode 100644 index 00000000..98e15a6e --- /dev/null +++ b/Makefile @@ -0,0 +1,100 @@ +############################# HELP MESSAGE ############################# +# Make sure the help command stays first, so that it's printed by default when `make` is called without arguments +.PHONY: help tests +help: + @grep -E '^[a-zA-Z0-9_-]+:.*?## .*$$' $(MAKEFILE_LIST) | awk 'BEGIN {FS = ":.*?## "}; {printf "\033[36m%-30s\033[0m %s\n", $$1, $$2}' + +AGGREGATOR_ECDSA_PRIV_KEY=0x2a871d0798f97d79848a013d4936a73bf4cc922c825d33c1cf7073dff6d409c6 +CHALLENGER_ECDSA_PRIV_KEY=0x5de4111afa1a4b94908f83103eb1f1706367c2e68ca870fc3fb9a804cdab365a + +CHAINID=31337 +# Make sure to update this if the strategy address changes +# check in contracts/script/output/${CHAINID}/sffl_avs_deployment_output.json +STRATEGY_ADDRESS=0x7a2088a1bFc9d81c55368AE168C2C02570cB814F +DEPLOYMENT_FILES_DIR=contracts/evm/script/output/${CHAINID} + +-----------------------------: ## + +___CONTRACTS___: ## + +deploy-eigenlayer-contracts-to-anvil-and-save-state: ## Deploy eigenlayer + ./tests/anvil/deploy-eigenlayer-save-anvil-state.sh + +deploy-sffl-contracts-to-anvil-and-save-state: ## Deploy avs + ./tests/anvil/deploy-avs-save-anvil-state.sh + +deploy-all-to-anvil-and-save-state: deploy-eigenlayer-contracts-to-anvil-and-save-state deploy-sffl-contracts-to-anvil-and-save-state ## deploy eigenlayer, shared avs contracts, and inc-sq contracts + +start-anvil-chain-with-el-and-avs-deployed: ## starts anvil from a saved state file (with el and avs contracts deployed) + ./tests/anvil/start-anvil-chain-with-el-and-avs-deployed.sh + +bindings: ## generates contract bindings + cd contracts && ./generate-go-bindings.sh + +___DOCKER___: ## +docker-build-and-publish-images: ## builds and publishes operator and aggregator docker images using Ko + KO_DOCKER_REPO=ghcr.io/layr-labs/sffl ko build aggregator/cmd/main.go --preserve-import-paths + KO_DOCKER_REPO=ghcr.io/layr-labs/sffl ko build operator/cmd/main.go --preserve-import-paths +docker-start-everything: docker-build-and-publish-images ## starts aggregator and operator docker containers + docker compose pull && docker compose up + +__CLI__: ## + +cli-setup-operator: send-fund cli-register-operator-with-eigenlayer cli-deposit-into-mocktoken-strategy cli-register-operator-with-avs ## registers operator with eigenlayer and avs + +cli-register-operator-with-eigenlayer: ## registers operator with delegationManager + go run cli/main.go --config config-files/operator.anvil.yaml register-operator-with-eigenlayer + +cli-deposit-into-mocktoken-strategy: ## + ./scripts/deposit-into-mocktoken-strategy.sh + +cli-register-operator-with-avs: ## + go run cli/main.go --config config-files/operator.anvil.yaml register-operator-with-avs + +cli-deregister-operator-with-avs: ## + go run cli/main.go --config config-files/operator.anvil.yaml deregister-operator-with-avs + +cli-print-operator-status: ## + go run cli/main.go --config config-files/operator.anvil.yaml print-operator-status + +send-fund: ## sends fund to the operator saved in tests/keys/test.ecdsa.key.json + cast send 0x860B6912C2d0337ef05bbC89b0C2CB6CbAEAB4A5 --value 10ether --private-key 0x2a871d0798f97d79848a013d4936a73bf4cc922c825d33c1cf7073dff6d409c6 + +-----------------------------: ## +# We pipe all zapper logs through https://github.com/maoueh/zap-pretty so make sure to install it +# TODO: piping to zap-pretty only works when zapper environment is set to production, unsure why +____OFFCHAIN_SOFTWARE___: ## +start-aggregator: ## + go run aggregator/cmd/main.go --config config-files/aggregator.yaml \ + --sffl-deployment ${DEPLOYMENT_FILES_DIR}/sffl_avs_deployment_output.json \ + --ecdsa-private-key ${AGGREGATOR_ECDSA_PRIV_KEY} \ + 2>&1 | zap-pretty + +start-operator: ## + go run operator/cmd/main.go --config config-files/operator.anvil.yaml \ + 2>&1 | zap-pretty + +start-challenger: ## + go run challenger/cmd/main.go --config config-files/challenger.yaml \ + --sffl-deployment ${DEPLOYMENT_FILES_DIR}/sffl_avs_deployment_output.json \ + --ecdsa-private-key ${CHALLENGER_ECDSA_PRIV_KEY} \ + 2>&1 | zap-pretty + +run-plugin: ## + go run plugin/cmd/main.go --config config-files/operator.anvil.yaml +-----------------------------: ## +_____HELPER_____: ## +mocks: ## generates mocks for tests + go install go.uber.org/mock/mockgen@v0.3.0 + go generate ./... + +tests-unit: ## runs all unit tests + go test $$(go list ./... | grep -v /integration) -coverprofile=coverage.out -covermode=atomic --timeout 15s + go tool cover -html=coverage.out -o coverage.html + +tests-contract: ## runs all forge tests + cd contracts && forge test + +tests-integration: ## runs all integration tests + go test ./tests/integration/... -v -count=1 + diff --git a/aggregator/aggregator.go b/aggregator/aggregator.go new file mode 100644 index 00000000..16fc14fa --- /dev/null +++ b/aggregator/aggregator.go @@ -0,0 +1,222 @@ +package aggregator + +import ( + "context" + "sync" + "time" + + "github.com/Layr-Labs/eigensdk-go/logging" + + "github.com/Layr-Labs/eigensdk-go/chainio/clients" + sdkclients "github.com/Layr-Labs/eigensdk-go/chainio/clients" + "github.com/Layr-Labs/eigensdk-go/services/avsregistry" + blsagg "github.com/Layr-Labs/eigensdk-go/services/bls_aggregation" + oppubkeysserv "github.com/Layr-Labs/eigensdk-go/services/operatorpubkeys" + sdktypes "github.com/Layr-Labs/eigensdk-go/types" + "github.com/NethermindEth/near-sffl/aggregator/types" + "github.com/NethermindEth/near-sffl/core" + "github.com/NethermindEth/near-sffl/core/chainio" + "github.com/NethermindEth/near-sffl/core/config" + + taskmanager "github.com/NethermindEth/near-sffl/contracts/bindings/SFFLTaskManager" +) + +const ( + // number of blocks after which a task is considered expired + // this hardcoded here because it's also hardcoded in the contracts, but should + // ideally be fetched from the contracts + taskChallengeWindowBlock = 100 + blockTimeSeconds = 12 * time.Second + avsName = "super-fast-finality-layer" +) + +// Aggregator sends checkpoint tasks onchain, then listens for operator signed TaskResponses. +// It aggregates responses signatures, and if any of the TaskResponses reaches the QuorumThreshold for each quorum +// (currently we only use a single quorum of the ERC20Mock token), it sends the aggregated TaskResponse and signature onchain. +// +// The signature is checked in the BLSSignatureChecker.sol contract, which expects a +// +// struct NonSignerStakesAndSignature { +// uint32[] nonSignerQuorumBitmapIndices; +// BN254.G1Point[] nonSignerPubkeys; +// BN254.G1Point[] quorumApks; +// BN254.G2Point apkG2; +// BN254.G1Point sigma; +// uint32[] quorumApkIndices; +// uint32[] totalStakeIndices; +// uint32[][] nonSignerStakeIndices; // nonSignerStakeIndices[quorumNumberIndex][nonSignerIndex] +// } +// +// A task can only be responded onchain by having enough operators sign on it such that their stake in each quorum reaches the QuorumThreshold. +// In order to verify this onchain, the Registry contracts store the history of stakes and aggregate pubkeys (apks) for each operators and each quorum. These are +// updated everytime an operator registers or deregisters with the BLSRegistryCoordinatorWithIndices.sol contract, or calls UpdateStakes() on the StakeRegistry.sol contract, +// after having received new delegated shares or having delegated shares removed by stakers queuing withdrawals. Each of these pushes to their respective datatype array a new entry. +// +// This is true for quorumBitmaps (represent the quorums each operator is opted into), quorumApks (apks per quorum), totalStakes (total stake per quorum), and nonSignerStakes (stake per quorum per operator). +// The 4 "indices" in NonSignerStakesAndSignature basically represent the index at which to fetch their respective data, given a blockNumber at which the task was created. +// Note that different data types might have different indices, since for eg QuorumBitmaps are updated for operators registering/deregistering, but not for UpdateStakes. +// Thankfully, we have deployed a helper contract BLSOperatorStateRetriever.sol whose function getCheckSignaturesIndices() can be used to fetch the indices given a block number. +// +// The 4 other fields nonSignerPubkeys, quorumApks, apkG2, and sigma, however, must be computed individually. +// apkG2 and sigma are just the aggregated signature and pubkeys of the operators who signed the task response (aggregated over all quorums, so individual signatures might be duplicated). +// quorumApks are the G1 aggregated pubkeys of the operators who signed the task response, but one per quorum, as opposed to apkG2 which is summed over all quorums. +// nonSignerPubkeys are the G1 pubkeys of the operators who did not sign the task response, but were opted into the quorum at the blocknumber at which the task was created. +// Upon sending a task onchain (or receiving a CheckpointTaskCreated Event if the tasks were sent by an external task generator), the aggregator can get the list of all operators opted into each quorum at that +// block number by calling the getOperatorState() function of the BLSOperatorStateRetriever.sol contract. +type Aggregator struct { + logger logging.Logger + serverIpPortAddr string + avsWriter chainio.AvsWriterer + // aggregation related fields + blsAggregationService blsagg.BlsAggregationService + tasks map[types.TaskIndex]taskmanager.CheckpointTask + tasksMu sync.RWMutex + taskResponses map[types.TaskIndex]map[sdktypes.TaskResponseDigest]taskmanager.CheckpointTaskResponse + taskResponsesMu sync.RWMutex +} + +// NewAggregator creates a new Aggregator with the provided config. +func NewAggregator(c *config.Config) (*Aggregator, error) { + + avsReader, err := chainio.BuildAvsReaderFromConfig(c) + if err != nil { + c.Logger.Error("Cannot create avsReader", "err", err) + return nil, err + } + + avsWriter, err := chainio.BuildAvsWriterFromConfig(c) + if err != nil { + c.Logger.Errorf("Cannot create avsWriter", "err", err) + return nil, err + } + + chainioConfig := sdkclients.BuildAllConfig{ + EthHttpUrl: c.EthHttpRpcUrl, + EthWsUrl: c.EthWsRpcUrl, + RegistryCoordinatorAddr: c.SFFLRegistryCoordinatorAddr.String(), + OperatorStateRetrieverAddr: c.OperatorStateRetrieverAddr.String(), + AvsName: avsName, + PromMetricsIpPortAddress: ":9090", + } + clients, err := clients.BuildAll(chainioConfig, c.AggregatorAddress, c.SignerFn, c.Logger) + if err != nil { + c.Logger.Errorf("Cannot create sdk clients", "err", err) + return nil, err + } + + operatorPubkeysService := oppubkeysserv.NewOperatorPubkeysServiceInMemory(context.Background(), clients.AvsRegistryChainSubscriber, clients.AvsRegistryChainReader, c.Logger) + avsRegistryService := avsregistry.NewAvsRegistryServiceChainCaller(avsReader, operatorPubkeysService, c.Logger) + blsAggregationService := blsagg.NewBlsAggregatorService(avsRegistryService, c.Logger) + + return &Aggregator{ + logger: c.Logger, + serverIpPortAddr: c.AggregatorServerIpPortAddr, + avsWriter: avsWriter, + blsAggregationService: blsAggregationService, + tasks: make(map[types.TaskIndex]taskmanager.CheckpointTask), + taskResponses: make(map[types.TaskIndex]map[sdktypes.TaskResponseDigest]taskmanager.CheckpointTaskResponse), + }, nil +} + +func (agg *Aggregator) Start(ctx context.Context) error { + agg.logger.Infof("Starting aggregator.") + agg.logger.Infof("Starting aggregator rpc server.") + go agg.startServer(ctx) + + // TODO(soubhik): refactor task generation/sending into a separate function that we can run as goroutine + ticker := time.NewTicker(10 * time.Second) + agg.logger.Infof("Aggregator set to send new task every 10 seconds...") + defer ticker.Stop() + + // ticker doesn't tick immediately, so we send the first task here + // see https://github.com/golang/go/issues/17601 + + // TODO: make this based on the NEAR block + block := uint64(0) + _ = agg.sendNewCheckpointTask(block, block) + block++ + + for { + select { + case <-ctx.Done(): + return nil + case blsAggServiceResp := <-agg.blsAggregationService.GetResponseChannel(): + agg.logger.Info("Received response from blsAggregationService", "blsAggServiceResp", blsAggServiceResp) + agg.sendAggregatedResponseToContract(blsAggServiceResp) + case <-ticker.C: + err := agg.sendNewCheckpointTask(block, block) + block++ + if err != nil { + // we log the errors inside sendNewCheckpointTask() so here we just continue to the next task + continue + } + } + } +} + +func (agg *Aggregator) sendAggregatedResponseToContract(blsAggServiceResp blsagg.BlsAggregationServiceResponse) { + // TODO: check if blsAggServiceResp contains an err + if blsAggServiceResp.Err != nil { + agg.logger.Error("BlsAggregationServiceResponse contains an error", "err", blsAggServiceResp.Err) + // panicing to help with debugging (fail fast), but we shouldn't panic if we run this in production + panic(blsAggServiceResp.Err) + } + nonSignerPubkeys := []taskmanager.BN254G1Point{} + for _, nonSignerPubkey := range blsAggServiceResp.NonSignersPubkeysG1 { + nonSignerPubkeys = append(nonSignerPubkeys, core.ConvertToBN254G1Point(nonSignerPubkey)) + } + quorumApks := []taskmanager.BN254G1Point{} + for _, quorumApk := range blsAggServiceResp.QuorumApksG1 { + quorumApks = append(quorumApks, core.ConvertToBN254G1Point(quorumApk)) + } + nonSignerStakesAndSignature := taskmanager.IBLSSignatureCheckerNonSignerStakesAndSignature{ + NonSignerPubkeys: nonSignerPubkeys, + QuorumApks: quorumApks, + ApkG2: core.ConvertToBN254G2Point(blsAggServiceResp.SignersApkG2), + Sigma: core.ConvertToBN254G1Point(blsAggServiceResp.SignersAggSigG1.G1Point), + NonSignerQuorumBitmapIndices: blsAggServiceResp.NonSignerQuorumBitmapIndices, + QuorumApkIndices: blsAggServiceResp.QuorumApkIndices, + TotalStakeIndices: blsAggServiceResp.TotalStakeIndices, + NonSignerStakeIndices: blsAggServiceResp.NonSignerStakeIndices, + } + + agg.logger.Info("Threshold reached. Sending aggregated response onchain.", + "taskIndex", blsAggServiceResp.TaskIndex, + ) + agg.tasksMu.RLock() + task := agg.tasks[blsAggServiceResp.TaskIndex] + agg.tasksMu.RUnlock() + agg.taskResponsesMu.RLock() + taskResponse := agg.taskResponses[blsAggServiceResp.TaskIndex][blsAggServiceResp.TaskResponseDigest] + agg.taskResponsesMu.RUnlock() + _, err := agg.avsWriter.SendAggregatedResponse(context.Background(), task, taskResponse, nonSignerStakesAndSignature) + if err != nil { + agg.logger.Error("Aggregator failed to respond to task", "err", err) + } +} + +// sendNewCheckpointTask sends a new task to the task manager contract, and updates the Task dict struct +// with the information of operators opted into quorum 0 at the block of task creation. +func (agg *Aggregator) sendNewCheckpointTask(fromNearBlock uint64, toNearBlock uint64) error { + agg.logger.Info("Aggregator sending new task", "fromNearBlock", fromNearBlock, "toNearBlock", toNearBlock) + // Send checkpoint to the task manager contract + newTask, taskIndex, err := agg.avsWriter.SendNewCheckpointTask(context.Background(), fromNearBlock, toNearBlock, types.QUORUM_THRESHOLD_NUMERATOR, types.QUORUM_NUMBERS) + if err != nil { + agg.logger.Error("Aggregator failed to send checkpoint", "err", err) + return err + } + + agg.tasksMu.Lock() + agg.tasks[taskIndex] = newTask + agg.tasksMu.Unlock() + + quorumThresholds := make([]uint32, len(newTask.QuorumNumbers)) + for i, _ := range newTask.QuorumNumbers { + quorumThresholds[i] = newTask.QuorumThreshold + } + // TODO(samlaf): we use seconds for now, but we should ideally pass a blocknumber to the blsAggregationService + // and it should monitor the chain and only expire the task aggregation once the chain has reached that block number. + taskTimeToExpiry := taskChallengeWindowBlock * blockTimeSeconds + agg.blsAggregationService.InitializeNewTask(taskIndex, newTask.TaskCreatedBlock, newTask.QuorumNumbers, quorumThresholds, taskTimeToExpiry) + return nil +} diff --git a/aggregator/aggregator_test.go b/aggregator/aggregator_test.go new file mode 100644 index 00000000..a7cd95cf --- /dev/null +++ b/aggregator/aggregator_test.go @@ -0,0 +1,104 @@ +package aggregator + +import ( + "context" + "math/big" + "testing" + "time" + + "github.com/ethereum/go-ethereum/accounts/abi/bind/backends" + "github.com/ethereum/go-ethereum/common" + gethcore "github.com/ethereum/go-ethereum/core" + "github.com/stretchr/testify/assert" + "go.uber.org/mock/gomock" + + "github.com/Layr-Labs/eigensdk-go/crypto/bls" + sdklogging "github.com/Layr-Labs/eigensdk-go/logging" + blsaggservmock "github.com/Layr-Labs/eigensdk-go/services/mocks/blsagg" + sdktypes "github.com/Layr-Labs/eigensdk-go/types" + + "github.com/NethermindEth/near-sffl/aggregator/mocks" + "github.com/NethermindEth/near-sffl/aggregator/types" + taskmanager "github.com/NethermindEth/near-sffl/contracts/bindings/SFFLTaskManager" + chainiomocks "github.com/NethermindEth/near-sffl/core/chainio/mocks" +) + +var MOCK_OPERATOR_ID = [32]byte{207, 73, 226, 221, 104, 100, 123, 41, 192, 3, 9, 119, 90, 83, 233, 159, 231, 151, 245, 96, 150, 48, 144, 27, 102, 253, 39, 101, 1, 26, 135, 173} +var MOCK_OPERATOR_STAKE = big.NewInt(100) +var MOCK_OPERATOR_BLS_PRIVATE_KEY_STRING = "50" + +type MockTask struct { + TaskNum uint32 + BlockNumber uint32 + FromNearBlock uint64 + ToNearBlock uint64 +} + +func TestSendNewTask(t *testing.T) { + mockCtrl := gomock.NewController(t) + defer mockCtrl.Finish() + + MOCK_OPERATOR_BLS_PRIVATE_KEY, err := bls.NewPrivateKey(MOCK_OPERATOR_BLS_PRIVATE_KEY_STRING) + assert.Nil(t, err) + MOCK_OPERATOR_KEYPAIR := bls.NewKeyPair(MOCK_OPERATOR_BLS_PRIVATE_KEY) + MOCK_OPERATOR_G1PUBKEY := MOCK_OPERATOR_KEYPAIR.GetPubKeyG1() + MOCK_OPERATOR_G2PUBKEY := MOCK_OPERATOR_KEYPAIR.GetPubKeyG2() + + operatorPubkeyDict := map[bls.OperatorId]types.OperatorInfo{ + MOCK_OPERATOR_ID: { + OperatorPubkeys: sdktypes.OperatorPubkeys{ + G1Pubkey: MOCK_OPERATOR_G1PUBKEY, + G2Pubkey: MOCK_OPERATOR_G2PUBKEY, + }, + OperatorAddr: common.Address{}, + }, + } + + aggregator, mockAvsWriterer, mockBlsAggService, err := createMockAggregator(mockCtrl, operatorPubkeyDict) + assert.Nil(t, err) + + var TASK_INDEX = uint32(0) + var BLOCK_NUMBER = uint32(100) + var FROM_NEAR_BLOCK = uint64(3) + var TO_NEAR_BLOCK = uint64(4) + + mockAvsWriterer.EXPECT().SendNewCheckpointTask( + context.Background(), FROM_NEAR_BLOCK, TO_NEAR_BLOCK, types.QUORUM_THRESHOLD_NUMERATOR, types.QUORUM_NUMBERS, + ).Return(mocks.MockSendNewCheckpointTask(BLOCK_NUMBER, TASK_INDEX, FROM_NEAR_BLOCK, TO_NEAR_BLOCK)) + + // 100 blocks, each takes 12 seconds. We hardcode for now since aggregator also hardcodes this value + taskTimeToExpiry := 100 * 12 * time.Second + // make sure that initializeNewTask was called on the blsAggService + // maybe there's a better way to do this? There's a saying "don't mock 3rd party code" + // see https://hynek.me/articles/what-to-mock-in-5-mins/ + mockBlsAggService.EXPECT().InitializeNewTask(TASK_INDEX, BLOCK_NUMBER, types.QUORUM_NUMBERS, []uint32{types.QUORUM_THRESHOLD_NUMERATOR}, taskTimeToExpiry) + + err = aggregator.sendNewCheckpointTask(FROM_NEAR_BLOCK, TO_NEAR_BLOCK) + assert.Nil(t, err) +} + +func createMockAggregator( + mockCtrl *gomock.Controller, operatorPubkeyDict map[bls.OperatorId]types.OperatorInfo, +) (*Aggregator, *chainiomocks.MockAvsWriterer, *blsaggservmock.MockBlsAggregationService, error) { + logger := sdklogging.NewNoopLogger() + mockAvsWriter := chainiomocks.NewMockAvsWriterer(mockCtrl) + mockBlsAggregationService := blsaggservmock.NewMockBlsAggregationService(mockCtrl) + + aggregator := &Aggregator{ + logger: logger, + avsWriter: mockAvsWriter, + blsAggregationService: mockBlsAggregationService, + tasks: make(map[types.TaskIndex]taskmanager.CheckpointTask), + taskResponses: make(map[types.TaskIndex]map[sdktypes.TaskResponseDigest]taskmanager.CheckpointTaskResponse), + } + return aggregator, mockAvsWriter, mockBlsAggregationService, nil +} + +// just a mock ethclient to pass to bindings +// so that we can access abi methods +func createMockEthClient() *backends.SimulatedBackend { + genesisAlloc := map[common.Address]gethcore.GenesisAccount{} + blockGasLimit := uint64(1000000) + client := backends.NewSimulatedBackend(genesisAlloc, blockGasLimit) + return client +} diff --git a/aggregator/cmd/main.go b/aggregator/cmd/main.go new file mode 100644 index 00000000..b90aa0f7 --- /dev/null +++ b/aggregator/cmd/main.go @@ -0,0 +1,64 @@ +package main + +import ( + "context" + "encoding/json" + "fmt" + "log" + "os" + + "github.com/urfave/cli" + + "github.com/NethermindEth/near-sffl/aggregator" + "github.com/NethermindEth/near-sffl/core/config" +) + +var ( + // Version is the version of the binary. + Version string + GitCommit string + GitDate string +) + +func main() { + + app := cli.NewApp() + app.Flags = config.Flags + app.Version = fmt.Sprintf("%s-%s-%s", Version, GitCommit, GitDate) + app.Name = "sffl" + app.Usage = "SFFL Aggregator" + app.Description = "Service that sends checkpoints to be signed by operator nodes." + + app.Action = aggregatorMain + err := app.Run(os.Args) + if err != nil { + log.Fatalln("Application failed.", "Message:", err) + } +} + +func aggregatorMain(ctx *cli.Context) error { + + log.Println("Initializing Aggregator") + config, err := config.NewConfig(ctx) + if err != nil { + return err + } + configJson, err := json.MarshalIndent(config, "", " ") + if err != nil { + config.Logger.Fatalf(err.Error()) + } + fmt.Println("Config:", string(configJson)) + + agg, err := aggregator.NewAggregator(config) + if err != nil { + return err + } + + err = agg.Start(context.Background()) + if err != nil { + return err + } + + return nil + +} diff --git a/aggregator/mocks/chain.go b/aggregator/mocks/chain.go new file mode 100644 index 00000000..869db1f8 --- /dev/null +++ b/aggregator/mocks/chain.go @@ -0,0 +1,75 @@ +package mocks + +import ( + "math/big" + + opstateretriever "github.com/Layr-Labs/eigensdk-go/contracts/bindings/OperatorStateRetriever" + "github.com/Layr-Labs/eigensdk-go/crypto/bls" + "github.com/NethermindEth/near-sffl/aggregator/types" + taskmanager "github.com/NethermindEth/near-sffl/contracts/bindings/SFFLTaskManager" +) + +// ====== TaskManager Mocks ====== + +func MockSendNewCheckpointTask(blockNum, taskNum uint32, fromNearBlock, toNearBlock uint64) (taskmanager.CheckpointTask, uint32, error) { + task := taskmanager.CheckpointTask{ + FromNearBlock: fromNearBlock, + ToNearBlock: toNearBlock, + TaskCreatedBlock: blockNum, + QuorumNumbers: types.QUORUM_NUMBERS, + QuorumThreshold: types.QUORUM_THRESHOLD_NUMERATOR, + } + + return task, taskNum, nil +} + +// ======= BLSOperatorStateRetriever Mocks ======= +type MockOperatorState struct { + OperatorId [32]byte + Stake *big.Int + G1Pubkey *bls.G1Point + G2Pubkey *bls.G2Point +} +type MockRegistry struct { + OperatorsState []MockOperatorState +} + +func (r *MockRegistry) GetOperatorsId() [][32]byte { + operatorIds := make([][32]byte, len(r.OperatorsState)) + for i, operatorState := range r.OperatorsState { + operatorIds[i] = operatorState.OperatorId + } + return operatorIds +} + +func (r *MockRegistry) GetOperatorsTotalStake() *big.Int { + totalStake := big.NewInt(0) + for _, operatorState := range r.OperatorsState { + totalStake.Add(totalStake, operatorState.Stake) + } + return totalStake +} + +// returns an array of operator states for each quorum number (only [0][] is used since we use a single quorum only) +// currently hardcoded for a single operator +func (r *MockRegistry) MockGetOperatorStateCall() [][]opstateretriever.OperatorStateRetrieverOperator { + quorum0OperatorStakes := make([]opstateretriever.OperatorStateRetrieverOperator, len(r.OperatorsState)) + for i, operatorState := range r.OperatorsState { + quorum0OperatorStakes[i] = opstateretriever.OperatorStateRetrieverOperator{ + OperatorId: operatorState.OperatorId, + Stake: operatorState.Stake, + } + } + return [][]opstateretriever.OperatorStateRetrieverOperator{ + quorum0OperatorStakes, + } +} + +// Aggregates the g1 pubkey of all operators in the mockregistry, assuming they are all registered for quorum0 +func (r *MockRegistry) AggregateG1Pubkey() *bls.G1Point { + aggregateG1Pubkey := bls.NewG1Point(big.NewInt(0), big.NewInt(0)) + for _, operatorState := range r.OperatorsState { + aggregateG1Pubkey.Add(operatorState.G1Pubkey) + } + return aggregateG1Pubkey +} diff --git a/aggregator/rpc_server.go b/aggregator/rpc_server.go new file mode 100644 index 00000000..31b64124 --- /dev/null +++ b/aggregator/rpc_server.go @@ -0,0 +1,71 @@ +package aggregator + +import ( + "context" + "errors" + "net/http" + "net/rpc" + + taskmanager "github.com/NethermindEth/near-sffl/contracts/bindings/SFFLTaskManager" + "github.com/NethermindEth/near-sffl/core" + + "github.com/Layr-Labs/eigensdk-go/crypto/bls" + sdktypes "github.com/Layr-Labs/eigensdk-go/types" +) + +var ( + TaskNotFoundError400 = errors.New("400. Task not found") + OperatorNotPartOfTaskQuorum400 = errors.New("400. Operator not part of quorum") + TaskResponseDigestNotFoundError500 = errors.New("500. Failed to get task response digest") + UnknownErrorWhileVerifyingSignature400 = errors.New("400. Failed to verify signature") + SignatureVerificationFailed400 = errors.New("400. Signature verification failed") + CallToGetCheckSignaturesIndicesFailed500 = errors.New("500. Failed to get check signatures indices") +) + +func (agg *Aggregator) startServer(ctx context.Context) error { + + err := rpc.Register(agg) + if err != nil { + agg.logger.Fatal("Format of service TaskManager isn't correct. ", "err", err) + } + rpc.HandleHTTP() + err = http.ListenAndServe(agg.serverIpPortAddr, nil) + if err != nil { + agg.logger.Fatal("ListenAndServe", "err", err) + } + + return nil +} + +type SignedCheckpointTaskResponse struct { + TaskResponse taskmanager.CheckpointTaskResponse + BlsSignature bls.Signature + OperatorId bls.OperatorId +} + +// rpc endpoint which is called by operator +// reply doesn't need to be checked. If there are no errors, the task response is accepted +// rpc framework forces a reply type to exist, so we put bool as a placeholder +func (agg *Aggregator) ProcessSignedCheckpointTaskResponse(signedCheckpointTaskResponse *SignedCheckpointTaskResponse, reply *bool) error { + agg.logger.Infof("Received signed task response: %#v", signedCheckpointTaskResponse) + taskIndex := signedCheckpointTaskResponse.TaskResponse.ReferenceTaskIndex + taskResponseDigest, err := core.GetCheckpointTaskResponseDigest(&signedCheckpointTaskResponse.TaskResponse) + if err != nil { + agg.logger.Error("Failed to get task response digest", "err", err) + return TaskResponseDigestNotFoundError500 + } + agg.taskResponsesMu.Lock() + if _, ok := agg.taskResponses[taskIndex]; !ok { + agg.taskResponses[taskIndex] = make(map[sdktypes.TaskResponseDigest]taskmanager.CheckpointTaskResponse) + } + if _, ok := agg.taskResponses[taskIndex][taskResponseDigest]; !ok { + agg.taskResponses[taskIndex][taskResponseDigest] = signedCheckpointTaskResponse.TaskResponse + } + agg.taskResponsesMu.Unlock() + + err = agg.blsAggregationService.ProcessNewSignature( + context.Background(), taskIndex, taskResponseDigest, + &signedCheckpointTaskResponse.BlsSignature, signedCheckpointTaskResponse.OperatorId, + ) + return err +} diff --git a/aggregator/rpc_server_test.go b/aggregator/rpc_server_test.go new file mode 100644 index 00000000..b5d44eee --- /dev/null +++ b/aggregator/rpc_server_test.go @@ -0,0 +1,93 @@ +package aggregator + +import ( + "context" + "encoding/binary" + "testing" + + "github.com/ethereum/go-ethereum/common" + "github.com/stretchr/testify/assert" + "go.uber.org/mock/gomock" + "golang.org/x/crypto/sha3" + + "github.com/Layr-Labs/eigensdk-go/crypto/bls" + sdktypes "github.com/Layr-Labs/eigensdk-go/types" + "github.com/NethermindEth/near-sffl/aggregator/types" + taskmanager "github.com/NethermindEth/near-sffl/contracts/bindings/SFFLTaskManager" + "github.com/NethermindEth/near-sffl/core" +) + +func TestProcessSignedCheckpointTaskResponse(t *testing.T) { + mockCtrl := gomock.NewController(t) + defer mockCtrl.Finish() + + var TASK_INDEX = uint32(0) + var BLOCK_NUMBER = uint32(100) + var FROM_NEAR_BLOCK = uint64(3) + var TO_NEAR_BLOCK = uint64(4) + + MOCK_OPERATOR_BLS_PRIVATE_KEY, err := bls.NewPrivateKey(MOCK_OPERATOR_BLS_PRIVATE_KEY_STRING) + assert.Nil(t, err) + MOCK_OPERATOR_KEYPAIR := bls.NewKeyPair(MOCK_OPERATOR_BLS_PRIVATE_KEY) + MOCK_OPERATOR_G1PUBKEY := MOCK_OPERATOR_KEYPAIR.GetPubKeyG1() + MOCK_OPERATOR_G2PUBKEY := MOCK_OPERATOR_KEYPAIR.GetPubKeyG2() + + operatorPubkeyDict := map[bls.OperatorId]types.OperatorInfo{ + MOCK_OPERATOR_ID: { + OperatorPubkeys: sdktypes.OperatorPubkeys{ + G1Pubkey: MOCK_OPERATOR_G1PUBKEY, + G2Pubkey: MOCK_OPERATOR_G2PUBKEY, + }, + OperatorAddr: common.Address{}, + }, + } + aggregator, _, mockBlsAggServ, err := createMockAggregator(mockCtrl, operatorPubkeyDict) + assert.Nil(t, err) + + signedCheckpointTaskResponse, err := createMockSignedCheckpointTaskResponse(MockTask{ + TaskNum: TASK_INDEX, + BlockNumber: BLOCK_NUMBER, + FromNearBlock: FROM_NEAR_BLOCK, + ToNearBlock: TO_NEAR_BLOCK, + }, *MOCK_OPERATOR_KEYPAIR) + assert.Nil(t, err) + signedCheckpointTaskResponseDigest, err := core.GetCheckpointTaskResponseDigest(&signedCheckpointTaskResponse.TaskResponse) + assert.Nil(t, err) + + // TODO(samlaf): is this the right way to test writing to external service? + // or is there some wisdom to "don't mock 3rd party code"? + // see https://hynek.me/articles/what-to-mock-in-5-mins/ + mockBlsAggServ.EXPECT().ProcessNewSignature(context.Background(), TASK_INDEX, signedCheckpointTaskResponseDigest, + &signedCheckpointTaskResponse.BlsSignature, signedCheckpointTaskResponse.OperatorId) + err = aggregator.ProcessSignedCheckpointTaskResponse(signedCheckpointTaskResponse, nil) + assert.Nil(t, err) +} + +func keccak256(num uint64) [32]byte { + var hash [32]byte + hasher := sha3.NewLegacyKeccak256() + binary.Write(hasher, binary.LittleEndian, num) + copy(hash[:], hasher.Sum(nil)[:32]) + + return hash +} + +// mocks an operator signing on a task response +func createMockSignedCheckpointTaskResponse(mockTask MockTask, keypair bls.KeyPair) (*SignedCheckpointTaskResponse, error) { + taskResponse := &taskmanager.CheckpointTaskResponse{ + ReferenceTaskIndex: mockTask.TaskNum, + StateRootUpdatesRoot: keccak256(mockTask.FromNearBlock), + OperatorSetUpdatesRoot: keccak256(mockTask.ToNearBlock), + } + taskResponseHash, err := core.GetCheckpointTaskResponseDigest(taskResponse) + if err != nil { + return nil, err + } + blsSignature := keypair.SignMessage(taskResponseHash) + signedCheckpointTaskResponse := &SignedCheckpointTaskResponse{ + TaskResponse: *taskResponse, + BlsSignature: *blsSignature, + OperatorId: MOCK_OPERATOR_ID, + } + return signedCheckpointTaskResponse, nil +} diff --git a/aggregator/types/types.go b/aggregator/types/types.go new file mode 100644 index 00000000..fecb8a32 --- /dev/null +++ b/aggregator/types/types.go @@ -0,0 +1,24 @@ +package types + +import ( + sdktypes "github.com/Layr-Labs/eigensdk-go/types" + "github.com/ethereum/go-ethereum/common" +) + +// TODO: Hardcoded for now +// all operators in quorum0 must sign the task response in order for it to be accepted +const QUORUM_THRESHOLD_NUMERATOR = uint32(100) +const QUORUM_THRESHOLD_DENOMINATOR = uint32(100) + +const QUERY_FILTER_FROM_BLOCK = uint64(1) + +// we only use a single quorum (quorum 0) for sffl +var QUORUM_NUMBERS = []byte{0} + +type BlockNumber = uint32 +type TaskIndex = uint32 + +type OperatorInfo struct { + OperatorPubkeys sdktypes.OperatorPubkeys + OperatorAddr common.Address +} diff --git a/cli/actions/deposit_into_strategy.go b/cli/actions/deposit_into_strategy.go new file mode 100644 index 00000000..cab9a541 --- /dev/null +++ b/cli/actions/deposit_into_strategy.go @@ -0,0 +1,54 @@ +package actions + +import ( + "encoding/json" + "fmt" + "log" + "math/big" + + sdkutils "github.com/Layr-Labs/eigensdk-go/utils" + "github.com/NethermindEth/near-sffl/core/config" + "github.com/NethermindEth/near-sffl/operator" + "github.com/NethermindEth/near-sffl/types" + "github.com/ethereum/go-ethereum/common" + "github.com/urfave/cli" +) + +func DepositIntoStrategy(ctx *cli.Context) error { + + configPath := ctx.GlobalString(config.ConfigFileFlag.Name) + nodeConfig := types.NodeConfig{} + err := sdkutils.ReadYamlConfig(configPath, &nodeConfig) + if err != nil { + return err + } + // need to make sure we don't register the operator on startup + // when using the cli commands to register the operator. + nodeConfig.RegisterOperatorOnStartup = false + configJson, err := json.MarshalIndent(nodeConfig, "", " ") + if err != nil { + log.Fatalf(err.Error()) + } + log.Println("Config:", string(configJson)) + + operator, err := operator.NewOperatorFromConfig(nodeConfig) + if err != nil { + return err + } + + strategyAddrStr := ctx.String("strategy-addr") + strategyAddr := common.HexToAddress(strategyAddrStr) + amountStr := ctx.String("amount") + amount, ok := new(big.Int).SetString(amountStr, 10) + if !ok { + fmt.Println("Error converting amount to big.Int") + return err + } + + err = operator.DepositIntoStrategy(strategyAddr, amount) + if err != nil { + return err + } + + return nil +} diff --git a/cli/actions/print_operator_status.go b/cli/actions/print_operator_status.go new file mode 100644 index 00000000..9a3c2c19 --- /dev/null +++ b/cli/actions/print_operator_status.go @@ -0,0 +1,42 @@ +package actions + +import ( + "encoding/json" + "log" + + sdkutils "github.com/Layr-Labs/eigensdk-go/utils" + "github.com/NethermindEth/near-sffl/core/config" + "github.com/NethermindEth/near-sffl/operator" + "github.com/NethermindEth/near-sffl/types" + "github.com/urfave/cli" +) + +func PrintOperatorStatus(ctx *cli.Context) error { + + configPath := ctx.GlobalString(config.ConfigFileFlag.Name) + nodeConfig := types.NodeConfig{} + err := sdkutils.ReadYamlConfig(configPath, &nodeConfig) + if err != nil { + return err + } + // need to make sure we don't register the operator on startup + // when using the cli commands to register the operator. + nodeConfig.RegisterOperatorOnStartup = false + configJson, err := json.MarshalIndent(nodeConfig, "", " ") + if err != nil { + log.Fatalf(err.Error()) + } + log.Println("Config:", string(configJson)) + + operator, err := operator.NewOperatorFromConfig(nodeConfig) + if err != nil { + return err + } + + err = operator.PrintOperatorStatus() + if err != nil { + return err + } + + return nil +} diff --git a/cli/actions/register_operator_with_avs.go b/cli/actions/register_operator_with_avs.go new file mode 100644 index 00000000..fc43c62b --- /dev/null +++ b/cli/actions/register_operator_with_avs.go @@ -0,0 +1,56 @@ +package actions + +import ( + "encoding/json" + "log" + "os" + + sdkecdsa "github.com/Layr-Labs/eigensdk-go/crypto/ecdsa" + sdkutils "github.com/Layr-Labs/eigensdk-go/utils" + "github.com/NethermindEth/near-sffl/core/config" + "github.com/NethermindEth/near-sffl/operator" + "github.com/NethermindEth/near-sffl/types" + "github.com/urfave/cli" +) + +func RegisterOperatorWithAvs(ctx *cli.Context) error { + + configPath := ctx.GlobalString(config.ConfigFileFlag.Name) + nodeConfig := types.NodeConfig{} + err := sdkutils.ReadYamlConfig(configPath, &nodeConfig) + if err != nil { + return err + } + // need to make sure we don't register the operator on startup + // when using the cli commands to register the operator. + nodeConfig.RegisterOperatorOnStartup = false + configJson, err := json.MarshalIndent(nodeConfig, "", " ") + if err != nil { + log.Fatalf(err.Error()) + } + log.Println("Config:", string(configJson)) + + operator, err := operator.NewOperatorFromConfig(nodeConfig) + if err != nil { + return err + } + + ecdsaKeyPassword, ok := os.LookupEnv("OPERATOR_ECDSA_KEY_PASSWORD") + if !ok { + log.Printf("OPERATOR_ECDSA_KEY_PASSWORD env var not set. using empty string") + } + operatorEcdsaPrivKey, err := sdkecdsa.ReadKey( + nodeConfig.EcdsaPrivateKeyStorePath, + ecdsaKeyPassword, + ) + if err != nil { + return err + } + + err = operator.RegisterOperatorWithAvs(operatorEcdsaPrivKey) + if err != nil { + return err + } + + return nil +} diff --git a/cli/actions/register_operator_with_eigenlayer.go b/cli/actions/register_operator_with_eigenlayer.go new file mode 100644 index 00000000..7d1ba390 --- /dev/null +++ b/cli/actions/register_operator_with_eigenlayer.go @@ -0,0 +1,43 @@ +package actions + +import ( + "encoding/json" + "log" + + "github.com/urfave/cli" + + sdkutils "github.com/Layr-Labs/eigensdk-go/utils" + "github.com/NethermindEth/near-sffl/core/config" + "github.com/NethermindEth/near-sffl/operator" + "github.com/NethermindEth/near-sffl/types" +) + +func RegisterOperatorWithEigenlayer(ctx *cli.Context) error { + + configPath := ctx.GlobalString(config.ConfigFileFlag.Name) + nodeConfig := types.NodeConfig{} + err := sdkutils.ReadYamlConfig(configPath, &nodeConfig) + if err != nil { + return err + } + // need to make sure we don't register the operator on startup + // when using the cli commands to register the operator. + nodeConfig.RegisterOperatorOnStartup = false + configJson, err := json.MarshalIndent(nodeConfig, "", " ") + if err != nil { + log.Fatalf(err.Error()) + } + log.Println("Config:", string(configJson)) + + operator, err := operator.NewOperatorFromConfig(nodeConfig) + if err != nil { + return err + } + + err = operator.RegisterOperatorWithEigenlayer() + if err != nil { + return err + } + + return nil +} diff --git a/cli/main.go b/cli/main.go new file mode 100644 index 00000000..555f5ae4 --- /dev/null +++ b/cli/main.go @@ -0,0 +1,67 @@ +package main + +import ( + "log" + "os" + + "github.com/NethermindEth/near-sffl/cli/actions" + "github.com/NethermindEth/near-sffl/core/config" + "github.com/urfave/cli" +) + +func main() { + app := cli.NewApp() + + app.Flags = []cli.Flag{config.ConfigFileFlag} + app.Commands = []cli.Command{ + { + Name: "register-operator-with-eigenlayer", + Aliases: []string{"rel"}, + Usage: "registers operator with eigenlayer (this should be called via eigenlayer cli, not plugin, but keeping here for convenience for now)", + Action: actions.RegisterOperatorWithEigenlayer, + }, + { + Name: "deposit-into-strategy", + Aliases: []string{"d"}, + Usage: "deposit tokens into a strategy", + Action: actions.DepositIntoStrategy, + Flags: []cli.Flag{ + cli.StringFlag{ + Name: "strategy-addr", + Usage: "Address of Strategy contract to deposit into", + Required: true, + }, + cli.StringFlag{ + Name: "amount", + Usage: "amount of tokens to deposit into strategy", + Required: true, + }, + }, + }, + { + Name: "register-operator-with-avs", + Aliases: []string{"r"}, + Usage: "registers bls keys with pubkey-compendium, opts into slashing by avs service-manager, and registers operators with avs registry", + Action: actions.RegisterOperatorWithAvs, + }, + { + Name: "deregister-operator-with-avs", + Aliases: []string{"d"}, + Action: func(ctx *cli.Context) error { + log.Fatal("Command not implemented.") + return nil + }, + }, + { + Name: "print-operator-status", + Aliases: []string{"s"}, + Usage: "prints operator status as viewed from sffl contracts", + Action: actions.PrintOperatorStatus, + }, + } + + err := app.Run(os.Args) + if err != nil { + log.Fatal(err) + } +} diff --git a/config-files/aggregator-docker-compose.yaml b/config-files/aggregator-docker-compose.yaml new file mode 100644 index 00000000..94773e58 --- /dev/null +++ b/config-files/aggregator-docker-compose.yaml @@ -0,0 +1,6 @@ +# production only prints info and above. development also prints debug +environment: production +eth_rpc_url: http://anvil:8545 +eth_ws_url: ws://anvil:8545 +# address which the aggregator listens on for operator signed messages +aggregator_server_ip_port_address: 0.0.0.0:8090 diff --git a/config-files/aggregator.yaml b/config-files/aggregator.yaml new file mode 100644 index 00000000..74adba25 --- /dev/null +++ b/config-files/aggregator.yaml @@ -0,0 +1,6 @@ +# 'production' only prints info and above. 'development' also prints debug +environment: production +eth_rpc_url: http://localhost:8545 +eth_ws_url: ws://localhost:8545 +# address which the aggregator listens on for operator signed messages +aggregator_server_ip_port_address: localhost:8090 diff --git a/config-files/challenger.yaml b/config-files/challenger.yaml new file mode 100644 index 00000000..52af8f3a --- /dev/null +++ b/config-files/challenger.yaml @@ -0,0 +1,4 @@ +# 'production' only prints info and above. 'development' also prints debug +environment: production +eth_rpc_url: http://localhost:8545 +eth_ws_url: ws://localhost:8545 diff --git a/config-files/operator-docker-compose.anvil.yaml b/config-files/operator-docker-compose.anvil.yaml new file mode 100644 index 00000000..2cb64d7c --- /dev/null +++ b/config-files/operator-docker-compose.anvil.yaml @@ -0,0 +1,49 @@ +# this sets the logger level (true = info, false = debug) +production: false + +operator_address: 0x860B6912C2d0337ef05bbC89b0C2CB6CbAEAB4A5 + +# EigenLayer Slasher contract address + +# This is the address of the slasher which is deployed in the anvil saved state +# The saved eigenlayer state is located in tests/anvil/data/eigenlayer-deployed-anvil-state.json +el_slasher_address: 0x5FC8d32690cc91D4c39d9d3abcBD16989F875707 +avs_service_manager_address: 0xc3e53F4d16Ae77Db1c982e75a937B9f60FE63690 +bls_operator_state_retriever_address: 0xa85233C63b9Ee964Add6F2cffe00Fd84eb32338f + +# ETH RPC URL +eth_rpc_url: http://anvil:8545 +eth_ws_url: ws://anvil:8545 + +# If you running this using eigenlayer CLI and the provided AVS packaging structure, +# this should be /operator_keys/ecdsa_key.json as the host path will be asked while running +# +# If you are running locally using go run main.go, this should be full path to your local ecdsa key file +ecdsa_private_key_store_path: tests/keys/test.ecdsa.key.json + +# If you running this using eigenlayer CLI and the provided AVS packaging structure, +# this should be /operator_keys/bls_key.json as the host path will be asked while running +# +# We are using bn254 curve for bls keys +# +# If you are running locally using go run main.go, this should be full path to your local bls key file +bls_private_key_store_path: tests/keys/test.bls.key.json + +# address which the aggregator listens on for operator signed messages +aggregator_server_ip_port_address: sffl-aggregator:8090 + +# avs node spec compliance https://eigen.nethermind.io/docs/spec/intro +eigen_metrics_ip_port_address: 0.0.0.0:9090 +enable_metrics: true +node_api_ip_port_address: 0.0.0.0:9010 +enable_node_api: true + +# we need to register the operator on startup when running the docker compose file +# because unfortunately we cannot register the operator previously and save it in the anvil json file +# This is because anvil only dumps the state, and not the receipt tree, so when we restart anvil with +# the registered operator, it's blspubkey registering event with the compendium is not present anymore, +# and so the aggregator can't find it.... very annoying +register_operator_on_startup: true +# address of token to deposit tokens into when registering on startup +# addresses.erc20MockStrategy in tests/anvil/sffl_avs_deployment_output.json +token_strategy_addr: 0xa85233C63b9Ee964Add6F2cffe00Fd84eb32338f diff --git a/config-files/operator.anvil.yaml b/config-files/operator.anvil.yaml new file mode 100644 index 00000000..656bc603 --- /dev/null +++ b/config-files/operator.anvil.yaml @@ -0,0 +1,43 @@ +# this sets the logger level (true = info, false = debug) +production: true + +operator_address: 0x860B6912C2d0337ef05bbC89b0C2CB6CbAEAB4A5 + +# EigenLayer Slasher contract address + +# This is the address of the slasher which is deployed in the anvil saved state +# The saved eigenlayer state is located in tests/anvil/sffl_avs_deployment_output.json +# TODO(samlaf): automate updating these addresses when we deploy new contracts +avs_registry_coordinator_address: 0xc3e53F4d16Ae77Db1c982e75a937B9f60FE63690 +operator_state_retriever_address: 0x1613beB3B2C4f22Ee086B2b38C1476A3cE7f78E8 + +# ETH RPC URL +eth_rpc_url: http://localhost:8545 +eth_ws_url: ws://localhost:8545 + +# If you running this using eigenlayer CLI and the provided AVS packaging structure, +# this should be /operator_keys/ecdsa_key.json as the host path will be asked while running +# +# If you are running locally using go run main.go, this should be full path to your local ecdsa key file +ecdsa_private_key_store_path: tests/keys/test.ecdsa.key.json + +# If you running this using eigenlayer CLI and the provided AVS packaging structure, +# this should be /operator_keys/bls_key.json as the host path will be asked while running +# +# We are using bn254 curve for bls keys +# +# If you are running locally using go run main.go, this should be full path to your local bls key file +bls_private_key_store_path: tests/keys/test.bls.key.json + +aggregator_server_ip_port_address: localhost:8090 + +# avs node spec compliance https://eigen.nethermind.io/docs/spec/intro +eigen_metrics_ip_port_address: localhost:9090 +enable_metrics: true +node_api_ip_port_address: localhost:9010 +enable_node_api: true + +register_operator_on_startup: true +# address of token to deposit tokens into when registering on startup +# addresses.erc20MockStrategy in tests/anvil/sffl_avs_deployment_output.json +token_strategy_addr: 0xa85233C63b9Ee964Add6F2cffe00Fd84eb32338f diff --git a/contracts/bindings/ERC20Mock/binding.go b/contracts/bindings/ERC20Mock/binding.go new file mode 100644 index 00000000..8b670a65 --- /dev/null +++ b/contracts/bindings/ERC20Mock/binding.go @@ -0,0 +1,688 @@ +// Code generated - DO NOT EDIT. +// This file is a generated binding and any manual changes will be lost. + +package contractERC20Mock + +import ( + "errors" + "math/big" + "strings" + + ethereum "github.com/ethereum/go-ethereum" + "github.com/ethereum/go-ethereum/accounts/abi" + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/event" +) + +// Reference imports to suppress errors if they are not otherwise used. +var ( + _ = errors.New + _ = big.NewInt + _ = strings.NewReader + _ = ethereum.NotFound + _ = bind.Bind + _ = common.Big1 + _ = types.BloomLookup + _ = event.NewSubscription + _ = abi.ConvertType +) + +// ContractERC20MockMetaData contains all meta data concerning the ContractERC20Mock contract. +var ContractERC20MockMetaData = &bind.MetaData{ + ABI: "[{\"type\":\"function\",\"name\":\"allowance\",\"inputs\":[{\"name\":\"owner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"spender\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"approve\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"balanceOf\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"mint\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"totalSupply\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"transfer\",\"inputs\":[{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"transferFrom\",\"inputs\":[{\"name\":\"from\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"Approval\",\"inputs\":[{\"name\":\"owner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"spender\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Transfer\",\"inputs\":[{\"name\":\"from\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false}]", + Bin: "0x608060405234801561001057600080fd5b50610527806100206000396000f3fe608060405234801561001057600080fd5b506004361061007d5760003560e01c806340c10f191161005b57806340c10f19146100d257806370a08231146100e7578063a9059cbb14610110578063dd62ed3e1461012357600080fd5b8063095ea7b31461008257806318160ddd146100ad57806323b872dd146100bf575b600080fd5b610098610090366004610410565b600192915050565b60405190151581526020015b60405180910390f35b6002545b6040519081526020016100a4565b6100986100cd36600461043a565b61015c565b6100e56100e0366004610410565b610173565b005b6100b16100f5366004610476565b6001600160a01b031660009081526020819052604090205490565b61009861011e366004610410565b610181565b6100b1610131366004610498565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b600061016984848461018b565b5060019392505050565b61017d8282610335565b5050565b6000336101698185855b6001600160a01b0383166101f45760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b60648201526084015b60405180910390fd5b6001600160a01b0382166102565760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b60648201526084016101eb565b6001600160a01b0383166000908152602081905260409020548111156102cd5760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b60648201526084016101eb565b6001600160a01b038381166000818152602081815260408083208054879003905593861680835291849020805486019055925184815290927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3505050565b6001600160a01b03821661038b5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f20616464726573730060448201526064016101eb565b806002600082825461039d91906104cb565b90915550506001600160a01b038216600081815260208181526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b80356001600160a01b038116811461040b57600080fd5b919050565b6000806040838503121561042357600080fd5b61042c836103f4565b946020939093013593505050565b60008060006060848603121561044f57600080fd5b610458846103f4565b9250610466602085016103f4565b9150604084013590509250925092565b60006020828403121561048857600080fd5b610491826103f4565b9392505050565b600080604083850312156104ab57600080fd5b6104b4836103f4565b91506104c2602084016103f4565b90509250929050565b600082198211156104ec57634e487b7160e01b600052601160045260246000fd5b50019056fea2646970667358221220cec8521b22478e97287133403b0757907f123f4ae3de11eb0e0148ef77cc3e6164736f6c634300080c0033", +} + +// ContractERC20MockABI is the input ABI used to generate the binding from. +// Deprecated: Use ContractERC20MockMetaData.ABI instead. +var ContractERC20MockABI = ContractERC20MockMetaData.ABI + +// ContractERC20MockBin is the compiled bytecode used for deploying new contracts. +// Deprecated: Use ContractERC20MockMetaData.Bin instead. +var ContractERC20MockBin = ContractERC20MockMetaData.Bin + +// DeployContractERC20Mock deploys a new Ethereum contract, binding an instance of ContractERC20Mock to it. +func DeployContractERC20Mock(auth *bind.TransactOpts, backend bind.ContractBackend) (common.Address, *types.Transaction, *ContractERC20Mock, error) { + parsed, err := ContractERC20MockMetaData.GetAbi() + if err != nil { + return common.Address{}, nil, nil, err + } + if parsed == nil { + return common.Address{}, nil, nil, errors.New("GetABI returned nil") + } + + address, tx, contract, err := bind.DeployContract(auth, *parsed, common.FromHex(ContractERC20MockBin), backend) + if err != nil { + return common.Address{}, nil, nil, err + } + return address, tx, &ContractERC20Mock{ContractERC20MockCaller: ContractERC20MockCaller{contract: contract}, ContractERC20MockTransactor: ContractERC20MockTransactor{contract: contract}, ContractERC20MockFilterer: ContractERC20MockFilterer{contract: contract}}, nil +} + +// ContractERC20Mock is an auto generated Go binding around an Ethereum contract. +type ContractERC20Mock struct { + ContractERC20MockCaller // Read-only binding to the contract + ContractERC20MockTransactor // Write-only binding to the contract + ContractERC20MockFilterer // Log filterer for contract events +} + +// ContractERC20MockCaller is an auto generated read-only Go binding around an Ethereum contract. +type ContractERC20MockCaller struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// ContractERC20MockTransactor is an auto generated write-only Go binding around an Ethereum contract. +type ContractERC20MockTransactor struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// ContractERC20MockFilterer is an auto generated log filtering Go binding around an Ethereum contract events. +type ContractERC20MockFilterer struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// ContractERC20MockSession is an auto generated Go binding around an Ethereum contract, +// with pre-set call and transact options. +type ContractERC20MockSession struct { + Contract *ContractERC20Mock // Generic contract binding to set the session for + CallOpts bind.CallOpts // Call options to use throughout this session + TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session +} + +// ContractERC20MockCallerSession is an auto generated read-only Go binding around an Ethereum contract, +// with pre-set call options. +type ContractERC20MockCallerSession struct { + Contract *ContractERC20MockCaller // Generic contract caller binding to set the session for + CallOpts bind.CallOpts // Call options to use throughout this session +} + +// ContractERC20MockTransactorSession is an auto generated write-only Go binding around an Ethereum contract, +// with pre-set transact options. +type ContractERC20MockTransactorSession struct { + Contract *ContractERC20MockTransactor // Generic contract transactor binding to set the session for + TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session +} + +// ContractERC20MockRaw is an auto generated low-level Go binding around an Ethereum contract. +type ContractERC20MockRaw struct { + Contract *ContractERC20Mock // Generic contract binding to access the raw methods on +} + +// ContractERC20MockCallerRaw is an auto generated low-level read-only Go binding around an Ethereum contract. +type ContractERC20MockCallerRaw struct { + Contract *ContractERC20MockCaller // Generic read-only contract binding to access the raw methods on +} + +// ContractERC20MockTransactorRaw is an auto generated low-level write-only Go binding around an Ethereum contract. +type ContractERC20MockTransactorRaw struct { + Contract *ContractERC20MockTransactor // Generic write-only contract binding to access the raw methods on +} + +// NewContractERC20Mock creates a new instance of ContractERC20Mock, bound to a specific deployed contract. +func NewContractERC20Mock(address common.Address, backend bind.ContractBackend) (*ContractERC20Mock, error) { + contract, err := bindContractERC20Mock(address, backend, backend, backend) + if err != nil { + return nil, err + } + return &ContractERC20Mock{ContractERC20MockCaller: ContractERC20MockCaller{contract: contract}, ContractERC20MockTransactor: ContractERC20MockTransactor{contract: contract}, ContractERC20MockFilterer: ContractERC20MockFilterer{contract: contract}}, nil +} + +// NewContractERC20MockCaller creates a new read-only instance of ContractERC20Mock, bound to a specific deployed contract. +func NewContractERC20MockCaller(address common.Address, caller bind.ContractCaller) (*ContractERC20MockCaller, error) { + contract, err := bindContractERC20Mock(address, caller, nil, nil) + if err != nil { + return nil, err + } + return &ContractERC20MockCaller{contract: contract}, nil +} + +// NewContractERC20MockTransactor creates a new write-only instance of ContractERC20Mock, bound to a specific deployed contract. +func NewContractERC20MockTransactor(address common.Address, transactor bind.ContractTransactor) (*ContractERC20MockTransactor, error) { + contract, err := bindContractERC20Mock(address, nil, transactor, nil) + if err != nil { + return nil, err + } + return &ContractERC20MockTransactor{contract: contract}, nil +} + +// NewContractERC20MockFilterer creates a new log filterer instance of ContractERC20Mock, bound to a specific deployed contract. +func NewContractERC20MockFilterer(address common.Address, filterer bind.ContractFilterer) (*ContractERC20MockFilterer, error) { + contract, err := bindContractERC20Mock(address, nil, nil, filterer) + if err != nil { + return nil, err + } + return &ContractERC20MockFilterer{contract: contract}, nil +} + +// bindContractERC20Mock binds a generic wrapper to an already deployed contract. +func bindContractERC20Mock(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error) { + parsed, err := ContractERC20MockMetaData.GetAbi() + if err != nil { + return nil, err + } + return bind.NewBoundContract(address, *parsed, caller, transactor, filterer), nil +} + +// Call invokes the (constant) contract method with params as input values and +// sets the output to result. The result type might be a single field for simple +// returns, a slice of interfaces for anonymous returns and a struct for named +// returns. +func (_ContractERC20Mock *ContractERC20MockRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { + return _ContractERC20Mock.Contract.ContractERC20MockCaller.contract.Call(opts, result, method, params...) +} + +// Transfer initiates a plain transaction to move funds to the contract, calling +// its default method if one is available. +func (_ContractERC20Mock *ContractERC20MockRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { + return _ContractERC20Mock.Contract.ContractERC20MockTransactor.contract.Transfer(opts) +} + +// Transact invokes the (paid) contract method with params as input values. +func (_ContractERC20Mock *ContractERC20MockRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { + return _ContractERC20Mock.Contract.ContractERC20MockTransactor.contract.Transact(opts, method, params...) +} + +// Call invokes the (constant) contract method with params as input values and +// sets the output to result. The result type might be a single field for simple +// returns, a slice of interfaces for anonymous returns and a struct for named +// returns. +func (_ContractERC20Mock *ContractERC20MockCallerRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { + return _ContractERC20Mock.Contract.contract.Call(opts, result, method, params...) +} + +// Transfer initiates a plain transaction to move funds to the contract, calling +// its default method if one is available. +func (_ContractERC20Mock *ContractERC20MockTransactorRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { + return _ContractERC20Mock.Contract.contract.Transfer(opts) +} + +// Transact invokes the (paid) contract method with params as input values. +func (_ContractERC20Mock *ContractERC20MockTransactorRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { + return _ContractERC20Mock.Contract.contract.Transact(opts, method, params...) +} + +// Allowance is a free data retrieval call binding the contract method 0xdd62ed3e. +// +// Solidity: function allowance(address owner, address spender) view returns(uint256) +func (_ContractERC20Mock *ContractERC20MockCaller) Allowance(opts *bind.CallOpts, owner common.Address, spender common.Address) (*big.Int, error) { + var out []interface{} + err := _ContractERC20Mock.contract.Call(opts, &out, "allowance", owner, spender) + + if err != nil { + return *new(*big.Int), err + } + + out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) + + return out0, err + +} + +// Allowance is a free data retrieval call binding the contract method 0xdd62ed3e. +// +// Solidity: function allowance(address owner, address spender) view returns(uint256) +func (_ContractERC20Mock *ContractERC20MockSession) Allowance(owner common.Address, spender common.Address) (*big.Int, error) { + return _ContractERC20Mock.Contract.Allowance(&_ContractERC20Mock.CallOpts, owner, spender) +} + +// Allowance is a free data retrieval call binding the contract method 0xdd62ed3e. +// +// Solidity: function allowance(address owner, address spender) view returns(uint256) +func (_ContractERC20Mock *ContractERC20MockCallerSession) Allowance(owner common.Address, spender common.Address) (*big.Int, error) { + return _ContractERC20Mock.Contract.Allowance(&_ContractERC20Mock.CallOpts, owner, spender) +} + +// BalanceOf is a free data retrieval call binding the contract method 0x70a08231. +// +// Solidity: function balanceOf(address account) view returns(uint256) +func (_ContractERC20Mock *ContractERC20MockCaller) BalanceOf(opts *bind.CallOpts, account common.Address) (*big.Int, error) { + var out []interface{} + err := _ContractERC20Mock.contract.Call(opts, &out, "balanceOf", account) + + if err != nil { + return *new(*big.Int), err + } + + out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) + + return out0, err + +} + +// BalanceOf is a free data retrieval call binding the contract method 0x70a08231. +// +// Solidity: function balanceOf(address account) view returns(uint256) +func (_ContractERC20Mock *ContractERC20MockSession) BalanceOf(account common.Address) (*big.Int, error) { + return _ContractERC20Mock.Contract.BalanceOf(&_ContractERC20Mock.CallOpts, account) +} + +// BalanceOf is a free data retrieval call binding the contract method 0x70a08231. +// +// Solidity: function balanceOf(address account) view returns(uint256) +func (_ContractERC20Mock *ContractERC20MockCallerSession) BalanceOf(account common.Address) (*big.Int, error) { + return _ContractERC20Mock.Contract.BalanceOf(&_ContractERC20Mock.CallOpts, account) +} + +// TotalSupply is a free data retrieval call binding the contract method 0x18160ddd. +// +// Solidity: function totalSupply() view returns(uint256) +func (_ContractERC20Mock *ContractERC20MockCaller) TotalSupply(opts *bind.CallOpts) (*big.Int, error) { + var out []interface{} + err := _ContractERC20Mock.contract.Call(opts, &out, "totalSupply") + + if err != nil { + return *new(*big.Int), err + } + + out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) + + return out0, err + +} + +// TotalSupply is a free data retrieval call binding the contract method 0x18160ddd. +// +// Solidity: function totalSupply() view returns(uint256) +func (_ContractERC20Mock *ContractERC20MockSession) TotalSupply() (*big.Int, error) { + return _ContractERC20Mock.Contract.TotalSupply(&_ContractERC20Mock.CallOpts) +} + +// TotalSupply is a free data retrieval call binding the contract method 0x18160ddd. +// +// Solidity: function totalSupply() view returns(uint256) +func (_ContractERC20Mock *ContractERC20MockCallerSession) TotalSupply() (*big.Int, error) { + return _ContractERC20Mock.Contract.TotalSupply(&_ContractERC20Mock.CallOpts) +} + +// Approve is a paid mutator transaction binding the contract method 0x095ea7b3. +// +// Solidity: function approve(address , uint256 ) returns(bool) +func (_ContractERC20Mock *ContractERC20MockTransactor) Approve(opts *bind.TransactOpts, arg0 common.Address, arg1 *big.Int) (*types.Transaction, error) { + return _ContractERC20Mock.contract.Transact(opts, "approve", arg0, arg1) +} + +// Approve is a paid mutator transaction binding the contract method 0x095ea7b3. +// +// Solidity: function approve(address , uint256 ) returns(bool) +func (_ContractERC20Mock *ContractERC20MockSession) Approve(arg0 common.Address, arg1 *big.Int) (*types.Transaction, error) { + return _ContractERC20Mock.Contract.Approve(&_ContractERC20Mock.TransactOpts, arg0, arg1) +} + +// Approve is a paid mutator transaction binding the contract method 0x095ea7b3. +// +// Solidity: function approve(address , uint256 ) returns(bool) +func (_ContractERC20Mock *ContractERC20MockTransactorSession) Approve(arg0 common.Address, arg1 *big.Int) (*types.Transaction, error) { + return _ContractERC20Mock.Contract.Approve(&_ContractERC20Mock.TransactOpts, arg0, arg1) +} + +// Mint is a paid mutator transaction binding the contract method 0x40c10f19. +// +// Solidity: function mint(address account, uint256 amount) returns() +func (_ContractERC20Mock *ContractERC20MockTransactor) Mint(opts *bind.TransactOpts, account common.Address, amount *big.Int) (*types.Transaction, error) { + return _ContractERC20Mock.contract.Transact(opts, "mint", account, amount) +} + +// Mint is a paid mutator transaction binding the contract method 0x40c10f19. +// +// Solidity: function mint(address account, uint256 amount) returns() +func (_ContractERC20Mock *ContractERC20MockSession) Mint(account common.Address, amount *big.Int) (*types.Transaction, error) { + return _ContractERC20Mock.Contract.Mint(&_ContractERC20Mock.TransactOpts, account, amount) +} + +// Mint is a paid mutator transaction binding the contract method 0x40c10f19. +// +// Solidity: function mint(address account, uint256 amount) returns() +func (_ContractERC20Mock *ContractERC20MockTransactorSession) Mint(account common.Address, amount *big.Int) (*types.Transaction, error) { + return _ContractERC20Mock.Contract.Mint(&_ContractERC20Mock.TransactOpts, account, amount) +} + +// Transfer is a paid mutator transaction binding the contract method 0xa9059cbb. +// +// Solidity: function transfer(address to, uint256 amount) returns(bool) +func (_ContractERC20Mock *ContractERC20MockTransactor) Transfer(opts *bind.TransactOpts, to common.Address, amount *big.Int) (*types.Transaction, error) { + return _ContractERC20Mock.contract.Transact(opts, "transfer", to, amount) +} + +// Transfer is a paid mutator transaction binding the contract method 0xa9059cbb. +// +// Solidity: function transfer(address to, uint256 amount) returns(bool) +func (_ContractERC20Mock *ContractERC20MockSession) Transfer(to common.Address, amount *big.Int) (*types.Transaction, error) { + return _ContractERC20Mock.Contract.Transfer(&_ContractERC20Mock.TransactOpts, to, amount) +} + +// Transfer is a paid mutator transaction binding the contract method 0xa9059cbb. +// +// Solidity: function transfer(address to, uint256 amount) returns(bool) +func (_ContractERC20Mock *ContractERC20MockTransactorSession) Transfer(to common.Address, amount *big.Int) (*types.Transaction, error) { + return _ContractERC20Mock.Contract.Transfer(&_ContractERC20Mock.TransactOpts, to, amount) +} + +// TransferFrom is a paid mutator transaction binding the contract method 0x23b872dd. +// +// Solidity: function transferFrom(address from, address to, uint256 amount) returns(bool) +func (_ContractERC20Mock *ContractERC20MockTransactor) TransferFrom(opts *bind.TransactOpts, from common.Address, to common.Address, amount *big.Int) (*types.Transaction, error) { + return _ContractERC20Mock.contract.Transact(opts, "transferFrom", from, to, amount) +} + +// TransferFrom is a paid mutator transaction binding the contract method 0x23b872dd. +// +// Solidity: function transferFrom(address from, address to, uint256 amount) returns(bool) +func (_ContractERC20Mock *ContractERC20MockSession) TransferFrom(from common.Address, to common.Address, amount *big.Int) (*types.Transaction, error) { + return _ContractERC20Mock.Contract.TransferFrom(&_ContractERC20Mock.TransactOpts, from, to, amount) +} + +// TransferFrom is a paid mutator transaction binding the contract method 0x23b872dd. +// +// Solidity: function transferFrom(address from, address to, uint256 amount) returns(bool) +func (_ContractERC20Mock *ContractERC20MockTransactorSession) TransferFrom(from common.Address, to common.Address, amount *big.Int) (*types.Transaction, error) { + return _ContractERC20Mock.Contract.TransferFrom(&_ContractERC20Mock.TransactOpts, from, to, amount) +} + +// ContractERC20MockApprovalIterator is returned from FilterApproval and is used to iterate over the raw logs and unpacked data for Approval events raised by the ContractERC20Mock contract. +type ContractERC20MockApprovalIterator struct { + Event *ContractERC20MockApproval // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *ContractERC20MockApprovalIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(ContractERC20MockApproval) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(ContractERC20MockApproval) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *ContractERC20MockApprovalIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *ContractERC20MockApprovalIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// ContractERC20MockApproval represents a Approval event raised by the ContractERC20Mock contract. +type ContractERC20MockApproval struct { + Owner common.Address + Spender common.Address + Value *big.Int + Raw types.Log // Blockchain specific contextual infos +} + +// FilterApproval is a free log retrieval operation binding the contract event 0x8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925. +// +// Solidity: event Approval(address indexed owner, address indexed spender, uint256 value) +func (_ContractERC20Mock *ContractERC20MockFilterer) FilterApproval(opts *bind.FilterOpts, owner []common.Address, spender []common.Address) (*ContractERC20MockApprovalIterator, error) { + + var ownerRule []interface{} + for _, ownerItem := range owner { + ownerRule = append(ownerRule, ownerItem) + } + var spenderRule []interface{} + for _, spenderItem := range spender { + spenderRule = append(spenderRule, spenderItem) + } + + logs, sub, err := _ContractERC20Mock.contract.FilterLogs(opts, "Approval", ownerRule, spenderRule) + if err != nil { + return nil, err + } + return &ContractERC20MockApprovalIterator{contract: _ContractERC20Mock.contract, event: "Approval", logs: logs, sub: sub}, nil +} + +// WatchApproval is a free log subscription operation binding the contract event 0x8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925. +// +// Solidity: event Approval(address indexed owner, address indexed spender, uint256 value) +func (_ContractERC20Mock *ContractERC20MockFilterer) WatchApproval(opts *bind.WatchOpts, sink chan<- *ContractERC20MockApproval, owner []common.Address, spender []common.Address) (event.Subscription, error) { + + var ownerRule []interface{} + for _, ownerItem := range owner { + ownerRule = append(ownerRule, ownerItem) + } + var spenderRule []interface{} + for _, spenderItem := range spender { + spenderRule = append(spenderRule, spenderItem) + } + + logs, sub, err := _ContractERC20Mock.contract.WatchLogs(opts, "Approval", ownerRule, spenderRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(ContractERC20MockApproval) + if err := _ContractERC20Mock.contract.UnpackLog(event, "Approval", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseApproval is a log parse operation binding the contract event 0x8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925. +// +// Solidity: event Approval(address indexed owner, address indexed spender, uint256 value) +func (_ContractERC20Mock *ContractERC20MockFilterer) ParseApproval(log types.Log) (*ContractERC20MockApproval, error) { + event := new(ContractERC20MockApproval) + if err := _ContractERC20Mock.contract.UnpackLog(event, "Approval", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// ContractERC20MockTransferIterator is returned from FilterTransfer and is used to iterate over the raw logs and unpacked data for Transfer events raised by the ContractERC20Mock contract. +type ContractERC20MockTransferIterator struct { + Event *ContractERC20MockTransfer // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *ContractERC20MockTransferIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(ContractERC20MockTransfer) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(ContractERC20MockTransfer) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *ContractERC20MockTransferIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *ContractERC20MockTransferIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// ContractERC20MockTransfer represents a Transfer event raised by the ContractERC20Mock contract. +type ContractERC20MockTransfer struct { + From common.Address + To common.Address + Value *big.Int + Raw types.Log // Blockchain specific contextual infos +} + +// FilterTransfer is a free log retrieval operation binding the contract event 0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef. +// +// Solidity: event Transfer(address indexed from, address indexed to, uint256 value) +func (_ContractERC20Mock *ContractERC20MockFilterer) FilterTransfer(opts *bind.FilterOpts, from []common.Address, to []common.Address) (*ContractERC20MockTransferIterator, error) { + + var fromRule []interface{} + for _, fromItem := range from { + fromRule = append(fromRule, fromItem) + } + var toRule []interface{} + for _, toItem := range to { + toRule = append(toRule, toItem) + } + + logs, sub, err := _ContractERC20Mock.contract.FilterLogs(opts, "Transfer", fromRule, toRule) + if err != nil { + return nil, err + } + return &ContractERC20MockTransferIterator{contract: _ContractERC20Mock.contract, event: "Transfer", logs: logs, sub: sub}, nil +} + +// WatchTransfer is a free log subscription operation binding the contract event 0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef. +// +// Solidity: event Transfer(address indexed from, address indexed to, uint256 value) +func (_ContractERC20Mock *ContractERC20MockFilterer) WatchTransfer(opts *bind.WatchOpts, sink chan<- *ContractERC20MockTransfer, from []common.Address, to []common.Address) (event.Subscription, error) { + + var fromRule []interface{} + for _, fromItem := range from { + fromRule = append(fromRule, fromItem) + } + var toRule []interface{} + for _, toItem := range to { + toRule = append(toRule, toItem) + } + + logs, sub, err := _ContractERC20Mock.contract.WatchLogs(opts, "Transfer", fromRule, toRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(ContractERC20MockTransfer) + if err := _ContractERC20Mock.contract.UnpackLog(event, "Transfer", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseTransfer is a log parse operation binding the contract event 0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef. +// +// Solidity: event Transfer(address indexed from, address indexed to, uint256 value) +func (_ContractERC20Mock *ContractERC20MockFilterer) ParseTransfer(log types.Log) (*ContractERC20MockTransfer, error) { + event := new(ContractERC20MockTransfer) + if err := _ContractERC20Mock.contract.UnpackLog(event, "Transfer", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} diff --git a/contracts/bindings/SFFLRegistryRollup/binding.go b/contracts/bindings/SFFLRegistryRollup/binding.go new file mode 100644 index 00000000..c5711780 --- /dev/null +++ b/contracts/bindings/SFFLRegistryRollup/binding.go @@ -0,0 +1,963 @@ +// Code generated - DO NOT EDIT. +// This file is a generated binding and any manual changes will be lost. + +package contractSFFLRegistryRollup + +import ( + "errors" + "math/big" + "strings" + + ethereum "github.com/ethereum/go-ethereum" + "github.com/ethereum/go-ethereum/accounts/abi" + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/event" +) + +// Reference imports to suppress errors if they are not otherwise used. +var ( + _ = errors.New + _ = big.NewInt + _ = strings.NewReader + _ = ethereum.NotFound + _ = bind.Bind + _ = common.Big1 + _ = types.BloomLookup + _ = event.NewSubscription + _ = abi.ConvertType +) + +// BN254G1Point is an auto generated low-level Go binding around an user-defined struct. +type BN254G1Point struct { + X *big.Int + Y *big.Int +} + +// BN254G2Point is an auto generated low-level Go binding around an user-defined struct. +type BN254G2Point struct { + X [2]*big.Int + Y [2]*big.Int +} + +// OperatorSetUpdateMessage is an auto generated low-level Go binding around an user-defined struct. +type OperatorSetUpdateMessage struct { + Id uint64 + NearBlockHeight uint64 + Operators []OperatorsOperator +} + +// OperatorsOperator is an auto generated low-level Go binding around an user-defined struct. +type OperatorsOperator struct { + Pubkey BN254G1Point + Weight *big.Int +} + +// OperatorsSignatureInfo is an auto generated low-level Go binding around an user-defined struct. +type OperatorsSignatureInfo struct { + NonSignerPubkeyHashes [][32]byte + ApkG2 BN254G2Point + Sigma BN254G1Point +} + +// SFFLRegistryBaseProofParams is an auto generated low-level Go binding around an user-defined struct. +type SFFLRegistryBaseProofParams struct { + Target common.Address + StorageKey [32]byte + StateTrieWitness []byte + StorageTrieWitness []byte +} + +// StateRootUpdateMessage is an auto generated low-level Go binding around an user-defined struct. +type StateRootUpdateMessage struct { + RollupId uint32 + BlockHeight uint64 + NearBlockHeight uint64 + StateRoot [32]byte +} + +// ContractSFFLRegistryRollupMetaData contains all meta data concerning the ContractSFFLRegistryRollup contract. +var ContractSFFLRegistryRollupMetaData = &bind.MetaData{ + ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"operators\",\"type\":\"tuple[]\",\"internalType\":\"structOperators.Operator[]\",\"components\":[{\"name\":\"pubkey\",\"type\":\"tuple\",\"internalType\":\"structBN254.G1Point\",\"components\":[{\"name\":\"X\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"Y\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"name\":\"weight\",\"type\":\"uint128\",\"internalType\":\"uint128\"}]},{\"name\":\"quorumThreshold\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"operatorUpdateId\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"THRESHOLD_DENOMINATOR\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint128\",\"internalType\":\"uint128\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"getApk\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structBN254.G1Point\",\"components\":[{\"name\":\"X\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"Y\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getOperatorWeight\",\"inputs\":[{\"name\":\"pubkeyHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint128\",\"internalType\":\"uint128\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getQuorumThreshold\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint128\",\"internalType\":\"uint128\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getStateRoot\",\"inputs\":[{\"name\":\"rollupId\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"blockHeight\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getStorageValue\",\"inputs\":[{\"name\":\"message\",\"type\":\"tuple\",\"internalType\":\"structStateRootUpdate.Message\",\"components\":[{\"name\":\"rollupId\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"blockHeight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"nearBlockHeight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"stateRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"name\":\"proofParams\",\"type\":\"tuple\",\"internalType\":\"structSFFLRegistryBase.ProofParams\",\"components\":[{\"name\":\"target\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"storageKey\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"stateTrieWitness\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"storageTrieWitness\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getTotalWeight\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint128\",\"internalType\":\"uint128\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"nextOperatorUpdateId\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setQuorumThreshold\",\"inputs\":[{\"name\":\"newQuorumThreshold\",\"type\":\"uint128\",\"internalType\":\"uint128\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"transferOwnership\",\"inputs\":[{\"name\":\"newOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"updateAndGetStorageValue\",\"inputs\":[{\"name\":\"message\",\"type\":\"tuple\",\"internalType\":\"structStateRootUpdate.Message\",\"components\":[{\"name\":\"rollupId\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"blockHeight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"nearBlockHeight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"stateRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"name\":\"proofParams\",\"type\":\"tuple\",\"internalType\":\"structSFFLRegistryBase.ProofParams\",\"components\":[{\"name\":\"target\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"storageKey\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"stateTrieWitness\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"storageTrieWitness\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"agreement\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"updateOperatorSet\",\"inputs\":[{\"name\":\"message\",\"type\":\"tuple\",\"internalType\":\"structOperatorSetUpdate.Message\",\"components\":[{\"name\":\"id\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"nearBlockHeight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"operators\",\"type\":\"tuple[]\",\"internalType\":\"structOperators.Operator[]\",\"components\":[{\"name\":\"pubkey\",\"type\":\"tuple\",\"internalType\":\"structBN254.G1Point\",\"components\":[{\"name\":\"X\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"Y\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"name\":\"weight\",\"type\":\"uint128\",\"internalType\":\"uint128\"}]}]},{\"name\":\"signatureInfo\",\"type\":\"tuple\",\"internalType\":\"structOperators.SignatureInfo\",\"components\":[{\"name\":\"nonSignerPubkeyHashes\",\"type\":\"bytes32[]\",\"internalType\":\"bytes32[]\"},{\"name\":\"apkG2\",\"type\":\"tuple\",\"internalType\":\"structBN254.G2Point\",\"components\":[{\"name\":\"X\",\"type\":\"uint256[2]\",\"internalType\":\"uint256[2]\"},{\"name\":\"Y\",\"type\":\"uint256[2]\",\"internalType\":\"uint256[2]\"}]},{\"name\":\"sigma\",\"type\":\"tuple\",\"internalType\":\"structBN254.G1Point\",\"components\":[{\"name\":\"X\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"Y\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"updateStateRoot\",\"inputs\":[{\"name\":\"message\",\"type\":\"tuple\",\"internalType\":\"structStateRootUpdate.Message\",\"components\":[{\"name\":\"rollupId\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"blockHeight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"nearBlockHeight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"stateRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"name\":\"signatureInfo\",\"type\":\"tuple\",\"internalType\":\"structOperators.SignatureInfo\",\"components\":[{\"name\":\"nonSignerPubkeyHashes\",\"type\":\"bytes32[]\",\"internalType\":\"bytes32[]\"},{\"name\":\"apkG2\",\"type\":\"tuple\",\"internalType\":\"structBN254.G2Point\",\"components\":[{\"name\":\"X\",\"type\":\"uint256[2]\",\"internalType\":\"uint256[2]\"},{\"name\":\"Y\",\"type\":\"uint256[2]\",\"internalType\":\"uint256[2]\"}]},{\"name\":\"sigma\",\"type\":\"tuple\",\"internalType\":\"structBN254.G1Point\",\"components\":[{\"name\":\"X\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"Y\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"OwnershipTransferred\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"StateRootUpdated\",\"inputs\":[{\"name\":\"rollupId\",\"type\":\"uint32\",\"indexed\":true,\"internalType\":\"uint32\"},{\"name\":\"blockHeight\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"stateRoot\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false}]", + Bin: "0x60806040523480156200001157600080fd5b5060405162003da438038062003da4833981016040819052620000349162000674565b6200003f3362000085565b6200005c83836002620000d760201b6200075e179092919060201c565b600680546001600160401b0319166001600160401b039290921691909117905550620008839050565b600180546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b620000e38383620000f4565b620000ef838262000394565b505050565b604080516080810182526000918101828152606082018390528152602081019190915260408051808201909152600184015481526002840154602082015260038401546001600160801b031660005b84518110156200035957848181518110620001625762000162620007a3565b6020026020010151935060006200018885600001516200044f60201b620007771760201c565b60008181526020898152604090912060020154908701519192506001600160801b039081169116811415620002045760405162461bcd60e51b815260206004820152601660248201527f4f70657261746f7220697320757020746f20646174650000000000000000000060448201526064015b60405180910390fd5b6020860151620002158286620007cf565b620002219190620007fa565b6020878101516000858152918b9052604090912060020180546001600160801b0319166001600160801b0392831617905590945081166200029f578551600083815260208a815260409091208251815591810151600190920191909155865162000297918791906200078e62000466821b17901c565b9450620002fe565b60208601516001600160801b0316620002fe57620002e5620002d087600001516200050f60201b620008311760201c565b866200046660201b6200078e1790919060201c565b6040805180820190915260008082526020820152875294505b6020808701516040516001600160801b03909116815283917f7714c619c02393ccf44c3de606bec5c80ae7a6077504b74887fb39f335e98adc910160405180910390a250508080620003509062000828565b91505062000143565b506003850180546001600160801b0319166001600160801b039290921691909117905580516001850155602001516002909301929092555050565b60646001600160801b0382161115620004025760405162461bcd60e51b815260206004820152602960248201527f51756f72756d207468726573686f6c642067726561746572207468616e2064656044820152683737b6b4b730ba37b960b91b6064820152608401620001fb565b6003820180546001600160801b03808416600160801b810291909216179091556040517f2b71b2179969a005ac6fd9c196134b364ff40069a17dd72faa96c4a00e73e9f490600090a25050565b805160009081526020918201519091526040902090565b604080518082019091526000808252602082015262000484620005b2565b835181526020808501518183015283516040808401919091529084015160608301526000908360808460066107d05a03fa9050808015620004c557620004c7565bfe5b5080620005075760405162461bcd60e51b815260206004820152600d60248201526c1958cb5859190b59985a5b1959609a1b6044820152606401620001fb565b505092915050565b604080518082019091526000808252602082015281511580156200053557506020820151155b1562000554575050604080518082019091526000808252602082015290565b60405180604001604052808360000151815260200160008051602062003d8483398151915284602001516200058a919062000846565b620005a59060008051602062003d8483398151915262000869565b905292915050565b919050565b60405180608001604052806004906020820280368337509192915050565b634e487b7160e01b600052604160045260246000fd5b604080519081016001600160401b03811182821017156200060b576200060b620005d0565b60405290565b604051601f8201601f191681016001600160401b03811182821017156200063c576200063c620005d0565b604052919050565b80516001600160801b0381168114620005ad57600080fd5b80516001600160401b0381168114620005ad57600080fd5b600080600060608085870312156200068b57600080fd5b84516001600160401b0380821115620006a357600080fd5b818701915087601f830112620006b857600080fd5b8151602082821115620006cf57620006cf620005d0565b620006df818360051b0162000611565b828152818101935091850284018101918a831115620006fd57600080fd5b938101935b828510156200077657848b03868112156200071d5760008081fd5b62000727620005e6565b604080831215620007385760008081fd5b62000742620005e6565b92508751835284880151858401528282526200076081890162000644565b8286015250855250938501939281019262000702565b97506200078589820162000644565b965050505050506200079a604085016200065c565b90509250925092565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b60006001600160801b0383811690831681811015620007f257620007f2620007b9565b039392505050565b60006001600160801b038281168482168083038211156200081f576200081f620007b9565b01949350505050565b60006000198214156200083f576200083f620007b9565b5060010190565b6000826200086457634e487b7160e01b600052601260045260246000fd5b500690565b6000828210156200087e576200087e620007b9565b500390565b6134f180620008936000396000f3fe608060405234801561001057600080fd5b50600436106100f55760003560e01c80638da5cb5b11610097578063dd64766e11610066578063dd64766e1461021f578063e0f5d9f014610232578063ef0244581461025d578063f2fde38b1461026457600080fd5b80638da5cb5b146101bd578063b3a9e53b146101d8578063b708c083146101f9578063ccd3bd9e1461020c57600080fd5b806344a74c90116100d357806344a74c901461014c5780634afa71b91461015f5780636f5b991814610177578063715018a6146101b557600080fd5b806306aba0e1146100fa5780632db52ea51461012457806343633b0f14610139575b600080fd5b6005546001600160801b03165b6040516001600160801b0390911681526020015b60405180910390f35b610137610132366004612c64565b610277565b005b610137610147366004612c97565b61028d565b61013761015a366004612d14565b6103f4565b600554600160801b90046001600160801b0316610107565b60408051808201825260008082526020918201528151808301835260035480825260045491830191825283519081529051918101919091520161011b565b610137610467565b6001546040516001600160a01b03909116815260200161011b565b6101eb6101e6366004612d83565b61047b565b60405190815260200161011b565b6101eb610207366004612db6565b6104aa565b6101eb61021a366004612e58565b61056a565b61010761022d366004612e9c565b6106c8565b600654610245906001600160401b031681565b6040516001600160401b03909116815260200161011b565b6064610107565b610137610272366004612eb5565b6106e8565b61027f6108cc565b61028a600282610926565b50565b6006546001600160401b03166102a66020840184612ede565b6001600160401b0316146102f45760405162461bcd60e51b815260206004820152601060248201526f15dc9bdb99c81b595cdcd859d948125160821b60448201526064015b60405180910390fd5b610309610300836109df565b60029083610a0f565b6103465760405162461bcd60e51b815260206004820152600e60248201526d145d5bdc9d5b481b9bdd081b595d60921b60448201526064016102eb565b6103536020830183612ede565b61035e906001612f0f565b6006805467ffffffffffffffff19166001600160401b03929092169190911790556103f061038f6040840184612f3a565b808060200260200160405190810160405280939291908181526020016000905b828210156103db576103cc60608302860136819003810190612ff7565b815260200190600101906103af565b50505050506002610ced90919063ffffffff16565b5050565b61040061030083610f4b565b61043d5760405162461bcd60e51b815260206004820152600e60248201526d145d5bdc9d5b481b9bdd081b595d60921b60448201526064016102eb565b6103f061044d6020840184613035565b61045d6040850160208601612ede565b8460600135610f5e565b61046f6108cc565b6104796000610fc2565b565b63ffffffff82166000908152602081815260408083206001600160401b03851684529091529020545b92915050565b60008080806104bc6020890189613035565b63ffffffff1663ffffffff16815260200190815260200160002060008760200160208101906104eb9190612ede565b6001600160401b03168152602081019190915260400160002054905080610556578261054b5760405162461bcd60e51b815260206004820152600f60248201526e115b5c1d1e481859dc99595b595b9d608a1b60448201526064016102eb565b610556868585611014565b610560868661056a565b9695505050505050565b600080808061057c6020870187613035565b63ffffffff1663ffffffff16815260200190815260200160002060008560200160208101906105ab9190612ede565b6001600160401b03166001600160401b03168152602001908152602001600020549050836060013581146106215760405162461bcd60e51b815260206004820152601760248201527f4d69736d61746368696e6720737461746520726f6f747300000000000000000060448201526064016102eb565b6106c06106316020850185612eb5565b6020850135836106446040880188613050565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250610686925050506060890189613050565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061102592505050565b949350505050565b6000818152600260208190526040822001546001600160801b03166104a4565b6106f06108cc565b6001600160a01b0381166107555760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016102eb565b61028a81610fc2565b6107688383610ced565b6107728382610926565b505050565b805160009081526020918201519091526040902090565b60408051808201909152600080825260208201526107aa612b73565b835181526020808501518183015283516040808401919091529084015160608301526000908360808460066107d05a03fa90508080156107e9576107eb565bfe5b50806108295760405162461bcd60e51b815260206004820152600d60248201526c1958cb5859190b59985a5b1959609a1b60448201526064016102eb565b505092915050565b6040805180820190915260008082526020820152815115801561085657506020820151155b15610874575050604080518082019091526000808252602082015290565b60405180604001604052808360000151815260200160008051602061349c83398151915284602001516108a791906130c2565b6108bf9060008051602061349c8339815191526130d6565b905292915050565b919050565b6001546001600160a01b031633146104795760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016102eb565b60646001600160801b03821611156109925760405162461bcd60e51b815260206004820152602960248201527f51756f72756d207468726573686f6c642067726561746572207468616e2064656044820152683737b6b4b730ba37b960b91b60648201526084016102eb565b6003820180546001600160801b03808416600160801b810291909216179091556040517f2b71b2179969a005ac6fd9c196134b364ff40069a17dd72faa96c4a00e73e9f490600090a25050565b6000816040516020016109f291906130ed565b604051602081830303815290604052805190602001209050919050565b604080518082018252600080825260208083018290526003870154845160808101865294850183815260608601849052855290840182905290926001600160801b039091169060005b610a6286806131c5565b9050811015610bae578015610b0557610a7b86806131c5565b610a866001846130d6565b818110610a9557610a95613096565b60200291909101359050610aa987806131c5565b83818110610ab957610ab9613096565b9050602002013560001c11610b055760405162461bcd60e51b8152602060048201526012602482015271141d589ad95e5cc81b9bdd081cdbdc9d195960721b60448201526064016102eb565b876000610b1288806131c5565b84818110610b2257610b22613096565b6020908102929092013583525081810192909252604090810160002081516080810183528154928101928352600182015460608201528281526002909101546001600160801b031692810192909252909250610b7f90859061078e565b935081602001516001600160801b031683610b9a91906130d6565b925080610ba68161320e565b915050610a58565b50610bdc610bbb84610831565b6040805180820190915260018a0154815260028a015460208201529061078e565b9250600080610c0f8886610bf8368b90038b0160208c01613298565b610c0a368c90038c0160a08d016132cb565b611160565b9150915081610c605760405162461bcd60e51b815260206004820152601e60248201527f50616972696e6720707265636f6d70696c652063616c6c206661696c6564000060448201526064016102eb565b80610ca45760405162461bcd60e51b815260206004820152601460248201527314da59db985d1d5c99481a5cc81a5b9d985b1a5960621b60448201526064016102eb565b6003890154606490610cc8906001600160801b03600160801b8204811691166132e7565b610cd29190613316565b6001600160801b0316841015955050505050505b9392505050565b604080516080810182526000918101828152606082018390528152602081019190915260408051808201909152600184015481526002840154602082015260038401546001600160801b031660005b8451811015610f1057848181518110610d5757610d57613096565b602002602001015193506000610d828560000151805160009081526020918201519091526040902090565b60008181526020898152604090912060020154908701519192506001600160801b039081169116811415610df15760405162461bcd60e51b81526020600482015260166024820152754f70657261746f7220697320757020746f206461746560501b60448201526064016102eb565b6020860151610e00828661333c565b610e0a9190613364565b6020878101516000858152918b9052604090912060020180546001600160801b0319166001600160801b039283161790559094508116610e76578551600083815260208a81526040909120825181559101516001909101558551610e6f90869061078e565b9450610eb8565b60208601516001600160801b0316610eb857610e9f610e988760000151610831565b869061078e565b6040805180820190915260008082526020820152875294505b6020808701516040516001600160801b03909116815283917f7714c619c02393ccf44c3de606bec5c80ae7a6077504b74887fb39f335e98adc910160405180910390a250508080610f089061320e565b915050610d3c565b506003850180546001600160801b0319166001600160801b039290921691909117905580516001850155602001516002909301929092555050565b6000816040516020016109f29190613386565b63ffffffff83166000818152602081815260408083206001600160401b03871680855290835292819020859055518481529192917fca7171570f4ca232f925661b810636124eaf784a25b7c14e6b34c95b814dfdd8910160405180910390a3505050565b600180546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b8161101f84826103f4565b50505050565b6040516bffffffffffffffffffffffff19606087901b166020820152600090819081906110659060340160405160208183030381529060405286886112e3565b91509150816110af5760405162461bcd60e51b81526020600482015260166024820152751058d8dbdd5b9d08191bd95cc81b9bdd08195e1a5cdd60521b60448201526064016102eb565b60006110ba8261130c565b90506000806110ef8a6040516020016110d591815260200190565b6040516020818303038152906040528885604001516112e3565b91509150816111405760405162461bcd60e51b815260206004820152601c60248201527f53746f726167652076616c756520646f6573206e6f742065786973740000000060448201526064016102eb565b61115161114c826113d0565b611403565b9b9a5050505050505050505050565b60008060007f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001878760000151886020015188600001516000600281106111a8576111a8613096565b60200201518951600160200201518a602001516000600281106111cd576111cd613096565b60200201518b602001516001600281106111e9576111e9613096565b602090810291909101518c518d8301516040516112469a99989796959401988952602089019790975260408801959095526060870193909352608086019190915260a085015260c084015260e08301526101008201526101200190565b6040516020818303038152906040528051906020012060001c61126991906130c2565b90506112d561127b610e988884611432565b6112836114ba565b6112cb6112bc856112b6604080518082018252600080825260209182015281518083019092526001825260029082015290565b90611432565b6112c58c61157a565b9061078e565b886201d4c061160a565b909890975095505050505050565b6000606060006112f28661182e565b90506112ff818686611860565b9250925050935093915050565b6040805160808101825260008082526020820181905291810182905260608101829052906113398361193b565b905060405180608001604052806113698360008151811061135c5761135c613096565b602002602001015161196e565b81526020016113848360018151811061135c5761135c613096565b81526020016113ac8360028151811061139f5761139f613096565b6020026020010151611975565b81526020016113c78360038151811061139f5761139f613096565b90529392505050565b6040805180820182526000808252602091820152815180830190925282518252808301908201526060906104a490611a77565b600080600060208451111561141957602061141c565b83515b60209485015194036008029390931c9392505050565b604080518082019091526000808252602082015261144e612b91565b835181526020808501519082015260408082018490526000908360608460076107d05a03fa90508080156107e95750806108295760405162461bcd60e51b815260206004820152600d60248201526c1958cb5b5d5b0b59985a5b1959609a1b60448201526064016102eb565b6114c2612baf565b50604080516080810182527f198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c28183019081527f1800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed6060830152815281518083019092527f275dc4a288d1afb3cbb1ac09187524c7db36395df7be3b99e673b13a075a65ec82527f1d9befcd05a5323e6da4d435f3b617cdb3af83285c2df711ef39c01571827f9d60208381019190915281019190915290565b6040805180820190915260008082526020820152600080806115aa60008051602061349c833981519152866130c2565b90505b6115b681611b07565b909350915060008051602061349c8339815191528283098314156115f0576040805180820190915290815260208101919091529392505050565b60008051602061349c8339815191526001820890506115ad565b60408051808201825286815260208082018690528251808401909352868352820184905260009182919061163c612bd4565b60005b60028110156118015760006116558260066133dc565b905084826002811061166957611669613096565b6020020151518361167b8360006133fb565b600c811061168b5761168b613096565b60200201528482600281106116a2576116a2613096565b602002015160200151838260016116b991906133fb565b600c81106116c9576116c9613096565b60200201528382600281106116e0576116e0613096565b60200201515151836116f38360026133fb565b600c811061170357611703613096565b602002015283826002811061171a5761171a613096565b60200201515160016020020151836117338360036133fb565b600c811061174357611743613096565b602002015283826002811061175a5761175a613096565b60200201516020015160006002811061177557611775613096565b6020020151836117868360046133fb565b600c811061179657611796613096565b60200201528382600281106117ad576117ad613096565b6020020151602001516001600281106117c8576117c8613096565b6020020151836117d98360056133fb565b600c81106117e9576117e9613096565b602002015250806117f98161320e565b91505061163f565b5061180a612bf3565b60006020826101808560088cfa9151919c9115159b50909950505050505050505050565b6060818051906020012060405160200161184a91815260200190565b6040516020818303038152906040529050919050565b60006060600061186f85611b89565b90506000806000611881848a89611c83565b815192955090935091501580806118955750815b6118e15760405162461bcd60e51b815260206004820152601a60248201527f50726f76696465642070726f6f6620697320696e76616c69642e00000000000060448201526064016102eb565b6000816118fd5760405180602001604052806000815250611929565b6119298661190c6001886130d6565b8151811061191c5761191c613096565b60200260200101516120a7565b919b919a509098505050505050505050565b6040805180820182526000808252602091820152815180830190925282518252808301908201526060906104a4906120d1565b60006104a4825b60006021826000015111156119cc5760405162461bcd60e51b815260206004820152601a60248201527f496e76616c696420524c5020627974657333322076616c75652e00000000000060448201526064016102eb565b60008060006119da856122bd565b9194509250905060008160018111156119f5576119f5613413565b14611a425760405162461bcd60e51b815260206004820152601a60248201527f496e76616c696420524c5020627974657333322076616c75652e00000000000060448201526064016102eb565b6000838660200151611a5491906133fb565b805190915060208410156105605760208490036101000a90049695505050505050565b60606000806000611a87856122bd565b919450925090506000816001811115611aa257611aa2613413565b14611aef5760405162461bcd60e51b815260206004820152601860248201527f496e76616c696420524c502062797465732076616c75652e000000000000000060448201526064016102eb565b611afe85602001518484612607565b95945050505050565b6000808060008051602061349c833981519152600360008051602061349c8339815191528660008051602061349c833981519152888909090890506000611b7d827f0c19139cb84c680a6e14116da060561765e05aa45a1c72a34f082305b61f3f5260008051602061349c8339815191526126e5565b91959194509092505050565b60606000611b968361193b565b9050600081516001600160401b03811115611bb357611bb3612f89565b604051908082528060200260200182016040528015611bf857816020015b6040805180820190915260608082526020820152815260200190600190039081611bd15790505b50905060005b8251811015611c7b576000611c2b848381518110611c1e57611c1e613096565b6020026020010151611a77565b90506040518060400160405280828152602001611c478361193b565b815250838381518110611c5c57611c5c613096565b6020026020010181905250508080611c739061320e565b915050611bfe565b509392505050565b60006060818080611c938761278d565b90506000869050600080611cba604051806040016040528060608152602001606081525090565b60005b8c5181101561207f578c8181518110611cd857611cd8613096565b602002602001015191508284611cee91906133fb565b9350611cfb6001886133fb565b965083611d5357815180516020909101208514611d4e5760405162461bcd60e51b8152602060048201526011602482015270092dcecc2d8d2c840e4dedee840d0c2e6d607b1b60448201526064016102eb565b611e10565b815151602011611db557815180516020909101208514611d4e5760405162461bcd60e51b815260206004820152601b60248201527f496e76616c6964206c6172676520696e7465726e616c2068617368000000000060448201526064016102eb565b84611dc383600001516128c7565b14611e105760405162461bcd60e51b815260206004820152601a60248201527f496e76616c696420696e7465726e616c206e6f6465206861736800000000000060448201526064016102eb565b611e1c601060016133fb565b8260200151511415611e95578551841415611e365761207f565b6000868581518110611e4a57611e4a613096565b602001015160f81c60f81b60f81c9050600083602001518260ff1681518110611e7557611e75613096565b60200260200101519050611e88816128ef565b965060019450505061206d565b60028260200151511415612025576000611eae83612925565b9050600081600081518110611ec557611ec5613096565b016020015160f81c90506000611edc600283613429565b611ee790600261344b565b90506000611ef8848360ff16612949565b90506000611f068b8a612949565b90506000611f14838361297f565b905060ff851660021480611f2b575060ff85166003145b15611f6557808351148015611f405750808251145b15611f5257611f4f818b6133fb565b99505b50600160ff1b995061207f945050505050565b60ff85161580611f78575060ff85166001145b15611fce5782518114611f985750600160ff1b995061207f945050505050565b611fbf8860200151600181518110611fb257611fb2613096565b60200260200101516128ef565b9a50975061206d945050505050565b60405162461bcd60e51b815260206004820152602660248201527f52656365697665642061206e6f6465207769746820616e20756e6b6e6f776e206044820152650e0e4caccd2f60d31b60648201526084016102eb565b60405162461bcd60e51b815260206004820152601d60248201527f526563656976656420616e20756e706172736561626c65206e6f64652e00000060448201526064016102eb565b806120778161320e565b915050611cbd565b50600160ff1b8414866120928786612949565b909e909d50909b509950505050505050505050565b602081015180516060916104a4916120c1906001906130d6565b81518110611c1e57611c1e613096565b60606000806120df846122bd565b919350909150600190508160018111156120fb576120fb613413565b146121485760405162461bcd60e51b815260206004820152601760248201527f496e76616c696420524c50206c6973742076616c75652e00000000000000000060448201526064016102eb565b6040805160208082526104208201909252600091816020015b60408051808201909152600080825260208201528152602001906001900390816121615790505090506000835b86518110156122b257602082106121fa5760405162461bcd60e51b815260206004820152602a60248201527f50726f766964656420524c50206c6973742065786365656473206d6178206c6960448201526939ba103632b733ba341760b11b60648201526084016102eb565b6000806122376040518060400160405280858c6000015161221b91906130d6565b8152602001858c6020015161223091906133fb565b90526122bd565b50915091506040518060400160405280838361225391906133fb565b8152602001848b6020015161226891906133fb565b81525085858151811061227d5761227d613096565b60209081029190910101526122936001856133fb565b935061229f81836133fb565b6122a990846133fb565b9250505061218e565b508152949350505050565b6000806000808460000151116123155760405162461bcd60e51b815260206004820152601860248201527f524c50206974656d2063616e6e6f74206265206e756c6c2e000000000000000060448201526064016102eb565b6020840151805160001a607f811161233a576000600160009450945094505050612600565b60b781116123b657600061234f6080836130d6565b9050808760000151116123a45760405162461bcd60e51b815260206004820152601960248201527f496e76616c696420524c502073686f727420737472696e672e0000000000000060448201526064016102eb565b60019550935060009250612600915050565b60bf81116124a55760006123cb60b7836130d6565b9050808760000151116124205760405162461bcd60e51b815260206004820152601f60248201527f496e76616c696420524c50206c6f6e6720737472696e67206c656e6774682e0060448201526064016102eb565b600183015160208290036101000a900461243a81836133fb565b8851116124895760405162461bcd60e51b815260206004820152601860248201527f496e76616c696420524c50206c6f6e6720737472696e672e000000000000000060448201526064016102eb565b6124948260016133fb565b965094506000935061260092505050565b60f781116125205760006124ba60c0836130d6565b90508087600001511161250f5760405162461bcd60e51b815260206004820152601760248201527f496e76616c696420524c502073686f7274206c6973742e00000000000000000060448201526064016102eb565b600195509350849250612600915050565b600061252d60f7836130d6565b9050808760000151116125825760405162461bcd60e51b815260206004820152601d60248201527f496e76616c696420524c50206c6f6e67206c697374206c656e6774682e00000060448201526064016102eb565b600183015160208290036101000a900461259c81836133fb565b8851116125e45760405162461bcd60e51b815260206004820152601660248201527524b73b30b634b210292628103637b733903634b9ba1760511b60448201526064016102eb565b6125ef8260016133fb565b965094506001935061260092505050565b9193909250565b60606000826001600160401b0381111561262357612623612f89565b6040519080825280601f01601f19166020018201604052801561264d576020820181803683370190505b509050805160001415612661579050610ce6565b600061266d85876133fb565b90506020820160005b61268160208761346e565b8110156126b857825182526126976020846133fb565b92506126a46020836133fb565b9150806126b08161320e565b915050612676565b5060006001602087066020036101000a039050808251168119845116178252839450505050509392505050565b6000806126f0612bf3565b6126f8612c11565b602080825281810181905260408201819052606082018890526080820187905260a082018690528260c08360056107d05a03fa92508280156107e95750826127825760405162461bcd60e51b815260206004820152601a60248201527f424e3235342e6578704d6f643a2063616c6c206661696c75726500000000000060448201526064016102eb565b505195945050505050565b606060008251600261279f91906133dc565b6001600160401b038111156127b6576127b6612f89565b6040519080825280601f01601f1916602001820160405280156127e0576020820181803683370190505b50905060005b83518110156128c057600484828151811061280357612803613096565b01602001516001600160f81b031916901c826128208360026133dc565b8151811061283057612830613096565b60200101906001600160f81b031916908160001a905350601084828151811061285b5761285b613096565b016020015161286d919060f81c613429565b60f81b8261287c8360026133dc565b6128879060016133fb565b8151811061289757612897613096565b60200101906001600160f81b031916908160001a905350806128b88161320e565b9150506127e6565b5092915050565b60006020825110156128db57506020015190565b818060200190518101906104a49190613482565b6000606060208360000151101561291057612909836129fb565b905061291c565b61291983611a77565b90505b610ce6816128c7565b60606104a46129448360200151600081518110611c1e57611c1e613096565b61278d565b60608251821061296857506040805160208101909152600081526104a4565b610ce6838384865161297a91906130d6565b612a06565b6000805b8084511180156129935750808351115b80156129e457508281815181106129ac576129ac613096565b602001015160f81c60f81b6001600160f81b0319168482815181106129d3576129d3613096565b01602001516001600160f81b031916145b15610ce657806129f38161320e565b915050612983565b60606104a482612b5d565b606081612a1481601f6133fb565b1015612a535760405162461bcd60e51b815260206004820152600e60248201526d736c6963655f6f766572666c6f7760901b60448201526064016102eb565b82612a5e83826133fb565b1015612a9d5760405162461bcd60e51b815260206004820152600e60248201526d736c6963655f6f766572666c6f7760901b60448201526064016102eb565b612aa782846133fb565b84511015612aeb5760405162461bcd60e51b8152602060048201526011602482015270736c6963655f6f75744f66426f756e647360781b60448201526064016102eb565b606082158015612b0a5760405191506000825260208201604052612b54565b6040519150601f8416801560200281840101858101878315602002848b0101015b81831015612b43578051835260209283019201612b2b565b5050858452601f01601f1916604052505b50949350505050565b60606104a4826020015160008460000151612607565b60405180608001604052806004906020820280368337509192915050565b60405180606001604052806003906020820280368337509192915050565b6040518060400160405280612bc2612c2f565b8152602001612bcf612c2f565b905290565b604051806101800160405280600c906020820280368337509192915050565b60405180602001604052806001906020820280368337509192915050565b6040518060c001604052806006906020820280368337509192915050565b60405180604001604052806002906020820280368337509192915050565b80356001600160801b03811681146108c757600080fd5b600060208284031215612c7657600080fd5b610ce682612c4d565b600060e08284031215612c9157600080fd5b50919050565b60008060408385031215612caa57600080fd5b82356001600160401b0380821115612cc157600080fd5b9084019060608287031215612cd557600080fd5b90925060208401359080821115612ceb57600080fd5b50612cf885828601612c7f565b9150509250929050565b600060808284031215612c9157600080fd5b60008060a08385031215612d2757600080fd5b612d318484612d02565b915060808301356001600160401b03811115612d4c57600080fd5b612cf885828601612c7f565b803563ffffffff811681146108c757600080fd5b80356001600160401b03811681146108c757600080fd5b60008060408385031215612d9657600080fd5b612d9f83612d58565b9150612dad60208401612d6c565b90509250929050565b60008060008060c08587031215612dcc57600080fd5b612dd68686612d02565b935060808501356001600160401b0380821115612df257600080fd5b612dfe88838901612d02565b945060a0870135915080821115612e1457600080fd5b818701915087601f830112612e2857600080fd5b813581811115612e3757600080fd5b886020828501011115612e4957600080fd5b95989497505060200194505050565b60008060a08385031215612e6b57600080fd5b612e758484612d02565b915060808301356001600160401b03811115612e9057600080fd5b612cf885828601612d02565b600060208284031215612eae57600080fd5b5035919050565b600060208284031215612ec757600080fd5b81356001600160a01b0381168114610ce657600080fd5b600060208284031215612ef057600080fd5b610ce682612d6c565b634e487b7160e01b600052601160045260246000fd5b60006001600160401b03808316818516808303821115612f3157612f31612ef9565b01949350505050565b6000808335601e19843603018112612f5157600080fd5b8301803591506001600160401b03821115612f6b57600080fd5b6020019150606081023603821315612f8257600080fd5b9250929050565b634e487b7160e01b600052604160045260246000fd5b604080519081016001600160401b0381118282101715612fc157612fc1612f89565b60405290565b600060408284031215612fd957600080fd5b612fe1612f9f565b9050813581526020820135602082015292915050565b60006060828403121561300957600080fd5b613011612f9f565b61301b8484612fc7565b815261302960408401612c4d565b60208201529392505050565b60006020828403121561304757600080fd5b610ce682612d58565b6000808335601e1984360301811261306757600080fd5b8301803591506001600160401b0382111561308157600080fd5b602001915036819003821315612f8257600080fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601260045260246000fd5b6000826130d1576130d16130ac565b500690565b6000828210156130e8576130e8612ef9565b500390565b60006020808352608083016001600160401b038061310a87612d6c565b168386015261311a838701612d6c565b604082821681880152808801359150601e1988360301821261313b57600080fd5b9087019081358381111561314e57600080fd5b60609350838102360389131561316357600080fd5b87840184905293849052908401926000919060a088015b818410156131b8578535815286860135878201526001600160801b036131a1848801612c4d565b16818401529484019460019390930192840161317a565b9998505050505050505050565b6000808335601e198436030181126131dc57600080fd5b8301803591506001600160401b038211156131f657600080fd5b6020019150600581901b3603821315612f8257600080fd5b600060001982141561322257613222612ef9565b5060010190565b600082601f83011261323a57600080fd5b604051604081018181106001600160401b038211171561325c5761325c612f89565b806040525080604084018581111561327357600080fd5b845b8181101561328d578035835260209283019201613275565b509195945050505050565b6000608082840312156132aa57600080fd5b6132b2612f9f565b6132bc8484613229565b81526130298460408501613229565b6000604082840312156132dd57600080fd5b610ce68383612fc7565b60006001600160801b038083168185168183048111821515161561330d5761330d612ef9565b02949350505050565b60006001600160801b0380841680613330576133306130ac565b92169190910492915050565b60006001600160801b038381169083168181101561335c5761335c612ef9565b039392505050565b60006001600160801b03808316818516808303821115612f3157612f31612ef9565b6080810163ffffffff61339884612d58565b1682526133a760208401612d6c565b6001600160401b038082166020850152806133c460408701612d6c565b16604085015250506060830135606083015292915050565b60008160001904831182151516156133f6576133f6612ef9565b500290565b6000821982111561340e5761340e612ef9565b500190565b634e487b7160e01b600052602160045260246000fd5b600060ff83168061343c5761343c6130ac565b8060ff84160691505092915050565b600060ff821660ff84168082101561346557613465612ef9565b90039392505050565b60008261347d5761347d6130ac565b500490565b60006020828403121561349457600080fd5b505191905056fe30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47a264697066735822122037a5fc0d840d33d9337c8a0e1f0d9f5b9aa25cd6867532fbafda8e4c4c2de98064736f6c634300080c003330644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47", +} + +// ContractSFFLRegistryRollupABI is the input ABI used to generate the binding from. +// Deprecated: Use ContractSFFLRegistryRollupMetaData.ABI instead. +var ContractSFFLRegistryRollupABI = ContractSFFLRegistryRollupMetaData.ABI + +// ContractSFFLRegistryRollupBin is the compiled bytecode used for deploying new contracts. +// Deprecated: Use ContractSFFLRegistryRollupMetaData.Bin instead. +var ContractSFFLRegistryRollupBin = ContractSFFLRegistryRollupMetaData.Bin + +// DeployContractSFFLRegistryRollup deploys a new Ethereum contract, binding an instance of ContractSFFLRegistryRollup to it. +func DeployContractSFFLRegistryRollup(auth *bind.TransactOpts, backend bind.ContractBackend, operators []OperatorsOperator, quorumThreshold *big.Int, operatorUpdateId uint64) (common.Address, *types.Transaction, *ContractSFFLRegistryRollup, error) { + parsed, err := ContractSFFLRegistryRollupMetaData.GetAbi() + if err != nil { + return common.Address{}, nil, nil, err + } + if parsed == nil { + return common.Address{}, nil, nil, errors.New("GetABI returned nil") + } + + address, tx, contract, err := bind.DeployContract(auth, *parsed, common.FromHex(ContractSFFLRegistryRollupBin), backend, operators, quorumThreshold, operatorUpdateId) + if err != nil { + return common.Address{}, nil, nil, err + } + return address, tx, &ContractSFFLRegistryRollup{ContractSFFLRegistryRollupCaller: ContractSFFLRegistryRollupCaller{contract: contract}, ContractSFFLRegistryRollupTransactor: ContractSFFLRegistryRollupTransactor{contract: contract}, ContractSFFLRegistryRollupFilterer: ContractSFFLRegistryRollupFilterer{contract: contract}}, nil +} + +// ContractSFFLRegistryRollup is an auto generated Go binding around an Ethereum contract. +type ContractSFFLRegistryRollup struct { + ContractSFFLRegistryRollupCaller // Read-only binding to the contract + ContractSFFLRegistryRollupTransactor // Write-only binding to the contract + ContractSFFLRegistryRollupFilterer // Log filterer for contract events +} + +// ContractSFFLRegistryRollupCaller is an auto generated read-only Go binding around an Ethereum contract. +type ContractSFFLRegistryRollupCaller struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// ContractSFFLRegistryRollupTransactor is an auto generated write-only Go binding around an Ethereum contract. +type ContractSFFLRegistryRollupTransactor struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// ContractSFFLRegistryRollupFilterer is an auto generated log filtering Go binding around an Ethereum contract events. +type ContractSFFLRegistryRollupFilterer struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// ContractSFFLRegistryRollupSession is an auto generated Go binding around an Ethereum contract, +// with pre-set call and transact options. +type ContractSFFLRegistryRollupSession struct { + Contract *ContractSFFLRegistryRollup // Generic contract binding to set the session for + CallOpts bind.CallOpts // Call options to use throughout this session + TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session +} + +// ContractSFFLRegistryRollupCallerSession is an auto generated read-only Go binding around an Ethereum contract, +// with pre-set call options. +type ContractSFFLRegistryRollupCallerSession struct { + Contract *ContractSFFLRegistryRollupCaller // Generic contract caller binding to set the session for + CallOpts bind.CallOpts // Call options to use throughout this session +} + +// ContractSFFLRegistryRollupTransactorSession is an auto generated write-only Go binding around an Ethereum contract, +// with pre-set transact options. +type ContractSFFLRegistryRollupTransactorSession struct { + Contract *ContractSFFLRegistryRollupTransactor // Generic contract transactor binding to set the session for + TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session +} + +// ContractSFFLRegistryRollupRaw is an auto generated low-level Go binding around an Ethereum contract. +type ContractSFFLRegistryRollupRaw struct { + Contract *ContractSFFLRegistryRollup // Generic contract binding to access the raw methods on +} + +// ContractSFFLRegistryRollupCallerRaw is an auto generated low-level read-only Go binding around an Ethereum contract. +type ContractSFFLRegistryRollupCallerRaw struct { + Contract *ContractSFFLRegistryRollupCaller // Generic read-only contract binding to access the raw methods on +} + +// ContractSFFLRegistryRollupTransactorRaw is an auto generated low-level write-only Go binding around an Ethereum contract. +type ContractSFFLRegistryRollupTransactorRaw struct { + Contract *ContractSFFLRegistryRollupTransactor // Generic write-only contract binding to access the raw methods on +} + +// NewContractSFFLRegistryRollup creates a new instance of ContractSFFLRegistryRollup, bound to a specific deployed contract. +func NewContractSFFLRegistryRollup(address common.Address, backend bind.ContractBackend) (*ContractSFFLRegistryRollup, error) { + contract, err := bindContractSFFLRegistryRollup(address, backend, backend, backend) + if err != nil { + return nil, err + } + return &ContractSFFLRegistryRollup{ContractSFFLRegistryRollupCaller: ContractSFFLRegistryRollupCaller{contract: contract}, ContractSFFLRegistryRollupTransactor: ContractSFFLRegistryRollupTransactor{contract: contract}, ContractSFFLRegistryRollupFilterer: ContractSFFLRegistryRollupFilterer{contract: contract}}, nil +} + +// NewContractSFFLRegistryRollupCaller creates a new read-only instance of ContractSFFLRegistryRollup, bound to a specific deployed contract. +func NewContractSFFLRegistryRollupCaller(address common.Address, caller bind.ContractCaller) (*ContractSFFLRegistryRollupCaller, error) { + contract, err := bindContractSFFLRegistryRollup(address, caller, nil, nil) + if err != nil { + return nil, err + } + return &ContractSFFLRegistryRollupCaller{contract: contract}, nil +} + +// NewContractSFFLRegistryRollupTransactor creates a new write-only instance of ContractSFFLRegistryRollup, bound to a specific deployed contract. +func NewContractSFFLRegistryRollupTransactor(address common.Address, transactor bind.ContractTransactor) (*ContractSFFLRegistryRollupTransactor, error) { + contract, err := bindContractSFFLRegistryRollup(address, nil, transactor, nil) + if err != nil { + return nil, err + } + return &ContractSFFLRegistryRollupTransactor{contract: contract}, nil +} + +// NewContractSFFLRegistryRollupFilterer creates a new log filterer instance of ContractSFFLRegistryRollup, bound to a specific deployed contract. +func NewContractSFFLRegistryRollupFilterer(address common.Address, filterer bind.ContractFilterer) (*ContractSFFLRegistryRollupFilterer, error) { + contract, err := bindContractSFFLRegistryRollup(address, nil, nil, filterer) + if err != nil { + return nil, err + } + return &ContractSFFLRegistryRollupFilterer{contract: contract}, nil +} + +// bindContractSFFLRegistryRollup binds a generic wrapper to an already deployed contract. +func bindContractSFFLRegistryRollup(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error) { + parsed, err := ContractSFFLRegistryRollupMetaData.GetAbi() + if err != nil { + return nil, err + } + return bind.NewBoundContract(address, *parsed, caller, transactor, filterer), nil +} + +// Call invokes the (constant) contract method with params as input values and +// sets the output to result. The result type might be a single field for simple +// returns, a slice of interfaces for anonymous returns and a struct for named +// returns. +func (_ContractSFFLRegistryRollup *ContractSFFLRegistryRollupRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { + return _ContractSFFLRegistryRollup.Contract.ContractSFFLRegistryRollupCaller.contract.Call(opts, result, method, params...) +} + +// Transfer initiates a plain transaction to move funds to the contract, calling +// its default method if one is available. +func (_ContractSFFLRegistryRollup *ContractSFFLRegistryRollupRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { + return _ContractSFFLRegistryRollup.Contract.ContractSFFLRegistryRollupTransactor.contract.Transfer(opts) +} + +// Transact invokes the (paid) contract method with params as input values. +func (_ContractSFFLRegistryRollup *ContractSFFLRegistryRollupRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { + return _ContractSFFLRegistryRollup.Contract.ContractSFFLRegistryRollupTransactor.contract.Transact(opts, method, params...) +} + +// Call invokes the (constant) contract method with params as input values and +// sets the output to result. The result type might be a single field for simple +// returns, a slice of interfaces for anonymous returns and a struct for named +// returns. +func (_ContractSFFLRegistryRollup *ContractSFFLRegistryRollupCallerRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { + return _ContractSFFLRegistryRollup.Contract.contract.Call(opts, result, method, params...) +} + +// Transfer initiates a plain transaction to move funds to the contract, calling +// its default method if one is available. +func (_ContractSFFLRegistryRollup *ContractSFFLRegistryRollupTransactorRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { + return _ContractSFFLRegistryRollup.Contract.contract.Transfer(opts) +} + +// Transact invokes the (paid) contract method with params as input values. +func (_ContractSFFLRegistryRollup *ContractSFFLRegistryRollupTransactorRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { + return _ContractSFFLRegistryRollup.Contract.contract.Transact(opts, method, params...) +} + +// THRESHOLDDENOMINATOR is a free data retrieval call binding the contract method 0xef024458. +// +// Solidity: function THRESHOLD_DENOMINATOR() pure returns(uint128) +func (_ContractSFFLRegistryRollup *ContractSFFLRegistryRollupCaller) THRESHOLDDENOMINATOR(opts *bind.CallOpts) (*big.Int, error) { + var out []interface{} + err := _ContractSFFLRegistryRollup.contract.Call(opts, &out, "THRESHOLD_DENOMINATOR") + + if err != nil { + return *new(*big.Int), err + } + + out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) + + return out0, err + +} + +// THRESHOLDDENOMINATOR is a free data retrieval call binding the contract method 0xef024458. +// +// Solidity: function THRESHOLD_DENOMINATOR() pure returns(uint128) +func (_ContractSFFLRegistryRollup *ContractSFFLRegistryRollupSession) THRESHOLDDENOMINATOR() (*big.Int, error) { + return _ContractSFFLRegistryRollup.Contract.THRESHOLDDENOMINATOR(&_ContractSFFLRegistryRollup.CallOpts) +} + +// THRESHOLDDENOMINATOR is a free data retrieval call binding the contract method 0xef024458. +// +// Solidity: function THRESHOLD_DENOMINATOR() pure returns(uint128) +func (_ContractSFFLRegistryRollup *ContractSFFLRegistryRollupCallerSession) THRESHOLDDENOMINATOR() (*big.Int, error) { + return _ContractSFFLRegistryRollup.Contract.THRESHOLDDENOMINATOR(&_ContractSFFLRegistryRollup.CallOpts) +} + +// GetApk is a free data retrieval call binding the contract method 0x6f5b9918. +// +// Solidity: function getApk() view returns((uint256,uint256)) +func (_ContractSFFLRegistryRollup *ContractSFFLRegistryRollupCaller) GetApk(opts *bind.CallOpts) (BN254G1Point, error) { + var out []interface{} + err := _ContractSFFLRegistryRollup.contract.Call(opts, &out, "getApk") + + if err != nil { + return *new(BN254G1Point), err + } + + out0 := *abi.ConvertType(out[0], new(BN254G1Point)).(*BN254G1Point) + + return out0, err + +} + +// GetApk is a free data retrieval call binding the contract method 0x6f5b9918. +// +// Solidity: function getApk() view returns((uint256,uint256)) +func (_ContractSFFLRegistryRollup *ContractSFFLRegistryRollupSession) GetApk() (BN254G1Point, error) { + return _ContractSFFLRegistryRollup.Contract.GetApk(&_ContractSFFLRegistryRollup.CallOpts) +} + +// GetApk is a free data retrieval call binding the contract method 0x6f5b9918. +// +// Solidity: function getApk() view returns((uint256,uint256)) +func (_ContractSFFLRegistryRollup *ContractSFFLRegistryRollupCallerSession) GetApk() (BN254G1Point, error) { + return _ContractSFFLRegistryRollup.Contract.GetApk(&_ContractSFFLRegistryRollup.CallOpts) +} + +// GetOperatorWeight is a free data retrieval call binding the contract method 0xdd64766e. +// +// Solidity: function getOperatorWeight(bytes32 pubkeyHash) view returns(uint128) +func (_ContractSFFLRegistryRollup *ContractSFFLRegistryRollupCaller) GetOperatorWeight(opts *bind.CallOpts, pubkeyHash [32]byte) (*big.Int, error) { + var out []interface{} + err := _ContractSFFLRegistryRollup.contract.Call(opts, &out, "getOperatorWeight", pubkeyHash) + + if err != nil { + return *new(*big.Int), err + } + + out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) + + return out0, err + +} + +// GetOperatorWeight is a free data retrieval call binding the contract method 0xdd64766e. +// +// Solidity: function getOperatorWeight(bytes32 pubkeyHash) view returns(uint128) +func (_ContractSFFLRegistryRollup *ContractSFFLRegistryRollupSession) GetOperatorWeight(pubkeyHash [32]byte) (*big.Int, error) { + return _ContractSFFLRegistryRollup.Contract.GetOperatorWeight(&_ContractSFFLRegistryRollup.CallOpts, pubkeyHash) +} + +// GetOperatorWeight is a free data retrieval call binding the contract method 0xdd64766e. +// +// Solidity: function getOperatorWeight(bytes32 pubkeyHash) view returns(uint128) +func (_ContractSFFLRegistryRollup *ContractSFFLRegistryRollupCallerSession) GetOperatorWeight(pubkeyHash [32]byte) (*big.Int, error) { + return _ContractSFFLRegistryRollup.Contract.GetOperatorWeight(&_ContractSFFLRegistryRollup.CallOpts, pubkeyHash) +} + +// GetQuorumThreshold is a free data retrieval call binding the contract method 0x4afa71b9. +// +// Solidity: function getQuorumThreshold() view returns(uint128) +func (_ContractSFFLRegistryRollup *ContractSFFLRegistryRollupCaller) GetQuorumThreshold(opts *bind.CallOpts) (*big.Int, error) { + var out []interface{} + err := _ContractSFFLRegistryRollup.contract.Call(opts, &out, "getQuorumThreshold") + + if err != nil { + return *new(*big.Int), err + } + + out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) + + return out0, err + +} + +// GetQuorumThreshold is a free data retrieval call binding the contract method 0x4afa71b9. +// +// Solidity: function getQuorumThreshold() view returns(uint128) +func (_ContractSFFLRegistryRollup *ContractSFFLRegistryRollupSession) GetQuorumThreshold() (*big.Int, error) { + return _ContractSFFLRegistryRollup.Contract.GetQuorumThreshold(&_ContractSFFLRegistryRollup.CallOpts) +} + +// GetQuorumThreshold is a free data retrieval call binding the contract method 0x4afa71b9. +// +// Solidity: function getQuorumThreshold() view returns(uint128) +func (_ContractSFFLRegistryRollup *ContractSFFLRegistryRollupCallerSession) GetQuorumThreshold() (*big.Int, error) { + return _ContractSFFLRegistryRollup.Contract.GetQuorumThreshold(&_ContractSFFLRegistryRollup.CallOpts) +} + +// GetStateRoot is a free data retrieval call binding the contract method 0xb3a9e53b. +// +// Solidity: function getStateRoot(uint32 rollupId, uint64 blockHeight) view returns(bytes32) +func (_ContractSFFLRegistryRollup *ContractSFFLRegistryRollupCaller) GetStateRoot(opts *bind.CallOpts, rollupId uint32, blockHeight uint64) ([32]byte, error) { + var out []interface{} + err := _ContractSFFLRegistryRollup.contract.Call(opts, &out, "getStateRoot", rollupId, blockHeight) + + if err != nil { + return *new([32]byte), err + } + + out0 := *abi.ConvertType(out[0], new([32]byte)).(*[32]byte) + + return out0, err + +} + +// GetStateRoot is a free data retrieval call binding the contract method 0xb3a9e53b. +// +// Solidity: function getStateRoot(uint32 rollupId, uint64 blockHeight) view returns(bytes32) +func (_ContractSFFLRegistryRollup *ContractSFFLRegistryRollupSession) GetStateRoot(rollupId uint32, blockHeight uint64) ([32]byte, error) { + return _ContractSFFLRegistryRollup.Contract.GetStateRoot(&_ContractSFFLRegistryRollup.CallOpts, rollupId, blockHeight) +} + +// GetStateRoot is a free data retrieval call binding the contract method 0xb3a9e53b. +// +// Solidity: function getStateRoot(uint32 rollupId, uint64 blockHeight) view returns(bytes32) +func (_ContractSFFLRegistryRollup *ContractSFFLRegistryRollupCallerSession) GetStateRoot(rollupId uint32, blockHeight uint64) ([32]byte, error) { + return _ContractSFFLRegistryRollup.Contract.GetStateRoot(&_ContractSFFLRegistryRollup.CallOpts, rollupId, blockHeight) +} + +// GetStorageValue is a free data retrieval call binding the contract method 0xccd3bd9e. +// +// Solidity: function getStorageValue((uint32,uint64,uint64,bytes32) message, (address,bytes32,bytes,bytes) proofParams) view returns(bytes32) +func (_ContractSFFLRegistryRollup *ContractSFFLRegistryRollupCaller) GetStorageValue(opts *bind.CallOpts, message StateRootUpdateMessage, proofParams SFFLRegistryBaseProofParams) ([32]byte, error) { + var out []interface{} + err := _ContractSFFLRegistryRollup.contract.Call(opts, &out, "getStorageValue", message, proofParams) + + if err != nil { + return *new([32]byte), err + } + + out0 := *abi.ConvertType(out[0], new([32]byte)).(*[32]byte) + + return out0, err + +} + +// GetStorageValue is a free data retrieval call binding the contract method 0xccd3bd9e. +// +// Solidity: function getStorageValue((uint32,uint64,uint64,bytes32) message, (address,bytes32,bytes,bytes) proofParams) view returns(bytes32) +func (_ContractSFFLRegistryRollup *ContractSFFLRegistryRollupSession) GetStorageValue(message StateRootUpdateMessage, proofParams SFFLRegistryBaseProofParams) ([32]byte, error) { + return _ContractSFFLRegistryRollup.Contract.GetStorageValue(&_ContractSFFLRegistryRollup.CallOpts, message, proofParams) +} + +// GetStorageValue is a free data retrieval call binding the contract method 0xccd3bd9e. +// +// Solidity: function getStorageValue((uint32,uint64,uint64,bytes32) message, (address,bytes32,bytes,bytes) proofParams) view returns(bytes32) +func (_ContractSFFLRegistryRollup *ContractSFFLRegistryRollupCallerSession) GetStorageValue(message StateRootUpdateMessage, proofParams SFFLRegistryBaseProofParams) ([32]byte, error) { + return _ContractSFFLRegistryRollup.Contract.GetStorageValue(&_ContractSFFLRegistryRollup.CallOpts, message, proofParams) +} + +// GetTotalWeight is a free data retrieval call binding the contract method 0x06aba0e1. +// +// Solidity: function getTotalWeight() view returns(uint128) +func (_ContractSFFLRegistryRollup *ContractSFFLRegistryRollupCaller) GetTotalWeight(opts *bind.CallOpts) (*big.Int, error) { + var out []interface{} + err := _ContractSFFLRegistryRollup.contract.Call(opts, &out, "getTotalWeight") + + if err != nil { + return *new(*big.Int), err + } + + out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) + + return out0, err + +} + +// GetTotalWeight is a free data retrieval call binding the contract method 0x06aba0e1. +// +// Solidity: function getTotalWeight() view returns(uint128) +func (_ContractSFFLRegistryRollup *ContractSFFLRegistryRollupSession) GetTotalWeight() (*big.Int, error) { + return _ContractSFFLRegistryRollup.Contract.GetTotalWeight(&_ContractSFFLRegistryRollup.CallOpts) +} + +// GetTotalWeight is a free data retrieval call binding the contract method 0x06aba0e1. +// +// Solidity: function getTotalWeight() view returns(uint128) +func (_ContractSFFLRegistryRollup *ContractSFFLRegistryRollupCallerSession) GetTotalWeight() (*big.Int, error) { + return _ContractSFFLRegistryRollup.Contract.GetTotalWeight(&_ContractSFFLRegistryRollup.CallOpts) +} + +// NextOperatorUpdateId is a free data retrieval call binding the contract method 0xe0f5d9f0. +// +// Solidity: function nextOperatorUpdateId() view returns(uint64) +func (_ContractSFFLRegistryRollup *ContractSFFLRegistryRollupCaller) NextOperatorUpdateId(opts *bind.CallOpts) (uint64, error) { + var out []interface{} + err := _ContractSFFLRegistryRollup.contract.Call(opts, &out, "nextOperatorUpdateId") + + if err != nil { + return *new(uint64), err + } + + out0 := *abi.ConvertType(out[0], new(uint64)).(*uint64) + + return out0, err + +} + +// NextOperatorUpdateId is a free data retrieval call binding the contract method 0xe0f5d9f0. +// +// Solidity: function nextOperatorUpdateId() view returns(uint64) +func (_ContractSFFLRegistryRollup *ContractSFFLRegistryRollupSession) NextOperatorUpdateId() (uint64, error) { + return _ContractSFFLRegistryRollup.Contract.NextOperatorUpdateId(&_ContractSFFLRegistryRollup.CallOpts) +} + +// NextOperatorUpdateId is a free data retrieval call binding the contract method 0xe0f5d9f0. +// +// Solidity: function nextOperatorUpdateId() view returns(uint64) +func (_ContractSFFLRegistryRollup *ContractSFFLRegistryRollupCallerSession) NextOperatorUpdateId() (uint64, error) { + return _ContractSFFLRegistryRollup.Contract.NextOperatorUpdateId(&_ContractSFFLRegistryRollup.CallOpts) +} + +// Owner is a free data retrieval call binding the contract method 0x8da5cb5b. +// +// Solidity: function owner() view returns(address) +func (_ContractSFFLRegistryRollup *ContractSFFLRegistryRollupCaller) Owner(opts *bind.CallOpts) (common.Address, error) { + var out []interface{} + err := _ContractSFFLRegistryRollup.contract.Call(opts, &out, "owner") + + if err != nil { + return *new(common.Address), err + } + + out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address) + + return out0, err + +} + +// Owner is a free data retrieval call binding the contract method 0x8da5cb5b. +// +// Solidity: function owner() view returns(address) +func (_ContractSFFLRegistryRollup *ContractSFFLRegistryRollupSession) Owner() (common.Address, error) { + return _ContractSFFLRegistryRollup.Contract.Owner(&_ContractSFFLRegistryRollup.CallOpts) +} + +// Owner is a free data retrieval call binding the contract method 0x8da5cb5b. +// +// Solidity: function owner() view returns(address) +func (_ContractSFFLRegistryRollup *ContractSFFLRegistryRollupCallerSession) Owner() (common.Address, error) { + return _ContractSFFLRegistryRollup.Contract.Owner(&_ContractSFFLRegistryRollup.CallOpts) +} + +// RenounceOwnership is a paid mutator transaction binding the contract method 0x715018a6. +// +// Solidity: function renounceOwnership() returns() +func (_ContractSFFLRegistryRollup *ContractSFFLRegistryRollupTransactor) RenounceOwnership(opts *bind.TransactOpts) (*types.Transaction, error) { + return _ContractSFFLRegistryRollup.contract.Transact(opts, "renounceOwnership") +} + +// RenounceOwnership is a paid mutator transaction binding the contract method 0x715018a6. +// +// Solidity: function renounceOwnership() returns() +func (_ContractSFFLRegistryRollup *ContractSFFLRegistryRollupSession) RenounceOwnership() (*types.Transaction, error) { + return _ContractSFFLRegistryRollup.Contract.RenounceOwnership(&_ContractSFFLRegistryRollup.TransactOpts) +} + +// RenounceOwnership is a paid mutator transaction binding the contract method 0x715018a6. +// +// Solidity: function renounceOwnership() returns() +func (_ContractSFFLRegistryRollup *ContractSFFLRegistryRollupTransactorSession) RenounceOwnership() (*types.Transaction, error) { + return _ContractSFFLRegistryRollup.Contract.RenounceOwnership(&_ContractSFFLRegistryRollup.TransactOpts) +} + +// SetQuorumThreshold is a paid mutator transaction binding the contract method 0x2db52ea5. +// +// Solidity: function setQuorumThreshold(uint128 newQuorumThreshold) returns() +func (_ContractSFFLRegistryRollup *ContractSFFLRegistryRollupTransactor) SetQuorumThreshold(opts *bind.TransactOpts, newQuorumThreshold *big.Int) (*types.Transaction, error) { + return _ContractSFFLRegistryRollup.contract.Transact(opts, "setQuorumThreshold", newQuorumThreshold) +} + +// SetQuorumThreshold is a paid mutator transaction binding the contract method 0x2db52ea5. +// +// Solidity: function setQuorumThreshold(uint128 newQuorumThreshold) returns() +func (_ContractSFFLRegistryRollup *ContractSFFLRegistryRollupSession) SetQuorumThreshold(newQuorumThreshold *big.Int) (*types.Transaction, error) { + return _ContractSFFLRegistryRollup.Contract.SetQuorumThreshold(&_ContractSFFLRegistryRollup.TransactOpts, newQuorumThreshold) +} + +// SetQuorumThreshold is a paid mutator transaction binding the contract method 0x2db52ea5. +// +// Solidity: function setQuorumThreshold(uint128 newQuorumThreshold) returns() +func (_ContractSFFLRegistryRollup *ContractSFFLRegistryRollupTransactorSession) SetQuorumThreshold(newQuorumThreshold *big.Int) (*types.Transaction, error) { + return _ContractSFFLRegistryRollup.Contract.SetQuorumThreshold(&_ContractSFFLRegistryRollup.TransactOpts, newQuorumThreshold) +} + +// TransferOwnership is a paid mutator transaction binding the contract method 0xf2fde38b. +// +// Solidity: function transferOwnership(address newOwner) returns() +func (_ContractSFFLRegistryRollup *ContractSFFLRegistryRollupTransactor) TransferOwnership(opts *bind.TransactOpts, newOwner common.Address) (*types.Transaction, error) { + return _ContractSFFLRegistryRollup.contract.Transact(opts, "transferOwnership", newOwner) +} + +// TransferOwnership is a paid mutator transaction binding the contract method 0xf2fde38b. +// +// Solidity: function transferOwnership(address newOwner) returns() +func (_ContractSFFLRegistryRollup *ContractSFFLRegistryRollupSession) TransferOwnership(newOwner common.Address) (*types.Transaction, error) { + return _ContractSFFLRegistryRollup.Contract.TransferOwnership(&_ContractSFFLRegistryRollup.TransactOpts, newOwner) +} + +// TransferOwnership is a paid mutator transaction binding the contract method 0xf2fde38b. +// +// Solidity: function transferOwnership(address newOwner) returns() +func (_ContractSFFLRegistryRollup *ContractSFFLRegistryRollupTransactorSession) TransferOwnership(newOwner common.Address) (*types.Transaction, error) { + return _ContractSFFLRegistryRollup.Contract.TransferOwnership(&_ContractSFFLRegistryRollup.TransactOpts, newOwner) +} + +// UpdateAndGetStorageValue is a paid mutator transaction binding the contract method 0xb708c083. +// +// Solidity: function updateAndGetStorageValue((uint32,uint64,uint64,bytes32) message, (address,bytes32,bytes,bytes) proofParams, bytes agreement) returns(bytes32) +func (_ContractSFFLRegistryRollup *ContractSFFLRegistryRollupTransactor) UpdateAndGetStorageValue(opts *bind.TransactOpts, message StateRootUpdateMessage, proofParams SFFLRegistryBaseProofParams, agreement []byte) (*types.Transaction, error) { + return _ContractSFFLRegistryRollup.contract.Transact(opts, "updateAndGetStorageValue", message, proofParams, agreement) +} + +// UpdateAndGetStorageValue is a paid mutator transaction binding the contract method 0xb708c083. +// +// Solidity: function updateAndGetStorageValue((uint32,uint64,uint64,bytes32) message, (address,bytes32,bytes,bytes) proofParams, bytes agreement) returns(bytes32) +func (_ContractSFFLRegistryRollup *ContractSFFLRegistryRollupSession) UpdateAndGetStorageValue(message StateRootUpdateMessage, proofParams SFFLRegistryBaseProofParams, agreement []byte) (*types.Transaction, error) { + return _ContractSFFLRegistryRollup.Contract.UpdateAndGetStorageValue(&_ContractSFFLRegistryRollup.TransactOpts, message, proofParams, agreement) +} + +// UpdateAndGetStorageValue is a paid mutator transaction binding the contract method 0xb708c083. +// +// Solidity: function updateAndGetStorageValue((uint32,uint64,uint64,bytes32) message, (address,bytes32,bytes,bytes) proofParams, bytes agreement) returns(bytes32) +func (_ContractSFFLRegistryRollup *ContractSFFLRegistryRollupTransactorSession) UpdateAndGetStorageValue(message StateRootUpdateMessage, proofParams SFFLRegistryBaseProofParams, agreement []byte) (*types.Transaction, error) { + return _ContractSFFLRegistryRollup.Contract.UpdateAndGetStorageValue(&_ContractSFFLRegistryRollup.TransactOpts, message, proofParams, agreement) +} + +// UpdateOperatorSet is a paid mutator transaction binding the contract method 0x43633b0f. +// +// Solidity: function updateOperatorSet((uint64,uint64,((uint256,uint256),uint128)[]) message, (bytes32[],(uint256[2],uint256[2]),(uint256,uint256)) signatureInfo) returns() +func (_ContractSFFLRegistryRollup *ContractSFFLRegistryRollupTransactor) UpdateOperatorSet(opts *bind.TransactOpts, message OperatorSetUpdateMessage, signatureInfo OperatorsSignatureInfo) (*types.Transaction, error) { + return _ContractSFFLRegistryRollup.contract.Transact(opts, "updateOperatorSet", message, signatureInfo) +} + +// UpdateOperatorSet is a paid mutator transaction binding the contract method 0x43633b0f. +// +// Solidity: function updateOperatorSet((uint64,uint64,((uint256,uint256),uint128)[]) message, (bytes32[],(uint256[2],uint256[2]),(uint256,uint256)) signatureInfo) returns() +func (_ContractSFFLRegistryRollup *ContractSFFLRegistryRollupSession) UpdateOperatorSet(message OperatorSetUpdateMessage, signatureInfo OperatorsSignatureInfo) (*types.Transaction, error) { + return _ContractSFFLRegistryRollup.Contract.UpdateOperatorSet(&_ContractSFFLRegistryRollup.TransactOpts, message, signatureInfo) +} + +// UpdateOperatorSet is a paid mutator transaction binding the contract method 0x43633b0f. +// +// Solidity: function updateOperatorSet((uint64,uint64,((uint256,uint256),uint128)[]) message, (bytes32[],(uint256[2],uint256[2]),(uint256,uint256)) signatureInfo) returns() +func (_ContractSFFLRegistryRollup *ContractSFFLRegistryRollupTransactorSession) UpdateOperatorSet(message OperatorSetUpdateMessage, signatureInfo OperatorsSignatureInfo) (*types.Transaction, error) { + return _ContractSFFLRegistryRollup.Contract.UpdateOperatorSet(&_ContractSFFLRegistryRollup.TransactOpts, message, signatureInfo) +} + +// UpdateStateRoot is a paid mutator transaction binding the contract method 0x44a74c90. +// +// Solidity: function updateStateRoot((uint32,uint64,uint64,bytes32) message, (bytes32[],(uint256[2],uint256[2]),(uint256,uint256)) signatureInfo) returns() +func (_ContractSFFLRegistryRollup *ContractSFFLRegistryRollupTransactor) UpdateStateRoot(opts *bind.TransactOpts, message StateRootUpdateMessage, signatureInfo OperatorsSignatureInfo) (*types.Transaction, error) { + return _ContractSFFLRegistryRollup.contract.Transact(opts, "updateStateRoot", message, signatureInfo) +} + +// UpdateStateRoot is a paid mutator transaction binding the contract method 0x44a74c90. +// +// Solidity: function updateStateRoot((uint32,uint64,uint64,bytes32) message, (bytes32[],(uint256[2],uint256[2]),(uint256,uint256)) signatureInfo) returns() +func (_ContractSFFLRegistryRollup *ContractSFFLRegistryRollupSession) UpdateStateRoot(message StateRootUpdateMessage, signatureInfo OperatorsSignatureInfo) (*types.Transaction, error) { + return _ContractSFFLRegistryRollup.Contract.UpdateStateRoot(&_ContractSFFLRegistryRollup.TransactOpts, message, signatureInfo) +} + +// UpdateStateRoot is a paid mutator transaction binding the contract method 0x44a74c90. +// +// Solidity: function updateStateRoot((uint32,uint64,uint64,bytes32) message, (bytes32[],(uint256[2],uint256[2]),(uint256,uint256)) signatureInfo) returns() +func (_ContractSFFLRegistryRollup *ContractSFFLRegistryRollupTransactorSession) UpdateStateRoot(message StateRootUpdateMessage, signatureInfo OperatorsSignatureInfo) (*types.Transaction, error) { + return _ContractSFFLRegistryRollup.Contract.UpdateStateRoot(&_ContractSFFLRegistryRollup.TransactOpts, message, signatureInfo) +} + +// ContractSFFLRegistryRollupOwnershipTransferredIterator is returned from FilterOwnershipTransferred and is used to iterate over the raw logs and unpacked data for OwnershipTransferred events raised by the ContractSFFLRegistryRollup contract. +type ContractSFFLRegistryRollupOwnershipTransferredIterator struct { + Event *ContractSFFLRegistryRollupOwnershipTransferred // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *ContractSFFLRegistryRollupOwnershipTransferredIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(ContractSFFLRegistryRollupOwnershipTransferred) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(ContractSFFLRegistryRollupOwnershipTransferred) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *ContractSFFLRegistryRollupOwnershipTransferredIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *ContractSFFLRegistryRollupOwnershipTransferredIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// ContractSFFLRegistryRollupOwnershipTransferred represents a OwnershipTransferred event raised by the ContractSFFLRegistryRollup contract. +type ContractSFFLRegistryRollupOwnershipTransferred struct { + PreviousOwner common.Address + NewOwner common.Address + Raw types.Log // Blockchain specific contextual infos +} + +// FilterOwnershipTransferred is a free log retrieval operation binding the contract event 0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0. +// +// Solidity: event OwnershipTransferred(address indexed previousOwner, address indexed newOwner) +func (_ContractSFFLRegistryRollup *ContractSFFLRegistryRollupFilterer) FilterOwnershipTransferred(opts *bind.FilterOpts, previousOwner []common.Address, newOwner []common.Address) (*ContractSFFLRegistryRollupOwnershipTransferredIterator, error) { + + var previousOwnerRule []interface{} + for _, previousOwnerItem := range previousOwner { + previousOwnerRule = append(previousOwnerRule, previousOwnerItem) + } + var newOwnerRule []interface{} + for _, newOwnerItem := range newOwner { + newOwnerRule = append(newOwnerRule, newOwnerItem) + } + + logs, sub, err := _ContractSFFLRegistryRollup.contract.FilterLogs(opts, "OwnershipTransferred", previousOwnerRule, newOwnerRule) + if err != nil { + return nil, err + } + return &ContractSFFLRegistryRollupOwnershipTransferredIterator{contract: _ContractSFFLRegistryRollup.contract, event: "OwnershipTransferred", logs: logs, sub: sub}, nil +} + +// WatchOwnershipTransferred is a free log subscription operation binding the contract event 0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0. +// +// Solidity: event OwnershipTransferred(address indexed previousOwner, address indexed newOwner) +func (_ContractSFFLRegistryRollup *ContractSFFLRegistryRollupFilterer) WatchOwnershipTransferred(opts *bind.WatchOpts, sink chan<- *ContractSFFLRegistryRollupOwnershipTransferred, previousOwner []common.Address, newOwner []common.Address) (event.Subscription, error) { + + var previousOwnerRule []interface{} + for _, previousOwnerItem := range previousOwner { + previousOwnerRule = append(previousOwnerRule, previousOwnerItem) + } + var newOwnerRule []interface{} + for _, newOwnerItem := range newOwner { + newOwnerRule = append(newOwnerRule, newOwnerItem) + } + + logs, sub, err := _ContractSFFLRegistryRollup.contract.WatchLogs(opts, "OwnershipTransferred", previousOwnerRule, newOwnerRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(ContractSFFLRegistryRollupOwnershipTransferred) + if err := _ContractSFFLRegistryRollup.contract.UnpackLog(event, "OwnershipTransferred", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseOwnershipTransferred is a log parse operation binding the contract event 0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0. +// +// Solidity: event OwnershipTransferred(address indexed previousOwner, address indexed newOwner) +func (_ContractSFFLRegistryRollup *ContractSFFLRegistryRollupFilterer) ParseOwnershipTransferred(log types.Log) (*ContractSFFLRegistryRollupOwnershipTransferred, error) { + event := new(ContractSFFLRegistryRollupOwnershipTransferred) + if err := _ContractSFFLRegistryRollup.contract.UnpackLog(event, "OwnershipTransferred", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// ContractSFFLRegistryRollupStateRootUpdatedIterator is returned from FilterStateRootUpdated and is used to iterate over the raw logs and unpacked data for StateRootUpdated events raised by the ContractSFFLRegistryRollup contract. +type ContractSFFLRegistryRollupStateRootUpdatedIterator struct { + Event *ContractSFFLRegistryRollupStateRootUpdated // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *ContractSFFLRegistryRollupStateRootUpdatedIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(ContractSFFLRegistryRollupStateRootUpdated) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(ContractSFFLRegistryRollupStateRootUpdated) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *ContractSFFLRegistryRollupStateRootUpdatedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *ContractSFFLRegistryRollupStateRootUpdatedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// ContractSFFLRegistryRollupStateRootUpdated represents a StateRootUpdated event raised by the ContractSFFLRegistryRollup contract. +type ContractSFFLRegistryRollupStateRootUpdated struct { + RollupId uint32 + BlockHeight uint64 + StateRoot [32]byte + Raw types.Log // Blockchain specific contextual infos +} + +// FilterStateRootUpdated is a free log retrieval operation binding the contract event 0xca7171570f4ca232f925661b810636124eaf784a25b7c14e6b34c95b814dfdd8. +// +// Solidity: event StateRootUpdated(uint32 indexed rollupId, uint64 indexed blockHeight, bytes32 stateRoot) +func (_ContractSFFLRegistryRollup *ContractSFFLRegistryRollupFilterer) FilterStateRootUpdated(opts *bind.FilterOpts, rollupId []uint32, blockHeight []uint64) (*ContractSFFLRegistryRollupStateRootUpdatedIterator, error) { + + var rollupIdRule []interface{} + for _, rollupIdItem := range rollupId { + rollupIdRule = append(rollupIdRule, rollupIdItem) + } + var blockHeightRule []interface{} + for _, blockHeightItem := range blockHeight { + blockHeightRule = append(blockHeightRule, blockHeightItem) + } + + logs, sub, err := _ContractSFFLRegistryRollup.contract.FilterLogs(opts, "StateRootUpdated", rollupIdRule, blockHeightRule) + if err != nil { + return nil, err + } + return &ContractSFFLRegistryRollupStateRootUpdatedIterator{contract: _ContractSFFLRegistryRollup.contract, event: "StateRootUpdated", logs: logs, sub: sub}, nil +} + +// WatchStateRootUpdated is a free log subscription operation binding the contract event 0xca7171570f4ca232f925661b810636124eaf784a25b7c14e6b34c95b814dfdd8. +// +// Solidity: event StateRootUpdated(uint32 indexed rollupId, uint64 indexed blockHeight, bytes32 stateRoot) +func (_ContractSFFLRegistryRollup *ContractSFFLRegistryRollupFilterer) WatchStateRootUpdated(opts *bind.WatchOpts, sink chan<- *ContractSFFLRegistryRollupStateRootUpdated, rollupId []uint32, blockHeight []uint64) (event.Subscription, error) { + + var rollupIdRule []interface{} + for _, rollupIdItem := range rollupId { + rollupIdRule = append(rollupIdRule, rollupIdItem) + } + var blockHeightRule []interface{} + for _, blockHeightItem := range blockHeight { + blockHeightRule = append(blockHeightRule, blockHeightItem) + } + + logs, sub, err := _ContractSFFLRegistryRollup.contract.WatchLogs(opts, "StateRootUpdated", rollupIdRule, blockHeightRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(ContractSFFLRegistryRollupStateRootUpdated) + if err := _ContractSFFLRegistryRollup.contract.UnpackLog(event, "StateRootUpdated", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseStateRootUpdated is a log parse operation binding the contract event 0xca7171570f4ca232f925661b810636124eaf784a25b7c14e6b34c95b814dfdd8. +// +// Solidity: event StateRootUpdated(uint32 indexed rollupId, uint64 indexed blockHeight, bytes32 stateRoot) +func (_ContractSFFLRegistryRollup *ContractSFFLRegistryRollupFilterer) ParseStateRootUpdated(log types.Log) (*ContractSFFLRegistryRollupStateRootUpdated, error) { + event := new(ContractSFFLRegistryRollupStateRootUpdated) + if err := _ContractSFFLRegistryRollup.contract.UnpackLog(event, "StateRootUpdated", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} diff --git a/contracts/bindings/SFFLServiceManager/binding.go b/contracts/bindings/SFFLServiceManager/binding.go new file mode 100644 index 00000000..794953d0 --- /dev/null +++ b/contracts/bindings/SFFLServiceManager/binding.go @@ -0,0 +1,1066 @@ +// Code generated - DO NOT EDIT. +// This file is a generated binding and any manual changes will be lost. + +package contractSFFLServiceManager + +import ( + "errors" + "math/big" + "strings" + + ethereum "github.com/ethereum/go-ethereum" + "github.com/ethereum/go-ethereum/accounts/abi" + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/event" +) + +// Reference imports to suppress errors if they are not otherwise used. +var ( + _ = errors.New + _ = big.NewInt + _ = strings.NewReader + _ = ethereum.NotFound + _ = bind.Bind + _ = common.Big1 + _ = types.BloomLookup + _ = event.NewSubscription + _ = abi.ConvertType +) + +// BN254G1Point is an auto generated low-level Go binding around an user-defined struct. +type BN254G1Point struct { + X *big.Int + Y *big.Int +} + +// BN254G2Point is an auto generated low-level Go binding around an user-defined struct. +type BN254G2Point struct { + X [2]*big.Int + Y [2]*big.Int +} + +// IBLSSignatureCheckerNonSignerStakesAndSignature is an auto generated low-level Go binding around an user-defined struct. +type IBLSSignatureCheckerNonSignerStakesAndSignature struct { + NonSignerQuorumBitmapIndices []uint32 + NonSignerPubkeys []BN254G1Point + QuorumApks []BN254G1Point + ApkG2 BN254G2Point + Sigma BN254G1Point + QuorumApkIndices []uint32 + TotalStakeIndices []uint32 + NonSignerStakeIndices [][]uint32 +} + +// ISignatureUtilsSignatureWithSaltAndExpiry is an auto generated low-level Go binding around an user-defined struct. +type ISignatureUtilsSignatureWithSaltAndExpiry struct { + Signature []byte + Salt [32]byte + Expiry *big.Int +} + +// SFFLRegistryBaseProofParams is an auto generated low-level Go binding around an user-defined struct. +type SFFLRegistryBaseProofParams struct { + Target common.Address + StorageKey [32]byte + StateTrieWitness []byte + StorageTrieWitness []byte +} + +// StateRootUpdateMessage is an auto generated low-level Go binding around an user-defined struct. +type StateRootUpdateMessage struct { + RollupId uint32 + BlockHeight uint64 + NearBlockHeight uint64 + StateRoot [32]byte +} + +// ContractSFFLServiceManagerMetaData contains all meta data concerning the ContractSFFLServiceManager contract. +var ContractSFFLServiceManagerMetaData = &bind.MetaData{ + ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"_delegationManager\",\"type\":\"address\",\"internalType\":\"contractIDelegationManager\"},{\"name\":\"_registryCoordinator\",\"type\":\"address\",\"internalType\":\"contractIRegistryCoordinator\"},{\"name\":\"_stakeRegistry\",\"type\":\"address\",\"internalType\":\"contractIStakeRegistry\"},{\"name\":\"_taskManager\",\"type\":\"address\",\"internalType\":\"contractSFFLTaskManager\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"deregisterOperatorFromAVS\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"freezeOperator\",\"inputs\":[{\"name\":\"operatorAddr\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"getOperatorRestakedStrategies\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address[]\",\"internalType\":\"address[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getRestakeableStrategies\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address[]\",\"internalType\":\"address[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getStateRoot\",\"inputs\":[{\"name\":\"rollupId\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"blockHeight\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getStorageValue\",\"inputs\":[{\"name\":\"message\",\"type\":\"tuple\",\"internalType\":\"structStateRootUpdate.Message\",\"components\":[{\"name\":\"rollupId\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"blockHeight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"nearBlockHeight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"stateRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"name\":\"proofParams\",\"type\":\"tuple\",\"internalType\":\"structSFFLRegistryBase.ProofParams\",\"components\":[{\"name\":\"target\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"storageKey\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"stateTrieWitness\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"storageTrieWitness\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"initialOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"registerOperatorToAVS\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSignature\",\"type\":\"tuple\",\"internalType\":\"structISignatureUtils.SignatureWithSaltAndExpiry\",\"components\":[{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"salt\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"expiry\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setMetadataURI\",\"inputs\":[{\"name\":\"_metadataURI\",\"type\":\"string\",\"internalType\":\"string\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"taskManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractSFFLTaskManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"transferOwnership\",\"inputs\":[{\"name\":\"newOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"updateAndGetStorageValue\",\"inputs\":[{\"name\":\"message\",\"type\":\"tuple\",\"internalType\":\"structStateRootUpdate.Message\",\"components\":[{\"name\":\"rollupId\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"blockHeight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"nearBlockHeight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"stateRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"name\":\"proofParams\",\"type\":\"tuple\",\"internalType\":\"structSFFLRegistryBase.ProofParams\",\"components\":[{\"name\":\"target\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"storageKey\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"stateTrieWitness\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"storageTrieWitness\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"agreement\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"updateStateRoot\",\"inputs\":[{\"name\":\"message\",\"type\":\"tuple\",\"internalType\":\"structStateRootUpdate.Message\",\"components\":[{\"name\":\"rollupId\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"blockHeight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"nearBlockHeight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"stateRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"name\":\"nonSignerStakesAndSignature\",\"type\":\"tuple\",\"internalType\":\"structIBLSSignatureChecker.NonSignerStakesAndSignature\",\"components\":[{\"name\":\"nonSignerQuorumBitmapIndices\",\"type\":\"uint32[]\",\"internalType\":\"uint32[]\"},{\"name\":\"nonSignerPubkeys\",\"type\":\"tuple[]\",\"internalType\":\"structBN254.G1Point[]\",\"components\":[{\"name\":\"X\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"Y\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"name\":\"quorumApks\",\"type\":\"tuple[]\",\"internalType\":\"structBN254.G1Point[]\",\"components\":[{\"name\":\"X\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"Y\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"name\":\"apkG2\",\"type\":\"tuple\",\"internalType\":\"structBN254.G2Point\",\"components\":[{\"name\":\"X\",\"type\":\"uint256[2]\",\"internalType\":\"uint256[2]\"},{\"name\":\"Y\",\"type\":\"uint256[2]\",\"internalType\":\"uint256[2]\"}]},{\"name\":\"sigma\",\"type\":\"tuple\",\"internalType\":\"structBN254.G1Point\",\"components\":[{\"name\":\"X\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"Y\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"name\":\"quorumApkIndices\",\"type\":\"uint32[]\",\"internalType\":\"uint32[]\"},{\"name\":\"totalStakeIndices\",\"type\":\"uint32[]\",\"internalType\":\"uint32[]\"},{\"name\":\"nonSignerStakeIndices\",\"type\":\"uint32[][]\",\"internalType\":\"uint32[][]\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferred\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"StateRootUpdated\",\"inputs\":[{\"name\":\"rollupId\",\"type\":\"uint32\",\"indexed\":true,\"internalType\":\"uint32\"},{\"name\":\"blockHeight\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"stateRoot\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false}]", + Bin: "0x6101006040523480156200001257600080fd5b506040516200375c3803806200375c83398101604081905262000035916200014f565b6001600160a01b0380851660a052808416608052821660c0528383836200005b62000074565b5050506001600160a01b031660e05250620001b7915050565b600154610100900460ff1615620000e15760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b60015460ff908116101562000134576001805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6001600160a01b03811681146200014c57600080fd5b50565b600080600080608085870312156200016657600080fd5b8451620001738162000136565b6020860151909450620001868162000136565b6040860151909350620001998162000136565b6060860151909250620001ac8162000136565b939692955090935050565b60805160a05160c05160e0516134fb62000261600039600081816101a30152818161072b01528181611405015261144101526000818161044b015281816105a60152818161063d01528181610e3201528181610fb501526110540152600081816107d30152818161089c01526109700152600081816102720152818161030101528181610381015281816108480152818161091401528181610d700152610f1001526134fb6000f3fe608060405234801561001057600080fd5b50600436106100f55760003560e01c8063a50a640e11610097578063ccd3bd9e11610066578063ccd3bd9e1461020c578063d5b206a31461021f578063e481af9d14610232578063f2fde38b1461023a57600080fd5b8063a50a640e1461019e578063b3a9e53b146101c5578063b708c083146101e6578063c4d66de8146101f957600080fd5b8063750521f5116100d3578063750521f5146101405780638da5cb5b146101535780639926ee7d14610178578063a364f4da1461018b57600080fd5b806333cfb7b7146100fa57806338c8ee6414610123578063715018a614610138575b600080fd5b61010d61010836600461293b565b61024d565b60405161011a9190612958565b60405180910390f35b61013661013136600461293b565b610720565b005b6101366107a0565b61013661014e366004612a58565b6107b4565b6034546001600160a01b03165b6040516001600160a01b03909116815260200161011a565b610136610186366004612aa0565b61083d565b61013661019936600461293b565b610909565b6101607f000000000000000000000000000000000000000000000000000000000000000081565b6101d86101d3366004612b78565b61099f565b60405190815260200161011a565b6101d86101f4366004612bc5565b6109ce565b61013661020736600461293b565b610a8e565b6101d861021a366004612c67565b610b9b565b61013661022d366004612cb5565b610cf9565b61010d610d6a565b61013661024836600461293b565b611133565b6040516309aa152760e11b81526001600160a01b0382811660048301526060916000917f000000000000000000000000000000000000000000000000000000000000000016906313542a4e90602401602060405180830381865afa1580156102b9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906102dd9190612d0b565b60405163871ef04960e01b8152600481018290529091506000906001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063871ef04990602401602060405180830381865afa158015610348573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061036c9190612d24565b90506001600160c01b038116158061040657507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316639aa1653d6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156103dd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104019190612d4d565b60ff16155b156104265760408051600080825260208201909252905b50949350505050565b600061043a826001600160c01b03166111a9565b90506000805b8251811015610510577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316633ca5a5f584838151811061048a5761048a612d70565b01602001516040516001600160e01b031960e084901b16815260f89190911c6004820152602401602060405180830381865afa1580156104ce573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104f29190612d0b565b6104fc9083612d9c565b91508061050881612db4565b915050610440565b506000816001600160401b0381111561052b5761052b6129a5565b604051908082528060200260200182016040528015610554578160200160208202803683370190505b5090506000805b845181101561071357600085828151811061057857610578612d70565b0160200151604051633ca5a5f560e01b815260f89190911c6004820181905291506000906001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690633ca5a5f590602401602060405180830381865afa1580156105ed573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106119190612d0b565b905060005b818110156106fd576040516356e4026d60e11b815260ff84166004820152602481018290527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063adc804da906044016040805180830381865afa15801561068b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106af9190612dcf565b600001518686815181106106c5576106c5612d70565b6001600160a01b0390921660209283029190910190910152846106e781612db4565b95505080806106f590612db4565b915050610616565b505050808061070b90612db4565b91505061055b565b5090979650505050505050565b336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461079d5760405162461bcd60e51b815260206004820152601f60248201527f5461736b206d616e61676572206d757374206265207468652063616c6c65720060448201526064015b60405180910390fd5b50565b6107a8611206565b6107b26000611260565b565b6107bc611206565b60405163a98fb35560e01b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063a98fb35590610808908490600401612e96565b600060405180830381600087803b15801561082257600080fd5b505af1158015610836573d6000803e3d6000fd5b5050505050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146108855760405162461bcd60e51b815260040161079490612ea9565b604051639926ee7d60e01b81526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690639926ee7d906108d39085908590600401612f21565b600060405180830381600087803b1580156108ed57600080fd5b505af1158015610901573d6000803e3d6000fd5b505050505050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146109515760405162461bcd60e51b815260040161079490612ea9565b6040516351b27a6d60e11b81526001600160a01b0382811660048301527f0000000000000000000000000000000000000000000000000000000000000000169063a364f4da90602401610808565b63ffffffff82166000908152602081815260408083206001600160401b03851684529091529020545b92915050565b60008080806109e06020890189612f6c565b63ffffffff1663ffffffff1681526020019081526020016000206000876020016020810190610a0f9190612f89565b6001600160401b03168152602081019190915260400160002054905080610a7a5782610a6f5760405162461bcd60e51b815260206004820152600f60248201526e115b5c1d1e481859dc99595b595b9d608a1b6044820152606401610794565b610a7a8685856112b2565b610a848686610b9b565b9695505050505050565b600154610100900460ff1615808015610aab57506001805460ff16105b80610ac45750303b158015610ac457506001805460ff16145b610b275760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610794565b6001805460ff1916811790558015610b49576001805461ff0019166101001790555b610b5282611260565b8015610b97576001805461ff00191681556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050565b6000808080610bad6020870187612f6c565b63ffffffff1663ffffffff1681526020019081526020016000206000856020016020810190610bdc9190612f89565b6001600160401b03166001600160401b0316815260200190815260200160002054905083606001358114610c525760405162461bcd60e51b815260206004820152601760248201527f4d69736d61746368696e6720737461746520726f6f74730000000000000000006044820152606401610794565b610cf1610c62602085018561293b565b602085013583610c756040880188612fa4565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250610cb7925050506060890189612fa4565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506112c392505050565b949350505050565b610d038282611400565b610d405760405162461bcd60e51b815260206004820152600e60248201526d145d5bdc9d5b481b9bdd081b595d60921b6044820152606401610794565b610b97610d506020840184612f6c565b610d606040850160208601612f89565b8460600135611535565b606060007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316639aa1653d6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610dcc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610df09190612d4d565b60ff16905080610e0e57505060408051600081526020810190915290565b6000805b82811015610ec357604051633ca5a5f560e01b815260ff821660048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690633ca5a5f590602401602060405180830381865afa158015610e81573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ea59190612d0b565b610eaf9083612d9c565b915080610ebb81612db4565b915050610e12565b506000816001600160401b03811115610ede57610ede6129a5565b604051908082528060200260200182016040528015610f07578160200160208202803683370190505b5090506000805b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316639aa1653d6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610f6c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f909190612d4d565b60ff1681101561112957604051633ca5a5f560e01b815260ff821660048201526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690633ca5a5f590602401602060405180830381865afa158015611004573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110289190612d0b565b905060005b81811015611114576040516356e4026d60e11b815260ff84166004820152602481018290527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063adc804da906044016040805180830381865afa1580156110a2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110c69190612dcf565b600001518585815181106110dc576110dc612d70565b6001600160a01b0390921660209283029190910190910152836110fe81612db4565b945050808061110c90612db4565b91505061102d565b5050808061112190612db4565b915050610f0e565b5090949350505050565b61113b611206565b6001600160a01b0381166111a05760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610794565b61079d81611260565b60606000805b6101008110156111ff576001811b9150838216156111ef57828160f81b6040516020016111dd929190612ff1565b60405160208183030381529060405292505b6111f881612db4565b90506111af565b5050919050565b6034546001600160a01b031633146107b25760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610794565b603480546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b816112bd8482610cf9565b50505050565b6040516bffffffffffffffffffffffff19606087901b16602082015260009081908190611303906034016040516020818303038152906040528688611599565b915091508161134d5760405162461bcd60e51b81526020600482015260166024820152751058d8dbdd5b9d08191bd95cc81b9bdd08195e1a5cdd60521b6044820152606401610794565b6000611358826115c2565b905060008061138d8a60405160200161137391815260200190565b604051602081830303815290604052888560400151611599565b91509150816113de5760405162461bcd60e51b815260206004820152601c60248201527f53746f726167652076616c756520646f6573206e6f74206578697374000000006044820152606401610794565b6113ef6113ea82611686565b6116b9565b955050505050505b95945050505050565b6000807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663292f7a4e61143b866116e8565b438660037f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663ef0244586040518163ffffffff1660e01b8152600401602060405180830381865afa15801561149d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114c19190613020565b6114cc90600261303d565b6114d6919061307f565b6040518563ffffffff1660e01b81526004016114f59493929190613236565b6040805180830381865afa158015611511573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061041d9190613395565b63ffffffff83166000818152602081815260408083206001600160401b03871680855290835292819020859055518481529192917fca7171570f4ca232f925661b810636124eaf784a25b7c14e6b34c95b814dfdd8910160405180910390a3505050565b6000606060006115a886611718565b90506115b581868661174a565b9250925050935093915050565b6040805160808101825260008082526020820181905291810182905260608101829052906115ef83611825565b9050604051806080016040528061161f8360008151811061161257611612612d70565b6020026020010151611858565b815260200161163a8360018151811061161257611612612d70565b81526020016116628360028151811061165557611655612d70565b602002602001015161185f565b815260200161167d8360038151811061165557611655612d70565b90529392505050565b6040805180820182526000808252602091820152815180830190925282518252808301908201526060906109c890611961565b60008060006020845111156116cf5760206116d2565b83515b60209485015194036008029390931c9392505050565b6000816040516020016116fb91906133c8565b604051602081830303815290604052805190602001209050919050565b6060818051906020012060405160200161173491815260200190565b6040516020818303038152906040529050919050565b600060606000611759856119e8565b9050600080600061176b848a89611ae2565b8151929550909350915015808061177f5750815b6117cb5760405162461bcd60e51b815260206004820152601a60248201527f50726f76696465642070726f6f6620697320696e76616c69642e0000000000006044820152606401610794565b6000816117e75760405180602001604052806000815250611813565b611813866117f6600188613420565b8151811061180657611806612d70565b6020026020010151611f06565b919b919a509098505050505050505050565b6040805180820182526000808252602091820152815180830190925282518252808301908201526060906109c890611f30565b60006109c8825b60006021826000015111156118b65760405162461bcd60e51b815260206004820152601a60248201527f496e76616c696420524c5020627974657333322076616c75652e0000000000006044820152606401610794565b60008060006118c48561211c565b9194509250905060008160018111156118df576118df613437565b1461192c5760405162461bcd60e51b815260206004820152601a60248201527f496e76616c696420524c5020627974657333322076616c75652e0000000000006044820152606401610794565b600083866020015161193e9190612d9c565b80519091506020841015610a845760208490036101000a90049695505050505050565b606060008060006119718561211c565b91945092509050600081600181111561198c5761198c613437565b146119d95760405162461bcd60e51b815260206004820152601860248201527f496e76616c696420524c502062797465732076616c75652e00000000000000006044820152606401610794565b6113f785602001518484612466565b606060006119f583611825565b9050600081516001600160401b03811115611a1257611a126129a5565b604051908082528060200260200182016040528015611a5757816020015b6040805180820190915260608082526020820152815260200190600190039081611a305790505b50905060005b8251811015611ada576000611a8a848381518110611a7d57611a7d612d70565b6020026020010151611961565b90506040518060400160405280828152602001611aa683611825565b815250838381518110611abb57611abb612d70565b6020026020010181905250508080611ad290612db4565b915050611a5d565b509392505050565b60006060818080611af287612541565b90506000869050600080611b19604051806040016040528060608152602001606081525090565b60005b8c51811015611ede578c8181518110611b3757611b37612d70565b602002602001015191508284611b4d9190612d9c565b9350611b5a600188612d9c565b965083611bb257815180516020909101208514611bad5760405162461bcd60e51b8152602060048201526011602482015270092dcecc2d8d2c840e4dedee840d0c2e6d607b1b6044820152606401610794565b611c6f565b815151602011611c1457815180516020909101208514611bad5760405162461bcd60e51b815260206004820152601b60248201527f496e76616c6964206c6172676520696e7465726e616c206861736800000000006044820152606401610794565b84611c22836000015161267b565b14611c6f5760405162461bcd60e51b815260206004820152601a60248201527f496e76616c696420696e7465726e616c206e6f646520686173680000000000006044820152606401610794565b611c7b60106001612d9c565b8260200151511415611cf4578551841415611c9557611ede565b6000868581518110611ca957611ca9612d70565b602001015160f81c60f81b60f81c9050600083602001518260ff1681518110611cd457611cd4612d70565b60200260200101519050611ce7816126a3565b9650600194505050611ecc565b60028260200151511415611e84576000611d0d836126d9565b9050600081600081518110611d2457611d24612d70565b016020015160f81c90506000611d3b60028361344d565b611d4690600261346f565b90506000611d57848360ff166126fd565b90506000611d658b8a6126fd565b90506000611d738383612733565b905060ff851660021480611d8a575060ff85166003145b15611dc457808351148015611d9f5750808251145b15611db157611dae818b612d9c565b99505b50600160ff1b9950611ede945050505050565b60ff85161580611dd7575060ff85166001145b15611e2d5782518114611df75750600160ff1b9950611ede945050505050565b611e1e8860200151600181518110611e1157611e11612d70565b60200260200101516126a3565b9a509750611ecc945050505050565b60405162461bcd60e51b815260206004820152602660248201527f52656365697665642061206e6f6465207769746820616e20756e6b6e6f776e206044820152650e0e4caccd2f60d31b6064820152608401610794565b60405162461bcd60e51b815260206004820152601d60248201527f526563656976656420616e20756e706172736561626c65206e6f64652e0000006044820152606401610794565b80611ed681612db4565b915050611b1c565b50600160ff1b841486611ef187866126fd565b909e909d50909b509950505050505050505050565b602081015180516060916109c891611f2090600190613420565b81518110611a7d57611a7d612d70565b6060600080611f3e8461211c565b91935090915060019050816001811115611f5a57611f5a613437565b14611fa75760405162461bcd60e51b815260206004820152601760248201527f496e76616c696420524c50206c6973742076616c75652e0000000000000000006044820152606401610794565b6040805160208082526104208201909252600091816020015b6040805180820190915260008082526020820152815260200190600190039081611fc05790505090506000835b865181101561211157602082106120595760405162461bcd60e51b815260206004820152602a60248201527f50726f766964656420524c50206c6973742065786365656473206d6178206c6960448201526939ba103632b733ba341760b11b6064820152608401610794565b6000806120966040518060400160405280858c6000015161207a9190613420565b8152602001858c6020015161208f9190612d9c565b905261211c565b5091509150604051806040016040528083836120b29190612d9c565b8152602001848b602001516120c79190612d9c565b8152508585815181106120dc576120dc612d70565b60209081029190910101526120f2600185612d9c565b93506120fe8183612d9c565b6121089084612d9c565b92505050611fed565b508152949350505050565b6000806000808460000151116121745760405162461bcd60e51b815260206004820152601860248201527f524c50206974656d2063616e6e6f74206265206e756c6c2e00000000000000006044820152606401610794565b6020840151805160001a607f811161219957600060016000945094509450505061245f565b60b781116122155760006121ae608083613420565b9050808760000151116122035760405162461bcd60e51b815260206004820152601960248201527f496e76616c696420524c502073686f727420737472696e672e000000000000006044820152606401610794565b6001955093506000925061245f915050565b60bf811161230457600061222a60b783613420565b90508087600001511161227f5760405162461bcd60e51b815260206004820152601f60248201527f496e76616c696420524c50206c6f6e6720737472696e67206c656e6774682e006044820152606401610794565b600183015160208290036101000a90046122998183612d9c565b8851116122e85760405162461bcd60e51b815260206004820152601860248201527f496e76616c696420524c50206c6f6e6720737472696e672e00000000000000006044820152606401610794565b6122f3826001612d9c565b965094506000935061245f92505050565b60f7811161237f57600061231960c083613420565b90508087600001511161236e5760405162461bcd60e51b815260206004820152601760248201527f496e76616c696420524c502073686f7274206c6973742e0000000000000000006044820152606401610794565b60019550935084925061245f915050565b600061238c60f783613420565b9050808760000151116123e15760405162461bcd60e51b815260206004820152601d60248201527f496e76616c696420524c50206c6f6e67206c697374206c656e6774682e0000006044820152606401610794565b600183015160208290036101000a90046123fb8183612d9c565b8851116124435760405162461bcd60e51b815260206004820152601660248201527524b73b30b634b210292628103637b733903634b9ba1760511b6044820152606401610794565b61244e826001612d9c565b965094506001935061245f92505050565b9193909250565b60606000826001600160401b03811115612482576124826129a5565b6040519080825280601f01601f1916602001820160405280156124ac576020820181803683370190505b5090508051600014156124c057905061253a565b60006124cc8587612d9c565b90506020820160005b6124e0602087613492565b81101561251757825182526124f6602084612d9c565b9250612503602083612d9c565b91508061250f81612db4565b9150506124d5565b5080519151601f86166020036101000a6000190192831692191691909117905290505b9392505050565b606060008251600261255391906134a6565b6001600160401b0381111561256a5761256a6129a5565b6040519080825280601f01601f191660200182016040528015612594576020820181803683370190505b50905060005b83518110156126745760048482815181106125b7576125b7612d70565b01602001516001600160f81b031916901c826125d48360026134a6565b815181106125e4576125e4612d70565b60200101906001600160f81b031916908160001a905350601084828151811061260f5761260f612d70565b0160200151612621919060f81c61344d565b60f81b826126308360026134a6565b61263b906001612d9c565b8151811061264b5761264b612d70565b60200101906001600160f81b031916908160001a9053508061266c81612db4565b91505061259a565b5092915050565b600060208251101561268f57506020015190565b818060200190518101906109c89190612d0b565b600060606020836000015110156126c4576126bd836127af565b90506126d0565b6126cd83611961565b90505b61253a8161267b565b60606109c86126f88360200151600081518110611a7d57611a7d612d70565b612541565b60608251821061271c57506040805160208101909152600081526109c8565b61253a838384865161272e9190613420565b6127ba565b6000805b8084511180156127475750808351115b8015612798575082818151811061276057612760612d70565b602001015160f81c60f81b6001600160f81b03191684828151811061278757612787612d70565b01602001516001600160f81b031916145b1561253a57806127a781612db4565b915050612737565b60606109c882612910565b6060816127c881601f612d9c565b10156128075760405162461bcd60e51b815260206004820152600e60248201526d736c6963655f6f766572666c6f7760901b6044820152606401610794565b826128128382612d9c565b10156128515760405162461bcd60e51b815260206004820152600e60248201526d736c6963655f6f766572666c6f7760901b6044820152606401610794565b61285b8284612d9c565b8451101561289f5760405162461bcd60e51b8152602060048201526011602482015270736c6963655f6f75744f66426f756e647360781b6044820152606401610794565b6060821580156128be576040519150600082526020820160405261041d565b6040519150601f8416801560200281840101858101878315602002848b0101015b818310156128f75780518352602092830192016128df565b5050858452601f01601f19166040525050949350505050565b60606109c8826020015160008460000151612466565b6001600160a01b038116811461079d57600080fd5b60006020828403121561294d57600080fd5b813561253a81612926565b6020808252825182820181905260009190848201906040850190845b818110156129995783516001600160a01b031683529284019291840191600101612974565b50909695505050505050565b634e487b7160e01b600052604160045260246000fd5b604051606081016001600160401b03811182821017156129dd576129dd6129a5565b60405290565b60006001600160401b03808411156129fd576129fd6129a5565b604051601f8501601f19908116603f01168101908282118183101715612a2557612a256129a5565b81604052809350858152868686011115612a3e57600080fd5b858560208301376000602087830101525050509392505050565b600060208284031215612a6a57600080fd5b81356001600160401b03811115612a8057600080fd5b8201601f81018413612a9157600080fd5b610cf1848235602084016129e3565b60008060408385031215612ab357600080fd5b8235612abe81612926565b915060208301356001600160401b0380821115612ada57600080fd5b9084019060608287031215612aee57600080fd5b612af66129bb565b823582811115612b0557600080fd5b83019150601f82018713612b1857600080fd5b612b27878335602085016129e3565b815260208301356020820152604083013560408201528093505050509250929050565b63ffffffff8116811461079d57600080fd5b80356001600160401b0381168114612b7357600080fd5b919050565b60008060408385031215612b8b57600080fd5b8235612b9681612b4a565b9150612ba460208401612b5c565b90509250929050565b600060808284031215612bbf57600080fd5b50919050565b60008060008060c08587031215612bdb57600080fd5b612be58686612bad565b935060808501356001600160401b0380821115612c0157600080fd5b612c0d88838901612bad565b945060a0870135915080821115612c2357600080fd5b818701915087601f830112612c3757600080fd5b813581811115612c4657600080fd5b886020828501011115612c5857600080fd5b95989497505060200194505050565b60008060a08385031215612c7a57600080fd5b612c848484612bad565b915060808301356001600160401b03811115612c9f57600080fd5b612cab85828601612bad565b9150509250929050565b60008060a08385031215612cc857600080fd5b612cd28484612bad565b915060808301356001600160401b03811115612ced57600080fd5b83016101808186031215612d0057600080fd5b809150509250929050565b600060208284031215612d1d57600080fd5b5051919050565b600060208284031215612d3657600080fd5b81516001600160c01b038116811461253a57600080fd5b600060208284031215612d5f57600080fd5b815160ff8116811461253a57600080fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b60008219821115612daf57612daf612d86565b500190565b6000600019821415612dc857612dc8612d86565b5060010190565b600060408284031215612de157600080fd5b604051604081018181106001600160401b0382111715612e0357612e036129a5565b6040528251612e1181612926565b815260208301516bffffffffffffffffffffffff81168114612e3257600080fd5b60208201529392505050565b60005b83811015612e59578181015183820152602001612e41565b838111156112bd5750506000910152565b60008151808452612e82816020860160208601612e3e565b601f01601f19169290920160200192915050565b60208152600061253a6020830184612e6a565b60208082526052908201527f536572766963654d616e61676572426173652e6f6e6c7952656769737472794360408201527f6f6f7264696e61746f723a2063616c6c6572206973206e6f742074686520726560608201527133b4b9ba393c9031b7b7b93234b730ba37b960711b608082015260a00190565b60018060a01b0383168152604060208201526000825160606040840152612f4b60a0840182612e6a565b90506020840151606084015260408401516080840152809150509392505050565b600060208284031215612f7e57600080fd5b813561253a81612b4a565b600060208284031215612f9b57600080fd5b61253a82612b5c565b6000808335601e19843603018112612fbb57600080fd5b8301803591506001600160401b03821115612fd557600080fd5b602001915036819003821315612fea57600080fd5b9250929050565b60008351613003818460208801612e3e565b6001600160f81b0319939093169190920190815260010192915050565b60006020828403121561303257600080fd5b815161253a81612b4a565b600063ffffffff8083168185168183048111821515161561306057613060612d86565b02949350505050565b634e487b7160e01b600052601260045260246000fd5b600063ffffffff8084168061309657613096613069565b92169190910492915050565b6000808335601e198436030181126130b957600080fd5b83016020810192503590506001600160401b038111156130d857600080fd5b8060051b3603831315612fea57600080fd5b8183526000602080850194508260005b8581101561312557813561310d81612b4a565b63ffffffff16875295820195908201906001016130fa565b509495945050505050565b6000808335601e1984360301811261314757600080fd5b83016020810192503590506001600160401b0381111561316657600080fd5b8060061b3603831315612fea57600080fd5b81835260208301925060008160005b848110156131af57813586526020808301359087015260409586019590910190600101613187565b5093949350505050565b604081833760408201600081526040808301823750600060808301525050565b81835260006020808501808196508560051b810191508460005b8781101561322957828403895261320a82886130a2565b6132158682846130ea565b9a87019a95505050908401906001016131f3565b5091979650505050505050565b84815260a06020820152600160a0820152600060c082015263ffffffff8416604082015260e06060820152600061326d84856130a2565b61018060e0850152613284610260850182846130ea565b9150506132946020860186613130565b60df1980868503016101008701526132ad848385613178565b93506132bc6040890189613130565b935091506101208187860301818801526132d7858585613178565b945061014093506132ed84880160608b016131b9565b60e08901356101c08801526101008901356101e0880152613310818a018a6130a2565b93509050818786030161020088015261332a8584836130ea565b945050613339838901896130a2565b9350915080868503016102208701526133538484846130ea565b93506133636101608901896130a2565b9350915080868503016102408701525061337e8383836131d9565b93505050506113f7608083018463ffffffff169052565b600080604083850312156133a857600080fd5b825180151581146133b857600080fd5b6020939093015192949293505050565b6080810182356133d781612b4a565b63ffffffff1682526133eb60208401612b5c565b6001600160401b0380821660208501528061340860408701612b5c565b16604085015250506060830135606083015292915050565b60008282101561343257613432612d86565b500390565b634e487b7160e01b600052602160045260246000fd5b600060ff83168061346057613460613069565b8060ff84160691505092915050565b600060ff821660ff84168082101561348957613489612d86565b90039392505050565b6000826134a1576134a1613069565b500490565b60008160001904831182151516156134c0576134c0612d86565b50029056fea26469706673582212201ca6cf3a56e4dfa400892ebaaf664bb3610672871b64ffcdff221108aa698db164736f6c634300080c0033", +} + +// ContractSFFLServiceManagerABI is the input ABI used to generate the binding from. +// Deprecated: Use ContractSFFLServiceManagerMetaData.ABI instead. +var ContractSFFLServiceManagerABI = ContractSFFLServiceManagerMetaData.ABI + +// ContractSFFLServiceManagerBin is the compiled bytecode used for deploying new contracts. +// Deprecated: Use ContractSFFLServiceManagerMetaData.Bin instead. +var ContractSFFLServiceManagerBin = ContractSFFLServiceManagerMetaData.Bin + +// DeployContractSFFLServiceManager deploys a new Ethereum contract, binding an instance of ContractSFFLServiceManager to it. +func DeployContractSFFLServiceManager(auth *bind.TransactOpts, backend bind.ContractBackend, _delegationManager common.Address, _registryCoordinator common.Address, _stakeRegistry common.Address, _taskManager common.Address) (common.Address, *types.Transaction, *ContractSFFLServiceManager, error) { + parsed, err := ContractSFFLServiceManagerMetaData.GetAbi() + if err != nil { + return common.Address{}, nil, nil, err + } + if parsed == nil { + return common.Address{}, nil, nil, errors.New("GetABI returned nil") + } + + address, tx, contract, err := bind.DeployContract(auth, *parsed, common.FromHex(ContractSFFLServiceManagerBin), backend, _delegationManager, _registryCoordinator, _stakeRegistry, _taskManager) + if err != nil { + return common.Address{}, nil, nil, err + } + return address, tx, &ContractSFFLServiceManager{ContractSFFLServiceManagerCaller: ContractSFFLServiceManagerCaller{contract: contract}, ContractSFFLServiceManagerTransactor: ContractSFFLServiceManagerTransactor{contract: contract}, ContractSFFLServiceManagerFilterer: ContractSFFLServiceManagerFilterer{contract: contract}}, nil +} + +// ContractSFFLServiceManager is an auto generated Go binding around an Ethereum contract. +type ContractSFFLServiceManager struct { + ContractSFFLServiceManagerCaller // Read-only binding to the contract + ContractSFFLServiceManagerTransactor // Write-only binding to the contract + ContractSFFLServiceManagerFilterer // Log filterer for contract events +} + +// ContractSFFLServiceManagerCaller is an auto generated read-only Go binding around an Ethereum contract. +type ContractSFFLServiceManagerCaller struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// ContractSFFLServiceManagerTransactor is an auto generated write-only Go binding around an Ethereum contract. +type ContractSFFLServiceManagerTransactor struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// ContractSFFLServiceManagerFilterer is an auto generated log filtering Go binding around an Ethereum contract events. +type ContractSFFLServiceManagerFilterer struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// ContractSFFLServiceManagerSession is an auto generated Go binding around an Ethereum contract, +// with pre-set call and transact options. +type ContractSFFLServiceManagerSession struct { + Contract *ContractSFFLServiceManager // Generic contract binding to set the session for + CallOpts bind.CallOpts // Call options to use throughout this session + TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session +} + +// ContractSFFLServiceManagerCallerSession is an auto generated read-only Go binding around an Ethereum contract, +// with pre-set call options. +type ContractSFFLServiceManagerCallerSession struct { + Contract *ContractSFFLServiceManagerCaller // Generic contract caller binding to set the session for + CallOpts bind.CallOpts // Call options to use throughout this session +} + +// ContractSFFLServiceManagerTransactorSession is an auto generated write-only Go binding around an Ethereum contract, +// with pre-set transact options. +type ContractSFFLServiceManagerTransactorSession struct { + Contract *ContractSFFLServiceManagerTransactor // Generic contract transactor binding to set the session for + TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session +} + +// ContractSFFLServiceManagerRaw is an auto generated low-level Go binding around an Ethereum contract. +type ContractSFFLServiceManagerRaw struct { + Contract *ContractSFFLServiceManager // Generic contract binding to access the raw methods on +} + +// ContractSFFLServiceManagerCallerRaw is an auto generated low-level read-only Go binding around an Ethereum contract. +type ContractSFFLServiceManagerCallerRaw struct { + Contract *ContractSFFLServiceManagerCaller // Generic read-only contract binding to access the raw methods on +} + +// ContractSFFLServiceManagerTransactorRaw is an auto generated low-level write-only Go binding around an Ethereum contract. +type ContractSFFLServiceManagerTransactorRaw struct { + Contract *ContractSFFLServiceManagerTransactor // Generic write-only contract binding to access the raw methods on +} + +// NewContractSFFLServiceManager creates a new instance of ContractSFFLServiceManager, bound to a specific deployed contract. +func NewContractSFFLServiceManager(address common.Address, backend bind.ContractBackend) (*ContractSFFLServiceManager, error) { + contract, err := bindContractSFFLServiceManager(address, backend, backend, backend) + if err != nil { + return nil, err + } + return &ContractSFFLServiceManager{ContractSFFLServiceManagerCaller: ContractSFFLServiceManagerCaller{contract: contract}, ContractSFFLServiceManagerTransactor: ContractSFFLServiceManagerTransactor{contract: contract}, ContractSFFLServiceManagerFilterer: ContractSFFLServiceManagerFilterer{contract: contract}}, nil +} + +// NewContractSFFLServiceManagerCaller creates a new read-only instance of ContractSFFLServiceManager, bound to a specific deployed contract. +func NewContractSFFLServiceManagerCaller(address common.Address, caller bind.ContractCaller) (*ContractSFFLServiceManagerCaller, error) { + contract, err := bindContractSFFLServiceManager(address, caller, nil, nil) + if err != nil { + return nil, err + } + return &ContractSFFLServiceManagerCaller{contract: contract}, nil +} + +// NewContractSFFLServiceManagerTransactor creates a new write-only instance of ContractSFFLServiceManager, bound to a specific deployed contract. +func NewContractSFFLServiceManagerTransactor(address common.Address, transactor bind.ContractTransactor) (*ContractSFFLServiceManagerTransactor, error) { + contract, err := bindContractSFFLServiceManager(address, nil, transactor, nil) + if err != nil { + return nil, err + } + return &ContractSFFLServiceManagerTransactor{contract: contract}, nil +} + +// NewContractSFFLServiceManagerFilterer creates a new log filterer instance of ContractSFFLServiceManager, bound to a specific deployed contract. +func NewContractSFFLServiceManagerFilterer(address common.Address, filterer bind.ContractFilterer) (*ContractSFFLServiceManagerFilterer, error) { + contract, err := bindContractSFFLServiceManager(address, nil, nil, filterer) + if err != nil { + return nil, err + } + return &ContractSFFLServiceManagerFilterer{contract: contract}, nil +} + +// bindContractSFFLServiceManager binds a generic wrapper to an already deployed contract. +func bindContractSFFLServiceManager(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error) { + parsed, err := ContractSFFLServiceManagerMetaData.GetAbi() + if err != nil { + return nil, err + } + return bind.NewBoundContract(address, *parsed, caller, transactor, filterer), nil +} + +// Call invokes the (constant) contract method with params as input values and +// sets the output to result. The result type might be a single field for simple +// returns, a slice of interfaces for anonymous returns and a struct for named +// returns. +func (_ContractSFFLServiceManager *ContractSFFLServiceManagerRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { + return _ContractSFFLServiceManager.Contract.ContractSFFLServiceManagerCaller.contract.Call(opts, result, method, params...) +} + +// Transfer initiates a plain transaction to move funds to the contract, calling +// its default method if one is available. +func (_ContractSFFLServiceManager *ContractSFFLServiceManagerRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { + return _ContractSFFLServiceManager.Contract.ContractSFFLServiceManagerTransactor.contract.Transfer(opts) +} + +// Transact invokes the (paid) contract method with params as input values. +func (_ContractSFFLServiceManager *ContractSFFLServiceManagerRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { + return _ContractSFFLServiceManager.Contract.ContractSFFLServiceManagerTransactor.contract.Transact(opts, method, params...) +} + +// Call invokes the (constant) contract method with params as input values and +// sets the output to result. The result type might be a single field for simple +// returns, a slice of interfaces for anonymous returns and a struct for named +// returns. +func (_ContractSFFLServiceManager *ContractSFFLServiceManagerCallerRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { + return _ContractSFFLServiceManager.Contract.contract.Call(opts, result, method, params...) +} + +// Transfer initiates a plain transaction to move funds to the contract, calling +// its default method if one is available. +func (_ContractSFFLServiceManager *ContractSFFLServiceManagerTransactorRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { + return _ContractSFFLServiceManager.Contract.contract.Transfer(opts) +} + +// Transact invokes the (paid) contract method with params as input values. +func (_ContractSFFLServiceManager *ContractSFFLServiceManagerTransactorRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { + return _ContractSFFLServiceManager.Contract.contract.Transact(opts, method, params...) +} + +// GetOperatorRestakedStrategies is a free data retrieval call binding the contract method 0x33cfb7b7. +// +// Solidity: function getOperatorRestakedStrategies(address operator) view returns(address[]) +func (_ContractSFFLServiceManager *ContractSFFLServiceManagerCaller) GetOperatorRestakedStrategies(opts *bind.CallOpts, operator common.Address) ([]common.Address, error) { + var out []interface{} + err := _ContractSFFLServiceManager.contract.Call(opts, &out, "getOperatorRestakedStrategies", operator) + + if err != nil { + return *new([]common.Address), err + } + + out0 := *abi.ConvertType(out[0], new([]common.Address)).(*[]common.Address) + + return out0, err + +} + +// GetOperatorRestakedStrategies is a free data retrieval call binding the contract method 0x33cfb7b7. +// +// Solidity: function getOperatorRestakedStrategies(address operator) view returns(address[]) +func (_ContractSFFLServiceManager *ContractSFFLServiceManagerSession) GetOperatorRestakedStrategies(operator common.Address) ([]common.Address, error) { + return _ContractSFFLServiceManager.Contract.GetOperatorRestakedStrategies(&_ContractSFFLServiceManager.CallOpts, operator) +} + +// GetOperatorRestakedStrategies is a free data retrieval call binding the contract method 0x33cfb7b7. +// +// Solidity: function getOperatorRestakedStrategies(address operator) view returns(address[]) +func (_ContractSFFLServiceManager *ContractSFFLServiceManagerCallerSession) GetOperatorRestakedStrategies(operator common.Address) ([]common.Address, error) { + return _ContractSFFLServiceManager.Contract.GetOperatorRestakedStrategies(&_ContractSFFLServiceManager.CallOpts, operator) +} + +// GetRestakeableStrategies is a free data retrieval call binding the contract method 0xe481af9d. +// +// Solidity: function getRestakeableStrategies() view returns(address[]) +func (_ContractSFFLServiceManager *ContractSFFLServiceManagerCaller) GetRestakeableStrategies(opts *bind.CallOpts) ([]common.Address, error) { + var out []interface{} + err := _ContractSFFLServiceManager.contract.Call(opts, &out, "getRestakeableStrategies") + + if err != nil { + return *new([]common.Address), err + } + + out0 := *abi.ConvertType(out[0], new([]common.Address)).(*[]common.Address) + + return out0, err + +} + +// GetRestakeableStrategies is a free data retrieval call binding the contract method 0xe481af9d. +// +// Solidity: function getRestakeableStrategies() view returns(address[]) +func (_ContractSFFLServiceManager *ContractSFFLServiceManagerSession) GetRestakeableStrategies() ([]common.Address, error) { + return _ContractSFFLServiceManager.Contract.GetRestakeableStrategies(&_ContractSFFLServiceManager.CallOpts) +} + +// GetRestakeableStrategies is a free data retrieval call binding the contract method 0xe481af9d. +// +// Solidity: function getRestakeableStrategies() view returns(address[]) +func (_ContractSFFLServiceManager *ContractSFFLServiceManagerCallerSession) GetRestakeableStrategies() ([]common.Address, error) { + return _ContractSFFLServiceManager.Contract.GetRestakeableStrategies(&_ContractSFFLServiceManager.CallOpts) +} + +// GetStateRoot is a free data retrieval call binding the contract method 0xb3a9e53b. +// +// Solidity: function getStateRoot(uint32 rollupId, uint64 blockHeight) view returns(bytes32) +func (_ContractSFFLServiceManager *ContractSFFLServiceManagerCaller) GetStateRoot(opts *bind.CallOpts, rollupId uint32, blockHeight uint64) ([32]byte, error) { + var out []interface{} + err := _ContractSFFLServiceManager.contract.Call(opts, &out, "getStateRoot", rollupId, blockHeight) + + if err != nil { + return *new([32]byte), err + } + + out0 := *abi.ConvertType(out[0], new([32]byte)).(*[32]byte) + + return out0, err + +} + +// GetStateRoot is a free data retrieval call binding the contract method 0xb3a9e53b. +// +// Solidity: function getStateRoot(uint32 rollupId, uint64 blockHeight) view returns(bytes32) +func (_ContractSFFLServiceManager *ContractSFFLServiceManagerSession) GetStateRoot(rollupId uint32, blockHeight uint64) ([32]byte, error) { + return _ContractSFFLServiceManager.Contract.GetStateRoot(&_ContractSFFLServiceManager.CallOpts, rollupId, blockHeight) +} + +// GetStateRoot is a free data retrieval call binding the contract method 0xb3a9e53b. +// +// Solidity: function getStateRoot(uint32 rollupId, uint64 blockHeight) view returns(bytes32) +func (_ContractSFFLServiceManager *ContractSFFLServiceManagerCallerSession) GetStateRoot(rollupId uint32, blockHeight uint64) ([32]byte, error) { + return _ContractSFFLServiceManager.Contract.GetStateRoot(&_ContractSFFLServiceManager.CallOpts, rollupId, blockHeight) +} + +// GetStorageValue is a free data retrieval call binding the contract method 0xccd3bd9e. +// +// Solidity: function getStorageValue((uint32,uint64,uint64,bytes32) message, (address,bytes32,bytes,bytes) proofParams) view returns(bytes32) +func (_ContractSFFLServiceManager *ContractSFFLServiceManagerCaller) GetStorageValue(opts *bind.CallOpts, message StateRootUpdateMessage, proofParams SFFLRegistryBaseProofParams) ([32]byte, error) { + var out []interface{} + err := _ContractSFFLServiceManager.contract.Call(opts, &out, "getStorageValue", message, proofParams) + + if err != nil { + return *new([32]byte), err + } + + out0 := *abi.ConvertType(out[0], new([32]byte)).(*[32]byte) + + return out0, err + +} + +// GetStorageValue is a free data retrieval call binding the contract method 0xccd3bd9e. +// +// Solidity: function getStorageValue((uint32,uint64,uint64,bytes32) message, (address,bytes32,bytes,bytes) proofParams) view returns(bytes32) +func (_ContractSFFLServiceManager *ContractSFFLServiceManagerSession) GetStorageValue(message StateRootUpdateMessage, proofParams SFFLRegistryBaseProofParams) ([32]byte, error) { + return _ContractSFFLServiceManager.Contract.GetStorageValue(&_ContractSFFLServiceManager.CallOpts, message, proofParams) +} + +// GetStorageValue is a free data retrieval call binding the contract method 0xccd3bd9e. +// +// Solidity: function getStorageValue((uint32,uint64,uint64,bytes32) message, (address,bytes32,bytes,bytes) proofParams) view returns(bytes32) +func (_ContractSFFLServiceManager *ContractSFFLServiceManagerCallerSession) GetStorageValue(message StateRootUpdateMessage, proofParams SFFLRegistryBaseProofParams) ([32]byte, error) { + return _ContractSFFLServiceManager.Contract.GetStorageValue(&_ContractSFFLServiceManager.CallOpts, message, proofParams) +} + +// Owner is a free data retrieval call binding the contract method 0x8da5cb5b. +// +// Solidity: function owner() view returns(address) +func (_ContractSFFLServiceManager *ContractSFFLServiceManagerCaller) Owner(opts *bind.CallOpts) (common.Address, error) { + var out []interface{} + err := _ContractSFFLServiceManager.contract.Call(opts, &out, "owner") + + if err != nil { + return *new(common.Address), err + } + + out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address) + + return out0, err + +} + +// Owner is a free data retrieval call binding the contract method 0x8da5cb5b. +// +// Solidity: function owner() view returns(address) +func (_ContractSFFLServiceManager *ContractSFFLServiceManagerSession) Owner() (common.Address, error) { + return _ContractSFFLServiceManager.Contract.Owner(&_ContractSFFLServiceManager.CallOpts) +} + +// Owner is a free data retrieval call binding the contract method 0x8da5cb5b. +// +// Solidity: function owner() view returns(address) +func (_ContractSFFLServiceManager *ContractSFFLServiceManagerCallerSession) Owner() (common.Address, error) { + return _ContractSFFLServiceManager.Contract.Owner(&_ContractSFFLServiceManager.CallOpts) +} + +// TaskManager is a free data retrieval call binding the contract method 0xa50a640e. +// +// Solidity: function taskManager() view returns(address) +func (_ContractSFFLServiceManager *ContractSFFLServiceManagerCaller) TaskManager(opts *bind.CallOpts) (common.Address, error) { + var out []interface{} + err := _ContractSFFLServiceManager.contract.Call(opts, &out, "taskManager") + + if err != nil { + return *new(common.Address), err + } + + out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address) + + return out0, err + +} + +// TaskManager is a free data retrieval call binding the contract method 0xa50a640e. +// +// Solidity: function taskManager() view returns(address) +func (_ContractSFFLServiceManager *ContractSFFLServiceManagerSession) TaskManager() (common.Address, error) { + return _ContractSFFLServiceManager.Contract.TaskManager(&_ContractSFFLServiceManager.CallOpts) +} + +// TaskManager is a free data retrieval call binding the contract method 0xa50a640e. +// +// Solidity: function taskManager() view returns(address) +func (_ContractSFFLServiceManager *ContractSFFLServiceManagerCallerSession) TaskManager() (common.Address, error) { + return _ContractSFFLServiceManager.Contract.TaskManager(&_ContractSFFLServiceManager.CallOpts) +} + +// DeregisterOperatorFromAVS is a paid mutator transaction binding the contract method 0xa364f4da. +// +// Solidity: function deregisterOperatorFromAVS(address operator) returns() +func (_ContractSFFLServiceManager *ContractSFFLServiceManagerTransactor) DeregisterOperatorFromAVS(opts *bind.TransactOpts, operator common.Address) (*types.Transaction, error) { + return _ContractSFFLServiceManager.contract.Transact(opts, "deregisterOperatorFromAVS", operator) +} + +// DeregisterOperatorFromAVS is a paid mutator transaction binding the contract method 0xa364f4da. +// +// Solidity: function deregisterOperatorFromAVS(address operator) returns() +func (_ContractSFFLServiceManager *ContractSFFLServiceManagerSession) DeregisterOperatorFromAVS(operator common.Address) (*types.Transaction, error) { + return _ContractSFFLServiceManager.Contract.DeregisterOperatorFromAVS(&_ContractSFFLServiceManager.TransactOpts, operator) +} + +// DeregisterOperatorFromAVS is a paid mutator transaction binding the contract method 0xa364f4da. +// +// Solidity: function deregisterOperatorFromAVS(address operator) returns() +func (_ContractSFFLServiceManager *ContractSFFLServiceManagerTransactorSession) DeregisterOperatorFromAVS(operator common.Address) (*types.Transaction, error) { + return _ContractSFFLServiceManager.Contract.DeregisterOperatorFromAVS(&_ContractSFFLServiceManager.TransactOpts, operator) +} + +// FreezeOperator is a paid mutator transaction binding the contract method 0x38c8ee64. +// +// Solidity: function freezeOperator(address operatorAddr) returns() +func (_ContractSFFLServiceManager *ContractSFFLServiceManagerTransactor) FreezeOperator(opts *bind.TransactOpts, operatorAddr common.Address) (*types.Transaction, error) { + return _ContractSFFLServiceManager.contract.Transact(opts, "freezeOperator", operatorAddr) +} + +// FreezeOperator is a paid mutator transaction binding the contract method 0x38c8ee64. +// +// Solidity: function freezeOperator(address operatorAddr) returns() +func (_ContractSFFLServiceManager *ContractSFFLServiceManagerSession) FreezeOperator(operatorAddr common.Address) (*types.Transaction, error) { + return _ContractSFFLServiceManager.Contract.FreezeOperator(&_ContractSFFLServiceManager.TransactOpts, operatorAddr) +} + +// FreezeOperator is a paid mutator transaction binding the contract method 0x38c8ee64. +// +// Solidity: function freezeOperator(address operatorAddr) returns() +func (_ContractSFFLServiceManager *ContractSFFLServiceManagerTransactorSession) FreezeOperator(operatorAddr common.Address) (*types.Transaction, error) { + return _ContractSFFLServiceManager.Contract.FreezeOperator(&_ContractSFFLServiceManager.TransactOpts, operatorAddr) +} + +// Initialize is a paid mutator transaction binding the contract method 0xc4d66de8. +// +// Solidity: function initialize(address initialOwner) returns() +func (_ContractSFFLServiceManager *ContractSFFLServiceManagerTransactor) Initialize(opts *bind.TransactOpts, initialOwner common.Address) (*types.Transaction, error) { + return _ContractSFFLServiceManager.contract.Transact(opts, "initialize", initialOwner) +} + +// Initialize is a paid mutator transaction binding the contract method 0xc4d66de8. +// +// Solidity: function initialize(address initialOwner) returns() +func (_ContractSFFLServiceManager *ContractSFFLServiceManagerSession) Initialize(initialOwner common.Address) (*types.Transaction, error) { + return _ContractSFFLServiceManager.Contract.Initialize(&_ContractSFFLServiceManager.TransactOpts, initialOwner) +} + +// Initialize is a paid mutator transaction binding the contract method 0xc4d66de8. +// +// Solidity: function initialize(address initialOwner) returns() +func (_ContractSFFLServiceManager *ContractSFFLServiceManagerTransactorSession) Initialize(initialOwner common.Address) (*types.Transaction, error) { + return _ContractSFFLServiceManager.Contract.Initialize(&_ContractSFFLServiceManager.TransactOpts, initialOwner) +} + +// RegisterOperatorToAVS is a paid mutator transaction binding the contract method 0x9926ee7d. +// +// Solidity: function registerOperatorToAVS(address operator, (bytes,bytes32,uint256) operatorSignature) returns() +func (_ContractSFFLServiceManager *ContractSFFLServiceManagerTransactor) RegisterOperatorToAVS(opts *bind.TransactOpts, operator common.Address, operatorSignature ISignatureUtilsSignatureWithSaltAndExpiry) (*types.Transaction, error) { + return _ContractSFFLServiceManager.contract.Transact(opts, "registerOperatorToAVS", operator, operatorSignature) +} + +// RegisterOperatorToAVS is a paid mutator transaction binding the contract method 0x9926ee7d. +// +// Solidity: function registerOperatorToAVS(address operator, (bytes,bytes32,uint256) operatorSignature) returns() +func (_ContractSFFLServiceManager *ContractSFFLServiceManagerSession) RegisterOperatorToAVS(operator common.Address, operatorSignature ISignatureUtilsSignatureWithSaltAndExpiry) (*types.Transaction, error) { + return _ContractSFFLServiceManager.Contract.RegisterOperatorToAVS(&_ContractSFFLServiceManager.TransactOpts, operator, operatorSignature) +} + +// RegisterOperatorToAVS is a paid mutator transaction binding the contract method 0x9926ee7d. +// +// Solidity: function registerOperatorToAVS(address operator, (bytes,bytes32,uint256) operatorSignature) returns() +func (_ContractSFFLServiceManager *ContractSFFLServiceManagerTransactorSession) RegisterOperatorToAVS(operator common.Address, operatorSignature ISignatureUtilsSignatureWithSaltAndExpiry) (*types.Transaction, error) { + return _ContractSFFLServiceManager.Contract.RegisterOperatorToAVS(&_ContractSFFLServiceManager.TransactOpts, operator, operatorSignature) +} + +// RenounceOwnership is a paid mutator transaction binding the contract method 0x715018a6. +// +// Solidity: function renounceOwnership() returns() +func (_ContractSFFLServiceManager *ContractSFFLServiceManagerTransactor) RenounceOwnership(opts *bind.TransactOpts) (*types.Transaction, error) { + return _ContractSFFLServiceManager.contract.Transact(opts, "renounceOwnership") +} + +// RenounceOwnership is a paid mutator transaction binding the contract method 0x715018a6. +// +// Solidity: function renounceOwnership() returns() +func (_ContractSFFLServiceManager *ContractSFFLServiceManagerSession) RenounceOwnership() (*types.Transaction, error) { + return _ContractSFFLServiceManager.Contract.RenounceOwnership(&_ContractSFFLServiceManager.TransactOpts) +} + +// RenounceOwnership is a paid mutator transaction binding the contract method 0x715018a6. +// +// Solidity: function renounceOwnership() returns() +func (_ContractSFFLServiceManager *ContractSFFLServiceManagerTransactorSession) RenounceOwnership() (*types.Transaction, error) { + return _ContractSFFLServiceManager.Contract.RenounceOwnership(&_ContractSFFLServiceManager.TransactOpts) +} + +// SetMetadataURI is a paid mutator transaction binding the contract method 0x750521f5. +// +// Solidity: function setMetadataURI(string _metadataURI) returns() +func (_ContractSFFLServiceManager *ContractSFFLServiceManagerTransactor) SetMetadataURI(opts *bind.TransactOpts, _metadataURI string) (*types.Transaction, error) { + return _ContractSFFLServiceManager.contract.Transact(opts, "setMetadataURI", _metadataURI) +} + +// SetMetadataURI is a paid mutator transaction binding the contract method 0x750521f5. +// +// Solidity: function setMetadataURI(string _metadataURI) returns() +func (_ContractSFFLServiceManager *ContractSFFLServiceManagerSession) SetMetadataURI(_metadataURI string) (*types.Transaction, error) { + return _ContractSFFLServiceManager.Contract.SetMetadataURI(&_ContractSFFLServiceManager.TransactOpts, _metadataURI) +} + +// SetMetadataURI is a paid mutator transaction binding the contract method 0x750521f5. +// +// Solidity: function setMetadataURI(string _metadataURI) returns() +func (_ContractSFFLServiceManager *ContractSFFLServiceManagerTransactorSession) SetMetadataURI(_metadataURI string) (*types.Transaction, error) { + return _ContractSFFLServiceManager.Contract.SetMetadataURI(&_ContractSFFLServiceManager.TransactOpts, _metadataURI) +} + +// TransferOwnership is a paid mutator transaction binding the contract method 0xf2fde38b. +// +// Solidity: function transferOwnership(address newOwner) returns() +func (_ContractSFFLServiceManager *ContractSFFLServiceManagerTransactor) TransferOwnership(opts *bind.TransactOpts, newOwner common.Address) (*types.Transaction, error) { + return _ContractSFFLServiceManager.contract.Transact(opts, "transferOwnership", newOwner) +} + +// TransferOwnership is a paid mutator transaction binding the contract method 0xf2fde38b. +// +// Solidity: function transferOwnership(address newOwner) returns() +func (_ContractSFFLServiceManager *ContractSFFLServiceManagerSession) TransferOwnership(newOwner common.Address) (*types.Transaction, error) { + return _ContractSFFLServiceManager.Contract.TransferOwnership(&_ContractSFFLServiceManager.TransactOpts, newOwner) +} + +// TransferOwnership is a paid mutator transaction binding the contract method 0xf2fde38b. +// +// Solidity: function transferOwnership(address newOwner) returns() +func (_ContractSFFLServiceManager *ContractSFFLServiceManagerTransactorSession) TransferOwnership(newOwner common.Address) (*types.Transaction, error) { + return _ContractSFFLServiceManager.Contract.TransferOwnership(&_ContractSFFLServiceManager.TransactOpts, newOwner) +} + +// UpdateAndGetStorageValue is a paid mutator transaction binding the contract method 0xb708c083. +// +// Solidity: function updateAndGetStorageValue((uint32,uint64,uint64,bytes32) message, (address,bytes32,bytes,bytes) proofParams, bytes agreement) returns(bytes32) +func (_ContractSFFLServiceManager *ContractSFFLServiceManagerTransactor) UpdateAndGetStorageValue(opts *bind.TransactOpts, message StateRootUpdateMessage, proofParams SFFLRegistryBaseProofParams, agreement []byte) (*types.Transaction, error) { + return _ContractSFFLServiceManager.contract.Transact(opts, "updateAndGetStorageValue", message, proofParams, agreement) +} + +// UpdateAndGetStorageValue is a paid mutator transaction binding the contract method 0xb708c083. +// +// Solidity: function updateAndGetStorageValue((uint32,uint64,uint64,bytes32) message, (address,bytes32,bytes,bytes) proofParams, bytes agreement) returns(bytes32) +func (_ContractSFFLServiceManager *ContractSFFLServiceManagerSession) UpdateAndGetStorageValue(message StateRootUpdateMessage, proofParams SFFLRegistryBaseProofParams, agreement []byte) (*types.Transaction, error) { + return _ContractSFFLServiceManager.Contract.UpdateAndGetStorageValue(&_ContractSFFLServiceManager.TransactOpts, message, proofParams, agreement) +} + +// UpdateAndGetStorageValue is a paid mutator transaction binding the contract method 0xb708c083. +// +// Solidity: function updateAndGetStorageValue((uint32,uint64,uint64,bytes32) message, (address,bytes32,bytes,bytes) proofParams, bytes agreement) returns(bytes32) +func (_ContractSFFLServiceManager *ContractSFFLServiceManagerTransactorSession) UpdateAndGetStorageValue(message StateRootUpdateMessage, proofParams SFFLRegistryBaseProofParams, agreement []byte) (*types.Transaction, error) { + return _ContractSFFLServiceManager.Contract.UpdateAndGetStorageValue(&_ContractSFFLServiceManager.TransactOpts, message, proofParams, agreement) +} + +// UpdateStateRoot is a paid mutator transaction binding the contract method 0xd5b206a3. +// +// Solidity: function updateStateRoot((uint32,uint64,uint64,bytes32) message, (uint32[],(uint256,uint256)[],(uint256,uint256)[],(uint256[2],uint256[2]),(uint256,uint256),uint32[],uint32[],uint32[][]) nonSignerStakesAndSignature) returns() +func (_ContractSFFLServiceManager *ContractSFFLServiceManagerTransactor) UpdateStateRoot(opts *bind.TransactOpts, message StateRootUpdateMessage, nonSignerStakesAndSignature IBLSSignatureCheckerNonSignerStakesAndSignature) (*types.Transaction, error) { + return _ContractSFFLServiceManager.contract.Transact(opts, "updateStateRoot", message, nonSignerStakesAndSignature) +} + +// UpdateStateRoot is a paid mutator transaction binding the contract method 0xd5b206a3. +// +// Solidity: function updateStateRoot((uint32,uint64,uint64,bytes32) message, (uint32[],(uint256,uint256)[],(uint256,uint256)[],(uint256[2],uint256[2]),(uint256,uint256),uint32[],uint32[],uint32[][]) nonSignerStakesAndSignature) returns() +func (_ContractSFFLServiceManager *ContractSFFLServiceManagerSession) UpdateStateRoot(message StateRootUpdateMessage, nonSignerStakesAndSignature IBLSSignatureCheckerNonSignerStakesAndSignature) (*types.Transaction, error) { + return _ContractSFFLServiceManager.Contract.UpdateStateRoot(&_ContractSFFLServiceManager.TransactOpts, message, nonSignerStakesAndSignature) +} + +// UpdateStateRoot is a paid mutator transaction binding the contract method 0xd5b206a3. +// +// Solidity: function updateStateRoot((uint32,uint64,uint64,bytes32) message, (uint32[],(uint256,uint256)[],(uint256,uint256)[],(uint256[2],uint256[2]),(uint256,uint256),uint32[],uint32[],uint32[][]) nonSignerStakesAndSignature) returns() +func (_ContractSFFLServiceManager *ContractSFFLServiceManagerTransactorSession) UpdateStateRoot(message StateRootUpdateMessage, nonSignerStakesAndSignature IBLSSignatureCheckerNonSignerStakesAndSignature) (*types.Transaction, error) { + return _ContractSFFLServiceManager.Contract.UpdateStateRoot(&_ContractSFFLServiceManager.TransactOpts, message, nonSignerStakesAndSignature) +} + +// ContractSFFLServiceManagerInitializedIterator is returned from FilterInitialized and is used to iterate over the raw logs and unpacked data for Initialized events raised by the ContractSFFLServiceManager contract. +type ContractSFFLServiceManagerInitializedIterator struct { + Event *ContractSFFLServiceManagerInitialized // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *ContractSFFLServiceManagerInitializedIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(ContractSFFLServiceManagerInitialized) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(ContractSFFLServiceManagerInitialized) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *ContractSFFLServiceManagerInitializedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *ContractSFFLServiceManagerInitializedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// ContractSFFLServiceManagerInitialized represents a Initialized event raised by the ContractSFFLServiceManager contract. +type ContractSFFLServiceManagerInitialized struct { + Version uint8 + Raw types.Log // Blockchain specific contextual infos +} + +// FilterInitialized is a free log retrieval operation binding the contract event 0x7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498. +// +// Solidity: event Initialized(uint8 version) +func (_ContractSFFLServiceManager *ContractSFFLServiceManagerFilterer) FilterInitialized(opts *bind.FilterOpts) (*ContractSFFLServiceManagerInitializedIterator, error) { + + logs, sub, err := _ContractSFFLServiceManager.contract.FilterLogs(opts, "Initialized") + if err != nil { + return nil, err + } + return &ContractSFFLServiceManagerInitializedIterator{contract: _ContractSFFLServiceManager.contract, event: "Initialized", logs: logs, sub: sub}, nil +} + +// WatchInitialized is a free log subscription operation binding the contract event 0x7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498. +// +// Solidity: event Initialized(uint8 version) +func (_ContractSFFLServiceManager *ContractSFFLServiceManagerFilterer) WatchInitialized(opts *bind.WatchOpts, sink chan<- *ContractSFFLServiceManagerInitialized) (event.Subscription, error) { + + logs, sub, err := _ContractSFFLServiceManager.contract.WatchLogs(opts, "Initialized") + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(ContractSFFLServiceManagerInitialized) + if err := _ContractSFFLServiceManager.contract.UnpackLog(event, "Initialized", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseInitialized is a log parse operation binding the contract event 0x7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498. +// +// Solidity: event Initialized(uint8 version) +func (_ContractSFFLServiceManager *ContractSFFLServiceManagerFilterer) ParseInitialized(log types.Log) (*ContractSFFLServiceManagerInitialized, error) { + event := new(ContractSFFLServiceManagerInitialized) + if err := _ContractSFFLServiceManager.contract.UnpackLog(event, "Initialized", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// ContractSFFLServiceManagerOwnershipTransferredIterator is returned from FilterOwnershipTransferred and is used to iterate over the raw logs and unpacked data for OwnershipTransferred events raised by the ContractSFFLServiceManager contract. +type ContractSFFLServiceManagerOwnershipTransferredIterator struct { + Event *ContractSFFLServiceManagerOwnershipTransferred // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *ContractSFFLServiceManagerOwnershipTransferredIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(ContractSFFLServiceManagerOwnershipTransferred) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(ContractSFFLServiceManagerOwnershipTransferred) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *ContractSFFLServiceManagerOwnershipTransferredIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *ContractSFFLServiceManagerOwnershipTransferredIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// ContractSFFLServiceManagerOwnershipTransferred represents a OwnershipTransferred event raised by the ContractSFFLServiceManager contract. +type ContractSFFLServiceManagerOwnershipTransferred struct { + PreviousOwner common.Address + NewOwner common.Address + Raw types.Log // Blockchain specific contextual infos +} + +// FilterOwnershipTransferred is a free log retrieval operation binding the contract event 0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0. +// +// Solidity: event OwnershipTransferred(address indexed previousOwner, address indexed newOwner) +func (_ContractSFFLServiceManager *ContractSFFLServiceManagerFilterer) FilterOwnershipTransferred(opts *bind.FilterOpts, previousOwner []common.Address, newOwner []common.Address) (*ContractSFFLServiceManagerOwnershipTransferredIterator, error) { + + var previousOwnerRule []interface{} + for _, previousOwnerItem := range previousOwner { + previousOwnerRule = append(previousOwnerRule, previousOwnerItem) + } + var newOwnerRule []interface{} + for _, newOwnerItem := range newOwner { + newOwnerRule = append(newOwnerRule, newOwnerItem) + } + + logs, sub, err := _ContractSFFLServiceManager.contract.FilterLogs(opts, "OwnershipTransferred", previousOwnerRule, newOwnerRule) + if err != nil { + return nil, err + } + return &ContractSFFLServiceManagerOwnershipTransferredIterator{contract: _ContractSFFLServiceManager.contract, event: "OwnershipTransferred", logs: logs, sub: sub}, nil +} + +// WatchOwnershipTransferred is a free log subscription operation binding the contract event 0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0. +// +// Solidity: event OwnershipTransferred(address indexed previousOwner, address indexed newOwner) +func (_ContractSFFLServiceManager *ContractSFFLServiceManagerFilterer) WatchOwnershipTransferred(opts *bind.WatchOpts, sink chan<- *ContractSFFLServiceManagerOwnershipTransferred, previousOwner []common.Address, newOwner []common.Address) (event.Subscription, error) { + + var previousOwnerRule []interface{} + for _, previousOwnerItem := range previousOwner { + previousOwnerRule = append(previousOwnerRule, previousOwnerItem) + } + var newOwnerRule []interface{} + for _, newOwnerItem := range newOwner { + newOwnerRule = append(newOwnerRule, newOwnerItem) + } + + logs, sub, err := _ContractSFFLServiceManager.contract.WatchLogs(opts, "OwnershipTransferred", previousOwnerRule, newOwnerRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(ContractSFFLServiceManagerOwnershipTransferred) + if err := _ContractSFFLServiceManager.contract.UnpackLog(event, "OwnershipTransferred", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseOwnershipTransferred is a log parse operation binding the contract event 0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0. +// +// Solidity: event OwnershipTransferred(address indexed previousOwner, address indexed newOwner) +func (_ContractSFFLServiceManager *ContractSFFLServiceManagerFilterer) ParseOwnershipTransferred(log types.Log) (*ContractSFFLServiceManagerOwnershipTransferred, error) { + event := new(ContractSFFLServiceManagerOwnershipTransferred) + if err := _ContractSFFLServiceManager.contract.UnpackLog(event, "OwnershipTransferred", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// ContractSFFLServiceManagerStateRootUpdatedIterator is returned from FilterStateRootUpdated and is used to iterate over the raw logs and unpacked data for StateRootUpdated events raised by the ContractSFFLServiceManager contract. +type ContractSFFLServiceManagerStateRootUpdatedIterator struct { + Event *ContractSFFLServiceManagerStateRootUpdated // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *ContractSFFLServiceManagerStateRootUpdatedIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(ContractSFFLServiceManagerStateRootUpdated) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(ContractSFFLServiceManagerStateRootUpdated) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *ContractSFFLServiceManagerStateRootUpdatedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *ContractSFFLServiceManagerStateRootUpdatedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// ContractSFFLServiceManagerStateRootUpdated represents a StateRootUpdated event raised by the ContractSFFLServiceManager contract. +type ContractSFFLServiceManagerStateRootUpdated struct { + RollupId uint32 + BlockHeight uint64 + StateRoot [32]byte + Raw types.Log // Blockchain specific contextual infos +} + +// FilterStateRootUpdated is a free log retrieval operation binding the contract event 0xca7171570f4ca232f925661b810636124eaf784a25b7c14e6b34c95b814dfdd8. +// +// Solidity: event StateRootUpdated(uint32 indexed rollupId, uint64 indexed blockHeight, bytes32 stateRoot) +func (_ContractSFFLServiceManager *ContractSFFLServiceManagerFilterer) FilterStateRootUpdated(opts *bind.FilterOpts, rollupId []uint32, blockHeight []uint64) (*ContractSFFLServiceManagerStateRootUpdatedIterator, error) { + + var rollupIdRule []interface{} + for _, rollupIdItem := range rollupId { + rollupIdRule = append(rollupIdRule, rollupIdItem) + } + var blockHeightRule []interface{} + for _, blockHeightItem := range blockHeight { + blockHeightRule = append(blockHeightRule, blockHeightItem) + } + + logs, sub, err := _ContractSFFLServiceManager.contract.FilterLogs(opts, "StateRootUpdated", rollupIdRule, blockHeightRule) + if err != nil { + return nil, err + } + return &ContractSFFLServiceManagerStateRootUpdatedIterator{contract: _ContractSFFLServiceManager.contract, event: "StateRootUpdated", logs: logs, sub: sub}, nil +} + +// WatchStateRootUpdated is a free log subscription operation binding the contract event 0xca7171570f4ca232f925661b810636124eaf784a25b7c14e6b34c95b814dfdd8. +// +// Solidity: event StateRootUpdated(uint32 indexed rollupId, uint64 indexed blockHeight, bytes32 stateRoot) +func (_ContractSFFLServiceManager *ContractSFFLServiceManagerFilterer) WatchStateRootUpdated(opts *bind.WatchOpts, sink chan<- *ContractSFFLServiceManagerStateRootUpdated, rollupId []uint32, blockHeight []uint64) (event.Subscription, error) { + + var rollupIdRule []interface{} + for _, rollupIdItem := range rollupId { + rollupIdRule = append(rollupIdRule, rollupIdItem) + } + var blockHeightRule []interface{} + for _, blockHeightItem := range blockHeight { + blockHeightRule = append(blockHeightRule, blockHeightItem) + } + + logs, sub, err := _ContractSFFLServiceManager.contract.WatchLogs(opts, "StateRootUpdated", rollupIdRule, blockHeightRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(ContractSFFLServiceManagerStateRootUpdated) + if err := _ContractSFFLServiceManager.contract.UnpackLog(event, "StateRootUpdated", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseStateRootUpdated is a log parse operation binding the contract event 0xca7171570f4ca232f925661b810636124eaf784a25b7c14e6b34c95b814dfdd8. +// +// Solidity: event StateRootUpdated(uint32 indexed rollupId, uint64 indexed blockHeight, bytes32 stateRoot) +func (_ContractSFFLServiceManager *ContractSFFLServiceManagerFilterer) ParseStateRootUpdated(log types.Log) (*ContractSFFLServiceManagerStateRootUpdated, error) { + event := new(ContractSFFLServiceManagerStateRootUpdated) + if err := _ContractSFFLServiceManager.contract.UnpackLog(event, "StateRootUpdated", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} diff --git a/contracts/bindings/SFFLTaskManager/binding.go b/contracts/bindings/SFFLTaskManager/binding.go new file mode 100644 index 00000000..9db45cf8 --- /dev/null +++ b/contracts/bindings/SFFLTaskManager/binding.go @@ -0,0 +1,2724 @@ +// Code generated - DO NOT EDIT. +// This file is a generated binding and any manual changes will be lost. + +package contractSFFLTaskManager + +import ( + "errors" + "math/big" + "strings" + + ethereum "github.com/ethereum/go-ethereum" + "github.com/ethereum/go-ethereum/accounts/abi" + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/event" +) + +// Reference imports to suppress errors if they are not otherwise used. +var ( + _ = errors.New + _ = big.NewInt + _ = strings.NewReader + _ = ethereum.NotFound + _ = bind.Bind + _ = common.Big1 + _ = types.BloomLookup + _ = event.NewSubscription + _ = abi.ConvertType +) + +// BN254G1Point is an auto generated low-level Go binding around an user-defined struct. +type BN254G1Point struct { + X *big.Int + Y *big.Int +} + +// BN254G2Point is an auto generated low-level Go binding around an user-defined struct. +type BN254G2Point struct { + X [2]*big.Int + Y [2]*big.Int +} + +// CheckpointTask is an auto generated low-level Go binding around an user-defined struct. +type CheckpointTask struct { + TaskCreatedBlock uint32 + FromNearBlock uint64 + ToNearBlock uint64 + QuorumThreshold uint32 + QuorumNumbers []byte +} + +// CheckpointTaskResponse is an auto generated low-level Go binding around an user-defined struct. +type CheckpointTaskResponse struct { + ReferenceTaskIndex uint32 + StateRootUpdatesRoot [32]byte + OperatorSetUpdatesRoot [32]byte +} + +// CheckpointTaskResponseMetadata is an auto generated low-level Go binding around an user-defined struct. +type CheckpointTaskResponseMetadata struct { + TaskRespondedBlock uint32 + HashOfNonSigners [32]byte +} + +// IBLSSignatureCheckerNonSignerStakesAndSignature is an auto generated low-level Go binding around an user-defined struct. +type IBLSSignatureCheckerNonSignerStakesAndSignature struct { + NonSignerQuorumBitmapIndices []uint32 + NonSignerPubkeys []BN254G1Point + QuorumApks []BN254G1Point + ApkG2 BN254G2Point + Sigma BN254G1Point + QuorumApkIndices []uint32 + TotalStakeIndices []uint32 + NonSignerStakeIndices [][]uint32 +} + +// IBLSSignatureCheckerQuorumStakeTotals is an auto generated low-level Go binding around an user-defined struct. +type IBLSSignatureCheckerQuorumStakeTotals struct { + SignedStakeForQuorum []*big.Int + TotalStakeForQuorum []*big.Int +} + +// OperatorStateRetrieverCheckSignaturesIndices is an auto generated low-level Go binding around an user-defined struct. +type OperatorStateRetrieverCheckSignaturesIndices struct { + NonSignerQuorumBitmapIndices []uint32 + QuorumApkIndices []uint32 + TotalStakeIndices []uint32 + NonSignerStakeIndices [][]uint32 +} + +// OperatorStateRetrieverOperator is an auto generated low-level Go binding around an user-defined struct. +type OperatorStateRetrieverOperator struct { + OperatorId [32]byte + Stake *big.Int +} + +// ContractSFFLTaskManagerMetaData contains all meta data concerning the ContractSFFLTaskManager contract. +var ContractSFFLTaskManagerMetaData = &bind.MetaData{ + ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"registryCoordinator\",\"type\":\"address\",\"internalType\":\"contractIRegistryCoordinator\"},{\"name\":\"taskResponseWindowBlock\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"TASK_CHALLENGE_WINDOW_BLOCK\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"TASK_RESPONSE_WINDOW_BLOCK\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"THRESHOLD_DENOMINATOR\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"aggregator\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"allCheckpointTaskHashes\",\"inputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"allCheckpointTaskResponses\",\"inputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"blsApkRegistry\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIBLSApkRegistry\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"checkQuorum\",\"inputs\":[{\"name\":\"messageHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"quorumNumbers\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"referenceBlockNumber\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"nonSignerStakesAndSignature\",\"type\":\"tuple\",\"internalType\":\"structIBLSSignatureChecker.NonSignerStakesAndSignature\",\"components\":[{\"name\":\"nonSignerQuorumBitmapIndices\",\"type\":\"uint32[]\",\"internalType\":\"uint32[]\"},{\"name\":\"nonSignerPubkeys\",\"type\":\"tuple[]\",\"internalType\":\"structBN254.G1Point[]\",\"components\":[{\"name\":\"X\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"Y\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"name\":\"quorumApks\",\"type\":\"tuple[]\",\"internalType\":\"structBN254.G1Point[]\",\"components\":[{\"name\":\"X\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"Y\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"name\":\"apkG2\",\"type\":\"tuple\",\"internalType\":\"structBN254.G2Point\",\"components\":[{\"name\":\"X\",\"type\":\"uint256[2]\",\"internalType\":\"uint256[2]\"},{\"name\":\"Y\",\"type\":\"uint256[2]\",\"internalType\":\"uint256[2]\"}]},{\"name\":\"sigma\",\"type\":\"tuple\",\"internalType\":\"structBN254.G1Point\",\"components\":[{\"name\":\"X\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"Y\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"name\":\"quorumApkIndices\",\"type\":\"uint32[]\",\"internalType\":\"uint32[]\"},{\"name\":\"totalStakeIndices\",\"type\":\"uint32[]\",\"internalType\":\"uint32[]\"},{\"name\":\"nonSignerStakeIndices\",\"type\":\"uint32[][]\",\"internalType\":\"uint32[][]\"}]},{\"name\":\"quorumThreshold\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"checkSignatures\",\"inputs\":[{\"name\":\"msgHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"quorumNumbers\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"referenceBlockNumber\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"params\",\"type\":\"tuple\",\"internalType\":\"structIBLSSignatureChecker.NonSignerStakesAndSignature\",\"components\":[{\"name\":\"nonSignerQuorumBitmapIndices\",\"type\":\"uint32[]\",\"internalType\":\"uint32[]\"},{\"name\":\"nonSignerPubkeys\",\"type\":\"tuple[]\",\"internalType\":\"structBN254.G1Point[]\",\"components\":[{\"name\":\"X\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"Y\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"name\":\"quorumApks\",\"type\":\"tuple[]\",\"internalType\":\"structBN254.G1Point[]\",\"components\":[{\"name\":\"X\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"Y\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"name\":\"apkG2\",\"type\":\"tuple\",\"internalType\":\"structBN254.G2Point\",\"components\":[{\"name\":\"X\",\"type\":\"uint256[2]\",\"internalType\":\"uint256[2]\"},{\"name\":\"Y\",\"type\":\"uint256[2]\",\"internalType\":\"uint256[2]\"}]},{\"name\":\"sigma\",\"type\":\"tuple\",\"internalType\":\"structBN254.G1Point\",\"components\":[{\"name\":\"X\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"Y\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"name\":\"quorumApkIndices\",\"type\":\"uint32[]\",\"internalType\":\"uint32[]\"},{\"name\":\"totalStakeIndices\",\"type\":\"uint32[]\",\"internalType\":\"uint32[]\"},{\"name\":\"nonSignerStakeIndices\",\"type\":\"uint32[][]\",\"internalType\":\"uint32[][]\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structIBLSSignatureChecker.QuorumStakeTotals\",\"components\":[{\"name\":\"signedStakeForQuorum\",\"type\":\"uint96[]\",\"internalType\":\"uint96[]\"},{\"name\":\"totalStakeForQuorum\",\"type\":\"uint96[]\",\"internalType\":\"uint96[]\"}]},{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"checkpointTaskNumber\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"checkpointTaskSuccesfullyChallenged\",\"inputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"createCheckpointTask\",\"inputs\":[{\"name\":\"fromNearBlock\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"toNearBlock\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"quorumThreshold\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"quorumNumbers\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"delegation\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIDelegationManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"generator\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getCheckSignaturesIndices\",\"inputs\":[{\"name\":\"registryCoordinator\",\"type\":\"address\",\"internalType\":\"contractIRegistryCoordinator\"},{\"name\":\"referenceBlockNumber\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"quorumNumbers\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"nonSignerOperatorIds\",\"type\":\"bytes32[]\",\"internalType\":\"bytes32[]\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structOperatorStateRetriever.CheckSignaturesIndices\",\"components\":[{\"name\":\"nonSignerQuorumBitmapIndices\",\"type\":\"uint32[]\",\"internalType\":\"uint32[]\"},{\"name\":\"quorumApkIndices\",\"type\":\"uint32[]\",\"internalType\":\"uint32[]\"},{\"name\":\"totalStakeIndices\",\"type\":\"uint32[]\",\"internalType\":\"uint32[]\"},{\"name\":\"nonSignerStakeIndices\",\"type\":\"uint32[][]\",\"internalType\":\"uint32[][]\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getOperatorState\",\"inputs\":[{\"name\":\"registryCoordinator\",\"type\":\"address\",\"internalType\":\"contractIRegistryCoordinator\"},{\"name\":\"quorumNumbers\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"blockNumber\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple[][]\",\"internalType\":\"structOperatorStateRetriever.Operator[][]\",\"components\":[{\"name\":\"operatorId\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"stake\",\"type\":\"uint96\",\"internalType\":\"uint96\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getOperatorState\",\"inputs\":[{\"name\":\"registryCoordinator\",\"type\":\"address\",\"internalType\":\"contractIRegistryCoordinator\"},{\"name\":\"operatorId\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"blockNumber\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"\",\"type\":\"tuple[][]\",\"internalType\":\"structOperatorStateRetriever.Operator[][]\",\"components\":[{\"name\":\"operatorId\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"stake\",\"type\":\"uint96\",\"internalType\":\"uint96\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"_pauserRegistry\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"},{\"name\":\"initialOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_aggregator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_generator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"nextCheckpointTaskNum\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"pauseAll\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[{\"name\":\"index\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pauserRegistry\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"raiseAndResolveCheckpointChallenge\",\"inputs\":[{\"name\":\"task\",\"type\":\"tuple\",\"internalType\":\"structCheckpoint.Task\",\"components\":[{\"name\":\"taskCreatedBlock\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"fromNearBlock\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"toNearBlock\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"quorumThreshold\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"quorumNumbers\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"taskResponse\",\"type\":\"tuple\",\"internalType\":\"structCheckpoint.TaskResponse\",\"components\":[{\"name\":\"referenceTaskIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"stateRootUpdatesRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"operatorSetUpdatesRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"name\":\"taskResponseMetadata\",\"type\":\"tuple\",\"internalType\":\"structCheckpoint.TaskResponseMetadata\",\"components\":[{\"name\":\"taskRespondedBlock\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"hashOfNonSigners\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"name\":\"pubkeysOfNonSigningOperators\",\"type\":\"tuple[]\",\"internalType\":\"structBN254.G1Point[]\",\"components\":[{\"name\":\"X\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"Y\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"registryCoordinator\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIRegistryCoordinator\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"respondToCheckpointTask\",\"inputs\":[{\"name\":\"task\",\"type\":\"tuple\",\"internalType\":\"structCheckpoint.Task\",\"components\":[{\"name\":\"taskCreatedBlock\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"fromNearBlock\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"toNearBlock\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"quorumThreshold\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"quorumNumbers\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"taskResponse\",\"type\":\"tuple\",\"internalType\":\"structCheckpoint.TaskResponse\",\"components\":[{\"name\":\"referenceTaskIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"stateRootUpdatesRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"operatorSetUpdatesRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"name\":\"nonSignerStakesAndSignature\",\"type\":\"tuple\",\"internalType\":\"structIBLSSignatureChecker.NonSignerStakesAndSignature\",\"components\":[{\"name\":\"nonSignerQuorumBitmapIndices\",\"type\":\"uint32[]\",\"internalType\":\"uint32[]\"},{\"name\":\"nonSignerPubkeys\",\"type\":\"tuple[]\",\"internalType\":\"structBN254.G1Point[]\",\"components\":[{\"name\":\"X\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"Y\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"name\":\"quorumApks\",\"type\":\"tuple[]\",\"internalType\":\"structBN254.G1Point[]\",\"components\":[{\"name\":\"X\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"Y\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"name\":\"apkG2\",\"type\":\"tuple\",\"internalType\":\"structBN254.G2Point\",\"components\":[{\"name\":\"X\",\"type\":\"uint256[2]\",\"internalType\":\"uint256[2]\"},{\"name\":\"Y\",\"type\":\"uint256[2]\",\"internalType\":\"uint256[2]\"}]},{\"name\":\"sigma\",\"type\":\"tuple\",\"internalType\":\"structBN254.G1Point\",\"components\":[{\"name\":\"X\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"Y\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"name\":\"quorumApkIndices\",\"type\":\"uint32[]\",\"internalType\":\"uint32[]\"},{\"name\":\"totalStakeIndices\",\"type\":\"uint32[]\",\"internalType\":\"uint32[]\"},{\"name\":\"nonSignerStakeIndices\",\"type\":\"uint32[][]\",\"internalType\":\"uint32[][]\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setPauserRegistry\",\"inputs\":[{\"name\":\"newPauserRegistry\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setStaleStakesForbidden\",\"inputs\":[{\"name\":\"value\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"stakeRegistry\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIStakeRegistry\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"staleStakesForbidden\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"transferOwnership\",\"inputs\":[{\"name\":\"newOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"trySignatureAndApkVerification\",\"inputs\":[{\"name\":\"msgHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"apk\",\"type\":\"tuple\",\"internalType\":\"structBN254.G1Point\",\"components\":[{\"name\":\"X\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"Y\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"name\":\"apkG2\",\"type\":\"tuple\",\"internalType\":\"structBN254.G2Point\",\"components\":[{\"name\":\"X\",\"type\":\"uint256[2]\",\"internalType\":\"uint256[2]\"},{\"name\":\"Y\",\"type\":\"uint256[2]\",\"internalType\":\"uint256[2]\"}]},{\"name\":\"sigma\",\"type\":\"tuple\",\"internalType\":\"structBN254.G1Point\",\"components\":[{\"name\":\"X\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"Y\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}],\"outputs\":[{\"name\":\"pairingSuccessful\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"siganatureIsValid\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"unpause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"CheckpointTaskChallengedSuccessfully\",\"inputs\":[{\"name\":\"taskIndex\",\"type\":\"uint32\",\"indexed\":true,\"internalType\":\"uint32\"},{\"name\":\"challenger\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"CheckpointTaskChallengedUnsuccessfully\",\"inputs\":[{\"name\":\"taskIndex\",\"type\":\"uint32\",\"indexed\":true,\"internalType\":\"uint32\"},{\"name\":\"challenger\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"CheckpointTaskCreated\",\"inputs\":[{\"name\":\"taskIndex\",\"type\":\"uint32\",\"indexed\":true,\"internalType\":\"uint32\"},{\"name\":\"task\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structCheckpoint.Task\",\"components\":[{\"name\":\"taskCreatedBlock\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"fromNearBlock\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"toNearBlock\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"quorumThreshold\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"quorumNumbers\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"CheckpointTaskResponded\",\"inputs\":[{\"name\":\"taskResponse\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structCheckpoint.TaskResponse\",\"components\":[{\"name\":\"referenceTaskIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"stateRootUpdatesRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"operatorSetUpdatesRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"name\":\"taskResponseMetadata\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structCheckpoint.TaskResponseMetadata\",\"components\":[{\"name\":\"taskRespondedBlock\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"hashOfNonSigners\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferred\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Paused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"PauserRegistrySet\",\"inputs\":[{\"name\":\"pauserRegistry\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIPauserRegistry\"},{\"name\":\"newPauserRegistry\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIPauserRegistry\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"StaleStakesForbiddenUpdate\",\"inputs\":[{\"name\":\"value\",\"type\":\"bool\",\"indexed\":false,\"internalType\":\"bool\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Unpaused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false}]", + Bin: "0x6101206040523480156200001257600080fd5b50604051620058d7380380620058d78339810160408190526200003591620001f7565b81806001600160a01b03166080816001600160a01b031681525050806001600160a01b031663683048356040518163ffffffff1660e01b8152600401602060405180830381865afa1580156200008f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620000b591906200023e565b6001600160a01b031660a0816001600160a01b031681525050806001600160a01b0316635df459466040518163ffffffff1660e01b8152600401602060405180830381865afa1580156200010d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200013391906200023e565b6001600160a01b031660c0816001600160a01b03168152505060a0516001600160a01b031663df5cf7236040518163ffffffff1660e01b8152600401602060405180830381865afa1580156200018d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620001b391906200023e565b6001600160a01b031660e052506097805460ff1916600117905563ffffffff16610100525062000265565b6001600160a01b0381168114620001f457600080fd5b50565b600080604083850312156200020b57600080fd5b82516200021881620001de565b602084015190925063ffffffff811681146200023357600080fd5b809150509250929050565b6000602082840312156200025157600080fd5b81516200025e81620001de565b9392505050565b60805160a05160c05160e051610100516155ee620002e96000396000818161027d0152612b4e01526000818161056f0152611ff10152600081816103fa01526121db015260008181610421015281816123b1015261257301526000818161044801528181610db401528181611cee01528181611e67015261209501526155ee6000f3fe608060405234801561001057600080fd5b506004361061021c5760003560e01c80636efb463611610125578063cefdc1d4116100ad578063efcf4edb1161007c578063efcf4edb14610599578063f2fde38b146105ac578063f63c5bab14610591578063f8c8765e146105bf578063fabc1cbc146105d257600080fd5b8063cefdc1d414610536578063da16491f14610557578063df5cf7231461056a578063ef0244581461059157600080fd5b80638cbc379a116100f45780638cbc379a146104c25780638da5cb5b146104d557806395eebee6146104e6578063a168e3c014610509578063b98d09081461052957600080fd5b80636efb46361461046a578063715018a61461048b5780637afa1eed14610493578063886f1195146104af57600080fd5b80634f19ade7116101a85780635ace2df7116101775780635ace2df7146103da5780635c975abb146103ed5780635df45946146103f5578063683048351461041c5780636d14a9871461044357600080fd5b80634f19ade7146103515780634f739f741461037f578063595c6a671461039f5780635ac86ab7146103a757600080fd5b8063245a7bfc116101ef578063245a7bfc146102b4578063292f7a4e146102df5780632e44b349146103095780633563b0d11461031e578063416c7e5e1461033e57600080fd5b806310d67a2f14610221578063136439dd14610236578063171f1d5b146102495780631ad4318914610278575b600080fd5b61023461022f366004614033565b6105e5565b005b610234610244366004614050565b6106a1565b61025c6102573660046141ce565b6107e0565b6040805192151583529015156020830152015b60405180910390f35b61029f7f000000000000000000000000000000000000000000000000000000000000000081565b60405163ffffffff909116815260200161026f565b6098546102c7906001600160a01b031681565b6040516001600160a01b03909116815260200161026f565b6102f26102ed366004614528565b61096a565b60408051921515835260208301919091520161026f565b60975461029f90610100900463ffffffff1681565b61033161032c3660046145c2565b610a37565b60405161026f9190614709565b61023461034c36600461472a565b610db2565b61037161035f366004614747565b60996020526000908152604090205481565b60405190815260200161026f565b61039261038d366004614764565b610f27565b60405161026f9190614868565b6102346115ab565b6103ca6103b5366004614932565b606654600160ff9092169190911b9081161490565b604051901515815260200161026f565b6102346103e8366004614979565b611672565b606654610371565b6102c77f000000000000000000000000000000000000000000000000000000000000000081565b6102c77f000000000000000000000000000000000000000000000000000000000000000081565b6102c77f000000000000000000000000000000000000000000000000000000000000000081565b61047d610478366004614a0a565b61199c565b60405161026f929190614aca565b610234612828565b6097546102c7906501000000000090046001600160a01b031681565b6065546102c7906001600160a01b031681565b609754610100900463ffffffff1661029f565b6033546001600160a01b03166102c7565b6103ca6104f4366004614747565b609b6020526000908152604090205460ff1681565b610371610517366004614747565b609a6020526000908152604090205481565b6097546103ca9060ff1681565b610549610544366004614b13565b61283c565b60405161026f929190614b55565b610234610565366004614b76565b6129ce565b6102c77f000000000000000000000000000000000000000000000000000000000000000081565b61029f606481565b6102346105a7366004614c01565b612ccf565b6102346105ba366004614033565b612ecf565b6102346105cd366004614c78565b612f45565b6102346105e0366004614050565b6130ad565b606560009054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610638573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061065c9190614cd4565b6001600160a01b0316336001600160a01b0316146106955760405162461bcd60e51b815260040161068c90614cf1565b60405180910390fd5b61069e81613209565b50565b60655460405163237dfb4760e11b81523360048201526001600160a01b03909116906346fbf68e90602401602060405180830381865afa1580156106e9573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061070d9190614d3b565b6107295760405162461bcd60e51b815260040161068c90614d58565b606654818116146107a25760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e70617573653a20696e76616c696420617474656d70742060448201527f746f20756e70617573652066756e6374696f6e616c6974790000000000000000606482015260840161068c565b606681905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d906020015b60405180910390a250565b60008060007f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018787600001518860200151886000015160006002811061082857610828614da0565b60200201518951600160200201518a6020015160006002811061084d5761084d614da0565b60200201518b6020015160016002811061086957610869614da0565b602090810291909101518c518d8301516040516108c69a99989796959401988952602089019790975260408801959095526060870193909352608086019190915260a085015260c084015260e08301526101008201526101200190565b6040516020818303038152906040528051906020012060001c6108e99190614db6565b905061095c6109026108fb8884613300565b8690613397565b61090a61342b565b6109526109438561093d604080518082018252600080825260209182015281518083019092526001825260029082015290565b90613300565b61094c8c6134eb565b90613397565b886201d4c061357b565b909890975095505050505050565b60008060008061097d8a8a8a8a8a61199c565b9150915060005b88811015610a23578563ffffffff16836020015182815181106109a9576109a9614da0565b60200260200101516109bb9190614dee565b6001600160601b0316606463ffffffff16846000015183815181106109e2576109e2614da0565b60200260200101516109f49190614dee565b6001600160601b03161015610a115750600093509150610a2c9050565b80610a1b81614e1d565b915050610984565b50600193509150505b965096945050505050565b60606000846001600160a01b031663683048356040518163ffffffff1660e01b8152600401602060405180830381865afa158015610a79573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a9d9190614cd4565b90506000856001600160a01b0316639e9923c26040518163ffffffff1660e01b8152600401602060405180830381865afa158015610adf573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b039190614cd4565b9050600085516001600160401b03811115610b2057610b20614069565b604051908082528060200260200182016040528015610b5357816020015b6060815260200190600190039081610b3e5790505b50905060005b8651811015610da5576000878281518110610b7657610b76614da0565b0160200151604051638902624560e01b815260f89190911c6004820181905263ffffffff8916602483015291506000906001600160a01b03861690638902624590604401600060405180830381865afa158015610bd7573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610bff9190810190614e38565b905080516001600160401b03811115610c1a57610c1a614069565b604051908082528060200260200182016040528015610c5f57816020015b6040805180820190915260008082526020820152815260200190600190039081610c385790505b50848481518110610c7257610c72614da0565b602002602001018190525060005b8151811015610d8f576000828281518110610c9d57610c9d614da0565b602090810291909101810151604080518082018252828152905163fa28c62760e01b81526004810183905260ff8816602482015263ffffffff8e166044820152919350918201906001600160a01b038b169063fa28c62790606401602060405180830381865afa158015610d15573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d399190614ec8565b6001600160601b0316815250868681518110610d5757610d57614da0565b60200260200101518381518110610d7057610d70614da0565b6020026020010181905250508080610d8790614e1d565b915050610c80565b5050508080610d9d90614e1d565b915050610b59565b50925050505b9392505050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610e10573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e349190614cd4565b6001600160a01b0316336001600160a01b031614610ee05760405162461bcd60e51b815260206004820152605c60248201527f424c535369676e6174757265436865636b65722e6f6e6c79436f6f7264696e6160448201527f746f724f776e65723a2063616c6c6572206973206e6f7420746865206f776e6560648201527f72206f6620746865207265676973747279436f6f7264696e61746f7200000000608482015260a40161068c565b6097805460ff19168215159081179091556040519081527f40e4ed880a29e0f6ddce307457fb75cddf4feef7d3ecb0301bfdf4976a0e2dfc9060200160405180910390a150565b610f526040518060800160405280606081526020016060815260200160608152602001606081525090565b6000876001600160a01b031663683048356040518163ffffffff1660e01b8152600401602060405180830381865afa158015610f92573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fb69190614cd4565b9050610fe36040518060800160405280606081526020016060815260200160608152602001606081525090565b6040516361c8a12f60e11b81526001600160a01b038a169063c391425e90611013908b9089908990600401614ef1565b600060405180830381865afa158015611030573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526110589190810190614f3b565b81526040516340e03a8160e11b81526001600160a01b038316906381c075029061108a908b908b908b90600401614ff2565b600060405180830381865afa1580156110a7573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526110cf9190810190614f3b565b6040820152856001600160401b038111156110ec576110ec614069565b60405190808252806020026020018201604052801561111f57816020015b606081526020019060019003908161110a5790505b50606082015260005b60ff81168711156114bc576000856001600160401b0381111561114d5761114d614069565b604051908082528060200260200182016040528015611176578160200160208202803683370190505b5083606001518360ff168151811061119057611190614da0565b602002602001018190525060005b868110156113bc5760008c6001600160a01b03166304ec63518a8a858181106111c9576111c9614da0565b905060200201358e886000015186815181106111e7576111e7614da0565b60200260200101516040518463ffffffff1660e01b81526004016112249392919092835263ffffffff918216602084015216604082015260600190565b602060405180830381865afa158015611241573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611265919061501b565b90508a8a8560ff1681811061127c5761127c614da0565b6001600160c01b03841692013560f81c9190911c6001908116141590506113a957856001600160a01b031663dd9846b98a8a858181106112be576112be614da0565b905060200201358d8d8860ff168181106112da576112da614da0565b6040516001600160e01b031960e087901b1681526004810194909452919091013560f81c60248301525063ffffffff8f166044820152606401602060405180830381865afa158015611330573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113549190615044565b85606001518560ff168151811061136d5761136d614da0565b6020026020010151848151811061138657611386614da0565b63ffffffff90921660209283029190910190910152826113a581614e1d565b9350505b50806113b481614e1d565b91505061119e565b506000816001600160401b038111156113d7576113d7614069565b604051908082528060200260200182016040528015611400578160200160208202803683370190505b50905060005b828110156114815784606001518460ff168151811061142757611427614da0565b6020026020010151818151811061144057611440614da0565b602002602001015182828151811061145a5761145a614da0565b63ffffffff909216602092830291909101909101528061147981614e1d565b915050611406565b508084606001518460ff168151811061149c5761149c614da0565b6020026020010181905250505080806114b490615061565b915050611128565b506000896001600160a01b0316635df459466040518163ffffffff1660e01b8152600401602060405180830381865afa1580156114fd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115219190614cd4565b60405163354952a360e21b81529091506001600160a01b0382169063d5254a8c90611554908b908b908e90600401615081565b600060405180830381865afa158015611571573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526115999190810190614f3b565b60208301525098975050505050505050565b60655460405163237dfb4760e11b81523360048201526001600160a01b03909116906346fbf68e90602401602060405180830381865afa1580156115f3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116179190614d3b565b6116335760405162461bcd60e51b815260040161068c90614d58565b600019606681905560405190815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a2565b60006116816020850185614747565b63ffffffff81166000908152609a60205260409020549091506116db5760405162461bcd60e51b815260206004820152601260248201527115185cdac81b9bdd081c995cdc1bdb99195960721b604482015260640161068c565b6116e5848461379f565b63ffffffff82166000908152609a60205260409020541461173e5760405162461bcd60e51b815260206004820152601360248201527257726f6e67207461736b20726573706f6e736560681b604482015260640161068c565b63ffffffff81166000908152609b602052604090205460ff16156117a45760405162461bcd60e51b815260206004820152601760248201527f416c7265616479206265656e206368616c6c656e676564000000000000000000604482015260640161068c565b60646117b36020850185614747565b6117bd91906150ab565b63ffffffff164363ffffffff1611156118185760405162461bcd60e51b815260206004820152601860248201527f4368616c6c656e676520706572696f6420657870697265640000000000000000604482015260640161068c565b604051339063ffffffff8316907f0c6923c4a98292e75c5d677a1634527f87b6d19cf2c7d396aece99790c44a79590600090a350611996565b83518110156118bd5761188e84828151811061186f5761186f614da0565b6020026020010151805160009081526020918201519091526040902090565b8282815181106118a0576118a0614da0565b6020908102919091010152806118b581614e1d565b915050611851565b5060006118cd6020880188614747565b826040516020016118df9291906150d3565b6040516020818303038152906040528051906020012090508460200135811461194a5760405162461bcd60e51b815260206004820152601860248201527f57726f6e67206e6f6e2d7369676e6572207075626b6579730000000000000000604482015260640161068c565b63ffffffff83166000818152609b6020526040808220805460ff19166001179055513392917fff48388ad5e2a6d1845a7672040fba7d9b14b22b9e0eecd37046e5313d3aebc291a35050505b50505050565b604080518082018252606080825260208201529082015151600090851480156119c9575060a08301515185145b80156119d9575060c08301515185145b80156119e9575060e08301515185145b611a535760405162461bcd60e51b8152602060048201526041602482015260008051602061559983398151915260448201527f7265733a20696e7075742071756f72756d206c656e677468206d69736d6174636064820152600d60fb1b608482015260a40161068c565b82515160208401515114611acb5760405162461bcd60e51b815260206004820152604460248201819052600080516020615599833981519152908201527f7265733a20696e707574206e6f6e7369676e6572206c656e677468206d69736d6064820152630c2e8c6d60e31b608482015260a40161068c565b4363ffffffff168463ffffffff161115611b3b5760405162461bcd60e51b815260206004820152603c602482015260008051602061559983398151915260448201527f7265733a20696e76616c6964207265666572656e636520626c6f636b00000000606482015260840161068c565b6040805180820182526000808252602080830191909152825180840190935260608084529083015290866001600160401b03811115611b7c57611b7c614069565b604051908082528060200260200182016040528015611ba5578160200160208202803683370190505b506020820152866001600160401b03811115611bc357611bc3614069565b604051908082528060200260200182016040528015611bec578160200160208202803683370190505b50815260408051808201909152606080825260208201528560200151516001600160401b03811115611c2057611c20614069565b604051908082528060200260200182016040528015611c49578160200160208202803683370190505b5081526020860151516001600160401b03811115611c6957611c69614069565b604051908082528060200260200182016040528015611c92578160200160208202803683370190505b5081602001819052506000611d648a8a8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505060408051639aa1653d60e01b815290516001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169350639aa1653d925060048083019260209291908290030181865afa158015611d3b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d5f919061511b565b6137d3565b905060005b876020015151811015611fe057611d8f8860200151828151811061186f5761186f614da0565b83602001518281518110611da557611da5614da0565b60209081029190910101528015611e65576020830151611dc6600183615138565b81518110611dd657611dd6614da0565b602002602001015160001c83602001518281518110611df757611df7614da0565b602002602001015160001c11611e65576040805162461bcd60e51b815260206004820152602481019190915260008051602061559983398151915260448201527f7265733a206e6f6e5369676e65725075626b657973206e6f7420736f72746564606482015260840161068c565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166304ec635184602001518381518110611eaa57611eaa614da0565b60200260200101518b8b600001518581518110611ec957611ec9614da0565b60200260200101516040518463ffffffff1660e01b8152600401611f069392919092835263ffffffff918216602084015216604082015260600190565b602060405180830381865afa158015611f23573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f47919061501b565b6001600160c01b031683600001518281518110611f6657611f66614da0565b602002602001018181525050611fcc6108fb611fa08486600001518581518110611f9257611f92614da0565b602002602001015116613885565b8a602001518481518110611fb657611fb6614da0565b60200260200101516138b090919063ffffffff16565b945080611fd881614e1d565b915050611d69565b5050611feb83613994565b925060007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166350f73e7c6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561204d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612071919061514f565b60975490915060ff1660005b8a8110156126f75781156121d9578963ffffffff16837f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663249a0c428f8f868181106120d4576120d4614da0565b60405160e085901b6001600160e01b031916815292013560f81c600483015250602401602060405180830381865afa158015612114573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612138919061514f565b6121429190615168565b10156121d95760405162461bcd60e51b8152602060048201526066602482015260008051602061559983398151915260448201527f7265733a205374616b6552656769737472792075706461746573206d7573742060648201527f62652077697468696e207769746864726177616c44656c6179426c6f636b732060848201526577696e646f7760d01b60a482015260c40161068c565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166368bccaac8d8d8481811061221a5761221a614da0565b9050013560f81c60f81b60f81c8c8c60a00151858151811061223e5761223e614da0565b60209081029190910101516040516001600160e01b031960e086901b16815260ff909316600484015263ffffffff9182166024840152166044820152606401602060405180830381865afa15801561229a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122be9190615180565b6001600160401b0319166122e18a60400151838151811061186f5761186f614da0565b67ffffffffffffffff19161461237d5760405162461bcd60e51b8152602060048201526061602482015260008051602061559983398151915260448201527f7265733a2071756f72756d41706b206861736820696e2073746f72616765206460648201527f6f6573206e6f74206d617463682070726f76696465642071756f72756d2061706084820152606b60f81b60a482015260c40161068c565b6123ad8960400151828151811061239657612396614da0565b60200260200101518761339790919063ffffffff16565b95507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663c8294c568d8d848181106123f0576123f0614da0565b9050013560f81c60f81b60f81c8c8c60c00151858151811061241457612414614da0565b60209081029190910101516040516001600160e01b031960e086901b16815260ff909316600484015263ffffffff9182166024840152166044820152606401602060405180830381865afa158015612470573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124949190614ec8565b856020015182815181106124aa576124aa614da0565b6001600160601b039092166020928302919091018201528501518051829081106124d6576124d6614da0565b6020026020010151856000015182815181106124f4576124f4614da0565b60200260200101906001600160601b031690816001600160601b0316815250506000805b8a60200151518110156126e25761256c8660000151828151811061253e5761253e614da0565b60200260200101518f8f8681811061255857612558614da0565b600192013560f81c9290921c811614919050565b156126d0577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663f2be94ae8f8f868181106125b2576125b2614da0565b9050013560f81c60f81b60f81c8e896020015185815181106125d6576125d6614da0565b60200260200101518f60e0015188815181106125f4576125f4614da0565b6020026020010151878151811061260d5761260d614da0565b60209081029190910101516040516001600160e01b031960e087901b16815260ff909416600485015263ffffffff92831660248501526044840191909152166064820152608401602060405180830381865afa158015612671573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126959190614ec8565b87518051859081106126a9576126a9614da0565b602002602001018181516126bd91906151ab565b6001600160601b03169052506001909101905b806126da81614e1d565b915050612518565b505080806126ef90614e1d565b91505061207d565b5050506000806127118c868a606001518b608001516107e0565b91509150816127825760405162461bcd60e51b8152602060048201526043602482015260008051602061559983398151915260448201527f7265733a2070616972696e6720707265636f6d70696c652063616c6c206661696064820152621b195960ea1b608482015260a40161068c565b806127e35760405162461bcd60e51b8152602060048201526039602482015260008051602061559983398151915260448201527f7265733a207369676e617475726520697320696e76616c696400000000000000606482015260840161068c565b505060008782602001516040516020016127fe9291906150d3565b60408051808303601f190181529190528051602090910120929b929a509198505050505050505050565b612830613a2f565b61283a6000613a89565b565b604080516001808252818301909252600091606091839160208083019080368337019050509050848160008151811061287757612877614da0565b60209081029190910101526040516361c8a12f60e11b81526000906001600160a01b0388169063c391425e906128b390889086906004016151d3565b600060405180830381865afa1580156128d0573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526128f89190810190614f3b565b60008151811061290a5761290a614da0565b60209081029190910101516040516304ec635160e01b81526004810188905263ffffffff87811660248301529091166044820181905291506000906001600160a01b038916906304ec635190606401602060405180830381865afa158015612976573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061299a919061501b565b6001600160c01b0316905060006129b082613adb565b9050816129be8a838a610a37565b9550955050505050935093915050565b6098546001600160a01b03163314612a285760405162461bcd60e51b815260206004820152601d60248201527f41676772656761746f72206d757374206265207468652063616c6c6572000000604482015260640161068c565b6000612a376020850185614747565b9050366000612a496080870187615227565b90925090506000612a606080880160608901614747565b905060996000612a736020890189614747565b63ffffffff1663ffffffff16815260200190815260200160002054612a9788613b38565b14612ad65760405162461bcd60e51b815260206004820152600f60248201526e0aee4dedcce40e8c2e6d640d0c2e6d608b1b604482015260640161068c565b6000609a81612ae860208a018a614747565b63ffffffff1663ffffffff1681526020019081526020016000205414612b495760405162461bcd60e51b815260206004820152601660248201527515185cdac8185b1c9958591e481c995cdc1bdb99195960521b604482015260640161068c565b612b737f0000000000000000000000000000000000000000000000000000000000000000856150ab565b63ffffffff164363ffffffff161115612bc75760405162461bcd60e51b815260206004820152601660248201527514995cdc1bdb9cd9481d1a5b5948195e18d95959195960521b604482015260640161068c565b6000612bd287613b68565b9050600080612be58387878a8c8961096a565b9150915081612c275760405162461bcd60e51b815260206004820152600e60248201526d145d5bdc9d5b481b9bdd081b595d60921b604482015260640161068c565b6040805180820190915263ffffffff4316815260208101829052612c5a81612c54368d90038d018d61526d565b90613b7b565b609a6000612c6b60208e018e614747565b63ffffffff1663ffffffff168152602001908152602001600020819055507f8016fcc5ad5dcf12fff2e128d239d9c6eb61f4041126bbac2c93fa8962627c1b8a82604051612cba9291906152f6565b60405180910390a15050505050505050505050565b6097546501000000000090046001600160a01b03163314612d3c5760405162461bcd60e51b815260206004820152602160248201527f5461736b2067656e657261746f72206d757374206265207468652063616c6c656044820152603960f91b606482015260840161068c565b606463ffffffff84161115612da55760405162461bcd60e51b815260206004820152602960248201527f51756f72756d207468726573686f6c642067726561746572207468616e2064656044820152683737b6b4b730ba37b960b91b606482015260840161068c565b60006040518060a001604052804363ffffffff168152602001876001600160401b03168152602001866001600160401b031681526020018563ffffffff16815260200184848080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050509152509050612e2b81613b90565b6097805463ffffffff610100918290048116600090815260996020526040908190209490945591549251920416907f78aec7310ea6fd468e3d3bbd16a806fd4987515634d5b5bf4cf4f036d9c3322590612e8690849061534c565b60405180910390a2609754612ea790610100900463ffffffff1660016150ab565b609760016101000a81548163ffffffff021916908363ffffffff160217905550505050505050565b612ed7613a2f565b6001600160a01b038116612f3c5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161068c565b61069e81613a89565b600054610100900460ff1615808015612f655750600054600160ff909116105b80612f7f5750303b158015612f7f575060005460ff166001145b612fe25760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b606482015260840161068c565b6000805460ff191660011790558015613005576000805461ff0019166101001790555b613010856000613ba3565b61301984613a89565b609880546001600160a01b0319166001600160a01b03858116919091179091556097805465010000000000600160c81b031916650100000000009285169290920291909117905580156130a6576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050505050565b606560009054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015613100573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906131249190614cd4565b6001600160a01b0316336001600160a01b0316146131545760405162461bcd60e51b815260040161068c90614cf1565b6066541981196066541916146131d25760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e756e70617573653a20696e76616c696420617474656d7060448201527f7420746f2070617573652066756e6374696f6e616c6974790000000000000000606482015260840161068c565b606681905560405181815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c906020016107d5565b6001600160a01b0381166132975760405162461bcd60e51b815260206004820152604960248201527f5061757361626c652e5f73657450617573657252656769737472793a206e657760448201527f50617573657252656769737472792063616e6e6f7420626520746865207a65726064820152686f206164647265737360b81b608482015260a40161068c565b606554604080516001600160a01b03928316815291831660208301527f6e9fcd539896fca60e8b0f01dd580233e48a6b0f7df013b89ba7f565869acdb6910160405180910390a1606580546001600160a01b0319166001600160a01b0392909216919091179055565b604080518082019091526000808252602082015261331c613f44565b835181526020808501519082015260408082018490526000908360608460076107d05a03fa905080801561334f57613351565bfe5b508061338f5760405162461bcd60e51b815260206004820152600d60248201526c1958cb5b5d5b0b59985a5b1959609a1b604482015260640161068c565b505092915050565b60408051808201909152600080825260208201526133b3613f62565b835181526020808501518183015283516040808401919091529084015160608301526000908360808460066107d05a03fa905080801561334f57508061338f5760405162461bcd60e51b815260206004820152600d60248201526c1958cb5859190b59985a5b1959609a1b604482015260640161068c565b613433613f80565b50604080516080810182527f198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c28183019081527f1800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed6060830152815281518083019092527f275dc4a288d1afb3cbb1ac09187524c7db36395df7be3b99e673b13a075a65ec82527f1d9befcd05a5323e6da4d435f3b617cdb3af83285c2df711ef39c01571827f9d60208381019190915281019190915290565b60408051808201909152600080825260208201526000808061351b60008051602061557983398151915286614db6565b90505b61352781613c8d565b9093509150600080516020615579833981519152828309831415613561576040805180820190915290815260208101919091529392505050565b60008051602061557983398151915260018208905061351e565b6040805180820182528681526020808201869052825180840190935286835282018490526000918291906135ad613fa5565b60005b60028110156137725760006135c68260066153c9565b90508482600281106135da576135da614da0565b602002015151836135ec836000615168565b600c81106135fc576135fc614da0565b602002015284826002811061361357613613614da0565b6020020151602001518382600161362a9190615168565b600c811061363a5761363a614da0565b602002015283826002811061365157613651614da0565b6020020151515183613664836002615168565b600c811061367457613674614da0565b602002015283826002811061368b5761368b614da0565b60200201515160016020020151836136a4836003615168565b600c81106136b4576136b4614da0565b60200201528382600281106136cb576136cb614da0565b6020020151602001516000600281106136e6576136e6614da0565b6020020151836136f7836004615168565b600c811061370757613707614da0565b602002015283826002811061371e5761371e614da0565b60200201516020015160016002811061373957613739614da0565b60200201518361374a836005615168565b600c811061375a5761375a614da0565b6020020152508061376a81614e1d565b9150506135b0565b5061377b613fc4565b60006020826101808560088cfa9151919c9115159b50909950505050505050505050565b600082826040516020016137b49291906153e8565b6040516020818303038152906040528051906020012090505b92915050565b6000806137df84613d0f565b90508015610dab578260ff1684600186516137fa9190615138565b8151811061380a5761380a614da0565b016020015160f81c10610dab5760405162461bcd60e51b815260206004820152603f60248201527f4269746d61705574696c732e6f72646572656442797465734172726179546f4260448201527f69746d61703a206269746d61702065786365656473206d61782076616c756500606482015260840161068c565b6000805b82156137cd5761389a600184615138565b90921691806138a88161541e565b915050613889565b60408051808201909152600080825260208201526102008261ffff161061390c5760405162461bcd60e51b815260206004820152601060248201526f7363616c61722d746f6f2d6c6172676560801b604482015260640161068c565b8161ffff16600114156139205750816137cd565b6040805180820190915260008082526020820181905284906001905b8161ffff168661ffff161061398957600161ffff871660ff83161c8116141561396c576139698484613397565b93505b6139768384613397565b92506201fffe600192831b16910161393c565b509195945050505050565b604080518082019091526000808252602082015281511580156139b957506020820151155b156139d7575050604080518082019091526000808252602082015290565b6040518060400160405280836000015181526020016000805160206155798339815191528460200151613a0a9190614db6565b613a2290600080516020615579833981519152615138565b905292915050565b919050565b6033546001600160a01b0316331461283a5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161068c565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60606000805b610100811015613b31576001811b915083821615613b2157828160f81b604051602001613b0f929190615440565b60405160208183030381529060405292505b613b2a81614e1d565b9050613ae1565b5050919050565b600081604051602001613b4b919061546f565b604051602081830303815290604052805190602001209050919050565b600081604051602001613b4b919061552b565b600082826040516020016137b4929190615539565b600081604051602001613b4b919061534c565b6065546001600160a01b0316158015613bc457506001600160a01b03821615155b613c465760405162461bcd60e51b815260206004820152604760248201527f5061757361626c652e5f696e697469616c697a655061757365723a205f696e6960448201527f7469616c697a6550617573657228292063616e206f6e6c792062652063616c6c6064820152666564206f6e636560c81b608482015260a40161068c565b606681905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a2613c8982613209565b5050565b60008080600080516020615579833981519152600360008051602061557983398151915286600080516020615579833981519152888909090890506000613d03827f0c19139cb84c680a6e14116da060561765e05aa45a1c72a34f082305b61f3f52600080516020615579833981519152613e9c565b91959194509092505050565b600061010082511115613d985760405162461bcd60e51b8152602060048201526044602482018190527f4269746d61705574696c732e6f72646572656442797465734172726179546f42908201527f69746d61703a206f7264657265644279746573417272617920697320746f6f206064820152636c6f6e6760e01b608482015260a40161068c565b8151613da657506000919050565b60008083600081518110613dbc57613dbc614da0565b0160200151600160f89190911c81901b92505b8451811015613e9357848181518110613dea57613dea614da0565b0160200151600160f89190911c1b9150828211613e7f5760405162461bcd60e51b815260206004820152604760248201527f4269746d61705574696c732e6f72646572656442797465734172726179546f4260448201527f69746d61703a206f72646572656442797465734172726179206973206e6f74206064820152661bdc99195c995960ca1b608482015260a40161068c565b91811791613e8c81614e1d565b9050613dcf565b50909392505050565b600080613ea7613fc4565b613eaf613fe2565b602080825281810181905260408201819052606082018890526080820187905260a082018690528260c08360056107d05a03fa925082801561334f575082613f395760405162461bcd60e51b815260206004820152601a60248201527f424e3235342e6578704d6f643a2063616c6c206661696c757265000000000000604482015260640161068c565b505195945050505050565b60405180606001604052806003906020820280368337509192915050565b60405180608001604052806004906020820280368337509192915050565b6040518060400160405280613f93614000565b8152602001613fa0614000565b905290565b604051806101800160405280600c906020820280368337509192915050565b60405180602001604052806001906020820280368337509192915050565b6040518060c001604052806006906020820280368337509192915050565b60405180604001604052806002906020820280368337509192915050565b6001600160a01b038116811461069e57600080fd5b60006020828403121561404557600080fd5b8135610dab8161401e565b60006020828403121561406257600080fd5b5035919050565b634e487b7160e01b600052604160045260246000fd5b604080519081016001600160401b03811182821017156140a1576140a1614069565b60405290565b60405161010081016001600160401b03811182821017156140a1576140a1614069565b604051601f8201601f191681016001600160401b03811182821017156140f2576140f2614069565b604052919050565b60006040828403121561410c57600080fd5b61411461407f565b9050813581526020820135602082015292915050565b600082601f83011261413b57600080fd5b604051604081018181106001600160401b038211171561415d5761415d614069565b806040525080604084018581111561417457600080fd5b845b81811015613989578035835260209283019201614176565b6000608082840312156141a057600080fd5b6141a861407f565b90506141b4838361412a565b81526141c3836040840161412a565b602082015292915050565b60008060008061012085870312156141e557600080fd5b843593506141f686602087016140fa565b9250614205866060870161418e565b91506142148660e087016140fa565b905092959194509250565b60008083601f84011261423157600080fd5b5081356001600160401b0381111561424857600080fd5b60208301915083602082850101111561426057600080fd5b9250929050565b63ffffffff8116811461069e57600080fd5b8035613a2a81614267565b60006001600160401b0382111561429d5761429d614069565b5060051b60200190565b600082601f8301126142b857600080fd5b813560206142cd6142c883614284565b6140ca565b82815260059290921b840181019181810190868411156142ec57600080fd5b8286015b8481101561431057803561430381614267565b83529183019183016142f0565b509695505050505050565b600082601f83011261432c57600080fd5b8135602061433c6142c883614284565b82815260069290921b8401810191818101908684111561435b57600080fd5b8286015b848110156143105761437188826140fa565b83529183019160400161435f565b600082601f83011261439057600080fd5b813560206143a06142c883614284565b82815260059290921b840181019181810190868411156143bf57600080fd5b8286015b848110156143105780356001600160401b038111156143e25760008081fd5b6143f08986838b01016142a7565b8452509183019183016143c3565b6000610180828403121561441157600080fd5b6144196140a7565b905081356001600160401b038082111561443257600080fd5b61443e858386016142a7565b8352602084013591508082111561445457600080fd5b6144608583860161431b565b6020840152604084013591508082111561447957600080fd5b6144858583860161431b565b6040840152614497856060860161418e565b60608401526144a98560e086016140fa565b60808401526101208401359150808211156144c357600080fd5b6144cf858386016142a7565b60a08401526101408401359150808211156144e957600080fd5b6144f5858386016142a7565b60c084015261016084013591508082111561450f57600080fd5b5061451c8482850161437f565b60e08301525092915050565b60008060008060008060a0878903121561454157600080fd5b8635955060208701356001600160401b038082111561455f57600080fd5b61456b8a838b0161421f565b90975095506040890135915061458082614267565b9093506060880135908082111561459657600080fd5b506145a389828a016143fe565b92505060808701356145b481614267565b809150509295509295509295565b6000806000606084860312156145d757600080fd5b83356145e28161401e565b92506020848101356001600160401b03808211156145ff57600080fd5b818701915087601f83011261461357600080fd5b81358181111561462557614625614069565b614637601f8201601f191685016140ca565b9150808252888482850101111561464d57600080fd5b808484018584013760008482840101525080945050505061467060408501614279565b90509250925092565b600081518084526020808501808196508360051b810191508286016000805b868110156146fb578385038a52825180518087529087019087870190845b818110156146e6578351805184528a01516001600160601b03168a840152928901926040909201916001016146b6565b50509a87019a95505091850191600101614698565b509298975050505050505050565b602081526000610dab6020830184614679565b801515811461069e57600080fd5b60006020828403121561473c57600080fd5b8135610dab8161471c565b60006020828403121561475957600080fd5b8135610dab81614267565b6000806000806000806080878903121561477d57600080fd5b86356147888161401e565b9550602087013561479881614267565b945060408701356001600160401b03808211156147b457600080fd5b6147c08a838b0161421f565b909650945060608901359150808211156147d957600080fd5b818901915089601f8301126147ed57600080fd5b8135818111156147fc57600080fd5b8a60208260051b850101111561481157600080fd5b6020830194508093505050509295509295509295565b600081518084526020808501945080840160005b8381101561485d57815163ffffffff168752958201959082019060010161483b565b509495945050505050565b60006020808352835160808285015261488460a0850182614827565b905081850151601f19808684030160408701526148a18383614827565b925060408701519150808684030160608701526148be8383614827565b60608801518782038301608089015280518083529194508501925084840190600581901b8501860160005b828110156149155784878303018452614903828751614827565b958801959388019391506001016148e9565b509998505050505050505050565b60ff8116811461069e57600080fd5b60006020828403121561494457600080fd5b8135610dab81614923565b600060a0828403121561496157600080fd5b50919050565b60006060828403121561496157600080fd5b60008060008084860360e081121561499057600080fd5b85356001600160401b03808211156149a757600080fd5b6149b389838a0161494f565b96506149c28960208a01614967565b95506040607f19840112156149d657600080fd5b60808801945060c08801359250808311156149f057600080fd5b50506149fe8782880161431b565b91505092959194509250565b600080600080600060808688031215614a2257600080fd5b8535945060208601356001600160401b0380821115614a4057600080fd5b614a4c89838a0161421f565b909650945060408801359150614a6182614267565b90925060608701359080821115614a7757600080fd5b50614a84888289016143fe565b9150509295509295909350565b600081518084526020808501945080840160005b8381101561485d5781516001600160601b031687529582019590820190600101614aa5565b6040815260008351604080840152614ae56080840182614a91565b90506020850151603f19848303016060850152614b028282614a91565b925050508260208301529392505050565b600080600060608486031215614b2857600080fd5b8335614b338161401e565b9250602084013591506040840135614b4a81614267565b809150509250925092565b828152604060208201526000614b6e6040830184614679565b949350505050565b600080600060a08486031215614b8b57600080fd5b83356001600160401b0380821115614ba257600080fd5b614bae8783880161494f565b9450614bbd8760208801614967565b93506080860135915080821115614bd357600080fd5b50614be0868287016143fe565b9150509250925092565b80356001600160401b0381168114613a2a57600080fd5b600080600080600060808688031215614c1957600080fd5b614c2286614bea565b9450614c3060208701614bea565b93506040860135614c4081614267565b925060608601356001600160401b03811115614c5b57600080fd5b614c678882890161421f565b969995985093965092949392505050565b60008060008060808587031215614c8e57600080fd5b8435614c998161401e565b93506020850135614ca98161401e565b92506040850135614cb98161401e565b91506060850135614cc98161401e565b939692955090935050565b600060208284031215614ce657600080fd5b8151610dab8161401e565b6020808252602a908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526939903ab73830bab9b2b960b11b606082015260800190565b600060208284031215614d4d57600080fd5b8151610dab8161471c565b60208082526028908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526739903830bab9b2b960c11b606082015260800190565b634e487b7160e01b600052603260045260246000fd5b600082614dd357634e487b7160e01b600052601260045260246000fd5b500690565b634e487b7160e01b600052601160045260246000fd5b60006001600160601b0380831681851681830481118215151615614e1457614e14614dd8565b02949350505050565b6000600019821415614e3157614e31614dd8565b5060010190565b60006020808385031215614e4b57600080fd5b82516001600160401b03811115614e6157600080fd5b8301601f81018513614e7257600080fd5b8051614e806142c882614284565b81815260059190911b82018301908381019087831115614e9f57600080fd5b928401925b82841015614ebd57835182529284019290840190614ea4565b979650505050505050565b600060208284031215614eda57600080fd5b81516001600160601b0381168114610dab57600080fd5b63ffffffff84168152604060208201819052810182905260006001600160fb1b03831115614f1e57600080fd5b8260051b8085606085013760009201606001918252509392505050565b60006020808385031215614f4e57600080fd5b82516001600160401b03811115614f6457600080fd5b8301601f81018513614f7557600080fd5b8051614f836142c882614284565b81815260059190911b82018301908381019087831115614fa257600080fd5b928401925b82841015614ebd578351614fba81614267565b82529284019290840190614fa7565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b63ffffffff84168152604060208201526000615012604083018486614fc9565b95945050505050565b60006020828403121561502d57600080fd5b81516001600160c01b0381168114610dab57600080fd5b60006020828403121561505657600080fd5b8151610dab81614267565b600060ff821660ff81141561507857615078614dd8565b60010192915050565b604081526000615095604083018587614fc9565b905063ffffffff83166020830152949350505050565b600063ffffffff8083168185168083038211156150ca576150ca614dd8565b01949350505050565b63ffffffff60e01b8360e01b1681526000600482018351602080860160005b8381101561510e578151855293820193908201906001016150f2565b5092979650505050505050565b60006020828403121561512d57600080fd5b8151610dab81614923565b60008282101561514a5761514a614dd8565b500390565b60006020828403121561516157600080fd5b5051919050565b6000821982111561517b5761517b614dd8565b500190565b60006020828403121561519257600080fd5b815167ffffffffffffffff1981168114610dab57600080fd5b60006001600160601b03838116908316818110156151cb576151cb614dd8565b039392505050565b60006040820163ffffffff851683526020604081850152818551808452606086019150828701935060005b8181101561521a578451835293830193918301916001016151fe565b5090979650505050505050565b6000808335601e1984360301811261523e57600080fd5b8301803591506001600160401b0382111561525857600080fd5b60200191503681900382131561426057600080fd5b60006060828403121561527f57600080fd5b604051606081018181106001600160401b03821117156152a1576152a1614069565b60405282356152af81614267565b8152602083810135908201526040928301359281019290925250919050565b80356152d981614267565b63ffffffff16825260208181013590830152604090810135910152565b60a0810161530482856152ce565b825163ffffffff16606083015260208301516080830152610dab565b60005b8381101561533b578181015183820152602001615323565b838111156119965750506000910152565b60208152600063ffffffff80845116602084015260208401516001600160401b038082166040860152806040870151166060860152505080606085015116608084015250608083015160a08084015280518060c08501526153b48160e0860160208501615320565b601f01601f19169290920160e0019392505050565b60008160001904831182151516156153e3576153e3614dd8565b500290565b60a081016153f682856152ce565b823561540181614267565b63ffffffff16606083015260209290920135608090910152919050565b600061ffff8083168181141561543657615436614dd8565b6001019392505050565b60008351615452818460208801615320565b6001600160f81b0319939093169190920190815260010192915050565b602081526000823561548081614267565b63ffffffff808216602085015261549960208601614bea565b91506001600160401b038083166040860152806154b860408801614bea565b166060860152606086013592506154ce83614267565b818316608086015260808601359250601e198636030183126154ef57600080fd5b91850191823591508082111561550457600080fd5b5080360385131561551457600080fd5b60a08085015261501260c085018260208501614fc9565b606081016137cd82846152ce565b825163ffffffff168152602080840151908201526040808401519082015260a08101610dab6060830184805163ffffffff16825260209081015191015256fe30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47424c535369676e6174757265436865636b65722e636865636b5369676e617475a2646970667358221220abc3f22429620c78bd73d566c650cbdd4b4a41ca198a4aa584d7614deee11f2564736f6c634300080c0033", +} + +// ContractSFFLTaskManagerABI is the input ABI used to generate the binding from. +// Deprecated: Use ContractSFFLTaskManagerMetaData.ABI instead. +var ContractSFFLTaskManagerABI = ContractSFFLTaskManagerMetaData.ABI + +// ContractSFFLTaskManagerBin is the compiled bytecode used for deploying new contracts. +// Deprecated: Use ContractSFFLTaskManagerMetaData.Bin instead. +var ContractSFFLTaskManagerBin = ContractSFFLTaskManagerMetaData.Bin + +// DeployContractSFFLTaskManager deploys a new Ethereum contract, binding an instance of ContractSFFLTaskManager to it. +func DeployContractSFFLTaskManager(auth *bind.TransactOpts, backend bind.ContractBackend, registryCoordinator common.Address, taskResponseWindowBlock uint32) (common.Address, *types.Transaction, *ContractSFFLTaskManager, error) { + parsed, err := ContractSFFLTaskManagerMetaData.GetAbi() + if err != nil { + return common.Address{}, nil, nil, err + } + if parsed == nil { + return common.Address{}, nil, nil, errors.New("GetABI returned nil") + } + + address, tx, contract, err := bind.DeployContract(auth, *parsed, common.FromHex(ContractSFFLTaskManagerBin), backend, registryCoordinator, taskResponseWindowBlock) + if err != nil { + return common.Address{}, nil, nil, err + } + return address, tx, &ContractSFFLTaskManager{ContractSFFLTaskManagerCaller: ContractSFFLTaskManagerCaller{contract: contract}, ContractSFFLTaskManagerTransactor: ContractSFFLTaskManagerTransactor{contract: contract}, ContractSFFLTaskManagerFilterer: ContractSFFLTaskManagerFilterer{contract: contract}}, nil +} + +// ContractSFFLTaskManager is an auto generated Go binding around an Ethereum contract. +type ContractSFFLTaskManager struct { + ContractSFFLTaskManagerCaller // Read-only binding to the contract + ContractSFFLTaskManagerTransactor // Write-only binding to the contract + ContractSFFLTaskManagerFilterer // Log filterer for contract events +} + +// ContractSFFLTaskManagerCaller is an auto generated read-only Go binding around an Ethereum contract. +type ContractSFFLTaskManagerCaller struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// ContractSFFLTaskManagerTransactor is an auto generated write-only Go binding around an Ethereum contract. +type ContractSFFLTaskManagerTransactor struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// ContractSFFLTaskManagerFilterer is an auto generated log filtering Go binding around an Ethereum contract events. +type ContractSFFLTaskManagerFilterer struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// ContractSFFLTaskManagerSession is an auto generated Go binding around an Ethereum contract, +// with pre-set call and transact options. +type ContractSFFLTaskManagerSession struct { + Contract *ContractSFFLTaskManager // Generic contract binding to set the session for + CallOpts bind.CallOpts // Call options to use throughout this session + TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session +} + +// ContractSFFLTaskManagerCallerSession is an auto generated read-only Go binding around an Ethereum contract, +// with pre-set call options. +type ContractSFFLTaskManagerCallerSession struct { + Contract *ContractSFFLTaskManagerCaller // Generic contract caller binding to set the session for + CallOpts bind.CallOpts // Call options to use throughout this session +} + +// ContractSFFLTaskManagerTransactorSession is an auto generated write-only Go binding around an Ethereum contract, +// with pre-set transact options. +type ContractSFFLTaskManagerTransactorSession struct { + Contract *ContractSFFLTaskManagerTransactor // Generic contract transactor binding to set the session for + TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session +} + +// ContractSFFLTaskManagerRaw is an auto generated low-level Go binding around an Ethereum contract. +type ContractSFFLTaskManagerRaw struct { + Contract *ContractSFFLTaskManager // Generic contract binding to access the raw methods on +} + +// ContractSFFLTaskManagerCallerRaw is an auto generated low-level read-only Go binding around an Ethereum contract. +type ContractSFFLTaskManagerCallerRaw struct { + Contract *ContractSFFLTaskManagerCaller // Generic read-only contract binding to access the raw methods on +} + +// ContractSFFLTaskManagerTransactorRaw is an auto generated low-level write-only Go binding around an Ethereum contract. +type ContractSFFLTaskManagerTransactorRaw struct { + Contract *ContractSFFLTaskManagerTransactor // Generic write-only contract binding to access the raw methods on +} + +// NewContractSFFLTaskManager creates a new instance of ContractSFFLTaskManager, bound to a specific deployed contract. +func NewContractSFFLTaskManager(address common.Address, backend bind.ContractBackend) (*ContractSFFLTaskManager, error) { + contract, err := bindContractSFFLTaskManager(address, backend, backend, backend) + if err != nil { + return nil, err + } + return &ContractSFFLTaskManager{ContractSFFLTaskManagerCaller: ContractSFFLTaskManagerCaller{contract: contract}, ContractSFFLTaskManagerTransactor: ContractSFFLTaskManagerTransactor{contract: contract}, ContractSFFLTaskManagerFilterer: ContractSFFLTaskManagerFilterer{contract: contract}}, nil +} + +// NewContractSFFLTaskManagerCaller creates a new read-only instance of ContractSFFLTaskManager, bound to a specific deployed contract. +func NewContractSFFLTaskManagerCaller(address common.Address, caller bind.ContractCaller) (*ContractSFFLTaskManagerCaller, error) { + contract, err := bindContractSFFLTaskManager(address, caller, nil, nil) + if err != nil { + return nil, err + } + return &ContractSFFLTaskManagerCaller{contract: contract}, nil +} + +// NewContractSFFLTaskManagerTransactor creates a new write-only instance of ContractSFFLTaskManager, bound to a specific deployed contract. +func NewContractSFFLTaskManagerTransactor(address common.Address, transactor bind.ContractTransactor) (*ContractSFFLTaskManagerTransactor, error) { + contract, err := bindContractSFFLTaskManager(address, nil, transactor, nil) + if err != nil { + return nil, err + } + return &ContractSFFLTaskManagerTransactor{contract: contract}, nil +} + +// NewContractSFFLTaskManagerFilterer creates a new log filterer instance of ContractSFFLTaskManager, bound to a specific deployed contract. +func NewContractSFFLTaskManagerFilterer(address common.Address, filterer bind.ContractFilterer) (*ContractSFFLTaskManagerFilterer, error) { + contract, err := bindContractSFFLTaskManager(address, nil, nil, filterer) + if err != nil { + return nil, err + } + return &ContractSFFLTaskManagerFilterer{contract: contract}, nil +} + +// bindContractSFFLTaskManager binds a generic wrapper to an already deployed contract. +func bindContractSFFLTaskManager(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error) { + parsed, err := ContractSFFLTaskManagerMetaData.GetAbi() + if err != nil { + return nil, err + } + return bind.NewBoundContract(address, *parsed, caller, transactor, filterer), nil +} + +// Call invokes the (constant) contract method with params as input values and +// sets the output to result. The result type might be a single field for simple +// returns, a slice of interfaces for anonymous returns and a struct for named +// returns. +func (_ContractSFFLTaskManager *ContractSFFLTaskManagerRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { + return _ContractSFFLTaskManager.Contract.ContractSFFLTaskManagerCaller.contract.Call(opts, result, method, params...) +} + +// Transfer initiates a plain transaction to move funds to the contract, calling +// its default method if one is available. +func (_ContractSFFLTaskManager *ContractSFFLTaskManagerRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { + return _ContractSFFLTaskManager.Contract.ContractSFFLTaskManagerTransactor.contract.Transfer(opts) +} + +// Transact invokes the (paid) contract method with params as input values. +func (_ContractSFFLTaskManager *ContractSFFLTaskManagerRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { + return _ContractSFFLTaskManager.Contract.ContractSFFLTaskManagerTransactor.contract.Transact(opts, method, params...) +} + +// Call invokes the (constant) contract method with params as input values and +// sets the output to result. The result type might be a single field for simple +// returns, a slice of interfaces for anonymous returns and a struct for named +// returns. +func (_ContractSFFLTaskManager *ContractSFFLTaskManagerCallerRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { + return _ContractSFFLTaskManager.Contract.contract.Call(opts, result, method, params...) +} + +// Transfer initiates a plain transaction to move funds to the contract, calling +// its default method if one is available. +func (_ContractSFFLTaskManager *ContractSFFLTaskManagerTransactorRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { + return _ContractSFFLTaskManager.Contract.contract.Transfer(opts) +} + +// Transact invokes the (paid) contract method with params as input values. +func (_ContractSFFLTaskManager *ContractSFFLTaskManagerTransactorRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { + return _ContractSFFLTaskManager.Contract.contract.Transact(opts, method, params...) +} + +// TASKCHALLENGEWINDOWBLOCK is a free data retrieval call binding the contract method 0xf63c5bab. +// +// Solidity: function TASK_CHALLENGE_WINDOW_BLOCK() view returns(uint32) +func (_ContractSFFLTaskManager *ContractSFFLTaskManagerCaller) TASKCHALLENGEWINDOWBLOCK(opts *bind.CallOpts) (uint32, error) { + var out []interface{} + err := _ContractSFFLTaskManager.contract.Call(opts, &out, "TASK_CHALLENGE_WINDOW_BLOCK") + + if err != nil { + return *new(uint32), err + } + + out0 := *abi.ConvertType(out[0], new(uint32)).(*uint32) + + return out0, err + +} + +// TASKCHALLENGEWINDOWBLOCK is a free data retrieval call binding the contract method 0xf63c5bab. +// +// Solidity: function TASK_CHALLENGE_WINDOW_BLOCK() view returns(uint32) +func (_ContractSFFLTaskManager *ContractSFFLTaskManagerSession) TASKCHALLENGEWINDOWBLOCK() (uint32, error) { + return _ContractSFFLTaskManager.Contract.TASKCHALLENGEWINDOWBLOCK(&_ContractSFFLTaskManager.CallOpts) +} + +// TASKCHALLENGEWINDOWBLOCK is a free data retrieval call binding the contract method 0xf63c5bab. +// +// Solidity: function TASK_CHALLENGE_WINDOW_BLOCK() view returns(uint32) +func (_ContractSFFLTaskManager *ContractSFFLTaskManagerCallerSession) TASKCHALLENGEWINDOWBLOCK() (uint32, error) { + return _ContractSFFLTaskManager.Contract.TASKCHALLENGEWINDOWBLOCK(&_ContractSFFLTaskManager.CallOpts) +} + +// TASKRESPONSEWINDOWBLOCK is a free data retrieval call binding the contract method 0x1ad43189. +// +// Solidity: function TASK_RESPONSE_WINDOW_BLOCK() view returns(uint32) +func (_ContractSFFLTaskManager *ContractSFFLTaskManagerCaller) TASKRESPONSEWINDOWBLOCK(opts *bind.CallOpts) (uint32, error) { + var out []interface{} + err := _ContractSFFLTaskManager.contract.Call(opts, &out, "TASK_RESPONSE_WINDOW_BLOCK") + + if err != nil { + return *new(uint32), err + } + + out0 := *abi.ConvertType(out[0], new(uint32)).(*uint32) + + return out0, err + +} + +// TASKRESPONSEWINDOWBLOCK is a free data retrieval call binding the contract method 0x1ad43189. +// +// Solidity: function TASK_RESPONSE_WINDOW_BLOCK() view returns(uint32) +func (_ContractSFFLTaskManager *ContractSFFLTaskManagerSession) TASKRESPONSEWINDOWBLOCK() (uint32, error) { + return _ContractSFFLTaskManager.Contract.TASKRESPONSEWINDOWBLOCK(&_ContractSFFLTaskManager.CallOpts) +} + +// TASKRESPONSEWINDOWBLOCK is a free data retrieval call binding the contract method 0x1ad43189. +// +// Solidity: function TASK_RESPONSE_WINDOW_BLOCK() view returns(uint32) +func (_ContractSFFLTaskManager *ContractSFFLTaskManagerCallerSession) TASKRESPONSEWINDOWBLOCK() (uint32, error) { + return _ContractSFFLTaskManager.Contract.TASKRESPONSEWINDOWBLOCK(&_ContractSFFLTaskManager.CallOpts) +} + +// THRESHOLDDENOMINATOR is a free data retrieval call binding the contract method 0xef024458. +// +// Solidity: function THRESHOLD_DENOMINATOR() view returns(uint32) +func (_ContractSFFLTaskManager *ContractSFFLTaskManagerCaller) THRESHOLDDENOMINATOR(opts *bind.CallOpts) (uint32, error) { + var out []interface{} + err := _ContractSFFLTaskManager.contract.Call(opts, &out, "THRESHOLD_DENOMINATOR") + + if err != nil { + return *new(uint32), err + } + + out0 := *abi.ConvertType(out[0], new(uint32)).(*uint32) + + return out0, err + +} + +// THRESHOLDDENOMINATOR is a free data retrieval call binding the contract method 0xef024458. +// +// Solidity: function THRESHOLD_DENOMINATOR() view returns(uint32) +func (_ContractSFFLTaskManager *ContractSFFLTaskManagerSession) THRESHOLDDENOMINATOR() (uint32, error) { + return _ContractSFFLTaskManager.Contract.THRESHOLDDENOMINATOR(&_ContractSFFLTaskManager.CallOpts) +} + +// THRESHOLDDENOMINATOR is a free data retrieval call binding the contract method 0xef024458. +// +// Solidity: function THRESHOLD_DENOMINATOR() view returns(uint32) +func (_ContractSFFLTaskManager *ContractSFFLTaskManagerCallerSession) THRESHOLDDENOMINATOR() (uint32, error) { + return _ContractSFFLTaskManager.Contract.THRESHOLDDENOMINATOR(&_ContractSFFLTaskManager.CallOpts) +} + +// Aggregator is a free data retrieval call binding the contract method 0x245a7bfc. +// +// Solidity: function aggregator() view returns(address) +func (_ContractSFFLTaskManager *ContractSFFLTaskManagerCaller) Aggregator(opts *bind.CallOpts) (common.Address, error) { + var out []interface{} + err := _ContractSFFLTaskManager.contract.Call(opts, &out, "aggregator") + + if err != nil { + return *new(common.Address), err + } + + out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address) + + return out0, err + +} + +// Aggregator is a free data retrieval call binding the contract method 0x245a7bfc. +// +// Solidity: function aggregator() view returns(address) +func (_ContractSFFLTaskManager *ContractSFFLTaskManagerSession) Aggregator() (common.Address, error) { + return _ContractSFFLTaskManager.Contract.Aggregator(&_ContractSFFLTaskManager.CallOpts) +} + +// Aggregator is a free data retrieval call binding the contract method 0x245a7bfc. +// +// Solidity: function aggregator() view returns(address) +func (_ContractSFFLTaskManager *ContractSFFLTaskManagerCallerSession) Aggregator() (common.Address, error) { + return _ContractSFFLTaskManager.Contract.Aggregator(&_ContractSFFLTaskManager.CallOpts) +} + +// AllCheckpointTaskHashes is a free data retrieval call binding the contract method 0x4f19ade7. +// +// Solidity: function allCheckpointTaskHashes(uint32 ) view returns(bytes32) +func (_ContractSFFLTaskManager *ContractSFFLTaskManagerCaller) AllCheckpointTaskHashes(opts *bind.CallOpts, arg0 uint32) ([32]byte, error) { + var out []interface{} + err := _ContractSFFLTaskManager.contract.Call(opts, &out, "allCheckpointTaskHashes", arg0) + + if err != nil { + return *new([32]byte), err + } + + out0 := *abi.ConvertType(out[0], new([32]byte)).(*[32]byte) + + return out0, err + +} + +// AllCheckpointTaskHashes is a free data retrieval call binding the contract method 0x4f19ade7. +// +// Solidity: function allCheckpointTaskHashes(uint32 ) view returns(bytes32) +func (_ContractSFFLTaskManager *ContractSFFLTaskManagerSession) AllCheckpointTaskHashes(arg0 uint32) ([32]byte, error) { + return _ContractSFFLTaskManager.Contract.AllCheckpointTaskHashes(&_ContractSFFLTaskManager.CallOpts, arg0) +} + +// AllCheckpointTaskHashes is a free data retrieval call binding the contract method 0x4f19ade7. +// +// Solidity: function allCheckpointTaskHashes(uint32 ) view returns(bytes32) +func (_ContractSFFLTaskManager *ContractSFFLTaskManagerCallerSession) AllCheckpointTaskHashes(arg0 uint32) ([32]byte, error) { + return _ContractSFFLTaskManager.Contract.AllCheckpointTaskHashes(&_ContractSFFLTaskManager.CallOpts, arg0) +} + +// AllCheckpointTaskResponses is a free data retrieval call binding the contract method 0xa168e3c0. +// +// Solidity: function allCheckpointTaskResponses(uint32 ) view returns(bytes32) +func (_ContractSFFLTaskManager *ContractSFFLTaskManagerCaller) AllCheckpointTaskResponses(opts *bind.CallOpts, arg0 uint32) ([32]byte, error) { + var out []interface{} + err := _ContractSFFLTaskManager.contract.Call(opts, &out, "allCheckpointTaskResponses", arg0) + + if err != nil { + return *new([32]byte), err + } + + out0 := *abi.ConvertType(out[0], new([32]byte)).(*[32]byte) + + return out0, err + +} + +// AllCheckpointTaskResponses is a free data retrieval call binding the contract method 0xa168e3c0. +// +// Solidity: function allCheckpointTaskResponses(uint32 ) view returns(bytes32) +func (_ContractSFFLTaskManager *ContractSFFLTaskManagerSession) AllCheckpointTaskResponses(arg0 uint32) ([32]byte, error) { + return _ContractSFFLTaskManager.Contract.AllCheckpointTaskResponses(&_ContractSFFLTaskManager.CallOpts, arg0) +} + +// AllCheckpointTaskResponses is a free data retrieval call binding the contract method 0xa168e3c0. +// +// Solidity: function allCheckpointTaskResponses(uint32 ) view returns(bytes32) +func (_ContractSFFLTaskManager *ContractSFFLTaskManagerCallerSession) AllCheckpointTaskResponses(arg0 uint32) ([32]byte, error) { + return _ContractSFFLTaskManager.Contract.AllCheckpointTaskResponses(&_ContractSFFLTaskManager.CallOpts, arg0) +} + +// BlsApkRegistry is a free data retrieval call binding the contract method 0x5df45946. +// +// Solidity: function blsApkRegistry() view returns(address) +func (_ContractSFFLTaskManager *ContractSFFLTaskManagerCaller) BlsApkRegistry(opts *bind.CallOpts) (common.Address, error) { + var out []interface{} + err := _ContractSFFLTaskManager.contract.Call(opts, &out, "blsApkRegistry") + + if err != nil { + return *new(common.Address), err + } + + out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address) + + return out0, err + +} + +// BlsApkRegistry is a free data retrieval call binding the contract method 0x5df45946. +// +// Solidity: function blsApkRegistry() view returns(address) +func (_ContractSFFLTaskManager *ContractSFFLTaskManagerSession) BlsApkRegistry() (common.Address, error) { + return _ContractSFFLTaskManager.Contract.BlsApkRegistry(&_ContractSFFLTaskManager.CallOpts) +} + +// BlsApkRegistry is a free data retrieval call binding the contract method 0x5df45946. +// +// Solidity: function blsApkRegistry() view returns(address) +func (_ContractSFFLTaskManager *ContractSFFLTaskManagerCallerSession) BlsApkRegistry() (common.Address, error) { + return _ContractSFFLTaskManager.Contract.BlsApkRegistry(&_ContractSFFLTaskManager.CallOpts) +} + +// CheckQuorum is a free data retrieval call binding the contract method 0x292f7a4e. +// +// Solidity: function checkQuorum(bytes32 messageHash, bytes quorumNumbers, uint32 referenceBlockNumber, (uint32[],(uint256,uint256)[],(uint256,uint256)[],(uint256[2],uint256[2]),(uint256,uint256),uint32[],uint32[],uint32[][]) nonSignerStakesAndSignature, uint32 quorumThreshold) view returns(bool, bytes32) +func (_ContractSFFLTaskManager *ContractSFFLTaskManagerCaller) CheckQuorum(opts *bind.CallOpts, messageHash [32]byte, quorumNumbers []byte, referenceBlockNumber uint32, nonSignerStakesAndSignature IBLSSignatureCheckerNonSignerStakesAndSignature, quorumThreshold uint32) (bool, [32]byte, error) { + var out []interface{} + err := _ContractSFFLTaskManager.contract.Call(opts, &out, "checkQuorum", messageHash, quorumNumbers, referenceBlockNumber, nonSignerStakesAndSignature, quorumThreshold) + + if err != nil { + return *new(bool), *new([32]byte), err + } + + out0 := *abi.ConvertType(out[0], new(bool)).(*bool) + out1 := *abi.ConvertType(out[1], new([32]byte)).(*[32]byte) + + return out0, out1, err + +} + +// CheckQuorum is a free data retrieval call binding the contract method 0x292f7a4e. +// +// Solidity: function checkQuorum(bytes32 messageHash, bytes quorumNumbers, uint32 referenceBlockNumber, (uint32[],(uint256,uint256)[],(uint256,uint256)[],(uint256[2],uint256[2]),(uint256,uint256),uint32[],uint32[],uint32[][]) nonSignerStakesAndSignature, uint32 quorumThreshold) view returns(bool, bytes32) +func (_ContractSFFLTaskManager *ContractSFFLTaskManagerSession) CheckQuorum(messageHash [32]byte, quorumNumbers []byte, referenceBlockNumber uint32, nonSignerStakesAndSignature IBLSSignatureCheckerNonSignerStakesAndSignature, quorumThreshold uint32) (bool, [32]byte, error) { + return _ContractSFFLTaskManager.Contract.CheckQuorum(&_ContractSFFLTaskManager.CallOpts, messageHash, quorumNumbers, referenceBlockNumber, nonSignerStakesAndSignature, quorumThreshold) +} + +// CheckQuorum is a free data retrieval call binding the contract method 0x292f7a4e. +// +// Solidity: function checkQuorum(bytes32 messageHash, bytes quorumNumbers, uint32 referenceBlockNumber, (uint32[],(uint256,uint256)[],(uint256,uint256)[],(uint256[2],uint256[2]),(uint256,uint256),uint32[],uint32[],uint32[][]) nonSignerStakesAndSignature, uint32 quorumThreshold) view returns(bool, bytes32) +func (_ContractSFFLTaskManager *ContractSFFLTaskManagerCallerSession) CheckQuorum(messageHash [32]byte, quorumNumbers []byte, referenceBlockNumber uint32, nonSignerStakesAndSignature IBLSSignatureCheckerNonSignerStakesAndSignature, quorumThreshold uint32) (bool, [32]byte, error) { + return _ContractSFFLTaskManager.Contract.CheckQuorum(&_ContractSFFLTaskManager.CallOpts, messageHash, quorumNumbers, referenceBlockNumber, nonSignerStakesAndSignature, quorumThreshold) +} + +// CheckSignatures is a free data retrieval call binding the contract method 0x6efb4636. +// +// Solidity: function checkSignatures(bytes32 msgHash, bytes quorumNumbers, uint32 referenceBlockNumber, (uint32[],(uint256,uint256)[],(uint256,uint256)[],(uint256[2],uint256[2]),(uint256,uint256),uint32[],uint32[],uint32[][]) params) view returns((uint96[],uint96[]), bytes32) +func (_ContractSFFLTaskManager *ContractSFFLTaskManagerCaller) CheckSignatures(opts *bind.CallOpts, msgHash [32]byte, quorumNumbers []byte, referenceBlockNumber uint32, params IBLSSignatureCheckerNonSignerStakesAndSignature) (IBLSSignatureCheckerQuorumStakeTotals, [32]byte, error) { + var out []interface{} + err := _ContractSFFLTaskManager.contract.Call(opts, &out, "checkSignatures", msgHash, quorumNumbers, referenceBlockNumber, params) + + if err != nil { + return *new(IBLSSignatureCheckerQuorumStakeTotals), *new([32]byte), err + } + + out0 := *abi.ConvertType(out[0], new(IBLSSignatureCheckerQuorumStakeTotals)).(*IBLSSignatureCheckerQuorumStakeTotals) + out1 := *abi.ConvertType(out[1], new([32]byte)).(*[32]byte) + + return out0, out1, err + +} + +// CheckSignatures is a free data retrieval call binding the contract method 0x6efb4636. +// +// Solidity: function checkSignatures(bytes32 msgHash, bytes quorumNumbers, uint32 referenceBlockNumber, (uint32[],(uint256,uint256)[],(uint256,uint256)[],(uint256[2],uint256[2]),(uint256,uint256),uint32[],uint32[],uint32[][]) params) view returns((uint96[],uint96[]), bytes32) +func (_ContractSFFLTaskManager *ContractSFFLTaskManagerSession) CheckSignatures(msgHash [32]byte, quorumNumbers []byte, referenceBlockNumber uint32, params IBLSSignatureCheckerNonSignerStakesAndSignature) (IBLSSignatureCheckerQuorumStakeTotals, [32]byte, error) { + return _ContractSFFLTaskManager.Contract.CheckSignatures(&_ContractSFFLTaskManager.CallOpts, msgHash, quorumNumbers, referenceBlockNumber, params) +} + +// CheckSignatures is a free data retrieval call binding the contract method 0x6efb4636. +// +// Solidity: function checkSignatures(bytes32 msgHash, bytes quorumNumbers, uint32 referenceBlockNumber, (uint32[],(uint256,uint256)[],(uint256,uint256)[],(uint256[2],uint256[2]),(uint256,uint256),uint32[],uint32[],uint32[][]) params) view returns((uint96[],uint96[]), bytes32) +func (_ContractSFFLTaskManager *ContractSFFLTaskManagerCallerSession) CheckSignatures(msgHash [32]byte, quorumNumbers []byte, referenceBlockNumber uint32, params IBLSSignatureCheckerNonSignerStakesAndSignature) (IBLSSignatureCheckerQuorumStakeTotals, [32]byte, error) { + return _ContractSFFLTaskManager.Contract.CheckSignatures(&_ContractSFFLTaskManager.CallOpts, msgHash, quorumNumbers, referenceBlockNumber, params) +} + +// CheckpointTaskNumber is a free data retrieval call binding the contract method 0x8cbc379a. +// +// Solidity: function checkpointTaskNumber() view returns(uint32) +func (_ContractSFFLTaskManager *ContractSFFLTaskManagerCaller) CheckpointTaskNumber(opts *bind.CallOpts) (uint32, error) { + var out []interface{} + err := _ContractSFFLTaskManager.contract.Call(opts, &out, "checkpointTaskNumber") + + if err != nil { + return *new(uint32), err + } + + out0 := *abi.ConvertType(out[0], new(uint32)).(*uint32) + + return out0, err + +} + +// CheckpointTaskNumber is a free data retrieval call binding the contract method 0x8cbc379a. +// +// Solidity: function checkpointTaskNumber() view returns(uint32) +func (_ContractSFFLTaskManager *ContractSFFLTaskManagerSession) CheckpointTaskNumber() (uint32, error) { + return _ContractSFFLTaskManager.Contract.CheckpointTaskNumber(&_ContractSFFLTaskManager.CallOpts) +} + +// CheckpointTaskNumber is a free data retrieval call binding the contract method 0x8cbc379a. +// +// Solidity: function checkpointTaskNumber() view returns(uint32) +func (_ContractSFFLTaskManager *ContractSFFLTaskManagerCallerSession) CheckpointTaskNumber() (uint32, error) { + return _ContractSFFLTaskManager.Contract.CheckpointTaskNumber(&_ContractSFFLTaskManager.CallOpts) +} + +// CheckpointTaskSuccesfullyChallenged is a free data retrieval call binding the contract method 0x95eebee6. +// +// Solidity: function checkpointTaskSuccesfullyChallenged(uint32 ) view returns(bool) +func (_ContractSFFLTaskManager *ContractSFFLTaskManagerCaller) CheckpointTaskSuccesfullyChallenged(opts *bind.CallOpts, arg0 uint32) (bool, error) { + var out []interface{} + err := _ContractSFFLTaskManager.contract.Call(opts, &out, "checkpointTaskSuccesfullyChallenged", arg0) + + if err != nil { + return *new(bool), err + } + + out0 := *abi.ConvertType(out[0], new(bool)).(*bool) + + return out0, err + +} + +// CheckpointTaskSuccesfullyChallenged is a free data retrieval call binding the contract method 0x95eebee6. +// +// Solidity: function checkpointTaskSuccesfullyChallenged(uint32 ) view returns(bool) +func (_ContractSFFLTaskManager *ContractSFFLTaskManagerSession) CheckpointTaskSuccesfullyChallenged(arg0 uint32) (bool, error) { + return _ContractSFFLTaskManager.Contract.CheckpointTaskSuccesfullyChallenged(&_ContractSFFLTaskManager.CallOpts, arg0) +} + +// CheckpointTaskSuccesfullyChallenged is a free data retrieval call binding the contract method 0x95eebee6. +// +// Solidity: function checkpointTaskSuccesfullyChallenged(uint32 ) view returns(bool) +func (_ContractSFFLTaskManager *ContractSFFLTaskManagerCallerSession) CheckpointTaskSuccesfullyChallenged(arg0 uint32) (bool, error) { + return _ContractSFFLTaskManager.Contract.CheckpointTaskSuccesfullyChallenged(&_ContractSFFLTaskManager.CallOpts, arg0) +} + +// Delegation is a free data retrieval call binding the contract method 0xdf5cf723. +// +// Solidity: function delegation() view returns(address) +func (_ContractSFFLTaskManager *ContractSFFLTaskManagerCaller) Delegation(opts *bind.CallOpts) (common.Address, error) { + var out []interface{} + err := _ContractSFFLTaskManager.contract.Call(opts, &out, "delegation") + + if err != nil { + return *new(common.Address), err + } + + out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address) + + return out0, err + +} + +// Delegation is a free data retrieval call binding the contract method 0xdf5cf723. +// +// Solidity: function delegation() view returns(address) +func (_ContractSFFLTaskManager *ContractSFFLTaskManagerSession) Delegation() (common.Address, error) { + return _ContractSFFLTaskManager.Contract.Delegation(&_ContractSFFLTaskManager.CallOpts) +} + +// Delegation is a free data retrieval call binding the contract method 0xdf5cf723. +// +// Solidity: function delegation() view returns(address) +func (_ContractSFFLTaskManager *ContractSFFLTaskManagerCallerSession) Delegation() (common.Address, error) { + return _ContractSFFLTaskManager.Contract.Delegation(&_ContractSFFLTaskManager.CallOpts) +} + +// Generator is a free data retrieval call binding the contract method 0x7afa1eed. +// +// Solidity: function generator() view returns(address) +func (_ContractSFFLTaskManager *ContractSFFLTaskManagerCaller) Generator(opts *bind.CallOpts) (common.Address, error) { + var out []interface{} + err := _ContractSFFLTaskManager.contract.Call(opts, &out, "generator") + + if err != nil { + return *new(common.Address), err + } + + out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address) + + return out0, err + +} + +// Generator is a free data retrieval call binding the contract method 0x7afa1eed. +// +// Solidity: function generator() view returns(address) +func (_ContractSFFLTaskManager *ContractSFFLTaskManagerSession) Generator() (common.Address, error) { + return _ContractSFFLTaskManager.Contract.Generator(&_ContractSFFLTaskManager.CallOpts) +} + +// Generator is a free data retrieval call binding the contract method 0x7afa1eed. +// +// Solidity: function generator() view returns(address) +func (_ContractSFFLTaskManager *ContractSFFLTaskManagerCallerSession) Generator() (common.Address, error) { + return _ContractSFFLTaskManager.Contract.Generator(&_ContractSFFLTaskManager.CallOpts) +} + +// GetCheckSignaturesIndices is a free data retrieval call binding the contract method 0x4f739f74. +// +// Solidity: function getCheckSignaturesIndices(address registryCoordinator, uint32 referenceBlockNumber, bytes quorumNumbers, bytes32[] nonSignerOperatorIds) view returns((uint32[],uint32[],uint32[],uint32[][])) +func (_ContractSFFLTaskManager *ContractSFFLTaskManagerCaller) GetCheckSignaturesIndices(opts *bind.CallOpts, registryCoordinator common.Address, referenceBlockNumber uint32, quorumNumbers []byte, nonSignerOperatorIds [][32]byte) (OperatorStateRetrieverCheckSignaturesIndices, error) { + var out []interface{} + err := _ContractSFFLTaskManager.contract.Call(opts, &out, "getCheckSignaturesIndices", registryCoordinator, referenceBlockNumber, quorumNumbers, nonSignerOperatorIds) + + if err != nil { + return *new(OperatorStateRetrieverCheckSignaturesIndices), err + } + + out0 := *abi.ConvertType(out[0], new(OperatorStateRetrieverCheckSignaturesIndices)).(*OperatorStateRetrieverCheckSignaturesIndices) + + return out0, err + +} + +// GetCheckSignaturesIndices is a free data retrieval call binding the contract method 0x4f739f74. +// +// Solidity: function getCheckSignaturesIndices(address registryCoordinator, uint32 referenceBlockNumber, bytes quorumNumbers, bytes32[] nonSignerOperatorIds) view returns((uint32[],uint32[],uint32[],uint32[][])) +func (_ContractSFFLTaskManager *ContractSFFLTaskManagerSession) GetCheckSignaturesIndices(registryCoordinator common.Address, referenceBlockNumber uint32, quorumNumbers []byte, nonSignerOperatorIds [][32]byte) (OperatorStateRetrieverCheckSignaturesIndices, error) { + return _ContractSFFLTaskManager.Contract.GetCheckSignaturesIndices(&_ContractSFFLTaskManager.CallOpts, registryCoordinator, referenceBlockNumber, quorumNumbers, nonSignerOperatorIds) +} + +// GetCheckSignaturesIndices is a free data retrieval call binding the contract method 0x4f739f74. +// +// Solidity: function getCheckSignaturesIndices(address registryCoordinator, uint32 referenceBlockNumber, bytes quorumNumbers, bytes32[] nonSignerOperatorIds) view returns((uint32[],uint32[],uint32[],uint32[][])) +func (_ContractSFFLTaskManager *ContractSFFLTaskManagerCallerSession) GetCheckSignaturesIndices(registryCoordinator common.Address, referenceBlockNumber uint32, quorumNumbers []byte, nonSignerOperatorIds [][32]byte) (OperatorStateRetrieverCheckSignaturesIndices, error) { + return _ContractSFFLTaskManager.Contract.GetCheckSignaturesIndices(&_ContractSFFLTaskManager.CallOpts, registryCoordinator, referenceBlockNumber, quorumNumbers, nonSignerOperatorIds) +} + +// GetOperatorState is a free data retrieval call binding the contract method 0x3563b0d1. +// +// Solidity: function getOperatorState(address registryCoordinator, bytes quorumNumbers, uint32 blockNumber) view returns((bytes32,uint96)[][]) +func (_ContractSFFLTaskManager *ContractSFFLTaskManagerCaller) GetOperatorState(opts *bind.CallOpts, registryCoordinator common.Address, quorumNumbers []byte, blockNumber uint32) ([][]OperatorStateRetrieverOperator, error) { + var out []interface{} + err := _ContractSFFLTaskManager.contract.Call(opts, &out, "getOperatorState", registryCoordinator, quorumNumbers, blockNumber) + + if err != nil { + return *new([][]OperatorStateRetrieverOperator), err + } + + out0 := *abi.ConvertType(out[0], new([][]OperatorStateRetrieverOperator)).(*[][]OperatorStateRetrieverOperator) + + return out0, err + +} + +// GetOperatorState is a free data retrieval call binding the contract method 0x3563b0d1. +// +// Solidity: function getOperatorState(address registryCoordinator, bytes quorumNumbers, uint32 blockNumber) view returns((bytes32,uint96)[][]) +func (_ContractSFFLTaskManager *ContractSFFLTaskManagerSession) GetOperatorState(registryCoordinator common.Address, quorumNumbers []byte, blockNumber uint32) ([][]OperatorStateRetrieverOperator, error) { + return _ContractSFFLTaskManager.Contract.GetOperatorState(&_ContractSFFLTaskManager.CallOpts, registryCoordinator, quorumNumbers, blockNumber) +} + +// GetOperatorState is a free data retrieval call binding the contract method 0x3563b0d1. +// +// Solidity: function getOperatorState(address registryCoordinator, bytes quorumNumbers, uint32 blockNumber) view returns((bytes32,uint96)[][]) +func (_ContractSFFLTaskManager *ContractSFFLTaskManagerCallerSession) GetOperatorState(registryCoordinator common.Address, quorumNumbers []byte, blockNumber uint32) ([][]OperatorStateRetrieverOperator, error) { + return _ContractSFFLTaskManager.Contract.GetOperatorState(&_ContractSFFLTaskManager.CallOpts, registryCoordinator, quorumNumbers, blockNumber) +} + +// GetOperatorState0 is a free data retrieval call binding the contract method 0xcefdc1d4. +// +// Solidity: function getOperatorState(address registryCoordinator, bytes32 operatorId, uint32 blockNumber) view returns(uint256, (bytes32,uint96)[][]) +func (_ContractSFFLTaskManager *ContractSFFLTaskManagerCaller) GetOperatorState0(opts *bind.CallOpts, registryCoordinator common.Address, operatorId [32]byte, blockNumber uint32) (*big.Int, [][]OperatorStateRetrieverOperator, error) { + var out []interface{} + err := _ContractSFFLTaskManager.contract.Call(opts, &out, "getOperatorState0", registryCoordinator, operatorId, blockNumber) + + if err != nil { + return *new(*big.Int), *new([][]OperatorStateRetrieverOperator), err + } + + out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) + out1 := *abi.ConvertType(out[1], new([][]OperatorStateRetrieverOperator)).(*[][]OperatorStateRetrieverOperator) + + return out0, out1, err + +} + +// GetOperatorState0 is a free data retrieval call binding the contract method 0xcefdc1d4. +// +// Solidity: function getOperatorState(address registryCoordinator, bytes32 operatorId, uint32 blockNumber) view returns(uint256, (bytes32,uint96)[][]) +func (_ContractSFFLTaskManager *ContractSFFLTaskManagerSession) GetOperatorState0(registryCoordinator common.Address, operatorId [32]byte, blockNumber uint32) (*big.Int, [][]OperatorStateRetrieverOperator, error) { + return _ContractSFFLTaskManager.Contract.GetOperatorState0(&_ContractSFFLTaskManager.CallOpts, registryCoordinator, operatorId, blockNumber) +} + +// GetOperatorState0 is a free data retrieval call binding the contract method 0xcefdc1d4. +// +// Solidity: function getOperatorState(address registryCoordinator, bytes32 operatorId, uint32 blockNumber) view returns(uint256, (bytes32,uint96)[][]) +func (_ContractSFFLTaskManager *ContractSFFLTaskManagerCallerSession) GetOperatorState0(registryCoordinator common.Address, operatorId [32]byte, blockNumber uint32) (*big.Int, [][]OperatorStateRetrieverOperator, error) { + return _ContractSFFLTaskManager.Contract.GetOperatorState0(&_ContractSFFLTaskManager.CallOpts, registryCoordinator, operatorId, blockNumber) +} + +// NextCheckpointTaskNum is a free data retrieval call binding the contract method 0x2e44b349. +// +// Solidity: function nextCheckpointTaskNum() view returns(uint32) +func (_ContractSFFLTaskManager *ContractSFFLTaskManagerCaller) NextCheckpointTaskNum(opts *bind.CallOpts) (uint32, error) { + var out []interface{} + err := _ContractSFFLTaskManager.contract.Call(opts, &out, "nextCheckpointTaskNum") + + if err != nil { + return *new(uint32), err + } + + out0 := *abi.ConvertType(out[0], new(uint32)).(*uint32) + + return out0, err + +} + +// NextCheckpointTaskNum is a free data retrieval call binding the contract method 0x2e44b349. +// +// Solidity: function nextCheckpointTaskNum() view returns(uint32) +func (_ContractSFFLTaskManager *ContractSFFLTaskManagerSession) NextCheckpointTaskNum() (uint32, error) { + return _ContractSFFLTaskManager.Contract.NextCheckpointTaskNum(&_ContractSFFLTaskManager.CallOpts) +} + +// NextCheckpointTaskNum is a free data retrieval call binding the contract method 0x2e44b349. +// +// Solidity: function nextCheckpointTaskNum() view returns(uint32) +func (_ContractSFFLTaskManager *ContractSFFLTaskManagerCallerSession) NextCheckpointTaskNum() (uint32, error) { + return _ContractSFFLTaskManager.Contract.NextCheckpointTaskNum(&_ContractSFFLTaskManager.CallOpts) +} + +// Owner is a free data retrieval call binding the contract method 0x8da5cb5b. +// +// Solidity: function owner() view returns(address) +func (_ContractSFFLTaskManager *ContractSFFLTaskManagerCaller) Owner(opts *bind.CallOpts) (common.Address, error) { + var out []interface{} + err := _ContractSFFLTaskManager.contract.Call(opts, &out, "owner") + + if err != nil { + return *new(common.Address), err + } + + out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address) + + return out0, err + +} + +// Owner is a free data retrieval call binding the contract method 0x8da5cb5b. +// +// Solidity: function owner() view returns(address) +func (_ContractSFFLTaskManager *ContractSFFLTaskManagerSession) Owner() (common.Address, error) { + return _ContractSFFLTaskManager.Contract.Owner(&_ContractSFFLTaskManager.CallOpts) +} + +// Owner is a free data retrieval call binding the contract method 0x8da5cb5b. +// +// Solidity: function owner() view returns(address) +func (_ContractSFFLTaskManager *ContractSFFLTaskManagerCallerSession) Owner() (common.Address, error) { + return _ContractSFFLTaskManager.Contract.Owner(&_ContractSFFLTaskManager.CallOpts) +} + +// Paused is a free data retrieval call binding the contract method 0x5ac86ab7. +// +// Solidity: function paused(uint8 index) view returns(bool) +func (_ContractSFFLTaskManager *ContractSFFLTaskManagerCaller) Paused(opts *bind.CallOpts, index uint8) (bool, error) { + var out []interface{} + err := _ContractSFFLTaskManager.contract.Call(opts, &out, "paused", index) + + if err != nil { + return *new(bool), err + } + + out0 := *abi.ConvertType(out[0], new(bool)).(*bool) + + return out0, err + +} + +// Paused is a free data retrieval call binding the contract method 0x5ac86ab7. +// +// Solidity: function paused(uint8 index) view returns(bool) +func (_ContractSFFLTaskManager *ContractSFFLTaskManagerSession) Paused(index uint8) (bool, error) { + return _ContractSFFLTaskManager.Contract.Paused(&_ContractSFFLTaskManager.CallOpts, index) +} + +// Paused is a free data retrieval call binding the contract method 0x5ac86ab7. +// +// Solidity: function paused(uint8 index) view returns(bool) +func (_ContractSFFLTaskManager *ContractSFFLTaskManagerCallerSession) Paused(index uint8) (bool, error) { + return _ContractSFFLTaskManager.Contract.Paused(&_ContractSFFLTaskManager.CallOpts, index) +} + +// Paused0 is a free data retrieval call binding the contract method 0x5c975abb. +// +// Solidity: function paused() view returns(uint256) +func (_ContractSFFLTaskManager *ContractSFFLTaskManagerCaller) Paused0(opts *bind.CallOpts) (*big.Int, error) { + var out []interface{} + err := _ContractSFFLTaskManager.contract.Call(opts, &out, "paused0") + + if err != nil { + return *new(*big.Int), err + } + + out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) + + return out0, err + +} + +// Paused0 is a free data retrieval call binding the contract method 0x5c975abb. +// +// Solidity: function paused() view returns(uint256) +func (_ContractSFFLTaskManager *ContractSFFLTaskManagerSession) Paused0() (*big.Int, error) { + return _ContractSFFLTaskManager.Contract.Paused0(&_ContractSFFLTaskManager.CallOpts) +} + +// Paused0 is a free data retrieval call binding the contract method 0x5c975abb. +// +// Solidity: function paused() view returns(uint256) +func (_ContractSFFLTaskManager *ContractSFFLTaskManagerCallerSession) Paused0() (*big.Int, error) { + return _ContractSFFLTaskManager.Contract.Paused0(&_ContractSFFLTaskManager.CallOpts) +} + +// PauserRegistry is a free data retrieval call binding the contract method 0x886f1195. +// +// Solidity: function pauserRegistry() view returns(address) +func (_ContractSFFLTaskManager *ContractSFFLTaskManagerCaller) PauserRegistry(opts *bind.CallOpts) (common.Address, error) { + var out []interface{} + err := _ContractSFFLTaskManager.contract.Call(opts, &out, "pauserRegistry") + + if err != nil { + return *new(common.Address), err + } + + out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address) + + return out0, err + +} + +// PauserRegistry is a free data retrieval call binding the contract method 0x886f1195. +// +// Solidity: function pauserRegistry() view returns(address) +func (_ContractSFFLTaskManager *ContractSFFLTaskManagerSession) PauserRegistry() (common.Address, error) { + return _ContractSFFLTaskManager.Contract.PauserRegistry(&_ContractSFFLTaskManager.CallOpts) +} + +// PauserRegistry is a free data retrieval call binding the contract method 0x886f1195. +// +// Solidity: function pauserRegistry() view returns(address) +func (_ContractSFFLTaskManager *ContractSFFLTaskManagerCallerSession) PauserRegistry() (common.Address, error) { + return _ContractSFFLTaskManager.Contract.PauserRegistry(&_ContractSFFLTaskManager.CallOpts) +} + +// RegistryCoordinator is a free data retrieval call binding the contract method 0x6d14a987. +// +// Solidity: function registryCoordinator() view returns(address) +func (_ContractSFFLTaskManager *ContractSFFLTaskManagerCaller) RegistryCoordinator(opts *bind.CallOpts) (common.Address, error) { + var out []interface{} + err := _ContractSFFLTaskManager.contract.Call(opts, &out, "registryCoordinator") + + if err != nil { + return *new(common.Address), err + } + + out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address) + + return out0, err + +} + +// RegistryCoordinator is a free data retrieval call binding the contract method 0x6d14a987. +// +// Solidity: function registryCoordinator() view returns(address) +func (_ContractSFFLTaskManager *ContractSFFLTaskManagerSession) RegistryCoordinator() (common.Address, error) { + return _ContractSFFLTaskManager.Contract.RegistryCoordinator(&_ContractSFFLTaskManager.CallOpts) +} + +// RegistryCoordinator is a free data retrieval call binding the contract method 0x6d14a987. +// +// Solidity: function registryCoordinator() view returns(address) +func (_ContractSFFLTaskManager *ContractSFFLTaskManagerCallerSession) RegistryCoordinator() (common.Address, error) { + return _ContractSFFLTaskManager.Contract.RegistryCoordinator(&_ContractSFFLTaskManager.CallOpts) +} + +// StakeRegistry is a free data retrieval call binding the contract method 0x68304835. +// +// Solidity: function stakeRegistry() view returns(address) +func (_ContractSFFLTaskManager *ContractSFFLTaskManagerCaller) StakeRegistry(opts *bind.CallOpts) (common.Address, error) { + var out []interface{} + err := _ContractSFFLTaskManager.contract.Call(opts, &out, "stakeRegistry") + + if err != nil { + return *new(common.Address), err + } + + out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address) + + return out0, err + +} + +// StakeRegistry is a free data retrieval call binding the contract method 0x68304835. +// +// Solidity: function stakeRegistry() view returns(address) +func (_ContractSFFLTaskManager *ContractSFFLTaskManagerSession) StakeRegistry() (common.Address, error) { + return _ContractSFFLTaskManager.Contract.StakeRegistry(&_ContractSFFLTaskManager.CallOpts) +} + +// StakeRegistry is a free data retrieval call binding the contract method 0x68304835. +// +// Solidity: function stakeRegistry() view returns(address) +func (_ContractSFFLTaskManager *ContractSFFLTaskManagerCallerSession) StakeRegistry() (common.Address, error) { + return _ContractSFFLTaskManager.Contract.StakeRegistry(&_ContractSFFLTaskManager.CallOpts) +} + +// StaleStakesForbidden is a free data retrieval call binding the contract method 0xb98d0908. +// +// Solidity: function staleStakesForbidden() view returns(bool) +func (_ContractSFFLTaskManager *ContractSFFLTaskManagerCaller) StaleStakesForbidden(opts *bind.CallOpts) (bool, error) { + var out []interface{} + err := _ContractSFFLTaskManager.contract.Call(opts, &out, "staleStakesForbidden") + + if err != nil { + return *new(bool), err + } + + out0 := *abi.ConvertType(out[0], new(bool)).(*bool) + + return out0, err + +} + +// StaleStakesForbidden is a free data retrieval call binding the contract method 0xb98d0908. +// +// Solidity: function staleStakesForbidden() view returns(bool) +func (_ContractSFFLTaskManager *ContractSFFLTaskManagerSession) StaleStakesForbidden() (bool, error) { + return _ContractSFFLTaskManager.Contract.StaleStakesForbidden(&_ContractSFFLTaskManager.CallOpts) +} + +// StaleStakesForbidden is a free data retrieval call binding the contract method 0xb98d0908. +// +// Solidity: function staleStakesForbidden() view returns(bool) +func (_ContractSFFLTaskManager *ContractSFFLTaskManagerCallerSession) StaleStakesForbidden() (bool, error) { + return _ContractSFFLTaskManager.Contract.StaleStakesForbidden(&_ContractSFFLTaskManager.CallOpts) +} + +// TrySignatureAndApkVerification is a free data retrieval call binding the contract method 0x171f1d5b. +// +// Solidity: function trySignatureAndApkVerification(bytes32 msgHash, (uint256,uint256) apk, (uint256[2],uint256[2]) apkG2, (uint256,uint256) sigma) view returns(bool pairingSuccessful, bool siganatureIsValid) +func (_ContractSFFLTaskManager *ContractSFFLTaskManagerCaller) TrySignatureAndApkVerification(opts *bind.CallOpts, msgHash [32]byte, apk BN254G1Point, apkG2 BN254G2Point, sigma BN254G1Point) (struct { + PairingSuccessful bool + SiganatureIsValid bool +}, error) { + var out []interface{} + err := _ContractSFFLTaskManager.contract.Call(opts, &out, "trySignatureAndApkVerification", msgHash, apk, apkG2, sigma) + + outstruct := new(struct { + PairingSuccessful bool + SiganatureIsValid bool + }) + if err != nil { + return *outstruct, err + } + + outstruct.PairingSuccessful = *abi.ConvertType(out[0], new(bool)).(*bool) + outstruct.SiganatureIsValid = *abi.ConvertType(out[1], new(bool)).(*bool) + + return *outstruct, err + +} + +// TrySignatureAndApkVerification is a free data retrieval call binding the contract method 0x171f1d5b. +// +// Solidity: function trySignatureAndApkVerification(bytes32 msgHash, (uint256,uint256) apk, (uint256[2],uint256[2]) apkG2, (uint256,uint256) sigma) view returns(bool pairingSuccessful, bool siganatureIsValid) +func (_ContractSFFLTaskManager *ContractSFFLTaskManagerSession) TrySignatureAndApkVerification(msgHash [32]byte, apk BN254G1Point, apkG2 BN254G2Point, sigma BN254G1Point) (struct { + PairingSuccessful bool + SiganatureIsValid bool +}, error) { + return _ContractSFFLTaskManager.Contract.TrySignatureAndApkVerification(&_ContractSFFLTaskManager.CallOpts, msgHash, apk, apkG2, sigma) +} + +// TrySignatureAndApkVerification is a free data retrieval call binding the contract method 0x171f1d5b. +// +// Solidity: function trySignatureAndApkVerification(bytes32 msgHash, (uint256,uint256) apk, (uint256[2],uint256[2]) apkG2, (uint256,uint256) sigma) view returns(bool pairingSuccessful, bool siganatureIsValid) +func (_ContractSFFLTaskManager *ContractSFFLTaskManagerCallerSession) TrySignatureAndApkVerification(msgHash [32]byte, apk BN254G1Point, apkG2 BN254G2Point, sigma BN254G1Point) (struct { + PairingSuccessful bool + SiganatureIsValid bool +}, error) { + return _ContractSFFLTaskManager.Contract.TrySignatureAndApkVerification(&_ContractSFFLTaskManager.CallOpts, msgHash, apk, apkG2, sigma) +} + +// CreateCheckpointTask is a paid mutator transaction binding the contract method 0xefcf4edb. +// +// Solidity: function createCheckpointTask(uint64 fromNearBlock, uint64 toNearBlock, uint32 quorumThreshold, bytes quorumNumbers) returns() +func (_ContractSFFLTaskManager *ContractSFFLTaskManagerTransactor) CreateCheckpointTask(opts *bind.TransactOpts, fromNearBlock uint64, toNearBlock uint64, quorumThreshold uint32, quorumNumbers []byte) (*types.Transaction, error) { + return _ContractSFFLTaskManager.contract.Transact(opts, "createCheckpointTask", fromNearBlock, toNearBlock, quorumThreshold, quorumNumbers) +} + +// CreateCheckpointTask is a paid mutator transaction binding the contract method 0xefcf4edb. +// +// Solidity: function createCheckpointTask(uint64 fromNearBlock, uint64 toNearBlock, uint32 quorumThreshold, bytes quorumNumbers) returns() +func (_ContractSFFLTaskManager *ContractSFFLTaskManagerSession) CreateCheckpointTask(fromNearBlock uint64, toNearBlock uint64, quorumThreshold uint32, quorumNumbers []byte) (*types.Transaction, error) { + return _ContractSFFLTaskManager.Contract.CreateCheckpointTask(&_ContractSFFLTaskManager.TransactOpts, fromNearBlock, toNearBlock, quorumThreshold, quorumNumbers) +} + +// CreateCheckpointTask is a paid mutator transaction binding the contract method 0xefcf4edb. +// +// Solidity: function createCheckpointTask(uint64 fromNearBlock, uint64 toNearBlock, uint32 quorumThreshold, bytes quorumNumbers) returns() +func (_ContractSFFLTaskManager *ContractSFFLTaskManagerTransactorSession) CreateCheckpointTask(fromNearBlock uint64, toNearBlock uint64, quorumThreshold uint32, quorumNumbers []byte) (*types.Transaction, error) { + return _ContractSFFLTaskManager.Contract.CreateCheckpointTask(&_ContractSFFLTaskManager.TransactOpts, fromNearBlock, toNearBlock, quorumThreshold, quorumNumbers) +} + +// Initialize is a paid mutator transaction binding the contract method 0xf8c8765e. +// +// Solidity: function initialize(address _pauserRegistry, address initialOwner, address _aggregator, address _generator) returns() +func (_ContractSFFLTaskManager *ContractSFFLTaskManagerTransactor) Initialize(opts *bind.TransactOpts, _pauserRegistry common.Address, initialOwner common.Address, _aggregator common.Address, _generator common.Address) (*types.Transaction, error) { + return _ContractSFFLTaskManager.contract.Transact(opts, "initialize", _pauserRegistry, initialOwner, _aggregator, _generator) +} + +// Initialize is a paid mutator transaction binding the contract method 0xf8c8765e. +// +// Solidity: function initialize(address _pauserRegistry, address initialOwner, address _aggregator, address _generator) returns() +func (_ContractSFFLTaskManager *ContractSFFLTaskManagerSession) Initialize(_pauserRegistry common.Address, initialOwner common.Address, _aggregator common.Address, _generator common.Address) (*types.Transaction, error) { + return _ContractSFFLTaskManager.Contract.Initialize(&_ContractSFFLTaskManager.TransactOpts, _pauserRegistry, initialOwner, _aggregator, _generator) +} + +// Initialize is a paid mutator transaction binding the contract method 0xf8c8765e. +// +// Solidity: function initialize(address _pauserRegistry, address initialOwner, address _aggregator, address _generator) returns() +func (_ContractSFFLTaskManager *ContractSFFLTaskManagerTransactorSession) Initialize(_pauserRegistry common.Address, initialOwner common.Address, _aggregator common.Address, _generator common.Address) (*types.Transaction, error) { + return _ContractSFFLTaskManager.Contract.Initialize(&_ContractSFFLTaskManager.TransactOpts, _pauserRegistry, initialOwner, _aggregator, _generator) +} + +// Pause is a paid mutator transaction binding the contract method 0x136439dd. +// +// Solidity: function pause(uint256 newPausedStatus) returns() +func (_ContractSFFLTaskManager *ContractSFFLTaskManagerTransactor) Pause(opts *bind.TransactOpts, newPausedStatus *big.Int) (*types.Transaction, error) { + return _ContractSFFLTaskManager.contract.Transact(opts, "pause", newPausedStatus) +} + +// Pause is a paid mutator transaction binding the contract method 0x136439dd. +// +// Solidity: function pause(uint256 newPausedStatus) returns() +func (_ContractSFFLTaskManager *ContractSFFLTaskManagerSession) Pause(newPausedStatus *big.Int) (*types.Transaction, error) { + return _ContractSFFLTaskManager.Contract.Pause(&_ContractSFFLTaskManager.TransactOpts, newPausedStatus) +} + +// Pause is a paid mutator transaction binding the contract method 0x136439dd. +// +// Solidity: function pause(uint256 newPausedStatus) returns() +func (_ContractSFFLTaskManager *ContractSFFLTaskManagerTransactorSession) Pause(newPausedStatus *big.Int) (*types.Transaction, error) { + return _ContractSFFLTaskManager.Contract.Pause(&_ContractSFFLTaskManager.TransactOpts, newPausedStatus) +} + +// PauseAll is a paid mutator transaction binding the contract method 0x595c6a67. +// +// Solidity: function pauseAll() returns() +func (_ContractSFFLTaskManager *ContractSFFLTaskManagerTransactor) PauseAll(opts *bind.TransactOpts) (*types.Transaction, error) { + return _ContractSFFLTaskManager.contract.Transact(opts, "pauseAll") +} + +// PauseAll is a paid mutator transaction binding the contract method 0x595c6a67. +// +// Solidity: function pauseAll() returns() +func (_ContractSFFLTaskManager *ContractSFFLTaskManagerSession) PauseAll() (*types.Transaction, error) { + return _ContractSFFLTaskManager.Contract.PauseAll(&_ContractSFFLTaskManager.TransactOpts) +} + +// PauseAll is a paid mutator transaction binding the contract method 0x595c6a67. +// +// Solidity: function pauseAll() returns() +func (_ContractSFFLTaskManager *ContractSFFLTaskManagerTransactorSession) PauseAll() (*types.Transaction, error) { + return _ContractSFFLTaskManager.Contract.PauseAll(&_ContractSFFLTaskManager.TransactOpts) +} + +// RaiseAndResolveCheckpointChallenge is a paid mutator transaction binding the contract method 0x5ace2df7. +// +// Solidity: function raiseAndResolveCheckpointChallenge((uint32,uint64,uint64,uint32,bytes) task, (uint32,bytes32,bytes32) taskResponse, (uint32,bytes32) taskResponseMetadata, (uint256,uint256)[] pubkeysOfNonSigningOperators) returns() +func (_ContractSFFLTaskManager *ContractSFFLTaskManagerTransactor) RaiseAndResolveCheckpointChallenge(opts *bind.TransactOpts, task CheckpointTask, taskResponse CheckpointTaskResponse, taskResponseMetadata CheckpointTaskResponseMetadata, pubkeysOfNonSigningOperators []BN254G1Point) (*types.Transaction, error) { + return _ContractSFFLTaskManager.contract.Transact(opts, "raiseAndResolveCheckpointChallenge", task, taskResponse, taskResponseMetadata, pubkeysOfNonSigningOperators) +} + +// RaiseAndResolveCheckpointChallenge is a paid mutator transaction binding the contract method 0x5ace2df7. +// +// Solidity: function raiseAndResolveCheckpointChallenge((uint32,uint64,uint64,uint32,bytes) task, (uint32,bytes32,bytes32) taskResponse, (uint32,bytes32) taskResponseMetadata, (uint256,uint256)[] pubkeysOfNonSigningOperators) returns() +func (_ContractSFFLTaskManager *ContractSFFLTaskManagerSession) RaiseAndResolveCheckpointChallenge(task CheckpointTask, taskResponse CheckpointTaskResponse, taskResponseMetadata CheckpointTaskResponseMetadata, pubkeysOfNonSigningOperators []BN254G1Point) (*types.Transaction, error) { + return _ContractSFFLTaskManager.Contract.RaiseAndResolveCheckpointChallenge(&_ContractSFFLTaskManager.TransactOpts, task, taskResponse, taskResponseMetadata, pubkeysOfNonSigningOperators) +} + +// RaiseAndResolveCheckpointChallenge is a paid mutator transaction binding the contract method 0x5ace2df7. +// +// Solidity: function raiseAndResolveCheckpointChallenge((uint32,uint64,uint64,uint32,bytes) task, (uint32,bytes32,bytes32) taskResponse, (uint32,bytes32) taskResponseMetadata, (uint256,uint256)[] pubkeysOfNonSigningOperators) returns() +func (_ContractSFFLTaskManager *ContractSFFLTaskManagerTransactorSession) RaiseAndResolveCheckpointChallenge(task CheckpointTask, taskResponse CheckpointTaskResponse, taskResponseMetadata CheckpointTaskResponseMetadata, pubkeysOfNonSigningOperators []BN254G1Point) (*types.Transaction, error) { + return _ContractSFFLTaskManager.Contract.RaiseAndResolveCheckpointChallenge(&_ContractSFFLTaskManager.TransactOpts, task, taskResponse, taskResponseMetadata, pubkeysOfNonSigningOperators) +} + +// RenounceOwnership is a paid mutator transaction binding the contract method 0x715018a6. +// +// Solidity: function renounceOwnership() returns() +func (_ContractSFFLTaskManager *ContractSFFLTaskManagerTransactor) RenounceOwnership(opts *bind.TransactOpts) (*types.Transaction, error) { + return _ContractSFFLTaskManager.contract.Transact(opts, "renounceOwnership") +} + +// RenounceOwnership is a paid mutator transaction binding the contract method 0x715018a6. +// +// Solidity: function renounceOwnership() returns() +func (_ContractSFFLTaskManager *ContractSFFLTaskManagerSession) RenounceOwnership() (*types.Transaction, error) { + return _ContractSFFLTaskManager.Contract.RenounceOwnership(&_ContractSFFLTaskManager.TransactOpts) +} + +// RenounceOwnership is a paid mutator transaction binding the contract method 0x715018a6. +// +// Solidity: function renounceOwnership() returns() +func (_ContractSFFLTaskManager *ContractSFFLTaskManagerTransactorSession) RenounceOwnership() (*types.Transaction, error) { + return _ContractSFFLTaskManager.Contract.RenounceOwnership(&_ContractSFFLTaskManager.TransactOpts) +} + +// RespondToCheckpointTask is a paid mutator transaction binding the contract method 0xda16491f. +// +// Solidity: function respondToCheckpointTask((uint32,uint64,uint64,uint32,bytes) task, (uint32,bytes32,bytes32) taskResponse, (uint32[],(uint256,uint256)[],(uint256,uint256)[],(uint256[2],uint256[2]),(uint256,uint256),uint32[],uint32[],uint32[][]) nonSignerStakesAndSignature) returns() +func (_ContractSFFLTaskManager *ContractSFFLTaskManagerTransactor) RespondToCheckpointTask(opts *bind.TransactOpts, task CheckpointTask, taskResponse CheckpointTaskResponse, nonSignerStakesAndSignature IBLSSignatureCheckerNonSignerStakesAndSignature) (*types.Transaction, error) { + return _ContractSFFLTaskManager.contract.Transact(opts, "respondToCheckpointTask", task, taskResponse, nonSignerStakesAndSignature) +} + +// RespondToCheckpointTask is a paid mutator transaction binding the contract method 0xda16491f. +// +// Solidity: function respondToCheckpointTask((uint32,uint64,uint64,uint32,bytes) task, (uint32,bytes32,bytes32) taskResponse, (uint32[],(uint256,uint256)[],(uint256,uint256)[],(uint256[2],uint256[2]),(uint256,uint256),uint32[],uint32[],uint32[][]) nonSignerStakesAndSignature) returns() +func (_ContractSFFLTaskManager *ContractSFFLTaskManagerSession) RespondToCheckpointTask(task CheckpointTask, taskResponse CheckpointTaskResponse, nonSignerStakesAndSignature IBLSSignatureCheckerNonSignerStakesAndSignature) (*types.Transaction, error) { + return _ContractSFFLTaskManager.Contract.RespondToCheckpointTask(&_ContractSFFLTaskManager.TransactOpts, task, taskResponse, nonSignerStakesAndSignature) +} + +// RespondToCheckpointTask is a paid mutator transaction binding the contract method 0xda16491f. +// +// Solidity: function respondToCheckpointTask((uint32,uint64,uint64,uint32,bytes) task, (uint32,bytes32,bytes32) taskResponse, (uint32[],(uint256,uint256)[],(uint256,uint256)[],(uint256[2],uint256[2]),(uint256,uint256),uint32[],uint32[],uint32[][]) nonSignerStakesAndSignature) returns() +func (_ContractSFFLTaskManager *ContractSFFLTaskManagerTransactorSession) RespondToCheckpointTask(task CheckpointTask, taskResponse CheckpointTaskResponse, nonSignerStakesAndSignature IBLSSignatureCheckerNonSignerStakesAndSignature) (*types.Transaction, error) { + return _ContractSFFLTaskManager.Contract.RespondToCheckpointTask(&_ContractSFFLTaskManager.TransactOpts, task, taskResponse, nonSignerStakesAndSignature) +} + +// SetPauserRegistry is a paid mutator transaction binding the contract method 0x10d67a2f. +// +// Solidity: function setPauserRegistry(address newPauserRegistry) returns() +func (_ContractSFFLTaskManager *ContractSFFLTaskManagerTransactor) SetPauserRegistry(opts *bind.TransactOpts, newPauserRegistry common.Address) (*types.Transaction, error) { + return _ContractSFFLTaskManager.contract.Transact(opts, "setPauserRegistry", newPauserRegistry) +} + +// SetPauserRegistry is a paid mutator transaction binding the contract method 0x10d67a2f. +// +// Solidity: function setPauserRegistry(address newPauserRegistry) returns() +func (_ContractSFFLTaskManager *ContractSFFLTaskManagerSession) SetPauserRegistry(newPauserRegistry common.Address) (*types.Transaction, error) { + return _ContractSFFLTaskManager.Contract.SetPauserRegistry(&_ContractSFFLTaskManager.TransactOpts, newPauserRegistry) +} + +// SetPauserRegistry is a paid mutator transaction binding the contract method 0x10d67a2f. +// +// Solidity: function setPauserRegistry(address newPauserRegistry) returns() +func (_ContractSFFLTaskManager *ContractSFFLTaskManagerTransactorSession) SetPauserRegistry(newPauserRegistry common.Address) (*types.Transaction, error) { + return _ContractSFFLTaskManager.Contract.SetPauserRegistry(&_ContractSFFLTaskManager.TransactOpts, newPauserRegistry) +} + +// SetStaleStakesForbidden is a paid mutator transaction binding the contract method 0x416c7e5e. +// +// Solidity: function setStaleStakesForbidden(bool value) returns() +func (_ContractSFFLTaskManager *ContractSFFLTaskManagerTransactor) SetStaleStakesForbidden(opts *bind.TransactOpts, value bool) (*types.Transaction, error) { + return _ContractSFFLTaskManager.contract.Transact(opts, "setStaleStakesForbidden", value) +} + +// SetStaleStakesForbidden is a paid mutator transaction binding the contract method 0x416c7e5e. +// +// Solidity: function setStaleStakesForbidden(bool value) returns() +func (_ContractSFFLTaskManager *ContractSFFLTaskManagerSession) SetStaleStakesForbidden(value bool) (*types.Transaction, error) { + return _ContractSFFLTaskManager.Contract.SetStaleStakesForbidden(&_ContractSFFLTaskManager.TransactOpts, value) +} + +// SetStaleStakesForbidden is a paid mutator transaction binding the contract method 0x416c7e5e. +// +// Solidity: function setStaleStakesForbidden(bool value) returns() +func (_ContractSFFLTaskManager *ContractSFFLTaskManagerTransactorSession) SetStaleStakesForbidden(value bool) (*types.Transaction, error) { + return _ContractSFFLTaskManager.Contract.SetStaleStakesForbidden(&_ContractSFFLTaskManager.TransactOpts, value) +} + +// TransferOwnership is a paid mutator transaction binding the contract method 0xf2fde38b. +// +// Solidity: function transferOwnership(address newOwner) returns() +func (_ContractSFFLTaskManager *ContractSFFLTaskManagerTransactor) TransferOwnership(opts *bind.TransactOpts, newOwner common.Address) (*types.Transaction, error) { + return _ContractSFFLTaskManager.contract.Transact(opts, "transferOwnership", newOwner) +} + +// TransferOwnership is a paid mutator transaction binding the contract method 0xf2fde38b. +// +// Solidity: function transferOwnership(address newOwner) returns() +func (_ContractSFFLTaskManager *ContractSFFLTaskManagerSession) TransferOwnership(newOwner common.Address) (*types.Transaction, error) { + return _ContractSFFLTaskManager.Contract.TransferOwnership(&_ContractSFFLTaskManager.TransactOpts, newOwner) +} + +// TransferOwnership is a paid mutator transaction binding the contract method 0xf2fde38b. +// +// Solidity: function transferOwnership(address newOwner) returns() +func (_ContractSFFLTaskManager *ContractSFFLTaskManagerTransactorSession) TransferOwnership(newOwner common.Address) (*types.Transaction, error) { + return _ContractSFFLTaskManager.Contract.TransferOwnership(&_ContractSFFLTaskManager.TransactOpts, newOwner) +} + +// Unpause is a paid mutator transaction binding the contract method 0xfabc1cbc. +// +// Solidity: function unpause(uint256 newPausedStatus) returns() +func (_ContractSFFLTaskManager *ContractSFFLTaskManagerTransactor) Unpause(opts *bind.TransactOpts, newPausedStatus *big.Int) (*types.Transaction, error) { + return _ContractSFFLTaskManager.contract.Transact(opts, "unpause", newPausedStatus) +} + +// Unpause is a paid mutator transaction binding the contract method 0xfabc1cbc. +// +// Solidity: function unpause(uint256 newPausedStatus) returns() +func (_ContractSFFLTaskManager *ContractSFFLTaskManagerSession) Unpause(newPausedStatus *big.Int) (*types.Transaction, error) { + return _ContractSFFLTaskManager.Contract.Unpause(&_ContractSFFLTaskManager.TransactOpts, newPausedStatus) +} + +// Unpause is a paid mutator transaction binding the contract method 0xfabc1cbc. +// +// Solidity: function unpause(uint256 newPausedStatus) returns() +func (_ContractSFFLTaskManager *ContractSFFLTaskManagerTransactorSession) Unpause(newPausedStatus *big.Int) (*types.Transaction, error) { + return _ContractSFFLTaskManager.Contract.Unpause(&_ContractSFFLTaskManager.TransactOpts, newPausedStatus) +} + +// ContractSFFLTaskManagerCheckpointTaskChallengedSuccessfullyIterator is returned from FilterCheckpointTaskChallengedSuccessfully and is used to iterate over the raw logs and unpacked data for CheckpointTaskChallengedSuccessfully events raised by the ContractSFFLTaskManager contract. +type ContractSFFLTaskManagerCheckpointTaskChallengedSuccessfullyIterator struct { + Event *ContractSFFLTaskManagerCheckpointTaskChallengedSuccessfully // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *ContractSFFLTaskManagerCheckpointTaskChallengedSuccessfullyIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(ContractSFFLTaskManagerCheckpointTaskChallengedSuccessfully) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(ContractSFFLTaskManagerCheckpointTaskChallengedSuccessfully) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *ContractSFFLTaskManagerCheckpointTaskChallengedSuccessfullyIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *ContractSFFLTaskManagerCheckpointTaskChallengedSuccessfullyIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// ContractSFFLTaskManagerCheckpointTaskChallengedSuccessfully represents a CheckpointTaskChallengedSuccessfully event raised by the ContractSFFLTaskManager contract. +type ContractSFFLTaskManagerCheckpointTaskChallengedSuccessfully struct { + TaskIndex uint32 + Challenger common.Address + Raw types.Log // Blockchain specific contextual infos +} + +// FilterCheckpointTaskChallengedSuccessfully is a free log retrieval operation binding the contract event 0xff48388ad5e2a6d1845a7672040fba7d9b14b22b9e0eecd37046e5313d3aebc2. +// +// Solidity: event CheckpointTaskChallengedSuccessfully(uint32 indexed taskIndex, address indexed challenger) +func (_ContractSFFLTaskManager *ContractSFFLTaskManagerFilterer) FilterCheckpointTaskChallengedSuccessfully(opts *bind.FilterOpts, taskIndex []uint32, challenger []common.Address) (*ContractSFFLTaskManagerCheckpointTaskChallengedSuccessfullyIterator, error) { + + var taskIndexRule []interface{} + for _, taskIndexItem := range taskIndex { + taskIndexRule = append(taskIndexRule, taskIndexItem) + } + var challengerRule []interface{} + for _, challengerItem := range challenger { + challengerRule = append(challengerRule, challengerItem) + } + + logs, sub, err := _ContractSFFLTaskManager.contract.FilterLogs(opts, "CheckpointTaskChallengedSuccessfully", taskIndexRule, challengerRule) + if err != nil { + return nil, err + } + return &ContractSFFLTaskManagerCheckpointTaskChallengedSuccessfullyIterator{contract: _ContractSFFLTaskManager.contract, event: "CheckpointTaskChallengedSuccessfully", logs: logs, sub: sub}, nil +} + +// WatchCheckpointTaskChallengedSuccessfully is a free log subscription operation binding the contract event 0xff48388ad5e2a6d1845a7672040fba7d9b14b22b9e0eecd37046e5313d3aebc2. +// +// Solidity: event CheckpointTaskChallengedSuccessfully(uint32 indexed taskIndex, address indexed challenger) +func (_ContractSFFLTaskManager *ContractSFFLTaskManagerFilterer) WatchCheckpointTaskChallengedSuccessfully(opts *bind.WatchOpts, sink chan<- *ContractSFFLTaskManagerCheckpointTaskChallengedSuccessfully, taskIndex []uint32, challenger []common.Address) (event.Subscription, error) { + + var taskIndexRule []interface{} + for _, taskIndexItem := range taskIndex { + taskIndexRule = append(taskIndexRule, taskIndexItem) + } + var challengerRule []interface{} + for _, challengerItem := range challenger { + challengerRule = append(challengerRule, challengerItem) + } + + logs, sub, err := _ContractSFFLTaskManager.contract.WatchLogs(opts, "CheckpointTaskChallengedSuccessfully", taskIndexRule, challengerRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(ContractSFFLTaskManagerCheckpointTaskChallengedSuccessfully) + if err := _ContractSFFLTaskManager.contract.UnpackLog(event, "CheckpointTaskChallengedSuccessfully", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseCheckpointTaskChallengedSuccessfully is a log parse operation binding the contract event 0xff48388ad5e2a6d1845a7672040fba7d9b14b22b9e0eecd37046e5313d3aebc2. +// +// Solidity: event CheckpointTaskChallengedSuccessfully(uint32 indexed taskIndex, address indexed challenger) +func (_ContractSFFLTaskManager *ContractSFFLTaskManagerFilterer) ParseCheckpointTaskChallengedSuccessfully(log types.Log) (*ContractSFFLTaskManagerCheckpointTaskChallengedSuccessfully, error) { + event := new(ContractSFFLTaskManagerCheckpointTaskChallengedSuccessfully) + if err := _ContractSFFLTaskManager.contract.UnpackLog(event, "CheckpointTaskChallengedSuccessfully", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// ContractSFFLTaskManagerCheckpointTaskChallengedUnsuccessfullyIterator is returned from FilterCheckpointTaskChallengedUnsuccessfully and is used to iterate over the raw logs and unpacked data for CheckpointTaskChallengedUnsuccessfully events raised by the ContractSFFLTaskManager contract. +type ContractSFFLTaskManagerCheckpointTaskChallengedUnsuccessfullyIterator struct { + Event *ContractSFFLTaskManagerCheckpointTaskChallengedUnsuccessfully // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *ContractSFFLTaskManagerCheckpointTaskChallengedUnsuccessfullyIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(ContractSFFLTaskManagerCheckpointTaskChallengedUnsuccessfully) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(ContractSFFLTaskManagerCheckpointTaskChallengedUnsuccessfully) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *ContractSFFLTaskManagerCheckpointTaskChallengedUnsuccessfullyIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *ContractSFFLTaskManagerCheckpointTaskChallengedUnsuccessfullyIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// ContractSFFLTaskManagerCheckpointTaskChallengedUnsuccessfully represents a CheckpointTaskChallengedUnsuccessfully event raised by the ContractSFFLTaskManager contract. +type ContractSFFLTaskManagerCheckpointTaskChallengedUnsuccessfully struct { + TaskIndex uint32 + Challenger common.Address + Raw types.Log // Blockchain specific contextual infos +} + +// FilterCheckpointTaskChallengedUnsuccessfully is a free log retrieval operation binding the contract event 0x0c6923c4a98292e75c5d677a1634527f87b6d19cf2c7d396aece99790c44a795. +// +// Solidity: event CheckpointTaskChallengedUnsuccessfully(uint32 indexed taskIndex, address indexed challenger) +func (_ContractSFFLTaskManager *ContractSFFLTaskManagerFilterer) FilterCheckpointTaskChallengedUnsuccessfully(opts *bind.FilterOpts, taskIndex []uint32, challenger []common.Address) (*ContractSFFLTaskManagerCheckpointTaskChallengedUnsuccessfullyIterator, error) { + + var taskIndexRule []interface{} + for _, taskIndexItem := range taskIndex { + taskIndexRule = append(taskIndexRule, taskIndexItem) + } + var challengerRule []interface{} + for _, challengerItem := range challenger { + challengerRule = append(challengerRule, challengerItem) + } + + logs, sub, err := _ContractSFFLTaskManager.contract.FilterLogs(opts, "CheckpointTaskChallengedUnsuccessfully", taskIndexRule, challengerRule) + if err != nil { + return nil, err + } + return &ContractSFFLTaskManagerCheckpointTaskChallengedUnsuccessfullyIterator{contract: _ContractSFFLTaskManager.contract, event: "CheckpointTaskChallengedUnsuccessfully", logs: logs, sub: sub}, nil +} + +// WatchCheckpointTaskChallengedUnsuccessfully is a free log subscription operation binding the contract event 0x0c6923c4a98292e75c5d677a1634527f87b6d19cf2c7d396aece99790c44a795. +// +// Solidity: event CheckpointTaskChallengedUnsuccessfully(uint32 indexed taskIndex, address indexed challenger) +func (_ContractSFFLTaskManager *ContractSFFLTaskManagerFilterer) WatchCheckpointTaskChallengedUnsuccessfully(opts *bind.WatchOpts, sink chan<- *ContractSFFLTaskManagerCheckpointTaskChallengedUnsuccessfully, taskIndex []uint32, challenger []common.Address) (event.Subscription, error) { + + var taskIndexRule []interface{} + for _, taskIndexItem := range taskIndex { + taskIndexRule = append(taskIndexRule, taskIndexItem) + } + var challengerRule []interface{} + for _, challengerItem := range challenger { + challengerRule = append(challengerRule, challengerItem) + } + + logs, sub, err := _ContractSFFLTaskManager.contract.WatchLogs(opts, "CheckpointTaskChallengedUnsuccessfully", taskIndexRule, challengerRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(ContractSFFLTaskManagerCheckpointTaskChallengedUnsuccessfully) + if err := _ContractSFFLTaskManager.contract.UnpackLog(event, "CheckpointTaskChallengedUnsuccessfully", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseCheckpointTaskChallengedUnsuccessfully is a log parse operation binding the contract event 0x0c6923c4a98292e75c5d677a1634527f87b6d19cf2c7d396aece99790c44a795. +// +// Solidity: event CheckpointTaskChallengedUnsuccessfully(uint32 indexed taskIndex, address indexed challenger) +func (_ContractSFFLTaskManager *ContractSFFLTaskManagerFilterer) ParseCheckpointTaskChallengedUnsuccessfully(log types.Log) (*ContractSFFLTaskManagerCheckpointTaskChallengedUnsuccessfully, error) { + event := new(ContractSFFLTaskManagerCheckpointTaskChallengedUnsuccessfully) + if err := _ContractSFFLTaskManager.contract.UnpackLog(event, "CheckpointTaskChallengedUnsuccessfully", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// ContractSFFLTaskManagerCheckpointTaskCreatedIterator is returned from FilterCheckpointTaskCreated and is used to iterate over the raw logs and unpacked data for CheckpointTaskCreated events raised by the ContractSFFLTaskManager contract. +type ContractSFFLTaskManagerCheckpointTaskCreatedIterator struct { + Event *ContractSFFLTaskManagerCheckpointTaskCreated // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *ContractSFFLTaskManagerCheckpointTaskCreatedIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(ContractSFFLTaskManagerCheckpointTaskCreated) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(ContractSFFLTaskManagerCheckpointTaskCreated) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *ContractSFFLTaskManagerCheckpointTaskCreatedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *ContractSFFLTaskManagerCheckpointTaskCreatedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// ContractSFFLTaskManagerCheckpointTaskCreated represents a CheckpointTaskCreated event raised by the ContractSFFLTaskManager contract. +type ContractSFFLTaskManagerCheckpointTaskCreated struct { + TaskIndex uint32 + Task CheckpointTask + Raw types.Log // Blockchain specific contextual infos +} + +// FilterCheckpointTaskCreated is a free log retrieval operation binding the contract event 0x78aec7310ea6fd468e3d3bbd16a806fd4987515634d5b5bf4cf4f036d9c33225. +// +// Solidity: event CheckpointTaskCreated(uint32 indexed taskIndex, (uint32,uint64,uint64,uint32,bytes) task) +func (_ContractSFFLTaskManager *ContractSFFLTaskManagerFilterer) FilterCheckpointTaskCreated(opts *bind.FilterOpts, taskIndex []uint32) (*ContractSFFLTaskManagerCheckpointTaskCreatedIterator, error) { + + var taskIndexRule []interface{} + for _, taskIndexItem := range taskIndex { + taskIndexRule = append(taskIndexRule, taskIndexItem) + } + + logs, sub, err := _ContractSFFLTaskManager.contract.FilterLogs(opts, "CheckpointTaskCreated", taskIndexRule) + if err != nil { + return nil, err + } + return &ContractSFFLTaskManagerCheckpointTaskCreatedIterator{contract: _ContractSFFLTaskManager.contract, event: "CheckpointTaskCreated", logs: logs, sub: sub}, nil +} + +// WatchCheckpointTaskCreated is a free log subscription operation binding the contract event 0x78aec7310ea6fd468e3d3bbd16a806fd4987515634d5b5bf4cf4f036d9c33225. +// +// Solidity: event CheckpointTaskCreated(uint32 indexed taskIndex, (uint32,uint64,uint64,uint32,bytes) task) +func (_ContractSFFLTaskManager *ContractSFFLTaskManagerFilterer) WatchCheckpointTaskCreated(opts *bind.WatchOpts, sink chan<- *ContractSFFLTaskManagerCheckpointTaskCreated, taskIndex []uint32) (event.Subscription, error) { + + var taskIndexRule []interface{} + for _, taskIndexItem := range taskIndex { + taskIndexRule = append(taskIndexRule, taskIndexItem) + } + + logs, sub, err := _ContractSFFLTaskManager.contract.WatchLogs(opts, "CheckpointTaskCreated", taskIndexRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(ContractSFFLTaskManagerCheckpointTaskCreated) + if err := _ContractSFFLTaskManager.contract.UnpackLog(event, "CheckpointTaskCreated", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseCheckpointTaskCreated is a log parse operation binding the contract event 0x78aec7310ea6fd468e3d3bbd16a806fd4987515634d5b5bf4cf4f036d9c33225. +// +// Solidity: event CheckpointTaskCreated(uint32 indexed taskIndex, (uint32,uint64,uint64,uint32,bytes) task) +func (_ContractSFFLTaskManager *ContractSFFLTaskManagerFilterer) ParseCheckpointTaskCreated(log types.Log) (*ContractSFFLTaskManagerCheckpointTaskCreated, error) { + event := new(ContractSFFLTaskManagerCheckpointTaskCreated) + if err := _ContractSFFLTaskManager.contract.UnpackLog(event, "CheckpointTaskCreated", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// ContractSFFLTaskManagerCheckpointTaskRespondedIterator is returned from FilterCheckpointTaskResponded and is used to iterate over the raw logs and unpacked data for CheckpointTaskResponded events raised by the ContractSFFLTaskManager contract. +type ContractSFFLTaskManagerCheckpointTaskRespondedIterator struct { + Event *ContractSFFLTaskManagerCheckpointTaskResponded // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *ContractSFFLTaskManagerCheckpointTaskRespondedIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(ContractSFFLTaskManagerCheckpointTaskResponded) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(ContractSFFLTaskManagerCheckpointTaskResponded) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *ContractSFFLTaskManagerCheckpointTaskRespondedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *ContractSFFLTaskManagerCheckpointTaskRespondedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// ContractSFFLTaskManagerCheckpointTaskResponded represents a CheckpointTaskResponded event raised by the ContractSFFLTaskManager contract. +type ContractSFFLTaskManagerCheckpointTaskResponded struct { + TaskResponse CheckpointTaskResponse + TaskResponseMetadata CheckpointTaskResponseMetadata + Raw types.Log // Blockchain specific contextual infos +} + +// FilterCheckpointTaskResponded is a free log retrieval operation binding the contract event 0x8016fcc5ad5dcf12fff2e128d239d9c6eb61f4041126bbac2c93fa8962627c1b. +// +// Solidity: event CheckpointTaskResponded((uint32,bytes32,bytes32) taskResponse, (uint32,bytes32) taskResponseMetadata) +func (_ContractSFFLTaskManager *ContractSFFLTaskManagerFilterer) FilterCheckpointTaskResponded(opts *bind.FilterOpts) (*ContractSFFLTaskManagerCheckpointTaskRespondedIterator, error) { + + logs, sub, err := _ContractSFFLTaskManager.contract.FilterLogs(opts, "CheckpointTaskResponded") + if err != nil { + return nil, err + } + return &ContractSFFLTaskManagerCheckpointTaskRespondedIterator{contract: _ContractSFFLTaskManager.contract, event: "CheckpointTaskResponded", logs: logs, sub: sub}, nil +} + +// WatchCheckpointTaskResponded is a free log subscription operation binding the contract event 0x8016fcc5ad5dcf12fff2e128d239d9c6eb61f4041126bbac2c93fa8962627c1b. +// +// Solidity: event CheckpointTaskResponded((uint32,bytes32,bytes32) taskResponse, (uint32,bytes32) taskResponseMetadata) +func (_ContractSFFLTaskManager *ContractSFFLTaskManagerFilterer) WatchCheckpointTaskResponded(opts *bind.WatchOpts, sink chan<- *ContractSFFLTaskManagerCheckpointTaskResponded) (event.Subscription, error) { + + logs, sub, err := _ContractSFFLTaskManager.contract.WatchLogs(opts, "CheckpointTaskResponded") + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(ContractSFFLTaskManagerCheckpointTaskResponded) + if err := _ContractSFFLTaskManager.contract.UnpackLog(event, "CheckpointTaskResponded", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseCheckpointTaskResponded is a log parse operation binding the contract event 0x8016fcc5ad5dcf12fff2e128d239d9c6eb61f4041126bbac2c93fa8962627c1b. +// +// Solidity: event CheckpointTaskResponded((uint32,bytes32,bytes32) taskResponse, (uint32,bytes32) taskResponseMetadata) +func (_ContractSFFLTaskManager *ContractSFFLTaskManagerFilterer) ParseCheckpointTaskResponded(log types.Log) (*ContractSFFLTaskManagerCheckpointTaskResponded, error) { + event := new(ContractSFFLTaskManagerCheckpointTaskResponded) + if err := _ContractSFFLTaskManager.contract.UnpackLog(event, "CheckpointTaskResponded", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// ContractSFFLTaskManagerInitializedIterator is returned from FilterInitialized and is used to iterate over the raw logs and unpacked data for Initialized events raised by the ContractSFFLTaskManager contract. +type ContractSFFLTaskManagerInitializedIterator struct { + Event *ContractSFFLTaskManagerInitialized // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *ContractSFFLTaskManagerInitializedIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(ContractSFFLTaskManagerInitialized) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(ContractSFFLTaskManagerInitialized) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *ContractSFFLTaskManagerInitializedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *ContractSFFLTaskManagerInitializedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// ContractSFFLTaskManagerInitialized represents a Initialized event raised by the ContractSFFLTaskManager contract. +type ContractSFFLTaskManagerInitialized struct { + Version uint8 + Raw types.Log // Blockchain specific contextual infos +} + +// FilterInitialized is a free log retrieval operation binding the contract event 0x7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498. +// +// Solidity: event Initialized(uint8 version) +func (_ContractSFFLTaskManager *ContractSFFLTaskManagerFilterer) FilterInitialized(opts *bind.FilterOpts) (*ContractSFFLTaskManagerInitializedIterator, error) { + + logs, sub, err := _ContractSFFLTaskManager.contract.FilterLogs(opts, "Initialized") + if err != nil { + return nil, err + } + return &ContractSFFLTaskManagerInitializedIterator{contract: _ContractSFFLTaskManager.contract, event: "Initialized", logs: logs, sub: sub}, nil +} + +// WatchInitialized is a free log subscription operation binding the contract event 0x7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498. +// +// Solidity: event Initialized(uint8 version) +func (_ContractSFFLTaskManager *ContractSFFLTaskManagerFilterer) WatchInitialized(opts *bind.WatchOpts, sink chan<- *ContractSFFLTaskManagerInitialized) (event.Subscription, error) { + + logs, sub, err := _ContractSFFLTaskManager.contract.WatchLogs(opts, "Initialized") + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(ContractSFFLTaskManagerInitialized) + if err := _ContractSFFLTaskManager.contract.UnpackLog(event, "Initialized", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseInitialized is a log parse operation binding the contract event 0x7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498. +// +// Solidity: event Initialized(uint8 version) +func (_ContractSFFLTaskManager *ContractSFFLTaskManagerFilterer) ParseInitialized(log types.Log) (*ContractSFFLTaskManagerInitialized, error) { + event := new(ContractSFFLTaskManagerInitialized) + if err := _ContractSFFLTaskManager.contract.UnpackLog(event, "Initialized", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// ContractSFFLTaskManagerOwnershipTransferredIterator is returned from FilterOwnershipTransferred and is used to iterate over the raw logs and unpacked data for OwnershipTransferred events raised by the ContractSFFLTaskManager contract. +type ContractSFFLTaskManagerOwnershipTransferredIterator struct { + Event *ContractSFFLTaskManagerOwnershipTransferred // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *ContractSFFLTaskManagerOwnershipTransferredIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(ContractSFFLTaskManagerOwnershipTransferred) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(ContractSFFLTaskManagerOwnershipTransferred) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *ContractSFFLTaskManagerOwnershipTransferredIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *ContractSFFLTaskManagerOwnershipTransferredIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// ContractSFFLTaskManagerOwnershipTransferred represents a OwnershipTransferred event raised by the ContractSFFLTaskManager contract. +type ContractSFFLTaskManagerOwnershipTransferred struct { + PreviousOwner common.Address + NewOwner common.Address + Raw types.Log // Blockchain specific contextual infos +} + +// FilterOwnershipTransferred is a free log retrieval operation binding the contract event 0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0. +// +// Solidity: event OwnershipTransferred(address indexed previousOwner, address indexed newOwner) +func (_ContractSFFLTaskManager *ContractSFFLTaskManagerFilterer) FilterOwnershipTransferred(opts *bind.FilterOpts, previousOwner []common.Address, newOwner []common.Address) (*ContractSFFLTaskManagerOwnershipTransferredIterator, error) { + + var previousOwnerRule []interface{} + for _, previousOwnerItem := range previousOwner { + previousOwnerRule = append(previousOwnerRule, previousOwnerItem) + } + var newOwnerRule []interface{} + for _, newOwnerItem := range newOwner { + newOwnerRule = append(newOwnerRule, newOwnerItem) + } + + logs, sub, err := _ContractSFFLTaskManager.contract.FilterLogs(opts, "OwnershipTransferred", previousOwnerRule, newOwnerRule) + if err != nil { + return nil, err + } + return &ContractSFFLTaskManagerOwnershipTransferredIterator{contract: _ContractSFFLTaskManager.contract, event: "OwnershipTransferred", logs: logs, sub: sub}, nil +} + +// WatchOwnershipTransferred is a free log subscription operation binding the contract event 0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0. +// +// Solidity: event OwnershipTransferred(address indexed previousOwner, address indexed newOwner) +func (_ContractSFFLTaskManager *ContractSFFLTaskManagerFilterer) WatchOwnershipTransferred(opts *bind.WatchOpts, sink chan<- *ContractSFFLTaskManagerOwnershipTransferred, previousOwner []common.Address, newOwner []common.Address) (event.Subscription, error) { + + var previousOwnerRule []interface{} + for _, previousOwnerItem := range previousOwner { + previousOwnerRule = append(previousOwnerRule, previousOwnerItem) + } + var newOwnerRule []interface{} + for _, newOwnerItem := range newOwner { + newOwnerRule = append(newOwnerRule, newOwnerItem) + } + + logs, sub, err := _ContractSFFLTaskManager.contract.WatchLogs(opts, "OwnershipTransferred", previousOwnerRule, newOwnerRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(ContractSFFLTaskManagerOwnershipTransferred) + if err := _ContractSFFLTaskManager.contract.UnpackLog(event, "OwnershipTransferred", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseOwnershipTransferred is a log parse operation binding the contract event 0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0. +// +// Solidity: event OwnershipTransferred(address indexed previousOwner, address indexed newOwner) +func (_ContractSFFLTaskManager *ContractSFFLTaskManagerFilterer) ParseOwnershipTransferred(log types.Log) (*ContractSFFLTaskManagerOwnershipTransferred, error) { + event := new(ContractSFFLTaskManagerOwnershipTransferred) + if err := _ContractSFFLTaskManager.contract.UnpackLog(event, "OwnershipTransferred", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// ContractSFFLTaskManagerPausedIterator is returned from FilterPaused and is used to iterate over the raw logs and unpacked data for Paused events raised by the ContractSFFLTaskManager contract. +type ContractSFFLTaskManagerPausedIterator struct { + Event *ContractSFFLTaskManagerPaused // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *ContractSFFLTaskManagerPausedIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(ContractSFFLTaskManagerPaused) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(ContractSFFLTaskManagerPaused) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *ContractSFFLTaskManagerPausedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *ContractSFFLTaskManagerPausedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// ContractSFFLTaskManagerPaused represents a Paused event raised by the ContractSFFLTaskManager contract. +type ContractSFFLTaskManagerPaused struct { + Account common.Address + NewPausedStatus *big.Int + Raw types.Log // Blockchain specific contextual infos +} + +// FilterPaused is a free log retrieval operation binding the contract event 0xab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d. +// +// Solidity: event Paused(address indexed account, uint256 newPausedStatus) +func (_ContractSFFLTaskManager *ContractSFFLTaskManagerFilterer) FilterPaused(opts *bind.FilterOpts, account []common.Address) (*ContractSFFLTaskManagerPausedIterator, error) { + + var accountRule []interface{} + for _, accountItem := range account { + accountRule = append(accountRule, accountItem) + } + + logs, sub, err := _ContractSFFLTaskManager.contract.FilterLogs(opts, "Paused", accountRule) + if err != nil { + return nil, err + } + return &ContractSFFLTaskManagerPausedIterator{contract: _ContractSFFLTaskManager.contract, event: "Paused", logs: logs, sub: sub}, nil +} + +// WatchPaused is a free log subscription operation binding the contract event 0xab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d. +// +// Solidity: event Paused(address indexed account, uint256 newPausedStatus) +func (_ContractSFFLTaskManager *ContractSFFLTaskManagerFilterer) WatchPaused(opts *bind.WatchOpts, sink chan<- *ContractSFFLTaskManagerPaused, account []common.Address) (event.Subscription, error) { + + var accountRule []interface{} + for _, accountItem := range account { + accountRule = append(accountRule, accountItem) + } + + logs, sub, err := _ContractSFFLTaskManager.contract.WatchLogs(opts, "Paused", accountRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(ContractSFFLTaskManagerPaused) + if err := _ContractSFFLTaskManager.contract.UnpackLog(event, "Paused", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParsePaused is a log parse operation binding the contract event 0xab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d. +// +// Solidity: event Paused(address indexed account, uint256 newPausedStatus) +func (_ContractSFFLTaskManager *ContractSFFLTaskManagerFilterer) ParsePaused(log types.Log) (*ContractSFFLTaskManagerPaused, error) { + event := new(ContractSFFLTaskManagerPaused) + if err := _ContractSFFLTaskManager.contract.UnpackLog(event, "Paused", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// ContractSFFLTaskManagerPauserRegistrySetIterator is returned from FilterPauserRegistrySet and is used to iterate over the raw logs and unpacked data for PauserRegistrySet events raised by the ContractSFFLTaskManager contract. +type ContractSFFLTaskManagerPauserRegistrySetIterator struct { + Event *ContractSFFLTaskManagerPauserRegistrySet // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *ContractSFFLTaskManagerPauserRegistrySetIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(ContractSFFLTaskManagerPauserRegistrySet) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(ContractSFFLTaskManagerPauserRegistrySet) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *ContractSFFLTaskManagerPauserRegistrySetIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *ContractSFFLTaskManagerPauserRegistrySetIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// ContractSFFLTaskManagerPauserRegistrySet represents a PauserRegistrySet event raised by the ContractSFFLTaskManager contract. +type ContractSFFLTaskManagerPauserRegistrySet struct { + PauserRegistry common.Address + NewPauserRegistry common.Address + Raw types.Log // Blockchain specific contextual infos +} + +// FilterPauserRegistrySet is a free log retrieval operation binding the contract event 0x6e9fcd539896fca60e8b0f01dd580233e48a6b0f7df013b89ba7f565869acdb6. +// +// Solidity: event PauserRegistrySet(address pauserRegistry, address newPauserRegistry) +func (_ContractSFFLTaskManager *ContractSFFLTaskManagerFilterer) FilterPauserRegistrySet(opts *bind.FilterOpts) (*ContractSFFLTaskManagerPauserRegistrySetIterator, error) { + + logs, sub, err := _ContractSFFLTaskManager.contract.FilterLogs(opts, "PauserRegistrySet") + if err != nil { + return nil, err + } + return &ContractSFFLTaskManagerPauserRegistrySetIterator{contract: _ContractSFFLTaskManager.contract, event: "PauserRegistrySet", logs: logs, sub: sub}, nil +} + +// WatchPauserRegistrySet is a free log subscription operation binding the contract event 0x6e9fcd539896fca60e8b0f01dd580233e48a6b0f7df013b89ba7f565869acdb6. +// +// Solidity: event PauserRegistrySet(address pauserRegistry, address newPauserRegistry) +func (_ContractSFFLTaskManager *ContractSFFLTaskManagerFilterer) WatchPauserRegistrySet(opts *bind.WatchOpts, sink chan<- *ContractSFFLTaskManagerPauserRegistrySet) (event.Subscription, error) { + + logs, sub, err := _ContractSFFLTaskManager.contract.WatchLogs(opts, "PauserRegistrySet") + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(ContractSFFLTaskManagerPauserRegistrySet) + if err := _ContractSFFLTaskManager.contract.UnpackLog(event, "PauserRegistrySet", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParsePauserRegistrySet is a log parse operation binding the contract event 0x6e9fcd539896fca60e8b0f01dd580233e48a6b0f7df013b89ba7f565869acdb6. +// +// Solidity: event PauserRegistrySet(address pauserRegistry, address newPauserRegistry) +func (_ContractSFFLTaskManager *ContractSFFLTaskManagerFilterer) ParsePauserRegistrySet(log types.Log) (*ContractSFFLTaskManagerPauserRegistrySet, error) { + event := new(ContractSFFLTaskManagerPauserRegistrySet) + if err := _ContractSFFLTaskManager.contract.UnpackLog(event, "PauserRegistrySet", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// ContractSFFLTaskManagerStaleStakesForbiddenUpdateIterator is returned from FilterStaleStakesForbiddenUpdate and is used to iterate over the raw logs and unpacked data for StaleStakesForbiddenUpdate events raised by the ContractSFFLTaskManager contract. +type ContractSFFLTaskManagerStaleStakesForbiddenUpdateIterator struct { + Event *ContractSFFLTaskManagerStaleStakesForbiddenUpdate // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *ContractSFFLTaskManagerStaleStakesForbiddenUpdateIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(ContractSFFLTaskManagerStaleStakesForbiddenUpdate) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(ContractSFFLTaskManagerStaleStakesForbiddenUpdate) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *ContractSFFLTaskManagerStaleStakesForbiddenUpdateIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *ContractSFFLTaskManagerStaleStakesForbiddenUpdateIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// ContractSFFLTaskManagerStaleStakesForbiddenUpdate represents a StaleStakesForbiddenUpdate event raised by the ContractSFFLTaskManager contract. +type ContractSFFLTaskManagerStaleStakesForbiddenUpdate struct { + Value bool + Raw types.Log // Blockchain specific contextual infos +} + +// FilterStaleStakesForbiddenUpdate is a free log retrieval operation binding the contract event 0x40e4ed880a29e0f6ddce307457fb75cddf4feef7d3ecb0301bfdf4976a0e2dfc. +// +// Solidity: event StaleStakesForbiddenUpdate(bool value) +func (_ContractSFFLTaskManager *ContractSFFLTaskManagerFilterer) FilterStaleStakesForbiddenUpdate(opts *bind.FilterOpts) (*ContractSFFLTaskManagerStaleStakesForbiddenUpdateIterator, error) { + + logs, sub, err := _ContractSFFLTaskManager.contract.FilterLogs(opts, "StaleStakesForbiddenUpdate") + if err != nil { + return nil, err + } + return &ContractSFFLTaskManagerStaleStakesForbiddenUpdateIterator{contract: _ContractSFFLTaskManager.contract, event: "StaleStakesForbiddenUpdate", logs: logs, sub: sub}, nil +} + +// WatchStaleStakesForbiddenUpdate is a free log subscription operation binding the contract event 0x40e4ed880a29e0f6ddce307457fb75cddf4feef7d3ecb0301bfdf4976a0e2dfc. +// +// Solidity: event StaleStakesForbiddenUpdate(bool value) +func (_ContractSFFLTaskManager *ContractSFFLTaskManagerFilterer) WatchStaleStakesForbiddenUpdate(opts *bind.WatchOpts, sink chan<- *ContractSFFLTaskManagerStaleStakesForbiddenUpdate) (event.Subscription, error) { + + logs, sub, err := _ContractSFFLTaskManager.contract.WatchLogs(opts, "StaleStakesForbiddenUpdate") + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(ContractSFFLTaskManagerStaleStakesForbiddenUpdate) + if err := _ContractSFFLTaskManager.contract.UnpackLog(event, "StaleStakesForbiddenUpdate", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseStaleStakesForbiddenUpdate is a log parse operation binding the contract event 0x40e4ed880a29e0f6ddce307457fb75cddf4feef7d3ecb0301bfdf4976a0e2dfc. +// +// Solidity: event StaleStakesForbiddenUpdate(bool value) +func (_ContractSFFLTaskManager *ContractSFFLTaskManagerFilterer) ParseStaleStakesForbiddenUpdate(log types.Log) (*ContractSFFLTaskManagerStaleStakesForbiddenUpdate, error) { + event := new(ContractSFFLTaskManagerStaleStakesForbiddenUpdate) + if err := _ContractSFFLTaskManager.contract.UnpackLog(event, "StaleStakesForbiddenUpdate", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// ContractSFFLTaskManagerUnpausedIterator is returned from FilterUnpaused and is used to iterate over the raw logs and unpacked data for Unpaused events raised by the ContractSFFLTaskManager contract. +type ContractSFFLTaskManagerUnpausedIterator struct { + Event *ContractSFFLTaskManagerUnpaused // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *ContractSFFLTaskManagerUnpausedIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(ContractSFFLTaskManagerUnpaused) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(ContractSFFLTaskManagerUnpaused) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *ContractSFFLTaskManagerUnpausedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *ContractSFFLTaskManagerUnpausedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// ContractSFFLTaskManagerUnpaused represents a Unpaused event raised by the ContractSFFLTaskManager contract. +type ContractSFFLTaskManagerUnpaused struct { + Account common.Address + NewPausedStatus *big.Int + Raw types.Log // Blockchain specific contextual infos +} + +// FilterUnpaused is a free log retrieval operation binding the contract event 0x3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c. +// +// Solidity: event Unpaused(address indexed account, uint256 newPausedStatus) +func (_ContractSFFLTaskManager *ContractSFFLTaskManagerFilterer) FilterUnpaused(opts *bind.FilterOpts, account []common.Address) (*ContractSFFLTaskManagerUnpausedIterator, error) { + + var accountRule []interface{} + for _, accountItem := range account { + accountRule = append(accountRule, accountItem) + } + + logs, sub, err := _ContractSFFLTaskManager.contract.FilterLogs(opts, "Unpaused", accountRule) + if err != nil { + return nil, err + } + return &ContractSFFLTaskManagerUnpausedIterator{contract: _ContractSFFLTaskManager.contract, event: "Unpaused", logs: logs, sub: sub}, nil +} + +// WatchUnpaused is a free log subscription operation binding the contract event 0x3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c. +// +// Solidity: event Unpaused(address indexed account, uint256 newPausedStatus) +func (_ContractSFFLTaskManager *ContractSFFLTaskManagerFilterer) WatchUnpaused(opts *bind.WatchOpts, sink chan<- *ContractSFFLTaskManagerUnpaused, account []common.Address) (event.Subscription, error) { + + var accountRule []interface{} + for _, accountItem := range account { + accountRule = append(accountRule, accountItem) + } + + logs, sub, err := _ContractSFFLTaskManager.contract.WatchLogs(opts, "Unpaused", accountRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(ContractSFFLTaskManagerUnpaused) + if err := _ContractSFFLTaskManager.contract.UnpackLog(event, "Unpaused", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseUnpaused is a log parse operation binding the contract event 0x3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c. +// +// Solidity: event Unpaused(address indexed account, uint256 newPausedStatus) +func (_ContractSFFLTaskManager *ContractSFFLTaskManagerFilterer) ParseUnpaused(log types.Log) (*ContractSFFLTaskManagerUnpaused, error) { + event := new(ContractSFFLTaskManagerUnpaused) + if err := _ContractSFFLTaskManager.contract.UnpackLog(event, "Unpaused", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} diff --git a/contracts/evm/src/eth/SFFLTaskManager.sol b/contracts/evm/src/eth/SFFLTaskManager.sol index e48226a5..a9e7f41d 100644 --- a/contracts/evm/src/eth/SFFLTaskManager.sol +++ b/contracts/evm/src/eth/SFFLTaskManager.sol @@ -34,8 +34,10 @@ contract SFFLTaskManager is Initializable, OwnableUpgradeable, Pausable, BLSSign /** * @dev Denominator for thresholds + * TODO: Possibly change this to a higher amount if 100 is not hardcoded in + * eigensdk */ - uint32 public constant THRESHOLD_DENOMINATOR = 1000000000; + uint32 public constant THRESHOLD_DENOMINATOR = 100; /** * @notice Next checkpoint task number diff --git a/contracts/evm/src/rollup/utils/Operators.sol b/contracts/evm/src/rollup/utils/Operators.sol index 7bf3da26..e01db597 100644 --- a/contracts/evm/src/rollup/utils/Operators.sol +++ b/contracts/evm/src/rollup/utils/Operators.sol @@ -17,7 +17,7 @@ library Operators { /** * @dev Denominator for quorum weight thresholds */ - uint128 internal constant THRESHOLD_DENOMINATOR = 1000000000; + uint128 internal constant THRESHOLD_DENOMINATOR = 100; /** * @dev Gas for checking pairing equality on ecpairing call. Based on * Eigenlayer's BLSSignatureChecker diff --git a/contracts/evm/test/SFFLRegistryRollup.t.sol b/contracts/evm/test/SFFLRegistryRollup.t.sol index ea440247..463b009a 100644 --- a/contracts/evm/test/SFFLRegistryRollup.t.sol +++ b/contracts/evm/test/SFFLRegistryRollup.t.sol @@ -21,7 +21,7 @@ contract SFFLRegistryRollupTest is TestUtils { Operators.Operator[] public extraOperators; uint128 public constant DEFAULT_WEIGHT = 100; - uint128 public QUORUM_THRESHOLD = 2 * uint128(1000000000) / 3; + uint128 public QUORUM_THRESHOLD = 2 * uint128(100) / 3; event StateRootUpdated(uint32 indexed rollupId, uint64 indexed blockHeight, bytes32 stateRoot); event OperatorUpdated(bytes32 indexed pubkeyHash, uint128 weight); @@ -282,13 +282,15 @@ contract SFFLRegistryRollupTest is TestUtils { function test_setQuorumThreshold() public { assertEq(registry.getQuorumThreshold(), QUORUM_THRESHOLD); + uint128 denominator = registry.THRESHOLD_DENOMINATOR(); + vm.expectEmit(true, false, false, false); - emit QuorumThresholdUpdated(1000); + emit QuorumThresholdUpdated(denominator - 1); vm.prank(addr("owner")); - registry.setQuorumThreshold(1000); + registry.setQuorumThreshold(denominator - 1); - assertEq(registry.getQuorumThreshold(), 1000); + assertEq(registry.getQuorumThreshold(), denominator - 1); } function test_setQuorumThreshold_RevertWhen_CallerNotOwner() public { diff --git a/contracts/generate-go-bindings.sh b/contracts/generate-go-bindings.sh new file mode 100644 index 00000000..ab75dba3 --- /dev/null +++ b/contracts/generate-go-bindings.sh @@ -0,0 +1,31 @@ +#!/bin/bash + +function create_binding { + contract_dir=$1 + contract=$2 + binding_dir=$3 + echo "generating bindings for" $contract + mkdir -p $binding_dir/${contract} + contract_json="$contract_dir/evm/out/${contract}.sol/${contract}.json" + solc_abi=$(cat ${contract_json} | jq -r '.abi') + solc_bin=$(cat ${contract_json} | jq -r '.bytecode.object') + + mkdir -p tmp + echo ${solc_abi} >tmp/tmp.abi + echo ${solc_bin} >tmp/tmp.bin + + rm -f $binding_dir/${contract}/binding.go + abigen --bin=tmp/tmp.bin --abi=tmp/tmp.abi --pkg=contract${contract} --out=$binding_dir/${contract}/binding.go + rm -rf tmp +} + +rm -rf bindings/* +forge clean --root ./evm +forge build --root ./evm + +avs_service_contracts="SFFLServiceManager SFFLTaskManager SFFLRegistryRollup" +for contract in $avs_service_contracts; do + create_binding . $contract ./bindings +done + +create_binding . ERC20Mock ./bindings diff --git a/core/chainio/avs_reader.go b/core/chainio/avs_reader.go new file mode 100644 index 00000000..13a25fc2 --- /dev/null +++ b/core/chainio/avs_reader.go @@ -0,0 +1,76 @@ +package chainio + +import ( + "context" + + "github.com/ethereum/go-ethereum/accounts/abi/bind" + gethcommon "github.com/ethereum/go-ethereum/common" + + sdkavsregistry "github.com/Layr-Labs/eigensdk-go/chainio/clients/avsregistry" + "github.com/Layr-Labs/eigensdk-go/chainio/clients/eth" + logging "github.com/Layr-Labs/eigensdk-go/logging" + + erc20mock "github.com/NethermindEth/near-sffl/contracts/bindings/ERC20Mock" + taskmanager "github.com/NethermindEth/near-sffl/contracts/bindings/SFFLTaskManager" + "github.com/NethermindEth/near-sffl/core/config" +) + +type AvsReaderer interface { + sdkavsregistry.AvsRegistryReader + + CheckSignatures( + ctx context.Context, msgHash [32]byte, quorumNumbers []byte, referenceBlockNumber uint32, nonSignerStakesAndSignature taskmanager.IBLSSignatureCheckerNonSignerStakesAndSignature, + ) (taskmanager.IBLSSignatureCheckerQuorumStakeTotals, error) + GetErc20Mock(ctx context.Context, tokenAddr gethcommon.Address) (*erc20mock.ContractERC20Mock, error) +} + +type AvsReader struct { + sdkavsregistry.AvsRegistryReader + AvsServiceBindings *AvsManagersBindings + logger logging.Logger +} + +var _ AvsReaderer = (*AvsReader)(nil) + +func BuildAvsReaderFromConfig(c *config.Config) (*AvsReader, error) { + return BuildAvsReader(c.SFFLRegistryCoordinatorAddr, c.OperatorStateRetrieverAddr, c.EthHttpClient, c.Logger) +} +func BuildAvsReader(registryCoordinatorAddr, operatorStateRetrieverAddr gethcommon.Address, ethHttpClient eth.EthClient, logger logging.Logger) (*AvsReader, error) { + avsManagersBindings, err := NewAvsManagersBindings(registryCoordinatorAddr, operatorStateRetrieverAddr, ethHttpClient, logger) + if err != nil { + return nil, err + } + avsRegistryReader, err := sdkavsregistry.BuildAvsRegistryChainReader(registryCoordinatorAddr, operatorStateRetrieverAddr, ethHttpClient, logger) + if err != nil { + return nil, err + } + return NewAvsReader(avsRegistryReader, avsManagersBindings, logger) +} +func NewAvsReader(avsRegistryReader sdkavsregistry.AvsRegistryReader, avsServiceBindings *AvsManagersBindings, logger logging.Logger) (*AvsReader, error) { + return &AvsReader{ + AvsRegistryReader: avsRegistryReader, + AvsServiceBindings: avsServiceBindings, + logger: logger, + }, nil +} + +func (r *AvsReader) CheckSignatures( + ctx context.Context, msgHash [32]byte, quorumNumbers []byte, referenceBlockNumber uint32, nonSignerStakesAndSignature taskmanager.IBLSSignatureCheckerNonSignerStakesAndSignature, +) (taskmanager.IBLSSignatureCheckerQuorumStakeTotals, error) { + stakeTotalsPerQuorum, _, err := r.AvsServiceBindings.TaskManager.CheckSignatures( + &bind.CallOpts{}, msgHash, quorumNumbers, referenceBlockNumber, nonSignerStakesAndSignature, + ) + if err != nil { + return taskmanager.IBLSSignatureCheckerQuorumStakeTotals{}, err + } + return stakeTotalsPerQuorum, nil +} + +func (r *AvsReader) GetErc20Mock(ctx context.Context, tokenAddr gethcommon.Address) (*erc20mock.ContractERC20Mock, error) { + erc20Mock, err := r.AvsServiceBindings.GetErc20Mock(tokenAddr) + if err != nil { + r.logger.Error("Failed to fetch ERC20Mock contract", "err", err) + return nil, err + } + return erc20Mock, nil +} diff --git a/core/chainio/avs_subscriber.go b/core/chainio/avs_subscriber.go new file mode 100644 index 00000000..7ba03af1 --- /dev/null +++ b/core/chainio/avs_subscriber.go @@ -0,0 +1,80 @@ +package chainio + +import ( + "github.com/ethereum/go-ethereum/accounts/abi/bind" + gethcommon "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/event" + + "github.com/Layr-Labs/eigensdk-go/chainio/clients/eth" + sdklogging "github.com/Layr-Labs/eigensdk-go/logging" + + taskmanager "github.com/NethermindEth/near-sffl/contracts/bindings/SFFLTaskManager" + "github.com/NethermindEth/near-sffl/core/config" +) + +type AvsSubscriberer interface { + SubscribeToNewTasks(checkpointTaskCreatedChan chan *taskmanager.ContractSFFLTaskManagerCheckpointTaskCreated) event.Subscription + SubscribeToTaskResponses(taskResponseLogs chan *taskmanager.ContractSFFLTaskManagerCheckpointTaskResponded) event.Subscription + ParseCheckpointTaskResponded(rawLog types.Log) (*taskmanager.ContractSFFLTaskManagerCheckpointTaskResponded, error) +} + +// Subscribers use a ws connection instead of http connection like Readers +// kind of stupid that the geth client doesn't have a unified interface for both... +// it takes a single url, so the bindings, even though they have watcher functions, those can't be used +// with the http connection... seems very very stupid. Am I missing something? +type AvsSubscriber struct { + AvsContractBindings *AvsManagersBindings + logger sdklogging.Logger +} + +func BuildAvsSubscriberFromConfig(config *config.Config) (*AvsSubscriber, error) { + return BuildAvsSubscriber( + config.SFFLRegistryCoordinatorAddr, + config.OperatorStateRetrieverAddr, + config.EthWsClient, + config.Logger, + ) +} + +func BuildAvsSubscriber(registryCoordinatorAddr, blsOperatorStateRetrieverAddr gethcommon.Address, ethclient eth.EthClient, logger sdklogging.Logger) (*AvsSubscriber, error) { + avsContractBindings, err := NewAvsManagersBindings(registryCoordinatorAddr, blsOperatorStateRetrieverAddr, ethclient, logger) + if err != nil { + logger.Errorf("Failed to create contract bindings", "err", err) + return nil, err + } + return NewAvsSubscriber(avsContractBindings, logger), nil +} + +func NewAvsSubscriber(avsContractBindings *AvsManagersBindings, logger sdklogging.Logger) *AvsSubscriber { + return &AvsSubscriber{ + AvsContractBindings: avsContractBindings, + logger: logger, + } +} + +func (s *AvsSubscriber) SubscribeToNewTasks(checkpointTaskCreatedChan chan *taskmanager.ContractSFFLTaskManagerCheckpointTaskCreated) event.Subscription { + sub, err := s.AvsContractBindings.TaskManager.WatchCheckpointTaskCreated( + &bind.WatchOpts{}, checkpointTaskCreatedChan, nil, + ) + if err != nil { + s.logger.Error("Failed to subscribe to new TaskManager tasks", "err", err) + } + s.logger.Infof("Subscribed to new TaskManager tasks") + return sub +} + +func (s *AvsSubscriber) SubscribeToTaskResponses(taskResponseChan chan *taskmanager.ContractSFFLTaskManagerCheckpointTaskResponded) event.Subscription { + sub, err := s.AvsContractBindings.TaskManager.WatchCheckpointTaskResponded( + &bind.WatchOpts{}, taskResponseChan, + ) + if err != nil { + s.logger.Error("Failed to subscribe to CheckpointTaskResponded events", "err", err) + } + s.logger.Infof("Subscribed to CheckpointTaskResponded events") + return sub +} + +func (s *AvsSubscriber) ParseCheckpointTaskResponded(rawLog types.Log) (*taskmanager.ContractSFFLTaskManagerCheckpointTaskResponded, error) { + return s.AvsContractBindings.TaskManager.ContractSFFLTaskManagerFilterer.ParseCheckpointTaskResponded(rawLog) +} diff --git a/core/chainio/avs_writer.go b/core/chainio/avs_writer.go new file mode 100644 index 00000000..9da9edfb --- /dev/null +++ b/core/chainio/avs_writer.go @@ -0,0 +1,148 @@ +package chainio + +import ( + "context" + + gethcommon "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/types" + + "github.com/Layr-Labs/eigensdk-go/chainio/clients/avsregistry" + "github.com/Layr-Labs/eigensdk-go/chainio/clients/eth" + "github.com/Layr-Labs/eigensdk-go/chainio/txmgr" + logging "github.com/Layr-Labs/eigensdk-go/logging" + + taskmanager "github.com/NethermindEth/near-sffl/contracts/bindings/SFFLTaskManager" + "github.com/NethermindEth/near-sffl/core/config" +) + +type AvsWriterer interface { + avsregistry.AvsRegistryWriter + + SendNewCheckpointTask( + ctx context.Context, + fromNearBlock uint64, + toNearBlock uint64, + quorumThreshold uint32, + quorumNumbers []byte, + ) (taskmanager.CheckpointTask, uint32, error) + RaiseChallenge( + ctx context.Context, + task taskmanager.CheckpointTask, + taskResponse taskmanager.CheckpointTaskResponse, + taskResponseMetadata taskmanager.CheckpointTaskResponseMetadata, + pubkeysOfNonSigningOperators []taskmanager.BN254G1Point, + ) (*types.Receipt, error) + SendAggregatedResponse(ctx context.Context, + task taskmanager.CheckpointTask, + taskResponse taskmanager.CheckpointTaskResponse, + nonSignerStakesAndSignature taskmanager.IBLSSignatureCheckerNonSignerStakesAndSignature, + ) (*types.Receipt, error) +} + +type AvsWriter struct { + avsregistry.AvsRegistryWriter + AvsContractBindings *AvsManagersBindings + logger logging.Logger + TxMgr txmgr.TxManager + client eth.EthClient +} + +var _ AvsWriterer = (*AvsWriter)(nil) + +func BuildAvsWriterFromConfig(c *config.Config) (*AvsWriter, error) { + return BuildAvsWriter(c.TxMgr, c.SFFLRegistryCoordinatorAddr, c.OperatorStateRetrieverAddr, c.EthHttpClient, c.Logger) +} + +func BuildAvsWriter(txMgr txmgr.TxManager, registryCoordinatorAddr, operatorStateRetrieverAddr gethcommon.Address, ethHttpClient eth.EthClient, logger logging.Logger) (*AvsWriter, error) { + avsServiceBindings, err := NewAvsManagersBindings(registryCoordinatorAddr, operatorStateRetrieverAddr, ethHttpClient, logger) + if err != nil { + logger.Error("Failed to create contract bindings", "err", err) + return nil, err + } + avsRegistryWriter, err := avsregistry.BuildAvsRegistryChainWriter(registryCoordinatorAddr, operatorStateRetrieverAddr, logger, ethHttpClient, txMgr) + if err != nil { + return nil, err + } + return NewAvsWriter(avsRegistryWriter, avsServiceBindings, logger, txMgr), nil +} +func NewAvsWriter(avsRegistryWriter avsregistry.AvsRegistryWriter, avsServiceBindings *AvsManagersBindings, logger logging.Logger, txMgr txmgr.TxManager) *AvsWriter { + return &AvsWriter{ + AvsRegistryWriter: avsRegistryWriter, + AvsContractBindings: avsServiceBindings, + logger: logger, + TxMgr: txMgr, + } +} + +// returns the tx receipt, as well as the task index (which it gets from parsing the tx receipt logs) +func (w *AvsWriter) SendNewCheckpointTask(ctx context.Context, fromNearBlock uint64, toNearBlock uint64, quorumThreshold uint32, quorumNumbers []byte) (taskmanager.CheckpointTask, uint32, error) { + txOpts, err := w.TxMgr.GetNoSendTxOpts() + if err != nil { + w.logger.Errorf("Error getting tx opts") + return taskmanager.CheckpointTask{}, 0, err + } + tx, err := w.AvsContractBindings.TaskManager.CreateCheckpointTask(txOpts, fromNearBlock, toNearBlock, quorumThreshold, quorumNumbers) + if err != nil { + w.logger.Errorf("Error assembling CreateCheckpointTask tx") + return taskmanager.CheckpointTask{}, 0, err + } + receipt, err := w.TxMgr.Send(ctx, tx) + if err != nil { + w.logger.Errorf("Error submitting CreateCheckpointTask tx") + return taskmanager.CheckpointTask{}, 0, err + } + checkpointTaskCreatedEvent, err := w.AvsContractBindings.TaskManager.ContractSFFLTaskManagerFilterer.ParseCheckpointTaskCreated(*receipt.Logs[0]) + if err != nil { + w.logger.Error("Aggregator failed to parse new task created event", "err", err) + return taskmanager.CheckpointTask{}, 0, err + } + return checkpointTaskCreatedEvent.Task, checkpointTaskCreatedEvent.TaskIndex, nil +} + +func (w *AvsWriter) SendAggregatedResponse( + ctx context.Context, task taskmanager.CheckpointTask, + taskResponse taskmanager.CheckpointTaskResponse, + nonSignerStakesAndSignature taskmanager.IBLSSignatureCheckerNonSignerStakesAndSignature, +) (*types.Receipt, error) { + txOpts, err := w.TxMgr.GetNoSendTxOpts() + if err != nil { + w.logger.Errorf("Error getting tx opts") + return nil, err + } + tx, err := w.AvsContractBindings.TaskManager.RespondToCheckpointTask(txOpts, task, taskResponse, nonSignerStakesAndSignature) + if err != nil { + w.logger.Error("Error submitting SubmitTaskResponse tx while calling respondToTask", "err", err) + return nil, err + } + receipt, err := w.TxMgr.Send(ctx, tx) + if err != nil { + w.logger.Errorf("Error submitting CreateCheckpointTask tx") + return nil, err + } + return receipt, nil +} + +func (w *AvsWriter) RaiseChallenge( + ctx context.Context, + task taskmanager.CheckpointTask, + taskResponse taskmanager.CheckpointTaskResponse, + taskResponseMetadata taskmanager.CheckpointTaskResponseMetadata, + pubkeysOfNonSigningOperators []taskmanager.BN254G1Point, +) (*types.Receipt, error) { + txOpts, err := w.TxMgr.GetNoSendTxOpts() + if err != nil { + w.logger.Errorf("Error getting tx opts") + return nil, err + } + tx, err := w.AvsContractBindings.TaskManager.RaiseAndResolveCheckpointChallenge(txOpts, task, taskResponse, taskResponseMetadata, pubkeysOfNonSigningOperators) + if err != nil { + w.logger.Errorf("Error assembling RaiseChallenge tx") + return nil, err + } + receipt, err := w.TxMgr.Send(ctx, tx) + if err != nil { + w.logger.Errorf("Error submitting CreateCheckpointTask tx") + return nil, err + } + return receipt, nil +} diff --git a/core/chainio/bindings.go b/core/chainio/bindings.go new file mode 100644 index 00000000..a582834b --- /dev/null +++ b/core/chainio/bindings.go @@ -0,0 +1,65 @@ +package chainio + +import ( + "github.com/Layr-Labs/eigensdk-go/chainio/clients/eth" + "github.com/Layr-Labs/eigensdk-go/logging" + + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/common" + gethcommon "github.com/ethereum/go-ethereum/common" + + regcoord "github.com/Layr-Labs/eigensdk-go/contracts/bindings/RegistryCoordinator" + erc20mock "github.com/NethermindEth/near-sffl/contracts/bindings/ERC20Mock" + csservicemanager "github.com/NethermindEth/near-sffl/contracts/bindings/SFFLServiceManager" + taskmanager "github.com/NethermindEth/near-sffl/contracts/bindings/SFFLTaskManager" +) + +type AvsManagersBindings struct { + TaskManager *taskmanager.ContractSFFLTaskManager + ServiceManager *csservicemanager.ContractSFFLServiceManager + ethClient eth.EthClient + logger logging.Logger +} + +func NewAvsManagersBindings(registryCoordinatorAddr, operatorStateRetrieverAddr gethcommon.Address, ethclient eth.EthClient, logger logging.Logger) (*AvsManagersBindings, error) { + contractRegistryCoordinator, err := regcoord.NewContractRegistryCoordinator(registryCoordinatorAddr, ethclient) + if err != nil { + return nil, err + } + serviceManagerAddr, err := contractRegistryCoordinator.ServiceManager(&bind.CallOpts{}) + if err != nil { + return nil, err + } + contractServiceManager, err := csservicemanager.NewContractSFFLServiceManager(serviceManagerAddr, ethclient) + if err != nil { + logger.Error("Failed to fetch IServiceManager contract", "err", err) + return nil, err + } + + taskManagerAddr, err := contractServiceManager.TaskManager(&bind.CallOpts{}) + if err != nil { + logger.Error("Failed to fetch TaskManager address", "err", err) + return nil, err + } + contractTaskManager, err := taskmanager.NewContractSFFLTaskManager(taskManagerAddr, ethclient) + if err != nil { + logger.Error("Failed to fetch ISFFLTaskManager contract", "err", err) + return nil, err + } + + return &AvsManagersBindings{ + ServiceManager: contractServiceManager, + TaskManager: contractTaskManager, + ethClient: ethclient, + logger: logger, + }, nil +} + +func (b *AvsManagersBindings) GetErc20Mock(tokenAddr common.Address) (*erc20mock.ContractERC20Mock, error) { + contractErc20Mock, err := erc20mock.NewContractERC20Mock(tokenAddr, b.ethClient) + if err != nil { + b.logger.Error("Failed to fetch ERC20Mock contract", "err", err) + return nil, err + } + return contractErc20Mock, nil +} diff --git a/core/chainio/gen.go b/core/chainio/gen.go new file mode 100644 index 00000000..95d85ea3 --- /dev/null +++ b/core/chainio/gen.go @@ -0,0 +1,5 @@ +package chainio + +//go:generate mockgen -destination=./mocks/avs_subscriber.go -package=mocks github.com/NethermindEth/near-sffl/core/chainio AvsSubscriberer +//go:generate mockgen -destination=./mocks/avs_writer.go -package=mocks github.com/NethermindEth/near-sffl/core/chainio AvsWriterer +//go:generate mockgen -destination=./mocks/avs_reader.go -package=mocks github.com/NethermindEth/near-sffl/core/chainio AvsReaderer diff --git a/core/chainio/mocks/avs_reader.go b/core/chainio/mocks/avs_reader.go new file mode 100644 index 00000000..9361b900 --- /dev/null +++ b/core/chainio/mocks/avs_reader.go @@ -0,0 +1,214 @@ +// Code generated by MockGen. DO NOT EDIT. +// Source: github.com/NethermindEth/near-sffl/core/chainio (interfaces: AvsReaderer) +// +// Generated by this command: +// +// mockgen -destination=./mocks/avs_reader.go -package=mocks github.com/NethermindEth/near-sffl/core/chainio AvsReaderer +// +// Package mocks is a generated GoMock package. +package mocks + +import ( + context "context" + big "math/big" + reflect "reflect" + + contractOperatorStateRetriever "github.com/Layr-Labs/eigensdk-go/contracts/bindings/OperatorStateRetriever" + types "github.com/Layr-Labs/eigensdk-go/types" + contractERC20Mock "github.com/NethermindEth/near-sffl/contracts/bindings/ERC20Mock" + contractSFFLTaskManager "github.com/NethermindEth/near-sffl/contracts/bindings/SFFLTaskManager" + bind "github.com/ethereum/go-ethereum/accounts/abi/bind" + common "github.com/ethereum/go-ethereum/common" + gomock "go.uber.org/mock/gomock" +) + +// MockAvsReaderer is a mock of AvsReaderer interface. +type MockAvsReaderer struct { + ctrl *gomock.Controller + recorder *MockAvsReadererMockRecorder +} + +// MockAvsReadererMockRecorder is the mock recorder for MockAvsReaderer. +type MockAvsReadererMockRecorder struct { + mock *MockAvsReaderer +} + +// NewMockAvsReaderer creates a new mock instance. +func NewMockAvsReaderer(ctrl *gomock.Controller) *MockAvsReaderer { + mock := &MockAvsReaderer{ctrl: ctrl} + mock.recorder = &MockAvsReadererMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use. +func (m *MockAvsReaderer) EXPECT() *MockAvsReadererMockRecorder { + return m.recorder +} + +// CheckSignatures mocks base method. +func (m *MockAvsReaderer) CheckSignatures(arg0 context.Context, arg1 [32]byte, arg2 []byte, arg3 uint32, arg4 contractSFFLTaskManager.IBLSSignatureCheckerNonSignerStakesAndSignature) (contractSFFLTaskManager.IBLSSignatureCheckerQuorumStakeTotals, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "CheckSignatures", arg0, arg1, arg2, arg3, arg4) + ret0, _ := ret[0].(contractSFFLTaskManager.IBLSSignatureCheckerQuorumStakeTotals) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// CheckSignatures indicates an expected call of CheckSignatures. +func (mr *MockAvsReadererMockRecorder) CheckSignatures(arg0, arg1, arg2, arg3, arg4 any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "CheckSignatures", reflect.TypeOf((*MockAvsReaderer)(nil).CheckSignatures), arg0, arg1, arg2, arg3, arg4) +} + +// GetCheckSignaturesIndices mocks base method. +func (m *MockAvsReaderer) GetCheckSignaturesIndices(arg0 *bind.CallOpts, arg1 uint32, arg2 []byte, arg3 [][32]byte) (contractOperatorStateRetriever.OperatorStateRetrieverCheckSignaturesIndices, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "GetCheckSignaturesIndices", arg0, arg1, arg2, arg3) + ret0, _ := ret[0].(contractOperatorStateRetriever.OperatorStateRetrieverCheckSignaturesIndices) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// GetCheckSignaturesIndices indicates an expected call of GetCheckSignaturesIndices. +func (mr *MockAvsReadererMockRecorder) GetCheckSignaturesIndices(arg0, arg1, arg2, arg3 any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetCheckSignaturesIndices", reflect.TypeOf((*MockAvsReaderer)(nil).GetCheckSignaturesIndices), arg0, arg1, arg2, arg3) +} + +// GetErc20Mock mocks base method. +func (m *MockAvsReaderer) GetErc20Mock(arg0 context.Context, arg1 common.Address) (*contractERC20Mock.ContractERC20Mock, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "GetErc20Mock", arg0, arg1) + ret0, _ := ret[0].(*contractERC20Mock.ContractERC20Mock) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// GetErc20Mock indicates an expected call of GetErc20Mock. +func (mr *MockAvsReadererMockRecorder) GetErc20Mock(arg0, arg1 any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetErc20Mock", reflect.TypeOf((*MockAvsReaderer)(nil).GetErc20Mock), arg0, arg1) +} + +// GetOperatorFromId mocks base method. +func (m *MockAvsReaderer) GetOperatorFromId(arg0 *bind.CallOpts, arg1 [32]byte) (common.Address, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "GetOperatorFromId", arg0, arg1) + ret0, _ := ret[0].(common.Address) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// GetOperatorFromId indicates an expected call of GetOperatorFromId. +func (mr *MockAvsReadererMockRecorder) GetOperatorFromId(arg0, arg1 any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetOperatorFromId", reflect.TypeOf((*MockAvsReaderer)(nil).GetOperatorFromId), arg0, arg1) +} + +// GetOperatorId mocks base method. +func (m *MockAvsReaderer) GetOperatorId(arg0 *bind.CallOpts, arg1 common.Address) ([32]byte, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "GetOperatorId", arg0, arg1) + ret0, _ := ret[0].([32]byte) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// GetOperatorId indicates an expected call of GetOperatorId. +func (mr *MockAvsReadererMockRecorder) GetOperatorId(arg0, arg1 any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetOperatorId", reflect.TypeOf((*MockAvsReaderer)(nil).GetOperatorId), arg0, arg1) +} + +// GetOperatorStakeInQuorumsOfOperatorAtCurrentBlock mocks base method. +func (m *MockAvsReaderer) GetOperatorStakeInQuorumsOfOperatorAtCurrentBlock(arg0 *bind.CallOpts, arg1 [32]byte) (map[byte]*big.Int, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "GetOperatorStakeInQuorumsOfOperatorAtCurrentBlock", arg0, arg1) + ret0, _ := ret[0].(map[byte]*big.Int) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// GetOperatorStakeInQuorumsOfOperatorAtCurrentBlock indicates an expected call of GetOperatorStakeInQuorumsOfOperatorAtCurrentBlock. +func (mr *MockAvsReadererMockRecorder) GetOperatorStakeInQuorumsOfOperatorAtCurrentBlock(arg0, arg1 any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetOperatorStakeInQuorumsOfOperatorAtCurrentBlock", reflect.TypeOf((*MockAvsReaderer)(nil).GetOperatorStakeInQuorumsOfOperatorAtCurrentBlock), arg0, arg1) +} + +// GetOperatorsStakeInQuorumsAtBlock mocks base method. +func (m *MockAvsReaderer) GetOperatorsStakeInQuorumsAtBlock(arg0 *bind.CallOpts, arg1 []byte, arg2 uint32) ([][]contractOperatorStateRetriever.OperatorStateRetrieverOperator, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "GetOperatorsStakeInQuorumsAtBlock", arg0, arg1, arg2) + ret0, _ := ret[0].([][]contractOperatorStateRetriever.OperatorStateRetrieverOperator) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// GetOperatorsStakeInQuorumsAtBlock indicates an expected call of GetOperatorsStakeInQuorumsAtBlock. +func (mr *MockAvsReadererMockRecorder) GetOperatorsStakeInQuorumsAtBlock(arg0, arg1, arg2 any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetOperatorsStakeInQuorumsAtBlock", reflect.TypeOf((*MockAvsReaderer)(nil).GetOperatorsStakeInQuorumsAtBlock), arg0, arg1, arg2) +} + +// GetOperatorsStakeInQuorumsOfOperatorAtBlock mocks base method. +func (m *MockAvsReaderer) GetOperatorsStakeInQuorumsOfOperatorAtBlock(arg0 *bind.CallOpts, arg1 [32]byte, arg2 uint32) ([]byte, [][]contractOperatorStateRetriever.OperatorStateRetrieverOperator, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "GetOperatorsStakeInQuorumsOfOperatorAtBlock", arg0, arg1, arg2) + ret0, _ := ret[0].([]byte) + ret1, _ := ret[1].([][]contractOperatorStateRetriever.OperatorStateRetrieverOperator) + ret2, _ := ret[2].(error) + return ret0, ret1, ret2 +} + +// GetOperatorsStakeInQuorumsOfOperatorAtBlock indicates an expected call of GetOperatorsStakeInQuorumsOfOperatorAtBlock. +func (mr *MockAvsReadererMockRecorder) GetOperatorsStakeInQuorumsOfOperatorAtBlock(arg0, arg1, arg2 any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetOperatorsStakeInQuorumsOfOperatorAtBlock", reflect.TypeOf((*MockAvsReaderer)(nil).GetOperatorsStakeInQuorumsOfOperatorAtBlock), arg0, arg1, arg2) +} + +// GetOperatorsStakeInQuorumsOfOperatorAtCurrentBlock mocks base method. +func (m *MockAvsReaderer) GetOperatorsStakeInQuorumsOfOperatorAtCurrentBlock(arg0 *bind.CallOpts, arg1 [32]byte) ([]byte, [][]contractOperatorStateRetriever.OperatorStateRetrieverOperator, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "GetOperatorsStakeInQuorumsOfOperatorAtCurrentBlock", arg0, arg1) + ret0, _ := ret[0].([]byte) + ret1, _ := ret[1].([][]contractOperatorStateRetriever.OperatorStateRetrieverOperator) + ret2, _ := ret[2].(error) + return ret0, ret1, ret2 +} + +// GetOperatorsStakeInQuorumsOfOperatorAtCurrentBlock indicates an expected call of GetOperatorsStakeInQuorumsOfOperatorAtCurrentBlock. +func (mr *MockAvsReadererMockRecorder) GetOperatorsStakeInQuorumsOfOperatorAtCurrentBlock(arg0, arg1 any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetOperatorsStakeInQuorumsOfOperatorAtCurrentBlock", reflect.TypeOf((*MockAvsReaderer)(nil).GetOperatorsStakeInQuorumsOfOperatorAtCurrentBlock), arg0, arg1) +} + +// IsOperatorRegistered mocks base method. +func (m *MockAvsReaderer) IsOperatorRegistered(arg0 *bind.CallOpts, arg1 common.Address) (bool, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "IsOperatorRegistered", arg0, arg1) + ret0, _ := ret[0].(bool) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// IsOperatorRegistered indicates an expected call of IsOperatorRegistered. +func (mr *MockAvsReadererMockRecorder) IsOperatorRegistered(arg0, arg1 any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "IsOperatorRegistered", reflect.TypeOf((*MockAvsReaderer)(nil).IsOperatorRegistered), arg0, arg1) +} + +// QueryExistingRegisteredOperatorPubKeys mocks base method. +func (m *MockAvsReaderer) QueryExistingRegisteredOperatorPubKeys(arg0 context.Context, arg1, arg2 *big.Int) ([]common.Address, []types.OperatorPubkeys, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "QueryExistingRegisteredOperatorPubKeys", arg0, arg1, arg2) + ret0, _ := ret[0].([]common.Address) + ret1, _ := ret[1].([]types.OperatorPubkeys) + ret2, _ := ret[2].(error) + return ret0, ret1, ret2 +} + +// QueryExistingRegisteredOperatorPubKeys indicates an expected call of QueryExistingRegisteredOperatorPubKeys. +func (mr *MockAvsReadererMockRecorder) QueryExistingRegisteredOperatorPubKeys(arg0, arg1, arg2 any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "QueryExistingRegisteredOperatorPubKeys", reflect.TypeOf((*MockAvsReaderer)(nil).QueryExistingRegisteredOperatorPubKeys), arg0, arg1, arg2) +} diff --git a/core/chainio/mocks/avs_subscriber.go b/core/chainio/mocks/avs_subscriber.go new file mode 100644 index 00000000..4ae503ec --- /dev/null +++ b/core/chainio/mocks/avs_subscriber.go @@ -0,0 +1,84 @@ +// Code generated by MockGen. DO NOT EDIT. +// Source: github.com/NethermindEth/near-sffl/core/chainio (interfaces: AvsSubscriberer) +// +// Generated by this command: +// +// mockgen -destination=./mocks/avs_subscriber.go -package=mocks github.com/NethermindEth/near-sffl/core/chainio AvsSubscriberer +// +// Package mocks is a generated GoMock package. +package mocks + +import ( + reflect "reflect" + + contractSFFLTaskManager "github.com/NethermindEth/near-sffl/contracts/bindings/SFFLTaskManager" + types "github.com/ethereum/go-ethereum/core/types" + event "github.com/ethereum/go-ethereum/event" + gomock "go.uber.org/mock/gomock" +) + +// MockAvsSubscriberer is a mock of AvsSubscriberer interface. +type MockAvsSubscriberer struct { + ctrl *gomock.Controller + recorder *MockAvsSubscribererMockRecorder +} + +// MockAvsSubscribererMockRecorder is the mock recorder for MockAvsSubscriberer. +type MockAvsSubscribererMockRecorder struct { + mock *MockAvsSubscriberer +} + +// NewMockAvsSubscriberer creates a new mock instance. +func NewMockAvsSubscriberer(ctrl *gomock.Controller) *MockAvsSubscriberer { + mock := &MockAvsSubscriberer{ctrl: ctrl} + mock.recorder = &MockAvsSubscribererMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use. +func (m *MockAvsSubscriberer) EXPECT() *MockAvsSubscribererMockRecorder { + return m.recorder +} + +// ParseCheckpointTaskResponded mocks base method. +func (m *MockAvsSubscriberer) ParseCheckpointTaskResponded(arg0 types.Log) (*contractSFFLTaskManager.ContractSFFLTaskManagerCheckpointTaskResponded, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "ParseCheckpointTaskResponded", arg0) + ret0, _ := ret[0].(*contractSFFLTaskManager.ContractSFFLTaskManagerCheckpointTaskResponded) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// ParseCheckpointTaskResponded indicates an expected call of ParseCheckpointTaskResponded. +func (mr *MockAvsSubscribererMockRecorder) ParseCheckpointTaskResponded(arg0 any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ParseCheckpointTaskResponded", reflect.TypeOf((*MockAvsSubscriberer)(nil).ParseCheckpointTaskResponded), arg0) +} + +// SubscribeToNewTasks mocks base method. +func (m *MockAvsSubscriberer) SubscribeToNewTasks(arg0 chan *contractSFFLTaskManager.ContractSFFLTaskManagerCheckpointTaskCreated) event.Subscription { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SubscribeToNewTasks", arg0) + ret0, _ := ret[0].(event.Subscription) + return ret0 +} + +// SubscribeToNewTasks indicates an expected call of SubscribeToNewTasks. +func (mr *MockAvsSubscribererMockRecorder) SubscribeToNewTasks(arg0 any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SubscribeToNewTasks", reflect.TypeOf((*MockAvsSubscriberer)(nil).SubscribeToNewTasks), arg0) +} + +// SubscribeToTaskResponses mocks base method. +func (m *MockAvsSubscriberer) SubscribeToTaskResponses(arg0 chan *contractSFFLTaskManager.ContractSFFLTaskManagerCheckpointTaskResponded) event.Subscription { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SubscribeToTaskResponses", arg0) + ret0, _ := ret[0].(event.Subscription) + return ret0 +} + +// SubscribeToTaskResponses indicates an expected call of SubscribeToTaskResponses. +func (mr *MockAvsSubscribererMockRecorder) SubscribeToTaskResponses(arg0 any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SubscribeToTaskResponses", reflect.TypeOf((*MockAvsSubscriberer)(nil).SubscribeToTaskResponses), arg0) +} diff --git a/core/chainio/mocks/avs_writer.go b/core/chainio/mocks/avs_writer.go new file mode 100644 index 00000000..f0a9d527 --- /dev/null +++ b/core/chainio/mocks/avs_writer.go @@ -0,0 +1,137 @@ +// Code generated by MockGen. DO NOT EDIT. +// Source: github.com/NethermindEth/near-sffl/core/chainio (interfaces: AvsWriterer) +// +// Generated by this command: +// +// mockgen -destination=./mocks/avs_writer.go -package=mocks github.com/NethermindEth/near-sffl/core/chainio AvsWriterer +// +// Package mocks is a generated GoMock package. +package mocks + +import ( + context "context" + ecdsa "crypto/ecdsa" + big "math/big" + reflect "reflect" + + contractRegistryCoordinator "github.com/Layr-Labs/eigensdk-go/contracts/bindings/RegistryCoordinator" + bls "github.com/Layr-Labs/eigensdk-go/crypto/bls" + contractSFFLTaskManager "github.com/NethermindEth/near-sffl/contracts/bindings/SFFLTaskManager" + common "github.com/ethereum/go-ethereum/common" + types "github.com/ethereum/go-ethereum/core/types" + gomock "go.uber.org/mock/gomock" +) + +// MockAvsWriterer is a mock of AvsWriterer interface. +type MockAvsWriterer struct { + ctrl *gomock.Controller + recorder *MockAvsWritererMockRecorder +} + +// MockAvsWritererMockRecorder is the mock recorder for MockAvsWriterer. +type MockAvsWritererMockRecorder struct { + mock *MockAvsWriterer +} + +// NewMockAvsWriterer creates a new mock instance. +func NewMockAvsWriterer(ctrl *gomock.Controller) *MockAvsWriterer { + mock := &MockAvsWriterer{ctrl: ctrl} + mock.recorder = &MockAvsWritererMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use. +func (m *MockAvsWriterer) EXPECT() *MockAvsWritererMockRecorder { + return m.recorder +} + +// DeregisterOperator mocks base method. +func (m *MockAvsWriterer) DeregisterOperator(arg0 context.Context, arg1 []byte, arg2 contractRegistryCoordinator.BN254G1Point) (*types.Receipt, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "DeregisterOperator", arg0, arg1, arg2) + ret0, _ := ret[0].(*types.Receipt) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// DeregisterOperator indicates an expected call of DeregisterOperator. +func (mr *MockAvsWritererMockRecorder) DeregisterOperator(arg0, arg1, arg2 any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "DeregisterOperator", reflect.TypeOf((*MockAvsWriterer)(nil).DeregisterOperator), arg0, arg1, arg2) +} + +// RaiseChallenge mocks base method. +func (m *MockAvsWriterer) RaiseChallenge(arg0 context.Context, arg1 contractSFFLTaskManager.CheckpointTask, arg2 contractSFFLTaskManager.CheckpointTaskResponse, arg3 contractSFFLTaskManager.CheckpointTaskResponseMetadata, arg4 []contractSFFLTaskManager.BN254G1Point) (*types.Receipt, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "RaiseChallenge", arg0, arg1, arg2, arg3, arg4) + ret0, _ := ret[0].(*types.Receipt) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// RaiseChallenge indicates an expected call of RaiseChallenge. +func (mr *MockAvsWritererMockRecorder) RaiseChallenge(arg0, arg1, arg2, arg3, arg4 any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "RaiseChallenge", reflect.TypeOf((*MockAvsWriterer)(nil).RaiseChallenge), arg0, arg1, arg2, arg3, arg4) +} + +// RegisterOperatorWithAVSRegistryCoordinator mocks base method. +func (m *MockAvsWriterer) RegisterOperatorWithAVSRegistryCoordinator(arg0 context.Context, arg1 *ecdsa.PrivateKey, arg2 [32]byte, arg3 *big.Int, arg4 *bls.KeyPair, arg5 []byte, arg6 string) (*types.Receipt, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "RegisterOperatorWithAVSRegistryCoordinator", arg0, arg1, arg2, arg3, arg4, arg5, arg6) + ret0, _ := ret[0].(*types.Receipt) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// RegisterOperatorWithAVSRegistryCoordinator indicates an expected call of RegisterOperatorWithAVSRegistryCoordinator. +func (mr *MockAvsWritererMockRecorder) RegisterOperatorWithAVSRegistryCoordinator(arg0, arg1, arg2, arg3, arg4, arg5, arg6 any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "RegisterOperatorWithAVSRegistryCoordinator", reflect.TypeOf((*MockAvsWriterer)(nil).RegisterOperatorWithAVSRegistryCoordinator), arg0, arg1, arg2, arg3, arg4, arg5, arg6) +} + +// SendAggregatedResponse mocks base method. +func (m *MockAvsWriterer) SendAggregatedResponse(arg0 context.Context, arg1 contractSFFLTaskManager.CheckpointTask, arg2 contractSFFLTaskManager.CheckpointTaskResponse, arg3 contractSFFLTaskManager.IBLSSignatureCheckerNonSignerStakesAndSignature) (*types.Receipt, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SendAggregatedResponse", arg0, arg1, arg2, arg3) + ret0, _ := ret[0].(*types.Receipt) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// SendAggregatedResponse indicates an expected call of SendAggregatedResponse. +func (mr *MockAvsWritererMockRecorder) SendAggregatedResponse(arg0, arg1, arg2, arg3 any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SendAggregatedResponse", reflect.TypeOf((*MockAvsWriterer)(nil).SendAggregatedResponse), arg0, arg1, arg2, arg3) +} + +// SendNewCheckpointTask mocks base method. +func (m *MockAvsWriterer) SendNewCheckpointTask(arg0 context.Context, arg1, arg2 uint64, arg3 uint32, arg4 []byte) (contractSFFLTaskManager.CheckpointTask, uint32, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SendNewCheckpointTask", arg0, arg1, arg2, arg3, arg4) + ret0, _ := ret[0].(contractSFFLTaskManager.CheckpointTask) + ret1, _ := ret[1].(uint32) + ret2, _ := ret[2].(error) + return ret0, ret1, ret2 +} + +// SendNewCheckpointTask indicates an expected call of SendNewCheckpointTask. +func (mr *MockAvsWritererMockRecorder) SendNewCheckpointTask(arg0, arg1, arg2, arg3, arg4 any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SendNewCheckpointTask", reflect.TypeOf((*MockAvsWriterer)(nil).SendNewCheckpointTask), arg0, arg1, arg2, arg3, arg4) +} + +// UpdateOperatorStakes mocks base method. +func (m *MockAvsWriterer) UpdateOperatorStakes(arg0 context.Context, arg1 []common.Address) (*types.Receipt, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "UpdateOperatorStakes", arg0, arg1) + ret0, _ := ret[0].(*types.Receipt) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// UpdateOperatorStakes indicates an expected call of UpdateOperatorStakes. +func (mr *MockAvsWritererMockRecorder) UpdateOperatorStakes(arg0, arg1 any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "UpdateOperatorStakes", reflect.TypeOf((*MockAvsWriterer)(nil).UpdateOperatorStakes), arg0, arg1) +} diff --git a/core/config/config.go b/core/config/config.go new file mode 100644 index 00000000..4be23c0a --- /dev/null +++ b/core/config/config.go @@ -0,0 +1,189 @@ +package config + +import ( + "context" + "crypto/ecdsa" + "errors" + "os" + + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/crypto" + "github.com/urfave/cli" + + "github.com/Layr-Labs/eigensdk-go/chainio/clients/eth" + "github.com/Layr-Labs/eigensdk-go/chainio/txmgr" + "github.com/Layr-Labs/eigensdk-go/crypto/bls" + sdklogging "github.com/Layr-Labs/eigensdk-go/logging" + "github.com/Layr-Labs/eigensdk-go/signerv2" + + sdkutils "github.com/Layr-Labs/eigensdk-go/utils" +) + +// Config contains all of the configuration information for SFFL aggregators and challengers. +// Operators use a separate config. (see config-files/operator.anvil.yaml) +type Config struct { + EcdsaPrivateKey *ecdsa.PrivateKey + BlsPrivateKey *bls.PrivateKey + Logger sdklogging.Logger + EigenMetricsIpPortAddress string + // we need the url for the eigensdk currently... eventually standardize api so as to + // only take an ethclient or an rpcUrl (and build the ethclient at each constructor site) + EthHttpRpcUrl string + EthWsRpcUrl string + EthHttpClient eth.EthClient + EthWsClient eth.EthClient + OperatorStateRetrieverAddr common.Address + SFFLRegistryCoordinatorAddr common.Address + AggregatorServerIpPortAddr string + RegisterOperatorOnStartup bool + // json:"-" skips this field when marshaling (only used for logging to stdout), since SignerFn doesnt implement marshalJson + SignerFn signerv2.SignerFn `json:"-"` + TxMgr txmgr.TxManager + AggregatorAddress common.Address +} + +// These are read from ConfigFileFlag +type ConfigRaw struct { + Environment sdklogging.LogLevel `yaml:"environment"` + EthRpcUrl string `yaml:"eth_rpc_url"` + EthWsUrl string `yaml:"eth_ws_url"` + AggregatorServerIpPortAddr string `yaml:"aggregator_server_ip_port_address"` + RegisterOperatorOnStartup bool `yaml:"register_operator_on_startup"` +} + +// These are read from SFFLDeploymentFileFlag +type SFFLDeploymentRaw struct { + Addresses SFFLContractsRaw `json:"addresses"` +} +type SFFLContractsRaw struct { + RegistryCoordinatorAddr string `json:"registryCoordinator"` + OperatorStateRetrieverAddr string `json:"operatorStateRetriever"` +} + +// NewConfig parses config file to read from from flags or environment variables +// Note: This config is shared by challenger and aggregator and so we put in the core. +// Operator has a different config and is meant to be used by the operator CLI. +func NewConfig(ctx *cli.Context) (*Config, error) { + + var configRaw ConfigRaw + configFilePath := ctx.GlobalString(ConfigFileFlag.Name) + if configFilePath != "" { + sdkutils.ReadYamlConfig(configFilePath, &configRaw) + } + + var sfflDeploymentRaw SFFLDeploymentRaw + sfflDeploymentFilePath := ctx.GlobalString(SFFLDeploymentFileFlag.Name) + if _, err := os.Stat(sfflDeploymentFilePath); errors.Is(err, os.ErrNotExist) { + panic("Path " + sfflDeploymentFilePath + " does not exist") + } + sdkutils.ReadJsonConfig(sfflDeploymentFilePath, &sfflDeploymentRaw) + + logger, err := sdklogging.NewZapLogger(configRaw.Environment) + if err != nil { + return nil, err + } + + ethRpcClient, err := eth.NewClient(configRaw.EthRpcUrl) + if err != nil { + logger.Errorf("Cannot create http ethclient", "err", err) + return nil, err + } + + ethWsClient, err := eth.NewClient(configRaw.EthWsUrl) + if err != nil { + logger.Errorf("Cannot create ws ethclient", "err", err) + return nil, err + } + + ecdsaPrivateKeyString := ctx.GlobalString(EcdsaPrivateKeyFlag.Name) + if ecdsaPrivateKeyString[:2] == "0x" { + ecdsaPrivateKeyString = ecdsaPrivateKeyString[2:] + } + ecdsaPrivateKey, err := crypto.HexToECDSA(ecdsaPrivateKeyString) + if err != nil { + logger.Errorf("Cannot parse ecdsa private key", "err", err) + return nil, err + } + + aggregatorAddr, err := sdkutils.EcdsaPrivateKeyToAddress(ecdsaPrivateKey) + if err != nil { + logger.Error("Cannot get operator address", "err", err) + return nil, err + } + + chainId, err := ethRpcClient.ChainID(context.Background()) + if err != nil { + logger.Error("Cannot get chainId", "err", err) + return nil, err + } + + signerV2, _, err := signerv2.SignerFromConfig(signerv2.Config{PrivateKey: ecdsaPrivateKey}, chainId) + if err != nil { + panic(err) + } + txMgr := txmgr.NewSimpleTxManager(ethRpcClient, logger, signerV2, aggregatorAddr) + + config := &Config{ + EcdsaPrivateKey: ecdsaPrivateKey, + Logger: logger, + EthWsRpcUrl: configRaw.EthWsUrl, + EthHttpRpcUrl: configRaw.EthRpcUrl, + EthHttpClient: ethRpcClient, + EthWsClient: ethWsClient, + OperatorStateRetrieverAddr: common.HexToAddress(sfflDeploymentRaw.Addresses.OperatorStateRetrieverAddr), + SFFLRegistryCoordinatorAddr: common.HexToAddress(sfflDeploymentRaw.Addresses.RegistryCoordinatorAddr), + AggregatorServerIpPortAddr: configRaw.AggregatorServerIpPortAddr, + RegisterOperatorOnStartup: configRaw.RegisterOperatorOnStartup, + SignerFn: signerV2, + TxMgr: txMgr, + AggregatorAddress: aggregatorAddr, + } + config.validate() + return config, nil +} + +func (c *Config) validate() { + // TODO: make sure every pointer is non-nil + if c.OperatorStateRetrieverAddr == common.HexToAddress("") { + panic("Config: BLSOperatorStateRetrieverAddr is required") + } + if c.SFFLRegistryCoordinatorAddr == common.HexToAddress("") { + panic("Config: SFFLRegistryCoordinatorAddr is required") + } +} + +var ( + /* Required Flags */ + ConfigFileFlag = cli.StringFlag{ + Name: "config", + Required: true, + Usage: "Load configuration from `FILE`", + } + SFFLDeploymentFileFlag = cli.StringFlag{ + Name: "sffl-deployment", + Required: true, + Usage: "Load SFFL contract addresses from `FILE`", + } + EcdsaPrivateKeyFlag = cli.StringFlag{ + Name: "ecdsa-private-key", + Usage: "Ethereum private key", + Required: true, + EnvVar: "ECDSA_PRIVATE_KEY", + } + /* Optional Flags */ +) + +var requiredFlags = []cli.Flag{ + ConfigFileFlag, + SFFLDeploymentFileFlag, + EcdsaPrivateKeyFlag, +} + +var optionalFlags = []cli.Flag{} + +func init() { + Flags = append(requiredFlags, optionalFlags...) +} + +// Flags contains the list of configuration options available to the binary. +var Flags []cli.Flag diff --git a/core/utils.go b/core/utils.go new file mode 100644 index 00000000..2e9b962c --- /dev/null +++ b/core/utils.go @@ -0,0 +1,83 @@ +package core + +import ( + "math/big" + + "github.com/Layr-Labs/eigensdk-go/crypto/bls" + taskmanager "github.com/NethermindEth/near-sffl/contracts/bindings/SFFLTaskManager" + "github.com/ethereum/go-ethereum/accounts/abi" + "golang.org/x/crypto/sha3" +) + +// this hardcodes abi.encode() for taskmanager.CheckpointTaskResponse +// unclear why abigen doesn't provide this out of the box... +func AbiEncodeCheckpointTaskResponse(h *taskmanager.CheckpointTaskResponse) ([]byte, error) { + + // The order here has to match the field ordering of taskmanager.CheckpointTaskResponse + taskResponseType, err := abi.NewType("tuple", "", []abi.ArgumentMarshaling{ + { + Name: "referenceTaskIndex", + Type: "uint32", + }, + { + Name: "stateRootUpdatesRoot", + Type: "bytes32", + }, + { + Name: "operatorSetUpdatesRoot", + Type: "bytes32", + }, + }) + if err != nil { + return nil, err + } + arguments := abi.Arguments{ + { + Type: taskResponseType, + }, + } + + bytes, err := arguments.Pack(h) + if err != nil { + return nil, err + } + + return bytes, nil +} + +// GetCheckpointTaskResponseDigest returns the hash of the TaskResponse, which is what operators sign over +func GetCheckpointTaskResponseDigest(h *taskmanager.CheckpointTaskResponse) ([32]byte, error) { + + encodeTaskResponseByte, err := AbiEncodeCheckpointTaskResponse(h) + if err != nil { + return [32]byte{}, err + } + + var taskResponseDigest [32]byte + hasher := sha3.NewLegacyKeccak256() + hasher.Write(encodeTaskResponseByte) + copy(taskResponseDigest[:], hasher.Sum(nil)[:32]) + + return taskResponseDigest, nil +} + +// BINDING UTILS - conversion from contract structs to golang structs + +// BN254.sol is a library, so bindings for G1 Points and G2 Points are only generated +// in every contract that imports that library. Thus the output here will need to be +// type casted if G1Point is needed to interface with another contract (eg: BLSPublicKeyCompendium.sol) +func ConvertToBN254G1Point(input *bls.G1Point) taskmanager.BN254G1Point { + output := taskmanager.BN254G1Point{ + X: input.X.BigInt(big.NewInt(0)), + Y: input.Y.BigInt(big.NewInt(0)), + } + return output +} + +func ConvertToBN254G2Point(input *bls.G2Point) taskmanager.BN254G2Point { + output := taskmanager.BN254G2Point{ + X: [2]*big.Int{input.X.A1.BigInt(big.NewInt(0)), input.X.A0.BigInt(big.NewInt(0))}, + Y: [2]*big.Int{input.Y.A1.BigInt(big.NewInt(0)), input.Y.A0.BigInt(big.NewInt(0))}, + } + return output +} diff --git a/go.mod b/go.mod new file mode 100644 index 00000000..a4e9f5be --- /dev/null +++ b/go.mod @@ -0,0 +1,114 @@ +module github.com/NethermindEth/near-sffl + +go 1.21 + +toolchain go1.21.0 + +require ( + github.com/Layr-Labs/eigensdk-go v0.0.10-0.20240103024128-1f8562000045 + github.com/ethereum/go-ethereum v1.13.5 + github.com/prometheus/client_golang v1.18.0 + github.com/stretchr/testify v1.8.4 + github.com/testcontainers/testcontainers-go v0.26.0 + github.com/urfave/cli v1.22.14 + go.uber.org/mock v0.3.0 + golang.org/x/crypto v0.18.0 +) + +require ( + dario.cat/mergo v1.0.0 // indirect + github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1 // indirect + github.com/DataDog/zstd v1.4.5 // indirect + github.com/Microsoft/go-winio v0.6.1 // indirect + github.com/Microsoft/hcsshim v0.11.4 // indirect + github.com/VictoriaMetrics/fastcache v1.12.1 // indirect + github.com/beorn7/perks v1.0.1 // indirect + github.com/bits-and-blooms/bitset v1.13.0 // indirect + github.com/btcsuite/btcd/btcec/v2 v2.3.2 // indirect + github.com/cenkalti/backoff/v4 v4.2.1 // indirect + github.com/cespare/xxhash/v2 v2.2.0 // indirect + github.com/cockroachdb/errors v1.8.1 // indirect + github.com/cockroachdb/logtags v0.0.0-20190617123548-eb05cc24525f // indirect + github.com/cockroachdb/pebble v0.0.0-20230928194634-aa077af62593 // indirect + github.com/cockroachdb/redact v1.0.8 // indirect + github.com/cockroachdb/sentry-go v0.6.1-cockroachdb.2 // indirect + github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06 // indirect + github.com/consensys/bavard v0.1.13 // indirect + github.com/consensys/gnark-crypto v0.12.1 // indirect + github.com/containerd/containerd v1.7.11 // indirect + github.com/containerd/log v0.1.0 // indirect + github.com/cpuguy83/dockercfg v0.3.1 // indirect + github.com/cpuguy83/go-md2man/v2 v2.0.3 // indirect + github.com/crate-crypto/go-kzg-4844 v0.7.0 // indirect + github.com/davecgh/go-spew v1.1.1 // indirect + github.com/deckarep/golang-set/v2 v2.6.0 // indirect + github.com/decred/dcrd/dcrec/secp256k1/v4 v4.2.0 // indirect + github.com/docker/distribution v2.8.2+incompatible // indirect + github.com/docker/docker v24.0.7+incompatible // indirect + github.com/docker/go-connections v0.4.0 // indirect + github.com/docker/go-units v0.5.0 // indirect + github.com/ethereum/c-kzg-4844 v0.4.0 // indirect + github.com/fsnotify/fsnotify v1.7.0 // indirect + github.com/gballet/go-libpcsclite v0.0.0-20190607065134-2772fd86a8ff // indirect + github.com/go-ole/go-ole v1.3.0 // indirect + github.com/go-stack/stack v1.8.1 // indirect + github.com/gofrs/flock v0.8.1 // indirect + github.com/gogo/protobuf v1.3.2 // indirect + github.com/golang/protobuf v1.5.3 // indirect + github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb // indirect + github.com/google/uuid v1.6.0 // indirect + github.com/gorilla/websocket v1.5.1 // indirect + github.com/holiman/bloomfilter/v2 v2.0.3 // indirect + github.com/holiman/uint256 v1.2.4 // indirect + github.com/huin/goupnp v1.3.0 // indirect + github.com/jackpal/go-nat-pmp v1.0.2 // indirect + github.com/klauspost/compress v1.16.0 // indirect + github.com/kr/pretty v0.3.1 // indirect + github.com/kr/text v0.2.0 // indirect + github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0 // indirect + github.com/magiconair/properties v1.8.7 // indirect + github.com/mattn/go-runewidth v0.0.13 // indirect + github.com/mmcloughlin/addchain v0.4.0 // indirect + github.com/moby/patternmatcher v0.6.0 // indirect + github.com/moby/sys/sequential v0.5.0 // indirect + github.com/moby/term v0.5.0 // indirect + github.com/morikuni/aec v1.0.0 // indirect + github.com/olekukonko/tablewriter v0.0.5 // indirect + github.com/opencontainers/go-digest v1.0.0 // indirect + github.com/opencontainers/image-spec v1.1.0-rc5 // indirect + github.com/opencontainers/runc v1.1.5 // indirect + github.com/pkg/errors v0.9.1 // indirect + github.com/pmezard/go-difflib v1.0.0 // indirect + github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c // indirect + github.com/prometheus/client_model v0.5.0 // indirect + github.com/prometheus/common v0.46.0 // indirect + github.com/prometheus/procfs v0.12.0 // indirect + github.com/rivo/uniseg v0.2.0 // indirect + github.com/rogpeppe/go-internal v1.10.0 // indirect + github.com/russross/blackfriday/v2 v2.1.0 // indirect + github.com/shirou/gopsutil v3.21.11+incompatible // indirect + github.com/shirou/gopsutil/v3 v3.23.11 // indirect + github.com/shoenig/go-m1cpu v0.1.6 // indirect + github.com/sirupsen/logrus v1.9.3 // indirect + github.com/status-im/keycard-go v0.2.0 // indirect + github.com/supranational/blst v0.3.11 // indirect + github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7 // indirect + github.com/tklauser/go-sysconf v0.3.13 // indirect + github.com/tklauser/numcpus v0.7.0 // indirect + github.com/tyler-smith/go-bip39 v1.1.0 // indirect + github.com/yusufpapurcu/wmi v1.2.3 // indirect + go.uber.org/multierr v1.11.0 // indirect + go.uber.org/zap v1.26.0 // indirect + golang.org/x/exp v0.0.0-20240119083558-1b970713d09a // indirect + golang.org/x/mod v0.14.0 // indirect + golang.org/x/net v0.20.0 // indirect + golang.org/x/sync v0.6.0 // indirect + golang.org/x/sys v0.16.0 // indirect + golang.org/x/text v0.14.0 // indirect + golang.org/x/tools v0.17.0 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20230711160842-782d3b101e98 // indirect + google.golang.org/grpc v1.58.3 // indirect + google.golang.org/protobuf v1.32.0 // indirect + gopkg.in/yaml.v3 v3.0.1 // indirect + rsc.io/tmplfunc v0.0.3 // indirect +) diff --git a/go.sum b/go.sum new file mode 100644 index 00000000..039528e8 --- /dev/null +++ b/go.sum @@ -0,0 +1,594 @@ +cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= +dario.cat/mergo v1.0.0 h1:AGCNq9Evsj31mOgNPcLyXc+4PNABt905YmuqPYYpBWk= +dario.cat/mergo v1.0.0/go.mod h1:uNxQE+84aUszobStD9th8a29P2fMDhsBdgRYvZOxGmk= +github.com/AdaLogics/go-fuzz-headers v0.0.0-20230811130428-ced1acdcaa24 h1:bvDV9vkmnHYOMsOr4WLk+Vo07yKIzd94sVoIqshQ4bU= +github.com/AdaLogics/go-fuzz-headers v0.0.0-20230811130428-ced1acdcaa24/go.mod h1:8o94RPi1/7XTJvwPpRSzSUedZrtlirdB3r9Z20bi2f8= +github.com/AndreasBriese/bbloom v0.0.0-20190306092124-e2d15f34fcf9/go.mod h1:bOvUY6CB00SOBii9/FifXqc0awNKxLFCL/+pkDPuyl8= +github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1 h1:UQHMgLO+TxOElx5B5HZ4hJQsoJ/PvUvKRhJHDQXO8P8= +github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1/go.mod h1:xomTg63KZ2rFqZQzSB4Vz2SUXa1BpHTVz9L5PTmPC4E= +github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= +github.com/BurntSushi/toml v1.3.2/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ= +github.com/CloudyKit/fastprinter v0.0.0-20170127035650-74b38d55f37a/go.mod h1:EFZQ978U7x8IRnstaskI3IysnWY5Ao3QgZUKOXlsAdw= +github.com/CloudyKit/jet v2.1.3-0.20180809161101-62edd43e4f88+incompatible/go.mod h1:HPYO+50pSWkPoj9Q/eq0aRGByCL6ScRlUmiEX5Zgm+w= +github.com/DataDog/zstd v1.4.5 h1:EndNeuB0l9syBZhut0wns3gV1hL8zX8LIu6ZiVHWLIQ= +github.com/DataDog/zstd v1.4.5/go.mod h1:1jcaCB/ufaK+sKp1NBhlGmpz41jOoPQ35bpF36t7BBo= +github.com/Joker/hpp v1.0.0/go.mod h1:8x5n+M1Hp5hC0g8okX3sR3vFQwynaX/UgSOM9MeBKzY= +github.com/Joker/jade v1.0.1-0.20190614124447-d475f43051e7/go.mod h1:6E6s8o2AE4KhCrqr6GRJjdC/gNfTdxkIXvuGZZda2VM= +github.com/Layr-Labs/eigensdk-go v0.0.10-0.20240103024128-1f8562000045 h1:NyPU6EmFwPjjj0a6NwofojKWiZ0GJDEwS6r/w5K+9R0= +github.com/Layr-Labs/eigensdk-go v0.0.10-0.20240103024128-1f8562000045/go.mod h1:oVDbRfA2GKFyZLf61zFOA3U2pjazHIFohlW7luDWqUA= +github.com/Microsoft/go-winio v0.6.1 h1:9/kr64B9VUZrLm5YYwbGtUJnMgqWVOdUAXu6Migciow= +github.com/Microsoft/go-winio v0.6.1/go.mod h1:LRdKpFKfdobln8UmuiYcKPot9D2v6svN5+sAH+4kjUM= +github.com/Microsoft/hcsshim v0.11.4 h1:68vKo2VN8DE9AdN4tnkWnmdhqdbpUFM8OF3Airm7fz8= +github.com/Microsoft/hcsshim v0.11.4/go.mod h1:smjE4dvqPX9Zldna+t5FG3rnoHhaB7QYxPRqGcpAD9w= +github.com/Shopify/goreferrer v0.0.0-20181106222321-ec9c9a553398/go.mod h1:a1uqRtAwp2Xwc6WNPJEufxJ7fx3npB4UV/JOLmbu5I0= +github.com/VictoriaMetrics/fastcache v1.12.1 h1:i0mICQuojGDL3KblA7wUNlY5lOK6a4bwt3uRKnkZU40= +github.com/VictoriaMetrics/fastcache v1.12.1/go.mod h1:tX04vaqcNoQeGLD+ra5pU5sWkuxnzWhEzLwhP9w653o= +github.com/ajg/form v1.5.1/go.mod h1:uL1WgH+h2mgNtvBq0339dVnzXdBETtL2LeUXaIv25UY= +github.com/allegro/bigcache v1.2.1-0.20190218064605-e24eb225f156 h1:eMwmnE/GDgah4HI848JfFxHt+iPb26b4zyfspmqY0/8= +github.com/allegro/bigcache v1.2.1-0.20190218064605-e24eb225f156/go.mod h1:Cb/ax3seSYIx7SuZdm2G2xzfwmv3TPSk2ucNfQESPXM= +github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8= +github.com/aymerick/raymond v2.0.3-0.20180322193309-b565731e1464+incompatible/go.mod h1:osfaiScAUVup+UC9Nfq76eWqDhXlp+4UYaA8uhTBO6g= +github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= +github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= +github.com/bits-and-blooms/bitset v1.13.0 h1:bAQ9OPNFYbGHV6Nez0tmNI0RiEu7/hxlYJRUA0wFAVE= +github.com/bits-and-blooms/bitset v1.13.0/go.mod h1:7hO7Gc7Pp1vODcmWvKMRA9BNmbv6a/7QIWpPxHddWR8= +github.com/btcsuite/btcd/btcec/v2 v2.3.2 h1:5n0X6hX0Zk+6omWcihdYvdAlGf2DfasC0GMf7DClJ3U= +github.com/btcsuite/btcd/btcec/v2 v2.3.2/go.mod h1:zYzJ8etWJQIv1Ogk7OzpWjowwOdXY1W/17j2MW85J04= +github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1 h1:q0rUy8C/TYNBQS1+CGKw68tLOFYSNEs0TFnxxnS9+4U= +github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1/go.mod h1:7SFka0XMvUgj3hfZtydOrQY2mwhPclbT2snogU7SQQc= +github.com/cenkalti/backoff/v4 v4.2.1 h1:y4OZtCnogmCPw98Zjyt5a6+QwPLGkiQsYW5oUqylYbM= +github.com/cenkalti/backoff/v4 v4.2.1/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE= +github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= +github.com/cespare/cp v0.1.0 h1:SE+dxFebS7Iik5LK0tsi1k9ZCxEaFX4AjQmoyA+1dJk= +github.com/cespare/cp v0.1.0/go.mod h1:SOGHArjBr4JWaSDEVpWpo/hNg6RoKrls6Oh40hiwW+s= +github.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44= +github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/checkpoint-restore/go-criu/v5 v5.3.0/go.mod h1:E/eQpaFtUKGOOSEBZgmKAcn+zUUwWxqcaKZlF54wK8E= +github.com/cilium/ebpf v0.7.0/go.mod h1:/oI2+1shJiTGAMgl6/RgJr36Eo1jzrRcAWbcXO2usCA= +github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= +github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= +github.com/cockroachdb/datadriven v1.0.0/go.mod h1:5Ib8Meh+jk1RlHIXej6Pzevx/NLlNvQB9pmSBZErGA4= +github.com/cockroachdb/datadriven v1.0.3-0.20230413201302-be42291fc80f h1:otljaYPt5hWxV3MUfO5dFPFiOXg9CyG5/kCfayTqsJ4= +github.com/cockroachdb/datadriven v1.0.3-0.20230413201302-be42291fc80f/go.mod h1:a9RdTaap04u637JoCzcUoIcDmvwSUtcUFtT/C3kJlTU= +github.com/cockroachdb/errors v1.6.1/go.mod h1:tm6FTP5G81vwJ5lC0SizQo374JNCOPrHyXGitRJoDqM= +github.com/cockroachdb/errors v1.8.1 h1:A5+txlVZfOqFBDa4mGz2bUWSp0aHElvHX2bKkdbQu+Y= +github.com/cockroachdb/errors v1.8.1/go.mod h1:qGwQn6JmZ+oMjuLwjWzUNqblqk0xl4CVV3SQbGwK7Ac= +github.com/cockroachdb/logtags v0.0.0-20190617123548-eb05cc24525f h1:o/kfcElHqOiXqcou5a3rIlMc7oJbMQkeLk0VQJ7zgqY= +github.com/cockroachdb/logtags v0.0.0-20190617123548-eb05cc24525f/go.mod h1:i/u985jwjWRlyHXQbwatDASoW0RMlZ/3i9yJHE2xLkI= +github.com/cockroachdb/pebble v0.0.0-20230928194634-aa077af62593 h1:aPEJyR4rPBvDmeyi+l/FS/VtA00IWvjeFvjen1m1l1A= +github.com/cockroachdb/pebble v0.0.0-20230928194634-aa077af62593/go.mod h1:6hk1eMY/u5t+Cf18q5lFMUA1Rc+Sm5I6Ra1QuPyxXCo= +github.com/cockroachdb/redact v1.0.8 h1:8QG/764wK+vmEYoOlfobpe12EQcS81ukx/a4hdVMxNw= +github.com/cockroachdb/redact v1.0.8/go.mod h1:BVNblN9mBWFyMyqK1k3AAiSxhvhfK2oOZZ2lK+dpvRg= +github.com/cockroachdb/sentry-go v0.6.1-cockroachdb.2 h1:IKgmqgMQlVJIZj19CdocBeSfSaiCbEBZGKODaixqtHM= +github.com/cockroachdb/sentry-go v0.6.1-cockroachdb.2/go.mod h1:8BT+cPK6xvFOcRlk0R8eg+OTkcqI6baNH4xAkpiYVvQ= +github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06 h1:zuQyyAKVxetITBuuhv3BI9cMrmStnpT18zmgmTxunpo= +github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06/go.mod h1:7nc4anLGjupUW/PeY5qiNYsdNXj7zopG+eqsS7To5IQ= +github.com/codegangsta/inject v0.0.0-20150114235600-33e0aa1cb7c0/go.mod h1:4Zcjuz89kmFXt9morQgcfYZAYZ5n8WHjt81YYWIwtTM= +github.com/consensys/bavard v0.1.13 h1:oLhMLOFGTLdlda/kma4VOJazblc7IM5y5QPd2A/YjhQ= +github.com/consensys/bavard v0.1.13/go.mod h1:9ItSMtA/dXMAiL7BG6bqW2m3NdSEObYWoH223nGHukI= +github.com/consensys/gnark-crypto v0.12.1 h1:lHH39WuuFgVHONRl3J0LRBtuYdQTumFSDtJF7HpyG8M= +github.com/consensys/gnark-crypto v0.12.1/go.mod h1:v2Gy7L/4ZRosZ7Ivs+9SfUDr0f5UlG+EM5t7MPHiLuY= +github.com/containerd/console v1.0.3/go.mod h1:7LqA/THxQ86k76b8c/EMSiaJ3h1eZkMkXar0TQ1gf3U= +github.com/containerd/containerd v1.7.11 h1:lfGKw3eU35sjV0aG2eYZTiwFEY1pCzxdzicHP3SZILw= +github.com/containerd/containerd v1.7.11/go.mod h1:5UluHxHTX2rdvYuZ5OJTC5m/KJNs0Zs9wVoJm9zf5ZE= +github.com/containerd/log v0.1.0 h1:TCJt7ioM2cr/tfR8GPbGf9/VRAX8D2B4PjzCpfX540I= +github.com/containerd/log v0.1.0/go.mod h1:VRRf09a7mHDIRezVKTRCrOq78v577GXq3bSa3EhrzVo= +github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= +github.com/coreos/go-etcd v2.0.0+incompatible/go.mod h1:Jez6KQU2B/sWsbdaef3ED8NzMklzPG4d5KIOhIy30Tk= +github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= +github.com/coreos/go-systemd/v22 v22.3.2/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= +github.com/cpuguy83/dockercfg v0.3.1 h1:/FpZ+JaygUR/lZP2NlFI2DVfrOEMAIKP5wWEJdoYe9E= +github.com/cpuguy83/dockercfg v0.3.1/go.mod h1:sugsbF4//dDlL/i+S+rtpIWp+5h0BHJHfjj5/jFyUJc= +github.com/cpuguy83/go-md2man v1.0.10/go.mod h1:SmD6nW6nTyfqj6ABTjUi3V3JVMnlJmwcJI5acqYI6dE= +github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= +github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= +github.com/cpuguy83/go-md2man/v2 v2.0.3 h1:qMCsGGgs+MAzDFyp9LpAe1Lqy/fY/qCovCm0qnXZOBM= +github.com/cpuguy83/go-md2man/v2 v2.0.3/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= +github.com/crate-crypto/go-kzg-4844 v0.7.0 h1:C0vgZRk4q4EZ/JgPfzuSoxdCq3C3mOZMBShovmncxvA= +github.com/crate-crypto/go-kzg-4844 v0.7.0/go.mod h1:1kMhvPgI0Ky3yIa+9lFySEBUBXkYxeOi8ZF1sYioxhc= +github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= +github.com/creack/pty v1.1.18 h1:n56/Zwd5o6whRC5PMGretI4IdRLlmBXYNjScPaBgsbY= +github.com/creack/pty v1.1.18/go.mod h1:MOBLtS5ELjhRRrroQr9kyvTxUAFNvYEK993ew/Vr4O4= +github.com/cyphar/filepath-securejoin v0.2.3/go.mod h1:aPGpWjXOXUn2NCNjFvBE6aRxGGx79pTxQpKOJNYHHl4= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/deckarep/golang-set/v2 v2.6.0 h1:XfcQbWM1LlMB8BsJ8N9vW5ehnnPVIw0je80NsVHagjM= +github.com/deckarep/golang-set/v2 v2.6.0/go.mod h1:VAky9rY/yGXJOLEDv3OMci+7wtDpOF4IN+y82NBOac4= +github.com/decred/dcrd/crypto/blake256 v1.0.1 h1:7PltbUIQB7u/FfZ39+DGa/ShuMyJ5ilcvdfma9wOH6Y= +github.com/decred/dcrd/crypto/blake256 v1.0.1/go.mod h1:2OfgNZ5wDpcsFmHmCK5gZTPcCXqlm2ArzUIkw9czNJo= +github.com/decred/dcrd/dcrec/secp256k1/v4 v4.2.0 h1:8UrgZ3GkP4i/CLijOJx79Yu+etlyjdBU4sfcs2WYQMs= +github.com/decred/dcrd/dcrec/secp256k1/v4 v4.2.0/go.mod h1:v57UDF4pDQJcEfFUCRop3lJL149eHGSe9Jvczhzjo/0= +github.com/dgraph-io/badger v1.6.0/go.mod h1:zwt7syl517jmP8s94KqSxTlM6IMsdhYy6psNgSztDR4= +github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= +github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= +github.com/docker/distribution v2.8.2+incompatible h1:T3de5rq0dB1j30rp0sA2rER+m322EBzniBPB6ZIzuh8= +github.com/docker/distribution v2.8.2+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= +github.com/docker/docker v24.0.7+incompatible h1:Wo6l37AuwP3JaMnZa226lzVXGA3F9Ig1seQen0cKYlM= +github.com/docker/docker v24.0.7+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= +github.com/docker/go-connections v0.4.0 h1:El9xVISelRB7BuFusrZozjnkIM5YnzCViNKohAFqRJQ= +github.com/docker/go-connections v0.4.0/go.mod h1:Gbd7IOopHjR8Iph03tsViu4nIes5XhDvyHbTtUxmeec= +github.com/docker/go-units v0.4.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= +github.com/docker/go-units v0.5.0 h1:69rxXcBk27SvSaaxTtLh/8llcHD8vYHT7WSdRZ/jvr4= +github.com/docker/go-units v0.5.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= +github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= +github.com/eknkc/amber v0.0.0-20171010120322-cdade1c07385/go.mod h1:0vRUJqYpeSZifjYj7uP3BG/gKcuzL9xWVV/Y+cK33KM= +github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= +github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= +github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= +github.com/etcd-io/bbolt v1.3.3/go.mod h1:ZF2nL25h33cCyBtcyWeZ2/I3HQOfTP+0PIEvHjkjCrw= +github.com/ethereum/c-kzg-4844 v0.4.0 h1:3MS1s4JtA868KpJxroZoepdV0ZKBp3u/O5HcZ7R3nlY= +github.com/ethereum/c-kzg-4844 v0.4.0/go.mod h1:VewdlzQmpT5QSrVhbBuGoCdFJkpaJlO1aQputP83wc0= +github.com/ethereum/go-ethereum v1.13.5 h1:U6TCRciCqZRe4FPXmy1sMGxTfuk8P7u2UoinF3VbaFk= +github.com/ethereum/go-ethereum v1.13.5/go.mod h1:yMTu38GSuyxaYzQMViqNmQ1s3cE84abZexQmTgenWk0= +github.com/fasthttp-contrib/websocket v0.0.0-20160511215533-1f3b11f56072/go.mod h1:duJ4Jxv5lDcvg4QuQr0oowTf7dz4/CR8NtyCooz9HL8= +github.com/fatih/structs v1.1.0/go.mod h1:9NiDSp5zOcgEDl+j00MP/WkGVPOlPRLejGD8Ga6PJ7M= +github.com/fjl/memsize v0.0.0-20190710130421-bcb5799ab5e5 h1:FtmdgXiUlNeRsoNMFlKLDt+S+6hbjVMEW6RGQ7aUf7c= +github.com/fjl/memsize v0.0.0-20190710130421-bcb5799ab5e5/go.mod h1:VvhXpOYNQvB+uIk2RvXzuaQtkQJzzIx6lSBe1xv7hi0= +github.com/flosch/pongo2 v0.0.0-20190707114632-bbf5a6c351f4/go.mod h1:T9YF2M40nIgbVgp3rreNmTged+9HrbNTIQf1PsaIiTA= +github.com/frankban/quicktest v1.11.3/go.mod h1:wRf/ReqHper53s+kmmSZizM8NamnL3IM0I9ntUbOk+k= +github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= +github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= +github.com/fsnotify/fsnotify v1.7.0 h1:8JEhPFa5W2WU7YfeZzPNqzMP6Lwt7L2715Ggo0nosvA= +github.com/fsnotify/fsnotify v1.7.0/go.mod h1:40Bi/Hjc2AVfZrqy+aj+yEI+/bRxZnMJyTJwOpGvigM= +github.com/gavv/httpexpect v2.0.0+incompatible/go.mod h1:x+9tiU1YnrOvnB725RkpoLv1M62hOWzwo5OXotisrKc= +github.com/gballet/go-libpcsclite v0.0.0-20190607065134-2772fd86a8ff h1:tY80oXqGNY4FhTFhk+o9oFHGINQ/+vhlm8HFzi6znCI= +github.com/gballet/go-libpcsclite v0.0.0-20190607065134-2772fd86a8ff/go.mod h1:x7DCsMOv1taUwEWCzT4cmDeAkigA5/QCwUodaVOe8Ww= +github.com/gin-contrib/sse v0.0.0-20190301062529-5545eab6dad3/go.mod h1:VJ0WA2NBN22VlZ2dKZQPAPnyWw5XTlK1KymzLKsr59s= +github.com/gin-gonic/gin v1.4.0/go.mod h1:OW2EZn3DO8Ln9oIKOvM++LBO+5UPHJJDH72/q/3rZdM= +github.com/go-check/check v0.0.0-20180628173108-788fd7840127/go.mod h1:9ES+weclKsC9YodN5RgxqK/VD9HM9JsCSh7rNhMZE98= +github.com/go-errors/errors v1.0.1 h1:LUHzmkK3GUKUrL/1gfBUxAHzcev3apQlezX/+O7ma6w= +github.com/go-errors/errors v1.0.1/go.mod h1:f4zRHt4oKfwPJE5k8C9vpYG+aDHdBFUsgrm6/TyX73Q= +github.com/go-martini/martini v0.0.0-20170121215854-22fa46961aab/go.mod h1:/P9AEU963A2AYjv4d1V5eVL1CQbEJq6aCNHDDjibzu8= +github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= +github.com/go-ole/go-ole v1.3.0 h1:Dt6ye7+vXGIKZ7Xtk4s6/xVdGDQynvom7xCFEdWr6uE= +github.com/go-ole/go-ole v1.3.0/go.mod h1:5LS6F96DhAwUc7C+1HLexzMXY1xGRSryjyPPKW6zv78= +github.com/go-stack/stack v1.8.1 h1:ntEHSVwIt7PNXNpgPmVfMrNhLtgjlmnZha2kOpuRiDw= +github.com/go-stack/stack v1.8.1/go.mod h1:dcoOX6HbPZSZptuspn9bctJ+N/CnF5gGygcUP3XYfe4= +github.com/gobwas/httphead v0.0.0-20180130184737-2c6c146eadee/go.mod h1:L0fX3K22YWvt/FAX9NnzrNzcI4wNYi9Yku4O0LKYflo= +github.com/gobwas/pool v0.2.0/go.mod h1:q8bcK0KcYlCgd9e7WYLm9LpyS+YeLd8JVDW6WezmKEw= +github.com/gobwas/ws v1.0.2/go.mod h1:szmBTxLgaFppYjEmNtny/v3w89xOydFnnZMcgRRu/EM= +github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= +github.com/godbus/dbus/v5 v5.0.6/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= +github.com/gofrs/flock v0.8.1 h1:+gYjHKf32LDeiEEFhQaotPbLuUXjY5ZqxKgXy7n59aw= +github.com/gofrs/flock v0.8.1/go.mod h1:F1TvTiK9OcQqauNUHlbJvyl9Qa1QvF/gOUDKA14jxHU= +github.com/gogo/googleapis v0.0.0-20180223154316-0cd9801be74a/go.mod h1:gf4bu3Q80BeJ6H1S1vYPm8/ELATdvryBaNFGgqEef3s= +github.com/gogo/protobuf v1.2.0/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= +github.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= +github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= +github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= +github.com/gogo/status v1.1.0/go.mod h1:BFv9nrluPLmrS0EmGVvLaPNmRosr9KapBYd5/hpY1WM= +github.com/golang-jwt/jwt/v4 v4.5.0 h1:7cYmW1XlMY7h7ii7UhUyChSgS5wUJEnm9uZVTGqOWzg= +github.com/golang-jwt/jwt/v4 v4.5.0/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= +github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= +github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= +github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= +github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= +github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= +github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= +github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= +github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= +github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= +github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= +github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg= +github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= +github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb h1:PBC98N2aIaM3XXiurYmW7fx4GZkL8feAMVq7nEjURHk= +github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/gomodule/redigo v1.7.1-0.20190724094224-574c33c3df38/go.mod h1:B4C85qUVwatsJoIUNIfCRsp7qO0iAmpGFZ4EELWSbC4= +github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= +github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= +github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/google/go-querystring v1.0.0/go.mod h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO6wN/zVPAxq5ck= +github.com/google/subcommands v1.2.0/go.mod h1:ZjhPrFU+Olkh9WazFPsl27BQ4UPiG37m3yTrtFlrHVk= +github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= +github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= +github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= +github.com/gorilla/websocket v1.5.1 h1:gmztn0JnHVt9JZquRuzLw3g4wouNVzKL15iLr/zn/QY= +github.com/gorilla/websocket v1.5.1/go.mod h1:x3kM2JMyaluk02fnUJpQuwD2dCS5NDG2ZHL0uE0tcaY= +github.com/hashicorp/go-bexpr v0.1.10 h1:9kuI5PFotCboP3dkDYFr/wi0gg0QVbSNz5oFRpxn4uE= +github.com/hashicorp/go-bexpr v0.1.10/go.mod h1:oxlubA2vC/gFVfX1A6JGp7ls7uCDlfJn732ehYYg+g0= +github.com/hashicorp/go-version v1.2.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= +github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= +github.com/holiman/billy v0.0.0-20230718173358-1c7e68d277a7 h1:3JQNjnMRil1yD0IfZKHF9GxxWKDJGj8I0IqOUol//sw= +github.com/holiman/billy v0.0.0-20230718173358-1c7e68d277a7/go.mod h1:5GuXa7vkL8u9FkFuWdVvfR5ix8hRB7DbOAaYULamFpc= +github.com/holiman/bloomfilter/v2 v2.0.3 h1:73e0e/V0tCydx14a0SCYS/EWCxgwLZ18CZcZKVu0fao= +github.com/holiman/bloomfilter/v2 v2.0.3/go.mod h1:zpoh+gs7qcpqrHr3dB55AMiJwo0iURXE7ZOP9L9hSkA= +github.com/holiman/uint256 v1.2.4 h1:jUc4Nk8fm9jZabQuqr2JzednajVmBpC+oiTiXZJEApU= +github.com/holiman/uint256 v1.2.4/go.mod h1:EOMSn4q6Nyt9P6efbI3bueV4e1b3dGlUCXeiRV4ng7E= +github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= +github.com/huin/goupnp v1.3.0 h1:UvLUlWDNpoUdYzb2TCn+MuTWtcjXKSza2n6CBdQ0xXc= +github.com/huin/goupnp v1.3.0/go.mod h1:gnGPsThkYa7bFi/KWmEysQRf48l2dvR5bxr2OFckNX8= +github.com/hydrogen18/memlistener v0.0.0-20141126152155-54553eb933fb/go.mod h1:qEIFzExnS6016fRpRfxrExeVn2gbClQA99gQhnIcdhE= +github.com/imkira/go-interpol v1.1.0/go.mod h1:z0h2/2T3XF8kyEPpRgJ3kmNv+C43p+I/CoI+jC3w2iA= +github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= +github.com/iris-contrib/blackfriday v2.0.0+incompatible/go.mod h1:UzZ2bDEoaSGPbkg6SAB4att1aAwTmVIx/5gCVqeyUdI= +github.com/iris-contrib/go.uuid v2.0.0+incompatible/go.mod h1:iz2lgM/1UnEf1kP0L/+fafWORmlnuysV2EMP8MW+qe0= +github.com/iris-contrib/i18n v0.0.0-20171121225848-987a633949d0/go.mod h1:pMCz62A0xJL6I+umB2YTlFRwWXaDFA0jy+5HzGiJjqI= +github.com/iris-contrib/schema v0.0.1/go.mod h1:urYA3uvUNG1TIIjOSCzHr9/LmbQo8LrOcOqfqxa4hXw= +github.com/jackpal/go-nat-pmp v1.0.2 h1:KzKSgb7qkJvOUTqYl9/Hg/me3pWgBmERKrTGD7BdWus= +github.com/jackpal/go-nat-pmp v1.0.2/go.mod h1:QPH045xvCAeXUZOxsnwmrtiCoxIr9eob+4orBN1SBKc= +github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= +github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= +github.com/juju/errors v0.0.0-20181118221551-089d3ea4e4d5/go.mod h1:W54LbzXuIE0boCoNJfwqpmkKJ1O4TCTZMetAt6jGk7Q= +github.com/juju/loggo v0.0.0-20180524022052-584905176618/go.mod h1:vgyd7OREkbtVEN/8IXZe5Ooef3LQePvuBm9UWj6ZL8U= +github.com/juju/testing v0.0.0-20180920084828-472a3e8b2073/go.mod h1:63prj8cnj0tU0S9OHjGJn+b1h0ZghCndfnbQolrYTwA= +github.com/k0kubun/colorstring v0.0.0-20150214042306-9440f1994b88/go.mod h1:3w7q1U84EfirKl04SVQ/s7nPm1ZPhiXd34z40TNz36k= +github.com/kataras/golog v0.0.9/go.mod h1:12HJgwBIZFNGL0EJnMRhmvGA0PQGx8VFwrZtM4CqbAk= +github.com/kataras/iris/v12 v12.0.1/go.mod h1:udK4vLQKkdDqMGJJVd/msuMtN6hpYJhg/lSzuxjhO+U= +github.com/kataras/neffos v0.0.10/go.mod h1:ZYmJC07hQPW67eKuzlfY7SO3bC0mw83A3j6im82hfqw= +github.com/kataras/pio v0.0.0-20190103105442-ea782b38602d/go.mod h1:NV88laa9UiiDuX9AhMbDPkGYSPugBOV6yTZB1l2K9Z0= +github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00= +github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= +github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= +github.com/klauspost/compress v1.8.2/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= +github.com/klauspost/compress v1.9.0/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= +github.com/klauspost/compress v1.16.0 h1:iULayQNOReoYUe+1qtKOqw9CwJv3aNQu8ivo7lw1HU4= +github.com/klauspost/compress v1.16.0/go.mod h1:ntbaceVETuRiXiv4DpjP66DpAtAGkEQskQzEyD//IeE= +github.com/klauspost/cpuid v1.2.1/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek= +github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= +github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= +github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= +github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= +github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= +github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= +github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= +github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= +github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc= +github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= +github.com/labstack/echo/v4 v4.1.11/go.mod h1:i541M3Fj6f76NZtHSj7TXnyM8n2gaodfvfxNnFqi74g= +github.com/labstack/gommon v0.3.0/go.mod h1:MULnywXg0yavhxWKc+lOruYdAhDwPK9wf0OL7NoOu+k= +github.com/leanovate/gopter v0.2.9 h1:fQjYxZaynp97ozCzfOyOuAGOU4aU/z37zf/tOujFk7c= +github.com/leanovate/gopter v0.2.9/go.mod h1:U2L/78B+KVFIx2VmW6onHJQzXtFb+p5y3y2Sh+Jxxv8= +github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0 h1:6E+4a0GO5zZEnZ81pIr0yLvtUWk2if982qA3F3QD6H4= +github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0/go.mod h1:zJYVVT2jmtg6P3p1VtQj7WsuWi/y4VnjVBn7F8KPB3I= +github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= +github.com/magiconair/properties v1.8.7 h1:IeQXZAiQcpL9mgcAe1Nu6cX9LLw6ExEHKjN0VQdvPDY= +github.com/magiconair/properties v1.8.7/go.mod h1:Dhd985XPs7jluiymwWYZ0G4Z61jb3vdS329zhj2hYo0= +github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= +github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= +github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= +github.com/mattn/go-isatty v0.0.7/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= +github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= +github.com/mattn/go-isatty v0.0.9/go.mod h1:YNRxwqDuOph6SZLI9vUUz6OYw3QyUt7WiY2yME+cCiQ= +github.com/mattn/go-isatty v0.0.17 h1:BTarxUcIeDqL27Mc+vyvdWYSL28zpIhv3RoTdsLMPng= +github.com/mattn/go-isatty v0.0.17/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= +github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= +github.com/mattn/go-runewidth v0.0.13 h1:lTGmDsbAYt5DmK6OnoV7EuIF1wEIFAcxld6ypU4OSgU= +github.com/mattn/go-runewidth v0.0.13/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= +github.com/mattn/goveralls v0.0.2/go.mod h1:8d1ZMHsd7fW6IRPKQh46F2WRpyib5/X4FOpevwGNQEw= +github.com/mediocregopher/mediocre-go-lib v0.0.0-20181029021733-cb65787f37ed/go.mod h1:dSsfyI2zABAdhcbvkXqgxOxrCsbYeHCPgrZkku60dSg= +github.com/mediocregopher/radix/v3 v3.3.0/go.mod h1:EmfVyvspXz1uZEyPBMyGK+kjWiKQGvsUt6O3Pj+LDCQ= +github.com/microcosm-cc/bluemonday v1.0.2/go.mod h1:iVP4YcDBq+n/5fb23BhYFvIMq/leAFZyRl6bYmGDlGc= +github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= +github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= +github.com/mitchellh/mapstructure v1.4.1 h1:CpVNEelQCZBooIPDn+AR3NpivK/TIKU8bDxdASFVQag= +github.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= +github.com/mitchellh/pointerstructure v1.2.0 h1:O+i9nHnXS3l/9Wu7r4NrEdwA2VFTicjUEN1uBnDo34A= +github.com/mitchellh/pointerstructure v1.2.0/go.mod h1:BRAsLI5zgXmw97Lf6s25bs8ohIXc3tViBH44KcwB2g4= +github.com/mmcloughlin/addchain v0.4.0 h1:SobOdjm2xLj1KkXN5/n0xTIWyZA2+s99UCY1iPfkHRY= +github.com/mmcloughlin/addchain v0.4.0/go.mod h1:A86O+tHqZLMNO4w6ZZ4FlVQEadcoqkyU72HC5wJ4RlU= +github.com/mmcloughlin/profile v0.1.1/go.mod h1:IhHD7q1ooxgwTgjxQYkACGA77oFTDdFVejUS1/tS/qU= +github.com/moby/patternmatcher v0.6.0 h1:GmP9lR19aU5GqSSFko+5pRqHi+Ohk1O69aFiKkVGiPk= +github.com/moby/patternmatcher v0.6.0/go.mod h1:hDPoyOpDY7OrrMDLaYoY3hf52gNCR/YOUYxkhApJIxc= +github.com/moby/sys/mountinfo v0.5.0/go.mod h1:3bMD3Rg+zkqx8MRYPi7Pyb0Ie97QEBmdxbhnCLlSvSU= +github.com/moby/sys/sequential v0.5.0 h1:OPvI35Lzn9K04PBbCLW0g4LcFAJgHsvXsRyewg5lXtc= +github.com/moby/sys/sequential v0.5.0/go.mod h1:tH2cOOs5V9MlPiXcQzRC+eEyab644PWKGRYaaV5ZZlo= +github.com/moby/term v0.5.0 h1:xt8Q1nalod/v7BqbG21f8mQPqH+xAaC9C3N3wfWbVP0= +github.com/moby/term v0.5.0/go.mod h1:8FzsFHVUBGZdbDsJw/ot+X+d5HLUbvklYLJ9uGfcI3Y= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= +github.com/morikuni/aec v1.0.0 h1:nP9CBfwrvYnBRgY6qfDQkygYDmYwOilePFkwzv4dU8A= +github.com/morikuni/aec v1.0.0/go.mod h1:BbKIizmSmc5MMPqRYbxO4ZU0S0+P200+tUnFx7PXmsc= +github.com/moul/http2curl v1.0.0/go.mod h1:8UbvGypXm98wA/IqH45anm5Y2Z6ep6O31QGOAZ3H0fQ= +github.com/mrunalp/fileutils v0.5.0/go.mod h1:M1WthSahJixYnrXQl/DFQuteStB1weuxD2QJNHXfbSQ= +github.com/nats-io/nats.go v1.8.1/go.mod h1:BrFz9vVn0fU3AcH9Vn4Kd7W0NpJ651tD5omQ3M8LwxM= +github.com/nats-io/nkeys v0.0.2/go.mod h1:dab7URMsZm6Z/jp9Z5UGa87Uutgc2mVpXLC4B7TDb/4= +github.com/nats-io/nuid v1.0.1/go.mod h1:19wcPz3Ph3q0Jbyiqsd0kePYG7A95tJPxeL+1OSON2c= +github.com/nxadm/tail v1.4.4 h1:DQuhQpB1tVlglWS2hLQ5OV6B5r8aGxSrPc5Qo6uTN78= +github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= +github.com/olekukonko/tablewriter v0.0.5 h1:P2Ga83D34wi1o9J6Wh1mRuqd4mF/x/lgBS7N7AbDhec= +github.com/olekukonko/tablewriter v0.0.5/go.mod h1:hPp6KlRPjbx+hW8ykQs1w3UBbZlj6HuIJcUGPhkA7kY= +github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= +github.com/onsi/ginkgo v1.13.0/go.mod h1:+REjRxOmWfHCjfv9TTWB1jD1Frx4XydAD3zm1lskyM0= +github.com/onsi/ginkgo v1.14.0 h1:2mOpI4JVVPBN+WQRa0WKH2eXR+Ey+uK4n7Zj0aYpIQA= +github.com/onsi/ginkgo v1.14.0/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY= +github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= +github.com/onsi/gomega v1.10.1 h1:o0+MgICZLuZ7xjH7Vx6zS/zcu93/BEp1VwkIW1mEXCE= +github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= +github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U= +github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM= +github.com/opencontainers/image-spec v1.1.0-rc5 h1:Ygwkfw9bpDvs+c9E34SdgGOj41dX/cbdlwvlWt0pnFI= +github.com/opencontainers/image-spec v1.1.0-rc5/go.mod h1:X4pATf0uXsnn3g5aiGIsVnJBR4mxhKzfwmvK/B2NTm8= +github.com/opencontainers/runc v1.1.5 h1:L44KXEpKmfWDcS02aeGm8QNTFXTo2D+8MYGDIJ/GDEs= +github.com/opencontainers/runc v1.1.5/go.mod h1:1J5XiS+vdZ3wCyZybsuxXZWGrgSr8fFJHLXuG2PsnNg= +github.com/opencontainers/runtime-spec v1.0.3-0.20210326190908-1c3f411f0417/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= +github.com/opencontainers/selinux v1.10.0/go.mod h1:2i0OySw99QjzBBQByd1Gr9gSjvuho1lHsJxIJ3gGbJI= +github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= +github.com/pingcap/errors v0.11.4 h1:lFuQV/oaUMGcD2tqt+01ROSmJs75VG1ToEOkZIZ4nE4= +github.com/pingcap/errors v0.11.4/go.mod h1:Oi8TUi2kEtXXLMJk9l1cGmz20kV3TaQ0usTwv5KuLY8= +github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= +github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= +github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c h1:ncq/mPwQF4JjgDlrVEn3C11VoGHZN7m8qihwgMEtzYw= +github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE= +github.com/prometheus/client_golang v1.18.0 h1:HzFfmkOzH5Q8L8G+kSJKUx5dtG87sewO+FoDDqP5Tbk= +github.com/prometheus/client_golang v1.18.0/go.mod h1:T+GXkCk5wSJyOqMIzVgvvjFDlkOQntgjkJWKrN5txjA= +github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/prometheus/client_model v0.5.0 h1:VQw1hfvPvk3Uv6Qf29VrPF32JB6rtbgI6cYPYQjL0Qw= +github.com/prometheus/client_model v0.5.0/go.mod h1:dTiFglRmd66nLR9Pv9f0mZi7B7fk5Pm3gvsjB5tr+kI= +github.com/prometheus/common v0.46.0 h1:doXzt5ybi1HBKpsZOL0sSkaNHJJqkyfEWZGGqqScV0Y= +github.com/prometheus/common v0.46.0/go.mod h1:Tp0qkxpb9Jsg54QMe+EAmqXkSV7Evdy1BTn+g2pa/hQ= +github.com/prometheus/procfs v0.12.0 h1:jluTpSng7V9hY0O2R9DzzJHYb2xULk9VTR1V1R/k6Bo= +github.com/prometheus/procfs v0.12.0/go.mod h1:pcuDEFsWDnvcgNzo4EEweacyhjeA9Zk3cnaOZAZEfOo= +github.com/rivo/uniseg v0.2.0 h1:S1pD9weZBuJdFmowNwbpi7BJ8TNftyUImj/0WQi72jY= +github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= +github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs= +github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ= +github.com/rogpeppe/go-internal v1.10.0/go.mod h1:UQnix2H7Ngw/k4C5ijL5+65zddjncjaFoBhdsK/akog= +github.com/rs/cors v1.7.0 h1:+88SsELBHx5r+hZ8TCkggzSstaWNbDvThkVK8H6f9ik= +github.com/rs/cors v1.7.0/go.mod h1:gFx+x8UowdsKA9AchylcLynDq+nNFfI8FkUZdN/jGCU= +github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g= +github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= +github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk= +github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= +github.com/ryanuber/columnize v2.1.0+incompatible/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= +github.com/sclevine/agouti v3.0.0+incompatible/go.mod h1:b4WX9W9L1sfQKXeJf1mUTLZKJ48R1S7H23Ji7oFO5Bw= +github.com/seccomp/libseccomp-golang v0.9.2-0.20220502022130-f33da4d89646/go.mod h1:JA8cRccbGaA1s33RQf7Y1+q9gHmZX1yB/z9WDN1C6fg= +github.com/sergi/go-diff v1.1.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNXdaHfM= +github.com/shirou/gopsutil v3.21.11+incompatible h1:+1+c1VGhc88SSonWP6foOcLhvnKlUeu/erjjvaPEYiI= +github.com/shirou/gopsutil v3.21.11+incompatible/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA= +github.com/shirou/gopsutil/v3 v3.23.11 h1:i3jP9NjCPUz7FiZKxlMnODZkdSIp2gnzfrvsu9CuWEQ= +github.com/shirou/gopsutil/v3 v3.23.11/go.mod h1:1FrWgea594Jp7qmjHUUPlJDTPgcsb9mGnXDxavtikzM= +github.com/shoenig/go-m1cpu v0.1.6 h1:nxdKQNcEB6vzgA2E2bvzKIYRuNj7XNJ4S/aRSwKzFtM= +github.com/shoenig/go-m1cpu v0.1.6/go.mod h1:1JJMcUBvfNwpq05QDQVAnx3gUHr9IYF7GNg9SUEw2VQ= +github.com/shoenig/test v0.6.4 h1:kVTaSd7WLz5WZ2IaoM0RSzRsUD+m8wRR+5qvntpn4LU= +github.com/shoenig/test v0.6.4/go.mod h1:byHiCGXqrVaflBLAMq/srcZIHynQPQgeyvkvXnjqq0k= +github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= +github.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= +github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ= +github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= +github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= +github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= +github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= +github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= +github.com/spf13/cobra v0.0.5/go.mod h1:3K3wKZymM7VvHMDS9+Akkh4K60UwM26emMESw8tLCHU= +github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= +github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= +github.com/spf13/viper v1.3.2/go.mod h1:ZiWeW+zYFKm7srdB9IoDzzZXaJaI5eL9QjNiN/DMA2s= +github.com/status-im/keycard-go v0.2.0 h1:QDLFswOQu1r5jsycloeQh3bVU8n/NatHHaZobtDnDzA= +github.com/status-im/keycard-go v0.2.0/go.mod h1:wlp8ZLbsmrF6g6WjugPAx+IzoLrkdf9+mHxBEeo3Hbg= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= +github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= +github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= +github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= +github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= +github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= +github.com/supranational/blst v0.3.11 h1:LyU6FolezeWAhvQk0k6O/d49jqgO52MSDDfYgbeoEm4= +github.com/supranational/blst v0.3.11/go.mod h1:jZJtfjgudtNl4en1tzwPIV3KjUnQUvG3/j+w+fVonLw= +github.com/syndtr/gocapability v0.0.0-20200815063812-42c35b437635/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww= +github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7 h1:epCh84lMvA70Z7CTTCmYQn2CKbY8j86K7/FAIr141uY= +github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7/go.mod h1:q4W45IWZaF22tdD+VEXcAWRA037jwmWEB5VWYORlTpc= +github.com/testcontainers/testcontainers-go v0.26.0 h1:uqcYdoOHBy1ca7gKODfBd9uTHVK3a7UL848z09MVZ0c= +github.com/testcontainers/testcontainers-go v0.26.0/go.mod h1:ICriE9bLX5CLxL9OFQ2N+2N+f+803LNJ1utJb1+Inx0= +github.com/tklauser/go-sysconf v0.3.12/go.mod h1:Ho14jnntGE1fpdOqQEEaiKRpvIavV0hSfmBq8nJbHYI= +github.com/tklauser/go-sysconf v0.3.13 h1:GBUpcahXSpR2xN01jhkNAbTLRk2Yzgggk8IM08lq3r4= +github.com/tklauser/go-sysconf v0.3.13/go.mod h1:zwleP4Q4OehZHGn4CYZDipCgg9usW5IJePewFCGVEa0= +github.com/tklauser/numcpus v0.6.1/go.mod h1:1XfjsgE2zo8GVw7POkMbHENHzVg3GzmoZ9fESEdAacY= +github.com/tklauser/numcpus v0.7.0 h1:yjuerZP127QG9m5Zh/mSO4wqurYil27tHrqwRoRjpr4= +github.com/tklauser/numcpus v0.7.0/go.mod h1:bb6dMVcj8A42tSE7i32fsIUCbQNllK5iDguyOZRUzAY= +github.com/tyler-smith/go-bip39 v1.1.0 h1:5eUemwrMargf3BSLRRCalXT93Ns6pQJIjYQN2nyfOP8= +github.com/tyler-smith/go-bip39 v1.1.0/go.mod h1:gUYDtqQw1JS3ZJ8UWVcGTGqqr6YIN3CWg+kkNaLt55U= +github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGrc= +github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0= +github.com/urfave/cli v1.22.1/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= +github.com/urfave/cli v1.22.14 h1:ebbhrRiGK2i4naQJr+1Xj92HXZCrK7MsyTS/ob3HnAk= +github.com/urfave/cli v1.22.14/go.mod h1:X0eDS6pD6Exaclxm99NJ3FiCDRED7vIHpx2mDOHLvkA= +github.com/urfave/cli/v2 v2.26.0 h1:3f3AMg3HpThFNT4I++TKOejZO8yU55t3JnnSr4S4QEI= +github.com/urfave/cli/v2 v2.26.0/go.mod h1:8qnjx1vcq5s2/wpsqoZFndg2CE5tNFyrTvS6SinrnYQ= +github.com/urfave/negroni v1.0.0/go.mod h1:Meg73S6kFm/4PpbYdq35yYWoCZ9mS/YSx+lKnmiohz4= +github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= +github.com/valyala/fasthttp v1.6.0/go.mod h1:FstJa9V+Pj9vQ7OJie2qMHdwemEDaDiSdBnvPM1Su9w= +github.com/valyala/fasttemplate v1.0.1/go.mod h1:UQGH1tvbgY+Nz5t2n7tXsz52dQxojPUpymEIMZ47gx8= +github.com/valyala/tcplisten v0.0.0-20161114210144-ceec8f93295a/go.mod h1:v3UYOV9WzVtRmSR+PDvWpU/qWl4Wa5LApYYX4ZtKbio= +github.com/vishvananda/netlink v1.1.0/go.mod h1:cTgwzPIzzgDAYoQrMm0EdrjRUBkTqKYppBueQtXaqoE= +github.com/vishvananda/netns v0.0.0-20191106174202-0a2b9b5464df/go.mod h1:JP3t17pCcGlemwknint6hfoeCVQrEMVwxRLRjXpq+BU= +github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU= +github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415/go.mod h1:GwrjFmJcFw6At/Gs6z4yjiIwzuJ1/+UwLxMQDVQXShQ= +github.com/xeipuuv/gojsonschema v1.2.0/go.mod h1:anYRn/JVcOK2ZgGU+IjEV4nwlhoK5sQluxsYJ78Id3Y= +github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= +github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673 h1:bAn7/zixMGCfxrRTfdpNzjtPYqr8smhKouy9mxVdGPU= +github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673/go.mod h1:N3UwUGtsrSj3ccvlPHLoLsHnpR27oXr4ZE984MbSER8= +github.com/yalp/jsonpath v0.0.0-20180802001716-5cc68e5049a0/go.mod h1:/LWChgwKmvncFJFHJ7Gvn9wZArjbV5/FppcK2fKk/tI= +github.com/yudai/gojsondiff v1.0.0/go.mod h1:AY32+k2cwILAkW1fbgxQ5mUmMiZFgLIV+FBNExI05xg= +github.com/yudai/golcs v0.0.0-20170316035057-ecda9a501e82/go.mod h1:lgjkn3NuSvDfVJdfcVVdX+jpBxNmX4rDAzaS45IcYoM= +github.com/yudai/pp v2.0.1+incompatible/go.mod h1:PuxR/8QJ7cyCkFp/aUDS+JY727OFEZkTdatxwunjIkc= +github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yusufpapurcu/wmi v1.2.3 h1:E1ctvB7uKFMOJw3fdOW32DwGE9I7t++CRUEMKvFoFiw= +github.com/yusufpapurcu/wmi v1.2.3/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0= +go.uber.org/goleak v1.2.0 h1:xqgm/S+aQvhWFTtR0XK3Jvg7z8kGV8P4X14IzwN3Eqk= +go.uber.org/goleak v1.2.0/go.mod h1:XJYK+MuIchqpmGmUSAzotztawfKvYLUIgg7guXrwVUo= +go.uber.org/mock v0.3.0 h1:3mUxI1No2/60yUYax92Pt8eNOEecx2D3lcXZh2NEZJo= +go.uber.org/mock v0.3.0/go.mod h1:a6FSlNadKUHUa9IP5Vyt1zh4fC7uAwxMutEAscFbkZc= +go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= +go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= +go.uber.org/zap v1.26.0 h1:sI7k6L95XOKS281NhVKOFCUNIvv9e0w4BF8N3u+tCRo= +go.uber.org/zap v1.26.0/go.mod h1:dtElttAiwGvoJ/vj4IwHBS/gXsEu/pZ50mUIRWuG0so= +golang.org/x/crypto v0.0.0-20181203042331-505ab145d0a9/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.18.0 h1:PGVlW0xEltQnzFZ55hkuX5+KLyrMYhHld1YHO4AKcdc= +golang.org/x/crypto v0.18.0/go.mod h1:R0j02AL6hcrfOiy9T4ZYp/rcWeMxM3L6QYxlOuEG1mg= +golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/exp v0.0.0-20240119083558-1b970713d09a h1:Q8/wZp0KX97QFTc2ywcOE0YRjZPVIx+MXInMzdvQqcA= +golang.org/x/exp v0.0.0-20240119083558-1b970713d09a/go.mod h1:idGWGoKP1toJGkd5/ig9ZLuPcZBC3ewk7SzmH0uou08= +golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= +golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= +golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.14.0 h1:dGoOF9QVLYng8IHTm7BAyWqCqSheQ5pYWGhzW00YJr0= +golang.org/x/mod v0.14.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= +golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20181220203305-927f97764cc3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190327091125-710a502c58a2/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200813134508-3edf25e44fcc/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20201224014010-6772e930b67b/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.20.0 h1:aCL9BSgETF1k+blQaYUBx9hJ9LOGP3gAVemcZlf1Kpo= +golang.org/x/net v0.20.0/go.mod h1:z8BVo6PvndSri0LbOE3hAn0apkU+1YvI6E70E9jsnvY= +golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= +golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.6.0 h1:5BMeUDZ7vkXGfEr1x9B4bRcTH4lpkTkpdh0T/J+qjbQ= +golang.org/x/sync v0.6.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= +golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20181205085412-a5c9d58dba9a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190606203320-7fc4e5ec1444/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190626221950-04f50cda93cb/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190813064441-fde4db37ae7a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191115151921-52ab43148777/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200519105757-fe76b779f299/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200814200057-3d37ad5750ed/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201204225414-ed752295db88/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210616094352-59db8d763f22/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210906170528-6f6e22806c34/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211025201205-69cdffdb9359/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211116061358-0a5406a5449c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.15.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.16.0 h1:xWw16ngr6ZMtmxDyKyIgsE93KNKz5HKmMa3b8ALHidU= +golang.org/x/sys v0.16.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= +golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= +golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= +golang.org/x/time v0.3.0 h1:rg5rLMjNzMS1RkNLzCG38eapWhnYLFYXDXj2gOlr8j4= +golang.org/x/time v0.3.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20181030221726-6c7e314b6563/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20181221001348-537d06c36207/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= +golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190327201419-c70d86f8b7cf/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.17.0 h1:FvmRgNOcs3kOa+T20R1uhfP9F6HgG2mfxDv1vrx1Htc= +golang.org/x/tools v0.17.0/go.mod h1:xsh6VxdV005rRVaS6SSAf9oiAqljS7UZUacMZ8Bnsps= +golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 h1:go1bK/D/BFZV2I8cIQd1NKEZ+0owSTG1fDTci4IqFcE= +golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= +google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= +google.golang.org/genproto v0.0.0-20180518175338-11a468237815/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= +google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= +google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= +google.golang.org/genproto/googleapis/rpc v0.0.0-20230711160842-782d3b101e98 h1:bVf09lpb+OJbByTj913DRJioFFAjf/ZGxEz7MajTp2U= +google.golang.org/genproto/googleapis/rpc v0.0.0-20230711160842-782d3b101e98/go.mod h1:TUfxEVdsvPg18p6AslUXFoLdpED4oBnGwyqk3dV1XzM= +google.golang.org/grpc v1.12.0/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw= +google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= +google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= +google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= +google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk= +google.golang.org/grpc v1.58.3 h1:BjnpXut1btbtgN/6sp+brB2Kbm2LjNXnidYujAVbSoQ= +google.golang.org/grpc v1.58.3/go.mod h1:tgX3ZQDlNJGU96V6yHh1T/JeoBQ2TXdr43YbYSsCJk0= +google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= +google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= +google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= +google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= +google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= +google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= +google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= +google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= +google.golang.org/protobuf v1.32.0 h1:pPC6BG5ex8PDFnkbrGU3EixyhKcQ2aDuBS36lqK/C7I= +google.golang.org/protobuf v1.32.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= +gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= +gopkg.in/go-playground/assert.v1 v1.2.1/go.mod h1:9RXL0bg/zibRAgZUYszZSwO/z8Y/a8bDuhia5mkpMnE= +gopkg.in/go-playground/validator.v8 v8.18.2/go.mod h1:RX2a/7Ha8BgOhfk7j780h4/u/RRjR0eouCJSH80/M2Y= +gopkg.in/mgo.v2 v2.0.0-20180705113604-9856a29383ce/go.mod h1:yeKp02qBN3iKW1OzL3MGk2IdtZzaj7SFntXj72NppTA= +gopkg.in/natefinch/lumberjack.v2 v2.0.0 h1:1Lc07Kr7qY4U2YPouBjpCLxpiyxIVoxqXgkXLknAOE8= +gopkg.in/natefinch/lumberjack.v2 v2.0.0/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24xpD6X8LsfU/+k= +gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= +gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= +gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= +gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gotest.tools/v3 v3.5.0 h1:Ljk6PdHdOhAb5aDMWXjDLMMhph+BpztA4v1QdqEW2eY= +gotest.tools/v3 v3.5.0/go.mod h1:isy3WKz7GK6uNw/sbHzfKBLvlvXwUyV06n6brMxxopU= +honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +rsc.io/tmplfunc v0.0.3 h1:53XFQh69AfOa8Tw0Jm7t+GV7KZhOi6jzsCzTtKbMvzU= +rsc.io/tmplfunc v0.0.3/go.mod h1:AG3sTPzElb1Io3Yg4voV9AGZJuleGAwaVRxL9M49PhA= diff --git a/grafana/provisioning/dashboards/AVSs/sffl.json b/grafana/provisioning/dashboards/AVSs/sffl.json new file mode 100644 index 00000000..cdb87527 --- /dev/null +++ b/grafana/provisioning/dashboards/AVSs/sffl.json @@ -0,0 +1,326 @@ +{ + "annotations": { + "list": [ + { + "builtIn": 1, + "datasource": { + "type": "grafana", + "uid": "-- Grafana --" + }, + "enable": true, + "hide": true, + "iconColor": "rgba(0, 211, 255, 1)", + "name": "Annotations & Alerts", + "target": { + "limit": 100, + "matchAny": false, + "tags": [], + "type": "dashboard" + }, + "type": "dashboard" + } + ] + }, + "editable": true, + "fiscalYearStartMonth": 0, + "graphTooltip": 0, + "id": 2, + "links": [], + "liveNow": false, + "panels": [ + { + "datasource": { + "type": "prometheus", + "uid": "prometheus" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 0 + }, + "id": 4, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "prometheus" + }, + "editorMode": "builder", + "expr": "sffl_num_tasks_received", + "legendFormat": "__auto", + "range": true, + "refId": "A" + } + ], + "title": "New Tasks Received", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "prometheus" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 12, + "y": 0 + }, + "id": 6, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "prometheus" + }, + "editorMode": "builder", + "expr": "sffl_num_signed_task_responses_accepted_by_aggregator", + "legendFormat": "__auto", + "range": true, + "refId": "A" + } + ], + "title": "Signed Tasks Responses", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "prometheus" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 9, + "w": 12, + "x": 0, + "y": 8 + }, + "id": 2, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "prometheus" + }, + "editorMode": "builder", + "expr": "eigen_performance_score{avs_name=\"super-fast-finality-layer\"}", + "legendFormat": "__auto", + "range": true, + "refId": "A" + } + ], + "title": "Performance Score", + "type": "timeseries" + } + ], + "refresh": "10s", + "revision": 1, + "schemaVersion": 38, + "style": "dark", + "tags": [], + "templating": { + "list": [] + }, + "time": { + "from": "now-15m", + "to": "now" + }, + "timepicker": {}, + "timezone": "", + "title": "SFFL", + "uid": "vgD8u1U4z", + "version": 2, + "weekStart": "" +} \ No newline at end of file diff --git a/grafana/provisioning/dashboards/dashboard_provider.yml b/grafana/provisioning/dashboards/dashboard_provider.yml new file mode 100644 index 00000000..1caea931 --- /dev/null +++ b/grafana/provisioning/dashboards/dashboard_provider.yml @@ -0,0 +1,17 @@ +apiVersion: 1 + +# dashboard providers +# we use a single generic one for now. +# we could split this into a provider for sui bot related, and one for general purpose, etc eventually +# see https://grafana.com/docs/grafana/latest/administration/provisioning/#dashboards +providers: + - name: 'Local Files' + folder: '' # General is the default + type: file + disableDeletion: false + editable: true + allowUiUpdates: true + updateIntervalSeconds: 10 + options: + path: /etc/grafana/provisioning/dashboards + foldersFromFilesStructure: true \ No newline at end of file diff --git a/grafana/provisioning/dashboards/system/monitor_prometheus.json b/grafana/provisioning/dashboards/system/monitor_prometheus.json new file mode 100644 index 00000000..e66af97e --- /dev/null +++ b/grafana/provisioning/dashboards/system/monitor_prometheus.json @@ -0,0 +1,3412 @@ +{ + "id": null, + "title": "Monitor Prometheus Services", + "tags": [ + "prometheus" + ], + "style": "dark", + "timezone": "browser", + "editable": true, + "hideControls": false, + "sharedCrosshair": true, + "panels": [ + { + "cacheTimeout": null, + "colorBackground": false, + "colorValue": false, + "colors": [ + "rgba(245, 54, 54, 0.9)", + "rgba(237, 129, 40, 0.89)", + "rgba(50, 172, 45, 0.97)" + ], + "datasource": "Prometheus", + "decimals": 1, + "editable": true, + "error": false, + "format": "s", + "gauge": { + "maxValue": 100, + "minValue": 0, + "show": false, + "thresholdLabels": false, + "thresholdMarkers": true + }, + "gridPos": { + "h": 3, + "w": 6, + "x": 0, + "y": 0 + }, + "hideTimeOverride": true, + "id": 1, + "interval": null, + "links": [], + "mappingType": 1, + "mappingTypes": [ + { + "name": "value to text", + "value": 1 + }, + { + "name": "range to text", + "value": 2 + } + ], + "maxDataPoints": 100, + "nullPointMode": "connected", + "nullText": null, + "postfix": "s", + "postfixFontSize": "80%", + "prefix": "", + "prefixFontSize": "50%", + "rangeMaps": [ + { + "from": "null", + "text": "N/A", + "to": "null" + } + ], + "sparkline": { + "fillColor": "rgba(31, 118, 189, 0.18)", + "full": false, + "lineColor": "rgb(31, 120, 193)", + "show": false + }, + "tableColumn": "", + "targets": [ + { + "expr": "(time() - process_start_time_seconds{instance=\"localhost:9090\",job=\"prometheus\"})", + "interval": "10s", + "intervalFactor": 1, + "legendFormat": "", + "refId": "A", + "step": 10 + } + ], + "thresholds": "", + "timeFrom": "10s", + "timeShift": null, + "title": "Prometheus Uptime", + "type": "singlestat", + "valueFontSize": "80%", + "valueMaps": [ + { + "op": "=", + "text": "N/A", + "value": "null" + } + ], + "valueName": "avg" + }, + { + "cacheTimeout": null, + "colorBackground": false, + "colorValue": false, + "colors": [ + "rgba(245, 54, 54, 0.9)", + "rgba(237, 129, 40, 0.89)", + "rgba(50, 172, 45, 0.97)" + ], + "datasource": "Prometheus", + "decimals": 2, + "editable": true, + "error": false, + "format": "bytes", + "gauge": { + "maxValue": 100, + "minValue": 0, + "show": false, + "thresholdLabels": false, + "thresholdMarkers": true + }, + "gridPos": { + "h": 3, + "w": 6, + "x": 6, + "y": 0 + }, + "hideTimeOverride": true, + "id": 5, + "interval": null, + "links": [], + "mappingType": 1, + "mappingTypes": [ + { + "name": "value to text", + "value": 1 + }, + { + "name": "range to text", + "value": 2 + } + ], + "maxDataPoints": 100, + "nullPointMode": "connected", + "nullText": null, + "postfix": "", + "postfixFontSize": "50%", + "prefix": "", + "prefixFontSize": "50%", + "rangeMaps": [ + { + "from": "null", + "text": "N/A", + "to": "null" + } + ], + "sparkline": { + "fillColor": "rgba(31, 118, 189, 0.18)", + "full": false, + "lineColor": "rgb(31, 120, 193)", + "show": false + }, + "tableColumn": "", + "targets": [ + { + "expr": "sum(container_memory_usage_bytes{container_label_org_label_schema_group=\"monitoring\"})", + "format": "time_series", + "interval": "10s", + "intervalFactor": 1, + "legendFormat": "", + "refId": "A", + "step": 10 + } + ], + "thresholds": "", + "timeFrom": "10s", + "timeShift": null, + "title": "Memory Usage", + "type": "singlestat", + "valueFontSize": "80%", + "valueMaps": [ + { + "op": "=", + "text": "N/A", + "value": "null" + } + ], + "valueName": "avg" + }, + { + "cacheTimeout": null, + "colorBackground": false, + "colorValue": false, + "colors": [ + "rgba(245, 54, 54, 0.9)", + "rgba(237, 129, 40, 0.89)", + "rgba(50, 172, 45, 0.97)" + ], + "datasource": "Prometheus", + "editable": true, + "error": false, + "format": "none", + "gauge": { + "maxValue": 100, + "minValue": 0, + "show": false, + "thresholdLabels": false, + "thresholdMarkers": true + }, + "gridPos": { + "h": 3, + "w": 6, + "x": 12, + "y": 0 + }, + "hideTimeOverride": true, + "id": 3, + "interval": null, + "links": [], + "mappingType": 1, + "mappingTypes": [ + { + "name": "value to text", + "value": 1 + }, + { + "name": "range to text", + "value": 2 + } + ], + "maxDataPoints": 100, + "nullPointMode": "connected", + "nullText": null, + "postfix": "", + "postfixFontSize": "50%", + "prefix": "", + "prefixFontSize": "50%", + "rangeMaps": [ + { + "from": "null", + "text": "N/A", + "to": "null" + } + ], + "sparkline": { + "fillColor": "rgba(31, 118, 189, 0.18)", + "full": false, + "lineColor": "rgb(31, 120, 193)", + "show": false + }, + "tableColumn": "", + "targets": [ + { + "expr": "prometheus_tsdb_head_chunks", + "interval": "10s", + "intervalFactor": 1, + "refId": "A", + "step": 10 + } + ], + "thresholds": "", + "timeFrom": "10s", + "timeShift": null, + "title": "In-Memory Chunks", + "type": "singlestat", + "valueFontSize": "80%", + "valueMaps": [ + { + "op": "=", + "text": "N/A", + "value": "null" + } + ], + "valueName": "avg" + }, + { + "cacheTimeout": null, + "colorBackground": false, + "colorValue": false, + "colors": [ + "rgba(245, 54, 54, 0.9)", + "rgba(237, 129, 40, 0.89)", + "rgba(50, 172, 45, 0.97)" + ], + "datasource": "Prometheus", + "editable": true, + "error": false, + "format": "none", + "gauge": { + "maxValue": 100, + "minValue": 0, + "show": false, + "thresholdLabels": false, + "thresholdMarkers": true + }, + "gridPos": { + "h": 3, + "w": 6, + "x": 18, + "y": 0 + }, + "hideTimeOverride": true, + "id": 2, + "interval": null, + "links": [], + "mappingType": 1, + "mappingTypes": [ + { + "name": "value to text", + "value": 1 + }, + { + "name": "range to text", + "value": 2 + } + ], + "maxDataPoints": 100, + "nullPointMode": "connected", + "nullText": null, + "postfix": "", + "postfixFontSize": "50%", + "prefix": "", + "prefixFontSize": "50%", + "rangeMaps": [ + { + "from": "null", + "text": "N/A", + "to": "null" + } + ], + "sparkline": { + "fillColor": "rgba(31, 118, 189, 0.18)", + "full": false, + "lineColor": "rgb(31, 120, 193)", + "show": false + }, + "tableColumn": "", + "targets": [ + { + "expr": "prometheus_tsdb_head_series", + "interval": "10s", + "intervalFactor": 1, + "refId": "A", + "step": 10 + } + ], + "thresholds": "", + "timeFrom": "10s", + "timeShift": null, + "title": "In-Memory Series", + "type": "singlestat", + "valueFontSize": "80%", + "valueMaps": [ + { + "op": "=", + "text": "N/A", + "value": "null" + } + ], + "valueName": "avg" + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "decimals": 2, + "editable": true, + "error": false, + "fill": 1, + "grid": {}, + "gridPos": { + "h": 7, + "w": 24, + "x": 0, + "y": 3 + }, + "id": 6, + "legend": { + "alignAsTable": true, + "avg": true, + "current": false, + "max": true, + "min": true, + "rightSide": true, + "show": true, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 2, + "links": [], + "nullPointMode": "connected", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "sum by (name) (rate(container_cpu_user_seconds_total{container_label_org_label_schema_group=\"monitoring\"}[1m]) * 100 / scalar(count(node_cpu{mode=\"user\"})))", + "format": "time_series", + "hide": true, + "intervalFactor": 10, + "legendFormat": "{{ name }}", + "refId": "A", + "step": 10 + }, + { + "expr": "sum by (name) (rate(container_cpu_user_seconds_total{container_label_org_label_schema_group=\"monitoring\"}[1m]) * 100 / scalar(count(node_cpu_seconds_total{mode=\"user\"})))", + "format": "time_series", + "intervalFactor": 10, + "legendFormat": "{{ name }}", + "refId": "B" + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "Container CPU Usage", + "tooltip": { + "msResolution": true, + "shared": true, + "sort": 2, + "value_type": "cumulative" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "percent", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "decimals": 2, + "editable": true, + "error": false, + "fill": 1, + "grid": {}, + "gridPos": { + "h": 7, + "w": 24, + "x": 0, + "y": 10 + }, + "id": 7, + "legend": { + "alignAsTable": true, + "avg": true, + "current": false, + "max": true, + "min": true, + "rightSide": true, + "show": true, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 2, + "links": [], + "nullPointMode": "connected", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "sum by (name) (container_memory_usage_bytes{container_label_org_label_schema_group=\"monitoring\"})", + "format": "time_series", + "interval": "", + "intervalFactor": 10, + "legendFormat": "{{ name }}", + "metric": "container_memory_usage_bytes", + "refId": "A", + "step": 10 + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "Container Memory Usage", + "tooltip": { + "msResolution": true, + "shared": true, + "sort": 2, + "value_type": "cumulative" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "bytes", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": true, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "decimals": 0, + "editable": true, + "error": false, + "fill": 1, + "grid": {}, + "gridPos": { + "h": 7, + "w": 24, + "x": 0, + "y": 17 + }, + "id": 73, + "legend": { + "alignAsTable": true, + "avg": false, + "current": true, + "max": false, + "min": false, + "rightSide": true, + "show": true, + "total": false, + "values": true + }, + "lines": false, + "linewidth": 2, + "links": [], + "nullPointMode": "connected", + "percentage": false, + "pointradius": 5, + "points": true, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "sum(ALERTS{alertstate=\"firing\"}) by (alertname)", + "format": "time_series", + "interval": "30s", + "intervalFactor": 1, + "legendFormat": "{{ alertname }}", + "metric": "container_memory_usage_bytes", + "refId": "A", + "step": 10 + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "Alerts", + "tooltip": { + "msResolution": true, + "shared": false, + "sort": 0, + "value_type": "cumulative" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": "0", + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "collapsed": false, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 24 + }, + "id": 22, + "panels": [], + "repeat": null, + "title": "Prometheus Metrics", + "type": "row" + }, + { + "aliasColors": { + "Max": "#e24d42", + "Open": "#508642" + }, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "fill": 1, + "gridPos": { + "h": 7, + "w": 8, + "x": 0, + "y": 25 + }, + "id": 18, + "legend": { + "alignAsTable": true, + "avg": true, + "current": true, + "max": true, + "min": true, + "show": true, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 2, + "links": [], + "nullPointMode": "null", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "process_max_fds{job=\"prometheus\"}", + "format": "time_series", + "intervalFactor": 1, + "legendFormat": "Max", + "refId": "A" + }, + { + "expr": "process_open_fds{job=\"prometheus\"}", + "format": "time_series", + "intervalFactor": 1, + "legendFormat": "Open", + "refId": "B" + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "File Descriptors", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": { + "Allocated bytes": "#7EB26D", + "Allocated bytes - 1m max": "#BF1B00", + "Allocated bytes - 1m min": "#BF1B00", + "Allocated bytes - 5m max": "#BF1B00", + "Allocated bytes - 5m min": "#BF1B00", + "Chunks": "#1F78C1", + "Chunks to persist": "#508642", + "Max chunks": "#052B51", + "Max to persist": "#3F6833", + "RSS": "#447EBC" + }, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "decimals": null, + "editable": true, + "error": false, + "fill": 1, + "gridPos": { + "h": 7, + "w": 8, + "x": 8, + "y": 25 + }, + "id": 58, + "legend": { + "alignAsTable": true, + "avg": true, + "current": true, + "max": true, + "min": true, + "show": true, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 2, + "links": [], + "nullPointMode": "null", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [ + { + "alias": "/-/", + "fill": 0 + } + ], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "process_resident_memory_bytes{job=\"prometheus\"}", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "RSS", + "metric": "process_resident_memory_bytes", + "refId": "B", + "step": 10 + }, + { + "expr": "prometheus_local_storage_target_heap_size_bytes{job=\"prometheus\"}", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "Target heap size", + "metric": "go_memstats_alloc_bytes", + "refId": "D", + "step": 10 + }, + { + "expr": "go_memstats_next_gc_bytes{job=\"prometheus\"}", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "Next GC", + "metric": "go_memstats_next_gc_bytes", + "refId": "C", + "step": 10 + }, + { + "expr": "go_memstats_alloc_bytes{job=\"prometheus\"}", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "Allocated", + "metric": "go_memstats_alloc_bytes", + "refId": "A", + "step": 10 + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "Memory", + "tooltip": { + "msResolution": false, + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "bytes", + "label": null, + "logBase": 1, + "max": null, + "min": "0", + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": { + "Allocated bytes": "#F9BA8F", + "Chunks": "#1F78C1", + "Chunks to persist": "#508642", + "Max chunks": "#052B51", + "Max to persist": "#3F6833", + "RSS": "#890F02" + }, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "editable": true, + "error": false, + "fill": 1, + "gridPos": { + "h": 7, + "w": 8, + "x": 16, + "y": 25 + }, + "id": 60, + "legend": { + "alignAsTable": true, + "avg": true, + "current": true, + "max": true, + "min": true, + "show": true, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 2, + "links": [], + "nullPointMode": "null", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "rate(go_memstats_alloc_bytes_total{job=\"prometheus\"}[1m])", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "Allocated", + "metric": "go_memstats_alloc_bytes", + "refId": "A", + "step": 10 + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "Allocations", + "tooltip": { + "msResolution": false, + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "Bps", + "label": null, + "logBase": 1, + "max": null, + "min": "0", + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": { + "Chunks": "#1F78C1", + "Chunks to persist": "#508642", + "Max chunks": "#052B51", + "Max to persist": "#3F6833", + "Time series": "#70dbed" + }, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "editable": true, + "error": false, + "fill": 1, + "gridPos": { + "h": 7, + "w": 8, + "x": 0, + "y": 32 + }, + "id": 20, + "legend": { + "alignAsTable": true, + "avg": true, + "current": true, + "max": true, + "min": true, + "show": true, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 2, + "links": [], + "nullPointMode": "null", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "prometheus_tsdb_head_series", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "Time series", + "metric": "prometheus_local_storage_memory_series", + "refId": "A", + "step": 10 + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "Head Time series", + "tooltip": { + "msResolution": false, + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": "0", + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": { + "Chunks": "#1F78C1", + "Chunks to persist": "#508642", + "Max chunks": "#052B51", + "Max to persist": "#3F6833" + }, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "editable": true, + "error": false, + "fill": 1, + "gridPos": { + "h": 7, + "w": 8, + "x": 8, + "y": 32 + }, + "id": 24, + "legend": { + "alignAsTable": true, + "avg": true, + "current": true, + "max": true, + "min": true, + "show": true, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 2, + "links": [], + "nullPointMode": "null", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "prometheus_tsdb_head_active_appenders", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "Head Appenders", + "metric": "prometheus_local_storage_memory_series", + "refId": "A", + "step": 10 + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "Head Active Appenders", + "tooltip": { + "msResolution": false, + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": "0", + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": { + "samples/s": "#e5a8e2" + }, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "editable": true, + "error": false, + "fill": 1, + "gridPos": { + "h": 7, + "w": 8, + "x": 16, + "y": 32 + }, + "id": 26, + "legend": { + "alignAsTable": true, + "avg": true, + "current": true, + "max": true, + "min": true, + "show": true, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 2, + "links": [], + "nullPointMode": "connected", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "rate(prometheus_tsdb_head_samples_appended_total[1m])", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "Samples", + "metric": "prometheus_local_storage_ingested_samples_total", + "refId": "A", + "step": 10 + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "Samples Appended", + "tooltip": { + "msResolution": false, + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "Bps", + "label": "", + "logBase": 1, + "max": null, + "min": "0", + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": { + "Chunks": "#1F78C1", + "Chunks to persist": "#508642", + "Max chunks": "#052B51", + "Max to persist": "#3F6833", + "To persist": "#9AC48A" + }, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "editable": true, + "error": false, + "fill": 1, + "gridPos": { + "h": 7, + "w": 8, + "x": 0, + "y": 39 + }, + "id": 28, + "legend": { + "alignAsTable": true, + "avg": true, + "current": true, + "max": true, + "min": true, + "show": true, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 2, + "links": [], + "nullPointMode": "null", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [ + { + "alias": "/Max.*/", + "fill": 0 + } + ], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "prometheus_tsdb_head_chunks", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "Chunks", + "metric": "prometheus_local_storage_memory_chunks", + "refId": "A", + "step": 10 + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "Head Chunks", + "tooltip": { + "msResolution": false, + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": "0", + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": { + "Chunks": "#1F78C1", + "Chunks to persist": "#508642", + "Max chunks": "#052B51", + "Max to persist": "#3F6833" + }, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "editable": true, + "error": false, + "fill": 1, + "gridPos": { + "h": 7, + "w": 8, + "x": 8, + "y": 39 + }, + "id": 30, + "legend": { + "alignAsTable": true, + "avg": true, + "current": true, + "max": true, + "min": true, + "show": true, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 2, + "links": [], + "nullPointMode": "null", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "rate(prometheus_tsdb_head_chunks_created_total[1m])", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "Created", + "metric": "prometheus_local_storage_chunk_ops_total", + "refId": "A", + "step": 10 + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "Head Chunks Created", + "tooltip": { + "msResolution": false, + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "ops", + "label": null, + "logBase": 1, + "max": null, + "min": "0", + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": { + "Chunks": "#1F78C1", + "Chunks to persist": "#508642", + "Max chunks": "#052B51", + "Max to persist": "#3F6833", + "Removed": "#e5ac0e" + }, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "editable": true, + "error": false, + "fill": 1, + "gridPos": { + "h": 7, + "w": 8, + "x": 16, + "y": 39 + }, + "id": 32, + "legend": { + "alignAsTable": true, + "avg": true, + "current": true, + "max": true, + "min": true, + "show": true, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "rate(prometheus_tsdb_head_chunks_removed_total[1m])", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "Removed", + "metric": "prometheus_local_storage_chunk_ops_total", + "refId": "B", + "step": 10 + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "Head Chunks Removed", + "tooltip": { + "msResolution": false, + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "ops", + "label": null, + "logBase": 1, + "max": null, + "min": "0", + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": { + "Chunks": "#1F78C1", + "Chunks to persist": "#508642", + "Max": "#447ebc", + "Max chunks": "#052B51", + "Max to persist": "#3F6833", + "Min": "#447ebc", + "Now": "#7eb26d" + }, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "editable": true, + "error": false, + "fill": 1, + "gridPos": { + "h": 7, + "w": 8, + "x": 0, + "y": 46 + }, + "id": 34, + "legend": { + "alignAsTable": false, + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 2, + "links": [], + "nullPointMode": "null", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [ + { + "alias": "Max", + "fillBelowTo": "Min", + "lines": false + } + ], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "prometheus_tsdb_head_min_time", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "Min", + "metric": "prometheus_local_storage_series_chunks_persisted_count", + "refId": "A", + "step": 10 + }, + { + "expr": "time() * 1000", + "format": "time_series", + "hide": false, + "intervalFactor": 2, + "legendFormat": "Now", + "refId": "C" + }, + { + "expr": "prometheus_tsdb_head_max_time", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "Max", + "metric": "prometheus_local_storage_series_chunks_persisted_count", + "refId": "B", + "step": 10 + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "Head Time Range", + "tooltip": { + "msResolution": false, + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "decimals": null, + "format": "dateTimeAsIso", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": { + "Chunks": "#1F78C1", + "Chunks to persist": "#508642", + "Max chunks": "#052B51", + "Max to persist": "#3F6833" + }, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "editable": true, + "error": false, + "fill": 1, + "gridPos": { + "h": 7, + "w": 8, + "x": 8, + "y": 46 + }, + "id": 36, + "legend": { + "alignAsTable": true, + "avg": true, + "current": true, + "max": true, + "min": true, + "show": true, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 2, + "links": [], + "nullPointMode": "null", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "rate(prometheus_tsdb_head_gc_duration_seconds_sum[1m])", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "GC Time", + "metric": "prometheus_local_storage_series_chunks_persisted_count", + "refId": "A", + "step": 10 + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "Head GC Time/s", + "tooltip": { + "msResolution": false, + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "s", + "label": null, + "logBase": 1, + "max": null, + "min": "0", + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": { + "Chunks": "#1F78C1", + "Chunks to persist": "#508642", + "Max chunks": "#052B51", + "Max to persist": "#3F6833" + }, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "editable": true, + "error": false, + "fill": 1, + "gridPos": { + "h": 7, + "w": 8, + "x": 16, + "y": 46 + }, + "id": 38, + "legend": { + "alignAsTable": true, + "avg": true, + "current": true, + "max": true, + "min": true, + "show": true, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 2, + "links": [], + "nullPointMode": "null", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [ + { + "alias": "Queue length", + "yaxis": 2 + } + ], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "prometheus_tsdb_blocks_loaded", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "Blocks Loaded", + "metric": "prometheus_local_storage_indexing_batch_sizes_sum", + "refId": "A", + "step": 10 + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "Blocks Loaded", + "tooltip": { + "msResolution": false, + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": "0", + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": "0", + "show": false + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": { + "Chunks": "#1F78C1", + "Chunks to persist": "#508642", + "Failed Compactions": "#bf1b00", + "Failed Reloads": "#bf1b00", + "Max chunks": "#052B51", + "Max to persist": "#3F6833" + }, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "editable": true, + "error": false, + "fill": 1, + "gridPos": { + "h": 7, + "w": 8, + "x": 0, + "y": 53 + }, + "id": 40, + "legend": { + "alignAsTable": false, + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 2, + "links": [], + "nullPointMode": "null", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "rate(prometheus_tsdb_reloads_total[10m])", + "format": "time_series", + "interval": "", + "intervalFactor": 2, + "legendFormat": "Reloads", + "metric": "prometheus_local_storage_series_chunks_persisted_count", + "refId": "A", + "step": 10 + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "TSDB Reloads", + "tooltip": { + "msResolution": false, + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "ops", + "label": null, + "logBase": 1, + "max": null, + "min": "0", + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": { + "Chunks": "#1F78C1", + "Chunks to persist": "#508642", + "Failed Compactions": "#bf1b00", + "Max chunks": "#052B51", + "Max to persist": "#3F6833", + "{instance=\"demo.robustperception.io:9090\",job=\"prometheus\"}": "#bf1b00" + }, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "editable": true, + "error": false, + "fill": 1, + "gridPos": { + "h": 7, + "w": 8, + "x": 8, + "y": 53 + }, + "id": 44, + "legend": { + "alignAsTable": true, + "avg": true, + "current": true, + "max": true, + "min": true, + "show": true, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 2, + "links": [], + "nullPointMode": "null", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "rate(prometheus_tsdb_wal_corruptions_total[10m])", + "format": "time_series", + "interval": "", + "intervalFactor": 2, + "legendFormat": "WAL Corruptions", + "metric": "prometheus_local_storage_series_chunks_persisted_count", + "refId": "A", + "step": 10 + }, + { + "expr": "rate(prometheus_tsdb_reloads_failures_total[10m])", + "format": "time_series", + "interval": "", + "intervalFactor": 2, + "legendFormat": "Reload Failures", + "metric": "prometheus_local_storage_series_chunks_persisted_count", + "refId": "B", + "step": 10 + }, + { + "expr": "rate(prometheus_tsdb_head_series_not_found[10m])", + "format": "time_series", + "interval": "", + "intervalFactor": 2, + "legendFormat": "Head Series Not Found", + "metric": "prometheus_local_storage_series_chunks_persisted_count", + "refId": "C", + "step": 10 + }, + { + "expr": "rate(prometheus_tsdb_compactions_failed_total[10m])", + "format": "time_series", + "interval": "", + "intervalFactor": 2, + "legendFormat": "Compaction Failures", + "metric": "prometheus_local_storage_series_chunks_persisted_count", + "refId": "D", + "step": 10 + }, + { + "expr": "rate(prometheus_tsdb_retention_cutoffs_failures_total[10m])", + "format": "time_series", + "interval": "", + "intervalFactor": 2, + "legendFormat": "Retention Cutoff Failures", + "metric": "prometheus_local_storage_series_chunks_persisted_count", + "refId": "E", + "step": 10 + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "TSDB Problems", + "tooltip": { + "msResolution": false, + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "none", + "label": null, + "logBase": 1, + "max": null, + "min": "0", + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": { + "Chunks": "#1F78C1", + "Chunks to persist": "#508642", + "Failed Compactions": "#bf1b00", + "Max chunks": "#052B51", + "Max to persist": "#3F6833" + }, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "editable": true, + "error": false, + "fill": 1, + "gridPos": { + "h": 7, + "w": 8, + "x": 16, + "y": 53 + }, + "id": 42, + "legend": { + "alignAsTable": true, + "avg": true, + "current": true, + "max": true, + "min": true, + "show": true, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 2, + "links": [], + "nullPointMode": "null", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "rate(prometheus_tsdb_wal_fsync_duration_seconds_sum[1m]) / rate(prometheus_tsdb_wal_fsync_duration_seconds_count[1m])", + "format": "time_series", + "interval": "", + "intervalFactor": 2, + "legendFormat": "Fsync Latency", + "metric": "prometheus_local_storage_series_chunks_persisted_count", + "refId": "A", + "step": 10 + }, + { + "expr": "rate(prometheus_tsdb_wal_truncate_duration_seconds_sum[1m]) / rate(prometheus_tsdb_wal_truncate_duration_seconds_count[1m])", + "format": "time_series", + "interval": "", + "intervalFactor": 2, + "legendFormat": "Truncate Latency", + "metric": "prometheus_local_storage_series_chunks_persisted_count", + "refId": "B", + "step": 10 + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "WAL Latencies", + "tooltip": { + "msResolution": false, + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "s", + "label": null, + "logBase": 1, + "max": null, + "min": "0", + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": { + "Chunks": "#1F78C1", + "Chunks to persist": "#508642", + "Failed Compactions": "#bf1b00", + "Max chunks": "#052B51", + "Max to persist": "#3F6833" + }, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "editable": true, + "error": false, + "fill": 1, + "gridPos": { + "h": 7, + "w": 8, + "x": 0, + "y": 60 + }, + "id": 46, + "legend": { + "alignAsTable": true, + "avg": true, + "current": true, + "max": true, + "min": true, + "show": true, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 2, + "links": [], + "nullPointMode": "null", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "rate(prometheus_tsdb_compactions_total[10m])", + "format": "time_series", + "interval": "", + "intervalFactor": 2, + "legendFormat": "Compactions", + "metric": "prometheus_local_storage_series_chunks_persisted_count", + "refId": "A", + "step": 10 + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "Compactions", + "tooltip": { + "msResolution": false, + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "none", + "label": null, + "logBase": 1, + "max": null, + "min": "0", + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": { + "Chunks": "#1F78C1", + "Chunks to persist": "#508642", + "Max chunks": "#052B51", + "Max to persist": "#3F6833" + }, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "editable": true, + "error": false, + "fill": 1, + "gridPos": { + "h": 7, + "w": 8, + "x": 8, + "y": 60 + }, + "id": 48, + "legend": { + "alignAsTable": true, + "avg": true, + "current": true, + "max": true, + "min": true, + "show": true, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 2, + "links": [], + "nullPointMode": "null", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "rate(prometheus_tsdb_compaction_duration_seconds_sum[10m])", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "Compaction Time", + "metric": "prometheus_local_storage_series_chunks_persisted_count", + "refId": "A", + "step": 10 + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "Compaction Time", + "tooltip": { + "msResolution": false, + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "s", + "label": null, + "logBase": 1, + "max": null, + "min": "0", + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": { + "Allocated bytes": "#F9BA8F", + "Chunks": "#1F78C1", + "Chunks to persist": "#508642", + "Max chunks": "#052B51", + "Max to persist": "#3F6833", + "RSS": "#890F02" + }, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "editable": true, + "error": false, + "fill": 1, + "gridPos": { + "h": 7, + "w": 8, + "x": 16, + "y": 60 + }, + "id": 50, + "legend": { + "alignAsTable": true, + "avg": true, + "current": true, + "max": true, + "min": true, + "show": true, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 2, + "links": [], + "nullPointMode": "null", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "rate(prometheus_tsdb_retention_cutoffs_total[10m])", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "Retention Cutoffs", + "metric": "last", + "refId": "A", + "step": 10 + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "Retention Cutoffs", + "tooltip": { + "msResolution": false, + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "none", + "label": null, + "logBase": 1, + "max": null, + "min": "0", + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": { + "Chunks": "#1F78C1", + "Chunks to persist": "#508642", + "Max chunks": "#052B51", + "Max to persist": "#3F6833" + }, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "editable": true, + "error": false, + "fill": 1, + "gridPos": { + "h": 7, + "w": 8, + "x": 0, + "y": 67 + }, + "id": 56, + "legend": { + "alignAsTable": true, + "avg": true, + "current": true, + "max": true, + "min": true, + "show": true, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 2, + "links": [], + "nullPointMode": "null", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "rate(prometheus_tsdb_compaction_chunk_samples_sum[10m]) / rate(prometheus_tsdb_compaction_chunk_samples_count[10m])", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "Chunk Samples", + "metric": "prometheus_local_storage_series_chunks_persisted_count", + "refId": "A", + "step": 10 + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "First Compaction, Avg Chunk Samples", + "tooltip": { + "msResolution": false, + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "none", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "editable": true, + "error": false, + "fill": 1, + "grid": {}, + "gridPos": { + "h": 7, + "w": 8, + "x": 8, + "y": 67 + }, + "id": 10, + "legend": { + "alignAsTable": false, + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 2, + "links": [], + "nullPointMode": "connected", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "rate(prometheus_target_interval_length_seconds_count[5m])", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "{{ interval }}", + "refId": "A", + "step": 2 + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "Target Scrapes", + "tooltip": { + "msResolution": true, + "shared": true, + "sort": 0, + "value_type": "cumulative" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "editable": true, + "error": false, + "fill": 1, + "grid": {}, + "gridPos": { + "h": 7, + "w": 8, + "x": 16, + "y": 67 + }, + "id": 11, + "legend": { + "alignAsTable": false, + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 2, + "links": [], + "nullPointMode": "connected", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "prometheus_target_interval_length_seconds{quantile!=\"0.01\", quantile!=\"0.05\"}", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "{{quantile}} ({{interval}})", + "refId": "A", + "step": 2 + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "Scrape Duration", + "tooltip": { + "msResolution": true, + "shared": true, + "sort": 0, + "value_type": "cumulative" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": { + "Chunks": "#1F78C1", + "Chunks to persist": "#508642", + "Max chunks": "#052B51", + "Max to persist": "#3F6833" + }, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "description": "", + "editable": true, + "error": false, + "fill": 1, + "gridPos": { + "h": 7, + "w": 8, + "x": 0, + "y": 74 + }, + "id": 62, + "legend": { + "alignAsTable": false, + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 2, + "links": [], + "nullPointMode": "null", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "rate(prometheus_http_request_duration_seconds_count[1m])", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "{{handler}}", + "metric": "prometheus_local_storage_memory_chunkdescs", + "refId": "A", + "step": 10 + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "HTTP requests", + "tooltip": { + "msResolution": false, + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "reqps", + "label": null, + "logBase": 1, + "max": null, + "min": "0", + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": { + "Chunks": "#1F78C1", + "Chunks to persist": "#508642", + "Max chunks": "#052B51", + "Max to persist": "#3F6833" + }, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "description": "", + "editable": true, + "error": false, + "fill": 1, + "gridPos": { + "h": 7, + "w": 8, + "x": 8, + "y": 74 + }, + "id": 64, + "legend": { + "alignAsTable": false, + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 2, + "links": [], + "nullPointMode": "null", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "rate(prometheus_http_request_duration_seconds_sum[1m]) / rate(prometheus_http_request_duration_seconds_count[1m])", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "{{handler}}", + "metric": "prometheus_local_storage_memory_chunkdescs", + "refId": "A", + "step": 10 + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "HTTP request latency", + "tooltip": { + "msResolution": false, + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "s", + "label": null, + "logBase": 1, + "max": null, + "min": "0", + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": { + "Chunks": "#1F78C1", + "Chunks to persist": "#508642", + "Max chunks": "#052B51", + "Max to persist": "#3F6833" + }, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "description": "", + "editable": true, + "error": false, + "fill": 1, + "gridPos": { + "h": 7, + "w": 8, + "x": 16, + "y": 74 + }, + "id": 66, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 2, + "links": [], + "nullPointMode": "null", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": true, + "steppedLine": false, + "targets": [ + { + "expr": "rate(prometheus_http_request_duration_seconds_sum[1m])", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "{{handler}}", + "metric": "prometheus_local_storage_memory_chunkdescs", + "refId": "A", + "step": 10 + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "Time spent in HTTP requests", + "tooltip": { + "msResolution": false, + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "s", + "label": null, + "logBase": 1, + "max": null, + "min": "0", + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": { + "Chunks": "#1F78C1", + "Chunks to persist": "#508642", + "Max chunks": "#052B51", + "Max to persist": "#3F6833" + }, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "description": "Time spent in each mode, per second", + "editable": true, + "error": false, + "fill": 1, + "gridPos": { + "h": 7, + "w": 8, + "x": 0, + "y": 81 + }, + "id": 68, + "legend": { + "alignAsTable": true, + "avg": true, + "current": true, + "max": true, + "min": true, + "show": true, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": true, + "steppedLine": false, + "targets": [ + { + "expr": "rate(prometheus_engine_query_duration_seconds_sum[1m])", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "{{slice}}", + "metric": "prometheus_local_storage_memory_chunkdescs", + "refId": "A", + "step": 10 + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "Query engine timings", + "tooltip": { + "msResolution": false, + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "s", + "label": null, + "logBase": 1, + "max": null, + "min": "0", + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": { + "Chunks": "#1F78C1", + "Chunks to persist": "#508642", + "Max chunks": "#052B51", + "Max to persist": "#3F6833" + }, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "editable": true, + "error": false, + "fill": 1, + "gridPos": { + "h": 7, + "w": 8, + "x": 8, + "y": 81 + }, + "id": 70, + "legend": { + "alignAsTable": true, + "avg": true, + "current": true, + "max": true, + "min": true, + "show": true, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 2, + "links": [], + "nullPointMode": "null", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": true, + "steppedLine": false, + "targets": [ + { + "expr": "rate(prometheus_rule_group_iterations_missed_total[1m]) ", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "Rule group missed", + "metric": "prometheus_local_storage_memory_chunkdescs", + "refId": "B", + "step": 10 + }, + { + "expr": "rate(prometheus_rule_evaluation_failures_total[1m])", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "Rule evals failed", + "metric": "prometheus_local_storage_memory_chunkdescs", + "refId": "C", + "step": 10 + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "Rule group evaulation problems", + "tooltip": { + "msResolution": false, + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": "0", + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": { + "Chunks": "#1F78C1", + "Chunks to persist": "#508642", + "Max chunks": "#052B51", + "Max to persist": "#3F6833" + }, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "editable": true, + "error": false, + "fill": 1, + "gridPos": { + "h": 7, + "w": 8, + "x": 16, + "y": 81 + }, + "id": 72, + "legend": { + "alignAsTable": true, + "avg": true, + "current": true, + "max": true, + "min": true, + "show": true, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 2, + "links": [], + "nullPointMode": "null", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "rate(prometheus_rule_group_duration_seconds_sum[1m])", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "Rule evaluation duration", + "metric": "prometheus_local_storage_memory_chunkdescs", + "refId": "A", + "step": 10 + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "Evaluation time of rule groups", + "tooltip": { + "msResolution": false, + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "s", + "label": null, + "logBase": 1, + "max": null, + "min": "0", + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + } + ], + "time": { + "from": "now-15m", + "to": "now" + }, + "timepicker": { + "refresh_intervals": [ + "5s", + "10s", + "30s", + "1m", + "5m", + "15m", + "30m", + "1h", + "2h", + "1d" + ], + "time_options": [ + "5m", + "15m", + "1h", + "6h", + "12h", + "24h", + "2d", + "7d", + "30d" + ] + }, + "templating": { + "list": [] + }, + "annotations": { + "list": [] + }, + "refresh": "10s", + "schemaVersion": 12, + "version": 22, + "links": [], + "gnetId": null +} \ No newline at end of file diff --git a/grafana/provisioning/datasources/datasource.yml b/grafana/provisioning/datasources/datasource.yml new file mode 100644 index 00000000..f0c711de --- /dev/null +++ b/grafana/provisioning/datasources/datasource.yml @@ -0,0 +1,12 @@ +apiVersion: 1 + +datasources: + - name: Prometheus + type: prometheus + uid: prometheus + access: proxy + orgId: 1 + url: http://prometheus:9090 + basicAuth: false + isDefault: true + editable: true \ No newline at end of file diff --git a/metrics/metrics.go b/metrics/metrics.go new file mode 100644 index 00000000..19246b74 --- /dev/null +++ b/metrics/metrics.go @@ -0,0 +1,52 @@ +package metrics + +import ( + "github.com/Layr-Labs/eigensdk-go/metrics" + "github.com/prometheus/client_golang/prometheus" + "github.com/prometheus/client_golang/prometheus/promauto" +) + +type Metrics interface { + metrics.Metrics + IncNumTasksReceived() + IncNumTasksAcceptedByAggregator() + // This metric would either need to be tracked by the aggregator itself, + // or we would need to write a collector that queries onchain for this info + // AddPercentageStakeSigned(percentage float64) +} + +// AvsMetrics contains instrumented metrics that should be incremented by the avs node using the methods below +type AvsAndEigenMetrics struct { + metrics.Metrics + numTasksReceived prometheus.Counter + // if numSignedTaskResponsesAcceptedByAggregator != numTasksReceived, then there is a bug + numSignedTaskResponsesAcceptedByAggregator prometheus.Counter +} + +const superFastFinalityLayerNamespace = "sffl" + +func NewAvsAndEigenMetrics(avsName string, eigenMetrics *metrics.EigenMetrics, reg prometheus.Registerer) *AvsAndEigenMetrics { + return &AvsAndEigenMetrics{ + Metrics: eigenMetrics, + numTasksReceived: promauto.With(reg).NewCounter( + prometheus.CounterOpts{ + Namespace: superFastFinalityLayerNamespace, + Name: "num_tasks_received", + Help: "The number of tasks received by reading from the avs service manager contract", + }), + numSignedTaskResponsesAcceptedByAggregator: promauto.With(reg).NewCounter( + prometheus.CounterOpts{ + Namespace: superFastFinalityLayerNamespace, + Name: "num_signed_task_responses_accepted_by_aggregator", + Help: "The number of signed task responses accepted by the aggregator", + }), + } +} + +func (m *AvsAndEigenMetrics) IncNumTasksReceived() { + m.numTasksReceived.Inc() +} + +func (m *AvsAndEigenMetrics) IncNumTasksAcceptedByAggregator() { + m.numSignedTaskResponsesAcceptedByAggregator.Inc() +} diff --git a/metrics/noopmetrics.go b/metrics/noopmetrics.go new file mode 100644 index 00000000..7737a3c7 --- /dev/null +++ b/metrics/noopmetrics.go @@ -0,0 +1,19 @@ +package metrics + +import ( + eigenmetrics "github.com/Layr-Labs/eigensdk-go/metrics" +) + +type NoopMetrics struct { + eigenmetrics.NoopMetrics +} + +func NewNoopMetrics() *NoopMetrics { + return &NoopMetrics{ + NoopMetrics: *eigenmetrics.NewNoopMetrics(), + } +} + +func (m *NoopMetrics) IncNumTasksReceived() {} + +func (m *NoopMetrics) IncNumTasksAcceptedByAggregator() {} diff --git a/operator/cmd/main.go b/operator/cmd/main.go new file mode 100644 index 00000000..be43aebf --- /dev/null +++ b/operator/cmd/main.go @@ -0,0 +1,63 @@ +package main + +import ( + "context" + "encoding/json" + "log" + "os" + + "github.com/urfave/cli" + + "github.com/NethermindEth/near-sffl/core/config" + "github.com/NethermindEth/near-sffl/operator" + "github.com/NethermindEth/near-sffl/types" + + sdkutils "github.com/Layr-Labs/eigensdk-go/utils" +) + +func main() { + app := cli.NewApp() + app.Flags = []cli.Flag{config.ConfigFileFlag} + app.Name = "sffl-operator" + app.Usage = "SFFL Operator" + app.Description = "Super Fast Finality Service that reads rollup data, agrees on a partial finality, signs, and sends them to the aggregator." + + app.Action = operatorMain + err := app.Run(os.Args) + if err != nil { + log.Fatalln("Application failed. Message:", err) + } +} + +func operatorMain(ctx *cli.Context) error { + + log.Println("Initializing Operator") + configPath := ctx.GlobalString(config.ConfigFileFlag.Name) + nodeConfig := types.NodeConfig{} + err := sdkutils.ReadYamlConfig(configPath, &nodeConfig) + if err != nil { + return err + } + configJson, err := json.MarshalIndent(nodeConfig, "", " ") + if err != nil { + log.Fatalf(err.Error()) + } + log.Println("Config:", string(configJson)) + + log.Println("initializing operator") + operator, err := operator.NewOperatorFromConfig(nodeConfig) + if err != nil { + return err + } + log.Println("initialized operator") + + log.Println("starting operator") + err = operator.Start(context.Background()) + if err != nil { + return err + } + log.Println("started operator") + + return nil + +} diff --git a/operator/gen.go b/operator/gen.go new file mode 100644 index 00000000..0b30820a --- /dev/null +++ b/operator/gen.go @@ -0,0 +1,3 @@ +package operator + +//go:generate mockgen -destination=./mocks/rpc_client.go -package=mocks github.com/NethermindEth/near-sffl/operator AggregatorRpcClienter diff --git a/operator/mocks/rpc_client.go b/operator/mocks/rpc_client.go new file mode 100644 index 00000000..40113ec0 --- /dev/null +++ b/operator/mocks/rpc_client.go @@ -0,0 +1,51 @@ +// Code generated by MockGen. DO NOT EDIT. +// Source: github.com/NethermindEth/near-sffl/operator (interfaces: AggregatorRpcClienter) +// +// Generated by this command: +// +// mockgen -destination=./mocks/rpc_client.go -package=mocks github.com/NethermindEth/near-sffl/operator AggregatorRpcClienter +// +// Package mocks is a generated GoMock package. +package mocks + +import ( + reflect "reflect" + + aggregator "github.com/NethermindEth/near-sffl/aggregator" + gomock "go.uber.org/mock/gomock" +) + +// MockAggregatorRpcClienter is a mock of AggregatorRpcClienter interface. +type MockAggregatorRpcClienter struct { + ctrl *gomock.Controller + recorder *MockAggregatorRpcClienterMockRecorder +} + +// MockAggregatorRpcClienterMockRecorder is the mock recorder for MockAggregatorRpcClienter. +type MockAggregatorRpcClienterMockRecorder struct { + mock *MockAggregatorRpcClienter +} + +// NewMockAggregatorRpcClienter creates a new mock instance. +func NewMockAggregatorRpcClienter(ctrl *gomock.Controller) *MockAggregatorRpcClienter { + mock := &MockAggregatorRpcClienter{ctrl: ctrl} + mock.recorder = &MockAggregatorRpcClienterMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use. +func (m *MockAggregatorRpcClienter) EXPECT() *MockAggregatorRpcClienterMockRecorder { + return m.recorder +} + +// SendSignedCheckpointTaskResponseToAggregator mocks base method. +func (m *MockAggregatorRpcClienter) SendSignedCheckpointTaskResponseToAggregator(arg0 *aggregator.SignedCheckpointTaskResponse) { + m.ctrl.T.Helper() + m.ctrl.Call(m, "SendSignedCheckpointTaskResponseToAggregator", arg0) +} + +// SendSignedCheckpointTaskResponseToAggregator indicates an expected call of SendSignedCheckpointTaskResponseToAggregator. +func (mr *MockAggregatorRpcClienterMockRecorder) SendSignedCheckpointTaskResponseToAggregator(arg0 any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SendSignedCheckpointTaskResponseToAggregator", reflect.TypeOf((*MockAggregatorRpcClienter)(nil).SendSignedCheckpointTaskResponseToAggregator), arg0) +} diff --git a/operator/operator.go b/operator/operator.go new file mode 100644 index 00000000..d70f9922 --- /dev/null +++ b/operator/operator.go @@ -0,0 +1,340 @@ +package operator + +import ( + "context" + "fmt" + "os" + + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/common" + "github.com/prometheus/client_golang/prometheus" + + "github.com/NethermindEth/near-sffl/aggregator" + taskmanager "github.com/NethermindEth/near-sffl/contracts/bindings/SFFLTaskManager" + "github.com/NethermindEth/near-sffl/core" + "github.com/NethermindEth/near-sffl/core/chainio" + "github.com/NethermindEth/near-sffl/metrics" + "github.com/NethermindEth/near-sffl/types" + + "github.com/Layr-Labs/eigensdk-go/chainio/clients" + sdkelcontracts "github.com/Layr-Labs/eigensdk-go/chainio/clients/elcontracts" + "github.com/Layr-Labs/eigensdk-go/chainio/clients/eth" + "github.com/Layr-Labs/eigensdk-go/chainio/txmgr" + "github.com/Layr-Labs/eigensdk-go/crypto/bls" + sdkecdsa "github.com/Layr-Labs/eigensdk-go/crypto/ecdsa" + "github.com/Layr-Labs/eigensdk-go/logging" + sdklogging "github.com/Layr-Labs/eigensdk-go/logging" + sdkmetrics "github.com/Layr-Labs/eigensdk-go/metrics" + "github.com/Layr-Labs/eigensdk-go/metrics/collectors/economic" + rpccalls "github.com/Layr-Labs/eigensdk-go/metrics/collectors/rpc_calls" + "github.com/Layr-Labs/eigensdk-go/nodeapi" + "github.com/Layr-Labs/eigensdk-go/signerv2" + sdktypes "github.com/Layr-Labs/eigensdk-go/types" +) + +const AVS_NAME = "super-fast-finality-layer" +const SEM_VER = "0.0.1" + +type Operator struct { + config types.NodeConfig + logger logging.Logger + ethClient eth.EthClient + // TODO(samlaf): remove both avsWriter and eigenlayerWrite from operator + // they are only used for registration, so we should make a special registration package + // this way, auditing this operator code makes it obvious that operators don't need to + // write to the chain during the course of their normal operations + // writing to the chain should be done via the cli only + metricsReg *prometheus.Registry + metrics metrics.Metrics + nodeApi *nodeapi.NodeApi + avsWriter *chainio.AvsWriter + avsReader chainio.AvsReaderer + avsSubscriber chainio.AvsSubscriberer + eigenlayerReader sdkelcontracts.ELReader + eigenlayerWriter sdkelcontracts.ELWriter + blsKeypair *bls.KeyPair + operatorId bls.OperatorId + operatorAddr common.Address + // receive new tasks in this chan (typically from listening to onchain event) + checkpointTaskCreatedChan chan *taskmanager.ContractSFFLTaskManagerCheckpointTaskCreated + // ip address of aggregator + aggregatorServerIpPortAddr string + // rpc client to send signed task responses to aggregator + aggregatorRpcClient AggregatorRpcClienter + // needed when opting in to avs (allow this service manager contract to slash operator) + sfflServiceManagerAddr common.Address +} + +// TODO(samlaf): config is a mess right now, since the chainio client constructors +// +// take the config in core (which is shared with aggregator and challenger) +func NewOperatorFromConfig(c types.NodeConfig) (*Operator, error) { + var logLevel logging.LogLevel + if c.Production { + logLevel = sdklogging.Production + } else { + logLevel = sdklogging.Development + } + logger, err := sdklogging.NewZapLogger(logLevel) + if err != nil { + return nil, err + } + reg := prometheus.NewRegistry() + eigenMetrics := sdkmetrics.NewEigenMetrics(AVS_NAME, c.EigenMetricsIpPortAddress, reg, logger) + avsAndEigenMetrics := metrics.NewAvsAndEigenMetrics(AVS_NAME, eigenMetrics, reg) + + // Setup Node Api + nodeApi := nodeapi.NewNodeApi(AVS_NAME, SEM_VER, c.NodeApiIpPortAddress, logger) + + var ethRpcClient, ethWsClient eth.EthClient + if c.EnableMetrics { + rpcCallsCollector := rpccalls.NewCollector(AVS_NAME, reg) + ethRpcClient, err = eth.NewInstrumentedClient(c.EthRpcUrl, rpcCallsCollector) + if err != nil { + logger.Errorf("Cannot create http ethclient", "err", err) + return nil, err + } + ethWsClient, err = eth.NewInstrumentedClient(c.EthWsUrl, rpcCallsCollector) + if err != nil { + logger.Errorf("Cannot create ws ethclient", "err", err) + return nil, err + } + } else { + ethRpcClient, err = eth.NewClient(c.EthRpcUrl) + if err != nil { + logger.Errorf("Cannot create http ethclient", "err", err) + return nil, err + } + ethWsClient, err = eth.NewClient(c.EthWsUrl) + if err != nil { + logger.Errorf("Cannot create ws ethclient", "err", err) + return nil, err + } + } + + blsKeyPassword, ok := os.LookupEnv("OPERATOR_BLS_KEY_PASSWORD") + if !ok { + logger.Warnf("OPERATOR_BLS_KEY_PASSWORD env var not set. using empty string") + } + blsKeyPair, err := bls.ReadPrivateKeyFromFile(c.BlsPrivateKeyStorePath, blsKeyPassword) + if err != nil { + logger.Errorf("Cannot parse bls private key", "err", err) + return nil, err + } + // TODO(samlaf): should we add the chainId to the config instead? + // this way we can prevent creating a signer that signs on mainnet by mistake + // if the config says chainId=5, then we can only create a goerli signer + chainId, err := ethRpcClient.ChainID(context.Background()) + if err != nil { + logger.Error("Cannot get chainId", "err", err) + return nil, err + } + + ecdsaKeyPassword, ok := os.LookupEnv("OPERATOR_ECDSA_KEY_PASSWORD") + if !ok { + logger.Warnf("OPERATOR_ECDSA_KEY_PASSWORD env var not set. using empty string") + } + + signerV2, _, err := signerv2.SignerFromConfig(signerv2.Config{ + KeystorePath: c.EcdsaPrivateKeyStorePath, + Password: ecdsaKeyPassword, + }, chainId) + if err != nil { + panic(err) + } + chainioConfig := clients.BuildAllConfig{ + EthHttpUrl: c.EthRpcUrl, + EthWsUrl: c.EthWsUrl, + RegistryCoordinatorAddr: c.AVSRegistryCoordinatorAddress, + OperatorStateRetrieverAddr: c.OperatorStateRetrieverAddress, + AvsName: AVS_NAME, + PromMetricsIpPortAddress: c.EigenMetricsIpPortAddress, + } + sdkClients, err := clients.BuildAll(chainioConfig, common.HexToAddress(c.OperatorAddress), signerV2, logger) + if err != nil { + panic(err) + } + txMgr := txmgr.NewSimpleTxManager(ethRpcClient, logger, signerV2, common.HexToAddress(c.OperatorAddress)) + + avsWriter, err := chainio.BuildAvsWriter( + txMgr, common.HexToAddress(c.AVSRegistryCoordinatorAddress), + common.HexToAddress(c.OperatorStateRetrieverAddress), ethRpcClient, logger, + ) + if err != nil { + logger.Error("Cannot create AvsWriter", "err", err) + return nil, err + } + + avsReader, err := chainio.BuildAvsReader( + common.HexToAddress(c.AVSRegistryCoordinatorAddress), + common.HexToAddress(c.OperatorStateRetrieverAddress), + ethRpcClient, logger) + if err != nil { + logger.Error("Cannot create AvsReader", "err", err) + return nil, err + } + avsSubscriber, err := chainio.BuildAvsSubscriber(common.HexToAddress(c.AVSRegistryCoordinatorAddress), + common.HexToAddress(c.OperatorStateRetrieverAddress), ethWsClient, logger, + ) + if err != nil { + logger.Error("Cannot create AvsSubscriber", "err", err) + return nil, err + } + + // We must register the economic metrics separately because they are exported metrics (from jsonrpc or subgraph calls) + // and not instrumented metrics: see https://prometheus.io/docs/instrumenting/writing_clientlibs/#overall-structure + quorumNames := map[sdktypes.QuorumNum]string{ + 0: "quorum0", + } + economicMetricsCollector := economic.NewCollector( + sdkClients.ElChainReader, sdkClients.AvsRegistryChainReader, + AVS_NAME, logger, common.HexToAddress(c.OperatorAddress), quorumNames) + reg.MustRegister(economicMetricsCollector) + + aggregatorRpcClient, err := NewAggregatorRpcClient(c.AggregatorServerIpPortAddress, logger, avsAndEigenMetrics) + if err != nil { + logger.Error("Cannot create AggregatorRpcClient. Is aggregator running?", "err", err) + return nil, err + } + + operator := &Operator{ + config: c, + logger: logger, + metricsReg: reg, + metrics: avsAndEigenMetrics, + nodeApi: nodeApi, + ethClient: ethRpcClient, + avsWriter: avsWriter, + avsReader: avsReader, + avsSubscriber: avsSubscriber, + eigenlayerReader: sdkClients.ElChainReader, + eigenlayerWriter: sdkClients.ElChainWriter, + blsKeypair: blsKeyPair, + operatorAddr: common.HexToAddress(c.OperatorAddress), + aggregatorServerIpPortAddr: c.AggregatorServerIpPortAddress, + aggregatorRpcClient: aggregatorRpcClient, + checkpointTaskCreatedChan: make(chan *taskmanager.ContractSFFLTaskManagerCheckpointTaskCreated), + sfflServiceManagerAddr: common.HexToAddress(c.AVSRegistryCoordinatorAddress), + operatorId: [32]byte{0}, // this is set below + + } + + if c.RegisterOperatorOnStartup { + operatorEcdsaPrivateKey, err := sdkecdsa.ReadKey( + c.EcdsaPrivateKeyStorePath, + ecdsaKeyPassword, + ) + if err != nil { + return nil, err + } + operator.registerOperatorOnStartup(operatorEcdsaPrivateKey, common.HexToAddress(c.TokenStrategyAddr)) + } + + // OperatorId is set in contract during registration so we get it after registering operator. + operatorId, err := sdkClients.AvsRegistryChainReader.GetOperatorId(&bind.CallOpts{}, operator.operatorAddr) + if err != nil { + logger.Error("Cannot get operator id", "err", err) + return nil, err + } + operator.operatorId = operatorId + logger.Info("Operator info", + "operatorId", operatorId, + "operatorAddr", c.OperatorAddress, + "operatorG1Pubkey", operator.blsKeypair.GetPubKeyG1(), + "operatorG2Pubkey", operator.blsKeypair.GetPubKeyG2(), + ) + + return operator, nil + +} + +func (o *Operator) Start(ctx context.Context) error { + operatorIsRegistered, err := o.avsReader.IsOperatorRegistered(&bind.CallOpts{}, o.operatorAddr) + if err != nil { + o.logger.Error("Error checking if operator is registered", "err", err) + return err + } + if !operatorIsRegistered { + // We bubble the error all the way up instead of using logger.Fatal because logger.Fatal prints a huge stack trace + // that hides the actual error message. This error msg is more explicit and doesn't require showing a stack trace to the user. + return fmt.Errorf("operator is not registered. Registering operator using the operator-cli before starting operator") + } + + o.logger.Infof("Starting operator.") + + if o.config.EnableNodeApi { + o.nodeApi.Start() + } + var metricsErrChan <-chan error + if o.config.EnableMetrics { + metricsErrChan = o.metrics.Start(ctx, o.metricsReg) + } else { + metricsErrChan = make(chan error, 1) + } + + // TODO(samlaf): wrap this call with increase in avs-node-spec metric + sub := o.avsSubscriber.SubscribeToNewTasks(o.checkpointTaskCreatedChan) + for { + select { + case <-ctx.Done(): + return nil + case err := <-metricsErrChan: + // TODO(samlaf); we should also register the service as unhealthy in the node api + // https://eigen.nethermind.io/docs/spec/api/ + o.logger.Fatal("Error in metrics server", "err", err) + case err := <-sub.Err(): + o.logger.Error("Error in websocket subscription", "err", err) + // TODO(samlaf): write unit tests to check if this fixed the issues we were seeing + sub.Unsubscribe() + // TODO(samlaf): wrap this call with increase in avs-node-spec metric + sub = o.avsSubscriber.SubscribeToNewTasks(o.checkpointTaskCreatedChan) + case checkpointTaskCreatedLog := <-o.checkpointTaskCreatedChan: + o.metrics.IncNumTasksReceived() + taskResponse := o.ProcessCheckpointTaskCreatedLog(checkpointTaskCreatedLog) + signedCheckpointTaskResponse, err := o.SignTaskResponse(taskResponse) + if err != nil { + continue + } + go o.aggregatorRpcClient.SendSignedCheckpointTaskResponseToAggregator(signedCheckpointTaskResponse) + } + } +} + +// Takes a CheckpointTaskCreatedLog struct as input and returns a TaskResponseHeader struct. +// The TaskResponseHeader struct is the struct that is signed and sent to the contract as a task response. +func (o *Operator) ProcessCheckpointTaskCreatedLog(checkpointTaskCreatedLog *taskmanager.ContractSFFLTaskManagerCheckpointTaskCreated) *taskmanager.CheckpointTaskResponse { + o.logger.Debug("Received new task", "task", checkpointTaskCreatedLog) + o.logger.Info("Received new task", + "fromNearBlock", checkpointTaskCreatedLog.Task.FromNearBlock, + "toNearBlock", checkpointTaskCreatedLog.Task.ToNearBlock, + "taskIndex", checkpointTaskCreatedLog.TaskIndex, + "taskCreatedBlock", checkpointTaskCreatedLog.Task.TaskCreatedBlock, + "quorumNumbers", checkpointTaskCreatedLog.Task.QuorumNumbers, + "quorumThreshold", checkpointTaskCreatedLog.Task.QuorumThreshold, + ) + + // TODO: build SMT based on stored message agreements and update the test + + taskResponse := &taskmanager.CheckpointTaskResponse{ + ReferenceTaskIndex: checkpointTaskCreatedLog.TaskIndex, + StateRootUpdatesRoot: [32]byte{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + OperatorSetUpdatesRoot: [32]byte{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + } + return taskResponse +} + +func (o *Operator) SignTaskResponse(taskResponse *taskmanager.CheckpointTaskResponse) (*aggregator.SignedCheckpointTaskResponse, error) { + taskResponseHash, err := core.GetCheckpointTaskResponseDigest(taskResponse) + if err != nil { + o.logger.Error("Error getting task response header hash. skipping task (this is not expected and should be investigated)", "err", err) + return nil, err + } + blsSignature := o.blsKeypair.SignMessage(taskResponseHash) + signedCheckpointTaskResponse := &aggregator.SignedCheckpointTaskResponse{ + TaskResponse: *taskResponse, + BlsSignature: *blsSignature, + OperatorId: o.operatorId, + } + o.logger.Debug("Signed task response", "signedCheckpointTaskResponse", signedCheckpointTaskResponse) + return signedCheckpointTaskResponse, nil +} diff --git a/operator/operator_test.go b/operator/operator_test.go new file mode 100644 index 00000000..0cd6ee60 --- /dev/null +++ b/operator/operator_test.go @@ -0,0 +1,116 @@ +package operator + +import ( + "context" + "fmt" + "math/big" + "testing" + "time" + + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/event" + "github.com/stretchr/testify/assert" + "go.uber.org/mock/gomock" + + "github.com/Layr-Labs/eigensdk-go/crypto/bls" + + "github.com/NethermindEth/near-sffl/aggregator" + aggtypes "github.com/NethermindEth/near-sffl/aggregator/types" + taskmanager "github.com/NethermindEth/near-sffl/contracts/bindings/SFFLTaskManager" + chainiomocks "github.com/NethermindEth/near-sffl/core/chainio/mocks" + operatormocks "github.com/NethermindEth/near-sffl/operator/mocks" +) + +func TestOperator(t *testing.T) { + operator, err := createMockOperator() + assert.Nil(t, err) + const taskIndex = 1 + + t.Run("ProcessNewTaskCreatedLog", func(t *testing.T) { + var fromNearBlock = uint64(3) + var toNearBlock = uint64(4) + + newTaskCreatedLog := &taskmanager.ContractSFFLTaskManagerCheckpointTaskCreated{ + TaskIndex: taskIndex, + Task: taskmanager.CheckpointTask{ + FromNearBlock: fromNearBlock, + ToNearBlock: toNearBlock, + TaskCreatedBlock: 1000, + QuorumNumbers: aggtypes.QUORUM_NUMBERS, + QuorumThreshold: aggtypes.QUORUM_THRESHOLD_NUMERATOR, + }, + Raw: types.Log{}, + } + got := operator.ProcessCheckpointTaskCreatedLog(newTaskCreatedLog) + want := &taskmanager.CheckpointTaskResponse{ + ReferenceTaskIndex: taskIndex, + StateRootUpdatesRoot: [32]byte{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + OperatorSetUpdatesRoot: [32]byte{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + } + assert.Equal(t, got, want) + }) + + t.Run("Start", func(t *testing.T) { + var fromNearBlock = uint64(3) + var toNearBlock = uint64(4) + + // new task event + newTaskCreatedEvent := &taskmanager.ContractSFFLTaskManagerCheckpointTaskCreated{ + TaskIndex: taskIndex, + Task: taskmanager.CheckpointTask{ + FromNearBlock: fromNearBlock, + ToNearBlock: toNearBlock, + TaskCreatedBlock: 1000, + QuorumNumbers: aggtypes.QUORUM_NUMBERS, + QuorumThreshold: aggtypes.QUORUM_THRESHOLD_NUMERATOR, + }, + Raw: types.Log{}, + } + fmt.Println("newTaskCreatedEvent", newTaskCreatedEvent) + X, ok := big.NewInt(0).SetString("9996820285347616229516447695531482442433381089408864937966952807215923228881", 10) + assert.True(t, ok) + Y, ok := big.NewInt(0).SetString("10403462274336311613113322623477208113332192454020049193133394900674966403334", 10) + assert.True(t, ok) + + signedTaskResponse := &aggregator.SignedCheckpointTaskResponse{ + TaskResponse: taskmanager.CheckpointTaskResponse{ + ReferenceTaskIndex: taskIndex, + StateRootUpdatesRoot: [32]byte{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + OperatorSetUpdatesRoot: [32]byte{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + }, + BlsSignature: bls.Signature{ + G1Point: bls.NewG1Point(X, Y), + }, + OperatorId: operator.operatorId, + } + mockCtrl := gomock.NewController(t) + defer mockCtrl.Finish() + + mockAggregatorRpcClient := operatormocks.NewMockAggregatorRpcClienter(mockCtrl) + mockAggregatorRpcClient.EXPECT().SendSignedCheckpointTaskResponseToAggregator(signedTaskResponse) + operator.aggregatorRpcClient = mockAggregatorRpcClient + + mockSubscriber := chainiomocks.NewMockAvsSubscriberer(mockCtrl) + mockSubscriber.EXPECT().SubscribeToNewTasks(operator.checkpointTaskCreatedChan).Return(event.NewSubscription(func(quit <-chan struct{}) error { + // loop forever + <-quit + return nil + })) + operator.avsSubscriber = mockSubscriber + + mockReader := chainiomocks.NewMockAvsReaderer(mockCtrl) + mockReader.EXPECT().IsOperatorRegistered(gomock.Any(), operator.operatorAddr).Return(true, nil) + operator.avsReader = mockReader + + ctx, cancel := context.WithCancel(context.Background()) + go func() { + err := operator.Start(ctx) + assert.Nil(t, err) + }() + operator.checkpointTaskCreatedChan <- newTaskCreatedEvent + time.Sleep(1 * time.Second) + + cancel() + }) + +} diff --git a/operator/registration.go b/operator/registration.go new file mode 100644 index 00000000..4c1f750b --- /dev/null +++ b/operator/registration.go @@ -0,0 +1,183 @@ +package operator + +// OUTDATED +// This file contains cli functions for registering an operator with the AVS and printing status +// However, all of this functionality has been moved to the plugin/ package +// we are just waiting for eigenlayer-cli to be open sourced so we can completely get rid of this registration functionality in the operator + +import ( + "context" + "crypto/ecdsa" + "encoding/hex" + "encoding/json" + "fmt" + "math/big" + + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/common" + + "github.com/Layr-Labs/eigensdk-go/crypto/bls" + eigenSdkTypes "github.com/Layr-Labs/eigensdk-go/types" + + regcoord "github.com/Layr-Labs/eigensdk-go/contracts/bindings/RegistryCoordinator" +) + +func (o *Operator) registerOperatorOnStartup( + operatorEcdsaPrivateKey *ecdsa.PrivateKey, + mockTokenStrategyAddr common.Address, +) { + err := o.RegisterOperatorWithEigenlayer() + if err != nil { + // This error might only be that the operator was already registered with eigenlayer, so we don't want to fatal + o.logger.Error("Error registering operator with eigenlayer", "err", err) + } else { + o.logger.Infof("Registered operator with eigenlayer") + } + + // TODO(samlaf): shouldn't hardcode number here + amount := big.NewInt(1000) + err = o.DepositIntoStrategy(mockTokenStrategyAddr, amount) + if err != nil { + o.logger.Fatal("Error depositing into strategy", "err", err) + } + o.logger.Infof("Deposited %s into strategy %s", amount, mockTokenStrategyAddr) + + err = o.RegisterOperatorWithAvs(operatorEcdsaPrivateKey) + if err != nil { + o.logger.Fatal("Error registering operator with avs", "err", err) + } + o.logger.Infof("Registered operator with avs") +} + +func (o *Operator) RegisterOperatorWithEigenlayer() error { + op := eigenSdkTypes.Operator{ + Address: o.operatorAddr.String(), + EarningsReceiverAddress: o.operatorAddr.String(), + } + _, err := o.eigenlayerWriter.RegisterAsOperator(context.Background(), op) + if err != nil { + o.logger.Errorf("Error registering operator with eigenlayer") + return err + } + return nil +} + +func (o *Operator) DepositIntoStrategy(strategyAddr common.Address, amount *big.Int) error { + _, tokenAddr, err := o.eigenlayerReader.GetStrategyAndUnderlyingToken(&bind.CallOpts{}, strategyAddr) + if err != nil { + o.logger.Error("Failed to fetch strategy contract", "err", err) + return err + } + contractErc20Mock, err := o.avsReader.GetErc20Mock(context.Background(), tokenAddr) + if err != nil { + o.logger.Error("Failed to fetch ERC20Mock contract", "err", err) + return err + } + txOpts, err := o.avsWriter.TxMgr.GetNoSendTxOpts() + tx, err := contractErc20Mock.Mint(txOpts, o.operatorAddr, amount) + if err != nil { + o.logger.Errorf("Error assembling Mint tx") + return err + } + _, err = o.avsWriter.TxMgr.Send(context.Background(), tx) + if err != nil { + o.logger.Errorf("Error submitting Mint tx") + return err + } + + _, err = o.eigenlayerWriter.DepositERC20IntoStrategy(context.Background(), strategyAddr, amount) + if err != nil { + o.logger.Errorf("Error depositing into strategy", "err", err) + return err + } + return nil +} + +// Registration specific functions +func (o *Operator) RegisterOperatorWithAvs( + operatorEcdsaKeyPair *ecdsa.PrivateKey, +) error { + // hardcode these things for now + quorumNumbers := []byte{0} + socket := "Not Needed" + operatorToAvsRegistrationSigSalt := [32]byte{123} + curBlockNum, err := o.ethClient.BlockNumber(context.Background()) + if err != nil { + o.logger.Errorf("Unable to get current block number") + return err + } + curBlock, err := o.ethClient.BlockByNumber(context.Background(), big.NewInt(int64(curBlockNum))) + if err != nil { + o.logger.Errorf("Unable to get current block") + return err + } + sigValidForSeconds := int64(1_000_000) + operatorToAvsRegistrationSigExpiry := big.NewInt(int64(curBlock.Time()) + sigValidForSeconds) + _, err = o.avsWriter.RegisterOperatorWithAVSRegistryCoordinator( + context.Background(), + operatorEcdsaKeyPair, operatorToAvsRegistrationSigSalt, operatorToAvsRegistrationSigExpiry, + o.blsKeypair, quorumNumbers, socket, + ) + if err != nil { + o.logger.Errorf("Unable to register operator with avs registry coordinator") + return err + } + o.logger.Infof("Registered operator with avs registry coordinator.") + + return nil +} + +// PRINTING STATUS OF OPERATOR: 1 +// operator address: 0xa0ee7a142d267c1f36714e4a8f75612f20a79720 +// dummy token balance: 0 +// delegated shares in dummyTokenStrat: 200 +// operator pubkey hash in AVS pubkey compendium (0 if not registered): 0x4b7b8243d970ff1c90a7c775c008baad825893ec6e806dfa5d3663dc093ed17f +// operator is opted in to eigenlayer: true +// operator is opted in to playgroundAVS (aka can be slashed): true +// operator status in AVS registry: REGISTERED +// +// operatorId: 0x4b7b8243d970ff1c90a7c775c008baad825893ec6e806dfa5d3663dc093ed17f +// middlewareTimesLen (# of stake updates): 0 +// +// operator is frozen: false +type OperatorStatus struct { + EcdsaAddress string + // pubkey compendium related + PubkeysRegistered bool + G1Pubkey string + G2Pubkey string + // avs related + RegisteredWithAvs bool + OperatorId string +} + +func (o *Operator) PrintOperatorStatus() error { + fmt.Println("Printing operator status") + operatorId, err := o.avsReader.GetOperatorId(&bind.CallOpts{}, o.operatorAddr) + if err != nil { + return err + } + pubkeysRegistered := operatorId != [32]byte{} + registeredWithAvs := o.operatorId != [32]byte{} + operatorStatus := OperatorStatus{ + EcdsaAddress: o.operatorAddr.String(), + PubkeysRegistered: pubkeysRegistered, + G1Pubkey: o.blsKeypair.GetPubKeyG1().String(), + G2Pubkey: o.blsKeypair.GetPubKeyG2().String(), + RegisteredWithAvs: registeredWithAvs, + OperatorId: hex.EncodeToString(o.operatorId[:]), + } + operatorStatusJson, err := json.MarshalIndent(operatorStatus, "", " ") + if err != nil { + return err + } + fmt.Println(string(operatorStatusJson)) + return nil +} + +func pubKeyG1ToBN254G1Point(p *bls.G1Point) regcoord.BN254G1Point { + return regcoord.BN254G1Point{ + X: p.X.BigInt(new(big.Int)), + Y: p.Y.BigInt(new(big.Int)), + } +} diff --git a/operator/registration_test.go b/operator/registration_test.go new file mode 100644 index 00000000..1e60105d --- /dev/null +++ b/operator/registration_test.go @@ -0,0 +1,54 @@ +package operator + +import ( + "testing" + + "github.com/prometheus/client_golang/prometheus" + "github.com/stretchr/testify/assert" + + "github.com/Layr-Labs/eigensdk-go/crypto/bls" + sdklogging "github.com/Layr-Labs/eigensdk-go/logging" + + taskmanager "github.com/NethermindEth/near-sffl/contracts/bindings/SFFLTaskManager" + "github.com/NethermindEth/near-sffl/metrics" + "github.com/NethermindEth/near-sffl/tests" +) + +const MOCK_OPERATOR_BLS_PRIVATE_KEY = "69" + +// hash of bls_public_key (hardcoded for sk=69) +var MOCK_OPERATOR_ID = [32]byte{207, 73, 226, 221, 104, 100, 123, 41, 192, 3, 9, 119, 90, 83, 233, 159, 231, 151, 245, 96, 150, 48, 144, 27, 102, 253, 39, 101, 1, 26, 135, 173} + +// Name starts with Integration test because we don't want it to run with go test ./... +// since this starts a chain and takes longer to run +// TODO(samlaf): buggy test, fix it +func IntegrationTestOperatorRegistration(t *testing.T) { + anvilCmd := tests.StartAnvilChainAndDeployContracts() + defer anvilCmd.Process.Kill() + operator, err := createMockOperator() + assert.Nil(t, err) + err = operator.RegisterOperatorWithEigenlayer() + assert.Nil(t, err) +} + +func createMockOperator() (*Operator, error) { + logger := sdklogging.NewNoopLogger() + reg := prometheus.NewRegistry() + noopMetrics := metrics.NewNoopMetrics() + + blsPrivateKey, err := bls.NewPrivateKey(MOCK_OPERATOR_BLS_PRIVATE_KEY) + if err != nil { + return nil, err + } + operatorKeypair := bls.NewKeyPair(blsPrivateKey) + + operator := &Operator{ + logger: logger, + blsKeypair: operatorKeypair, + metricsReg: reg, + metrics: noopMetrics, + checkpointTaskCreatedChan: make(chan *taskmanager.ContractSFFLTaskManagerCheckpointTaskCreated), + operatorId: MOCK_OPERATOR_ID, + } + return operator, nil +} diff --git a/operator/rpc_client.go b/operator/rpc_client.go new file mode 100644 index 00000000..85364457 --- /dev/null +++ b/operator/rpc_client.go @@ -0,0 +1,77 @@ +package operator + +import ( + "fmt" + "net/rpc" + "time" + + "github.com/NethermindEth/near-sffl/aggregator" + "github.com/NethermindEth/near-sffl/metrics" + + "github.com/Layr-Labs/eigensdk-go/logging" +) + +type AggregatorRpcClienter interface { + SendSignedCheckpointTaskResponseToAggregator(signedCheckpointTaskResponse *aggregator.SignedCheckpointTaskResponse) +} +type AggregatorRpcClient struct { + rpcClient *rpc.Client + metrics metrics.Metrics + logger logging.Logger + aggregatorIpPortAddr string +} + +func NewAggregatorRpcClient(aggregatorIpPortAddr string, logger logging.Logger, metrics metrics.Metrics) (*AggregatorRpcClient, error) { + return &AggregatorRpcClient{ + // set to nil so that we can create an rpc client even if the aggregator is not running + rpcClient: nil, + metrics: metrics, + logger: logger, + aggregatorIpPortAddr: aggregatorIpPortAddr, + }, nil +} + +func (c *AggregatorRpcClient) dialAggregatorRpcClient() error { + client, err := rpc.DialHTTP("tcp", c.aggregatorIpPortAddr) + if err != nil { + return err + } + c.rpcClient = client + return nil +} + +// SendSignedCheckpointTaskResponseToAggregator sends a signed task response to the aggregator. +// it is meant to be ran inside a go thread, so doesn't return anything. +// this is because sending the signed task response to the aggregator is time sensitive, +// so there is no point in retrying if it fails for a few times. +// Currently hardcoded to retry sending the signed task response 5 times, waiting 2 seconds in between each attempt. +func (c *AggregatorRpcClient) SendSignedCheckpointTaskResponseToAggregator(signedCheckpointTaskResponse *aggregator.SignedCheckpointTaskResponse) { + if c.rpcClient == nil { + c.logger.Info("rpc client is nil. Dialing aggregator rpc client") + err := c.dialAggregatorRpcClient() + if err != nil { + c.logger.Error("Could not dial aggregator rpc client. Not sending signed task response header to aggregator. Is aggregator running?", "err", err) + return + } + } + // we don't check this bool. It's just needed because rpc.Call requires rpc methods to have a return value + var reply bool + // We try to send the response 5 times to the aggregator, waiting 2 times in between each attempt. + // This is mostly only necessary for local testing, since the aggregator sometimes is not ready to process task responses + // before the operator gets the new task created log from anvil (because blocks are mined instantly) + // the aggregator needs to read some onchain data related to quorums before it can accept operator signed task responses. + c.logger.Info("Sending signed task response header to aggregator", "signedCheckpointTaskResponse", fmt.Sprintf("%#v", signedCheckpointTaskResponse)) + for i := 0; i < 5; i++ { + err := c.rpcClient.Call("Aggregator.ProcessSignedCheckpointTaskResponse", signedCheckpointTaskResponse, &reply) + if err != nil { + c.logger.Info("Received error from aggregator", "err", err) + } else { + c.logger.Info("Signed task response header accepted by aggregator.", "reply", reply) + c.metrics.IncNumTasksAcceptedByAggregator() + return + } + c.logger.Infof("Retrying in 2 seconds") + time.Sleep(2 * time.Second) + } + c.logger.Errorf("Could not send signed task response to aggregator. Tried 5 times.") +} diff --git a/plugin/cmd/main.go b/plugin/cmd/main.go new file mode 100644 index 00000000..0967af09 --- /dev/null +++ b/plugin/cmd/main.go @@ -0,0 +1,240 @@ +package main + +import ( + "context" + "fmt" + "log" + "math/big" + "os" + "time" + + sdkclients "github.com/Layr-Labs/eigensdk-go/chainio/clients" + "github.com/Layr-Labs/eigensdk-go/chainio/clients/eth" + "github.com/Layr-Labs/eigensdk-go/chainio/txmgr" + regcoord "github.com/Layr-Labs/eigensdk-go/contracts/bindings/RegistryCoordinator" + "github.com/Layr-Labs/eigensdk-go/crypto/bls" + sdkecdsa "github.com/Layr-Labs/eigensdk-go/crypto/ecdsa" + "github.com/Layr-Labs/eigensdk-go/logging" + "github.com/Layr-Labs/eigensdk-go/signerv2" + "github.com/Layr-Labs/eigensdk-go/utils" + "github.com/NethermindEth/near-sffl/core/chainio" + "github.com/NethermindEth/near-sffl/types" + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/common" + "github.com/urfave/cli" +) + +var ( + /* Required Flags */ + ConfigFileFlag = cli.StringFlag{ + Name: "config", + Required: true, + Usage: "Load configuration from `FILE`", + EnvVar: "CONFIG", + } + EcdsaKeyPasswordFlag = cli.StringFlag{ + Name: "ecdsa-key-password", + Required: false, + Usage: "Password to decrypt the ecdsa key", + EnvVar: "ECDSA_KEY_PASSWORD", + } + BlsKeyPasswordFlag = cli.StringFlag{ + Name: "bls-key-password", + Required: false, + Usage: "Password to decrypt the bls key", + EnvVar: "BLS_KEY_PASSWORD", + } + OperationFlag = cli.StringFlag{ + Name: "operation-type", + Required: true, + Usage: "Supported operations: opt-in, deposit", + EnvVar: "OPERATION_TYPE", + } + StrategyAddrFlag = cli.StringFlag{ + Name: "strategy-addr", + Required: false, + Usage: "Strategy address for deposit mock tokens, only used for deposit action", + EnvVar: "STRATEGY_ADDR", + } +) + +func main() { + app := cli.NewApp() + app.Flags = []cli.Flag{ + ConfigFileFlag, + EcdsaKeyPasswordFlag, + BlsKeyPasswordFlag, + OperationFlag, + StrategyAddrFlag, + } + app.Name = "sffl-plugin" + app.Usage = "SFFL Plugin" + app.Description = "This is used to run one time operations like avs opt-in/opt-out" + app.Action = plugin + err := app.Run(os.Args) + if err != nil { + log.Fatalln("Application failed.", "Message:", err) + } +} + +func plugin(ctx *cli.Context) { + goCtx := context.Background() + + operationType := ctx.GlobalString(OperationFlag.Name) + configPath := ctx.GlobalString(ConfigFileFlag.Name) + + avsConfig := types.NodeConfig{} + err := utils.ReadYamlConfig(configPath, &avsConfig) + if err != nil { + fmt.Println(err) + return + } + fmt.Println(avsConfig) + + ecdsaKeyPassword := ctx.GlobalString(EcdsaKeyPasswordFlag.Name) + + buildClientConfig := sdkclients.BuildAllConfig{ + EthHttpUrl: avsConfig.EthRpcUrl, + EthWsUrl: avsConfig.EthWsUrl, + RegistryCoordinatorAddr: avsConfig.AVSRegistryCoordinatorAddress, + OperatorStateRetrieverAddr: avsConfig.OperatorStateRetrieverAddress, + AvsName: "super-fast-finality-layer", + PromMetricsIpPortAddress: avsConfig.EigenMetricsIpPortAddress, + } + logger, _ := logging.NewZapLogger(logging.Development) + ethHttpClient, err := eth.NewClient(avsConfig.EthRpcUrl) + if err != nil { + fmt.Println("can't connect to eth client") + fmt.Println(err) + return + } + chainID, err := ethHttpClient.ChainID(goCtx) + if err != nil { + fmt.Println("can't get chain id") + fmt.Println(err) + return + } + signerV2, _, err := signerv2.SignerFromConfig(signerv2.Config{ + KeystorePath: avsConfig.EcdsaPrivateKeyStorePath, + Password: ecdsaKeyPassword, + }, chainID) + if err != nil { + fmt.Println("can't create signer") + fmt.Println(err) + return + } + clients, err := sdkclients.BuildAll(buildClientConfig, common.HexToAddress(avsConfig.OperatorAddress), signerV2, logger) + avsReader, err := chainio.BuildAvsReader( + common.HexToAddress(avsConfig.AVSRegistryCoordinatorAddress), + common.HexToAddress(avsConfig.OperatorStateRetrieverAddress), + ethHttpClient, + logger, + ) + if err != nil { + fmt.Println("can't create avs reader") + fmt.Println(err) + return + } + txMgr := txmgr.NewSimpleTxManager(ethHttpClient, logger, signerV2, common.HexToAddress(avsConfig.OperatorAddress)) + avsWriter, err := chainio.BuildAvsWriter( + txMgr, + common.HexToAddress(avsConfig.AVSRegistryCoordinatorAddress), + common.HexToAddress(avsConfig.OperatorStateRetrieverAddress), + ethHttpClient, + logger, + ) + if err != nil { + fmt.Println("can't create avs reader") + fmt.Println(err) + return + } + + if operationType == "opt-in" { + blsKeyPassword := ctx.GlobalString(BlsKeyPasswordFlag.Name) + + blsKeypair, err := bls.ReadPrivateKeyFromFile(avsConfig.BlsPrivateKeyStorePath, blsKeyPassword) + if err != nil { + fmt.Println(err) + return + } + + operatorEcdsaPrivateKey, err := sdkecdsa.ReadKey( + avsConfig.EcdsaPrivateKeyStorePath, + ecdsaKeyPassword, + ) + if err != nil { + fmt.Println(err) + return + } + + // Register with registry coordination + quorumNumbers := []byte{0} + socket := "Not Needed" + sigValidForSeconds := int64(1_000_000) + operatorToAvsRegistrationSigSalt := [32]byte{123} + operatorToAvsRegistrationSigExpiry := big.NewInt(int64(time.Now().Unix()) + sigValidForSeconds) + logger.Infof("Registering with registry coordination with quorum numbers %v and socket %s", quorumNumbers, socket) + r, err := clients.AvsRegistryChainWriter.RegisterOperatorWithAVSRegistryCoordinator( + goCtx, + operatorEcdsaPrivateKey, operatorToAvsRegistrationSigSalt, operatorToAvsRegistrationSigExpiry, + blsKeypair, quorumNumbers, socket, + ) + if err != nil { + logger.Errorf("Error assembling RegisterOperatorWithAVSRegistryCoordinator tx") + fmt.Println(err) + return + } + logger.Infof("Registered with registry coordination successfully with tx hash %s", r.TxHash.Hex()) + } else if operationType == "opt-out" { + fmt.Println("Opting out of slashing - unimplemented") + } else if operationType == "deposit" { + starategyAddrString := ctx.GlobalString(StrategyAddrFlag.Name) + if len(starategyAddrString) == 0 { + fmt.Println("Strategy address is required for deposit operation") + return + } + strategyAddr := common.HexToAddress(ctx.GlobalString(StrategyAddrFlag.Name)) + _, tokenAddr, err := clients.ElChainReader.GetStrategyAndUnderlyingToken(&bind.CallOpts{}, strategyAddr) + if err != nil { + logger.Error("Failed to fetch strategy contract", "err", err) + return + } + contractErc20Mock, err := avsReader.GetErc20Mock(context.Background(), tokenAddr) + if err != nil { + logger.Error("Failed to fetch ERC20Mock contract", "err", err) + return + } + txOpts, err := avsWriter.TxMgr.GetNoSendTxOpts() + if err != nil { + logger.Errorf("Error getting tx opts") + return + } + amount := big.NewInt(1000) + tx, err := contractErc20Mock.Mint(txOpts, common.HexToAddress(avsConfig.OperatorAddress), amount) + if err != nil { + logger.Errorf("Error assembling Mint tx") + return + } + _, err = avsWriter.TxMgr.Send(context.Background(), tx) + if err != nil { + logger.Errorf("Error submitting Mint tx") + return + } + + _, err = clients.ElChainWriter.DepositERC20IntoStrategy(context.Background(), strategyAddr, amount) + if err != nil { + logger.Errorf("Error depositing into strategy") + return + } + return + } else { + fmt.Println("Invalid operation type") + } +} + +func pubKeyG1ToBN254G1Point(p *bls.G1Point) regcoord.BN254G1Point { + return regcoord.BN254G1Point{ + X: p.X.BigInt(new(big.Int)), + Y: p.Y.BigInt(new(big.Int)), + } +} diff --git a/prometheus/prometheus.yml b/prometheus/prometheus.yml new file mode 100644 index 00000000..7383f605 --- /dev/null +++ b/prometheus/prometheus.yml @@ -0,0 +1,27 @@ +global: + scrape_interval: 15s + + # Attach these labels to any time series or alerts when communicating with + # external systems (federation, remote storage, Alertmanager). + external_labels: + monitor: "docker-host-alpha" + +# A scrape configuration containing exactly one endpoint to scrape. +scrape_configs: + + - job_name: "prometheus" + scrape_interval: 10s + static_configs: + - targets: ["localhost:9090"] + + - job_name: "sffl-node" + scrape_interval: 5s + static_configs: + # host.docker.internal might not work on linux + # TODO: do https://stackoverflow.com/a/67158212/4971151 + # - targets: ["host.docker.internal:9090"] + - targets: ["sffl-operator1:9090"] + labels: + bot: "sffl-node" + relabel_configs: + # is this actually useful? We already have the job name \ No newline at end of file diff --git a/tests/anvil/README.md b/tests/anvil/README.md new file mode 100644 index 00000000..e117cfbb --- /dev/null +++ b/tests/anvil/README.md @@ -0,0 +1,21 @@ +# Integration Tests + +We store an anvil state files in this directory, so that we can start an anvil chain with the correct state for integration tests. +``` +anvil --load-state STATE_FILE.json +``` + +## Deployment state files + +The various anvil state files such as `eigenlayer-deployed-anvil-state.json` contain the state of the anvil chain after deploying the contracts. They are created by running the various scripts in this folder + +### Eigenlayer deployment state +It was created by running this [deploy script](https://github.com/Layr-Labs/eigenlayer-contracts/blob/2cb9ed107c6c918b9dfbac94cd71b4ab7c94e8c2/script/testing/M2_Deploy_From_Scratch.s.sol). If you ever need to redeploy a new version of eigenlayer contracts, first start an anvil chain that dumps its state after exiting +``` +anvil --dump-state eigenlayer-deployed-anvil-state.json +``` +Then run the deploy script +``` +forge script script/testing/M2_Deploy_From_Scratch.s.sol --rpc-url http://localhost:8545 --private-key 0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80 --broadcast --sig "run(string memory configFile)" -- M2_deploy_from_scratch.anvil.config.json +``` +and finally kill the anvil chain with `Ctrl-C`. Make sure to copy the deployment [output file](https://github.com/Layr-Labs/eigenlayer-contracts/blob/master/script/output/M2_from_scratch_deployment_data.json) to [eigenlayer_deployment_output.json](../../contracts/evm/script/output/31337/eigenlayer_deployment_output.json) so that the tests can find the deployed contracts. \ No newline at end of file diff --git a/tests/anvil/data/avs-and-eigenlayer-deployed-anvil-state.json b/tests/anvil/data/avs-and-eigenlayer-deployed-anvil-state.json new file mode 100644 index 00000000..5cc03c06 --- /dev/null +++ b/tests/anvil/data/avs-and-eigenlayer-deployed-anvil-state.json @@ -0,0 +1 @@ +{"accounts":{"0x0000000000000000000000000000000000000000":{"nonce":0,"balance":"0x229a9ac9fb68200","code":"0x","storage":{}},"0x0165878a594ca255338adfa4d48449f69242eb8f":{"nonce":1,"balance":"0x0","code":"0x60806040526004361061004e5760003560e01c80633659cfe6146100655780634f1ef286146100855780635c60da1b146100985780638f283970146100c9578063f851a440146100e95761005d565b3661005d5761005b6100fe565b005b61005b6100fe565b34801561007157600080fd5b5061005b6100803660046106f1565b610118565b61005b61009336600461070c565b61015f565b3480156100a457600080fd5b506100ad6101d0565b6040516001600160a01b03909116815260200160405180910390f35b3480156100d557600080fd5b5061005b6100e43660046106f1565b61020b565b3480156100f557600080fd5b506100ad610235565b61010661029b565b61011661011161033a565b610344565b565b610120610368565b6001600160a01b0316336001600160a01b03161415610157576101548160405180602001604052806000815250600061039b565b50565b6101546100fe565b610167610368565b6001600160a01b0316336001600160a01b031614156101c8576101c38383838080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506001925061039b915050565b505050565b6101c36100fe565b60006101da610368565b6001600160a01b0316336001600160a01b03161415610200576101fb61033a565b905090565b6102086100fe565b90565b610213610368565b6001600160a01b0316336001600160a01b0316141561015757610154816103c6565b600061023f610368565b6001600160a01b0316336001600160a01b03161415610200576101fb610368565b6060610285838360405180606001604052806027815260200161080b6027913961041a565b9392505050565b6001600160a01b03163b151590565b6102a3610368565b6001600160a01b0316336001600160a01b031614156101165760405162461bcd60e51b815260206004820152604260248201527f5472616e73706172656e745570677261646561626c6550726f78793a2061646d60448201527f696e2063616e6e6f742066616c6c6261636b20746f2070726f78792074617267606482015261195d60f21b608482015260a4015b60405180910390fd5b60006101fb6104f7565b3660008037600080366000845af43d6000803e808015610363573d6000f35b3d6000fd5b60007fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b546001600160a01b0316919050565b6103a48361051f565b6000825111806103b15750805b156101c3576103c08383610260565b50505050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f6103ef610368565b604080516001600160a01b03928316815291841660208301520160405180910390a16101548161055f565b60606001600160a01b0384163b6104825760405162461bcd60e51b815260206004820152602660248201527f416464726573733a2064656c65676174652063616c6c20746f206e6f6e2d636f6044820152651b9d1c9858dd60d21b6064820152608401610331565b600080856001600160a01b03168560405161049d91906107bb565b600060405180830381855af49150503d80600081146104d8576040519150601f19603f3d011682016040523d82523d6000602084013e6104dd565b606091505b50915091506104ed828286610608565b9695505050505050565b60007f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc61038c565b61052881610641565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b6001600160a01b0381166105c45760405162461bcd60e51b815260206004820152602660248201527f455243313936373a206e65772061646d696e20697320746865207a65726f206160448201526564647265737360d01b6064820152608401610331565b807fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b80546001600160a01b0319166001600160a01b039290921691909117905550565b60608315610617575081610285565b8251156106275782518084602001fd5b8160405162461bcd60e51b815260040161033191906107d7565b6001600160a01b0381163b6106ae5760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b6064820152608401610331565b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc6105e7565b80356001600160a01b03811681146106ec57600080fd5b919050565b60006020828403121561070357600080fd5b610285826106d5565b60008060006040848603121561072157600080fd5b61072a846106d5565b9250602084013567ffffffffffffffff8082111561074757600080fd5b818601915086601f83011261075b57600080fd5b81358181111561076a57600080fd5b87602082850101111561077c57600080fd5b6020830194508093505050509250925092565b60005b838110156107aa578181015183820152602001610792565b838111156103c05750506000910152565b600082516107cd81846020870161078f565b9190910192915050565b60208152600082518060208401526107f681604085016020870161078f565b601f01601f1916919091016040019291505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a2646970667358221220bceca38d0e447b38e612e8ea5bb02b1e1fcac6609b19aa0fd3fd43aa4b97bf1b64736f6c634300080c0033","storage":{"0x0":"0x1","0x33":"0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266","0x65":"0xe7f1725e7734ce288f8367e1bb143e90bb3f0512","0x66":"0x1e","0x97":"0x0","0x9a":"0x0","0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc":"0xdcd1bf9a1b36ce34237eeafef220932846bcd82","0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103":"0x5fbdb2315678afecb367f032d93f642f64180aa3"}},"0x09635f643e140090a9a8dcd712ed6285858cebef":{"nonce":1,"balance":"0x0","code":"0x608060405234801561001057600080fd5b506004361061004c5760003560e01c806346fbf68e146100515780638568520614610089578063ce5484281461009e578063eab66d7a146100b1575b600080fd5b61007461005f366004610313565b60006020819052908152604090205460ff1681565b60405190151581526020015b60405180910390f35b61009c610097366004610335565b6100dc565b005b61009c6100ac366004610313565b61011d565b6001546100c4906001600160a01b031681565b6040516001600160a01b039091168152602001610080565b6001546001600160a01b0316331461010f5760405162461bcd60e51b815260040161010690610371565b60405180910390fd5b6101198282610153565b5050565b6001546001600160a01b031633146101475760405162461bcd60e51b815260040161010690610371565b61015081610220565b50565b6001600160a01b0382166101bf5760405162461bcd60e51b815260206004820152602d60248201527f50617573657252656769737472792e5f7365745061757365723a207a65726f2060448201526c1859191c995cdcc81a5b9c1d5d609a1b6064820152608401610106565b6001600160a01b03821660008181526020818152604091829020805460ff19168515159081179091558251938452908301527f65d3a1fd4c13f05cba164f80d03ce90fb4b5e21946bfc3ab7dbd434c2d0b9152910160405180910390a15050565b6001600160a01b03811661028e5760405162461bcd60e51b815260206004820152602f60248201527f50617573657252656769737472792e5f736574556e7061757365723a207a657260448201526e1bc81859191c995cdcc81a5b9c1d5d608a1b6064820152608401610106565b600154604080516001600160a01b03928316815291831660208301527f06b4167a2528887a1e97a366eefe8549bfbf1ea3e6ac81cb2564a934d20e8892910160405180910390a1600180546001600160a01b0319166001600160a01b0392909216919091179055565b80356001600160a01b038116811461030e57600080fd5b919050565b60006020828403121561032557600080fd5b61032e826102f7565b9392505050565b6000806040838503121561034857600080fd5b610351836102f7565b91506020830135801515811461036657600080fd5b809150509250929050565b6020808252602a908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526939903ab73830bab9b2b960b11b60608201526080019056fea2646970667358221220885ae5714fc1e3bd0d22f21b5099f13667e21b0f31caf869dee3c46b7e0b399864736f6c634300080c0033","storage":{"0x1":"0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266","0x723077b8a1b173adc35e5f0e7e3662fd1208212cb629f9c128551ea7168da722":"0x1"}},"0x0dcd1bf9a1b36ce34237eeafef220932846bcd82":{"nonce":1,"balance":"0x0","code":"0x6080604052600436106101ee5760003560e01c80639104c3191161010d578063c0ccbf10116100a0578063daf12cd41161006f578063daf12cd4146105ec578063ea4d3c9b1461060c578063f2fde38b14610640578063f6848d2414610660578063fabc1cbc1461069b57600080fd5b8063c0ccbf1014610576578063c1de3aef1461058c578063c2c51c40146105ac578063d1c64cc9146105cc57600080fd5b8063a6a509be116100dc578063a6a509be146104ec578063b134427114610502578063beffbb8914610536578063c052bd611461055657600080fd5b80639104c3191461045b5780639b4e4634146104835780639ba0627514610496578063a38406a3146104cc57600080fd5b80635ac86ab71161018557806374cdd7981161015457806374cdd798146103d457806384d8106214610408578063886f11951461041d5780638da5cb5b1461043d57600080fd5b80635ac86ab71461033d5780635c975abb1461037d57806360f4062b14610392578063715018a6146103bf57600080fd5b8063292b7b2b116101c1578063292b7b2b14610288578063387b1300146102d457806339b70e38146102f4578063595c6a671461032857600080fd5b80630cf2686d146101f35780630e81073c1461021557806310d67a2f14610248578063136439dd14610268575b600080fd5b3480156101ff57600080fd5b5061021361020e3660046122df565b6106bb565b005b34801561022157600080fd5b5061023561023036600461230d565b610777565b6040519081526020015b60405180910390f35b34801561025457600080fd5b50610213610263366004612339565b610982565b34801561027457600080fd5b506102136102833660046122df565b610a32565b34801561029457600080fd5b506102bc7f0000000000000000000000008a791620dd6260079bf849dc5567adc3f2fdc31881565b6040516001600160a01b03909116815260200161023f565b3480156102e057600080fd5b506102136102ef366004612356565b610b71565b34801561030057600080fd5b506102bc7f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c981565b34801561033457600080fd5b50610213610eb4565b34801561034957600080fd5b5061036d610358366004612397565b606654600160ff9092169190911b9081161490565b604051901515815260200161023f565b34801561038957600080fd5b50606654610235565b34801561039e57600080fd5b506102356103ad366004612339565b609b6020526000908152604090205481565b3480156103cb57600080fd5b50610213610f7b565b3480156103e057600080fd5b506102bc7f00000000000000000000000000000000219ab540356cbb839cbe05303d7705fa81565b34801561041457600080fd5b506102bc610f8f565b34801561042957600080fd5b506065546102bc906001600160a01b031681565b34801561044957600080fd5b506033546001600160a01b03166102bc565b34801561046757600080fd5b506102bc73beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac081565b610213610491366004612403565b611079565b3480156104a257600080fd5b506102bc6104b1366004612339565b6098602052600090815260409020546001600160a01b031681565b3480156104d857600080fd5b506102bc6104e7366004612339565b611168565b3480156104f857600080fd5b5061023560995481565b34801561050e57600080fd5b506102bc7f0000000000000000000000005fc8d32690cc91d4c39d9d3abcbd16989f87570781565b34801561054257600080fd5b5061021361055136600461230d565b61123a565b34801561056257600080fd5b506097546102bc906001600160a01b031681565b34801561058257600080fd5b50610235609a5481565b34801561059857600080fd5b506102136105a7366004612339565b611451565b3480156105b857600080fd5b506102136105c736600461230d565b611462565b3480156105d857600080fd5b506102356105e7366004612477565b611834565b3480156105f857600080fd5b506102136106073660046124a1565b61193f565b34801561061857600080fd5b506102bc7f000000000000000000000000cf7ed3acca5a467e9e704c703e8d87f634fb0fc981565b34801561064c57600080fd5b5061021361065b366004612339565b611a72565b34801561066c57600080fd5b5061036d61067b366004612339565b6001600160a01b0390811660009081526098602052604090205416151590565b3480156106a757600080fd5b506102136106b63660046122df565b611ae8565b606560009054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561070e573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061073291906124fc565b6001600160a01b0316336001600160a01b03161461076b5760405162461bcd60e51b815260040161076290612519565b60405180910390fd5b61077481611c44565b50565b6000336001600160a01b037f000000000000000000000000cf7ed3acca5a467e9e704c703e8d87f634fb0fc916146107c15760405162461bcd60e51b815260040161076290612563565b6001600160a01b03831661083d5760405162461bcd60e51b815260206004820152603a60248201527f456967656e506f644d616e616765722e6164645368617265733a20706f644f7760448201527f6e65722063616e6e6f74206265207a65726f20616464726573730000000000006064820152608401610762565b60008212156108ab5760405162461bcd60e51b815260206004820152603460248201527f456967656e506f644d616e616765722e6164645368617265733a207368617265604482015273732063616e6e6f74206265206e6567617469766560601b6064820152608401610762565b6108b9633b9aca00836125d7565b1561092c5760405162461bcd60e51b815260206004820152603d60248201527f456967656e506f644d616e616765722e6164645368617265733a20736861726560448201527f73206d75737420626520612077686f6c65204777656920616d6f756e740000006064820152608401610762565b6001600160a01b0383166000908152609b6020526040812054906109508483612601565b6001600160a01b0386166000908152609b6020526040902081905590506109778282611c85565b925050505b92915050565b606560009054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156109d5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109f991906124fc565b6001600160a01b0316336001600160a01b031614610a295760405162461bcd60e51b815260040161076290612519565b61077481611cc7565b60655460405163237dfb4760e11b81523360048201526001600160a01b03909116906346fbf68e90602401602060405180830381865afa158015610a7a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a9e9190612642565b610aba5760405162461bcd60e51b815260040161076290612664565b60665481811614610b335760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e70617573653a20696e76616c696420617474656d70742060448201527f746f20756e70617573652066756e6374696f6e616c69747900000000000000006064820152608401610762565b606681905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d906020015b60405180910390a250565b336001600160a01b037f000000000000000000000000cf7ed3acca5a467e9e704c703e8d87f634fb0fc91614610bb95760405162461bcd60e51b815260040161076290612563565b6001600160a01b038316610c335760405162461bcd60e51b8152602060048201526047602482015260008051602061314183398151915260448201527f546f6b656e733a20706f644f776e65722063616e6e6f74206265207a65726f206064820152666164647265737360c81b608482015260a401610762565b6001600160a01b038216610cb05760405162461bcd60e51b815260206004820152604a602482015260008051602061314183398151915260448201527f546f6b656e733a2064657374696e6174696f6e2063616e6e6f74206265207a65606482015269726f206164647265737360b01b608482015260a401610762565b6000811215610d1f5760405162461bcd60e51b8152602060048201526041602482015260008051602061314183398151915260448201527f546f6b656e733a207368617265732063616e6e6f74206265206e6567617469766064820152606560f81b608482015260a401610762565b610d2d633b9aca00826125d7565b15610da15760405162461bcd60e51b815260206004820152604a602482015260008051602061314183398151915260448201527f546f6b656e733a20736861726573206d75737420626520612077686f6c6520476064820152691dd95a48185b5bdd5b9d60b21b608482015260a401610762565b6001600160a01b0383166000908152609b602052604081205490811215610e38576000610dcd826126ac565b905080831115610e01576001600160a01b0385166000908152609b6020526040812055610dfa81846126c9565b9250610e36565b6001600160a01b0385166000908152609b602052604081208054859290610e29908490612601565b90915550610eaf92505050565b505b6001600160a01b03848116600090815260986020526040908190205490516362483a2160e11b815285831660048201526024810185905291169063c490744290604401600060405180830381600087803b158015610e9557600080fd5b505af1158015610ea9573d6000803e3d6000fd5b50505050505b505050565b60655460405163237dfb4760e11b81523360048201526001600160a01b03909116906346fbf68e90602401602060405180830381865afa158015610efc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f209190612642565b610f3c5760405162461bcd60e51b815260040161076290612664565b600019606681905560405190815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a2565b610f83611dbe565b610f8d6000611e18565b565b606654600090819060019081161415610fe65760405162461bcd60e51b815260206004820152601960248201527814185d5cd8589b194e881a5b99195e081a5cc81c185d5cd959603a1b6044820152606401610762565b336000908152609860205260409020546001600160a01b0316156110685760405162461bcd60e51b815260206004820152603360248201527f456967656e506f644d616e616765722e637265617465506f643a2053656e64656044820152721c88185b1c9958591e481a185cc818481c1bd9606a1b6064820152608401610762565b6000611072611e6a565b9250505090565b606654600090600190811614156110ce5760405162461bcd60e51b815260206004820152601960248201527814185d5cd8589b194e881a5b99195e081a5cc81c185d5cd959603a1b6044820152606401610762565b336000908152609860205260409020546001600160a01b0316806110f7576110f4611e6a565b90505b6040516326d3918d60e21b81526001600160a01b03821690639b4e463490349061112d908b908b908b908b908b90600401612709565b6000604051808303818588803b15801561114657600080fd5b505af115801561115a573d6000803e3d6000fd5b505050505050505050505050565b6001600160a01b038082166000908152609860205260408120549091168061097c57611233836001600160a01b031660001b60405180610940016040528061090e815260200161283361090e9139604080516001600160a01b037f0000000000000000000000008a791620dd6260079bf849dc5567adc3f2fdc318166020820152808201919091526000606082015260800160408051601f1981840301815290829052611218929160200161277e565b60405160208183030381529060405280519060200120612045565b9392505050565b336001600160a01b037f000000000000000000000000cf7ed3acca5a467e9e704c703e8d87f634fb0fc916146112825760405162461bcd60e51b815260040161076290612563565b60008112156112f95760405162461bcd60e51b815260206004820152603760248201527f456967656e506f644d616e616765722e72656d6f76655368617265733a20736860448201527f617265732063616e6e6f74206265206e656761746976650000000000000000006064820152608401610762565b611307633b9aca00826125d7565b1561137c576040805162461bcd60e51b81526020600482015260248101919091527f456967656e506f644d616e616765722e72656d6f76655368617265733a20736860448201527f61726573206d75737420626520612077686f6c65204777656920616d6f756e746064820152608401610762565b6001600160a01b0382166000908152609b60205260408120546113a0908390612793565b905060008112156114315760405162461bcd60e51b815260206004820152604f60248201527f456967656e506f644d616e616765722e72656d6f76655368617265733a20636160448201527f6e6e6f7420726573756c7420696e20706f64206f776e657220686176696e672060648201526e6e656761746976652073686172657360881b608482015260a401610762565b6001600160a01b039092166000908152609b602052604090209190915550565b611459611dbe565b610774816120a1565b6001600160a01b0380831660009081526098602052604090205483911633146114dd5760405162461bcd60e51b815260206004820152602760248201527f456967656e506f644d616e616765722e6f6e6c79456967656e506f643a206e6f6044820152661d0818481c1bd960ca1b6064820152608401610762565b600260c95414156115305760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610762565b600260c9556001600160a01b0383166115cc5760405162461bcd60e51b815260206004820152605260248201527f456967656e506f644d616e616765722e7265636f7264426561636f6e4368616960448201527f6e45544842616c616e63655570646174653a20706f644f776e65722063616e6e6064820152716f74206265207a65726f206164647265737360701b608482015260a401610762565b6115da633b9aca00836127d2565b156116735760405162461bcd60e51b815260206004820152605a60248201527f456967656e506f644d616e616765722e7265636f7264426561636f6e4368616960448201527f6e45544842616c616e63655570646174653a2073686172657344656c7461206d60648201527f75737420626520612077686f6c65204777656920616d6f756e74000000000000608482015260a401610762565b6001600160a01b0383166000908152609b6020526040812054906116978483612601565b6001600160a01b0386166000908152609b602052604081208290559091506116bf8383611c85565b9050801561182757600081121561178a576001600160a01b037f000000000000000000000000cf7ed3acca5a467e9e704c703e8d87f634fb0fc91663132d49678773beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac061171e856126ac565b6040516001600160e01b031960e086901b1681526001600160a01b0393841660048201529290911660248301526044820152606401600060405180830381600087803b15801561176d57600080fd5b505af1158015611781573d6000803e3d6000fd5b50505050611827565b604051631452b9d760e11b81526001600160a01b03878116600483015273beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac06024830152604482018390527f000000000000000000000000cf7ed3acca5a467e9e704c703e8d87f634fb0fc916906328a573ae90606401600060405180830381600087803b15801561180e57600080fd5b505af1158015611822573d6000803e3d6000fd5b505050505b5050600160c95550505050565b60975460405163321accf960e11b815267ffffffffffffffff8316600482015260009182916001600160a01b039091169063643599f290602401602060405180830381865afa15801561188b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118af91906127e6565b90508061097c5760405162461bcd60e51b815260206004820152605260248201527f456967656e506f644d616e616765722e676574426c6f636b526f6f744174546960448201527f6d657374616d703a20737461746520726f6f742061742074696d657374616d70606482015271081b9bdd081e595d08199a5b985b1a5e995960721b608482015260a401610762565b600054610100900460ff161580801561195f5750600054600160ff909116105b806119795750303b158015611979575060005460ff166001145b6119dc5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610762565b6000805460ff1916600117905580156119ff576000805461ff0019166101001790555b611a0886611c44565b611a11856120a1565b611a1a84611e18565b611a2483836120eb565b8015611a6a576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050505050565b611a7a611dbe565b6001600160a01b038116611adf5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610762565b61077481611e18565b606560009054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611b3b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b5f91906124fc565b6001600160a01b0316336001600160a01b031614611b8f5760405162461bcd60e51b815260040161076290612519565b606654198119606654191614611c0d5760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e756e70617573653a20696e76616c696420617474656d7060448201527f7420746f2070617573652066756e6374696f6e616c69747900000000000000006064820152608401610762565b606681905560405181815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c90602001610b66565b609a5460408051918252602082018390527f4e65c41a3597bda732ca64980235cf51494171d5853998763fb05db45afaacb3910160405180910390a1609a55565b6000808313611ca55760008213611c9e5750600061097c565b508061097c565b60008213611cbd57611cb6836126ac565b905061097c565b611cb68383612793565b6001600160a01b038116611d555760405162461bcd60e51b815260206004820152604960248201527f5061757361626c652e5f73657450617573657252656769737472793a206e657760448201527f50617573657252656769737472792063616e6e6f7420626520746865207a65726064820152686f206164647265737360b81b608482015260a401610762565b606554604080516001600160a01b03928316815291831660208301527f6e9fcd539896fca60e8b0f01dd580233e48a6b0f7df013b89ba7f565869acdb6910160405180910390a1606580546001600160a01b0319166001600160a01b0392909216919091179055565b6033546001600160a01b03163314610f8d5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610762565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6000609a546099546001611e7e91906127ff565b1115611ee25760405162461bcd60e51b815260206004820152602d60248201527f456967656e506f644d616e616765722e5f6465706c6f79506f643a20706f642060448201526c1b1a5b5a5d081c995858da1959609a1b6064820152608401610762565b609960008154611ef190612817565b9091555060408051610940810190915261090e808252600091611f9091839133916128336020830139604080516001600160a01b037f0000000000000000000000008a791620dd6260079bf849dc5567adc3f2fdc318166020820152808201919091526000606082015260800160408051601f1981840301815290829052611f7c929160200161277e565b6040516020818303038152906040526121d5565b60405163189acdbd60e31b81523360048201529091506001600160a01b0382169063c4d66de890602401600060405180830381600087803b158015611fd457600080fd5b505af1158015611fe8573d6000803e3d6000fd5b50503360008181526098602052604080822080546001600160a01b0319166001600160a01b038816908117909155905192945092507f21c99d0db02213c32fff5b05cf0a718ab5f858802b91498f80d82270289d856a91a3919050565b604080516001600160f81b03196020808301919091526bffffffffffffffffffffffff193060601b1660218301526035820185905260558083018590528351808403909101815260759092019092528051910120600090611233565b609780546001600160a01b0319166001600160a01b0383169081179091556040517f08f0470754946ccfbb446ff7fd2d6ae6af1bbdae19f85794c0cc5ed5e8ceb4f690600090a250565b6065546001600160a01b031615801561210c57506001600160a01b03821615155b61218e5760405162461bcd60e51b815260206004820152604760248201527f5061757361626c652e5f696e697469616c697a655061757365723a205f696e6960448201527f7469616c697a6550617573657228292063616e206f6e6c792062652063616c6c6064820152666564206f6e636560c81b608482015260a401610762565b606681905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a26121d182611cc7565b5050565b600080844710156122285760405162461bcd60e51b815260206004820152601d60248201527f437265617465323a20696e73756666696369656e742062616c616e63650000006044820152606401610762565b82516122765760405162461bcd60e51b815260206004820181905260248201527f437265617465323a2062797465636f6465206c656e677468206973207a65726f6044820152606401610762565b8383516020850187f590506001600160a01b0381166122d75760405162461bcd60e51b815260206004820152601960248201527f437265617465323a204661696c6564206f6e206465706c6f79000000000000006044820152606401610762565b949350505050565b6000602082840312156122f157600080fd5b5035919050565b6001600160a01b038116811461077457600080fd5b6000806040838503121561232057600080fd5b823561232b816122f8565b946020939093013593505050565b60006020828403121561234b57600080fd5b8135611233816122f8565b60008060006060848603121561236b57600080fd5b8335612376816122f8565b92506020840135612386816122f8565b929592945050506040919091013590565b6000602082840312156123a957600080fd5b813560ff8116811461123357600080fd5b60008083601f8401126123cc57600080fd5b50813567ffffffffffffffff8111156123e457600080fd5b6020830191508360208285010111156123fc57600080fd5b9250929050565b60008060008060006060868803121561241b57600080fd5b853567ffffffffffffffff8082111561243357600080fd5b61243f89838a016123ba565b9097509550602088013591508082111561245857600080fd5b50612465888289016123ba565b96999598509660400135949350505050565b60006020828403121561248957600080fd5b813567ffffffffffffffff8116811461123357600080fd5b600080600080600060a086880312156124b957600080fd5b8535945060208601356124cb816122f8565b935060408601356124db816122f8565b925060608601356124eb816122f8565b949793965091946080013592915050565b60006020828403121561250e57600080fd5b8151611233816122f8565b6020808252602a908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526939903ab73830bab9b2b960b11b606082015260800190565b602080825260409082018190527f456967656e506f644d616e616765722e6f6e6c7944656c65676174696f6e4d61908201527f6e616765723a206e6f74207468652044656c65676174696f6e4d616e61676572606082015260800190565b634e487b7160e01b600052601260045260246000fd5b6000826125e6576125e66125c1565b500690565b634e487b7160e01b600052601160045260246000fd5b600080821280156001600160ff1b0384900385131615612623576126236125eb565b600160ff1b839003841281161561263c5761263c6125eb565b50500190565b60006020828403121561265457600080fd5b8151801515811461123357600080fd5b60208082526028908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526739903830bab9b2b960c11b606082015260800190565b6000600160ff1b8214156126c2576126c26125eb565b5060000390565b6000828210156126db576126db6125eb565b500390565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b60608152600061271d6060830187896126e0565b82810360208401526127308186886126e0565b9150508260408301529695505050505050565b6000815160005b81811015612764576020818501810151868301520161274a565b81811115612773576000828601525b509290920192915050565b60006122d761278d8386612743565b84612743565b60008083128015600160ff1b8501841216156127b1576127b16125eb565b6001600160ff1b03840183138116156127cc576127cc6125eb565b50500390565b6000826127e1576127e16125c1565b500790565b6000602082840312156127f857600080fd5b5051919050565b60008219821115612812576128126125eb565b500190565b600060001982141561282b5761282b6125eb565b506001019056fe608060405260405161090e38038061090e83398101604081905261002291610460565b61002e82826000610035565b505061058a565b61003e83610100565b6040516001600160a01b038416907f1cf3b03a6cf19fa2baba4df148e9dcabedea7f8a5c07840e207e5c089be95d3e90600090a260008251118061007f5750805b156100fb576100f9836001600160a01b0316635c60da1b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156100c5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906100e99190610520565b836102a360201b6100291760201c565b505b505050565b610113816102cf60201b6100551760201c565b6101725760405162461bcd60e51b815260206004820152602560248201527f455243313936373a206e657720626561636f6e206973206e6f74206120636f6e6044820152641d1c9858dd60da1b60648201526084015b60405180910390fd5b6101e6816001600160a01b0316635c60da1b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156101b3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906101d79190610520565b6102cf60201b6100551760201c565b61024b5760405162461bcd60e51b815260206004820152603060248201527f455243313936373a20626561636f6e20696d706c656d656e746174696f6e206960448201526f1cc81b9bdd08184818dbdb9d1c9858dd60821b6064820152608401610169565b806102827fa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d5060001b6102de60201b6100641760201c565b80546001600160a01b0319166001600160a01b039290921691909117905550565b60606102c883836040518060600160405280602781526020016108e7602791396102e1565b9392505050565b6001600160a01b03163b151590565b90565b6060600080856001600160a01b0316856040516102fe919061053b565b600060405180830381855af49150503d8060008114610339576040519150601f19603f3d011682016040523d82523d6000602084013e61033e565b606091505b5090925090506103508683838761035a565b9695505050505050565b606083156103c65782516103bf576001600160a01b0385163b6103bf5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610169565b50816103d0565b6103d083836103d8565b949350505050565b8151156103e85781518083602001fd5b8060405162461bcd60e51b81526004016101699190610557565b80516001600160a01b038116811461041957600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b60005b8381101561044f578181015183820152602001610437565b838111156100f95750506000910152565b6000806040838503121561047357600080fd5b61047c83610402565b60208401519092506001600160401b038082111561049957600080fd5b818501915085601f8301126104ad57600080fd5b8151818111156104bf576104bf61041e565b604051601f8201601f19908116603f011681019083821181831017156104e7576104e761041e565b8160405282815288602084870101111561050057600080fd5b610511836020830160208801610434565b80955050505050509250929050565b60006020828403121561053257600080fd5b6102c882610402565b6000825161054d818460208701610434565b9190910192915050565b6020815260008251806020840152610576816040850160208701610434565b601f01601f19169190910160400192915050565b61034e806105996000396000f3fe60806040523661001357610011610017565b005b6100115b610027610022610067565b610100565b565b606061004e83836040518060600160405280602781526020016102f260279139610124565b9392505050565b6001600160a01b03163b151590565b90565b600061009a7fa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d50546001600160a01b031690565b6001600160a01b0316635c60da1b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156100d7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906100fb9190610249565b905090565b3660008037600080366000845af43d6000803e80801561011f573d6000f35b3d6000fd5b6060600080856001600160a01b03168560405161014191906102a2565b600060405180830381855af49150503d806000811461017c576040519150601f19603f3d011682016040523d82523d6000602084013e610181565b606091505b50915091506101928683838761019c565b9695505050505050565b6060831561020d578251610206576001600160a01b0385163b6102065760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064015b60405180910390fd5b5081610217565b610217838361021f565b949350505050565b81511561022f5781518083602001fd5b8060405162461bcd60e51b81526004016101fd91906102be565b60006020828403121561025b57600080fd5b81516001600160a01b038116811461004e57600080fd5b60005b8381101561028d578181015183820152602001610275565b8381111561029c576000848401525b50505050565b600082516102b4818460208701610272565b9190910192915050565b60208152600082518060208401526102dd816040850160208701610272565b601f01601f1916919091016040019291505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a2646970667358221220d51e81d3bc5ed20a26aeb05dce7e825c503b2061aa78628027300c8d65b9d89a64736f6c634300080c0033416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564456967656e506f644d616e616765722e77697468647261775368617265734173a2646970667358221220543f9ce279848456798b3d87c119b4c7742c70fdf6bb7e22c63123da44aa75d864736f6c634300080c0033","storage":{"0x0":"0xff"}},"0x14dc79964da2c08b23698b3d3cc7ca32193d9955":{"nonce":0,"balance":"0x21e19e0c9bab2400000","code":"0x","storage":{}},"0x15d34aaf54267db7d7c367839aaf71a00a2c6a65":{"nonce":0,"balance":"0x21e19e0c9bab2400000","code":"0x","storage":{}},"0x1613beb3b2c4f22ee086b2b38c1476a3ce7f78e8":{"nonce":1,"balance":"0x0","code":"0x608060405234801561001057600080fd5b50600436106100415760003560e01c80633563b0d1146100465780634f739f741461006f578063cefdc1d41461008f575b600080fd5b610059610054366004610d22565b6100b0565b6040516100669190610e6a565b60405180910390f35b61008261007d366004610ed0565b61042b565b6040516100669190610fd4565b6100a261009d36600461108f565b610ab2565b6040516100669291906110d1565b60606000846001600160a01b031663683048356040518163ffffffff1660e01b8152600401602060405180830381865afa1580156100f2573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061011691906110f2565b90506000856001600160a01b0316639e9923c26040518163ffffffff1660e01b8152600401602060405180830381865afa158015610158573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061017c91906110f2565b90506000855167ffffffffffffffff81111561019a5761019a610cb9565b6040519080825280602002602001820160405280156101cd57816020015b60608152602001906001900390816101b85790505b50905060005b86518110156104205760008782815181106101f0576101f061110f565b0160200151604051638902624560e01b815260f89190911c6004820181905263ffffffff8916602483015291506000906001600160a01b03861690638902624590604401600060405180830381865afa158015610251573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526102799190810190611149565b9050805167ffffffffffffffff81111561029557610295610cb9565b6040519080825280602002602001820160405280156102da57816020015b60408051808201909152600080825260208201528152602001906001900390816102b35790505b508484815181106102ed576102ed61110f565b602002602001018190525060005b815181101561040a5760008282815181106103185761031861110f565b602090810291909101810151604080518082018252828152905163fa28c62760e01b81526004810183905260ff8816602482015263ffffffff8e166044820152919350918201906001600160a01b038b169063fa28c62790606401602060405180830381865afa158015610390573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103b491906111df565b6001600160601b03168152508686815181106103d2576103d261110f565b602002602001015183815181106103eb576103eb61110f565b60200260200101819052505080806104029061121e565b9150506102fb565b50505080806104189061121e565b9150506101d3565b509695505050505050565b6104566040518060800160405280606081526020016060815260200160608152602001606081525090565b6000876001600160a01b031663683048356040518163ffffffff1660e01b8152600401602060405180830381865afa158015610496573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104ba91906110f2565b90506104e76040518060800160405280606081526020016060815260200160608152602001606081525090565b6040516361c8a12f60e11b81526001600160a01b038a169063c391425e90610517908b9089908990600401611239565b600060405180830381865afa158015610534573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261055c9190810190611283565b81526040516340e03a8160e11b81526001600160a01b038316906381c075029061058e908b908b908b9060040161133b565b600060405180830381865afa1580156105ab573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526105d39190810190611283565b60408201528567ffffffffffffffff8111156105f1576105f1610cb9565b60405190808252806020026020018201604052801561062457816020015b606081526020019060019003908161060f5790505b50606082015260005b60ff81168711156109c35760008567ffffffffffffffff81111561065357610653610cb9565b60405190808252806020026020018201604052801561067c578160200160208202803683370190505b5083606001518360ff16815181106106965761069661110f565b602002602001018190525060005b868110156108c25760008c6001600160a01b03166304ec63518a8a858181106106cf576106cf61110f565b905060200201358e886000015186815181106106ed576106ed61110f565b60200260200101516040518463ffffffff1660e01b815260040161072a9392919092835263ffffffff918216602084015216604082015260600190565b602060405180830381865afa158015610747573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061076b9190611364565b90508a8a8560ff168181106107825761078261110f565b6001600160c01b03841692013560f81c9190911c6001908116141590506108af57856001600160a01b031663dd9846b98a8a858181106107c4576107c461110f565b905060200201358d8d8860ff168181106107e0576107e061110f565b6040516001600160e01b031960e087901b1681526004810194909452919091013560f81c60248301525063ffffffff8f166044820152606401602060405180830381865afa158015610836573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061085a919061138d565b85606001518560ff16815181106108735761087361110f565b6020026020010151848151811061088c5761088c61110f565b63ffffffff90921660209283029190910190910152826108ab8161121e565b9350505b50806108ba8161121e565b9150506106a4565b5060008167ffffffffffffffff8111156108de576108de610cb9565b604051908082528060200260200182016040528015610907578160200160208202803683370190505b50905060005b828110156109885784606001518460ff168151811061092e5761092e61110f565b602002602001015181815181106109475761094761110f565b60200260200101518282815181106109615761096161110f565b63ffffffff90921660209283029190910190910152806109808161121e565b91505061090d565b508084606001518460ff16815181106109a3576109a361110f565b6020026020010181905250505080806109bb906113aa565b91505061062d565b506000896001600160a01b0316635df459466040518163ffffffff1660e01b8152600401602060405180830381865afa158015610a04573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a2891906110f2565b60405163354952a360e21b81529091506001600160a01b0382169063d5254a8c90610a5b908b908b908e906004016113ca565b600060405180830381865afa158015610a78573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610aa09190810190611283565b60208301525098975050505050505050565b6040805160018082528183019092526000916060918391602080830190803683370190505090508481600081518110610aed57610aed61110f565b60209081029190910101526040516361c8a12f60e11b81526000906001600160a01b0388169063c391425e90610b2990889086906004016113f4565b600060405180830381865afa158015610b46573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610b6e9190810190611283565b600081518110610b8057610b8061110f565b60209081029190910101516040516304ec635160e01b81526004810188905263ffffffff87811660248301529091166044820181905291506000906001600160a01b038916906304ec635190606401602060405180830381865afa158015610bec573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c109190611364565b6001600160c01b031690506000610c2682610c44565b905081610c348a838a6100b0565b9550955050505050935093915050565b60606000805b610100811015610c9a576001811b915083821615610c8a57828160f81b604051602001610c78929190611448565b60405160208183030381529060405292505b610c938161121e565b9050610c4a565b5050919050565b6001600160a01b0381168114610cb657600080fd5b50565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff81118282101715610cf857610cf8610cb9565b604052919050565b63ffffffff81168114610cb657600080fd5b8035610d1d81610d00565b919050565b600080600060608486031215610d3757600080fd5b8335610d4281610ca1565b925060208481013567ffffffffffffffff80821115610d6057600080fd5b818701915087601f830112610d7457600080fd5b813581811115610d8657610d86610cb9565b610d98601f8201601f19168501610ccf565b91508082528884828501011115610dae57600080fd5b8084840185840137600084828401015250809450505050610dd160408501610d12565b90509250925092565b600081518084526020808501808196508360051b810191508286016000805b86811015610e5c578385038a52825180518087529087019087870190845b81811015610e47578351805184528a01516001600160601b03168a84015292890192604090920191600101610e17565b50509a87019a95505091850191600101610df9565b509298975050505050505050565b602081526000610e7d6020830184610dda565b9392505050565b60008083601f840112610e9657600080fd5b50813567ffffffffffffffff811115610eae57600080fd5b6020830191508360208260051b8501011115610ec957600080fd5b9250929050565b60008060008060008060808789031215610ee957600080fd5b8635610ef481610ca1565b95506020870135610f0481610d00565b9450604087013567ffffffffffffffff80821115610f2157600080fd5b818901915089601f830112610f3557600080fd5b813581811115610f4457600080fd5b8a6020828501011115610f5657600080fd5b602083019650809550506060890135915080821115610f7457600080fd5b50610f8189828a01610e84565b979a9699509497509295939492505050565b600081518084526020808501945080840160005b83811015610fc957815163ffffffff1687529582019590820190600101610fa7565b509495945050505050565b600060208083528351608082850152610ff060a0850182610f93565b905081850151601f198086840301604087015261100d8383610f93565b9250604087015191508086840301606087015261102a8383610f93565b60608801518782038301608089015280518083529194508501925084840190600581901b8501860160005b82811015611081578487830301845261106f828751610f93565b95880195938801939150600101611055565b509998505050505050505050565b6000806000606084860312156110a457600080fd5b83356110af81610ca1565b92506020840135915060408401356110c681610d00565b809150509250925092565b8281526040602082015260006110ea6040830184610dda565b949350505050565b60006020828403121561110457600080fd5b8151610e7d81610ca1565b634e487b7160e01b600052603260045260246000fd5b600067ffffffffffffffff82111561113f5761113f610cb9565b5060051b60200190565b6000602080838503121561115c57600080fd5b825167ffffffffffffffff81111561117357600080fd5b8301601f8101851361118457600080fd5b805161119761119282611125565b610ccf565b81815260059190911b820183019083810190878311156111b657600080fd5b928401925b828410156111d4578351825292840192908401906111bb565b979650505050505050565b6000602082840312156111f157600080fd5b81516001600160601b0381168114610e7d57600080fd5b634e487b7160e01b600052601160045260246000fd5b600060001982141561123257611232611208565b5060010190565b63ffffffff84168152604060208201819052810182905260006001600160fb1b0383111561126657600080fd5b8260051b8085606085013760009201606001918252509392505050565b6000602080838503121561129657600080fd5b825167ffffffffffffffff8111156112ad57600080fd5b8301601f810185136112be57600080fd5b80516112cc61119282611125565b81815260059190911b820183019083810190878311156112eb57600080fd5b928401925b828410156111d457835161130381610d00565b825292840192908401906112f0565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b63ffffffff8416815260406020820152600061135b604083018486611312565b95945050505050565b60006020828403121561137657600080fd5b81516001600160c01b0381168114610e7d57600080fd5b60006020828403121561139f57600080fd5b8151610e7d81610d00565b600060ff821660ff8114156113c1576113c1611208565b60010192915050565b6040815260006113de604083018587611312565b905063ffffffff83166020830152949350505050565b60006040820163ffffffff851683526020604081850152818551808452606086019150828701935060005b8181101561143b5784518352938301939183019160010161141f565b5090979650505050505050565b6000835160005b81811015611469576020818701810151858301520161144f565b81811115611478576000828501525b506001600160f81b031993909316919092019081526001019291505056fea26469706673582212207ceec542143f09f97ea3e4cc65c829de002a2be50588308c1b3a6ae41c6e743864736f6c634300080c0033","storage":{}},"0x2279b7a0a67db372996a5fab50d91eaa73d2ebe6":{"nonce":1,"balance":"0x0","code":"0x6080604052600436106101855760003560e01c806374cdd798116100d1578063c49074421161008a578063e251ef5211610064578063e251ef5214610563578063e2c8344514610583578063f2882461146105a3578063fe80b087146105d757600080fd5b8063c490744214610503578063c4d66de814610523578063dda3346c1461054357600080fd5b806374cdd7981461044057806387e0d289146104745780639b4e46341461049b578063a50600f4146104ae578063b522538a146104ce578063baa7145a146104ee57600080fd5b806334bea20a1161013e57806358eaee791161011857806358eaee791461038f5780635d3f65b6146103bc5780636fcd0e53146103dc5780637439841f1461040957600080fd5b806334bea20a146103005780633f65cf191461033b5780634665bcda1461035b57600080fd5b80630b18ff66146101db5780630cd4649e146102185780631a5057be1461022f5780631d905d5c146102635780633106ab53146102af5780633474aa16146102e057600080fd5b366101d657346037600082825461019c9190614a35565b90915550506040513481527f6fdd3dbdb173299608c0aa9f368735857c8842b581f8389238bf05bd04b3bf499060200160405180910390a1005b600080fd5b3480156101e757600080fd5b506033546101fb906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b34801561022457600080fd5b5061022d6105fb565b005b34801561023b57600080fd5b506101fb7f000000000000000000000000a513e6e4b8f2a923d98304ec87f64353c4d5c85381565b34801561026f57600080fd5b506102977f000000000000000000000000000000000000000000000000000000077359400081565b6040516001600160401b03909116815260200161020f565b3480156102bb57600080fd5b506034546102d090600160401b900460ff1681565b604051901515815260200161020f565b3480156102ec57600080fd5b50603454610297906001600160401b031681565b34801561030c57600080fd5b506102d061031b366004614a69565b603560209081526000928352604080842090915290825290205460ff1681565b34801561034757600080fd5b5061022d610356366004614af8565b610764565b34801561036757600080fd5b506101fb7f0000000000000000000000000165878a594ca255338adfa4d48449f69242eb8f81565b34801561039b57600080fd5b506103af6103aa366004614c07565b610c05565b60405161020f9190614c80565b3480156103c857600080fd5b50603854610297906001600160401b031681565b3480156103e857600080fd5b506103fc6103f7366004614c8e565b610c6a565b60405161020f9190614ca7565b34801561041557600080fd5b506103af610424366004614c8e565b600090815260366020526040902054600160c01b900460ff1690565b34801561044c57600080fd5b506101fb7f00000000000000000000000000000000219ab540356cbb839cbe05303d7705fa81565b34801561048057600080fd5b5060335461029790600160a01b90046001600160401b031681565b61022d6104a9366004614cef565b610d17565b3480156104ba57600080fd5b5061022d6104c9366004614d62565b610ec4565b3480156104da57600080fd5b506103fc6104e9366004614c07565b611293565b3480156104fa57600080fd5b5061022d611386565b34801561050f57600080fd5b5061022d61051e366004614e0a565b6113f1565b34801561052f57600080fd5b5061022d61053e366004614e36565b61162e565b34801561054f57600080fd5b5061022d61055e366004614f50565b611806565b34801561056f57600080fd5b5061022d61057e366004615021565b6119d9565b34801561058f57600080fd5b5061022d61059e366004614e0a565b611da4565b3480156105af57600080fd5b506102977f000000000000000000000000000000000000000000000000000000006059f46081565b3480156105e357600080fd5b506105ed60375481565b60405190815260200161020f565b604051635ac86ab760e01b8152600260048201819052907f0000000000000000000000000165878a594ca255338adfa4d48449f69242eb8f6001600160a01b031690635ac86ab790602401602060405180830381865afa158015610663573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610687919061511c565b156106ad5760405162461bcd60e51b81526004016106a49061513e565b60405180910390fd5b6033546001600160a01b031633146106d75760405162461bcd60e51b81526004016106a49061519b565b603454600160401b900460ff16156107015760405162461bcd60e51b81526004016106a4906151e3565b6034805460ff60401b1916600160401b179055603354610729906001600160a01b0316611f87565b6033546040516001600160a01b03909116907fca8dfc8c5e0a67a74501c072a3325f685259bebbae7cfd230ab85198a78b70cd90600090a250565b6033546001600160a01b0316331461078e5760405162461bcd60e51b81526004016106a49061519b565b604051635ac86ab760e01b8152600260048201819052907f0000000000000000000000000165878a594ca255338adfa4d48449f69242eb8f6001600160a01b031690635ac86ab790602401602060405180830381865afa1580156107f6573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061081a919061511c565b156108375760405162461bcd60e51b81526004016106a49061513e565b60335489906001600160401b03600160a01b90910481169082161161086e5760405162461bcd60e51b81526004016106a490615232565b603454600160401b900460ff166108e65760405162461bcd60e51b815260206004820152603660248201527f456967656e506f642e686173456e61626c656452657374616b696e673a2072656044820152751cdd185ada5b99c81a5cc81b9bdd08195b98589b195960521b60648201526084016106a4565b86851480156108f457508483145b6109845760405162461bcd60e51b815260206004820152605560248201527f456967656e506f642e7665726966795769746864726177616c43726564656e7460448201527f69616c733a2076616c696461746f72496e646963657320616e642070726f6f666064820152740e640daeae6e840c4ca40e6c2daca40d8cadccee8d605b1b608482015260a4016106a4565b4261099a613f486001600160401b038d16614a35565b1015610a235760405162461bcd60e51b815260206004820152604c60248201527f456967656e506f642e7665726966795769746864726177616c43726564656e7460448201527f69616c733a207370656369666965642074696d657374616d7020697320746f6f60648201526b0819985c881a5b881c185cdd60a21b608482015260a4016106a4565b60405163d1c64cc960e01b81526001600160401b038b166004820152610acc907f0000000000000000000000000165878a594ca255338adfa4d48449f69242eb8f6001600160a01b03169063d1c64cc990602401602060405180830381865afa158015610a94573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ab891906152cd565b8a35610ac760208d018d6152e6565b611fbb565b6000805b88811015610b7057610b528c8c358c8c85818110610af057610af061532c565b9050602002016020810190610b059190615342565b8b8b86818110610b1757610b1761532c565b9050602002810190610b2991906152e6565b8b8b88818110610b3b57610b3b61532c565b9050602002810190610b4d9190615369565b612149565b610b5c9083614a35565b915080610b68816153b2565b915050610ad0565b5060335460405163030b147160e61b81526001600160a01b039182166004820152602481018390527f0000000000000000000000000165878a594ca255338adfa4d48449f69242eb8f9091169063c2c51c4090604401600060405180830381600087803b158015610be057600080fd5b505af1158015610bf4573d6000803e3d6000fd5b505050505050505050505050505050565b600080610c4784848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506125ee92505050565b600090815260366020526040902054600160c01b900460ff169150505b92915050565b610c926040805160808101825260008082526020820181905291810182905290606082015290565b600082815260366020908152604091829020825160808101845281546001600160401b038082168352600160401b8204811694830194909452600160801b810490931693810193909352906060830190600160c01b900460ff166002811115610cfd57610cfd614c48565b6002811115610d0e57610d0e614c48565b90525092915050565b336001600160a01b037f0000000000000000000000000165878a594ca255338adfa4d48449f69242eb8f1614610d5f5760405162461bcd60e51b81526004016106a4906153cd565b346801bc16d674ec80000014610deb5760405162461bcd60e51b8152602060048201526044602482018190527f456967656e506f642e7374616b653a206d75737420696e697469616c6c792073908201527f74616b6520666f7220616e792076616c696461746f72207769746820333220656064820152633a3432b960e11b608482015260a4016106a4565b7f00000000000000000000000000000000219ab540356cbb839cbe05303d7705fa6001600160a01b031663228951186801bc16d674ec8000008787610e2e6126e8565b8888886040518863ffffffff1660e01b8152600401610e529695949392919061549f565b6000604051808303818588803b158015610e6b57600080fd5b505af1158015610e7f573d6000803e3d6000fd5b50505050507f606865b7934a25d4aed43f6cdb426403353fa4b3009c4d228407474581b01e238585604051610eb59291906154ee565b60405180910390a15050505050565b604051635ac86ab760e01b8152600360048201819052907f0000000000000000000000000165878a594ca255338adfa4d48449f69242eb8f6001600160a01b031690635ac86ab790602401602060405180830381865afa158015610f2c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f50919061511c565b15610f6d5760405162461bcd60e51b81526004016106a49061513e565b8684148015610f7b57508382145b6110045760405162461bcd60e51b815260206004820152604e60248201527f456967656e506f642e76657269667942616c616e6365557064617465733a207660448201527f616c696461746f72496e646963657320616e642070726f6f6673206d7573742060648201526d0c4ca40e6c2daca40d8cadccee8d60931b608482015260a4016106a4565b4261101a613f486001600160401b038c16614a35565b101561109c5760405162461bcd60e51b815260206004820152604560248201527f456967656e506f642e76657269667942616c616e6365557064617465733a207360448201527f70656369666965642074696d657374616d7020697320746f6f2066617220696e606482015264081c185cdd60da1b608482015260a4016106a4565b60405163d1c64cc960e01b81526001600160401b038a166004820152611140907f0000000000000000000000000165878a594ca255338adfa4d48449f69242eb8f6001600160a01b03169063d1c64cc990602401602060405180830381865afa15801561110d573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061113191906152cd565b8735610ac760208a018a6152e6565b6000805b888110156111e4576111c68b8b8b848181106111625761116261532c565b90506020020160208101906111779190615342565b8a358a8a8681811061118b5761118b61532c565b905060200281019061119d91906152e6565b8a8a888181106111af576111af61532c565b90506020028101906111c19190615369565b61272d565b6111d09083615502565b9150806111dc816153b2565b915050611144565b506033546001600160a01b037f0000000000000000000000000165878a594ca255338adfa4d48449f69242eb8f81169163c2c51c409116611229633b9aca0085615543565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b15801561126f57600080fd5b505af1158015611283573d6000803e3d6000fd5b5050505050505050505050505050565b6112bb6040805160808101825260008082526020820181905291810182905290606082015290565b603660006112fe85858080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506125ee92505050565b81526020808201929092526040908101600020815160808101835281546001600160401b038082168352600160401b8204811695830195909552600160801b81049094169281019290925290916060830190600160c01b900460ff16600281111561136b5761136b614c48565b600281111561137c5761137c614c48565b9052509392505050565b6033546001600160a01b031633146113b05760405162461bcd60e51b81526004016106a49061519b565b603454600160401b900460ff16156113da5760405162461bcd60e51b81526004016106a4906151e3565b6033546113ef906001600160a01b0316611f87565b565b336001600160a01b037f0000000000000000000000000165878a594ca255338adfa4d48449f69242eb8f16146114395760405162461bcd60e51b81526004016106a4906153cd565b611447633b9aca00826155de565b156114d15760405162461bcd60e51b815260206004820152604e60248201527f456967656e506f642e776974686472617752657374616b6564426561636f6e4360448201527f6861696e4554483a20616d6f756e74576569206d75737420626520612077686f60648201526d1b194811ddd95a48185b5bdd5b9d60921b608482015260a4016106a4565b60006114e1633b9aca00836155f2565b6034549091506001600160401b03908116908216111561159a5760405162461bcd60e51b815260206004820152606260248201527f456967656e506f642e776974686472617752657374616b6564426561636f6e4360448201527f6861696e4554483a20616d6f756e74477765692065786365656473207769746860648201527f6472617761626c6552657374616b6564457865637574696f6e4c617965724777608482015261656960f01b60a482015260c4016106a4565b603480548291906000906115b89084906001600160401b0316615606565b92506101000a8154816001600160401b0302191690836001600160401b03160217905550826001600160a01b03167f8947fd2ce07ef9cc302c4e8f0461015615d91ce851564839e91cc804c2f49d8e8360405161161791815260200190565b60405180910390a26116298383612c0b565b505050565b600054610100900460ff161580801561164e5750600054600160ff909116105b806116685750303b158015611668575060005460ff166001145b6116cb5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084016106a4565b6000805460ff1916600117905580156116ee576000805461ff0019166101001790555b6001600160a01b0382166117615760405162461bcd60e51b815260206004820152603460248201527f456967656e506f642e696e697469616c697a653a20706f644f776e65722063616044820152736e6e6f74206265207a65726f206164647265737360601b60648201526084016106a4565b603380546001600160a01b0384166001600160a01b031990911681179091556034805460ff60401b1916600160401b1790556040517fca8dfc8c5e0a67a74501c072a3325f685259bebbae7cfd230ab85198a78b70cd90600090a28015611802576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050565b6033546001600160a01b031633146118305760405162461bcd60e51b81526004016106a49061519b565b604051635ac86ab760e01b8152600560048201819052907f0000000000000000000000000165878a594ca255338adfa4d48449f69242eb8f6001600160a01b031690635ac86ab790602401602060405180830381865afa158015611898573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118bc919061511c565b156118d95760405162461bcd60e51b81526004016106a49061513e565b82518451146119645760405162461bcd60e51b815260206004820152604b60248201527f456967656e506f642e7265636f766572546f6b656e733a20746f6b656e4c697360448201527f7420616e6420616d6f756e7473546f5769746864726177206d7573742062652060648201526a0e6c2daca40d8cadccee8d60ab1b608482015260a4016106a4565b60005b84518110156119d2576119c0838583815181106119865761198661532c565b60200260200101518784815181106119a0576119a061532c565b60200260200101516001600160a01b0316612c159092919063ffffffff16565b806119ca816153b2565b915050611967565b5050505050565b604051635ac86ab760e01b81526004808201819052907f0000000000000000000000000165878a594ca255338adfa4d48449f69242eb8f6001600160a01b031690635ac86ab790602401602060405180830381865afa158015611a40573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a64919061511c565b15611a815760405162461bcd60e51b81526004016106a49061513e565b8386148015611a8f57508588145b8015611a9a57508782145b611b0e576040805162461bcd60e51b81526020600482015260248101919091527f456967656e506f642e766572696679416e6450726f636573735769746864726160448201527f77616c733a20696e70757473206d7573742062652073616d65206c656e67746860648201526084016106a4565b60405163d1c64cc960e01b81526001600160401b038c166004820152611bb2907f0000000000000000000000000165878a594ca255338adfa4d48449f69242eb8f6001600160a01b03169063d1c64cc990602401602060405180830381865afa158015611b7f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ba391906152cd565b8b35610ac760208e018e6152e6565b604080518082019091526000808252602082015260005b83811015611cb2576000611c6d8d358d8d85818110611bea57611bea61532c565b9050602002810190611bfc919061562e565b8c8c86818110611c0e57611c0e61532c565b9050602002810190611c2091906152e6565b8c8c88818110611c3257611c3261532c565b9050602002810190611c449190615369565b8c8c8a818110611c5657611c5661532c565b9050602002810190611c689190615369565b612c67565b80518451919250908490611c82908390614a35565b9052506020808201519084018051611c9b908390615502565b905250819050611caa816153b2565b915050611bc9565b50805115611ce1576033548151611ce1916001600160a01b031690611cdc90633b9aca009061564f565b6130ae565b602081015115611d965760335460208201516001600160a01b037f0000000000000000000000000165878a594ca255338adfa4d48449f69242eb8f81169263c2c51c4092911690611d3790633b9aca0090615543565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b158015611d7d57600080fd5b505af1158015611d91573d6000803e3d6000fd5b505050505b505050505050505050505050565b6033546001600160a01b03163314611dce5760405162461bcd60e51b81526004016106a49061519b565b604051635ac86ab760e01b8152600560048201819052907f0000000000000000000000000165878a594ca255338adfa4d48449f69242eb8f6001600160a01b031690635ac86ab790602401602060405180830381865afa158015611e36573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e5a919061511c565b15611e775760405162461bcd60e51b81526004016106a49061513e565b603754821115611f285760405162461bcd60e51b815260206004820152606a60248201527f456967656e506f642e77697468647261776e6f6e426561636f6e436861696e4560448201527f544842616c616e63655765693a20616d6f756e74546f5769746864726177206960648201527f732067726561746572207468616e206e6f6e426561636f6e436861696e45544860848201526942616c616e636557656960b01b60a482015260c4016106a4565b8160376000828254611f3a919061566e565b90915550506040518281526001600160a01b038416907f30420aacd028abb3c1fd03aba253ae725d6ddd52d16c9ac4cb5742cd43f530969060200160405180910390a261162983836130ae565b6033805467ffffffffffffffff60a01b19164263ffffffff16600160a01b021790556000603755611fb881476130ae565b50565b611fc76003602061564f565b81146120575760405162461bcd60e51b815260206004820152605360248201527f426561636f6e436861696e50726f6f66732e7665726966795374617465526f6f60448201527f74416761696e73744c6174657374426c6f636b526f6f743a2050726f6f6620686064820152720c2e640d2dcc6dee4e4cac6e840d8cadccee8d606b1b608482015260a4016106a4565b61209c82828080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152508892508791506003905061313c565b6121435760405162461bcd60e51b815260206004820152606660248201527f426561636f6e436861696e50726f6f66732e7665726966795374617465526f6f60448201527f74416761696e73744c6174657374426c6f636b526f6f743a20496e76616c696460648201527f206c617465737420626c6f636b2068656164657220726f6f74206d65726b6c6560848201526510383937b7b360d11b60a482015260c4016106a4565b50505050565b60008061218884848080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061315492505050565b6000818152603660209081526040808320815160808101835281546001600160401b038082168352600160401b8204811695830195909552600160801b8104909416928101929092529394509192906060830190600160c01b900460ff1660028111156121f7576121f7614c48565b600281111561220857612208614c48565b905250905060008160600151600281111561222557612225614c48565b146122ce5760405162461bcd60e51b815260206004820152606760248201527f456967656e506f642e766572696679436f72726563745769746864726177616c60448201527f43726564656e7469616c733a2056616c696461746f72206d757374206265206960648201527f6e61637469766520746f2070726f7665207769746864726177616c2063726564608482015266656e7469616c7360c81b60a482015260c4016106a4565b6122d66126e8565b6122df90615685565b61231b86868080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061317892505050565b146123a25760405162461bcd60e51b815260206004820152604b60248201527f456967656e506f642e766572696679436f72726563745769746864726177616c60448201527f43726564656e7469616c733a2050726f6f66206973206e6f7420666f7220746860648201526a1a5cc8115a59d95b941bd960aa1b608482015260a4016106a4565b60006123e086868080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061318d92505050565b90506123f08a87878b8b8e6131b2565b6001606083015264ffffffffff891682526001600160401b038b811660408401527f000000000000000000000000000000000000000000000000000000077359400081169082161115612471576001600160401b037f0000000000000000000000000000000000000000000000000000000773594000166020830152612481565b6001600160401b03811660208301525b6000838152603660209081526040918290208451815492860151938601516001600160401b03908116600160801b0267ffffffffffffffff60801b19958216600160401b026001600160801b0319909516919092161792909217928316821781556060850151859391929091839160ff60c01b191668ffffffffffffffffff60801b1990911617600160c01b83600281111561251f5761251f614c48565b02179055505060405164ffffffffff8b1681527f2d0800bbc377ea54a08c5db6a87aafff5e3e9c8fead0eda110e40e0c10441449915060200160405180910390a17f0e5fac175b83177cc047381e030d8fb3b42b37bd1c025e22c280facad62c32df898c84602001516040516125ba9392919064ffffffffff9390931683526001600160401b03918216602084015216604082015260600190565b60405180910390a1633b9aca0082602001516001600160401b03166125df919061564f565b9b9a5050505050505050505050565b600081516030146126775760405162461bcd60e51b815260206004820152604760248201527f456967656e506f642e5f63616c63756c61746556616c696461746f725075626b60448201527f657948617368206d75737420626520612034382d6279746520424c53207075626064820152666c6963206b657960c81b608482015260a4016106a4565b60405160029061268e9084906000906020016156a9565b60408051601f19818403018152908290526126a8916156d8565b602060405180830381855afa1580156126c5573d6000803e3d6000fd5b5050506040513d601f19601f82011682018060405250810190610c6491906152cd565b60408051600160f81b60208201526000602182015230606090811b6bffffffffffffffffffffffff1916602c8301529101604051602081830303815290604052905090565b60008061276c84848080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061318d92505050565b905060006127ac85858080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061315492505050565b6000818152603660209081526040808320815160808101835281546001600160401b038082168352600160401b8204811695830195909552600160801b8104909416928101929092529394509192906060830190600160c01b900460ff16600281111561281b5761281b614c48565b600281111561282c5761282c614c48565b8152505090508a6001600160401b031681604001516001600160401b0316106128e35760405162461bcd60e51b815260206004820152605c60248201527f456967656e506f642e76657269667942616c616e63655570646174653a20566160448201527f6c696461746f72732062616c616e63652068617320616c72656164792062656560648201527f6e207570646174656420666f7220746869732074696d657374616d7000000000608482015260a4016106a4565b6001816060015160028111156128fb576128fb614c48565b146129635760405162461bcd60e51b815260206004820152603260248201527f456967656e506f642e76657269667942616c616e63655570646174653a2056616044820152716c696461746f72206e6f742061637469766560701b60648201526084016106a4565b61296c8b613409565b6001600160401b03166129b18787808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152506134f392505050565b6001600160401b031611612a54576000836001600160401b031611612a545760405162461bcd60e51b815260206004820152604d60248201527f456967656e506f642e76657269667942616c616e63655570646174653a20766160448201527f6c696461746f7220697320776974686472617761626c6520627574206861732060648201526c3737ba103bb4ba34323930bbb760991b608482015260a4016106a4565b612a628987878b8b8f6131b2565b602081015160006001600160401b037f000000000000000000000000000000000000000000000000000000077359400081169086161115612ac457507f0000000000000000000000000000000000000000000000000000000773594000612ac7565b50835b6001600160401b0380821660208086019182528f831660408088019182526000898152603690935290912086518154935192518516600160801b0267ffffffffffffffff60801b19938616600160401b026001600160801b031990951691909516179290921790811683178255606086015186939091839160ff60c01b191668ffffffffffffffffff60801b1990911617600160c01b836002811115612b6f57612b6f614c48565b0217905550905050816001600160401b0316816001600160401b031614612bfb577f0e5fac175b83177cc047381e030d8fb3b42b37bd1c025e22c280facad62c32df8c8e83604051612be69392919064ffffffffff9390931683526001600160401b03918216602084015216604082015260600190565b60405180910390a1612bf8818361350b565b95505b5050505050979650505050505050565b611802828261352a565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052611629908490613643565b6040805180820190915260008082526020820152612c8c612c8789615759565b613715565b6033546001600160401b03600160a01b909104811690821611612cc15760405162461bcd60e51b81526004016106a490615232565b6000612ccf612c878b615759565b90506000612d0f88888080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061315492505050565b905060008082815260366020526040902054600160c01b900460ff166002811115612d3c57612d3c614c48565b1415612df35760405162461bcd60e51b815260206004820152607460248201527f456967656e506f642e5f766572696679416e6450726f6365737357697468647260448201527f6177616c3a2056616c696461746f72206e657665722070726f76656e20746f2060648201527f68617665207769746864726177616c2063726564656e7469616c7320706f696e6084820152731d1959081d1bc81d1a1a5cc818dbdb9d1c9858dd60621b60a482015260c4016106a4565b60008181526035602090815260408083206001600160401b038616845290915290205460ff1615612eb25760405162461bcd60e51b815260206004820152605b60248201527f456967656e506f642e5f766572696679416e6450726f6365737357697468647260448201527f6177616c3a207769746864726177616c2068617320616c72656164792062656560648201527f6e2070726f76656e20666f7220746869732074696d657374616d700000000000608482015260a4016106a4565b60008181526035602090815260408083206001600160401b03861684529091529020805460ff19166001179055612eeb8c87878e613725565b6000612f2987878080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061410d92505050565b9050612f398d8a8a8e8e866131b2565b6000612f7788888080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061412592505050565b9050612fb58a8a808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152506134f392505050565b6001600160401b0316612fcf612fca8f615759565b61413d565b6001600160401b03161061308757603354600084815260366020908152604091829020825160808101845281546001600160401b038082168352600160401b8204811694830194909452600160801b81049093169381019390935261307c93869388938a936001600160a01b03909316928892916060830190600160c01b900460ff16600281111561306357613063614c48565b600281111561307457613074614c48565b90525061414f565b9550505050506130a1565b60335461307c90839086906001600160a01b031684614360565b5098975050505050505050565b603354604051633036cd5360e21b81526001600160a01b03918216600482015283821660248201527f000000000000000000000000a513e6e4b8f2a923d98304ec87f64353c4d5c8539091169063c0db354c9083906044016000604051808303818588803b15801561311f57600080fd5b505af1158015613133573d6000803e3d6000fd5b50505050505050565b60008361314a86858561443e565b1495945050505050565b6000816000815181106131695761316961532c565b60200260200101519050919050565b6000816001815181106131695761316961532c565b6000610c64826002815181106131a5576131a561532c565b602002602001015161458a565b6131be60036002615979565b84146132495760405162461bcd60e51b815260206004820152604e60248201527f426561636f6e436861696e50726f6f66732e76657269667956616c696461746f60448201527f724669656c64733a2056616c696461746f72206669656c64732068617320696e60648201526d0c6dee4e4cac6e840d8cadccee8d60931b608482015260a4016106a4565b600561325760286001614a35565b6132619190614a35565b61326c90602061564f565b82146132ec5760405162461bcd60e51b815260206004820152604360248201527f426561636f6e436861696e50726f6f66732e76657269667956616c696461746f60448201527f724669656c64733a2050726f6f662068617320696e636f7272656374206c656e6064820152620cee8d60eb1b608482015260a4016106a4565b600064ffffffffff821661330260286001614a35565b600b901b17905060006133478787808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152506145f192505050565b905061338d85858080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152508c925085915086905061313c565b6133ff5760405162461bcd60e51b815260206004820152603d60248201527f426561636f6e436861696e50726f6f66732e76657269667956616c696461746f60448201527f724669656c64733a20496e76616c6964206d65726b6c652070726f6f6600000060648201526084016106a4565b5050505050505050565b60007f000000000000000000000000000000000000000000000000000000006059f4606001600160401b0316826001600160401b031610156134b35760405162461bcd60e51b815260206004820152603760248201527f456967656e506f642e5f74696d657374616d70546f45706f63683a2074696d6560448201527f7374616d70206973206265666f72652067656e6573697300000000000000000060648201526084016106a4565b6134bf600c6020615985565b6134e97f000000000000000000000000000000000000000000000000000000006059f46084615606565b610c6491906159b4565b6000610c64826007815181106131a5576131a561532c565b60006135236001600160401b038084169085166159da565b9392505050565b8047101561357a5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e636500000060448201526064016106a4565b6000826001600160a01b03168260405160006040518083038185875af1925050503d80600081146135c7576040519150601f19603f3d011682016040523d82523d6000602084013e6135cc565b606091505b50509050806116295760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d6179206861766520726576657274656400000000000060648201526084016106a4565b6000613698826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b031661489e9092919063ffffffff16565b80519091501561162957808060200190518101906136b6919061511c565b6116295760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b60648201526084016106a4565b6000610c6482610140015161458a565b613730600280615979565b82146137a45760405162461bcd60e51b81526020600482015260496024820152600080516020615a7383398151915260448201527f616c3a207769746864726177616c4669656c64732068617320696e636f7272656064820152680c6e840d8cadccee8d60bb1b608482015260a4016106a4565b6137b0600d6002615979565b6137c060c0830160a08401615a19565b6001600160401b03161061382a5760405162461bcd60e51b815260206004820152603f6024820152600080516020615a7383398151915260448201527f616c3a20626c6f636b526f6f74496e64657820697320746f6f206c617267650060648201526084016106a4565b61383660046002615979565b613847610100830160e08401615a19565b6001600160401b0316106138b3576040805162461bcd60e51b8152602060048201526024810191909152600080516020615a7383398151915260448201527f616c3a207769746864726177616c496e64657820697320746f6f206c6172676560648201526084016106a4565b6138bf60186002615979565b6138cf60e0830160c08401615a19565b6001600160401b0316106139495760405162461bcd60e51b81526020600482015260476024820152600080516020615a7383398151915260448201527f616c3a20686973746f726963616c53756d6d617279496e64657820697320746f6064820152666f206c6172676560c81b608482015260a4016106a4565b613954600480614a35565b61395f906001614a35565b61396a90602061564f565b61397482806152e6565b9050146139e85760405162461bcd60e51b81526020600482015260486024820152600080516020615a7383398151915260448201527f616c3a207769746864726177616c50726f6f662068617320696e636f727265636064820152670e840d8cadccee8d60c31b608482015260a4016106a4565b6139f460046003614a35565b6139ff90602061564f565b613a0c60408301836152e6565b905014613a865760405162461bcd60e51b815260206004820152604e6024820152600080516020615a7383398151915260448201527f616c3a20657865637574696f6e5061796c6f616450726f6f662068617320696e60648201526d0c6dee4e4cac6e840d8cadccee8d60931b608482015260a4016106a4565b613a926003602061564f565b613a9f60208301836152e6565b905014613b0d5760405162461bcd60e51b81526020600482015260426024820152600080516020615a7383398151915260448201527f616c3a20736c6f7450726f6f662068617320696e636f7272656374206c656e676064820152610e8d60f31b608482015260a4016106a4565b613b196004602061564f565b613b2660608301836152e6565b905014613b995760405162461bcd60e51b81526020600482015260476024820152600080516020615a7383398151915260448201527f616c3a2074696d657374616d7050726f6f662068617320696e636f7272656374606482015266040d8cadccee8d60cb1b608482015260a4016106a4565b600d613ba760186001614a35565b613bb2906005614a35565b613bbd906001614a35565b613bc79190614a35565b613bd290602061564f565b613bdf60808301836152e6565b905014613c685760405162461bcd60e51b81526020600482015260586024820152600080516020615a7383398151915260448201527f616c3a20686973746f726963616c53756d6d617279426c6f636b526f6f74507260648201527f6f6f662068617320696e636f7272656374206c656e6774680000000000000000608482015260a4016106a4565b6000613c7a60c0830160a08401615a19565b6001600160401b03166000613c91600d6001614a35565b613ca160e0860160c08701615a19565b6001600160401b0316901b600d613cba60186001614a35565b613cc5906001614a35565b613ccf9190614a35565b601b901b1717179050613d2a613ce860808401846152e6565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525089925050506101008501358461313c565b613d9d5760405162461bcd60e51b815260206004820152604a6024820152600080516020615a7383398151915260448201527f616c3a20496e76616c696420686973746f726963616c73756d6d617279206d656064820152693935b63290383937b7b360b11b608482015260a4016106a4565b613df4613dad60208401846152e6565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092018290525061010088013593506101208801359250905061313c565b613e545760405162461bcd60e51b815260206004820152603d6024820152600080516020615a7383398151915260448201527f616c3a20496e76616c696420736c6f74206d65726b6c652070726f6f6600000060648201526084016106a4565b6049613eac613e6660408501856152e6565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050506101008501356101608601358461313c565b613f1e5760405162461bcd60e51b81526020600482015260496024820152600080516020615a7383398151915260448201527f616c3a20496e76616c696420657865637574696f6e5061796c6f6164206d657260648201526835b63290383937b7b360b91b608482015260a4016106a4565b50613f76613f2f60608401846152e6565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250505050610160840135610140850135600961313c565b613fe45760405162461bcd60e51b815260206004820152604460248201819052600080516020615a73833981519152908201527f616c3a20496e76616c696420626c6f636b4e756d626572206d65726b6c6520706064820152633937b7b360e11b608482015260a4016106a4565b6000613ff7610100840160e08501615a19565b6001600160401b031661400c60046001614a35565b600e901b17905060006140518686808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152506145f192505050565b90506140a161406085806152e6565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250505050610160860135838561313c565b6131335760405162461bcd60e51b81526020600482015260436024820152600080516020615a7383398151915260448201527f616c3a20496e76616c6964207769746864726177616c206d65726b6c6520707260648201526237b7b360e91b608482015260a4016106a4565b6000610c64826001815181106131a5576131a561532c565b6000610c64826003815181106131a5576131a561532c565b600060206134e983610120015161458a565b604080518082019091526000808252602082015260007f00000000000000000000000000000000000000000000000000000007735940006001600160401b0316846001600160401b031611156141c657507f00000000000000000000000000000000000000000000000000000007735940006141c9565b50825b60408051808201909152600080825260208201526141e78286615606565b6001600160401b03908116825260348054849260009161420991859116615a34565b92506101000a8154816001600160401b0302191690836001600160401b0316021790555061423b82856020015161350b565b602082810191909152600090850152600260608501819052506000888152603660209081526040918290208651815492880151938801516001600160401b03908116600160801b0267ffffffffffffffff60801b19958216600160401b026001600160801b0319909516919092161792909217928316821781556060870151879391929091839160ff60c01b191668ffffffffffffffffff60801b1990911617600160c01b8360028111156142f2576142f2614c48565b0217905550506040805164ffffffffff8c1681526001600160401b038a8116602083015288168183015290516001600160a01b03891692507fb76a93bb649ece524688f1a01d184e0bbebcda58eae80c28a898bec3fb5a09639181900360600190a298975050505050505050565b60408051808201909152600080825260208201526040805164ffffffffff871681526001600160401b0380871660208301528416918101919091526001600160a01b038416907f8a7335714231dbd551aaba6314f4a97a14c201e53a3e25e1140325cdf67d7a4e9060600160405180910390a2603880548391906000906143f19084906001600160401b0316615a34565b92506101000a8154816001600160401b0302191690836001600160401b031602179055506040518060400160405280836001600160401b0316815260200160008152509050949350505050565b6000835160001415801561445d57506020845161445b91906155de565b155b6144ec5760405162461bcd60e51b815260206004820152605460248201527f4d65726b6c652e70726f63657373496e636c7573696f6e50726f6f665368613260448201527f35363a2070726f6f66206c656e6774682073686f756c642062652061206e6f6e60648201527316bd32b9379036bab63a34b836329037b310199960611b608482015260a4016106a4565b604080516020808201909252848152905b85518111614580576145106002856155de565b614543578151600052808601516020526020826040600060026107d05a03fa61453857600080fd5b60028404935061456e565b8086015160005281516020526020826040600060026107d05a03fa61456757600080fd5b6002840493505b614579602082614a35565b90506144fd565b5051949350505050565b60f881901c60e882901c61ff00161760d882901c62ff0000161760c882901c63ff000000161764ff0000000060b883901c161765ff000000000060a883901c161766ff000000000000609883901c161767ff0000000000000060889290921c919091161790565b6000806002835161460291906155f2565b90506000816001600160401b0381111561461e5761461e614e53565b604051908082528060200260200182016040528015614647578160200160208202803683370190505b50905060005b8281101561474e57600285614662838361564f565b815181106146725761467261532c565b602002602001015186836002614688919061564f565b614693906001614a35565b815181106146a3576146a361532c565b60200260200101516040516020016146c5929190918252602082015260400190565b60408051601f19818403018152908290526146df916156d8565b602060405180830381855afa1580156146fc573d6000803e3d6000fd5b5050506040513d601f19601f8201168201806040525081019061471f91906152cd565b8282815181106147315761473161532c565b602090810291909101015280614746816153b2565b91505061464d565b5061475a6002836155f2565b91505b811561487a5760005b828110156148675760028261477b838361564f565b8151811061478b5761478b61532c565b6020026020010151838360026147a1919061564f565b6147ac906001614a35565b815181106147bc576147bc61532c565b60200260200101516040516020016147de929190918252602082015260400190565b60408051601f19818403018152908290526147f8916156d8565b602060405180830381855afa158015614815573d6000803e3d6000fd5b5050506040513d601f19601f8201168201806040525081019061483891906152cd565b82828151811061484a5761484a61532c565b60209081029190910101528061485f816153b2565b915050614766565b506148736002836155f2565b915061475d565b8060008151811061488d5761488d61532c565b602002602001015192505050919050565b60606148ad84846000856148b5565b949350505050565b6060824710156149165760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b60648201526084016106a4565b6001600160a01b0385163b61496d5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016106a4565b600080866001600160a01b0316858760405161498991906156d8565b60006040518083038185875af1925050503d80600081146149c6576040519150601f19603f3d011682016040523d82523d6000602084013e6149cb565b606091505b50915091506149db8282866149e6565b979650505050505050565b606083156149f5575081613523565b825115614a055782518084602001fd5b8160405162461bcd60e51b81526004016106a49190615a5f565b634e487b7160e01b600052601160045260246000fd5b60008219821115614a4857614a48614a1f565b500190565b80356001600160401b0381168114614a6457600080fd5b919050565b60008060408385031215614a7c57600080fd5b82359150614a8c60208401614a4d565b90509250929050565b600060408284031215614aa757600080fd5b50919050565b60008083601f840112614abf57600080fd5b5081356001600160401b03811115614ad657600080fd5b6020830191508360208260051b8501011115614af157600080fd5b9250929050565b60008060008060008060008060a0898b031215614b1457600080fd5b614b1d89614a4d565b975060208901356001600160401b0380821115614b3957600080fd5b614b458c838d01614a95565b985060408b0135915080821115614b5b57600080fd5b614b678c838d01614aad565b909850965060608b0135915080821115614b8057600080fd5b614b8c8c838d01614aad565b909650945060808b0135915080821115614ba557600080fd5b50614bb28b828c01614aad565b999c989b5096995094979396929594505050565b60008083601f840112614bd857600080fd5b5081356001600160401b03811115614bef57600080fd5b602083019150836020828501011115614af157600080fd5b60008060208385031215614c1a57600080fd5b82356001600160401b03811115614c3057600080fd5b614c3c85828601614bc6565b90969095509350505050565b634e487b7160e01b600052602160045260246000fd5b60038110614c7c57634e487b7160e01b600052602160045260246000fd5b9052565b60208101610c648284614c5e565b600060208284031215614ca057600080fd5b5035919050565b60006080820190506001600160401b03808451168352806020850151166020840152806040850151166040840152506060830151614ce86060840182614c5e565b5092915050565b600080600080600060608688031215614d0757600080fd5b85356001600160401b0380821115614d1e57600080fd5b614d2a89838a01614bc6565b90975095506020880135915080821115614d4357600080fd5b50614d5088828901614bc6565b96999598509660400135949350505050565b60008060008060008060008060a0898b031215614d7e57600080fd5b614d8789614a4d565b975060208901356001600160401b0380821115614da357600080fd5b614daf8c838d01614aad565b909950975060408b0135915080821115614dc857600080fd5b614dd48c838d01614a95565b965060608b0135915080821115614b8057600080fd5b6001600160a01b0381168114611fb857600080fd5b8035614a6481614dea565b60008060408385031215614e1d57600080fd5b8235614e2881614dea565b946020939093013593505050565b600060208284031215614e4857600080fd5b813561352381614dea565b634e487b7160e01b600052604160045260246000fd5b60405161018081016001600160401b0381118282101715614e8c57614e8c614e53565b60405290565b604051601f8201601f191681016001600160401b0381118282101715614eba57614eba614e53565b604052919050565b60006001600160401b03821115614edb57614edb614e53565b5060051b60200190565b600082601f830112614ef657600080fd5b81356020614f0b614f0683614ec2565b614e92565b82815260059290921b84018101918181019086841115614f2a57600080fd5b8286015b84811015614f455780358352918301918301614f2e565b509695505050505050565b600080600060608486031215614f6557600080fd5b83356001600160401b0380821115614f7c57600080fd5b818601915086601f830112614f9057600080fd5b81356020614fa0614f0683614ec2565b82815260059290921b8401810191818101908a841115614fbf57600080fd5b948201945b83861015614fe6578535614fd781614dea565b82529482019490820190614fc4565b97505087013592505080821115614ffc57600080fd5b5061500986828701614ee5565b92505061501860408501614dff565b90509250925092565b60008060008060008060008060008060c08b8d03121561504057600080fd5b6150498b614a4d565b995060208b01356001600160401b038082111561506557600080fd5b6150718e838f01614a95565b9a5060408d013591508082111561508757600080fd5b6150938e838f01614aad565b909a50985060608d01359150808211156150ac57600080fd5b6150b88e838f01614aad565b909850965060808d01359150808211156150d157600080fd5b6150dd8e838f01614aad565b909650945060a08d01359150808211156150f657600080fd5b506151038d828e01614aad565b915080935050809150509295989b9194979a5092959850565b60006020828403121561512e57600080fd5b8151801515811461352357600080fd5b6020808252603e908201527f456967656e506f642e6f6e6c795768656e4e6f745061757365643a20696e646560408201527f782069732070617573656420696e20456967656e506f644d616e616765720000606082015260800190565b60208082526028908201527f456967656e506f642e6f6e6c79456967656e506f644f776e65723a206e6f74206040820152673837b227bbb732b960c11b606082015260800190565b6020808252602f908201527f456967656e506f642e6861734e6576657252657374616b65643a20726573746160408201526e1ada5b99c81a5cc8195b98589b1959608a1b606082015260800190565b6020808252606f908201527f456967656e506f642e70726f6f664973466f7256616c696454696d657374616d60408201527f703a20626561636f6e20636861696e2070726f6f66206d75737420626520666f60608201527f722074696d657374616d70206166746572206d6f7374526563656e745769746860808201526e064726177616c54696d657374616d7608c1b60a082015260c00190565b6000602082840312156152df57600080fd5b5051919050565b6000808335601e198436030181126152fd57600080fd5b8301803591506001600160401b0382111561531757600080fd5b602001915036819003821315614af157600080fd5b634e487b7160e01b600052603260045260246000fd5b60006020828403121561535457600080fd5b813564ffffffffff8116811461352357600080fd5b6000808335601e1984360301811261538057600080fd5b8301803591506001600160401b0382111561539a57600080fd5b6020019150600581901b3603821315614af157600080fd5b60006000198214156153c6576153c6614a1f565b5060010190565b60208082526031908201527f456967656e506f642e6f6e6c79456967656e506f644d616e616765723a206e6f6040820152703a1032b4b3b2b72837b226b0b730b3b2b960791b606082015260800190565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b60005b8381101561546257818101518382015260200161544a565b838111156121435750506000910152565b6000815180845261548b816020860160208601615447565b601f01601f19169290920160200192915050565b6080815260006154b360808301888a61541e565b82810360208401526154c58188615473565b905082810360408401526154da81868861541e565b915050826060830152979650505050505050565b6020815260006148ad60208301848661541e565b600080821280156001600160ff1b038490038513161561552457615524614a1f565b600160ff1b839003841281161561553d5761553d614a1f565b50500190565b60006001600160ff1b038184138284138082168684048611161561556957615569614a1f565b600160ff1b600087128281168783058912161561558857615588614a1f565b600087129250878205871284841616156155a4576155a4614a1f565b878505871281841616156155ba576155ba614a1f565b505050929093029392505050565b634e487b7160e01b600052601260045260246000fd5b6000826155ed576155ed6155c8565b500690565b600082615601576156016155c8565b500490565b60006001600160401b038381169083168181101561562657615626614a1f565b039392505050565b6000823561017e1983360301811261564557600080fd5b9190910192915050565b600081600019048311821515161561566957615669614a1f565b500290565b60008282101561568057615680614a1f565b500390565b80516020808301519190811015614aa75760001960209190910360031b1b16919050565b600083516156bb818460208801615447565b6001600160801b0319939093169190920190815260100192915050565b60008251615645818460208701615447565b600082601f8301126156fb57600080fd5b81356001600160401b0381111561571457615714614e53565b615727601f8201601f1916602001614e92565b81815284602083860101111561573c57600080fd5b816020850160208301376000918101602001919091529392505050565b6000610180823603121561576c57600080fd5b615774614e69565b82356001600160401b038082111561578b57600080fd5b615797368387016156ea565b835260208501359150808211156157ad57600080fd5b6157b9368387016156ea565b602084015260408501359150808211156157d257600080fd5b6157de368387016156ea565b604084015260608501359150808211156157f757600080fd5b615803368387016156ea565b6060840152608085013591508082111561581c57600080fd5b50615829368286016156ea565b60808301525061583b60a08401614a4d565b60a082015261584c60c08401614a4d565b60c082015261585d60e08401614a4d565b60e082015261010083810135908201526101208084013590820152610140808401359082015261016092830135928101929092525090565b600181815b808511156158d05781600019048211156158b6576158b6614a1f565b808516156158c357918102915b93841c939080029061589a565b509250929050565b6000826158e757506001610c64565b816158f457506000610c64565b816001811461590a576002811461591457615930565b6001915050610c64565b60ff84111561592557615925614a1f565b50506001821b610c64565b5060208310610133831016604e8410600b8410161715615953575081810a610c64565b61595d8383615895565b806000190482111561597157615971614a1f565b029392505050565b600061352383836158d8565b60006001600160401b03808316818516818304811182151516156159ab576159ab614a1f565b02949350505050565b60006001600160401b03808416806159ce576159ce6155c8565b92169190910492915050565b60008083128015600160ff1b8501841216156159f8576159f8614a1f565b6001600160ff1b0384018313811615615a1357615a13614a1f565b50500390565b600060208284031215615a2b57600080fd5b61352382614a4d565b60006001600160401b03808316818516808303821115615a5657615a56614a1f565b01949350505050565b602081526000613523602083018461547356fe426561636f6e436861696e50726f6f66732e7665726966795769746864726177a2646970667358221220a70662ddf5cc6c48da2de15b85bdb76166a7de80fea7d4fd1263864700cbbdaf64736f6c634300080c0033","storage":{"0x0":"0xff"}},"0x23618e81e3f5cdf7f54c3d65f7fbc0abf5b21e8f":{"nonce":0,"balance":"0x21e19e0c9bab2400000","code":"0x","storage":{}},"0x322813fd9a801c5507c9de605d63cea4f2ce6c44":{"nonce":1,"balance":"0x0","code":"0x608060405234801561001057600080fd5b506004361061007d5760003560e01c806340c10f191161005b57806340c10f19146100d257806370a08231146100e7578063a9059cbb14610110578063dd62ed3e1461012357600080fd5b8063095ea7b31461008257806318160ddd146100ad57806323b872dd146100bf575b600080fd5b610098610090366004610410565b600192915050565b60405190151581526020015b60405180910390f35b6002545b6040519081526020016100a4565b6100986100cd36600461043a565b61015c565b6100e56100e0366004610410565b610173565b005b6100b16100f5366004610476565b6001600160a01b031660009081526020819052604090205490565b61009861011e366004610410565b610181565b6100b1610131366004610498565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b600061016984848461018b565b5060019392505050565b61017d8282610335565b5050565b6000336101698185855b6001600160a01b0383166101f45760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b60648201526084015b60405180910390fd5b6001600160a01b0382166102565760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b60648201526084016101eb565b6001600160a01b0383166000908152602081905260409020548111156102cd5760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b60648201526084016101eb565b6001600160a01b038381166000818152602081815260408083208054879003905593861680835291849020805486019055925184815290927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3505050565b6001600160a01b03821661038b5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f20616464726573730060448201526064016101eb565b806002600082825461039d91906104cb565b90915550506001600160a01b038216600081815260208181526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b80356001600160a01b038116811461040b57600080fd5b919050565b6000806040838503121561042357600080fd5b61042c836103f4565b946020939093013593505050565b60008060006060848603121561044f57600080fd5b610458846103f4565b9250610466602085016103f4565b9150604084013590509250925092565b60006020828403121561048857600080fd5b610491826103f4565b9392505050565b600080604083850312156104ab57600080fd5b6104b4836103f4565b91506104c2602084016103f4565b90509250929050565b600082198211156104ec57634e487b7160e01b600052601160045260246000fd5b50019056fea26469706673582212203586c66b722a1b0ea3bb87e82ee7ccb8ee4d6d664e440f715cc7c1eaacbaab2864736f6c634300080c0033","storage":{}},"0x3c44cdddb6a900fa2b585dd299e03d12fa4293bc":{"nonce":0,"balance":"0x21e19e0c9bab2400000","code":"0x","storage":{}},"0x4e59b44847b379578588920ca78fbf26c0b4956c":{"nonce":0,"balance":"0x0","code":"0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe03601600081602082378035828234f58015156039578182fd5b8082525050506014600cf3","storage":{}},"0x5eb3bc0a489c5a8288765d2336659ebca68fcd00":{"nonce":1,"balance":"0x0","code":"0x608060405234801561001057600080fd5b506004361061021c5760003560e01c80636efb463611610125578063cefdc1d4116100ad578063efcf4edb1161007c578063efcf4edb1461059c578063f2fde38b146105af578063f63c5bab146105c2578063f8c8765e146105ca578063fabc1cbc146105dd57600080fd5b8063cefdc1d414610536578063da16491f14610557578063df5cf7231461056a578063ef0244581461059157600080fd5b80638cbc379a116100f45780638cbc379a146104c25780638da5cb5b146104d557806395eebee6146104e6578063a168e3c014610509578063b98d09081461052957600080fd5b80636efb46361461046a578063715018a61461048b5780637afa1eed14610493578063886f1195146104af57600080fd5b80634f19ade7116101a85780635ace2df7116101775780635ace2df7146103da5780635c975abb146103ed5780635df45946146103f5578063683048351461041c5780636d14a9871461044357600080fd5b80634f19ade7146103515780634f739f741461037f578063595c6a671461039f5780635ac86ab7146103a757600080fd5b8063245a7bfc116101ef578063245a7bfc146102b4578063292f7a4e146102df5780632e44b349146103095780633563b0d11461031e578063416c7e5e1461033e57600080fd5b806310d67a2f14610221578063136439dd14610236578063171f1d5b146102495780631ad4318914610278575b600080fd5b61023461022f366004614044565b6105f0565b005b610234610244366004614061565b6106ac565b61025c6102573660046141df565b6107eb565b6040805192151583529015156020830152015b60405180910390f35b61029f7f000000000000000000000000000000000000000000000000000000000000001e81565b60405163ffffffff909116815260200161026f565b6098546102c7906001600160a01b031681565b6040516001600160a01b03909116815260200161026f565b6102f26102ed366004614539565b610975565b60408051921515835260208301919091520161026f565b60975461029f90610100900463ffffffff1681565b61033161032c3660046145d3565b610a45565b60405161026f919061471a565b61023461034c36600461473b565b610dc0565b61037161035f366004614758565b60996020526000908152604090205481565b60405190815260200161026f565b61039261038d366004614775565b610f35565b60405161026f9190614879565b6102346115b9565b6103ca6103b5366004614943565b606654600160ff9092169190911b9081161490565b604051901515815260200161026f565b6102346103e836600461498a565b611680565b606654610371565b6102c77f00000000000000000000000084ea74d481ee0a5332c457a4d796187f6ba67feb81565b6102c77f000000000000000000000000a82ff9afd8f496c3d6ac40e2a0f282e47488cfc981565b6102c77f000000000000000000000000c3e53f4d16ae77db1c982e75a937b9f60fe6369081565b61047d610478366004614a1b565b6119aa565b60405161026f929190614adb565b610234612836565b6097546102c7906501000000000090046001600160a01b031681565b6065546102c7906001600160a01b031681565b609754610100900463ffffffff1661029f565b6033546001600160a01b03166102c7565b6103ca6104f4366004614758565b609b6020526000908152604090205460ff1681565b610371610517366004614758565b609a6020526000908152604090205481565b6097546103ca9060ff1681565b610549610544366004614b24565b61284a565b60405161026f929190614b66565b610234610565366004614b87565b6129dc565b6102c77f000000000000000000000000cf7ed3acca5a467e9e704c703e8d87f634fb0fc981565b61029f633b9aca0081565b6102346105aa366004614c12565b612cdd565b6102346105bd366004614044565b612ee0565b61029f606481565b6102346105d8366004614c89565b612f56565b6102346105eb366004614061565b6130be565b606560009054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610643573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106679190614ce5565b6001600160a01b0316336001600160a01b0316146106a05760405162461bcd60e51b815260040161069790614d02565b60405180910390fd5b6106a98161321a565b50565b60655460405163237dfb4760e11b81523360048201526001600160a01b03909116906346fbf68e90602401602060405180830381865afa1580156106f4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107189190614d4c565b6107345760405162461bcd60e51b815260040161069790614d69565b606654818116146107ad5760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e70617573653a20696e76616c696420617474656d70742060448201527f746f20756e70617573652066756e6374696f6e616c69747900000000000000006064820152608401610697565b606681905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d906020015b60405180910390a250565b60008060007f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018787600001518860200151886000015160006002811061083357610833614db1565b60200201518951600160200201518a6020015160006002811061085857610858614db1565b60200201518b6020015160016002811061087457610874614db1565b602090810291909101518c518d8301516040516108d19a99989796959401988952602089019790975260408801959095526060870193909352608086019190915260a085015260c084015260e08301526101008201526101200190565b6040516020818303038152906040528051906020012060001c6108f49190614dc7565b905061096761090d6109068884613311565b86906133a8565b61091561343c565b61095d61094e85610948604080518082018252600080825260209182015281518083019092526001825260029082015290565b90613311565b6109578c6134fc565b906133a8565b886201d4c061358c565b909890975095505050505050565b6000806000806109888a8a8a8a8a6119aa565b9150915060005b88811015610a31578563ffffffff16836020015182815181106109b4576109b4614db1565b60200260200101516109c69190614dff565b6001600160601b0316633b9aca0063ffffffff16846000015183815181106109f0576109f0614db1565b6020026020010151610a029190614dff565b6001600160601b03161015610a1f5750600093509150610a3a9050565b80610a2981614e2e565b91505061098f565b50600193509150505b965096945050505050565b60606000846001600160a01b031663683048356040518163ffffffff1660e01b8152600401602060405180830381865afa158015610a87573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610aab9190614ce5565b90506000856001600160a01b0316639e9923c26040518163ffffffff1660e01b8152600401602060405180830381865afa158015610aed573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b119190614ce5565b9050600085516001600160401b03811115610b2e57610b2e61407a565b604051908082528060200260200182016040528015610b6157816020015b6060815260200190600190039081610b4c5790505b50905060005b8651811015610db3576000878281518110610b8457610b84614db1565b0160200151604051638902624560e01b815260f89190911c6004820181905263ffffffff8916602483015291506000906001600160a01b03861690638902624590604401600060405180830381865afa158015610be5573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610c0d9190810190614e49565b905080516001600160401b03811115610c2857610c2861407a565b604051908082528060200260200182016040528015610c6d57816020015b6040805180820190915260008082526020820152815260200190600190039081610c465790505b50848481518110610c8057610c80614db1565b602002602001018190525060005b8151811015610d9d576000828281518110610cab57610cab614db1565b602090810291909101810151604080518082018252828152905163fa28c62760e01b81526004810183905260ff8816602482015263ffffffff8e166044820152919350918201906001600160a01b038b169063fa28c62790606401602060405180830381865afa158015610d23573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d479190614ed9565b6001600160601b0316815250868681518110610d6557610d65614db1565b60200260200101518381518110610d7e57610d7e614db1565b6020026020010181905250508080610d9590614e2e565b915050610c8e565b5050508080610dab90614e2e565b915050610b67565b50925050505b9392505050565b7f000000000000000000000000c3e53f4d16ae77db1c982e75a937b9f60fe636906001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610e1e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e429190614ce5565b6001600160a01b0316336001600160a01b031614610eee5760405162461bcd60e51b815260206004820152605c60248201527f424c535369676e6174757265436865636b65722e6f6e6c79436f6f7264696e6160448201527f746f724f776e65723a2063616c6c6572206973206e6f7420746865206f776e6560648201527f72206f6620746865207265676973747279436f6f7264696e61746f7200000000608482015260a401610697565b6097805460ff19168215159081179091556040519081527f40e4ed880a29e0f6ddce307457fb75cddf4feef7d3ecb0301bfdf4976a0e2dfc9060200160405180910390a150565b610f606040518060800160405280606081526020016060815260200160608152602001606081525090565b6000876001600160a01b031663683048356040518163ffffffff1660e01b8152600401602060405180830381865afa158015610fa0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fc49190614ce5565b9050610ff16040518060800160405280606081526020016060815260200160608152602001606081525090565b6040516361c8a12f60e11b81526001600160a01b038a169063c391425e90611021908b9089908990600401614f02565b600060405180830381865afa15801561103e573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526110669190810190614f4c565b81526040516340e03a8160e11b81526001600160a01b038316906381c0750290611098908b908b908b90600401615003565b600060405180830381865afa1580156110b5573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526110dd9190810190614f4c565b6040820152856001600160401b038111156110fa576110fa61407a565b60405190808252806020026020018201604052801561112d57816020015b60608152602001906001900390816111185790505b50606082015260005b60ff81168711156114ca576000856001600160401b0381111561115b5761115b61407a565b604051908082528060200260200182016040528015611184578160200160208202803683370190505b5083606001518360ff168151811061119e5761119e614db1565b602002602001018190525060005b868110156113ca5760008c6001600160a01b03166304ec63518a8a858181106111d7576111d7614db1565b905060200201358e886000015186815181106111f5576111f5614db1565b60200260200101516040518463ffffffff1660e01b81526004016112329392919092835263ffffffff918216602084015216604082015260600190565b602060405180830381865afa15801561124f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611273919061502c565b90508a8a8560ff1681811061128a5761128a614db1565b6001600160c01b03841692013560f81c9190911c6001908116141590506113b757856001600160a01b031663dd9846b98a8a858181106112cc576112cc614db1565b905060200201358d8d8860ff168181106112e8576112e8614db1565b6040516001600160e01b031960e087901b1681526004810194909452919091013560f81c60248301525063ffffffff8f166044820152606401602060405180830381865afa15801561133e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113629190615055565b85606001518560ff168151811061137b5761137b614db1565b6020026020010151848151811061139457611394614db1565b63ffffffff90921660209283029190910190910152826113b381614e2e565b9350505b50806113c281614e2e565b9150506111ac565b506000816001600160401b038111156113e5576113e561407a565b60405190808252806020026020018201604052801561140e578160200160208202803683370190505b50905060005b8281101561148f5784606001518460ff168151811061143557611435614db1565b6020026020010151818151811061144e5761144e614db1565b602002602001015182828151811061146857611468614db1565b63ffffffff909216602092830291909101909101528061148781614e2e565b915050611414565b508084606001518460ff16815181106114aa576114aa614db1565b6020026020010181905250505080806114c290615072565b915050611136565b506000896001600160a01b0316635df459466040518163ffffffff1660e01b8152600401602060405180830381865afa15801561150b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061152f9190614ce5565b60405163354952a360e21b81529091506001600160a01b0382169063d5254a8c90611562908b908b908e90600401615092565b600060405180830381865afa15801561157f573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526115a79190810190614f4c565b60208301525098975050505050505050565b60655460405163237dfb4760e11b81523360048201526001600160a01b03909116906346fbf68e90602401602060405180830381865afa158015611601573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116259190614d4c565b6116415760405162461bcd60e51b815260040161069790614d69565b600019606681905560405190815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a2565b600061168f6020850185614758565b63ffffffff81166000908152609a60205260409020549091506116e95760405162461bcd60e51b815260206004820152601260248201527115185cdac81b9bdd081c995cdc1bdb99195960721b6044820152606401610697565b6116f384846137b0565b63ffffffff82166000908152609a60205260409020541461174c5760405162461bcd60e51b815260206004820152601360248201527257726f6e67207461736b20726573706f6e736560681b6044820152606401610697565b63ffffffff81166000908152609b602052604090205460ff16156117b25760405162461bcd60e51b815260206004820152601760248201527f416c7265616479206265656e206368616c6c656e6765640000000000000000006044820152606401610697565b60646117c16020850185614758565b6117cb91906150bc565b63ffffffff164363ffffffff1611156118265760405162461bcd60e51b815260206004820152601860248201527f4368616c6c656e676520706572696f64206578706972656400000000000000006044820152606401610697565b604051339063ffffffff8316907f0c6923c4a98292e75c5d677a1634527f87b6d19cf2c7d396aece99790c44a79590600090a3506119a4565b83518110156118cb5761189c84828151811061187d5761187d614db1565b6020026020010151805160009081526020918201519091526040902090565b8282815181106118ae576118ae614db1565b6020908102919091010152806118c381614e2e565b91505061185f565b5060006118db6020880188614758565b826040516020016118ed9291906150e4565b604051602081830303815290604052805190602001209050846020013581146119585760405162461bcd60e51b815260206004820152601860248201527f57726f6e67206e6f6e2d7369676e6572207075626b65797300000000000000006044820152606401610697565b63ffffffff83166000818152609b6020526040808220805460ff19166001179055513392917fff48388ad5e2a6d1845a7672040fba7d9b14b22b9e0eecd37046e5313d3aebc291a35050505b50505050565b604080518082018252606080825260208201529082015151600090851480156119d7575060a08301515185145b80156119e7575060c08301515185145b80156119f7575060e08301515185145b611a615760405162461bcd60e51b815260206004820152604160248201526000805160206155aa83398151915260448201527f7265733a20696e7075742071756f72756d206c656e677468206d69736d6174636064820152600d60fb1b608482015260a401610697565b82515160208401515114611ad95760405162461bcd60e51b8152602060048201526044602482018190526000805160206155aa833981519152908201527f7265733a20696e707574206e6f6e7369676e6572206c656e677468206d69736d6064820152630c2e8c6d60e31b608482015260a401610697565b4363ffffffff168463ffffffff161115611b495760405162461bcd60e51b815260206004820152603c60248201526000805160206155aa83398151915260448201527f7265733a20696e76616c6964207265666572656e636520626c6f636b000000006064820152608401610697565b6040805180820182526000808252602080830191909152825180840190935260608084529083015290866001600160401b03811115611b8a57611b8a61407a565b604051908082528060200260200182016040528015611bb3578160200160208202803683370190505b506020820152866001600160401b03811115611bd157611bd161407a565b604051908082528060200260200182016040528015611bfa578160200160208202803683370190505b50815260408051808201909152606080825260208201528560200151516001600160401b03811115611c2e57611c2e61407a565b604051908082528060200260200182016040528015611c57578160200160208202803683370190505b5081526020860151516001600160401b03811115611c7757611c7761407a565b604051908082528060200260200182016040528015611ca0578160200160208202803683370190505b5081602001819052506000611d728a8a8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505060408051639aa1653d60e01b815290516001600160a01b037f000000000000000000000000c3e53f4d16ae77db1c982e75a937b9f60fe63690169350639aa1653d925060048083019260209291908290030181865afa158015611d49573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d6d919061512c565b6137e4565b905060005b876020015151811015611fee57611d9d8860200151828151811061187d5761187d614db1565b83602001518281518110611db357611db3614db1565b60209081029190910101528015611e73576020830151611dd4600183615149565b81518110611de457611de4614db1565b602002602001015160001c83602001518281518110611e0557611e05614db1565b602002602001015160001c11611e73576040805162461bcd60e51b81526020600482015260248101919091526000805160206155aa83398151915260448201527f7265733a206e6f6e5369676e65725075626b657973206e6f7420736f727465646064820152608401610697565b7f000000000000000000000000c3e53f4d16ae77db1c982e75a937b9f60fe636906001600160a01b03166304ec635184602001518381518110611eb857611eb8614db1565b60200260200101518b8b600001518581518110611ed757611ed7614db1565b60200260200101516040518463ffffffff1660e01b8152600401611f149392919092835263ffffffff918216602084015216604082015260600190565b602060405180830381865afa158015611f31573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f55919061502c565b6001600160c01b031683600001518281518110611f7457611f74614db1565b602002602001018181525050611fda610906611fae8486600001518581518110611fa057611fa0614db1565b602002602001015116613896565b8a602001518481518110611fc457611fc4614db1565b60200260200101516138c190919063ffffffff16565b945080611fe681614e2e565b915050611d77565b5050611ff9836139a5565b925060007f000000000000000000000000cf7ed3acca5a467e9e704c703e8d87f634fb0fc96001600160a01b03166350f73e7c6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561205b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061207f9190615160565b60975490915060ff1660005b8a8110156127055781156121e7578963ffffffff16837f000000000000000000000000c3e53f4d16ae77db1c982e75a937b9f60fe636906001600160a01b031663249a0c428f8f868181106120e2576120e2614db1565b60405160e085901b6001600160e01b031916815292013560f81c600483015250602401602060405180830381865afa158015612122573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121469190615160565b6121509190615179565b10156121e75760405162461bcd60e51b815260206004820152606660248201526000805160206155aa83398151915260448201527f7265733a205374616b6552656769737472792075706461746573206d7573742060648201527f62652077697468696e207769746864726177616c44656c6179426c6f636b732060848201526577696e646f7760d01b60a482015260c401610697565b7f00000000000000000000000084ea74d481ee0a5332c457a4d796187f6ba67feb6001600160a01b03166368bccaac8d8d8481811061222857612228614db1565b9050013560f81c60f81b60f81c8c8c60a00151858151811061224c5761224c614db1565b60209081029190910101516040516001600160e01b031960e086901b16815260ff909316600484015263ffffffff9182166024840152166044820152606401602060405180830381865afa1580156122a8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122cc9190615191565b6001600160401b0319166122ef8a60400151838151811061187d5761187d614db1565b67ffffffffffffffff19161461238b5760405162461bcd60e51b815260206004820152606160248201526000805160206155aa83398151915260448201527f7265733a2071756f72756d41706b206861736820696e2073746f72616765206460648201527f6f6573206e6f74206d617463682070726f76696465642071756f72756d2061706084820152606b60f81b60a482015260c401610697565b6123bb896040015182815181106123a4576123a4614db1565b6020026020010151876133a890919063ffffffff16565b95507f000000000000000000000000a82ff9afd8f496c3d6ac40e2a0f282e47488cfc96001600160a01b031663c8294c568d8d848181106123fe576123fe614db1565b9050013560f81c60f81b60f81c8c8c60c00151858151811061242257612422614db1565b60209081029190910101516040516001600160e01b031960e086901b16815260ff909316600484015263ffffffff9182166024840152166044820152606401602060405180830381865afa15801561247e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124a29190614ed9565b856020015182815181106124b8576124b8614db1565b6001600160601b039092166020928302919091018201528501518051829081106124e4576124e4614db1565b60200260200101518560000151828151811061250257612502614db1565b60200260200101906001600160601b031690816001600160601b0316815250506000805b8a60200151518110156126f05761257a8660000151828151811061254c5761254c614db1565b60200260200101518f8f8681811061256657612566614db1565b600192013560f81c9290921c811614919050565b156126de577f000000000000000000000000a82ff9afd8f496c3d6ac40e2a0f282e47488cfc96001600160a01b031663f2be94ae8f8f868181106125c0576125c0614db1565b9050013560f81c60f81b60f81c8e896020015185815181106125e4576125e4614db1565b60200260200101518f60e00151888151811061260257612602614db1565b6020026020010151878151811061261b5761261b614db1565b60209081029190910101516040516001600160e01b031960e087901b16815260ff909416600485015263ffffffff92831660248501526044840191909152166064820152608401602060405180830381865afa15801561267f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126a39190614ed9565b87518051859081106126b7576126b7614db1565b602002602001018181516126cb91906151bc565b6001600160601b03169052506001909101905b806126e881614e2e565b915050612526565b505080806126fd90614e2e565b91505061208b565b50505060008061271f8c868a606001518b608001516107eb565b91509150816127905760405162461bcd60e51b815260206004820152604360248201526000805160206155aa83398151915260448201527f7265733a2070616972696e6720707265636f6d70696c652063616c6c206661696064820152621b195960ea1b608482015260a401610697565b806127f15760405162461bcd60e51b815260206004820152603960248201526000805160206155aa83398151915260448201527f7265733a207369676e617475726520697320696e76616c6964000000000000006064820152608401610697565b5050600087826020015160405160200161280c9291906150e4565b60408051808303601f190181529190528051602090910120929b929a509198505050505050505050565b61283e613a40565b6128486000613a9a565b565b604080516001808252818301909252600091606091839160208083019080368337019050509050848160008151811061288557612885614db1565b60209081029190910101526040516361c8a12f60e11b81526000906001600160a01b0388169063c391425e906128c190889086906004016151e4565b600060405180830381865afa1580156128de573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526129069190810190614f4c565b60008151811061291857612918614db1565b60209081029190910101516040516304ec635160e01b81526004810188905263ffffffff87811660248301529091166044820181905291506000906001600160a01b038916906304ec635190606401602060405180830381865afa158015612984573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129a8919061502c565b6001600160c01b0316905060006129be82613aec565b9050816129cc8a838a610a45565b9550955050505050935093915050565b6098546001600160a01b03163314612a365760405162461bcd60e51b815260206004820152601d60248201527f41676772656761746f72206d757374206265207468652063616c6c65720000006044820152606401610697565b6000612a456020850185614758565b9050366000612a576080870187615238565b90925090506000612a6e6080880160608901614758565b905060996000612a816020890189614758565b63ffffffff1663ffffffff16815260200190815260200160002054612aa588613b49565b14612ae45760405162461bcd60e51b815260206004820152600f60248201526e0aee4dedcce40e8c2e6d640d0c2e6d608b1b6044820152606401610697565b6000609a81612af660208a018a614758565b63ffffffff1663ffffffff1681526020019081526020016000205414612b575760405162461bcd60e51b815260206004820152601660248201527515185cdac8185b1c9958591e481c995cdc1bdb99195960521b6044820152606401610697565b612b817f000000000000000000000000000000000000000000000000000000000000001e856150bc565b63ffffffff164363ffffffff161115612bd55760405162461bcd60e51b815260206004820152601660248201527514995cdc1bdb9cd9481d1a5b5948195e18d95959195960521b6044820152606401610697565b6000612be087613b79565b9050600080612bf38387878a8c89610975565b9150915081612c355760405162461bcd60e51b815260206004820152600e60248201526d145d5bdc9d5b481b9bdd081b595d60921b6044820152606401610697565b6040805180820190915263ffffffff4316815260208101829052612c6881612c62368d90038d018d61527e565b90613b8c565b609a6000612c7960208e018e614758565b63ffffffff1663ffffffff168152602001908152602001600020819055507f8016fcc5ad5dcf12fff2e128d239d9c6eb61f4041126bbac2c93fa8962627c1b8a82604051612cc8929190615307565b60405180910390a15050505050505050505050565b6097546501000000000090046001600160a01b03163314612d4a5760405162461bcd60e51b815260206004820152602160248201527f5461736b2067656e657261746f72206d757374206265207468652063616c6c656044820152603960f91b6064820152608401610697565b633b9aca0063ffffffff84161115612db65760405162461bcd60e51b815260206004820152602960248201527f51756f72756d207468726573686f6c642067726561746572207468616e2064656044820152683737b6b4b730ba37b960b91b6064820152608401610697565b60006040518060a001604052804363ffffffff168152602001876001600160401b03168152602001866001600160401b031681526020018563ffffffff16815260200184848080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050509152509050612e3c81613ba1565b6097805463ffffffff610100918290048116600090815260996020526040908190209490945591549251920416907f78aec7310ea6fd468e3d3bbd16a806fd4987515634d5b5bf4cf4f036d9c3322590612e9790849061535d565b60405180910390a2609754612eb890610100900463ffffffff1660016150bc565b609760016101000a81548163ffffffff021916908363ffffffff160217905550505050505050565b612ee8613a40565b6001600160a01b038116612f4d5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610697565b6106a981613a9a565b600054610100900460ff1615808015612f765750600054600160ff909116105b80612f905750303b158015612f90575060005460ff166001145b612ff35760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610697565b6000805460ff191660011790558015613016576000805461ff0019166101001790555b613021856000613bb4565b61302a84613a9a565b609880546001600160a01b0319166001600160a01b03858116919091179091556097805465010000000000600160c81b031916650100000000009285169290920291909117905580156130b7576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050505050565b606560009054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015613111573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906131359190614ce5565b6001600160a01b0316336001600160a01b0316146131655760405162461bcd60e51b815260040161069790614d02565b6066541981196066541916146131e35760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e756e70617573653a20696e76616c696420617474656d7060448201527f7420746f2070617573652066756e6374696f6e616c69747900000000000000006064820152608401610697565b606681905560405181815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c906020016107e0565b6001600160a01b0381166132a85760405162461bcd60e51b815260206004820152604960248201527f5061757361626c652e5f73657450617573657252656769737472793a206e657760448201527f50617573657252656769737472792063616e6e6f7420626520746865207a65726064820152686f206164647265737360b81b608482015260a401610697565b606554604080516001600160a01b03928316815291831660208301527f6e9fcd539896fca60e8b0f01dd580233e48a6b0f7df013b89ba7f565869acdb6910160405180910390a1606580546001600160a01b0319166001600160a01b0392909216919091179055565b604080518082019091526000808252602082015261332d613f55565b835181526020808501519082015260408082018490526000908360608460076107d05a03fa905080801561336057613362565bfe5b50806133a05760405162461bcd60e51b815260206004820152600d60248201526c1958cb5b5d5b0b59985a5b1959609a1b6044820152606401610697565b505092915050565b60408051808201909152600080825260208201526133c4613f73565b835181526020808501518183015283516040808401919091529084015160608301526000908360808460066107d05a03fa90508080156133605750806133a05760405162461bcd60e51b815260206004820152600d60248201526c1958cb5859190b59985a5b1959609a1b6044820152606401610697565b613444613f91565b50604080516080810182527f198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c28183019081527f1800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed6060830152815281518083019092527f275dc4a288d1afb3cbb1ac09187524c7db36395df7be3b99e673b13a075a65ec82527f1d9befcd05a5323e6da4d435f3b617cdb3af83285c2df711ef39c01571827f9d60208381019190915281019190915290565b60408051808201909152600080825260208201526000808061352c60008051602061558a83398151915286614dc7565b90505b61353881613c9e565b909350915060008051602061558a833981519152828309831415613572576040805180820190915290815260208101919091529392505050565b60008051602061558a83398151915260018208905061352f565b6040805180820182528681526020808201869052825180840190935286835282018490526000918291906135be613fb6565b60005b60028110156137835760006135d78260066153da565b90508482600281106135eb576135eb614db1565b602002015151836135fd836000615179565b600c811061360d5761360d614db1565b602002015284826002811061362457613624614db1565b6020020151602001518382600161363b9190615179565b600c811061364b5761364b614db1565b602002015283826002811061366257613662614db1565b6020020151515183613675836002615179565b600c811061368557613685614db1565b602002015283826002811061369c5761369c614db1565b60200201515160016020020151836136b5836003615179565b600c81106136c5576136c5614db1565b60200201528382600281106136dc576136dc614db1565b6020020151602001516000600281106136f7576136f7614db1565b602002015183613708836004615179565b600c811061371857613718614db1565b602002015283826002811061372f5761372f614db1565b60200201516020015160016002811061374a5761374a614db1565b60200201518361375b836005615179565b600c811061376b5761376b614db1565b6020020152508061377b81614e2e565b9150506135c1565b5061378c613fd5565b60006020826101808560088cfa9151919c9115159b50909950505050505050505050565b600082826040516020016137c59291906153f9565b6040516020818303038152906040528051906020012090505b92915050565b6000806137f084613d20565b90508015610db9578260ff16846001865161380b9190615149565b8151811061381b5761381b614db1565b016020015160f81c10610db95760405162461bcd60e51b815260206004820152603f60248201527f4269746d61705574696c732e6f72646572656442797465734172726179546f4260448201527f69746d61703a206269746d61702065786365656473206d61782076616c7565006064820152608401610697565b6000805b82156137de576138ab600184615149565b90921691806138b98161542f565b91505061389a565b60408051808201909152600080825260208201526102008261ffff161061391d5760405162461bcd60e51b815260206004820152601060248201526f7363616c61722d746f6f2d6c6172676560801b6044820152606401610697565b8161ffff16600114156139315750816137de565b6040805180820190915260008082526020820181905284906001905b8161ffff168661ffff161061399a57600161ffff871660ff83161c8116141561397d5761397a84846133a8565b93505b61398783846133a8565b92506201fffe600192831b16910161394d565b509195945050505050565b604080518082019091526000808252602082015281511580156139ca57506020820151155b156139e8575050604080518082019091526000808252602082015290565b60405180604001604052808360000151815260200160008051602061558a8339815191528460200151613a1b9190614dc7565b613a339060008051602061558a833981519152615149565b905292915050565b919050565b6033546001600160a01b031633146128485760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610697565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60606000805b610100811015613b42576001811b915083821615613b3257828160f81b604051602001613b20929190615451565b60405160208183030381529060405292505b613b3b81614e2e565b9050613af2565b5050919050565b600081604051602001613b5c9190615480565b604051602081830303815290604052805190602001209050919050565b600081604051602001613b5c919061553c565b600082826040516020016137c592919061554a565b600081604051602001613b5c919061535d565b6065546001600160a01b0316158015613bd557506001600160a01b03821615155b613c575760405162461bcd60e51b815260206004820152604760248201527f5061757361626c652e5f696e697469616c697a655061757365723a205f696e6960448201527f7469616c697a6550617573657228292063616e206f6e6c792062652063616c6c6064820152666564206f6e636560c81b608482015260a401610697565b606681905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a2613c9a8261321a565b5050565b6000808060008051602061558a833981519152600360008051602061558a8339815191528660008051602061558a833981519152888909090890506000613d14827f0c19139cb84c680a6e14116da060561765e05aa45a1c72a34f082305b61f3f5260008051602061558a833981519152613ead565b91959194509092505050565b600061010082511115613da95760405162461bcd60e51b8152602060048201526044602482018190527f4269746d61705574696c732e6f72646572656442797465734172726179546f42908201527f69746d61703a206f7264657265644279746573417272617920697320746f6f206064820152636c6f6e6760e01b608482015260a401610697565b8151613db757506000919050565b60008083600081518110613dcd57613dcd614db1565b0160200151600160f89190911c81901b92505b8451811015613ea457848181518110613dfb57613dfb614db1565b0160200151600160f89190911c1b9150828211613e905760405162461bcd60e51b815260206004820152604760248201527f4269746d61705574696c732e6f72646572656442797465734172726179546f4260448201527f69746d61703a206f72646572656442797465734172726179206973206e6f74206064820152661bdc99195c995960ca1b608482015260a401610697565b91811791613e9d81614e2e565b9050613de0565b50909392505050565b600080613eb8613fd5565b613ec0613ff3565b602080825281810181905260408201819052606082018890526080820187905260a082018690528260c08360056107d05a03fa9250828015613360575082613f4a5760405162461bcd60e51b815260206004820152601a60248201527f424e3235342e6578704d6f643a2063616c6c206661696c7572650000000000006044820152606401610697565b505195945050505050565b60405180606001604052806003906020820280368337509192915050565b60405180608001604052806004906020820280368337509192915050565b6040518060400160405280613fa4614011565b8152602001613fb1614011565b905290565b604051806101800160405280600c906020820280368337509192915050565b60405180602001604052806001906020820280368337509192915050565b6040518060c001604052806006906020820280368337509192915050565b60405180604001604052806002906020820280368337509192915050565b6001600160a01b03811681146106a957600080fd5b60006020828403121561405657600080fd5b8135610db98161402f565b60006020828403121561407357600080fd5b5035919050565b634e487b7160e01b600052604160045260246000fd5b604080519081016001600160401b03811182821017156140b2576140b261407a565b60405290565b60405161010081016001600160401b03811182821017156140b2576140b261407a565b604051601f8201601f191681016001600160401b03811182821017156141035761410361407a565b604052919050565b60006040828403121561411d57600080fd5b614125614090565b9050813581526020820135602082015292915050565b600082601f83011261414c57600080fd5b604051604081018181106001600160401b038211171561416e5761416e61407a565b806040525080604084018581111561418557600080fd5b845b8181101561399a578035835260209283019201614187565b6000608082840312156141b157600080fd5b6141b9614090565b90506141c5838361413b565b81526141d4836040840161413b565b602082015292915050565b60008060008061012085870312156141f657600080fd5b84359350614207866020870161410b565b9250614216866060870161419f565b91506142258660e0870161410b565b905092959194509250565b60008083601f84011261424257600080fd5b5081356001600160401b0381111561425957600080fd5b60208301915083602082850101111561427157600080fd5b9250929050565b63ffffffff811681146106a957600080fd5b8035613a3b81614278565b60006001600160401b038211156142ae576142ae61407a565b5060051b60200190565b600082601f8301126142c957600080fd5b813560206142de6142d983614295565b6140db565b82815260059290921b840181019181810190868411156142fd57600080fd5b8286015b8481101561432157803561431481614278565b8352918301918301614301565b509695505050505050565b600082601f83011261433d57600080fd5b8135602061434d6142d983614295565b82815260069290921b8401810191818101908684111561436c57600080fd5b8286015b8481101561432157614382888261410b565b835291830191604001614370565b600082601f8301126143a157600080fd5b813560206143b16142d983614295565b82815260059290921b840181019181810190868411156143d057600080fd5b8286015b848110156143215780356001600160401b038111156143f35760008081fd5b6144018986838b01016142b8565b8452509183019183016143d4565b6000610180828403121561442257600080fd5b61442a6140b8565b905081356001600160401b038082111561444357600080fd5b61444f858386016142b8565b8352602084013591508082111561446557600080fd5b6144718583860161432c565b6020840152604084013591508082111561448a57600080fd5b6144968583860161432c565b60408401526144a8856060860161419f565b60608401526144ba8560e0860161410b565b60808401526101208401359150808211156144d457600080fd5b6144e0858386016142b8565b60a08401526101408401359150808211156144fa57600080fd5b614506858386016142b8565b60c084015261016084013591508082111561452057600080fd5b5061452d84828501614390565b60e08301525092915050565b60008060008060008060a0878903121561455257600080fd5b8635955060208701356001600160401b038082111561457057600080fd5b61457c8a838b01614230565b90975095506040890135915061459182614278565b909350606088013590808211156145a757600080fd5b506145b489828a0161440f565b92505060808701356145c581614278565b809150509295509295509295565b6000806000606084860312156145e857600080fd5b83356145f38161402f565b92506020848101356001600160401b038082111561461057600080fd5b818701915087601f83011261462457600080fd5b8135818111156146365761463661407a565b614648601f8201601f191685016140db565b9150808252888482850101111561465e57600080fd5b80848401858401376000848284010152508094505050506146816040850161428a565b90509250925092565b600081518084526020808501808196508360051b810191508286016000805b8681101561470c578385038a52825180518087529087019087870190845b818110156146f7578351805184528a01516001600160601b03168a840152928901926040909201916001016146c7565b50509a87019a955050918501916001016146a9565b509298975050505050505050565b602081526000610db9602083018461468a565b80151581146106a957600080fd5b60006020828403121561474d57600080fd5b8135610db98161472d565b60006020828403121561476a57600080fd5b8135610db981614278565b6000806000806000806080878903121561478e57600080fd5b86356147998161402f565b955060208701356147a981614278565b945060408701356001600160401b03808211156147c557600080fd5b6147d18a838b01614230565b909650945060608901359150808211156147ea57600080fd5b818901915089601f8301126147fe57600080fd5b81358181111561480d57600080fd5b8a60208260051b850101111561482257600080fd5b6020830194508093505050509295509295509295565b600081518084526020808501945080840160005b8381101561486e57815163ffffffff168752958201959082019060010161484c565b509495945050505050565b60006020808352835160808285015261489560a0850182614838565b905081850151601f19808684030160408701526148b28383614838565b925060408701519150808684030160608701526148cf8383614838565b60608801518782038301608089015280518083529194508501925084840190600581901b8501860160005b828110156149265784878303018452614914828751614838565b958801959388019391506001016148fa565b509998505050505050505050565b60ff811681146106a957600080fd5b60006020828403121561495557600080fd5b8135610db981614934565b600060a0828403121561497257600080fd5b50919050565b60006060828403121561497257600080fd5b60008060008084860360e08112156149a157600080fd5b85356001600160401b03808211156149b857600080fd5b6149c489838a01614960565b96506149d38960208a01614978565b95506040607f19840112156149e757600080fd5b60808801945060c0880135925080831115614a0157600080fd5b5050614a0f8782880161432c565b91505092959194509250565b600080600080600060808688031215614a3357600080fd5b8535945060208601356001600160401b0380821115614a5157600080fd5b614a5d89838a01614230565b909650945060408801359150614a7282614278565b90925060608701359080821115614a8857600080fd5b50614a958882890161440f565b9150509295509295909350565b600081518084526020808501945080840160005b8381101561486e5781516001600160601b031687529582019590820190600101614ab6565b6040815260008351604080840152614af66080840182614aa2565b90506020850151603f19848303016060850152614b138282614aa2565b925050508260208301529392505050565b600080600060608486031215614b3957600080fd5b8335614b448161402f565b9250602084013591506040840135614b5b81614278565b809150509250925092565b828152604060208201526000614b7f604083018461468a565b949350505050565b600080600060a08486031215614b9c57600080fd5b83356001600160401b0380821115614bb357600080fd5b614bbf87838801614960565b9450614bce8760208801614978565b93506080860135915080821115614be457600080fd5b50614bf18682870161440f565b9150509250925092565b80356001600160401b0381168114613a3b57600080fd5b600080600080600060808688031215614c2a57600080fd5b614c3386614bfb565b9450614c4160208701614bfb565b93506040860135614c5181614278565b925060608601356001600160401b03811115614c6c57600080fd5b614c7888828901614230565b969995985093965092949392505050565b60008060008060808587031215614c9f57600080fd5b8435614caa8161402f565b93506020850135614cba8161402f565b92506040850135614cca8161402f565b91506060850135614cda8161402f565b939692955090935050565b600060208284031215614cf757600080fd5b8151610db98161402f565b6020808252602a908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526939903ab73830bab9b2b960b11b606082015260800190565b600060208284031215614d5e57600080fd5b8151610db98161472d565b60208082526028908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526739903830bab9b2b960c11b606082015260800190565b634e487b7160e01b600052603260045260246000fd5b600082614de457634e487b7160e01b600052601260045260246000fd5b500690565b634e487b7160e01b600052601160045260246000fd5b60006001600160601b0380831681851681830481118215151615614e2557614e25614de9565b02949350505050565b6000600019821415614e4257614e42614de9565b5060010190565b60006020808385031215614e5c57600080fd5b82516001600160401b03811115614e7257600080fd5b8301601f81018513614e8357600080fd5b8051614e916142d982614295565b81815260059190911b82018301908381019087831115614eb057600080fd5b928401925b82841015614ece57835182529284019290840190614eb5565b979650505050505050565b600060208284031215614eeb57600080fd5b81516001600160601b0381168114610db957600080fd5b63ffffffff84168152604060208201819052810182905260006001600160fb1b03831115614f2f57600080fd5b8260051b8085606085013760009201606001918252509392505050565b60006020808385031215614f5f57600080fd5b82516001600160401b03811115614f7557600080fd5b8301601f81018513614f8657600080fd5b8051614f946142d982614295565b81815260059190911b82018301908381019087831115614fb357600080fd5b928401925b82841015614ece578351614fcb81614278565b82529284019290840190614fb8565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b63ffffffff84168152604060208201526000615023604083018486614fda565b95945050505050565b60006020828403121561503e57600080fd5b81516001600160c01b0381168114610db957600080fd5b60006020828403121561506757600080fd5b8151610db981614278565b600060ff821660ff81141561508957615089614de9565b60010192915050565b6040815260006150a6604083018587614fda565b905063ffffffff83166020830152949350505050565b600063ffffffff8083168185168083038211156150db576150db614de9565b01949350505050565b63ffffffff60e01b8360e01b1681526000600482018351602080860160005b8381101561511f57815185529382019390820190600101615103565b5092979650505050505050565b60006020828403121561513e57600080fd5b8151610db981614934565b60008282101561515b5761515b614de9565b500390565b60006020828403121561517257600080fd5b5051919050565b6000821982111561518c5761518c614de9565b500190565b6000602082840312156151a357600080fd5b815167ffffffffffffffff1981168114610db957600080fd5b60006001600160601b03838116908316818110156151dc576151dc614de9565b039392505050565b60006040820163ffffffff851683526020604081850152818551808452606086019150828701935060005b8181101561522b5784518352938301939183019160010161520f565b5090979650505050505050565b6000808335601e1984360301811261524f57600080fd5b8301803591506001600160401b0382111561526957600080fd5b60200191503681900382131561427157600080fd5b60006060828403121561529057600080fd5b604051606081018181106001600160401b03821117156152b2576152b261407a565b60405282356152c081614278565b8152602083810135908201526040928301359281019290925250919050565b80356152ea81614278565b63ffffffff16825260208181013590830152604090810135910152565b60a0810161531582856152df565b825163ffffffff16606083015260208301516080830152610db9565b60005b8381101561534c578181015183820152602001615334565b838111156119a45750506000910152565b60208152600063ffffffff80845116602084015260208401516001600160401b038082166040860152806040870151166060860152505080606085015116608084015250608083015160a08084015280518060c08501526153c58160e0860160208501615331565b601f01601f19169290920160e0019392505050565b60008160001904831182151516156153f4576153f4614de9565b500290565b60a0810161540782856152df565b823561541281614278565b63ffffffff16606083015260209290920135608090910152919050565b600061ffff8083168181141561544757615447614de9565b6001019392505050565b60008351615463818460208801615331565b6001600160f81b0319939093169190920190815260010192915050565b602081526000823561549181614278565b63ffffffff80821660208501526154aa60208601614bfb565b91506001600160401b038083166040860152806154c960408801614bfb565b166060860152606086013592506154df83614278565b818316608086015260808601359250601e1986360301831261550057600080fd5b91850191823591508082111561551557600080fd5b5080360385131561552557600080fd5b60a08085015261502360c085018260208501614fda565b606081016137de82846152df565b825163ffffffff168152602080840151908201526040808401519082015260a08101610db96060830184805163ffffffff16825260209081015191015256fe30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47424c535369676e6174757265436865636b65722e636865636b5369676e617475a26469706673582212205494e9c32e9fdb58fcee2e1fed471942f99c183e1ad475405ea3e18bbcf2cb6164736f6c634300080c0033","storage":{"0x97":"0x1"}},"0x5fbdb2315678afecb367f032d93f642f64180aa3":{"nonce":1,"balance":"0x0","code":"0x60806040526004361061007b5760003560e01c80639623609d1161004e5780639623609d1461011157806399a88ec414610124578063f2fde38b14610144578063f3b7dead1461016457600080fd5b8063204e1c7a14610080578063715018a6146100bc5780637eff275e146100d35780638da5cb5b146100f3575b600080fd5b34801561008c57600080fd5b506100a061009b366004610499565b610184565b6040516001600160a01b03909116815260200160405180910390f35b3480156100c857600080fd5b506100d1610215565b005b3480156100df57600080fd5b506100d16100ee3660046104bd565b610229565b3480156100ff57600080fd5b506000546001600160a01b03166100a0565b6100d161011f36600461050c565b610291565b34801561013057600080fd5b506100d161013f3660046104bd565b610300565b34801561015057600080fd5b506100d161015f366004610499565b610336565b34801561017057600080fd5b506100a061017f366004610499565b6103b4565b6000806000836001600160a01b03166040516101aa90635c60da1b60e01b815260040190565b600060405180830381855afa9150503d80600081146101e5576040519150601f19603f3d011682016040523d82523d6000602084013e6101ea565b606091505b5091509150816101f957600080fd5b8080602001905181019061020d91906105e2565b949350505050565b61021d6103da565b6102276000610434565b565b6102316103da565b6040516308f2839760e41b81526001600160a01b038281166004830152831690638f283970906024015b600060405180830381600087803b15801561027557600080fd5b505af1158015610289573d6000803e3d6000fd5b505050505050565b6102996103da565b60405163278f794360e11b81526001600160a01b03841690634f1ef2869034906102c990869086906004016105ff565b6000604051808303818588803b1580156102e257600080fd5b505af11580156102f6573d6000803e3d6000fd5b5050505050505050565b6103086103da565b604051631b2ce7f360e11b81526001600160a01b038281166004830152831690633659cfe69060240161025b565b61033e6103da565b6001600160a01b0381166103a85760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084015b60405180910390fd5b6103b181610434565b50565b6000806000836001600160a01b03166040516101aa906303e1469160e61b815260040190565b6000546001600160a01b031633146102275760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161039f565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b03811681146103b157600080fd5b6000602082840312156104ab57600080fd5b81356104b681610484565b9392505050565b600080604083850312156104d057600080fd5b82356104db81610484565b915060208301356104eb81610484565b809150509250929050565b634e487b7160e01b600052604160045260246000fd5b60008060006060848603121561052157600080fd5b833561052c81610484565b9250602084013561053c81610484565b9150604084013567ffffffffffffffff8082111561055957600080fd5b818601915086601f83011261056d57600080fd5b81358181111561057f5761057f6104f6565b604051601f8201601f19908116603f011681019083821181831017156105a7576105a76104f6565b816040528281528960208487010111156105c057600080fd5b8260208601602083013760006020848301015280955050505050509250925092565b6000602082840312156105f457600080fd5b81516104b681610484565b60018060a01b038316815260006020604081840152835180604085015260005b8181101561063b5785810183015185820160600152820161061f565b8181111561064d576000606083870101525b50601f01601f19169290920160600194935050505056fea26469706673582212200fdbd2e25973eab45d03ab46d4fda931522c5b45bccd7b63ecf3c38942f8913564736f6c634300080c0033","storage":{"0x0":"0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266"}},"0x5fc8d32690cc91d4c39d9d3abcbd16989f875707":{"nonce":1,"balance":"0x0","code":"0x60806040526004361061004e5760003560e01c80633659cfe6146100655780634f1ef286146100855780635c60da1b146100985780638f283970146100c9578063f851a440146100e95761005d565b3661005d5761005b6100fe565b005b61005b6100fe565b34801561007157600080fd5b5061005b6100803660046106f1565b610118565b61005b61009336600461070c565b61015f565b3480156100a457600080fd5b506100ad6101d0565b6040516001600160a01b03909116815260200160405180910390f35b3480156100d557600080fd5b5061005b6100e43660046106f1565b61020b565b3480156100f557600080fd5b506100ad610235565b61010661029b565b61011661011161033a565b610344565b565b610120610368565b6001600160a01b0316336001600160a01b03161415610157576101548160405180602001604052806000815250600061039b565b50565b6101546100fe565b610167610368565b6001600160a01b0316336001600160a01b031614156101c8576101c38383838080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506001925061039b915050565b505050565b6101c36100fe565b60006101da610368565b6001600160a01b0316336001600160a01b03161415610200576101fb61033a565b905090565b6102086100fe565b90565b610213610368565b6001600160a01b0316336001600160a01b0316141561015757610154816103c6565b600061023f610368565b6001600160a01b0316336001600160a01b03161415610200576101fb610368565b6060610285838360405180606001604052806027815260200161080b6027913961041a565b9392505050565b6001600160a01b03163b151590565b6102a3610368565b6001600160a01b0316336001600160a01b031614156101165760405162461bcd60e51b815260206004820152604260248201527f5472616e73706172656e745570677261646561626c6550726f78793a2061646d60448201527f696e2063616e6e6f742066616c6c6261636b20746f2070726f78792074617267606482015261195d60f21b608482015260a4015b60405180910390fd5b60006101fb6104f7565b3660008037600080366000845af43d6000803e808015610363573d6000f35b3d6000fd5b60007fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b546001600160a01b0316919050565b6103a48361051f565b6000825111806103b15750805b156101c3576103c08383610260565b50505050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f6103ef610368565b604080516001600160a01b03928316815291841660208301520160405180910390a16101548161055f565b60606001600160a01b0384163b6104825760405162461bcd60e51b815260206004820152602660248201527f416464726573733a2064656c65676174652063616c6c20746f206e6f6e2d636f6044820152651b9d1c9858dd60d21b6064820152608401610331565b600080856001600160a01b03168560405161049d91906107bb565b600060405180830381855af49150503d80600081146104d8576040519150601f19603f3d011682016040523d82523d6000602084013e6104dd565b606091505b50915091506104ed828286610608565b9695505050505050565b60007f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc61038c565b61052881610641565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b6001600160a01b0381166105c45760405162461bcd60e51b815260206004820152602660248201527f455243313936373a206e65772061646d696e20697320746865207a65726f206160448201526564647265737360d01b6064820152608401610331565b807fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b80546001600160a01b0319166001600160a01b039290921691909117905550565b60608315610617575081610285565b8251156106275782518084602001fd5b8160405162461bcd60e51b815260040161033191906107d7565b6001600160a01b0381163b6106ae5760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b6064820152608401610331565b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc6105e7565b80356001600160a01b03811681146106ec57600080fd5b919050565b60006020828403121561070357600080fd5b610285826106d5565b60008060006040848603121561072157600080fd5b61072a846106d5565b9250602084013567ffffffffffffffff8082111561074757600080fd5b818601915086601f83011261075b57600080fd5b81358181111561076a57600080fd5b87602082850101111561077c57600080fd5b6020830194508093505050509250925092565b60005b838110156107aa578181015183820152602001610792565b838111156103c05750506000910152565b600082516107cd81846020870161078f565b9190910192915050565b60208152600082518060208401526107f681604085016020870161078f565b601f01601f1916919091016040019291505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a2646970667358221220bceca38d0e447b38e612e8ea5bb02b1e1fcac6609b19aa0fd3fd43aa4b97bf1b64736f6c634300080c0033","storage":{"0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc":"0xa51c1fc2f0d1a1b8494ed1fe312d7c3a78ed91c0","0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103":"0x5fbdb2315678afecb367f032d93f642f64180aa3"}},"0x610178da211fef7d417bc0e6fed39f05609ad788":{"nonce":1,"balance":"0x0","code":"0x608060405234801561001057600080fd5b506004361061038e5760003560e01c806365da1264116101de578063b13442711161010f578063d79aceab116100ad578063f16172b01161007c578063f16172b0146109f5578063f2fde38b14610a08578063f698da2514610a1b578063fabc1cbc14610a2357600080fd5b8063d79aceab14610995578063da8be864146109bc578063eb990c59146109cf578063eea9064b146109e257600080fd5b8063c5e480db116100e9578063c5e480db146108b2578063c94b511114610958578063ca661c041461096b578063cf80873e1461097457600080fd5b8063b13442711461083a578063b7f06ebe14610861578063bb45fef21461088457600080fd5b80639104c3191161017c578063a1060c8811610156578063a1060c88146107e1578063a1788484146107f4578063a364f4da14610814578063a98fb3551461082757600080fd5b80639104c319146107a05780639926ee7d146107bb57806399be81c8146107ce57600080fd5b8063778e55f3116101b8578063778e55f31461073e5780637f54807114610769578063886f11951461077c5780638da5cb5b1461078f57600080fd5b806365da1264146106fa5780636d70f7ae14610723578063715018a61461073657600080fd5b806339b70e38116102c357806350f73e7c116102615780635c975abb116102305780635c975abb146106a05780635cfe8d2c146106a85780635f966f14146106bb57806360d7faed146106e757600080fd5b806350f73e7c14610659578063595c6a6714610662578063597b36da1461066a5780635ac86ab71461067d57600080fd5b8063433773821161029d57806343377382146105c65780634665bcda146105ed57806349075da3146106145780634fc40b611461064f57600080fd5b806339b70e38146105455780633cdeb5e0146105845780633e28391d146105b357600080fd5b8063169283651161033057806328a573ae1161030a57806328a573ae146104c157806329c77d4f146104d457806333404396146104f4578063374823b51461050757600080fd5b8063169283651461044e5780631bbce0911461048757806320606b701461049a57600080fd5b80630f589e591161036c5780630f589e591461040057806310d67a2f14610415578063132d496714610428578063136439dd1461043b57600080fd5b806304a4f979146103935780630b9f487a146103cd5780630dd8dd02146103e0575b600080fd5b6103ba7f3b89fca151cbe5122d58acee86cf184413d751d585779bdd19d3bbfa3a306dce81565b6040519081526020015b60405180910390f35b6103ba6103db36600461496f565b610a36565b6103f36103ee366004614a0e565b610af8565b6040516103c49190614a4f565b61041361040e366004614aec565b610e72565b005b610413610423366004614b3f565b610fc2565b610413610436366004614b63565b611075565b610413610449366004614ba4565b61112c565b6103ba61045c366004614b3f565b6001600160a01b0316600090815260996020526040902060010154600160a01b900463ffffffff1690565b6103ba610495366004614b63565b61126b565b6103ba7f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a86681565b6104136104cf366004614b63565b611299565b6103ba6104e2366004614b3f565b609b6020526000908152604090205481565b610413610502366004614bbd565b611349565b610535610515366004614c80565b60a260209081526000928352604080842090915290825290205460ff1681565b60405190151581526020016103c4565b61056c7f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c981565b6040516001600160a01b0390911681526020016103c4565b61056c610592366004614b3f565b6001600160a01b039081166000908152609960205260409020600101541690565b6105356105c1366004614b3f565b611486565b6103ba7f39111bc4a4d688e1f685123d7497d4615370152a8ee4a0593e647bd06ad8bb0b81565b61056c7f0000000000000000000000000165878a594ca255338adfa4d48449f69242eb8f81565b610642610622366004614cac565b60a160209081526000928352604080842090915290825290205460ff1681565b6040516103c49190614cfb565b6103ba6213c68081565b6103ba609d5481565b6104136114a6565b6103ba610678366004614fa0565b61156d565b61053561068b366004614fdc565b606654600160ff9092169190911b9081161490565b6066546103ba565b6104136106b6366004615052565b61159d565b61056c6106c9366004614b3f565b6001600160a01b039081166000908152609960205260409020541690565b6104136106f53660046151b2565b611848565b61056c610708366004614b3f565b609a602052600090815260409020546001600160a01b031681565b610535610731366004614b3f565b6118e3565b610413611903565b6103ba61074c366004614cac565b609860209081526000928352604080842090915290825290205481565b610413610777366004615301565b611917565b60655461056c906001600160a01b031681565b6033546001600160a01b031661056c565b61056c73beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac081565b6104136107c9366004615391565b611a1c565b6104136107dc36600461543c565b611d28565b6103ba6107ef366004615471565b611dfa565b6103ba610802366004614b3f565b609f6020526000908152604090205481565b610413610822366004614b3f565b611eba565b61041361083536600461543c565b612005565b61056c7f0000000000000000000000005fc8d32690cc91d4c39d9d3abcbd16989f87570781565b61053561086f366004614ba4565b609e6020526000908152604090205460ff1681565b610535610892366004614c80565b609c60209081526000928352604080842090915290825290205460ff1681565b6109226108c0366004614b3f565b6040805160608082018352600080835260208084018290529284018190526001600160a01b03948516815260998352839020835191820184528054851682526001015493841691810191909152600160a01b90920463ffffffff169082015290565b6040805182516001600160a01b039081168252602080850151909116908201529181015163ffffffff16908201526060016103c4565b6103ba6109663660046154b7565b612040565b6103ba61c4e081565b610987610982366004614b3f565b61209f565b6040516103c4929190615573565b6103ba7ff48bd254e30ce2953d187fdb4ef0cfdddb782ab1da55beebaef67c1f258d256e81565b6103f36109ca366004614b3f565b612457565b6104136109dd366004615471565b61291b565b6104136109f0366004615598565b612a4f565b610413610a033660046155f0565b612a5b565b610413610a16366004614b3f565b612aec565b6103ba612b62565b610413610a31366004614ba4565b612ba0565b604080517f3b89fca151cbe5122d58acee86cf184413d751d585779bdd19d3bbfa3a306dce6020808301919091526001600160a01b038681168385015288811660608401528716608083015260a0820185905260c08083018590528351808403909101815260e0909201909252805191012060009081610ab4612b62565b60405161190160f01b602082015260228101919091526042810183905260620160408051808303601f19018152919052805160209091012098975050505050505050565b60665460609060019060029081161415610b2d5760405162461bcd60e51b8152600401610b249061560c565b60405180910390fd5b6000836001600160401b03811115610b4757610b47614d23565b604051908082528060200260200182016040528015610b70578160200160208202803683370190505b50905060005b84811015610e6957858582818110610b9057610b90615643565b9050602002810190610ba29190615659565b610bb0906020810190615679565b9050868683818110610bc457610bc4615643565b9050602002810190610bd69190615659565b610be09080615679565b905014610c555760405162461bcd60e51b815260206004820152603860248201527f44656c65676174696f6e4d616e616765722e717565756557697468647261776160448201527f6c3a20696e707574206c656e677468206d69736d6174636800000000000000006064820152608401610b24565b6000868683818110610c6957610c69615643565b9050602002810190610c7b9190615659565b610c8c906060810190604001614b3f565b6001600160a01b03161415610d1a5760405162461bcd60e51b815260206004820152604860248201527f44656c65676174696f6e4d616e616765722e717565756557697468647261776160448201527f6c3a206d7573742070726f766964652076616c6964207769746864726177616c606482015267206164647265737360c01b608482015260a401610b24565b336000818152609a60205260409020546001600160a01b031690610e399082898986818110610d4b57610d4b615643565b9050602002810190610d5d9190615659565b610d6e906060810190604001614b3f565b8a8a87818110610d8057610d80615643565b9050602002810190610d929190615659565b610d9c9080615679565b808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152508e92508d9150899050818110610de257610de2615643565b9050602002810190610df49190615659565b610e02906020810190615679565b80806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250612cfc92505050565b838381518110610e4b57610e4b615643565b60209081029190910101525080610e61816156d8565b915050610b76565b50949350505050565b336000908152609960205260409020546001600160a01b031615610f0c5760405162461bcd60e51b815260206004820152604560248201527f44656c65676174696f6e4d616e616765722e726567697374657241734f70657260448201527f61746f723a206f70657261746f722068617320616c72656164792072656769736064820152641d195c995960da1b608482015260a401610b24565b610f16338461311e565b604080518082019091526060815260006020820152610f3833808360006133ba565b336001600160a01b03167f8e8485583a2310d41f7c82b9427d0bd49bad74bb9cff9d3402a29d8f9b28a0e285604051610f7191906156f3565b60405180910390a2336001600160a01b03167f02a919ed0e2acad1dd90f17ef2fa4ae5462ee1339170034a8531cca4b67080908484604051610fb4929190615745565b60405180910390a250505050565b606560009054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611015573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110399190615774565b6001600160a01b0316336001600160a01b0316146110695760405162461bcd60e51b8152600401610b2490615791565b6110728161376a565b50565b336001600160a01b037f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c91614806110d45750336001600160a01b037f0000000000000000000000000165878a594ca255338adfa4d48449f69242eb8f16145b6110f05760405162461bcd60e51b8152600401610b24906157db565b6110f983611486565b15611127576001600160a01b038084166000908152609a60205260409020541661112581858585613861565b505b505050565b60655460405163237dfb4760e11b81523360048201526001600160a01b03909116906346fbf68e90602401602060405180830381865afa158015611174573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111989190615838565b6111b45760405162461bcd60e51b8152600401610b2490615855565b6066548181161461122d5760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e70617573653a20696e76616c696420617474656d70742060448201527f746f20756e70617573652066756e6374696f6e616c69747900000000000000006064820152608401610b24565b606681905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d906020015b60405180910390a250565b6001600160a01b0383166000908152609b602052604081205461129085828686612040565b95945050505050565b336001600160a01b037f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c91614806112f85750336001600160a01b037f0000000000000000000000000165878a594ca255338adfa4d48449f69242eb8f16145b6113145760405162461bcd60e51b8152600401610b24906157db565b61131d83611486565b15611127576001600160a01b038084166000908152609a602052604090205416611125818585856138dc565b606654600290600490811614156113725760405162461bcd60e51b8152600401610b249061560c565b600260c95414156113c55760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610b24565b600260c95560005b88811015611475576114658a8a838181106113ea576113ea615643565b90506020028101906113fc919061589d565b89898481811061140e5761140e615643565b90506020028101906114209190615679565b89898681811061143257611432615643565b9050602002013588888781811061144b5761144b615643565b905060200201602081019061146091906158b3565b613957565b61146e816156d8565b90506113cd565b5050600160c9555050505050505050565b6001600160a01b039081166000908152609a602052604090205416151590565b60655460405163237dfb4760e11b81523360048201526001600160a01b03909116906346fbf68e90602401602060405180830381865afa1580156114ee573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115129190615838565b61152e5760405162461bcd60e51b8152600401610b2490615855565b600019606681905560405190815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a2565b6000816040516020016115809190615944565b604051602081830303815290604052805190602001209050919050565b60005b81518110156118445760008282815181106115bd576115bd615643565b602002602001015190506000807f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c96001600160a01b031663cd293f6f846040518263ffffffff1660e01b81526004016116169190615957565b60408051808303816000875af1158015611634573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116589190615a06565b915091508115611836576040808401516001600160a01b0381166000908152609f6020529182208054919282919061168f836156d8565b919050555060006040518060e00160405280846001600160a01b031681526020018760a001516001600160a01b031681526020018760600151600001516001600160a01b03168152602001838152602001876080015163ffffffff1681526020018760000151815260200187602001518152509050600061170f8261156d565b6000818152609e602052604090205490915060ff16156117a55760405162461bcd60e51b815260206004820152604560248201527f44656c65676174696f6e4d616e616765722e6d6967726174655175657565645760448201527f69746864726177616c733a207769746864726177616c20616c72656164792065606482015264786973747360d81b608482015260a401610b24565b6000818152609e602052604090819020805460ff19166001179055517f9009ab153e8014fbfb02f2217f5cde7aa7f9ad734ae85ca3ee3f4ca2fdd499f9906117f09083908590615a34565b60405180910390a160408051868152602081018390527fdc00758b65eef71dc3780c04ebe36cab6bdb266c3a698187e29e0f0dca012630910160405180910390a1505050505b8360010193505050506115a0565b5050565b606654600290600490811614156118715760405162461bcd60e51b8152600401610b249061560c565b600260c95414156118c45760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610b24565b600260c9556118d68686868686613957565b5050600160c95550505050565b6001600160a01b0390811660009081526099602052604090205416151590565b61190b613fbf565b6119156000614019565b565b428360200151101561199b5760405162461bcd60e51b815260206004820152604160248201527f44656c65676174696f6e4d616e616765722e64656c6567617465546f4279536960448201527f676e61747572653a207374616b6572207369676e6174757265206578706972656064820152601960fa1b608482015260a401610b24565b6000609b6000876001600160a01b03166001600160a01b0316815260200190815260200160002054905060006119d78783888860200151612040565b6001600160a01b0388166000908152609b602052604090206001840190558551909150611a07908890839061406b565b611a13878786866133ba565b50505050505050565b60665460039060089081161415611a455760405162461bcd60e51b8152600401610b249061560c565b4282604001511015611ab95760405162461bcd60e51b81526020600482015260436024820152600080516020615d1283398151915260448201527f6f72546f4156533a206f70657261746f72207369676e617475726520657870696064820152621c995960ea1b608482015260a401610b24565b600133600090815260a1602090815260408083206001600160a01b038816845290915290205460ff166001811115611af357611af3614ce5565b1415611b635760405162461bcd60e51b815260206004820152604460248201819052600080516020615d12833981519152908201527f6f72546f4156533a206f70657261746f7220616c726561647920726567697374606482015263195c995960e21b608482015260a401610b24565b6001600160a01b038316600090815260a26020908152604080832085830151845290915290205460ff1615611bee5760405162461bcd60e51b815260206004820152603b6024820152600080516020615d1283398151915260448201527f6f72546f4156533a2073616c7420616c7265616479207370656e7400000000006064820152608401610b24565b611bf7836118e3565b611c725760405162461bcd60e51b81526020600482015260526024820152600080516020615d1283398151915260448201527f6f72546f4156533a206f70657261746f72206e6f742072656769737465726564606482015271081d1bc8115a59d95b93185e595c881e595d60721b608482015260a401610b24565b6000611c88843385602001518660400151611dfa565b9050611c998482856000015161406b565b33600081815260a1602090815260408083206001600160a01b0389168085529083528184208054600160ff19918216811790925560a285528386208a860151875290945293829020805490931684179092555190917ff0952b1c65271d819d39983d2abb044b9cace59bcc4d4dd389f586ebdcb15b4191611d1a9190614cfb565b60405180910390a350505050565b611d31336118e3565b611db35760405162461bcd60e51b815260206004820152604760248201527f44656c65676174696f6e4d616e616765722e7570646174654f70657261746f7260448201527f4d657461646174615552493a2063616c6c6572206d75737420626520616e206f6064820152663832b930ba37b960c91b608482015260a401610b24565b336001600160a01b03167f02a919ed0e2acad1dd90f17ef2fa4ae5462ee1339170034a8531cca4b67080908383604051611dee929190615745565b60405180910390a25050565b604080517ff48bd254e30ce2953d187fdb4ef0cfdddb782ab1da55beebaef67c1f258d256e60208201526001600160a01b038087169282019290925290841660608201526080810183905260a08101829052600090819060c0015b6040516020818303038152906040528051906020012090506000611e77612b62565b60405161190160f01b602082015260228101919091526042810183905260620160408051808303601f190181529190528051602090910120979650505050505050565b60665460039060089081161415611ee35760405162461bcd60e51b8152600401610b249061560c565b600133600090815260a1602090815260408083206001600160a01b038716845290915290205460ff166001811115611f1d57611f1d614ce5565b14611f9e5760405162461bcd60e51b8152602060048201526044602482018190527f44656c65676174696f6e4d616e616765722e646572656769737465724f706572908201527f61746f7246726f6d4156533a206f70657261746f72206e6f7420726567697374606482015263195c995960e21b608482015260a401610b24565b33600081815260a1602090815260408083206001600160a01b0387168085529252808320805460ff191690555190917ff0952b1c65271d819d39983d2abb044b9cace59bcc4d4dd389f586ebdcb15b4191611ff99190614cfb565b60405180910390a35050565b336001600160a01b03167fa89c1dc243d8908a96dd84944bcc97d6bc6ac00dd78e20621576be6a3c9437138383604051611dee929190615745565b604080517f39111bc4a4d688e1f685123d7497d4615370152a8ee4a0593e647bd06ad8bb0b60208201526001600160a01b038087169282019290925290831660608201526080810184905260a08101829052600090819060c001611e55565b6040516360f4062b60e01b81526001600160a01b03828116600483015260609182916000917f0000000000000000000000000165878a594ca255338adfa4d48449f69242eb8f909116906360f4062b90602401602060405180830381865afa15801561210f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121339190615a4d565b6040516394f649dd60e01b81526001600160a01b03868116600483015291925060009182917f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c9909116906394f649dd90602401600060405180830381865afa1580156121a3573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526121cb9190810190615ac1565b91509150600083136121e257909590945092505050565b60608083516000141561229c576040805160018082528183019092529060208083019080368337505060408051600180825281830190925292945090506020808301908036833701905050905073beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac08260008151811061225757612257615643565b60200260200101906001600160a01b031690816001600160a01b031681525050848160008151811061228b5761228b615643565b60200260200101818152505061244a565b83516122a9906001615b85565b6001600160401b038111156122c0576122c0614d23565b6040519080825280602002602001820160405280156122e9578160200160208202803683370190505b50915081516001600160401b0381111561230557612305614d23565b60405190808252806020026020018201604052801561232e578160200160208202803683370190505b50905060005b84518110156123c85784818151811061234f5761234f615643565b602002602001015183828151811061236957612369615643565b60200260200101906001600160a01b031690816001600160a01b03168152505083818151811061239b5761239b615643565b60200260200101518282815181106123b5576123b5615643565b6020908102919091010152600101612334565b5073beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac082600184516123ed9190615b9d565b815181106123fd576123fd615643565b60200260200101906001600160a01b031690816001600160a01b03168152505084816001845161242d9190615b9d565b8151811061243d5761243d615643565b6020026020010181815250505b9097909650945050505050565b606654606090600190600290811614156124835760405162461bcd60e51b8152600401610b249061560c565b61248c83611486565b61250c5760405162461bcd60e51b8152602060048201526044602482018190527f44656c65676174696f6e4d616e616765722e756e64656c65676174653a207374908201527f616b6572206d7573742062652064656c65676174656420746f20756e64656c656064820152636761746560e01b608482015260a401610b24565b612515836118e3565b156125885760405162461bcd60e51b815260206004820152603d60248201527f44656c65676174696f6e4d616e616765722e756e64656c65676174653a206f7060448201527f657261746f72732063616e6e6f7420626520756e64656c6567617465640000006064820152608401610b24565b6001600160a01b0383166126045760405162461bcd60e51b815260206004820152603c60248201527f44656c65676174696f6e4d616e616765722e756e64656c65676174653a20636160448201527f6e6e6f7420756e64656c6567617465207a65726f2061646472657373000000006064820152608401610b24565b6001600160a01b038084166000818152609a6020526040902054909116903314806126375750336001600160a01b038216145b8061265e57506001600160a01b038181166000908152609960205260409020600101541633145b6126d05760405162461bcd60e51b815260206004820152603d60248201527f44656c65676174696f6e4d616e616765722e756e64656c65676174653a20636160448201527f6c6c65722063616e6e6f7420756e64656c6567617465207374616b65720000006064820152608401610b24565b6000806126dc8661209f565b9092509050336001600160a01b0387161461273257826001600160a01b0316866001600160a01b03167ff0eddf07e6ea14f388b47e1e94a0f464ecbd9eed4171130e0fc0e99fb4030a8a60405160405180910390a35b826001600160a01b0316866001600160a01b03167ffee30966a256b71e14bc0ebfc94315e28ef4a97a7131a9e2b7a310a73af4467660405160405180910390a36001600160a01b0386166000908152609a6020526040902080546001600160a01b031916905581516127b4576040805160008152602081019091529450612912565b81516001600160401b038111156127cd576127cd614d23565b6040519080825280602002602001820160405280156127f6578160200160208202803683370190505b50945060005b82518110156129105760408051600180825281830190925260009160208083019080368337505060408051600180825281830190925292935060009291506020808301908036833701905050905084838151811061285c5761285c615643565b60200260200101518260008151811061287757612877615643565b60200260200101906001600160a01b031690816001600160a01b0316815250508383815181106128a9576128a9615643565b6020026020010151816000815181106128c4576128c4615643565b6020026020010181815250506128dd89878b8585612cfc565b8884815181106128ef576128ef615643565b60200260200101818152505050508080612908906156d8565b9150506127fc565b505b50505050919050565b600054610100900460ff161580801561293b5750600054600160ff909116105b806129555750303b158015612955575060005460ff166001145b6129b85760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610b24565b6000805460ff1916600117905580156129db576000805461ff0019166101001790555b6129e58484614225565b6129ed61430b565b6097556129f985614019565b612a02826143a2565b8015612a48576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050505050565b611127338484846133ba565b612a64336118e3565b612ae25760405162461bcd60e51b815260206004820152604360248201527f44656c65676174696f6e4d616e616765722e6d6f646966794f70657261746f7260448201527f44657461696c733a2063616c6c6572206d75737420626520616e206f706572616064820152623a37b960e91b608482015260a401610b24565b611072338261311e565b612af4613fbf565b6001600160a01b038116612b595760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610b24565b61107281614019565b60007f0000000000000000000000000000000000000000000000000000000000007a69461415612b93575060975490565b612b9b61430b565b905090565b606560009054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612bf3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c179190615774565b6001600160a01b0316336001600160a01b031614612c475760405162461bcd60e51b8152600401610b2490615791565b606654198119606654191614612cc55760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e756e70617573653a20696e76616c696420617474656d7060448201527f7420746f2070617573652066756e6374696f6e616c69747900000000000000006064820152608401610b24565b606681905560405181815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c90602001611260565b60006001600160a01b038616612d935760405162461bcd60e51b815260206004820152605060248201527f44656c65676174696f6e4d616e616765722e5f72656d6f76655368617265734160448201527f6e6451756575655769746864726177616c3a207374616b65722063616e6e6f7460648201526f206265207a65726f206164647265737360801b608482015260a401610b24565b8251612e1d5760405162461bcd60e51b815260206004820152604d60248201527f44656c65676174696f6e4d616e616765722e5f72656d6f76655368617265734160448201527f6e6451756575655769746864726177616c3a207374726174656769657320636160648201526c6e6e6f7420626520656d70747960981b608482015260a401610b24565b60005b835181101561302c576001600160a01b03861615612e7657612e768688868481518110612e4f57612e4f615643565b6020026020010151868581518110612e6957612e69615643565b6020026020010151613861565b73beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac06001600160a01b0316848281518110612ea657612ea6615643565b60200260200101516001600160a01b03161415612f6f577f0000000000000000000000000165878a594ca255338adfa4d48449f69242eb8f6001600160a01b031663beffbb8988858481518110612eff57612eff615643565b60200260200101516040518363ffffffff1660e01b8152600401612f389291906001600160a01b03929092168252602082015260400190565b600060405180830381600087803b158015612f5257600080fd5b505af1158015612f66573d6000803e3d6000fd5b50505050613024565b7f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c96001600160a01b0316638c80d4e588868481518110612fb157612fb1615643565b6020026020010151868581518110612fcb57612fcb615643565b60200260200101516040518463ffffffff1660e01b8152600401612ff193929190615bb4565b600060405180830381600087803b15801561300b57600080fd5b505af115801561301f573d6000803e3d6000fd5b505050505b600101612e20565b506001600160a01b0386166000908152609f60205260408120805491829190613054836156d8565b919050555060006040518060e00160405280896001600160a01b03168152602001886001600160a01b03168152602001876001600160a01b031681526020018381526020014363ffffffff16815260200186815260200185815250905060006130bc8261156d565b6000818152609e602052604090819020805460ff19166001179055519091507f9009ab153e8014fbfb02f2217f5cde7aa7f9ad734ae85ca3ee3f4ca2fdd499f99061310a9083908590615a34565b60405180910390a198975050505050505050565b600061312d6020830183614b3f565b6001600160a01b031614156131c75760405162461bcd60e51b815260206004820152605460248201527f44656c65676174696f6e4d616e616765722e5f7365744f70657261746f72446560448201527f7461696c733a2063616e6e6f742073657420606561726e696e677352656365696064820152737665726020746f207a65726f206164647265737360601b608482015260a401610b24565b6213c6806131db6060830160408401615bd8565b63ffffffff1611156132905760405162461bcd60e51b815260206004820152606c60248201527f44656c65676174696f6e4d616e616765722e5f7365744f70657261746f72446560448201527f7461696c733a207374616b65724f70744f757457696e646f77426c6f636b732060648201527f63616e6e6f74206265203e204d41585f5354414b45525f4f50545f4f55545f5760848201526b494e444f575f424c4f434b5360a01b60a482015260c401610b24565b6001600160a01b0382166000908152609960205260409081902060010154600160a01b900463ffffffff16906132cc9060608401908401615bd8565b63ffffffff1610156133625760405162461bcd60e51b815260206004820152605360248201527f44656c65676174696f6e4d616e616765722e5f7365744f70657261746f72446560448201527f7461696c733a207374616b65724f70744f757457696e646f77426c6f636b732060648201527218d85b9b9bdd08189948191958dc99585cd959606a1b608482015260a401610b24565b6001600160a01b038216600090815260996020526040902081906133868282615c15565b505060405133907ffebe5cd24b2cbc7b065b9d0fdeb904461e4afcff57dd57acda1e7832031ba7ac90611dee9084906156f3565b606654600090600190811614156133e35760405162461bcd60e51b8152600401610b249061560c565b6133ec85611486565b156134695760405162461bcd60e51b815260206004820152604160248201527f44656c65676174696f6e4d616e616765722e5f64656c65676174653a2073746160448201527f6b657220697320616c7265616479206163746976656c792064656c65676174656064820152601960fa1b608482015260a401610b24565b613472846118e3565b6134f25760405162461bcd60e51b815260206004820152604560248201527f44656c65676174696f6e4d616e616765722e5f64656c65676174653a206f706560448201527f7261746f72206973206e6f74207265676973746572656420696e20456967656e6064820152642630bcb2b960d91b608482015260a401610b24565b6001600160a01b038085166000908152609960205260409020600101541680158015906135285750336001600160a01b03821614155b801561353d5750336001600160a01b03861614155b156136aa5742846020015110156135bc5760405162461bcd60e51b815260206004820152603760248201527f44656c65676174696f6e4d616e616765722e5f64656c65676174653a2061707060448201527f726f766572207369676e617475726520657870697265640000000000000000006064820152608401610b24565b6001600160a01b0381166000908152609c6020908152604080832086845290915290205460ff16156136565760405162461bcd60e51b815260206004820152603760248201527f44656c65676174696f6e4d616e616765722e5f64656c65676174653a2061707060448201527f726f76657253616c7420616c7265616479207370656e740000000000000000006064820152608401610b24565b6001600160a01b0381166000908152609c6020908152604080832086845282528220805460ff19166001179055850151613697908890889085908890610a36565b90506136a88282876000015161406b565b505b6001600160a01b038681166000818152609a602052604080822080546001600160a01b031916948a169485179055517fc3ee9f2e5fda98e8066a1f745b2df9285f416fe98cf2559cd21484b3d87433049190a36000806137098861209f565b9150915060005b825181101561375f57613757888a85848151811061373057613730615643565b602002602001015185858151811061374a5761374a615643565b60200260200101516138dc565b600101613710565b505050505050505050565b6001600160a01b0381166137f85760405162461bcd60e51b815260206004820152604960248201527f5061757361626c652e5f73657450617573657252656769737472793a206e657760448201527f50617573657252656769737472792063616e6e6f7420626520746865207a65726064820152686f206164647265737360b81b608482015260a401610b24565b606554604080516001600160a01b03928316815291831660208301527f6e9fcd539896fca60e8b0f01dd580233e48a6b0f7df013b89ba7f565869acdb6910160405180910390a1606580546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b03808516600090815260986020908152604080832093861683529290529081208054839290613898908490615b9d565b92505081905550836001600160a01b03167f6909600037b75d7b4733aedd815442b5ec018a827751c832aaff64eba5d6d2dd848484604051610fb493929190615bb4565b6001600160a01b03808516600090815260986020908152604080832093861683529290529081208054839290613913908490615b85565b92505081905550836001600160a01b03167f1ec042c965e2edd7107b51188ee0f383e22e76179041ab3a9d18ff151405166c848484604051610fb493929190615bb4565b600061396561067887615c78565b6000818152609e602052604090205490915060ff166139da5760405162461bcd60e51b815260206004820152603e6024820152600080516020615d3283398151915260448201527f416374696f6e3a20616374696f6e206973206e6f7420696e20717565756500006064820152608401610b24565b609d5443906139ef60a0890160808a01615bd8565b63ffffffff166139ff9190615b85565b1115613a875760405162461bcd60e51b81526020600482015260576024820152600080516020615d3283398151915260448201527f416374696f6e3a207769746864726177616c44656c6179426c6f636b7320706560648201527f72696f6420686173206e6f742079657420706173736564000000000000000000608482015260a401610b24565b613a976060870160408801614b3f565b6001600160a01b0316336001600160a01b031614613b1f5760405162461bcd60e51b815260206004820152604b6024820152600080516020615d3283398151915260448201527f416374696f6e3a206f6e6c7920776974686472617765722063616e20636f6d7060648201526a3632ba329030b1ba34b7b760a91b608482015260a401610b24565b8115613b9657613b3260a0870187615679565b85149050613b965760405162461bcd60e51b815260206004820152603d6024820152600080516020615d3283398151915260448201527f416374696f6e3a20696e707574206c656e677468206d69736d617463680000006064820152608401610b24565b6000818152609e60205260409020805460ff191690558115613c6c5760005b613bc260a0880188615679565b9050811015613c6657613c5e613bdb6020890189614b3f565b33613be960a08b018b615679565b85818110613bf957613bf9615643565b9050602002016020810190613c0e9190614b3f565b613c1b60c08c018c615679565b86818110613c2b57613c2b615643565b905060200201358a8a87818110613c4457613c44615643565b9050602002016020810190613c599190614b3f565b61449c565b600101613bb5565b50613f84565b336000908152609a60205260408120546001600160a01b0316905b613c9460a0890189615679565b9050811015613f815773beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac0613cbf60a08a018a615679565b83818110613ccf57613ccf615643565b9050602002016020810190613ce49190614b3f565b6001600160a01b03161415613e34576000613d0260208a018a614b3f565b905060006001600160a01b037f0000000000000000000000000165878a594ca255338adfa4d48449f69242eb8f16630e81073c83613d4360c08e018e615679565b87818110613d5357613d53615643565b6040516001600160e01b031960e087901b1681526001600160a01b03909416600485015260200291909101356024830152506044016020604051808303816000875af1158015613da7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613dcb9190615a4d565b6001600160a01b038084166000908152609a6020526040902054919250168015613e2c57613e2c8184613e0160a08f018f615679565b88818110613e1157613e11615643565b9050602002016020810190613e269190614b3f565b856138dc565b505050613f79565b6001600160a01b037f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c9166350ff722533613e7160a08c018c615679565b85818110613e8157613e81615643565b9050602002016020810190613e969190614b3f565b613ea360c08d018d615679565b86818110613eb357613eb3615643565b905060200201356040518463ffffffff1660e01b8152600401613ed893929190615bb4565b600060405180830381600087803b158015613ef257600080fd5b505af1158015613f06573d6000803e3d6000fd5b505050506001600160a01b03821615613f7957613f798233613f2b60a08c018c615679565b85818110613f3b57613f3b615643565b9050602002016020810190613f509190614b3f565b613f5d60c08d018d615679565b86818110613f6d57613f6d615643565b905060200201356138dc565b600101613c87565b50505b6040518181527fc97098c2f658800b4df29001527f7324bcdffcf6e8751a699ab920a1eced5b1d9060200160405180910390a1505050505050565b6033546001600160a01b031633146119155760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610b24565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6001600160a01b0383163b1561418557604051630b135d3f60e11b808252906001600160a01b03851690631626ba7e906140ab9086908690600401615c8a565b602060405180830381865afa1580156140c8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906140ec9190615ce7565b6001600160e01b031916146111275760405162461bcd60e51b815260206004820152605360248201527f454950313237315369676e61747572655574696c732e636865636b5369676e6160448201527f747572655f454950313237313a2045524331323731207369676e6174757265206064820152721d995c9a599a58d85d1a5bdb8819985a5b1959606a1b608482015260a401610b24565b826001600160a01b031661419983836145d5565b6001600160a01b0316146111275760405162461bcd60e51b815260206004820152604760248201527f454950313237315369676e61747572655574696c732e636865636b5369676e6160448201527f747572655f454950313237313a207369676e6174757265206e6f742066726f6d6064820152661039b4b3b732b960c91b608482015260a401610b24565b6065546001600160a01b031615801561424657506001600160a01b03821615155b6142c85760405162461bcd60e51b815260206004820152604760248201527f5061757361626c652e5f696e697469616c697a655061757365723a205f696e6960448201527f7469616c697a6550617573657228292063616e206f6e6c792062652063616c6c6064820152666564206f6e636560c81b608482015260a401610b24565b606681905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a26118448261376a565b604080518082018252600a81526922b4b3b2b72630bcb2b960b11b60209182015281517f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a866818301527f71b625cfad44bac63b13dba07f2e1d6084ee04b6f8752101ece6126d584ee6ea81840152466060820152306080808301919091528351808303909101815260a0909101909252815191012090565b61c4e081111561445b5760405162461bcd60e51b815260206004820152607260248201527f44656c65676174696f6e4d616e616765722e5f696e697469616c697a6557697460448201527f6864726177616c44656c6179426c6f636b733a205f7769746864726177616c4460648201527f656c6179426c6f636b732063616e6e6f74206265203e204d41585f5749544844608482015271524157414c5f44454c41595f424c4f434b5360701b60a482015260c401610b24565b609d5460408051918252602082018390527f4ffb00400574147429ee377a5633386321e66d45d8b14676014b5fa393e61e9e910160405180910390a1609d55565b6001600160a01b03831673beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac014156145475760405162387b1360e81b81526001600160a01b037f0000000000000000000000000165878a594ca255338adfa4d48449f69242eb8f169063387b13009061451090889088908790600401615bb4565b600060405180830381600087803b15801561452a57600080fd5b505af115801561453e573d6000803e3d6000fd5b50505050612a48565b60405163c608c7f360e01b81526001600160a01b03858116600483015284811660248301526044820184905282811660648301527f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c9169063c608c7f390608401600060405180830381600087803b1580156145c157600080fd5b505af115801561375f573d6000803e3d6000fd5b60008060006145e485856145f9565b915091506145f181614669565b509392505050565b6000808251604114156146305760208301516040840151606085015160001a61462487828585614824565b94509450505050614662565b82516040141561465a576020830151604084015161464f868383614911565b935093505050614662565b506000905060025b9250929050565b600081600481111561467d5761467d614ce5565b14156146865750565b600181600481111561469a5761469a614ce5565b14156146e85760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606401610b24565b60028160048111156146fc576146fc614ce5565b141561474a5760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606401610b24565b600381600481111561475e5761475e614ce5565b14156147b75760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b6064820152608401610b24565b60048160048111156147cb576147cb614ce5565b14156110725760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c604482015261756560f01b6064820152608401610b24565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a083111561485b5750600090506003614908565b8460ff16601b1415801561487357508460ff16601c14155b156148845750600090506004614908565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa1580156148d8573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b03811661490157600060019250925050614908565b9150600090505b94509492505050565b6000806001600160ff1b0383168161492e60ff86901c601b615b85565b905061493c87828885614824565b935093505050935093915050565b6001600160a01b038116811461107257600080fd5b803561496a8161494a565b919050565b600080600080600060a0868803121561498757600080fd5b85356149928161494a565b945060208601356149a28161494a565b935060408601356149b28161494a565b94979396509394606081013594506080013592915050565b60008083601f8401126149dc57600080fd5b5081356001600160401b038111156149f357600080fd5b6020830191508360208260051b850101111561466257600080fd5b60008060208385031215614a2157600080fd5b82356001600160401b03811115614a3757600080fd5b614a43858286016149ca565b90969095509350505050565b6020808252825182820181905260009190848201906040850190845b81811015614a8757835183529284019291840191600101614a6b565b50909695505050505050565b600060608284031215614aa557600080fd5b50919050565b60008083601f840112614abd57600080fd5b5081356001600160401b03811115614ad457600080fd5b60208301915083602082850101111561466257600080fd5b600080600060808486031215614b0157600080fd5b614b0b8585614a93565b925060608401356001600160401b03811115614b2657600080fd5b614b3286828701614aab565b9497909650939450505050565b600060208284031215614b5157600080fd5b8135614b5c8161494a565b9392505050565b600080600060608486031215614b7857600080fd5b8335614b838161494a565b92506020840135614b938161494a565b929592945050506040919091013590565b600060208284031215614bb657600080fd5b5035919050565b6000806000806000806000806080898b031215614bd957600080fd5b88356001600160401b0380821115614bf057600080fd5b614bfc8c838d016149ca565b909a50985060208b0135915080821115614c1557600080fd5b614c218c838d016149ca565b909850965060408b0135915080821115614c3a57600080fd5b614c468c838d016149ca565b909650945060608b0135915080821115614c5f57600080fd5b50614c6c8b828c016149ca565b999c989b5096995094979396929594505050565b60008060408385031215614c9357600080fd5b8235614c9e8161494a565b946020939093013593505050565b60008060408385031215614cbf57600080fd5b8235614cca8161494a565b91506020830135614cda8161494a565b809150509250929050565b634e487b7160e01b600052602160045260246000fd5b6020810160028310614d1d57634e487b7160e01b600052602160045260246000fd5b91905290565b634e487b7160e01b600052604160045260246000fd5b60405160e081016001600160401b0381118282101715614d5b57614d5b614d23565b60405290565b604080519081016001600160401b0381118282101715614d5b57614d5b614d23565b60405160c081016001600160401b0381118282101715614d5b57614d5b614d23565b604051601f8201601f191681016001600160401b0381118282101715614dcd57614dcd614d23565b604052919050565b63ffffffff8116811461107257600080fd5b803561496a81614dd5565b60006001600160401b03821115614e0b57614e0b614d23565b5060051b60200190565b600082601f830112614e2657600080fd5b81356020614e3b614e3683614df2565b614da5565b82815260059290921b84018101918181019086841115614e5a57600080fd5b8286015b84811015614e7e578035614e718161494a565b8352918301918301614e5e565b509695505050505050565b600082601f830112614e9a57600080fd5b81356020614eaa614e3683614df2565b82815260059290921b84018101918181019086841115614ec957600080fd5b8286015b84811015614e7e5780358352918301918301614ecd565b600060e08284031215614ef657600080fd5b614efe614d39565b9050614f098261495f565b8152614f176020830161495f565b6020820152614f286040830161495f565b604082015260608201356060820152614f4360808301614de7565b608082015260a08201356001600160401b0380821115614f6257600080fd5b614f6e85838601614e15565b60a084015260c0840135915080821115614f8757600080fd5b50614f9484828501614e89565b60c08301525092915050565b600060208284031215614fb257600080fd5b81356001600160401b03811115614fc857600080fd5b614fd484828501614ee4565b949350505050565b600060208284031215614fee57600080fd5b813560ff81168114614b5c57600080fd5b60006040828403121561501157600080fd5b615019614d61565b905081356150268161494a565b815260208201356bffffffffffffffffffffffff8116811461504757600080fd5b602082015292915050565b6000602080838503121561506557600080fd5b82356001600160401b038082111561507c57600080fd5b818501915085601f83011261509057600080fd5b813561509e614e3682614df2565b81815260059190911b830184019084810190888311156150bd57600080fd5b8585015b83811015615197578035858111156150d95760008081fd5b860160e0818c03601f19018113156150f15760008081fd5b6150f9614d83565b898301358881111561510b5760008081fd5b6151198e8c83870101614e15565b825250604080840135898111156151305760008081fd5b61513e8f8d83880101614e89565b8c84015250606061515081860161495f565b82840152608091506151648f838701614fff565b9083015261517460c08501614de7565b9082015261518383830161495f565b60a0820152855250509186019186016150c1565b5098975050505050505050565b801515811461107257600080fd5b6000806000806000608086880312156151ca57600080fd5b85356001600160401b03808211156151e157600080fd5b9087019060e0828a0312156151f557600080fd5b9095506020870135908082111561520b57600080fd5b50615218888289016149ca565b909550935050604086013591506060860135615233816151a4565b809150509295509295909350565b600082601f83011261525257600080fd5b81356001600160401b0381111561526b5761526b614d23565b61527e601f8201601f1916602001614da5565b81815284602083860101111561529357600080fd5b816020850160208301376000918101602001919091529392505050565b6000604082840312156152c257600080fd5b6152ca614d61565b905081356001600160401b038111156152e257600080fd5b6152ee84828501615241565b8252506020820135602082015292915050565b600080600080600060a0868803121561531957600080fd5b85356153248161494a565b945060208601356153348161494a565b935060408601356001600160401b038082111561535057600080fd5b61535c89838a016152b0565b9450606088013591508082111561537257600080fd5b5061537f888289016152b0565b95989497509295608001359392505050565b600080604083850312156153a457600080fd5b82356153af8161494a565b915060208301356001600160401b03808211156153cb57600080fd5b90840190606082870312156153df57600080fd5b6040516060810181811083821117156153fa576153fa614d23565b60405282358281111561540c57600080fd5b61541888828601615241565b82525060208301356020820152604083013560408201528093505050509250929050565b6000806020838503121561544f57600080fd5b82356001600160401b0381111561546557600080fd5b614a4385828601614aab565b6000806000806080858703121561548757600080fd5b84356154928161494a565b935060208501356154a28161494a565b93969395505050506040820135916060013590565b600080600080608085870312156154cd57600080fd5b84356154d88161494a565b93506020850135925060408501356154ef8161494a565b9396929550929360600135925050565b600081518084526020808501945080840160005b838110156155385781516001600160a01b031687529582019590820190600101615513565b509495945050505050565b600081518084526020808501945080840160005b8381101561553857815187529582019590820190600101615557565b60408152600061558660408301856154ff565b82810360208401526112908185615543565b6000806000606084860312156155ad57600080fd5b83356155b88161494a565b925060208401356001600160401b038111156155d357600080fd5b6155df868287016152b0565b925050604084013590509250925092565b60006060828403121561560257600080fd5b614b5c8383614a93565b60208082526019908201527f5061757361626c653a20696e6465782069732070617573656400000000000000604082015260600190565b634e487b7160e01b600052603260045260246000fd5b60008235605e1983360301811261566f57600080fd5b9190910192915050565b6000808335601e1984360301811261569057600080fd5b8301803591506001600160401b038211156156aa57600080fd5b6020019150600581901b360382131561466257600080fd5b634e487b7160e01b600052601160045260246000fd5b60006000198214156156ec576156ec6156c2565b5060010190565b6060810182356157028161494a565b6001600160a01b03908116835260208401359061571e8261494a565b166020830152604083013561573281614dd5565b63ffffffff811660408401525092915050565b60208152816020820152818360408301376000818301604090810191909152601f909201601f19160101919050565b60006020828403121561578657600080fd5b8151614b5c8161494a565b6020808252602a908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526939903ab73830bab9b2b960b11b606082015260800190565b60208082526037908201527f44656c65676174696f6e4d616e616765723a206f6e6c7953747261746567794d60408201527f616e616765724f72456967656e506f644d616e61676572000000000000000000606082015260800190565b60006020828403121561584a57600080fd5b8151614b5c816151a4565b60208082526028908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526739903830bab9b2b960c11b606082015260800190565b6000823560de1983360301811261566f57600080fd5b6000602082840312156158c557600080fd5b8135614b5c816151a4565b600060018060a01b03808351168452806020840151166020850152806040840151166040850152506060820151606084015263ffffffff608083015116608084015260a082015160e060a085015261592b60e08501826154ff565b905060c083015184820360c08601526112908282615543565b602081526000614b5c60208301846158d0565b602081526000825160e060208401526159746101008401826154ff565b90506020840151601f198483030160408501526159918282615543565b915050604084015160018060a01b03808216606086015260608601519150808251166080860152506bffffffffffffffffffffffff60208201511660a08501525060808401516159e960c085018263ffffffff169052565b5060a08401516001600160a01b03811660e0850152509392505050565b60008060408385031215615a1957600080fd5b8251615a24816151a4565b6020939093015192949293505050565b828152604060208201526000614fd460408301846158d0565b600060208284031215615a5f57600080fd5b5051919050565b600082601f830112615a7757600080fd5b81516020615a87614e3683614df2565b82815260059290921b84018101918181019086841115615aa657600080fd5b8286015b84811015614e7e5780518352918301918301615aaa565b60008060408385031215615ad457600080fd5b82516001600160401b0380821115615aeb57600080fd5b818501915085601f830112615aff57600080fd5b81516020615b0f614e3683614df2565b82815260059290921b84018101918181019089841115615b2e57600080fd5b948201945b83861015615b55578551615b468161494a565b82529482019490820190615b33565b91880151919650909350505080821115615b6e57600080fd5b50615b7b85828601615a66565b9150509250929050565b60008219821115615b9857615b986156c2565b500190565b600082821015615baf57615baf6156c2565b500390565b6001600160a01b039384168152919092166020820152604081019190915260600190565b600060208284031215615bea57600080fd5b8135614b5c81614dd5565b80546001600160a01b0319166001600160a01b0392909216919091179055565b8135615c208161494a565b615c2a8183615bf5565b50600181016020830135615c3d8161494a565b615c478183615bf5565b506040830135615c5681614dd5565b815463ffffffff60a01b191660a09190911b63ffffffff60a01b161790555050565b6000615c843683614ee4565b92915050565b82815260006020604081840152835180604085015260005b81811015615cbe57858101830151858201606001528201615ca2565b81811115615cd0576000606083870101525b50601f01601f191692909201606001949350505050565b600060208284031215615cf957600080fd5b81516001600160e01b031981168114614b5c57600080fdfe44656c65676174696f6e4d616e616765722e72656769737465724f706572617444656c65676174696f6e4d616e616765722e636f6d706c657465517565756564a26469706673582212206a81cf1e3f4da9c1111581c8df74dfd0a545ece3552675f7c9396674b435d7ab64736f6c634300080c0033","storage":{"0x0":"0xff"}},"0x67d269191c92caf3cd7723f116c85e6e9bf55933":{"nonce":1,"balance":"0x0","code":"0x60806040526004361061004e5760003560e01c80633659cfe6146100655780634f1ef286146100855780635c60da1b146100985780638f283970146100c9578063f851a440146100e95761005d565b3661005d5761005b6100fe565b005b61005b6100fe565b34801561007157600080fd5b5061005b6100803660046106f1565b610118565b61005b61009336600461070c565b61015f565b3480156100a457600080fd5b506100ad6101d0565b6040516001600160a01b03909116815260200160405180910390f35b3480156100d557600080fd5b5061005b6100e43660046106f1565b61020b565b3480156100f557600080fd5b506100ad610235565b61010661029b565b61011661011161033a565b610344565b565b610120610368565b6001600160a01b0316336001600160a01b03161415610157576101548160405180602001604052806000815250600061039b565b50565b6101546100fe565b610167610368565b6001600160a01b0316336001600160a01b031614156101c8576101c38383838080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506001925061039b915050565b505050565b6101c36100fe565b60006101da610368565b6001600160a01b0316336001600160a01b03161415610200576101fb61033a565b905090565b6102086100fe565b90565b610213610368565b6001600160a01b0316336001600160a01b0316141561015757610154816103c6565b600061023f610368565b6001600160a01b0316336001600160a01b03161415610200576101fb610368565b6060610285838360405180606001604052806027815260200161080b6027913961041a565b9392505050565b6001600160a01b03163b151590565b6102a3610368565b6001600160a01b0316336001600160a01b031614156101165760405162461bcd60e51b815260206004820152604260248201527f5472616e73706172656e745570677261646561626c6550726f78793a2061646d60448201527f696e2063616e6e6f742066616c6c6261636b20746f2070726f78792074617267606482015261195d60f21b608482015260a4015b60405180910390fd5b60006101fb6104f7565b3660008037600080366000845af43d6000803e808015610363573d6000f35b3d6000fd5b60007fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b546001600160a01b0316919050565b6103a48361051f565b6000825111806103b15750805b156101c3576103c08383610260565b50505050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f6103ef610368565b604080516001600160a01b03928316815291841660208301520160405180910390a16101548161055f565b60606001600160a01b0384163b6104825760405162461bcd60e51b815260206004820152602660248201527f416464726573733a2064656c65676174652063616c6c20746f206e6f6e2d636f6044820152651b9d1c9858dd60d21b6064820152608401610331565b600080856001600160a01b03168560405161049d91906107bb565b600060405180830381855af49150503d80600081146104d8576040519150601f19603f3d011682016040523d82523d6000602084013e6104dd565b606091505b50915091506104ed828286610608565b9695505050505050565b60007f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc61038c565b61052881610641565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b6001600160a01b0381166105c45760405162461bcd60e51b815260206004820152602660248201527f455243313936373a206e65772061646d696e20697320746865207a65726f206160448201526564647265737360d01b6064820152608401610331565b807fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b80546001600160a01b0319166001600160a01b039290921691909117905550565b60608315610617575081610285565b8251156106275782518084602001fd5b8160405162461bcd60e51b815260040161033191906107d7565b6001600160a01b0381163b6106ae5760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b6064820152608401610331565b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc6105e7565b80356001600160a01b03811681146106ec57600080fd5b919050565b60006020828403121561070357600080fd5b610285826106d5565b60008060006040848603121561072157600080fd5b61072a846106d5565b9250602084013567ffffffffffffffff8082111561074757600080fd5b818601915086601f83011261075b57600080fd5b81358181111561076a57600080fd5b87602082850101111561077c57600080fd5b6020830194508093505050509250925092565b60005b838110156107aa578181015183820152602001610792565b838111156103c05750506000910152565b600082516107cd81846020870161078f565b9190910192915050565b60208152600082518060208401526107f681604085016020870161078f565b601f01601f1916919091016040019291505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a2646970667358221220e0ca31ca14c3ab02f9d35807e213496778d76ad573a18c89caa6360e8a17421464736f6c634300080c0033","storage":{"0x1":"0x1","0x34":"0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266","0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc":"0x8f86403a4de0bb5791fa46b8e795c547942fe4cf","0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103":"0x7a2088a1bfc9d81c55368ae168c2c02570cb814f"}},"0x70997970c51812dc3a010c7d01b50e0d17dc79c8":{"nonce":0,"balance":"0x21e19e0c9bab2400000","code":"0x","storage":{}},"0x70e0ba845a1a0f2da3359c97e0285013525ffc49":{"nonce":1,"balance":"0x0","code":"0x608060405234801561001057600080fd5b50600436106100b35760003560e01c8063890262451161007157806389026245146101b3578063a48bb0ac146101d3578063bd29b8cd146101e6578063caa3cd76146101f9578063e2e685801461020f578063f34109221461025557600080fd5b8062bff04d146100b857806312d1d74d146100e157806326d941f2146101155780632ed583e51461012a5780636d14a9871461013d5780638121906f1461017c575b600080fd5b6100cb6100c6366004610f6f565b610268565b6040516100d89190610feb565b60405180910390f35b6100f46100ef36600461105f565b6103ca565b60408051825163ffffffff16815260209283015192810192909252016100d8565b610128610123366004611092565b610410565b005b6100f46101383660046110ad565b610534565b6101647f000000000000000000000000c3e53f4d16ae77db1c982e75a937b9f60fe6369081565b6040516001600160a01b0390911681526020016100d8565b61018f61018a366004611092565b6105ba565b60408051825163ffffffff90811682526020938401511692810192909252016100d8565b6101c66101c136600461105f565b610601565b6040516100d891906110f0565b61018f6101e136600461105f565b61076b565b6101286101f4366004610f6f565b6107e2565b610201600081565b6040519081526020016100d8565b61024061021d366004611128565b600160209081526000928352604080842090915290825290205463ffffffff1681565b60405163ffffffff90911681526020016100d8565b610240610263366004611092565b6108f0565b6060336001600160a01b037f000000000000000000000000c3e53f4d16ae77db1c982e75a937b9f60fe6369016146102bb5760405162461bcd60e51b81526004016102b290611152565b60405180910390fd5b60008267ffffffffffffffff8111156102d6576102d66111c5565b6040519080825280602002602001820160405280156102ff578160200160208202803683370190505b50905060005b838110156103bf576000858583818110610321576103216111db565b919091013560f81c60008181526003602052604090205490925090508061035a5760405162461bcd60e51b81526004016102b2906111f1565b60006103658361090f565b905061037c898461037760018561125c565b610a08565b8085858151811061038f5761038f6111db565b602002602001019063ffffffff16908163ffffffff168152505050505080806103b790611281565b915050610305565b5090505b9392505050565b60408051808201909152600080825260208201526103e88383610a92565b60408051808201909152815463ffffffff168152600190910154602082015290505b92915050565b336001600160a01b037f000000000000000000000000c3e53f4d16ae77db1c982e75a937b9f60fe6369016146104585760405162461bcd60e51b81526004016102b290611152565b60ff8116600090815260036020526040902054156104d25760405162461bcd60e51b815260206004820152603160248201527f496e64657852656769737472792e63726561746551756f72756d3a2071756f72604482015270756d20616c72656164792065786973747360781b60648201526084016102b2565b60ff166000908152600360209081526040808320815180830190925263ffffffff438116835282840185815282546001810184559286529390942091519101805492518416600160201b0267ffffffffffffffff199093169190931617179055565b604080518082019091526000808252602082015260ff8416600090815260026020908152604080832063ffffffff80881685529252909120805490918416908110610581576105816111db565b600091825260209182902060408051808201909152600290920201805463ffffffff168252600101549181019190915290509392505050565b60408051808201909152600080825260208201526105d782610aea565b60408051808201909152905463ffffffff8082168352600160201b90910416602082015292915050565b6060600061060f8484610b2c565b905060008163ffffffff1667ffffffffffffffff811115610632576106326111c5565b60405190808252806020026020018201604052801561065b578160200160208202803683370190505b50905060005b8263ffffffff168110156107625761067a868287610cf0565b82828151811061068c5761068c6111db565b6020026020010181815250506000801b8282815181106106ae576106ae6111db565b602002602001015114156107505760405162461bcd60e51b815260206004820152605d60248201527f496e64657852656769737472792e6765744f70657261746f724c69737441744260448201527f6c6f636b4e756d6265723a206f70657261746f7220646f6573206e6f7420657860648201527f6973742061742074686520676976656e20626c6f636b206e756d626572000000608482015260a4016102b2565b8061075a81611281565b915050610661565b50949350505050565b604080518082019091526000808252602082015260ff83166000908152600360205260409020805463ffffffff84169081106107a9576107a96111db565b60009182526020918290206040805180820190915291015463ffffffff8082168352600160201b90910416918101919091529392505050565b336001600160a01b037f000000000000000000000000c3e53f4d16ae77db1c982e75a937b9f60fe63690161461082a5760405162461bcd60e51b81526004016102b290611152565b60005b818110156108ea576000838383818110610849576108496111db565b919091013560f81c6000818152600360205260409020549092509050806108825760405162461bcd60e51b81526004016102b2906111f1565b60ff8216600090815260016020908152604080832089845290915281205463ffffffff16906108b084610de0565b905060006108be8583610e1a565b90508089146108d2576108d2818685610a08565b505050505080806108e290611281565b91505061082d565b50505050565b60006108fb82610aea565b54600160201b900463ffffffff1692915050565b60008061091b83610aea565b805490915060009061093b90600160201b900463ffffffff16600161129c565b9050610948848383610e44565b60ff841660009081526002602052604081209061096660018461125c565b63ffffffff1681526020810191909152604001600020546103c35760ff841660009081526002602052604081209061099f60018461125c565b63ffffffff908116825260208083019390935260409182016000908120835180850190945243831684528385018281528154600180820184559284529590922093516002909502909301805463ffffffff19169490921693909317815591519101559392505050565b6000610a148383610a92565b9050610a2283838387610ee4565b60ff83166000818152600160209081526040808320888452825291829020805463ffffffff191663ffffffff871690811790915582519384529083015285917f6ee1e4f4075f3d067176140d34e87874244dd273294c05b2218133e49a2ba6f6910160405180910390a250505050565b60ff8216600090815260026020908152604080832063ffffffff851684529091528120805490610ac36001836112c4565b81548110610ad357610ad36111db565b906000526020600020906002020191505092915050565b60ff81166000908152600360205260408120805490610b0a6001836112c4565b81548110610b1a57610b1a6111db565b90600052602060002001915050919050565b60ff821660009081526003602052604081205480610bb4576040805162461bcd60e51b81526020600482015260248101919091527f496e64657852656769737472792e5f6f70657261746f72436f756e744174426c60448201527f6f636b4e756d6265723a2071756f72756d20646f6573206e6f7420657869737460648201526084016102b2565b60005b81811015610c6357600081610bcd6001856112c4565b610bd791906112c4565b60ff871660009081526003602052604081208054929350909183908110610c0057610c006111db565b60009182526020918290206040805180820190915291015463ffffffff808216808452600160201b90920481169383019390935290925090871610610c4e5760200151935061040a92505050565b50508080610c5b90611281565b915050610bb7565b5060405162461bcd60e51b815260206004820152605560248201527f496e64657852656769737472792e5f6f70657261746f72436f756e744174426c60448201527f6f636b4e756d6265723a2071756f72756d20646964206e6f742065786973742060648201527430ba1033b4bb32b710313637b1b590373ab6b132b960591b608482015260a4016102b2565b60ff8316600090815260026020908152604080832063ffffffff86168452909152812054815b81811015610dd457600081610d2c6001856112c4565b610d3691906112c4565b60ff8816600090815260026020908152604080832063ffffffff8b16845290915281208054929350909183908110610d7057610d706111db565b600091825260209182902060408051808201909152600290920201805463ffffffff9081168084526001909201549383019390935290925090871610610dbf576020015193506103c392505050565b50508080610dcc90611281565b915050610d16565b50600095945050505050565b600080610dec83610aea565b8054909150600090610e0d90600190600160201b900463ffffffff1661125c565b90506103c3848383610e44565b600080610e278484610a92565b6001810154909150610e3c8585846000610ee4565b949350505050565b81544363ffffffff90811691161415610e7b57815463ffffffff8216600160201b0267ffffffff0000000019909116178255505050565b60ff83166000908152600360209081526040808320815180830190925263ffffffff438116835285811683850190815282546001810184559286529390942091519101805492518416600160201b0267ffffffffffffffff199093169190931617179055505050565b81544363ffffffff90811691161415610f0357600182018190556108ea565b60ff93909316600090815260026020818152604080842063ffffffff968716855282528084208151808301909252438716825281830197885280546001808201835591865292909420905191909202909101805463ffffffff1916919094161783559251919092015550565b600080600060408486031215610f8457600080fd5b83359250602084013567ffffffffffffffff80821115610fa357600080fd5b818601915086601f830112610fb757600080fd5b813581811115610fc657600080fd5b876020828501011115610fd857600080fd5b6020830194508093505050509250925092565b6020808252825182820181905260009190848201906040850190845b8181101561102957835163ffffffff1683529284019291840191600101611007565b50909695505050505050565b803560ff8116811461104657600080fd5b919050565b803563ffffffff8116811461104657600080fd5b6000806040838503121561107257600080fd5b61107b83611035565b91506110896020840161104b565b90509250929050565b6000602082840312156110a457600080fd5b6103c382611035565b6000806000606084860312156110c257600080fd5b6110cb84611035565b92506110d96020850161104b565b91506110e76040850161104b565b90509250925092565b6020808252825182820181905260009190848201906040850190845b818110156110295783518352928401929184019160010161110c565b6000806040838503121561113b57600080fd5b61114483611035565b946020939093013593505050565b6020808252604d908201527f496e64657852656769737472792e6f6e6c795265676973747279436f6f72646960408201527f6e61746f723a2063616c6c6572206973206e6f7420746865207265676973747260608201526c3c9031b7b7b93234b730ba37b960991b608082015260a00190565b634e487b7160e01b600052604160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b60208082526035908201527f496e64657852656769737472792e72656769737465724f70657261746f723a206040820152741c5d5bdc9d5b48191bd95cc81b9bdd08195e1a5cdd605a1b606082015260800190565b634e487b7160e01b600052601160045260246000fd5b600063ffffffff8381169083168181101561127957611279611246565b039392505050565b600060001982141561129557611295611246565b5060010190565b600063ffffffff8083168185168083038211156112bb576112bb611246565b01949350505050565b6000828210156112d6576112d6611246565b50039056fea264697066735822122026312ae69a60b269cb73e75e78b7e0c1a19a83d010aac07cdcc742e900a0267c64736f6c634300080c0033","storage":{"0x0":"0xff"}},"0x7a2088a1bfc9d81c55368ae168c2c02570cb814f":{"nonce":1,"balance":"0x0","code":"0x60806040526004361061007b5760003560e01c80639623609d1161004e5780639623609d1461011157806399a88ec414610124578063f2fde38b14610144578063f3b7dead1461016457600080fd5b8063204e1c7a14610080578063715018a6146100bc5780637eff275e146100d35780638da5cb5b146100f3575b600080fd5b34801561008c57600080fd5b506100a061009b366004610499565b610184565b6040516001600160a01b03909116815260200160405180910390f35b3480156100c857600080fd5b506100d1610215565b005b3480156100df57600080fd5b506100d16100ee3660046104bd565b610229565b3480156100ff57600080fd5b506000546001600160a01b03166100a0565b6100d161011f36600461050c565b610291565b34801561013057600080fd5b506100d161013f3660046104bd565b610300565b34801561015057600080fd5b506100d161015f366004610499565b610336565b34801561017057600080fd5b506100a061017f366004610499565b6103b4565b6000806000836001600160a01b03166040516101aa90635c60da1b60e01b815260040190565b600060405180830381855afa9150503d80600081146101e5576040519150601f19603f3d011682016040523d82523d6000602084013e6101ea565b606091505b5091509150816101f957600080fd5b8080602001905181019061020d91906105e2565b949350505050565b61021d6103da565b6102276000610434565b565b6102316103da565b6040516308f2839760e41b81526001600160a01b038281166004830152831690638f283970906024015b600060405180830381600087803b15801561027557600080fd5b505af1158015610289573d6000803e3d6000fd5b505050505050565b6102996103da565b60405163278f794360e11b81526001600160a01b03841690634f1ef2869034906102c990869086906004016105ff565b6000604051808303818588803b1580156102e257600080fd5b505af11580156102f6573d6000803e3d6000fd5b5050505050505050565b6103086103da565b604051631b2ce7f360e11b81526001600160a01b038281166004830152831690633659cfe69060240161025b565b61033e6103da565b6001600160a01b0381166103a85760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084015b60405180910390fd5b6103b181610434565b50565b6000806000836001600160a01b03166040516101aa906303e1469160e61b815260040190565b6000546001600160a01b031633146102275760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161039f565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b03811681146103b157600080fd5b6000602082840312156104ab57600080fd5b81356104b681610484565b9392505050565b600080604083850312156104d057600080fd5b82356104db81610484565b915060208301356104eb81610484565b809150509250929050565b634e487b7160e01b600052604160045260246000fd5b60008060006060848603121561052157600080fd5b833561052c81610484565b9250602084013561053c81610484565b9150604084013567ffffffffffffffff8082111561055957600080fd5b818601915086601f83011261056d57600080fd5b81358181111561057f5761057f6104f6565b604051601f8201601f19908116603f011681019083821181831017156105a7576105a76104f6565b816040528281528960208487010111156105c057600080fd5b8260208601602083013760006020848301015280955050505050509250925092565b6000602082840312156105f457600080fd5b81516104b681610484565b60018060a01b038316815260006020604081840152835180604085015260005b8181101561063b5785810183015185820160600152820161061f565b8181111561064d576000606083870101525b50601f01601f19169290920160600194935050505056fea26469706673582212209061c80899128b8684c86edc8249d7e30bf7fad8379ff9eb2a531c00b3c4708164736f6c634300080c0033","storage":{"0x0":"0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266"}},"0x84ea74d481ee0a5332c457a4d796187f6ba67feb":{"nonce":1,"balance":"0x0","code":"0x60806040526004361061004e5760003560e01c80633659cfe6146100655780634f1ef286146100855780635c60da1b146100985780638f283970146100c9578063f851a440146100e95761005d565b3661005d5761005b6100fe565b005b61005b6100fe565b34801561007157600080fd5b5061005b6100803660046106f1565b610118565b61005b61009336600461070c565b61015f565b3480156100a457600080fd5b506100ad6101d0565b6040516001600160a01b03909116815260200160405180910390f35b3480156100d557600080fd5b5061005b6100e43660046106f1565b61020b565b3480156100f557600080fd5b506100ad610235565b61010661029b565b61011661011161033a565b610344565b565b610120610368565b6001600160a01b0316336001600160a01b03161415610157576101548160405180602001604052806000815250600061039b565b50565b6101546100fe565b610167610368565b6001600160a01b0316336001600160a01b031614156101c8576101c38383838080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506001925061039b915050565b505050565b6101c36100fe565b60006101da610368565b6001600160a01b0316336001600160a01b03161415610200576101fb61033a565b905090565b6102086100fe565b90565b610213610368565b6001600160a01b0316336001600160a01b0316141561015757610154816103c6565b600061023f610368565b6001600160a01b0316336001600160a01b03161415610200576101fb610368565b6060610285838360405180606001604052806027815260200161080b6027913961041a565b9392505050565b6001600160a01b03163b151590565b6102a3610368565b6001600160a01b0316336001600160a01b031614156101165760405162461bcd60e51b815260206004820152604260248201527f5472616e73706172656e745570677261646561626c6550726f78793a2061646d60448201527f696e2063616e6e6f742066616c6c6261636b20746f2070726f78792074617267606482015261195d60f21b608482015260a4015b60405180910390fd5b60006101fb6104f7565b3660008037600080366000845af43d6000803e808015610363573d6000f35b3d6000fd5b60007fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b546001600160a01b0316919050565b6103a48361051f565b6000825111806103b15750805b156101c3576103c08383610260565b50505050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f6103ef610368565b604080516001600160a01b03928316815291841660208301520160405180910390a16101548161055f565b60606001600160a01b0384163b6104825760405162461bcd60e51b815260206004820152602660248201527f416464726573733a2064656c65676174652063616c6c20746f206e6f6e2d636f6044820152651b9d1c9858dd60d21b6064820152608401610331565b600080856001600160a01b03168560405161049d91906107bb565b600060405180830381855af49150503d80600081146104d8576040519150601f19603f3d011682016040523d82523d6000602084013e6104dd565b606091505b50915091506104ed828286610608565b9695505050505050565b60007f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc61038c565b61052881610641565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b6001600160a01b0381166105c45760405162461bcd60e51b815260206004820152602660248201527f455243313936373a206e65772061646d696e20697320746865207a65726f206160448201526564647265737360d01b6064820152608401610331565b807fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b80546001600160a01b0319166001600160a01b039290921691909117905550565b60608315610617575081610285565b8251156106275782518084602001fd5b8160405162461bcd60e51b815260040161033191906107d7565b6001600160a01b0381163b6106ae5760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b6064820152608401610331565b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc6105e7565b80356001600160a01b03811681146106ec57600080fd5b919050565b60006020828403121561070357600080fd5b610285826106d5565b60008060006040848603121561072157600080fd5b61072a846106d5565b9250602084013567ffffffffffffffff8082111561074757600080fd5b818601915086601f83011261075b57600080fd5b81358181111561076a57600080fd5b87602082850101111561077c57600080fd5b6020830194508093505050509250925092565b60005b838110156107aa578181015183820152602001610792565b838111156103c05750506000910152565b600082516107cd81846020870161078f565b9190910192915050565b60208152600082518060208401526107f681604085016020870161078f565b601f01601f1916919091016040019291505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a2646970667358221220e0ca31ca14c3ab02f9d35807e213496778d76ad573a18c89caa6360e8a17421464736f6c634300080c0033","storage":{"0x17ef568e3e12ab5b9c7254a8d58478811de00f9e6eb34345acd53bf8fd09d3ec":"0x1","0x295841a49a1089f4b560f91cfbb0133326654dcbb1041861fc5dde96c724a22f":"0x6000000000000000000000000000000000000000000000000","0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc":"0x95401dc811bb5740090279ba06cfa8fcf6113778","0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103":"0x7a2088a1bfc9d81c55368ae168c2c02570cb814f"}},"0x851356ae760d987e095750cceb3bc6014560891c":{"nonce":1,"balance":"0x0","code":"0x608060405234801561001057600080fd5b50600436106101da5760003560e01c806381c0750211610104578063c8294c56116100a2578063f2be94ae11610071578063f2be94ae14610509578063f851e1981461051c578063fa28c6271461052f578063ff694a771461054257600080fd5b8063c8294c5614610494578063d5eccc05146104a7578063dd9846b9146104ba578063df5cf723146104e257600080fd5b8063b6904b78116100de578063b6904b7814610448578063bc9a40c31461045b578063bd29b8cd1461046e578063c601527d1461048157600080fd5b806381c07502146103c8578063ac6bfb03146103e8578063adc804da1461040857600080fd5b80634bd26e091161017c57806366acfefe1161014b57806366acfefe146103315780636d14a9871461035c5780637c1723471461039b5780637ed9430f146103b557600080fd5b80634bd26e09146102cb5780635401ed27146102fc5780635e5a67751461030f5780635f1f2d771461031e57600080fd5b806320b66298116101b857806320b662981461025157806325504777146102665780632cd95940146102875780633ca5a5f5146102a757600080fd5b80630491b41c146101df57806308732461146102055780631f9b74e014610226575b600080fd5b6101f26101ed366004612bd0565b610555565b6040519081526020015b60405180910390f35b610218610213366004612beb565b610576565b6040516101fc929190612c15565b610239610234366004612c4f565b6105c0565b6040516001600160601b0390911681526020016101fc565b61026461025f366004612cca565b610607565b005b610279610274366004612d8b565b610927565b6040516101fc929190612e2a565b61029a610295366004612e4f565b610be9565b6040516101fc9190612e7b565b6101f26102b5366004612bd0565b60ff166000908152610181602052604090205490565b6101f26102d9366004612e4f565b60009182526101806020908152604080842060ff93909316845291905290205490565b61023961030a366004612e4f565b610c89565b6101f2670de0b6b3a764000081565b61026461032c366004612f84565b610ca2565b61034461033f366004612d8b565b610fdc565b6040516001600160c01b0390911681526020016101fc565b6103837f000000000000000000000000c3e53f4d16ae77db1c982e75a937b9f60fe6369081565b6040516001600160a01b0390911681526020016101fc565b6103a3602081565b60405160ff90911681526020016101fc565b6102396103c336600461302c565b61112d565b6103db6103d6366004613059565b611161565b6040516101fc91906130ab565b6103fb6103f63660046130e9565b6113ab565b6040516101fc919061311c565b61041b610416366004612beb565b611444565b6040805182516001600160a01b031681526020928301516001600160601b031692810192909252016101fc565b6103fb610456366004612beb565b6114bf565b610264610469366004613168565b611557565b61026461047c366004613192565b61163e565b61026461048f36600461325e565b611762565b6102396104a23660046132ab565b611844565b6102396104b5366004612bd0565b6118c7565b6104cd6104c83660046132e7565b611938565b60405163ffffffff90911681526020016101fc565b6103837f000000000000000000000000cf7ed3acca5a467e9e704c703e8d87f634fb0fc981565b610239610517366004613323565b61194d565b6103fb61052a366004612e4f565b6119e3565b61023961053d3660046132e7565b611aca565b610264610550366004613365565b611b2c565b600060808260ff16610100811061056e5761056e6133c2565b015492915050565b610181602052816000526040600020818154811061059357600080fd5b6000918252602090912001546001600160a01b0381169250600160a01b90046001600160601b0316905082565b6000826105cc81611c9e565b6105f15760405162461bcd60e51b81526004016105e8906133d8565b60405180910390fd5b60006105fd8585611cc1565b5095945050505050565b7f000000000000000000000000c3e53f4d16ae77db1c982e75a937b9f60fe636906001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610665573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106899190613429565b6001600160a01b0316336001600160a01b0316146106b95760405162461bcd60e51b81526004016105e890613446565b846106c381611c9e565b6106df5760405162461bcd60e51b81526004016105e8906133d8565b8380610755576040805162461bcd60e51b81526020600482015260248101919091527f5374616b6552656769737472792e6d6f6469667953747261746567795061726160448201527f6d733a206e6f20737472617465677920696e64696365732070726f766964656460648201526084016105e8565b8281146107ca5760405162461bcd60e51b815260206004820152603960248201527f5374616b6552656769737472792e6d6f6469667953747261746567795061726160448201527f6d733a20696e707574206c656e677468206d69736d617463680000000000000060648201526084016105e8565b60ff8716600090815261018160205260408120905b8281101561091c578585828181106107f9576107f96133c2565b905060200201602081019061080e91906134c2565b82898984818110610821576108216133c2565b9050602002013581548110610838576108386133c2565b9060005260206000200160000160146101000a8154816001600160601b0302191690836001600160601b031602179055508860ff167f11a5641322da1dff56a4b66eaac31ffa465295ece907cd163437793b4d009a75838a8a858181106108a1576108a16133c2565b90506020020135815481106108b8576108b86133c2565b6000918252602090912001546001600160a01b03168888858181106108df576108df6133c2565b90506020020160208101906108f491906134c2565b604051610902929190612c15565b60405180910390a280610914816134f3565b9150506107df565b505050505050505050565b606080336001600160a01b037f000000000000000000000000c3e53f4d16ae77db1c982e75a937b9f60fe6369016146109725760405162461bcd60e51b81526004016105e89061350e565b6000836001600160401b0381111561098c5761098c612ef3565b6040519080825280602002602001820160405280156109b5578160200160208202803683370190505b5090506000846001600160401b038111156109d2576109d2612ef3565b6040519080825280602002602001820160405280156109fb578160200160208202803683370190505b50905060005b85811015610bdb576000878783818110610a1d57610a1d6133c2565b919091013560f81c9150610a32905081611c9e565b610a9c5760405162461bcd60e51b815260206004820152603560248201527f5374616b6552656769737472792e72656769737465724f70657261746f723a206044820152741c5d5bdc9d5b48191bd95cc81b9bdd08195e1a5cdd605a1b60648201526084016105e8565b600080610aa9838d611cc1565b9150915080610b465760405162461bcd60e51b815260206004820152605b60248201527f5374616b6552656769737472792e72656769737465724f70657261746f723a2060448201527f4f70657261746f7220646f6573206e6f74206d656574206d696e696d756d207360648201527f74616b6520726571756972656d656e7420666f722071756f72756d0000000000608482015260a4016105e8565b6000610b538c8585611ea7565b905082878681518110610b6857610b686133c2565b60200260200101906001600160601b031690816001600160601b031681525050610b92848261212b565b868681518110610ba457610ba46133c2565b60200260200101906001600160601b031690816001600160601b031681525050505050508080610bd3906134f3565b915050610a01565b509097909650945050505050565b60008281526101806020908152604080832060ff851684528252808320805482518185028101850190935280835260609492939192909184015b82821015610c7c576000848152602090819020604080516060810182529185015463ffffffff8082168452600160201b82041683850152600160401b90046001600160601b031690820152825260019092019101610c23565b5050505090505b92915050565b600080610c9684846119e3565b60400151949350505050565b7f000000000000000000000000c3e53f4d16ae77db1c982e75a937b9f60fe636906001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610d00573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d249190613429565b6001600160a01b0316336001600160a01b031614610d545760405162461bcd60e51b81526004016105e890613446565b81610d5e81611c9e565b610d7a5760405162461bcd60e51b81526004016105e8906133d8565b815180610def5760405162461bcd60e51b815260206004820152603d60248201527f5374616b6552656769737472792e72656d6f7665537472617465676965733a2060448201527f6e6f20696e646963657320746f2072656d6f76652070726f766964656400000060648201526084016105e8565b60ff8416600090815261018160205260408120905b82811015610fd4578560ff167f31fa2e2cd280c9375e13ffcf3d81e2378100186e4058f8d3ddb690b82dcd31f783878481518110610e4457610e446133c2565b602002602001015181548110610e5c57610e5c6133c2565b600091825260209182902001546040516001600160a01b0390911681520160405180910390a28560ff167f11a5641322da1dff56a4b66eaac31ffa465295ece907cd163437793b4d009a7583878481518110610eba57610eba6133c2565b602002602001015181548110610ed257610ed26133c2565b600091825260208083209190910154604080516001600160a01b039092168252918101929092520160405180910390a281548290610f1290600190613580565b81548110610f2257610f226133c2565b9060005260206000200182868381518110610f3f57610f3f6133c2565b602002602001015181548110610f5757610f576133c2565b600091825260209091208254910180546001600160a01b0319166001600160a01b03909216918217815591546001600160601b03600160a01b9182900416021790558154829080610faa57610faa613597565b60008281526020812082016000199081019190915501905580610fcc816134f3565b915050610e04565b505050505050565b6000336001600160a01b037f000000000000000000000000c3e53f4d16ae77db1c982e75a937b9f60fe6369016146110265760405162461bcd60e51b81526004016105e89061350e565b6000805b838110156105fd576000858583818110611046576110466133c2565b919091013560f81c915061105b905081611c9e565b6110cd5760405162461bcd60e51b815260206004820152603860248201527f5374616b6552656769737472792e7570646174654f70657261746f725374616b60448201527f653a2071756f72756d20646f6573206e6f74206578697374000000000000000060648201526084016105e8565b6000806110da838b611cc1565b91509150806110fc5760009150600160ff84161b6001600160c01b0386161794505b60006111098a8585611ea7565b9050611115848261212b565b50505050508080611125906134f3565b91505061102a565b600081610100811061113e57600080fd5b60029182820401919006600c02915054906101000a90046001600160601b031681565b60606000826001600160401b0381111561117d5761117d612ef3565b6040519080825280602002602001820160405280156111a6578160200160208202803683370190505b50905060005b838110156113a05760008585838181106111c8576111c86133c2565b919091013560f81c91505063ffffffff871660808261010081106111ee576111ee6133c2565b01600081548110611201576112016133c2565b60009182526020909120015463ffffffff1611156112ad5760405162461bcd60e51b815260206004820152605b60248201527f5374616b6552656769737472792e676574546f74616c5374616b65496e64696360448201527f65734174426c6f636b4e756d6265723a2071756f72756d20686173206e6f207360648201527f74616b6520686973746f727920617420626c6f636b4e756d6265720000000000608482015260a4016105e8565b600060808260ff1661010081106112c6576112c66133c2565b0154905060005b8181101561138a578863ffffffff1660808460ff1661010081106112f3576112f36133c2565b0160016113008486613580565b61130a9190613580565b8154811061131a5761131a6133c2565b60009182526020909120015463ffffffff161161137857600161133d8284613580565b6113479190613580565b858581518110611359576113596133c2565b602002602001019063ffffffff16908163ffffffff168152505061138a565b80611382816134f3565b9150506112cd565b5050508080611398906134f3565b9150506111ac565b5090505b9392505050565b6040805160608101825260008082526020808301829052828401829052858252610180815283822060ff881683529052919091208054839081106113f1576113f16133c2565b600091825260209182902060408051606081018252929091015463ffffffff8082168452600160201b82041693830193909352600160401b9092046001600160601b031691810191909152949350505050565b604080518082019091526000808252602082015260ff831660009081526101816020526040902080548390811061147d5761147d6133c2565b6000918252602091829020604080518082019091529101546001600160a01b0381168252600160a01b90046001600160601b0316918101919091529392505050565b604080516060810182526000808252602082018190529181019190915260808360ff1661010081106114f3576114f36133c2565b018281548110611505576115056133c2565b600091825260209182902060408051606081018252929091015463ffffffff8082168452600160201b82041693830193909352600160401b9092046001600160601b0316918101919091529392505050565b7f000000000000000000000000c3e53f4d16ae77db1c982e75a937b9f60fe636906001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156115b5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115d99190613429565b6001600160a01b0316336001600160a01b0316146116095760405162461bcd60e51b81526004016105e890613446565b8161161381611c9e565b61162f5760405162461bcd60e51b81526004016105e8906133d8565b61163983836122cc565b505050565b336001600160a01b037f000000000000000000000000c3e53f4d16ae77db1c982e75a937b9f60fe6369016146116865760405162461bcd60e51b81526004016105e89061350e565b60005b8181101561175c5760008383838181106116a5576116a56133c2565b919091013560f81c91506116ba905081611c9e565b61172c5760405162461bcd60e51b815260206004820152603760248201527f5374616b6552656769737472792e646572656769737465724f70657261746f7260448201527f3a2071756f72756d20646f6573206e6f7420657869737400000000000000000060648201526084016105e8565b600061173a86836000611ea7565b9050611746828261212b565b5050508080611754906134f3565b915050611689565b50505050565b7f000000000000000000000000c3e53f4d16ae77db1c982e75a937b9f60fe636906001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156117c0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117e49190613429565b6001600160a01b0316336001600160a01b0316146118145760405162461bcd60e51b81526004016105e890613446565b8161181e81611c9e565b61183a5760405162461bcd60e51b81526004016105e8906133d8565b6116398383612361565b60008060808560ff16610100811061185e5761185e6133c2565b018381548110611870576118706133c2565b600091825260209182902060408051606081018252919092015463ffffffff8082168352600160201b820416938201939093526001600160601b03600160401b90930492909216908201529050610c968185612748565b600060808260ff1661010081106118e0576118e06133c2565b01600160808460ff1661010081106118fa576118fa6133c2565b01546119069190613580565b81548110611916576119166133c2565b600091825260209091200154600160401b90046001600160601b031692915050565b60006119458484846128d3565b949350505050565b60008281526101806020908152604080832060ff88168452909152812080548291908490811061197f5761197f6133c2565b600091825260209182902060408051606081018252919092015463ffffffff8082168352600160201b820416938201939093526001600160601b03600160401b909304929092169082015290506119d68186612748565b6040015195945050505050565b604080516060808201835260008083526020808401829052838501829052868252610180815284822060ff87168352815284822054855193840186528284529083018290529382015290919081611a3d579150610c839050565b60008581526101806020908152604080832060ff881684529091529020611a65600184613580565b81548110611a7557611a756133c2565b600091825260209182902060408051606081018252919092015463ffffffff8082168352600160201b820416938201939093526001600160601b03600160401b90930492909216908201529250610c83915050565b60008381526101806020908152604080832060ff861684529091528120611af28585856128d3565b63ffffffff1681548110611b0857611b086133c2565b600091825260209091200154600160401b90046001600160601b0316949350505050565b336001600160a01b037f000000000000000000000000c3e53f4d16ae77db1c982e75a937b9f60fe636901614611b745760405162461bcd60e51b81526004016105e89061350e565b611b7d83611c9e565b15611be85760405162461bcd60e51b815260206004820152603560248201527f5374616b6552656769737472792e696e697469616c697a6551756f72756d3a2060448201527471756f72756d20616c72656164792065786973747360581b60648201526084016105e8565b611bf28382612361565b611bfc83836122cc565b60808360ff166101008110611c1357611c136133c2565b6040805160608101825263ffffffff4381168252600060208084018281529484018281529690950180546001810182559082529490209151919093018054925194516001600160601b0316600160401b02600160401b600160a01b0319958516600160201b0267ffffffffffffffff1990941692909416919091179190911792909216179055505050565b600060808260ff166101008110611cb757611cb76133c2565b0154151592915050565b600080600080611ce18660ff166000908152610181602052604090205490565b604080518082019091526000808252602082015290915060005b82811015611e465760ff8816600090815261018160205260409020805482908110611d2857611d286133c2565b6000918252602080832060408051808201825293909101546001600160a01b03808216808652600160a01b9092046001600160601b031693850193909352905163778e55f360e01b81528b8316600482015260248101919091529194507f000000000000000000000000cf7ed3acca5a467e9e704c703e8d87f634fb0fc9169063778e55f390604401602060405180830381865afa158015611dce573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611df291906135ad565b90508015611e3357670de0b6b3a764000083602001516001600160601b031682611e1c91906135c6565b611e2691906135e5565b611e309086613607565b94505b5080611e3e816134f3565b915050611cfb565b506000808860ff166101008110611e5f57611e5f6133c2565b60029182820401919006600c029054906101000a90046001600160601b03166001600160601b0316846001600160601b031610159050838195509550505050505b9250929050565b60008381526101806020908152604080832060ff86168452909152812054819080611f6d5760008681526101806020908152604080832060ff891684528252808320815160608101835263ffffffff43811682528185018681526001600160601b03808c16958401958652845460018101865594885295909620915191909201805495519351909416600160401b02600160401b600160a01b0319938316600160201b0267ffffffffffffffff19909616919092161793909317169190911790556120d1565b60008681526101806020908152604080832060ff891684529091528120611f95600184613580565b81548110611fa557611fa56133c2565b600091825260209091200180546001600160601b03600160401b909104811694509091508516831415611fde57600093505050506113a4565b80544363ffffffff90811691161415612018578054600160401b600160a01b031916600160401b6001600160601b038716021781556120cf565b805467ffffffff000000001916600160201b4363ffffffff90811682810293909317845560008a81526101806020908152604080832060ff8d168452825280832081516060810183529687528683018481526001600160601b038d81169389019384528254600181018455928652939094209651960180549351915196851667ffffffffffffffff1990941693909317931690930291909117600160401b600160a01b031916600160401b93909216929092021790555b505b6040805160ff871681526001600160601b038616602082015287917f2f527d527e95d8fe40aec55377743bb779087da3f6d0d08f12e36444da62327d910160405180910390a26121218285612b74565b9695505050505050565b60008060808460ff166101008110612145576121456133c2565b015490506000608060ff86166101008110612162576121626133c2565b0161216e600184613580565b8154811061217e5761217e6133c2565b90600052602060002001905083600014156121ad5754600160401b90046001600160601b03169150610c839050565b80546000906121cc90600160401b90046001600160601b031686612b8c565b82549091504363ffffffff90811691161415612209578154600160401b600160a01b031916600160401b6001600160601b038316021782556122c3565b815467ffffffff000000001916600160201b4363ffffffff1602178255608060ff8716610100811061223d5761223d6133c2565b6040805160608101825263ffffffff4381168252600060208084018281526001600160601b03808a16968601968752979096018054600181018255908352912092519201805494519351909516600160401b02600160401b600160a01b0319938216600160201b0267ffffffffffffffff19909516929091169190911792909217161790555b95945050505050565b8060008360ff1661010081106122e4576122e46133c2565b60029182820401919006600c026101000a8154816001600160601b0302191690836001600160601b031602179055508160ff167f26eecff2b70b0a71104ff4d940ba7162d23a95c248771fc487a7be17a596b3cf8260405161235591906001600160601b0391909116815260200190565b60405180910390a25050565b60008151116123c65760405162461bcd60e51b815260206004820152603860248201526000805160206136cf83398151915260448201527f3a206e6f20737472617465676965732070726f7669646564000000000000000060648201526084016105e8565b805160ff831660009081526101816020908152604090912054906123ea8383613632565b111561245a5760405162461bcd60e51b815260206004820152604560248201526000805160206136cf83398151915260448201527f3a20657863656564204d41585f5745494748494e475f46554e4354494f4e5f4c60648201526408a9c8ea8960db1b608482015260a4016105e8565b60005b828110156127415760005b6124728284613632565b8110156125545784828151811061248b5761248b6133c2565b6020026020010151600001516001600160a01b031661018160008860ff1660ff16815260200190815260200160002082815481106124cb576124cb6133c2565b6000918252602090912001546001600160a01b031614156125425760405162461bcd60e51b815260206004820152603d60248201526000805160206136cf83398151915260448201527f3a2063616e6e6f74206164642073616d6520737472617465677920327800000060648201526084016105e8565b8061254c816134f3565b915050612468565b506000848281518110612569576125696133c2565b6020026020010151602001516001600160601b0316116125ee5760405162461bcd60e51b815260206004820152604660248201526000805160206136cf83398151915260448201527f3a2063616e6e6f74206164642073747261746567792077697468207a65726f206064820152651dd95a59da1d60d21b608482015260a4016105e8565b60ff85166000908152610181602052604090208451859083908110612615576126156133c2565b6020908102919091018101518254600181018455600093845292829020815191909201516001600160601b0316600160a01b026001600160a01b0390911617910155835160ff8616907f10565e56cacbf32eca267945f054fec02e59750032d113d3302182ad967f540490869084908110612692576126926133c2565b602090810291909101810151516040516001600160a01b0390911681520160405180910390a28460ff167f11a5641322da1dff56a4b66eaac31ffa465295ece907cd163437793b4d009a758583815181106126ef576126ef6133c2565b60200260200101516000015186848151811061270d5761270d6133c2565b602002602001015160200151604051612727929190612c15565b60405180910390a280612739816134f3565b91505061245d565b5050505050565b816000015163ffffffff168163ffffffff1610156127f45760405162461bcd60e51b815260206004820152606060248201527f5374616b6552656769737472792e5f76616c69646174654f70657261746f725360448201527f74616b654174426c6f636b4e756d6265723a206f70657261746f725374616b6560648201527f5570646174652069732066726f6d20616674657220626c6f636b4e756d626572608482015260a4016105e8565b602082015163ffffffff16158061281a5750816020015163ffffffff168163ffffffff16105b6128cf5760405162461bcd60e51b815260206004820152607460248201527f5374616b6552656769737472792e5f76616c69646174654f70657261746f725360448201527f74616b654174426c6f636b4e756d6265723a2074686572652069732061206e6560648201527f776572206f70657261746f725374616b6555706461746520617661696c61626c60848201527332903132b337b93290313637b1b5a73ab6b132b960611b60a482015260c4016105e8565b5050565b60008381526101806020908152604080832060ff86168452909152812054815b81811015612aaf5760008681526101806020908152604080832060ff89168452909152902063ffffffff851690600161292c8486613580565b6129369190613580565b81548110612946576129466133c2565b60009182526020909120015463ffffffff1611612a9d5760008681526101806020908152604080832060ff89168452909152812060016129868486613580565b6129909190613580565b815481106129a0576129a06133c2565b600091825260209091200154600160201b900463ffffffff1690508015806129d357508463ffffffff168163ffffffff16115b612a7d5760405162461bcd60e51b815260206004820152606960248201527f5374616b6552656769737472792e5f6765745374616b65557064617465496e6460448201527f6578466f724f70657261746f724174426c6f636b4e756d6265723a206f70657260648201527f61746f72496420686173206e6f207374616b652075706461746520617420626c60848201526837b1b5a73ab6b132b960b91b60a482015260c4016105e8565b6001612a898385613580565b612a939190613580565b93505050506113a4565b80612aa7816134f3565b9150506128f3565b5060405162461bcd60e51b815260206004820152608160248201527f5374616b6552656769737472792e5f6765745374616b65557064617465496e6460448201527f6578466f724f70657261746f724174426c6f636b4e756d6265723a206e6f207360648201527f74616b652075706461746520666f756e6420666f72206f70657261746f72496460848201527f20616e642071756f72756d4e756d62657220617420626c6f636b206e756d626560a4820152603960f91b60c482015260e4016105e8565b60006113a46001600160601b0380851690841661364a565b600080821215612bb057612b9f82613689565b612ba990846136a6565b9050610c83565b612ba98284613607565b803560ff81168114612bcb57600080fd5b919050565b600060208284031215612be257600080fd5b6113a482612bba565b60008060408385031215612bfe57600080fd5b612c0783612bba565b946020939093013593505050565b6001600160a01b039290921682526001600160601b0316602082015260400190565b6001600160a01b0381168114612c4c57600080fd5b50565b60008060408385031215612c6257600080fd5b612c6b83612bba565b91506020830135612c7b81612c37565b809150509250929050565b60008083601f840112612c9857600080fd5b5081356001600160401b03811115612caf57600080fd5b6020830191508360208260051b8501011115611ea057600080fd5b600080600080600060608688031215612ce257600080fd5b612ceb86612bba565b945060208601356001600160401b0380821115612d0757600080fd5b612d1389838a01612c86565b90965094506040880135915080821115612d2c57600080fd5b50612d3988828901612c86565b969995985093965092949392505050565b60008083601f840112612d5c57600080fd5b5081356001600160401b03811115612d7357600080fd5b602083019150836020828501011115611ea057600080fd5b60008060008060608587031215612da157600080fd5b8435612dac81612c37565b93506020850135925060408501356001600160401b03811115612dce57600080fd5b612dda87828801612d4a565b95989497509550505050565b600081518084526020808501945080840160005b83811015612e1f5781516001600160601b031687529582019590820190600101612dfa565b509495945050505050565b604081526000612e3d6040830185612de6565b82810360208401526122c38185612de6565b60008060408385031215612e6257600080fd5b82359150612e7260208401612bba565b90509250929050565b6020808252825182820181905260009190848201906040850190845b81811015612ee757612ed483855163ffffffff808251168352806020830151166020840152506001600160601b0360408201511660408301525050565b9284019260609290920191600101612e97565b50909695505050505050565b634e487b7160e01b600052604160045260246000fd5b604080519081016001600160401b0381118282101715612f2b57612f2b612ef3565b60405290565b604051601f8201601f191681016001600160401b0381118282101715612f5957612f59612ef3565b604052919050565b60006001600160401b03821115612f7a57612f7a612ef3565b5060051b60200190565b60008060408385031215612f9757600080fd5b612fa083612bba565b91506020808401356001600160401b03811115612fbc57600080fd5b8401601f81018613612fcd57600080fd5b8035612fe0612fdb82612f61565b612f31565b81815260059190911b82018301908381019088831115612fff57600080fd5b928401925b8284101561301d57833582529284019290840190613004565b80955050505050509250929050565b60006020828403121561303e57600080fd5b5035919050565b803563ffffffff81168114612bcb57600080fd5b60008060006040848603121561306e57600080fd5b61307784613045565b925060208401356001600160401b0381111561309257600080fd5b61309e86828701612d4a565b9497909650939450505050565b6020808252825182820181905260009190848201906040850190845b81811015612ee757835163ffffffff16835292840192918401916001016130c7565b6000806000606084860312156130fe57600080fd5b61310784612bba565b95602085013595506040909401359392505050565b815163ffffffff9081168252602080840151909116908201526040808301516001600160601b03169082015260608101610c83565b80356001600160601b0381168114612bcb57600080fd5b6000806040838503121561317b57600080fd5b61318483612bba565b9150612e7260208401613151565b6000806000604084860312156131a757600080fd5b8335925060208401356001600160401b0381111561309257600080fd5b600082601f8301126131d557600080fd5b813560206131e5612fdb83612f61565b82815260069290921b8401810191818101908684111561320457600080fd5b8286015b8481101561325357604081890312156132215760008081fd5b613229612f09565b813561323481612c37565b8152613241828601613151565b81860152835291830191604001613208565b509695505050505050565b6000806040838503121561327157600080fd5b61327a83612bba565b915060208301356001600160401b0381111561329557600080fd5b6132a1858286016131c4565b9150509250929050565b6000806000606084860312156132c057600080fd5b6132c984612bba565b92506132d760208501613045565b9150604084013590509250925092565b6000806000606084860312156132fc57600080fd5b8335925061330c60208501612bba565b915061331a60408501613045565b90509250925092565b6000806000806080858703121561333957600080fd5b61334285612bba565b935061335060208601613045565b93969395505050506040820135916060013590565b60008060006060848603121561337a57600080fd5b61338384612bba565b925061339160208501613151565b915060408401356001600160401b038111156133ac57600080fd5b6133b8868287016131c4565b9150509250925092565b634e487b7160e01b600052603260045260246000fd5b60208082526031908201527f5374616b6552656769737472792e71756f72756d4578697374733a2071756f726040820152701d5b48191bd95cc81b9bdd08195e1a5cdd607a1b606082015260800190565b60006020828403121561343b57600080fd5b81516113a481612c37565b60208082526056908201527f5374616b6552656769737472792e6f6e6c79436f6f7264696e61746f724f776e60408201527f65723a2063616c6c6572206973206e6f7420746865206f776e6572206f6620746060820152753432903932b3b4b9ba393ca1b7b7b93234b730ba37b960511b608082015260a00190565b6000602082840312156134d457600080fd5b6113a482613151565b634e487b7160e01b600052601160045260246000fd5b6000600019821415613507576135076134dd565b5060010190565b6020808252604c908201527f5374616b6552656769737472792e6f6e6c795265676973747279436f6f72646960408201527f6e61746f723a2063616c6c6572206973206e6f7420746865205265676973747260608201526b3ca1b7b7b93234b730ba37b960a11b608082015260a00190565b600082821015613592576135926134dd565b500390565b634e487b7160e01b600052603160045260246000fd5b6000602082840312156135bf57600080fd5b5051919050565b60008160001904831182151516156135e0576135e06134dd565b500290565b60008261360257634e487b7160e01b600052601260045260246000fd5b500490565b60006001600160601b03808316818516808303821115613629576136296134dd565b01949350505050565b60008219821115613645576136456134dd565b500190565b60008083128015600160ff1b850184121615613668576136686134dd565b6001600160ff1b0384018313811615613683576136836134dd565b50500390565b6000600160ff1b82141561369f5761369f6134dd565b5060000390565b60006001600160601b03838116908316818110156136c6576136c66134dd565b03939250505056fe5374616b6552656769737472792e5f6164645374726174656779506172616d73a2646970667358221220c3bccee685375c15dd7188386e181764cbb45931cf084c6514caf0294e332f0764736f6c634300080c0033","storage":{}},"0x860b6912c2d0337ef05bbc89b0c2cb6cbaeab4a5":{"nonce":0,"balance":"0x8ac7230489e80000","code":"0x","storage":{}},"0x8a791620dd6260079bf849dc5567adc3f2fdc318":{"nonce":1,"balance":"0x0","code":"0x608060405234801561001057600080fd5b50600436106100575760003560e01c80633659cfe61461005c5780635c60da1b14610071578063715018a61461009a5780638da5cb5b146100a2578063f2fde38b146100b3575b600080fd5b61006f61006a3660046102ee565b6100c6565b005b6001546001600160a01b03165b6040516001600160a01b03909116815260200160405180910390f35b61006f61010e565b6000546001600160a01b031661007e565b61006f6100c13660046102ee565b610122565b6100ce6101af565b6100d781610209565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b6101166101af565b610120600061029e565b565b61012a6101af565b6001600160a01b0381166101945760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084015b60405180910390fd5b61019d8161029e565b50565b6001600160a01b03163b151590565b6000546001600160a01b031633146101205760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161018b565b6001600160a01b0381163b61027c5760405162461bcd60e51b815260206004820152603360248201527f5570677261646561626c65426561636f6e3a20696d706c656d656e746174696f6044820152721b881a5cc81b9bdd08184818dbdb9d1c9858dd606a1b606482015260840161018b565b600180546001600160a01b0319166001600160a01b0392909216919091179055565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60006020828403121561030057600080fd5b81356001600160a01b038116811461031757600080fd5b939250505056fea2646970667358221220a22223d3e2a2d861ad54e68b7bc44b4d82a5a12a0bcca5c3404502bb1b430c5c64736f6c634300080c0033","storage":{"0x0":"0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266","0x1":"0x2279b7a0a67db372996a5fab50d91eaa73d2ebe6"}},"0x8f86403a4de0bb5791fa46b8e795c547942fe4cf":{"nonce":1,"balance":"0x0","code":"0x608060405234801561001057600080fd5b50600436106100f55760003560e01c8063a50a640e11610097578063ccd3bd9e11610066578063ccd3bd9e1461020c578063d5b206a31461021f578063e481af9d14610232578063f2fde38b1461023a57600080fd5b8063a50a640e1461019e578063b3a9e53b146101c5578063b708c083146101e6578063c4d66de8146101f957600080fd5b8063750521f5116100d3578063750521f5146101405780638da5cb5b146101535780639926ee7d14610178578063a364f4da1461018b57600080fd5b806333cfb7b7146100fa57806338c8ee6414610123578063715018a614610138575b600080fd5b61010d61010836600461293b565b61024d565b60405161011a9190612958565b60405180910390f35b61013661013136600461293b565b610720565b005b6101366107a0565b61013661014e366004612a58565b6107b4565b6034546001600160a01b03165b6040516001600160a01b03909116815260200161011a565b610136610186366004612aa0565b61083d565b61013661019936600461293b565b610909565b6101607f000000000000000000000000e6e340d132b5f46d1e472debcd681b2abc16e57e81565b6101d86101d3366004612b78565b61099f565b60405190815260200161011a565b6101d86101f4366004612bc5565b6109ce565b61013661020736600461293b565b610a8e565b6101d861021a366004612c67565b610b9b565b61013661022d366004612cb5565b610cf9565b61010d610d6a565b61013661024836600461293b565b611133565b6040516309aa152760e11b81526001600160a01b0382811660048301526060916000917f000000000000000000000000c3e53f4d16ae77db1c982e75a937b9f60fe6369016906313542a4e90602401602060405180830381865afa1580156102b9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906102dd9190612d0b565b60405163871ef04960e01b8152600481018290529091506000906001600160a01b037f000000000000000000000000c3e53f4d16ae77db1c982e75a937b9f60fe63690169063871ef04990602401602060405180830381865afa158015610348573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061036c9190612d24565b90506001600160c01b038116158061040657507f000000000000000000000000c3e53f4d16ae77db1c982e75a937b9f60fe636906001600160a01b0316639aa1653d6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156103dd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104019190612d4d565b60ff16155b156104265760408051600080825260208201909252905b50949350505050565b600061043a826001600160c01b03166111a9565b90506000805b8251811015610510577f000000000000000000000000a82ff9afd8f496c3d6ac40e2a0f282e47488cfc96001600160a01b0316633ca5a5f584838151811061048a5761048a612d70565b01602001516040516001600160e01b031960e084901b16815260f89190911c6004820152602401602060405180830381865afa1580156104ce573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104f29190612d0b565b6104fc9083612d9c565b91508061050881612db4565b915050610440565b506000816001600160401b0381111561052b5761052b6129a5565b604051908082528060200260200182016040528015610554578160200160208202803683370190505b5090506000805b845181101561071357600085828151811061057857610578612d70565b0160200151604051633ca5a5f560e01b815260f89190911c6004820181905291506000906001600160a01b037f000000000000000000000000a82ff9afd8f496c3d6ac40e2a0f282e47488cfc91690633ca5a5f590602401602060405180830381865afa1580156105ed573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106119190612d0b565b905060005b818110156106fd576040516356e4026d60e11b815260ff84166004820152602481018290527f000000000000000000000000a82ff9afd8f496c3d6ac40e2a0f282e47488cfc96001600160a01b03169063adc804da906044016040805180830381865afa15801561068b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106af9190612dcf565b600001518686815181106106c5576106c5612d70565b6001600160a01b0390921660209283029190910190910152846106e781612db4565b95505080806106f590612db4565b915050610616565b505050808061070b90612db4565b91505061055b565b5090979650505050505050565b336001600160a01b037f000000000000000000000000e6e340d132b5f46d1e472debcd681b2abc16e57e161461079d5760405162461bcd60e51b815260206004820152601f60248201527f5461736b206d616e61676572206d757374206265207468652063616c6c65720060448201526064015b60405180910390fd5b50565b6107a8611206565b6107b26000611260565b565b6107bc611206565b60405163a98fb35560e01b81526001600160a01b037f000000000000000000000000cf7ed3acca5a467e9e704c703e8d87f634fb0fc9169063a98fb35590610808908490600401612e96565b600060405180830381600087803b15801561082257600080fd5b505af1158015610836573d6000803e3d6000fd5b5050505050565b336001600160a01b037f000000000000000000000000c3e53f4d16ae77db1c982e75a937b9f60fe6369016146108855760405162461bcd60e51b815260040161079490612ea9565b604051639926ee7d60e01b81526001600160a01b037f000000000000000000000000cf7ed3acca5a467e9e704c703e8d87f634fb0fc91690639926ee7d906108d39085908590600401612f21565b600060405180830381600087803b1580156108ed57600080fd5b505af1158015610901573d6000803e3d6000fd5b505050505050565b336001600160a01b037f000000000000000000000000c3e53f4d16ae77db1c982e75a937b9f60fe6369016146109515760405162461bcd60e51b815260040161079490612ea9565b6040516351b27a6d60e11b81526001600160a01b0382811660048301527f000000000000000000000000cf7ed3acca5a467e9e704c703e8d87f634fb0fc9169063a364f4da90602401610808565b63ffffffff82166000908152602081815260408083206001600160401b03851684529091529020545b92915050565b60008080806109e06020890189612f6c565b63ffffffff1663ffffffff1681526020019081526020016000206000876020016020810190610a0f9190612f89565b6001600160401b03168152602081019190915260400160002054905080610a7a5782610a6f5760405162461bcd60e51b815260206004820152600f60248201526e115b5c1d1e481859dc99595b595b9d608a1b6044820152606401610794565b610a7a8685856112b2565b610a848686610b9b565b9695505050505050565b600154610100900460ff1615808015610aab57506001805460ff16105b80610ac45750303b158015610ac457506001805460ff16145b610b275760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610794565b6001805460ff1916811790558015610b49576001805461ff0019166101001790555b610b5282611260565b8015610b97576001805461ff00191681556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050565b6000808080610bad6020870187612f6c565b63ffffffff1663ffffffff1681526020019081526020016000206000856020016020810190610bdc9190612f89565b6001600160401b03166001600160401b0316815260200190815260200160002054905083606001358114610c525760405162461bcd60e51b815260206004820152601760248201527f4d69736d61746368696e6720737461746520726f6f74730000000000000000006044820152606401610794565b610cf1610c62602085018561293b565b602085013583610c756040880188612fa4565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250610cb7925050506060890189612fa4565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506112c392505050565b949350505050565b610d038282611400565b610d405760405162461bcd60e51b815260206004820152600e60248201526d145d5bdc9d5b481b9bdd081b595d60921b6044820152606401610794565b610b97610d506020840184612f6c565b610d606040850160208601612f89565b8460600135611535565b606060007f000000000000000000000000c3e53f4d16ae77db1c982e75a937b9f60fe636906001600160a01b0316639aa1653d6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610dcc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610df09190612d4d565b60ff16905080610e0e57505060408051600081526020810190915290565b6000805b82811015610ec357604051633ca5a5f560e01b815260ff821660048201527f000000000000000000000000a82ff9afd8f496c3d6ac40e2a0f282e47488cfc96001600160a01b031690633ca5a5f590602401602060405180830381865afa158015610e81573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ea59190612d0b565b610eaf9083612d9c565b915080610ebb81612db4565b915050610e12565b506000816001600160401b03811115610ede57610ede6129a5565b604051908082528060200260200182016040528015610f07578160200160208202803683370190505b5090506000805b7f000000000000000000000000c3e53f4d16ae77db1c982e75a937b9f60fe636906001600160a01b0316639aa1653d6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610f6c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f909190612d4d565b60ff1681101561112957604051633ca5a5f560e01b815260ff821660048201526000907f000000000000000000000000a82ff9afd8f496c3d6ac40e2a0f282e47488cfc96001600160a01b031690633ca5a5f590602401602060405180830381865afa158015611004573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110289190612d0b565b905060005b81811015611114576040516356e4026d60e11b815260ff84166004820152602481018290527f000000000000000000000000a82ff9afd8f496c3d6ac40e2a0f282e47488cfc96001600160a01b03169063adc804da906044016040805180830381865afa1580156110a2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110c69190612dcf565b600001518585815181106110dc576110dc612d70565b6001600160a01b0390921660209283029190910190910152836110fe81612db4565b945050808061110c90612db4565b91505061102d565b5050808061112190612db4565b915050610f0e565b5090949350505050565b61113b611206565b6001600160a01b0381166111a05760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610794565b61079d81611260565b60606000805b6101008110156111ff576001811b9150838216156111ef57828160f81b6040516020016111dd929190612ff1565b60405160208183030381529060405292505b6111f881612db4565b90506111af565b5050919050565b6034546001600160a01b031633146107b25760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610794565b603480546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b816112bd8482610cf9565b50505050565b6040516bffffffffffffffffffffffff19606087901b16602082015260009081908190611303906034016040516020818303038152906040528688611599565b915091508161134d5760405162461bcd60e51b81526020600482015260166024820152751058d8dbdd5b9d08191bd95cc81b9bdd08195e1a5cdd60521b6044820152606401610794565b6000611358826115c2565b905060008061138d8a60405160200161137391815260200190565b604051602081830303815290604052888560400151611599565b91509150816113de5760405162461bcd60e51b815260206004820152601c60248201527f53746f726167652076616c756520646f6573206e6f74206578697374000000006044820152606401610794565b6113ef6113ea82611686565b6116b9565b955050505050505b95945050505050565b6000807f000000000000000000000000e6e340d132b5f46d1e472debcd681b2abc16e57e6001600160a01b031663292f7a4e61143b866116e8565b438660037f000000000000000000000000e6e340d132b5f46d1e472debcd681b2abc16e57e6001600160a01b031663ef0244586040518163ffffffff1660e01b8152600401602060405180830381865afa15801561149d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114c19190613020565b6114cc90600261303d565b6114d6919061307f565b6040518563ffffffff1660e01b81526004016114f59493929190613236565b6040805180830381865afa158015611511573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061041d9190613395565b63ffffffff83166000818152602081815260408083206001600160401b03871680855290835292819020859055518481529192917fca7171570f4ca232f925661b810636124eaf784a25b7c14e6b34c95b814dfdd8910160405180910390a3505050565b6000606060006115a886611718565b90506115b581868661174a565b9250925050935093915050565b6040805160808101825260008082526020820181905291810182905260608101829052906115ef83611825565b9050604051806080016040528061161f8360008151811061161257611612612d70565b6020026020010151611858565b815260200161163a8360018151811061161257611612612d70565b81526020016116628360028151811061165557611655612d70565b602002602001015161185f565b815260200161167d8360038151811061165557611655612d70565b90529392505050565b6040805180820182526000808252602091820152815180830190925282518252808301908201526060906109c890611961565b60008060006020845111156116cf5760206116d2565b83515b60209485015194036008029390931c9392505050565b6000816040516020016116fb91906133c8565b604051602081830303815290604052805190602001209050919050565b6060818051906020012060405160200161173491815260200190565b6040516020818303038152906040529050919050565b600060606000611759856119e8565b9050600080600061176b848a89611ae2565b8151929550909350915015808061177f5750815b6117cb5760405162461bcd60e51b815260206004820152601a60248201527f50726f76696465642070726f6f6620697320696e76616c69642e0000000000006044820152606401610794565b6000816117e75760405180602001604052806000815250611813565b611813866117f6600188613420565b8151811061180657611806612d70565b6020026020010151611f06565b919b919a509098505050505050505050565b6040805180820182526000808252602091820152815180830190925282518252808301908201526060906109c890611f30565b60006109c8825b60006021826000015111156118b65760405162461bcd60e51b815260206004820152601a60248201527f496e76616c696420524c5020627974657333322076616c75652e0000000000006044820152606401610794565b60008060006118c48561211c565b9194509250905060008160018111156118df576118df613437565b1461192c5760405162461bcd60e51b815260206004820152601a60248201527f496e76616c696420524c5020627974657333322076616c75652e0000000000006044820152606401610794565b600083866020015161193e9190612d9c565b80519091506020841015610a845760208490036101000a90049695505050505050565b606060008060006119718561211c565b91945092509050600081600181111561198c5761198c613437565b146119d95760405162461bcd60e51b815260206004820152601860248201527f496e76616c696420524c502062797465732076616c75652e00000000000000006044820152606401610794565b6113f785602001518484612466565b606060006119f583611825565b9050600081516001600160401b03811115611a1257611a126129a5565b604051908082528060200260200182016040528015611a5757816020015b6040805180820190915260608082526020820152815260200190600190039081611a305790505b50905060005b8251811015611ada576000611a8a848381518110611a7d57611a7d612d70565b6020026020010151611961565b90506040518060400160405280828152602001611aa683611825565b815250838381518110611abb57611abb612d70565b6020026020010181905250508080611ad290612db4565b915050611a5d565b509392505050565b60006060818080611af287612541565b90506000869050600080611b19604051806040016040528060608152602001606081525090565b60005b8c51811015611ede578c8181518110611b3757611b37612d70565b602002602001015191508284611b4d9190612d9c565b9350611b5a600188612d9c565b965083611bb257815180516020909101208514611bad5760405162461bcd60e51b8152602060048201526011602482015270092dcecc2d8d2c840e4dedee840d0c2e6d607b1b6044820152606401610794565b611c6f565b815151602011611c1457815180516020909101208514611bad5760405162461bcd60e51b815260206004820152601b60248201527f496e76616c6964206c6172676520696e7465726e616c206861736800000000006044820152606401610794565b84611c22836000015161267b565b14611c6f5760405162461bcd60e51b815260206004820152601a60248201527f496e76616c696420696e7465726e616c206e6f646520686173680000000000006044820152606401610794565b611c7b60106001612d9c565b8260200151511415611cf4578551841415611c9557611ede565b6000868581518110611ca957611ca9612d70565b602001015160f81c60f81b60f81c9050600083602001518260ff1681518110611cd457611cd4612d70565b60200260200101519050611ce7816126a3565b9650600194505050611ecc565b60028260200151511415611e84576000611d0d836126d9565b9050600081600081518110611d2457611d24612d70565b016020015160f81c90506000611d3b60028361344d565b611d4690600261346f565b90506000611d57848360ff166126fd565b90506000611d658b8a6126fd565b90506000611d738383612733565b905060ff851660021480611d8a575060ff85166003145b15611dc457808351148015611d9f5750808251145b15611db157611dae818b612d9c565b99505b50600160ff1b9950611ede945050505050565b60ff85161580611dd7575060ff85166001145b15611e2d5782518114611df75750600160ff1b9950611ede945050505050565b611e1e8860200151600181518110611e1157611e11612d70565b60200260200101516126a3565b9a509750611ecc945050505050565b60405162461bcd60e51b815260206004820152602660248201527f52656365697665642061206e6f6465207769746820616e20756e6b6e6f776e206044820152650e0e4caccd2f60d31b6064820152608401610794565b60405162461bcd60e51b815260206004820152601d60248201527f526563656976656420616e20756e706172736561626c65206e6f64652e0000006044820152606401610794565b80611ed681612db4565b915050611b1c565b50600160ff1b841486611ef187866126fd565b909e909d50909b509950505050505050505050565b602081015180516060916109c891611f2090600190613420565b81518110611a7d57611a7d612d70565b6060600080611f3e8461211c565b91935090915060019050816001811115611f5a57611f5a613437565b14611fa75760405162461bcd60e51b815260206004820152601760248201527f496e76616c696420524c50206c6973742076616c75652e0000000000000000006044820152606401610794565b6040805160208082526104208201909252600091816020015b6040805180820190915260008082526020820152815260200190600190039081611fc05790505090506000835b865181101561211157602082106120595760405162461bcd60e51b815260206004820152602a60248201527f50726f766964656420524c50206c6973742065786365656473206d6178206c6960448201526939ba103632b733ba341760b11b6064820152608401610794565b6000806120966040518060400160405280858c6000015161207a9190613420565b8152602001858c6020015161208f9190612d9c565b905261211c565b5091509150604051806040016040528083836120b29190612d9c565b8152602001848b602001516120c79190612d9c565b8152508585815181106120dc576120dc612d70565b60209081029190910101526120f2600185612d9c565b93506120fe8183612d9c565b6121089084612d9c565b92505050611fed565b508152949350505050565b6000806000808460000151116121745760405162461bcd60e51b815260206004820152601860248201527f524c50206974656d2063616e6e6f74206265206e756c6c2e00000000000000006044820152606401610794565b6020840151805160001a607f811161219957600060016000945094509450505061245f565b60b781116122155760006121ae608083613420565b9050808760000151116122035760405162461bcd60e51b815260206004820152601960248201527f496e76616c696420524c502073686f727420737472696e672e000000000000006044820152606401610794565b6001955093506000925061245f915050565b60bf811161230457600061222a60b783613420565b90508087600001511161227f5760405162461bcd60e51b815260206004820152601f60248201527f496e76616c696420524c50206c6f6e6720737472696e67206c656e6774682e006044820152606401610794565b600183015160208290036101000a90046122998183612d9c565b8851116122e85760405162461bcd60e51b815260206004820152601860248201527f496e76616c696420524c50206c6f6e6720737472696e672e00000000000000006044820152606401610794565b6122f3826001612d9c565b965094506000935061245f92505050565b60f7811161237f57600061231960c083613420565b90508087600001511161236e5760405162461bcd60e51b815260206004820152601760248201527f496e76616c696420524c502073686f7274206c6973742e0000000000000000006044820152606401610794565b60019550935084925061245f915050565b600061238c60f783613420565b9050808760000151116123e15760405162461bcd60e51b815260206004820152601d60248201527f496e76616c696420524c50206c6f6e67206c697374206c656e6774682e0000006044820152606401610794565b600183015160208290036101000a90046123fb8183612d9c565b8851116124435760405162461bcd60e51b815260206004820152601660248201527524b73b30b634b210292628103637b733903634b9ba1760511b6044820152606401610794565b61244e826001612d9c565b965094506001935061245f92505050565b9193909250565b60606000826001600160401b03811115612482576124826129a5565b6040519080825280601f01601f1916602001820160405280156124ac576020820181803683370190505b5090508051600014156124c057905061253a565b60006124cc8587612d9c565b90506020820160005b6124e0602087613492565b81101561251757825182526124f6602084612d9c565b9250612503602083612d9c565b91508061250f81612db4565b9150506124d5565b5080519151601f86166020036101000a6000190192831692191691909117905290505b9392505050565b606060008251600261255391906134a6565b6001600160401b0381111561256a5761256a6129a5565b6040519080825280601f01601f191660200182016040528015612594576020820181803683370190505b50905060005b83518110156126745760048482815181106125b7576125b7612d70565b01602001516001600160f81b031916901c826125d48360026134a6565b815181106125e4576125e4612d70565b60200101906001600160f81b031916908160001a905350601084828151811061260f5761260f612d70565b0160200151612621919060f81c61344d565b60f81b826126308360026134a6565b61263b906001612d9c565b8151811061264b5761264b612d70565b60200101906001600160f81b031916908160001a9053508061266c81612db4565b91505061259a565b5092915050565b600060208251101561268f57506020015190565b818060200190518101906109c89190612d0b565b600060606020836000015110156126c4576126bd836127af565b90506126d0565b6126cd83611961565b90505b61253a8161267b565b60606109c86126f88360200151600081518110611a7d57611a7d612d70565b612541565b60608251821061271c57506040805160208101909152600081526109c8565b61253a838384865161272e9190613420565b6127ba565b6000805b8084511180156127475750808351115b8015612798575082818151811061276057612760612d70565b602001015160f81c60f81b6001600160f81b03191684828151811061278757612787612d70565b01602001516001600160f81b031916145b1561253a57806127a781612db4565b915050612737565b60606109c882612910565b6060816127c881601f612d9c565b10156128075760405162461bcd60e51b815260206004820152600e60248201526d736c6963655f6f766572666c6f7760901b6044820152606401610794565b826128128382612d9c565b10156128515760405162461bcd60e51b815260206004820152600e60248201526d736c6963655f6f766572666c6f7760901b6044820152606401610794565b61285b8284612d9c565b8451101561289f5760405162461bcd60e51b8152602060048201526011602482015270736c6963655f6f75744f66426f756e647360781b6044820152606401610794565b6060821580156128be576040519150600082526020820160405261041d565b6040519150601f8416801560200281840101858101878315602002848b0101015b818310156128f75780518352602092830192016128df565b5050858452601f01601f19166040525050949350505050565b60606109c8826020015160008460000151612466565b6001600160a01b038116811461079d57600080fd5b60006020828403121561294d57600080fd5b813561253a81612926565b6020808252825182820181905260009190848201906040850190845b818110156129995783516001600160a01b031683529284019291840191600101612974565b50909695505050505050565b634e487b7160e01b600052604160045260246000fd5b604051606081016001600160401b03811182821017156129dd576129dd6129a5565b60405290565b60006001600160401b03808411156129fd576129fd6129a5565b604051601f8501601f19908116603f01168101908282118183101715612a2557612a256129a5565b81604052809350858152868686011115612a3e57600080fd5b858560208301376000602087830101525050509392505050565b600060208284031215612a6a57600080fd5b81356001600160401b03811115612a8057600080fd5b8201601f81018413612a9157600080fd5b610cf1848235602084016129e3565b60008060408385031215612ab357600080fd5b8235612abe81612926565b915060208301356001600160401b0380821115612ada57600080fd5b9084019060608287031215612aee57600080fd5b612af66129bb565b823582811115612b0557600080fd5b83019150601f82018713612b1857600080fd5b612b27878335602085016129e3565b815260208301356020820152604083013560408201528093505050509250929050565b63ffffffff8116811461079d57600080fd5b80356001600160401b0381168114612b7357600080fd5b919050565b60008060408385031215612b8b57600080fd5b8235612b9681612b4a565b9150612ba460208401612b5c565b90509250929050565b600060808284031215612bbf57600080fd5b50919050565b60008060008060c08587031215612bdb57600080fd5b612be58686612bad565b935060808501356001600160401b0380821115612c0157600080fd5b612c0d88838901612bad565b945060a0870135915080821115612c2357600080fd5b818701915087601f830112612c3757600080fd5b813581811115612c4657600080fd5b886020828501011115612c5857600080fd5b95989497505060200194505050565b60008060a08385031215612c7a57600080fd5b612c848484612bad565b915060808301356001600160401b03811115612c9f57600080fd5b612cab85828601612bad565b9150509250929050565b60008060a08385031215612cc857600080fd5b612cd28484612bad565b915060808301356001600160401b03811115612ced57600080fd5b83016101808186031215612d0057600080fd5b809150509250929050565b600060208284031215612d1d57600080fd5b5051919050565b600060208284031215612d3657600080fd5b81516001600160c01b038116811461253a57600080fd5b600060208284031215612d5f57600080fd5b815160ff8116811461253a57600080fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b60008219821115612daf57612daf612d86565b500190565b6000600019821415612dc857612dc8612d86565b5060010190565b600060408284031215612de157600080fd5b604051604081018181106001600160401b0382111715612e0357612e036129a5565b6040528251612e1181612926565b815260208301516bffffffffffffffffffffffff81168114612e3257600080fd5b60208201529392505050565b60005b83811015612e59578181015183820152602001612e41565b838111156112bd5750506000910152565b60008151808452612e82816020860160208601612e3e565b601f01601f19169290920160200192915050565b60208152600061253a6020830184612e6a565b60208082526052908201527f536572766963654d616e61676572426173652e6f6e6c7952656769737472794360408201527f6f6f7264696e61746f723a2063616c6c6572206973206e6f742074686520726560608201527133b4b9ba393c9031b7b7b93234b730ba37b960711b608082015260a00190565b60018060a01b0383168152604060208201526000825160606040840152612f4b60a0840182612e6a565b90506020840151606084015260408401516080840152809150509392505050565b600060208284031215612f7e57600080fd5b813561253a81612b4a565b600060208284031215612f9b57600080fd5b61253a82612b5c565b6000808335601e19843603018112612fbb57600080fd5b8301803591506001600160401b03821115612fd557600080fd5b602001915036819003821315612fea57600080fd5b9250929050565b60008351613003818460208801612e3e565b6001600160f81b0319939093169190920190815260010192915050565b60006020828403121561303257600080fd5b815161253a81612b4a565b600063ffffffff8083168185168183048111821515161561306057613060612d86565b02949350505050565b634e487b7160e01b600052601260045260246000fd5b600063ffffffff8084168061309657613096613069565b92169190910492915050565b6000808335601e198436030181126130b957600080fd5b83016020810192503590506001600160401b038111156130d857600080fd5b8060051b3603831315612fea57600080fd5b8183526000602080850194508260005b8581101561312557813561310d81612b4a565b63ffffffff16875295820195908201906001016130fa565b509495945050505050565b6000808335601e1984360301811261314757600080fd5b83016020810192503590506001600160401b0381111561316657600080fd5b8060061b3603831315612fea57600080fd5b81835260208301925060008160005b848110156131af57813586526020808301359087015260409586019590910190600101613187565b5093949350505050565b604081833760408201600081526040808301823750600060808301525050565b81835260006020808501808196508560051b810191508460005b8781101561322957828403895261320a82886130a2565b6132158682846130ea565b9a87019a95505050908401906001016131f3565b5091979650505050505050565b84815260a06020820152600160a0820152600060c082015263ffffffff8416604082015260e06060820152600061326d84856130a2565b61018060e0850152613284610260850182846130ea565b9150506132946020860186613130565b60df1980868503016101008701526132ad848385613178565b93506132bc6040890189613130565b935091506101208187860301818801526132d7858585613178565b945061014093506132ed84880160608b016131b9565b60e08901356101c08801526101008901356101e0880152613310818a018a6130a2565b93509050818786030161020088015261332a8584836130ea565b945050613339838901896130a2565b9350915080868503016102208701526133538484846130ea565b93506133636101608901896130a2565b9350915080868503016102408701525061337e8383836131d9565b93505050506113f7608083018463ffffffff169052565b600080604083850312156133a857600080fd5b825180151581146133b857600080fd5b6020939093015192949293505050565b6080810182356133d781612b4a565b63ffffffff1682526133eb60208401612b5c565b6001600160401b0380821660208501528061340860408701612b5c565b16604085015250506060830135606083015292915050565b60008282101561343257613432612d86565b500390565b634e487b7160e01b600052602160045260246000fd5b600060ff83168061346057613460613069565b8060ff84160691505092915050565b600060ff821660ff84168082101561348957613489612d86565b90039392505050565b6000826134a1576134a1613069565b500490565b60008160001904831182151516156134c0576134c0612d86565b50029056fea26469706673582212204c66b0f8ac571aeb402c8b0ea7a5749bca9a6e2820e2fd51960fb28f1aecabd564736f6c634300080c0033","storage":{"0x1":"0xff"}},"0x90f79bf6eb2c4f870365e785982e1f101e93b906":{"nonce":0,"balance":"0x21e19e0c9bab2400000","code":"0x","storage":{}},"0x95401dc811bb5740090279ba06cfa8fcf6113778":{"nonce":1,"balance":"0x0","code":"0x608060405234801561001057600080fd5b50600436106101155760003560e01c80636d14a987116100a2578063bf79ce5811610071578063bf79ce58146103cc578063d5254a8c146103df578063de29fac0146103ff578063e8bb9ae61461041f578063f4e24fe51461044857600080fd5b80636d14a9871461030a5780637916cea6146103315780637ff81a8714610372578063a3db80e2146103a557600080fd5b80633fb27952116100e95780633fb27952146101df57806347b314e8146101f25780635f61a88414610233578063605747d51461028f57806368bccaac146102dd57600080fd5b8062a1f4cb1461011a57806313542a4e1461015b57806326d941f214610192578063377ed99d146101a7575b600080fd5b610141610128366004611905565b6003602052600090815260409020805460019091015482565b604080519283526020830191909152015b60405180910390f35b610184610169366004611905565b6001600160a01b031660009081526001602052604090205490565b604051908152602001610152565b6101a56101a0366004611938565b61045b565b005b6101ca6101b5366004611938565b60ff1660009081526004602052604090205490565b60405163ffffffff9091168152602001610152565b6101a56101ed3660046119c3565b6105b4565b61021b610200366004611a69565b6000908152600260205260409020546001600160a01b031690565b6040516001600160a01b039091168152602001610152565b610282610241366004611938565b60408051808201909152600080825260208201525060ff16600090815260056020908152604091829020825180840190935280548352600101549082015290565b6040516101529190611a82565b6102a261029d366004611a99565b610652565b60408051825167ffffffffffffffff1916815260208084015163ffffffff908116918301919091529282015190921690820152606001610152565b6102f06102eb366004611ac3565b6106e5565b60405167ffffffffffffffff199091168152602001610152565b61021b7f000000000000000000000000c3e53f4d16ae77db1c982e75a937b9f60fe6369081565b61034461033f366004611a99565b610880565b6040805167ffffffffffffffff19909416845263ffffffff9283166020850152911690820152606001610152565b610385610380366004611905565b6108cb565b604080518351815260209384015193810193909352820152606001610152565b6101416103b3366004611938565b6005602052600090815260409020805460019091015482565b6101846103da366004611b0b565b610998565b6103f26103ed366004611b68565b610dec565b6040516101529190611be0565b61018461040d366004611905565b60016020526000908152604090205481565b61021b61042d366004611a69565b6002602052600090815260409020546001600160a01b031681565b6101a56104563660046119c3565b611037565b336001600160a01b037f000000000000000000000000c3e53f4d16ae77db1c982e75a937b9f60fe6369016146104ac5760405162461bcd60e51b81526004016104a390611c2a565b60405180910390fd5b60ff81166000908152600460205260409020541561052b5760405162461bcd60e51b815260206004820152603660248201527f424c5341706b52656769737472792e696e697469616c697a6551756f72756d3a6044820152752071756f72756d20616c72656164792065786973747360501b60648201526084016104a3565b60ff166000908152600460209081526040808320815160608101835284815263ffffffff4381168286019081528285018781528454600181018655948852959096209151919092018054955194518316600160e01b026001600160e01b0395909316600160c01b026001600160e01b03199096169190931c179390931791909116919091179055565b336001600160a01b037f000000000000000000000000c3e53f4d16ae77db1c982e75a937b9f60fe6369016146105fc5760405162461bcd60e51b81526004016104a390611c2a565b6000610607836108cb565b50905061061482826110d0565b7f5358c5b42179178c8fc757734ac2a3198f9071c765ee0d8389211525f50052468383604051610645929190611c9e565b60405180910390a1505050565b604080516060810182526000808252602080830182905282840182905260ff86168252600490529190912080548390811061068f5761068f611d03565b600091825260209182902060408051606081018252919092015467ffffffffffffffff1981841b16825263ffffffff600160c01b8204811694830194909452600160e01b90049092169082015290505b92915050565b60ff8316600090815260046020526040812080548291908490811061070c5761070c611d03565b600091825260209182902060408051606081018252919092015467ffffffffffffffff1981841b16825263ffffffff600160c01b82048116948301859052600160e01b9091048116928201929092529250851610156107d35760405162461bcd60e51b815260206004820152603e60248201527f424c5341706b52656769737472792e5f76616c696461746541706b486173684160448201527f74426c6f636b4e756d6265723a20696e64657820746f6f20726563656e74000060648201526084016104a3565b604081015163ffffffff1615806107f95750806040015163ffffffff168463ffffffff16105b6108775760405162461bcd60e51b815260206004820152604360248201527f424c5341706b52656769737472792e5f76616c696461746541706b486173684160448201527f74426c6f636b4e756d6265723a206e6f74206c61746573742061706b2075706460648201526261746560e81b608482015260a4016104a3565b51949350505050565b6004602052816000526040600020818154811061089c57600080fd5b600091825260209091200154604081901b925063ffffffff600160c01b820481169250600160e01b9091041683565b60408051808201909152600080825260208201526001600160a01b03821660008181526003602090815260408083208151808301835281548152600191820154818501529484529091528120549091908061098e5760405162461bcd60e51b815260206004820152603e60248201527f424c5341706b52656769737472792e676574526567697374657265645075626b60448201527f65793a206f70657261746f72206973206e6f742072656769737465726564000060648201526084016104a3565b9094909350915050565b6000336001600160a01b037f000000000000000000000000c3e53f4d16ae77db1c982e75a937b9f60fe6369016146109e25760405162461bcd60e51b81526004016104a390611c2a565b6000610a106109f936869003860160408701611d19565b805160009081526020918201519091526040902090565b90507fad3228b676f7d3cd4284a5443f17f1962b36e491b30a40b2405849e597ba5fb5811415610a98576040805162461bcd60e51b8152602060048201526024810191909152600080516020611f6283398151915260448201527f4b65793a2063616e6e6f74207265676973746572207a65726f207075626b657960648201526084016104a3565b6001600160a01b03851660009081526001602052604090205415610b225760405162461bcd60e51b81526020600482015260476024820152600080516020611f6283398151915260448201527f4b65793a206f70657261746f7220616c72656164792072656769737465726564606482015266207075626b657960c81b608482015260a4016104a3565b6000818152600260205260409020546001600160a01b031615610ba65760405162461bcd60e51b81526020600482015260426024820152600080516020611f6283398151915260448201527f4b65793a207075626c6963206b657920616c7265616479207265676973746572606482015261195960f21b608482015260a4016104a3565b604080516000917f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000191610bff918835916020808b0135928b01359160608c01359160808d019160c08e01918d35918e8201359101611d4b565b6040516020818303038152906040528051906020012060001c610c229190611d96565b9050610cbc610c5b610c4683610c40368a90038a0160408b01611d19565b9061131b565b610c5536899003890189611d19565b906113b2565b610c63611446565b610ca5610c9685610c40604080518082018252600080825260209182015281518083019092526001825260029082015290565b610c55368a90038a018a611d19565b610cb7368a90038a0160808b01611e08565b611506565b610d575760405162461bcd60e51b815260206004820152606c6024820152600080516020611f6283398151915260448201527f4b65793a2065697468657220746865204731207369676e61747572652069732060648201527f77726f6e672c206f7220473120616e642047322070726976617465206b65792060848201526b0c8de40dcdee840dac2e8c6d60a31b60a482015260c4016104a3565b6001600160a01b03861660008181526003602090815260408083208982018035825560608b013560019283015590835281842087905586845260029092529182902080546001600160a01b0319168417905590517fe3fb6613af2e8930cf85d47fcf6db10192224a64c6cbe8023e0eee1ba382804191610ddb9160808a0190611e65565b60405180910390a250949350505050565b606060008367ffffffffffffffff811115610e0957610e09611953565b604051908082528060200260200182016040528015610e32578160200160208202803683370190505b50905060005b8481101561102e576000868683818110610e5457610e54611d03565b919091013560f81c600081815260046020526040902054909250905063ffffffff81161580610ebd575060ff821660009081526004602052604081208054909190610ea157610ea1611d03565b600091825260209091200154600160c01b900463ffffffff1686105b15610f4a5760405162461bcd60e51b815260206004820152605160248201527f424c5341706b52656769737472792e67657441706b496e64696365734174426c60448201527f6f636b4e756d6265723a20626c6f636b4e756d626572206973206265666f7265606482015270207468652066697273742075706461746560781b608482015260a4016104a3565b60005b8163ffffffff168163ffffffff1610156110185760ff8316600090815260046020526040902087906001610f818486611eaf565b610f8b9190611eaf565b63ffffffff1681548110610fa157610fa1611d03565b600091825260209091200154600160c01b900463ffffffff1611611006576001610fcb8284611eaf565b610fd59190611eaf565b858581518110610fe757610fe7611d03565b602002602001019063ffffffff16908163ffffffff1681525050611018565b8061101081611ed4565b915050610f4d565b505050808061102690611ef8565b915050610e38565b50949350505050565b336001600160a01b037f000000000000000000000000c3e53f4d16ae77db1c982e75a937b9f60fe63690161461107f5760405162461bcd60e51b81526004016104a390611c2a565b600061108a836108cb565b50905061109f8261109a83611773565b6110d0565b7f14a5172b312e9d2c22b8468f9c70ec2caa9de934fe380734fbc6f3beff2b14ba8383604051610645929190611c9e565b604080518082019091526000808252602082015260005b835181101561131557600084828151811061110457611104611d03565b0160209081015160f81c60008181526004909252604090912054909150806111945760405162461bcd60e51b815260206004820152603d60248201527f424c5341706b52656769737472792e5f70726f6365737351756f72756d41706b60448201527f5570646174653a2071756f72756d20646f6573206e6f7420657869737400000060648201526084016104a3565b60ff821660009081526005602090815260409182902082518084019093528054835260010154908201526111c890866113b2565b60ff831660008181526005602090815260408083208551808255868401805160019384015590855251835281842094845260049092528220939750919290916112119085611f13565b8154811061122157611221611d03565b600091825260209091200180549091504363ffffffff908116600160c01b9092041614156112625780546001600160c01b031916604083901c1781556112fe565b805463ffffffff438116600160e01b8181026001600160e01b0394851617855560ff88166000908152600460209081526040808320815160608101835267ffffffffffffffff198b16815280840196875280830185815282546001810184559286529390942093519301805495519251871690940291909516600160c01b026001600160e01b0319949094169190941c17919091179092161790555b50505050808061130d90611ef8565b9150506110e7565b50505050565b6040805180820190915260008082526020820152611337611832565b835181526020808501519082015260408082018490526000908360608460076107d05a03fa905080801561136a5761136c565bfe5b50806113aa5760405162461bcd60e51b815260206004820152600d60248201526c1958cb5b5d5b0b59985a5b1959609a1b60448201526064016104a3565b505092915050565b60408051808201909152600080825260208201526113ce611850565b835181526020808501518183015283516040808401919091529084015160608301526000908360808460066107d05a03fa905080801561136a5750806113aa5760405162461bcd60e51b815260206004820152600d60248201526c1958cb5859190b59985a5b1959609a1b60448201526064016104a3565b61144e61186e565b50604080516080810182527f198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c28183019081527f1800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed6060830152815281518083019092527f275dc4a288d1afb3cbb1ac09187524c7db36395df7be3b99e673b13a075a65ec82527f1d9befcd05a5323e6da4d435f3b617cdb3af83285c2df711ef39c01571827f9d60208381019190915281019190915290565b604080518082018252858152602080820185905282518084019093528583528201839052600091611535611893565b60005b60028110156116fa57600061154e826006611f2a565b905084826002811061156257611562611d03565b60200201515183611574836000611f49565b600c811061158457611584611d03565b602002015284826002811061159b5761159b611d03565b602002015160200151838260016115b29190611f49565b600c81106115c2576115c2611d03565b60200201528382600281106115d9576115d9611d03565b60200201515151836115ec836002611f49565b600c81106115fc576115fc611d03565b602002015283826002811061161357611613611d03565b602002015151600160200201518361162c836003611f49565b600c811061163c5761163c611d03565b602002015283826002811061165357611653611d03565b60200201516020015160006002811061166e5761166e611d03565b60200201518361167f836004611f49565b600c811061168f5761168f611d03565b60200201528382600281106116a6576116a6611d03565b6020020151602001516001600281106116c1576116c1611d03565b6020020151836116d2836005611f49565b600c81106116e2576116e2611d03565b602002015250806116f281611ef8565b915050611538565b506117036118b2565b60006020826101808560086107d05a03fa905080801561136a5750806117635760405162461bcd60e51b81526020600482015260156024820152741c185a5c9a5b99cb5bdc18dbd9194b59985a5b1959605a1b60448201526064016104a3565b5051151598975050505050505050565b6040805180820190915260008082526020820152815115801561179857506020820151155b156117b6575050604080518082019091526000808252602082015290565b6040518060400160405280836000015181526020017f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd4784602001516117fb9190611d96565b611825907f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47611f13565b905292915050565b919050565b60405180606001604052806003906020820280368337509192915050565b60405180608001604052806004906020820280368337509192915050565b60405180604001604052806118816118d0565b815260200161188e6118d0565b905290565b604051806101800160405280600c906020820280368337509192915050565b60405180602001604052806001906020820280368337509192915050565b60405180604001604052806002906020820280368337509192915050565b80356001600160a01b038116811461182d57600080fd5b60006020828403121561191757600080fd5b611920826118ee565b9392505050565b803560ff8116811461182d57600080fd5b60006020828403121561194a57600080fd5b61192082611927565b634e487b7160e01b600052604160045260246000fd5b6040805190810167ffffffffffffffff8111828210171561198c5761198c611953565b60405290565b604051601f8201601f1916810167ffffffffffffffff811182821017156119bb576119bb611953565b604052919050565b600080604083850312156119d657600080fd5b6119df836118ee565b915060208084013567ffffffffffffffff808211156119fd57600080fd5b818601915086601f830112611a1157600080fd5b813581811115611a2357611a23611953565b611a35601f8201601f19168501611992565b91508082528784828501011115611a4b57600080fd5b80848401858401376000848284010152508093505050509250929050565b600060208284031215611a7b57600080fd5b5035919050565b8151815260208083015190820152604081016106df565b60008060408385031215611aac57600080fd5b611ab583611927565b946020939093013593505050565b600080600060608486031215611ad857600080fd5b611ae184611927565b9250602084013563ffffffff81168114611afa57600080fd5b929592945050506040919091013590565b6000806000838503610160811215611b2257600080fd5b611b2b856118ee565b9350610100601f1982011215611b4057600080fd5b602085019250604061011f1982011215611b5957600080fd5b50610120840190509250925092565b600080600060408486031215611b7d57600080fd5b833567ffffffffffffffff80821115611b9557600080fd5b818601915086601f830112611ba957600080fd5b813581811115611bb857600080fd5b876020828501011115611bca57600080fd5b6020928301989097509590910135949350505050565b6020808252825182820181905260009190848201906040850190845b81811015611c1e57835163ffffffff1683529284019291840191600101611bfc565b50909695505050505050565b6020808252604e908201527f424c5341706b52656769737472792e6f6e6c795265676973747279436f6f726460408201527f696e61746f723a2063616c6c6572206973206e6f74207468652072656769737460608201526d393c9031b7b7b93234b730ba37b960911b608082015260a00190565b60018060a01b038316815260006020604081840152835180604085015260005b81811015611cda57858101830151858201606001528201611cbe565b81811115611cec576000606083870101525b50601f01601f191692909201606001949350505050565b634e487b7160e01b600052603260045260246000fd5b600060408284031215611d2b57600080fd5b611d33611969565b82358152602083013560208201528091505092915050565b8881528760208201528660408201528560608201526040856080830137600060c082016000815260408682375050610100810192909252610120820152610140019695505050505050565b600082611db357634e487b7160e01b600052601260045260246000fd5b500690565b600082601f830112611dc957600080fd5b611dd1611969565b806040840185811115611de357600080fd5b845b81811015611dfd578035845260209384019301611de5565b509095945050505050565b600060808284031215611e1a57600080fd5b6040516040810181811067ffffffffffffffff82111715611e3d57611e3d611953565b604052611e4a8484611db8565b8152611e598460408501611db8565b60208201529392505050565b823581526020808401359082015260c081016040838184013760808201600081526040808501823750600081529392505050565b634e487b7160e01b600052601160045260246000fd5b600063ffffffff83811690831681811015611ecc57611ecc611e99565b039392505050565b600063ffffffff80831681811415611eee57611eee611e99565b6001019392505050565b6000600019821415611f0c57611f0c611e99565b5060010190565b600082821015611f2557611f25611e99565b500390565b6000816000190483118215151615611f4457611f44611e99565b500290565b60008219821115611f5c57611f5c611e99565b50019056fe424c5341706b52656769737472792e7265676973746572424c535075626c6963a2646970667358221220154582672e3ebcf63c6931babaf1da6635e3a131fd4757615b57edad13100bd864736f6c634300080c0033","storage":{"0x0":"0xff"}},"0x976ea74026e726554db657fa54763abd0c3a0aa9":{"nonce":0,"balance":"0x21e19e0c9bab2400000","code":"0x","storage":{}},"0x9965507d1a55bcc2695c58ba16fb37d819b0a4dc":{"nonce":0,"balance":"0x21e19e0c9bab2400000","code":"0x","storage":{}},"0x99bba657f2bbc93c02d617f8ba121cb8fc104acf":{"nonce":1,"balance":"0x0","code":"0x608060405234801561001057600080fd5b50600436106102945760003560e01c80635df4594611610167578063a50857bf116100ce578063dd8283f311610087578063dd8283f3146106f5578063e65797ad14610708578063f2fde38b146107ab578063f8581191146107be578063fabc1cbc146107d1578063fd39105a146107e457600080fd5b8063a50857bf1461066d578063c391425e14610680578063ca0de882146106a0578063ca4f2d97146106c7578063d72d8dd6146106da578063d75b4c88146106e257600080fd5b8063886f119511610120578063886f1195146105cc5780638da5cb5b146105e55780639aa1653d146105ed5780639b5d177b1461060c5780639e9923c21461061f5780639feab8591461064657600080fd5b80635df459461461053d5780636347c9001461056457806368304835146105775780636e3b17db1461059e578063715018a6146105b1578063871ef049146105b957600080fd5b806328f61b311161020b5780635140a548116101c45780635140a548146104c85780635865c60c146104db578063595c6a67146104fb5780635ac86ab7146105035780635b0b829f146105225780635c975abb1461053557600080fd5b806328f61b3114610435578063296bb0641461044857806329d1e0c31461045b5780632cdd1e861461046e5780633998fdd3146104815780633c2a7f4c146104a857600080fd5b806310d67a2f1161025d57806310d67a2f1461034a57806313542a4e1461035d578063136439dd146103865780631478851f146103995780631eb812da146103cc578063249a0c421461041557600080fd5b8062cf2ab51461029957806303fd3492146102ae57806304ec6351146102e1578063054310e61461030c5780630cf4b76714610337575b600080fd5b6102ac6102a7366004614a5c565b610820565b005b6102ce6102bc366004614a9d565b60009081526098602052604090205490565b6040519081526020015b60405180910390f35b6102f46102ef366004614ac8565b610936565b6040516001600160c01b0390911681526020016102d8565b609d5461031f906001600160a01b031681565b6040516001600160a01b0390911681526020016102d8565b6102ac610345366004614be7565b610b2c565b6102ac610358366004614c5c565b610c14565b6102ce61036b366004614c5c565b6001600160a01b031660009081526099602052604090205490565b6102ac610394366004614a9d565b610cc7565b6103bc6103a7366004614a9d565b609a6020526000908152604090205460ff1681565b60405190151581526020016102d8565b6103df6103da366004614c79565b610e04565b60408051825163ffffffff908116825260208085015190911690820152918101516001600160c01b0316908201526060016102d8565b6102ce610423366004614cac565b609b6020526000908152604090205481565b609e5461031f906001600160a01b031681565b61031f610456366004614a9d565b610e95565b6102ac610469366004614c5c565b610f21565b6102ac61047c366004614c5c565b610f32565b61031f7f00000000000000000000000067d269191c92caf3cd7723f116c85e6e9bf5593381565b6104bb6104b6366004614c5c565b610f43565b6040516102d89190614cc7565b6102ac6104d6366004614d1f565b610fc2565b6104ee6104e9366004614c5c565b61154c565b6040516102d89190614dc2565b6102ac6115c0565b6103bc610511366004614cac565b6001805460ff9092161b9081161490565b6102ac610530366004614e47565b61168c565b6001546102ce565b61031f7f00000000000000000000000084ea74d481ee0a5332c457a4d796187f6ba67feb81565b61031f610572366004614a9d565b611723565b61031f7f000000000000000000000000a82ff9afd8f496c3d6ac40e2a0f282e47488cfc981565b6102ac6105ac366004614e7b565b61174d565b6102ac61180d565b6102f46105c7366004614a9d565b611821565b60005461031f906201000090046001600160a01b031681565b61031f61182c565b6096546105fa9060ff1681565b60405160ff90911681526020016102d8565b6102ac61061a366004614f9b565b611845565b61031f7f0000000000000000000000009e545e3c0baab3e08cdfd552c960a1050f37304281565b6102ce7f2bd82124057f0913bc3b772ce7b83e8057c1ad1f3510fc83778be20f10ec5de681565b6102ac61067b366004615094565b611b7c565b61069361068e36600461515f565b611d00565b6040516102d89190615209565b6102ce7ff843b3116d574f43e69f8dda5d93ebf11dccc4a465983f9453058005cd6b34a081565b6102ac6106d5366004615253565b611fae565b609c546102ce565b6102ac6106f0366004615339565b612015565b6102ac6107033660046154ec565b612028565b610777610716366004614cac565b60408051606080820183526000808352602080840182905292840181905260ff9490941684526097825292829020825193840183525463ffffffff8116845261ffff600160201b8204811692850192909252600160301b9004169082015290565b60408051825163ffffffff16815260208084015161ffff9081169183019190915292820151909216908201526060016102d8565b6102ac6107b9366004614c5c565b61232c565b6102ce6107cc366004615600565b6123a2565b6102ac6107df366004614a9d565b6123e9565b6108136107f2366004614c5c565b6001600160a01b031660009081526099602052604090206001015460ff1690565b6040516102d891906156b5565b600154600290600490811614156108525760405162461bcd60e51b8152600401610849906156c3565b60405180910390fd5b60005b82811015610930576000848483818110610871576108716156fa565b90506020020160208101906108869190614c5c565b6001600160a01b03811660009081526099602090815260408083208151808301909252805482526001810154949550929390929183019060ff1660028111156108d1576108d1614d8a565b60028111156108e2576108e2614d8a565b905250805190915060006108f582612545565b9050600061090b826001600160c01b03166125ae565b905061091885858361260b565b5050505050808061092890615726565b915050610855565b50505050565b6000838152609860205260408120805482919084908110610959576109596156fa565b600091825260209182902060408051606081018252929091015463ffffffff808216808552600160201b8304821695850195909552600160401b9091046001600160c01b03169183019190915290925085161015610a535760405162461bcd60e51b815260206004820152606560248201527f5265676973747279436f6f7264696e61746f722e67657451756f72756d42697460448201527f6d61704174426c6f636b4e756d6265724279496e6465783a2071756f72756d4260648201527f69746d61705570646174652069732066726f6d20616674657220626c6f636b4e6084820152643ab6b132b960d91b60a482015260c401610849565b602081015163ffffffff161580610a795750806020015163ffffffff168463ffffffff16105b610b205760405162461bcd60e51b815260206004820152606660248201527f5265676973747279436f6f7264696e61746f722e67657451756f72756d42697460448201527f6d61704174426c6f636b4e756d6265724279496e6465783a2071756f72756d4260648201527f69746d61705570646174652069732066726f6d206265666f726520626c6f636b608482015265273ab6b132b960d11b60a482015260c401610849565b60400151949350505050565b60013360009081526099602052604090206001015460ff166002811115610b5557610b55614d8a565b14610bc85760405162461bcd60e51b815260206004820152603c60248201527f5265676973747279436f6f7264696e61746f722e757064617465536f636b657460448201527f3a206f70657261746f72206973206e6f742072656769737465726564000000006064820152608401610849565b33600090815260996020526040908190205490517fec2963ab21c1e50e1e582aa542af2e4bf7bf38e6e1403c27b42e1c5d6e621eaa90610c09908490615799565b60405180910390a250565b600060029054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610c67573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c8b91906157ac565b6001600160a01b0316336001600160a01b031614610cbb5760405162461bcd60e51b8152600401610849906157c9565b610cc4816126f8565b50565b60005460405163237dfb4760e11b8152336004820152620100009091046001600160a01b0316906346fbf68e90602401602060405180830381865afa158015610d14573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d389190615813565b610d545760405162461bcd60e51b815260040161084990615835565b60015481811614610dcd5760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e70617573653a20696e76616c696420617474656d70742060448201527f746f20756e70617573652066756e6374696f6e616c69747900000000000000006064820152608401610849565b600181905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d90602001610c09565b60408051606081018252600080825260208201819052918101919091526000838152609860205260409020805483908110610e4157610e416156fa565b600091825260209182902060408051606081018252919092015463ffffffff8082168352600160201b820416938201939093526001600160c01b03600160401b909304929092169082015290505b92915050565b6040516308f6629d60e31b8152600481018290526000907f00000000000000000000000084ea74d481ee0a5332c457a4d796187f6ba67feb6001600160a01b0316906347b314e890602401602060405180830381865afa158015610efd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e8f91906157ac565b610f296127fd565b610cc48161285c565b610f3a6127fd565b610cc4816128c5565b6040805180820190915260008082526020820152610e8f610fbd7f2bd82124057f0913bc3b772ce7b83e8057c1ad1f3510fc83778be20f10ec5de684604051602001610fa29291909182526001600160a01b0316602082015260400190565b6040516020818303038152906040528051906020012061292e565b61297c565b60015460029060049081161415610feb5760405162461bcd60e51b8152600401610849906156c3565b600061103384848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505060965460ff169150612a0c9050565b905061103e81612ac5565b6110ae5760405162461bcd60e51b81526020600482015260476024820152600080516020615ecc83398151915260448201527f6f7273466f7251756f72756d3a20736f6d652071756f72756d7320646f206e6f6064820152661d08195e1a5cdd60ca1b608482015260a401610849565b84831461111d5760405162461bcd60e51b81526020600482015260436024820152600080516020615ecc83398151915260448201527f6f7273466f7251756f72756d3a20696e707574206c656e677468206d69736d616064820152620e8c6d60eb1b608482015260a401610849565b60005b8381101561154357600085858381811061113c5761113c6156fa565b919091013560f81c9150369050600089898581811061115d5761115d6156fa565b905060200281019061116f919061587d565b6040516379a0849160e11b815260ff8616600482015291935091507f0000000000000000000000009e545e3c0baab3e08cdfd552c960a1050f3730426001600160a01b03169063f341092290602401602060405180830381865afa1580156111db573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111ff91906158c6565b63ffffffff16811461129b5760405162461bcd60e51b81526020600482015260656024820152600080516020615ecc83398151915260448201527f6f7273466f7251756f72756d3a206e756d626572206f6620757064617465642060648201527f6f70657261746f727320646f6573206e6f74206d617463682071756f72756d206084820152641d1bdd185b60da1b60a482015260c401610849565b6000805b828110156114e25760008484838181106112bb576112bb6156fa565b90506020020160208101906112d09190614c5c565b6001600160a01b03811660009081526099602090815260408083208151808301909252805482526001810154949550929390929183019060ff16600281111561131b5761131b614d8a565b600281111561132c5761132c614d8a565b9052508051909150600061133f82612545565b905060016001600160c01b03821660ff8b161c8116146113c35760405162461bcd60e51b815260206004820152604460248201819052600080516020615ecc833981519152908201527f6f7273466f7251756f72756d3a206f70657261746f72206e6f7420696e2071756064820152636f72756d60e01b608482015260a401610849565b856001600160a01b0316846001600160a01b03161161146e5760405162461bcd60e51b81526020600482015260676024820152600080516020615ecc83398151915260448201527f6f7273466f7251756f72756d3a206f70657261746f7273206172726179206d7560648201527f737420626520736f7274656420696e20617363656e64696e6720616464726573608482015266399037b93232b960c91b60a482015260c401610849565b506114cc83838f8f8d908e600161148591906158e3565b92611492939291906158fb565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061260b92505050565b509092506114db905081615726565b905061129f565b5060ff84166000818152609b6020908152604091829020439081905591519182527f46077d55330763f16269fd75e5761663f4192d2791747c0189b16ad31db07db4910160405180910390a2505050508061153c90615726565b9050611120565b50505050505050565b60408051808201909152600080825260208201526001600160a01b0382166000908152609960209081526040918290208251808401909352805483526001810154909183019060ff1660028111156115a6576115a6614d8a565b60028111156115b7576115b7614d8a565b90525092915050565b60005460405163237dfb4760e11b8152336004820152620100009091046001600160a01b0316906346fbf68e90602401602060405180830381865afa15801561160d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116319190615813565b61164d5760405162461bcd60e51b815260040161084990615835565b600019600181905560405190815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a2565b6116946127fd565b609654829060ff908116908216106117145760405162461bcd60e51b815260206004820152603760248201527f5265676973747279436f6f7264696e61746f722e71756f72756d45786973747360448201527f3a2071756f72756d20646f6573206e6f742065786973740000000000000000006064820152608401610849565b61171e8383612af8565b505050565b609c818154811061173357600080fd5b6000918252602090912001546001600160a01b0316905081565b609e546001600160a01b031633146117cd5760405162461bcd60e51b815260206004820152603a60248201527f5265676973747279436f6f7264696e61746f722e6f6e6c79456a6563746f723a60448201527f2063616c6c6572206973206e6f742074686520656a6563746f720000000000006064820152608401610849565b61171e8383838080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250612ba592505050565b6118156127fd565b61181f6000613055565b565b6000610e8f82612545565b60006118406064546001600160a01b031690565b905090565b60018054600091908116141561186d5760405162461bcd60e51b8152600401610849906156c3565b8389146118f05760405162461bcd60e51b8152602060048201526044602482018190527f5265676973747279436f6f7264696e61746f722e72656769737465724f706572908201527f61746f7257697468436875726e3a20696e707574206c656e677468206d69736d6064820152630c2e8c6d60e31b608482015260a401610849565b60006118fc33886130a7565b905061195b818787808060200260200160405190810160405280939291908181526020016000905b828210156119505761194160408302860136819003810190615925565b81526020019060010190611924565b5050505050866131d8565b60006119a233838e8e8e8e8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152508c9250613362915050565b905060005b8b811015611b6d576000609760008f8f858181106119c7576119c76156fa565b919091013560f81c82525060208082019290925260409081016000208151606081018352905463ffffffff811680835261ffff600160201b8304811695840195909552600160301b90910490931691810191909152845180519193509084908110611a3457611a346156fa565b602002602001015163ffffffff161115611b5a57611ad58e8e84818110611a5d57611a5d6156fa565b9050013560f81c60f81b60f81c84604001518481518110611a8057611a806156fa565b60200260200101513386602001518681518110611a9f57611a9f6156fa565b60200260200101518d8d88818110611ab957611ab96156fa565b905060400201803603810190611acf9190615925565b866138f6565b611b5a898984818110611aea57611aea6156fa565b9050604002016020016020810190611b029190614c5c565b8f8f8590866001611b1391906158e3565b92611b20939291906158fb565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250612ba592505050565b5080611b6581615726565b9150506119a7565b50505050505050505050505050565b600180546000919081161415611ba45760405162461bcd60e51b8152600401610849906156c3565b6000611bb033856130a7565b90506000611bf933838b8b8b8b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152508c9250613362915050565b51905060005b88811015611cf45760008a8a83818110611c1b57611c1b6156fa565b919091013560f81c600081815260976020526040902054855191935063ffffffff169150849084908110611c5157611c516156fa565b602002602001015163ffffffff161115611ce15760405162461bcd60e51b8152602060048201526044602482018190527f5265676973747279436f6f7264696e61746f722e72656769737465724f706572908201527f61746f723a206f70657261746f7220636f756e742065786365656473206d6178606482015263696d756d60e01b608482015260a401610849565b5080611cec81615726565b915050611bff565b50505050505050505050565b6060600082516001600160401b03811115611d1d57611d1d614b00565b604051908082528060200260200182016040528015611d46578160200160208202803683370190505b50905060005b8351811015611fa657600060986000868481518110611d6d57611d6d6156fa565b6020026020010151815260200190815260200160002080549050905060005b81811015611f91578663ffffffff1660986000888681518110611db157611db16156fa565b6020026020010151815260200190815260200160002060018385611dd59190615941565b611ddf9190615941565b81548110611def57611def6156fa565b60009182526020909120015463ffffffff1611611f7f57600060986000888681518110611e1e57611e1e6156fa565b6020026020010151815260200190815260200160002060018385611e429190615941565b611e4c9190615941565b81548110611e5c57611e5c6156fa565b600091825260209091200154600160201b900463ffffffff169050801580611e8f57508763ffffffff168163ffffffff16115b611f375760405162461bcd60e51b815260206004820152606760248201527f5265676973747279436f6f7264696e61746f722e67657451756f72756d42697460448201527f6d6170496e64696365734174426c6f636b4e756d6265723a206f70657261746f60648201527f72496420686173206e6f2071756f72756d4269746d61707320617420626c6f6360848201526635a73ab6b132b960c91b60a482015260c401610849565b6001611f438385615941565b611f4d9190615941565b858581518110611f5f57611f5f6156fa565b602002602001019063ffffffff16908163ffffffff168152505050611f91565b80611f8981615726565b915050611d8c565b50508080611f9e90615726565b915050611d4c565b509392505050565b6001805460029081161415611fd55760405162461bcd60e51b8152600401610849906156c3565b61171e3384848080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250612ba592505050565b61201d6127fd565b61171e838383613bcb565b600054610100900460ff16158080156120485750600054600160ff909116105b806120625750303b158015612062575060005460ff166001145b6120c55760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610849565b6000805460ff1916600117905580156120e8576000805461ff0019166101001790555b825184511480156120fa575081518351145b6121645760405162461bcd60e51b815260206004820152603560248201527f5265676973747279436f6f7264696e61746f722e696e697469616c697a653a206044820152740d2dce0eae840d8cadccee8d040dad2e6dac2e8c6d605b1b6064820152608401610849565b61216d89613055565b6121778686613de2565b6121808861285c565b612189876128c5565b609c80546001818101835560008381527faf85b9071dfafeac1409d3f1d19bafc9bc7c37974cde8df0ee6168f0086e539c92830180546001600160a01b037f000000000000000000000000a82ff9afd8f496c3d6ac40e2a0f282e47488cfc981166001600160a01b03199283161790925585548085018755850180547f00000000000000000000000084ea74d481ee0a5332c457a4d796187f6ba67feb841690831617905585549384019095559190920180547f0000000000000000000000009e545e3c0baab3e08cdfd552c960a1050f37304290921691909316179091555b84518110156122da576122c8858281518110612287576122876156fa565b60200260200101518583815181106122a1576122a16156fa565b60200260200101518584815181106122bb576122bb6156fa565b6020026020010151613bcb565b806122d281615726565b915050612269565b508015612321576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050505050505050565b6123346127fd565b6001600160a01b0381166123995760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610849565b610cc481613055565b60006123e07ff843b3116d574f43e69f8dda5d93ebf11dccc4a465983f9453058005cd6b34a086868686604051602001610fa2959493929190615958565b95945050505050565b600060029054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561243c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061246091906157ac565b6001600160a01b0316336001600160a01b0316146124905760405162461bcd60e51b8152600401610849906157c9565b60015419811960015419161461250e5760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e756e70617573653a20696e76616c696420617474656d7060448201527f7420746f2070617573652066756e6374696f6e616c69747900000000000000006064820152608401610849565b600181905560405181815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c90602001610c09565b600081815260986020526040812054806125625750600092915050565b600083815260986020526040902061257b600183615941565b8154811061258b5761258b6156fa565b600091825260209091200154600160401b90046001600160c01b03169392505050565b60606000805b610100811015612604576001811b9150838216156125f457828160f81b6040516020016125e29291906159ce565b60405160208183030381529060405292505b6125fd81615726565b90506125b4565b5050919050565b60018260200151600281111561262357612623614d8a565b1461262d57505050565b81516040516333567f7f60e11b81526000906001600160a01b037f000000000000000000000000a82ff9afd8f496c3d6ac40e2a0f282e47488cfc916906366acfefe90612682908890869088906004016159fd565b6020604051808303816000875af11580156126a1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126c59190615a24565b90506001600160c01b038116156126f1576126f1856126ec836001600160c01b03166125ae565b612ba5565b5050505050565b6001600160a01b0381166127865760405162461bcd60e51b815260206004820152604960248201527f5061757361626c652e5f73657450617573657252656769737472793a206e657760448201527f50617573657252656769737472792063616e6e6f7420626520746865207a65726064820152686f206164647265737360b81b608482015260a401610849565b600054604080516001600160a01b03620100009093048316815291831660208301527f6e9fcd539896fca60e8b0f01dd580233e48a6b0f7df013b89ba7f565869acdb6910160405180910390a1600080546001600160a01b03909216620100000262010000600160b01b0319909216919091179055565b3361280661182c565b6001600160a01b03161461181f5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610849565b609d54604080516001600160a01b03928316815291831660208301527f315457d8a8fe60f04af17c16e2f5a5e1db612b31648e58030360759ef8f3528c910160405180910390a1609d80546001600160a01b0319166001600160a01b0392909216919091179055565b609e54604080516001600160a01b03928316815291831660208301527f8f30ab09f43a6c157d7fce7e0a13c003042c1c95e8a72e7a146a21c0caa24dc9910160405180910390a1609e80546001600160a01b0319166001600160a01b0392909216919091179055565b6000610e8f61293b613ed2565b8360405161190160f01b6020820152602281018390526042810182905260009060620160405160208183030381529060405280519060200120905092915050565b6040805180820190915260008082526020820152600080806129ac600080516020615f0c83398151915286615a63565b90505b6129b881613ff9565b9093509150600080516020615f0c8339815191528283098314156129f2576040805180820190915290815260208101919091529392505050565b600080516020615f0c8339815191526001820890506129af565b600080612a188461407b565b90508015612abe578260ff168460018651612a339190615941565b81518110612a4357612a436156fa565b016020015160f81c10612abe5760405162461bcd60e51b815260206004820152603f60248201527f4269746d61705574696c732e6f72646572656442797465734172726179546f4260448201527f69746d61703a206269746d61702065786365656473206d61782076616c7565006064820152608401610849565b9392505050565b6096546000908190612adf9060019060ff1681901b615941565b9050612abe6001600160c01b0384811690831681161490565b60ff8216600081815260976020908152604091829020845181548684018051888701805163ffffffff90951665ffffffffffff199094168417600160201b61ffff938416021767ffff0000000000001916600160301b95831695909502949094179094558551918252518316938101939093525116918101919091527f3ee6fe8d54610244c3e9d3c066ae4aee997884aa28f10616ae821925401318ac9060600160405180910390a25050565b6001600160a01b0382166000908152609960205260409020805460018083015460ff166002811115612bd957612bd9614d8a565b14612c465760405162461bcd60e51b81526020600482015260436024820152600080516020615f2c83398151915260448201527f70657261746f723a206f70657261746f72206973206e6f7420726567697374656064820152621c995960ea1b608482015260a401610849565b609654600090612c5a90859060ff16612a0c565b90506000612c6783612545565b90506001600160c01b038216612cd35760405162461bcd60e51b815260206004820152603b6024820152600080516020615f2c83398151915260448201527f70657261746f723a206269746d61702063616e6e6f74206265203000000000006064820152608401610849565b612cdc82612ac5565b612d475760405162461bcd60e51b81526020600482015260426024820152600080516020615f2c83398151915260448201527f70657261746f723a20736f6d652071756f72756d7320646f206e6f74206578696064820152611cdd60f21b608482015260a401610849565b612d5e6001600160c01b0383811690831681161490565b612de45760405162461bcd60e51b81526020600482015260596024820152600080516020615f2c83398151915260448201527f70657261746f723a206f70657261746f72206973206e6f74207265676973746560648201527f72656420666f72207370656369666965642071756f72756d7300000000000000608482015260a401610849565b6001600160c01b0382811619821616612dfd8482614208565b6001600160c01b038116612ecc5760018501805460ff191660021790556040516351b27a6d60e11b81526001600160a01b0388811660048301527f00000000000000000000000067d269191c92caf3cd7723f116c85e6e9bf55933169063a364f4da90602401600060405180830381600087803b158015612e7d57600080fd5b505af1158015612e91573d6000803e3d6000fd5b50506040518692506001600160a01b038a1691507f396fdcb180cb0fea26928113fb0fd1c3549863f9cd563e6a184f1d578116c8e490600090a35b60405163f4e24fe560e01b81526001600160a01b037f00000000000000000000000084ea74d481ee0a5332c457a4d796187f6ba67feb169063f4e24fe590612f1a908a908a90600401615a77565b600060405180830381600087803b158015612f3457600080fd5b505af1158015612f48573d6000803e3d6000fd5b505060405163bd29b8cd60e01b81526001600160a01b037f000000000000000000000000a82ff9afd8f496c3d6ac40e2a0f282e47488cfc916925063bd29b8cd9150612f9a9087908a90600401615a9b565b600060405180830381600087803b158015612fb457600080fd5b505af1158015612fc8573d6000803e3d6000fd5b505060405163bd29b8cd60e01b81526001600160a01b037f0000000000000000000000009e545e3c0baab3e08cdfd552c960a1050f37304216925063bd29b8cd915061301a9087908a90600401615a9b565b600060405180830381600087803b15801561303457600080fd5b505af1158015613048573d6000803e3d6000fd5b5050505050505050505050565b606480546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6040516309aa152760e11b81526001600160a01b0383811660048301526000917f00000000000000000000000084ea74d481ee0a5332c457a4d796187f6ba67feb909116906313542a4e90602401602060405180830381865afa158015613112573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906131369190615ab4565b905080610e8f577f00000000000000000000000084ea74d481ee0a5332c457a4d796187f6ba67feb6001600160a01b031663bf79ce58848461317787610f43565b6040518463ffffffff1660e01b815260040161319593929190615acd565b6020604051808303816000875af11580156131b4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612abe9190615ab4565b6020808201516000908152609a909152604090205460ff161561327e5760405162461bcd60e51b815260206004820152605260248201527f5265676973747279436f6f7264696e61746f722e5f766572696679436875726e60448201527f417070726f7665725369676e61747572653a20636875726e417070726f766572606482015271081cd85b1d08185b1c9958591e481d5cd95960721b608482015260a401610849565b42816040015110156133135760405162461bcd60e51b815260206004820152605260248201527f5265676973747279436f6f7264696e61746f722e5f766572696679436875726e60448201527f417070726f7665725369676e61747572653a20636875726e417070726f766572606482015271081cda59db985d1d5c9948195e1c1a5c995960721b608482015260a401610849565b602080820180516000908152609a909252604091829020805460ff19166001179055609d5490519183015161171e926001600160a01b039092169161335b91879187916123a2565b83516143c8565b61338660405180606001604052806060815260200160608152602001606081525090565b60006133ce86868080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505060965460ff169150612a0c9050565b905060006133db88612545565b90506001600160c01b0382166134595760405162461bcd60e51b815260206004820152603960248201527f5265676973747279436f6f7264696e61746f722e5f72656769737465724f706560448201527f7261746f723a206269746d61702063616e6e6f742062652030000000000000006064820152608401610849565b61346282612ac5565b6134d6576040805162461bcd60e51b81526020600482015260248101919091527f5265676973747279436f6f7264696e61746f722e5f72656769737465724f706560448201527f7261746f723a20736f6d652071756f72756d7320646f206e6f742065786973746064820152608401610849565b8082166001600160c01b03161561358c5760405162461bcd60e51b815260206004820152606860248201527f5265676973747279436f6f7264696e61746f722e5f72656769737465724f706560448201527f7261746f723a206f70657261746f7220616c726561647920726567697374657260648201527f656420666f7220736f6d652071756f72756d73206265696e672072656769737460848201526732b932b2103337b960c11b60a482015260c401610849565b6001600160c01b03818116908316176135a58982614208565b887fec2963ab21c1e50e1e582aa542af2e4bf7bf38e6e1403c27b42e1c5d6e621eaa876040516135d59190615799565b60405180910390a260016001600160a01b038b1660009081526099602052604090206001015460ff16600281111561360f5761360f614d8a565b14613728576040805180820182528a8152600160208083018281526001600160a01b038f166000908152609990925293902082518155925183820180549394939192909160ff19169083600281111561366a5761366a614d8a565b021790555050604051639926ee7d60e01b81526001600160a01b037f00000000000000000000000067d269191c92caf3cd7723f116c85e6e9bf55933169150639926ee7d906136bf908d908990600401615b4c565b600060405180830381600087803b1580156136d957600080fd5b505af11580156136ed573d6000803e3d6000fd5b50506040518b92506001600160a01b038d1691507fe8e68cef1c3a761ed7be7e8463a375f27f7bc335e51824223cacce636ec5c3fe90600090a35b604051631fd93ca960e11b81526001600160a01b037f00000000000000000000000084ea74d481ee0a5332c457a4d796187f6ba67feb1690633fb2795290613778908d908c908c90600401615bc0565b600060405180830381600087803b15801561379257600080fd5b505af11580156137a6573d6000803e3d6000fd5b5050604051632550477760e01b81526001600160a01b037f000000000000000000000000a82ff9afd8f496c3d6ac40e2a0f282e47488cfc9169250632550477791506137fc908d908d908d908d90600401615be5565b6000604051808303816000875af115801561381b573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526138439190810190615c7b565b60408087019190915260208601919091525162bff04d60e01b81526001600160a01b037f0000000000000000000000009e545e3c0baab3e08cdfd552c960a1050f373042169062bff04d906138a0908c908c908c90600401615cde565b6000604051808303816000875af11580156138bf573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526138e79190810190615cf8565b84525050509695505050505050565b6020808301516001600160a01b0380821660008181526099909452604090932054919290871614156139765760405162461bcd60e51b81526020600482015260356024820152600080516020615eec83398151915260448201527439371d1031b0b73737ba1031b43ab9371039b2b63360591b6064820152608401610849565b8760ff16846000015160ff16146139f35760405162461bcd60e51b81526020600482015260476024820152600080516020615eec83398151915260448201527f726e3a2071756f72756d4e756d626572206e6f74207468652073616d65206173606482015266081cda59db995960ca1b608482015260a401610849565b604051635401ed2760e01b81526004810182905260ff891660248201526000907f000000000000000000000000a82ff9afd8f496c3d6ac40e2a0f282e47488cfc96001600160a01b031690635401ed2790604401602060405180830381865afa158015613a64573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613a889190615d91565b9050613a948185614582565b6001600160601b0316866001600160601b031611613b275760405162461bcd60e51b81526020600482015260566024820152600080516020615eec83398151915260448201527f726e3a20696e636f6d696e67206f70657261746f722068617320696e7375666660648201527534b1b4b2b73a1039ba30b5b2903337b91031b43ab93760511b608482015260a401610849565b613b3188856145a6565b6001600160601b0316816001600160601b0316106123215760405162461bcd60e51b815260206004820152605c6024820152600080516020615eec83398151915260448201527f726e3a2063616e6e6f74206b69636b206f70657261746f722077697468206d6f60648201527f7265207468616e206b69636b424950734f66546f74616c5374616b6500000000608482015260a401610849565b60965460ff1660c08110613c3f5760405162461bcd60e51b815260206004820152603560248201527f5265676973747279436f6f7264696e61746f722e63726561746551756f72756d6044820152740e881b585e081c5d5bdc9d5b5cc81c995858da1959605a1b6064820152608401610849565b613c4a816001615dae565b6096805460ff191660ff9290921691909117905580613c698186612af8565b60405160016296b58960e01b031981526001600160a01b037f000000000000000000000000a82ff9afd8f496c3d6ac40e2a0f282e47488cfc9169063ff694a7790613cbc90849088908890600401615dd3565b600060405180830381600087803b158015613cd657600080fd5b505af1158015613cea573d6000803e3d6000fd5b505060405163136ca0f960e11b815260ff841660048201527f0000000000000000000000009e545e3c0baab3e08cdfd552c960a1050f3730426001600160a01b031692506326d941f29150602401600060405180830381600087803b158015613d5257600080fd5b505af1158015613d66573d6000803e3d6000fd5b505060405163136ca0f960e11b815260ff841660048201527f00000000000000000000000084ea74d481ee0a5332c457a4d796187f6ba67feb6001600160a01b031692506326d941f29150602401600060405180830381600087803b158015613dce57600080fd5b505af1158015612321573d6000803e3d6000fd5b6000546201000090046001600160a01b0316158015613e0957506001600160a01b03821615155b613e8b5760405162461bcd60e51b815260206004820152604760248201527f5061757361626c652e5f696e697469616c697a655061757365723a205f696e6960448201527f7469616c697a6550617573657228292063616e206f6e6c792062652063616c6c6064820152666564206f6e636560c81b608482015260a401610849565b600181905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a2613ece826126f8565b5050565b6000306001600160a01b037f00000000000000000000000099bba657f2bbc93c02d617f8ba121cb8fc104acf16148015613f2b57507f0000000000000000000000000000000000000000000000000000000000007a6946145b15613f5557507f406317ba320aa1ce27f534da819f43f06d3f4ae2bb66e781d9097ad693209a7090565b50604080517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f6020808301919091527f6ec8a99f0e7f9ebde7354a446dcb9423f3af9c58f386a53c59c5b384f9e82d11828401527f6bda7e3f385e48841048390444cced5cc795af87758af67622e5f4f0882c4a9960608301524660808301523060a0808401919091528351808403909101815260c0909201909252805191012090565b60008080600080516020615f0c8339815191526003600080516020615f0c83398151915286600080516020615f0c83398151915288890909089050600061406f827f0c19139cb84c680a6e14116da060561765e05aa45a1c72a34f082305b61f3f52600080516020615f0c8339815191526145c0565b91959194509092505050565b6000610100825111156141045760405162461bcd60e51b8152602060048201526044602482018190527f4269746d61705574696c732e6f72646572656442797465734172726179546f42908201527f69746d61703a206f7264657265644279746573417272617920697320746f6f206064820152636c6f6e6760e01b608482015260a401610849565b815161411257506000919050565b60008083600081518110614128576141286156fa565b0160200151600160f89190911c81901b92505b84518110156141ff57848181518110614156576141566156fa565b0160200151600160f89190911c1b91508282116141eb5760405162461bcd60e51b815260206004820152604760248201527f4269746d61705574696c732e6f72646572656442797465734172726179546f4260448201527f69746d61703a206f72646572656442797465734172726179206973206e6f74206064820152661bdc99195c995960ca1b608482015260a401610849565b918117916141f881615726565b905061413b565b50909392505050565b600082815260986020526040902054806142ad576000838152609860209081526040808320815160608101835263ffffffff43811682528185018681526001600160c01b03808a16958401958652845460018101865594885295909620915191909201805495519351909416600160401b026001600160401b03938316600160201b0267ffffffffffffffff1990961691909216179390931716919091179055505050565b60008381526098602052604081206142c6600184615941565b815481106142d6576142d66156fa565b600091825260209091200180549091504363ffffffff9081169116141561431a5780546001600160401b0316600160401b6001600160c01b03851602178155610930565b805463ffffffff438116600160201b81810267ffffffff0000000019909416939093178455600087815260986020908152604080832081516060810183529485528483018481526001600160c01b03808c1693870193845282546001810184559286529390942094519401805493519151909216600160401b026001600160401b0391861690960267ffffffffffffffff199093169390941692909217179190911691909117905550505050565b6001600160a01b0383163b156144e257604051630b135d3f60e11b808252906001600160a01b03851690631626ba7e906144089086908690600401615a9b565b602060405180830381865afa158015614425573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906144499190615e4c565b6001600160e01b0319161461171e5760405162461bcd60e51b815260206004820152605360248201527f454950313237315369676e61747572655574696c732e636865636b5369676e6160448201527f747572655f454950313237313a2045524331323731207369676e6174757265206064820152721d995c9a599a58d85d1a5bdb8819985a5b1959606a1b608482015260a401610849565b826001600160a01b03166144f6838361466f565b6001600160a01b03161461171e5760405162461bcd60e51b815260206004820152604760248201527f454950313237315369676e61747572655574696c732e636865636b5369676e6160448201527f747572655f454950313237313a207369676e6174757265206e6f742066726f6d6064820152661039b4b3b732b960c91b608482015260a401610849565b60208101516000906127109061459c9061ffff1685615e76565b612abe9190615ea5565b60408101516000906127109061459c9061ffff1685615e76565b6000806145cb6149dc565b6145d36149fa565b602080825281810181905260408201819052606082018890526080820187905260a082018690528260c08360056107d05a03fa925082801561461457614616565bfe5b50826146645760405162461bcd60e51b815260206004820152601a60248201527f424e3235342e6578704d6f643a2063616c6c206661696c7572650000000000006044820152606401610849565b505195945050505050565b600080600061467e858561468b565b91509150611fa6816146fb565b6000808251604114156146c25760208301516040840151606085015160001a6146b6878285856148b6565b945094505050506146f4565b8251604014156146ec57602083015160408401516146e18683836149a3565b9350935050506146f4565b506000905060025b9250929050565b600081600481111561470f5761470f614d8a565b14156147185750565b600181600481111561472c5761472c614d8a565b141561477a5760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606401610849565b600281600481111561478e5761478e614d8a565b14156147dc5760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606401610849565b60038160048111156147f0576147f0614d8a565b14156148495760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b6064820152608401610849565b600481600481111561485d5761485d614d8a565b1415610cc45760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c604482015261756560f01b6064820152608401610849565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08311156148ed575060009050600361499a565b8460ff16601b1415801561490557508460ff16601c14155b15614916575060009050600461499a565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa15801561496a573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b0381166149935760006001925092505061499a565b9150600090505b94509492505050565b6000806001600160ff1b038316816149c060ff86901c601b6158e3565b90506149ce878288856148b6565b935093505050935093915050565b60405180602001604052806001906020820280368337509192915050565b6040518060c001604052806006906020820280368337509192915050565b60008083601f840112614a2a57600080fd5b5081356001600160401b03811115614a4157600080fd5b6020830191508360208260051b85010111156146f457600080fd5b60008060208385031215614a6f57600080fd5b82356001600160401b03811115614a8557600080fd5b614a9185828601614a18565b90969095509350505050565b600060208284031215614aaf57600080fd5b5035919050565b63ffffffff81168114610cc457600080fd5b600080600060608486031215614add57600080fd5b833592506020840135614aef81614ab6565b929592945050506040919091013590565b634e487b7160e01b600052604160045260246000fd5b604051606081016001600160401b0381118282101715614b3857614b38614b00565b60405290565b604080519081016001600160401b0381118282101715614b3857614b38614b00565b604051601f8201601f191681016001600160401b0381118282101715614b8857614b88614b00565b604052919050565b60006001600160401b03831115614ba957614ba9614b00565b614bbc601f8401601f1916602001614b60565b9050828152838383011115614bd057600080fd5b828260208301376000602084830101529392505050565b600060208284031215614bf957600080fd5b81356001600160401b03811115614c0f57600080fd5b8201601f81018413614c2057600080fd5b614c2f84823560208401614b90565b949350505050565b6001600160a01b0381168114610cc457600080fd5b8035614c5781614c37565b919050565b600060208284031215614c6e57600080fd5b8135612abe81614c37565b60008060408385031215614c8c57600080fd5b50508035926020909101359150565b803560ff81168114614c5757600080fd5b600060208284031215614cbe57600080fd5b612abe82614c9b565b815181526020808301519082015260408101610e8f565b60008083601f840112614cf057600080fd5b5081356001600160401b03811115614d0757600080fd5b6020830191508360208285010111156146f457600080fd5b60008060008060408587031215614d3557600080fd5b84356001600160401b0380821115614d4c57600080fd5b614d5888838901614a18565b90965094506020870135915080821115614d7157600080fd5b50614d7e87828801614cde565b95989497509550505050565b634e487b7160e01b600052602160045260246000fd5b60038110614dbe57634e487b7160e01b600052602160045260246000fd5b9052565b815181526020808301516040830191614ddd90840182614da0565b5092915050565b803561ffff81168114614c5757600080fd5b600060608284031215614e0857600080fd5b614e10614b16565b90508135614e1d81614ab6565b8152614e2b60208301614de4565b6020820152614e3c60408301614de4565b604082015292915050565b60008060808385031215614e5a57600080fd5b614e6383614c9b565b9150614e728460208501614df6565b90509250929050565b600080600060408486031215614e9057600080fd5b8335614e9b81614c37565b925060208401356001600160401b03811115614eb657600080fd5b614ec286828701614cde565b9497909650939450505050565b60006101008284031215614ee257600080fd5b50919050565b60008083601f840112614efa57600080fd5b5081356001600160401b03811115614f1157600080fd5b6020830191508360208260061b85010111156146f457600080fd5b600060608284031215614f3e57600080fd5b614f46614b16565b905081356001600160401b03811115614f5e57600080fd5b8201601f81018413614f6f57600080fd5b614f7e84823560208401614b90565b825250602082013560208201526040820135604082015292915050565b60008060008060008060008060006101a08a8c031215614fba57600080fd5b89356001600160401b0380821115614fd157600080fd5b614fdd8d838e01614cde565b909b50995060208c0135915080821115614ff657600080fd5b6150028d838e01614cde565b90995097508791506150178d60408e01614ecf565b96506101408c013591508082111561502e57600080fd5b61503a8d838e01614ee8565b90965094506101608c013591508082111561505457600080fd5b6150608d838e01614f2c565b93506101808c013591508082111561507757600080fd5b506150848c828d01614f2c565b9150509295985092959850929598565b60008060008060008061016087890312156150ae57600080fd5b86356001600160401b03808211156150c557600080fd5b6150d18a838b01614cde565b909850965060208901359150808211156150ea57600080fd5b6150f68a838b01614cde565b909650945084915061510b8a60408b01614ecf565b935061014089013591508082111561512257600080fd5b5061512f89828a01614f2c565b9150509295509295509295565b60006001600160401b0382111561515557615155614b00565b5060051b60200190565b6000806040838503121561517257600080fd5b823561517d81614ab6565b91506020838101356001600160401b0381111561519957600080fd5b8401601f810186136151aa57600080fd5b80356151bd6151b88261513c565b614b60565b81815260059190911b820183019083810190888311156151dc57600080fd5b928401925b828410156151fa578335825292840192908401906151e1565b80955050505050509250929050565b6020808252825182820181905260009190848201906040850190845b8181101561524757835163ffffffff1683529284019291840191600101615225565b50909695505050505050565b6000806020838503121561526657600080fd5b82356001600160401b0381111561527c57600080fd5b614a9185828601614cde565b6001600160601b0381168114610cc457600080fd5b600082601f8301126152ae57600080fd5b813560206152be6151b88361513c565b82815260069290921b840181019181810190868411156152dd57600080fd5b8286015b8481101561532e57604081890312156152fa5760008081fd5b615302614b3e565b813561530d81614c37565b81528185013561531c81615288565b818601528352918301916040016152e1565b509695505050505050565b600080600060a0848603121561534e57600080fd5b6153588585614df6565b9250606084013561536881615288565b915060808401356001600160401b0381111561538357600080fd5b61538f8682870161529d565b9150509250925092565b600082601f8301126153aa57600080fd5b813560206153ba6151b88361513c565b828152606092830285018201928282019190878511156153d957600080fd5b8387015b858110156153fc576153ef8982614df6565b84529284019281016153dd565b5090979650505050505050565b600082601f83011261541a57600080fd5b8135602061542a6151b88361513c565b82815260059290921b8401810191818101908684111561544957600080fd5b8286015b8481101561532e57803561546081615288565b835291830191830161544d565b600082601f83011261547e57600080fd5b8135602061548e6151b88361513c565b82815260059290921b840181019181810190868411156154ad57600080fd5b8286015b8481101561532e5780356001600160401b038111156154d05760008081fd5b6154de8986838b010161529d565b8452509183019183016154b1565b600080600080600080600080610100898b03121561550957600080fd5b61551289614c4c565b975061552060208a01614c4c565b965061552e60408a01614c4c565b955061553c60608a01614c4c565b94506080890135935060a08901356001600160401b038082111561555f57600080fd5b61556b8c838d01615399565b945060c08b013591508082111561558157600080fd5b61558d8c838d01615409565b935060e08b01359150808211156155a357600080fd5b506155b08b828c0161546d565b9150509295985092959890939650565b6000604082840312156155d257600080fd5b6155da614b3e565b90506155e582614c9b565b815260208201356155f581614c37565b602082015292915050565b6000806000806080858703121561561657600080fd5b843593506020808601356001600160401b0381111561563457600080fd5b8601601f8101881361564557600080fd5b80356156536151b88261513c565b81815260069190911b8201830190838101908a83111561567257600080fd5b928401925b8284101561569b576156898b856155c0565b82528482019150604084019350615677565b979a97995050505060408601359560600135949350505050565b60208101610e8f8284614da0565b60208082526019908201527f5061757361626c653a20696e6465782069732070617573656400000000000000604082015260600190565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b600060001982141561573a5761573a615710565b5060010190565b60005b8381101561575c578181015183820152602001615744565b838111156109305750506000910152565b60008151808452615785816020860160208601615741565b601f01601f19169290920160200192915050565b602081526000612abe602083018461576d565b6000602082840312156157be57600080fd5b8151612abe81614c37565b6020808252602a908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526939903ab73830bab9b2b960b11b606082015260800190565b60006020828403121561582557600080fd5b81518015158114612abe57600080fd5b60208082526028908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526739903830bab9b2b960c11b606082015260800190565b6000808335601e1984360301811261589457600080fd5b8301803591506001600160401b038211156158ae57600080fd5b6020019150600581901b36038213156146f457600080fd5b6000602082840312156158d857600080fd5b8151612abe81614ab6565b600082198211156158f6576158f6615710565b500190565b6000808585111561590b57600080fd5b8386111561591857600080fd5b5050820193919092039150565b60006040828403121561593757600080fd5b612abe83836155c0565b60008282101561595357615953615710565b500390565b600060a0820187835260208781850152604060a08186015282885180855260c087019150838a01945060005b818110156159b5578551805160ff1684528501516001600160a01b0316858401529484019491830191600101615984565b5050606086019790975250505050608001529392505050565b600083516159e0818460208801615741565b6001600160f81b0319939093169190920190815260010192915050565b60018060a01b03841681528260208201526060604082015260006123e0606083018461576d565b600060208284031215615a3657600080fd5b81516001600160c01b0381168114612abe57600080fd5b634e487b7160e01b600052601260045260246000fd5b600082615a7257615a72615a4d565b500690565b6001600160a01b0383168152604060208201819052600090614c2f9083018461576d565b828152604060208201526000614c2f604083018461576d565b600060208284031215615ac657600080fd5b5051919050565b6001600160a01b03841681526101608101615af5602083018580358252602090810135910152565b615b0f606083016040860180358252602090810135910152565b60406080850160a084013760e0820160008152604060c0860182375060006101208301908152835190526020909201516101409091015292915050565b60018060a01b0383168152604060208201526000825160606040840152615b7660a084018261576d565b90506020840151606084015260408401516080840152809150509392505050565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b6001600160a01b03841681526040602082018190526000906123e09083018486615b97565b60018060a01b0385168152836020820152606060408201526000615c0d606083018486615b97565b9695505050505050565b600082601f830112615c2857600080fd5b81516020615c386151b88361513c565b82815260059290921b84018101918181019086841115615c5757600080fd5b8286015b8481101561532e578051615c6e81615288565b8352918301918301615c5b565b60008060408385031215615c8e57600080fd5b82516001600160401b0380821115615ca557600080fd5b615cb186838701615c17565b93506020850151915080821115615cc757600080fd5b50615cd485828601615c17565b9150509250929050565b8381526040602082015260006123e0604083018486615b97565b60006020808385031215615d0b57600080fd5b82516001600160401b03811115615d2157600080fd5b8301601f81018513615d3257600080fd5b8051615d406151b88261513c565b81815260059190911b82018301908381019087831115615d5f57600080fd5b928401925b82841015615d86578351615d7781614ab6565b82529284019290840190615d64565b979650505050505050565b600060208284031215615da357600080fd5b8151612abe81615288565b600060ff821660ff84168060ff03821115615dcb57615dcb615710565b019392505050565b60006060820160ff8616835260206001600160601b03808716828601526040606081870152838751808652608088019150848901955060005b81811015615e3c57865180516001600160a01b031684528601518516868401529585019591830191600101615e0c565b50909a9950505050505050505050565b600060208284031215615e5e57600080fd5b81516001600160e01b031981168114612abe57600080fd5b60006001600160601b0380831681851681830481118215151615615e9c57615e9c615710565b02949350505050565b60006001600160601b0380841680615ebf57615ebf615a4d565b9216919091049291505056fe5265676973747279436f6f7264696e61746f722e7570646174654f70657261745265676973747279436f6f7264696e61746f722e5f76616c696461746543687530644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd475265676973747279436f6f7264696e61746f722e5f646572656769737465724fa26469706673582212206ef0ff599ca366193c5de93790464df6bb5e365ddca58aa33d66360d817c942164736f6c634300080c0033","storage":{"0x0":"0xff"}},"0x9a676e781a523b5d0c0e43731313a708cb607508":{"nonce":1,"balance":"0x0","code":"0x60806040526004361061014b5760003560e01c806385594e58116100b6578063e4f4f8871161006f578063e4f4f887146103cb578063e5db06c014610404578063eb990c5914610424578063ecb7cb1b14610444578063f2fde38b14610471578063fabc1cbc1461049157600080fd5b806385594e5814610317578063886f1195146103445780638da5cb5b14610364578063c0db354c14610382578063ca661c0414610395578063d44e1b76146103ab57600080fd5b806350f73e7c1161010857806350f73e7c14610254578063595c6a67146102785780635ac86ab71461028d5780635c975abb146102cd578063715018a6146102e257806375608896146102f757600080fd5b806310d67a2f14610150578063136439dd146101725780631f39d87f146101925780633e1de008146101c85780634665bcda146101e85780634d50f9a414610234575b600080fd5b34801561015c57600080fd5b5061017061016b36600461196b565b6104b1565b005b34801561017e57600080fd5b5061017061018d36600461198f565b61056d565b34801561019e57600080fd5b506101b26101ad36600461196b565b6106ac565b6040516101bf91906119c6565b60405180910390f35b3480156101d457600080fd5b506101b26101e336600461196b565b6108a7565b3480156101f457600080fd5b5061021c7f0000000000000000000000000165878a594ca255338adfa4d48449f69242eb8f81565b6040516001600160a01b0390911681526020016101bf565b34801561024057600080fd5b5061017061024f36600461198f565b6109ed565b34801561026057600080fd5b5061026a60c95481565b6040519081526020016101bf565b34801561028457600080fd5b506101706109fe565b34801561029957600080fd5b506102bd6102a8366004611a13565b609854600160ff9092169190911b9081161490565b60405190151581526020016101bf565b3480156102d957600080fd5b5060985461026a565b3480156102ee57600080fd5b50610170610ac5565b34801561030357600080fd5b506102bd610312366004611a36565b610ad9565b34801561032357600080fd5b50610337610332366004611a36565b610b5c565b6040516101bf9190611a62565b34801561035057600080fd5b5060975461021c906001600160a01b031681565b34801561037057600080fd5b506033546001600160a01b031661021c565b610170610390366004611a70565b610bdc565b3480156103a157600080fd5b5061026a61c4e081565b3480156103b757600080fd5b506101706103c636600461198f565b610e9c565b3480156103d757600080fd5b5061026a6103e636600461196b565b6001600160a01b0316600090815260ca602052604090206001015490565b34801561041057600080fd5b5061017061041f366004611a36565b610f30565b34801561043057600080fd5b5061017061043f366004611aa9565b610fc5565b34801561045057600080fd5b5061046461045f36600461196b565b6110ed565b6040516101bf9190611aef565b34801561047d57600080fd5b5061017061048c36600461196b565b6111a7565b34801561049d57600080fd5b506101706104ac36600461198f565b61121d565b609760009054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610504573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105289190611b45565b6001600160a01b0316336001600160a01b0316146105615760405162461bcd60e51b815260040161055890611b62565b60405180910390fd5b61056a81611379565b50565b60975460405163237dfb4760e11b81523360048201526001600160a01b03909116906346fbf68e90602401602060405180830381865afa1580156105b5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105d99190611bac565b6105f55760405162461bcd60e51b815260040161055890611bce565b6098548181161461066e5760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e70617573653a20696e76616c696420617474656d70742060448201527f746f20756e70617573652066756e6374696f6e616c69747900000000000000006064820152608401610558565b609881905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d906020015b60405180910390a250565b6001600160a01b038116600090815260ca6020526040812080546001909101546060926106d98383611c2c565b90508060005b82811015610785576001600160a01b038716600090815260ca6020526040812060010161070c8388611c43565b8154811061071c5761071c611c5b565b6000918252602091829020604080518082019091529101546001600160e01b0381168252600160e01b900463ffffffff1691810182905260c95490925061076291611c43565b4310156107725781925050610785565b508061077d81611c71565b9150506106df565b508060008167ffffffffffffffff8111156107a2576107a2611c8c565b6040519080825280602002602001820160405280156107e757816020015b60408051808201909152600080825260208201528152602001906001900390816107c05790505b509050811561089c5760005b8281101561089a576001600160a01b038916600090815260ca602052604090206001016108208289611c43565b8154811061083057610830611c5b565b6000918252602091829020604080518082019091529101546001600160e01b0381168252600160e01b900463ffffffff1691810191909152825183908390811061087c5761087c611c5b565b6020026020010181905250808061089290611c71565b9150506107f3565b505b979650505050505050565b6001600160a01b038116600090815260ca6020526040812080546001909101546060926108d48383611c2c565b905060008167ffffffffffffffff8111156108f1576108f1611c8c565b60405190808252806020026020018201604052801561093657816020015b604080518082019091526000808252602082015281526020019060019003908161090f5790505b50905060005b828110156109e3576001600160a01b038716600090815260ca602052604090206001016109698287611c43565b8154811061097957610979611c5b565b6000918252602091829020604080518082019091529101546001600160e01b0381168252600160e01b900463ffffffff169181019190915282518390839081106109c5576109c5611c5b565b602002602001018190525080806109db90611c71565b91505061093c565b5095945050505050565b6109f5611470565b61056a816114ca565b60975460405163237dfb4760e11b81523360048201526001600160a01b03909116906346fbf68e90602401602060405180830381865afa158015610a46573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a6a9190611bac565b610a865760405162461bcd60e51b815260040161055890611bce565b600019609881905560405190815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a2565b610acd611470565b610ad76000611591565b565b6001600160a01b038216600090815260ca60205260408120548210801590610b53575060c9546001600160a01b038416600090815260ca60205260409020600101805484908110610b2c57610b2c611c5b565b600091825260209091200154610b4f9190600160e01b900463ffffffff16611c43565b4310155b90505b92915050565b60408051808201909152600080825260208201526001600160a01b038316600090815260ca60205260409020600101805483908110610b9d57610b9d611c5b565b6000918252602091829020604080518082019091529101546001600160e01b0381168252600160e01b900463ffffffff16918101919091529392505050565b60405163a38406a360e01b81526001600160a01b038084166004830152839133917f0000000000000000000000000165878a594ca255338adfa4d48449f69242eb8f169063a38406a390602401602060405180830381865afa158015610c46573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c6a9190611b45565b6001600160a01b031614610ce65760405162461bcd60e51b815260206004820152603d60248201527f44656c617965645769746864726177616c526f757465722e6f6e6c794569676560448201527f6e506f643a206e6f7420706f644f776e6572277320456967656e506f640000006064820152608401610558565b60985460009060019081161415610d0f5760405162461bcd60e51b815260040161055890611ca2565b6001600160a01b038316610da55760405162461bcd60e51b815260206004820152605160248201527f44656c617965645769746864726177616c526f757465722e637265617465446560448201527f6c617965645769746864726177616c3a20726563697069656e742063616e6e6f60648201527074206265207a65726f206164647265737360781b608482015260a401610558565b346001600160e01b03811615610e95576040805180820182526001600160e01b03808416825263ffffffff43811660208085019182526001600160a01b038a16600081815260ca8352968720600190810180548083018255818a5293892088519551909616600160e01b029490961693909317939091019290925593525490917fb8f1b14c7caf74150801dcc9bc18d575cbeaf5b421943497e409df92c92e0f5991889188918691610e5691611c2c565b604080516001600160a01b0395861681529490931660208501526001600160e01b039091169183019190915260608201526080015b60405180910390a1505b5050505050565b60026065541415610eef5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610558565b600260655560985460009060019081161415610f1d5760405162461bcd60e51b815260040161055890611ca2565b610f2733836115e3565b50506001606555565b60026065541415610f835760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610558565b600260655560985460009060019081161415610fb15760405162461bcd60e51b815260040161055890611ca2565b610fbb83836115e3565b5050600160655550565b600054610100900460ff1615808015610fe55750600054600160ff909116105b80610fff5750303b158015610fff575060005460ff166001145b6110625760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610558565b6000805460ff191660011790558015611085576000805461ff0019166101001790555b61108e85611591565b611098848461174e565b6110a1826114ca565b8015610e95576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15050505050565b6040805180820190915260008152606060208201526001600160a01b038216600090815260ca6020908152604080832081518083018352815481526001820180548451818702810187019095528085529195929486810194939192919084015b8282101561119957600084815260209081902060408051808201909152908401546001600160e01b0381168252600160e01b900463ffffffff168183015282526001909201910161114d565b505050915250909392505050565b6111af611470565b6001600160a01b0381166112145760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610558565b61056a81611591565b609760009054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611270573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112949190611b45565b6001600160a01b0316336001600160a01b0316146112c45760405162461bcd60e51b815260040161055890611b62565b6098541981196098541916146113425760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e756e70617573653a20696e76616c696420617474656d7060448201527f7420746f2070617573652066756e6374696f6e616c69747900000000000000006064820152608401610558565b609881905560405181815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c906020016106a1565b6001600160a01b0381166114075760405162461bcd60e51b815260206004820152604960248201527f5061757361626c652e5f73657450617573657252656769737472793a206e657760448201527f50617573657252656769737472792063616e6e6f7420626520746865207a65726064820152686f206164647265737360b81b608482015260a401610558565b609754604080516001600160a01b03928316815291831660208301527f6e9fcd539896fca60e8b0f01dd580233e48a6b0f7df013b89ba7f565869acdb6910160405180910390a1609780546001600160a01b0319166001600160a01b0392909216919091179055565b6033546001600160a01b03163314610ad75760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610558565b61c4e08111156115505760405162461bcd60e51b815260206004820152604560248201527f44656c617965645769746864726177616c526f757465722e5f7365745769746860448201527f64726177616c44656c6179426c6f636b733a206e657756616c756520746f6f206064820152646c6172676560d81b608482015260a401610558565b60c95460408051918252602082018390527f4ffb00400574147429ee377a5633386321e66d45d8b14676014b5fa393e61e9e910160405180910390a160c955565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6001600160a01b038216600090815260ca602052604081208054600190910154825b848110801561161c57508161161a8285611c43565b105b156116c9576001600160a01b038616600090815260ca602052604081206001016116468386611c43565b8154811061165657611656611c5b565b6000918252602091829020604080518082019091529101546001600160e01b0381168252600160e01b900463ffffffff1691810182905260c95490925061169c91611c43565b4310156116a957506116c9565b80516116be906001600160e01b031686611c43565b945050600101611605565b6116d38184611c43565b6001600160a01b038716600090815260ca602052604090205583156116fc576116fc8685611838565b7f6b7151500bd0b5cc211bcc47b3029831b769004df4549e8e1c9a69da05bb094386856117298487611c43565b604080516001600160a01b039094168452602084019290925290820152606001610e8b565b6097546001600160a01b031615801561176f57506001600160a01b03821615155b6117f15760405162461bcd60e51b815260206004820152604760248201527f5061757361626c652e5f696e697469616c697a655061757365723a205f696e6960448201527f7469616c697a6550617573657228292063616e206f6e6c792062652063616c6c6064820152666564206f6e636560c81b608482015260a401610558565b609881905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a261183482611379565b5050565b804710156118885760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610558565b6000826001600160a01b03168260405160006040518083038185875af1925050503d80600081146118d5576040519150601f19603f3d011682016040523d82523d6000602084013e6118da565b606091505b50509050806119515760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610558565b505050565b6001600160a01b038116811461056a57600080fd5b60006020828403121561197d57600080fd5b813561198881611956565b9392505050565b6000602082840312156119a157600080fd5b5035919050565b80516001600160e01b0316825260209081015163ffffffff16910152565b602080825282518282018190526000919060409081850190868401855b82811015611a06576119f68483516119a8565b92840192908501906001016119e3565b5091979650505050505050565b600060208284031215611a2557600080fd5b813560ff8116811461198857600080fd5b60008060408385031215611a4957600080fd5b8235611a5481611956565b946020939093013593505050565b60408101610b5682846119a8565b60008060408385031215611a8357600080fd5b8235611a8e81611956565b91506020830135611a9e81611956565b809150509250929050565b60008060008060808587031215611abf57600080fd5b8435611aca81611956565b93506020850135611ada81611956565b93969395505050506040820135916060013590565b602080825282518282015282810151604080840181905281516060850181905260009392830191849160808701905b8084101561089a57611b318286516119a8565b938501936001939093019290820190611b1e565b600060208284031215611b5757600080fd5b815161198881611956565b6020808252602a908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526939903ab73830bab9b2b960b11b606082015260800190565b600060208284031215611bbe57600080fd5b8151801515811461198857600080fd5b60208082526028908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526739903830bab9b2b960c11b606082015260800190565b634e487b7160e01b600052601160045260246000fd5b600082821015611c3e57611c3e611c16565b500390565b60008219821115611c5657611c56611c16565b500190565b634e487b7160e01b600052603260045260246000fd5b6000600019821415611c8557611c85611c16565b5060010190565b634e487b7160e01b600052604160045260246000fd5b60208082526019908201527f5061757361626c653a20696e646578206973207061757365640000000000000060408201526060019056fea2646970667358221220974bfb720499b56252b27ea3937b9115de548a0dbf1088884cefaa0333c9e23f64736f6c634300080c0033","storage":{}},"0x9e545e3c0baab3e08cdfd552c960a1050f373042":{"nonce":1,"balance":"0x0","code":"0x60806040526004361061004e5760003560e01c80633659cfe6146100655780634f1ef286146100855780635c60da1b146100985780638f283970146100c9578063f851a440146100e95761005d565b3661005d5761005b6100fe565b005b61005b6100fe565b34801561007157600080fd5b5061005b6100803660046106f1565b610118565b61005b61009336600461070c565b61015f565b3480156100a457600080fd5b506100ad6101d0565b6040516001600160a01b03909116815260200160405180910390f35b3480156100d557600080fd5b5061005b6100e43660046106f1565b61020b565b3480156100f557600080fd5b506100ad610235565b61010661029b565b61011661011161033a565b610344565b565b610120610368565b6001600160a01b0316336001600160a01b03161415610157576101548160405180602001604052806000815250600061039b565b50565b6101546100fe565b610167610368565b6001600160a01b0316336001600160a01b031614156101c8576101c38383838080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506001925061039b915050565b505050565b6101c36100fe565b60006101da610368565b6001600160a01b0316336001600160a01b03161415610200576101fb61033a565b905090565b6102086100fe565b90565b610213610368565b6001600160a01b0316336001600160a01b0316141561015757610154816103c6565b600061023f610368565b6001600160a01b0316336001600160a01b03161415610200576101fb610368565b6060610285838360405180606001604052806027815260200161080b6027913961041a565b9392505050565b6001600160a01b03163b151590565b6102a3610368565b6001600160a01b0316336001600160a01b031614156101165760405162461bcd60e51b815260206004820152604260248201527f5472616e73706172656e745570677261646561626c6550726f78793a2061646d60448201527f696e2063616e6e6f742066616c6c6261636b20746f2070726f78792074617267606482015261195d60f21b608482015260a4015b60405180910390fd5b60006101fb6104f7565b3660008037600080366000845af43d6000803e808015610363573d6000f35b3d6000fd5b60007fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b546001600160a01b0316919050565b6103a48361051f565b6000825111806103b15750805b156101c3576103c08383610260565b50505050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f6103ef610368565b604080516001600160a01b03928316815291841660208301520160405180910390a16101548161055f565b60606001600160a01b0384163b6104825760405162461bcd60e51b815260206004820152602660248201527f416464726573733a2064656c65676174652063616c6c20746f206e6f6e2d636f6044820152651b9d1c9858dd60d21b6064820152608401610331565b600080856001600160a01b03168560405161049d91906107bb565b600060405180830381855af49150503d80600081146104d8576040519150601f19603f3d011682016040523d82523d6000602084013e6104dd565b606091505b50915091506104ed828286610608565b9695505050505050565b60007f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc61038c565b61052881610641565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b6001600160a01b0381166105c45760405162461bcd60e51b815260206004820152602660248201527f455243313936373a206e65772061646d696e20697320746865207a65726f206160448201526564647265737360d01b6064820152608401610331565b807fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b80546001600160a01b0319166001600160a01b039290921691909117905550565b60608315610617575081610285565b8251156106275782518084602001fd5b8160405162461bcd60e51b815260040161033191906107d7565b6001600160a01b0381163b6106ae5760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b6064820152608401610331565b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc6105e7565b80356001600160a01b03811681146106ec57600080fd5b919050565b60006020828403121561070357600080fd5b610285826106d5565b60008060006040848603121561072157600080fd5b61072a846106d5565b9250602084013567ffffffffffffffff8082111561074757600080fd5b818601915086601f83011261075b57600080fd5b81358181111561076a57600080fd5b87602082850101111561077c57600080fd5b6020830194508093505050509250925092565b60005b838110156107aa578181015183820152602001610792565b838111156103c05750506000910152565b600082516107cd81846020870161078f565b9190910192915050565b60208152600082518060208401526107f681604085016020870161078f565b601f01601f1916919091016040019291505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a2646970667358221220e0ca31ca14c3ab02f9d35807e213496778d76ad573a18c89caa6360e8a17421464736f6c634300080c0033","storage":{"0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc":"0x70e0ba845a1a0f2da3359c97e0285013525ffc49","0x3617319a054d772f909f7c479a2cebe5066e836a939412e32403c99029b92eff":"0x1","0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103":"0x7a2088a1bfc9d81c55368ae168c2c02570cb814f","0xcfb339bd1c51c488f6134f4ac63d1594afad827b3401c3fc51ed1da74a8ca14e":"0x6"}},"0x9fe46736679d2d9a65f0992f2272de9f3c7fa6e0":{"nonce":1,"balance":"0x0","code":"0x6080604052348015600f57600080fd5b506004361060285760003560e01c8063c298557814602d575b600080fd5b600060405190815260200160405180910390f3fea26469706673582212209882247b872d905a05380b42c11d1716ad43e9b19643a0cf588a80c0958bf20d64736f6c634300080c0033","storage":{}},"0xa0ee7a142d267c1f36714e4a8f75612f20a79720":{"nonce":1,"balance":"0x21d8f1963cddb943c00","code":"0x","storage":{}},"0xa513e6e4b8f2a923d98304ec87f64353c4d5c853":{"nonce":1,"balance":"0x0","code":"0x60806040526004361061004e5760003560e01c80633659cfe6146100655780634f1ef286146100855780635c60da1b146100985780638f283970146100c9578063f851a440146100e95761005d565b3661005d5761005b6100fe565b005b61005b6100fe565b34801561007157600080fd5b5061005b6100803660046106f1565b610118565b61005b61009336600461070c565b61015f565b3480156100a457600080fd5b506100ad6101d0565b6040516001600160a01b03909116815260200160405180910390f35b3480156100d557600080fd5b5061005b6100e43660046106f1565b61020b565b3480156100f557600080fd5b506100ad610235565b61010661029b565b61011661011161033a565b610344565b565b610120610368565b6001600160a01b0316336001600160a01b03161415610157576101548160405180602001604052806000815250600061039b565b50565b6101546100fe565b610167610368565b6001600160a01b0316336001600160a01b031614156101c8576101c38383838080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506001925061039b915050565b505050565b6101c36100fe565b60006101da610368565b6001600160a01b0316336001600160a01b03161415610200576101fb61033a565b905090565b6102086100fe565b90565b610213610368565b6001600160a01b0316336001600160a01b0316141561015757610154816103c6565b600061023f610368565b6001600160a01b0316336001600160a01b03161415610200576101fb610368565b6060610285838360405180606001604052806027815260200161080b6027913961041a565b9392505050565b6001600160a01b03163b151590565b6102a3610368565b6001600160a01b0316336001600160a01b031614156101165760405162461bcd60e51b815260206004820152604260248201527f5472616e73706172656e745570677261646561626c6550726f78793a2061646d60448201527f696e2063616e6e6f742066616c6c6261636b20746f2070726f78792074617267606482015261195d60f21b608482015260a4015b60405180910390fd5b60006101fb6104f7565b3660008037600080366000845af43d6000803e808015610363573d6000f35b3d6000fd5b60007fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b546001600160a01b0316919050565b6103a48361051f565b6000825111806103b15750805b156101c3576103c08383610260565b50505050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f6103ef610368565b604080516001600160a01b03928316815291841660208301520160405180910390a16101548161055f565b60606001600160a01b0384163b6104825760405162461bcd60e51b815260206004820152602660248201527f416464726573733a2064656c65676174652063616c6c20746f206e6f6e2d636f6044820152651b9d1c9858dd60d21b6064820152608401610331565b600080856001600160a01b03168560405161049d91906107bb565b600060405180830381855af49150503d80600081146104d8576040519150601f19603f3d011682016040523d82523d6000602084013e6104dd565b606091505b50915091506104ed828286610608565b9695505050505050565b60007f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc61038c565b61052881610641565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b6001600160a01b0381166105c45760405162461bcd60e51b815260206004820152602660248201527f455243313936373a206e65772061646d696e20697320746865207a65726f206160448201526564647265737360d01b6064820152608401610331565b807fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b80546001600160a01b0319166001600160a01b039290921691909117905550565b60608315610617575081610285565b8251156106275782518084602001fd5b8160405162461bcd60e51b815260040161033191906107d7565b6001600160a01b0381163b6106ae5760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b6064820152608401610331565b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc6105e7565b80356001600160a01b03811681146106ec57600080fd5b919050565b60006020828403121561070357600080fd5b610285826106d5565b60008060006040848603121561072157600080fd5b61072a846106d5565b9250602084013567ffffffffffffffff8082111561074757600080fd5b818601915086601f83011261075b57600080fd5b81358181111561076a57600080fd5b87602082850101111561077c57600080fd5b6020830194508093505050509250925092565b60005b838110156107aa578181015183820152602001610792565b838111156103c05750506000910152565b600082516107cd81846020870161078f565b9190910192915050565b60208152600082518060208401526107f681604085016020870161078f565b601f01601f1916919091016040019291505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a2646970667358221220bceca38d0e447b38e612e8ea5bb02b1e1fcac6609b19aa0fd3fd43aa4b97bf1b64736f6c634300080c0033","storage":{"0x0":"0x1","0x33":"0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266","0x97":"0xe7f1725e7734ce288f8367e1bb143e90bb3f0512","0x98":"0x0","0xc9":"0x1","0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc":"0x9a676e781a523b5d0c0e43731313a708cb607508","0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103":"0x5fbdb2315678afecb367f032d93f642f64180aa3"}},"0xa51c1fc2f0d1a1b8494ed1fe312d7c3a78ed91c0":{"nonce":1,"balance":"0x0","code":"0x608060405234801561001057600080fd5b50600436106101f05760003560e01c80637cf72bba1161010f578063d98128c0116100a2578063e921d4fa11610071578063e921d4fa146103c6578063f2fde38b1461044c578063f73b7519146102a9578063fabc1cbc1461045f57600080fd5b8063d98128c014610430578063da16e29b14610322578063df5cf723146102ba578063e58398361461043e57600080fd5b80638da5cb5b116100de5780638da5cb5b146103b5578063a49db732146103c6578063c747075b146103da578063d7b7fa13146103ee57600080fd5b80637cf72bba146103465780638105e04314610354578063855fcc4a1461036b578063886f1195146103a257600080fd5b806339b70e38116101875780636f0c2f74116101565780636f0c2f7414610322578063715018a614610330578063723e59c7146103385780637259a45c1461024257600080fd5b806339b70e38146102ba578063595c6a67146102d55780635ac86ab7146102dd5780635c975abb1461031057600080fd5b80631794bb3c116101c35780631794bb3c1461022f5780631874e5ae14610242578063282670fc1461027257806338c8ee64146102a957600080fd5b80630ffabbce146101f557806310d67a2f14610209578063136439dd1461021c578063175d3205146101f5575b600080fd5b610207610203366004610b25565b5050565b005b610207610217366004610b5a565b610472565b61020761022a366004610b7e565b61052b565b61020761023d366004610b97565b505050565b610258610250366004610b25565b600092915050565b60405163ffffffff90911681526020015b60405180910390f35b610285610280366004610bd8565b61066a565b60408051825163ffffffff9081168252602093840151169281019290925201610269565b6102076102b7366004610b5a565b50565b60005b6040516001600160a01b039091168152602001610269565b610207610685565b6103006102eb366004610c04565b606654600160ff9092169190911b9081161490565b6040519015158152602001610269565b6066545b604051908152602001610269565b610258610250366004610c27565b61020761074c565b610314610250366004610b25565b610207610203366004610c60565b610300610362366004610cd5565b60009392505050565b610385610379366004610c27565b60008060009250925092565b604080519315158452602084019290925290820152606001610269565b6065546102bd906001600160a01b031681565b6033546001600160a01b03166102bd565b6103146103d4366004610b5a565b50600090565b6102076103e8366004610d13565b50505050565b6104016103fc366004610c27565b610760565b60408051825163ffffffff90811682526020808501518216908301529282015190921690820152606001610269565b610300610250366004610c27565b6103006103d4366004610b5a565b61020761045a366004610b5a565b610782565b61020761046d366004610b7e565b6107f8565b606560009054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156104c5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104e99190610d60565b6001600160a01b0316336001600160a01b0316146105225760405162461bcd60e51b815260040161051990610d7d565b60405180910390fd5b6102b781610954565b60655460405163237dfb4760e11b81523360048201526001600160a01b03909116906346fbf68e90602401602060405180830381865afa158015610573573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105979190610dc7565b6105b35760405162461bcd60e51b815260040161051990610de9565b6066548181161461062c5760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e70617573653a20696e76616c696420617474656d70742060448201527f746f20756e70617573652066756e6374696f6e616c69747900000000000000006064820152608401610519565b606681905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d906020015b60405180910390a250565b60408051808201909152600080825260208201525b92915050565b60655460405163237dfb4760e11b81523360048201526001600160a01b03909116906346fbf68e90602401602060405180830381865afa1580156106cd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106f19190610dc7565b61070d5760405162461bcd60e51b815260040161051990610de9565b600019606681905560405190815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a2565b610754610a4b565b61075e6000610aa5565b565b604080516060810182526000808252602082018190529181019190915261067f565b61078a610a4b565b6001600160a01b0381166107ef5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610519565b6102b781610aa5565b606560009054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561084b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061086f9190610d60565b6001600160a01b0316336001600160a01b03161461089f5760405162461bcd60e51b815260040161051990610d7d565b60665419811960665419161461091d5760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e756e70617573653a20696e76616c696420617474656d7060448201527f7420746f2070617573652066756e6374696f6e616c69747900000000000000006064820152608401610519565b606681905560405181815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c9060200161065f565b6001600160a01b0381166109e25760405162461bcd60e51b815260206004820152604960248201527f5061757361626c652e5f73657450617573657252656769737472793a206e657760448201527f50617573657252656769737472792063616e6e6f7420626520746865207a65726064820152686f206164647265737360b81b608482015260a401610519565b606554604080516001600160a01b03928316815291831660208301527f6e9fcd539896fca60e8b0f01dd580233e48a6b0f7df013b89ba7f565869acdb6910160405180910390a1606580546001600160a01b0319166001600160a01b0392909216919091179055565b6033546001600160a01b0316331461075e5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610519565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6001600160a01b03811681146102b757600080fd5b803563ffffffff81168114610b2057600080fd5b919050565b60008060408385031215610b3857600080fd5b8235610b4381610af7565b9150610b5160208401610b0c565b90509250929050565b600060208284031215610b6c57600080fd5b8135610b7781610af7565b9392505050565b600060208284031215610b9057600080fd5b5035919050565b600080600060608486031215610bac57600080fd5b8335610bb781610af7565b92506020840135610bc781610af7565b929592945050506040919091013590565b60008060408385031215610beb57600080fd5b8235610bf681610af7565b946020939093013593505050565b600060208284031215610c1657600080fd5b813560ff81168114610b7757600080fd5b60008060408385031215610c3a57600080fd5b8235610c4581610af7565b91506020830135610c5581610af7565b809150509250929050565b60008060208385031215610c7357600080fd5b823567ffffffffffffffff80821115610c8b57600080fd5b818501915085601f830112610c9f57600080fd5b813581811115610cae57600080fd5b8660208260051b8501011115610cc357600080fd5b60209290920196919550909350505050565b600080600060608486031215610cea57600080fd5b8335610cf581610af7565b9250610d0360208501610b0c565b9150604084013590509250925092565b60008060008060808587031215610d2957600080fd5b8435610d3481610af7565b9350610d4260208601610b0c565b9250610d5060408601610b0c565b9396929550929360600135925050565b600060208284031215610d7257600080fd5b8151610b7781610af7565b6020808252602a908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526939903ab73830bab9b2b960b11b606082015260800190565b600060208284031215610dd957600080fd5b81518015158114610b7757600080fd5b60208082526028908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526739903830bab9b2b960c11b60608201526080019056fea2646970667358221220f0fb0dbe9401a6132d4f8201707595a4adbf43511b70c6ae5d4d839d365297af64736f6c634300080c0033","storage":{}},"0xa82ff9afd8f496c3d6ac40e2a0f282e47488cfc9":{"nonce":1,"balance":"0x0","code":"0x60806040526004361061004e5760003560e01c80633659cfe6146100655780634f1ef286146100855780635c60da1b146100985780638f283970146100c9578063f851a440146100e95761005d565b3661005d5761005b6100fe565b005b61005b6100fe565b34801561007157600080fd5b5061005b6100803660046106f1565b610118565b61005b61009336600461070c565b61015f565b3480156100a457600080fd5b506100ad6101d0565b6040516001600160a01b03909116815260200160405180910390f35b3480156100d557600080fd5b5061005b6100e43660046106f1565b61020b565b3480156100f557600080fd5b506100ad610235565b61010661029b565b61011661011161033a565b610344565b565b610120610368565b6001600160a01b0316336001600160a01b03161415610157576101548160405180602001604052806000815250600061039b565b50565b6101546100fe565b610167610368565b6001600160a01b0316336001600160a01b031614156101c8576101c38383838080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506001925061039b915050565b505050565b6101c36100fe565b60006101da610368565b6001600160a01b0316336001600160a01b03161415610200576101fb61033a565b905090565b6102086100fe565b90565b610213610368565b6001600160a01b0316336001600160a01b0316141561015757610154816103c6565b600061023f610368565b6001600160a01b0316336001600160a01b03161415610200576101fb610368565b6060610285838360405180606001604052806027815260200161080b6027913961041a565b9392505050565b6001600160a01b03163b151590565b6102a3610368565b6001600160a01b0316336001600160a01b031614156101165760405162461bcd60e51b815260206004820152604260248201527f5472616e73706172656e745570677261646561626c6550726f78793a2061646d60448201527f696e2063616e6e6f742066616c6c6261636b20746f2070726f78792074617267606482015261195d60f21b608482015260a4015b60405180910390fd5b60006101fb6104f7565b3660008037600080366000845af43d6000803e808015610363573d6000f35b3d6000fd5b60007fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b546001600160a01b0316919050565b6103a48361051f565b6000825111806103b15750805b156101c3576103c08383610260565b50505050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f6103ef610368565b604080516001600160a01b03928316815291841660208301520160405180910390a16101548161055f565b60606001600160a01b0384163b6104825760405162461bcd60e51b815260206004820152602660248201527f416464726573733a2064656c65676174652063616c6c20746f206e6f6e2d636f6044820152651b9d1c9858dd60d21b6064820152608401610331565b600080856001600160a01b03168560405161049d91906107bb565b600060405180830381855af49150503d80600081146104d8576040519150601f19603f3d011682016040523d82523d6000602084013e6104dd565b606091505b50915091506104ed828286610608565b9695505050505050565b60007f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc61038c565b61052881610641565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b6001600160a01b0381166105c45760405162461bcd60e51b815260206004820152602660248201527f455243313936373a206e65772061646d696e20697320746865207a65726f206160448201526564647265737360d01b6064820152608401610331565b807fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b80546001600160a01b0319166001600160a01b039290921691909117905550565b60608315610617575081610285565b8251156106275782518084602001fd5b8160405162461bcd60e51b815260040161033191906107d7565b6001600160a01b0381163b6106ae5760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b6064820152608401610331565b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc6105e7565b80356001600160a01b03811681146106ec57600080fd5b919050565b60006020828403121561070357600080fd5b610285826106d5565b60008060006040848603121561072157600080fd5b61072a846106d5565b9250602084013567ffffffffffffffff8082111561074757600080fd5b818601915086601f83011261075b57600080fd5b81358181111561076a57600080fd5b87602082850101111561077c57600080fd5b6020830194508093505050509250925092565b60005b838110156107aa578181015183820152602001610792565b838111156103c05750506000910152565b600082516107cd81846020870161078f565b9190910192915050565b60208152600082518060208401526107f681604085016020870161078f565b601f01601f1916919091016040019291505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a2646970667358221220e0ca31ca14c3ab02f9d35807e213496778d76ad573a18c89caa6360e8a17421464736f6c634300080c0033","storage":{"0x0":"0x0","0x80":"0x1","0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc":"0x851356ae760d987e095750cceb3bc6014560891c","0x3ad60d32a0e8c5a5940fecd326a61dc5fb7ab78edc33c152c1a84747329bcd4d":"0xde0b6b3a7640000a85233c63b9ee964add6f2cffe00fd84eb32338f","0x59f3fb058c6bba7a4e76396639fc4dd21bd59163db798899cf56cef48b3c9ec9":"0x6","0x7cb9c93668c060b9badced98ccf9b1a368bec61c9ba581c8ae380b3ac16e8ef6":"0x1","0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103":"0x7a2088a1bfc9d81c55368ae168c2c02570cb814f"}},"0xa85233c63b9ee964add6f2cffe00fd84eb32338f":{"nonce":1,"balance":"0x0","code":"0x60806040526004361061004e5760003560e01c80633659cfe6146100655780634f1ef286146100855780635c60da1b146100985780638f283970146100c9578063f851a440146100e95761005d565b3661005d5761005b6100fe565b005b61005b6100fe565b34801561007157600080fd5b5061005b6100803660046106f1565b610118565b61005b61009336600461070c565b61015f565b3480156100a457600080fd5b506100ad6101d0565b6040516001600160a01b03909116815260200160405180910390f35b3480156100d557600080fd5b5061005b6100e43660046106f1565b61020b565b3480156100f557600080fd5b506100ad610235565b61010661029b565b61011661011161033a565b610344565b565b610120610368565b6001600160a01b0316336001600160a01b03161415610157576101548160405180602001604052806000815250600061039b565b50565b6101546100fe565b610167610368565b6001600160a01b0316336001600160a01b031614156101c8576101c38383838080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506001925061039b915050565b505050565b6101c36100fe565b60006101da610368565b6001600160a01b0316336001600160a01b03161415610200576101fb61033a565b905090565b6102086100fe565b90565b610213610368565b6001600160a01b0316336001600160a01b0316141561015757610154816103c6565b600061023f610368565b6001600160a01b0316336001600160a01b03161415610200576101fb610368565b6060610285838360405180606001604052806027815260200161080b6027913961041a565b9392505050565b6001600160a01b03163b151590565b6102a3610368565b6001600160a01b0316336001600160a01b031614156101165760405162461bcd60e51b815260206004820152604260248201527f5472616e73706172656e745570677261646561626c6550726f78793a2061646d60448201527f696e2063616e6e6f742066616c6c6261636b20746f2070726f78792074617267606482015261195d60f21b608482015260a4015b60405180910390fd5b60006101fb6104f7565b3660008037600080366000845af43d6000803e808015610363573d6000f35b3d6000fd5b60007fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b546001600160a01b0316919050565b6103a48361051f565b6000825111806103b15750805b156101c3576103c08383610260565b50505050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f6103ef610368565b604080516001600160a01b03928316815291841660208301520160405180910390a16101548161055f565b60606001600160a01b0384163b6104825760405162461bcd60e51b815260206004820152602660248201527f416464726573733a2064656c65676174652063616c6c20746f206e6f6e2d636f6044820152651b9d1c9858dd60d21b6064820152608401610331565b600080856001600160a01b03168560405161049d91906107bb565b600060405180830381855af49150503d80600081146104d8576040519150601f19603f3d011682016040523d82523d6000602084013e6104dd565b606091505b50915091506104ed828286610608565b9695505050505050565b60007f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc61038c565b61052881610641565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b6001600160a01b0381166105c45760405162461bcd60e51b815260206004820152602660248201527f455243313936373a206e65772061646d696e20697320746865207a65726f206160448201526564647265737360d01b6064820152608401610331565b807fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b80546001600160a01b0319166001600160a01b039290921691909117905550565b60608315610617575081610285565b8251156106275782518084602001fd5b8160405162461bcd60e51b815260040161033191906107d7565b6001600160a01b0381163b6106ae5760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b6064820152608401610331565b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc6105e7565b80356001600160a01b03811681146106ec57600080fd5b919050565b60006020828403121561070357600080fd5b610285826106d5565b60008060006040848603121561072157600080fd5b61072a846106d5565b9250602084013567ffffffffffffffff8082111561074757600080fd5b818601915086601f83011261075b57600080fd5b81358181111561076a57600080fd5b87602082850101111561077c57600080fd5b6020830194508093505050509250925092565b60005b838110156107aa578181015183820152602001610792565b838111156103c05750506000910152565b600082516107cd81846020870161078f565b9190910192915050565b60208152600082518060208401526107f681604085016020870161078f565b601f01601f1916919091016040019291505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a2646970667358221220e0ca31ca14c3ab02f9d35807e213496778d76ad573a18c89caa6360e8a17421464736f6c634300080c0033","storage":{"0x0":"0xe7f1725e7734ce288f8367e1bb143e90bb3f05120001","0x1":"0x0","0x32":"0x322813fd9a801c5507c9de605d63cea4f2ce6c44","0x64":"0xde0b6b3a7640000","0x65":"0x56bc75e2d63100000","0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc":"0xc6e7df5e7b4f2a278906862b61205850344d4e7d","0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103":"0x5fbdb2315678afecb367f032d93f642f64180aa3"}},"0xb7f8bc63bbcad18155201308c8f3540b07f84f5e":{"nonce":1,"balance":"0x0","code":"0x608060405234801561001057600080fd5b50600436106102115760003560e01c80638c80d4e511610125578063c6656702116100ad578063df5cf7231161007c578063df5cf7231461054a578063e7a050aa14610571578063f2fde38b14610584578063f698da2514610597578063fabc1cbc1461059f57600080fd5b8063c6656702146104e7578063cbc2bd62146104fa578063cd293f6f1461050d578063cf756fdf1461053757600080fd5b8063b1344271116100f4578063b134427114610464578063b43b514b1461048b578063b5d8b5b81461049e578063c3c6b3a9146104b1578063c608c7f3146104d457600080fd5b80638c80d4e51461040c5780638da5cb5b1461041f57806394f649dd14610430578063967fc0d21461045157600080fd5b80635ac86ab7116101a8578063715018a611610177578063715018a61461037d5780637a7e0d92146103855780637ecebe00146103b0578063886f1195146103d05780638b8aac3c146103e357600080fd5b80635ac86ab71461030c5780635c975abb1461033f5780635de08ff214610347578063663c1de41461035a57600080fd5b80634665bcda116101e45780634665bcda1461028b57806348825e94146102ca57806350ff7225146102f1578063595c6a671461030457600080fd5b806310d67a2f14610216578063136439dd1461022b57806320606b701461023e57806332e89ace14610278575b600080fd5b61022961022436600461289a565b6105b2565b005b6102296102393660046128b7565b61066e565b6102657f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a86681565b6040519081526020015b60405180910390f35b610265610286366004612950565b6107ad565b6102b27f0000000000000000000000000165878a594ca255338adfa4d48449f69242eb8f81565b6040516001600160a01b03909116815260200161026f565b6102657f0a564d4cfe5cb0d4ee082aab2ca54b8c48e129485a8f7c77766ab5ef0c3566f181565b6102296102ff366004612a2f565b6109f1565b610229610a49565b61032f61031a366004612a70565b609854600160ff9092169190911b9081161490565b604051901515815260200161026f565b609854610265565b610229610355366004612a93565b610b10565b61032f61036836600461289a565b60d16020526000908152604090205460ff1681565b610229610c59565b610265610393366004612b08565b60cd60209081526000928352604080842090915290825290205481565b6102656103be36600461289a565b60ca6020526000908152604090205481565b6097546102b2906001600160a01b031681565b6102656103f136600461289a565b6001600160a01b0316600090815260ce602052604090205490565b61022961041a366004612a2f565b610c6d565b6033546001600160a01b03166102b2565b61044361043e36600461289a565b610cc0565b60405161026f929190612bb5565b60cb546102b2906001600160a01b031681565b6102b27f0000000000000000000000005fc8d32690cc91d4c39d9d3abcbd16989f87570781565b610265610499366004612d5e565b610e40565b6102296104ac366004612a93565b610e8d565b61032f6104bf3660046128b7565b60cf6020526000908152604090205460ff1681565b6102296104e2366004612e34565b610fd1565b6102296104f536600461289a565b611089565b6102b2610508366004612e87565b61109a565b61052061051b366004612d5e565b6110d2565b60408051921515835260208301919091520161026f565b610229610545366004612eb3565b611166565b6102b27f000000000000000000000000cf7ed3acca5a467e9e704c703e8d87f634fb0fc981565b61026561057f366004612a2f565b61129a565b61022961059236600461289a565b611363565b6102656113d9565b6102296105ad3660046128b7565b611417565b609760009054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610605573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106299190612f04565b6001600160a01b0316336001600160a01b0316146106625760405162461bcd60e51b815260040161065990612f21565b60405180910390fd5b61066b81611573565b50565b60975460405163237dfb4760e11b81523360048201526001600160a01b03909116906346fbf68e90602401602060405180830381865afa1580156106b6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106da9190612f6b565b6106f65760405162461bcd60e51b815260040161065990612f8d565b6098548181161461076f5760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e70617573653a20696e76616c696420617474656d70742060448201527f746f20756e70617573652066756e6374696f6e616c69747900000000000000006064820152608401610659565b609881905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d906020015b60405180910390a250565b6098546000908190600190811614156108045760405162461bcd60e51b815260206004820152601960248201527814185d5cd8589b194e881a5b99195e081a5cc81c185d5cd959603a1b6044820152606401610659565b600260655414156108575760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610659565b6002606555428410156108de5760405162461bcd60e51b815260206004820152604360248201527f53747261746567794d616e616765722e6465706f736974496e746f537472617460448201527f656779576974685369676e61747572653a207369676e617475726520657870696064820152621c995960ea1b608482015260a401610659565b6001600160a01b03858116600090815260ca602090815260408083205481517f0a564d4cfe5cb0d4ee082aab2ca54b8c48e129485a8f7c77766ab5ef0c3566f1938101939093528c851691830191909152928a1660608201526080810189905260a0810183905260c0810187905260e00160408051601f1981840301815291815281516020928301206001600160a01b038a16600090815260ca909352908220600185019055915061098e6113d9565b60405161190160f01b60208201526022810191909152604281018390526062016040516020818303038152906040528051906020012090506109d188828861166a565b6109dd888c8c8c611824565b60016065559b9a5050505050505050505050565b336001600160a01b037f000000000000000000000000cf7ed3acca5a467e9e704c703e8d87f634fb0fc91614610a395760405162461bcd60e51b815260040161065990612fd5565b610a44838383611a45565b505050565b60975460405163237dfb4760e11b81523360048201526001600160a01b03909116906346fbf68e90602401602060405180830381865afa158015610a91573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ab59190612f6b565b610ad15760405162461bcd60e51b815260040161065990612f8d565b600019609881905560405190815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a2565b60cb546001600160a01b03163314610b3a5760405162461bcd60e51b815260040161065990613033565b8060005b81811015610c535760d16000858584818110610b5c57610b5c61309d565b9050602002016020810190610b71919061289a565b6001600160a01b0316815260208101919091526040016000205460ff16610c4b57600160d16000868685818110610baa57610baa61309d565b9050602002016020810190610bbf919061289a565b6001600160a01b031681526020810191909152604001600020805460ff19169115159190911790557f0c35b17d91c96eb2751cd456e1252f42a386e524ef9ff26ecc9950859fdc04fe848483818110610c1a57610c1a61309d565b9050602002016020810190610c2f919061289a565b6040516001600160a01b03909116815260200160405180910390a15b600101610b3e565b50505050565b610c61611c7f565b610c6b6000611cd9565b565b336001600160a01b037f000000000000000000000000cf7ed3acca5a467e9e704c703e8d87f634fb0fc91614610cb55760405162461bcd60e51b815260040161065990612fd5565b610c53838383611d2b565b6001600160a01b038116600090815260ce60205260408120546060918291908167ffffffffffffffff811115610cf857610cf86128e0565b604051908082528060200260200182016040528015610d21578160200160208202803683370190505b50905060005b82811015610db2576001600160a01b038616600090815260cd6020908152604080832060ce9092528220805491929184908110610d6657610d6661309d565b60009182526020808320909101546001600160a01b031683528201929092526040019020548251839083908110610d9f57610d9f61309d565b6020908102919091010152600101610d27565b5060ce6000866001600160a01b03166001600160a01b031681526020019081526020016000208181805480602002602001604051908101604052809291908181526020018280548015610e2e57602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311610e10575b50505050509150935093505050915091565b80516020808301516040808501516060860151608087015160a08801519351600097610e709790969591016130b3565b604051602081830303815290604052805190602001209050919050565b60cb546001600160a01b03163314610eb75760405162461bcd60e51b815260040161065990613033565b8060005b81811015610c535760d16000858584818110610ed957610ed961309d565b9050602002016020810190610eee919061289a565b6001600160a01b0316815260208101919091526040016000205460ff1615610fc957600060d16000868685818110610f2857610f2861309d565b9050602002016020810190610f3d919061289a565b6001600160a01b031681526020810191909152604001600020805460ff19169115159190911790557f4074413b4b443e4e58019f2855a8765113358c7c72e39509c6af45fc0f5ba030848483818110610f9857610f9861309d565b9050602002016020810190610fad919061289a565b6040516001600160a01b03909116815260200160405180910390a15b600101610ebb565b336001600160a01b037f000000000000000000000000cf7ed3acca5a467e9e704c703e8d87f634fb0fc916146110195760405162461bcd60e51b815260040161065990612fd5565b604051636ce5768960e11b81526001600160a01b03858116600483015282811660248301526044820184905284169063d9caed1290606401600060405180830381600087803b15801561106b57600080fd5b505af115801561107f573d6000803e3d6000fd5b5050505050505050565b611091611c7f565b61066b81611e87565b60ce60205281600052604060002081815481106110b657600080fd5b6000918252602090912001546001600160a01b03169150829050565b600080336001600160a01b037f000000000000000000000000cf7ed3acca5a467e9e704c703e8d87f634fb0fc9161461111d5760405162461bcd60e51b815260040161065990612fd5565b600061112884610e40565b600081815260cf60205260408120549192509060ff161561115d5750600081815260cf60205260409020805460ff1916905560015b92509050915091565b600054610100900460ff16158080156111865750600054600160ff909116105b806111a05750303b1580156111a0575060005460ff166001145b6112035760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610659565b6000805460ff191660011790558015611226576000805461ff0019166101001790555b61122e611ef0565b60c95561123b8383611f87565b61124485611cd9565b61124d84611e87565b8015611293576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050505050565b6098546000908190600190811614156112f15760405162461bcd60e51b815260206004820152601960248201527814185d5cd8589b194e881a5b99195e081a5cc81c185d5cd959603a1b6044820152606401610659565b600260655414156113445760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610659565b600260655561135533868686611824565b600160655595945050505050565b61136b611c7f565b6001600160a01b0381166113d05760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610659565b61066b81611cd9565b60007f0000000000000000000000000000000000000000000000000000000000007a6946141561140a575060c95490565b611412611ef0565b905090565b609760009054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561146a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061148e9190612f04565b6001600160a01b0316336001600160a01b0316146114be5760405162461bcd60e51b815260040161065990612f21565b60985419811960985419161461153c5760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e756e70617573653a20696e76616c696420617474656d7060448201527f7420746f2070617573652066756e6374696f6e616c69747900000000000000006064820152608401610659565b609881905560405181815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c906020016107a2565b6001600160a01b0381166116015760405162461bcd60e51b815260206004820152604960248201527f5061757361626c652e5f73657450617573657252656769737472793a206e657760448201527f50617573657252656769737472792063616e6e6f7420626520746865207a65726064820152686f206164647265737360b81b608482015260a401610659565b609754604080516001600160a01b03928316815291831660208301527f6e9fcd539896fca60e8b0f01dd580233e48a6b0f7df013b89ba7f565869acdb6910160405180910390a1609780546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b0383163b1561178457604051630b135d3f60e11b808252906001600160a01b03851690631626ba7e906116aa9086908690600401613184565b602060405180830381865afa1580156116c7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116eb919061319d565b6001600160e01b03191614610a445760405162461bcd60e51b815260206004820152605360248201527f454950313237315369676e61747572655574696c732e636865636b5369676e6160448201527f747572655f454950313237313a2045524331323731207369676e6174757265206064820152721d995c9a599a58d85d1a5bdb8819985a5b1959606a1b608482015260a401610659565b826001600160a01b03166117988383612071565b6001600160a01b031614610a445760405162461bcd60e51b815260206004820152604760248201527f454950313237315369676e61747572655574696c732e636865636b5369676e6160448201527f747572655f454950313237313a207369676e6174757265206e6f742066726f6d6064820152661039b4b3b732b960c91b608482015260a401610659565b6001600160a01b038316600090815260d16020526040812054849060ff166118ca5760405162461bcd60e51b815260206004820152604d60248201527f53747261746567794d616e616765722e6f6e6c7953747261746567696573576860448201527f6974656c6973746564466f724465706f7369743a207374726174656779206e6f60648201526c1d081dda1a5d195b1a5cdd1959609a1b608482015260a401610659565b6118df6001600160a01b038516338786612095565b6040516311f9fbc960e21b81526001600160a01b038581166004830152602482018590528616906347e7ef24906044016020604051808303816000875af115801561192e573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061195291906131c7565b915061195f868684611a45565b604051631452b9d760e11b81526001600160a01b0387811660048301528681166024830152604482018490527f000000000000000000000000cf7ed3acca5a467e9e704c703e8d87f634fb0fc916906328a573ae90606401600060405180830381600087803b1580156119d157600080fd5b505af11580156119e5573d6000803e3d6000fd5b5050604080516001600160a01b038a8116825288811660208301528916818301526060810186905290517f7cfff908a4b583f36430b25d75964c458d8ede8a99bd61be750e97ee1b2f3a969350908190036080019150a150949350505050565b6001600160a01b038316611ac15760405162461bcd60e51b815260206004820152603960248201527f53747261746567794d616e616765722e5f6164645368617265733a207374616b60448201527f65722063616e6e6f74206265207a65726f2061646472657373000000000000006064820152608401610659565b80611b2d5760405162461bcd60e51b815260206004820152603660248201527f53747261746567794d616e616765722e5f6164645368617265733a207368617260448201527565732073686f756c64206e6f74206265207a65726f2160501b6064820152608401610659565b6001600160a01b03808416600090815260cd6020908152604080832093861683529290522054611c3e576001600160a01b038316600090815260ce602090815260409091205410611bff5760405162461bcd60e51b815260206004820152605060248201527f53747261746567794d616e616765722e5f6164645368617265733a206465706f60448201527f73697420776f756c6420657863656564204d41585f5354414b45525f5354524160648201526f0a88a8eb2be9892a6a8be988a9c8ea8960831b608482015260a401610659565b6001600160a01b03838116600090815260ce602090815260408220805460018101825590835291200180546001600160a01b0319169184169190911790555b6001600160a01b03808416600090815260cd6020908152604080832093861683529290529081208054839290611c759084906131f6565b9091555050505050565b6033546001600160a01b03163314610c6b5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610659565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600081611da05760405162461bcd60e51b815260206004820152603e60248201527f53747261746567794d616e616765722e5f72656d6f76655368617265733a207360448201527f68617265416d6f756e742073686f756c64206e6f74206265207a65726f2100006064820152608401610659565b6001600160a01b03808516600090815260cd602090815260408083209387168352929052205480831115611e325760405162461bcd60e51b815260206004820152603360248201527f53747261746567794d616e616765722e5f72656d6f76655368617265733a20736044820152720d0c2e4ca82dadeeadce840e8dede40d0d2ced606b1b6064820152608401610659565b6001600160a01b03808616600090815260cd602090815260408083209388168352929052208382039081905590831415611e7a57611e7085856120ef565b6001915050611e80565b60009150505b9392505050565b60cb54604080516001600160a01b03928316815291831660208301527f4264275e593955ff9d6146a51a4525f6ddace2e81db9391abcc9d1ca48047d29910160405180910390a160cb80546001600160a01b0319166001600160a01b0392909216919091179055565b604080518082018252600a81526922b4b3b2b72630bcb2b960b11b60209182015281517f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a866818301527f71b625cfad44bac63b13dba07f2e1d6084ee04b6f8752101ece6126d584ee6ea81840152466060820152306080808301919091528351808303909101815260a0909101909252815191012090565b6097546001600160a01b0316158015611fa857506001600160a01b03821615155b61202a5760405162461bcd60e51b815260206004820152604760248201527f5061757361626c652e5f696e697469616c697a655061757365723a205f696e6960448201527f7469616c697a6550617573657228292063616e206f6e6c792062652063616c6c6064820152666564206f6e636560c81b608482015260a401610659565b609881905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a261206d82611573565b5050565b600080600061208085856122e1565b9150915061208d81612351565b509392505050565b604080516001600160a01b0385811660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b179052610c5390859061250c565b6001600160a01b038216600090815260ce6020526040812054905b8181101561220a576001600160a01b03848116600090815260ce60205260409020805491851691839081106121415761214161309d565b6000918252602090912001546001600160a01b03161415612202576001600160a01b038416600090815260ce6020526040902080546121829060019061320e565b815481106121925761219261309d565b60009182526020808320909101546001600160a01b03878116845260ce90925260409092208054919092169190839081106121cf576121cf61309d565b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555061220a565b60010161210a565b818114156122925760405162461bcd60e51b815260206004820152604960248201527f53747261746567794d616e616765722e5f72656d6f766553747261746567794660448201527f726f6d5374616b657253747261746567794c6973743a207374726174656779206064820152681b9bdd08199bdd5b9960ba1b608482015260a401610659565b6001600160a01b038416600090815260ce602052604090208054806122b9576122b9613225565b600082815260209020810160001990810180546001600160a01b031916905501905550505050565b6000808251604114156123185760208301516040840151606085015160001a61230c878285856125de565b9450945050505061234a565b82516040141561234257602083015160408401516123378683836126cb565b93509350505061234a565b506000905060025b9250929050565b60008160048111156123655761236561323b565b141561236e5750565b60018160048111156123825761238261323b565b14156123d05760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606401610659565b60028160048111156123e4576123e461323b565b14156124325760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606401610659565b60038160048111156124465761244661323b565b141561249f5760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b6064820152608401610659565b60048160048111156124b3576124b361323b565b141561066b5760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c604482015261756560f01b6064820152608401610659565b6000612561826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166127049092919063ffffffff16565b805190915015610a44578080602001905181019061257f9190612f6b565b610a445760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610659565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a083111561261557506000905060036126c2565b8460ff16601b1415801561262d57508460ff16601c14155b1561263e57506000905060046126c2565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015612692573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b0381166126bb576000600192509250506126c2565b9150600090505b94509492505050565b6000806001600160ff1b038316816126e860ff86901c601b6131f6565b90506126f6878288856125de565b935093505050935093915050565b6060612713848460008561271b565b949350505050565b60608247101561277c5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401610659565b6001600160a01b0385163b6127d35760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610659565b600080866001600160a01b031685876040516127ef9190613251565b60006040518083038185875af1925050503d806000811461282c576040519150601f19603f3d011682016040523d82523d6000602084013e612831565b606091505b509150915061284182828661284c565b979650505050505050565b6060831561285b575081611e80565b82511561286b5782518084602001fd5b8160405162461bcd60e51b8152600401610659919061326d565b6001600160a01b038116811461066b57600080fd5b6000602082840312156128ac57600080fd5b8135611e8081612885565b6000602082840312156128c957600080fd5b5035919050565b80356128db81612885565b919050565b634e487b7160e01b600052604160045260246000fd5b60405160c0810167ffffffffffffffff81118282101715612919576129196128e0565b60405290565b604051601f8201601f1916810167ffffffffffffffff81118282101715612948576129486128e0565b604052919050565b60008060008060008060c0878903121561296957600080fd5b863561297481612885565b955060208781013561298581612885565b955060408801359450606088013561299c81612885565b93506080880135925060a088013567ffffffffffffffff808211156129c057600080fd5b818a0191508a601f8301126129d457600080fd5b8135818111156129e6576129e66128e0565b6129f8601f8201601f1916850161291f565b91508082528b84828501011115612a0e57600080fd5b80848401858401376000848284010152508093505050509295509295509295565b600080600060608486031215612a4457600080fd5b8335612a4f81612885565b92506020840135612a5f81612885565b929592945050506040919091013590565b600060208284031215612a8257600080fd5b813560ff81168114611e8057600080fd5b60008060208385031215612aa657600080fd5b823567ffffffffffffffff80821115612abe57600080fd5b818501915085601f830112612ad257600080fd5b813581811115612ae157600080fd5b8660208260051b8501011115612af657600080fd5b60209290920196919550909350505050565b60008060408385031215612b1b57600080fd5b8235612b2681612885565b91506020830135612b3681612885565b809150509250929050565b600081518084526020808501945080840160005b83811015612b7a5781516001600160a01b031687529582019590820190600101612b55565b509495945050505050565b600081518084526020808501945080840160005b83811015612b7a57815187529582019590820190600101612b99565b604081526000612bc86040830185612b41565b8281036020840152612bda8185612b85565b95945050505050565b600067ffffffffffffffff821115612bfd57612bfd6128e0565b5060051b60200190565b600082601f830112612c1857600080fd5b81356020612c2d612c2883612be3565b61291f565b82815260059290921b84018101918181019086841115612c4c57600080fd5b8286015b84811015612c70578035612c6381612885565b8352918301918301612c50565b509695505050505050565b600082601f830112612c8c57600080fd5b81356020612c9c612c2883612be3565b82815260059290921b84018101918181019086841115612cbb57600080fd5b8286015b84811015612c705780358352918301918301612cbf565b600060408284031215612ce857600080fd5b6040516040810181811067ffffffffffffffff82111715612d0b57612d0b6128e0565b6040529050808235612d1c81612885565b815260208301356bffffffffffffffffffffffff81168114612d3d57600080fd5b6020919091015292915050565b803563ffffffff811681146128db57600080fd5b600060208284031215612d7057600080fd5b813567ffffffffffffffff80821115612d8857600080fd5b9083019060e08286031215612d9c57600080fd5b612da46128f6565b823582811115612db357600080fd5b612dbf87828601612c07565b825250602083013582811115612dd457600080fd5b612de087828601612c7b565b602083015250612df2604084016128d0565b6040820152612e048660608501612cd6565b6060820152612e1560a08401612d4a565b6080820152612e2660c084016128d0565b60a082015295945050505050565b60008060008060808587031215612e4a57600080fd5b8435612e5581612885565b93506020850135612e6581612885565b9250604085013591506060850135612e7c81612885565b939692955090935050565b60008060408385031215612e9a57600080fd5b8235612ea581612885565b946020939093013593505050565b60008060008060808587031215612ec957600080fd5b8435612ed481612885565b93506020850135612ee481612885565b92506040850135612ef481612885565b9396929550929360600135925050565b600060208284031215612f1657600080fd5b8151611e8081612885565b6020808252602a908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526939903ab73830bab9b2b960b11b606082015260800190565b600060208284031215612f7d57600080fd5b81518015158114611e8057600080fd5b60208082526028908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526739903830bab9b2b960c11b606082015260800190565b602080825260409082018190527f53747261746567794d616e616765722e6f6e6c7944656c65676174696f6e4d61908201527f6e616765723a206e6f74207468652044656c65676174696f6e4d616e61676572606082015260800190565b60208082526044908201527f53747261746567794d616e616765722e6f6e6c7953747261746567795768697460408201527f656c69737465723a206e6f742074686520737472617465677957686974656c6960608201526339ba32b960e11b608082015260a00190565b634e487b7160e01b600052603260045260246000fd5b60e0815260006130c660e0830189612b41565b82810360208401526130d88189612b85565b6001600160a01b0397881660408501528651881660608501526020909601516bffffffffffffffffffffffff166080840152505063ffffffff9290921660a083015290921660c09092019190915292915050565b60005b8381101561314757818101518382015260200161312f565b83811115610c535750506000910152565b6000815180845261317081602086016020860161312c565b601f01601f19169290920160200192915050565b8281526040602082015260006127136040830184613158565b6000602082840312156131af57600080fd5b81516001600160e01b031981168114611e8057600080fd5b6000602082840312156131d957600080fd5b5051919050565b634e487b7160e01b600052601160045260246000fd5b60008219821115613209576132096131e0565b500190565b600082821015613220576132206131e0565b500390565b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052602160045260246000fd5b6000825161326381846020870161312c565b9190910192915050565b602081526000611e80602083018461315856fea2646970667358221220c56189ec727d108892fe316fda0640a975c27d8b087d6f78a4efbb1e4a58677064736f6c634300080c0033","storage":{"0x0":"0xff"}},"0xc3e53f4d16ae77db1c982e75a937b9f60fe63690":{"nonce":1,"balance":"0x0","code":"0x60806040526004361061004e5760003560e01c80633659cfe6146100655780634f1ef286146100855780635c60da1b146100985780638f283970146100c9578063f851a440146100e95761005d565b3661005d5761005b6100fe565b005b61005b6100fe565b34801561007157600080fd5b5061005b6100803660046106f1565b610118565b61005b61009336600461070c565b61015f565b3480156100a457600080fd5b506100ad6101d0565b6040516001600160a01b03909116815260200160405180910390f35b3480156100d557600080fd5b5061005b6100e43660046106f1565b61020b565b3480156100f557600080fd5b506100ad610235565b61010661029b565b61011661011161033a565b610344565b565b610120610368565b6001600160a01b0316336001600160a01b03161415610157576101548160405180602001604052806000815250600061039b565b50565b6101546100fe565b610167610368565b6001600160a01b0316336001600160a01b031614156101c8576101c38383838080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506001925061039b915050565b505050565b6101c36100fe565b60006101da610368565b6001600160a01b0316336001600160a01b03161415610200576101fb61033a565b905090565b6102086100fe565b90565b610213610368565b6001600160a01b0316336001600160a01b0316141561015757610154816103c6565b600061023f610368565b6001600160a01b0316336001600160a01b03161415610200576101fb610368565b6060610285838360405180606001604052806027815260200161080b6027913961041a565b9392505050565b6001600160a01b03163b151590565b6102a3610368565b6001600160a01b0316336001600160a01b031614156101165760405162461bcd60e51b815260206004820152604260248201527f5472616e73706172656e745570677261646561626c6550726f78793a2061646d60448201527f696e2063616e6e6f742066616c6c6261636b20746f2070726f78792074617267606482015261195d60f21b608482015260a4015b60405180910390fd5b60006101fb6104f7565b3660008037600080366000845af43d6000803e808015610363573d6000f35b3d6000fd5b60007fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b546001600160a01b0316919050565b6103a48361051f565b6000825111806103b15750805b156101c3576103c08383610260565b50505050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f6103ef610368565b604080516001600160a01b03928316815291841660208301520160405180910390a16101548161055f565b60606001600160a01b0384163b6104825760405162461bcd60e51b815260206004820152602660248201527f416464726573733a2064656c65676174652063616c6c20746f206e6f6e2d636f6044820152651b9d1c9858dd60d21b6064820152608401610331565b600080856001600160a01b03168560405161049d91906107bb565b600060405180830381855af49150503d80600081146104d8576040519150601f19603f3d011682016040523d82523d6000602084013e6104dd565b606091505b50915091506104ed828286610608565b9695505050505050565b60007f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc61038c565b61052881610641565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b6001600160a01b0381166105c45760405162461bcd60e51b815260206004820152602660248201527f455243313936373a206e65772061646d696e20697320746865207a65726f206160448201526564647265737360d01b6064820152608401610331565b807fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b80546001600160a01b0319166001600160a01b039290921691909117905550565b60608315610617575081610285565b8251156106275782518084602001fd5b8160405162461bcd60e51b815260040161033191906107d7565b6001600160a01b0381163b6106ae5760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b6064820152608401610331565b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc6105e7565b80356001600160a01b03811681146106ec57600080fd5b919050565b60006020828403121561070357600080fd5b610285826106d5565b60008060006040848603121561072157600080fd5b61072a846106d5565b9250602084013567ffffffffffffffff8082111561074757600080fd5b818601915086601f83011261075b57600080fd5b81358181111561076a57600080fd5b87602082850101111561077c57600080fd5b6020830194508093505050509250925092565b60005b838110156107aa578181015183820152602001610792565b838111156103c05750506000910152565b600082516107cd81846020870161078f565b9190910192915050565b60208152600082518060208401526107f681604085016020870161078f565b601f01601f1916919091016040019291505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a2646970667358221220e0ca31ca14c3ab02f9d35807e213496778d76ad573a18c89caa6360e8a17421464736f6c634300080c0033","storage":{"0x0":"0x9635f643e140090a9a8dcd712ed6285858cebef0001","0x1":"0x0","0x64":"0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266","0x96":"0x1","0x9c":"0x3","0x9d":"0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266","0x9e":"0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266","0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc":"0x99bba657f2bbc93c02d617f8ba121cb8fc104acf","0x683723e34a772b6e4f2c919bba7fa32ed8ea11a8325f54da7db716e9d9dd98c7":"0x643a9800002710","0xaf85b9071dfafeac1409d3f1d19bafc9bc7c37974cde8df0ee6168f0086e539c":"0xa82ff9afd8f496c3d6ac40e2a0f282e47488cfc9","0xaf85b9071dfafeac1409d3f1d19bafc9bc7c37974cde8df0ee6168f0086e539d":"0x84ea74d481ee0a5332c457a4d796187f6ba67feb","0xaf85b9071dfafeac1409d3f1d19bafc9bc7c37974cde8df0ee6168f0086e539e":"0x9e545e3c0baab3e08cdfd552c960a1050f373042","0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103":"0x7a2088a1bfc9d81c55368ae168c2c02570cb814f"}},"0xc5a5c42992decbae36851359345fe25997f5c42d":{"nonce":1,"balance":"0x0","code":"0x6080604052348015600f57600080fd5b506004361060285760003560e01c8063c298557814602d575b600080fd5b600060405190815260200160405180910390f3fea2646970667358221220d4f8d483d0b8632b73020e6c75711593324a89a8e9f2e445827f8d5352f9ed6364736f6c634300080c0033","storage":{}},"0xc6e7df5e7b4f2a278906862b61205850344d4e7d":{"nonce":1,"balance":"0x0","code":"0x608060405234801561001057600080fd5b506004361061018e5760003560e01c80635c975abb116100de578063ab5921e111610097578063df6fadc111610071578063df6fadc114610366578063e3dae51c14610381578063f3e7387514610394578063fabc1cbc146103a757600080fd5b8063ab5921e11461032b578063ce7c2ac214610340578063d9caed121461035357600080fd5b80635c975abb146102c857806361b01b5d146102d05780637a8b2637146102d9578063886f1195146102ec5780638c871019146103055780638f6a62401461031857600080fd5b80633a98ef391161014b578063485cc95511610125578063485cc9551461026b578063553ca5f81461027e578063595c6a67146102915780635ac86ab71461029957600080fd5b80633a98ef391461023857806343fe08b01461024f57806347e7ef241461025857600080fd5b8063019e27291461019357806310d67a2f146101a857806311c70c9d146101bb578063136439dd146101ce5780632495a599146101e157806339b70e3814610211575b600080fd5b6101a66101a13660046117b2565b6103ba565b005b6101a66101b63660046117fc565b61049d565b6101a66101c9366004611819565b610550565b6101a66101dc36600461183b565b610605565b6032546101f4906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b6101f47f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c981565b61024160335481565b604051908152602001610208565b61024160645481565b610241610266366004611854565b610749565b6101a6610279366004611880565b610969565b61024161028c3660046117fc565b610a37565b6101a6610a4b565b6102b86102a73660046118b9565b6001805460ff9092161b9081161490565b6040519015158152602001610208565b600154610241565b61024160655481565b6102416102e736600461183b565b610b17565b6000546101f4906201000090046001600160a01b031681565b61024161031336600461183b565b610b62565b6102416103263660046117fc565b610b6d565b610333610b7b565b604051610208919061190c565b61024161034e3660046117fc565b610b9b565b6101a661036136600461193f565b610c30565b60645460655460408051928352602083019190915201610208565b61024161038f36600461183b565b610e7d565b6102416103a236600461183b565b610eb6565b6101a66103b536600461183b565b610ec1565b600054610100900460ff16158080156103da5750600054600160ff909116105b806103f45750303b1580156103f4575060005460ff166001145b6104195760405162461bcd60e51b815260040161041090611980565b60405180910390fd5b6000805460ff19166001179055801561043c576000805461ff0019166101001790555b610446858561101d565b610450838361112a565b8015610496576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050505050565b600060029054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156104f0573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061051491906119ce565b6001600160a01b0316336001600160a01b0316146105445760405162461bcd60e51b8152600401610410906119eb565b61054d816111bb565b50565b600060029054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156105a3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105c791906119ce565b6001600160a01b0316336001600160a01b0316146105f75760405162461bcd60e51b8152600401610410906119eb565b610601828261101d565b5050565b60005460405163237dfb4760e11b8152336004820152620100009091046001600160a01b0316906346fbf68e90602401602060405180830381865afa158015610652573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106769190611a35565b6106925760405162461bcd60e51b815260040161041090611a57565b6001548181161461070b5760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e70617573653a20696e76616c696420617474656d70742060448201527f746f20756e70617573652066756e6374696f6e616c69747900000000000000006064820152608401610410565b600181905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d906020015b60405180910390a250565b6001805460009182918116141561079e5760405162461bcd60e51b815260206004820152601960248201527814185d5cd8589b194e881a5b99195e081a5cc81c185d5cd959603a1b6044820152606401610410565b336001600160a01b037f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c916146108165760405162461bcd60e51b815260206004820181905260248201527f5374726174656779426173652e6f6e6c7953747261746567794d616e616765726044820152606401610410565b61082084846112c0565b6032546001600160a01b0385811691161461089c5760405162461bcd60e51b815260206004820152603660248201527f5374726174656779426173652e6465706f7369743a2043616e206f6e6c79206460448201527532b837b9b4ba103ab73232b9363cb4b733aa37b5b2b760511b6064820152608401610410565b60335460006108ad6103e883611ab5565b905060006103e86108bc611398565b6108c69190611ab5565b905060006108d48783611acd565b9050806108e18489611ae4565b6108eb9190611b03565b9550856109515760405162461bcd60e51b815260206004820152602e60248201527f5374726174656779426173652e6465706f7369743a206e65775368617265732060448201526d63616e6e6f74206265207a65726f60901b6064820152608401610410565b61095b8685611ab5565b603355505050505092915050565b600054610100900460ff16158080156109895750600054600160ff909116105b806109a35750303b1580156109a3575060005460ff166001145b6109bf5760405162461bcd60e51b815260040161041090611980565b6000805460ff1916600117905580156109e2576000805461ff0019166101001790555b6109ec838361112a565b8015610a32576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050565b6000610a456102e783610b9b565b92915050565b60005460405163237dfb4760e11b8152336004820152620100009091046001600160a01b0316906346fbf68e90602401602060405180830381865afa158015610a98573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610abc9190611a35565b610ad85760405162461bcd60e51b815260040161041090611a57565b600019600181905560405190815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a2565b6000806103e8603354610b2a9190611ab5565b905060006103e8610b39611398565b610b439190611ab5565b905081610b508583611ae4565b610b5a9190611b03565b949350505050565b6000610a4582610e7d565b6000610a456103a283610b9b565b60606040518060800160405280604d8152602001611b5b604d9139905090565b604051633d3f06c960e11b81526001600160a01b0382811660048301523060248301526000917f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c990911690637a7e0d9290604401602060405180830381865afa158015610c0c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a459190611b25565b6001805460029081161415610c835760405162461bcd60e51b815260206004820152601960248201527814185d5cd8589b194e881a5b99195e081a5cc81c185d5cd959603a1b6044820152606401610410565b336001600160a01b037f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c91614610cfb5760405162461bcd60e51b815260206004820181905260248201527f5374726174656779426173652e6f6e6c7953747261746567794d616e616765726044820152606401610410565b6032546001600160a01b03848116911614610d7e5760405162461bcd60e51b815260206004820152603b60248201527f5374726174656779426173652e77697468647261773a2043616e206f6e6c792060448201527f77697468647261772074686520737472617465677920746f6b656e00000000006064820152608401610410565b60335480831115610e0d5760405162461bcd60e51b815260206004820152604d60248201527f5374726174656779426173652e77697468647261773a20616d6f756e7453686160448201527f726573206d757374206265206c657373207468616e206f7220657175616c207460648201526c6f20746f74616c53686172657360981b608482015260a401610410565b6000610e1b6103e883611ab5565b905060006103e8610e2a611398565b610e349190611ab5565b9050600082610e438784611ae4565b610e4d9190611b03565b9050610e598685611acd565b603355603254610e73906001600160a01b0316898361140a565b5050505050505050565b6000806103e8603354610e909190611ab5565b905060006103e8610e9f611398565b610ea99190611ab5565b905080610b508386611ae4565b6000610a4582610b17565b600060029054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610f14573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f3891906119ce565b6001600160a01b0316336001600160a01b031614610f685760405162461bcd60e51b8152600401610410906119eb565b600154198119600154191614610fe65760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e756e70617573653a20696e76616c696420617474656d7060448201527f7420746f2070617573652066756e6374696f6e616c69747900000000000000006064820152608401610410565b600181905560405181815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c9060200161073e565b60645460408051918252602082018490527ff97ed4e083acac67830025ecbc756d8fe847cdbdca4cee3fe1e128e98b54ecb5910160405180910390a160655460408051918252602082018390527f6ab181e0440bfbf4bacdf2e99674735ce6638005490688c5f994f5399353e452910160405180910390a18082111561111f5760405162461bcd60e51b815260206004820152604b60248201527f53747261746567794261736554564c4c696d6974732e5f73657454564c4c696d60448201527f6974733a206d61785065724465706f7369742065786365656473206d6178546f60648201526a74616c4465706f7369747360a81b608482015260a401610410565b606491909155606555565b600054610100900460ff166111955760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b6064820152608401610410565b603280546001600160a01b0319166001600160a01b03841617905561060181600061145c565b6001600160a01b0381166112495760405162461bcd60e51b815260206004820152604960248201527f5061757361626c652e5f73657450617573657252656769737472793a206e657760448201527f50617573657252656769737472792063616e6e6f7420626520746865207a65726064820152686f206164647265737360b81b608482015260a401610410565b600054604080516001600160a01b03620100009093048316815291831660208301527f6e9fcd539896fca60e8b0f01dd580233e48a6b0f7df013b89ba7f565869acdb6910160405180910390a1600080546001600160a01b03909216620100000262010000600160b01b0319909216919091179055565b60645481111561132a5760405162461bcd60e51b815260206004820152602f60248201527f53747261746567794261736554564c4c696d6974733a206d617820706572206460448201526e195c1bdcda5d08195e18d959591959608a1b6064820152608401610410565b606554611335611398565b11156106015760405162461bcd60e51b815260206004820152602c60248201527f53747261746567794261736554564c4c696d6974733a206d6178206465706f7360448201526b1a5d1cc8195e18d95959195960a21b6064820152608401610410565b6032546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa1580156113e1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114059190611b25565b905090565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052610a32908490611548565b6000546201000090046001600160a01b031615801561148357506001600160a01b03821615155b6115055760405162461bcd60e51b815260206004820152604760248201527f5061757361626c652e5f696e697469616c697a655061757365723a205f696e6960448201527f7469616c697a6550617573657228292063616e206f6e6c792062652063616c6c6064820152666564206f6e636560c81b608482015260a401610410565b600181905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a2610601826111bb565b600061159d826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b031661161a9092919063ffffffff16565b805190915015610a3257808060200190518101906115bb9190611a35565b610a325760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610410565b60606116298484600085611633565b90505b9392505050565b6060824710156116945760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401610410565b6001600160a01b0385163b6116eb5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610410565b600080866001600160a01b031685876040516117079190611b3e565b60006040518083038185875af1925050503d8060008114611744576040519150601f19603f3d011682016040523d82523d6000602084013e611749565b606091505b5091509150611759828286611764565b979650505050505050565b6060831561177357508161162c565b8251156117835782518084602001fd5b8160405162461bcd60e51b8152600401610410919061190c565b6001600160a01b038116811461054d57600080fd5b600080600080608085870312156117c857600080fd5b843593506020850135925060408501356117e18161179d565b915060608501356117f18161179d565b939692955090935050565b60006020828403121561180e57600080fd5b813561162c8161179d565b6000806040838503121561182c57600080fd5b50508035926020909101359150565b60006020828403121561184d57600080fd5b5035919050565b6000806040838503121561186757600080fd5b82356118728161179d565b946020939093013593505050565b6000806040838503121561189357600080fd5b823561189e8161179d565b915060208301356118ae8161179d565b809150509250929050565b6000602082840312156118cb57600080fd5b813560ff8116811461162c57600080fd5b60005b838110156118f75781810151838201526020016118df565b83811115611906576000848401525b50505050565b602081526000825180602084015261192b8160408501602087016118dc565b601f01601f19169190910160400192915050565b60008060006060848603121561195457600080fd5b833561195f8161179d565b9250602084013561196f8161179d565b929592945050506040919091013590565b6020808252602e908201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160408201526d191e481a5b9a5d1a585b1a5e995960921b606082015260800190565b6000602082840312156119e057600080fd5b815161162c8161179d565b6020808252602a908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526939903ab73830bab9b2b960b11b606082015260800190565b600060208284031215611a4757600080fd5b8151801515811461162c57600080fd5b60208082526028908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526739903830bab9b2b960c11b606082015260800190565b634e487b7160e01b600052601160045260246000fd5b60008219821115611ac857611ac8611a9f565b500190565b600082821015611adf57611adf611a9f565b500390565b6000816000190483118215151615611afe57611afe611a9f565b500290565b600082611b2057634e487b7160e01b600052601260045260246000fd5b500490565b600060208284031215611b3757600080fd5b5051919050565b60008251611b508184602087016118dc565b919091019291505056fe4261736520537472617465677920696d706c656d656e746174696f6e20746f20696e68657269742066726f6d20666f72206d6f726520636f6d706c657820696d706c656d656e746174696f6e73a264697066735822122034593a0699459364f9a894977ab2a32440eec074a8626722acd4cd4064c0abf864736f6c634300080c0033","storage":{"0x0":"0xff"}},"0xcf7ed3acca5a467e9e704c703e8d87f634fb0fc9":{"nonce":1,"balance":"0x0","code":"0x60806040526004361061004e5760003560e01c80633659cfe6146100655780634f1ef286146100855780635c60da1b146100985780638f283970146100c9578063f851a440146100e95761005d565b3661005d5761005b6100fe565b005b61005b6100fe565b34801561007157600080fd5b5061005b6100803660046106f1565b610118565b61005b61009336600461070c565b61015f565b3480156100a457600080fd5b506100ad6101d0565b6040516001600160a01b03909116815260200160405180910390f35b3480156100d557600080fd5b5061005b6100e43660046106f1565b61020b565b3480156100f557600080fd5b506100ad610235565b61010661029b565b61011661011161033a565b610344565b565b610120610368565b6001600160a01b0316336001600160a01b03161415610157576101548160405180602001604052806000815250600061039b565b50565b6101546100fe565b610167610368565b6001600160a01b0316336001600160a01b031614156101c8576101c38383838080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506001925061039b915050565b505050565b6101c36100fe565b60006101da610368565b6001600160a01b0316336001600160a01b03161415610200576101fb61033a565b905090565b6102086100fe565b90565b610213610368565b6001600160a01b0316336001600160a01b0316141561015757610154816103c6565b600061023f610368565b6001600160a01b0316336001600160a01b03161415610200576101fb610368565b6060610285838360405180606001604052806027815260200161080b6027913961041a565b9392505050565b6001600160a01b03163b151590565b6102a3610368565b6001600160a01b0316336001600160a01b031614156101165760405162461bcd60e51b815260206004820152604260248201527f5472616e73706172656e745570677261646561626c6550726f78793a2061646d60448201527f696e2063616e6e6f742066616c6c6261636b20746f2070726f78792074617267606482015261195d60f21b608482015260a4015b60405180910390fd5b60006101fb6104f7565b3660008037600080366000845af43d6000803e808015610363573d6000f35b3d6000fd5b60007fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b546001600160a01b0316919050565b6103a48361051f565b6000825111806103b15750805b156101c3576103c08383610260565b50505050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f6103ef610368565b604080516001600160a01b03928316815291841660208301520160405180910390a16101548161055f565b60606001600160a01b0384163b6104825760405162461bcd60e51b815260206004820152602660248201527f416464726573733a2064656c65676174652063616c6c20746f206e6f6e2d636f6044820152651b9d1c9858dd60d21b6064820152608401610331565b600080856001600160a01b03168560405161049d91906107bb565b600060405180830381855af49150503d80600081146104d8576040519150601f19603f3d011682016040523d82523d6000602084013e6104dd565b606091505b50915091506104ed828286610608565b9695505050505050565b60007f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc61038c565b61052881610641565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b6001600160a01b0381166105c45760405162461bcd60e51b815260206004820152602660248201527f455243313936373a206e65772061646d696e20697320746865207a65726f206160448201526564647265737360d01b6064820152608401610331565b807fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b80546001600160a01b0319166001600160a01b039290921691909117905550565b60608315610617575081610285565b8251156106275782518084602001fd5b8160405162461bcd60e51b815260040161033191906107d7565b6001600160a01b0381163b6106ae5760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b6064820152608401610331565b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc6105e7565b80356001600160a01b03811681146106ec57600080fd5b919050565b60006020828403121561070357600080fd5b610285826106d5565b60008060006040848603121561072157600080fd5b61072a846106d5565b9250602084013567ffffffffffffffff8082111561074757600080fd5b818601915086601f83011261075b57600080fd5b81358181111561076a57600080fd5b87602082850101111561077c57600080fd5b6020830194508093505050509250925092565b60005b838110156107aa578181015183820152602001610792565b838111156103c05750506000910152565b600082516107cd81846020870161078f565b9190910192915050565b60208152600082518060208401526107f681604085016020870161078f565b601f01601f1916919091016040019291505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a2646970667358221220bceca38d0e447b38e612e8ea5bb02b1e1fcac6609b19aa0fd3fd43aa4b97bf1b64736f6c634300080c0033","storage":{"0x0":"0x1","0x33":"0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266","0x65":"0xe7f1725e7734ce288f8367e1bb143e90bb3f0512","0x66":"0x0","0x97":"0x831f01b2aeb61d5d8c019704e62c25763057a8806c5c790bc8b4c99ee54ac8a7","0x9d":"0x1","0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc":"0x610178da211fef7d417bc0e6fed39f05609ad788","0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103":"0x5fbdb2315678afecb367f032d93f642f64180aa3"}},"0xdc64a140aa3e981100a9beca4e685f962f0cf6c9":{"nonce":1,"balance":"0x0","code":"0x60806040526004361061004e5760003560e01c80633659cfe6146100655780634f1ef286146100855780635c60da1b146100985780638f283970146100c9578063f851a440146100e95761005d565b3661005d5761005b6100fe565b005b61005b6100fe565b34801561007157600080fd5b5061005b6100803660046106f1565b610118565b61005b61009336600461070c565b61015f565b3480156100a457600080fd5b506100ad6101d0565b6040516001600160a01b03909116815260200160405180910390f35b3480156100d557600080fd5b5061005b6100e43660046106f1565b61020b565b3480156100f557600080fd5b506100ad610235565b61010661029b565b61011661011161033a565b610344565b565b610120610368565b6001600160a01b0316336001600160a01b03161415610157576101548160405180602001604052806000815250600061039b565b50565b6101546100fe565b610167610368565b6001600160a01b0316336001600160a01b031614156101c8576101c38383838080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506001925061039b915050565b505050565b6101c36100fe565b60006101da610368565b6001600160a01b0316336001600160a01b03161415610200576101fb61033a565b905090565b6102086100fe565b90565b610213610368565b6001600160a01b0316336001600160a01b0316141561015757610154816103c6565b600061023f610368565b6001600160a01b0316336001600160a01b03161415610200576101fb610368565b6060610285838360405180606001604052806027815260200161080b6027913961041a565b9392505050565b6001600160a01b03163b151590565b6102a3610368565b6001600160a01b0316336001600160a01b031614156101165760405162461bcd60e51b815260206004820152604260248201527f5472616e73706172656e745570677261646561626c6550726f78793a2061646d60448201527f696e2063616e6e6f742066616c6c6261636b20746f2070726f78792074617267606482015261195d60f21b608482015260a4015b60405180910390fd5b60006101fb6104f7565b3660008037600080366000845af43d6000803e808015610363573d6000f35b3d6000fd5b60007fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b546001600160a01b0316919050565b6103a48361051f565b6000825111806103b15750805b156101c3576103c08383610260565b50505050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f6103ef610368565b604080516001600160a01b03928316815291841660208301520160405180910390a16101548161055f565b60606001600160a01b0384163b6104825760405162461bcd60e51b815260206004820152602660248201527f416464726573733a2064656c65676174652063616c6c20746f206e6f6e2d636f6044820152651b9d1c9858dd60d21b6064820152608401610331565b600080856001600160a01b03168560405161049d91906107bb565b600060405180830381855af49150503d80600081146104d8576040519150601f19603f3d011682016040523d82523d6000602084013e6104dd565b606091505b50915091506104ed828286610608565b9695505050505050565b60007f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc61038c565b61052881610641565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b6001600160a01b0381166105c45760405162461bcd60e51b815260206004820152602660248201527f455243313936373a206e65772061646d696e20697320746865207a65726f206160448201526564647265737360d01b6064820152608401610331565b807fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b80546001600160a01b0319166001600160a01b039290921691909117905550565b60608315610617575081610285565b8251156106275782518084602001fd5b8160405162461bcd60e51b815260040161033191906107d7565b6001600160a01b0381163b6106ae5760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b6064820152608401610331565b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc6105e7565b80356001600160a01b03811681146106ec57600080fd5b919050565b60006020828403121561070357600080fd5b610285826106d5565b60008060006040848603121561072157600080fd5b61072a846106d5565b9250602084013567ffffffffffffffff8082111561074757600080fd5b818601915086601f83011261075b57600080fd5b81358181111561076a57600080fd5b87602082850101111561077c57600080fd5b6020830194508093505050509250925092565b60005b838110156107aa578181015183820152602001610792565b838111156103c05750506000910152565b600082516107cd81846020870161078f565b9190910192915050565b60208152600082518060208401526107f681604085016020870161078f565b601f01601f1916919091016040019291505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a2646970667358221220bceca38d0e447b38e612e8ea5bb02b1e1fcac6609b19aa0fd3fd43aa4b97bf1b64736f6c634300080c0033","storage":{"0x0":"0x1","0x33":"0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266","0x97":"0xe7f1725e7734ce288f8367e1bb143e90bb3f0512","0x98":"0x0","0xc9":"0xd65ac9700cec4e530497617d02afdf0d5de3ed18466aca1578edcbce0d40ee16","0xcb":"0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266","0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc":"0xb7f8bc63bbcad18155201308c8f3540b07f84f5e","0x9c7f15e2efdc949baef1d04ae2dc54dd4c243a203e1838d067abde08bd01fcfb":"0x1","0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103":"0x5fbdb2315678afecb367f032d93f642f64180aa3"}},"0xe6e340d132b5f46d1e472debcd681b2abc16e57e":{"nonce":1,"balance":"0x0","code":"0x60806040526004361061004e5760003560e01c80633659cfe6146100655780634f1ef286146100855780635c60da1b146100985780638f283970146100c9578063f851a440146100e95761005d565b3661005d5761005b6100fe565b005b61005b6100fe565b34801561007157600080fd5b5061005b6100803660046106f1565b610118565b61005b61009336600461070c565b61015f565b3480156100a457600080fd5b506100ad6101d0565b6040516001600160a01b03909116815260200160405180910390f35b3480156100d557600080fd5b5061005b6100e43660046106f1565b61020b565b3480156100f557600080fd5b506100ad610235565b61010661029b565b61011661011161033a565b610344565b565b610120610368565b6001600160a01b0316336001600160a01b03161415610157576101548160405180602001604052806000815250600061039b565b50565b6101546100fe565b610167610368565b6001600160a01b0316336001600160a01b031614156101c8576101c38383838080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506001925061039b915050565b505050565b6101c36100fe565b60006101da610368565b6001600160a01b0316336001600160a01b03161415610200576101fb61033a565b905090565b6102086100fe565b90565b610213610368565b6001600160a01b0316336001600160a01b0316141561015757610154816103c6565b600061023f610368565b6001600160a01b0316336001600160a01b03161415610200576101fb610368565b6060610285838360405180606001604052806027815260200161080b6027913961041a565b9392505050565b6001600160a01b03163b151590565b6102a3610368565b6001600160a01b0316336001600160a01b031614156101165760405162461bcd60e51b815260206004820152604260248201527f5472616e73706172656e745570677261646561626c6550726f78793a2061646d60448201527f696e2063616e6e6f742066616c6c6261636b20746f2070726f78792074617267606482015261195d60f21b608482015260a4015b60405180910390fd5b60006101fb6104f7565b3660008037600080366000845af43d6000803e808015610363573d6000f35b3d6000fd5b60007fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b546001600160a01b0316919050565b6103a48361051f565b6000825111806103b15750805b156101c3576103c08383610260565b50505050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f6103ef610368565b604080516001600160a01b03928316815291841660208301520160405180910390a16101548161055f565b60606001600160a01b0384163b6104825760405162461bcd60e51b815260206004820152602660248201527f416464726573733a2064656c65676174652063616c6c20746f206e6f6e2d636f6044820152651b9d1c9858dd60d21b6064820152608401610331565b600080856001600160a01b03168560405161049d91906107bb565b600060405180830381855af49150503d80600081146104d8576040519150601f19603f3d011682016040523d82523d6000602084013e6104dd565b606091505b50915091506104ed828286610608565b9695505050505050565b60007f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc61038c565b61052881610641565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b6001600160a01b0381166105c45760405162461bcd60e51b815260206004820152602660248201527f455243313936373a206e65772061646d696e20697320746865207a65726f206160448201526564647265737360d01b6064820152608401610331565b807fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b80546001600160a01b0319166001600160a01b039290921691909117905550565b60608315610617575081610285565b8251156106275782518084602001fd5b8160405162461bcd60e51b815260040161033191906107d7565b6001600160a01b0381163b6106ae5760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b6064820152608401610331565b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc6105e7565b80356001600160a01b03811681146106ec57600080fd5b919050565b60006020828403121561070357600080fd5b610285826106d5565b60008060006040848603121561072157600080fd5b61072a846106d5565b9250602084013567ffffffffffffffff8082111561074757600080fd5b818601915086601f83011261075b57600080fd5b81358181111561076a57600080fd5b87602082850101111561077c57600080fd5b6020830194508093505050509250925092565b60005b838110156107aa578181015183820152602001610792565b838111156103c05750506000910152565b600082516107cd81846020870161078f565b9190910192915050565b60208152600082518060208401526107f681604085016020870161078f565b601f01601f1916919091016040019291505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a2646970667358221220e0ca31ca14c3ab02f9d35807e213496778d76ad573a18c89caa6360e8a17421464736f6c634300080c0033","storage":{"0x0":"0x1","0x33":"0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266","0x65":"0x9635f643e140090a9a8dcd712ed6285858cebef","0x66":"0x0","0x97":"0xa0ee7a142d267c1f36714e4a8f75612f20a797200000000000","0x98":"0xa0ee7a142d267c1f36714e4a8f75612f20a79720","0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc":"0x5eb3bc0a489c5a8288765d2336659ebca68fcd00","0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103":"0x7a2088a1bfc9d81c55368ae168c2c02570cb814f"}},"0xe7f1725e7734ce288f8367e1bb143e90bb3f0512":{"nonce":1,"balance":"0x0","code":"0x608060405234801561001057600080fd5b506004361061004c5760003560e01c806346fbf68e146100515780638568520614610089578063ce5484281461009e578063eab66d7a146100b1575b600080fd5b61007461005f366004610313565b60006020819052908152604090205460ff1681565b60405190151581526020015b60405180910390f35b61009c610097366004610335565b6100dc565b005b61009c6100ac366004610313565b61011d565b6001546100c4906001600160a01b031681565b6040516001600160a01b039091168152602001610080565b6001546001600160a01b0316331461010f5760405162461bcd60e51b815260040161010690610371565b60405180910390fd5b6101198282610153565b5050565b6001546001600160a01b031633146101475760405162461bcd60e51b815260040161010690610371565b61015081610220565b50565b6001600160a01b0382166101bf5760405162461bcd60e51b815260206004820152602d60248201527f50617573657252656769737472792e5f7365745061757365723a207a65726f2060448201526c1859191c995cdcc81a5b9c1d5d609a1b6064820152608401610106565b6001600160a01b03821660008181526020818152604091829020805460ff19168515159081179091558251938452908301527f65d3a1fd4c13f05cba164f80d03ce90fb4b5e21946bfc3ab7dbd434c2d0b9152910160405180910390a15050565b6001600160a01b03811661028e5760405162461bcd60e51b815260206004820152602f60248201527f50617573657252656769737472792e5f736574556e7061757365723a207a657260448201526e1bc81859191c995cdcc81a5b9c1d5d608a1b6064820152608401610106565b600154604080516001600160a01b03928316815291831660208301527f06b4167a2528887a1e97a366eefe8549bfbf1ea3e6ac81cb2564a934d20e8892910160405180910390a1600180546001600160a01b0319166001600160a01b0392909216919091179055565b80356001600160a01b038116811461030e57600080fd5b919050565b60006020828403121561032557600080fd5b61032e826102f7565b9392505050565b6000806040838503121561034857600080fd5b610351836102f7565b91506020830135801515811461036657600080fd5b809150509250929050565b6020808252602a908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526939903ab73830bab9b2b960b11b60608201526080019056fea2646970667358221220f71399fafd06d0e383b21957bcac3bf3986a6a0701bc4c5dc7ee118215f3652364736f6c634300080c0033","storage":{"0x1":"0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266","0x723077b8a1b173adc35e5f0e7e3662fd1208212cb629f9c128551ea7168da722":"0x1"}},"0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266":{"nonce":48,"balance":"0x21e173c4656549bc0a7","code":"0x","storage":{}}}} \ No newline at end of file diff --git a/tests/anvil/data/eigenlayer-deployed-anvil-state.json b/tests/anvil/data/eigenlayer-deployed-anvil-state.json new file mode 100644 index 00000000..e1aa6348 --- /dev/null +++ b/tests/anvil/data/eigenlayer-deployed-anvil-state.json @@ -0,0 +1 @@ +{"accounts":{"0x0000000000000000000000000000000000000000":{"nonce":0,"balance":"0x10acd316ebce800","code":"0x","storage":{}},"0x0165878a594ca255338adfa4d48449f69242eb8f":{"nonce":1,"balance":"0x0","code":"0x60806040526004361061004e5760003560e01c80633659cfe6146100655780634f1ef286146100855780635c60da1b146100985780638f283970146100c9578063f851a440146100e95761005d565b3661005d5761005b6100fe565b005b61005b6100fe565b34801561007157600080fd5b5061005b6100803660046106f1565b610118565b61005b61009336600461070c565b61015f565b3480156100a457600080fd5b506100ad6101d0565b6040516001600160a01b03909116815260200160405180910390f35b3480156100d557600080fd5b5061005b6100e43660046106f1565b61020b565b3480156100f557600080fd5b506100ad610235565b61010661029b565b61011661011161033a565b610344565b565b610120610368565b6001600160a01b0316336001600160a01b03161415610157576101548160405180602001604052806000815250600061039b565b50565b6101546100fe565b610167610368565b6001600160a01b0316336001600160a01b031614156101c8576101c38383838080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506001925061039b915050565b505050565b6101c36100fe565b60006101da610368565b6001600160a01b0316336001600160a01b03161415610200576101fb61033a565b905090565b6102086100fe565b90565b610213610368565b6001600160a01b0316336001600160a01b0316141561015757610154816103c6565b600061023f610368565b6001600160a01b0316336001600160a01b03161415610200576101fb610368565b6060610285838360405180606001604052806027815260200161080b6027913961041a565b9392505050565b6001600160a01b03163b151590565b6102a3610368565b6001600160a01b0316336001600160a01b031614156101165760405162461bcd60e51b815260206004820152604260248201527f5472616e73706172656e745570677261646561626c6550726f78793a2061646d60448201527f696e2063616e6e6f742066616c6c6261636b20746f2070726f78792074617267606482015261195d60f21b608482015260a4015b60405180910390fd5b60006101fb6104f7565b3660008037600080366000845af43d6000803e808015610363573d6000f35b3d6000fd5b60007fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b546001600160a01b0316919050565b6103a48361051f565b6000825111806103b15750805b156101c3576103c08383610260565b50505050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f6103ef610368565b604080516001600160a01b03928316815291841660208301520160405180910390a16101548161055f565b60606001600160a01b0384163b6104825760405162461bcd60e51b815260206004820152602660248201527f416464726573733a2064656c65676174652063616c6c20746f206e6f6e2d636f6044820152651b9d1c9858dd60d21b6064820152608401610331565b600080856001600160a01b03168560405161049d91906107bb565b600060405180830381855af49150503d80600081146104d8576040519150601f19603f3d011682016040523d82523d6000602084013e6104dd565b606091505b50915091506104ed828286610608565b9695505050505050565b60007f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc61038c565b61052881610641565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b6001600160a01b0381166105c45760405162461bcd60e51b815260206004820152602660248201527f455243313936373a206e65772061646d696e20697320746865207a65726f206160448201526564647265737360d01b6064820152608401610331565b807fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b80546001600160a01b0319166001600160a01b039290921691909117905550565b60608315610617575081610285565b8251156106275782518084602001fd5b8160405162461bcd60e51b815260040161033191906107d7565b6001600160a01b0381163b6106ae5760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b6064820152608401610331565b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc6105e7565b80356001600160a01b03811681146106ec57600080fd5b919050565b60006020828403121561070357600080fd5b610285826106d5565b60008060006040848603121561072157600080fd5b61072a846106d5565b9250602084013567ffffffffffffffff8082111561074757600080fd5b818601915086601f83011261075b57600080fd5b81358181111561076a57600080fd5b87602082850101111561077c57600080fd5b6020830194508093505050509250925092565b60005b838110156107aa578181015183820152602001610792565b838111156103c05750506000910152565b600082516107cd81846020870161078f565b9190910192915050565b60208152600082518060208401526107f681604085016020870161078f565b601f01601f1916919091016040019291505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a2646970667358221220bceca38d0e447b38e612e8ea5bb02b1e1fcac6609b19aa0fd3fd43aa4b97bf1b64736f6c634300080c0033","storage":{"0x0":"0x1","0x33":"0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266","0x65":"0xe7f1725e7734ce288f8367e1bb143e90bb3f0512","0x66":"0x1e","0x97":"0x0","0x9a":"0x0","0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc":"0xdcd1bf9a1b36ce34237eeafef220932846bcd82","0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103":"0x5fbdb2315678afecb367f032d93f642f64180aa3"}},"0x0dcd1bf9a1b36ce34237eeafef220932846bcd82":{"nonce":1,"balance":"0x0","code":"0x6080604052600436106101ee5760003560e01c80639104c3191161010d578063c0ccbf10116100a0578063daf12cd41161006f578063daf12cd4146105ec578063ea4d3c9b1461060c578063f2fde38b14610640578063f6848d2414610660578063fabc1cbc1461069b57600080fd5b8063c0ccbf1014610576578063c1de3aef1461058c578063c2c51c40146105ac578063d1c64cc9146105cc57600080fd5b8063a6a509be116100dc578063a6a509be146104ec578063b134427114610502578063beffbb8914610536578063c052bd611461055657600080fd5b80639104c3191461045b5780639b4e4634146104835780639ba0627514610496578063a38406a3146104cc57600080fd5b80635ac86ab71161018557806374cdd7981161015457806374cdd798146103d457806384d8106214610408578063886f11951461041d5780638da5cb5b1461043d57600080fd5b80635ac86ab71461033d5780635c975abb1461037d57806360f4062b14610392578063715018a6146103bf57600080fd5b8063292b7b2b116101c1578063292b7b2b14610288578063387b1300146102d457806339b70e38146102f4578063595c6a671461032857600080fd5b80630cf2686d146101f35780630e81073c1461021557806310d67a2f14610248578063136439dd14610268575b600080fd5b3480156101ff57600080fd5b5061021361020e3660046122df565b6106bb565b005b34801561022157600080fd5b5061023561023036600461230d565b610777565b6040519081526020015b60405180910390f35b34801561025457600080fd5b50610213610263366004612339565b610982565b34801561027457600080fd5b506102136102833660046122df565b610a32565b34801561029457600080fd5b506102bc7f0000000000000000000000008a791620dd6260079bf849dc5567adc3f2fdc31881565b6040516001600160a01b03909116815260200161023f565b3480156102e057600080fd5b506102136102ef366004612356565b610b71565b34801561030057600080fd5b506102bc7f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c981565b34801561033457600080fd5b50610213610eb4565b34801561034957600080fd5b5061036d610358366004612397565b606654600160ff9092169190911b9081161490565b604051901515815260200161023f565b34801561038957600080fd5b50606654610235565b34801561039e57600080fd5b506102356103ad366004612339565b609b6020526000908152604090205481565b3480156103cb57600080fd5b50610213610f7b565b3480156103e057600080fd5b506102bc7f00000000000000000000000000000000219ab540356cbb839cbe05303d7705fa81565b34801561041457600080fd5b506102bc610f8f565b34801561042957600080fd5b506065546102bc906001600160a01b031681565b34801561044957600080fd5b506033546001600160a01b03166102bc565b34801561046757600080fd5b506102bc73beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac081565b610213610491366004612403565b611079565b3480156104a257600080fd5b506102bc6104b1366004612339565b6098602052600090815260409020546001600160a01b031681565b3480156104d857600080fd5b506102bc6104e7366004612339565b611168565b3480156104f857600080fd5b5061023560995481565b34801561050e57600080fd5b506102bc7f0000000000000000000000005fc8d32690cc91d4c39d9d3abcbd16989f87570781565b34801561054257600080fd5b5061021361055136600461230d565b61123a565b34801561056257600080fd5b506097546102bc906001600160a01b031681565b34801561058257600080fd5b50610235609a5481565b34801561059857600080fd5b506102136105a7366004612339565b611451565b3480156105b857600080fd5b506102136105c736600461230d565b611462565b3480156105d857600080fd5b506102356105e7366004612477565b611834565b3480156105f857600080fd5b506102136106073660046124a1565b61193f565b34801561061857600080fd5b506102bc7f000000000000000000000000cf7ed3acca5a467e9e704c703e8d87f634fb0fc981565b34801561064c57600080fd5b5061021361065b366004612339565b611a72565b34801561066c57600080fd5b5061036d61067b366004612339565b6001600160a01b0390811660009081526098602052604090205416151590565b3480156106a757600080fd5b506102136106b63660046122df565b611ae8565b606560009054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561070e573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061073291906124fc565b6001600160a01b0316336001600160a01b03161461076b5760405162461bcd60e51b815260040161076290612519565b60405180910390fd5b61077481611c44565b50565b6000336001600160a01b037f000000000000000000000000cf7ed3acca5a467e9e704c703e8d87f634fb0fc916146107c15760405162461bcd60e51b815260040161076290612563565b6001600160a01b03831661083d5760405162461bcd60e51b815260206004820152603a60248201527f456967656e506f644d616e616765722e6164645368617265733a20706f644f7760448201527f6e65722063616e6e6f74206265207a65726f20616464726573730000000000006064820152608401610762565b60008212156108ab5760405162461bcd60e51b815260206004820152603460248201527f456967656e506f644d616e616765722e6164645368617265733a207368617265604482015273732063616e6e6f74206265206e6567617469766560601b6064820152608401610762565b6108b9633b9aca00836125d7565b1561092c5760405162461bcd60e51b815260206004820152603d60248201527f456967656e506f644d616e616765722e6164645368617265733a20736861726560448201527f73206d75737420626520612077686f6c65204777656920616d6f756e740000006064820152608401610762565b6001600160a01b0383166000908152609b6020526040812054906109508483612601565b6001600160a01b0386166000908152609b6020526040902081905590506109778282611c85565b925050505b92915050565b606560009054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156109d5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109f991906124fc565b6001600160a01b0316336001600160a01b031614610a295760405162461bcd60e51b815260040161076290612519565b61077481611cc7565b60655460405163237dfb4760e11b81523360048201526001600160a01b03909116906346fbf68e90602401602060405180830381865afa158015610a7a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a9e9190612642565b610aba5760405162461bcd60e51b815260040161076290612664565b60665481811614610b335760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e70617573653a20696e76616c696420617474656d70742060448201527f746f20756e70617573652066756e6374696f6e616c69747900000000000000006064820152608401610762565b606681905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d906020015b60405180910390a250565b336001600160a01b037f000000000000000000000000cf7ed3acca5a467e9e704c703e8d87f634fb0fc91614610bb95760405162461bcd60e51b815260040161076290612563565b6001600160a01b038316610c335760405162461bcd60e51b8152602060048201526047602482015260008051602061314183398151915260448201527f546f6b656e733a20706f644f776e65722063616e6e6f74206265207a65726f206064820152666164647265737360c81b608482015260a401610762565b6001600160a01b038216610cb05760405162461bcd60e51b815260206004820152604a602482015260008051602061314183398151915260448201527f546f6b656e733a2064657374696e6174696f6e2063616e6e6f74206265207a65606482015269726f206164647265737360b01b608482015260a401610762565b6000811215610d1f5760405162461bcd60e51b8152602060048201526041602482015260008051602061314183398151915260448201527f546f6b656e733a207368617265732063616e6e6f74206265206e6567617469766064820152606560f81b608482015260a401610762565b610d2d633b9aca00826125d7565b15610da15760405162461bcd60e51b815260206004820152604a602482015260008051602061314183398151915260448201527f546f6b656e733a20736861726573206d75737420626520612077686f6c6520476064820152691dd95a48185b5bdd5b9d60b21b608482015260a401610762565b6001600160a01b0383166000908152609b602052604081205490811215610e38576000610dcd826126ac565b905080831115610e01576001600160a01b0385166000908152609b6020526040812055610dfa81846126c9565b9250610e36565b6001600160a01b0385166000908152609b602052604081208054859290610e29908490612601565b90915550610eaf92505050565b505b6001600160a01b03848116600090815260986020526040908190205490516362483a2160e11b815285831660048201526024810185905291169063c490744290604401600060405180830381600087803b158015610e9557600080fd5b505af1158015610ea9573d6000803e3d6000fd5b50505050505b505050565b60655460405163237dfb4760e11b81523360048201526001600160a01b03909116906346fbf68e90602401602060405180830381865afa158015610efc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f209190612642565b610f3c5760405162461bcd60e51b815260040161076290612664565b600019606681905560405190815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a2565b610f83611dbe565b610f8d6000611e18565b565b606654600090819060019081161415610fe65760405162461bcd60e51b815260206004820152601960248201527814185d5cd8589b194e881a5b99195e081a5cc81c185d5cd959603a1b6044820152606401610762565b336000908152609860205260409020546001600160a01b0316156110685760405162461bcd60e51b815260206004820152603360248201527f456967656e506f644d616e616765722e637265617465506f643a2053656e64656044820152721c88185b1c9958591e481a185cc818481c1bd9606a1b6064820152608401610762565b6000611072611e6a565b9250505090565b606654600090600190811614156110ce5760405162461bcd60e51b815260206004820152601960248201527814185d5cd8589b194e881a5b99195e081a5cc81c185d5cd959603a1b6044820152606401610762565b336000908152609860205260409020546001600160a01b0316806110f7576110f4611e6a565b90505b6040516326d3918d60e21b81526001600160a01b03821690639b4e463490349061112d908b908b908b908b908b90600401612709565b6000604051808303818588803b15801561114657600080fd5b505af115801561115a573d6000803e3d6000fd5b505050505050505050505050565b6001600160a01b038082166000908152609860205260408120549091168061097c57611233836001600160a01b031660001b60405180610940016040528061090e815260200161283361090e9139604080516001600160a01b037f0000000000000000000000008a791620dd6260079bf849dc5567adc3f2fdc318166020820152808201919091526000606082015260800160408051601f1981840301815290829052611218929160200161277e565b60405160208183030381529060405280519060200120612045565b9392505050565b336001600160a01b037f000000000000000000000000cf7ed3acca5a467e9e704c703e8d87f634fb0fc916146112825760405162461bcd60e51b815260040161076290612563565b60008112156112f95760405162461bcd60e51b815260206004820152603760248201527f456967656e506f644d616e616765722e72656d6f76655368617265733a20736860448201527f617265732063616e6e6f74206265206e656761746976650000000000000000006064820152608401610762565b611307633b9aca00826125d7565b1561137c576040805162461bcd60e51b81526020600482015260248101919091527f456967656e506f644d616e616765722e72656d6f76655368617265733a20736860448201527f61726573206d75737420626520612077686f6c65204777656920616d6f756e746064820152608401610762565b6001600160a01b0382166000908152609b60205260408120546113a0908390612793565b905060008112156114315760405162461bcd60e51b815260206004820152604f60248201527f456967656e506f644d616e616765722e72656d6f76655368617265733a20636160448201527f6e6e6f7420726573756c7420696e20706f64206f776e657220686176696e672060648201526e6e656761746976652073686172657360881b608482015260a401610762565b6001600160a01b039092166000908152609b602052604090209190915550565b611459611dbe565b610774816120a1565b6001600160a01b0380831660009081526098602052604090205483911633146114dd5760405162461bcd60e51b815260206004820152602760248201527f456967656e506f644d616e616765722e6f6e6c79456967656e506f643a206e6f6044820152661d0818481c1bd960ca1b6064820152608401610762565b600260c95414156115305760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610762565b600260c9556001600160a01b0383166115cc5760405162461bcd60e51b815260206004820152605260248201527f456967656e506f644d616e616765722e7265636f7264426561636f6e4368616960448201527f6e45544842616c616e63655570646174653a20706f644f776e65722063616e6e6064820152716f74206265207a65726f206164647265737360701b608482015260a401610762565b6115da633b9aca00836127d2565b156116735760405162461bcd60e51b815260206004820152605a60248201527f456967656e506f644d616e616765722e7265636f7264426561636f6e4368616960448201527f6e45544842616c616e63655570646174653a2073686172657344656c7461206d60648201527f75737420626520612077686f6c65204777656920616d6f756e74000000000000608482015260a401610762565b6001600160a01b0383166000908152609b6020526040812054906116978483612601565b6001600160a01b0386166000908152609b602052604081208290559091506116bf8383611c85565b9050801561182757600081121561178a576001600160a01b037f000000000000000000000000cf7ed3acca5a467e9e704c703e8d87f634fb0fc91663132d49678773beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac061171e856126ac565b6040516001600160e01b031960e086901b1681526001600160a01b0393841660048201529290911660248301526044820152606401600060405180830381600087803b15801561176d57600080fd5b505af1158015611781573d6000803e3d6000fd5b50505050611827565b604051631452b9d760e11b81526001600160a01b03878116600483015273beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac06024830152604482018390527f000000000000000000000000cf7ed3acca5a467e9e704c703e8d87f634fb0fc916906328a573ae90606401600060405180830381600087803b15801561180e57600080fd5b505af1158015611822573d6000803e3d6000fd5b505050505b5050600160c95550505050565b60975460405163321accf960e11b815267ffffffffffffffff8316600482015260009182916001600160a01b039091169063643599f290602401602060405180830381865afa15801561188b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118af91906127e6565b90508061097c5760405162461bcd60e51b815260206004820152605260248201527f456967656e506f644d616e616765722e676574426c6f636b526f6f744174546960448201527f6d657374616d703a20737461746520726f6f742061742074696d657374616d70606482015271081b9bdd081e595d08199a5b985b1a5e995960721b608482015260a401610762565b600054610100900460ff161580801561195f5750600054600160ff909116105b806119795750303b158015611979575060005460ff166001145b6119dc5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610762565b6000805460ff1916600117905580156119ff576000805461ff0019166101001790555b611a0886611c44565b611a11856120a1565b611a1a84611e18565b611a2483836120eb565b8015611a6a576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050505050565b611a7a611dbe565b6001600160a01b038116611adf5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610762565b61077481611e18565b606560009054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611b3b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b5f91906124fc565b6001600160a01b0316336001600160a01b031614611b8f5760405162461bcd60e51b815260040161076290612519565b606654198119606654191614611c0d5760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e756e70617573653a20696e76616c696420617474656d7060448201527f7420746f2070617573652066756e6374696f6e616c69747900000000000000006064820152608401610762565b606681905560405181815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c90602001610b66565b609a5460408051918252602082018390527f4e65c41a3597bda732ca64980235cf51494171d5853998763fb05db45afaacb3910160405180910390a1609a55565b6000808313611ca55760008213611c9e5750600061097c565b508061097c565b60008213611cbd57611cb6836126ac565b905061097c565b611cb68383612793565b6001600160a01b038116611d555760405162461bcd60e51b815260206004820152604960248201527f5061757361626c652e5f73657450617573657252656769737472793a206e657760448201527f50617573657252656769737472792063616e6e6f7420626520746865207a65726064820152686f206164647265737360b81b608482015260a401610762565b606554604080516001600160a01b03928316815291831660208301527f6e9fcd539896fca60e8b0f01dd580233e48a6b0f7df013b89ba7f565869acdb6910160405180910390a1606580546001600160a01b0319166001600160a01b0392909216919091179055565b6033546001600160a01b03163314610f8d5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610762565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6000609a546099546001611e7e91906127ff565b1115611ee25760405162461bcd60e51b815260206004820152602d60248201527f456967656e506f644d616e616765722e5f6465706c6f79506f643a20706f642060448201526c1b1a5b5a5d081c995858da1959609a1b6064820152608401610762565b609960008154611ef190612817565b9091555060408051610940810190915261090e808252600091611f9091839133916128336020830139604080516001600160a01b037f0000000000000000000000008a791620dd6260079bf849dc5567adc3f2fdc318166020820152808201919091526000606082015260800160408051601f1981840301815290829052611f7c929160200161277e565b6040516020818303038152906040526121d5565b60405163189acdbd60e31b81523360048201529091506001600160a01b0382169063c4d66de890602401600060405180830381600087803b158015611fd457600080fd5b505af1158015611fe8573d6000803e3d6000fd5b50503360008181526098602052604080822080546001600160a01b0319166001600160a01b038816908117909155905192945092507f21c99d0db02213c32fff5b05cf0a718ab5f858802b91498f80d82270289d856a91a3919050565b604080516001600160f81b03196020808301919091526bffffffffffffffffffffffff193060601b1660218301526035820185905260558083018590528351808403909101815260759092019092528051910120600090611233565b609780546001600160a01b0319166001600160a01b0383169081179091556040517f08f0470754946ccfbb446ff7fd2d6ae6af1bbdae19f85794c0cc5ed5e8ceb4f690600090a250565b6065546001600160a01b031615801561210c57506001600160a01b03821615155b61218e5760405162461bcd60e51b815260206004820152604760248201527f5061757361626c652e5f696e697469616c697a655061757365723a205f696e6960448201527f7469616c697a6550617573657228292063616e206f6e6c792062652063616c6c6064820152666564206f6e636560c81b608482015260a401610762565b606681905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a26121d182611cc7565b5050565b600080844710156122285760405162461bcd60e51b815260206004820152601d60248201527f437265617465323a20696e73756666696369656e742062616c616e63650000006044820152606401610762565b82516122765760405162461bcd60e51b815260206004820181905260248201527f437265617465323a2062797465636f6465206c656e677468206973207a65726f6044820152606401610762565b8383516020850187f590506001600160a01b0381166122d75760405162461bcd60e51b815260206004820152601960248201527f437265617465323a204661696c6564206f6e206465706c6f79000000000000006044820152606401610762565b949350505050565b6000602082840312156122f157600080fd5b5035919050565b6001600160a01b038116811461077457600080fd5b6000806040838503121561232057600080fd5b823561232b816122f8565b946020939093013593505050565b60006020828403121561234b57600080fd5b8135611233816122f8565b60008060006060848603121561236b57600080fd5b8335612376816122f8565b92506020840135612386816122f8565b929592945050506040919091013590565b6000602082840312156123a957600080fd5b813560ff8116811461123357600080fd5b60008083601f8401126123cc57600080fd5b50813567ffffffffffffffff8111156123e457600080fd5b6020830191508360208285010111156123fc57600080fd5b9250929050565b60008060008060006060868803121561241b57600080fd5b853567ffffffffffffffff8082111561243357600080fd5b61243f89838a016123ba565b9097509550602088013591508082111561245857600080fd5b50612465888289016123ba565b96999598509660400135949350505050565b60006020828403121561248957600080fd5b813567ffffffffffffffff8116811461123357600080fd5b600080600080600060a086880312156124b957600080fd5b8535945060208601356124cb816122f8565b935060408601356124db816122f8565b925060608601356124eb816122f8565b949793965091946080013592915050565b60006020828403121561250e57600080fd5b8151611233816122f8565b6020808252602a908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526939903ab73830bab9b2b960b11b606082015260800190565b602080825260409082018190527f456967656e506f644d616e616765722e6f6e6c7944656c65676174696f6e4d61908201527f6e616765723a206e6f74207468652044656c65676174696f6e4d616e61676572606082015260800190565b634e487b7160e01b600052601260045260246000fd5b6000826125e6576125e66125c1565b500690565b634e487b7160e01b600052601160045260246000fd5b600080821280156001600160ff1b0384900385131615612623576126236125eb565b600160ff1b839003841281161561263c5761263c6125eb565b50500190565b60006020828403121561265457600080fd5b8151801515811461123357600080fd5b60208082526028908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526739903830bab9b2b960c11b606082015260800190565b6000600160ff1b8214156126c2576126c26125eb565b5060000390565b6000828210156126db576126db6125eb565b500390565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b60608152600061271d6060830187896126e0565b82810360208401526127308186886126e0565b9150508260408301529695505050505050565b6000815160005b81811015612764576020818501810151868301520161274a565b81811115612773576000828601525b509290920192915050565b60006122d761278d8386612743565b84612743565b60008083128015600160ff1b8501841216156127b1576127b16125eb565b6001600160ff1b03840183138116156127cc576127cc6125eb565b50500390565b6000826127e1576127e16125c1565b500790565b6000602082840312156127f857600080fd5b5051919050565b60008219821115612812576128126125eb565b500190565b600060001982141561282b5761282b6125eb565b506001019056fe608060405260405161090e38038061090e83398101604081905261002291610460565b61002e82826000610035565b505061058a565b61003e83610100565b6040516001600160a01b038416907f1cf3b03a6cf19fa2baba4df148e9dcabedea7f8a5c07840e207e5c089be95d3e90600090a260008251118061007f5750805b156100fb576100f9836001600160a01b0316635c60da1b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156100c5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906100e99190610520565b836102a360201b6100291760201c565b505b505050565b610113816102cf60201b6100551760201c565b6101725760405162461bcd60e51b815260206004820152602560248201527f455243313936373a206e657720626561636f6e206973206e6f74206120636f6e6044820152641d1c9858dd60da1b60648201526084015b60405180910390fd5b6101e6816001600160a01b0316635c60da1b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156101b3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906101d79190610520565b6102cf60201b6100551760201c565b61024b5760405162461bcd60e51b815260206004820152603060248201527f455243313936373a20626561636f6e20696d706c656d656e746174696f6e206960448201526f1cc81b9bdd08184818dbdb9d1c9858dd60821b6064820152608401610169565b806102827fa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d5060001b6102de60201b6100641760201c565b80546001600160a01b0319166001600160a01b039290921691909117905550565b60606102c883836040518060600160405280602781526020016108e7602791396102e1565b9392505050565b6001600160a01b03163b151590565b90565b6060600080856001600160a01b0316856040516102fe919061053b565b600060405180830381855af49150503d8060008114610339576040519150601f19603f3d011682016040523d82523d6000602084013e61033e565b606091505b5090925090506103508683838761035a565b9695505050505050565b606083156103c65782516103bf576001600160a01b0385163b6103bf5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610169565b50816103d0565b6103d083836103d8565b949350505050565b8151156103e85781518083602001fd5b8060405162461bcd60e51b81526004016101699190610557565b80516001600160a01b038116811461041957600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b60005b8381101561044f578181015183820152602001610437565b838111156100f95750506000910152565b6000806040838503121561047357600080fd5b61047c83610402565b60208401519092506001600160401b038082111561049957600080fd5b818501915085601f8301126104ad57600080fd5b8151818111156104bf576104bf61041e565b604051601f8201601f19908116603f011681019083821181831017156104e7576104e761041e565b8160405282815288602084870101111561050057600080fd5b610511836020830160208801610434565b80955050505050509250929050565b60006020828403121561053257600080fd5b6102c882610402565b6000825161054d818460208701610434565b9190910192915050565b6020815260008251806020840152610576816040850160208701610434565b601f01601f19169190910160400192915050565b61034e806105996000396000f3fe60806040523661001357610011610017565b005b6100115b610027610022610067565b610100565b565b606061004e83836040518060600160405280602781526020016102f260279139610124565b9392505050565b6001600160a01b03163b151590565b90565b600061009a7fa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d50546001600160a01b031690565b6001600160a01b0316635c60da1b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156100d7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906100fb9190610249565b905090565b3660008037600080366000845af43d6000803e80801561011f573d6000f35b3d6000fd5b6060600080856001600160a01b03168560405161014191906102a2565b600060405180830381855af49150503d806000811461017c576040519150601f19603f3d011682016040523d82523d6000602084013e610181565b606091505b50915091506101928683838761019c565b9695505050505050565b6060831561020d578251610206576001600160a01b0385163b6102065760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064015b60405180910390fd5b5081610217565b610217838361021f565b949350505050565b81511561022f5781518083602001fd5b8060405162461bcd60e51b81526004016101fd91906102be565b60006020828403121561025b57600080fd5b81516001600160a01b038116811461004e57600080fd5b60005b8381101561028d578181015183820152602001610275565b8381111561029c576000848401525b50505050565b600082516102b4818460208701610272565b9190910192915050565b60208152600082518060208401526102dd816040850160208701610272565b601f01601f1916919091016040019291505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a2646970667358221220d51e81d3bc5ed20a26aeb05dce7e825c503b2061aa78628027300c8d65b9d89a64736f6c634300080c0033416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564456967656e506f644d616e616765722e77697468647261775368617265734173a2646970667358221220543f9ce279848456798b3d87c119b4c7742c70fdf6bb7e22c63123da44aa75d864736f6c634300080c0033","storage":{"0x0":"0xff"}},"0x14dc79964da2c08b23698b3d3cc7ca32193d9955":{"nonce":0,"balance":"0x21e19e0c9bab2400000","code":"0x","storage":{}},"0x15d34aaf54267db7d7c367839aaf71a00a2c6a65":{"nonce":0,"balance":"0x21e19e0c9bab2400000","code":"0x","storage":{}},"0x2279b7a0a67db372996a5fab50d91eaa73d2ebe6":{"nonce":1,"balance":"0x0","code":"0x6080604052600436106101855760003560e01c806374cdd798116100d1578063c49074421161008a578063e251ef5211610064578063e251ef5214610563578063e2c8344514610583578063f2882461146105a3578063fe80b087146105d757600080fd5b8063c490744214610503578063c4d66de814610523578063dda3346c1461054357600080fd5b806374cdd7981461044057806387e0d289146104745780639b4e46341461049b578063a50600f4146104ae578063b522538a146104ce578063baa7145a146104ee57600080fd5b806334bea20a1161013e57806358eaee791161011857806358eaee791461038f5780635d3f65b6146103bc5780636fcd0e53146103dc5780637439841f1461040957600080fd5b806334bea20a146103005780633f65cf191461033b5780634665bcda1461035b57600080fd5b80630b18ff66146101db5780630cd4649e146102185780631a5057be1461022f5780631d905d5c146102635780633106ab53146102af5780633474aa16146102e057600080fd5b366101d657346037600082825461019c9190614a35565b90915550506040513481527f6fdd3dbdb173299608c0aa9f368735857c8842b581f8389238bf05bd04b3bf499060200160405180910390a1005b600080fd5b3480156101e757600080fd5b506033546101fb906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b34801561022457600080fd5b5061022d6105fb565b005b34801561023b57600080fd5b506101fb7f000000000000000000000000a513e6e4b8f2a923d98304ec87f64353c4d5c85381565b34801561026f57600080fd5b506102977f000000000000000000000000000000000000000000000000000000077359400081565b6040516001600160401b03909116815260200161020f565b3480156102bb57600080fd5b506034546102d090600160401b900460ff1681565b604051901515815260200161020f565b3480156102ec57600080fd5b50603454610297906001600160401b031681565b34801561030c57600080fd5b506102d061031b366004614a69565b603560209081526000928352604080842090915290825290205460ff1681565b34801561034757600080fd5b5061022d610356366004614af8565b610764565b34801561036757600080fd5b506101fb7f0000000000000000000000000165878a594ca255338adfa4d48449f69242eb8f81565b34801561039b57600080fd5b506103af6103aa366004614c07565b610c05565b60405161020f9190614c80565b3480156103c857600080fd5b50603854610297906001600160401b031681565b3480156103e857600080fd5b506103fc6103f7366004614c8e565b610c6a565b60405161020f9190614ca7565b34801561041557600080fd5b506103af610424366004614c8e565b600090815260366020526040902054600160c01b900460ff1690565b34801561044c57600080fd5b506101fb7f00000000000000000000000000000000219ab540356cbb839cbe05303d7705fa81565b34801561048057600080fd5b5060335461029790600160a01b90046001600160401b031681565b61022d6104a9366004614cef565b610d17565b3480156104ba57600080fd5b5061022d6104c9366004614d62565b610ec4565b3480156104da57600080fd5b506103fc6104e9366004614c07565b611293565b3480156104fa57600080fd5b5061022d611386565b34801561050f57600080fd5b5061022d61051e366004614e0a565b6113f1565b34801561052f57600080fd5b5061022d61053e366004614e36565b61162e565b34801561054f57600080fd5b5061022d61055e366004614f50565b611806565b34801561056f57600080fd5b5061022d61057e366004615021565b6119d9565b34801561058f57600080fd5b5061022d61059e366004614e0a565b611da4565b3480156105af57600080fd5b506102977f000000000000000000000000000000000000000000000000000000006059f46081565b3480156105e357600080fd5b506105ed60375481565b60405190815260200161020f565b604051635ac86ab760e01b8152600260048201819052907f0000000000000000000000000165878a594ca255338adfa4d48449f69242eb8f6001600160a01b031690635ac86ab790602401602060405180830381865afa158015610663573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610687919061511c565b156106ad5760405162461bcd60e51b81526004016106a49061513e565b60405180910390fd5b6033546001600160a01b031633146106d75760405162461bcd60e51b81526004016106a49061519b565b603454600160401b900460ff16156107015760405162461bcd60e51b81526004016106a4906151e3565b6034805460ff60401b1916600160401b179055603354610729906001600160a01b0316611f87565b6033546040516001600160a01b03909116907fca8dfc8c5e0a67a74501c072a3325f685259bebbae7cfd230ab85198a78b70cd90600090a250565b6033546001600160a01b0316331461078e5760405162461bcd60e51b81526004016106a49061519b565b604051635ac86ab760e01b8152600260048201819052907f0000000000000000000000000165878a594ca255338adfa4d48449f69242eb8f6001600160a01b031690635ac86ab790602401602060405180830381865afa1580156107f6573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061081a919061511c565b156108375760405162461bcd60e51b81526004016106a49061513e565b60335489906001600160401b03600160a01b90910481169082161161086e5760405162461bcd60e51b81526004016106a490615232565b603454600160401b900460ff166108e65760405162461bcd60e51b815260206004820152603660248201527f456967656e506f642e686173456e61626c656452657374616b696e673a2072656044820152751cdd185ada5b99c81a5cc81b9bdd08195b98589b195960521b60648201526084016106a4565b86851480156108f457508483145b6109845760405162461bcd60e51b815260206004820152605560248201527f456967656e506f642e7665726966795769746864726177616c43726564656e7460448201527f69616c733a2076616c696461746f72496e646963657320616e642070726f6f666064820152740e640daeae6e840c4ca40e6c2daca40d8cadccee8d605b1b608482015260a4016106a4565b4261099a613f486001600160401b038d16614a35565b1015610a235760405162461bcd60e51b815260206004820152604c60248201527f456967656e506f642e7665726966795769746864726177616c43726564656e7460448201527f69616c733a207370656369666965642074696d657374616d7020697320746f6f60648201526b0819985c881a5b881c185cdd60a21b608482015260a4016106a4565b60405163d1c64cc960e01b81526001600160401b038b166004820152610acc907f0000000000000000000000000165878a594ca255338adfa4d48449f69242eb8f6001600160a01b03169063d1c64cc990602401602060405180830381865afa158015610a94573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ab891906152cd565b8a35610ac760208d018d6152e6565b611fbb565b6000805b88811015610b7057610b528c8c358c8c85818110610af057610af061532c565b9050602002016020810190610b059190615342565b8b8b86818110610b1757610b1761532c565b9050602002810190610b2991906152e6565b8b8b88818110610b3b57610b3b61532c565b9050602002810190610b4d9190615369565b612149565b610b5c9083614a35565b915080610b68816153b2565b915050610ad0565b5060335460405163030b147160e61b81526001600160a01b039182166004820152602481018390527f0000000000000000000000000165878a594ca255338adfa4d48449f69242eb8f9091169063c2c51c4090604401600060405180830381600087803b158015610be057600080fd5b505af1158015610bf4573d6000803e3d6000fd5b505050505050505050505050505050565b600080610c4784848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506125ee92505050565b600090815260366020526040902054600160c01b900460ff169150505b92915050565b610c926040805160808101825260008082526020820181905291810182905290606082015290565b600082815260366020908152604091829020825160808101845281546001600160401b038082168352600160401b8204811694830194909452600160801b810490931693810193909352906060830190600160c01b900460ff166002811115610cfd57610cfd614c48565b6002811115610d0e57610d0e614c48565b90525092915050565b336001600160a01b037f0000000000000000000000000165878a594ca255338adfa4d48449f69242eb8f1614610d5f5760405162461bcd60e51b81526004016106a4906153cd565b346801bc16d674ec80000014610deb5760405162461bcd60e51b8152602060048201526044602482018190527f456967656e506f642e7374616b653a206d75737420696e697469616c6c792073908201527f74616b6520666f7220616e792076616c696461746f72207769746820333220656064820152633a3432b960e11b608482015260a4016106a4565b7f00000000000000000000000000000000219ab540356cbb839cbe05303d7705fa6001600160a01b031663228951186801bc16d674ec8000008787610e2e6126e8565b8888886040518863ffffffff1660e01b8152600401610e529695949392919061549f565b6000604051808303818588803b158015610e6b57600080fd5b505af1158015610e7f573d6000803e3d6000fd5b50505050507f606865b7934a25d4aed43f6cdb426403353fa4b3009c4d228407474581b01e238585604051610eb59291906154ee565b60405180910390a15050505050565b604051635ac86ab760e01b8152600360048201819052907f0000000000000000000000000165878a594ca255338adfa4d48449f69242eb8f6001600160a01b031690635ac86ab790602401602060405180830381865afa158015610f2c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f50919061511c565b15610f6d5760405162461bcd60e51b81526004016106a49061513e565b8684148015610f7b57508382145b6110045760405162461bcd60e51b815260206004820152604e60248201527f456967656e506f642e76657269667942616c616e6365557064617465733a207660448201527f616c696461746f72496e646963657320616e642070726f6f6673206d7573742060648201526d0c4ca40e6c2daca40d8cadccee8d60931b608482015260a4016106a4565b4261101a613f486001600160401b038c16614a35565b101561109c5760405162461bcd60e51b815260206004820152604560248201527f456967656e506f642e76657269667942616c616e6365557064617465733a207360448201527f70656369666965642074696d657374616d7020697320746f6f2066617220696e606482015264081c185cdd60da1b608482015260a4016106a4565b60405163d1c64cc960e01b81526001600160401b038a166004820152611140907f0000000000000000000000000165878a594ca255338adfa4d48449f69242eb8f6001600160a01b03169063d1c64cc990602401602060405180830381865afa15801561110d573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061113191906152cd565b8735610ac760208a018a6152e6565b6000805b888110156111e4576111c68b8b8b848181106111625761116261532c565b90506020020160208101906111779190615342565b8a358a8a8681811061118b5761118b61532c565b905060200281019061119d91906152e6565b8a8a888181106111af576111af61532c565b90506020028101906111c19190615369565b61272d565b6111d09083615502565b9150806111dc816153b2565b915050611144565b506033546001600160a01b037f0000000000000000000000000165878a594ca255338adfa4d48449f69242eb8f81169163c2c51c409116611229633b9aca0085615543565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b15801561126f57600080fd5b505af1158015611283573d6000803e3d6000fd5b5050505050505050505050505050565b6112bb6040805160808101825260008082526020820181905291810182905290606082015290565b603660006112fe85858080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506125ee92505050565b81526020808201929092526040908101600020815160808101835281546001600160401b038082168352600160401b8204811695830195909552600160801b81049094169281019290925290916060830190600160c01b900460ff16600281111561136b5761136b614c48565b600281111561137c5761137c614c48565b9052509392505050565b6033546001600160a01b031633146113b05760405162461bcd60e51b81526004016106a49061519b565b603454600160401b900460ff16156113da5760405162461bcd60e51b81526004016106a4906151e3565b6033546113ef906001600160a01b0316611f87565b565b336001600160a01b037f0000000000000000000000000165878a594ca255338adfa4d48449f69242eb8f16146114395760405162461bcd60e51b81526004016106a4906153cd565b611447633b9aca00826155de565b156114d15760405162461bcd60e51b815260206004820152604e60248201527f456967656e506f642e776974686472617752657374616b6564426561636f6e4360448201527f6861696e4554483a20616d6f756e74576569206d75737420626520612077686f60648201526d1b194811ddd95a48185b5bdd5b9d60921b608482015260a4016106a4565b60006114e1633b9aca00836155f2565b6034549091506001600160401b03908116908216111561159a5760405162461bcd60e51b815260206004820152606260248201527f456967656e506f642e776974686472617752657374616b6564426561636f6e4360448201527f6861696e4554483a20616d6f756e74477765692065786365656473207769746860648201527f6472617761626c6552657374616b6564457865637574696f6e4c617965724777608482015261656960f01b60a482015260c4016106a4565b603480548291906000906115b89084906001600160401b0316615606565b92506101000a8154816001600160401b0302191690836001600160401b03160217905550826001600160a01b03167f8947fd2ce07ef9cc302c4e8f0461015615d91ce851564839e91cc804c2f49d8e8360405161161791815260200190565b60405180910390a26116298383612c0b565b505050565b600054610100900460ff161580801561164e5750600054600160ff909116105b806116685750303b158015611668575060005460ff166001145b6116cb5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084016106a4565b6000805460ff1916600117905580156116ee576000805461ff0019166101001790555b6001600160a01b0382166117615760405162461bcd60e51b815260206004820152603460248201527f456967656e506f642e696e697469616c697a653a20706f644f776e65722063616044820152736e6e6f74206265207a65726f206164647265737360601b60648201526084016106a4565b603380546001600160a01b0384166001600160a01b031990911681179091556034805460ff60401b1916600160401b1790556040517fca8dfc8c5e0a67a74501c072a3325f685259bebbae7cfd230ab85198a78b70cd90600090a28015611802576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050565b6033546001600160a01b031633146118305760405162461bcd60e51b81526004016106a49061519b565b604051635ac86ab760e01b8152600560048201819052907f0000000000000000000000000165878a594ca255338adfa4d48449f69242eb8f6001600160a01b031690635ac86ab790602401602060405180830381865afa158015611898573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118bc919061511c565b156118d95760405162461bcd60e51b81526004016106a49061513e565b82518451146119645760405162461bcd60e51b815260206004820152604b60248201527f456967656e506f642e7265636f766572546f6b656e733a20746f6b656e4c697360448201527f7420616e6420616d6f756e7473546f5769746864726177206d7573742062652060648201526a0e6c2daca40d8cadccee8d60ab1b608482015260a4016106a4565b60005b84518110156119d2576119c0838583815181106119865761198661532c565b60200260200101518784815181106119a0576119a061532c565b60200260200101516001600160a01b0316612c159092919063ffffffff16565b806119ca816153b2565b915050611967565b5050505050565b604051635ac86ab760e01b81526004808201819052907f0000000000000000000000000165878a594ca255338adfa4d48449f69242eb8f6001600160a01b031690635ac86ab790602401602060405180830381865afa158015611a40573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a64919061511c565b15611a815760405162461bcd60e51b81526004016106a49061513e565b8386148015611a8f57508588145b8015611a9a57508782145b611b0e576040805162461bcd60e51b81526020600482015260248101919091527f456967656e506f642e766572696679416e6450726f636573735769746864726160448201527f77616c733a20696e70757473206d7573742062652073616d65206c656e67746860648201526084016106a4565b60405163d1c64cc960e01b81526001600160401b038c166004820152611bb2907f0000000000000000000000000165878a594ca255338adfa4d48449f69242eb8f6001600160a01b03169063d1c64cc990602401602060405180830381865afa158015611b7f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ba391906152cd565b8b35610ac760208e018e6152e6565b604080518082019091526000808252602082015260005b83811015611cb2576000611c6d8d358d8d85818110611bea57611bea61532c565b9050602002810190611bfc919061562e565b8c8c86818110611c0e57611c0e61532c565b9050602002810190611c2091906152e6565b8c8c88818110611c3257611c3261532c565b9050602002810190611c449190615369565b8c8c8a818110611c5657611c5661532c565b9050602002810190611c689190615369565b612c67565b80518451919250908490611c82908390614a35565b9052506020808201519084018051611c9b908390615502565b905250819050611caa816153b2565b915050611bc9565b50805115611ce1576033548151611ce1916001600160a01b031690611cdc90633b9aca009061564f565b6130ae565b602081015115611d965760335460208201516001600160a01b037f0000000000000000000000000165878a594ca255338adfa4d48449f69242eb8f81169263c2c51c4092911690611d3790633b9aca0090615543565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b158015611d7d57600080fd5b505af1158015611d91573d6000803e3d6000fd5b505050505b505050505050505050505050565b6033546001600160a01b03163314611dce5760405162461bcd60e51b81526004016106a49061519b565b604051635ac86ab760e01b8152600560048201819052907f0000000000000000000000000165878a594ca255338adfa4d48449f69242eb8f6001600160a01b031690635ac86ab790602401602060405180830381865afa158015611e36573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e5a919061511c565b15611e775760405162461bcd60e51b81526004016106a49061513e565b603754821115611f285760405162461bcd60e51b815260206004820152606a60248201527f456967656e506f642e77697468647261776e6f6e426561636f6e436861696e4560448201527f544842616c616e63655765693a20616d6f756e74546f5769746864726177206960648201527f732067726561746572207468616e206e6f6e426561636f6e436861696e45544860848201526942616c616e636557656960b01b60a482015260c4016106a4565b8160376000828254611f3a919061566e565b90915550506040518281526001600160a01b038416907f30420aacd028abb3c1fd03aba253ae725d6ddd52d16c9ac4cb5742cd43f530969060200160405180910390a261162983836130ae565b6033805467ffffffffffffffff60a01b19164263ffffffff16600160a01b021790556000603755611fb881476130ae565b50565b611fc76003602061564f565b81146120575760405162461bcd60e51b815260206004820152605360248201527f426561636f6e436861696e50726f6f66732e7665726966795374617465526f6f60448201527f74416761696e73744c6174657374426c6f636b526f6f743a2050726f6f6620686064820152720c2e640d2dcc6dee4e4cac6e840d8cadccee8d606b1b608482015260a4016106a4565b61209c82828080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152508892508791506003905061313c565b6121435760405162461bcd60e51b815260206004820152606660248201527f426561636f6e436861696e50726f6f66732e7665726966795374617465526f6f60448201527f74416761696e73744c6174657374426c6f636b526f6f743a20496e76616c696460648201527f206c617465737420626c6f636b2068656164657220726f6f74206d65726b6c6560848201526510383937b7b360d11b60a482015260c4016106a4565b50505050565b60008061218884848080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061315492505050565b6000818152603660209081526040808320815160808101835281546001600160401b038082168352600160401b8204811695830195909552600160801b8104909416928101929092529394509192906060830190600160c01b900460ff1660028111156121f7576121f7614c48565b600281111561220857612208614c48565b905250905060008160600151600281111561222557612225614c48565b146122ce5760405162461bcd60e51b815260206004820152606760248201527f456967656e506f642e766572696679436f72726563745769746864726177616c60448201527f43726564656e7469616c733a2056616c696461746f72206d757374206265206960648201527f6e61637469766520746f2070726f7665207769746864726177616c2063726564608482015266656e7469616c7360c81b60a482015260c4016106a4565b6122d66126e8565b6122df90615685565b61231b86868080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061317892505050565b146123a25760405162461bcd60e51b815260206004820152604b60248201527f456967656e506f642e766572696679436f72726563745769746864726177616c60448201527f43726564656e7469616c733a2050726f6f66206973206e6f7420666f7220746860648201526a1a5cc8115a59d95b941bd960aa1b608482015260a4016106a4565b60006123e086868080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061318d92505050565b90506123f08a87878b8b8e6131b2565b6001606083015264ffffffffff891682526001600160401b038b811660408401527f000000000000000000000000000000000000000000000000000000077359400081169082161115612471576001600160401b037f0000000000000000000000000000000000000000000000000000000773594000166020830152612481565b6001600160401b03811660208301525b6000838152603660209081526040918290208451815492860151938601516001600160401b03908116600160801b0267ffffffffffffffff60801b19958216600160401b026001600160801b0319909516919092161792909217928316821781556060850151859391929091839160ff60c01b191668ffffffffffffffffff60801b1990911617600160c01b83600281111561251f5761251f614c48565b02179055505060405164ffffffffff8b1681527f2d0800bbc377ea54a08c5db6a87aafff5e3e9c8fead0eda110e40e0c10441449915060200160405180910390a17f0e5fac175b83177cc047381e030d8fb3b42b37bd1c025e22c280facad62c32df898c84602001516040516125ba9392919064ffffffffff9390931683526001600160401b03918216602084015216604082015260600190565b60405180910390a1633b9aca0082602001516001600160401b03166125df919061564f565b9b9a5050505050505050505050565b600081516030146126775760405162461bcd60e51b815260206004820152604760248201527f456967656e506f642e5f63616c63756c61746556616c696461746f725075626b60448201527f657948617368206d75737420626520612034382d6279746520424c53207075626064820152666c6963206b657960c81b608482015260a4016106a4565b60405160029061268e9084906000906020016156a9565b60408051601f19818403018152908290526126a8916156d8565b602060405180830381855afa1580156126c5573d6000803e3d6000fd5b5050506040513d601f19601f82011682018060405250810190610c6491906152cd565b60408051600160f81b60208201526000602182015230606090811b6bffffffffffffffffffffffff1916602c8301529101604051602081830303815290604052905090565b60008061276c84848080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061318d92505050565b905060006127ac85858080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061315492505050565b6000818152603660209081526040808320815160808101835281546001600160401b038082168352600160401b8204811695830195909552600160801b8104909416928101929092529394509192906060830190600160c01b900460ff16600281111561281b5761281b614c48565b600281111561282c5761282c614c48565b8152505090508a6001600160401b031681604001516001600160401b0316106128e35760405162461bcd60e51b815260206004820152605c60248201527f456967656e506f642e76657269667942616c616e63655570646174653a20566160448201527f6c696461746f72732062616c616e63652068617320616c72656164792062656560648201527f6e207570646174656420666f7220746869732074696d657374616d7000000000608482015260a4016106a4565b6001816060015160028111156128fb576128fb614c48565b146129635760405162461bcd60e51b815260206004820152603260248201527f456967656e506f642e76657269667942616c616e63655570646174653a2056616044820152716c696461746f72206e6f742061637469766560701b60648201526084016106a4565b61296c8b613409565b6001600160401b03166129b18787808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152506134f392505050565b6001600160401b031611612a54576000836001600160401b031611612a545760405162461bcd60e51b815260206004820152604d60248201527f456967656e506f642e76657269667942616c616e63655570646174653a20766160448201527f6c696461746f7220697320776974686472617761626c6520627574206861732060648201526c3737ba103bb4ba34323930bbb760991b608482015260a4016106a4565b612a628987878b8b8f6131b2565b602081015160006001600160401b037f000000000000000000000000000000000000000000000000000000077359400081169086161115612ac457507f0000000000000000000000000000000000000000000000000000000773594000612ac7565b50835b6001600160401b0380821660208086019182528f831660408088019182526000898152603690935290912086518154935192518516600160801b0267ffffffffffffffff60801b19938616600160401b026001600160801b031990951691909516179290921790811683178255606086015186939091839160ff60c01b191668ffffffffffffffffff60801b1990911617600160c01b836002811115612b6f57612b6f614c48565b0217905550905050816001600160401b0316816001600160401b031614612bfb577f0e5fac175b83177cc047381e030d8fb3b42b37bd1c025e22c280facad62c32df8c8e83604051612be69392919064ffffffffff9390931683526001600160401b03918216602084015216604082015260600190565b60405180910390a1612bf8818361350b565b95505b5050505050979650505050505050565b611802828261352a565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052611629908490613643565b6040805180820190915260008082526020820152612c8c612c8789615759565b613715565b6033546001600160401b03600160a01b909104811690821611612cc15760405162461bcd60e51b81526004016106a490615232565b6000612ccf612c878b615759565b90506000612d0f88888080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061315492505050565b905060008082815260366020526040902054600160c01b900460ff166002811115612d3c57612d3c614c48565b1415612df35760405162461bcd60e51b815260206004820152607460248201527f456967656e506f642e5f766572696679416e6450726f6365737357697468647260448201527f6177616c3a2056616c696461746f72206e657665722070726f76656e20746f2060648201527f68617665207769746864726177616c2063726564656e7469616c7320706f696e6084820152731d1959081d1bc81d1a1a5cc818dbdb9d1c9858dd60621b60a482015260c4016106a4565b60008181526035602090815260408083206001600160401b038616845290915290205460ff1615612eb25760405162461bcd60e51b815260206004820152605b60248201527f456967656e506f642e5f766572696679416e6450726f6365737357697468647260448201527f6177616c3a207769746864726177616c2068617320616c72656164792062656560648201527f6e2070726f76656e20666f7220746869732074696d657374616d700000000000608482015260a4016106a4565b60008181526035602090815260408083206001600160401b03861684529091529020805460ff19166001179055612eeb8c87878e613725565b6000612f2987878080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061410d92505050565b9050612f398d8a8a8e8e866131b2565b6000612f7788888080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061412592505050565b9050612fb58a8a808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152506134f392505050565b6001600160401b0316612fcf612fca8f615759565b61413d565b6001600160401b03161061308757603354600084815260366020908152604091829020825160808101845281546001600160401b038082168352600160401b8204811694830194909452600160801b81049093169381019390935261307c93869388938a936001600160a01b03909316928892916060830190600160c01b900460ff16600281111561306357613063614c48565b600281111561307457613074614c48565b90525061414f565b9550505050506130a1565b60335461307c90839086906001600160a01b031684614360565b5098975050505050505050565b603354604051633036cd5360e21b81526001600160a01b03918216600482015283821660248201527f000000000000000000000000a513e6e4b8f2a923d98304ec87f64353c4d5c8539091169063c0db354c9083906044016000604051808303818588803b15801561311f57600080fd5b505af1158015613133573d6000803e3d6000fd5b50505050505050565b60008361314a86858561443e565b1495945050505050565b6000816000815181106131695761316961532c565b60200260200101519050919050565b6000816001815181106131695761316961532c565b6000610c64826002815181106131a5576131a561532c565b602002602001015161458a565b6131be60036002615979565b84146132495760405162461bcd60e51b815260206004820152604e60248201527f426561636f6e436861696e50726f6f66732e76657269667956616c696461746f60448201527f724669656c64733a2056616c696461746f72206669656c64732068617320696e60648201526d0c6dee4e4cac6e840d8cadccee8d60931b608482015260a4016106a4565b600561325760286001614a35565b6132619190614a35565b61326c90602061564f565b82146132ec5760405162461bcd60e51b815260206004820152604360248201527f426561636f6e436861696e50726f6f66732e76657269667956616c696461746f60448201527f724669656c64733a2050726f6f662068617320696e636f7272656374206c656e6064820152620cee8d60eb1b608482015260a4016106a4565b600064ffffffffff821661330260286001614a35565b600b901b17905060006133478787808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152506145f192505050565b905061338d85858080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152508c925085915086905061313c565b6133ff5760405162461bcd60e51b815260206004820152603d60248201527f426561636f6e436861696e50726f6f66732e76657269667956616c696461746f60448201527f724669656c64733a20496e76616c6964206d65726b6c652070726f6f6600000060648201526084016106a4565b5050505050505050565b60007f000000000000000000000000000000000000000000000000000000006059f4606001600160401b0316826001600160401b031610156134b35760405162461bcd60e51b815260206004820152603760248201527f456967656e506f642e5f74696d657374616d70546f45706f63683a2074696d6560448201527f7374616d70206973206265666f72652067656e6573697300000000000000000060648201526084016106a4565b6134bf600c6020615985565b6134e97f000000000000000000000000000000000000000000000000000000006059f46084615606565b610c6491906159b4565b6000610c64826007815181106131a5576131a561532c565b60006135236001600160401b038084169085166159da565b9392505050565b8047101561357a5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e636500000060448201526064016106a4565b6000826001600160a01b03168260405160006040518083038185875af1925050503d80600081146135c7576040519150601f19603f3d011682016040523d82523d6000602084013e6135cc565b606091505b50509050806116295760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d6179206861766520726576657274656400000000000060648201526084016106a4565b6000613698826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b031661489e9092919063ffffffff16565b80519091501561162957808060200190518101906136b6919061511c565b6116295760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b60648201526084016106a4565b6000610c6482610140015161458a565b613730600280615979565b82146137a45760405162461bcd60e51b81526020600482015260496024820152600080516020615a7383398151915260448201527f616c3a207769746864726177616c4669656c64732068617320696e636f7272656064820152680c6e840d8cadccee8d60bb1b608482015260a4016106a4565b6137b0600d6002615979565b6137c060c0830160a08401615a19565b6001600160401b03161061382a5760405162461bcd60e51b815260206004820152603f6024820152600080516020615a7383398151915260448201527f616c3a20626c6f636b526f6f74496e64657820697320746f6f206c617267650060648201526084016106a4565b61383660046002615979565b613847610100830160e08401615a19565b6001600160401b0316106138b3576040805162461bcd60e51b8152602060048201526024810191909152600080516020615a7383398151915260448201527f616c3a207769746864726177616c496e64657820697320746f6f206c6172676560648201526084016106a4565b6138bf60186002615979565b6138cf60e0830160c08401615a19565b6001600160401b0316106139495760405162461bcd60e51b81526020600482015260476024820152600080516020615a7383398151915260448201527f616c3a20686973746f726963616c53756d6d617279496e64657820697320746f6064820152666f206c6172676560c81b608482015260a4016106a4565b613954600480614a35565b61395f906001614a35565b61396a90602061564f565b61397482806152e6565b9050146139e85760405162461bcd60e51b81526020600482015260486024820152600080516020615a7383398151915260448201527f616c3a207769746864726177616c50726f6f662068617320696e636f727265636064820152670e840d8cadccee8d60c31b608482015260a4016106a4565b6139f460046003614a35565b6139ff90602061564f565b613a0c60408301836152e6565b905014613a865760405162461bcd60e51b815260206004820152604e6024820152600080516020615a7383398151915260448201527f616c3a20657865637574696f6e5061796c6f616450726f6f662068617320696e60648201526d0c6dee4e4cac6e840d8cadccee8d60931b608482015260a4016106a4565b613a926003602061564f565b613a9f60208301836152e6565b905014613b0d5760405162461bcd60e51b81526020600482015260426024820152600080516020615a7383398151915260448201527f616c3a20736c6f7450726f6f662068617320696e636f7272656374206c656e676064820152610e8d60f31b608482015260a4016106a4565b613b196004602061564f565b613b2660608301836152e6565b905014613b995760405162461bcd60e51b81526020600482015260476024820152600080516020615a7383398151915260448201527f616c3a2074696d657374616d7050726f6f662068617320696e636f7272656374606482015266040d8cadccee8d60cb1b608482015260a4016106a4565b600d613ba760186001614a35565b613bb2906005614a35565b613bbd906001614a35565b613bc79190614a35565b613bd290602061564f565b613bdf60808301836152e6565b905014613c685760405162461bcd60e51b81526020600482015260586024820152600080516020615a7383398151915260448201527f616c3a20686973746f726963616c53756d6d617279426c6f636b526f6f74507260648201527f6f6f662068617320696e636f7272656374206c656e6774680000000000000000608482015260a4016106a4565b6000613c7a60c0830160a08401615a19565b6001600160401b03166000613c91600d6001614a35565b613ca160e0860160c08701615a19565b6001600160401b0316901b600d613cba60186001614a35565b613cc5906001614a35565b613ccf9190614a35565b601b901b1717179050613d2a613ce860808401846152e6565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525089925050506101008501358461313c565b613d9d5760405162461bcd60e51b815260206004820152604a6024820152600080516020615a7383398151915260448201527f616c3a20496e76616c696420686973746f726963616c73756d6d617279206d656064820152693935b63290383937b7b360b11b608482015260a4016106a4565b613df4613dad60208401846152e6565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092018290525061010088013593506101208801359250905061313c565b613e545760405162461bcd60e51b815260206004820152603d6024820152600080516020615a7383398151915260448201527f616c3a20496e76616c696420736c6f74206d65726b6c652070726f6f6600000060648201526084016106a4565b6049613eac613e6660408501856152e6565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050506101008501356101608601358461313c565b613f1e5760405162461bcd60e51b81526020600482015260496024820152600080516020615a7383398151915260448201527f616c3a20496e76616c696420657865637574696f6e5061796c6f6164206d657260648201526835b63290383937b7b360b91b608482015260a4016106a4565b50613f76613f2f60608401846152e6565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250505050610160840135610140850135600961313c565b613fe45760405162461bcd60e51b815260206004820152604460248201819052600080516020615a73833981519152908201527f616c3a20496e76616c696420626c6f636b4e756d626572206d65726b6c6520706064820152633937b7b360e11b608482015260a4016106a4565b6000613ff7610100840160e08501615a19565b6001600160401b031661400c60046001614a35565b600e901b17905060006140518686808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152506145f192505050565b90506140a161406085806152e6565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250505050610160860135838561313c565b6131335760405162461bcd60e51b81526020600482015260436024820152600080516020615a7383398151915260448201527f616c3a20496e76616c6964207769746864726177616c206d65726b6c6520707260648201526237b7b360e91b608482015260a4016106a4565b6000610c64826001815181106131a5576131a561532c565b6000610c64826003815181106131a5576131a561532c565b600060206134e983610120015161458a565b604080518082019091526000808252602082015260007f00000000000000000000000000000000000000000000000000000007735940006001600160401b0316846001600160401b031611156141c657507f00000000000000000000000000000000000000000000000000000007735940006141c9565b50825b60408051808201909152600080825260208201526141e78286615606565b6001600160401b03908116825260348054849260009161420991859116615a34565b92506101000a8154816001600160401b0302191690836001600160401b0316021790555061423b82856020015161350b565b602082810191909152600090850152600260608501819052506000888152603660209081526040918290208651815492880151938801516001600160401b03908116600160801b0267ffffffffffffffff60801b19958216600160401b026001600160801b0319909516919092161792909217928316821781556060870151879391929091839160ff60c01b191668ffffffffffffffffff60801b1990911617600160c01b8360028111156142f2576142f2614c48565b0217905550506040805164ffffffffff8c1681526001600160401b038a8116602083015288168183015290516001600160a01b03891692507fb76a93bb649ece524688f1a01d184e0bbebcda58eae80c28a898bec3fb5a09639181900360600190a298975050505050505050565b60408051808201909152600080825260208201526040805164ffffffffff871681526001600160401b0380871660208301528416918101919091526001600160a01b038416907f8a7335714231dbd551aaba6314f4a97a14c201e53a3e25e1140325cdf67d7a4e9060600160405180910390a2603880548391906000906143f19084906001600160401b0316615a34565b92506101000a8154816001600160401b0302191690836001600160401b031602179055506040518060400160405280836001600160401b0316815260200160008152509050949350505050565b6000835160001415801561445d57506020845161445b91906155de565b155b6144ec5760405162461bcd60e51b815260206004820152605460248201527f4d65726b6c652e70726f63657373496e636c7573696f6e50726f6f665368613260448201527f35363a2070726f6f66206c656e6774682073686f756c642062652061206e6f6e60648201527316bd32b9379036bab63a34b836329037b310199960611b608482015260a4016106a4565b604080516020808201909252848152905b85518111614580576145106002856155de565b614543578151600052808601516020526020826040600060026107d05a03fa61453857600080fd5b60028404935061456e565b8086015160005281516020526020826040600060026107d05a03fa61456757600080fd5b6002840493505b614579602082614a35565b90506144fd565b5051949350505050565b60f881901c60e882901c61ff00161760d882901c62ff0000161760c882901c63ff000000161764ff0000000060b883901c161765ff000000000060a883901c161766ff000000000000609883901c161767ff0000000000000060889290921c919091161790565b6000806002835161460291906155f2565b90506000816001600160401b0381111561461e5761461e614e53565b604051908082528060200260200182016040528015614647578160200160208202803683370190505b50905060005b8281101561474e57600285614662838361564f565b815181106146725761467261532c565b602002602001015186836002614688919061564f565b614693906001614a35565b815181106146a3576146a361532c565b60200260200101516040516020016146c5929190918252602082015260400190565b60408051601f19818403018152908290526146df916156d8565b602060405180830381855afa1580156146fc573d6000803e3d6000fd5b5050506040513d601f19601f8201168201806040525081019061471f91906152cd565b8282815181106147315761473161532c565b602090810291909101015280614746816153b2565b91505061464d565b5061475a6002836155f2565b91505b811561487a5760005b828110156148675760028261477b838361564f565b8151811061478b5761478b61532c565b6020026020010151838360026147a1919061564f565b6147ac906001614a35565b815181106147bc576147bc61532c565b60200260200101516040516020016147de929190918252602082015260400190565b60408051601f19818403018152908290526147f8916156d8565b602060405180830381855afa158015614815573d6000803e3d6000fd5b5050506040513d601f19601f8201168201806040525081019061483891906152cd565b82828151811061484a5761484a61532c565b60209081029190910101528061485f816153b2565b915050614766565b506148736002836155f2565b915061475d565b8060008151811061488d5761488d61532c565b602002602001015192505050919050565b60606148ad84846000856148b5565b949350505050565b6060824710156149165760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b60648201526084016106a4565b6001600160a01b0385163b61496d5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016106a4565b600080866001600160a01b0316858760405161498991906156d8565b60006040518083038185875af1925050503d80600081146149c6576040519150601f19603f3d011682016040523d82523d6000602084013e6149cb565b606091505b50915091506149db8282866149e6565b979650505050505050565b606083156149f5575081613523565b825115614a055782518084602001fd5b8160405162461bcd60e51b81526004016106a49190615a5f565b634e487b7160e01b600052601160045260246000fd5b60008219821115614a4857614a48614a1f565b500190565b80356001600160401b0381168114614a6457600080fd5b919050565b60008060408385031215614a7c57600080fd5b82359150614a8c60208401614a4d565b90509250929050565b600060408284031215614aa757600080fd5b50919050565b60008083601f840112614abf57600080fd5b5081356001600160401b03811115614ad657600080fd5b6020830191508360208260051b8501011115614af157600080fd5b9250929050565b60008060008060008060008060a0898b031215614b1457600080fd5b614b1d89614a4d565b975060208901356001600160401b0380821115614b3957600080fd5b614b458c838d01614a95565b985060408b0135915080821115614b5b57600080fd5b614b678c838d01614aad565b909850965060608b0135915080821115614b8057600080fd5b614b8c8c838d01614aad565b909650945060808b0135915080821115614ba557600080fd5b50614bb28b828c01614aad565b999c989b5096995094979396929594505050565b60008083601f840112614bd857600080fd5b5081356001600160401b03811115614bef57600080fd5b602083019150836020828501011115614af157600080fd5b60008060208385031215614c1a57600080fd5b82356001600160401b03811115614c3057600080fd5b614c3c85828601614bc6565b90969095509350505050565b634e487b7160e01b600052602160045260246000fd5b60038110614c7c57634e487b7160e01b600052602160045260246000fd5b9052565b60208101610c648284614c5e565b600060208284031215614ca057600080fd5b5035919050565b60006080820190506001600160401b03808451168352806020850151166020840152806040850151166040840152506060830151614ce86060840182614c5e565b5092915050565b600080600080600060608688031215614d0757600080fd5b85356001600160401b0380821115614d1e57600080fd5b614d2a89838a01614bc6565b90975095506020880135915080821115614d4357600080fd5b50614d5088828901614bc6565b96999598509660400135949350505050565b60008060008060008060008060a0898b031215614d7e57600080fd5b614d8789614a4d565b975060208901356001600160401b0380821115614da357600080fd5b614daf8c838d01614aad565b909950975060408b0135915080821115614dc857600080fd5b614dd48c838d01614a95565b965060608b0135915080821115614b8057600080fd5b6001600160a01b0381168114611fb857600080fd5b8035614a6481614dea565b60008060408385031215614e1d57600080fd5b8235614e2881614dea565b946020939093013593505050565b600060208284031215614e4857600080fd5b813561352381614dea565b634e487b7160e01b600052604160045260246000fd5b60405161018081016001600160401b0381118282101715614e8c57614e8c614e53565b60405290565b604051601f8201601f191681016001600160401b0381118282101715614eba57614eba614e53565b604052919050565b60006001600160401b03821115614edb57614edb614e53565b5060051b60200190565b600082601f830112614ef657600080fd5b81356020614f0b614f0683614ec2565b614e92565b82815260059290921b84018101918181019086841115614f2a57600080fd5b8286015b84811015614f455780358352918301918301614f2e565b509695505050505050565b600080600060608486031215614f6557600080fd5b83356001600160401b0380821115614f7c57600080fd5b818601915086601f830112614f9057600080fd5b81356020614fa0614f0683614ec2565b82815260059290921b8401810191818101908a841115614fbf57600080fd5b948201945b83861015614fe6578535614fd781614dea565b82529482019490820190614fc4565b97505087013592505080821115614ffc57600080fd5b5061500986828701614ee5565b92505061501860408501614dff565b90509250925092565b60008060008060008060008060008060c08b8d03121561504057600080fd5b6150498b614a4d565b995060208b01356001600160401b038082111561506557600080fd5b6150718e838f01614a95565b9a5060408d013591508082111561508757600080fd5b6150938e838f01614aad565b909a50985060608d01359150808211156150ac57600080fd5b6150b88e838f01614aad565b909850965060808d01359150808211156150d157600080fd5b6150dd8e838f01614aad565b909650945060a08d01359150808211156150f657600080fd5b506151038d828e01614aad565b915080935050809150509295989b9194979a5092959850565b60006020828403121561512e57600080fd5b8151801515811461352357600080fd5b6020808252603e908201527f456967656e506f642e6f6e6c795768656e4e6f745061757365643a20696e646560408201527f782069732070617573656420696e20456967656e506f644d616e616765720000606082015260800190565b60208082526028908201527f456967656e506f642e6f6e6c79456967656e506f644f776e65723a206e6f74206040820152673837b227bbb732b960c11b606082015260800190565b6020808252602f908201527f456967656e506f642e6861734e6576657252657374616b65643a20726573746160408201526e1ada5b99c81a5cc8195b98589b1959608a1b606082015260800190565b6020808252606f908201527f456967656e506f642e70726f6f664973466f7256616c696454696d657374616d60408201527f703a20626561636f6e20636861696e2070726f6f66206d75737420626520666f60608201527f722074696d657374616d70206166746572206d6f7374526563656e745769746860808201526e064726177616c54696d657374616d7608c1b60a082015260c00190565b6000602082840312156152df57600080fd5b5051919050565b6000808335601e198436030181126152fd57600080fd5b8301803591506001600160401b0382111561531757600080fd5b602001915036819003821315614af157600080fd5b634e487b7160e01b600052603260045260246000fd5b60006020828403121561535457600080fd5b813564ffffffffff8116811461352357600080fd5b6000808335601e1984360301811261538057600080fd5b8301803591506001600160401b0382111561539a57600080fd5b6020019150600581901b3603821315614af157600080fd5b60006000198214156153c6576153c6614a1f565b5060010190565b60208082526031908201527f456967656e506f642e6f6e6c79456967656e506f644d616e616765723a206e6f6040820152703a1032b4b3b2b72837b226b0b730b3b2b960791b606082015260800190565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b60005b8381101561546257818101518382015260200161544a565b838111156121435750506000910152565b6000815180845261548b816020860160208601615447565b601f01601f19169290920160200192915050565b6080815260006154b360808301888a61541e565b82810360208401526154c58188615473565b905082810360408401526154da81868861541e565b915050826060830152979650505050505050565b6020815260006148ad60208301848661541e565b600080821280156001600160ff1b038490038513161561552457615524614a1f565b600160ff1b839003841281161561553d5761553d614a1f565b50500190565b60006001600160ff1b038184138284138082168684048611161561556957615569614a1f565b600160ff1b600087128281168783058912161561558857615588614a1f565b600087129250878205871284841616156155a4576155a4614a1f565b878505871281841616156155ba576155ba614a1f565b505050929093029392505050565b634e487b7160e01b600052601260045260246000fd5b6000826155ed576155ed6155c8565b500690565b600082615601576156016155c8565b500490565b60006001600160401b038381169083168181101561562657615626614a1f565b039392505050565b6000823561017e1983360301811261564557600080fd5b9190910192915050565b600081600019048311821515161561566957615669614a1f565b500290565b60008282101561568057615680614a1f565b500390565b80516020808301519190811015614aa75760001960209190910360031b1b16919050565b600083516156bb818460208801615447565b6001600160801b0319939093169190920190815260100192915050565b60008251615645818460208701615447565b600082601f8301126156fb57600080fd5b81356001600160401b0381111561571457615714614e53565b615727601f8201601f1916602001614e92565b81815284602083860101111561573c57600080fd5b816020850160208301376000918101602001919091529392505050565b6000610180823603121561576c57600080fd5b615774614e69565b82356001600160401b038082111561578b57600080fd5b615797368387016156ea565b835260208501359150808211156157ad57600080fd5b6157b9368387016156ea565b602084015260408501359150808211156157d257600080fd5b6157de368387016156ea565b604084015260608501359150808211156157f757600080fd5b615803368387016156ea565b6060840152608085013591508082111561581c57600080fd5b50615829368286016156ea565b60808301525061583b60a08401614a4d565b60a082015261584c60c08401614a4d565b60c082015261585d60e08401614a4d565b60e082015261010083810135908201526101208084013590820152610140808401359082015261016092830135928101929092525090565b600181815b808511156158d05781600019048211156158b6576158b6614a1f565b808516156158c357918102915b93841c939080029061589a565b509250929050565b6000826158e757506001610c64565b816158f457506000610c64565b816001811461590a576002811461591457615930565b6001915050610c64565b60ff84111561592557615925614a1f565b50506001821b610c64565b5060208310610133831016604e8410600b8410161715615953575081810a610c64565b61595d8383615895565b806000190482111561597157615971614a1f565b029392505050565b600061352383836158d8565b60006001600160401b03808316818516818304811182151516156159ab576159ab614a1f565b02949350505050565b60006001600160401b03808416806159ce576159ce6155c8565b92169190910492915050565b60008083128015600160ff1b8501841216156159f8576159f8614a1f565b6001600160ff1b0384018313811615615a1357615a13614a1f565b50500390565b600060208284031215615a2b57600080fd5b61352382614a4d565b60006001600160401b03808316818516808303821115615a5657615a56614a1f565b01949350505050565b602081526000613523602083018461547356fe426561636f6e436861696e50726f6f66732e7665726966795769746864726177a2646970667358221220a70662ddf5cc6c48da2de15b85bdb76166a7de80fea7d4fd1263864700cbbdaf64736f6c634300080c0033","storage":{"0x0":"0xff"}},"0x23618e81e3f5cdf7f54c3d65f7fbc0abf5b21e8f":{"nonce":0,"balance":"0x21e19e0c9bab2400000","code":"0x","storage":{}},"0x3c44cdddb6a900fa2b585dd299e03d12fa4293bc":{"nonce":0,"balance":"0x21e19e0c9bab2400000","code":"0x","storage":{}},"0x4e59b44847b379578588920ca78fbf26c0b4956c":{"nonce":0,"balance":"0x0","code":"0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe03601600081602082378035828234f58015156039578182fd5b8082525050506014600cf3","storage":{}},"0x5fbdb2315678afecb367f032d93f642f64180aa3":{"nonce":1,"balance":"0x0","code":"0x60806040526004361061007b5760003560e01c80639623609d1161004e5780639623609d1461011157806399a88ec414610124578063f2fde38b14610144578063f3b7dead1461016457600080fd5b8063204e1c7a14610080578063715018a6146100bc5780637eff275e146100d35780638da5cb5b146100f3575b600080fd5b34801561008c57600080fd5b506100a061009b366004610499565b610184565b6040516001600160a01b03909116815260200160405180910390f35b3480156100c857600080fd5b506100d1610215565b005b3480156100df57600080fd5b506100d16100ee3660046104bd565b610229565b3480156100ff57600080fd5b506000546001600160a01b03166100a0565b6100d161011f36600461050c565b610291565b34801561013057600080fd5b506100d161013f3660046104bd565b610300565b34801561015057600080fd5b506100d161015f366004610499565b610336565b34801561017057600080fd5b506100a061017f366004610499565b6103b4565b6000806000836001600160a01b03166040516101aa90635c60da1b60e01b815260040190565b600060405180830381855afa9150503d80600081146101e5576040519150601f19603f3d011682016040523d82523d6000602084013e6101ea565b606091505b5091509150816101f957600080fd5b8080602001905181019061020d91906105e2565b949350505050565b61021d6103da565b6102276000610434565b565b6102316103da565b6040516308f2839760e41b81526001600160a01b038281166004830152831690638f283970906024015b600060405180830381600087803b15801561027557600080fd5b505af1158015610289573d6000803e3d6000fd5b505050505050565b6102996103da565b60405163278f794360e11b81526001600160a01b03841690634f1ef2869034906102c990869086906004016105ff565b6000604051808303818588803b1580156102e257600080fd5b505af11580156102f6573d6000803e3d6000fd5b5050505050505050565b6103086103da565b604051631b2ce7f360e11b81526001600160a01b038281166004830152831690633659cfe69060240161025b565b61033e6103da565b6001600160a01b0381166103a85760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084015b60405180910390fd5b6103b181610434565b50565b6000806000836001600160a01b03166040516101aa906303e1469160e61b815260040190565b6000546001600160a01b031633146102275760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161039f565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b03811681146103b157600080fd5b6000602082840312156104ab57600080fd5b81356104b681610484565b9392505050565b600080604083850312156104d057600080fd5b82356104db81610484565b915060208301356104eb81610484565b809150509250929050565b634e487b7160e01b600052604160045260246000fd5b60008060006060848603121561052157600080fd5b833561052c81610484565b9250602084013561053c81610484565b9150604084013567ffffffffffffffff8082111561055957600080fd5b818601915086601f83011261056d57600080fd5b81358181111561057f5761057f6104f6565b604051601f8201601f19908116603f011681019083821181831017156105a7576105a76104f6565b816040528281528960208487010111156105c057600080fd5b8260208601602083013760006020848301015280955050505050509250925092565b6000602082840312156105f457600080fd5b81516104b681610484565b60018060a01b038316815260006020604081840152835180604085015260005b8181101561063b5785810183015185820160600152820161061f565b8181111561064d576000606083870101525b50601f01601f19169290920160600194935050505056fea26469706673582212200fdbd2e25973eab45d03ab46d4fda931522c5b45bccd7b63ecf3c38942f8913564736f6c634300080c0033","storage":{"0x0":"0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266"}},"0x5fc8d32690cc91d4c39d9d3abcbd16989f875707":{"nonce":1,"balance":"0x0","code":"0x60806040526004361061004e5760003560e01c80633659cfe6146100655780634f1ef286146100855780635c60da1b146100985780638f283970146100c9578063f851a440146100e95761005d565b3661005d5761005b6100fe565b005b61005b6100fe565b34801561007157600080fd5b5061005b6100803660046106f1565b610118565b61005b61009336600461070c565b61015f565b3480156100a457600080fd5b506100ad6101d0565b6040516001600160a01b03909116815260200160405180910390f35b3480156100d557600080fd5b5061005b6100e43660046106f1565b61020b565b3480156100f557600080fd5b506100ad610235565b61010661029b565b61011661011161033a565b610344565b565b610120610368565b6001600160a01b0316336001600160a01b03161415610157576101548160405180602001604052806000815250600061039b565b50565b6101546100fe565b610167610368565b6001600160a01b0316336001600160a01b031614156101c8576101c38383838080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506001925061039b915050565b505050565b6101c36100fe565b60006101da610368565b6001600160a01b0316336001600160a01b03161415610200576101fb61033a565b905090565b6102086100fe565b90565b610213610368565b6001600160a01b0316336001600160a01b0316141561015757610154816103c6565b600061023f610368565b6001600160a01b0316336001600160a01b03161415610200576101fb610368565b6060610285838360405180606001604052806027815260200161080b6027913961041a565b9392505050565b6001600160a01b03163b151590565b6102a3610368565b6001600160a01b0316336001600160a01b031614156101165760405162461bcd60e51b815260206004820152604260248201527f5472616e73706172656e745570677261646561626c6550726f78793a2061646d60448201527f696e2063616e6e6f742066616c6c6261636b20746f2070726f78792074617267606482015261195d60f21b608482015260a4015b60405180910390fd5b60006101fb6104f7565b3660008037600080366000845af43d6000803e808015610363573d6000f35b3d6000fd5b60007fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b546001600160a01b0316919050565b6103a48361051f565b6000825111806103b15750805b156101c3576103c08383610260565b50505050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f6103ef610368565b604080516001600160a01b03928316815291841660208301520160405180910390a16101548161055f565b60606001600160a01b0384163b6104825760405162461bcd60e51b815260206004820152602660248201527f416464726573733a2064656c65676174652063616c6c20746f206e6f6e2d636f6044820152651b9d1c9858dd60d21b6064820152608401610331565b600080856001600160a01b03168560405161049d91906107bb565b600060405180830381855af49150503d80600081146104d8576040519150601f19603f3d011682016040523d82523d6000602084013e6104dd565b606091505b50915091506104ed828286610608565b9695505050505050565b60007f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc61038c565b61052881610641565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b6001600160a01b0381166105c45760405162461bcd60e51b815260206004820152602660248201527f455243313936373a206e65772061646d696e20697320746865207a65726f206160448201526564647265737360d01b6064820152608401610331565b807fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b80546001600160a01b0319166001600160a01b039290921691909117905550565b60608315610617575081610285565b8251156106275782518084602001fd5b8160405162461bcd60e51b815260040161033191906107d7565b6001600160a01b0381163b6106ae5760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b6064820152608401610331565b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc6105e7565b80356001600160a01b03811681146106ec57600080fd5b919050565b60006020828403121561070357600080fd5b610285826106d5565b60008060006040848603121561072157600080fd5b61072a846106d5565b9250602084013567ffffffffffffffff8082111561074757600080fd5b818601915086601f83011261075b57600080fd5b81358181111561076a57600080fd5b87602082850101111561077c57600080fd5b6020830194508093505050509250925092565b60005b838110156107aa578181015183820152602001610792565b838111156103c05750506000910152565b600082516107cd81846020870161078f565b9190910192915050565b60208152600082518060208401526107f681604085016020870161078f565b601f01601f1916919091016040019291505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a2646970667358221220bceca38d0e447b38e612e8ea5bb02b1e1fcac6609b19aa0fd3fd43aa4b97bf1b64736f6c634300080c0033","storage":{"0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc":"0xa51c1fc2f0d1a1b8494ed1fe312d7c3a78ed91c0","0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103":"0x5fbdb2315678afecb367f032d93f642f64180aa3"}},"0x610178da211fef7d417bc0e6fed39f05609ad788":{"nonce":1,"balance":"0x0","code":"0x608060405234801561001057600080fd5b506004361061038e5760003560e01c806365da1264116101de578063b13442711161010f578063d79aceab116100ad578063f16172b01161007c578063f16172b0146109f5578063f2fde38b14610a08578063f698da2514610a1b578063fabc1cbc14610a2357600080fd5b8063d79aceab14610995578063da8be864146109bc578063eb990c59146109cf578063eea9064b146109e257600080fd5b8063c5e480db116100e9578063c5e480db146108b2578063c94b511114610958578063ca661c041461096b578063cf80873e1461097457600080fd5b8063b13442711461083a578063b7f06ebe14610861578063bb45fef21461088457600080fd5b80639104c3191161017c578063a1060c8811610156578063a1060c88146107e1578063a1788484146107f4578063a364f4da14610814578063a98fb3551461082757600080fd5b80639104c319146107a05780639926ee7d146107bb57806399be81c8146107ce57600080fd5b8063778e55f3116101b8578063778e55f31461073e5780637f54807114610769578063886f11951461077c5780638da5cb5b1461078f57600080fd5b806365da1264146106fa5780636d70f7ae14610723578063715018a61461073657600080fd5b806339b70e38116102c357806350f73e7c116102615780635c975abb116102305780635c975abb146106a05780635cfe8d2c146106a85780635f966f14146106bb57806360d7faed146106e757600080fd5b806350f73e7c14610659578063595c6a6714610662578063597b36da1461066a5780635ac86ab71461067d57600080fd5b8063433773821161029d57806343377382146105c65780634665bcda146105ed57806349075da3146106145780634fc40b611461064f57600080fd5b806339b70e38146105455780633cdeb5e0146105845780633e28391d146105b357600080fd5b8063169283651161033057806328a573ae1161030a57806328a573ae146104c157806329c77d4f146104d457806333404396146104f4578063374823b51461050757600080fd5b8063169283651461044e5780631bbce0911461048757806320606b701461049a57600080fd5b80630f589e591161036c5780630f589e591461040057806310d67a2f14610415578063132d496714610428578063136439dd1461043b57600080fd5b806304a4f979146103935780630b9f487a146103cd5780630dd8dd02146103e0575b600080fd5b6103ba7f3b89fca151cbe5122d58acee86cf184413d751d585779bdd19d3bbfa3a306dce81565b6040519081526020015b60405180910390f35b6103ba6103db36600461496f565b610a36565b6103f36103ee366004614a0e565b610af8565b6040516103c49190614a4f565b61041361040e366004614aec565b610e72565b005b610413610423366004614b3f565b610fc2565b610413610436366004614b63565b611075565b610413610449366004614ba4565b61112c565b6103ba61045c366004614b3f565b6001600160a01b0316600090815260996020526040902060010154600160a01b900463ffffffff1690565b6103ba610495366004614b63565b61126b565b6103ba7f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a86681565b6104136104cf366004614b63565b611299565b6103ba6104e2366004614b3f565b609b6020526000908152604090205481565b610413610502366004614bbd565b611349565b610535610515366004614c80565b60a260209081526000928352604080842090915290825290205460ff1681565b60405190151581526020016103c4565b61056c7f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c981565b6040516001600160a01b0390911681526020016103c4565b61056c610592366004614b3f565b6001600160a01b039081166000908152609960205260409020600101541690565b6105356105c1366004614b3f565b611486565b6103ba7f39111bc4a4d688e1f685123d7497d4615370152a8ee4a0593e647bd06ad8bb0b81565b61056c7f0000000000000000000000000165878a594ca255338adfa4d48449f69242eb8f81565b610642610622366004614cac565b60a160209081526000928352604080842090915290825290205460ff1681565b6040516103c49190614cfb565b6103ba6213c68081565b6103ba609d5481565b6104136114a6565b6103ba610678366004614fa0565b61156d565b61053561068b366004614fdc565b606654600160ff9092169190911b9081161490565b6066546103ba565b6104136106b6366004615052565b61159d565b61056c6106c9366004614b3f565b6001600160a01b039081166000908152609960205260409020541690565b6104136106f53660046151b2565b611848565b61056c610708366004614b3f565b609a602052600090815260409020546001600160a01b031681565b610535610731366004614b3f565b6118e3565b610413611903565b6103ba61074c366004614cac565b609860209081526000928352604080842090915290825290205481565b610413610777366004615301565b611917565b60655461056c906001600160a01b031681565b6033546001600160a01b031661056c565b61056c73beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac081565b6104136107c9366004615391565b611a1c565b6104136107dc36600461543c565b611d28565b6103ba6107ef366004615471565b611dfa565b6103ba610802366004614b3f565b609f6020526000908152604090205481565b610413610822366004614b3f565b611eba565b61041361083536600461543c565b612005565b61056c7f0000000000000000000000005fc8d32690cc91d4c39d9d3abcbd16989f87570781565b61053561086f366004614ba4565b609e6020526000908152604090205460ff1681565b610535610892366004614c80565b609c60209081526000928352604080842090915290825290205460ff1681565b6109226108c0366004614b3f565b6040805160608082018352600080835260208084018290529284018190526001600160a01b03948516815260998352839020835191820184528054851682526001015493841691810191909152600160a01b90920463ffffffff169082015290565b6040805182516001600160a01b039081168252602080850151909116908201529181015163ffffffff16908201526060016103c4565b6103ba6109663660046154b7565b612040565b6103ba61c4e081565b610987610982366004614b3f565b61209f565b6040516103c4929190615573565b6103ba7ff48bd254e30ce2953d187fdb4ef0cfdddb782ab1da55beebaef67c1f258d256e81565b6103f36109ca366004614b3f565b612457565b6104136109dd366004615471565b61291b565b6104136109f0366004615598565b612a4f565b610413610a033660046155f0565b612a5b565b610413610a16366004614b3f565b612aec565b6103ba612b62565b610413610a31366004614ba4565b612ba0565b604080517f3b89fca151cbe5122d58acee86cf184413d751d585779bdd19d3bbfa3a306dce6020808301919091526001600160a01b038681168385015288811660608401528716608083015260a0820185905260c08083018590528351808403909101815260e0909201909252805191012060009081610ab4612b62565b60405161190160f01b602082015260228101919091526042810183905260620160408051808303601f19018152919052805160209091012098975050505050505050565b60665460609060019060029081161415610b2d5760405162461bcd60e51b8152600401610b249061560c565b60405180910390fd5b6000836001600160401b03811115610b4757610b47614d23565b604051908082528060200260200182016040528015610b70578160200160208202803683370190505b50905060005b84811015610e6957858582818110610b9057610b90615643565b9050602002810190610ba29190615659565b610bb0906020810190615679565b9050868683818110610bc457610bc4615643565b9050602002810190610bd69190615659565b610be09080615679565b905014610c555760405162461bcd60e51b815260206004820152603860248201527f44656c65676174696f6e4d616e616765722e717565756557697468647261776160448201527f6c3a20696e707574206c656e677468206d69736d6174636800000000000000006064820152608401610b24565b6000868683818110610c6957610c69615643565b9050602002810190610c7b9190615659565b610c8c906060810190604001614b3f565b6001600160a01b03161415610d1a5760405162461bcd60e51b815260206004820152604860248201527f44656c65676174696f6e4d616e616765722e717565756557697468647261776160448201527f6c3a206d7573742070726f766964652076616c6964207769746864726177616c606482015267206164647265737360c01b608482015260a401610b24565b336000818152609a60205260409020546001600160a01b031690610e399082898986818110610d4b57610d4b615643565b9050602002810190610d5d9190615659565b610d6e906060810190604001614b3f565b8a8a87818110610d8057610d80615643565b9050602002810190610d929190615659565b610d9c9080615679565b808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152508e92508d9150899050818110610de257610de2615643565b9050602002810190610df49190615659565b610e02906020810190615679565b80806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250612cfc92505050565b838381518110610e4b57610e4b615643565b60209081029190910101525080610e61816156d8565b915050610b76565b50949350505050565b336000908152609960205260409020546001600160a01b031615610f0c5760405162461bcd60e51b815260206004820152604560248201527f44656c65676174696f6e4d616e616765722e726567697374657241734f70657260448201527f61746f723a206f70657261746f722068617320616c72656164792072656769736064820152641d195c995960da1b608482015260a401610b24565b610f16338461311e565b604080518082019091526060815260006020820152610f3833808360006133ba565b336001600160a01b03167f8e8485583a2310d41f7c82b9427d0bd49bad74bb9cff9d3402a29d8f9b28a0e285604051610f7191906156f3565b60405180910390a2336001600160a01b03167f02a919ed0e2acad1dd90f17ef2fa4ae5462ee1339170034a8531cca4b67080908484604051610fb4929190615745565b60405180910390a250505050565b606560009054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611015573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110399190615774565b6001600160a01b0316336001600160a01b0316146110695760405162461bcd60e51b8152600401610b2490615791565b6110728161376a565b50565b336001600160a01b037f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c91614806110d45750336001600160a01b037f0000000000000000000000000165878a594ca255338adfa4d48449f69242eb8f16145b6110f05760405162461bcd60e51b8152600401610b24906157db565b6110f983611486565b15611127576001600160a01b038084166000908152609a60205260409020541661112581858585613861565b505b505050565b60655460405163237dfb4760e11b81523360048201526001600160a01b03909116906346fbf68e90602401602060405180830381865afa158015611174573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111989190615838565b6111b45760405162461bcd60e51b8152600401610b2490615855565b6066548181161461122d5760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e70617573653a20696e76616c696420617474656d70742060448201527f746f20756e70617573652066756e6374696f6e616c69747900000000000000006064820152608401610b24565b606681905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d906020015b60405180910390a250565b6001600160a01b0383166000908152609b602052604081205461129085828686612040565b95945050505050565b336001600160a01b037f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c91614806112f85750336001600160a01b037f0000000000000000000000000165878a594ca255338adfa4d48449f69242eb8f16145b6113145760405162461bcd60e51b8152600401610b24906157db565b61131d83611486565b15611127576001600160a01b038084166000908152609a602052604090205416611125818585856138dc565b606654600290600490811614156113725760405162461bcd60e51b8152600401610b249061560c565b600260c95414156113c55760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610b24565b600260c95560005b88811015611475576114658a8a838181106113ea576113ea615643565b90506020028101906113fc919061589d565b89898481811061140e5761140e615643565b90506020028101906114209190615679565b89898681811061143257611432615643565b9050602002013588888781811061144b5761144b615643565b905060200201602081019061146091906158b3565b613957565b61146e816156d8565b90506113cd565b5050600160c9555050505050505050565b6001600160a01b039081166000908152609a602052604090205416151590565b60655460405163237dfb4760e11b81523360048201526001600160a01b03909116906346fbf68e90602401602060405180830381865afa1580156114ee573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115129190615838565b61152e5760405162461bcd60e51b8152600401610b2490615855565b600019606681905560405190815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a2565b6000816040516020016115809190615944565b604051602081830303815290604052805190602001209050919050565b60005b81518110156118445760008282815181106115bd576115bd615643565b602002602001015190506000807f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c96001600160a01b031663cd293f6f846040518263ffffffff1660e01b81526004016116169190615957565b60408051808303816000875af1158015611634573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116589190615a06565b915091508115611836576040808401516001600160a01b0381166000908152609f6020529182208054919282919061168f836156d8565b919050555060006040518060e00160405280846001600160a01b031681526020018760a001516001600160a01b031681526020018760600151600001516001600160a01b03168152602001838152602001876080015163ffffffff1681526020018760000151815260200187602001518152509050600061170f8261156d565b6000818152609e602052604090205490915060ff16156117a55760405162461bcd60e51b815260206004820152604560248201527f44656c65676174696f6e4d616e616765722e6d6967726174655175657565645760448201527f69746864726177616c733a207769746864726177616c20616c72656164792065606482015264786973747360d81b608482015260a401610b24565b6000818152609e602052604090819020805460ff19166001179055517f9009ab153e8014fbfb02f2217f5cde7aa7f9ad734ae85ca3ee3f4ca2fdd499f9906117f09083908590615a34565b60405180910390a160408051868152602081018390527fdc00758b65eef71dc3780c04ebe36cab6bdb266c3a698187e29e0f0dca012630910160405180910390a1505050505b8360010193505050506115a0565b5050565b606654600290600490811614156118715760405162461bcd60e51b8152600401610b249061560c565b600260c95414156118c45760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610b24565b600260c9556118d68686868686613957565b5050600160c95550505050565b6001600160a01b0390811660009081526099602052604090205416151590565b61190b613fbf565b6119156000614019565b565b428360200151101561199b5760405162461bcd60e51b815260206004820152604160248201527f44656c65676174696f6e4d616e616765722e64656c6567617465546f4279536960448201527f676e61747572653a207374616b6572207369676e6174757265206578706972656064820152601960fa1b608482015260a401610b24565b6000609b6000876001600160a01b03166001600160a01b0316815260200190815260200160002054905060006119d78783888860200151612040565b6001600160a01b0388166000908152609b602052604090206001840190558551909150611a07908890839061406b565b611a13878786866133ba565b50505050505050565b60665460039060089081161415611a455760405162461bcd60e51b8152600401610b249061560c565b4282604001511015611ab95760405162461bcd60e51b81526020600482015260436024820152600080516020615d1283398151915260448201527f6f72546f4156533a206f70657261746f72207369676e617475726520657870696064820152621c995960ea1b608482015260a401610b24565b600133600090815260a1602090815260408083206001600160a01b038816845290915290205460ff166001811115611af357611af3614ce5565b1415611b635760405162461bcd60e51b815260206004820152604460248201819052600080516020615d12833981519152908201527f6f72546f4156533a206f70657261746f7220616c726561647920726567697374606482015263195c995960e21b608482015260a401610b24565b6001600160a01b038316600090815260a26020908152604080832085830151845290915290205460ff1615611bee5760405162461bcd60e51b815260206004820152603b6024820152600080516020615d1283398151915260448201527f6f72546f4156533a2073616c7420616c7265616479207370656e7400000000006064820152608401610b24565b611bf7836118e3565b611c725760405162461bcd60e51b81526020600482015260526024820152600080516020615d1283398151915260448201527f6f72546f4156533a206f70657261746f72206e6f742072656769737465726564606482015271081d1bc8115a59d95b93185e595c881e595d60721b608482015260a401610b24565b6000611c88843385602001518660400151611dfa565b9050611c998482856000015161406b565b33600081815260a1602090815260408083206001600160a01b0389168085529083528184208054600160ff19918216811790925560a285528386208a860151875290945293829020805490931684179092555190917ff0952b1c65271d819d39983d2abb044b9cace59bcc4d4dd389f586ebdcb15b4191611d1a9190614cfb565b60405180910390a350505050565b611d31336118e3565b611db35760405162461bcd60e51b815260206004820152604760248201527f44656c65676174696f6e4d616e616765722e7570646174654f70657261746f7260448201527f4d657461646174615552493a2063616c6c6572206d75737420626520616e206f6064820152663832b930ba37b960c91b608482015260a401610b24565b336001600160a01b03167f02a919ed0e2acad1dd90f17ef2fa4ae5462ee1339170034a8531cca4b67080908383604051611dee929190615745565b60405180910390a25050565b604080517ff48bd254e30ce2953d187fdb4ef0cfdddb782ab1da55beebaef67c1f258d256e60208201526001600160a01b038087169282019290925290841660608201526080810183905260a08101829052600090819060c0015b6040516020818303038152906040528051906020012090506000611e77612b62565b60405161190160f01b602082015260228101919091526042810183905260620160408051808303601f190181529190528051602090910120979650505050505050565b60665460039060089081161415611ee35760405162461bcd60e51b8152600401610b249061560c565b600133600090815260a1602090815260408083206001600160a01b038716845290915290205460ff166001811115611f1d57611f1d614ce5565b14611f9e5760405162461bcd60e51b8152602060048201526044602482018190527f44656c65676174696f6e4d616e616765722e646572656769737465724f706572908201527f61746f7246726f6d4156533a206f70657261746f72206e6f7420726567697374606482015263195c995960e21b608482015260a401610b24565b33600081815260a1602090815260408083206001600160a01b0387168085529252808320805460ff191690555190917ff0952b1c65271d819d39983d2abb044b9cace59bcc4d4dd389f586ebdcb15b4191611ff99190614cfb565b60405180910390a35050565b336001600160a01b03167fa89c1dc243d8908a96dd84944bcc97d6bc6ac00dd78e20621576be6a3c9437138383604051611dee929190615745565b604080517f39111bc4a4d688e1f685123d7497d4615370152a8ee4a0593e647bd06ad8bb0b60208201526001600160a01b038087169282019290925290831660608201526080810184905260a08101829052600090819060c001611e55565b6040516360f4062b60e01b81526001600160a01b03828116600483015260609182916000917f0000000000000000000000000165878a594ca255338adfa4d48449f69242eb8f909116906360f4062b90602401602060405180830381865afa15801561210f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121339190615a4d565b6040516394f649dd60e01b81526001600160a01b03868116600483015291925060009182917f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c9909116906394f649dd90602401600060405180830381865afa1580156121a3573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526121cb9190810190615ac1565b91509150600083136121e257909590945092505050565b60608083516000141561229c576040805160018082528183019092529060208083019080368337505060408051600180825281830190925292945090506020808301908036833701905050905073beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac08260008151811061225757612257615643565b60200260200101906001600160a01b031690816001600160a01b031681525050848160008151811061228b5761228b615643565b60200260200101818152505061244a565b83516122a9906001615b85565b6001600160401b038111156122c0576122c0614d23565b6040519080825280602002602001820160405280156122e9578160200160208202803683370190505b50915081516001600160401b0381111561230557612305614d23565b60405190808252806020026020018201604052801561232e578160200160208202803683370190505b50905060005b84518110156123c85784818151811061234f5761234f615643565b602002602001015183828151811061236957612369615643565b60200260200101906001600160a01b031690816001600160a01b03168152505083818151811061239b5761239b615643565b60200260200101518282815181106123b5576123b5615643565b6020908102919091010152600101612334565b5073beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac082600184516123ed9190615b9d565b815181106123fd576123fd615643565b60200260200101906001600160a01b031690816001600160a01b03168152505084816001845161242d9190615b9d565b8151811061243d5761243d615643565b6020026020010181815250505b9097909650945050505050565b606654606090600190600290811614156124835760405162461bcd60e51b8152600401610b249061560c565b61248c83611486565b61250c5760405162461bcd60e51b8152602060048201526044602482018190527f44656c65676174696f6e4d616e616765722e756e64656c65676174653a207374908201527f616b6572206d7573742062652064656c65676174656420746f20756e64656c656064820152636761746560e01b608482015260a401610b24565b612515836118e3565b156125885760405162461bcd60e51b815260206004820152603d60248201527f44656c65676174696f6e4d616e616765722e756e64656c65676174653a206f7060448201527f657261746f72732063616e6e6f7420626520756e64656c6567617465640000006064820152608401610b24565b6001600160a01b0383166126045760405162461bcd60e51b815260206004820152603c60248201527f44656c65676174696f6e4d616e616765722e756e64656c65676174653a20636160448201527f6e6e6f7420756e64656c6567617465207a65726f2061646472657373000000006064820152608401610b24565b6001600160a01b038084166000818152609a6020526040902054909116903314806126375750336001600160a01b038216145b8061265e57506001600160a01b038181166000908152609960205260409020600101541633145b6126d05760405162461bcd60e51b815260206004820152603d60248201527f44656c65676174696f6e4d616e616765722e756e64656c65676174653a20636160448201527f6c6c65722063616e6e6f7420756e64656c6567617465207374616b65720000006064820152608401610b24565b6000806126dc8661209f565b9092509050336001600160a01b0387161461273257826001600160a01b0316866001600160a01b03167ff0eddf07e6ea14f388b47e1e94a0f464ecbd9eed4171130e0fc0e99fb4030a8a60405160405180910390a35b826001600160a01b0316866001600160a01b03167ffee30966a256b71e14bc0ebfc94315e28ef4a97a7131a9e2b7a310a73af4467660405160405180910390a36001600160a01b0386166000908152609a6020526040902080546001600160a01b031916905581516127b4576040805160008152602081019091529450612912565b81516001600160401b038111156127cd576127cd614d23565b6040519080825280602002602001820160405280156127f6578160200160208202803683370190505b50945060005b82518110156129105760408051600180825281830190925260009160208083019080368337505060408051600180825281830190925292935060009291506020808301908036833701905050905084838151811061285c5761285c615643565b60200260200101518260008151811061287757612877615643565b60200260200101906001600160a01b031690816001600160a01b0316815250508383815181106128a9576128a9615643565b6020026020010151816000815181106128c4576128c4615643565b6020026020010181815250506128dd89878b8585612cfc565b8884815181106128ef576128ef615643565b60200260200101818152505050508080612908906156d8565b9150506127fc565b505b50505050919050565b600054610100900460ff161580801561293b5750600054600160ff909116105b806129555750303b158015612955575060005460ff166001145b6129b85760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610b24565b6000805460ff1916600117905580156129db576000805461ff0019166101001790555b6129e58484614225565b6129ed61430b565b6097556129f985614019565b612a02826143a2565b8015612a48576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050505050565b611127338484846133ba565b612a64336118e3565b612ae25760405162461bcd60e51b815260206004820152604360248201527f44656c65676174696f6e4d616e616765722e6d6f646966794f70657261746f7260448201527f44657461696c733a2063616c6c6572206d75737420626520616e206f706572616064820152623a37b960e91b608482015260a401610b24565b611072338261311e565b612af4613fbf565b6001600160a01b038116612b595760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610b24565b61107281614019565b60007f0000000000000000000000000000000000000000000000000000000000007a69461415612b93575060975490565b612b9b61430b565b905090565b606560009054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612bf3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c179190615774565b6001600160a01b0316336001600160a01b031614612c475760405162461bcd60e51b8152600401610b2490615791565b606654198119606654191614612cc55760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e756e70617573653a20696e76616c696420617474656d7060448201527f7420746f2070617573652066756e6374696f6e616c69747900000000000000006064820152608401610b24565b606681905560405181815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c90602001611260565b60006001600160a01b038616612d935760405162461bcd60e51b815260206004820152605060248201527f44656c65676174696f6e4d616e616765722e5f72656d6f76655368617265734160448201527f6e6451756575655769746864726177616c3a207374616b65722063616e6e6f7460648201526f206265207a65726f206164647265737360801b608482015260a401610b24565b8251612e1d5760405162461bcd60e51b815260206004820152604d60248201527f44656c65676174696f6e4d616e616765722e5f72656d6f76655368617265734160448201527f6e6451756575655769746864726177616c3a207374726174656769657320636160648201526c6e6e6f7420626520656d70747960981b608482015260a401610b24565b60005b835181101561302c576001600160a01b03861615612e7657612e768688868481518110612e4f57612e4f615643565b6020026020010151868581518110612e6957612e69615643565b6020026020010151613861565b73beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac06001600160a01b0316848281518110612ea657612ea6615643565b60200260200101516001600160a01b03161415612f6f577f0000000000000000000000000165878a594ca255338adfa4d48449f69242eb8f6001600160a01b031663beffbb8988858481518110612eff57612eff615643565b60200260200101516040518363ffffffff1660e01b8152600401612f389291906001600160a01b03929092168252602082015260400190565b600060405180830381600087803b158015612f5257600080fd5b505af1158015612f66573d6000803e3d6000fd5b50505050613024565b7f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c96001600160a01b0316638c80d4e588868481518110612fb157612fb1615643565b6020026020010151868581518110612fcb57612fcb615643565b60200260200101516040518463ffffffff1660e01b8152600401612ff193929190615bb4565b600060405180830381600087803b15801561300b57600080fd5b505af115801561301f573d6000803e3d6000fd5b505050505b600101612e20565b506001600160a01b0386166000908152609f60205260408120805491829190613054836156d8565b919050555060006040518060e00160405280896001600160a01b03168152602001886001600160a01b03168152602001876001600160a01b031681526020018381526020014363ffffffff16815260200186815260200185815250905060006130bc8261156d565b6000818152609e602052604090819020805460ff19166001179055519091507f9009ab153e8014fbfb02f2217f5cde7aa7f9ad734ae85ca3ee3f4ca2fdd499f99061310a9083908590615a34565b60405180910390a198975050505050505050565b600061312d6020830183614b3f565b6001600160a01b031614156131c75760405162461bcd60e51b815260206004820152605460248201527f44656c65676174696f6e4d616e616765722e5f7365744f70657261746f72446560448201527f7461696c733a2063616e6e6f742073657420606561726e696e677352656365696064820152737665726020746f207a65726f206164647265737360601b608482015260a401610b24565b6213c6806131db6060830160408401615bd8565b63ffffffff1611156132905760405162461bcd60e51b815260206004820152606c60248201527f44656c65676174696f6e4d616e616765722e5f7365744f70657261746f72446560448201527f7461696c733a207374616b65724f70744f757457696e646f77426c6f636b732060648201527f63616e6e6f74206265203e204d41585f5354414b45525f4f50545f4f55545f5760848201526b494e444f575f424c4f434b5360a01b60a482015260c401610b24565b6001600160a01b0382166000908152609960205260409081902060010154600160a01b900463ffffffff16906132cc9060608401908401615bd8565b63ffffffff1610156133625760405162461bcd60e51b815260206004820152605360248201527f44656c65676174696f6e4d616e616765722e5f7365744f70657261746f72446560448201527f7461696c733a207374616b65724f70744f757457696e646f77426c6f636b732060648201527218d85b9b9bdd08189948191958dc99585cd959606a1b608482015260a401610b24565b6001600160a01b038216600090815260996020526040902081906133868282615c15565b505060405133907ffebe5cd24b2cbc7b065b9d0fdeb904461e4afcff57dd57acda1e7832031ba7ac90611dee9084906156f3565b606654600090600190811614156133e35760405162461bcd60e51b8152600401610b249061560c565b6133ec85611486565b156134695760405162461bcd60e51b815260206004820152604160248201527f44656c65676174696f6e4d616e616765722e5f64656c65676174653a2073746160448201527f6b657220697320616c7265616479206163746976656c792064656c65676174656064820152601960fa1b608482015260a401610b24565b613472846118e3565b6134f25760405162461bcd60e51b815260206004820152604560248201527f44656c65676174696f6e4d616e616765722e5f64656c65676174653a206f706560448201527f7261746f72206973206e6f74207265676973746572656420696e20456967656e6064820152642630bcb2b960d91b608482015260a401610b24565b6001600160a01b038085166000908152609960205260409020600101541680158015906135285750336001600160a01b03821614155b801561353d5750336001600160a01b03861614155b156136aa5742846020015110156135bc5760405162461bcd60e51b815260206004820152603760248201527f44656c65676174696f6e4d616e616765722e5f64656c65676174653a2061707060448201527f726f766572207369676e617475726520657870697265640000000000000000006064820152608401610b24565b6001600160a01b0381166000908152609c6020908152604080832086845290915290205460ff16156136565760405162461bcd60e51b815260206004820152603760248201527f44656c65676174696f6e4d616e616765722e5f64656c65676174653a2061707060448201527f726f76657253616c7420616c7265616479207370656e740000000000000000006064820152608401610b24565b6001600160a01b0381166000908152609c6020908152604080832086845282528220805460ff19166001179055850151613697908890889085908890610a36565b90506136a88282876000015161406b565b505b6001600160a01b038681166000818152609a602052604080822080546001600160a01b031916948a169485179055517fc3ee9f2e5fda98e8066a1f745b2df9285f416fe98cf2559cd21484b3d87433049190a36000806137098861209f565b9150915060005b825181101561375f57613757888a85848151811061373057613730615643565b602002602001015185858151811061374a5761374a615643565b60200260200101516138dc565b600101613710565b505050505050505050565b6001600160a01b0381166137f85760405162461bcd60e51b815260206004820152604960248201527f5061757361626c652e5f73657450617573657252656769737472793a206e657760448201527f50617573657252656769737472792063616e6e6f7420626520746865207a65726064820152686f206164647265737360b81b608482015260a401610b24565b606554604080516001600160a01b03928316815291831660208301527f6e9fcd539896fca60e8b0f01dd580233e48a6b0f7df013b89ba7f565869acdb6910160405180910390a1606580546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b03808516600090815260986020908152604080832093861683529290529081208054839290613898908490615b9d565b92505081905550836001600160a01b03167f6909600037b75d7b4733aedd815442b5ec018a827751c832aaff64eba5d6d2dd848484604051610fb493929190615bb4565b6001600160a01b03808516600090815260986020908152604080832093861683529290529081208054839290613913908490615b85565b92505081905550836001600160a01b03167f1ec042c965e2edd7107b51188ee0f383e22e76179041ab3a9d18ff151405166c848484604051610fb493929190615bb4565b600061396561067887615c78565b6000818152609e602052604090205490915060ff166139da5760405162461bcd60e51b815260206004820152603e6024820152600080516020615d3283398151915260448201527f416374696f6e3a20616374696f6e206973206e6f7420696e20717565756500006064820152608401610b24565b609d5443906139ef60a0890160808a01615bd8565b63ffffffff166139ff9190615b85565b1115613a875760405162461bcd60e51b81526020600482015260576024820152600080516020615d3283398151915260448201527f416374696f6e3a207769746864726177616c44656c6179426c6f636b7320706560648201527f72696f6420686173206e6f742079657420706173736564000000000000000000608482015260a401610b24565b613a976060870160408801614b3f565b6001600160a01b0316336001600160a01b031614613b1f5760405162461bcd60e51b815260206004820152604b6024820152600080516020615d3283398151915260448201527f416374696f6e3a206f6e6c7920776974686472617765722063616e20636f6d7060648201526a3632ba329030b1ba34b7b760a91b608482015260a401610b24565b8115613b9657613b3260a0870187615679565b85149050613b965760405162461bcd60e51b815260206004820152603d6024820152600080516020615d3283398151915260448201527f416374696f6e3a20696e707574206c656e677468206d69736d617463680000006064820152608401610b24565b6000818152609e60205260409020805460ff191690558115613c6c5760005b613bc260a0880188615679565b9050811015613c6657613c5e613bdb6020890189614b3f565b33613be960a08b018b615679565b85818110613bf957613bf9615643565b9050602002016020810190613c0e9190614b3f565b613c1b60c08c018c615679565b86818110613c2b57613c2b615643565b905060200201358a8a87818110613c4457613c44615643565b9050602002016020810190613c599190614b3f565b61449c565b600101613bb5565b50613f84565b336000908152609a60205260408120546001600160a01b0316905b613c9460a0890189615679565b9050811015613f815773beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac0613cbf60a08a018a615679565b83818110613ccf57613ccf615643565b9050602002016020810190613ce49190614b3f565b6001600160a01b03161415613e34576000613d0260208a018a614b3f565b905060006001600160a01b037f0000000000000000000000000165878a594ca255338adfa4d48449f69242eb8f16630e81073c83613d4360c08e018e615679565b87818110613d5357613d53615643565b6040516001600160e01b031960e087901b1681526001600160a01b03909416600485015260200291909101356024830152506044016020604051808303816000875af1158015613da7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613dcb9190615a4d565b6001600160a01b038084166000908152609a6020526040902054919250168015613e2c57613e2c8184613e0160a08f018f615679565b88818110613e1157613e11615643565b9050602002016020810190613e269190614b3f565b856138dc565b505050613f79565b6001600160a01b037f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c9166350ff722533613e7160a08c018c615679565b85818110613e8157613e81615643565b9050602002016020810190613e969190614b3f565b613ea360c08d018d615679565b86818110613eb357613eb3615643565b905060200201356040518463ffffffff1660e01b8152600401613ed893929190615bb4565b600060405180830381600087803b158015613ef257600080fd5b505af1158015613f06573d6000803e3d6000fd5b505050506001600160a01b03821615613f7957613f798233613f2b60a08c018c615679565b85818110613f3b57613f3b615643565b9050602002016020810190613f509190614b3f565b613f5d60c08d018d615679565b86818110613f6d57613f6d615643565b905060200201356138dc565b600101613c87565b50505b6040518181527fc97098c2f658800b4df29001527f7324bcdffcf6e8751a699ab920a1eced5b1d9060200160405180910390a1505050505050565b6033546001600160a01b031633146119155760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610b24565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6001600160a01b0383163b1561418557604051630b135d3f60e11b808252906001600160a01b03851690631626ba7e906140ab9086908690600401615c8a565b602060405180830381865afa1580156140c8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906140ec9190615ce7565b6001600160e01b031916146111275760405162461bcd60e51b815260206004820152605360248201527f454950313237315369676e61747572655574696c732e636865636b5369676e6160448201527f747572655f454950313237313a2045524331323731207369676e6174757265206064820152721d995c9a599a58d85d1a5bdb8819985a5b1959606a1b608482015260a401610b24565b826001600160a01b031661419983836145d5565b6001600160a01b0316146111275760405162461bcd60e51b815260206004820152604760248201527f454950313237315369676e61747572655574696c732e636865636b5369676e6160448201527f747572655f454950313237313a207369676e6174757265206e6f742066726f6d6064820152661039b4b3b732b960c91b608482015260a401610b24565b6065546001600160a01b031615801561424657506001600160a01b03821615155b6142c85760405162461bcd60e51b815260206004820152604760248201527f5061757361626c652e5f696e697469616c697a655061757365723a205f696e6960448201527f7469616c697a6550617573657228292063616e206f6e6c792062652063616c6c6064820152666564206f6e636560c81b608482015260a401610b24565b606681905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a26118448261376a565b604080518082018252600a81526922b4b3b2b72630bcb2b960b11b60209182015281517f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a866818301527f71b625cfad44bac63b13dba07f2e1d6084ee04b6f8752101ece6126d584ee6ea81840152466060820152306080808301919091528351808303909101815260a0909101909252815191012090565b61c4e081111561445b5760405162461bcd60e51b815260206004820152607260248201527f44656c65676174696f6e4d616e616765722e5f696e697469616c697a6557697460448201527f6864726177616c44656c6179426c6f636b733a205f7769746864726177616c4460648201527f656c6179426c6f636b732063616e6e6f74206265203e204d41585f5749544844608482015271524157414c5f44454c41595f424c4f434b5360701b60a482015260c401610b24565b609d5460408051918252602082018390527f4ffb00400574147429ee377a5633386321e66d45d8b14676014b5fa393e61e9e910160405180910390a1609d55565b6001600160a01b03831673beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac014156145475760405162387b1360e81b81526001600160a01b037f0000000000000000000000000165878a594ca255338adfa4d48449f69242eb8f169063387b13009061451090889088908790600401615bb4565b600060405180830381600087803b15801561452a57600080fd5b505af115801561453e573d6000803e3d6000fd5b50505050612a48565b60405163c608c7f360e01b81526001600160a01b03858116600483015284811660248301526044820184905282811660648301527f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c9169063c608c7f390608401600060405180830381600087803b1580156145c157600080fd5b505af115801561375f573d6000803e3d6000fd5b60008060006145e485856145f9565b915091506145f181614669565b509392505050565b6000808251604114156146305760208301516040840151606085015160001a61462487828585614824565b94509450505050614662565b82516040141561465a576020830151604084015161464f868383614911565b935093505050614662565b506000905060025b9250929050565b600081600481111561467d5761467d614ce5565b14156146865750565b600181600481111561469a5761469a614ce5565b14156146e85760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606401610b24565b60028160048111156146fc576146fc614ce5565b141561474a5760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606401610b24565b600381600481111561475e5761475e614ce5565b14156147b75760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b6064820152608401610b24565b60048160048111156147cb576147cb614ce5565b14156110725760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c604482015261756560f01b6064820152608401610b24565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a083111561485b5750600090506003614908565b8460ff16601b1415801561487357508460ff16601c14155b156148845750600090506004614908565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa1580156148d8573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b03811661490157600060019250925050614908565b9150600090505b94509492505050565b6000806001600160ff1b0383168161492e60ff86901c601b615b85565b905061493c87828885614824565b935093505050935093915050565b6001600160a01b038116811461107257600080fd5b803561496a8161494a565b919050565b600080600080600060a0868803121561498757600080fd5b85356149928161494a565b945060208601356149a28161494a565b935060408601356149b28161494a565b94979396509394606081013594506080013592915050565b60008083601f8401126149dc57600080fd5b5081356001600160401b038111156149f357600080fd5b6020830191508360208260051b850101111561466257600080fd5b60008060208385031215614a2157600080fd5b82356001600160401b03811115614a3757600080fd5b614a43858286016149ca565b90969095509350505050565b6020808252825182820181905260009190848201906040850190845b81811015614a8757835183529284019291840191600101614a6b565b50909695505050505050565b600060608284031215614aa557600080fd5b50919050565b60008083601f840112614abd57600080fd5b5081356001600160401b03811115614ad457600080fd5b60208301915083602082850101111561466257600080fd5b600080600060808486031215614b0157600080fd5b614b0b8585614a93565b925060608401356001600160401b03811115614b2657600080fd5b614b3286828701614aab565b9497909650939450505050565b600060208284031215614b5157600080fd5b8135614b5c8161494a565b9392505050565b600080600060608486031215614b7857600080fd5b8335614b838161494a565b92506020840135614b938161494a565b929592945050506040919091013590565b600060208284031215614bb657600080fd5b5035919050565b6000806000806000806000806080898b031215614bd957600080fd5b88356001600160401b0380821115614bf057600080fd5b614bfc8c838d016149ca565b909a50985060208b0135915080821115614c1557600080fd5b614c218c838d016149ca565b909850965060408b0135915080821115614c3a57600080fd5b614c468c838d016149ca565b909650945060608b0135915080821115614c5f57600080fd5b50614c6c8b828c016149ca565b999c989b5096995094979396929594505050565b60008060408385031215614c9357600080fd5b8235614c9e8161494a565b946020939093013593505050565b60008060408385031215614cbf57600080fd5b8235614cca8161494a565b91506020830135614cda8161494a565b809150509250929050565b634e487b7160e01b600052602160045260246000fd5b6020810160028310614d1d57634e487b7160e01b600052602160045260246000fd5b91905290565b634e487b7160e01b600052604160045260246000fd5b60405160e081016001600160401b0381118282101715614d5b57614d5b614d23565b60405290565b604080519081016001600160401b0381118282101715614d5b57614d5b614d23565b60405160c081016001600160401b0381118282101715614d5b57614d5b614d23565b604051601f8201601f191681016001600160401b0381118282101715614dcd57614dcd614d23565b604052919050565b63ffffffff8116811461107257600080fd5b803561496a81614dd5565b60006001600160401b03821115614e0b57614e0b614d23565b5060051b60200190565b600082601f830112614e2657600080fd5b81356020614e3b614e3683614df2565b614da5565b82815260059290921b84018101918181019086841115614e5a57600080fd5b8286015b84811015614e7e578035614e718161494a565b8352918301918301614e5e565b509695505050505050565b600082601f830112614e9a57600080fd5b81356020614eaa614e3683614df2565b82815260059290921b84018101918181019086841115614ec957600080fd5b8286015b84811015614e7e5780358352918301918301614ecd565b600060e08284031215614ef657600080fd5b614efe614d39565b9050614f098261495f565b8152614f176020830161495f565b6020820152614f286040830161495f565b604082015260608201356060820152614f4360808301614de7565b608082015260a08201356001600160401b0380821115614f6257600080fd5b614f6e85838601614e15565b60a084015260c0840135915080821115614f8757600080fd5b50614f9484828501614e89565b60c08301525092915050565b600060208284031215614fb257600080fd5b81356001600160401b03811115614fc857600080fd5b614fd484828501614ee4565b949350505050565b600060208284031215614fee57600080fd5b813560ff81168114614b5c57600080fd5b60006040828403121561501157600080fd5b615019614d61565b905081356150268161494a565b815260208201356bffffffffffffffffffffffff8116811461504757600080fd5b602082015292915050565b6000602080838503121561506557600080fd5b82356001600160401b038082111561507c57600080fd5b818501915085601f83011261509057600080fd5b813561509e614e3682614df2565b81815260059190911b830184019084810190888311156150bd57600080fd5b8585015b83811015615197578035858111156150d95760008081fd5b860160e0818c03601f19018113156150f15760008081fd5b6150f9614d83565b898301358881111561510b5760008081fd5b6151198e8c83870101614e15565b825250604080840135898111156151305760008081fd5b61513e8f8d83880101614e89565b8c84015250606061515081860161495f565b82840152608091506151648f838701614fff565b9083015261517460c08501614de7565b9082015261518383830161495f565b60a0820152855250509186019186016150c1565b5098975050505050505050565b801515811461107257600080fd5b6000806000806000608086880312156151ca57600080fd5b85356001600160401b03808211156151e157600080fd5b9087019060e0828a0312156151f557600080fd5b9095506020870135908082111561520b57600080fd5b50615218888289016149ca565b909550935050604086013591506060860135615233816151a4565b809150509295509295909350565b600082601f83011261525257600080fd5b81356001600160401b0381111561526b5761526b614d23565b61527e601f8201601f1916602001614da5565b81815284602083860101111561529357600080fd5b816020850160208301376000918101602001919091529392505050565b6000604082840312156152c257600080fd5b6152ca614d61565b905081356001600160401b038111156152e257600080fd5b6152ee84828501615241565b8252506020820135602082015292915050565b600080600080600060a0868803121561531957600080fd5b85356153248161494a565b945060208601356153348161494a565b935060408601356001600160401b038082111561535057600080fd5b61535c89838a016152b0565b9450606088013591508082111561537257600080fd5b5061537f888289016152b0565b95989497509295608001359392505050565b600080604083850312156153a457600080fd5b82356153af8161494a565b915060208301356001600160401b03808211156153cb57600080fd5b90840190606082870312156153df57600080fd5b6040516060810181811083821117156153fa576153fa614d23565b60405282358281111561540c57600080fd5b61541888828601615241565b82525060208301356020820152604083013560408201528093505050509250929050565b6000806020838503121561544f57600080fd5b82356001600160401b0381111561546557600080fd5b614a4385828601614aab565b6000806000806080858703121561548757600080fd5b84356154928161494a565b935060208501356154a28161494a565b93969395505050506040820135916060013590565b600080600080608085870312156154cd57600080fd5b84356154d88161494a565b93506020850135925060408501356154ef8161494a565b9396929550929360600135925050565b600081518084526020808501945080840160005b838110156155385781516001600160a01b031687529582019590820190600101615513565b509495945050505050565b600081518084526020808501945080840160005b8381101561553857815187529582019590820190600101615557565b60408152600061558660408301856154ff565b82810360208401526112908185615543565b6000806000606084860312156155ad57600080fd5b83356155b88161494a565b925060208401356001600160401b038111156155d357600080fd5b6155df868287016152b0565b925050604084013590509250925092565b60006060828403121561560257600080fd5b614b5c8383614a93565b60208082526019908201527f5061757361626c653a20696e6465782069732070617573656400000000000000604082015260600190565b634e487b7160e01b600052603260045260246000fd5b60008235605e1983360301811261566f57600080fd5b9190910192915050565b6000808335601e1984360301811261569057600080fd5b8301803591506001600160401b038211156156aa57600080fd5b6020019150600581901b360382131561466257600080fd5b634e487b7160e01b600052601160045260246000fd5b60006000198214156156ec576156ec6156c2565b5060010190565b6060810182356157028161494a565b6001600160a01b03908116835260208401359061571e8261494a565b166020830152604083013561573281614dd5565b63ffffffff811660408401525092915050565b60208152816020820152818360408301376000818301604090810191909152601f909201601f19160101919050565b60006020828403121561578657600080fd5b8151614b5c8161494a565b6020808252602a908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526939903ab73830bab9b2b960b11b606082015260800190565b60208082526037908201527f44656c65676174696f6e4d616e616765723a206f6e6c7953747261746567794d60408201527f616e616765724f72456967656e506f644d616e61676572000000000000000000606082015260800190565b60006020828403121561584a57600080fd5b8151614b5c816151a4565b60208082526028908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526739903830bab9b2b960c11b606082015260800190565b6000823560de1983360301811261566f57600080fd5b6000602082840312156158c557600080fd5b8135614b5c816151a4565b600060018060a01b03808351168452806020840151166020850152806040840151166040850152506060820151606084015263ffffffff608083015116608084015260a082015160e060a085015261592b60e08501826154ff565b905060c083015184820360c08601526112908282615543565b602081526000614b5c60208301846158d0565b602081526000825160e060208401526159746101008401826154ff565b90506020840151601f198483030160408501526159918282615543565b915050604084015160018060a01b03808216606086015260608601519150808251166080860152506bffffffffffffffffffffffff60208201511660a08501525060808401516159e960c085018263ffffffff169052565b5060a08401516001600160a01b03811660e0850152509392505050565b60008060408385031215615a1957600080fd5b8251615a24816151a4565b6020939093015192949293505050565b828152604060208201526000614fd460408301846158d0565b600060208284031215615a5f57600080fd5b5051919050565b600082601f830112615a7757600080fd5b81516020615a87614e3683614df2565b82815260059290921b84018101918181019086841115615aa657600080fd5b8286015b84811015614e7e5780518352918301918301615aaa565b60008060408385031215615ad457600080fd5b82516001600160401b0380821115615aeb57600080fd5b818501915085601f830112615aff57600080fd5b81516020615b0f614e3683614df2565b82815260059290921b84018101918181019089841115615b2e57600080fd5b948201945b83861015615b55578551615b468161494a565b82529482019490820190615b33565b91880151919650909350505080821115615b6e57600080fd5b50615b7b85828601615a66565b9150509250929050565b60008219821115615b9857615b986156c2565b500190565b600082821015615baf57615baf6156c2565b500390565b6001600160a01b039384168152919092166020820152604081019190915260600190565b600060208284031215615bea57600080fd5b8135614b5c81614dd5565b80546001600160a01b0319166001600160a01b0392909216919091179055565b8135615c208161494a565b615c2a8183615bf5565b50600181016020830135615c3d8161494a565b615c478183615bf5565b506040830135615c5681614dd5565b815463ffffffff60a01b191660a09190911b63ffffffff60a01b161790555050565b6000615c843683614ee4565b92915050565b82815260006020604081840152835180604085015260005b81811015615cbe57858101830151858201606001528201615ca2565b81811115615cd0576000606083870101525b50601f01601f191692909201606001949350505050565b600060208284031215615cf957600080fd5b81516001600160e01b031981168114614b5c57600080fdfe44656c65676174696f6e4d616e616765722e72656769737465724f706572617444656c65676174696f6e4d616e616765722e636f6d706c657465517565756564a26469706673582212206a81cf1e3f4da9c1111581c8df74dfd0a545ece3552675f7c9396674b435d7ab64736f6c634300080c0033","storage":{"0x0":"0xff"}},"0x70997970c51812dc3a010c7d01b50e0d17dc79c8":{"nonce":0,"balance":"0x21e19e0c9bab2400000","code":"0x","storage":{}},"0x8a791620dd6260079bf849dc5567adc3f2fdc318":{"nonce":1,"balance":"0x0","code":"0x608060405234801561001057600080fd5b50600436106100575760003560e01c80633659cfe61461005c5780635c60da1b14610071578063715018a61461009a5780638da5cb5b146100a2578063f2fde38b146100b3575b600080fd5b61006f61006a3660046102ee565b6100c6565b005b6001546001600160a01b03165b6040516001600160a01b03909116815260200160405180910390f35b61006f61010e565b6000546001600160a01b031661007e565b61006f6100c13660046102ee565b610122565b6100ce6101af565b6100d781610209565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b6101166101af565b610120600061029e565b565b61012a6101af565b6001600160a01b0381166101945760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084015b60405180910390fd5b61019d8161029e565b50565b6001600160a01b03163b151590565b6000546001600160a01b031633146101205760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161018b565b6001600160a01b0381163b61027c5760405162461bcd60e51b815260206004820152603360248201527f5570677261646561626c65426561636f6e3a20696d706c656d656e746174696f6044820152721b881a5cc81b9bdd08184818dbdb9d1c9858dd606a1b606482015260840161018b565b600180546001600160a01b0319166001600160a01b0392909216919091179055565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60006020828403121561030057600080fd5b81356001600160a01b038116811461031757600080fd5b939250505056fea2646970667358221220a22223d3e2a2d861ad54e68b7bc44b4d82a5a12a0bcca5c3404502bb1b430c5c64736f6c634300080c0033","storage":{"0x0":"0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266","0x1":"0x2279b7a0a67db372996a5fab50d91eaa73d2ebe6"}},"0x90f79bf6eb2c4f870365e785982e1f101e93b906":{"nonce":0,"balance":"0x21e19e0c9bab2400000","code":"0x","storage":{}},"0x976ea74026e726554db657fa54763abd0c3a0aa9":{"nonce":0,"balance":"0x21e19e0c9bab2400000","code":"0x","storage":{}},"0x9965507d1a55bcc2695c58ba16fb37d819b0a4dc":{"nonce":0,"balance":"0x21e19e0c9bab2400000","code":"0x","storage":{}},"0x9a676e781a523b5d0c0e43731313a708cb607508":{"nonce":1,"balance":"0x0","code":"0x60806040526004361061014b5760003560e01c806385594e58116100b6578063e4f4f8871161006f578063e4f4f887146103cb578063e5db06c014610404578063eb990c5914610424578063ecb7cb1b14610444578063f2fde38b14610471578063fabc1cbc1461049157600080fd5b806385594e5814610317578063886f1195146103445780638da5cb5b14610364578063c0db354c14610382578063ca661c0414610395578063d44e1b76146103ab57600080fd5b806350f73e7c1161010857806350f73e7c14610254578063595c6a67146102785780635ac86ab71461028d5780635c975abb146102cd578063715018a6146102e257806375608896146102f757600080fd5b806310d67a2f14610150578063136439dd146101725780631f39d87f146101925780633e1de008146101c85780634665bcda146101e85780634d50f9a414610234575b600080fd5b34801561015c57600080fd5b5061017061016b36600461196b565b6104b1565b005b34801561017e57600080fd5b5061017061018d36600461198f565b61056d565b34801561019e57600080fd5b506101b26101ad36600461196b565b6106ac565b6040516101bf91906119c6565b60405180910390f35b3480156101d457600080fd5b506101b26101e336600461196b565b6108a7565b3480156101f457600080fd5b5061021c7f0000000000000000000000000165878a594ca255338adfa4d48449f69242eb8f81565b6040516001600160a01b0390911681526020016101bf565b34801561024057600080fd5b5061017061024f36600461198f565b6109ed565b34801561026057600080fd5b5061026a60c95481565b6040519081526020016101bf565b34801561028457600080fd5b506101706109fe565b34801561029957600080fd5b506102bd6102a8366004611a13565b609854600160ff9092169190911b9081161490565b60405190151581526020016101bf565b3480156102d957600080fd5b5060985461026a565b3480156102ee57600080fd5b50610170610ac5565b34801561030357600080fd5b506102bd610312366004611a36565b610ad9565b34801561032357600080fd5b50610337610332366004611a36565b610b5c565b6040516101bf9190611a62565b34801561035057600080fd5b5060975461021c906001600160a01b031681565b34801561037057600080fd5b506033546001600160a01b031661021c565b610170610390366004611a70565b610bdc565b3480156103a157600080fd5b5061026a61c4e081565b3480156103b757600080fd5b506101706103c636600461198f565b610e9c565b3480156103d757600080fd5b5061026a6103e636600461196b565b6001600160a01b0316600090815260ca602052604090206001015490565b34801561041057600080fd5b5061017061041f366004611a36565b610f30565b34801561043057600080fd5b5061017061043f366004611aa9565b610fc5565b34801561045057600080fd5b5061046461045f36600461196b565b6110ed565b6040516101bf9190611aef565b34801561047d57600080fd5b5061017061048c36600461196b565b6111a7565b34801561049d57600080fd5b506101706104ac36600461198f565b61121d565b609760009054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610504573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105289190611b45565b6001600160a01b0316336001600160a01b0316146105615760405162461bcd60e51b815260040161055890611b62565b60405180910390fd5b61056a81611379565b50565b60975460405163237dfb4760e11b81523360048201526001600160a01b03909116906346fbf68e90602401602060405180830381865afa1580156105b5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105d99190611bac565b6105f55760405162461bcd60e51b815260040161055890611bce565b6098548181161461066e5760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e70617573653a20696e76616c696420617474656d70742060448201527f746f20756e70617573652066756e6374696f6e616c69747900000000000000006064820152608401610558565b609881905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d906020015b60405180910390a250565b6001600160a01b038116600090815260ca6020526040812080546001909101546060926106d98383611c2c565b90508060005b82811015610785576001600160a01b038716600090815260ca6020526040812060010161070c8388611c43565b8154811061071c5761071c611c5b565b6000918252602091829020604080518082019091529101546001600160e01b0381168252600160e01b900463ffffffff1691810182905260c95490925061076291611c43565b4310156107725781925050610785565b508061077d81611c71565b9150506106df565b508060008167ffffffffffffffff8111156107a2576107a2611c8c565b6040519080825280602002602001820160405280156107e757816020015b60408051808201909152600080825260208201528152602001906001900390816107c05790505b509050811561089c5760005b8281101561089a576001600160a01b038916600090815260ca602052604090206001016108208289611c43565b8154811061083057610830611c5b565b6000918252602091829020604080518082019091529101546001600160e01b0381168252600160e01b900463ffffffff1691810191909152825183908390811061087c5761087c611c5b565b6020026020010181905250808061089290611c71565b9150506107f3565b505b979650505050505050565b6001600160a01b038116600090815260ca6020526040812080546001909101546060926108d48383611c2c565b905060008167ffffffffffffffff8111156108f1576108f1611c8c565b60405190808252806020026020018201604052801561093657816020015b604080518082019091526000808252602082015281526020019060019003908161090f5790505b50905060005b828110156109e3576001600160a01b038716600090815260ca602052604090206001016109698287611c43565b8154811061097957610979611c5b565b6000918252602091829020604080518082019091529101546001600160e01b0381168252600160e01b900463ffffffff169181019190915282518390839081106109c5576109c5611c5b565b602002602001018190525080806109db90611c71565b91505061093c565b5095945050505050565b6109f5611470565b61056a816114ca565b60975460405163237dfb4760e11b81523360048201526001600160a01b03909116906346fbf68e90602401602060405180830381865afa158015610a46573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a6a9190611bac565b610a865760405162461bcd60e51b815260040161055890611bce565b600019609881905560405190815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a2565b610acd611470565b610ad76000611591565b565b6001600160a01b038216600090815260ca60205260408120548210801590610b53575060c9546001600160a01b038416600090815260ca60205260409020600101805484908110610b2c57610b2c611c5b565b600091825260209091200154610b4f9190600160e01b900463ffffffff16611c43565b4310155b90505b92915050565b60408051808201909152600080825260208201526001600160a01b038316600090815260ca60205260409020600101805483908110610b9d57610b9d611c5b565b6000918252602091829020604080518082019091529101546001600160e01b0381168252600160e01b900463ffffffff16918101919091529392505050565b60405163a38406a360e01b81526001600160a01b038084166004830152839133917f0000000000000000000000000165878a594ca255338adfa4d48449f69242eb8f169063a38406a390602401602060405180830381865afa158015610c46573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c6a9190611b45565b6001600160a01b031614610ce65760405162461bcd60e51b815260206004820152603d60248201527f44656c617965645769746864726177616c526f757465722e6f6e6c794569676560448201527f6e506f643a206e6f7420706f644f776e6572277320456967656e506f640000006064820152608401610558565b60985460009060019081161415610d0f5760405162461bcd60e51b815260040161055890611ca2565b6001600160a01b038316610da55760405162461bcd60e51b815260206004820152605160248201527f44656c617965645769746864726177616c526f757465722e637265617465446560448201527f6c617965645769746864726177616c3a20726563697069656e742063616e6e6f60648201527074206265207a65726f206164647265737360781b608482015260a401610558565b346001600160e01b03811615610e95576040805180820182526001600160e01b03808416825263ffffffff43811660208085019182526001600160a01b038a16600081815260ca8352968720600190810180548083018255818a5293892088519551909616600160e01b029490961693909317939091019290925593525490917fb8f1b14c7caf74150801dcc9bc18d575cbeaf5b421943497e409df92c92e0f5991889188918691610e5691611c2c565b604080516001600160a01b0395861681529490931660208501526001600160e01b039091169183019190915260608201526080015b60405180910390a1505b5050505050565b60026065541415610eef5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610558565b600260655560985460009060019081161415610f1d5760405162461bcd60e51b815260040161055890611ca2565b610f2733836115e3565b50506001606555565b60026065541415610f835760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610558565b600260655560985460009060019081161415610fb15760405162461bcd60e51b815260040161055890611ca2565b610fbb83836115e3565b5050600160655550565b600054610100900460ff1615808015610fe55750600054600160ff909116105b80610fff5750303b158015610fff575060005460ff166001145b6110625760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610558565b6000805460ff191660011790558015611085576000805461ff0019166101001790555b61108e85611591565b611098848461174e565b6110a1826114ca565b8015610e95576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15050505050565b6040805180820190915260008152606060208201526001600160a01b038216600090815260ca6020908152604080832081518083018352815481526001820180548451818702810187019095528085529195929486810194939192919084015b8282101561119957600084815260209081902060408051808201909152908401546001600160e01b0381168252600160e01b900463ffffffff168183015282526001909201910161114d565b505050915250909392505050565b6111af611470565b6001600160a01b0381166112145760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610558565b61056a81611591565b609760009054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611270573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112949190611b45565b6001600160a01b0316336001600160a01b0316146112c45760405162461bcd60e51b815260040161055890611b62565b6098541981196098541916146113425760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e756e70617573653a20696e76616c696420617474656d7060448201527f7420746f2070617573652066756e6374696f6e616c69747900000000000000006064820152608401610558565b609881905560405181815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c906020016106a1565b6001600160a01b0381166114075760405162461bcd60e51b815260206004820152604960248201527f5061757361626c652e5f73657450617573657252656769737472793a206e657760448201527f50617573657252656769737472792063616e6e6f7420626520746865207a65726064820152686f206164647265737360b81b608482015260a401610558565b609754604080516001600160a01b03928316815291831660208301527f6e9fcd539896fca60e8b0f01dd580233e48a6b0f7df013b89ba7f565869acdb6910160405180910390a1609780546001600160a01b0319166001600160a01b0392909216919091179055565b6033546001600160a01b03163314610ad75760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610558565b61c4e08111156115505760405162461bcd60e51b815260206004820152604560248201527f44656c617965645769746864726177616c526f757465722e5f7365745769746860448201527f64726177616c44656c6179426c6f636b733a206e657756616c756520746f6f206064820152646c6172676560d81b608482015260a401610558565b60c95460408051918252602082018390527f4ffb00400574147429ee377a5633386321e66d45d8b14676014b5fa393e61e9e910160405180910390a160c955565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6001600160a01b038216600090815260ca602052604081208054600190910154825b848110801561161c57508161161a8285611c43565b105b156116c9576001600160a01b038616600090815260ca602052604081206001016116468386611c43565b8154811061165657611656611c5b565b6000918252602091829020604080518082019091529101546001600160e01b0381168252600160e01b900463ffffffff1691810182905260c95490925061169c91611c43565b4310156116a957506116c9565b80516116be906001600160e01b031686611c43565b945050600101611605565b6116d38184611c43565b6001600160a01b038716600090815260ca602052604090205583156116fc576116fc8685611838565b7f6b7151500bd0b5cc211bcc47b3029831b769004df4549e8e1c9a69da05bb094386856117298487611c43565b604080516001600160a01b039094168452602084019290925290820152606001610e8b565b6097546001600160a01b031615801561176f57506001600160a01b03821615155b6117f15760405162461bcd60e51b815260206004820152604760248201527f5061757361626c652e5f696e697469616c697a655061757365723a205f696e6960448201527f7469616c697a6550617573657228292063616e206f6e6c792062652063616c6c6064820152666564206f6e636560c81b608482015260a401610558565b609881905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a261183482611379565b5050565b804710156118885760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610558565b6000826001600160a01b03168260405160006040518083038185875af1925050503d80600081146118d5576040519150601f19603f3d011682016040523d82523d6000602084013e6118da565b606091505b50509050806119515760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610558565b505050565b6001600160a01b038116811461056a57600080fd5b60006020828403121561197d57600080fd5b813561198881611956565b9392505050565b6000602082840312156119a157600080fd5b5035919050565b80516001600160e01b0316825260209081015163ffffffff16910152565b602080825282518282018190526000919060409081850190868401855b82811015611a06576119f68483516119a8565b92840192908501906001016119e3565b5091979650505050505050565b600060208284031215611a2557600080fd5b813560ff8116811461198857600080fd5b60008060408385031215611a4957600080fd5b8235611a5481611956565b946020939093013593505050565b60408101610b5682846119a8565b60008060408385031215611a8357600080fd5b8235611a8e81611956565b91506020830135611a9e81611956565b809150509250929050565b60008060008060808587031215611abf57600080fd5b8435611aca81611956565b93506020850135611ada81611956565b93969395505050506040820135916060013590565b602080825282518282015282810151604080840181905281516060850181905260009392830191849160808701905b8084101561089a57611b318286516119a8565b938501936001939093019290820190611b1e565b600060208284031215611b5757600080fd5b815161198881611956565b6020808252602a908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526939903ab73830bab9b2b960b11b606082015260800190565b600060208284031215611bbe57600080fd5b8151801515811461198857600080fd5b60208082526028908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526739903830bab9b2b960c11b606082015260800190565b634e487b7160e01b600052601160045260246000fd5b600082821015611c3e57611c3e611c16565b500390565b60008219821115611c5657611c56611c16565b500190565b634e487b7160e01b600052603260045260246000fd5b6000600019821415611c8557611c85611c16565b5060010190565b634e487b7160e01b600052604160045260246000fd5b60208082526019908201527f5061757361626c653a20696e646578206973207061757365640000000000000060408201526060019056fea2646970667358221220974bfb720499b56252b27ea3937b9115de548a0dbf1088884cefaa0333c9e23f64736f6c634300080c0033","storage":{}},"0x9fe46736679d2d9a65f0992f2272de9f3c7fa6e0":{"nonce":1,"balance":"0x0","code":"0x6080604052348015600f57600080fd5b506004361060285760003560e01c8063c298557814602d575b600080fd5b600060405190815260200160405180910390f3fea26469706673582212209882247b872d905a05380b42c11d1716ad43e9b19643a0cf588a80c0958bf20d64736f6c634300080c0033","storage":{}},"0xa0ee7a142d267c1f36714e4a8f75612f20a79720":{"nonce":0,"balance":"0x21e19e0c9bab2400000","code":"0x","storage":{}},"0xa513e6e4b8f2a923d98304ec87f64353c4d5c853":{"nonce":1,"balance":"0x0","code":"0x60806040526004361061004e5760003560e01c80633659cfe6146100655780634f1ef286146100855780635c60da1b146100985780638f283970146100c9578063f851a440146100e95761005d565b3661005d5761005b6100fe565b005b61005b6100fe565b34801561007157600080fd5b5061005b6100803660046106f1565b610118565b61005b61009336600461070c565b61015f565b3480156100a457600080fd5b506100ad6101d0565b6040516001600160a01b03909116815260200160405180910390f35b3480156100d557600080fd5b5061005b6100e43660046106f1565b61020b565b3480156100f557600080fd5b506100ad610235565b61010661029b565b61011661011161033a565b610344565b565b610120610368565b6001600160a01b0316336001600160a01b03161415610157576101548160405180602001604052806000815250600061039b565b50565b6101546100fe565b610167610368565b6001600160a01b0316336001600160a01b031614156101c8576101c38383838080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506001925061039b915050565b505050565b6101c36100fe565b60006101da610368565b6001600160a01b0316336001600160a01b03161415610200576101fb61033a565b905090565b6102086100fe565b90565b610213610368565b6001600160a01b0316336001600160a01b0316141561015757610154816103c6565b600061023f610368565b6001600160a01b0316336001600160a01b03161415610200576101fb610368565b6060610285838360405180606001604052806027815260200161080b6027913961041a565b9392505050565b6001600160a01b03163b151590565b6102a3610368565b6001600160a01b0316336001600160a01b031614156101165760405162461bcd60e51b815260206004820152604260248201527f5472616e73706172656e745570677261646561626c6550726f78793a2061646d60448201527f696e2063616e6e6f742066616c6c6261636b20746f2070726f78792074617267606482015261195d60f21b608482015260a4015b60405180910390fd5b60006101fb6104f7565b3660008037600080366000845af43d6000803e808015610363573d6000f35b3d6000fd5b60007fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b546001600160a01b0316919050565b6103a48361051f565b6000825111806103b15750805b156101c3576103c08383610260565b50505050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f6103ef610368565b604080516001600160a01b03928316815291841660208301520160405180910390a16101548161055f565b60606001600160a01b0384163b6104825760405162461bcd60e51b815260206004820152602660248201527f416464726573733a2064656c65676174652063616c6c20746f206e6f6e2d636f6044820152651b9d1c9858dd60d21b6064820152608401610331565b600080856001600160a01b03168560405161049d91906107bb565b600060405180830381855af49150503d80600081146104d8576040519150601f19603f3d011682016040523d82523d6000602084013e6104dd565b606091505b50915091506104ed828286610608565b9695505050505050565b60007f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc61038c565b61052881610641565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b6001600160a01b0381166105c45760405162461bcd60e51b815260206004820152602660248201527f455243313936373a206e65772061646d696e20697320746865207a65726f206160448201526564647265737360d01b6064820152608401610331565b807fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b80546001600160a01b0319166001600160a01b039290921691909117905550565b60608315610617575081610285565b8251156106275782518084602001fd5b8160405162461bcd60e51b815260040161033191906107d7565b6001600160a01b0381163b6106ae5760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b6064820152608401610331565b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc6105e7565b80356001600160a01b03811681146106ec57600080fd5b919050565b60006020828403121561070357600080fd5b610285826106d5565b60008060006040848603121561072157600080fd5b61072a846106d5565b9250602084013567ffffffffffffffff8082111561074757600080fd5b818601915086601f83011261075b57600080fd5b81358181111561076a57600080fd5b87602082850101111561077c57600080fd5b6020830194508093505050509250925092565b60005b838110156107aa578181015183820152602001610792565b838111156103c05750506000910152565b600082516107cd81846020870161078f565b9190910192915050565b60208152600082518060208401526107f681604085016020870161078f565b601f01601f1916919091016040019291505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a2646970667358221220bceca38d0e447b38e612e8ea5bb02b1e1fcac6609b19aa0fd3fd43aa4b97bf1b64736f6c634300080c0033","storage":{"0x0":"0x1","0x33":"0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266","0x97":"0xe7f1725e7734ce288f8367e1bb143e90bb3f0512","0x98":"0x0","0xc9":"0x1","0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc":"0x9a676e781a523b5d0c0e43731313a708cb607508","0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103":"0x5fbdb2315678afecb367f032d93f642f64180aa3"}},"0xa51c1fc2f0d1a1b8494ed1fe312d7c3a78ed91c0":{"nonce":1,"balance":"0x0","code":"0x608060405234801561001057600080fd5b50600436106101f05760003560e01c80637cf72bba1161010f578063d98128c0116100a2578063e921d4fa11610071578063e921d4fa146103c6578063f2fde38b1461044c578063f73b7519146102a9578063fabc1cbc1461045f57600080fd5b8063d98128c014610430578063da16e29b14610322578063df5cf723146102ba578063e58398361461043e57600080fd5b80638da5cb5b116100de5780638da5cb5b146103b5578063a49db732146103c6578063c747075b146103da578063d7b7fa13146103ee57600080fd5b80637cf72bba146103465780638105e04314610354578063855fcc4a1461036b578063886f1195146103a257600080fd5b806339b70e38116101875780636f0c2f74116101565780636f0c2f7414610322578063715018a614610330578063723e59c7146103385780637259a45c1461024257600080fd5b806339b70e38146102ba578063595c6a67146102d55780635ac86ab7146102dd5780635c975abb1461031057600080fd5b80631794bb3c116101c35780631794bb3c1461022f5780631874e5ae14610242578063282670fc1461027257806338c8ee64146102a957600080fd5b80630ffabbce146101f557806310d67a2f14610209578063136439dd1461021c578063175d3205146101f5575b600080fd5b610207610203366004610b25565b5050565b005b610207610217366004610b5a565b610472565b61020761022a366004610b7e565b61052b565b61020761023d366004610b97565b505050565b610258610250366004610b25565b600092915050565b60405163ffffffff90911681526020015b60405180910390f35b610285610280366004610bd8565b61066a565b60408051825163ffffffff9081168252602093840151169281019290925201610269565b6102076102b7366004610b5a565b50565b60005b6040516001600160a01b039091168152602001610269565b610207610685565b6103006102eb366004610c04565b606654600160ff9092169190911b9081161490565b6040519015158152602001610269565b6066545b604051908152602001610269565b610258610250366004610c27565b61020761074c565b610314610250366004610b25565b610207610203366004610c60565b610300610362366004610cd5565b60009392505050565b610385610379366004610c27565b60008060009250925092565b604080519315158452602084019290925290820152606001610269565b6065546102bd906001600160a01b031681565b6033546001600160a01b03166102bd565b6103146103d4366004610b5a565b50600090565b6102076103e8366004610d13565b50505050565b6104016103fc366004610c27565b610760565b60408051825163ffffffff90811682526020808501518216908301529282015190921690820152606001610269565b610300610250366004610c27565b6103006103d4366004610b5a565b61020761045a366004610b5a565b610782565b61020761046d366004610b7e565b6107f8565b606560009054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156104c5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104e99190610d60565b6001600160a01b0316336001600160a01b0316146105225760405162461bcd60e51b815260040161051990610d7d565b60405180910390fd5b6102b781610954565b60655460405163237dfb4760e11b81523360048201526001600160a01b03909116906346fbf68e90602401602060405180830381865afa158015610573573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105979190610dc7565b6105b35760405162461bcd60e51b815260040161051990610de9565b6066548181161461062c5760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e70617573653a20696e76616c696420617474656d70742060448201527f746f20756e70617573652066756e6374696f6e616c69747900000000000000006064820152608401610519565b606681905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d906020015b60405180910390a250565b60408051808201909152600080825260208201525b92915050565b60655460405163237dfb4760e11b81523360048201526001600160a01b03909116906346fbf68e90602401602060405180830381865afa1580156106cd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106f19190610dc7565b61070d5760405162461bcd60e51b815260040161051990610de9565b600019606681905560405190815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a2565b610754610a4b565b61075e6000610aa5565b565b604080516060810182526000808252602082018190529181019190915261067f565b61078a610a4b565b6001600160a01b0381166107ef5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610519565b6102b781610aa5565b606560009054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561084b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061086f9190610d60565b6001600160a01b0316336001600160a01b03161461089f5760405162461bcd60e51b815260040161051990610d7d565b60665419811960665419161461091d5760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e756e70617573653a20696e76616c696420617474656d7060448201527f7420746f2070617573652066756e6374696f6e616c69747900000000000000006064820152608401610519565b606681905560405181815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c9060200161065f565b6001600160a01b0381166109e25760405162461bcd60e51b815260206004820152604960248201527f5061757361626c652e5f73657450617573657252656769737472793a206e657760448201527f50617573657252656769737472792063616e6e6f7420626520746865207a65726064820152686f206164647265737360b81b608482015260a401610519565b606554604080516001600160a01b03928316815291831660208301527f6e9fcd539896fca60e8b0f01dd580233e48a6b0f7df013b89ba7f565869acdb6910160405180910390a1606580546001600160a01b0319166001600160a01b0392909216919091179055565b6033546001600160a01b0316331461075e5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610519565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6001600160a01b03811681146102b757600080fd5b803563ffffffff81168114610b2057600080fd5b919050565b60008060408385031215610b3857600080fd5b8235610b4381610af7565b9150610b5160208401610b0c565b90509250929050565b600060208284031215610b6c57600080fd5b8135610b7781610af7565b9392505050565b600060208284031215610b9057600080fd5b5035919050565b600080600060608486031215610bac57600080fd5b8335610bb781610af7565b92506020840135610bc781610af7565b929592945050506040919091013590565b60008060408385031215610beb57600080fd5b8235610bf681610af7565b946020939093013593505050565b600060208284031215610c1657600080fd5b813560ff81168114610b7757600080fd5b60008060408385031215610c3a57600080fd5b8235610c4581610af7565b91506020830135610c5581610af7565b809150509250929050565b60008060208385031215610c7357600080fd5b823567ffffffffffffffff80821115610c8b57600080fd5b818501915085601f830112610c9f57600080fd5b813581811115610cae57600080fd5b8660208260051b8501011115610cc357600080fd5b60209290920196919550909350505050565b600080600060608486031215610cea57600080fd5b8335610cf581610af7565b9250610d0360208501610b0c565b9150604084013590509250925092565b60008060008060808587031215610d2957600080fd5b8435610d3481610af7565b9350610d4260208601610b0c565b9250610d5060408601610b0c565b9396929550929360600135925050565b600060208284031215610d7257600080fd5b8151610b7781610af7565b6020808252602a908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526939903ab73830bab9b2b960b11b606082015260800190565b600060208284031215610dd957600080fd5b81518015158114610b7757600080fd5b60208082526028908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526739903830bab9b2b960c11b60608201526080019056fea2646970667358221220f0fb0dbe9401a6132d4f8201707595a4adbf43511b70c6ae5d4d839d365297af64736f6c634300080c0033","storage":{}},"0xb7f8bc63bbcad18155201308c8f3540b07f84f5e":{"nonce":1,"balance":"0x0","code":"0x608060405234801561001057600080fd5b50600436106102115760003560e01c80638c80d4e511610125578063c6656702116100ad578063df5cf7231161007c578063df5cf7231461054a578063e7a050aa14610571578063f2fde38b14610584578063f698da2514610597578063fabc1cbc1461059f57600080fd5b8063c6656702146104e7578063cbc2bd62146104fa578063cd293f6f1461050d578063cf756fdf1461053757600080fd5b8063b1344271116100f4578063b134427114610464578063b43b514b1461048b578063b5d8b5b81461049e578063c3c6b3a9146104b1578063c608c7f3146104d457600080fd5b80638c80d4e51461040c5780638da5cb5b1461041f57806394f649dd14610430578063967fc0d21461045157600080fd5b80635ac86ab7116101a8578063715018a611610177578063715018a61461037d5780637a7e0d92146103855780637ecebe00146103b0578063886f1195146103d05780638b8aac3c146103e357600080fd5b80635ac86ab71461030c5780635c975abb1461033f5780635de08ff214610347578063663c1de41461035a57600080fd5b80634665bcda116101e45780634665bcda1461028b57806348825e94146102ca57806350ff7225146102f1578063595c6a671461030457600080fd5b806310d67a2f14610216578063136439dd1461022b57806320606b701461023e57806332e89ace14610278575b600080fd5b61022961022436600461289a565b6105b2565b005b6102296102393660046128b7565b61066e565b6102657f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a86681565b6040519081526020015b60405180910390f35b610265610286366004612950565b6107ad565b6102b27f0000000000000000000000000165878a594ca255338adfa4d48449f69242eb8f81565b6040516001600160a01b03909116815260200161026f565b6102657f0a564d4cfe5cb0d4ee082aab2ca54b8c48e129485a8f7c77766ab5ef0c3566f181565b6102296102ff366004612a2f565b6109f1565b610229610a49565b61032f61031a366004612a70565b609854600160ff9092169190911b9081161490565b604051901515815260200161026f565b609854610265565b610229610355366004612a93565b610b10565b61032f61036836600461289a565b60d16020526000908152604090205460ff1681565b610229610c59565b610265610393366004612b08565b60cd60209081526000928352604080842090915290825290205481565b6102656103be36600461289a565b60ca6020526000908152604090205481565b6097546102b2906001600160a01b031681565b6102656103f136600461289a565b6001600160a01b0316600090815260ce602052604090205490565b61022961041a366004612a2f565b610c6d565b6033546001600160a01b03166102b2565b61044361043e36600461289a565b610cc0565b60405161026f929190612bb5565b60cb546102b2906001600160a01b031681565b6102b27f0000000000000000000000005fc8d32690cc91d4c39d9d3abcbd16989f87570781565b610265610499366004612d5e565b610e40565b6102296104ac366004612a93565b610e8d565b61032f6104bf3660046128b7565b60cf6020526000908152604090205460ff1681565b6102296104e2366004612e34565b610fd1565b6102296104f536600461289a565b611089565b6102b2610508366004612e87565b61109a565b61052061051b366004612d5e565b6110d2565b60408051921515835260208301919091520161026f565b610229610545366004612eb3565b611166565b6102b27f000000000000000000000000cf7ed3acca5a467e9e704c703e8d87f634fb0fc981565b61026561057f366004612a2f565b61129a565b61022961059236600461289a565b611363565b6102656113d9565b6102296105ad3660046128b7565b611417565b609760009054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610605573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106299190612f04565b6001600160a01b0316336001600160a01b0316146106625760405162461bcd60e51b815260040161065990612f21565b60405180910390fd5b61066b81611573565b50565b60975460405163237dfb4760e11b81523360048201526001600160a01b03909116906346fbf68e90602401602060405180830381865afa1580156106b6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106da9190612f6b565b6106f65760405162461bcd60e51b815260040161065990612f8d565b6098548181161461076f5760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e70617573653a20696e76616c696420617474656d70742060448201527f746f20756e70617573652066756e6374696f6e616c69747900000000000000006064820152608401610659565b609881905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d906020015b60405180910390a250565b6098546000908190600190811614156108045760405162461bcd60e51b815260206004820152601960248201527814185d5cd8589b194e881a5b99195e081a5cc81c185d5cd959603a1b6044820152606401610659565b600260655414156108575760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610659565b6002606555428410156108de5760405162461bcd60e51b815260206004820152604360248201527f53747261746567794d616e616765722e6465706f736974496e746f537472617460448201527f656779576974685369676e61747572653a207369676e617475726520657870696064820152621c995960ea1b608482015260a401610659565b6001600160a01b03858116600090815260ca602090815260408083205481517f0a564d4cfe5cb0d4ee082aab2ca54b8c48e129485a8f7c77766ab5ef0c3566f1938101939093528c851691830191909152928a1660608201526080810189905260a0810183905260c0810187905260e00160408051601f1981840301815291815281516020928301206001600160a01b038a16600090815260ca909352908220600185019055915061098e6113d9565b60405161190160f01b60208201526022810191909152604281018390526062016040516020818303038152906040528051906020012090506109d188828861166a565b6109dd888c8c8c611824565b60016065559b9a5050505050505050505050565b336001600160a01b037f000000000000000000000000cf7ed3acca5a467e9e704c703e8d87f634fb0fc91614610a395760405162461bcd60e51b815260040161065990612fd5565b610a44838383611a45565b505050565b60975460405163237dfb4760e11b81523360048201526001600160a01b03909116906346fbf68e90602401602060405180830381865afa158015610a91573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ab59190612f6b565b610ad15760405162461bcd60e51b815260040161065990612f8d565b600019609881905560405190815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a2565b60cb546001600160a01b03163314610b3a5760405162461bcd60e51b815260040161065990613033565b8060005b81811015610c535760d16000858584818110610b5c57610b5c61309d565b9050602002016020810190610b71919061289a565b6001600160a01b0316815260208101919091526040016000205460ff16610c4b57600160d16000868685818110610baa57610baa61309d565b9050602002016020810190610bbf919061289a565b6001600160a01b031681526020810191909152604001600020805460ff19169115159190911790557f0c35b17d91c96eb2751cd456e1252f42a386e524ef9ff26ecc9950859fdc04fe848483818110610c1a57610c1a61309d565b9050602002016020810190610c2f919061289a565b6040516001600160a01b03909116815260200160405180910390a15b600101610b3e565b50505050565b610c61611c7f565b610c6b6000611cd9565b565b336001600160a01b037f000000000000000000000000cf7ed3acca5a467e9e704c703e8d87f634fb0fc91614610cb55760405162461bcd60e51b815260040161065990612fd5565b610c53838383611d2b565b6001600160a01b038116600090815260ce60205260408120546060918291908167ffffffffffffffff811115610cf857610cf86128e0565b604051908082528060200260200182016040528015610d21578160200160208202803683370190505b50905060005b82811015610db2576001600160a01b038616600090815260cd6020908152604080832060ce9092528220805491929184908110610d6657610d6661309d565b60009182526020808320909101546001600160a01b031683528201929092526040019020548251839083908110610d9f57610d9f61309d565b6020908102919091010152600101610d27565b5060ce6000866001600160a01b03166001600160a01b031681526020019081526020016000208181805480602002602001604051908101604052809291908181526020018280548015610e2e57602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311610e10575b50505050509150935093505050915091565b80516020808301516040808501516060860151608087015160a08801519351600097610e709790969591016130b3565b604051602081830303815290604052805190602001209050919050565b60cb546001600160a01b03163314610eb75760405162461bcd60e51b815260040161065990613033565b8060005b81811015610c535760d16000858584818110610ed957610ed961309d565b9050602002016020810190610eee919061289a565b6001600160a01b0316815260208101919091526040016000205460ff1615610fc957600060d16000868685818110610f2857610f2861309d565b9050602002016020810190610f3d919061289a565b6001600160a01b031681526020810191909152604001600020805460ff19169115159190911790557f4074413b4b443e4e58019f2855a8765113358c7c72e39509c6af45fc0f5ba030848483818110610f9857610f9861309d565b9050602002016020810190610fad919061289a565b6040516001600160a01b03909116815260200160405180910390a15b600101610ebb565b336001600160a01b037f000000000000000000000000cf7ed3acca5a467e9e704c703e8d87f634fb0fc916146110195760405162461bcd60e51b815260040161065990612fd5565b604051636ce5768960e11b81526001600160a01b03858116600483015282811660248301526044820184905284169063d9caed1290606401600060405180830381600087803b15801561106b57600080fd5b505af115801561107f573d6000803e3d6000fd5b5050505050505050565b611091611c7f565b61066b81611e87565b60ce60205281600052604060002081815481106110b657600080fd5b6000918252602090912001546001600160a01b03169150829050565b600080336001600160a01b037f000000000000000000000000cf7ed3acca5a467e9e704c703e8d87f634fb0fc9161461111d5760405162461bcd60e51b815260040161065990612fd5565b600061112884610e40565b600081815260cf60205260408120549192509060ff161561115d5750600081815260cf60205260409020805460ff1916905560015b92509050915091565b600054610100900460ff16158080156111865750600054600160ff909116105b806111a05750303b1580156111a0575060005460ff166001145b6112035760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610659565b6000805460ff191660011790558015611226576000805461ff0019166101001790555b61122e611ef0565b60c95561123b8383611f87565b61124485611cd9565b61124d84611e87565b8015611293576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050505050565b6098546000908190600190811614156112f15760405162461bcd60e51b815260206004820152601960248201527814185d5cd8589b194e881a5b99195e081a5cc81c185d5cd959603a1b6044820152606401610659565b600260655414156113445760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610659565b600260655561135533868686611824565b600160655595945050505050565b61136b611c7f565b6001600160a01b0381166113d05760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610659565b61066b81611cd9565b60007f0000000000000000000000000000000000000000000000000000000000007a6946141561140a575060c95490565b611412611ef0565b905090565b609760009054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561146a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061148e9190612f04565b6001600160a01b0316336001600160a01b0316146114be5760405162461bcd60e51b815260040161065990612f21565b60985419811960985419161461153c5760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e756e70617573653a20696e76616c696420617474656d7060448201527f7420746f2070617573652066756e6374696f6e616c69747900000000000000006064820152608401610659565b609881905560405181815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c906020016107a2565b6001600160a01b0381166116015760405162461bcd60e51b815260206004820152604960248201527f5061757361626c652e5f73657450617573657252656769737472793a206e657760448201527f50617573657252656769737472792063616e6e6f7420626520746865207a65726064820152686f206164647265737360b81b608482015260a401610659565b609754604080516001600160a01b03928316815291831660208301527f6e9fcd539896fca60e8b0f01dd580233e48a6b0f7df013b89ba7f565869acdb6910160405180910390a1609780546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b0383163b1561178457604051630b135d3f60e11b808252906001600160a01b03851690631626ba7e906116aa9086908690600401613184565b602060405180830381865afa1580156116c7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116eb919061319d565b6001600160e01b03191614610a445760405162461bcd60e51b815260206004820152605360248201527f454950313237315369676e61747572655574696c732e636865636b5369676e6160448201527f747572655f454950313237313a2045524331323731207369676e6174757265206064820152721d995c9a599a58d85d1a5bdb8819985a5b1959606a1b608482015260a401610659565b826001600160a01b03166117988383612071565b6001600160a01b031614610a445760405162461bcd60e51b815260206004820152604760248201527f454950313237315369676e61747572655574696c732e636865636b5369676e6160448201527f747572655f454950313237313a207369676e6174757265206e6f742066726f6d6064820152661039b4b3b732b960c91b608482015260a401610659565b6001600160a01b038316600090815260d16020526040812054849060ff166118ca5760405162461bcd60e51b815260206004820152604d60248201527f53747261746567794d616e616765722e6f6e6c7953747261746567696573576860448201527f6974656c6973746564466f724465706f7369743a207374726174656779206e6f60648201526c1d081dda1a5d195b1a5cdd1959609a1b608482015260a401610659565b6118df6001600160a01b038516338786612095565b6040516311f9fbc960e21b81526001600160a01b038581166004830152602482018590528616906347e7ef24906044016020604051808303816000875af115801561192e573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061195291906131c7565b915061195f868684611a45565b604051631452b9d760e11b81526001600160a01b0387811660048301528681166024830152604482018490527f000000000000000000000000cf7ed3acca5a467e9e704c703e8d87f634fb0fc916906328a573ae90606401600060405180830381600087803b1580156119d157600080fd5b505af11580156119e5573d6000803e3d6000fd5b5050604080516001600160a01b038a8116825288811660208301528916818301526060810186905290517f7cfff908a4b583f36430b25d75964c458d8ede8a99bd61be750e97ee1b2f3a969350908190036080019150a150949350505050565b6001600160a01b038316611ac15760405162461bcd60e51b815260206004820152603960248201527f53747261746567794d616e616765722e5f6164645368617265733a207374616b60448201527f65722063616e6e6f74206265207a65726f2061646472657373000000000000006064820152608401610659565b80611b2d5760405162461bcd60e51b815260206004820152603660248201527f53747261746567794d616e616765722e5f6164645368617265733a207368617260448201527565732073686f756c64206e6f74206265207a65726f2160501b6064820152608401610659565b6001600160a01b03808416600090815260cd6020908152604080832093861683529290522054611c3e576001600160a01b038316600090815260ce602090815260409091205410611bff5760405162461bcd60e51b815260206004820152605060248201527f53747261746567794d616e616765722e5f6164645368617265733a206465706f60448201527f73697420776f756c6420657863656564204d41585f5354414b45525f5354524160648201526f0a88a8eb2be9892a6a8be988a9c8ea8960831b608482015260a401610659565b6001600160a01b03838116600090815260ce602090815260408220805460018101825590835291200180546001600160a01b0319169184169190911790555b6001600160a01b03808416600090815260cd6020908152604080832093861683529290529081208054839290611c759084906131f6565b9091555050505050565b6033546001600160a01b03163314610c6b5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610659565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600081611da05760405162461bcd60e51b815260206004820152603e60248201527f53747261746567794d616e616765722e5f72656d6f76655368617265733a207360448201527f68617265416d6f756e742073686f756c64206e6f74206265207a65726f2100006064820152608401610659565b6001600160a01b03808516600090815260cd602090815260408083209387168352929052205480831115611e325760405162461bcd60e51b815260206004820152603360248201527f53747261746567794d616e616765722e5f72656d6f76655368617265733a20736044820152720d0c2e4ca82dadeeadce840e8dede40d0d2ced606b1b6064820152608401610659565b6001600160a01b03808616600090815260cd602090815260408083209388168352929052208382039081905590831415611e7a57611e7085856120ef565b6001915050611e80565b60009150505b9392505050565b60cb54604080516001600160a01b03928316815291831660208301527f4264275e593955ff9d6146a51a4525f6ddace2e81db9391abcc9d1ca48047d29910160405180910390a160cb80546001600160a01b0319166001600160a01b0392909216919091179055565b604080518082018252600a81526922b4b3b2b72630bcb2b960b11b60209182015281517f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a866818301527f71b625cfad44bac63b13dba07f2e1d6084ee04b6f8752101ece6126d584ee6ea81840152466060820152306080808301919091528351808303909101815260a0909101909252815191012090565b6097546001600160a01b0316158015611fa857506001600160a01b03821615155b61202a5760405162461bcd60e51b815260206004820152604760248201527f5061757361626c652e5f696e697469616c697a655061757365723a205f696e6960448201527f7469616c697a6550617573657228292063616e206f6e6c792062652063616c6c6064820152666564206f6e636560c81b608482015260a401610659565b609881905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a261206d82611573565b5050565b600080600061208085856122e1565b9150915061208d81612351565b509392505050565b604080516001600160a01b0385811660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b179052610c5390859061250c565b6001600160a01b038216600090815260ce6020526040812054905b8181101561220a576001600160a01b03848116600090815260ce60205260409020805491851691839081106121415761214161309d565b6000918252602090912001546001600160a01b03161415612202576001600160a01b038416600090815260ce6020526040902080546121829060019061320e565b815481106121925761219261309d565b60009182526020808320909101546001600160a01b03878116845260ce90925260409092208054919092169190839081106121cf576121cf61309d565b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555061220a565b60010161210a565b818114156122925760405162461bcd60e51b815260206004820152604960248201527f53747261746567794d616e616765722e5f72656d6f766553747261746567794660448201527f726f6d5374616b657253747261746567794c6973743a207374726174656779206064820152681b9bdd08199bdd5b9960ba1b608482015260a401610659565b6001600160a01b038416600090815260ce602052604090208054806122b9576122b9613225565b600082815260209020810160001990810180546001600160a01b031916905501905550505050565b6000808251604114156123185760208301516040840151606085015160001a61230c878285856125de565b9450945050505061234a565b82516040141561234257602083015160408401516123378683836126cb565b93509350505061234a565b506000905060025b9250929050565b60008160048111156123655761236561323b565b141561236e5750565b60018160048111156123825761238261323b565b14156123d05760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606401610659565b60028160048111156123e4576123e461323b565b14156124325760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606401610659565b60038160048111156124465761244661323b565b141561249f5760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b6064820152608401610659565b60048160048111156124b3576124b361323b565b141561066b5760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c604482015261756560f01b6064820152608401610659565b6000612561826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166127049092919063ffffffff16565b805190915015610a44578080602001905181019061257f9190612f6b565b610a445760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610659565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a083111561261557506000905060036126c2565b8460ff16601b1415801561262d57508460ff16601c14155b1561263e57506000905060046126c2565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015612692573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b0381166126bb576000600192509250506126c2565b9150600090505b94509492505050565b6000806001600160ff1b038316816126e860ff86901c601b6131f6565b90506126f6878288856125de565b935093505050935093915050565b6060612713848460008561271b565b949350505050565b60608247101561277c5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401610659565b6001600160a01b0385163b6127d35760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610659565b600080866001600160a01b031685876040516127ef9190613251565b60006040518083038185875af1925050503d806000811461282c576040519150601f19603f3d011682016040523d82523d6000602084013e612831565b606091505b509150915061284182828661284c565b979650505050505050565b6060831561285b575081611e80565b82511561286b5782518084602001fd5b8160405162461bcd60e51b8152600401610659919061326d565b6001600160a01b038116811461066b57600080fd5b6000602082840312156128ac57600080fd5b8135611e8081612885565b6000602082840312156128c957600080fd5b5035919050565b80356128db81612885565b919050565b634e487b7160e01b600052604160045260246000fd5b60405160c0810167ffffffffffffffff81118282101715612919576129196128e0565b60405290565b604051601f8201601f1916810167ffffffffffffffff81118282101715612948576129486128e0565b604052919050565b60008060008060008060c0878903121561296957600080fd5b863561297481612885565b955060208781013561298581612885565b955060408801359450606088013561299c81612885565b93506080880135925060a088013567ffffffffffffffff808211156129c057600080fd5b818a0191508a601f8301126129d457600080fd5b8135818111156129e6576129e66128e0565b6129f8601f8201601f1916850161291f565b91508082528b84828501011115612a0e57600080fd5b80848401858401376000848284010152508093505050509295509295509295565b600080600060608486031215612a4457600080fd5b8335612a4f81612885565b92506020840135612a5f81612885565b929592945050506040919091013590565b600060208284031215612a8257600080fd5b813560ff81168114611e8057600080fd5b60008060208385031215612aa657600080fd5b823567ffffffffffffffff80821115612abe57600080fd5b818501915085601f830112612ad257600080fd5b813581811115612ae157600080fd5b8660208260051b8501011115612af657600080fd5b60209290920196919550909350505050565b60008060408385031215612b1b57600080fd5b8235612b2681612885565b91506020830135612b3681612885565b809150509250929050565b600081518084526020808501945080840160005b83811015612b7a5781516001600160a01b031687529582019590820190600101612b55565b509495945050505050565b600081518084526020808501945080840160005b83811015612b7a57815187529582019590820190600101612b99565b604081526000612bc86040830185612b41565b8281036020840152612bda8185612b85565b95945050505050565b600067ffffffffffffffff821115612bfd57612bfd6128e0565b5060051b60200190565b600082601f830112612c1857600080fd5b81356020612c2d612c2883612be3565b61291f565b82815260059290921b84018101918181019086841115612c4c57600080fd5b8286015b84811015612c70578035612c6381612885565b8352918301918301612c50565b509695505050505050565b600082601f830112612c8c57600080fd5b81356020612c9c612c2883612be3565b82815260059290921b84018101918181019086841115612cbb57600080fd5b8286015b84811015612c705780358352918301918301612cbf565b600060408284031215612ce857600080fd5b6040516040810181811067ffffffffffffffff82111715612d0b57612d0b6128e0565b6040529050808235612d1c81612885565b815260208301356bffffffffffffffffffffffff81168114612d3d57600080fd5b6020919091015292915050565b803563ffffffff811681146128db57600080fd5b600060208284031215612d7057600080fd5b813567ffffffffffffffff80821115612d8857600080fd5b9083019060e08286031215612d9c57600080fd5b612da46128f6565b823582811115612db357600080fd5b612dbf87828601612c07565b825250602083013582811115612dd457600080fd5b612de087828601612c7b565b602083015250612df2604084016128d0565b6040820152612e048660608501612cd6565b6060820152612e1560a08401612d4a565b6080820152612e2660c084016128d0565b60a082015295945050505050565b60008060008060808587031215612e4a57600080fd5b8435612e5581612885565b93506020850135612e6581612885565b9250604085013591506060850135612e7c81612885565b939692955090935050565b60008060408385031215612e9a57600080fd5b8235612ea581612885565b946020939093013593505050565b60008060008060808587031215612ec957600080fd5b8435612ed481612885565b93506020850135612ee481612885565b92506040850135612ef481612885565b9396929550929360600135925050565b600060208284031215612f1657600080fd5b8151611e8081612885565b6020808252602a908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526939903ab73830bab9b2b960b11b606082015260800190565b600060208284031215612f7d57600080fd5b81518015158114611e8057600080fd5b60208082526028908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526739903830bab9b2b960c11b606082015260800190565b602080825260409082018190527f53747261746567794d616e616765722e6f6e6c7944656c65676174696f6e4d61908201527f6e616765723a206e6f74207468652044656c65676174696f6e4d616e61676572606082015260800190565b60208082526044908201527f53747261746567794d616e616765722e6f6e6c7953747261746567795768697460408201527f656c69737465723a206e6f742074686520737472617465677957686974656c6960608201526339ba32b960e11b608082015260a00190565b634e487b7160e01b600052603260045260246000fd5b60e0815260006130c660e0830189612b41565b82810360208401526130d88189612b85565b6001600160a01b0397881660408501528651881660608501526020909601516bffffffffffffffffffffffff166080840152505063ffffffff9290921660a083015290921660c09092019190915292915050565b60005b8381101561314757818101518382015260200161312f565b83811115610c535750506000910152565b6000815180845261317081602086016020860161312c565b601f01601f19169290920160200192915050565b8281526040602082015260006127136040830184613158565b6000602082840312156131af57600080fd5b81516001600160e01b031981168114611e8057600080fd5b6000602082840312156131d957600080fd5b5051919050565b634e487b7160e01b600052601160045260246000fd5b60008219821115613209576132096131e0565b500190565b600082821015613220576132206131e0565b500390565b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052602160045260246000fd5b6000825161326381846020870161312c565b9190910192915050565b602081526000611e80602083018461315856fea2646970667358221220c56189ec727d108892fe316fda0640a975c27d8b087d6f78a4efbb1e4a58677064736f6c634300080c0033","storage":{"0x0":"0xff"}},"0xc6e7df5e7b4f2a278906862b61205850344d4e7d":{"nonce":1,"balance":"0x0","code":"0x608060405234801561001057600080fd5b506004361061018e5760003560e01c80635c975abb116100de578063ab5921e111610097578063df6fadc111610071578063df6fadc114610366578063e3dae51c14610381578063f3e7387514610394578063fabc1cbc146103a757600080fd5b8063ab5921e11461032b578063ce7c2ac214610340578063d9caed121461035357600080fd5b80635c975abb146102c857806361b01b5d146102d05780637a8b2637146102d9578063886f1195146102ec5780638c871019146103055780638f6a62401461031857600080fd5b80633a98ef391161014b578063485cc95511610125578063485cc9551461026b578063553ca5f81461027e578063595c6a67146102915780635ac86ab71461029957600080fd5b80633a98ef391461023857806343fe08b01461024f57806347e7ef241461025857600080fd5b8063019e27291461019357806310d67a2f146101a857806311c70c9d146101bb578063136439dd146101ce5780632495a599146101e157806339b70e3814610211575b600080fd5b6101a66101a13660046117b2565b6103ba565b005b6101a66101b63660046117fc565b61049d565b6101a66101c9366004611819565b610550565b6101a66101dc36600461183b565b610605565b6032546101f4906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b6101f47f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c981565b61024160335481565b604051908152602001610208565b61024160645481565b610241610266366004611854565b610749565b6101a6610279366004611880565b610969565b61024161028c3660046117fc565b610a37565b6101a6610a4b565b6102b86102a73660046118b9565b6001805460ff9092161b9081161490565b6040519015158152602001610208565b600154610241565b61024160655481565b6102416102e736600461183b565b610b17565b6000546101f4906201000090046001600160a01b031681565b61024161031336600461183b565b610b62565b6102416103263660046117fc565b610b6d565b610333610b7b565b604051610208919061190c565b61024161034e3660046117fc565b610b9b565b6101a661036136600461193f565b610c30565b60645460655460408051928352602083019190915201610208565b61024161038f36600461183b565b610e7d565b6102416103a236600461183b565b610eb6565b6101a66103b536600461183b565b610ec1565b600054610100900460ff16158080156103da5750600054600160ff909116105b806103f45750303b1580156103f4575060005460ff166001145b6104195760405162461bcd60e51b815260040161041090611980565b60405180910390fd5b6000805460ff19166001179055801561043c576000805461ff0019166101001790555b610446858561101d565b610450838361112a565b8015610496576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050505050565b600060029054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156104f0573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061051491906119ce565b6001600160a01b0316336001600160a01b0316146105445760405162461bcd60e51b8152600401610410906119eb565b61054d816111bb565b50565b600060029054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156105a3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105c791906119ce565b6001600160a01b0316336001600160a01b0316146105f75760405162461bcd60e51b8152600401610410906119eb565b610601828261101d565b5050565b60005460405163237dfb4760e11b8152336004820152620100009091046001600160a01b0316906346fbf68e90602401602060405180830381865afa158015610652573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106769190611a35565b6106925760405162461bcd60e51b815260040161041090611a57565b6001548181161461070b5760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e70617573653a20696e76616c696420617474656d70742060448201527f746f20756e70617573652066756e6374696f6e616c69747900000000000000006064820152608401610410565b600181905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d906020015b60405180910390a250565b6001805460009182918116141561079e5760405162461bcd60e51b815260206004820152601960248201527814185d5cd8589b194e881a5b99195e081a5cc81c185d5cd959603a1b6044820152606401610410565b336001600160a01b037f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c916146108165760405162461bcd60e51b815260206004820181905260248201527f5374726174656779426173652e6f6e6c7953747261746567794d616e616765726044820152606401610410565b61082084846112c0565b6032546001600160a01b0385811691161461089c5760405162461bcd60e51b815260206004820152603660248201527f5374726174656779426173652e6465706f7369743a2043616e206f6e6c79206460448201527532b837b9b4ba103ab73232b9363cb4b733aa37b5b2b760511b6064820152608401610410565b60335460006108ad6103e883611ab5565b905060006103e86108bc611398565b6108c69190611ab5565b905060006108d48783611acd565b9050806108e18489611ae4565b6108eb9190611b03565b9550856109515760405162461bcd60e51b815260206004820152602e60248201527f5374726174656779426173652e6465706f7369743a206e65775368617265732060448201526d63616e6e6f74206265207a65726f60901b6064820152608401610410565b61095b8685611ab5565b603355505050505092915050565b600054610100900460ff16158080156109895750600054600160ff909116105b806109a35750303b1580156109a3575060005460ff166001145b6109bf5760405162461bcd60e51b815260040161041090611980565b6000805460ff1916600117905580156109e2576000805461ff0019166101001790555b6109ec838361112a565b8015610a32576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050565b6000610a456102e783610b9b565b92915050565b60005460405163237dfb4760e11b8152336004820152620100009091046001600160a01b0316906346fbf68e90602401602060405180830381865afa158015610a98573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610abc9190611a35565b610ad85760405162461bcd60e51b815260040161041090611a57565b600019600181905560405190815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a2565b6000806103e8603354610b2a9190611ab5565b905060006103e8610b39611398565b610b439190611ab5565b905081610b508583611ae4565b610b5a9190611b03565b949350505050565b6000610a4582610e7d565b6000610a456103a283610b9b565b60606040518060800160405280604d8152602001611b5b604d9139905090565b604051633d3f06c960e11b81526001600160a01b0382811660048301523060248301526000917f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c990911690637a7e0d9290604401602060405180830381865afa158015610c0c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a459190611b25565b6001805460029081161415610c835760405162461bcd60e51b815260206004820152601960248201527814185d5cd8589b194e881a5b99195e081a5cc81c185d5cd959603a1b6044820152606401610410565b336001600160a01b037f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c91614610cfb5760405162461bcd60e51b815260206004820181905260248201527f5374726174656779426173652e6f6e6c7953747261746567794d616e616765726044820152606401610410565b6032546001600160a01b03848116911614610d7e5760405162461bcd60e51b815260206004820152603b60248201527f5374726174656779426173652e77697468647261773a2043616e206f6e6c792060448201527f77697468647261772074686520737472617465677920746f6b656e00000000006064820152608401610410565b60335480831115610e0d5760405162461bcd60e51b815260206004820152604d60248201527f5374726174656779426173652e77697468647261773a20616d6f756e7453686160448201527f726573206d757374206265206c657373207468616e206f7220657175616c207460648201526c6f20746f74616c53686172657360981b608482015260a401610410565b6000610e1b6103e883611ab5565b905060006103e8610e2a611398565b610e349190611ab5565b9050600082610e438784611ae4565b610e4d9190611b03565b9050610e598685611acd565b603355603254610e73906001600160a01b0316898361140a565b5050505050505050565b6000806103e8603354610e909190611ab5565b905060006103e8610e9f611398565b610ea99190611ab5565b905080610b508386611ae4565b6000610a4582610b17565b600060029054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610f14573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f3891906119ce565b6001600160a01b0316336001600160a01b031614610f685760405162461bcd60e51b8152600401610410906119eb565b600154198119600154191614610fe65760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e756e70617573653a20696e76616c696420617474656d7060448201527f7420746f2070617573652066756e6374696f6e616c69747900000000000000006064820152608401610410565b600181905560405181815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c9060200161073e565b60645460408051918252602082018490527ff97ed4e083acac67830025ecbc756d8fe847cdbdca4cee3fe1e128e98b54ecb5910160405180910390a160655460408051918252602082018390527f6ab181e0440bfbf4bacdf2e99674735ce6638005490688c5f994f5399353e452910160405180910390a18082111561111f5760405162461bcd60e51b815260206004820152604b60248201527f53747261746567794261736554564c4c696d6974732e5f73657454564c4c696d60448201527f6974733a206d61785065724465706f7369742065786365656473206d6178546f60648201526a74616c4465706f7369747360a81b608482015260a401610410565b606491909155606555565b600054610100900460ff166111955760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b6064820152608401610410565b603280546001600160a01b0319166001600160a01b03841617905561060181600061145c565b6001600160a01b0381166112495760405162461bcd60e51b815260206004820152604960248201527f5061757361626c652e5f73657450617573657252656769737472793a206e657760448201527f50617573657252656769737472792063616e6e6f7420626520746865207a65726064820152686f206164647265737360b81b608482015260a401610410565b600054604080516001600160a01b03620100009093048316815291831660208301527f6e9fcd539896fca60e8b0f01dd580233e48a6b0f7df013b89ba7f565869acdb6910160405180910390a1600080546001600160a01b03909216620100000262010000600160b01b0319909216919091179055565b60645481111561132a5760405162461bcd60e51b815260206004820152602f60248201527f53747261746567794261736554564c4c696d6974733a206d617820706572206460448201526e195c1bdcda5d08195e18d959591959608a1b6064820152608401610410565b606554611335611398565b11156106015760405162461bcd60e51b815260206004820152602c60248201527f53747261746567794261736554564c4c696d6974733a206d6178206465706f7360448201526b1a5d1cc8195e18d95959195960a21b6064820152608401610410565b6032546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa1580156113e1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114059190611b25565b905090565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052610a32908490611548565b6000546201000090046001600160a01b031615801561148357506001600160a01b03821615155b6115055760405162461bcd60e51b815260206004820152604760248201527f5061757361626c652e5f696e697469616c697a655061757365723a205f696e6960448201527f7469616c697a6550617573657228292063616e206f6e6c792062652063616c6c6064820152666564206f6e636560c81b608482015260a401610410565b600181905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a2610601826111bb565b600061159d826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b031661161a9092919063ffffffff16565b805190915015610a3257808060200190518101906115bb9190611a35565b610a325760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610410565b60606116298484600085611633565b90505b9392505050565b6060824710156116945760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401610410565b6001600160a01b0385163b6116eb5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610410565b600080866001600160a01b031685876040516117079190611b3e565b60006040518083038185875af1925050503d8060008114611744576040519150601f19603f3d011682016040523d82523d6000602084013e611749565b606091505b5091509150611759828286611764565b979650505050505050565b6060831561177357508161162c565b8251156117835782518084602001fd5b8160405162461bcd60e51b8152600401610410919061190c565b6001600160a01b038116811461054d57600080fd5b600080600080608085870312156117c857600080fd5b843593506020850135925060408501356117e18161179d565b915060608501356117f18161179d565b939692955090935050565b60006020828403121561180e57600080fd5b813561162c8161179d565b6000806040838503121561182c57600080fd5b50508035926020909101359150565b60006020828403121561184d57600080fd5b5035919050565b6000806040838503121561186757600080fd5b82356118728161179d565b946020939093013593505050565b6000806040838503121561189357600080fd5b823561189e8161179d565b915060208301356118ae8161179d565b809150509250929050565b6000602082840312156118cb57600080fd5b813560ff8116811461162c57600080fd5b60005b838110156118f75781810151838201526020016118df565b83811115611906576000848401525b50505050565b602081526000825180602084015261192b8160408501602087016118dc565b601f01601f19169190910160400192915050565b60008060006060848603121561195457600080fd5b833561195f8161179d565b9250602084013561196f8161179d565b929592945050506040919091013590565b6020808252602e908201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160408201526d191e481a5b9a5d1a585b1a5e995960921b606082015260800190565b6000602082840312156119e057600080fd5b815161162c8161179d565b6020808252602a908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526939903ab73830bab9b2b960b11b606082015260800190565b600060208284031215611a4757600080fd5b8151801515811461162c57600080fd5b60208082526028908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526739903830bab9b2b960c11b606082015260800190565b634e487b7160e01b600052601160045260246000fd5b60008219821115611ac857611ac8611a9f565b500190565b600082821015611adf57611adf611a9f565b500390565b6000816000190483118215151615611afe57611afe611a9f565b500290565b600082611b2057634e487b7160e01b600052601260045260246000fd5b500490565b600060208284031215611b3757600080fd5b5051919050565b60008251611b508184602087016118dc565b919091019291505056fe4261736520537472617465677920696d706c656d656e746174696f6e20746f20696e68657269742066726f6d20666f72206d6f726520636f6d706c657820696d706c656d656e746174696f6e73a264697066735822122034593a0699459364f9a894977ab2a32440eec074a8626722acd4cd4064c0abf864736f6c634300080c0033","storage":{"0x0":"0xff"}},"0xcf7ed3acca5a467e9e704c703e8d87f634fb0fc9":{"nonce":1,"balance":"0x0","code":"0x60806040526004361061004e5760003560e01c80633659cfe6146100655780634f1ef286146100855780635c60da1b146100985780638f283970146100c9578063f851a440146100e95761005d565b3661005d5761005b6100fe565b005b61005b6100fe565b34801561007157600080fd5b5061005b6100803660046106f1565b610118565b61005b61009336600461070c565b61015f565b3480156100a457600080fd5b506100ad6101d0565b6040516001600160a01b03909116815260200160405180910390f35b3480156100d557600080fd5b5061005b6100e43660046106f1565b61020b565b3480156100f557600080fd5b506100ad610235565b61010661029b565b61011661011161033a565b610344565b565b610120610368565b6001600160a01b0316336001600160a01b03161415610157576101548160405180602001604052806000815250600061039b565b50565b6101546100fe565b610167610368565b6001600160a01b0316336001600160a01b031614156101c8576101c38383838080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506001925061039b915050565b505050565b6101c36100fe565b60006101da610368565b6001600160a01b0316336001600160a01b03161415610200576101fb61033a565b905090565b6102086100fe565b90565b610213610368565b6001600160a01b0316336001600160a01b0316141561015757610154816103c6565b600061023f610368565b6001600160a01b0316336001600160a01b03161415610200576101fb610368565b6060610285838360405180606001604052806027815260200161080b6027913961041a565b9392505050565b6001600160a01b03163b151590565b6102a3610368565b6001600160a01b0316336001600160a01b031614156101165760405162461bcd60e51b815260206004820152604260248201527f5472616e73706172656e745570677261646561626c6550726f78793a2061646d60448201527f696e2063616e6e6f742066616c6c6261636b20746f2070726f78792074617267606482015261195d60f21b608482015260a4015b60405180910390fd5b60006101fb6104f7565b3660008037600080366000845af43d6000803e808015610363573d6000f35b3d6000fd5b60007fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b546001600160a01b0316919050565b6103a48361051f565b6000825111806103b15750805b156101c3576103c08383610260565b50505050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f6103ef610368565b604080516001600160a01b03928316815291841660208301520160405180910390a16101548161055f565b60606001600160a01b0384163b6104825760405162461bcd60e51b815260206004820152602660248201527f416464726573733a2064656c65676174652063616c6c20746f206e6f6e2d636f6044820152651b9d1c9858dd60d21b6064820152608401610331565b600080856001600160a01b03168560405161049d91906107bb565b600060405180830381855af49150503d80600081146104d8576040519150601f19603f3d011682016040523d82523d6000602084013e6104dd565b606091505b50915091506104ed828286610608565b9695505050505050565b60007f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc61038c565b61052881610641565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b6001600160a01b0381166105c45760405162461bcd60e51b815260206004820152602660248201527f455243313936373a206e65772061646d696e20697320746865207a65726f206160448201526564647265737360d01b6064820152608401610331565b807fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b80546001600160a01b0319166001600160a01b039290921691909117905550565b60608315610617575081610285565b8251156106275782518084602001fd5b8160405162461bcd60e51b815260040161033191906107d7565b6001600160a01b0381163b6106ae5760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b6064820152608401610331565b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc6105e7565b80356001600160a01b03811681146106ec57600080fd5b919050565b60006020828403121561070357600080fd5b610285826106d5565b60008060006040848603121561072157600080fd5b61072a846106d5565b9250602084013567ffffffffffffffff8082111561074757600080fd5b818601915086601f83011261075b57600080fd5b81358181111561076a57600080fd5b87602082850101111561077c57600080fd5b6020830194508093505050509250925092565b60005b838110156107aa578181015183820152602001610792565b838111156103c05750506000910152565b600082516107cd81846020870161078f565b9190910192915050565b60208152600082518060208401526107f681604085016020870161078f565b601f01601f1916919091016040019291505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a2646970667358221220bceca38d0e447b38e612e8ea5bb02b1e1fcac6609b19aa0fd3fd43aa4b97bf1b64736f6c634300080c0033","storage":{"0x0":"0x1","0x33":"0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266","0x65":"0xe7f1725e7734ce288f8367e1bb143e90bb3f0512","0x66":"0x0","0x97":"0x831f01b2aeb61d5d8c019704e62c25763057a8806c5c790bc8b4c99ee54ac8a7","0x9d":"0x1","0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc":"0x610178da211fef7d417bc0e6fed39f05609ad788","0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103":"0x5fbdb2315678afecb367f032d93f642f64180aa3"}},"0xdc64a140aa3e981100a9beca4e685f962f0cf6c9":{"nonce":1,"balance":"0x0","code":"0x60806040526004361061004e5760003560e01c80633659cfe6146100655780634f1ef286146100855780635c60da1b146100985780638f283970146100c9578063f851a440146100e95761005d565b3661005d5761005b6100fe565b005b61005b6100fe565b34801561007157600080fd5b5061005b6100803660046106f1565b610118565b61005b61009336600461070c565b61015f565b3480156100a457600080fd5b506100ad6101d0565b6040516001600160a01b03909116815260200160405180910390f35b3480156100d557600080fd5b5061005b6100e43660046106f1565b61020b565b3480156100f557600080fd5b506100ad610235565b61010661029b565b61011661011161033a565b610344565b565b610120610368565b6001600160a01b0316336001600160a01b03161415610157576101548160405180602001604052806000815250600061039b565b50565b6101546100fe565b610167610368565b6001600160a01b0316336001600160a01b031614156101c8576101c38383838080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506001925061039b915050565b505050565b6101c36100fe565b60006101da610368565b6001600160a01b0316336001600160a01b03161415610200576101fb61033a565b905090565b6102086100fe565b90565b610213610368565b6001600160a01b0316336001600160a01b0316141561015757610154816103c6565b600061023f610368565b6001600160a01b0316336001600160a01b03161415610200576101fb610368565b6060610285838360405180606001604052806027815260200161080b6027913961041a565b9392505050565b6001600160a01b03163b151590565b6102a3610368565b6001600160a01b0316336001600160a01b031614156101165760405162461bcd60e51b815260206004820152604260248201527f5472616e73706172656e745570677261646561626c6550726f78793a2061646d60448201527f696e2063616e6e6f742066616c6c6261636b20746f2070726f78792074617267606482015261195d60f21b608482015260a4015b60405180910390fd5b60006101fb6104f7565b3660008037600080366000845af43d6000803e808015610363573d6000f35b3d6000fd5b60007fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b546001600160a01b0316919050565b6103a48361051f565b6000825111806103b15750805b156101c3576103c08383610260565b50505050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f6103ef610368565b604080516001600160a01b03928316815291841660208301520160405180910390a16101548161055f565b60606001600160a01b0384163b6104825760405162461bcd60e51b815260206004820152602660248201527f416464726573733a2064656c65676174652063616c6c20746f206e6f6e2d636f6044820152651b9d1c9858dd60d21b6064820152608401610331565b600080856001600160a01b03168560405161049d91906107bb565b600060405180830381855af49150503d80600081146104d8576040519150601f19603f3d011682016040523d82523d6000602084013e6104dd565b606091505b50915091506104ed828286610608565b9695505050505050565b60007f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc61038c565b61052881610641565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b6001600160a01b0381166105c45760405162461bcd60e51b815260206004820152602660248201527f455243313936373a206e65772061646d696e20697320746865207a65726f206160448201526564647265737360d01b6064820152608401610331565b807fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b80546001600160a01b0319166001600160a01b039290921691909117905550565b60608315610617575081610285565b8251156106275782518084602001fd5b8160405162461bcd60e51b815260040161033191906107d7565b6001600160a01b0381163b6106ae5760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b6064820152608401610331565b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc6105e7565b80356001600160a01b03811681146106ec57600080fd5b919050565b60006020828403121561070357600080fd5b610285826106d5565b60008060006040848603121561072157600080fd5b61072a846106d5565b9250602084013567ffffffffffffffff8082111561074757600080fd5b818601915086601f83011261075b57600080fd5b81358181111561076a57600080fd5b87602082850101111561077c57600080fd5b6020830194508093505050509250925092565b60005b838110156107aa578181015183820152602001610792565b838111156103c05750506000910152565b600082516107cd81846020870161078f565b9190910192915050565b60208152600082518060208401526107f681604085016020870161078f565b601f01601f1916919091016040019291505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a2646970667358221220bceca38d0e447b38e612e8ea5bb02b1e1fcac6609b19aa0fd3fd43aa4b97bf1b64736f6c634300080c0033","storage":{"0x0":"0x1","0x33":"0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266","0x97":"0xe7f1725e7734ce288f8367e1bb143e90bb3f0512","0x98":"0x0","0xc9":"0xd65ac9700cec4e530497617d02afdf0d5de3ed18466aca1578edcbce0d40ee16","0xcb":"0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266","0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc":"0xb7f8bc63bbcad18155201308c8f3540b07f84f5e","0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103":"0x5fbdb2315678afecb367f032d93f642f64180aa3"}},"0xe7f1725e7734ce288f8367e1bb143e90bb3f0512":{"nonce":1,"balance":"0x0","code":"0x608060405234801561001057600080fd5b506004361061004c5760003560e01c806346fbf68e146100515780638568520614610089578063ce5484281461009e578063eab66d7a146100b1575b600080fd5b61007461005f366004610313565b60006020819052908152604090205460ff1681565b60405190151581526020015b60405180910390f35b61009c610097366004610335565b6100dc565b005b61009c6100ac366004610313565b61011d565b6001546100c4906001600160a01b031681565b6040516001600160a01b039091168152602001610080565b6001546001600160a01b0316331461010f5760405162461bcd60e51b815260040161010690610371565b60405180910390fd5b6101198282610153565b5050565b6001546001600160a01b031633146101475760405162461bcd60e51b815260040161010690610371565b61015081610220565b50565b6001600160a01b0382166101bf5760405162461bcd60e51b815260206004820152602d60248201527f50617573657252656769737472792e5f7365745061757365723a207a65726f2060448201526c1859191c995cdcc81a5b9c1d5d609a1b6064820152608401610106565b6001600160a01b03821660008181526020818152604091829020805460ff19168515159081179091558251938452908301527f65d3a1fd4c13f05cba164f80d03ce90fb4b5e21946bfc3ab7dbd434c2d0b9152910160405180910390a15050565b6001600160a01b03811661028e5760405162461bcd60e51b815260206004820152602f60248201527f50617573657252656769737472792e5f736574556e7061757365723a207a657260448201526e1bc81859191c995cdcc81a5b9c1d5d608a1b6064820152608401610106565b600154604080516001600160a01b03928316815291831660208301527f06b4167a2528887a1e97a366eefe8549bfbf1ea3e6ac81cb2564a934d20e8892910160405180910390a1600180546001600160a01b0319166001600160a01b0392909216919091179055565b80356001600160a01b038116811461030e57600080fd5b919050565b60006020828403121561032557600080fd5b61032e826102f7565b9392505050565b6000806040838503121561034857600080fd5b610351836102f7565b91506020830135801515811461036657600080fd5b809150509250929050565b6020808252602a908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526939903ab73830bab9b2b960b11b60608201526080019056fea2646970667358221220f71399fafd06d0e383b21957bcac3bf3986a6a0701bc4c5dc7ee118215f3652364736f6c634300080c0033","storage":{"0x1":"0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266","0x723077b8a1b173adc35e5f0e7e3662fd1208212cb629f9c128551ea7168da722":"0x1"}},"0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266":{"nonce":23,"balance":"0x21e189608cedf295a5d","code":"0x","storage":{}}}} \ No newline at end of file diff --git a/tests/anvil/data/genesis.json b/tests/anvil/data/genesis.json new file mode 100644 index 00000000..e47134d1 --- /dev/null +++ b/tests/anvil/data/genesis.json @@ -0,0 +1,49 @@ +{ + "nonce": "0x0", + "timestamp": "0x0", + "extraData": "0x5343", + "gasLimit": "0x1388", + "difficulty": "0x400000000", + "mixHash": "0x0000000000000000000000000000000000000000000000000000000000000000", + "coinbase": "0x0000000000000000000000000000000000000000", + "alloc": { + "0xd143C405751162d0F96bEE2eB5eb9C61882a736E": { + "balance": "0x4a47e3c12448f4ad000000" + }, + "0x0165878a594ca255338adfa4d48449f69242eb8f": { + "nonce": 1, + "balance": "0x0", + "code": "0x60806040526004361061004e5760003560e01c80633659cfe6146100655780634f1ef286146100855780635c60da1b146100985780638f283970146100c9578063f851a440146100e95761005d565b3661005d5761005b6100fe565b005b61005b6100fe565b34801561007157600080fd5b5061005b6100803660046106f1565b610118565b61005b61009336600461070c565b61015f565b3480156100a457600080fd5b506100ad6101d0565b6040516001600160a01b03909116815260200160405180910390f35b3480156100d557600080fd5b5061005b6100e43660046106f1565b61020b565b3480156100f557600080fd5b506100ad610235565b61010661029b565b61011661011161033a565b610344565b565b610120610368565b6001600160a01b0316336001600160a01b03161415610157576101548160405180602001604052806000815250600061039b565b50565b6101546100fe565b610167610368565b6001600160a01b0316336001600160a01b031614156101c8576101c38383838080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506001925061039b915050565b505050565b6101c36100fe565b60006101da610368565b6001600160a01b0316336001600160a01b03161415610200576101fb61033a565b905090565b6102086100fe565b90565b610213610368565b6001600160a01b0316336001600160a01b0316141561015757610154816103c6565b600061023f610368565b6001600160a01b0316336001600160a01b03161415610200576101fb610368565b6060610285838360405180606001604052806027815260200161080b6027913961041a565b9392505050565b6001600160a01b03163b151590565b6102a3610368565b6001600160a01b0316336001600160a01b031614156101165760405162461bcd60e51b815260206004820152604260248201527f5472616e73706172656e745570677261646561626c6550726f78793a2061646d60448201527f696e2063616e6e6f742066616c6c6261636b20746f2070726f78792074617267606482015261195d60f21b608482015260a4015b60405180910390fd5b60006101fb6104f7565b3660008037600080366000845af43d6000803e808015610363573d6000f35b3d6000fd5b60007fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b546001600160a01b0316919050565b6103a48361051f565b6000825111806103b15750805b156101c3576103c08383610260565b50505050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f6103ef610368565b604080516001600160a01b03928316815291841660208301520160405180910390a16101548161055f565b60606001600160a01b0384163b6104825760405162461bcd60e51b815260206004820152602660248201527f416464726573733a2064656c65676174652063616c6c20746f206e6f6e2d636f6044820152651b9d1c9858dd60d21b6064820152608401610331565b600080856001600160a01b03168560405161049d91906107bb565b600060405180830381855af49150503d80600081146104d8576040519150601f19603f3d011682016040523d82523d6000602084013e6104dd565b606091505b50915091506104ed828286610608565b9695505050505050565b60007f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc61038c565b61052881610641565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b6001600160a01b0381166105c45760405162461bcd60e51b815260206004820152602660248201527f455243313936373a206e65772061646d696e20697320746865207a65726f206160448201526564647265737360d01b6064820152608401610331565b807fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b80546001600160a01b0319166001600160a01b039290921691909117905550565b60608315610617575081610285565b8251156106275782518084602001fd5b8160405162461bcd60e51b815260040161033191906107d7565b6001600160a01b0381163b6106ae5760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b6064820152608401610331565b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc6105e7565b80356001600160a01b03811681146106ec57600080fd5b919050565b60006020828403121561070357600080fd5b610285826106d5565b60008060006040848603121561072157600080fd5b61072a846106d5565b9250602084013567ffffffffffffffff8082111561074757600080fd5b818601915086601f83011261075b57600080fd5b81358181111561076a57600080fd5b87602082850101111561077c57600080fd5b6020830194508093505050509250925092565b60005b838110156107aa578181015183820152602001610792565b838111156103c05750506000910152565b600082516107cd81846020870161078f565b9190910192915050565b60208152600082518060208401526107f681604085016020870161078f565b601f01601f1916919091016040019291505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a2646970667358221220bceca38d0e447b38e612e8ea5bb02b1e1fcac6609b19aa0fd3fd43aa4b97bf1b64736f6c634300080c0033", + "storage": { + "0x0": "0x1", + "0x33": "0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266", + "0x65": "0xe7f1725e7734ce288f8367e1bb143e90bb3f0512", + "0x66": "0x1e", + "0x97": "0x0", + "0x9a": "0x0", + "0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc": "0xdcd1bf9a1b36ce34237eeafef220932846bcd82", + "0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103": "0x5fbdb2315678afecb367f032d93f642f64180aa3" + } + } + }, + "number": "7", + "gasUsed": "0x0", + "parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000", + "config": { + "ethash": {}, + "chainId": 31337, + "homesteadBlock": 0, + "eip150Block": 0, + "eip155Block": 0, + "eip158Block": 0, + "byzantiumBlock": 0, + "constantinopleBlock": 0, + "petersburgBlock": 0, + "istanbulBlock": 0, + "berlinBlock": 0, + "londonBlock": 0, + "terminalTotalDifficulty": 0, + "terminalTotalDifficultyPassed": true, + "shanghaiTime": 0 + } +} diff --git a/tests/anvil/deploy-avs-save-anvil-state.sh b/tests/anvil/deploy-avs-save-anvil-state.sh new file mode 100644 index 00000000..d20474d8 --- /dev/null +++ b/tests/anvil/deploy-avs-save-anvil-state.sh @@ -0,0 +1,27 @@ +#!/bin/bash + +RPC_URL=http://localhost:8545 +PRIVATE_KEY=0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80 + +# cd to the directory of this script so that this can be run from anywhere +parent_path=$( cd "$(dirname "${BASH_SOURCE[0]}")" ; pwd -P ) +cd "$parent_path" + +# start an anvil instance in the background that has eigenlayer contracts deployed +anvil --load-state data/eigenlayer-deployed-anvil-state.json --dump-state data/avs-and-eigenlayer-deployed-anvil-state.json & +cd ../../contracts/evm +forge script script/SFFLDeployer.s.sol --rpc-url $RPC_URL --private-key $PRIVATE_KEY --broadcast -v +# save the block-number in the genesis file which we also need to restart the anvil chain at the correct block +# otherwise the indexRegistry has a quorumUpdate at a high block number, and when we restart a clean anvil (without genesis.json) file +# it starts at block 0, and so calling getOperatorListAtBlockNumber reverts because it thinks there are no quorums registered at block 0 +# EDIT: this doesn't actually work... since we can't both load a state and a genesis.json file... see https://github.com/foundry-rs/foundry/issues/6679 +# will keep here in case this PR ever gets merged. +GENESIS_FILE=$parent_path/data/genesis.json +TMP_GENESIS_FILE=$parent_path/data/genesis.json.tmp +jq '.number = "'$(cast block-number)'"' $GENESIS_FILE > $TMP_GENESIS_FILE +mv $TMP_GENESIS_FILE $GENESIS_FILE + +# we also do this here to make sure the operator has funds to register with the eigenlayer contracts +cast send 0x860B6912C2d0337ef05bbC89b0C2CB6CbAEAB4A5 --value 10ether --private-key 0x2a871d0798f97d79848a013d4936a73bf4cc922c825d33c1cf7073dff6d409c6 +# kill anvil to save its state +pkill anvil diff --git a/tests/anvil/deploy-eigenlayer-save-anvil-state.sh b/tests/anvil/deploy-eigenlayer-save-anvil-state.sh new file mode 100755 index 00000000..5bbbfa98 --- /dev/null +++ b/tests/anvil/deploy-eigenlayer-save-anvil-state.sh @@ -0,0 +1,20 @@ +#!/bin/bash + +# cd to the directory of this script so that this can be run from anywhere +parent_path=$( cd "$(dirname "${BASH_SOURCE[0]}")" ; pwd -P ) +# At this point we are in tests/anvil +cd "$parent_path" + +# start an empty anvil chain in the background and dump its state to a json file upon exit +anvil --dump-state data/eigenlayer-deployed-anvil-state.json & + +cd ../../contracts/evm/lib/eigenlayer-contracts +# deployment overwrites this file, so we save it as backup, because we want that output in our local files, and not in the eigenlayer-contracts submodule files +mv script/output/M2_from_scratch_deployment_data.json script/output/M2_from_scratch_deployment_data.json.bak +# M2_Deploy_From_Scratch.s.sol prepends "script/testing/" to the configFile passed as input (M2_deploy_from_scratch.anvil.config.json) +forge script script/testing/M2_Deploy_From_Scratch.s.sol --rpc-url http://localhost:8545 --private-key 0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80 --broadcast --sig "run(string memory configFile)" -- M2_deploy_from_scratch.anvil.config.json +mv script/output/M2_from_scratch_deployment_data.json ../../script/output/31337/eigenlayer_deployment_output.json +mv script/output/M2_from_scratch_deployment_data.json.bak script/output/M2_from_scratch_deployment_data.json + +# # kill anvil to save its state +pkill anvil diff --git a/tests/anvil/operator-registration.sh b/tests/anvil/operator-registration.sh new file mode 100644 index 00000000..9b313fd1 --- /dev/null +++ b/tests/anvil/operator-registration.sh @@ -0,0 +1,3 @@ +#!/bin/bash + +cd ../../ && make cli-setup-operator \ No newline at end of file diff --git a/tests/anvil/start-anvil-chain-with-el-and-avs-deployed.sh b/tests/anvil/start-anvil-chain-with-el-and-avs-deployed.sh new file mode 100755 index 00000000..3470490b --- /dev/null +++ b/tests/anvil/start-anvil-chain-with-el-and-avs-deployed.sh @@ -0,0 +1,25 @@ +#!/bin/bash + +RPC_URL=http://localhost:8545 +PRIVATE_KEY=0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80 + +# cd to the directory of this script so that this can be run from anywhere +parent_path=$( cd "$(dirname "${BASH_SOURCE[0]}")" ; pwd -P ) +cd "$parent_path" + +# start an anvil instance in the background that has eigenlayer contracts deployed +# we start anvil in the background so that we can run the below script +anvil --load-state data/avs-and-eigenlayer-deployed-anvil-state.json & +ANVIL_PID=$! + +cd ../../contracts/evm +# we need to restart the anvil chain at the correct block, otherwise the indexRegistry has a quorumUpdate at the block number +# at which it was deployed (aka quorum was created/updated), but when we start anvil by loading state file it starts at block number 0 +# so calling getOperatorListAtBlockNumber reverts because it thinks there are no quorums registered at block 0 +# advancing chain manually like this is a current hack until https://github.com/foundry-rs/foundry/issues/6679 is merged +# also not that it doesn't really advance by the correct number of blocks.. not sure why, so we just forward by a bunch of blocks that should be enough +forge script script/utils/Utils.sol --sig "advanceChainByNBlocks(uint256)" 100 --rpc-url $RPC_URL --private-key $PRIVATE_KEY --broadcast +echo "current block-number:" $(cast block-number) + +# Bring Anvil back to the foreground +wait $ANVIL_PID \ No newline at end of file diff --git a/tests/integration/integration_test.go b/tests/integration/integration_test.go new file mode 100644 index 00000000..aa3a3933 --- /dev/null +++ b/tests/integration/integration_test.go @@ -0,0 +1,246 @@ +package integration_test + +import ( + "bytes" + "context" + "fmt" + "log" + "os" + "os/exec" + "path/filepath" + "testing" + "time" + + "github.com/Layr-Labs/eigensdk-go/chainio/clients" + "github.com/Layr-Labs/eigensdk-go/chainio/clients/eth" + "github.com/Layr-Labs/eigensdk-go/chainio/txmgr" + sdklogging "github.com/Layr-Labs/eigensdk-go/logging" + "github.com/Layr-Labs/eigensdk-go/signerv2" + sdkutils "github.com/Layr-Labs/eigensdk-go/utils" + "github.com/NethermindEth/near-sffl/aggregator" + "github.com/NethermindEth/near-sffl/core/chainio" + "github.com/NethermindEth/near-sffl/core/config" + "github.com/NethermindEth/near-sffl/operator" + "github.com/NethermindEth/near-sffl/types" + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/crypto" + "github.com/testcontainers/testcontainers-go" + "github.com/testcontainers/testcontainers-go/wait" +) + +type IntegrationClients struct { + Sdkclients clients.Clients +} + +func TestIntegration(t *testing.T) { + log.Println("This test takes ~50 seconds to run...") + + /* Start the anvil chain */ + anvilC := startAnvilTestContainer() + // Not sure why but deferring anvilC.Terminate() causes a panic when the test finishes... + // so letting it terminate silently for now + anvilEndpoint, err := anvilC.Endpoint(context.Background(), "") + if err != nil { + t.Error(err) + } + + /* Prepare the config file for aggregator */ + var aggConfigRaw config.ConfigRaw + aggConfigFilePath := "../../config-files/aggregator.yaml" + sdkutils.ReadYamlConfig(aggConfigFilePath, &aggConfigRaw) + aggConfigRaw.EthRpcUrl = "http://" + anvilEndpoint + aggConfigRaw.EthWsUrl = "ws://" + anvilEndpoint + + var sfflDeploymentRaw config.SFFLDeploymentRaw + sfflDeploymentFilePath := "../../contracts/evm/script/output/31337/sffl_avs_deployment_output.json" + sdkutils.ReadJsonConfig(sfflDeploymentFilePath, &sfflDeploymentRaw) + + logger, err := sdklogging.NewZapLogger(aggConfigRaw.Environment) + if err != nil { + t.Fatalf("Failed to create logger: %s", err.Error()) + } + ethRpcClient, err := eth.NewClient(aggConfigRaw.EthRpcUrl) + if err != nil { + t.Fatalf("Failed to create eth client: %s", err.Error()) + } + ethWsClient, err := eth.NewClient(aggConfigRaw.EthWsUrl) + if err != nil { + t.Fatalf("Failed to create eth client: %s", err.Error()) + } + + aggregatorEcdsaPrivateKeyString := "0x2a871d0798f97d79848a013d4936a73bf4cc922c825d33c1cf7073dff6d409c6" + if aggregatorEcdsaPrivateKeyString[:2] == "0x" { + aggregatorEcdsaPrivateKeyString = aggregatorEcdsaPrivateKeyString[2:] + } + aggregatorEcdsaPrivateKey, err := crypto.HexToECDSA(aggregatorEcdsaPrivateKeyString) + if err != nil { + t.Fatalf("Cannot parse ecdsa private key: %s", err.Error()) + } + aggregatorAddr, err := sdkutils.EcdsaPrivateKeyToAddress(aggregatorEcdsaPrivateKey) + if err != nil { + t.Fatalf("Cannot get operator address: %s", err.Error()) + } + + chainId, err := ethRpcClient.ChainID(context.Background()) + if err != nil { + t.Fatalf("Cannot get chainId: %s", err.Error()) + } + + privateKeySigner, _, err := signerv2.SignerFromConfig(signerv2.Config{PrivateKey: aggregatorEcdsaPrivateKey}, chainId) + if err != nil { + t.Fatalf("Cannot create signer: %s", err.Error()) + } + txMgr := txmgr.NewSimpleTxManager(ethRpcClient, logger, privateKeySigner, aggregatorAddr) + + config := &config.Config{ + EcdsaPrivateKey: aggregatorEcdsaPrivateKey, + Logger: logger, + EthHttpRpcUrl: aggConfigRaw.EthRpcUrl, + EthHttpClient: ethRpcClient, + EthWsRpcUrl: aggConfigRaw.EthWsUrl, + EthWsClient: ethWsClient, + OperatorStateRetrieverAddr: common.HexToAddress(sfflDeploymentRaw.Addresses.OperatorStateRetrieverAddr), + SFFLRegistryCoordinatorAddr: common.HexToAddress(sfflDeploymentRaw.Addresses.RegistryCoordinatorAddr), + AggregatorServerIpPortAddr: aggConfigRaw.AggregatorServerIpPortAddr, + RegisterOperatorOnStartup: aggConfigRaw.RegisterOperatorOnStartup, + TxMgr: txMgr, + AggregatorAddress: aggregatorAddr, + } + + /* Prepare the config file for operator */ + nodeConfig := types.NodeConfig{} + nodeConfigFilePath := "../../config-files/operator.anvil.yaml" + err = sdkutils.ReadYamlConfig(nodeConfigFilePath, &nodeConfig) + if err != nil { + t.Fatalf("Failed to read yaml config: %s", err.Error()) + } + /* Register operator*/ + // log.Println("registering operator for integration tests") + // we need to do this dynamically and can't just hardcode a registered operator into the anvil + // state because the anvil state dump doesn't also dump the receipts tree so we lose events, + // and the aggregator thus can't get the operator's pubkey + // operatorRegistrationCmd := exec.Command("bash", "./operator-registration.sh") + // err = operatorRegistrationCmd.Run() + // if err != nil { + // t.Fatalf("Failed to register operator: %s", err.Error()) + // } + + ctx, cancel := context.WithTimeout(context.Background(), 65*time.Second) + defer cancel() + /* start operator */ + // the passwords are set to empty strings + log.Println("starting operator for integration tests") + os.Setenv("OPERATOR_BLS_KEY_PASSWORD", "") + os.Setenv("OPERATOR_ECDSA_KEY_PASSWORD", "") + nodeConfig.BlsPrivateKeyStorePath = "../keys/test.bls.key.json" + nodeConfig.EcdsaPrivateKeyStorePath = "../keys/test.ecdsa.key.json" + nodeConfig.RegisterOperatorOnStartup = true + nodeConfig.EthRpcUrl = "http://" + anvilEndpoint + nodeConfig.EthWsUrl = "ws://" + anvilEndpoint + operator, err := operator.NewOperatorFromConfig(nodeConfig) + if err != nil { + t.Fatalf("Failed to create operator: %s", err.Error()) + } + go operator.Start(ctx) + log.Println("Started operator. Sleeping 15 seconds to give it time to register...") + time.Sleep(15 * time.Second) + + /* start aggregator */ + log.Println("starting aggregator for integration tests") + agg, err := aggregator.NewAggregator(config) + if err != nil { + t.Fatalf("Failed to create aggregator: %s", err.Error()) + } + go agg.Start(ctx) + log.Println("Started aggregator. Sleeping 20 seconds to give operator time to answer task 1...") + time.Sleep(20 * time.Second) + + // get avsRegistry client to interact with the chain + avsReader, err := chainio.BuildAvsReaderFromConfig(config) + if err != nil { + t.Fatalf("Cannot create AVS Reader: %s", err.Error()) + } + + // check if the task is recorded in the contract for task index 1 + taskHash, err := avsReader.AvsServiceBindings.TaskManager.AllCheckpointTaskHashes(&bind.CallOpts{}, 1) + if err != nil { + t.Fatalf("Cannot get task hash: %s", err.Error()) + } + if taskHash == [32]byte{} { + t.Fatalf("Task hash is empty") + } + + // check if the task response is recorded in the contract for task index 1 + taskResponseHash, err := avsReader.AvsServiceBindings.TaskManager.AllCheckpointTaskResponses(&bind.CallOpts{}, 1) + log.Printf("taskResponseHash: %v", taskResponseHash) + if err != nil { + t.Fatalf("Cannot get task response hash: %s", err.Error()) + } + if taskResponseHash == [32]byte{} { + t.Fatalf("Task response hash is empty") + } + +} + +// TODO(samlaf): have to advance chain to a block where the task is answered +func startAnvilTestContainer() testcontainers.Container { + integrationDir, err := os.Getwd() + if err != nil { + panic(err) + } + + ctx := context.Background() + req := testcontainers.ContainerRequest{ + Image: "ghcr.io/foundry-rs/foundry:latest", + Mounts: testcontainers.ContainerMounts{ + testcontainers.ContainerMount{ + Source: testcontainers.GenericBindMountSource{ + HostPath: filepath.Join(integrationDir, "../anvil/data/avs-and-eigenlayer-deployed-anvil-state.json"), + }, + Target: "/root/.anvil/state.json", + }, + }, + Entrypoint: []string{"anvil"}, + Cmd: []string{"--host", "0.0.0.0", "--load-state", "/root/.anvil/state.json"}, + ExposedPorts: []string{"8545/tcp"}, + WaitingFor: wait.ForLog("Listening on"), + } + anvilC, err := testcontainers.GenericContainer(ctx, testcontainers.GenericContainerRequest{ + ContainerRequest: req, + Started: true, + }) + if err != nil { + panic(err) + } + // this is needed temporarily because anvil restarts at 0 block when we load a state... + // see comment in start-anvil-chain-with-el-and-avs-deployed.sh + advanceChain(anvilC) + return anvilC +} + +func advanceChain(anvilC testcontainers.Container) { + anvilEndpoint, err := anvilC.Endpoint(context.Background(), "") + if err != nil { + panic(err) + } + rpcUrl := "http://" + anvilEndpoint + privateKey := "0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80" + cmd := exec.Command("bash", "-c", + fmt.Sprintf( + `forge script script/utils/Utils.sol --sig "advanceChainByNBlocks(uint256)" 100 --rpc-url %s --private-key %s --broadcast`, + rpcUrl, privateKey), + ) + cmd.Dir = "../../contracts/evm" + + var stdout, stderr bytes.Buffer + cmd.Stdout = &stdout + cmd.Stderr = &stderr + err = cmd.Run() + + if err != nil { + fmt.Println(stderr.String()) + panic(err) + } + fmt.Println(stdout.String()) +} diff --git a/tests/keys/test.bls.key.json b/tests/keys/test.bls.key.json new file mode 100644 index 00000000..72d5c64f --- /dev/null +++ b/tests/keys/test.bls.key.json @@ -0,0 +1 @@ +{"pubKey":"E([643552363890320897587044283125191574906281609959531590546948318138132520777,7028377728703212953187883551402495866059211864756496641401904395458852281995])","crypto":{"cipher":"aes-128-ctr","ciphertext":"8221f69293d98ca9d46c52a2747b61755c6bb71f41e951154af3bcbc0daef2b8","cipherparams":{"iv":"d8a38c68f3400aeb93084672b6e3ae61"},"kdf":"scrypt","kdfparams":{"dklen":32,"n":262144,"p":1,"r":8,"salt":"c41150482e6acfc2f0fcfd68b67f28ef22de8aa3f982048bdaf793c2e3ac3730"},"mac":"879c2831169d9ac70c662ebca90b9f3cd63761d0924bdbbde0a82a306baf44cd"}} \ No newline at end of file diff --git a/tests/keys/test.ecdsa.key.json b/tests/keys/test.ecdsa.key.json new file mode 100644 index 00000000..7f3380de --- /dev/null +++ b/tests/keys/test.ecdsa.key.json @@ -0,0 +1 @@ +{"address":"860b6912c2d0337ef05bbc89b0c2cb6cbaeab4a5","crypto":{"cipher":"aes-128-ctr","ciphertext":"37ab29382354906d7b33b0ad1b00c539dfb69ea85997e470baba7601b0faa373","cipherparams":{"iv":"b7642683ba782688cc4da76dd5c61fce"},"kdf":"scrypt","kdfparams":{"dklen":32,"n":262144,"p":1,"r":8,"salt":"fdc108d3e6388174f4cf6d5abe6de2364c96dcc03c4f1bddb1b47b01dce742e2"},"mac":"d4fff8d963a7815a7203f8c73b3047a2e5efcefb8163e6df316cc55f79df0cc2"},"id":"0c401f60-9d1f-4918-a823-1866984f8fcd","version":3} \ No newline at end of file diff --git a/tests/utils.go b/tests/utils.go new file mode 100644 index 00000000..3447466d --- /dev/null +++ b/tests/utils.go @@ -0,0 +1,42 @@ +package tests + +import ( + "bytes" + "fmt" + "log" + "os/exec" + "time" +) + +// Make sure to stop the anvil subprocess by calling anvilCmd.Process.Kill() +func StartAnvilChainAndDeployContracts() *exec.Cmd { + fmt.Println("Starting anvil...") + anvilCmd := exec.Command("anvil", "--fork-url", "https://goerli.infura.io/v3/9aa3d95b3bc440fa88ea12eaa4456161") + err := anvilCmd.Start() + if err != nil { + log.Fatal(err.Error()) + } + + fmt.Println("Sleeping for 2 seconds to give time for anvil to start before we deploy contracts...") + time.Sleep(2 * time.Second) + + fmt.Println("Deploying contracts...") + cmd := exec.Command("forge", "script", "script/SFFLDeployer.s.sol", + "--rpc-url", "http://localhost:8545", + "--private-key", "0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80", + "--broadcast", + ) + cmd.Dir = "./contracts/evm" + var stdout, stderr bytes.Buffer + cmd.Stdout = &stdout + cmd.Stderr = &stderr + err = cmd.Run() + + if err != nil { + fmt.Println(stderr.String()) + log.Fatal(err.Error()) + } + fmt.Println(stdout.String()) + + return anvilCmd +} diff --git a/types/avs_config.go b/types/avs_config.go new file mode 100644 index 00000000..5157698a --- /dev/null +++ b/types/avs_config.go @@ -0,0 +1,20 @@ +package types + +type NodeConfig struct { + // used to set the logger level (true = info, false = debug) + Production bool `yaml:"production"` + OperatorAddress string `yaml:"operator_address"` + OperatorStateRetrieverAddress string `yaml:"operator_state_retriever_address"` + AVSRegistryCoordinatorAddress string `yaml:"avs_registry_coordinator_address"` + TokenStrategyAddr string `yaml:"token_strategy_addr"` + EthRpcUrl string `yaml:"eth_rpc_url"` + EthWsUrl string `yaml:"eth_ws_url"` + BlsPrivateKeyStorePath string `yaml:"bls_private_key_store_path"` + EcdsaPrivateKeyStorePath string `yaml:"ecdsa_private_key_store_path"` + AggregatorServerIpPortAddress string `yaml:"aggregator_server_ip_port_address"` + RegisterOperatorOnStartup bool `yaml:"register_operator_on_startup"` + EigenMetricsIpPortAddress string `yaml:"eigen_metrics_ip_port_address"` + EnableMetrics bool `yaml:"enable_metrics"` + NodeApiIpPortAddress string `yaml:"node_api_ip_port_address"` + EnableNodeApi bool `yaml:"enable_node_api"` +}