From 01c3bb4caf7323c14850882a974869101840db9a Mon Sep 17 00:00:00 2001 From: ozwaldorf Date: Sat, 7 Feb 2026 18:21:37 -0500 Subject: [PATCH 1/9] refactor: split native and erc20 into unique contracts Reduces contract sizes to: - ERC20: 11Kb - Native: 10Kb --- src/Escrow.sol | 320 ----------------------- src/EscrowBase.sol | 132 ++++++++++ src/EscrowERC20.sol | 116 ++++++++ src/EscrowNative.sol | 110 ++++++++ test/{Escrow.t.sol => EscrowERC20.t.sol} | 26 +- test/EscrowNative.t.sol | 124 ++++----- test/Proof.t.sol | 29 +- test/Tempo.t.sol | 6 +- 8 files changed, 433 insertions(+), 430 deletions(-) delete mode 100644 src/Escrow.sol create mode 100644 src/EscrowBase.sol create mode 100644 src/EscrowERC20.sol create mode 100644 src/EscrowNative.sol rename test/{Escrow.t.sol => EscrowERC20.t.sol} (92%) diff --git a/src/Escrow.sol b/src/Escrow.sol deleted file mode 100644 index 4730824..0000000 --- a/src/Escrow.sol +++ /dev/null @@ -1,320 +0,0 @@ -// SPDX-License-Identifier: UNLICENSED -pragma solidity 0.8.30; - -import "./BlockHeaderParser.sol"; -import "./MPTVerifier.sol"; -import "./ReceiptValidator.sol"; - -interface IERC20 { - function send(address to, uint256 amount) external returns (bool); - function transfer(address to, uint256 amount) external returns (bool); - function transferFrom(address from, address to, uint256 amount) external returns (bool); - function balanceOf(address account) external view returns (uint256); -} - -contract Escrow { - // The following variables are set up in the constructor. - address immutable deployerAddress; - address immutable tokenContract; // The tokens used in the escrow - // address immutable paymentTokenContract; // The tokens used in the payment to the recipient - uint256 public currentRewardAmount; - uint256 public currentPaymentAmount; - uint256 public originalRewardAmount; - - // The following variables are for Merkle proof validation - address public immutable expectedRecipient; // The intended recipient of the transfer - uint256 public immutable expectedAmount; // The expected transfer amount - uint256 public immutable maxBlockLookback; // Maximum blocks to look back for validation - - // The following variables are dynamically adjusted by the contract when a bond or cancellation request is submitted. - address public bondedExecutor; - uint256 public executionDeadline; - uint256 public bondAmount; - uint256 public totalBondsDeposited; - bool public cancellationRequest; - bool public funded; // marks if the contract has funds to pay out the executors or not (if it doesn't have funds, no executor should be accepted) - - // Based on Nomad's proof structure - struct ReceiptProof { - bytes blockHeader; // RLP-encoded block header - bytes receiptRlp; // RLP-encoded target receipt - bytes proofNodes; // RLP-encoded array of MPT proof nodes - bytes receiptPath; // RLP-encoded receipt index - uint256 logIndex; // Index of target log in receipt - } - - // Proof structure for native ETH transfers (requires both tx and receipt) - struct NativeTransferProof { - bytes blockHeader; // RLP-encoded block header - bytes transactionRlp; // RLP-encoded target transaction (for to/value validation) - bytes txProofNodes; // MPT proof nodes for transaction inclusion - bytes receiptRlp; // RLP-encoded receipt (for status validation) - bytes receiptProofNodes; // MPT proof nodes for receipt inclusion - bytes path; // RLP-encoded index (same for both tx and receipt) - } - - constructor( - address _tokenContract, - address _expectedRecipient, - uint256 _expectedAmount, - uint256 _currentRewardAmount, - uint256 _currentPaymentAmount - ) payable { - tokenContract = _tokenContract; - expectedRecipient = _expectedRecipient; - expectedAmount = _expectedAmount; - deployerAddress = msg.sender; - maxBlockLookback = 256; - - if (_currentRewardAmount > 0 && _currentPaymentAmount > 0) { - if (_tokenContract == address(0)) { - // Native ETH escrow - fund directly from msg.value - require(msg.value == _currentRewardAmount + _currentPaymentAmount, "Incorrect ETH amount"); - currentRewardAmount = _currentRewardAmount; - originalRewardAmount = _currentRewardAmount; - currentPaymentAmount = _currentPaymentAmount; - funded = true; - } else { - // ERC20 escrow - fund(_currentRewardAmount, _currentPaymentAmount); - } - } - } - - // takes currentRewardAmount + currentPaymentAmount from the deployer's balance from the tokenContract. - function fund(uint256 _currentRewardAmount, uint256 _currentPaymentAmount) public { - require(msg.sender == deployerAddress, "Only callable by the deployer"); - require(!funded, "Contract already funded"); - require(tokenContract != address(0), "Use fundNative for native ETH"); - require(_currentRewardAmount > 0, "Reward amount must be non-zero"); - require(_currentPaymentAmount > 0, "Payment amount must be non-zero"); - - currentRewardAmount = _currentRewardAmount; - originalRewardAmount = _currentRewardAmount; - currentPaymentAmount = _currentPaymentAmount; - IERC20(tokenContract).transferFrom(msg.sender, address(this), originalRewardAmount + currentPaymentAmount); - funded = true; - } - - function fundNative(uint256 _currentRewardAmount, uint256 _currentPaymentAmount) public payable { - require(msg.sender == deployerAddress, "Only callable by the deployer"); - require(!funded, "Contract already funded"); - require(tokenContract == address(0), "Use fund for ERC20"); - require(_currentRewardAmount > 0, "Reward amount must be non-zero"); - require(_currentPaymentAmount > 0, "Payment amount must be non-zero"); - require(msg.value == _currentRewardAmount + _currentPaymentAmount, "Incorrect ETH amount"); - - currentRewardAmount = _currentRewardAmount; - originalRewardAmount = _currentRewardAmount; - currentPaymentAmount = _currentPaymentAmount; - funded = true; - } - - // takes _bondAmount from the caller's balance of the tokenContract. The bondstatus is now bonded, execution deadline is current block timestamp + 5 minutes. Sets bondedexecutor to the caller. Will only accept a bond if the cancellationrequest is set to false, and no one is bonded. - function bond(uint256 _bondAmount) public { - require(funded, "Contract not funded"); - require(tokenContract != address(0), "Use bondNative for native ETH"); - require(!cancellationRequest, "Cancellation requested"); - - // If deadline passed and someone is bonded, add their bond to reward - if (executionDeadline > 0 && block.timestamp > executionDeadline) { - currentRewardAmount += bondAmount; - totalBondsDeposited += bondAmount; - tryResetBondData(); - } - - // Prevent double bonding - no one can bond while another executor is actively bonded - require(!is_bonded(), "Another executor is already bonded"); - require(_bondAmount >= currentRewardAmount / 2, "Bond must be at least half of reward amount"); - - IERC20(tokenContract).transferFrom(msg.sender, address(this), _bondAmount); - - bondedExecutor = msg.sender; - executionDeadline = block.timestamp + 5 minutes; - bondAmount = _bondAmount; - } - - function bondNative() public payable { - require(funded, "Contract not funded"); - require(tokenContract == address(0), "Use bond for ERC20"); - require(!cancellationRequest, "Cancellation requested"); - - if (executionDeadline > 0 && block.timestamp > executionDeadline) { - currentRewardAmount += bondAmount; - totalBondsDeposited += bondAmount; - tryResetBondData(); - } - - require(!is_bonded(), "Another executor is already bonded"); - require(msg.value >= currentRewardAmount / 2, "Bond must be at least half of reward amount"); - - bondedExecutor = msg.sender; - executionDeadline = block.timestamp + 5 minutes; - bondAmount = msg.value; - } - - // only deployer can call this. will set the cancellation request to true. - // when the cancellation is requested, the bonded executor may still finish their job and collect, but no new executor is accepted after the current bonded one. - function requestCancellation() public { - require(msg.sender == deployerAddress, "Only callable by the deployer"); - cancellationRequest = true; - } - - // sets cancellation request to false, if the caller is deployer. - // starts accepting new executors - function resume() public { - require(msg.sender == deployerAddress, "Only callable by the deployer"); - cancellationRequest = false; - } - - // Validates a given merkle proof against a recent block hash and checks the Transfer event's contents - function collect(ReceiptProof calldata proof, uint256 targetBlockNumber) public { - require(tokenContract != address(0), "Use collectNative for native ETH"); - _validateBlockHeader(proof.blockHeader, targetBlockNumber); - - // Extract receipts root and verify receipt inclusion - bytes32 receiptsRoot = BlockHeaderParser.extractReceiptsRoot(proof.blockHeader); - require( - MPTVerifier.verifyReceiptProof(proof.receiptRlp, proof.proofNodes, proof.receiptPath, receiptsRoot), - "Invalid receipt MPT proof" - ); - - // Validate the Transfer event - require( - ReceiptValidator.validateTransferInReceipt( - proof.receiptRlp, proof.logIndex, tokenContract, expectedRecipient, expectedAmount - ), - "Invalid Transfer event" - ); - - _payout(); - } - - // Validates native ETH transfer by proving both transaction inclusion (for to/value) - // and receipt inclusion (for status == 1, i.e., successful execution) - function collectNative(NativeTransferProof calldata proof, uint256 targetBlockNumber) public { - require(tokenContract == address(0), "Use collect for ERC20"); - _validateBlockHeader(proof.blockHeader, targetBlockNumber); - - // Verify transaction inclusion in transactions trie - bytes32 transactionsRoot = BlockHeaderParser.extractTransactionsRoot(proof.blockHeader); - require( - MPTVerifier.verifyReceiptProof(proof.transactionRlp, proof.txProofNodes, proof.path, transactionsRoot), - "Invalid transaction MPT proof" - ); - - // Verify receipt inclusion in receipts trie - bytes32 receiptsRoot = BlockHeaderParser.extractReceiptsRoot(proof.blockHeader); - require( - MPTVerifier.verifyReceiptProof(proof.receiptRlp, proof.receiptProofNodes, proof.path, receiptsRoot), - "Invalid receipt MPT proof" - ); - - // Validate transaction succeeded (status == 1) - require(ReceiptValidator.validateReceiptStatus(proof.receiptRlp), "Transaction failed (status != 1)"); - - // Validate the native ETH transfer (to and value fields) - require( - ReceiptValidator.validateNativeTransfer(proof.transactionRlp, expectedRecipient, expectedAmount), - "Invalid native transfer" - ); - - _payoutNative(); - } - - function _validateBlockHeader(bytes calldata blockHeader, uint256 targetBlockNumber) internal view { - require(funded, "Contract not funded"); - require(msg.sender == bondedExecutor && is_bonded(), "Only bonded executor can collect"); - require(targetBlockNumber <= block.number, "Target block is in the future"); - require(block.number - targetBlockNumber <= maxBlockLookback, "Target block too old"); - - bytes32 targetBlockHash = blockhash(targetBlockNumber); - require(targetBlockHash != bytes32(0), "Unable to retrieve block hash"); - require(keccak256(blockHeader) == targetBlockHash, "Block header hash mismatch"); - require(BlockHeaderParser.extractBlockNumber(blockHeader) == targetBlockNumber, "Header block number mismatch"); - } - - function _payout() internal { - uint256 payout = bondAmount + currentRewardAmount + currentPaymentAmount; - address executor = bondedExecutor; - - bondedExecutor = address(0); - bondAmount = 0; - executionDeadline = 0; - funded = false; - currentPaymentAmount = 0; - currentRewardAmount = 0; - - if (block.chainid == 11155111) { - // Sepolia testnet uses non-standard send - IERC20(tokenContract).send(executor, payout); - } else { - IERC20(tokenContract).transfer(executor, payout); - } - } - - function _payoutNative() internal { - uint256 payout = bondAmount + currentRewardAmount + currentPaymentAmount; - address executor = bondedExecutor; - - bondedExecutor = address(0); - bondAmount = 0; - executionDeadline = 0; - funded = false; - currentPaymentAmount = 0; - currentRewardAmount = 0; - - (bool success,) = executor.call{value: payout}(""); - require(success, "ETH transfer failed"); - } - - // checks if contract is currently bonded by verifying deadline - function is_bonded() public view returns (bool) { - return executionDeadline > 0 && block.timestamp <= executionDeadline; - } - - // allows deployer to withdraw all assets except the seized bonds (so the deployer can withdraw only and only what was deposited by deployer in the start function) - // only if the contract is not currently bonded (or the execution deadline has passed) - function withdraw() public { - require(funded, "Contract not funded"); - require(tokenContract != address(0), "Use withdrawNative for native ETH"); - require(msg.sender == deployerAddress, "Only callable by the deployer"); - tryResetBondData(); - - uint256 withdrawableAmount = currentPaymentAmount + originalRewardAmount; - - funded = false; - currentPaymentAmount = 0; - currentRewardAmount = 0; - - require(withdrawableAmount > 0, "No withdrawable funds"); - - IERC20(tokenContract).transfer(msg.sender, withdrawableAmount); - } - - function withdrawNative() public { - require(funded, "Contract not funded"); - require(tokenContract == address(0), "Use withdraw for ERC20"); - require(msg.sender == deployerAddress, "Only callable by the deployer"); - tryResetBondData(); - - uint256 withdrawableAmount = currentPaymentAmount + originalRewardAmount; - - funded = false; - currentPaymentAmount = 0; - currentRewardAmount = 0; - - require(withdrawableAmount > 0, "No withdrawable funds"); - - (bool success,) = msg.sender.call{value: withdrawableAmount}(""); - require(success, "ETH transfer failed"); - } - - function tryResetBondData() internal { - require(!is_bonded(), "Cannot reset while bond is active"); - - bondedExecutor = address(0); - bondAmount = 0; - executionDeadline = 0; - } -} diff --git a/src/EscrowBase.sol b/src/EscrowBase.sol new file mode 100644 index 0000000..978307f --- /dev/null +++ b/src/EscrowBase.sol @@ -0,0 +1,132 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity 0.8.30; + +import "./BlockHeaderParser.sol"; +import "./MPTVerifier.sol"; +import "./ReceiptValidator.sol"; + +abstract contract EscrowBase { + // The following variables are set up in the constructor. + address immutable deployerAddress; + uint256 public currentRewardAmount; + uint256 public currentPaymentAmount; + uint256 public originalRewardAmount; + + // The following variables are for Merkle proof validation + address public immutable expectedRecipient; // The intended recipient of the transfer + uint256 public immutable expectedAmount; // The expected transfer amount + uint256 public immutable maxBlockLookback; // Maximum blocks to look back for validation + + // The following variables are dynamically adjusted by the contract when a bond or cancellation request is submitted. + address public bondedExecutor; + uint256 public executionDeadline; + uint256 public bondAmount; + uint256 public totalBondsDeposited; + bool public cancellationRequest; + bool public funded; // marks if the contract has funds to pay out the executors or not (if it doesn't have funds, no executor should be accepted) + + constructor(address _expectedRecipient, uint256 _expectedAmount) { + expectedRecipient = _expectedRecipient; + expectedAmount = _expectedAmount; + deployerAddress = msg.sender; + maxBlockLookback = 256; + } + + // only deployer can call this. will set the cancellation request to true. + // when the cancellation is requested, the bonded executor may still finish their job and collect, but no new executor is accepted after the current bonded one. + function requestCancellation() public { + require(msg.sender == deployerAddress, "Only callable by the deployer"); + cancellationRequest = true; + } + + // sets cancellation request to false, if the caller is deployer. + // starts accepting new executors + function resume() public { + require(msg.sender == deployerAddress, "Only callable by the deployer"); + cancellationRequest = false; + } + + // checks if contract is currently bonded by verifying deadline + function is_bonded() public view returns (bool) { + return executionDeadline > 0 && block.timestamp <= executionDeadline; + } + + // Internal helper to validate block header for proof verification + function _validateBlockHeader(bytes calldata blockHeader, uint256 targetBlockNumber) internal view { + require(funded, "Contract not funded"); + require(msg.sender == bondedExecutor && is_bonded(), "Only bonded executor can collect"); + require(targetBlockNumber <= block.number, "Target block is in the future"); + require(block.number - targetBlockNumber <= maxBlockLookback, "Target block too old"); + + bytes32 targetBlockHash = blockhash(targetBlockNumber); + require(targetBlockHash != bytes32(0), "Unable to retrieve block hash"); + require(keccak256(blockHeader) == targetBlockHash, "Block header hash mismatch"); + require(BlockHeaderParser.extractBlockNumber(blockHeader) == targetBlockNumber, "Header block number mismatch"); + } + + // Internal helper to reset bond data when expired + function _tryResetBondData() internal { + require(!is_bonded(), "Cannot reset while bond is active"); + + bondedExecutor = address(0); + bondAmount = 0; + executionDeadline = 0; + } + + // Internal helper to handle expired bonds (adds bond to reward pool) + function _handleExpiredBond() internal { + if (executionDeadline > 0 && block.timestamp > executionDeadline) { + currentRewardAmount += bondAmount; + totalBondsDeposited += bondAmount; + _tryResetBondData(); + } + } + + // Internal helper to validate bond requirements + function _validateBondRequirements(uint256 _bondAmount) internal view { + require(funded, "Contract not funded"); + require(!cancellationRequest, "Cancellation requested"); + require(!is_bonded(), "Another executor is already bonded"); + require(_bondAmount >= currentRewardAmount / 2, "Bond must be at least half of reward amount"); + } + + // Internal helper to set bond data + function _setBondData(uint256 _bondAmount) internal { + bondedExecutor = msg.sender; + executionDeadline = block.timestamp + 5 minutes; + bondAmount = _bondAmount; + } + + // Internal helper to clear payout state + function _clearPayoutState() internal { + bondedExecutor = address(0); + bondAmount = 0; + executionDeadline = 0; + funded = false; + currentPaymentAmount = 0; + currentRewardAmount = 0; + } + + // Internal helper to calculate payout amount + function _calculatePayout() internal view returns (uint256) { + return bondAmount + currentRewardAmount + currentPaymentAmount; + } + + // Internal helper to validate withdraw requirements + function _validateWithdraw() internal view { + require(funded, "Contract not funded"); + require(msg.sender == deployerAddress, "Only callable by the deployer"); + } + + // Internal helper to calculate withdrawable amount and clear state + function _calculateWithdrawableAmount() internal view returns (uint256) { + return currentPaymentAmount + originalRewardAmount; + } + + // Internal helper to clear state after withdraw + function _clearWithdrawState() internal { + funded = false; + currentPaymentAmount = 0; + currentRewardAmount = 0; + } +} diff --git a/src/EscrowERC20.sol b/src/EscrowERC20.sol new file mode 100644 index 0000000..515bc76 --- /dev/null +++ b/src/EscrowERC20.sol @@ -0,0 +1,116 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity 0.8.30; + +import "./EscrowBase.sol"; + +interface IERC20 { + function send(address to, uint256 amount) external returns (bool); + function transfer(address to, uint256 amount) external returns (bool); + function transferFrom(address from, address to, uint256 amount) external returns (bool); + function balanceOf(address account) external view returns (uint256); +} + +contract EscrowERC20 is EscrowBase { + address public immutable tokenContract; // The tokens used in the escrow + + // Based on Nomad's proof structure + struct ReceiptProof { + bytes blockHeader; // RLP-encoded block header + bytes receiptRlp; // RLP-encoded target receipt + bytes proofNodes; // RLP-encoded array of MPT proof nodes + bytes receiptPath; // RLP-encoded receipt index + uint256 logIndex; // Index of target log in receipt + } + + constructor( + address _tokenContract, + address _expectedRecipient, + uint256 _expectedAmount, + uint256 _currentRewardAmount, + uint256 _currentPaymentAmount + ) EscrowBase(_expectedRecipient, _expectedAmount) { + require(_tokenContract != address(0), "Token contract cannot be zero address"); + tokenContract = _tokenContract; + + if (_currentRewardAmount > 0 && _currentPaymentAmount > 0) { + fund(_currentRewardAmount, _currentPaymentAmount); + } + } + + // takes currentRewardAmount + currentPaymentAmount from the deployer's balance from the tokenContract. + function fund(uint256 _currentRewardAmount, uint256 _currentPaymentAmount) public { + require(msg.sender == deployerAddress, "Only callable by the deployer"); + require(!funded, "Contract already funded"); + require(_currentRewardAmount > 0, "Reward amount must be non-zero"); + require(_currentPaymentAmount > 0, "Payment amount must be non-zero"); + + currentRewardAmount = _currentRewardAmount; + originalRewardAmount = _currentRewardAmount; + currentPaymentAmount = _currentPaymentAmount; + IERC20(tokenContract).transferFrom(msg.sender, address(this), originalRewardAmount + currentPaymentAmount); + funded = true; + } + + // takes _bondAmount from the caller's balance of the tokenContract. The bondstatus is now bonded, execution deadline is current block timestamp + 5 minutes. Sets bondedexecutor to the caller. Will only accept a bond if the cancellationrequest is set to false, and no one is bonded. + function bond(uint256 _bondAmount) public { + // If deadline passed and someone is bonded, add their bond to reward + _handleExpiredBond(); + + _validateBondRequirements(_bondAmount); + + IERC20(tokenContract).transferFrom(msg.sender, address(this), _bondAmount); + + _setBondData(_bondAmount); + } + + // Validates a given merkle proof against a recent block hash and checks the Transfer event's contents + function collect(ReceiptProof calldata proof, uint256 targetBlockNumber) public { + _validateBlockHeader(proof.blockHeader, targetBlockNumber); + + // Extract receipts root and verify receipt inclusion + bytes32 receiptsRoot = BlockHeaderParser.extractReceiptsRoot(proof.blockHeader); + require( + MPTVerifier.verifyReceiptProof(proof.receiptRlp, proof.proofNodes, proof.receiptPath, receiptsRoot), + "Invalid receipt MPT proof" + ); + + // Validate the Transfer event + require( + ReceiptValidator.validateTransferInReceipt( + proof.receiptRlp, proof.logIndex, tokenContract, expectedRecipient, expectedAmount + ), + "Invalid Transfer event" + ); + + _payout(); + } + + function _payout() internal { + uint256 payout = _calculatePayout(); + address executor = bondedExecutor; + + _clearPayoutState(); + + if (block.chainid == 11155111) { + // Sepolia testnet uses non-standard send + IERC20(tokenContract).send(executor, payout); + } else { + IERC20(tokenContract).transfer(executor, payout); + } + } + + // allows deployer to withdraw all assets except the seized bonds (so the deployer can withdraw only and only what was deposited by deployer in the start function) + // only if the contract is not currently bonded (or the execution deadline has passed) + function withdraw() public { + _validateWithdraw(); + _tryResetBondData(); + + uint256 withdrawableAmount = _calculateWithdrawableAmount(); + + _clearWithdrawState(); + + require(withdrawableAmount > 0, "No withdrawable funds"); + + IERC20(tokenContract).transfer(msg.sender, withdrawableAmount); + } +} diff --git a/src/EscrowNative.sol b/src/EscrowNative.sol new file mode 100644 index 0000000..81f2a23 --- /dev/null +++ b/src/EscrowNative.sol @@ -0,0 +1,110 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity 0.8.30; + +import "./EscrowBase.sol"; + +contract EscrowNative is EscrowBase { + // Proof structure for native ETH transfers (requires both tx and receipt) + struct NativeTransferProof { + bytes blockHeader; // RLP-encoded block header + bytes transactionRlp; // RLP-encoded target transaction (for to/value validation) + bytes txProofNodes; // MPT proof nodes for transaction inclusion + bytes receiptRlp; // RLP-encoded receipt (for status validation) + bytes receiptProofNodes; // MPT proof nodes for receipt inclusion + bytes path; // RLP-encoded index (same for both tx and receipt) + } + + constructor( + address _expectedRecipient, + uint256 _expectedAmount, + uint256 _currentRewardAmount, + uint256 _currentPaymentAmount + ) payable EscrowBase(_expectedRecipient, _expectedAmount) { + if (_currentRewardAmount > 0 && _currentPaymentAmount > 0) { + require(msg.value == _currentRewardAmount + _currentPaymentAmount, "Incorrect ETH amount"); + currentRewardAmount = _currentRewardAmount; + originalRewardAmount = _currentRewardAmount; + currentPaymentAmount = _currentPaymentAmount; + funded = true; + } + } + + function fund(uint256 _currentRewardAmount, uint256 _currentPaymentAmount) public payable { + require(msg.sender == deployerAddress, "Only callable by the deployer"); + require(!funded, "Contract already funded"); + require(_currentRewardAmount > 0, "Reward amount must be non-zero"); + require(_currentPaymentAmount > 0, "Payment amount must be non-zero"); + require(msg.value == _currentRewardAmount + _currentPaymentAmount, "Incorrect ETH amount"); + + currentRewardAmount = _currentRewardAmount; + originalRewardAmount = _currentRewardAmount; + currentPaymentAmount = _currentPaymentAmount; + funded = true; + } + + function bond() public payable { + // If deadline passed and someone is bonded, add their bond to reward + _handleExpiredBond(); + + _validateBondRequirements(msg.value); + + _setBondData(msg.value); + } + + // Validates native ETH transfer by proving both transaction inclusion (for to/value) + // and receipt inclusion (for status == 1, i.e., successful execution) + function collect(NativeTransferProof calldata proof, uint256 targetBlockNumber) public { + _validateBlockHeader(proof.blockHeader, targetBlockNumber); + + // Verify transaction inclusion in transactions trie + bytes32 transactionsRoot = BlockHeaderParser.extractTransactionsRoot(proof.blockHeader); + require( + MPTVerifier.verifyReceiptProof(proof.transactionRlp, proof.txProofNodes, proof.path, transactionsRoot), + "Invalid transaction MPT proof" + ); + + // Verify receipt inclusion in receipts trie + bytes32 receiptsRoot = BlockHeaderParser.extractReceiptsRoot(proof.blockHeader); + require( + MPTVerifier.verifyReceiptProof(proof.receiptRlp, proof.receiptProofNodes, proof.path, receiptsRoot), + "Invalid receipt MPT proof" + ); + + // Validate transaction succeeded (status == 1) + require(ReceiptValidator.validateReceiptStatus(proof.receiptRlp), "Transaction failed (status != 1)"); + + // Validate the native ETH transfer (to and value fields) + require( + ReceiptValidator.validateNativeTransfer(proof.transactionRlp, expectedRecipient, expectedAmount), + "Invalid native transfer" + ); + + _payout(); + } + + function _payout() internal { + uint256 payout = _calculatePayout(); + address executor = bondedExecutor; + + _clearPayoutState(); + + (bool success,) = executor.call{value: payout}(""); + require(success, "ETH transfer failed"); + } + + // allows deployer to withdraw all assets except the seized bonds (so the deployer can withdraw only and only what was deposited by deployer in the start function) + // only if the contract is not currently bonded (or the execution deadline has passed) + function withdraw() public { + _validateWithdraw(); + _tryResetBondData(); + + uint256 withdrawableAmount = _calculateWithdrawableAmount(); + + _clearWithdrawState(); + + require(withdrawableAmount > 0, "No withdrawable funds"); + + (bool success,) = msg.sender.call{value: withdrawableAmount}(""); + require(success, "ETH transfer failed"); + } +} diff --git a/test/Escrow.t.sol b/test/EscrowERC20.t.sol similarity index 92% rename from test/Escrow.t.sol rename to test/EscrowERC20.t.sol index 5694898..9d8e20e 100644 --- a/test/Escrow.t.sol +++ b/test/EscrowERC20.t.sol @@ -2,7 +2,7 @@ pragma solidity ^0.8.30; import {Test, console} from "forge-std/Test.sol"; -import {Escrow} from "../src/Escrow.sol"; +import {EscrowERC20} from "../src/EscrowERC20.sol"; contract MockERC20 { mapping(address => uint256) public balanceOf; @@ -38,8 +38,8 @@ contract MockERC20 { } } -contract EscrowTest is Test { - Escrow public escrow; +contract EscrowERC20Test is Test { + EscrowERC20 public escrow; MockERC20 public token; address public deployer; address public executor; @@ -64,7 +64,7 @@ contract EscrowTest is Test { address futureEscrow = vm.computeCreateAddress(deployer, vm.getNonce(deployer)); token.approve(futureEscrow, REWARD_AMOUNT + PAYMENT_AMOUNT); - escrow = new Escrow(address(token), recipient, EXPECTED_AMOUNT, REWARD_AMOUNT, PAYMENT_AMOUNT); + escrow = new EscrowERC20(address(token), recipient, EXPECTED_AMOUNT, REWARD_AMOUNT, PAYMENT_AMOUNT); vm.stopPrank(); token.mint(executor, 10000e18); @@ -85,7 +85,7 @@ contract EscrowTest is Test { address futureEscrow2 = vm.computeCreateAddress(deployer, vm.getNonce(deployer)); token.approve(futureEscrow2, REWARD_AMOUNT + PAYMENT_AMOUNT); - Escrow escrow2 = new Escrow(address(token), recipient, EXPECTED_AMOUNT, 0, 0); + EscrowERC20 escrow2 = new EscrowERC20(address(token), recipient, EXPECTED_AMOUNT, 0, 0); token.approve(address(escrow2), REWARD_AMOUNT + PAYMENT_AMOUNT); escrow2.fund(REWARD_AMOUNT, PAYMENT_AMOUNT); @@ -100,7 +100,7 @@ contract EscrowTest is Test { function testFundZeroReward() public { vm.startPrank(deployer); - Escrow unfundedEscrow = new Escrow(address(token), recipient, EXPECTED_AMOUNT, 0, 0); + EscrowERC20 unfundedEscrow = new EscrowERC20(address(token), recipient, EXPECTED_AMOUNT, 0, 0); token.approve(address(unfundedEscrow), PAYMENT_AMOUNT); vm.expectRevert("Reward amount must be non-zero"); @@ -140,7 +140,7 @@ contract EscrowTest is Test { function testBondNotFunded() public { // Create an unfunded escrow vm.startPrank(deployer); - Escrow unfundedEscrow = new Escrow(address(token), recipient, EXPECTED_AMOUNT, 0, 0); + EscrowERC20 unfundedEscrow = new EscrowERC20(address(token), recipient, EXPECTED_AMOUNT, 0, 0); vm.stopPrank(); vm.startPrank(executor); @@ -247,7 +247,7 @@ contract EscrowTest is Test { function testCollectRequiresProof() public { _bondExecutor(); - Escrow.ReceiptProof memory dummyProof = Escrow.ReceiptProof({ + EscrowERC20.ReceiptProof memory dummyProof = EscrowERC20.ReceiptProof({ blockHeader: hex"", receiptRlp: hex"", proofNodes: hex"", receiptPath: hex"", logIndex: 0 }); @@ -258,9 +258,9 @@ contract EscrowTest is Test { function testCollectNotFunded() public { vm.prank(deployer); - Escrow unfundedEscrow = new Escrow(address(token), recipient, EXPECTED_AMOUNT, 0, 0); + EscrowERC20 unfundedEscrow = new EscrowERC20(address(token), recipient, EXPECTED_AMOUNT, 0, 0); - Escrow.ReceiptProof memory dummyProof = Escrow.ReceiptProof({ + EscrowERC20.ReceiptProof memory dummyProof = EscrowERC20.ReceiptProof({ blockHeader: hex"", receiptRlp: hex"", proofNodes: hex"", receiptPath: hex"", logIndex: 0 }); @@ -272,7 +272,7 @@ contract EscrowTest is Test { function testCollectNotBondedExecutor() public { _bondExecutor(); - Escrow.ReceiptProof memory dummyProof = Escrow.ReceiptProof({ + EscrowERC20.ReceiptProof memory dummyProof = EscrowERC20.ReceiptProof({ blockHeader: hex"", receiptRlp: hex"", proofNodes: hex"", receiptPath: hex"", logIndex: 0 }); @@ -286,7 +286,7 @@ contract EscrowTest is Test { vm.warp(block.timestamp + 6 minutes); - Escrow.ReceiptProof memory dummyProof = Escrow.ReceiptProof({ + EscrowERC20.ReceiptProof memory dummyProof = EscrowERC20.ReceiptProof({ blockHeader: hex"", receiptRlp: hex"", proofNodes: hex"", receiptPath: hex"", logIndex: 0 }); @@ -309,7 +309,7 @@ contract EscrowTest is Test { function testWithdrawNotFunded() public { vm.prank(deployer); - Escrow unfundedEscrow = new Escrow(address(token), recipient, EXPECTED_AMOUNT, 0, 0); + EscrowERC20 unfundedEscrow = new EscrowERC20(address(token), recipient, EXPECTED_AMOUNT, 0, 0); vm.prank(deployer); vm.expectRevert("Contract not funded"); diff --git a/test/EscrowNative.t.sol b/test/EscrowNative.t.sol index 5968390..5f8a72d 100644 --- a/test/EscrowNative.t.sol +++ b/test/EscrowNative.t.sol @@ -2,10 +2,10 @@ pragma solidity ^0.8.30; import {Test} from "forge-std/Test.sol"; -import {Escrow} from "../src/Escrow.sol"; +import {EscrowNative} from "../src/EscrowNative.sol"; contract EscrowNativeTest is Test { - Escrow public escrow; + EscrowNative public escrow; address public deployer; address public executor; address public recipient; @@ -29,8 +29,7 @@ contract EscrowNativeTest is Test { // Deploy escrow with native ETH funding in constructor vm.prank(deployer); - escrow = new Escrow{value: REWARD_AMOUNT + PAYMENT_AMOUNT}( - address(0), // Native ETH + escrow = new EscrowNative{value: REWARD_AMOUNT + PAYMENT_AMOUNT}( recipient, EXPECTED_AMOUNT, REWARD_AMOUNT, @@ -51,25 +50,25 @@ contract EscrowNativeTest is Test { function testConstructorNativeIncorrectAmount() public { vm.prank(deployer); vm.expectRevert("Incorrect ETH amount"); - new Escrow{value: 0.5 ether}( // Wrong amount - should be 1 ether - address(0), recipient, EXPECTED_AMOUNT, REWARD_AMOUNT, PAYMENT_AMOUNT + new EscrowNative{value: 0.5 ether}( // Wrong amount - should be 1 ether + recipient, EXPECTED_AMOUNT, REWARD_AMOUNT, PAYMENT_AMOUNT ); } function testConstructorNativeZeroValueWithAmounts() public { vm.prank(deployer); vm.expectRevert("Incorrect ETH amount"); - new Escrow{value: 0}(address(0), recipient, EXPECTED_AMOUNT, REWARD_AMOUNT, PAYMENT_AMOUNT); + new EscrowNative{value: 0}(recipient, EXPECTED_AMOUNT, REWARD_AMOUNT, PAYMENT_AMOUNT); } function testFundNative() public { vm.startPrank(deployer); // Create unfunded escrow - Escrow escrow2 = new Escrow(address(0), recipient, EXPECTED_AMOUNT, 0, 0); + EscrowNative escrow2 = new EscrowNative(recipient, EXPECTED_AMOUNT, 0, 0); // Fund it separately - escrow2.fundNative{value: REWARD_AMOUNT + PAYMENT_AMOUNT}(REWARD_AMOUNT, PAYMENT_AMOUNT); + escrow2.fund{value: REWARD_AMOUNT + PAYMENT_AMOUNT}(REWARD_AMOUNT, PAYMENT_AMOUNT); vm.stopPrank(); assertEq(escrow2.currentRewardAmount(), REWARD_AMOUNT); @@ -81,49 +80,40 @@ contract EscrowNativeTest is Test { function testFundNativeZeroReward() public { vm.startPrank(deployer); - Escrow unfundedEscrow = new Escrow(address(0), recipient, EXPECTED_AMOUNT, 0, 0); + EscrowNative unfundedEscrow = new EscrowNative(recipient, EXPECTED_AMOUNT, 0, 0); vm.expectRevert("Reward amount must be non-zero"); - unfundedEscrow.fundNative{value: PAYMENT_AMOUNT}(0, PAYMENT_AMOUNT); + unfundedEscrow.fund{value: PAYMENT_AMOUNT}(0, PAYMENT_AMOUNT); vm.stopPrank(); } function testFundNativeOnlyDeployer() public { vm.prank(deployer); - Escrow unfundedEscrow = new Escrow(address(0), recipient, EXPECTED_AMOUNT, 0, 0); + EscrowNative unfundedEscrow = new EscrowNative(recipient, EXPECTED_AMOUNT, 0, 0); vm.prank(executor); vm.expectRevert("Only callable by the deployer"); - unfundedEscrow.fundNative{value: REWARD_AMOUNT + PAYMENT_AMOUNT}(REWARD_AMOUNT, PAYMENT_AMOUNT); + unfundedEscrow.fund{value: REWARD_AMOUNT + PAYMENT_AMOUNT}(REWARD_AMOUNT, PAYMENT_AMOUNT); } function testFundNativeAlreadyFunded() public { vm.prank(deployer); vm.expectRevert("Contract already funded"); - escrow.fundNative{value: REWARD_AMOUNT + PAYMENT_AMOUNT}(REWARD_AMOUNT, PAYMENT_AMOUNT); + escrow.fund{value: REWARD_AMOUNT + PAYMENT_AMOUNT}(REWARD_AMOUNT, PAYMENT_AMOUNT); } function testFundNativeIncorrectAmount() public { vm.startPrank(deployer); - Escrow unfundedEscrow = new Escrow(address(0), recipient, EXPECTED_AMOUNT, 0, 0); + EscrowNative unfundedEscrow = new EscrowNative(recipient, EXPECTED_AMOUNT, 0, 0); vm.expectRevert("Incorrect ETH amount"); - unfundedEscrow.fundNative{value: 0.5 ether}(REWARD_AMOUNT, PAYMENT_AMOUNT); - vm.stopPrank(); - } - - function testFundNativeWrongFunction() public { - vm.startPrank(deployer); - Escrow unfundedEscrow = new Escrow(address(0), recipient, EXPECTED_AMOUNT, 0, 0); - - vm.expectRevert("Use fundNative for native ETH"); - unfundedEscrow.fund(REWARD_AMOUNT, PAYMENT_AMOUNT); + unfundedEscrow.fund{value: 0.5 ether}(REWARD_AMOUNT, PAYMENT_AMOUNT); vm.stopPrank(); } function testBondNative() public { vm.prank(executor); - escrow.bondNative{value: BOND_AMOUNT}(); + escrow.bond{value: BOND_AMOUNT}(); assertEq(escrow.bondedExecutor(), executor); assertEq(escrow.bondAmount(), BOND_AMOUNT); @@ -134,11 +124,11 @@ contract EscrowNativeTest is Test { function testBondNativeNotFunded() public { vm.prank(deployer); - Escrow unfundedEscrow = new Escrow(address(0), recipient, EXPECTED_AMOUNT, 0, 0); + EscrowNative unfundedEscrow = new EscrowNative(recipient, EXPECTED_AMOUNT, 0, 0); vm.prank(executor); vm.expectRevert("Contract not funded"); - unfundedEscrow.bondNative{value: BOND_AMOUNT}(); + unfundedEscrow.bond{value: BOND_AMOUNT}(); } function testBondNativeCancellationRequested() public { @@ -147,13 +137,13 @@ contract EscrowNativeTest is Test { vm.prank(executor); vm.expectRevert("Cancellation requested"); - escrow.bondNative{value: BOND_AMOUNT}(); + escrow.bond{value: BOND_AMOUNT}(); } function testBondNativeInsufficientAmount() public { vm.prank(executor); vm.expectRevert("Bond must be at least half of reward amount"); - escrow.bondNative{value: BOND_AMOUNT / 4}(); + escrow.bond{value: BOND_AMOUNT / 4}(); } function testBondNativeAfterDeadlinePassed() public { @@ -166,7 +156,7 @@ contract EscrowNativeTest is Test { uint256 newBondAmount = updatedReward / 2; vm.prank(other); - escrow.bondNative{value: newBondAmount}(); + escrow.bond{value: newBondAmount}(); assertEq(escrow.bondedExecutor(), other); assertEq(escrow.currentRewardAmount(), updatedReward); @@ -185,9 +175,9 @@ contract EscrowNativeTest is Test { vm.startPrank(other); vm.expectRevert("Bond must be at least half of reward amount"); - escrow.bondNative{value: BOND_AMOUNT}(); + escrow.bond{value: BOND_AMOUNT}(); - escrow.bondNative{value: minimumRequiredBond}(); + escrow.bond{value: minimumRequiredBond}(); vm.stopPrank(); assertEq(escrow.currentRewardAmount(), updatedReward); @@ -196,16 +186,10 @@ contract EscrowNativeTest is Test { assertEq(escrow.totalBondsDeposited(), BOND_AMOUNT); } - function testBondNativeWrongFunction() public { - vm.prank(executor); - vm.expectRevert("Use bondNative for native ETH"); - escrow.bond(BOND_AMOUNT); - } - function testCollectNativeRequiresProof() public { _bondExecutor(); - Escrow.NativeTransferProof memory dummyProof = Escrow.NativeTransferProof({ + EscrowNative.NativeTransferProof memory dummyProof = EscrowNative.NativeTransferProof({ blockHeader: hex"", transactionRlp: hex"", txProofNodes: hex"", @@ -216,14 +200,14 @@ contract EscrowNativeTest is Test { vm.prank(executor); vm.expectRevert(); - escrow.collectNative(dummyProof, block.number - 1); + escrow.collect(dummyProof, block.number - 1); } function testCollectNativeNotFunded() public { vm.prank(deployer); - Escrow unfundedEscrow = new Escrow(address(0), recipient, EXPECTED_AMOUNT, 0, 0); + EscrowNative unfundedEscrow = new EscrowNative(recipient, EXPECTED_AMOUNT, 0, 0); - Escrow.NativeTransferProof memory dummyProof = Escrow.NativeTransferProof({ + EscrowNative.NativeTransferProof memory dummyProof = EscrowNative.NativeTransferProof({ blockHeader: hex"", transactionRlp: hex"", txProofNodes: hex"", @@ -234,13 +218,13 @@ contract EscrowNativeTest is Test { vm.prank(executor); vm.expectRevert("Contract not funded"); - unfundedEscrow.collectNative(dummyProof, block.number - 1); + unfundedEscrow.collect(dummyProof, block.number - 1); } function testCollectNativeNotBondedExecutor() public { _bondExecutor(); - Escrow.NativeTransferProof memory dummyProof = Escrow.NativeTransferProof({ + EscrowNative.NativeTransferProof memory dummyProof = EscrowNative.NativeTransferProof({ blockHeader: hex"", transactionRlp: hex"", txProofNodes: hex"", @@ -251,7 +235,7 @@ contract EscrowNativeTest is Test { vm.prank(other); vm.expectRevert("Only bonded executor can collect"); - escrow.collectNative(dummyProof, block.number - 1); + escrow.collect(dummyProof, block.number - 1); } function testCollectNativeAfterDeadline() public { @@ -259,7 +243,7 @@ contract EscrowNativeTest is Test { vm.warp(block.timestamp + 6 minutes); - Escrow.NativeTransferProof memory dummyProof = Escrow.NativeTransferProof({ + EscrowNative.NativeTransferProof memory dummyProof = EscrowNative.NativeTransferProof({ blockHeader: hex"", transactionRlp: hex"", txProofNodes: hex"", @@ -270,18 +254,6 @@ contract EscrowNativeTest is Test { vm.prank(executor); vm.expectRevert("Only bonded executor can collect"); - escrow.collectNative(dummyProof, block.number - 1); - } - - function testCollectNativeWrongFunction() public { - _bondExecutor(); - - Escrow.ReceiptProof memory dummyProof = Escrow.ReceiptProof({ - blockHeader: hex"", receiptRlp: hex"", proofNodes: hex"", receiptPath: hex"", logIndex: 0 - }); - - vm.prank(executor); - vm.expectRevert("Use collectNative for native ETH"); escrow.collect(dummyProof, block.number - 1); } @@ -289,7 +261,7 @@ contract EscrowNativeTest is Test { uint256 initialBalance = deployer.balance; vm.prank(deployer); - escrow.withdrawNative(); + escrow.withdraw(); assertEq(deployer.balance, initialBalance + REWARD_AMOUNT + PAYMENT_AMOUNT); assertFalse(escrow.funded()); @@ -299,17 +271,17 @@ contract EscrowNativeTest is Test { function testWithdrawNativeNotFunded() public { vm.prank(deployer); - Escrow unfundedEscrow = new Escrow(address(0), recipient, EXPECTED_AMOUNT, 0, 0); + EscrowNative unfundedEscrow = new EscrowNative(recipient, EXPECTED_AMOUNT, 0, 0); vm.prank(deployer); vm.expectRevert("Contract not funded"); - unfundedEscrow.withdrawNative(); + unfundedEscrow.withdraw(); } function testWithdrawNativeOnlyDeployer() public { vm.prank(executor); vm.expectRevert("Only callable by the deployer"); - escrow.withdrawNative(); + escrow.withdraw(); } function testWithdrawNativeWhileBonded() public { @@ -317,7 +289,7 @@ contract EscrowNativeTest is Test { vm.prank(deployer); vm.expectRevert("Cannot reset while bond is active"); - escrow.withdrawNative(); + escrow.withdraw(); } function testWithdrawNativeAfterBondExpired() public { @@ -326,17 +298,11 @@ contract EscrowNativeTest is Test { vm.warp(block.timestamp + 6 minutes); vm.prank(deployer); - escrow.withdrawNative(); + escrow.withdraw(); assertFalse(escrow.funded()); } - function testWithdrawNativeWrongFunction() public { - vm.prank(deployer); - vm.expectRevert("Use withdrawNative for native ETH"); - escrow.withdraw(); - } - function testIsBondedNative() public { assertFalse(escrow.is_bonded()); @@ -352,7 +318,7 @@ contract EscrowNativeTest is Test { vm.prank(other); vm.expectRevert("Another executor is already bonded"); - escrow.bondNative{value: BOND_AMOUNT}(); + escrow.bond{value: BOND_AMOUNT}(); } function testBondNativeAfterFirstExecutorStillActive() public { @@ -363,14 +329,14 @@ contract EscrowNativeTest is Test { vm.prank(other); vm.expectRevert("Another executor is already bonded"); - escrow.bondNative{value: BOND_AMOUNT}(); + escrow.bond{value: BOND_AMOUNT}(); assertEq(escrow.bondedExecutor(), executor); } function testMultipleBondCyclesNative() public { vm.prank(executor); - escrow.bondNative{value: BOND_AMOUNT}(); + escrow.bond{value: BOND_AMOUNT}(); vm.warp(block.timestamp + 6 minutes); @@ -379,7 +345,7 @@ contract EscrowNativeTest is Test { uint256 newBondAmount = updatedReward / 2; vm.prank(other); - escrow.bondNative{value: newBondAmount}(); + escrow.bond{value: newBondAmount}(); assertEq(escrow.bondedExecutor(), other); assertEq(escrow.currentRewardAmount(), updatedReward); @@ -391,7 +357,7 @@ contract EscrowNativeTest is Test { // First executor bonds at time 0 vm.prank(executor); - escrow.bondNative{value: BOND_AMOUNT}(); + escrow.bond{value: BOND_AMOUNT}(); // Warp to startTime + 6 minutes (first deadline expires) vm.warp(startTime + 6 minutes); @@ -403,7 +369,7 @@ contract EscrowNativeTest is Test { // Second executor bonds at startTime + 6 minutes vm.prank(other); - escrow.bondNative{value: newBondAmount}(); + escrow.bond{value: newBondAmount}(); // Verify first bond was collected assertEq(escrow.currentRewardAmount(), updatedReward); @@ -417,7 +383,7 @@ contract EscrowNativeTest is Test { uint256 initialBalance = deployer.balance; vm.prank(deployer); - escrow.withdrawNative(); + escrow.withdraw(); assertEq(deployer.balance, initialBalance + REWARD_AMOUNT + PAYMENT_AMOUNT); // Escrow holds both failed bonds: first bond (0.25) + second bond (0.375) @@ -443,7 +409,7 @@ contract EscrowNativeTest is Test { function _bondExecutor() internal { vm.prank(executor); - escrow.bondNative{value: BOND_AMOUNT}(); + escrow.bond{value: BOND_AMOUNT}(); } } diff --git a/test/Proof.t.sol b/test/Proof.t.sol index 442b863..f46e25f 100644 --- a/test/Proof.t.sol +++ b/test/Proof.t.sol @@ -2,8 +2,8 @@ pragma solidity ^0.8.30; import {Test, console} from "forge-std/Test.sol"; -import {Escrow} from "../src/Escrow.sol"; -import {IERC20} from "../src/Escrow.sol"; +import {EscrowERC20, IERC20} from "../src/EscrowERC20.sol"; +import {EscrowNative} from "../src/EscrowNative.sol"; contract MockERC20 { mapping(address => uint256) public balanceOf; @@ -40,7 +40,7 @@ contract MockERC20 { } contract EscrowMPTTest is Test { - Escrow public escrow; + EscrowERC20 public escrow; MockERC20 public token; address public deployer; @@ -68,8 +68,8 @@ contract EscrowMPTTest is Test { // Mock the token transfers for constructor funding vm.mockCall(proofTokenAddress, abi.encodeWithSelector(IERC20.transferFrom.selector), abi.encode(true)); - Escrow proofEscrow = - new Escrow(proofTokenAddress, proofRecipient, TRANSFER_AMOUNT, REWARD_AMOUNT, PAYMENT_AMOUNT); + EscrowERC20 proofEscrow = + new EscrowERC20(proofTokenAddress, proofRecipient, TRANSFER_AMOUNT, REWARD_AMOUNT, PAYMENT_AMOUNT); vm.stopPrank(); console.log("Proof escrow address:", address(proofEscrow)); @@ -87,7 +87,7 @@ contract EscrowMPTTest is Test { vm.roll(TARGET_BLOCK_NUMBER + 10); vm.setBlockhash(TARGET_BLOCK_NUMBER, TARGET_BLOCK_HASH); - Escrow.ReceiptProof memory proof = Escrow.ReceiptProof({ + EscrowERC20.ReceiptProof memory proof = EscrowERC20.ReceiptProof({ blockHeader: hex"f90284a038d8a229ef5ed7e4c0ae36034362b7ed00d49d57f1b31e60190befaeca73ff37a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347945cc0dde14e7256340cc820415a6022a7d1c93a35a02624c60133f2c08e34990e93b66aaa3a72b135f77cf00c043a35caebf39ae54ba00ca3a794d63539a566e6a5d8cfbbf9c0e603022ae866248e7006710fde83eb12a025996241a33fe6ed92599ff80b2021d5f60993913b9e0552762d03104aa40996b901000224180066041c1200807d10a642c8950918d3200d0230551880a124009a5d50419a900270c0032603ab204001208000d54911110080ac20840900227e2841101224280202206149000c105cc0081020910100c58244804009828403e0828040020e400922215048954cc0d184112c8298ca001044584c1b20544050101c004008c028ca30523c142041038022228c0c514405110000c00b0052904914b46cc04209ba00088100812b005a054068204802b2008882009888a06022b0e02024254a110846880000008447002000d692c832540005a8a4001011800996203969225018901428000820dc121002c0a10042a05910a50208414404c852460012000380838a9e34840393870084011657b98468b0bba099d883010f0b846765746888676f312e32342e32856c696e7578a07e4379dbae3938a4b37b5b2cee386d2d9211adb64f4e3e2639ce9a4a721ea446880000000000000000826d7ba07f589ddc82719228971df748642152411fdd81592b880c2d913aeab7c415c204830a00008405580000a08744f3f453b537272189a1a10202fbfa9fb991fa1f431a5dd96cb6255ea39c58a0e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", receiptRlp: hex"02f901a801840114e0a3b9010000000000000000000000000000000880000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000010000000000000200000000000004000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000001000000000000000000000000000f89df89b94be41a9ec942d5b52be07cc7f4d7e30e10e9b652af863a0ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa0000000000000000000000000e1a9d9c9abb872ddef70a4d108fd8fc3c7ce4dc4a0000000000000000000000000658d9c76ff358984d6436ea11ee1eda08894c818a000000000000000000000000000000000000000000000000000000000017d7840", proofNodes: hex"f903c2b90114f90111a0521cc12bd9690d6917c873bca358761ebe614bcdda311ae96a565eb3541fb976a0b02184e8a0f42f8fc9334201f746a9baff3de9e8f41eea0e18fad0548b97e764a0bf9522de2efbf1ecd763d7d07c04b9579780e4dfcef4cd95d28941645d47b1cda09a0a1fe35afc2e59684ff2f5daa1c73b86cdcdae91e3368474eb9022bda2d063a013bdd2da4c785610d0f05060fe681f5e477f50c69194c0e28136e69206563696a05560234c78f21ba3a9aae7cba7ae577bfef05933de718331d878c739507efa02a0d845d6731dfdf289204a3a1ffe46af371ad170b4daac166e62904542c6f878be80a0e58215be848c1293dd381210359d84485553000a82b67410406d183b42adbbdd8080808080808080b8f3f8f1a05de6d331fd323cecf969809160b38063ad1e7a57621535a2c9503cf09ef18e74a0020c21c6134f94c5450c428e2dd9c92e1f027453e4ce8a329ba860fd7b8609e7a0b9f56b8bb529ada6000134c7eaf30976bdde0677b22ef29fbe235df54205cb83a0f57f302c4dd5c6a92c1f8349d86e89e0fe628640114cbc39417dcfc4a30ac43da0781c51cf0bce52b41a3304f2a8e588127c811c0c69988cd84527721c7f39e8eea0a2d9ebe7b6cb704af1eed8dd7524ee7d1b762e83e602f07053a93c2c230a91b7a052dca8e0b775939ceafe9bceb2bb92fd94196bc96e377721bd1e58899065341080808080808080808080b901b3f901b020b901ac02f901a801840114e0a3b9010000000000000000000000000000000880000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000010000000000000200000000000004000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000001000000000000000000000000000f89df89b94be41a9ec942d5b52be07cc7f4d7e30e10e9b652af863a0ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa0000000000000000000000000e1a9d9c9abb872ddef70a4d108fd8fc3c7ce4dc4a0000000000000000000000000658d9c76ff358984d6436ea11ee1eda08894c818a000000000000000000000000000000000000000000000000000000000017d7840", @@ -121,18 +121,17 @@ contract EscrowMPTTest is Test { vm.deal(deployer, 10 ether); vm.startPrank(deployer); - // Create native ETH escrow (tokenContract = address(0)) + // Create native ETH escrow // Pass 0, 0 to defer funding (constructor auto-calls fund() if non-zero) - Escrow proofEscrow = new Escrow( - address(0), // Native ETH + EscrowNative proofEscrow = new EscrowNative( proofRecipient, expectedAmount, - 0, // reward - defer to fundNative - 0 // payment - defer to fundNative + 0, // reward - defer to fund + 0 // payment - defer to fund ); // Fund the escrow with ETH - proofEscrow.fundNative{value: 1 ether}(0.5 ether, 0.5 ether); + proofEscrow.fund{value: 1 ether}(0.5 ether, 0.5 ether); vm.stopPrank(); console.log("Native proof escrow address:", address(proofEscrow)); @@ -142,14 +141,14 @@ contract EscrowMPTTest is Test { address executor = makeAddr("executor"); vm.deal(executor, 1 ether); vm.prank(executor); - proofEscrow.bondNative{value: 0.25 ether}(); + proofEscrow.bond{value: 0.25 ether}(); vm.roll(targetBlockNumber + 10); vm.setBlockhash(targetBlockNumber, targetBlockHash); // Full native ETH transfer proof with both transaction and receipt Merkle proofs // This proves: (1) tx was included in block, (2) tx succeeded (receipt status=1) - Escrow.NativeTransferProof memory proof = Escrow.NativeTransferProof({ + EscrowNative.NativeTransferProof memory proof = EscrowNative.NativeTransferProof({ blockHeader: hex"f90281a0397210743fb9da13aeccc4aabe2661bfa32141d4f29f6e7d19f9b687e9ed528aa01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347944df6eb2ec570b58cc64f540247a8adfa11f1cf63a00e7e627445ec722103ef8589db019ed664c2b60135149c2aac77592cbc73f2e1a0de2ddb3e41cd5a8ea1ba0ca1edb40173c290f986b2b90b2b04e57dbd1188d3b0a049342d87846703e91c3996fd651fe201e2b0438b89e72c306c91f5553014b47eb9010090296205660011a20c500a44024053005a0802482220050020a0304116423100008024420a000010a2c3404810001a0644040e0134882e10200100101245bc0010000049088843082044248b042806ac0001002820e4800802030044801102000400030a82840a58368401202031080042020094c424804080060036004900c43840001010366032620903c140000924210010030001a4018424106000820c004010b2260800040840089229d08400008002008c800c2490d17081030041a0802a0401220047000085420305080403820482008904200321005021499e1660400c120d400080000790c2d10220081908551000084d2040400c103c0a2821962480839a3db2840393870083bc0cee846973d94c95657269676f6e2d332e332e332d3762633364366431a0da7f921ea19c9df08304a2f4bca0af0a03ac9460ce65f0fe3bfa2d8ca2fb41b0880000000000000000843e642ba6a0d1a30c37e5696198b78a5f5acbb4695000eadc4e1c0c418ec2d64084e733c60c830e0000840c845646a026a71dc0fcb6c3cc98c6cea6459e4474085101a08c5c47b44b5297c2067ec2e9a0e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", transactionRlp: hex"02f87483aa36a703840349764384522407e2825208943c86ee0028788fcea3d1c0c486d3794254adcafc87038d7ea4c6800080c001a0bf78958050d25c0a20b23c53fffe328af09621b4aee42ea533e7dc361c89e80fa010a717301aa6292f8662f42c8f813e6f469e7ff87db37fe92afd0bb5849dd078", txProofNodes: hex"f9030ab893f891a04df2041d420fa3d55f34a8746442bb2ed115d53d152bae9a1e06c87a96495b26a096914abc2f5dedf4238ec649c5c802d4b845f3626da32c55a6bdfd0319ed674ea0c34cb53df6c5f6bd768894697e2a863ab3ade892f1014b73e739f4b63a5f3c1e8080808080a071bb16c3a3fa6ada920324ef40f4d5a36428f1430e14cae9a3bd98045ecf47ec8080808080808080b901f4f901f1a02aa618e5267c0753bd259e9012e392b7051d7350d437e3f70b97896f9eddd0bca037054656be02df06093636df195366c503730bf8dbec5c7322865ea8f0eaf4f0a0a258f45df5fa79f1f445ff6c0d6ffcc3ef5722ece8641a8bbb680a5765aea922a0a352b719cd5389335fff522878e047447dc1a2309e11ae5981a11ddc0b77da6da04d7f26ce3509ea037fa9b90188fd386851dbd9188fc55bd0fdf9c4b80c5f9379a0757f4d110e8958bd48fd1c674f7c1640d29d300ab2fdd6e5841dfbf2c59eb897a05ca297ed486e83631116a2e3a4b4729e67f8a5c87b3540b2e9f5a6827ca2f794a0606e7d8f4a1147546b12bf57b8e5dc9dd3b7e452cdec901410c4fe1ea9702a8ea03d03afcdf2972ac57a4751773cc002788967548f2b865832f911523eb5653c9ea087e14e540fa705597c4168e5903968cf5c76dd99c59ff1a3560166951fe44f62a0be5d49ad02271c9a68eb24f463b6b2fc985fc907f2de62c9ea9cdd1996d2cb3ca025e85233691d941a8bee020fe80354f21407625db38745d915e22bbd870bb451a0d3519df5120c28feeeb18c727bf8a013648308f32820558bb6fb2be4a1e89f16a0f87abef5804462906a643dd6a5fb7d0c84e9baa58a019b7627ac12219a49b145a0db699bee4861ee642e3088dc28ef8a9d1fdb5a5eb7f9bb8ad5f28f38717cd0698080b87cf87a20b87702f87483aa36a703840349764384522407e2825208943c86ee0028788fcea3d1c0c486d3794254adcafc87038d7ea4c6800080c001a0bf78958050d25c0a20b23c53fffe328af09621b4aee42ea533e7dc361c89e80fa010a717301aa6292f8662f42c8f813e6f469e7ff87db37fe92afd0bb5849dd078", @@ -160,7 +159,7 @@ contract EscrowMPTTest is Test { }); vm.prank(executor); - proofEscrow.collectNative(proof, targetBlockNumber); + proofEscrow.collect(proof, targetBlockNumber); console.log("Proved native ETH transfer"); console.log("To recipient:", proofRecipient); diff --git a/test/Tempo.t.sol b/test/Tempo.t.sol index 855568a..c08f06f 100644 --- a/test/Tempo.t.sol +++ b/test/Tempo.t.sol @@ -2,7 +2,7 @@ pragma solidity ^0.8.30; import {Test, console} from "forge-std/Test.sol"; -import {Escrow, IERC20} from "../src/Escrow.sol"; +import {EscrowERC20, IERC20} from "../src/EscrowERC20.sol"; import {ReceiptValidator} from "../src/ReceiptValidator.sol"; contract ReceiptValidatorWrapper { @@ -101,7 +101,7 @@ contract TempoTest is Test { vm.mockCall(TOKEN, abi.encodeWithSelector(IERC20.send.selector), abi.encode(true)); vm.prank(deployer); - Escrow escrow = new Escrow(TOKEN, TO_ADDRESS, AMOUNT, 500e18, 500e18); + EscrowERC20 escrow = new EscrowERC20(TOKEN, TO_ADDRESS, AMOUNT, 500e18, 500e18); vm.prank(FROM_ADDRESS); escrow.bond(250e18); @@ -111,7 +111,7 @@ contract TempoTest is Test { vm.prank(FROM_ADDRESS); escrow.collect( - Escrow.ReceiptProof({ + EscrowERC20.ReceiptProof({ blockHeader: BLOCK_HEADER, receiptRlp: RECEIPT_RLP, proofNodes: PROOF_NODES, From 6521185c18164e7a063f1ebab7f4171a0723805f Mon Sep 17 00:00:00 2001 From: ozwaldorf Date: Sat, 7 Feb 2026 18:27:53 -0500 Subject: [PATCH 2/9] fix: forge lint to require erc20 successes --- src/EscrowERC20.sol | 21 ++++++++++++++++----- 1 file changed, 16 insertions(+), 5 deletions(-) diff --git a/src/EscrowERC20.sol b/src/EscrowERC20.sol index 515bc76..2472ba3 100644 --- a/src/EscrowERC20.sol +++ b/src/EscrowERC20.sol @@ -47,7 +47,10 @@ contract EscrowERC20 is EscrowBase { currentRewardAmount = _currentRewardAmount; originalRewardAmount = _currentRewardAmount; currentPaymentAmount = _currentPaymentAmount; - IERC20(tokenContract).transferFrom(msg.sender, address(this), originalRewardAmount + currentPaymentAmount); + require( + IERC20(tokenContract).transferFrom(msg.sender, address(this), originalRewardAmount + currentPaymentAmount), + "Token transfer failed" + ); funded = true; } @@ -58,7 +61,10 @@ contract EscrowERC20 is EscrowBase { _validateBondRequirements(_bondAmount); - IERC20(tokenContract).transferFrom(msg.sender, address(this), _bondAmount); + require( + IERC20(tokenContract).transferFrom(msg.sender, address(this), _bondAmount), + "Token transfer failed" + ); _setBondData(_bondAmount); } @@ -91,12 +97,14 @@ contract EscrowERC20 is EscrowBase { _clearPayoutState(); + bool success; if (block.chainid == 11155111) { // Sepolia testnet uses non-standard send - IERC20(tokenContract).send(executor, payout); + success = IERC20(tokenContract).send(executor, payout); } else { - IERC20(tokenContract).transfer(executor, payout); + success = IERC20(tokenContract).transfer(executor, payout); } + require(success, "Token transfer failed"); } // allows deployer to withdraw all assets except the seized bonds (so the deployer can withdraw only and only what was deposited by deployer in the start function) @@ -111,6 +119,9 @@ contract EscrowERC20 is EscrowBase { require(withdrawableAmount > 0, "No withdrawable funds"); - IERC20(tokenContract).transfer(msg.sender, withdrawableAmount); + require( + IERC20(tokenContract).transfer(msg.sender, withdrawableAmount), + "Token transfer failed" + ); } } From c786e137537c02edb3ca820848f9a0c47bbe4529 Mon Sep 17 00:00:00 2001 From: ozwaldorf Date: Sat, 7 Feb 2026 18:28:12 -0500 Subject: [PATCH 3/9] fix: forge lint to hardcode runtime keccak computation --- src/ReceiptValidator.sol | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/ReceiptValidator.sol b/src/ReceiptValidator.sol index 6301342..6fbe544 100644 --- a/src/ReceiptValidator.sol +++ b/src/ReceiptValidator.sol @@ -11,6 +11,9 @@ import "./RLPParser.sol"; library ReceiptValidator { using RLPParser for bytes; + // Pre-computed Transfer(address,address,uint256) event signature + bytes32 private constant TRANSFER_EVENT_SIG = 0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef; + /** * @dev Validate Transfer event in receipt * @param receiptRlp RLP-encoded transaction receipt @@ -159,8 +162,7 @@ library ReceiptValidator { // Check first topic (event signature) bytes32 eventSig = receiptRlp.extractBytes32(offset); - bytes32 expectedSig = keccak256("Transfer(address,address,uint256)"); - require(eventSig == expectedSig, "Wrong event signature"); + require(eventSig == TRANSFER_EVENT_SIG, "Wrong event signature"); // Check second topic (from address) --skip validation offset = receiptRlp.skipItem(offset); From 6f6da7fd52926e0cb04845c995aeb4a0e84cb846 Mon Sep 17 00:00:00 2001 From: ozwaldorf Date: Sat, 7 Feb 2026 19:29:54 -0500 Subject: [PATCH 4/9] optimize: custom errors and unchecked loops, reduces bytecode by ~2.2k --- src/BlockHeaderParser.sol | 50 +++++++++++++++--------- src/EscrowBase.sol | 46 ++++++++++++++-------- src/EscrowERC20.sol | 61 +++++++++++++++-------------- src/EscrowNative.sol | 53 ++++++++++++++----------- src/MPTVerifier.sol | 21 ++++++---- src/RLPParser.sol | 34 ++++++++++------ src/ReceiptValidator.sol | 81 ++++++++++++++++++++++++--------------- test/EscrowERC20.t.sol | 35 +++++++++-------- test/EscrowNative.t.sol | 44 +++++++++++---------- test/Tempo.t.sol | 6 +-- 10 files changed, 257 insertions(+), 174 deletions(-) diff --git a/src/BlockHeaderParser.sol b/src/BlockHeaderParser.sol index 40617fa..6b6349a 100644 --- a/src/BlockHeaderParser.sol +++ b/src/BlockHeaderParser.sol @@ -15,6 +15,11 @@ import "./RLPParser.sol"; library BlockHeaderParser { using RLPParser for bytes; + error InvalidRLPList(); + error InvalidRLPEncoding(); + error RLPOffsetOutOfBounds(); + error ExpectedStringItem(); + /** * @dev Get offset to inner header (skips Tempo wrapper if present) * Tempo: [slot, parent_slot, extra, inner_header] -> skip to inner_header @@ -24,7 +29,7 @@ library BlockHeaderParser { uint256 offset = 0; // Skip outer RLP list prefix - require(blockHeader[offset] >= 0xc0, "Invalid RLP list"); + if (blockHeader[offset] < 0xc0) revert InvalidRLPList(); if (blockHeader[offset] >= 0xf8) { offset += 1 + (uint8(blockHeader[offset]) - 0xf7); } else { @@ -34,12 +39,13 @@ library BlockHeaderParser { // Tempo networks: 42429 (local/test), 42431 (Moderato testnet) if (block.chainid == 42429 || block.chainid == 42431) { // Tempo: skip first 3 fields (slot, parent_slot, extra) to get to inner header - for (uint256 i = 0; i < 3; i++) { + for (uint256 i = 0; i < 3;) { offset = blockHeader.skipItem(offset); + unchecked { ++i; } } // Now skip the inner header's list prefix - require(blockHeader[offset] >= 0xc0, "Invalid inner header RLP list"); + if (blockHeader[offset] < 0xc0) revert InvalidRLPList(); if (blockHeader[offset] >= 0xf8) { offset += 1 + (uint8(blockHeader[offset]) - 0xf7); } else { @@ -60,8 +66,9 @@ library BlockHeaderParser { // Skip first 8 fields to get to block number (index 8) // [parentHash, sha3Uncles, miner, stateRoot, transactionsRoot, receiptsRoot, logsBloom, difficulty, number, ...] - for (uint256 i = 0; i < 8; i++) { + for (uint256 i = 0; i < 8;) { offset = blockHeader.skipItem(offset); + unchecked { ++i; } } // Extract block number @@ -69,8 +76,9 @@ library BlockHeaderParser { // Decode big-endian number uint256 blockNumber = 0; - for (uint256 i = 0; i < numBytes.length; i++) { + for (uint256 i = 0; i < numBytes.length;) { blockNumber = (blockNumber << 8) | uint8(numBytes[i]); + unchecked { ++i; } } return blockNumber; @@ -86,12 +94,13 @@ library BlockHeaderParser { // Skip first 5 fields to get to receiptsRoot (index 5) // [parentHash, sha3Uncles, miner, stateRoot, transactionsRoot, receiptsRoot, ...] - for (uint256 i = 0; i < 5; i++) { + for (uint256 i = 0; i < 5;) { offset = blockHeader.skipItem(offset); + unchecked { ++i; } } // Extract receiptsRoot (32 bytes) - require(blockHeader[offset] == 0xa0, "Invalid receiptsRoot RLP encoding"); + if (blockHeader[offset] != 0xa0) revert InvalidRLPEncoding(); offset += 1; bytes32 receiptsRoot; @@ -114,7 +123,7 @@ library BlockHeaderParser { pure returns (bytes memory result, uint256 length) { - require(offset < data.length, "RLP offset out of bounds"); + if (offset >= data.length) revert RLPOffsetOutOfBounds(); uint8 prefix = uint8(data[offset]); @@ -127,24 +136,27 @@ library BlockHeaderParser { // Short string uint256 itemLength = prefix - 0x80; result = new bytes(itemLength); - for (uint256 i = 0; i < itemLength; i++) { + for (uint256 i = 0; i < itemLength;) { result[i] = data[offset + 1 + i]; + unchecked { ++i; } } return (result, 1 + itemLength); } else if (prefix < 0xc0) { // Long string uint256 lengthBytes = prefix - 0xb7; uint256 itemLength = 0; - for (uint256 i = 0; i < lengthBytes; i++) { + for (uint256 i = 0; i < lengthBytes;) { itemLength = (itemLength << 8) | uint8(data[offset + 1 + i]); + unchecked { ++i; } } result = new bytes(itemLength); - for (uint256 i = 0; i < itemLength; i++) { + for (uint256 i = 0; i < itemLength;) { result[i] = data[offset + 1 + lengthBytes + i]; + unchecked { ++i; } } return (result, 1 + lengthBytes + itemLength); } else { - revert("Expected string item, got list"); + revert ExpectedStringItem(); } } @@ -157,7 +169,7 @@ library BlockHeaderParser { uint256 offset = 0; // Skip RLP list prefix - require(blockHeader[offset] >= 0xc0, "Invalid RLP list"); + if (blockHeader[offset] < 0xc0) revert InvalidRLPList(); if (blockHeader[offset] >= 0xf8) { offset += 1 + (uint8(blockHeader[offset]) - 0xf7); } else { @@ -165,12 +177,13 @@ library BlockHeaderParser { } // Skip first 3 fields to get to stateRoot (index 3) - for (uint256 i = 0; i < 3; i++) { + for (uint256 i = 0; i < 3;) { offset = blockHeader.skipItem(offset); + unchecked { ++i; } } // Extract stateRoot (32 bytes) - require(blockHeader[offset] == 0xa0, "Invalid stateRoot RLP encoding"); + if (blockHeader[offset] != 0xa0) revert InvalidRLPEncoding(); offset += 1; bytes32 stateRoot; @@ -190,7 +203,7 @@ library BlockHeaderParser { uint256 offset = 0; // Skip RLP list prefix - require(blockHeader[offset] >= 0xc0, "Invalid RLP list"); + if (blockHeader[offset] < 0xc0) revert InvalidRLPList(); if (blockHeader[offset] >= 0xf8) { offset += 1 + (uint8(blockHeader[offset]) - 0xf7); } else { @@ -198,12 +211,13 @@ library BlockHeaderParser { } // Skip first 4 fields to get to transactionsRoot (index 4) - for (uint256 i = 0; i < 4; i++) { + for (uint256 i = 0; i < 4;) { offset = blockHeader.skipItem(offset); + unchecked { ++i; } } // Extract transactionsRoot (32 bytes) - require(blockHeader[offset] == 0xa0, "Invalid transactionsRoot RLP encoding"); + if (blockHeader[offset] != 0xa0) revert InvalidRLPEncoding(); offset += 1; bytes32 transactionsRoot; diff --git a/src/EscrowBase.sol b/src/EscrowBase.sol index 978307f..30b9cc2 100644 --- a/src/EscrowBase.sol +++ b/src/EscrowBase.sol @@ -6,6 +6,20 @@ import "./MPTVerifier.sol"; import "./ReceiptValidator.sol"; abstract contract EscrowBase { + // Custom errors + error OnlyDeployer(); + error NotFunded(); + error OnlyBondedExecutor(); + error TargetBlockInFuture(); + error TargetBlockTooOld(); + error BlockHashUnavailable(); + error BlockHeaderMismatch(); + error BlockNumberMismatch(); + error BondActive(); + error CancellationRequested(); + error ExecutorAlreadyBonded(); + error InsufficientBond(); + // The following variables are set up in the constructor. address immutable deployerAddress; uint256 public currentRewardAmount; @@ -35,14 +49,14 @@ abstract contract EscrowBase { // only deployer can call this. will set the cancellation request to true. // when the cancellation is requested, the bonded executor may still finish their job and collect, but no new executor is accepted after the current bonded one. function requestCancellation() public { - require(msg.sender == deployerAddress, "Only callable by the deployer"); + if (msg.sender != deployerAddress) revert OnlyDeployer(); cancellationRequest = true; } // sets cancellation request to false, if the caller is deployer. // starts accepting new executors function resume() public { - require(msg.sender == deployerAddress, "Only callable by the deployer"); + if (msg.sender != deployerAddress) revert OnlyDeployer(); cancellationRequest = false; } @@ -53,20 +67,20 @@ abstract contract EscrowBase { // Internal helper to validate block header for proof verification function _validateBlockHeader(bytes calldata blockHeader, uint256 targetBlockNumber) internal view { - require(funded, "Contract not funded"); - require(msg.sender == bondedExecutor && is_bonded(), "Only bonded executor can collect"); - require(targetBlockNumber <= block.number, "Target block is in the future"); - require(block.number - targetBlockNumber <= maxBlockLookback, "Target block too old"); + if (!funded) revert NotFunded(); + if (msg.sender != bondedExecutor || !is_bonded()) revert OnlyBondedExecutor(); + if (targetBlockNumber > block.number) revert TargetBlockInFuture(); + if (block.number - targetBlockNumber > maxBlockLookback) revert TargetBlockTooOld(); bytes32 targetBlockHash = blockhash(targetBlockNumber); - require(targetBlockHash != bytes32(0), "Unable to retrieve block hash"); - require(keccak256(blockHeader) == targetBlockHash, "Block header hash mismatch"); - require(BlockHeaderParser.extractBlockNumber(blockHeader) == targetBlockNumber, "Header block number mismatch"); + if (targetBlockHash == bytes32(0)) revert BlockHashUnavailable(); + if (keccak256(blockHeader) != targetBlockHash) revert BlockHeaderMismatch(); + if (BlockHeaderParser.extractBlockNumber(blockHeader) != targetBlockNumber) revert BlockNumberMismatch(); } // Internal helper to reset bond data when expired function _tryResetBondData() internal { - require(!is_bonded(), "Cannot reset while bond is active"); + if (is_bonded()) revert BondActive(); bondedExecutor = address(0); bondAmount = 0; @@ -84,10 +98,10 @@ abstract contract EscrowBase { // Internal helper to validate bond requirements function _validateBondRequirements(uint256 _bondAmount) internal view { - require(funded, "Contract not funded"); - require(!cancellationRequest, "Cancellation requested"); - require(!is_bonded(), "Another executor is already bonded"); - require(_bondAmount >= currentRewardAmount / 2, "Bond must be at least half of reward amount"); + if (!funded) revert NotFunded(); + if (cancellationRequest) revert CancellationRequested(); + if (is_bonded()) revert ExecutorAlreadyBonded(); + if (_bondAmount < currentRewardAmount / 2) revert InsufficientBond(); } // Internal helper to set bond data @@ -114,8 +128,8 @@ abstract contract EscrowBase { // Internal helper to validate withdraw requirements function _validateWithdraw() internal view { - require(funded, "Contract not funded"); - require(msg.sender == deployerAddress, "Only callable by the deployer"); + if (!funded) revert NotFunded(); + if (msg.sender != deployerAddress) revert OnlyDeployer(); } // Internal helper to calculate withdrawable amount and clear state diff --git a/src/EscrowERC20.sol b/src/EscrowERC20.sol index 2472ba3..5918228 100644 --- a/src/EscrowERC20.sol +++ b/src/EscrowERC20.sol @@ -11,6 +11,16 @@ interface IERC20 { } contract EscrowERC20 is EscrowBase { + // Custom errors + error ZeroAddress(); + error AlreadyFunded(); + error ZeroRewardAmount(); + error ZeroPaymentAmount(); + error TokenTransferFailed(); + error InvalidReceiptProof(); + error InvalidTransferEvent(); + error NoWithdrawableFunds(); + address public immutable tokenContract; // The tokens used in the escrow // Based on Nomad's proof structure @@ -29,7 +39,7 @@ contract EscrowERC20 is EscrowBase { uint256 _currentRewardAmount, uint256 _currentPaymentAmount ) EscrowBase(_expectedRecipient, _expectedAmount) { - require(_tokenContract != address(0), "Token contract cannot be zero address"); + if (_tokenContract == address(0)) revert ZeroAddress(); tokenContract = _tokenContract; if (_currentRewardAmount > 0 && _currentPaymentAmount > 0) { @@ -39,18 +49,17 @@ contract EscrowERC20 is EscrowBase { // takes currentRewardAmount + currentPaymentAmount from the deployer's balance from the tokenContract. function fund(uint256 _currentRewardAmount, uint256 _currentPaymentAmount) public { - require(msg.sender == deployerAddress, "Only callable by the deployer"); - require(!funded, "Contract already funded"); - require(_currentRewardAmount > 0, "Reward amount must be non-zero"); - require(_currentPaymentAmount > 0, "Payment amount must be non-zero"); + if (msg.sender != deployerAddress) revert OnlyDeployer(); + if (funded) revert AlreadyFunded(); + if (_currentRewardAmount == 0) revert ZeroRewardAmount(); + if (_currentPaymentAmount == 0) revert ZeroPaymentAmount(); currentRewardAmount = _currentRewardAmount; originalRewardAmount = _currentRewardAmount; currentPaymentAmount = _currentPaymentAmount; - require( - IERC20(tokenContract).transferFrom(msg.sender, address(this), originalRewardAmount + currentPaymentAmount), - "Token transfer failed" - ); + if (!IERC20(tokenContract).transferFrom(msg.sender, address(this), originalRewardAmount + currentPaymentAmount)) { + revert TokenTransferFailed(); + } funded = true; } @@ -61,10 +70,9 @@ contract EscrowERC20 is EscrowBase { _validateBondRequirements(_bondAmount); - require( - IERC20(tokenContract).transferFrom(msg.sender, address(this), _bondAmount), - "Token transfer failed" - ); + if (!IERC20(tokenContract).transferFrom(msg.sender, address(this), _bondAmount)) { + revert TokenTransferFailed(); + } _setBondData(_bondAmount); } @@ -75,18 +83,16 @@ contract EscrowERC20 is EscrowBase { // Extract receipts root and verify receipt inclusion bytes32 receiptsRoot = BlockHeaderParser.extractReceiptsRoot(proof.blockHeader); - require( - MPTVerifier.verifyReceiptProof(proof.receiptRlp, proof.proofNodes, proof.receiptPath, receiptsRoot), - "Invalid receipt MPT proof" - ); + if (!MPTVerifier.verifyReceiptProof(proof.receiptRlp, proof.proofNodes, proof.receiptPath, receiptsRoot)) { + revert InvalidReceiptProof(); + } // Validate the Transfer event - require( - ReceiptValidator.validateTransferInReceipt( + if (!ReceiptValidator.validateTransferInReceipt( proof.receiptRlp, proof.logIndex, tokenContract, expectedRecipient, expectedAmount - ), - "Invalid Transfer event" - ); + )) { + revert InvalidTransferEvent(); + } _payout(); } @@ -104,7 +110,7 @@ contract EscrowERC20 is EscrowBase { } else { success = IERC20(tokenContract).transfer(executor, payout); } - require(success, "Token transfer failed"); + if (!success) revert TokenTransferFailed(); } // allows deployer to withdraw all assets except the seized bonds (so the deployer can withdraw only and only what was deposited by deployer in the start function) @@ -117,11 +123,10 @@ contract EscrowERC20 is EscrowBase { _clearWithdrawState(); - require(withdrawableAmount > 0, "No withdrawable funds"); + if (withdrawableAmount == 0) revert NoWithdrawableFunds(); - require( - IERC20(tokenContract).transfer(msg.sender, withdrawableAmount), - "Token transfer failed" - ); + if (!IERC20(tokenContract).transfer(msg.sender, withdrawableAmount)) { + revert TokenTransferFailed(); + } } } diff --git a/src/EscrowNative.sol b/src/EscrowNative.sol index 81f2a23..8cbb27b 100644 --- a/src/EscrowNative.sol +++ b/src/EscrowNative.sol @@ -4,6 +4,18 @@ pragma solidity 0.8.30; import "./EscrowBase.sol"; contract EscrowNative is EscrowBase { + // Custom errors + error IncorrectETHAmount(); + error AlreadyFunded(); + error ZeroRewardAmount(); + error ZeroPaymentAmount(); + error InvalidTxProof(); + error InvalidReceiptProof(); + error TxFailed(); + error InvalidNativeTransfer(); + error ETHTransferFailed(); + error NoWithdrawableFunds(); + // Proof structure for native ETH transfers (requires both tx and receipt) struct NativeTransferProof { bytes blockHeader; // RLP-encoded block header @@ -21,7 +33,7 @@ contract EscrowNative is EscrowBase { uint256 _currentPaymentAmount ) payable EscrowBase(_expectedRecipient, _expectedAmount) { if (_currentRewardAmount > 0 && _currentPaymentAmount > 0) { - require(msg.value == _currentRewardAmount + _currentPaymentAmount, "Incorrect ETH amount"); + if (msg.value != _currentRewardAmount + _currentPaymentAmount) revert IncorrectETHAmount(); currentRewardAmount = _currentRewardAmount; originalRewardAmount = _currentRewardAmount; currentPaymentAmount = _currentPaymentAmount; @@ -30,11 +42,11 @@ contract EscrowNative is EscrowBase { } function fund(uint256 _currentRewardAmount, uint256 _currentPaymentAmount) public payable { - require(msg.sender == deployerAddress, "Only callable by the deployer"); - require(!funded, "Contract already funded"); - require(_currentRewardAmount > 0, "Reward amount must be non-zero"); - require(_currentPaymentAmount > 0, "Payment amount must be non-zero"); - require(msg.value == _currentRewardAmount + _currentPaymentAmount, "Incorrect ETH amount"); + if (msg.sender != deployerAddress) revert OnlyDeployer(); + if (funded) revert AlreadyFunded(); + if (_currentRewardAmount == 0) revert ZeroRewardAmount(); + if (_currentPaymentAmount == 0) revert ZeroPaymentAmount(); + if (msg.value != _currentRewardAmount + _currentPaymentAmount) revert IncorrectETHAmount(); currentRewardAmount = _currentRewardAmount; originalRewardAmount = _currentRewardAmount; @@ -58,26 +70,23 @@ contract EscrowNative is EscrowBase { // Verify transaction inclusion in transactions trie bytes32 transactionsRoot = BlockHeaderParser.extractTransactionsRoot(proof.blockHeader); - require( - MPTVerifier.verifyReceiptProof(proof.transactionRlp, proof.txProofNodes, proof.path, transactionsRoot), - "Invalid transaction MPT proof" - ); + if (!MPTVerifier.verifyReceiptProof(proof.transactionRlp, proof.txProofNodes, proof.path, transactionsRoot)) { + revert InvalidTxProof(); + } // Verify receipt inclusion in receipts trie bytes32 receiptsRoot = BlockHeaderParser.extractReceiptsRoot(proof.blockHeader); - require( - MPTVerifier.verifyReceiptProof(proof.receiptRlp, proof.receiptProofNodes, proof.path, receiptsRoot), - "Invalid receipt MPT proof" - ); + if (!MPTVerifier.verifyReceiptProof(proof.receiptRlp, proof.receiptProofNodes, proof.path, receiptsRoot)) { + revert InvalidReceiptProof(); + } // Validate transaction succeeded (status == 1) - require(ReceiptValidator.validateReceiptStatus(proof.receiptRlp), "Transaction failed (status != 1)"); + if (!ReceiptValidator.validateReceiptStatus(proof.receiptRlp)) revert TxFailed(); // Validate the native ETH transfer (to and value fields) - require( - ReceiptValidator.validateNativeTransfer(proof.transactionRlp, expectedRecipient, expectedAmount), - "Invalid native transfer" - ); + if (!ReceiptValidator.validateNativeTransfer(proof.transactionRlp, expectedRecipient, expectedAmount)) { + revert InvalidNativeTransfer(); + } _payout(); } @@ -89,7 +98,7 @@ contract EscrowNative is EscrowBase { _clearPayoutState(); (bool success,) = executor.call{value: payout}(""); - require(success, "ETH transfer failed"); + if (!success) revert ETHTransferFailed(); } // allows deployer to withdraw all assets except the seized bonds (so the deployer can withdraw only and only what was deposited by deployer in the start function) @@ -102,9 +111,9 @@ contract EscrowNative is EscrowBase { _clearWithdrawState(); - require(withdrawableAmount > 0, "No withdrawable funds"); + if (withdrawableAmount == 0) revert NoWithdrawableFunds(); (bool success,) = msg.sender.call{value: withdrawableAmount}(""); - require(success, "ETH transfer failed"); + if (!success) revert ETHTransferFailed(); } } diff --git a/src/MPTVerifier.sol b/src/MPTVerifier.sol index 72f5f0e..45a1363 100644 --- a/src/MPTVerifier.sol +++ b/src/MPTVerifier.sol @@ -11,6 +11,8 @@ import "./RLPParser.sol"; library MPTVerifier { using RLPParser for bytes; + error ExpectedRLPList(); + /** * @dev Verify receipt inclusion using Merkle Patricia Trie proof * @param receiptRlp RLP-encoded transaction receipt @@ -49,7 +51,7 @@ library MPTVerifier { { // Parse the RLP array header uint256 arrayOffset = 0; - require(proofArray[0] >= 0xc0, "Expected RLP list for proof nodes"); + if (proofArray[0] < 0xc0) revert ExpectedRLPList(); if (proofArray[0] >= 0xf8) { uint256 lengthBytes = uint8(proofArray[0]) - 0xf7; @@ -128,7 +130,7 @@ library MPTVerifier { uint256 items = 0; while (offset < data.length) { offset += data.getItemLength(offset); - items++; + unchecked { ++items; } } return items; } @@ -154,8 +156,9 @@ library MPTVerifier { if (keyOffset >= key.length * 2) { // Check value in branch node (at index 16) uint256 valueOffset = nodeOffset; - for (uint256 i = 0; i < 16; i++) { + for (uint256 i = 0; i < 16;) { valueOffset += node.getItemLength(valueOffset); + unchecked { ++i; } } (bytes memory nodeValue,) = node.parseItem(valueOffset); if (keccak256(nodeValue) == keccak256(value)) { @@ -175,8 +178,9 @@ library MPTVerifier { // Get the branch at this nibble uint256 branchOffset = nodeOffset; - for (uint256 i = 0; i < nibble; i++) { + for (uint256 i = 0; i < nibble;) { branchOffset += node.getItemLength(branchOffset); + unchecked { ++i; } } (bytes memory nextHash,) = node.parseItem(branchOffset); @@ -272,15 +276,17 @@ library MPTVerifier { if (isOdd) { result = new bytes(nodeKey.length * 2 - 1); result[0] = bytes1(firstByte & 0x0f); - for (uint256 i = 1; i < nodeKey.length; i++) { + for (uint256 i = 1; i < nodeKey.length;) { result[i * 2 - 1] = bytes1(uint8(nodeKey[i]) >> 4); result[i * 2] = bytes1(uint8(nodeKey[i]) & 0x0f); + unchecked { ++i; } } } else { result = new bytes(nodeKey.length * 2 - 2); - for (uint256 i = 1; i < nodeKey.length; i++) { + for (uint256 i = 1; i < nodeKey.length;) { result[(i - 1) * 2] = bytes1(uint8(nodeKey[i]) >> 4); result[(i - 1) * 2 + 1] = bytes1(uint8(nodeKey[i]) & 0x0f); + unchecked { ++i; } } } @@ -297,7 +303,7 @@ library MPTVerifier { function compareKeys(bytes memory key, uint256 offset, bytes memory nodeKey) private pure returns (bool) { if (offset + nodeKey.length > key.length * 2) return false; - for (uint256 i = 0; i < nodeKey.length; i++) { + for (uint256 i = 0; i < nodeKey.length;) { uint8 keyNibble; if ((offset + i) % 2 == 0) { keyNibble = uint8(key[(offset + i) / 2]) >> 4; @@ -308,6 +314,7 @@ library MPTVerifier { if (keyNibble != uint8(nodeKey[i])) { return false; } + unchecked { ++i; } } return true; diff --git a/src/RLPParser.sol b/src/RLPParser.sol index 3c7de91..4a1fc8e 100644 --- a/src/RLPParser.sol +++ b/src/RLPParser.sol @@ -7,6 +7,8 @@ pragma solidity ^0.8.13; * Used for decoding Ethereum block headers, transaction receipts, and event logs */ library RLPParser { + error RLPOffsetOutOfBounds(); + error ExpectedBytes32(); /** * @dev Skip an RLP item and return new offset * @param data The RLP encoded data @@ -14,7 +16,7 @@ library RLPParser { * @return New offset after skipping the item */ function skipItem(bytes calldata data, uint256 offset) internal pure returns (uint256) { - require(offset < data.length, "RLP offset out of bounds"); + if (offset >= data.length) revert RLPOffsetOutOfBounds(); uint8 prefix = uint8(data[offset]); @@ -28,8 +30,9 @@ library RLPParser { // Long string uint256 lengthBytes = prefix - 0xb7; uint256 length = 0; - for (uint256 i = 0; i < lengthBytes; i++) { + for (uint256 i = 0; i < lengthBytes;) { length = (length << 8) | uint8(data[offset + 1 + i]); + unchecked { ++i; } } return offset + 1 + lengthBytes + length; } else if (prefix < 0xf8) { @@ -39,8 +42,9 @@ library RLPParser { // Long list uint256 lengthBytes = prefix - 0xf7; uint256 length = 0; - for (uint256 i = 0; i < lengthBytes; i++) { + for (uint256 i = 0; i < lengthBytes;) { length = (length << 8) | uint8(data[offset + 1 + i]); + unchecked { ++i; } } return offset + 1 + lengthBytes + length; } @@ -54,7 +58,7 @@ library RLPParser { * @return length Total length of the RLP item including prefix */ function parseItem(bytes memory data, uint256 offset) internal pure returns (bytes memory, uint256) { - require(offset < data.length, "RLP offset out of bounds"); + if (offset >= data.length) revert RLPOffsetOutOfBounds(); uint8 prefix = uint8(data[offset]); @@ -67,28 +71,32 @@ library RLPParser { // Short string uint256 length = prefix - 0x80; bytes memory result = new bytes(length); - for (uint256 i = 0; i < length; i++) { + for (uint256 i = 0; i < length;) { result[i] = data[offset + 1 + i]; + unchecked { ++i; } } return (result, 1 + length); } else if (prefix < 0xc0) { // Long string uint256 lengthBytes = prefix - 0xb7; uint256 length = 0; - for (uint256 i = 0; i < lengthBytes; i++) { + for (uint256 i = 0; i < lengthBytes;) { length = (length << 8) | uint8(data[offset + 1 + i]); + unchecked { ++i; } } bytes memory result = new bytes(length); - for (uint256 i = 0; i < length; i++) { + for (uint256 i = 0; i < length;) { result[i] = data[offset + 1 + lengthBytes + i]; + unchecked { ++i; } } return (result, 1 + lengthBytes + length); } else { // List - return the entire list content uint256 totalLength = getItemLength(data, offset); bytes memory result = new bytes(totalLength); - for (uint256 i = 0; i < totalLength; i++) { + for (uint256 i = 0; i < totalLength;) { result[i] = data[offset + i]; + unchecked { ++i; } } return (result, totalLength); } @@ -101,7 +109,7 @@ library RLPParser { * @return Total length of the RLP item */ function getItemLength(bytes memory data, uint256 offset) internal pure returns (uint256) { - require(offset < data.length, "RLP offset out of bounds"); + if (offset >= data.length) revert RLPOffsetOutOfBounds(); uint8 prefix = uint8(data[offset]); @@ -112,8 +120,9 @@ library RLPParser { } else if (prefix < 0xc0) { uint256 lengthBytes = prefix - 0xb7; uint256 length = 0; - for (uint256 i = 0; i < lengthBytes; i++) { + for (uint256 i = 0; i < lengthBytes;) { length = (length << 8) | uint8(data[offset + 1 + i]); + unchecked { ++i; } } return 1 + lengthBytes + length; } else if (prefix < 0xf8) { @@ -121,8 +130,9 @@ library RLPParser { } else { uint256 lengthBytes = prefix - 0xf7; uint256 length = 0; - for (uint256 i = 0; i < lengthBytes; i++) { + for (uint256 i = 0; i < lengthBytes;) { length = (length << 8) | uint8(data[offset + 1 + i]); + unchecked { ++i; } } return 1 + lengthBytes + length; } @@ -135,7 +145,7 @@ library RLPParser { * @return The extracted bytes32 value */ function extractBytes32(bytes calldata data, uint256 offset) internal pure returns (bytes32) { - require(data[offset] == 0xa0, "Expected 32-byte string"); + if (data[offset] != 0xa0) revert ExpectedBytes32(); bytes32 result; assembly { result := calldataload(add(data.offset, add(offset, 1))) diff --git a/src/ReceiptValidator.sol b/src/ReceiptValidator.sol index 6fbe544..d7fb7bb 100644 --- a/src/ReceiptValidator.sol +++ b/src/ReceiptValidator.sol @@ -11,6 +11,18 @@ import "./RLPParser.sol"; library ReceiptValidator { using RLPParser for bytes; + // Custom errors + error InvalidRLP(); + error InvalidAddress(); + error WrongTokenContract(); + error WrongEventSignature(); + error ToAddressMismatch(); + error AmountMismatch(); + error ExpectedStringData(); + error ReceiptStatusNotSuccess(); + error UnsupportedTxType(); + error RecipientMismatch(); + // Pre-computed Transfer(address,address,uint256) event signature bytes32 private constant TRANSFER_EVENT_SIG = 0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef; @@ -37,7 +49,7 @@ library ReceiptValidator { } // Skip RLP list prefix - require(uint8(receiptRlp[offset]) >= 0xc0, "Invalid receipt RLP"); + if (uint8(receiptRlp[offset]) < 0xc0) revert InvalidRLP(); if (uint8(receiptRlp[offset]) >= 0xf8) { offset += 1 + (uint8(receiptRlp[offset]) - 0xf7); } else { @@ -45,12 +57,13 @@ library ReceiptValidator { } // Skip status, cumulativeGasUsed, bloom to get to logs - for (uint256 i = 0; i < 3; i++) { + for (uint256 i = 0; i < 3;) { offset = receiptRlp.skipItem(offset); + unchecked { ++i; } } // Now at logs array - require(uint8(receiptRlp[offset]) >= 0xc0, "Invalid logs RLP"); + if (uint8(receiptRlp[offset]) < 0xc0) revert InvalidRLP(); if (uint8(receiptRlp[offset]) >= 0xf8) { offset += 1 + (uint8(receiptRlp[offset]) - 0xf7); } else { @@ -58,8 +71,9 @@ library ReceiptValidator { } // Navigate to target log - for (uint256 i = 0; i < logIndex; i++) { + for (uint256 i = 0; i < logIndex;) { offset = receiptRlp.skipItem(offset); + unchecked { ++i; } } // Validate the target log @@ -85,7 +99,7 @@ library ReceiptValidator { uint256 offset = logOffset; // Parse target log: [address, topics[], data] - require(uint8(receiptRlp[offset]) >= 0xc0, "Invalid log RLP"); + if (uint8(receiptRlp[offset]) < 0xc0) revert InvalidRLP(); if (uint8(receiptRlp[offset]) >= 0xf8) { offset += 1 + (uint8(receiptRlp[offset]) - 0xf7); } else { @@ -94,14 +108,14 @@ library ReceiptValidator { // Parse emitter address (should be the token contract) (bytes memory addrBytes, uint256 addrLen) = parseAddressFromRLP(receiptRlp, offset); - require(addrBytes.length == 20, "Invalid emitter address length"); + if (addrBytes.length != 20) revert InvalidAddress(); // Extract emitter address address emitter; assembly { emitter := mload(add(addrBytes, 20)) } - require(emitter == tokenContract, "Wrong token contract"); + if (emitter != tokenContract) revert WrongTokenContract(); offset += addrLen; // Parse and validate topics @@ -120,19 +134,20 @@ library ReceiptValidator { pure returns (bytes memory result, uint256 length) { - require(offset < data.length, "RLP offset out of bounds"); + if (offset >= data.length) revert InvalidRLP(); uint8 prefix = uint8(data[offset]); if (prefix == 0x94) { // Address is 20 bytes with prefix 0x94 result = new bytes(20); - for (uint256 i = 0; i < 20; i++) { + for (uint256 i = 0; i < 20;) { result[i] = data[offset + 1 + i]; + unchecked { ++i; } } return (result, 21); } else { - revert("Invalid address RLP encoding"); + revert InvalidAddress(); } } @@ -153,7 +168,7 @@ library ReceiptValidator { uint256 offset = topicsOffset; // Parse topics array - require(uint8(receiptRlp[offset]) >= 0xc0, "Invalid topics RLP"); + if (uint8(receiptRlp[offset]) < 0xc0) revert InvalidRLP(); if (uint8(receiptRlp[offset]) >= 0xf8) { offset += 1 + (uint8(receiptRlp[offset]) - 0xf7); } else { @@ -162,7 +177,7 @@ library ReceiptValidator { // Check first topic (event signature) bytes32 eventSig = receiptRlp.extractBytes32(offset); - require(eventSig == TRANSFER_EVENT_SIG, "Wrong event signature"); + if (eventSig != TRANSFER_EVENT_SIG) revert WrongEventSignature(); // Check second topic (from address) --skip validation offset = receiptRlp.skipItem(offset); @@ -170,19 +185,20 @@ library ReceiptValidator { // Check third topic (to address) offset = receiptRlp.skipItem(offset); bytes32 logToAddr = receiptRlp.extractBytes32(offset); - require(address(uint160(uint256(logToAddr))) == toAddress, "To address mismatch"); + if (address(uint160(uint256(logToAddr))) != toAddress) revert ToAddressMismatch(); // Parse and validate data payload (amount) offset = receiptRlp.skipItem(topicsOffset); // Skip entire topics array (bytes memory dataBytes,) = parseDataFromRLP(receiptRlp, offset); // Convert data bytes to uint256 (amount) - require(dataBytes.length <= 32, "Amount data too long"); + if (dataBytes.length > 32) revert InvalidRLP(); uint256 logAmount = 0; - for (uint256 i = 0; i < dataBytes.length; i++) { + for (uint256 i = 0; i < dataBytes.length;) { logAmount = (logAmount << 8) | uint8(dataBytes[i]); + unchecked { ++i; } } - require(logAmount == expectedAmount, "Transfer amount mismatch"); + if (logAmount != expectedAmount) revert AmountMismatch(); return true; } @@ -199,7 +215,7 @@ library ReceiptValidator { pure returns (bytes memory result, uint256 length) { - require(offset < data.length, "RLP offset out of bounds"); + if (offset >= data.length) revert InvalidRLP(); uint8 prefix = uint8(data[offset]); @@ -212,24 +228,27 @@ library ReceiptValidator { // Short string uint256 dataLength = prefix - 0x80; result = new bytes(dataLength); - for (uint256 i = 0; i < dataLength; i++) { + for (uint256 i = 0; i < dataLength;) { result[i] = data[offset + 1 + i]; + unchecked { ++i; } } return (result, 1 + dataLength); } else if (prefix < 0xc0) { // Long string uint256 lengthBytes = prefix - 0xb7; uint256 dataLength = 0; - for (uint256 i = 0; i < lengthBytes; i++) { + for (uint256 i = 0; i < lengthBytes;) { dataLength = (dataLength << 8) | uint8(data[offset + 1 + i]); + unchecked { ++i; } } result = new bytes(dataLength); - for (uint256 i = 0; i < dataLength; i++) { + for (uint256 i = 0; i < dataLength;) { result[i] = data[offset + 1 + lengthBytes + i]; + unchecked { ++i; } } return (result, 1 + lengthBytes + dataLength); } else { - revert("Expected string data, got list"); + revert ExpectedStringData(); } } @@ -247,7 +266,7 @@ library ReceiptValidator { } // Skip RLP list prefix - require(uint8(receiptRlp[offset]) >= 0xc0, "Invalid receipt RLP"); + if (uint8(receiptRlp[offset]) < 0xc0) revert InvalidRLP(); if (uint8(receiptRlp[offset]) >= 0xf8) { offset += 1 + (uint8(receiptRlp[offset]) - 0xf7); } else { @@ -261,7 +280,7 @@ library ReceiptValidator { // Status must be 0x01 (success) // 0x80 means empty byte string (status = 0, failed) // 0x01 means single byte with value 1 (success) - require(statusByte == 0x01, "Receipt status is not success"); + if (statusByte != 0x01) revert ReceiptStatusNotSuccess(); return true; } @@ -286,26 +305,27 @@ library ReceiptValidator { } else if (txType == 0x02) { toIndex = 5; // EIP-1559: [chainId, nonce, maxPriorityFee, maxFee, gasLimit, to, value, ...] } else { - revert("Unsupported tx type"); + revert UnsupportedTxType(); } } // Skip list prefix - require(uint8(txRlp[offset]) >= 0xc0, "Invalid tx RLP"); + if (uint8(txRlp[offset]) < 0xc0) revert InvalidRLP(); offset += uint8(txRlp[offset]) >= 0xf8 ? 1 + (uint8(txRlp[offset]) - 0xf7) : 1; // Skip to 'to' field - for (uint256 i = 0; i < toIndex; i++) { + for (uint256 i = 0; i < toIndex;) { offset = txRlp.skipItem(offset); + unchecked { ++i; } } // Validate 'to' address (0x94 prefix = 20 byte string) - require(uint8(txRlp[offset]) == 0x94, "Invalid to address"); + if (uint8(txRlp[offset]) != 0x94) revert InvalidAddress(); address to; assembly { to := shr(96, calldataload(add(txRlp.offset, add(offset, 1)))) } - require(to == expectedRecipient, "Recipient mismatch"); + if (to != expectedRecipient) revert RecipientMismatch(); offset += 21; // Validate 'value' @@ -317,11 +337,12 @@ library ReceiptValidator { value = 0; } else { uint256 len = prefix - 0x80; - for (uint256 i = 0; i < len; i++) { + for (uint256 i = 0; i < len;) { value = (value << 8) | uint8(txRlp[offset + 1 + i]); + unchecked { ++i; } } } - require(value == expectedAmount, "Amount mismatch"); + if (value != expectedAmount) revert AmountMismatch(); return true; } diff --git a/test/EscrowERC20.t.sol b/test/EscrowERC20.t.sol index 9d8e20e..06e28be 100644 --- a/test/EscrowERC20.t.sol +++ b/test/EscrowERC20.t.sol @@ -3,6 +3,7 @@ pragma solidity ^0.8.30; import {Test, console} from "forge-std/Test.sol"; import {EscrowERC20} from "../src/EscrowERC20.sol"; +import {EscrowBase} from "../src/EscrowBase.sol"; contract MockERC20 { mapping(address => uint256) public balanceOf; @@ -103,7 +104,7 @@ contract EscrowERC20Test is Test { EscrowERC20 unfundedEscrow = new EscrowERC20(address(token), recipient, EXPECTED_AMOUNT, 0, 0); token.approve(address(unfundedEscrow), PAYMENT_AMOUNT); - vm.expectRevert("Reward amount must be non-zero"); + vm.expectRevert(EscrowERC20.ZeroRewardAmount.selector); unfundedEscrow.fund(0, PAYMENT_AMOUNT); vm.stopPrank(); } @@ -111,7 +112,7 @@ contract EscrowERC20Test is Test { function testFundOnlyDeployer() public { vm.startPrank(executor); token.approve(address(escrow), REWARD_AMOUNT + PAYMENT_AMOUNT); - vm.expectRevert("Only callable by the deployer"); + vm.expectRevert(EscrowBase.OnlyDeployer.selector); escrow.fund(REWARD_AMOUNT, PAYMENT_AMOUNT); vm.stopPrank(); } @@ -120,7 +121,7 @@ contract EscrowERC20Test is Test { // Escrow is already funded in setUp, so any fund() call should revert vm.startPrank(deployer); token.approve(address(escrow), REWARD_AMOUNT + PAYMENT_AMOUNT); - vm.expectRevert("Contract already funded"); + vm.expectRevert(EscrowERC20.AlreadyFunded.selector); escrow.fund(REWARD_AMOUNT, PAYMENT_AMOUNT); vm.stopPrank(); } @@ -145,7 +146,7 @@ contract EscrowERC20Test is Test { vm.startPrank(executor); token.approve(address(unfundedEscrow), BOND_AMOUNT); - vm.expectRevert("Contract not funded"); + vm.expectRevert(EscrowBase.NotFunded.selector); unfundedEscrow.bond(BOND_AMOUNT); vm.stopPrank(); } @@ -156,7 +157,7 @@ contract EscrowERC20Test is Test { vm.startPrank(executor); token.approve(address(escrow), BOND_AMOUNT); - vm.expectRevert("Cancellation requested"); + vm.expectRevert(EscrowBase.CancellationRequested.selector); escrow.bond(BOND_AMOUNT); vm.stopPrank(); } @@ -164,7 +165,7 @@ contract EscrowERC20Test is Test { function testBondInsufficientAmount() public { vm.startPrank(executor); token.approve(address(escrow), BOND_AMOUNT / 4); - vm.expectRevert("Bond must be at least half of reward amount"); + vm.expectRevert(EscrowBase.InsufficientBond.selector); escrow.bond(BOND_AMOUNT / 4); vm.stopPrank(); } @@ -200,7 +201,7 @@ contract EscrowERC20Test is Test { vm.startPrank(other); token.approve(address(escrow), type(uint256).max); - vm.expectRevert("Bond must be at least half of reward amount"); + vm.expectRevert(EscrowBase.InsufficientBond.selector); escrow.bond(BOND_AMOUNT); escrow.bond(minimumRequiredBond); @@ -221,7 +222,7 @@ contract EscrowERC20Test is Test { function testRequestCancellationOnlyDeployer() public { vm.prank(executor); - vm.expectRevert("Only callable by the deployer"); + vm.expectRevert(EscrowBase.OnlyDeployer.selector); escrow.requestCancellation(); } @@ -240,7 +241,7 @@ contract EscrowERC20Test is Test { escrow.requestCancellation(); vm.prank(executor); - vm.expectRevert("Only callable by the deployer"); + vm.expectRevert(EscrowBase.OnlyDeployer.selector); escrow.resume(); } @@ -265,7 +266,7 @@ contract EscrowERC20Test is Test { }); vm.prank(executor); - vm.expectRevert("Contract not funded"); + vm.expectRevert(EscrowBase.NotFunded.selector); unfundedEscrow.collect(dummyProof, block.number - 1); } @@ -277,7 +278,7 @@ contract EscrowERC20Test is Test { }); vm.prank(other); - vm.expectRevert("Only bonded executor can collect"); + vm.expectRevert(EscrowBase.OnlyBondedExecutor.selector); escrow.collect(dummyProof, block.number - 1); } @@ -291,7 +292,7 @@ contract EscrowERC20Test is Test { }); vm.prank(executor); - vm.expectRevert("Only bonded executor can collect"); + vm.expectRevert(EscrowBase.OnlyBondedExecutor.selector); escrow.collect(dummyProof, block.number - 1); } @@ -312,13 +313,13 @@ contract EscrowERC20Test is Test { EscrowERC20 unfundedEscrow = new EscrowERC20(address(token), recipient, EXPECTED_AMOUNT, 0, 0); vm.prank(deployer); - vm.expectRevert("Contract not funded"); + vm.expectRevert(EscrowBase.NotFunded.selector); unfundedEscrow.withdraw(); } function testWithdrawOnlyDeployer() public { vm.prank(executor); - vm.expectRevert("Only callable by the deployer"); + vm.expectRevert(EscrowBase.OnlyDeployer.selector); escrow.withdraw(); } @@ -326,7 +327,7 @@ contract EscrowERC20Test is Test { _bondExecutor(); vm.prank(deployer); - vm.expectRevert("Cannot reset while bond is active"); + vm.expectRevert(EscrowBase.BondActive.selector); escrow.withdraw(); } @@ -356,7 +357,7 @@ contract EscrowERC20Test is Test { vm.startPrank(other); token.approve(address(escrow), BOND_AMOUNT); - vm.expectRevert("Another executor is already bonded"); + vm.expectRevert(EscrowBase.ExecutorAlreadyBonded.selector); escrow.bond(BOND_AMOUNT); vm.stopPrank(); } @@ -369,7 +370,7 @@ contract EscrowERC20Test is Test { vm.startPrank(other); token.approve(address(escrow), BOND_AMOUNT); - vm.expectRevert("Another executor is already bonded"); + vm.expectRevert(EscrowBase.ExecutorAlreadyBonded.selector); escrow.bond(BOND_AMOUNT); vm.stopPrank(); diff --git a/test/EscrowNative.t.sol b/test/EscrowNative.t.sol index 5f8a72d..de790cd 100644 --- a/test/EscrowNative.t.sol +++ b/test/EscrowNative.t.sol @@ -3,6 +3,8 @@ pragma solidity ^0.8.30; import {Test} from "forge-std/Test.sol"; import {EscrowNative} from "../src/EscrowNative.sol"; +import {EscrowBase} from "../src/EscrowBase.sol"; +import {ReceiptValidator} from "../src/ReceiptValidator.sol"; contract EscrowNativeTest is Test { EscrowNative public escrow; @@ -49,7 +51,7 @@ contract EscrowNativeTest is Test { function testConstructorNativeIncorrectAmount() public { vm.prank(deployer); - vm.expectRevert("Incorrect ETH amount"); + vm.expectRevert(EscrowNative.IncorrectETHAmount.selector); new EscrowNative{value: 0.5 ether}( // Wrong amount - should be 1 ether recipient, EXPECTED_AMOUNT, REWARD_AMOUNT, PAYMENT_AMOUNT ); @@ -57,7 +59,7 @@ contract EscrowNativeTest is Test { function testConstructorNativeZeroValueWithAmounts() public { vm.prank(deployer); - vm.expectRevert("Incorrect ETH amount"); + vm.expectRevert(EscrowNative.IncorrectETHAmount.selector); new EscrowNative{value: 0}(recipient, EXPECTED_AMOUNT, REWARD_AMOUNT, PAYMENT_AMOUNT); } @@ -82,7 +84,7 @@ contract EscrowNativeTest is Test { vm.startPrank(deployer); EscrowNative unfundedEscrow = new EscrowNative(recipient, EXPECTED_AMOUNT, 0, 0); - vm.expectRevert("Reward amount must be non-zero"); + vm.expectRevert(EscrowNative.ZeroRewardAmount.selector); unfundedEscrow.fund{value: PAYMENT_AMOUNT}(0, PAYMENT_AMOUNT); vm.stopPrank(); } @@ -92,13 +94,13 @@ contract EscrowNativeTest is Test { EscrowNative unfundedEscrow = new EscrowNative(recipient, EXPECTED_AMOUNT, 0, 0); vm.prank(executor); - vm.expectRevert("Only callable by the deployer"); + vm.expectRevert(EscrowBase.OnlyDeployer.selector); unfundedEscrow.fund{value: REWARD_AMOUNT + PAYMENT_AMOUNT}(REWARD_AMOUNT, PAYMENT_AMOUNT); } function testFundNativeAlreadyFunded() public { vm.prank(deployer); - vm.expectRevert("Contract already funded"); + vm.expectRevert(EscrowNative.AlreadyFunded.selector); escrow.fund{value: REWARD_AMOUNT + PAYMENT_AMOUNT}(REWARD_AMOUNT, PAYMENT_AMOUNT); } @@ -106,7 +108,7 @@ contract EscrowNativeTest is Test { vm.startPrank(deployer); EscrowNative unfundedEscrow = new EscrowNative(recipient, EXPECTED_AMOUNT, 0, 0); - vm.expectRevert("Incorrect ETH amount"); + vm.expectRevert(EscrowNative.IncorrectETHAmount.selector); unfundedEscrow.fund{value: 0.5 ether}(REWARD_AMOUNT, PAYMENT_AMOUNT); vm.stopPrank(); } @@ -127,7 +129,7 @@ contract EscrowNativeTest is Test { EscrowNative unfundedEscrow = new EscrowNative(recipient, EXPECTED_AMOUNT, 0, 0); vm.prank(executor); - vm.expectRevert("Contract not funded"); + vm.expectRevert(EscrowBase.NotFunded.selector); unfundedEscrow.bond{value: BOND_AMOUNT}(); } @@ -136,13 +138,13 @@ contract EscrowNativeTest is Test { escrow.requestCancellation(); vm.prank(executor); - vm.expectRevert("Cancellation requested"); + vm.expectRevert(EscrowBase.CancellationRequested.selector); escrow.bond{value: BOND_AMOUNT}(); } function testBondNativeInsufficientAmount() public { vm.prank(executor); - vm.expectRevert("Bond must be at least half of reward amount"); + vm.expectRevert(EscrowBase.InsufficientBond.selector); escrow.bond{value: BOND_AMOUNT / 4}(); } @@ -174,7 +176,7 @@ contract EscrowNativeTest is Test { vm.startPrank(other); - vm.expectRevert("Bond must be at least half of reward amount"); + vm.expectRevert(EscrowBase.InsufficientBond.selector); escrow.bond{value: BOND_AMOUNT}(); escrow.bond{value: minimumRequiredBond}(); @@ -217,7 +219,7 @@ contract EscrowNativeTest is Test { }); vm.prank(executor); - vm.expectRevert("Contract not funded"); + vm.expectRevert(EscrowBase.NotFunded.selector); unfundedEscrow.collect(dummyProof, block.number - 1); } @@ -234,7 +236,7 @@ contract EscrowNativeTest is Test { }); vm.prank(other); - vm.expectRevert("Only bonded executor can collect"); + vm.expectRevert(EscrowBase.OnlyBondedExecutor.selector); escrow.collect(dummyProof, block.number - 1); } @@ -253,7 +255,7 @@ contract EscrowNativeTest is Test { }); vm.prank(executor); - vm.expectRevert("Only bonded executor can collect"); + vm.expectRevert(EscrowBase.OnlyBondedExecutor.selector); escrow.collect(dummyProof, block.number - 1); } @@ -274,13 +276,13 @@ contract EscrowNativeTest is Test { EscrowNative unfundedEscrow = new EscrowNative(recipient, EXPECTED_AMOUNT, 0, 0); vm.prank(deployer); - vm.expectRevert("Contract not funded"); + vm.expectRevert(EscrowBase.NotFunded.selector); unfundedEscrow.withdraw(); } function testWithdrawNativeOnlyDeployer() public { vm.prank(executor); - vm.expectRevert("Only callable by the deployer"); + vm.expectRevert(EscrowBase.OnlyDeployer.selector); escrow.withdraw(); } @@ -288,7 +290,7 @@ contract EscrowNativeTest is Test { _bondExecutor(); vm.prank(deployer); - vm.expectRevert("Cannot reset while bond is active"); + vm.expectRevert(EscrowBase.BondActive.selector); escrow.withdraw(); } @@ -317,7 +319,7 @@ contract EscrowNativeTest is Test { _bondExecutor(); vm.prank(other); - vm.expectRevert("Another executor is already bonded"); + vm.expectRevert(EscrowBase.ExecutorAlreadyBonded.selector); escrow.bond{value: BOND_AMOUNT}(); } @@ -328,7 +330,7 @@ contract EscrowNativeTest is Test { assertTrue(escrow.is_bonded()); vm.prank(other); - vm.expectRevert("Another executor is already bonded"); + vm.expectRevert(EscrowBase.ExecutorAlreadyBonded.selector); escrow.bond{value: BOND_AMOUNT}(); assertEq(escrow.bondedExecutor(), executor); @@ -414,7 +416,7 @@ contract EscrowNativeTest is Test { } // Helper contract to test ReceiptValidator with calldata -import {ReceiptValidator} from "../src/ReceiptValidator.sol"; +// ReceiptValidator is already imported below for the wrapper contract ReceiptValidatorWrapper { function validateReceiptStatus(bytes calldata receiptRlp) external pure returns (bool) { @@ -449,7 +451,7 @@ contract ReceiptValidatorTest is Test { hex"02f901a880840114e0a3b9010000000000000000000000000000000880000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000010000000000000200000000000004000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000001000000000000000000000000000f89df89b94be41a9ec942d5b52be07cc7f4d7e30e10e9b652af863a0ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa0000000000000000000000000e1a9d9c9abb872ddef70a4d108fd8fc3c7ce4dc4a0000000000000000000000000658d9c76ff358984d6436ea11ee1eda08894c818a000000000000000000000000000000000000000000000000000000000017d7840"; // Should revert with "Receipt status is not success" - vm.expectRevert("Receipt status is not success"); + vm.expectRevert(ReceiptValidator.ReceiptStatusNotSuccess.selector); wrapper.validateReceiptStatus(failedReceipt); } @@ -470,7 +472,7 @@ contract ReceiptValidatorTest is Test { bytes memory legacyFailedReceipt = hex"f901a880840114e0a3b9010000000000000000000000000000000880000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000010000000000000200000000000004000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000001000000000000000000000000000f89df89b94be41a9ec942d5b52be07cc7f4d7e30e10e9b652af863a0ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa0000000000000000000000000e1a9d9c9abb872ddef70a4d108fd8fc3c7ce4dc4a0000000000000000000000000658d9c76ff358984d6436ea11ee1eda08894c818a000000000000000000000000000000000000000000000000000000000017d7840"; - vm.expectRevert("Receipt status is not success"); + vm.expectRevert(ReceiptValidator.ReceiptStatusNotSuccess.selector); wrapper.validateReceiptStatus(legacyFailedReceipt); } } diff --git a/test/Tempo.t.sol b/test/Tempo.t.sol index c08f06f..91933a6 100644 --- a/test/Tempo.t.sol +++ b/test/Tempo.t.sol @@ -79,17 +79,17 @@ contract TempoTest is Test { } function testRejectWrongAmount() public { - vm.expectRevert("Transfer amount mismatch"); + vm.expectRevert(ReceiptValidator.AmountMismatch.selector); validator.validateTransferInReceipt(RECEIPT_RLP, 0, TOKEN, TO_ADDRESS, AMOUNT + 1); } function testRejectWrongRecipient() public { - vm.expectRevert("To address mismatch"); + vm.expectRevert(ReceiptValidator.ToAddressMismatch.selector); validator.validateTransferInReceipt(RECEIPT_RLP, 0, TOKEN, address(0xdead), AMOUNT); } function testRejectWrongToken() public { - vm.expectRevert("Wrong token contract"); + vm.expectRevert(ReceiptValidator.WrongTokenContract.selector); validator.validateTransferInReceipt(RECEIPT_RLP, 0, address(0xbeef), TO_ADDRESS, AMOUNT); } From f9d6626d2e86e94ae3eb914641867a2aacc8b57f Mon Sep 17 00:00:00 2001 From: ozwaldorf Date: Sat, 7 Feb 2026 19:32:20 -0500 Subject: [PATCH 5/9] optimize: inline constant, save 60 bytes --- src/EscrowBase.sol | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/EscrowBase.sol b/src/EscrowBase.sol index 30b9cc2..c0c2732 100644 --- a/src/EscrowBase.sol +++ b/src/EscrowBase.sol @@ -29,7 +29,7 @@ abstract contract EscrowBase { // The following variables are for Merkle proof validation address public immutable expectedRecipient; // The intended recipient of the transfer uint256 public immutable expectedAmount; // The expected transfer amount - uint256 public immutable maxBlockLookback; // Maximum blocks to look back for validation + uint256 public constant MAX_BLOCK_LOOKBACK = 256; // Maximum blocks to look back for validation // The following variables are dynamically adjusted by the contract when a bond or cancellation request is submitted. address public bondedExecutor; @@ -43,7 +43,6 @@ abstract contract EscrowBase { expectedRecipient = _expectedRecipient; expectedAmount = _expectedAmount; deployerAddress = msg.sender; - maxBlockLookback = 256; } // only deployer can call this. will set the cancellation request to true. @@ -70,7 +69,7 @@ abstract contract EscrowBase { if (!funded) revert NotFunded(); if (msg.sender != bondedExecutor || !is_bonded()) revert OnlyBondedExecutor(); if (targetBlockNumber > block.number) revert TargetBlockInFuture(); - if (block.number - targetBlockNumber > maxBlockLookback) revert TargetBlockTooOld(); + if (block.number - targetBlockNumber > MAX_BLOCK_LOOKBACK) revert TargetBlockTooOld(); bytes32 targetBlockHash = blockhash(targetBlockNumber); if (targetBlockHash == bytes32(0)) revert BlockHashUnavailable(); From 79950caaae19e7be38df0d74fc40848bd485cb64 Mon Sep 17 00:00:00 2001 From: ozwaldorf Date: Sat, 7 Feb 2026 19:35:20 -0500 Subject: [PATCH 6/9] chore: mark functions external instead of public --- src/EscrowBase.sol | 4 ++-- src/EscrowERC20.sol | 6 +++--- src/EscrowNative.sol | 8 ++++---- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/src/EscrowBase.sol b/src/EscrowBase.sol index c0c2732..c6f0f85 100644 --- a/src/EscrowBase.sol +++ b/src/EscrowBase.sol @@ -47,14 +47,14 @@ abstract contract EscrowBase { // only deployer can call this. will set the cancellation request to true. // when the cancellation is requested, the bonded executor may still finish their job and collect, but no new executor is accepted after the current bonded one. - function requestCancellation() public { + function requestCancellation() external { if (msg.sender != deployerAddress) revert OnlyDeployer(); cancellationRequest = true; } // sets cancellation request to false, if the caller is deployer. // starts accepting new executors - function resume() public { + function resume() external { if (msg.sender != deployerAddress) revert OnlyDeployer(); cancellationRequest = false; } diff --git a/src/EscrowERC20.sol b/src/EscrowERC20.sol index 5918228..94a3ab5 100644 --- a/src/EscrowERC20.sol +++ b/src/EscrowERC20.sol @@ -64,7 +64,7 @@ contract EscrowERC20 is EscrowBase { } // takes _bondAmount from the caller's balance of the tokenContract. The bondstatus is now bonded, execution deadline is current block timestamp + 5 minutes. Sets bondedexecutor to the caller. Will only accept a bond if the cancellationrequest is set to false, and no one is bonded. - function bond(uint256 _bondAmount) public { + function bond(uint256 _bondAmount) external { // If deadline passed and someone is bonded, add their bond to reward _handleExpiredBond(); @@ -78,7 +78,7 @@ contract EscrowERC20 is EscrowBase { } // Validates a given merkle proof against a recent block hash and checks the Transfer event's contents - function collect(ReceiptProof calldata proof, uint256 targetBlockNumber) public { + function collect(ReceiptProof calldata proof, uint256 targetBlockNumber) external { _validateBlockHeader(proof.blockHeader, targetBlockNumber); // Extract receipts root and verify receipt inclusion @@ -115,7 +115,7 @@ contract EscrowERC20 is EscrowBase { // allows deployer to withdraw all assets except the seized bonds (so the deployer can withdraw only and only what was deposited by deployer in the start function) // only if the contract is not currently bonded (or the execution deadline has passed) - function withdraw() public { + function withdraw() external { _validateWithdraw(); _tryResetBondData(); diff --git a/src/EscrowNative.sol b/src/EscrowNative.sol index 8cbb27b..769afdf 100644 --- a/src/EscrowNative.sol +++ b/src/EscrowNative.sol @@ -41,7 +41,7 @@ contract EscrowNative is EscrowBase { } } - function fund(uint256 _currentRewardAmount, uint256 _currentPaymentAmount) public payable { + function fund(uint256 _currentRewardAmount, uint256 _currentPaymentAmount) external payable { if (msg.sender != deployerAddress) revert OnlyDeployer(); if (funded) revert AlreadyFunded(); if (_currentRewardAmount == 0) revert ZeroRewardAmount(); @@ -54,7 +54,7 @@ contract EscrowNative is EscrowBase { funded = true; } - function bond() public payable { + function bond() external payable { // If deadline passed and someone is bonded, add their bond to reward _handleExpiredBond(); @@ -65,7 +65,7 @@ contract EscrowNative is EscrowBase { // Validates native ETH transfer by proving both transaction inclusion (for to/value) // and receipt inclusion (for status == 1, i.e., successful execution) - function collect(NativeTransferProof calldata proof, uint256 targetBlockNumber) public { + function collect(NativeTransferProof calldata proof, uint256 targetBlockNumber) external { _validateBlockHeader(proof.blockHeader, targetBlockNumber); // Verify transaction inclusion in transactions trie @@ -103,7 +103,7 @@ contract EscrowNative is EscrowBase { // allows deployer to withdraw all assets except the seized bonds (so the deployer can withdraw only and only what was deposited by deployer in the start function) // only if the contract is not currently bonded (or the execution deadline has passed) - function withdraw() public { + function withdraw() external { _validateWithdraw(); _tryResetBondData(); From cce3f08412d54b33c7509460af793ecf5456e541 Mon Sep 17 00:00:00 2001 From: ozwaldorf Date: Mon, 9 Feb 2026 13:39:55 -0500 Subject: [PATCH 7/9] chore: forge fmt --- src/BlockHeaderParser.sol | 36 +++++++++++++++++++++++++++--------- src/EscrowERC20.sol | 3 ++- src/MPTVerifier.sol | 24 ++++++++++++++++++------ src/RLPParser.sol | 33 +++++++++++++++++++++++++-------- src/ReceiptValidator.sol | 36 +++++++++++++++++++++++++++--------- test/EscrowNative.t.sol | 5 +---- 6 files changed, 100 insertions(+), 37 deletions(-) diff --git a/src/BlockHeaderParser.sol b/src/BlockHeaderParser.sol index 6b6349a..d39ec42 100644 --- a/src/BlockHeaderParser.sol +++ b/src/BlockHeaderParser.sol @@ -41,7 +41,9 @@ library BlockHeaderParser { // Tempo: skip first 3 fields (slot, parent_slot, extra) to get to inner header for (uint256 i = 0; i < 3;) { offset = blockHeader.skipItem(offset); - unchecked { ++i; } + unchecked { + ++i; + } } // Now skip the inner header's list prefix @@ -68,7 +70,9 @@ library BlockHeaderParser { // [parentHash, sha3Uncles, miner, stateRoot, transactionsRoot, receiptsRoot, logsBloom, difficulty, number, ...] for (uint256 i = 0; i < 8;) { offset = blockHeader.skipItem(offset); - unchecked { ++i; } + unchecked { + ++i; + } } // Extract block number @@ -78,7 +82,9 @@ library BlockHeaderParser { uint256 blockNumber = 0; for (uint256 i = 0; i < numBytes.length;) { blockNumber = (blockNumber << 8) | uint8(numBytes[i]); - unchecked { ++i; } + unchecked { + ++i; + } } return blockNumber; @@ -96,7 +102,9 @@ library BlockHeaderParser { // [parentHash, sha3Uncles, miner, stateRoot, transactionsRoot, receiptsRoot, ...] for (uint256 i = 0; i < 5;) { offset = blockHeader.skipItem(offset); - unchecked { ++i; } + unchecked { + ++i; + } } // Extract receiptsRoot (32 bytes) @@ -138,7 +146,9 @@ library BlockHeaderParser { result = new bytes(itemLength); for (uint256 i = 0; i < itemLength;) { result[i] = data[offset + 1 + i]; - unchecked { ++i; } + unchecked { + ++i; + } } return (result, 1 + itemLength); } else if (prefix < 0xc0) { @@ -147,12 +157,16 @@ library BlockHeaderParser { uint256 itemLength = 0; for (uint256 i = 0; i < lengthBytes;) { itemLength = (itemLength << 8) | uint8(data[offset + 1 + i]); - unchecked { ++i; } + unchecked { + ++i; + } } result = new bytes(itemLength); for (uint256 i = 0; i < itemLength;) { result[i] = data[offset + 1 + lengthBytes + i]; - unchecked { ++i; } + unchecked { + ++i; + } } return (result, 1 + lengthBytes + itemLength); } else { @@ -179,7 +193,9 @@ library BlockHeaderParser { // Skip first 3 fields to get to stateRoot (index 3) for (uint256 i = 0; i < 3;) { offset = blockHeader.skipItem(offset); - unchecked { ++i; } + unchecked { + ++i; + } } // Extract stateRoot (32 bytes) @@ -213,7 +229,9 @@ library BlockHeaderParser { // Skip first 4 fields to get to transactionsRoot (index 4) for (uint256 i = 0; i < 4;) { offset = blockHeader.skipItem(offset); - unchecked { ++i; } + unchecked { + ++i; + } } // Extract transactionsRoot (32 bytes) diff --git a/src/EscrowERC20.sol b/src/EscrowERC20.sol index 94a3ab5..ad15175 100644 --- a/src/EscrowERC20.sol +++ b/src/EscrowERC20.sol @@ -57,7 +57,8 @@ contract EscrowERC20 is EscrowBase { currentRewardAmount = _currentRewardAmount; originalRewardAmount = _currentRewardAmount; currentPaymentAmount = _currentPaymentAmount; - if (!IERC20(tokenContract).transferFrom(msg.sender, address(this), originalRewardAmount + currentPaymentAmount)) { + if (!IERC20(tokenContract).transferFrom(msg.sender, address(this), originalRewardAmount + currentPaymentAmount)) + { revert TokenTransferFailed(); } funded = true; diff --git a/src/MPTVerifier.sol b/src/MPTVerifier.sol index 45a1363..f1d5f0a 100644 --- a/src/MPTVerifier.sol +++ b/src/MPTVerifier.sol @@ -130,7 +130,9 @@ library MPTVerifier { uint256 items = 0; while (offset < data.length) { offset += data.getItemLength(offset); - unchecked { ++items; } + unchecked { + ++items; + } } return items; } @@ -158,7 +160,9 @@ library MPTVerifier { uint256 valueOffset = nodeOffset; for (uint256 i = 0; i < 16;) { valueOffset += node.getItemLength(valueOffset); - unchecked { ++i; } + unchecked { + ++i; + } } (bytes memory nodeValue,) = node.parseItem(valueOffset); if (keccak256(nodeValue) == keccak256(value)) { @@ -180,7 +184,9 @@ library MPTVerifier { uint256 branchOffset = nodeOffset; for (uint256 i = 0; i < nibble;) { branchOffset += node.getItemLength(branchOffset); - unchecked { ++i; } + unchecked { + ++i; + } } (bytes memory nextHash,) = node.parseItem(branchOffset); @@ -279,14 +285,18 @@ library MPTVerifier { for (uint256 i = 1; i < nodeKey.length;) { result[i * 2 - 1] = bytes1(uint8(nodeKey[i]) >> 4); result[i * 2] = bytes1(uint8(nodeKey[i]) & 0x0f); - unchecked { ++i; } + unchecked { + ++i; + } } } else { result = new bytes(nodeKey.length * 2 - 2); for (uint256 i = 1; i < nodeKey.length;) { result[(i - 1) * 2] = bytes1(uint8(nodeKey[i]) >> 4); result[(i - 1) * 2 + 1] = bytes1(uint8(nodeKey[i]) & 0x0f); - unchecked { ++i; } + unchecked { + ++i; + } } } @@ -314,7 +324,9 @@ library MPTVerifier { if (keyNibble != uint8(nodeKey[i])) { return false; } - unchecked { ++i; } + unchecked { + ++i; + } } return true; diff --git a/src/RLPParser.sol b/src/RLPParser.sol index 4a1fc8e..006ebae 100644 --- a/src/RLPParser.sol +++ b/src/RLPParser.sol @@ -9,6 +9,7 @@ pragma solidity ^0.8.13; library RLPParser { error RLPOffsetOutOfBounds(); error ExpectedBytes32(); + /** * @dev Skip an RLP item and return new offset * @param data The RLP encoded data @@ -32,7 +33,9 @@ library RLPParser { uint256 length = 0; for (uint256 i = 0; i < lengthBytes;) { length = (length << 8) | uint8(data[offset + 1 + i]); - unchecked { ++i; } + unchecked { + ++i; + } } return offset + 1 + lengthBytes + length; } else if (prefix < 0xf8) { @@ -44,7 +47,9 @@ library RLPParser { uint256 length = 0; for (uint256 i = 0; i < lengthBytes;) { length = (length << 8) | uint8(data[offset + 1 + i]); - unchecked { ++i; } + unchecked { + ++i; + } } return offset + 1 + lengthBytes + length; } @@ -73,7 +78,9 @@ library RLPParser { bytes memory result = new bytes(length); for (uint256 i = 0; i < length;) { result[i] = data[offset + 1 + i]; - unchecked { ++i; } + unchecked { + ++i; + } } return (result, 1 + length); } else if (prefix < 0xc0) { @@ -82,12 +89,16 @@ library RLPParser { uint256 length = 0; for (uint256 i = 0; i < lengthBytes;) { length = (length << 8) | uint8(data[offset + 1 + i]); - unchecked { ++i; } + unchecked { + ++i; + } } bytes memory result = new bytes(length); for (uint256 i = 0; i < length;) { result[i] = data[offset + 1 + lengthBytes + i]; - unchecked { ++i; } + unchecked { + ++i; + } } return (result, 1 + lengthBytes + length); } else { @@ -96,7 +107,9 @@ library RLPParser { bytes memory result = new bytes(totalLength); for (uint256 i = 0; i < totalLength;) { result[i] = data[offset + i]; - unchecked { ++i; } + unchecked { + ++i; + } } return (result, totalLength); } @@ -122,7 +135,9 @@ library RLPParser { uint256 length = 0; for (uint256 i = 0; i < lengthBytes;) { length = (length << 8) | uint8(data[offset + 1 + i]); - unchecked { ++i; } + unchecked { + ++i; + } } return 1 + lengthBytes + length; } else if (prefix < 0xf8) { @@ -132,7 +147,9 @@ library RLPParser { uint256 length = 0; for (uint256 i = 0; i < lengthBytes;) { length = (length << 8) | uint8(data[offset + 1 + i]); - unchecked { ++i; } + unchecked { + ++i; + } } return 1 + lengthBytes + length; } diff --git a/src/ReceiptValidator.sol b/src/ReceiptValidator.sol index d7fb7bb..fc85275 100644 --- a/src/ReceiptValidator.sol +++ b/src/ReceiptValidator.sol @@ -59,7 +59,9 @@ library ReceiptValidator { // Skip status, cumulativeGasUsed, bloom to get to logs for (uint256 i = 0; i < 3;) { offset = receiptRlp.skipItem(offset); - unchecked { ++i; } + unchecked { + ++i; + } } // Now at logs array @@ -73,7 +75,9 @@ library ReceiptValidator { // Navigate to target log for (uint256 i = 0; i < logIndex;) { offset = receiptRlp.skipItem(offset); - unchecked { ++i; } + unchecked { + ++i; + } } // Validate the target log @@ -143,7 +147,9 @@ library ReceiptValidator { result = new bytes(20); for (uint256 i = 0; i < 20;) { result[i] = data[offset + 1 + i]; - unchecked { ++i; } + unchecked { + ++i; + } } return (result, 21); } else { @@ -196,7 +202,9 @@ library ReceiptValidator { uint256 logAmount = 0; for (uint256 i = 0; i < dataBytes.length;) { logAmount = (logAmount << 8) | uint8(dataBytes[i]); - unchecked { ++i; } + unchecked { + ++i; + } } if (logAmount != expectedAmount) revert AmountMismatch(); @@ -230,7 +238,9 @@ library ReceiptValidator { result = new bytes(dataLength); for (uint256 i = 0; i < dataLength;) { result[i] = data[offset + 1 + i]; - unchecked { ++i; } + unchecked { + ++i; + } } return (result, 1 + dataLength); } else if (prefix < 0xc0) { @@ -239,12 +249,16 @@ library ReceiptValidator { uint256 dataLength = 0; for (uint256 i = 0; i < lengthBytes;) { dataLength = (dataLength << 8) | uint8(data[offset + 1 + i]); - unchecked { ++i; } + unchecked { + ++i; + } } result = new bytes(dataLength); for (uint256 i = 0; i < dataLength;) { result[i] = data[offset + 1 + lengthBytes + i]; - unchecked { ++i; } + unchecked { + ++i; + } } return (result, 1 + lengthBytes + dataLength); } else { @@ -316,7 +330,9 @@ library ReceiptValidator { // Skip to 'to' field for (uint256 i = 0; i < toIndex;) { offset = txRlp.skipItem(offset); - unchecked { ++i; } + unchecked { + ++i; + } } // Validate 'to' address (0x94 prefix = 20 byte string) @@ -339,7 +355,9 @@ library ReceiptValidator { uint256 len = prefix - 0x80; for (uint256 i = 0; i < len;) { value = (value << 8) | uint8(txRlp[offset + 1 + i]); - unchecked { ++i; } + unchecked { + ++i; + } } } if (value != expectedAmount) revert AmountMismatch(); diff --git a/test/EscrowNative.t.sol b/test/EscrowNative.t.sol index de790cd..570bf99 100644 --- a/test/EscrowNative.t.sol +++ b/test/EscrowNative.t.sol @@ -32,10 +32,7 @@ contract EscrowNativeTest is Test { // Deploy escrow with native ETH funding in constructor vm.prank(deployer); escrow = new EscrowNative{value: REWARD_AMOUNT + PAYMENT_AMOUNT}( - recipient, - EXPECTED_AMOUNT, - REWARD_AMOUNT, - PAYMENT_AMOUNT + recipient, EXPECTED_AMOUNT, REWARD_AMOUNT, PAYMENT_AMOUNT ); } From 6aac821df11d8c22ed36259bf6d331dc8acb1c0e Mon Sep 17 00:00:00 2001 From: ozwaldorf Date: Mon, 9 Feb 2026 13:57:01 -0500 Subject: [PATCH 8/9] feat: split artifact files --- .github/workflows/bytecode.yml | 32 +++++++++++++++----------- .gitignore | 5 +++- artifacts/deployment_bytecode.hex | 1 - artifacts/erc20_deployment.hex | 1 + artifacts/erc20_runtime.hex | 1 + artifacts/native_deployment.hex | 1 + artifacts/native_runtime.hex | 1 + artifacts/runtime_bytecode.hex | 1 - out/Escrow.sol/Escrow.json | 1 - out/EscrowERC20.sol/EscrowERC20.json | 1 + out/EscrowNative.sol/EscrowNative.json | 1 + 11 files changed, 28 insertions(+), 18 deletions(-) delete mode 100644 artifacts/deployment_bytecode.hex create mode 100644 artifacts/erc20_deployment.hex create mode 100644 artifacts/erc20_runtime.hex create mode 100644 artifacts/native_deployment.hex create mode 100644 artifacts/native_runtime.hex delete mode 100644 artifacts/runtime_bytecode.hex delete mode 100644 out/Escrow.sol/Escrow.json create mode 100644 out/EscrowERC20.sol/EscrowERC20.json create mode 100644 out/EscrowNative.sol/EscrowNative.json diff --git a/.github/workflows/bytecode.yml b/.github/workflows/bytecode.yml index 950604c..2f0717a 100644 --- a/.github/workflows/bytecode.yml +++ b/.github/workflows/bytecode.yml @@ -4,13 +4,17 @@ on: pull_request: paths: - "src/**" - - "artifacts/runtime_bytecode.hex" - - "artifacts/deployment_bytecode.hex" + - "artifacts/native_deployment.hex" + - "artifacts/native_runtime.hex" + - "artifacts/erc20_deployment.hex" + - "artifacts/erc20_runtime.hex" push: paths: - "src/**" - - "artifacts/runtime_bytecode.hex" - - "artifacts/deployment_bytecode.hex" + - "artifacts/native_deployment.hex" + - "artifacts/native_runtime.hex" + - "artifacts/erc20_deployment.hex" + - "artifacts/erc20_runtime.hex" workflow_dispatch: jobs: @@ -66,16 +70,16 @@ jobs: if echo "$CHANGED_FILES" | grep -qE '^src/'; then echo "Detected changes in src/." - if echo "$CHANGED_FILES" | grep -qE '^artifacts/deployment_bytecode\.hex$'; then - echo "artifacts/deployment_bytecode.hex changed as expected." - else - echo "::error title=Bytecode not updated::Changes in src/ require an updated artifacts/deployment_bytecode.hex." - exit 1 - fi - if echo "$CHANGED_FILES" | grep -qE '^artifacts/runtime_bytecode\.hex$'; then - echo "artifacts/runtime_bytecode.hex changed as expected." - else - echo "::error title=Bytecode not updated::Changes in src/ require an updated artifacts/runtime_bytecode.hex." + MISSING=() + for f in native_deployment native_runtime erc20_deployment erc20_runtime; do + if echo "$CHANGED_FILES" | grep -qE "^artifacts/${f}\\.hex$"; then + echo "artifacts/${f}.hex changed as expected." + else + MISSING+=("artifacts/${f}.hex") + fi + done + if [[ ${#MISSING[@]} -gt 0 ]]; then + echo "::error title=Bytecode not updated::Changes in src/ require updated artifacts: ${MISSING[*]}" exit 1 fi else diff --git a/.gitignore b/.gitignore index 5ae783c..f835304 100644 --- a/.gitignore +++ b/.gitignore @@ -1,7 +1,10 @@ # Compiler files cache/ -!out/Escrow.sol/Escrow.json out/ +!out/EscrowNative.sol/ +!out/EscrowNative.sol/EscrowNative.json +!out/EscrowERC20.sol/ +!out/EscrowERC20.sol/EscrowERC20.json # Ignores development broadcast logs !/broadcast diff --git a/artifacts/deployment_bytecode.hex b/artifacts/deployment_bytecode.hex deleted file mode 100644 index 2c84439..0000000 --- a/artifacts/deployment_bytecode.hex +++ /dev/null @@ -1 +0,0 @@ -610120806040525f9060a081613da4803803809161001d82856103ab565b83398101031261027757610030816103e2565b9161003d602083016103e2565b92604083015160806060850151940151948260a05260c05260e0523360805261010080528215908115806103a2575b61012c575b60405161398c9081610418823960805181818161019a015281816102e10152818161040b015281816106f10152818161092a0152610bd2015260a0518181816102a8015281816103d901528181610508015281816107b80152818161097501528181610a7c01528181610c1401528181610cea01526122d3015260c051818181610633015281816107430152610d9c015260e051818181610217015281816106110152610d7a015261010051818181610b9701526118230152f35b6001600160a01b03166101b2575061014483836103f6565b340361016d5781905560025560015561010061ff001960075416176007555b5f80808080610071565b60405162461bcd60e51b815260206004820152601460248201527f496e636f72726563742045544820616d6f756e740000000000000000000000006044820152606490fd5b60075492939290915060081c60ff1661035d5760a0516001600160a01b031615610318576102d357801561028e578160646102066020935f958655836002558060015560018060a01b0360a05116936103f6565b60405194859384926323b872dd60e01b845233600485015230602485015260448401525af180156102835761024b575b5061010061ff00196007541617600755610163565b6020813d60201161027b575b81610264602093836103ab565b8101031261027757518015158114610236575b5f80fd5b3d9150610257565b6040513d5f823e3d90fd5b60405162461bcd60e51b815260206004820152601f60248201527f5061796d656e7420616d6f756e74206d757374206265206e6f6e2d7a65726f006044820152606490fd5b60405162461bcd60e51b815260206004820152601e60248201527f52657761726420616d6f756e74206d757374206265206e6f6e2d7a65726f00006044820152606490fd5b60405162461bcd60e51b815260206004820152601d60248201527f5573652066756e644e617469766520666f72206e6174697665204554480000006044820152606490fd5b60405162461bcd60e51b815260206004820152601760248201527f436f6e747261637420616c72656164792066756e6465640000000000000000006044820152606490fd5b5084151561006c565b601f909101601f19168101906001600160401b038211908210176103ce57604052565b634e487b7160e01b5f52604160045260245ffd5b51906001600160a01b038216820361027757565b9190820180921161040357565b634e487b7160e01b5f52601160045260245ffdfe60806040526004361015610011575f80fd5b5f3560e01c8063046f7da2146101845780631aa7c0ec1461017f5780632feef2ec1461017a578063308657d71461017557806333ee5f35146101705780633ccfd60b1461016b57806350431ce4146101665780635922e8f8146101615780635a4fd6451461015c57806380f323a71461015757806381972d00146101525780638677ab231461014d5780638bd03d0a146101485780639940686e14610143578063a65e2cfd1461013e578063ae6c3fcf14610139578063cb766a5614610134578063d415b3f91461012f578063d4899a621461012a578063df23579414610125578063ede7f6a314610120578063f3a504f21461011b5763fe03a46014610116575f80fd5b610e3a565b610e15565b610cb3565b610bba565b610b80565b610b63565b610b3f565b610a4f565b610904565b61078f565b610772565b61072e565b6106db565b6106be565b6106a2565b6104cd565b6103b6565b610279565b61025c565b61023a565b610200565b6101d8565b346101d4575f3660031901126101d4576101c8337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031614610e57565b6007805460ff19169055005b5f80fd5b346101d4575f3660031901126101d4576003546040516001600160a01b039091168152602090f35b346101d4575f3660031901126101d45760206040517f00000000000000000000000000000000000000000000000000000000000000008152f35b346101d4575f3660031901126101d457602060ff600754166040519015158152f35b346101d4575f3660031901126101d4576020600454604051908152f35b346101d4575f3660031901126101d4576007546102a09060081c60ff16610ea3565b610ea3565b5f60206103777f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166102db811515610ee5565b61030f337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031614610e57565b610317611584565b61032660015460025490610f8d565b61033661ff001960075416600755565b61033f5f600155565b84805561034d811515610f9a565b60405163a9059cbb60e01b8152336004820152602481019190915293849283919082906044820190565b03925af180156103b15761038757005b6103a89060203d6020116103aa575b6103a08183610ff2565b810190611019565b005b503d610396565b611031565b346101d4575f3660031901126101d4576103d760ff60075460081c16610ea3565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031661048f57610439337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031614610e57565b610441611584565b6103a85f80808061045760015460025490610f8d565b61046761ff001960075416600755565b6104705f600155565b81805561047e811515610f9a565b335af1610489611058565b50611087565b60405162461bcd60e51b8152602060048201526016602482015275055736520776974686472617720666f722045524332360541b6044820152606490fd5b346101d45760403660031901126101d45760043567ffffffffffffffff81116101d4578060040160c060031983360301126101d457602435917f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166106655761058e826106096106046105fe836105f86105f382608461060e9a61056961065d9e6105636106589f806110c9565b906117d3565b6105b86105b361058261057c86806110c9565b906119f4565b602484019d8e876110c9565b9061059c60448701896110c9565b906105ab60a48901809b6110c9565b949093611adc565b6110fc565b6105ab6105ce6105c888806110c9565b90611b03565b936105ea6105e060648501809a6110c9565b959094018d6110c9565b9290918d6110c9565b611148565b846110c9565b90611c38565b611194565b6110c9565b907f0000000000000000000000000000000000000000000000000000000000000000917f000000000000000000000000000000000000000000000000000000000000000091611dea565b6111df565b6103a8612025565b60405162461bcd60e51b8152602060048201526015602482015274055736520636f6c6c65637420666f7220455243323605c1b6044820152606490fd5b346101d4575f3660031901126101d45760205f54604051908152f35b346101d4575f3660031901126101d4576020600554604051908152f35b346101d4575f3660031901126101d45761071f337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031614610e57565b6007805460ff19166001179055005b346101d4575f3660031901126101d4576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b346101d4575f3660031901126101d4576020600154604051908152f35b346101d45760203660031901126101d4576007546004356107b660ff600884901c16610ea3565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169161080790610802906107fe906107f886151561122b565b60ff1690565b1590565b611277565b60045480151590816108fa575b506108c8575b61082d6108286107fe6114e4565b6112bc565b61084361083b5f5460011c90565b821015611313565b6040516323b872dd60e01b81523360048201523060248201526044810182905291602090839060649082905f905af19182156103b1576103a8926108ab575b50600380546001600160a01b031916331790556108a66108a142610f4f565b600455565b600555565b6108c39060203d6020116103aa576103a08183610ff2565b610882565b6108d56005545f54610f8d565b5f556108ed6108e8600554600654610f8d565b600655565b6108f5611584565b61081a565b905042115f610814565b346101d45760403660031901126101d4575f6020610a0f6004356109d0602435610958337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031614610e57565b61097361096e6107fe60075460ff9060081c1690565b611373565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316926109cb906109ad8515156113bf565b6109b881151561140b565b6109c3831515611457565b808855600255565b600155565b6109df60025460015490610f8d565b6040516323b872dd60e01b8152336004820152306024820152604481019190915293849283919082906064820190565b03925af180156103b157610a32575b6103a861010061ff00196007541617600755565b610a4a9060203d6020116103aa576103a08183610ff2565b610a1e565b5f3660031901126101d457610aaa6108026107fe600754610a7761029b8260ff9060081c1690565b6107f87f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316156114a3565b6004548015159081610b35575b50610b08575b610acb6108286107fe6114e4565b610ae1610ad95f5460011c90565b341015611313565b600380546001600160a01b03191633179055610aff6108a142610f4f565b6103a834600555565b610b156005545f54610f8d565b5f55610b286108e8600554600654610f8d565b610b30611584565b610abd565b905042115f610ab7565b346101d4575f3660031901126101d4576020610b596114e4565b6040519015158152f35b346101d4575f3660031901126101d4576020600254604051908152f35b346101d4575f3660031901126101d45760206040517f00000000000000000000000000000000000000000000000000000000000000008152f35b60403660031901126101d457600435602435610c00337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031614610e57565b610c1260ff60075460081c1615611373565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316610c79576109cb82610c52610a1e94151561140b565b610c5d831515611457565b610c71610c6a8483610f8d565b34146114fc565b805f55600255565b60405162461bcd60e51b815260206004820152601260248201527105573652066756e6420666f722045524332360741b6044820152606490fd5b346101d45760403660031901126101d45760043567ffffffffffffffff81116101d4578060040160a060031983360301126101d4577f00000000000000000000000000000000000000000000000000000000000000009160243591906001600160a01b03841615610dd157610dc993610d7883610d39610dc496610563836084986110c9565b610d466105c882806110c9565b906106096105f36024870193610d5c85856110c9565b90610d6a60448b01876110c9565b906105ab60648d01896110c9565b7f0000000000000000000000000000000000000000000000000000000000000000947f0000000000000000000000000000000000000000000000000000000000000000940135916120d1565b61153f565b6103a8612232565b606460405162461bcd60e51b815260206004820152602060248201527f55736520636f6c6c6563744e617469766520666f72206e6174697665204554486044820152fd5b346101d4575f3660031901126101d457602060ff60075460081c166040519015158152f35b346101d4575f3660031901126101d4576020600654604051908152f35b15610e5e57565b60405162461bcd60e51b815260206004820152601d60248201527f4f6e6c792063616c6c61626c6520627920746865206465706c6f7965720000006044820152606490fd5b15610eaa57565b60405162461bcd60e51b815260206004820152601360248201527210dbdb9d1c9858dd081b9bdd08199d5b991959606a1b6044820152606490fd5b15610eec57565b60405162461bcd60e51b815260206004820152602160248201527f5573652077697468647261774e617469766520666f72206e61746976652045546044820152600960fb1b6064820152608490fd5b634e487b7160e01b5f52601160045260245ffd5b9061012c8201809211610f5e57565b610f3b565b9060018201809211610f5e57565b9060158201809211610f5e57565b6001019081600111610f5e57565b91908201809211610f5e57565b15610fa157565b60405162461bcd60e51b81526020600482015260156024820152744e6f20776974686472617761626c652066756e647360581b6044820152606490fd5b634e487b7160e01b5f52604160045260245ffd5b90601f8019910116810190811067ffffffffffffffff82111761101457604052565b610fde565b908160209103126101d4575180151581036101d45790565b6040513d5f823e3d90fd5b67ffffffffffffffff811161101457601f01601f191660200190565b3d15611082573d906110698261103c565b916110776040519384610ff2565b82523d5f602084013e565b606090565b1561108e57565b60405162461bcd60e51b8152602060048201526013602482015272115512081d1c985b9cd9995c8819985a5b1959606a1b6044820152606490fd5b903590601e19813603018212156101d4570180359067ffffffffffffffff82116101d4576020019181360383136101d457565b1561110357565b60405162461bcd60e51b815260206004820152601d60248201527f496e76616c6964207472616e73616374696f6e204d50542070726f6f660000006044820152606490fd5b1561114f57565b60405162461bcd60e51b815260206004820152601960248201527f496e76616c69642072656365697074204d50542070726f6f66000000000000006044820152606490fd5b1561119b57565b606460405162461bcd60e51b815260206004820152602060248201527f5472616e73616374696f6e206661696c6564202873746174757320213d2031296044820152fd5b156111e657565b60405162461bcd60e51b815260206004820152601760248201527f496e76616c6964206e6174697665207472616e736665720000000000000000006044820152606490fd5b1561123257565b60405162461bcd60e51b815260206004820152601d60248201527f55736520626f6e644e617469766520666f72206e6174697665204554480000006044820152606490fd5b1561127e57565b60405162461bcd60e51b815260206004820152601660248201527510d85b98d95b1b185d1a5bdb881c995c5d595cdd195960521b6044820152606490fd5b156112c357565b60405162461bcd60e51b815260206004820152602260248201527f416e6f74686572206578656375746f7220697320616c726561647920626f6e64604482015261195960f21b6064820152608490fd5b1561131a57565b60405162461bcd60e51b815260206004820152602b60248201527f426f6e64206d757374206265206174206c656173742068616c66206f6620726560448201526a1dd85c9908185b5bdd5b9d60aa1b6064820152608490fd5b1561137a57565b60405162461bcd60e51b815260206004820152601760248201527f436f6e747261637420616c72656164792066756e6465640000000000000000006044820152606490fd5b156113c657565b60405162461bcd60e51b815260206004820152601d60248201527f5573652066756e644e617469766520666f72206e6174697665204554480000006044820152606490fd5b1561141257565b60405162461bcd60e51b815260206004820152601e60248201527f52657761726420616d6f756e74206d757374206265206e6f6e2d7a65726f00006044820152606490fd5b1561145e57565b60405162461bcd60e51b815260206004820152601f60248201527f5061796d656e7420616d6f756e74206d757374206265206e6f6e2d7a65726f006044820152606490fd5b156114aa57565b60405162461bcd60e51b8152602060048201526012602482015271055736520626f6e6420666f722045524332360741b6044820152606490fd5b60045480151590816114f4575090565b905042111590565b1561150357565b60405162461bcd60e51b8152602060048201526014602482015273125b98dbdc9c9958dd0811551208185b5bdd5b9d60621b6044820152606490fd5b1561154657565b60405162461bcd60e51b8152602060048201526016602482015275125b9d985b1a5908151c985b9cd9995c88195d995b9d60521b6044820152606490fd5b61158c6114e4565b6115b1576bffffffffffffffffffffffff60a01b600354166003555f6005555f600455565b60405162461bcd60e51b815260206004820152602160248201527f43616e6e6f74207265736574207768696c6520626f6e642069732061637469766044820152606560f81b6064820152608490fd5b1561160757565b60405162461bcd60e51b815260206004820152601d60248201527f54617267657420626c6f636b20697320696e20746865206675747572650000006044820152606490fd5b600119810191908211610f5e57565b5f19810191908211610f5e57565b91908203918211610f5e57565b1561167d57565b60405162461bcd60e51b815260206004820152601460248201527315185c99d95d08189b1bd8dac81d1bdbc81bdb1960621b6044820152606490fd5b156116c057565b60405162461bcd60e51b815260206004820152601d60248201527f556e61626c6520746f20726574726965766520626c6f636b20686173680000006044820152606490fd5b9291926117118261103c565b9161171f6040519384610ff2565b8294818452818301116101d4578281602093845f960137010152565b1561174257565b60405162461bcd60e51b815260206004820152601a60248201527f426c6f636b206865616465722068617368206d69736d617463680000000000006044820152606490fd5b1561178e57565b60405162461bcd60e51b815260206004820152601c60248201527f48656164657220626c6f636b206e756d626572206d69736d61746368000000006044820152606490fd5b9190916117e760ff60075460081c16610ea3565b6003546001600160a01b03163314806118c2575b1561187e5761187c926118769161181443851115611600565b6118496118218543611669565b7f00000000000000000000000000000000000000000000000000000000000000001015611676565b61187184406118598115156116b9565b611864368585611705565b602081519101201461173b565b612375565b14611787565b565b606460405162461bcd60e51b815260206004820152602060248201527f4f6e6c7920626f6e646564206578656375746f722063616e20636f6c6c6563746044820152fd5b506118cb6114e4565b6117fb565b634e487b7160e01b5f52603260045260245ffd5b90156118ed5790565b6118d0565b908210156118ed570190565b1561190557565b60405162461bcd60e51b815260206004820152601060248201526f125b9d985b1a5908149314081b1a5cdd60821b6044820152606490fd5b60ff60f6199116019060ff8211610f5e57565b60ff607f199116019060ff8211610f5e57565b60ff60bf199116019060ff8211610f5e57565b60ff60b6199116019060ff8211610f5e57565b60ff166001019060ff8211610f5e57565b156119a157565b60405162461bcd60e51b815260206004820152602560248201527f496e76616c6964207472616e73616374696f6e73526f6f7420524c5020656e636044820152646f64696e6760d81b6064820152608490fd5b9091905f611a2c600360fe1b6001600160f81b0319611a24611a1688876118e4565b356001600160f81b03191690565b1610156118fe565b601f60fb1b6001600160f81b0319611a47611a1687866118e4565b1610611ad45780611a7b6107f8611a76611a71611a6b611a16611a81978b8a6118f2565b60f81c90565b61193d565b611989565b90610f8d565b5f5b60048110611abf5750611ab5611aba929394600560fd1b90611aae611a168560ff60f81b93896118f2565b161461199a565b610f63565b013590565b90611acd6001918685612429565b9101611a83565b506001611a81565b611af2611afa92939495611b0098973691611705565b923691611705565b906125dd565b90565b90611b0e81836127d9565b905f5b60058110611b955750600560fd1b906001600160f81b031990611b36908490866118f2565b351603611b4657611aba90610f63565b60405162461bcd60e51b815260206004820152602160248201527f496e76616c6964207265636569707473526f6f7420524c5020656e636f64696e6044820152606760f81b6064820152608490fd5b91611ba36001918386612429565b9201611b11565b15611bb157565b60405162461bcd60e51b81526020600482015260136024820152720496e76616c6964207265636569707420524c5606c1b6044820152606490fd5b15611bf357565b60405162461bcd60e51b815260206004820152601d60248201527f5265636569707420737461747573206973206e6f7420737563636573730000006044820152606490fd5b60ff611cb6611a6b611a16600194611cbd965f81151580611cd2575b611ccb575b611c7860c088611c70611a6b611a1686888a6118f2565b161015611baa565b60f887611c8c611a6b611a168587896118f2565b1610611cc25780611a7b6107f8611a76611a71611a6b611a16611cb097898b6118f2565b916118f2565b1614611bec565b600190565b611cb090610f63565b5086611c59565b50608087611ce6611a6b611a1686886118e4565b1610611c54565b15611cf457565b60405162461bcd60e51b815260206004820152600e60248201526d0496e76616c696420747820524c560941b6044820152606490fd5b15611d3157565b60405162461bcd60e51b8152602060048201526012602482015271496e76616c696420746f206164647265737360701b6044820152606490fd5b15611d7257565b60405162461bcd60e51b81526020600482015260126024820152710a4cac6d2e0d2cadce840dad2e6dac2e8c6d60731b6044820152606490fd5b15611db357565b60405162461bcd60e51b815260206004820152600f60248201526e082dadeeadce840dad2e6dac2e8c6d608b1b6044820152606490fd5b90916003905f84151580612009575b611f8c575b80611e2260c060ff611e1a611a6b611a16611e5d978c8c6118f2565b161015611ced565b60f860ff611e37611a6b611a16858b8b6118f2565b1610611f835760ff611e56611a76611a71611a6b611a16868c8c6118f2565b1690610f8d565b915f905b808210611f6c57505090611eaa611eaf92611e91609460ff611e8a611a6b611a16888c8c6118f2565b1614611d2a565b6001600160a01b03166001838601013560601c14611d6b565b610f71565b91611ec1611a6b611a168584866118f2565b925f9260ff851694608086105f14611ee457505050505090611cbd915b14611dac565b90919293946080145f14611f01575050505050611cbd905f611ede565b6107f8611f1091939293611950565b915f935b838510611f2a57505050505090611cbd91611ede565b9091929394611f3b60019160081b90565b611f606107f8611a6b611a16611f598b611f548b610f63565b610f8d565b87896118f2565b17950193929190611f14565b9092611f7b6001918787612429565b930190611e61565b60ff6001611e56565b509050611f9f611a6b611a1685856118e4565b6001919060ff16808303611fbc5750611e5d6004925b9050611dfe565b600203611fce57611e5d600592611fb5565b60405162461bcd60e51b8152602060048201526013602482015272556e737570706f72746564207478207479706560681b6044820152606490fd5b50608060ff61201e611a6b611a1689896118e4565b1610611df9565b6005545f548101809111610f5e576001548101809111610f5e575f80808061187c946003546bffffffffffffffffffffffff60a01b8116600355826005558260045561207761ff001960075416600755565b60018390558280556001600160a01b03165af1610489611058565b1561209957565b60405162461bcd60e51b815260206004820152601060248201526f0496e76616c6964206c6f677320524c560841b6044820152606490fd5b959493929190805f818981151580612216575b61220d575b60ff611c70611a6b611a16866121019660c0966118f2565b8860f860ff612117611a6b611a168688876118f2565b16106121fb576107f8611a76611a71611a6b611a168661213a98611a7b976118f2565b81905b885f5b600381106121e2575060c06121626107f8611a6b611a168688612169976118f2565b1015612092565b8860f86121806107f8611a6b611a168688876118f2565b106121d1576107f8611a76611a71611a6b611a16866121a298611a7b976118f2565b915b5f905b8082106121ba575050611b0095966129c0565b90926121c9600191848b612429565b9301906121a7565b506121dc9150610f63565b916121a4565b92916001926121f092612429565b910190888392612140565b506122069150610f63565b819061213d565b600192506120e9565b50608060ff61222b611a6b611a1686866118e4565b16106120e4565b61224c6122436005545f5490610f8d565b60015490610f8d565b6003546001600160a01b0316600380546001600160a01b03191690556122715f600555565b61227a5f600455565b61228a61ff001960075416600755565b6122935f600155565b5f80554662aa36a70361232557604051633419e74d60e21b81526001600160a01b039091166004820152602481019190915260208180604481015b03815f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165af180156103b15761230a5750565b6123229060203d6020116103aa576103a08183610ff2565b50565b60405163a9059cbb60e01b81526001600160a01b039091166004820152602481019190915260208180604481016122ce565b8051156118ed5760200190565b9081518110156118ed570160200190565b919061238181846127d9565b905f5b600881106123c857506123979293612aeb565b50905f805b83518210156123c3576001906123b28386612364565b5160f81c9060081b1791019061239c565b925050565b916123d66001918387612429565b9201612384565b156123e457565b60405162461bcd60e51b815260206004820152601860248201527f524c50206f6666736574206f7574206f6620626f756e647300000000000000006044820152606490fd5b91906124368183106123dd565b612447611a6b611a168484876118f2565b9060ff8216608081101561246257505050611b009150610f63565b91929160b881101561248a575050611b0092506107f8612484611a7b92610f63565b92611950565b90929060c081101561250057506107f86124a691949394611976565b915f935f915b8483106124c757505050611b009291611f54611f5492610f63565b9091946124d660019160081b90565b6124f66107f8611a6b611a166124ef8b611f548b610f63565b88886118f2565b17950191906124ac565b90929060f811156125265750611b0092506107f8612520611a7b92610f63565b92611963565b92916107f86125349161193d565b915f935f915b84831061255557505050611b009291611f54611f5492610f63565b90919461256460019160081b90565b61257d6107f8611a6b611a166124ef8b611f548b610f63565b179501919061253a565b1561258e57565b60405162461bcd60e51b815260206004820152602160248201527f457870656374656420524c50206c69737420666f722070726f6f66206e6f64656044820152607360f81b6064820152608490fd5b919390929190612609600360fe1b6001600160f81b0319612601611a16878a6118e4565b161015612587565b601f60fb1b6001600160f81b0319612624611a1686896118e4565b1610612783576126486126436107f8611a71611a6b611a16888b6118e4565b610f7f565b9492905b945f5b82821061266157505050505050505f90565b61267f6126788361267336878a611705565b612c95565b9093610f8d565b96825160208401200361272157600360fe1b6126bb6126ae6126a085612357565b516001600160f81b03191690565b6001600160f81b03191690565b10612721578590846001601f60fb1b6126d96126ae6126a088612357565b1015612765575b6126ea8186612e1f565b6011810361272c57506126fc94612fb1565b9491156127215784156127155793915b9195909361264f565b50505050505050600190565b505050505050505f90565b9093506002141590506127595784879261274594612e6b565b94911561272157841561271557939161270c565b50505050505050505f90565b5061277e6126436107f8611a71611a6b6126a089612357565b6126e0565b600194929061264c565b1561279457565b60405162461bcd60e51b815260206004820152601d60248201527f496e76616c696420696e6e65722068656164657220524c50206c6973740000006044820152606490fd5b5f6127f8600360fe1b6001600160f81b0319611a24611a1687876118e4565b601f60fb1b6001600160f81b0319612813611a1686866118e4565b16106128ea5780611a7b6107f8611a76611a71611a6b611a16612837978a8a6118f2565b905b61a5bd461480156128df575b612850575b50905090565b5f5b600381106128ca575061287b600360fe1b6128746126ae611a168688876118f2565b101561278d565b601f60fb1b6128916126ae611a168587866118f2565b106128ba576107f8611a76611a71611a6b611a16866128b398611a7b976118f2565b805f61284a565b506128c59150610f63565b6128b3565b916128d86001918584612429565b9201612852565b5061a5bf4614612845565b50600190612839565b156128fa57565b60405162461bcd60e51b815260206004820152600f60248201526e0496e76616c6964206c6f6720524c5608c1b6044820152606490fd5b1561293857565b60405162461bcd60e51b815260206004820152601e60248201527f496e76616c696420656d69747465722061646472657373206c656e67746800006044820152606490fd5b1561298457565b60405162461bcd60e51b815260206004820152601460248201527315dc9bdb99c81d1bdad95b8818dbdb9d1c9858dd60621b6044820152606490fd5b916014611b00969594611f5484612a5c9487816129f360c060ff6129eb611a6b611a16868a896118f2565b1610156128f3565b60f860ff612a08611a6b611a168589886118f2565b1610612a6257506107f8611a76611a71611a6b611a1686612a2c98611a7b976118f2565b915b612a398387896130c6565b9490612a4782825114612931565b01516001600160a01b0390811691161461297d565b916132d0565b915050612a6f9150610f63565b91612a2e565b60408051909190612a868382610ff2565b6001815291601f1901366020840137565b60408051909190612aa88382610ff2565b6014815291601f1901366020840137565b90612ac38261103c565b612ad06040519182610ff2565b8281528092612ae1601f199161103c565b0190602036910137565b612af68284106123dd565b612b07611a6b611a168585856118f2565b9260ff84166080811015612b415750505050612b21612a75565b9060f81b6001600160f81b0319165f1a612b3a82612357565b5390600190565b60b881969592939496105f14612baf57506107f8612b5e91611950565b91612b6883612ab9565b945f5b848110612b7f5750505050611b0090610f7f565b80612b9c611a16612b95600194611f5489610f63565b85876118f2565b5f1a612ba8828a612364565b5301612b6b565b60c01115612c50576107f8612bc391611976565b905f925f5b838110612c215750612bd984612ab9565b955f5b858110612bf4575050505090611f54611b0092610f7f565b80612c0e611a16612b95600194611f548a611f548b610f63565b5f1a612c1a828b612364565b5301612bdc565b9360019060081b612c486107f8611a6b611a16612c418a611f548a610f63565b8c886118f2565b179401612bc8565b60405162461bcd60e51b815260206004820152601e60248201527f457870656374656420737472696e67206974656d2c20676f74206c69737400006044820152606490fd5b612ca1815183106123dd565b612cb1611a6b6126a08484612364565b9160ff83166080811015612cca57505050612b21612a75565b919392909160b8811015612d3457506107f8612ce591611950565b90612cef82612ab9565b935f5b838110612d0557505050611b0090610f7f565b80612d216126a0612d1b600194611f5488610f63565b85612364565b5f1a612d2d8289612364565b5301612cf2565b60c01115612dd2576107f8612d4891611976565b5f915f5b828110612da45750612d5d83612ab9565b945f5b848110612d775750505090611f54611b0092610f7f565b80612d916126a0612d1b600194611f5489611f548a610f63565b5f1a612d9d828a612364565b5301612d60565b9260019060081b612dca6107f8611a6b6126a0612dc489611f5489610f63565b8b612364565b179301612d4c565b5091612dde8382613416565b92612de884612ab9565b915f5b858110612df9575050509190565b80612e0c6126a0612d1b60019487610f8d565b5f1a612e188287612364565b5301612deb565b5f915b8151811015612e5057612e358183613416565b8101809111610f5e57915f198114610f5e5760010191612e22565b505090565b908160011b9180830460021490151715610f5e57565b83949291612e798183612c95565b9390612e986020612e8f611a6b6126a085612357565b16151591613546565b97889115612f3a5750612eac905187610f8d565b612eb68251612e55565b14612ecb575b505050505050505f905f905f90565b86866001928251612f28575b505050612ee5575b80612ebc565b612ef892612ef291610f8d565b90612c95565b5060208151910120906020815191012014612f165780808080612edf565b612f21915190610f8d565b6001915f90565b612f3293506136aa565b86865f612ed7565b612f4b93949596506107fe926136aa565b612fa457612f5c92612ef291610f8d565b50908151602081145f14612f8457506020612f7c920151925b5190610f8d565b916001929190565b8015612f98576020612f7c93012092612f75565b505050505f905f905f90565b50505050505f905f905f90565b91909293612fbf8251612e55565b8510156130695750611a6b6126a0612fe192612fdb8760011c90565b90612364565b600184166130605760041c600f16915b905f925b60ff81168410613040575061300a9250612c95565b508051801561303557612f7c916020820361302b5760209150015191610f63565b6020012091610f63565b5050505f905f905f90565b9091600161305482611a7b60ff9487613416565b94019392919050612ff5565b600f1691612ff1565b9290509392935f915b601083106130ac576130849250612c95565b50602081519101209060208151910120145f146130a357600191905f90565b5f915081908190565b906130bd81611a7b60019385613416565b92019190613072565b9190916130d48383106123dd565b609460ff6130e9611a6b611a168688876118f2565b1603613135576130f7612a97565b925f5b6014811061310c575050505090601590565b80613122611a16612b95600194611f5489610f63565b5f1a61312e8288612364565b53016130fa565b60405162461bcd60e51b815260206004820152601c60248201527f496e76616c6964206164647265737320524c5020656e636f64696e67000000006044820152606490fd5b1561318157565b60405162461bcd60e51b81526020600482015260126024820152710496e76616c696420746f7069637320524c560741b6044820152606490fd5b156131c257565b60405162461bcd60e51b815260206004820152601560248201527457726f6e67206576656e74207369676e617475726560581b6044820152606490fd5b1561320657565b60405162461bcd60e51b81526020600482015260136024820152720a8de40c2c8c8e4cae6e640dad2e6dac2e8c6d606b1b6044820152606490fd5b1561324857565b60405162461bcd60e51b8152602060048201526014602482015273416d6f756e74206461746120746f6f206c6f6e6760601b6044820152606490fd5b1561328b57565b60405162461bcd60e51b815260206004820152601860248201527f5472616e7366657220616d6f756e74206d69736d6174636800000000000000006044820152606490fd5b91806133b26133bf9561339f61339361339361338c6133858961337e7fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef6133788e8060f86133b99f61334c611a6b611a168361334560c060ff61333d8f611a16839a611a6b92819e6118f2565b16101561317a565b8b886118f2565b161061340c5780611a7b6107f8611a76611a71611a6b611a16613370978d8a6118f2565b948591613768565b146131bb565b8a8c612429565b898b612429565b888a613768565b6001600160a01b031690565b6001600160a01b039081169116146131ff565b8284612429565b916137da565b506133ce602082511115613241565b5f92835b82518510156133fd5760019060081b6133f46107f8611a6b6126a08988612364565b179401936133d2565b909350611cbd92915014613284565b506133708d610f63565b90613423825182106123dd565b613433611a6b6126a08385612364565b9160ff8316608081101561344a5750505050600190565b60b8811015613465575050506107f8611a76611b0092611950565b60c08110156134d15750916107f861347c91611976565b905f925f915b8383106134995750505090611f54611b0092610f7f565b9091936134a860019160081b90565b6134c76107f8611a6b6126a06134c18a611f5489610f63565b88612364565b1794019190613482565b60f811156134ea5750506107f8611a76611b0092611963565b916107f86134f79161193d565b905f925f915b8383106135145750505090611f54611b0092610f7f565b90919361352360019160081b90565b61353c6107f8611a6b6126a06134c18a611f5489610f63565b17940191906134fd565b9081511561187c5761355d611a6b6126a084612357565b601081161561362c5761358061357b6135768551612e55565b61165b565b612ab9565b9060f81b600f60f81b165f1a61359582612357565b5360015b835181101561362757806135d46135c46135bb611a6b6126a06001968a612364565b60041c600f1690565b60f81b6001600160f81b03191690565b6135ed6135e361357684612e55565b915f1a9185612364565b53613614600f613603611a6b6126a0858a612364565b1660f81b6001600160f81b03191690565b6136206135e383612e55565b5301613599565b509150565b5061364261357b61363d8451612e55565b61164c565b60015b835181101561362757806136676135c46135bb611a6b6126a06001968a612364565b61367b6135e36136768461165b565b612e55565b53613691600f613603611a6b6126a0858a612364565b6136a36135e3611ab56136768561165b565b5301613645565b9190916136b8825184610f8d565b6136c28251612e55565b10613761575f5b8251811015613758576136e56136df8286610f8d565b60011690565b61373a5761370e6135bb611a6b6126a0613708613702868a610f8d565b60011c90565b86612364565b60ff6137236107f8611a6b6126a08689612364565b911603613732576001016136c9565b505050505f90565b600f613752611a6b6126a0613708613702868a610f8d565b1661370e565b50505050600190565b5050505f90565b9190600560fd1b906001600160f81b031990613786908490866118f2565b35160361379557016001013590565b60405162461bcd60e51b815260206004820152601760248201527f45787065637465642033322d6279746520737472696e670000000000000000006044820152606490fd5b6137e58284106123dd565b6137f6611a6b611a168585856118f2565b9260ff841660808110156138105750505050612b21612a75565b60b881969592939496105f1461387757506107f861382d91611950565b9161383783612ab9565b945f5b84811061384e5750505050611b0090610f7f565b80613864611a16612b95600194611f5489610f63565b5f1a613870828a612364565b530161383a565b60c01115613911576107f861388b91611976565b905f925f5b8381106138e957506138a184612ab9565b955f5b8581106138bc575050505090611f54611b0092610f7f565b806138d6611a16612b95600194611f548a611f548b610f63565b5f1a6138e2828b612364565b53016138a4565b9360019060081b6139096107f8611a6b611a16612c418a611f548a610f63565b179401613890565b60405162461bcd60e51b815260206004820152601e60248201527f457870656374656420737472696e6720646174612c20676f74206c69737400006044820152606490fdfea2646970667358221220cf5d410282956f49525d49e939275e5accc13b9b670073f101b75a932c70f62364736f6c634300081e0033 diff --git a/artifacts/erc20_deployment.hex b/artifacts/erc20_deployment.hex new file mode 100644 index 0000000..b9552f3 --- /dev/null +++ b/artifacts/erc20_deployment.hex @@ -0,0 +1 @@ +0x61010080604052346101c15760a08161256580380380916100208285610231565b8339810103126101c15761003381610268565b9061004060208201610268565b6040820151608060608401519301519160a05260c0523360805260018060a01b0383169283156102225760e0528115801580610219575b6100fc575b6040516122e8908161027d8239608051818181610166015281816103fa015281816105670152610a67015260a05181818161044c015261083a015260c0518181816101f20152610818015260e0518181816102c501528181610380015281816104ee015281816106080152818161085c01528181610f650152610ff70152f35b60ff60075460081c1661020a576101fb5780156101ec57815f55816002558060015581018091116101d8575f91606460209260405194859384926323b872dd60e01b845233600485015230602485015260448401525af19081156101cd575f9161018e575b501561017f5761010061ff001960075416176007555f80808061007c565b63022e258160e11b5f5260045ffd5b90506020813d6020116101c5575b816101a960209383610231565b810103126101c1575180151581036101c1575f610161565b5f80fd5b3d915061019c565b6040513d5f823e3d90fd5b634e487b7160e01b5f52601160045260245ffd5b63932ca0a360e01b5f5260045ffd5b63ea1083a760e01b5f5260045ffd5b635adf638760e01b5f5260045ffd5b50811515610077565b63d92e233d60e01b5f5260045ffd5b601f909101601f19168101906001600160401b0382119082101761025457604052565b634e487b7160e01b5f52604160045260245ffd5b51906001600160a01b03821682036101c15756fe60806040526004361015610011575f80fd5b5f3560e01c8063046f7da2146101545780631aa7c0ec1461014f5780632feef2ec1461014a578063308657d71461014557806333ee5f35146101405780633ccfd60b1461013b5780633d2691bc1461013657806355a373d6146101315780635a4fd6451461012c57806380f323a71461012757806381972d00146101225780638677ab231461011d5780638bd03d0a146101185780639940686e14610113578063a65e2cfd1461010e578063cb766a5614610109578063d415b3f914610104578063ede7f6a3146100ff578063f3a504f2146100fa5763fe03a460146100f5575f80fd5b61094f565b61092a565b6106e7565b6106ca565b6106a6565b61054e565b610498565b61047b565b610437565b6103e8565b6103cb565b6103af565b61036b565b61034f565b610254565b610237565b610215565b6101db565b6101b3565b346101af575f3660031901126101af577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031633036101a0576007805460ff19169055005b63618bbdd560e01b5f5260045ffd5b5f80fd5b346101af575f3660031901126101af576003546040516001600160a01b039091168152602090f35b346101af575f3660031901126101af5760206040517f00000000000000000000000000000000000000000000000000000000000000008152f35b346101af575f3660031901126101af57602060ff600754166040519015158152f35b346101af575f3660031901126101af576020600454604051908152f35b346101af575f3660031901126101af5761026c610a57565b610274610a97565b61027c610ace565b61029361ff0019600754166007555f6001555f8055565b80156103405760405163a9059cbb60e01b815233600482015260248101919091526020816044815f6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000165af190811561033b575f9161030c575b50156102fd57005b63022e258160e11b5f5260045ffd5b61032e915060203d602011610334575b6103268183610980565b8101906109a7565b5f6102f5565b503d61031c565b6109bf565b6353cd7f7960e01b5f5260045ffd5b346101af575f3660031901126101af5760206040516101008152f35b346101af575f3660031901126101af576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b346101af575f3660031901126101af5760205f54604051908152f35b346101af575f3660031901126101af576020600554604051908152f35b346101af575f3660031901126101af577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031633036101a0576007805460ff19166001179055005b346101af575f3660031901126101af576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b346101af575f3660031901126101af576020600154604051908152f35b346101af5760203660031901126101af576004356104b4610ae0565b6104bd81610b29565b6040516323b872dd60e01b8152336004820152306024820152604481018290526020816064815f6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000165af190811561033b575f9161052f575b50156102fd5761052d90610b84565b005b610548915060203d602011610334576103268183610980565b5f61051e565b346101af5760403660031901126101af576004356024357f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031633036101a05760075460081c60ff16610697578115610688578015610679576105bd826105c2935f55600255565b600155565b61060360206105d6600254600154906109ff565b6040516323b872dd60e01b8152336004820152306024820152604481019190915291829081906064820190565b03815f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165af190811561033b575f9161065a575b50156102fd5761052d61010061ff00196007541617600755565b610673915060203d602011610334576103268183610980565b5f610640565b63932ca0a360e01b5f5260045ffd5b63ea1083a760e01b5f5260045ffd5b635adf638760e01b5f5260045ffd5b346101af575f3660031901126101af5760206106c0610a0c565b6040519015158152f35b346101af575f3660031901126101af576020600254604051908152f35b346101af5760403660031901126101af5760043567ffffffffffffffff81116101af578060040160a060031983360301126101af576024356107298280610a24565b60075461073e9060081c60ff161590565b1590565b61091b5760035461075f906001600160a01b03165b6001600160a01b031690565b331480159061090a575b6108fb574383116108ec576101006107818443610bc9565b116108dd57824080156108ce57610799368385610bf2565b60208151910120036108bf576107ae91611072565b036108b0576107c66107c08280610a24565b90610c56565b9161080061073a60248301946107dc8686610a24565b906107ea6044870188610a24565b906107f8606489018a610a24565b949093610cc6565b6108a15760846108166108869461073a94610a24565b7f0000000000000000000000000000000000000000000000000000000000000000937f0000000000000000000000000000000000000000000000000000000000000000937f0000000000000000000000000000000000000000000000000000000000000000939101359190610d4a565b6108925761052d610ee4565b6364fa89e160e11b5f5260045ffd5b637b374dd160e01b5f5260045ffd5b63048a12f560e11b5f5260045ffd5b63ff28378760e01b5f5260045ffd5b63bfc9f0d360e01b5f5260045ffd5b63c42a018560e01b5f5260045ffd5b63058968cf60e41b5f5260045ffd5b6337b5f20360e21b5f5260045ffd5b5061091661073a610a0c565b610769565b636af784dd60e11b5f5260045ffd5b346101af575f3660031901126101af57602060ff60075460081c166040519015158152f35b346101af575f3660031901126101af576020600654604051908152f35b634e487b7160e01b5f52604160045260245ffd5b90601f8019910116810190811067ffffffffffffffff8211176109a257604052565b61096c565b908160209103126101af575180151581036101af5790565b6040513d5f823e3d90fd5b634e487b7160e01b5f52601160045260245ffd5b90600182018092116109ec57565b6109ca565b60010190816001116109ec57565b919082018092116109ec57565b6004548015159081610a1c575090565b905042111590565b903590601e19813603018212156101af570180359067ffffffffffffffff82116101af576020019181360383136101af57565b60ff60075460081c161561091b577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031633036101a057565b610a9f610a0c565b610abf576001600160601b0360a01b600354166003555f6005555f600455565b639cbc1de160e01b5f5260045ffd5b60015460025481018091116109ec5790565b6004548015159081610b1f575b50610af457565b6005545f548181018091116109ec575f556006549081018091116109ec57600655610b1d610a97565b565b905042115f610aed565b60075460ff8160081c161561091b5760ff16610b7557610b47610a0c565b610b66575f5460011c11610b5757565b63e92c469f60e01b5f5260045ffd5b63129f78e960e11b5f5260045ffd5b632479328960e01b5f5260045ffd5b336001600160601b0360a01b600354161760035561012c42018042116109ec57600455600555565b6001198101919082116109ec57565b5f198101919082116109ec57565b919082039182116109ec57565b67ffffffffffffffff81116109a257601f01601f191660200190565b929192610bfe82610bd6565b91610c0c6040519384610980565b8294818452818301116101af578281602093845f960137010152565b634e487b7160e01b5f52603260045260245ffd5b9015610c455790565b610c28565b90821015610c45570190565b90610c6181836110da565b905f5b60058110610cb15750600560fd1b906001600160f81b031990610c8990849086610c4a565b351603610ca2576001810181116109ec57016001013590565b633954003560e11b5f5260045ffd5b91610cbf600191838661120e565b9201610c64565b610cdc610ce492939495610cea98973691610bf2565b923691610bf2565b9061137d565b90565b60ff60f6199116019060ff82116109ec57565b60ff60bf199116019060ff82116109ec57565b60ff60b6199116019060ff82116109ec57565b60ff607f199116019060ff82116109ec57565b60ff166001019060ff82116109ec57565b9594939291905f818881151580610ec8575b610eba575b610d8a610d84610d768560c09560ff95610c4a565b356001600160f81b03191690565b60f81c90565b1610610e8457808860f860ff610da8610d84610d7688978887610c4a565b1610610eaa57610dd5610dd0610dcb610d84610d7686610de198610ddb97610c4a565b610ced565b610d39565b60ff1690565b906109ff565b81885f5b60038110610e935750610dd5610d84610d768560c095610e0495610c4a565b10610e8457808860f8610e22610dd5610d84610d7688978887610c4a565b10610e7357610dd5610dd0610dcb610d84610d7686610e4498610ddb97610c4a565b915b5f905b808210610e5c575050610cea959661152a565b9092610e6b600191848b61120e565b930190610e49565b50610e7e91506109de565b91610e46565b631bd5dcf760e31b5f5260045ffd5b92600192610ea09261120e565b9101888391610de5565b50610eb591506109de565b610de1565b506001915082905088610d61565b50608060ff610edd610d84610d768686610c3c565b1610610d5c565b610eec6115f1565b6003546001600160a01b0316610f296001600160601b0360a01b600354166003555f6005555f60045561ff0019600754166007555f6001555f8055565b4662aa36a703610fc557604051633419e74d60e21b81526001600160a01b0390911660048201526024810191909152602081806044810103815f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165af190811561033b575f91610fa6575b505b156102fd57565b610fbf915060203d602011610334576103268183610980565b5f610f9d565b60405163a9059cbb60e01b81526001600160a01b0390911660048201526024810191909152602081806044810103815f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165af190811561033b575f91611035575b50610f9f565b61104e915060203d602011610334576103268183610980565b5f61102f565b805115610c455760200190565b908151811015610c45570160200190565b919061107e81846110da565b905f5b600881106110c557506110949293611684565b50905f805b83518210156110c0576001906110af8386611061565b5160f81c9060081b17910190611099565b925050565b916110d3600191838761120e565b9201611081565b5f600360fe1b6001600160f81b03196110f6610d768686610c3c565b16106111d657601f60fb1b6001600160f81b0319611117610d768686610c3c565b16106112055780610ddb610dd5610dd0610dcb610d84610d7661113b978a8a610c4a565b905b61a5bd461480156111fa575b611154575b50905090565b5f5b600381106111e55750600360fe1b611182611175610d76858786610c4a565b6001600160f81b03191690565b106111d657601f60fb1b61119d611175610d76858786610c4a565b106111c657610dd5610dd0610dcb610d84610d76866111bf98610ddb97610c4a565b805f61114e565b506111d191506109de565b6111bf565b63c0098bd960e01b5f5260045ffd5b916111f3600191858461120e565b9201611156565b5061a5bf4614611149565b5060019061113d565b91908082101561136e57611229610d84610d76848487610c4a565b9060ff8216608081101561124457505050610cea91506109de565b91929160b881101561126c575050610cea9250610dd5611266610ddb926109de565b92610d26565b90929060c08110156112e75750610dd561128891949394610d13565b915f935f915b8483106112ae57505050610cea92916112a96112a9926109de565b6109ff565b9091946112bd60019160081b90565b6112dd610dd5610d84610d766112d68b6112a98b6109de565b8888610c4a565b179501919061128e565b90929060f8111561130d5750610cea9250610dd5611307610ddb926109de565b92610d00565b9291610dd561131b91610ced565b915f935f915b84831061133c57505050610cea92916112a96112a9926109de565b90919461134b60019160081b90565b611364610dd5610d84610d766112d68b6112a98b6109de565b1795019190611321565b6318d76ae160e11b5f5260045ffd5b919390929190600360fe1b6001600160f81b031961139e610d768689610c3c565b161061151b57601f60fb1b6001600160f81b03196113bf610d768689610c3c565b1610611511576113e36113de610dd5610dcb610d84610d76888b610c3c565b6109f1565b9492905b945f5b8282106113fc57505050505050505f90565b61141a6114138361140e36878a610bf2565b6117f5565b90936109ff565b9682516020840120036114af57600360fe1b61144961117561143b85611054565b516001600160f81b03191690565b106114af578590846001601f60fb1b61146761117561143b88611054565b10156114f3575b611478818661197c565b601181036114ba575061148a94611b07565b9491156114af5784156114a35793915b919590936113ea565b50505050505050600190565b505050505050505f90565b9093506002141590506114e7578487926114d3946119c1565b9491156114af5784156114a357939161149a565b50505050505050505f90565b5061150c6113de610dd5610dcb610d8461143b89611054565b61146e565b60019492906113e7565b63ebb47d1d60e01b5f5260045ffd5b91949392948060c060ff611545610d84610d7685888a610c4a565b1610610e845760f860ff611560610d84610d7685888a610c4a565b16106115e2575080610ddb610dd5610dd0610dcb610d84610d7661158597898b610c4a565b611590818385611c1c565b969060148151036115d357601401516001600160a01b039182169116036115c457610cea956115be916109ff565b91611c88565b63a087f96f60e01b5f5260045ffd5b63e6c4247b60e01b5f5260045ffd5b6115ec91506109de565b611585565b6005545f5481018091116109ec5760015481018091116109ec5790565b6040805190919061161f8382610980565b6001815291601f1901366020840137565b604080519091906116418382610980565b6014815291601f1901366020840137565b9061165c82610bd6565b6116696040519182610980565b828152809261167a601f1991610bd6565b0190602036910137565b8183101561136e5761169d610d84610d76858585610c4a565b9260ff841660808110156116d757505050506116b761160e565b9060f81b6001600160f81b0319165f1a6116d082611054565b5390600190565b60b881969592939496105f146117455750610dd56116f491610d26565b916116fe83611652565b945f5b8481106117155750505050610cea906109f1565b80611732610d7661172b6001946112a9896109de565b8587610c4a565b5f1a61173e828a611061565b5301611701565b60c011156117e657610dd561175991610d13565b905f925f5b8381106117b7575061176f84611652565b955f5b85811061178a5750505050906112a9610cea926109f1565b806117a4610d7661172b6001946112a98a6112a98b6109de565b5f1a6117b0828b611061565b5301611772565b9360019060081b6117de610dd5610d84610d766117d78a6112a98a6109de565b8c88610c4a565b17940161175e565b636b2e9c5f60e11b5f5260045ffd5b805182101561136e5761180e610d8461143b8484611061565b9160ff83166080811015611827575050506116b761160e565b919392909160b88110156118915750610dd561184291610d26565b9061184c82611652565b935f5b83811061186257505050610cea906109f1565b8061187e61143b6118786001946112a9886109de565b85611061565b5f1a61188a8289611061565b530161184f565b60c0111561192f57610dd56118a591610d13565b5f915f5b82811061190157506118ba83611652565b945f5b8481106118d457505050906112a9610cea926109f1565b806118ee61143b6118786001946112a9896112a98a6109de565b5f1a6118fa828a611061565b53016118bd565b9260019060081b611927610dd5610d8461143b611921896112a9896109de565b8b611061565b1793016118a9565b509161193b8382611ddf565b9261194584611652565b915f5b858110611956575050509190565b8061196961143b611878600194876109ff565b5f1a6119758287611061565b5301611948565b5f92915b81518110156119a7576119938183611ddf565b81018091116109ec57600190930192611980565b5050565b908160011b91808304600214901517156109ec57565b839492916119cf81836117f5565b93906119ee60206119e5610d8461143b85611054565b16151591611f0c565b97889115611a905750611a029051876109ff565b611a0c82516119ab565b14611a21575b505050505050505f905f905f90565b86866001928251611a7e575b505050611a3b575b80611a12565b611a4e92611a48916109ff565b906117f5565b5060208151910120906020815191012014611a6c5780808080611a35565b611a779151906109ff565b6001915f90565b611a889350612075565b86865f611a2d565b611aa1939495965061073a92612075565b611afa57611ab292611a48916109ff565b50908151602081145f14611ada57506020611ad2920151925b51906109ff565b916001929190565b8015611aee576020611ad293012092611acb565b505050505f905f905f90565b50505050505f905f905f90565b91909293611b1582516119ab565b851015611bbf5750610d8461143b611b3792611b318760011c90565b90611061565b60018416611bb65760041c600f16915b905f925b60ff81168410611b965750611b6092506117f5565b5080518015611b8b57611ad29160208203611b8157602091500151916109de565b60200120916109de565b5050505f905f905f90565b90916001611baa82610ddb60ff9487611ddf565b94019392919050611b4b565b600f1691611b47565b9290509392935f915b60108310611c0257611bda92506117f5565b50602081519101209060208151910120145f14611bf957600191905f90565b5f915081908190565b90611c1381610ddb60019385611ddf565b92019190611bc8565b91909182821015610e8457609460ff611c3c610d84610d76868887610c4a565b16036115d357611c4a611630565b925f5b60148110611c5f575050505090601590565b80611c75610d7661172b6001946112a9896109de565b5f1a611c818288611061565b5301611c4d565b91928360c060ff611ca0610d84610d7689888a610c4a565b1610610e845760f860ff611cbb610d84610d7689888a610c4a565b1610611dd05780610ddb610dd5610dd0610dcb610d84610d76611cdf978a8c610c4a565b7fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef611d0b828587612133565b03611dc157610753610753611d2e611d27611d3594878961120e565b868861120e565b8587612133565b6001600160a01b03918216911603611db257611d55611d5b93828461120e565b9161216f565b50916020835111610e84575f90815b8451831015611d955760019060081b611d8c610dd5610d8461143b878a611061565b17920191611d6a565b9150925003611da357600190565b6355e97b0d60e01b5f5260045ffd5b634cd4b7b160e01b5f5260045ffd5b6324da545d60e11b5f5260045ffd5b50611dda846109de565b611cdf565b90815181101561136e57611df9610d8461143b8385611061565b9160ff83166080811015611e105750505050600190565b60b8811015611e2b57505050610dd5610dd0610cea92610d26565b60c0811015611e97575091610dd5611e4291610d13565b905f925f915b838310611e5f57505050906112a9610cea926109f1565b909193611e6e60019160081b90565b611e8d610dd5610d8461143b611e878a6112a9896109de565b88611061565b1794019190611e48565b60f81115611eb0575050610dd5610dd0610cea92610d00565b91610dd5611ebd91610ced565b905f925f915b838310611eda57505050906112a9610cea926109f1565b909193611ee960019160081b90565b611f02610dd5610d8461143b611e878a6112a9896109de565b1794019190611ec3565b90815115610b1d57611f23610d8461143b84611054565b6010811615611ff257611f46611f41611f3c85516119ab565b610bbb565b611652565b9060f81b600f60f81b165f1a611f5b82611054565b5360015b8351811015611fed5780611f9a611f8a611f81610d8461143b6001968a611061565b60041c600f1690565b60f81b6001600160f81b03191690565b611fb3611fa9611f3c846119ab565b915f1a9185611061565b53611fda600f611fc9610d8461143b858a611061565b1660f81b6001600160f81b03191690565b611fe6611fa9836119ab565b5301611f5f565b509150565b50612008611f4161200384516119ab565b610bac565b60015b8351811015611fed578061202d611f8a611f81610d8461143b6001968a611061565b612041611fa961203c84610bbb565b6119ab565b53612057600f611fc9610d8461143b858a611061565b61206e611fa961206961203c85610bbb565b6109de565b530161200b565b9190916120838251846109ff565b61208d82516119ab565b1061212c575f5b8251811015612123576120b06120aa82866109ff565b60011690565b612105576120d9611f81610d8461143b6120d36120cd868a6109ff565b60011c90565b86611061565b60ff6120ee610dd5610d8461143b8689611061565b9116036120fd57600101612094565b505050505f90565b600f61211d610d8461143b6120d36120cd868a6109ff565b166120d9565b50505050600190565b5050505f90565b9190600560fd1b906001600160f81b03199061215190849086610c4a565b35160361216057016001013590565b63f0ff325b60e01b5f5260045ffd5b81831015610e8457612188610d84610d76858585610c4a565b9260ff841660808110156121a257505050506116b761160e565b60b881969592939496105f146122095750610dd56121bf91610d26565b916121c983611652565b945f5b8481106121e05750505050610cea906109f1565b806121f6610d7661172b6001946112a9896109de565b5f1a612202828a611061565b53016121cc565b60c011156122a357610dd561221d91610d13565b905f925f5b83811061227b575061223384611652565b955f5b85811061224e5750505050906112a9610cea926109f1565b80612268610d7661172b6001946112a98a6112a98b6109de565b5f1a612274828b611061565b5301612236565b9360019060081b61229b610dd5610d84610d766117d78a6112a98a6109de565b179401612222565b6336459a5b60e21b5f5260045ffdfea2646970667358221220f111dda4228930ff7fcf5360c1e823b8ddcd3e1621a6c54215af8789b55a438f64736f6c634300081e0033 diff --git a/artifacts/erc20_runtime.hex b/artifacts/erc20_runtime.hex new file mode 100644 index 0000000..7815466 --- /dev/null +++ b/artifacts/erc20_runtime.hex @@ -0,0 +1 @@ +0x60806040526004361015610011575f80fd5b5f3560e01c8063046f7da2146101545780631aa7c0ec1461014f5780632feef2ec1461014a578063308657d71461014557806333ee5f35146101405780633ccfd60b1461013b5780633d2691bc1461013657806355a373d6146101315780635a4fd6451461012c57806380f323a71461012757806381972d00146101225780638677ab231461011d5780638bd03d0a146101185780639940686e14610113578063a65e2cfd1461010e578063cb766a5614610109578063d415b3f914610104578063ede7f6a3146100ff578063f3a504f2146100fa5763fe03a460146100f5575f80fd5b61094f565b61092a565b6106e7565b6106ca565b6106a6565b61054e565b610498565b61047b565b610437565b6103e8565b6103cb565b6103af565b61036b565b61034f565b610254565b610237565b610215565b6101db565b6101b3565b346101af575f3660031901126101af577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031633036101a0576007805460ff19169055005b63618bbdd560e01b5f5260045ffd5b5f80fd5b346101af575f3660031901126101af576003546040516001600160a01b039091168152602090f35b346101af575f3660031901126101af5760206040517f00000000000000000000000000000000000000000000000000000000000000008152f35b346101af575f3660031901126101af57602060ff600754166040519015158152f35b346101af575f3660031901126101af576020600454604051908152f35b346101af575f3660031901126101af5761026c610a57565b610274610a97565b61027c610ace565b61029361ff0019600754166007555f6001555f8055565b80156103405760405163a9059cbb60e01b815233600482015260248101919091526020816044815f6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000165af190811561033b575f9161030c575b50156102fd57005b63022e258160e11b5f5260045ffd5b61032e915060203d602011610334575b6103268183610980565b8101906109a7565b5f6102f5565b503d61031c565b6109bf565b6353cd7f7960e01b5f5260045ffd5b346101af575f3660031901126101af5760206040516101008152f35b346101af575f3660031901126101af576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b346101af575f3660031901126101af5760205f54604051908152f35b346101af575f3660031901126101af576020600554604051908152f35b346101af575f3660031901126101af577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031633036101a0576007805460ff19166001179055005b346101af575f3660031901126101af576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b346101af575f3660031901126101af576020600154604051908152f35b346101af5760203660031901126101af576004356104b4610ae0565b6104bd81610b29565b6040516323b872dd60e01b8152336004820152306024820152604481018290526020816064815f6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000165af190811561033b575f9161052f575b50156102fd5761052d90610b84565b005b610548915060203d602011610334576103268183610980565b5f61051e565b346101af5760403660031901126101af576004356024357f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031633036101a05760075460081c60ff16610697578115610688578015610679576105bd826105c2935f55600255565b600155565b61060360206105d6600254600154906109ff565b6040516323b872dd60e01b8152336004820152306024820152604481019190915291829081906064820190565b03815f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165af190811561033b575f9161065a575b50156102fd5761052d61010061ff00196007541617600755565b610673915060203d602011610334576103268183610980565b5f610640565b63932ca0a360e01b5f5260045ffd5b63ea1083a760e01b5f5260045ffd5b635adf638760e01b5f5260045ffd5b346101af575f3660031901126101af5760206106c0610a0c565b6040519015158152f35b346101af575f3660031901126101af576020600254604051908152f35b346101af5760403660031901126101af5760043567ffffffffffffffff81116101af578060040160a060031983360301126101af576024356107298280610a24565b60075461073e9060081c60ff161590565b1590565b61091b5760035461075f906001600160a01b03165b6001600160a01b031690565b331480159061090a575b6108fb574383116108ec576101006107818443610bc9565b116108dd57824080156108ce57610799368385610bf2565b60208151910120036108bf576107ae91611072565b036108b0576107c66107c08280610a24565b90610c56565b9161080061073a60248301946107dc8686610a24565b906107ea6044870188610a24565b906107f8606489018a610a24565b949093610cc6565b6108a15760846108166108869461073a94610a24565b7f0000000000000000000000000000000000000000000000000000000000000000937f0000000000000000000000000000000000000000000000000000000000000000937f0000000000000000000000000000000000000000000000000000000000000000939101359190610d4a565b6108925761052d610ee4565b6364fa89e160e11b5f5260045ffd5b637b374dd160e01b5f5260045ffd5b63048a12f560e11b5f5260045ffd5b63ff28378760e01b5f5260045ffd5b63bfc9f0d360e01b5f5260045ffd5b63c42a018560e01b5f5260045ffd5b63058968cf60e41b5f5260045ffd5b6337b5f20360e21b5f5260045ffd5b5061091661073a610a0c565b610769565b636af784dd60e11b5f5260045ffd5b346101af575f3660031901126101af57602060ff60075460081c166040519015158152f35b346101af575f3660031901126101af576020600654604051908152f35b634e487b7160e01b5f52604160045260245ffd5b90601f8019910116810190811067ffffffffffffffff8211176109a257604052565b61096c565b908160209103126101af575180151581036101af5790565b6040513d5f823e3d90fd5b634e487b7160e01b5f52601160045260245ffd5b90600182018092116109ec57565b6109ca565b60010190816001116109ec57565b919082018092116109ec57565b6004548015159081610a1c575090565b905042111590565b903590601e19813603018212156101af570180359067ffffffffffffffff82116101af576020019181360383136101af57565b60ff60075460081c161561091b577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031633036101a057565b610a9f610a0c565b610abf576001600160601b0360a01b600354166003555f6005555f600455565b639cbc1de160e01b5f5260045ffd5b60015460025481018091116109ec5790565b6004548015159081610b1f575b50610af457565b6005545f548181018091116109ec575f556006549081018091116109ec57600655610b1d610a97565b565b905042115f610aed565b60075460ff8160081c161561091b5760ff16610b7557610b47610a0c565b610b66575f5460011c11610b5757565b63e92c469f60e01b5f5260045ffd5b63129f78e960e11b5f5260045ffd5b632479328960e01b5f5260045ffd5b336001600160601b0360a01b600354161760035561012c42018042116109ec57600455600555565b6001198101919082116109ec57565b5f198101919082116109ec57565b919082039182116109ec57565b67ffffffffffffffff81116109a257601f01601f191660200190565b929192610bfe82610bd6565b91610c0c6040519384610980565b8294818452818301116101af578281602093845f960137010152565b634e487b7160e01b5f52603260045260245ffd5b9015610c455790565b610c28565b90821015610c45570190565b90610c6181836110da565b905f5b60058110610cb15750600560fd1b906001600160f81b031990610c8990849086610c4a565b351603610ca2576001810181116109ec57016001013590565b633954003560e11b5f5260045ffd5b91610cbf600191838661120e565b9201610c64565b610cdc610ce492939495610cea98973691610bf2565b923691610bf2565b9061137d565b90565b60ff60f6199116019060ff82116109ec57565b60ff60bf199116019060ff82116109ec57565b60ff60b6199116019060ff82116109ec57565b60ff607f199116019060ff82116109ec57565b60ff166001019060ff82116109ec57565b9594939291905f818881151580610ec8575b610eba575b610d8a610d84610d768560c09560ff95610c4a565b356001600160f81b03191690565b60f81c90565b1610610e8457808860f860ff610da8610d84610d7688978887610c4a565b1610610eaa57610dd5610dd0610dcb610d84610d7686610de198610ddb97610c4a565b610ced565b610d39565b60ff1690565b906109ff565b81885f5b60038110610e935750610dd5610d84610d768560c095610e0495610c4a565b10610e8457808860f8610e22610dd5610d84610d7688978887610c4a565b10610e7357610dd5610dd0610dcb610d84610d7686610e4498610ddb97610c4a565b915b5f905b808210610e5c575050610cea959661152a565b9092610e6b600191848b61120e565b930190610e49565b50610e7e91506109de565b91610e46565b631bd5dcf760e31b5f5260045ffd5b92600192610ea09261120e565b9101888391610de5565b50610eb591506109de565b610de1565b506001915082905088610d61565b50608060ff610edd610d84610d768686610c3c565b1610610d5c565b610eec6115f1565b6003546001600160a01b0316610f296001600160601b0360a01b600354166003555f6005555f60045561ff0019600754166007555f6001555f8055565b4662aa36a703610fc557604051633419e74d60e21b81526001600160a01b0390911660048201526024810191909152602081806044810103815f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165af190811561033b575f91610fa6575b505b156102fd57565b610fbf915060203d602011610334576103268183610980565b5f610f9d565b60405163a9059cbb60e01b81526001600160a01b0390911660048201526024810191909152602081806044810103815f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165af190811561033b575f91611035575b50610f9f565b61104e915060203d602011610334576103268183610980565b5f61102f565b805115610c455760200190565b908151811015610c45570160200190565b919061107e81846110da565b905f5b600881106110c557506110949293611684565b50905f805b83518210156110c0576001906110af8386611061565b5160f81c9060081b17910190611099565b925050565b916110d3600191838761120e565b9201611081565b5f600360fe1b6001600160f81b03196110f6610d768686610c3c565b16106111d657601f60fb1b6001600160f81b0319611117610d768686610c3c565b16106112055780610ddb610dd5610dd0610dcb610d84610d7661113b978a8a610c4a565b905b61a5bd461480156111fa575b611154575b50905090565b5f5b600381106111e55750600360fe1b611182611175610d76858786610c4a565b6001600160f81b03191690565b106111d657601f60fb1b61119d611175610d76858786610c4a565b106111c657610dd5610dd0610dcb610d84610d76866111bf98610ddb97610c4a565b805f61114e565b506111d191506109de565b6111bf565b63c0098bd960e01b5f5260045ffd5b916111f3600191858461120e565b9201611156565b5061a5bf4614611149565b5060019061113d565b91908082101561136e57611229610d84610d76848487610c4a565b9060ff8216608081101561124457505050610cea91506109de565b91929160b881101561126c575050610cea9250610dd5611266610ddb926109de565b92610d26565b90929060c08110156112e75750610dd561128891949394610d13565b915f935f915b8483106112ae57505050610cea92916112a96112a9926109de565b6109ff565b9091946112bd60019160081b90565b6112dd610dd5610d84610d766112d68b6112a98b6109de565b8888610c4a565b179501919061128e565b90929060f8111561130d5750610cea9250610dd5611307610ddb926109de565b92610d00565b9291610dd561131b91610ced565b915f935f915b84831061133c57505050610cea92916112a96112a9926109de565b90919461134b60019160081b90565b611364610dd5610d84610d766112d68b6112a98b6109de565b1795019190611321565b6318d76ae160e11b5f5260045ffd5b919390929190600360fe1b6001600160f81b031961139e610d768689610c3c565b161061151b57601f60fb1b6001600160f81b03196113bf610d768689610c3c565b1610611511576113e36113de610dd5610dcb610d84610d76888b610c3c565b6109f1565b9492905b945f5b8282106113fc57505050505050505f90565b61141a6114138361140e36878a610bf2565b6117f5565b90936109ff565b9682516020840120036114af57600360fe1b61144961117561143b85611054565b516001600160f81b03191690565b106114af578590846001601f60fb1b61146761117561143b88611054565b10156114f3575b611478818661197c565b601181036114ba575061148a94611b07565b9491156114af5784156114a35793915b919590936113ea565b50505050505050600190565b505050505050505f90565b9093506002141590506114e7578487926114d3946119c1565b9491156114af5784156114a357939161149a565b50505050505050505f90565b5061150c6113de610dd5610dcb610d8461143b89611054565b61146e565b60019492906113e7565b63ebb47d1d60e01b5f5260045ffd5b91949392948060c060ff611545610d84610d7685888a610c4a565b1610610e845760f860ff611560610d84610d7685888a610c4a565b16106115e2575080610ddb610dd5610dd0610dcb610d84610d7661158597898b610c4a565b611590818385611c1c565b969060148151036115d357601401516001600160a01b039182169116036115c457610cea956115be916109ff565b91611c88565b63a087f96f60e01b5f5260045ffd5b63e6c4247b60e01b5f5260045ffd5b6115ec91506109de565b611585565b6005545f5481018091116109ec5760015481018091116109ec5790565b6040805190919061161f8382610980565b6001815291601f1901366020840137565b604080519091906116418382610980565b6014815291601f1901366020840137565b9061165c82610bd6565b6116696040519182610980565b828152809261167a601f1991610bd6565b0190602036910137565b8183101561136e5761169d610d84610d76858585610c4a565b9260ff841660808110156116d757505050506116b761160e565b9060f81b6001600160f81b0319165f1a6116d082611054565b5390600190565b60b881969592939496105f146117455750610dd56116f491610d26565b916116fe83611652565b945f5b8481106117155750505050610cea906109f1565b80611732610d7661172b6001946112a9896109de565b8587610c4a565b5f1a61173e828a611061565b5301611701565b60c011156117e657610dd561175991610d13565b905f925f5b8381106117b7575061176f84611652565b955f5b85811061178a5750505050906112a9610cea926109f1565b806117a4610d7661172b6001946112a98a6112a98b6109de565b5f1a6117b0828b611061565b5301611772565b9360019060081b6117de610dd5610d84610d766117d78a6112a98a6109de565b8c88610c4a565b17940161175e565b636b2e9c5f60e11b5f5260045ffd5b805182101561136e5761180e610d8461143b8484611061565b9160ff83166080811015611827575050506116b761160e565b919392909160b88110156118915750610dd561184291610d26565b9061184c82611652565b935f5b83811061186257505050610cea906109f1565b8061187e61143b6118786001946112a9886109de565b85611061565b5f1a61188a8289611061565b530161184f565b60c0111561192f57610dd56118a591610d13565b5f915f5b82811061190157506118ba83611652565b945f5b8481106118d457505050906112a9610cea926109f1565b806118ee61143b6118786001946112a9896112a98a6109de565b5f1a6118fa828a611061565b53016118bd565b9260019060081b611927610dd5610d8461143b611921896112a9896109de565b8b611061565b1793016118a9565b509161193b8382611ddf565b9261194584611652565b915f5b858110611956575050509190565b8061196961143b611878600194876109ff565b5f1a6119758287611061565b5301611948565b5f92915b81518110156119a7576119938183611ddf565b81018091116109ec57600190930192611980565b5050565b908160011b91808304600214901517156109ec57565b839492916119cf81836117f5565b93906119ee60206119e5610d8461143b85611054565b16151591611f0c565b97889115611a905750611a029051876109ff565b611a0c82516119ab565b14611a21575b505050505050505f905f905f90565b86866001928251611a7e575b505050611a3b575b80611a12565b611a4e92611a48916109ff565b906117f5565b5060208151910120906020815191012014611a6c5780808080611a35565b611a779151906109ff565b6001915f90565b611a889350612075565b86865f611a2d565b611aa1939495965061073a92612075565b611afa57611ab292611a48916109ff565b50908151602081145f14611ada57506020611ad2920151925b51906109ff565b916001929190565b8015611aee576020611ad293012092611acb565b505050505f905f905f90565b50505050505f905f905f90565b91909293611b1582516119ab565b851015611bbf5750610d8461143b611b3792611b318760011c90565b90611061565b60018416611bb65760041c600f16915b905f925b60ff81168410611b965750611b6092506117f5565b5080518015611b8b57611ad29160208203611b8157602091500151916109de565b60200120916109de565b5050505f905f905f90565b90916001611baa82610ddb60ff9487611ddf565b94019392919050611b4b565b600f1691611b47565b9290509392935f915b60108310611c0257611bda92506117f5565b50602081519101209060208151910120145f14611bf957600191905f90565b5f915081908190565b90611c1381610ddb60019385611ddf565b92019190611bc8565b91909182821015610e8457609460ff611c3c610d84610d76868887610c4a565b16036115d357611c4a611630565b925f5b60148110611c5f575050505090601590565b80611c75610d7661172b6001946112a9896109de565b5f1a611c818288611061565b5301611c4d565b91928360c060ff611ca0610d84610d7689888a610c4a565b1610610e845760f860ff611cbb610d84610d7689888a610c4a565b1610611dd05780610ddb610dd5610dd0610dcb610d84610d76611cdf978a8c610c4a565b7fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef611d0b828587612133565b03611dc157610753610753611d2e611d27611d3594878961120e565b868861120e565b8587612133565b6001600160a01b03918216911603611db257611d55611d5b93828461120e565b9161216f565b50916020835111610e84575f90815b8451831015611d955760019060081b611d8c610dd5610d8461143b878a611061565b17920191611d6a565b9150925003611da357600190565b6355e97b0d60e01b5f5260045ffd5b634cd4b7b160e01b5f5260045ffd5b6324da545d60e11b5f5260045ffd5b50611dda846109de565b611cdf565b90815181101561136e57611df9610d8461143b8385611061565b9160ff83166080811015611e105750505050600190565b60b8811015611e2b57505050610dd5610dd0610cea92610d26565b60c0811015611e97575091610dd5611e4291610d13565b905f925f915b838310611e5f57505050906112a9610cea926109f1565b909193611e6e60019160081b90565b611e8d610dd5610d8461143b611e878a6112a9896109de565b88611061565b1794019190611e48565b60f81115611eb0575050610dd5610dd0610cea92610d00565b91610dd5611ebd91610ced565b905f925f915b838310611eda57505050906112a9610cea926109f1565b909193611ee960019160081b90565b611f02610dd5610d8461143b611e878a6112a9896109de565b1794019190611ec3565b90815115610b1d57611f23610d8461143b84611054565b6010811615611ff257611f46611f41611f3c85516119ab565b610bbb565b611652565b9060f81b600f60f81b165f1a611f5b82611054565b5360015b8351811015611fed5780611f9a611f8a611f81610d8461143b6001968a611061565b60041c600f1690565b60f81b6001600160f81b03191690565b611fb3611fa9611f3c846119ab565b915f1a9185611061565b53611fda600f611fc9610d8461143b858a611061565b1660f81b6001600160f81b03191690565b611fe6611fa9836119ab565b5301611f5f565b509150565b50612008611f4161200384516119ab565b610bac565b60015b8351811015611fed578061202d611f8a611f81610d8461143b6001968a611061565b612041611fa961203c84610bbb565b6119ab565b53612057600f611fc9610d8461143b858a611061565b61206e611fa961206961203c85610bbb565b6109de565b530161200b565b9190916120838251846109ff565b61208d82516119ab565b1061212c575f5b8251811015612123576120b06120aa82866109ff565b60011690565b612105576120d9611f81610d8461143b6120d36120cd868a6109ff565b60011c90565b86611061565b60ff6120ee610dd5610d8461143b8689611061565b9116036120fd57600101612094565b505050505f90565b600f61211d610d8461143b6120d36120cd868a6109ff565b166120d9565b50505050600190565b5050505f90565b9190600560fd1b906001600160f81b03199061215190849086610c4a565b35160361216057016001013590565b63f0ff325b60e01b5f5260045ffd5b81831015610e8457612188610d84610d76858585610c4a565b9260ff841660808110156121a257505050506116b761160e565b60b881969592939496105f146122095750610dd56121bf91610d26565b916121c983611652565b945f5b8481106121e05750505050610cea906109f1565b806121f6610d7661172b6001946112a9896109de565b5f1a612202828a611061565b53016121cc565b60c011156122a357610dd561221d91610d13565b905f925f5b83811061227b575061223384611652565b955f5b85811061224e5750505050906112a9610cea926109f1565b80612268610d7661172b6001946112a98a6112a98b6109de565b5f1a612274828b611061565b5301612236565b9360019060081b61229b610dd5610d84610d766117d78a6112a98a6109de565b179401612222565b6336459a5b60e21b5f5260045ffdfea2646970667358221220f111dda4228930ff7fcf5360c1e823b8ddcd3e1621a6c54215af8789b55a438f64736f6c634300081e0033 diff --git a/artifacts/native_deployment.hex b/artifacts/native_deployment.hex new file mode 100644 index 0000000..7ef4965 --- /dev/null +++ b/artifacts/native_deployment.hex @@ -0,0 +1 @@ +0x60e0601f611f5738819003918201601f19168301916001600160401b038311848410176101205780849260809460405283398101031261011c578051906001600160a01b038216820361011c576020810151606060408301519201519260a05260c0523360805280151580610113575b6100c1575b604051611e22908161013582396080518181816101560152818161040f015281816105d40152610686015260a0518181816103070152610626015260c0518181816102e5015261038d0152f35b8181018082116100ff5734036100f057805f5560025560015561010061ff001960075416176007555f80610074565b63201c04ab60e01b5f5260045ffd5b634e487b7160e01b5f52601160045260245ffd5b5081151561006f565b5f80fd5b634e487b7160e01b5f52604160045260245ffdfe60806040526004361015610011575f80fd5b5f3560e01c8063046f7da2146101445780631aa7c0ec1461013f57806323a8b41a1461013a5780632feef2ec14610135578063308657d71461013057806333ee5f351461012b5780633ccfd60b146101265780633d2691bc146101215780635a4fd6451461011c57806364c9ec6f1461011757806380f323a71461011257806381972d001461010d5780638677ab23146101085780638bd03d0a14610103578063a65e2cfd146100fe578063cb766a56146100f9578063d415b3f9146100f4578063f3a504f2146100ef5763fe03a460146100ea575f80fd5b6107a7565b610782565b610765565b610741565b610672565b610655565b610611565b6105c2565b6105a5565b6104e7565b6104cb565b6104af565b6103ef565b6103d2565b6103b0565b610376565b6101cb565b6101a3565b3461019f575f36600319011261019f577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03163303610190576007805460ff19169055005b63618bbdd560e01b5f5260045ffd5b5f80fd5b3461019f575f36600319011261019f576003546040516001600160a01b039091168152602090f35b3461019f57604036600319011261019f5760043567ffffffffffffffff811161019f57806004019060c0600319823603011261019f5761021760243561021184806107c4565b90610934565b61022a61022483806107c4565b90610aa4565b602482019161026b61026761023f85876107c4565b61024f60448697939701896107c4565b60a48701979161025f898c6107c4565b949093610bad565b1590565b610367576102676102b491608461028b61028588806107c4565b90610bd4565b9161025f60648201966102ab6102a1898c6107c4565b959094018b6107c4565b9290918b6107c4565b610358576102676102c86102ce92856107c4565b90610c35565b610349576102e26102679161032c936107c4565b907f0000000000000000000000000000000000000000000000000000000000000000917f000000000000000000000000000000000000000000000000000000000000000091610d05565b61033a57610338610f20565b005b633cff557560e11b5f5260045ffd5b632b96f51360e01b5f5260045ffd5b637b374dd160e01b5f5260045ffd5b63c89e37db60e01b5f5260045ffd5b3461019f575f36600319011261019f5760206040517f00000000000000000000000000000000000000000000000000000000000000008152f35b3461019f575f36600319011261019f57602060ff600754166040519015158152f35b3461019f575f36600319011261019f576020600454604051908152f35b3461019f575f36600319011261019f5760ff60075460081c16156104a0577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316330361019057610445610f86565b61044d610fbd565b61046461ff0019600754166007555f6001555f8055565b8015610491575f80808093335af161047a610852565b501561048257005b63b12d13eb60e01b5f5260045ffd5b6353cd7f7960e01b5f5260045ffd5b636af784dd60e11b5f5260045ffd5b3461019f575f36600319011261019f5760206040516101008152f35b3461019f575f36600319011261019f5760205f54604051908152f35b5f36600319011261019f57600454801515908161059b575b50610568575b60075460ff8160081c16156104a05760ff16610559576105236108c7565b61054a575f5460011c341061053b5761033834610fcf565b63e92c469f60e01b5f5260045ffd5b63129f78e960e11b5f5260045ffd5b632479328960e01b5f5260045ffd5b6005545f54818101809111610596575f5560065490810180911161059657600655610591610f86565b610505565b61087c565b905042115f6104ff565b3461019f575f36600319011261019f576020600554604051908152f35b3461019f575f36600319011261019f577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03163303610190576007805460ff19166001179055005b3461019f575f36600319011261019f576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b3461019f575f36600319011261019f576020600154604051908152f35b604036600319011261019f576004356024357f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031633036101905760075460081c60ff16610732578115610723578015610714576106d781836108ba565b3403610705576106ec826106f1935f55600255565b600155565b61033861010061ff00196007541617600755565b63201c04ab60e01b5f5260045ffd5b63932ca0a360e01b5f5260045ffd5b63ea1083a760e01b5f5260045ffd5b635adf638760e01b5f5260045ffd5b3461019f575f36600319011261019f57602061075b6108c7565b6040519015158152f35b3461019f575f36600319011261019f576020600254604051908152f35b3461019f575f36600319011261019f57602060ff60075460081c166040519015158152f35b3461019f575f36600319011261019f576020600654604051908152f35b903590601e198136030182121561019f570180359067ffffffffffffffff821161019f5760200191813603831361019f57565b634e487b7160e01b5f52604160045260245ffd5b6040519190601f01601f1916820167ffffffffffffffff81118382101761083157604052565b6107f7565b67ffffffffffffffff811161083157601f01601f191660200190565b3d15610877573d9061086b61086683610836565b61080b565b9182523d5f602084013e565b606090565b634e487b7160e01b5f52601160045260245ffd5b906001820180921161059657565b906015820180921161059657565b600101908160011161059657565b9190820180921161059657565b60045480151590816108d7575090565b905042111590565b60011981019190821161059657565b5f1981019190821161059657565b9190820391821161059657565b92919261091861086683610836565b938285528282011161019f57815f926020928387013784010152565b9061094861026760075460ff9060081c1690565b6104a0576003546001600160a01b03163314801590610a08575b6109f9574383116109ea5761010061097a84436108fc565b116109db57824080156109cc57610992368385610909565b60208151910120036109bd576109a791611015565b036109ae57565b63048a12f560e11b5f5260045ffd5b63ff28378760e01b5f5260045ffd5b63bfc9f0d360e01b5f5260045ffd5b63c42a018560e01b5f5260045ffd5b63058968cf60e41b5f5260045ffd5b6337b5f20360e21b5f5260045ffd5b50610a146102676108c7565b610962565b634e487b7160e01b5f52603260045260245ffd5b9015610a365790565b610a19565b90821015610a36570190565b60ff60f6199116019060ff821161059657565b60ff607f199116019060ff821161059657565b60ff60bf199116019060ff821161059657565b60ff60b6199116019060ff821161059657565b60ff166001019060ff821161059657565b905f600360fe1b6001600160f81b0319610acf610ac18587610a2d565b356001600160f81b03191690565b1610610b9e57601f60fb1b6001600160f81b0319610af0610ac18587610a2d565b1610610b955780610b2a610b24610b1f610b1a610b14610ac1610b3097898b610a3b565b60f81c90565b610a47565b610a93565b60ff1690565b906108ba565b905b5f5b60048110610b805750600560fd1b906001600160f81b031990610b5d90610ac190859087610a3b565b1603610b7157610b6c90610890565b013590565b633954003560e11b5f5260045ffd5b91610b8e600191838661107d565b9201610b34565b50600190610b32565b63c0098bd960e01b5f5260045ffd5b610bc3610bcb92939495610bd198973691610909565b923691610909565b906111e7565b90565b90610bdf81836113a1565b905f5b60058110610c205750600560fd1b906001600160f81b031990610c0790849086610a3b565b351603610b715760018101811161059657016001013590565b91610c2e600191838661107d565b9201610be2565b5f9082151580610ce9575b610ce0575b60c060ff610c5a610b14610ac1868887610a3b565b1610610cd157610b14610ac182858560f860ff610c84610b14610ac1839b60019d610cae9c610a3b565b1610610cc85780610b2a610b24610b1f610b1a610b14610ac1610ca897898b610a3b565b91610a3b565b1603610cb957600190565b63e9dd8a9d60e01b5f5260045ffd5b610ca890610890565b631bd5dcf760e31b5f5260045ffd5b60019150610c45565b50608060ff610cfe610b14610ac18786610a2d565b1610610c40565b90916003905f84151580610f04575b610ebc575b60c060ff610d2e610b14610ac1858a8a610a3b565b1610610cd1578060f860ff610d4d610b14610ac1610d73968b8b610a3b565b1610610eb35760ff610d6c610b1f610b1a610b14610ac1868c8c610a3b565b16906108ba565b915f905b808210610e9c575050609460ff610d95610b14610ac1868989610a3b565b1603610e8d576001600160a01b03168282016001013560601c03610e7e57610dbc9061089e565b91610dce610b14610ac1858486610a3b565b925f9260ff851694608086105f14610dff5750505050505b03610df057600190565b6355e97b0d60e01b5f5260045ffd5b90919293946080145f14610e185750505050505f610de6565b610b24610e2791939293610a5a565b915f935b838510610e3c575050505050610de6565b9091929394610e4d60019160081b90565b610e72610b24610b14610ac1610e6b8b610e668b610890565b6108ba565b8789610a3b565b17950193929190610e2b565b63c0ee95bb60e01b5f5260045ffd5b63e6c4247b60e01b5f5260045ffd5b9092610eab600191878761107d565b930190610d77565b60ff6001610d6c565b509050610ecf610b14610ac18585610a2d565b6001919060ff16808303610ee65750600491610d19565b600203610ef557600591610d19565b636fc3daa360e11b5f5260045ffd5b50608060ff610f19610b14610ac18989610a2d565b1610610d14565b6005545f548101809111610596576001548101809111610596575f808080936003546001600160601b0360a01b8116600355826005558260045561ff0019600754166007558260015582805560018060a01b03165af1610f7e610852565b501561048257565b610f8e6108c7565b610fae576001600160601b0360a01b600354166003555f6005555f600455565b639cbc1de160e01b5f5260045ffd5b60015460025481018091116105965790565b336001600160601b0360a01b600354161760035561012c420180421161059657600455600555565b805115610a365760200190565b908151811015610a36570160200190565b919061102181846113a1565b905f5b60088110611068575061103792936114fe565b50905f805b8351821015611063576001906110528386611004565b5160f81c9060081b1791019061103c565b925050565b91611076600191838761107d565b9201611024565b9190808210156111d857611098610b14610ac1848487610a3b565b9060ff821660808110156110b357505050610bd19150610890565b91929160b88110156110db575050610bd19250610b246110d5610b2a92610890565b92610a5a565b90929060c08110156111515750610b246110f791949394610a80565b915f935f915b84831061111857505050610bd19291610e66610e6692610890565b90919461112760019160081b90565b611147610b24610b14610ac16111408b610e668b610890565b8888610a3b565b17950191906110fd565b90929060f811156111775750610bd19250610b24611171610b2a92610890565b92610a6d565b9291610b2461118591610a47565b915f935f915b8483106111a657505050610bd19291610e66610e6692610890565b9091946111b560019160081b90565b6111ce610b24610b14610ac16111408b610e668b610890565b179501919061118b565b6318d76ae160e11b5f5260045ffd5b919390929190600360fe1b6001600160f81b0319611208610ac18689610a2d565b161061139257601f60fb1b6001600160f81b0319611229610ac18689610a2d565b16106113885761124d611248610b24610b1a610b14610ac1888b610a2d565b6108ac565b9492905b945f5b82821061126657505050505050505f90565b61128461127d8361127836878a610909565b61166f565b90936108ba565b96825160208401200361132657600360fe1b6112c06112b36112a585610ff7565b516001600160f81b03191690565b6001600160f81b03191690565b10611326578590846001601f60fb1b6112de6112b36112a588610ff7565b101561136a575b6112ef81866117f6565b60118103611331575061130194611981565b94911561132657841561131a5793915b91959093611254565b50505050505050600190565b505050505050505f90565b90935060021415905061135e5784879261134a9461183b565b94911561132657841561131a579391611311565b50505050505050505f90565b50611383611248610b24610b1a610b146112a589610ff7565b6112e5565b6001949290611251565b63ebb47d1d60e01b5f5260045ffd5b5f600360fe1b6001600160f81b03196113bd610ac18686610a2d565b1610610b9e57601f60fb1b6001600160f81b03196113de610ac18686610a2d565b16106114b05780610b2a610b24610b1f610b1a610b14610ac1611402978a8a610a3b565b905b61a5bd461480156114a5575b61141b575b50905090565b5f5b600381106114905750600360fe1b61143c6112b3610ac1858786610a3b565b10610b9e57601f60fb1b6114576112b3610ac1858786610a3b565b1061148057610b24610b1f610b1a610b14610ac18661147998610b2a97610a3b565b805f611415565b5061148b9150610890565b611479565b9161149e600191858461107d565b920161141d565b5061a5bf4614611410565b50600190611404565b6040906114c58261080b565b6001815291601f1901366020840137565b906114e361086683610836565b82815280926114f4601f1991610836565b0190602036910137565b818310156111d857611517610b14610ac1858585610a3b565b9260ff8416608081101561155157505050506115316114b9565b9060f81b6001600160f81b0319165f1a61154a82610ff7565b5390600190565b60b881969592939496105f146115bf5750610b2461156e91610a5a565b91611578836114d6565b945f5b84811061158f5750505050610bd1906108ac565b806115ac610ac16115a5600194610e6689610890565b8587610a3b565b5f1a6115b8828a611004565b530161157b565b60c0111561166057610b246115d391610a80565b905f925f5b83811061163157506115e9846114d6565b955f5b858110611604575050505090610e66610bd1926108ac565b8061161e610ac16115a5600194610e668a610e668b610890565b5f1a61162a828b611004565b53016115ec565b9360019060081b611658610b24610b14610ac16116518a610e668a610890565b8c88610a3b565b1794016115d8565b636b2e9c5f60e11b5f5260045ffd5b80518210156111d857611688610b146112a58484611004565b9160ff831660808110156116a1575050506115316114b9565b919392909160b881101561170b5750610b246116bc91610a5a565b906116c6826114d6565b935f5b8381106116dc57505050610bd1906108ac565b806116f86112a56116f2600194610e6688610890565b85611004565b5f1a6117048289611004565b53016116c9565b60c011156117a957610b2461171f91610a80565b5f915f5b82811061177b5750611734836114d6565b945f5b84811061174e5750505090610e66610bd1926108ac565b806117686112a56116f2600194610e6689610e668a610890565b5f1a611774828a611004565b5301611737565b9260019060081b6117a1610b24610b146112a561179b89610e6689610890565b8b611004565b179301611723565b50916117b58382611a96565b926117bf846114d6565b915f5b8581106117d0575050509190565b806117e36112a56116f2600194876108ba565b5f1a6117ef8287611004565b53016117c2565b5f92915b81518110156118215761180d8183611a96565b8101809111610596576001909301926117fa565b5050565b908160011b918083046002149015171561059657565b83949291611849818361166f565b9390611868602061185f610b146112a585610ff7565b16151591611bc3565b9788911561190a575061187c9051876108ba565b6118868251611825565b1461189b575b505050505050505f905f905f90565b868660019282516118f8575b5050506118b5575b8061188c565b6118c8926118c2916108ba565b9061166f565b50602081519101209060208151910120146118e657808080806118af565b6118f19151906108ba565b6001915f90565b6119029350611d2e565b86865f6118a7565b61191b939495965061026792611d2e565b6119745761192c926118c2916108ba565b50908151602081145f146119545750602061194c920151925b51906108ba565b916001929190565b801561196857602061194c93012092611945565b505050505f905f905f90565b50505050505f905f905f90565b9190929361198f8251611825565b851015611a395750610b146112a56119b1926119ab8760011c90565b90611004565b60018416611a305760041c600f16915b905f925b60ff81168410611a1057506119da925061166f565b5080518015611a055761194c91602082036119fb5760209150015191610890565b6020012091610890565b5050505f905f905f90565b90916001611a2482610b2a60ff9487611a96565b940193929190506119c5565b600f16916119c1565b9290509392935f915b60108310611a7c57611a54925061166f565b50602081519101209060208151910120145f14611a7357600191905f90565b5f915081908190565b90611a8d81610b2a60019385611a96565b92019190611a42565b9081518110156111d857611ab0610b146112a58385611004565b9160ff83166080811015611ac75750505050600190565b60b8811015611ae257505050610b24610b1f610bd192610a5a565b60c0811015611b4e575091610b24611af991610a80565b905f925f915b838310611b165750505090610e66610bd1926108ac565b909193611b2560019160081b90565b611b44610b24610b146112a5611b3e8a610e6689610890565b88611004565b1794019190611aff565b60f81115611b67575050610b24610b1f610bd192610a6d565b91610b24611b7491610a47565b905f925f915b838310611b915750505090610e66610bd1926108ac565b909193611ba060019160081b90565b611bb9610b24610b146112a5611b3e8a610e6689610890565b1794019190611b7a565b90815115611d2c57611bda610b146112a584610ff7565b6010811615611ca957611bfd611bf8611bf38551611825565b6108ee565b6114d6565b9060f81b600f60f81b165f1a611c1282610ff7565b5360015b8351811015611ca45780611c51611c41611c38610b146112a56001968a611004565b60041c600f1690565b60f81b6001600160f81b03191690565b611c6a611c60611bf384611825565b915f1a9185611004565b53611c91600f611c80610b146112a5858a611004565b1660f81b6001600160f81b03191690565b611c9d611c6083611825565b5301611c16565b509150565b50611cbf611bf8611cba8451611825565b6108df565b60015b8351811015611ca45780611ce4611c41611c38610b146112a56001968a611004565b611cf8611c60611cf3846108ee565b611825565b53611d0e600f611c80610b146112a5858a611004565b611d25611c60611d20611cf3856108ee565b610890565b5301611cc2565b565b919091611d3c8251846108ba565b611d468251611825565b10611de5575f5b8251811015611ddc57611d69611d6382866108ba565b60011690565b611dbe57611d92611c38610b146112a5611d8c611d86868a6108ba565b60011c90565b86611004565b60ff611da7610b24610b146112a58689611004565b911603611db657600101611d4d565b505050505f90565b600f611dd6610b146112a5611d8c611d86868a6108ba565b16611d92565b50505050600190565b5050505f9056fea2646970667358221220290b4349508c088a1ee4b25b8002172ad42ab21d1e2ad16b6e9456f82cd5a8db64736f6c634300081e0033 diff --git a/artifacts/native_runtime.hex b/artifacts/native_runtime.hex new file mode 100644 index 0000000..d565629 --- /dev/null +++ b/artifacts/native_runtime.hex @@ -0,0 +1 @@ +0x60806040526004361015610011575f80fd5b5f3560e01c8063046f7da2146101445780631aa7c0ec1461013f57806323a8b41a1461013a5780632feef2ec14610135578063308657d71461013057806333ee5f351461012b5780633ccfd60b146101265780633d2691bc146101215780635a4fd6451461011c57806364c9ec6f1461011757806380f323a71461011257806381972d001461010d5780638677ab23146101085780638bd03d0a14610103578063a65e2cfd146100fe578063cb766a56146100f9578063d415b3f9146100f4578063f3a504f2146100ef5763fe03a460146100ea575f80fd5b6107a7565b610782565b610765565b610741565b610672565b610655565b610611565b6105c2565b6105a5565b6104e7565b6104cb565b6104af565b6103ef565b6103d2565b6103b0565b610376565b6101cb565b6101a3565b3461019f575f36600319011261019f577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03163303610190576007805460ff19169055005b63618bbdd560e01b5f5260045ffd5b5f80fd5b3461019f575f36600319011261019f576003546040516001600160a01b039091168152602090f35b3461019f57604036600319011261019f5760043567ffffffffffffffff811161019f57806004019060c0600319823603011261019f5761021760243561021184806107c4565b90610934565b61022a61022483806107c4565b90610aa4565b602482019161026b61026761023f85876107c4565b61024f60448697939701896107c4565b60a48701979161025f898c6107c4565b949093610bad565b1590565b610367576102676102b491608461028b61028588806107c4565b90610bd4565b9161025f60648201966102ab6102a1898c6107c4565b959094018b6107c4565b9290918b6107c4565b610358576102676102c86102ce92856107c4565b90610c35565b610349576102e26102679161032c936107c4565b907f0000000000000000000000000000000000000000000000000000000000000000917f000000000000000000000000000000000000000000000000000000000000000091610d05565b61033a57610338610f20565b005b633cff557560e11b5f5260045ffd5b632b96f51360e01b5f5260045ffd5b637b374dd160e01b5f5260045ffd5b63c89e37db60e01b5f5260045ffd5b3461019f575f36600319011261019f5760206040517f00000000000000000000000000000000000000000000000000000000000000008152f35b3461019f575f36600319011261019f57602060ff600754166040519015158152f35b3461019f575f36600319011261019f576020600454604051908152f35b3461019f575f36600319011261019f5760ff60075460081c16156104a0577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316330361019057610445610f86565b61044d610fbd565b61046461ff0019600754166007555f6001555f8055565b8015610491575f80808093335af161047a610852565b501561048257005b63b12d13eb60e01b5f5260045ffd5b6353cd7f7960e01b5f5260045ffd5b636af784dd60e11b5f5260045ffd5b3461019f575f36600319011261019f5760206040516101008152f35b3461019f575f36600319011261019f5760205f54604051908152f35b5f36600319011261019f57600454801515908161059b575b50610568575b60075460ff8160081c16156104a05760ff16610559576105236108c7565b61054a575f5460011c341061053b5761033834610fcf565b63e92c469f60e01b5f5260045ffd5b63129f78e960e11b5f5260045ffd5b632479328960e01b5f5260045ffd5b6005545f54818101809111610596575f5560065490810180911161059657600655610591610f86565b610505565b61087c565b905042115f6104ff565b3461019f575f36600319011261019f576020600554604051908152f35b3461019f575f36600319011261019f577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03163303610190576007805460ff19166001179055005b3461019f575f36600319011261019f576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b3461019f575f36600319011261019f576020600154604051908152f35b604036600319011261019f576004356024357f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031633036101905760075460081c60ff16610732578115610723578015610714576106d781836108ba565b3403610705576106ec826106f1935f55600255565b600155565b61033861010061ff00196007541617600755565b63201c04ab60e01b5f5260045ffd5b63932ca0a360e01b5f5260045ffd5b63ea1083a760e01b5f5260045ffd5b635adf638760e01b5f5260045ffd5b3461019f575f36600319011261019f57602061075b6108c7565b6040519015158152f35b3461019f575f36600319011261019f576020600254604051908152f35b3461019f575f36600319011261019f57602060ff60075460081c166040519015158152f35b3461019f575f36600319011261019f576020600654604051908152f35b903590601e198136030182121561019f570180359067ffffffffffffffff821161019f5760200191813603831361019f57565b634e487b7160e01b5f52604160045260245ffd5b6040519190601f01601f1916820167ffffffffffffffff81118382101761083157604052565b6107f7565b67ffffffffffffffff811161083157601f01601f191660200190565b3d15610877573d9061086b61086683610836565b61080b565b9182523d5f602084013e565b606090565b634e487b7160e01b5f52601160045260245ffd5b906001820180921161059657565b906015820180921161059657565b600101908160011161059657565b9190820180921161059657565b60045480151590816108d7575090565b905042111590565b60011981019190821161059657565b5f1981019190821161059657565b9190820391821161059657565b92919261091861086683610836565b938285528282011161019f57815f926020928387013784010152565b9061094861026760075460ff9060081c1690565b6104a0576003546001600160a01b03163314801590610a08575b6109f9574383116109ea5761010061097a84436108fc565b116109db57824080156109cc57610992368385610909565b60208151910120036109bd576109a791611015565b036109ae57565b63048a12f560e11b5f5260045ffd5b63ff28378760e01b5f5260045ffd5b63bfc9f0d360e01b5f5260045ffd5b63c42a018560e01b5f5260045ffd5b63058968cf60e41b5f5260045ffd5b6337b5f20360e21b5f5260045ffd5b50610a146102676108c7565b610962565b634e487b7160e01b5f52603260045260245ffd5b9015610a365790565b610a19565b90821015610a36570190565b60ff60f6199116019060ff821161059657565b60ff607f199116019060ff821161059657565b60ff60bf199116019060ff821161059657565b60ff60b6199116019060ff821161059657565b60ff166001019060ff821161059657565b905f600360fe1b6001600160f81b0319610acf610ac18587610a2d565b356001600160f81b03191690565b1610610b9e57601f60fb1b6001600160f81b0319610af0610ac18587610a2d565b1610610b955780610b2a610b24610b1f610b1a610b14610ac1610b3097898b610a3b565b60f81c90565b610a47565b610a93565b60ff1690565b906108ba565b905b5f5b60048110610b805750600560fd1b906001600160f81b031990610b5d90610ac190859087610a3b565b1603610b7157610b6c90610890565b013590565b633954003560e11b5f5260045ffd5b91610b8e600191838661107d565b9201610b34565b50600190610b32565b63c0098bd960e01b5f5260045ffd5b610bc3610bcb92939495610bd198973691610909565b923691610909565b906111e7565b90565b90610bdf81836113a1565b905f5b60058110610c205750600560fd1b906001600160f81b031990610c0790849086610a3b565b351603610b715760018101811161059657016001013590565b91610c2e600191838661107d565b9201610be2565b5f9082151580610ce9575b610ce0575b60c060ff610c5a610b14610ac1868887610a3b565b1610610cd157610b14610ac182858560f860ff610c84610b14610ac1839b60019d610cae9c610a3b565b1610610cc85780610b2a610b24610b1f610b1a610b14610ac1610ca897898b610a3b565b91610a3b565b1603610cb957600190565b63e9dd8a9d60e01b5f5260045ffd5b610ca890610890565b631bd5dcf760e31b5f5260045ffd5b60019150610c45565b50608060ff610cfe610b14610ac18786610a2d565b1610610c40565b90916003905f84151580610f04575b610ebc575b60c060ff610d2e610b14610ac1858a8a610a3b565b1610610cd1578060f860ff610d4d610b14610ac1610d73968b8b610a3b565b1610610eb35760ff610d6c610b1f610b1a610b14610ac1868c8c610a3b565b16906108ba565b915f905b808210610e9c575050609460ff610d95610b14610ac1868989610a3b565b1603610e8d576001600160a01b03168282016001013560601c03610e7e57610dbc9061089e565b91610dce610b14610ac1858486610a3b565b925f9260ff851694608086105f14610dff5750505050505b03610df057600190565b6355e97b0d60e01b5f5260045ffd5b90919293946080145f14610e185750505050505f610de6565b610b24610e2791939293610a5a565b915f935b838510610e3c575050505050610de6565b9091929394610e4d60019160081b90565b610e72610b24610b14610ac1610e6b8b610e668b610890565b6108ba565b8789610a3b565b17950193929190610e2b565b63c0ee95bb60e01b5f5260045ffd5b63e6c4247b60e01b5f5260045ffd5b9092610eab600191878761107d565b930190610d77565b60ff6001610d6c565b509050610ecf610b14610ac18585610a2d565b6001919060ff16808303610ee65750600491610d19565b600203610ef557600591610d19565b636fc3daa360e11b5f5260045ffd5b50608060ff610f19610b14610ac18989610a2d565b1610610d14565b6005545f548101809111610596576001548101809111610596575f808080936003546001600160601b0360a01b8116600355826005558260045561ff0019600754166007558260015582805560018060a01b03165af1610f7e610852565b501561048257565b610f8e6108c7565b610fae576001600160601b0360a01b600354166003555f6005555f600455565b639cbc1de160e01b5f5260045ffd5b60015460025481018091116105965790565b336001600160601b0360a01b600354161760035561012c420180421161059657600455600555565b805115610a365760200190565b908151811015610a36570160200190565b919061102181846113a1565b905f5b60088110611068575061103792936114fe565b50905f805b8351821015611063576001906110528386611004565b5160f81c9060081b1791019061103c565b925050565b91611076600191838761107d565b9201611024565b9190808210156111d857611098610b14610ac1848487610a3b565b9060ff821660808110156110b357505050610bd19150610890565b91929160b88110156110db575050610bd19250610b246110d5610b2a92610890565b92610a5a565b90929060c08110156111515750610b246110f791949394610a80565b915f935f915b84831061111857505050610bd19291610e66610e6692610890565b90919461112760019160081b90565b611147610b24610b14610ac16111408b610e668b610890565b8888610a3b565b17950191906110fd565b90929060f811156111775750610bd19250610b24611171610b2a92610890565b92610a6d565b9291610b2461118591610a47565b915f935f915b8483106111a657505050610bd19291610e66610e6692610890565b9091946111b560019160081b90565b6111ce610b24610b14610ac16111408b610e668b610890565b179501919061118b565b6318d76ae160e11b5f5260045ffd5b919390929190600360fe1b6001600160f81b0319611208610ac18689610a2d565b161061139257601f60fb1b6001600160f81b0319611229610ac18689610a2d565b16106113885761124d611248610b24610b1a610b14610ac1888b610a2d565b6108ac565b9492905b945f5b82821061126657505050505050505f90565b61128461127d8361127836878a610909565b61166f565b90936108ba565b96825160208401200361132657600360fe1b6112c06112b36112a585610ff7565b516001600160f81b03191690565b6001600160f81b03191690565b10611326578590846001601f60fb1b6112de6112b36112a588610ff7565b101561136a575b6112ef81866117f6565b60118103611331575061130194611981565b94911561132657841561131a5793915b91959093611254565b50505050505050600190565b505050505050505f90565b90935060021415905061135e5784879261134a9461183b565b94911561132657841561131a579391611311565b50505050505050505f90565b50611383611248610b24610b1a610b146112a589610ff7565b6112e5565b6001949290611251565b63ebb47d1d60e01b5f5260045ffd5b5f600360fe1b6001600160f81b03196113bd610ac18686610a2d565b1610610b9e57601f60fb1b6001600160f81b03196113de610ac18686610a2d565b16106114b05780610b2a610b24610b1f610b1a610b14610ac1611402978a8a610a3b565b905b61a5bd461480156114a5575b61141b575b50905090565b5f5b600381106114905750600360fe1b61143c6112b3610ac1858786610a3b565b10610b9e57601f60fb1b6114576112b3610ac1858786610a3b565b1061148057610b24610b1f610b1a610b14610ac18661147998610b2a97610a3b565b805f611415565b5061148b9150610890565b611479565b9161149e600191858461107d565b920161141d565b5061a5bf4614611410565b50600190611404565b6040906114c58261080b565b6001815291601f1901366020840137565b906114e361086683610836565b82815280926114f4601f1991610836565b0190602036910137565b818310156111d857611517610b14610ac1858585610a3b565b9260ff8416608081101561155157505050506115316114b9565b9060f81b6001600160f81b0319165f1a61154a82610ff7565b5390600190565b60b881969592939496105f146115bf5750610b2461156e91610a5a565b91611578836114d6565b945f5b84811061158f5750505050610bd1906108ac565b806115ac610ac16115a5600194610e6689610890565b8587610a3b565b5f1a6115b8828a611004565b530161157b565b60c0111561166057610b246115d391610a80565b905f925f5b83811061163157506115e9846114d6565b955f5b858110611604575050505090610e66610bd1926108ac565b8061161e610ac16115a5600194610e668a610e668b610890565b5f1a61162a828b611004565b53016115ec565b9360019060081b611658610b24610b14610ac16116518a610e668a610890565b8c88610a3b565b1794016115d8565b636b2e9c5f60e11b5f5260045ffd5b80518210156111d857611688610b146112a58484611004565b9160ff831660808110156116a1575050506115316114b9565b919392909160b881101561170b5750610b246116bc91610a5a565b906116c6826114d6565b935f5b8381106116dc57505050610bd1906108ac565b806116f86112a56116f2600194610e6688610890565b85611004565b5f1a6117048289611004565b53016116c9565b60c011156117a957610b2461171f91610a80565b5f915f5b82811061177b5750611734836114d6565b945f5b84811061174e5750505090610e66610bd1926108ac565b806117686112a56116f2600194610e6689610e668a610890565b5f1a611774828a611004565b5301611737565b9260019060081b6117a1610b24610b146112a561179b89610e6689610890565b8b611004565b179301611723565b50916117b58382611a96565b926117bf846114d6565b915f5b8581106117d0575050509190565b806117e36112a56116f2600194876108ba565b5f1a6117ef8287611004565b53016117c2565b5f92915b81518110156118215761180d8183611a96565b8101809111610596576001909301926117fa565b5050565b908160011b918083046002149015171561059657565b83949291611849818361166f565b9390611868602061185f610b146112a585610ff7565b16151591611bc3565b9788911561190a575061187c9051876108ba565b6118868251611825565b1461189b575b505050505050505f905f905f90565b868660019282516118f8575b5050506118b5575b8061188c565b6118c8926118c2916108ba565b9061166f565b50602081519101209060208151910120146118e657808080806118af565b6118f19151906108ba565b6001915f90565b6119029350611d2e565b86865f6118a7565b61191b939495965061026792611d2e565b6119745761192c926118c2916108ba565b50908151602081145f146119545750602061194c920151925b51906108ba565b916001929190565b801561196857602061194c93012092611945565b505050505f905f905f90565b50505050505f905f905f90565b9190929361198f8251611825565b851015611a395750610b146112a56119b1926119ab8760011c90565b90611004565b60018416611a305760041c600f16915b905f925b60ff81168410611a1057506119da925061166f565b5080518015611a055761194c91602082036119fb5760209150015191610890565b6020012091610890565b5050505f905f905f90565b90916001611a2482610b2a60ff9487611a96565b940193929190506119c5565b600f16916119c1565b9290509392935f915b60108310611a7c57611a54925061166f565b50602081519101209060208151910120145f14611a7357600191905f90565b5f915081908190565b90611a8d81610b2a60019385611a96565b92019190611a42565b9081518110156111d857611ab0610b146112a58385611004565b9160ff83166080811015611ac75750505050600190565b60b8811015611ae257505050610b24610b1f610bd192610a5a565b60c0811015611b4e575091610b24611af991610a80565b905f925f915b838310611b165750505090610e66610bd1926108ac565b909193611b2560019160081b90565b611b44610b24610b146112a5611b3e8a610e6689610890565b88611004565b1794019190611aff565b60f81115611b67575050610b24610b1f610bd192610a6d565b91610b24611b7491610a47565b905f925f915b838310611b915750505090610e66610bd1926108ac565b909193611ba060019160081b90565b611bb9610b24610b146112a5611b3e8a610e6689610890565b1794019190611b7a565b90815115611d2c57611bda610b146112a584610ff7565b6010811615611ca957611bfd611bf8611bf38551611825565b6108ee565b6114d6565b9060f81b600f60f81b165f1a611c1282610ff7565b5360015b8351811015611ca45780611c51611c41611c38610b146112a56001968a611004565b60041c600f1690565b60f81b6001600160f81b03191690565b611c6a611c60611bf384611825565b915f1a9185611004565b53611c91600f611c80610b146112a5858a611004565b1660f81b6001600160f81b03191690565b611c9d611c6083611825565b5301611c16565b509150565b50611cbf611bf8611cba8451611825565b6108df565b60015b8351811015611ca45780611ce4611c41611c38610b146112a56001968a611004565b611cf8611c60611cf3846108ee565b611825565b53611d0e600f611c80610b146112a5858a611004565b611d25611c60611d20611cf3856108ee565b610890565b5301611cc2565b565b919091611d3c8251846108ba565b611d468251611825565b10611de5575f5b8251811015611ddc57611d69611d6382866108ba565b60011690565b611dbe57611d92611c38610b146112a5611d8c611d86868a6108ba565b60011c90565b86611004565b60ff611da7610b24610b146112a58689611004565b911603611db657600101611d4d565b505050505f90565b600f611dd6610b146112a5611d8c611d86868a6108ba565b16611d92565b50505050600190565b5050505f9056fea2646970667358221220290b4349508c088a1ee4b25b8002172ad42ab21d1e2ad16b6e9456f82cd5a8db64736f6c634300081e0033 diff --git a/artifacts/runtime_bytecode.hex b/artifacts/runtime_bytecode.hex deleted file mode 100644 index 63b832d..0000000 --- a/artifacts/runtime_bytecode.hex +++ /dev/null @@ -1 +0,0 @@ -60806040526004361015610011575f80fd5b5f3560e01c8063046f7da2146101845780631aa7c0ec1461017f5780632feef2ec1461017a578063308657d71461017557806333ee5f35146101705780633ccfd60b1461016b57806350431ce4146101665780635922e8f8146101615780635a4fd6451461015c57806380f323a71461015757806381972d00146101525780638677ab231461014d5780638bd03d0a146101485780639940686e14610143578063a65e2cfd1461013e578063ae6c3fcf14610139578063cb766a5614610134578063d415b3f91461012f578063d4899a621461012a578063df23579414610125578063ede7f6a314610120578063f3a504f21461011b5763fe03a46014610116575f80fd5b610e3a565b610e15565b610cb3565b610bba565b610b80565b610b63565b610b3f565b610a4f565b610904565b61078f565b610772565b61072e565b6106db565b6106be565b6106a2565b6104cd565b6103b6565b610279565b61025c565b61023a565b610200565b6101d8565b346101d4575f3660031901126101d4576101c8337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031614610e57565b6007805460ff19169055005b5f80fd5b346101d4575f3660031901126101d4576003546040516001600160a01b039091168152602090f35b346101d4575f3660031901126101d45760206040517f00000000000000000000000000000000000000000000000000000000000000008152f35b346101d4575f3660031901126101d457602060ff600754166040519015158152f35b346101d4575f3660031901126101d4576020600454604051908152f35b346101d4575f3660031901126101d4576007546102a09060081c60ff16610ea3565b610ea3565b5f60206103777f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166102db811515610ee5565b61030f337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031614610e57565b610317611584565b61032660015460025490610f8d565b61033661ff001960075416600755565b61033f5f600155565b84805561034d811515610f9a565b60405163a9059cbb60e01b8152336004820152602481019190915293849283919082906044820190565b03925af180156103b15761038757005b6103a89060203d6020116103aa575b6103a08183610ff2565b810190611019565b005b503d610396565b611031565b346101d4575f3660031901126101d4576103d760ff60075460081c16610ea3565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031661048f57610439337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031614610e57565b610441611584565b6103a85f80808061045760015460025490610f8d565b61046761ff001960075416600755565b6104705f600155565b81805561047e811515610f9a565b335af1610489611058565b50611087565b60405162461bcd60e51b8152602060048201526016602482015275055736520776974686472617720666f722045524332360541b6044820152606490fd5b346101d45760403660031901126101d45760043567ffffffffffffffff81116101d4578060040160c060031983360301126101d457602435917f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166106655761058e826106096106046105fe836105f86105f382608461060e9a61056961065d9e6105636106589f806110c9565b906117d3565b6105b86105b361058261057c86806110c9565b906119f4565b602484019d8e876110c9565b9061059c60448701896110c9565b906105ab60a48901809b6110c9565b949093611adc565b6110fc565b6105ab6105ce6105c888806110c9565b90611b03565b936105ea6105e060648501809a6110c9565b959094018d6110c9565b9290918d6110c9565b611148565b846110c9565b90611c38565b611194565b6110c9565b907f0000000000000000000000000000000000000000000000000000000000000000917f000000000000000000000000000000000000000000000000000000000000000091611dea565b6111df565b6103a8612025565b60405162461bcd60e51b8152602060048201526015602482015274055736520636f6c6c65637420666f7220455243323605c1b6044820152606490fd5b346101d4575f3660031901126101d45760205f54604051908152f35b346101d4575f3660031901126101d4576020600554604051908152f35b346101d4575f3660031901126101d45761071f337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031614610e57565b6007805460ff19166001179055005b346101d4575f3660031901126101d4576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b346101d4575f3660031901126101d4576020600154604051908152f35b346101d45760203660031901126101d4576007546004356107b660ff600884901c16610ea3565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169161080790610802906107fe906107f886151561122b565b60ff1690565b1590565b611277565b60045480151590816108fa575b506108c8575b61082d6108286107fe6114e4565b6112bc565b61084361083b5f5460011c90565b821015611313565b6040516323b872dd60e01b81523360048201523060248201526044810182905291602090839060649082905f905af19182156103b1576103a8926108ab575b50600380546001600160a01b031916331790556108a66108a142610f4f565b600455565b600555565b6108c39060203d6020116103aa576103a08183610ff2565b610882565b6108d56005545f54610f8d565b5f556108ed6108e8600554600654610f8d565b600655565b6108f5611584565b61081a565b905042115f610814565b346101d45760403660031901126101d4575f6020610a0f6004356109d0602435610958337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031614610e57565b61097361096e6107fe60075460ff9060081c1690565b611373565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316926109cb906109ad8515156113bf565b6109b881151561140b565b6109c3831515611457565b808855600255565b600155565b6109df60025460015490610f8d565b6040516323b872dd60e01b8152336004820152306024820152604481019190915293849283919082906064820190565b03925af180156103b157610a32575b6103a861010061ff00196007541617600755565b610a4a9060203d6020116103aa576103a08183610ff2565b610a1e565b5f3660031901126101d457610aaa6108026107fe600754610a7761029b8260ff9060081c1690565b6107f87f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316156114a3565b6004548015159081610b35575b50610b08575b610acb6108286107fe6114e4565b610ae1610ad95f5460011c90565b341015611313565b600380546001600160a01b03191633179055610aff6108a142610f4f565b6103a834600555565b610b156005545f54610f8d565b5f55610b286108e8600554600654610f8d565b610b30611584565b610abd565b905042115f610ab7565b346101d4575f3660031901126101d4576020610b596114e4565b6040519015158152f35b346101d4575f3660031901126101d4576020600254604051908152f35b346101d4575f3660031901126101d45760206040517f00000000000000000000000000000000000000000000000000000000000000008152f35b60403660031901126101d457600435602435610c00337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031614610e57565b610c1260ff60075460081c1615611373565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316610c79576109cb82610c52610a1e94151561140b565b610c5d831515611457565b610c71610c6a8483610f8d565b34146114fc565b805f55600255565b60405162461bcd60e51b815260206004820152601260248201527105573652066756e6420666f722045524332360741b6044820152606490fd5b346101d45760403660031901126101d45760043567ffffffffffffffff81116101d4578060040160a060031983360301126101d4577f00000000000000000000000000000000000000000000000000000000000000009160243591906001600160a01b03841615610dd157610dc993610d7883610d39610dc496610563836084986110c9565b610d466105c882806110c9565b906106096105f36024870193610d5c85856110c9565b90610d6a60448b01876110c9565b906105ab60648d01896110c9565b7f0000000000000000000000000000000000000000000000000000000000000000947f0000000000000000000000000000000000000000000000000000000000000000940135916120d1565b61153f565b6103a8612232565b606460405162461bcd60e51b815260206004820152602060248201527f55736520636f6c6c6563744e617469766520666f72206e6174697665204554486044820152fd5b346101d4575f3660031901126101d457602060ff60075460081c166040519015158152f35b346101d4575f3660031901126101d4576020600654604051908152f35b15610e5e57565b60405162461bcd60e51b815260206004820152601d60248201527f4f6e6c792063616c6c61626c6520627920746865206465706c6f7965720000006044820152606490fd5b15610eaa57565b60405162461bcd60e51b815260206004820152601360248201527210dbdb9d1c9858dd081b9bdd08199d5b991959606a1b6044820152606490fd5b15610eec57565b60405162461bcd60e51b815260206004820152602160248201527f5573652077697468647261774e617469766520666f72206e61746976652045546044820152600960fb1b6064820152608490fd5b634e487b7160e01b5f52601160045260245ffd5b9061012c8201809211610f5e57565b610f3b565b9060018201809211610f5e57565b9060158201809211610f5e57565b6001019081600111610f5e57565b91908201809211610f5e57565b15610fa157565b60405162461bcd60e51b81526020600482015260156024820152744e6f20776974686472617761626c652066756e647360581b6044820152606490fd5b634e487b7160e01b5f52604160045260245ffd5b90601f8019910116810190811067ffffffffffffffff82111761101457604052565b610fde565b908160209103126101d4575180151581036101d45790565b6040513d5f823e3d90fd5b67ffffffffffffffff811161101457601f01601f191660200190565b3d15611082573d906110698261103c565b916110776040519384610ff2565b82523d5f602084013e565b606090565b1561108e57565b60405162461bcd60e51b8152602060048201526013602482015272115512081d1c985b9cd9995c8819985a5b1959606a1b6044820152606490fd5b903590601e19813603018212156101d4570180359067ffffffffffffffff82116101d4576020019181360383136101d457565b1561110357565b60405162461bcd60e51b815260206004820152601d60248201527f496e76616c6964207472616e73616374696f6e204d50542070726f6f660000006044820152606490fd5b1561114f57565b60405162461bcd60e51b815260206004820152601960248201527f496e76616c69642072656365697074204d50542070726f6f66000000000000006044820152606490fd5b1561119b57565b606460405162461bcd60e51b815260206004820152602060248201527f5472616e73616374696f6e206661696c6564202873746174757320213d2031296044820152fd5b156111e657565b60405162461bcd60e51b815260206004820152601760248201527f496e76616c6964206e6174697665207472616e736665720000000000000000006044820152606490fd5b1561123257565b60405162461bcd60e51b815260206004820152601d60248201527f55736520626f6e644e617469766520666f72206e6174697665204554480000006044820152606490fd5b1561127e57565b60405162461bcd60e51b815260206004820152601660248201527510d85b98d95b1b185d1a5bdb881c995c5d595cdd195960521b6044820152606490fd5b156112c357565b60405162461bcd60e51b815260206004820152602260248201527f416e6f74686572206578656375746f7220697320616c726561647920626f6e64604482015261195960f21b6064820152608490fd5b1561131a57565b60405162461bcd60e51b815260206004820152602b60248201527f426f6e64206d757374206265206174206c656173742068616c66206f6620726560448201526a1dd85c9908185b5bdd5b9d60aa1b6064820152608490fd5b1561137a57565b60405162461bcd60e51b815260206004820152601760248201527f436f6e747261637420616c72656164792066756e6465640000000000000000006044820152606490fd5b156113c657565b60405162461bcd60e51b815260206004820152601d60248201527f5573652066756e644e617469766520666f72206e6174697665204554480000006044820152606490fd5b1561141257565b60405162461bcd60e51b815260206004820152601e60248201527f52657761726420616d6f756e74206d757374206265206e6f6e2d7a65726f00006044820152606490fd5b1561145e57565b60405162461bcd60e51b815260206004820152601f60248201527f5061796d656e7420616d6f756e74206d757374206265206e6f6e2d7a65726f006044820152606490fd5b156114aa57565b60405162461bcd60e51b8152602060048201526012602482015271055736520626f6e6420666f722045524332360741b6044820152606490fd5b60045480151590816114f4575090565b905042111590565b1561150357565b60405162461bcd60e51b8152602060048201526014602482015273125b98dbdc9c9958dd0811551208185b5bdd5b9d60621b6044820152606490fd5b1561154657565b60405162461bcd60e51b8152602060048201526016602482015275125b9d985b1a5908151c985b9cd9995c88195d995b9d60521b6044820152606490fd5b61158c6114e4565b6115b1576bffffffffffffffffffffffff60a01b600354166003555f6005555f600455565b60405162461bcd60e51b815260206004820152602160248201527f43616e6e6f74207265736574207768696c6520626f6e642069732061637469766044820152606560f81b6064820152608490fd5b1561160757565b60405162461bcd60e51b815260206004820152601d60248201527f54617267657420626c6f636b20697320696e20746865206675747572650000006044820152606490fd5b600119810191908211610f5e57565b5f19810191908211610f5e57565b91908203918211610f5e57565b1561167d57565b60405162461bcd60e51b815260206004820152601460248201527315185c99d95d08189b1bd8dac81d1bdbc81bdb1960621b6044820152606490fd5b156116c057565b60405162461bcd60e51b815260206004820152601d60248201527f556e61626c6520746f20726574726965766520626c6f636b20686173680000006044820152606490fd5b9291926117118261103c565b9161171f6040519384610ff2565b8294818452818301116101d4578281602093845f960137010152565b1561174257565b60405162461bcd60e51b815260206004820152601a60248201527f426c6f636b206865616465722068617368206d69736d617463680000000000006044820152606490fd5b1561178e57565b60405162461bcd60e51b815260206004820152601c60248201527f48656164657220626c6f636b206e756d626572206d69736d61746368000000006044820152606490fd5b9190916117e760ff60075460081c16610ea3565b6003546001600160a01b03163314806118c2575b1561187e5761187c926118769161181443851115611600565b6118496118218543611669565b7f00000000000000000000000000000000000000000000000000000000000000001015611676565b61187184406118598115156116b9565b611864368585611705565b602081519101201461173b565b612375565b14611787565b565b606460405162461bcd60e51b815260206004820152602060248201527f4f6e6c7920626f6e646564206578656375746f722063616e20636f6c6c6563746044820152fd5b506118cb6114e4565b6117fb565b634e487b7160e01b5f52603260045260245ffd5b90156118ed5790565b6118d0565b908210156118ed570190565b1561190557565b60405162461bcd60e51b815260206004820152601060248201526f125b9d985b1a5908149314081b1a5cdd60821b6044820152606490fd5b60ff60f6199116019060ff8211610f5e57565b60ff607f199116019060ff8211610f5e57565b60ff60bf199116019060ff8211610f5e57565b60ff60b6199116019060ff8211610f5e57565b60ff166001019060ff8211610f5e57565b156119a157565b60405162461bcd60e51b815260206004820152602560248201527f496e76616c6964207472616e73616374696f6e73526f6f7420524c5020656e636044820152646f64696e6760d81b6064820152608490fd5b9091905f611a2c600360fe1b6001600160f81b0319611a24611a1688876118e4565b356001600160f81b03191690565b1610156118fe565b601f60fb1b6001600160f81b0319611a47611a1687866118e4565b1610611ad45780611a7b6107f8611a76611a71611a6b611a16611a81978b8a6118f2565b60f81c90565b61193d565b611989565b90610f8d565b5f5b60048110611abf5750611ab5611aba929394600560fd1b90611aae611a168560ff60f81b93896118f2565b161461199a565b610f63565b013590565b90611acd6001918685612429565b9101611a83565b506001611a81565b611af2611afa92939495611b0098973691611705565b923691611705565b906125dd565b90565b90611b0e81836127d9565b905f5b60058110611b955750600560fd1b906001600160f81b031990611b36908490866118f2565b351603611b4657611aba90610f63565b60405162461bcd60e51b815260206004820152602160248201527f496e76616c6964207265636569707473526f6f7420524c5020656e636f64696e6044820152606760f81b6064820152608490fd5b91611ba36001918386612429565b9201611b11565b15611bb157565b60405162461bcd60e51b81526020600482015260136024820152720496e76616c6964207265636569707420524c5606c1b6044820152606490fd5b15611bf357565b60405162461bcd60e51b815260206004820152601d60248201527f5265636569707420737461747573206973206e6f7420737563636573730000006044820152606490fd5b60ff611cb6611a6b611a16600194611cbd965f81151580611cd2575b611ccb575b611c7860c088611c70611a6b611a1686888a6118f2565b161015611baa565b60f887611c8c611a6b611a168587896118f2565b1610611cc25780611a7b6107f8611a76611a71611a6b611a16611cb097898b6118f2565b916118f2565b1614611bec565b600190565b611cb090610f63565b5086611c59565b50608087611ce6611a6b611a1686886118e4565b1610611c54565b15611cf457565b60405162461bcd60e51b815260206004820152600e60248201526d0496e76616c696420747820524c560941b6044820152606490fd5b15611d3157565b60405162461bcd60e51b8152602060048201526012602482015271496e76616c696420746f206164647265737360701b6044820152606490fd5b15611d7257565b60405162461bcd60e51b81526020600482015260126024820152710a4cac6d2e0d2cadce840dad2e6dac2e8c6d60731b6044820152606490fd5b15611db357565b60405162461bcd60e51b815260206004820152600f60248201526e082dadeeadce840dad2e6dac2e8c6d608b1b6044820152606490fd5b90916003905f84151580612009575b611f8c575b80611e2260c060ff611e1a611a6b611a16611e5d978c8c6118f2565b161015611ced565b60f860ff611e37611a6b611a16858b8b6118f2565b1610611f835760ff611e56611a76611a71611a6b611a16868c8c6118f2565b1690610f8d565b915f905b808210611f6c57505090611eaa611eaf92611e91609460ff611e8a611a6b611a16888c8c6118f2565b1614611d2a565b6001600160a01b03166001838601013560601c14611d6b565b610f71565b91611ec1611a6b611a168584866118f2565b925f9260ff851694608086105f14611ee457505050505090611cbd915b14611dac565b90919293946080145f14611f01575050505050611cbd905f611ede565b6107f8611f1091939293611950565b915f935b838510611f2a57505050505090611cbd91611ede565b9091929394611f3b60019160081b90565b611f606107f8611a6b611a16611f598b611f548b610f63565b610f8d565b87896118f2565b17950193929190611f14565b9092611f7b6001918787612429565b930190611e61565b60ff6001611e56565b509050611f9f611a6b611a1685856118e4565b6001919060ff16808303611fbc5750611e5d6004925b9050611dfe565b600203611fce57611e5d600592611fb5565b60405162461bcd60e51b8152602060048201526013602482015272556e737570706f72746564207478207479706560681b6044820152606490fd5b50608060ff61201e611a6b611a1689896118e4565b1610611df9565b6005545f548101809111610f5e576001548101809111610f5e575f80808061187c946003546bffffffffffffffffffffffff60a01b8116600355826005558260045561207761ff001960075416600755565b60018390558280556001600160a01b03165af1610489611058565b1561209957565b60405162461bcd60e51b815260206004820152601060248201526f0496e76616c6964206c6f677320524c560841b6044820152606490fd5b959493929190805f818981151580612216575b61220d575b60ff611c70611a6b611a16866121019660c0966118f2565b8860f860ff612117611a6b611a168688876118f2565b16106121fb576107f8611a76611a71611a6b611a168661213a98611a7b976118f2565b81905b885f5b600381106121e2575060c06121626107f8611a6b611a168688612169976118f2565b1015612092565b8860f86121806107f8611a6b611a168688876118f2565b106121d1576107f8611a76611a71611a6b611a16866121a298611a7b976118f2565b915b5f905b8082106121ba575050611b0095966129c0565b90926121c9600191848b612429565b9301906121a7565b506121dc9150610f63565b916121a4565b92916001926121f092612429565b910190888392612140565b506122069150610f63565b819061213d565b600192506120e9565b50608060ff61222b611a6b611a1686866118e4565b16106120e4565b61224c6122436005545f5490610f8d565b60015490610f8d565b6003546001600160a01b0316600380546001600160a01b03191690556122715f600555565b61227a5f600455565b61228a61ff001960075416600755565b6122935f600155565b5f80554662aa36a70361232557604051633419e74d60e21b81526001600160a01b039091166004820152602481019190915260208180604481015b03815f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165af180156103b15761230a5750565b6123229060203d6020116103aa576103a08183610ff2565b50565b60405163a9059cbb60e01b81526001600160a01b039091166004820152602481019190915260208180604481016122ce565b8051156118ed5760200190565b9081518110156118ed570160200190565b919061238181846127d9565b905f5b600881106123c857506123979293612aeb565b50905f805b83518210156123c3576001906123b28386612364565b5160f81c9060081b1791019061239c565b925050565b916123d66001918387612429565b9201612384565b156123e457565b60405162461bcd60e51b815260206004820152601860248201527f524c50206f6666736574206f7574206f6620626f756e647300000000000000006044820152606490fd5b91906124368183106123dd565b612447611a6b611a168484876118f2565b9060ff8216608081101561246257505050611b009150610f63565b91929160b881101561248a575050611b0092506107f8612484611a7b92610f63565b92611950565b90929060c081101561250057506107f86124a691949394611976565b915f935f915b8483106124c757505050611b009291611f54611f5492610f63565b9091946124d660019160081b90565b6124f66107f8611a6b611a166124ef8b611f548b610f63565b88886118f2565b17950191906124ac565b90929060f811156125265750611b0092506107f8612520611a7b92610f63565b92611963565b92916107f86125349161193d565b915f935f915b84831061255557505050611b009291611f54611f5492610f63565b90919461256460019160081b90565b61257d6107f8611a6b611a166124ef8b611f548b610f63565b179501919061253a565b1561258e57565b60405162461bcd60e51b815260206004820152602160248201527f457870656374656420524c50206c69737420666f722070726f6f66206e6f64656044820152607360f81b6064820152608490fd5b919390929190612609600360fe1b6001600160f81b0319612601611a16878a6118e4565b161015612587565b601f60fb1b6001600160f81b0319612624611a1686896118e4565b1610612783576126486126436107f8611a71611a6b611a16888b6118e4565b610f7f565b9492905b945f5b82821061266157505050505050505f90565b61267f6126788361267336878a611705565b612c95565b9093610f8d565b96825160208401200361272157600360fe1b6126bb6126ae6126a085612357565b516001600160f81b03191690565b6001600160f81b03191690565b10612721578590846001601f60fb1b6126d96126ae6126a088612357565b1015612765575b6126ea8186612e1f565b6011810361272c57506126fc94612fb1565b9491156127215784156127155793915b9195909361264f565b50505050505050600190565b505050505050505f90565b9093506002141590506127595784879261274594612e6b565b94911561272157841561271557939161270c565b50505050505050505f90565b5061277e6126436107f8611a71611a6b6126a089612357565b6126e0565b600194929061264c565b1561279457565b60405162461bcd60e51b815260206004820152601d60248201527f496e76616c696420696e6e65722068656164657220524c50206c6973740000006044820152606490fd5b5f6127f8600360fe1b6001600160f81b0319611a24611a1687876118e4565b601f60fb1b6001600160f81b0319612813611a1686866118e4565b16106128ea5780611a7b6107f8611a76611a71611a6b611a16612837978a8a6118f2565b905b61a5bd461480156128df575b612850575b50905090565b5f5b600381106128ca575061287b600360fe1b6128746126ae611a168688876118f2565b101561278d565b601f60fb1b6128916126ae611a168587866118f2565b106128ba576107f8611a76611a71611a6b611a16866128b398611a7b976118f2565b805f61284a565b506128c59150610f63565b6128b3565b916128d86001918584612429565b9201612852565b5061a5bf4614612845565b50600190612839565b156128fa57565b60405162461bcd60e51b815260206004820152600f60248201526e0496e76616c6964206c6f6720524c5608c1b6044820152606490fd5b1561293857565b60405162461bcd60e51b815260206004820152601e60248201527f496e76616c696420656d69747465722061646472657373206c656e67746800006044820152606490fd5b1561298457565b60405162461bcd60e51b815260206004820152601460248201527315dc9bdb99c81d1bdad95b8818dbdb9d1c9858dd60621b6044820152606490fd5b916014611b00969594611f5484612a5c9487816129f360c060ff6129eb611a6b611a16868a896118f2565b1610156128f3565b60f860ff612a08611a6b611a168589886118f2565b1610612a6257506107f8611a76611a71611a6b611a1686612a2c98611a7b976118f2565b915b612a398387896130c6565b9490612a4782825114612931565b01516001600160a01b0390811691161461297d565b916132d0565b915050612a6f9150610f63565b91612a2e565b60408051909190612a868382610ff2565b6001815291601f1901366020840137565b60408051909190612aa88382610ff2565b6014815291601f1901366020840137565b90612ac38261103c565b612ad06040519182610ff2565b8281528092612ae1601f199161103c565b0190602036910137565b612af68284106123dd565b612b07611a6b611a168585856118f2565b9260ff84166080811015612b415750505050612b21612a75565b9060f81b6001600160f81b0319165f1a612b3a82612357565b5390600190565b60b881969592939496105f14612baf57506107f8612b5e91611950565b91612b6883612ab9565b945f5b848110612b7f5750505050611b0090610f7f565b80612b9c611a16612b95600194611f5489610f63565b85876118f2565b5f1a612ba8828a612364565b5301612b6b565b60c01115612c50576107f8612bc391611976565b905f925f5b838110612c215750612bd984612ab9565b955f5b858110612bf4575050505090611f54611b0092610f7f565b80612c0e611a16612b95600194611f548a611f548b610f63565b5f1a612c1a828b612364565b5301612bdc565b9360019060081b612c486107f8611a6b611a16612c418a611f548a610f63565b8c886118f2565b179401612bc8565b60405162461bcd60e51b815260206004820152601e60248201527f457870656374656420737472696e67206974656d2c20676f74206c69737400006044820152606490fd5b612ca1815183106123dd565b612cb1611a6b6126a08484612364565b9160ff83166080811015612cca57505050612b21612a75565b919392909160b8811015612d3457506107f8612ce591611950565b90612cef82612ab9565b935f5b838110612d0557505050611b0090610f7f565b80612d216126a0612d1b600194611f5488610f63565b85612364565b5f1a612d2d8289612364565b5301612cf2565b60c01115612dd2576107f8612d4891611976565b5f915f5b828110612da45750612d5d83612ab9565b945f5b848110612d775750505090611f54611b0092610f7f565b80612d916126a0612d1b600194611f5489611f548a610f63565b5f1a612d9d828a612364565b5301612d60565b9260019060081b612dca6107f8611a6b6126a0612dc489611f5489610f63565b8b612364565b179301612d4c565b5091612dde8382613416565b92612de884612ab9565b915f5b858110612df9575050509190565b80612e0c6126a0612d1b60019487610f8d565b5f1a612e188287612364565b5301612deb565b5f915b8151811015612e5057612e358183613416565b8101809111610f5e57915f198114610f5e5760010191612e22565b505090565b908160011b9180830460021490151715610f5e57565b83949291612e798183612c95565b9390612e986020612e8f611a6b6126a085612357565b16151591613546565b97889115612f3a5750612eac905187610f8d565b612eb68251612e55565b14612ecb575b505050505050505f905f905f90565b86866001928251612f28575b505050612ee5575b80612ebc565b612ef892612ef291610f8d565b90612c95565b5060208151910120906020815191012014612f165780808080612edf565b612f21915190610f8d565b6001915f90565b612f3293506136aa565b86865f612ed7565b612f4b93949596506107fe926136aa565b612fa457612f5c92612ef291610f8d565b50908151602081145f14612f8457506020612f7c920151925b5190610f8d565b916001929190565b8015612f98576020612f7c93012092612f75565b505050505f905f905f90565b50505050505f905f905f90565b91909293612fbf8251612e55565b8510156130695750611a6b6126a0612fe192612fdb8760011c90565b90612364565b600184166130605760041c600f16915b905f925b60ff81168410613040575061300a9250612c95565b508051801561303557612f7c916020820361302b5760209150015191610f63565b6020012091610f63565b5050505f905f905f90565b9091600161305482611a7b60ff9487613416565b94019392919050612ff5565b600f1691612ff1565b9290509392935f915b601083106130ac576130849250612c95565b50602081519101209060208151910120145f146130a357600191905f90565b5f915081908190565b906130bd81611a7b60019385613416565b92019190613072565b9190916130d48383106123dd565b609460ff6130e9611a6b611a168688876118f2565b1603613135576130f7612a97565b925f5b6014811061310c575050505090601590565b80613122611a16612b95600194611f5489610f63565b5f1a61312e8288612364565b53016130fa565b60405162461bcd60e51b815260206004820152601c60248201527f496e76616c6964206164647265737320524c5020656e636f64696e67000000006044820152606490fd5b1561318157565b60405162461bcd60e51b81526020600482015260126024820152710496e76616c696420746f7069637320524c560741b6044820152606490fd5b156131c257565b60405162461bcd60e51b815260206004820152601560248201527457726f6e67206576656e74207369676e617475726560581b6044820152606490fd5b1561320657565b60405162461bcd60e51b81526020600482015260136024820152720a8de40c2c8c8e4cae6e640dad2e6dac2e8c6d606b1b6044820152606490fd5b1561324857565b60405162461bcd60e51b8152602060048201526014602482015273416d6f756e74206461746120746f6f206c6f6e6760601b6044820152606490fd5b1561328b57565b60405162461bcd60e51b815260206004820152601860248201527f5472616e7366657220616d6f756e74206d69736d6174636800000000000000006044820152606490fd5b91806133b26133bf9561339f61339361339361338c6133858961337e7fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef6133788e8060f86133b99f61334c611a6b611a168361334560c060ff61333d8f611a16839a611a6b92819e6118f2565b16101561317a565b8b886118f2565b161061340c5780611a7b6107f8611a76611a71611a6b611a16613370978d8a6118f2565b948591613768565b146131bb565b8a8c612429565b898b612429565b888a613768565b6001600160a01b031690565b6001600160a01b039081169116146131ff565b8284612429565b916137da565b506133ce602082511115613241565b5f92835b82518510156133fd5760019060081b6133f46107f8611a6b6126a08988612364565b179401936133d2565b909350611cbd92915014613284565b506133708d610f63565b90613423825182106123dd565b613433611a6b6126a08385612364565b9160ff8316608081101561344a5750505050600190565b60b8811015613465575050506107f8611a76611b0092611950565b60c08110156134d15750916107f861347c91611976565b905f925f915b8383106134995750505090611f54611b0092610f7f565b9091936134a860019160081b90565b6134c76107f8611a6b6126a06134c18a611f5489610f63565b88612364565b1794019190613482565b60f811156134ea5750506107f8611a76611b0092611963565b916107f86134f79161193d565b905f925f915b8383106135145750505090611f54611b0092610f7f565b90919361352360019160081b90565b61353c6107f8611a6b6126a06134c18a611f5489610f63565b17940191906134fd565b9081511561187c5761355d611a6b6126a084612357565b601081161561362c5761358061357b6135768551612e55565b61165b565b612ab9565b9060f81b600f60f81b165f1a61359582612357565b5360015b835181101561362757806135d46135c46135bb611a6b6126a06001968a612364565b60041c600f1690565b60f81b6001600160f81b03191690565b6135ed6135e361357684612e55565b915f1a9185612364565b53613614600f613603611a6b6126a0858a612364565b1660f81b6001600160f81b03191690565b6136206135e383612e55565b5301613599565b509150565b5061364261357b61363d8451612e55565b61164c565b60015b835181101561362757806136676135c46135bb611a6b6126a06001968a612364565b61367b6135e36136768461165b565b612e55565b53613691600f613603611a6b6126a0858a612364565b6136a36135e3611ab56136768561165b565b5301613645565b9190916136b8825184610f8d565b6136c28251612e55565b10613761575f5b8251811015613758576136e56136df8286610f8d565b60011690565b61373a5761370e6135bb611a6b6126a0613708613702868a610f8d565b60011c90565b86612364565b60ff6137236107f8611a6b6126a08689612364565b911603613732576001016136c9565b505050505f90565b600f613752611a6b6126a0613708613702868a610f8d565b1661370e565b50505050600190565b5050505f90565b9190600560fd1b906001600160f81b031990613786908490866118f2565b35160361379557016001013590565b60405162461bcd60e51b815260206004820152601760248201527f45787065637465642033322d6279746520737472696e670000000000000000006044820152606490fd5b6137e58284106123dd565b6137f6611a6b611a168585856118f2565b9260ff841660808110156138105750505050612b21612a75565b60b881969592939496105f1461387757506107f861382d91611950565b9161383783612ab9565b945f5b84811061384e5750505050611b0090610f7f565b80613864611a16612b95600194611f5489610f63565b5f1a613870828a612364565b530161383a565b60c01115613911576107f861388b91611976565b905f925f5b8381106138e957506138a184612ab9565b955f5b8581106138bc575050505090611f54611b0092610f7f565b806138d6611a16612b95600194611f548a611f548b610f63565b5f1a6138e2828b612364565b53016138a4565b9360019060081b6139096107f8611a6b611a16612c418a611f548a610f63565b179401613890565b60405162461bcd60e51b815260206004820152601e60248201527f457870656374656420737472696e6720646174612c20676f74206c69737400006044820152606490fdfea2646970667358221220cf5d410282956f49525d49e939275e5accc13b9b670073f101b75a932c70f62364736f6c634300081e0033 diff --git a/out/Escrow.sol/Escrow.json b/out/Escrow.sol/Escrow.json deleted file mode 100644 index 5858487..0000000 --- a/out/Escrow.sol/Escrow.json +++ /dev/null @@ -1 +0,0 @@ -{"abi":[{"type":"constructor","inputs":[{"name":"_tokenContract","type":"address","internalType":"address"},{"name":"_expectedRecipient","type":"address","internalType":"address"},{"name":"_expectedAmount","type":"uint256","internalType":"uint256"},{"name":"_currentRewardAmount","type":"uint256","internalType":"uint256"},{"name":"_currentPaymentAmount","type":"uint256","internalType":"uint256"}],"stateMutability":"payable"},{"type":"function","name":"bond","inputs":[{"name":"_bondAmount","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"bondAmount","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"bondNative","inputs":[],"outputs":[],"stateMutability":"payable"},{"type":"function","name":"bondedExecutor","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"type":"function","name":"cancellationRequest","inputs":[],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"collect","inputs":[{"name":"proof","type":"tuple","internalType":"struct Escrow.ReceiptProof","components":[{"name":"blockHeader","type":"bytes","internalType":"bytes"},{"name":"receiptRlp","type":"bytes","internalType":"bytes"},{"name":"proofNodes","type":"bytes","internalType":"bytes"},{"name":"receiptPath","type":"bytes","internalType":"bytes"},{"name":"logIndex","type":"uint256","internalType":"uint256"}]},{"name":"targetBlockNumber","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"collectNative","inputs":[{"name":"proof","type":"tuple","internalType":"struct Escrow.NativeTransferProof","components":[{"name":"blockHeader","type":"bytes","internalType":"bytes"},{"name":"transactionRlp","type":"bytes","internalType":"bytes"},{"name":"txProofNodes","type":"bytes","internalType":"bytes"},{"name":"receiptRlp","type":"bytes","internalType":"bytes"},{"name":"receiptProofNodes","type":"bytes","internalType":"bytes"},{"name":"path","type":"bytes","internalType":"bytes"}]},{"name":"targetBlockNumber","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"currentPaymentAmount","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"currentRewardAmount","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"executionDeadline","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"expectedAmount","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"expectedRecipient","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"type":"function","name":"fund","inputs":[{"name":"_currentRewardAmount","type":"uint256","internalType":"uint256"},{"name":"_currentPaymentAmount","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"fundNative","inputs":[{"name":"_currentRewardAmount","type":"uint256","internalType":"uint256"},{"name":"_currentPaymentAmount","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"payable"},{"type":"function","name":"funded","inputs":[],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"is_bonded","inputs":[],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"maxBlockLookback","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"originalRewardAmount","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"requestCancellation","inputs":[],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"resume","inputs":[],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"totalBondsDeposited","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"withdraw","inputs":[],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"withdrawNative","inputs":[],"outputs":[],"stateMutability":"nonpayable"}],"bytecode":{"object":"0x610120806040525f9060a081613da4803803809161001d82856103ab565b83398101031261027757610030816103e2565b9161003d602083016103e2565b92604083015160806060850151940151948260a05260c05260e0523360805261010080528215908115806103a2575b61012c575b60405161398c9081610418823960805181818161019a015281816102e10152818161040b015281816106f10152818161092a0152610bd2015260a0518181816102a8015281816103d901528181610508015281816107b80152818161097501528181610a7c01528181610c1401528181610cea01526122d3015260c051818181610633015281816107430152610d9c015260e051818181610217015281816106110152610d7a015261010051818181610b9701526118230152f35b6001600160a01b03166101b2575061014483836103f6565b340361016d5781905560025560015561010061ff001960075416176007555b5f80808080610071565b60405162461bcd60e51b815260206004820152601460248201527f496e636f72726563742045544820616d6f756e740000000000000000000000006044820152606490fd5b60075492939290915060081c60ff1661035d5760a0516001600160a01b031615610318576102d357801561028e578160646102066020935f958655836002558060015560018060a01b0360a05116936103f6565b60405194859384926323b872dd60e01b845233600485015230602485015260448401525af180156102835761024b575b5061010061ff00196007541617600755610163565b6020813d60201161027b575b81610264602093836103ab565b8101031261027757518015158114610236575b5f80fd5b3d9150610257565b6040513d5f823e3d90fd5b60405162461bcd60e51b815260206004820152601f60248201527f5061796d656e7420616d6f756e74206d757374206265206e6f6e2d7a65726f006044820152606490fd5b60405162461bcd60e51b815260206004820152601e60248201527f52657761726420616d6f756e74206d757374206265206e6f6e2d7a65726f00006044820152606490fd5b60405162461bcd60e51b815260206004820152601d60248201527f5573652066756e644e617469766520666f72206e6174697665204554480000006044820152606490fd5b60405162461bcd60e51b815260206004820152601760248201527f436f6e747261637420616c72656164792066756e6465640000000000000000006044820152606490fd5b5084151561006c565b601f909101601f19168101906001600160401b038211908210176103ce57604052565b634e487b7160e01b5f52604160045260245ffd5b51906001600160a01b038216820361027757565b9190820180921161040357565b634e487b7160e01b5f52601160045260245ffdfe60806040526004361015610011575f80fd5b5f3560e01c8063046f7da2146101845780631aa7c0ec1461017f5780632feef2ec1461017a578063308657d71461017557806333ee5f35146101705780633ccfd60b1461016b57806350431ce4146101665780635922e8f8146101615780635a4fd6451461015c57806380f323a71461015757806381972d00146101525780638677ab231461014d5780638bd03d0a146101485780639940686e14610143578063a65e2cfd1461013e578063ae6c3fcf14610139578063cb766a5614610134578063d415b3f91461012f578063d4899a621461012a578063df23579414610125578063ede7f6a314610120578063f3a504f21461011b5763fe03a46014610116575f80fd5b610e3a565b610e15565b610cb3565b610bba565b610b80565b610b63565b610b3f565b610a4f565b610904565b61078f565b610772565b61072e565b6106db565b6106be565b6106a2565b6104cd565b6103b6565b610279565b61025c565b61023a565b610200565b6101d8565b346101d4575f3660031901126101d4576101c8337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031614610e57565b6007805460ff19169055005b5f80fd5b346101d4575f3660031901126101d4576003546040516001600160a01b039091168152602090f35b346101d4575f3660031901126101d45760206040517f00000000000000000000000000000000000000000000000000000000000000008152f35b346101d4575f3660031901126101d457602060ff600754166040519015158152f35b346101d4575f3660031901126101d4576020600454604051908152f35b346101d4575f3660031901126101d4576007546102a09060081c60ff16610ea3565b610ea3565b5f60206103777f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166102db811515610ee5565b61030f337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031614610e57565b610317611584565b61032660015460025490610f8d565b61033661ff001960075416600755565b61033f5f600155565b84805561034d811515610f9a565b60405163a9059cbb60e01b8152336004820152602481019190915293849283919082906044820190565b03925af180156103b15761038757005b6103a89060203d6020116103aa575b6103a08183610ff2565b810190611019565b005b503d610396565b611031565b346101d4575f3660031901126101d4576103d760ff60075460081c16610ea3565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031661048f57610439337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031614610e57565b610441611584565b6103a85f80808061045760015460025490610f8d565b61046761ff001960075416600755565b6104705f600155565b81805561047e811515610f9a565b335af1610489611058565b50611087565b60405162461bcd60e51b8152602060048201526016602482015275055736520776974686472617720666f722045524332360541b6044820152606490fd5b346101d45760403660031901126101d45760043567ffffffffffffffff81116101d4578060040160c060031983360301126101d457602435917f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166106655761058e826106096106046105fe836105f86105f382608461060e9a61056961065d9e6105636106589f806110c9565b906117d3565b6105b86105b361058261057c86806110c9565b906119f4565b602484019d8e876110c9565b9061059c60448701896110c9565b906105ab60a48901809b6110c9565b949093611adc565b6110fc565b6105ab6105ce6105c888806110c9565b90611b03565b936105ea6105e060648501809a6110c9565b959094018d6110c9565b9290918d6110c9565b611148565b846110c9565b90611c38565b611194565b6110c9565b907f0000000000000000000000000000000000000000000000000000000000000000917f000000000000000000000000000000000000000000000000000000000000000091611dea565b6111df565b6103a8612025565b60405162461bcd60e51b8152602060048201526015602482015274055736520636f6c6c65637420666f7220455243323605c1b6044820152606490fd5b346101d4575f3660031901126101d45760205f54604051908152f35b346101d4575f3660031901126101d4576020600554604051908152f35b346101d4575f3660031901126101d45761071f337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031614610e57565b6007805460ff19166001179055005b346101d4575f3660031901126101d4576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b346101d4575f3660031901126101d4576020600154604051908152f35b346101d45760203660031901126101d4576007546004356107b660ff600884901c16610ea3565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169161080790610802906107fe906107f886151561122b565b60ff1690565b1590565b611277565b60045480151590816108fa575b506108c8575b61082d6108286107fe6114e4565b6112bc565b61084361083b5f5460011c90565b821015611313565b6040516323b872dd60e01b81523360048201523060248201526044810182905291602090839060649082905f905af19182156103b1576103a8926108ab575b50600380546001600160a01b031916331790556108a66108a142610f4f565b600455565b600555565b6108c39060203d6020116103aa576103a08183610ff2565b610882565b6108d56005545f54610f8d565b5f556108ed6108e8600554600654610f8d565b600655565b6108f5611584565b61081a565b905042115f610814565b346101d45760403660031901126101d4575f6020610a0f6004356109d0602435610958337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031614610e57565b61097361096e6107fe60075460ff9060081c1690565b611373565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316926109cb906109ad8515156113bf565b6109b881151561140b565b6109c3831515611457565b808855600255565b600155565b6109df60025460015490610f8d565b6040516323b872dd60e01b8152336004820152306024820152604481019190915293849283919082906064820190565b03925af180156103b157610a32575b6103a861010061ff00196007541617600755565b610a4a9060203d6020116103aa576103a08183610ff2565b610a1e565b5f3660031901126101d457610aaa6108026107fe600754610a7761029b8260ff9060081c1690565b6107f87f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316156114a3565b6004548015159081610b35575b50610b08575b610acb6108286107fe6114e4565b610ae1610ad95f5460011c90565b341015611313565b600380546001600160a01b03191633179055610aff6108a142610f4f565b6103a834600555565b610b156005545f54610f8d565b5f55610b286108e8600554600654610f8d565b610b30611584565b610abd565b905042115f610ab7565b346101d4575f3660031901126101d4576020610b596114e4565b6040519015158152f35b346101d4575f3660031901126101d4576020600254604051908152f35b346101d4575f3660031901126101d45760206040517f00000000000000000000000000000000000000000000000000000000000000008152f35b60403660031901126101d457600435602435610c00337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031614610e57565b610c1260ff60075460081c1615611373565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316610c79576109cb82610c52610a1e94151561140b565b610c5d831515611457565b610c71610c6a8483610f8d565b34146114fc565b805f55600255565b60405162461bcd60e51b815260206004820152601260248201527105573652066756e6420666f722045524332360741b6044820152606490fd5b346101d45760403660031901126101d45760043567ffffffffffffffff81116101d4578060040160a060031983360301126101d4577f00000000000000000000000000000000000000000000000000000000000000009160243591906001600160a01b03841615610dd157610dc993610d7883610d39610dc496610563836084986110c9565b610d466105c882806110c9565b906106096105f36024870193610d5c85856110c9565b90610d6a60448b01876110c9565b906105ab60648d01896110c9565b7f0000000000000000000000000000000000000000000000000000000000000000947f0000000000000000000000000000000000000000000000000000000000000000940135916120d1565b61153f565b6103a8612232565b606460405162461bcd60e51b815260206004820152602060248201527f55736520636f6c6c6563744e617469766520666f72206e6174697665204554486044820152fd5b346101d4575f3660031901126101d457602060ff60075460081c166040519015158152f35b346101d4575f3660031901126101d4576020600654604051908152f35b15610e5e57565b60405162461bcd60e51b815260206004820152601d60248201527f4f6e6c792063616c6c61626c6520627920746865206465706c6f7965720000006044820152606490fd5b15610eaa57565b60405162461bcd60e51b815260206004820152601360248201527210dbdb9d1c9858dd081b9bdd08199d5b991959606a1b6044820152606490fd5b15610eec57565b60405162461bcd60e51b815260206004820152602160248201527f5573652077697468647261774e617469766520666f72206e61746976652045546044820152600960fb1b6064820152608490fd5b634e487b7160e01b5f52601160045260245ffd5b9061012c8201809211610f5e57565b610f3b565b9060018201809211610f5e57565b9060158201809211610f5e57565b6001019081600111610f5e57565b91908201809211610f5e57565b15610fa157565b60405162461bcd60e51b81526020600482015260156024820152744e6f20776974686472617761626c652066756e647360581b6044820152606490fd5b634e487b7160e01b5f52604160045260245ffd5b90601f8019910116810190811067ffffffffffffffff82111761101457604052565b610fde565b908160209103126101d4575180151581036101d45790565b6040513d5f823e3d90fd5b67ffffffffffffffff811161101457601f01601f191660200190565b3d15611082573d906110698261103c565b916110776040519384610ff2565b82523d5f602084013e565b606090565b1561108e57565b60405162461bcd60e51b8152602060048201526013602482015272115512081d1c985b9cd9995c8819985a5b1959606a1b6044820152606490fd5b903590601e19813603018212156101d4570180359067ffffffffffffffff82116101d4576020019181360383136101d457565b1561110357565b60405162461bcd60e51b815260206004820152601d60248201527f496e76616c6964207472616e73616374696f6e204d50542070726f6f660000006044820152606490fd5b1561114f57565b60405162461bcd60e51b815260206004820152601960248201527f496e76616c69642072656365697074204d50542070726f6f66000000000000006044820152606490fd5b1561119b57565b606460405162461bcd60e51b815260206004820152602060248201527f5472616e73616374696f6e206661696c6564202873746174757320213d2031296044820152fd5b156111e657565b60405162461bcd60e51b815260206004820152601760248201527f496e76616c6964206e6174697665207472616e736665720000000000000000006044820152606490fd5b1561123257565b60405162461bcd60e51b815260206004820152601d60248201527f55736520626f6e644e617469766520666f72206e6174697665204554480000006044820152606490fd5b1561127e57565b60405162461bcd60e51b815260206004820152601660248201527510d85b98d95b1b185d1a5bdb881c995c5d595cdd195960521b6044820152606490fd5b156112c357565b60405162461bcd60e51b815260206004820152602260248201527f416e6f74686572206578656375746f7220697320616c726561647920626f6e64604482015261195960f21b6064820152608490fd5b1561131a57565b60405162461bcd60e51b815260206004820152602b60248201527f426f6e64206d757374206265206174206c656173742068616c66206f6620726560448201526a1dd85c9908185b5bdd5b9d60aa1b6064820152608490fd5b1561137a57565b60405162461bcd60e51b815260206004820152601760248201527f436f6e747261637420616c72656164792066756e6465640000000000000000006044820152606490fd5b156113c657565b60405162461bcd60e51b815260206004820152601d60248201527f5573652066756e644e617469766520666f72206e6174697665204554480000006044820152606490fd5b1561141257565b60405162461bcd60e51b815260206004820152601e60248201527f52657761726420616d6f756e74206d757374206265206e6f6e2d7a65726f00006044820152606490fd5b1561145e57565b60405162461bcd60e51b815260206004820152601f60248201527f5061796d656e7420616d6f756e74206d757374206265206e6f6e2d7a65726f006044820152606490fd5b156114aa57565b60405162461bcd60e51b8152602060048201526012602482015271055736520626f6e6420666f722045524332360741b6044820152606490fd5b60045480151590816114f4575090565b905042111590565b1561150357565b60405162461bcd60e51b8152602060048201526014602482015273125b98dbdc9c9958dd0811551208185b5bdd5b9d60621b6044820152606490fd5b1561154657565b60405162461bcd60e51b8152602060048201526016602482015275125b9d985b1a5908151c985b9cd9995c88195d995b9d60521b6044820152606490fd5b61158c6114e4565b6115b1576bffffffffffffffffffffffff60a01b600354166003555f6005555f600455565b60405162461bcd60e51b815260206004820152602160248201527f43616e6e6f74207265736574207768696c6520626f6e642069732061637469766044820152606560f81b6064820152608490fd5b1561160757565b60405162461bcd60e51b815260206004820152601d60248201527f54617267657420626c6f636b20697320696e20746865206675747572650000006044820152606490fd5b600119810191908211610f5e57565b5f19810191908211610f5e57565b91908203918211610f5e57565b1561167d57565b60405162461bcd60e51b815260206004820152601460248201527315185c99d95d08189b1bd8dac81d1bdbc81bdb1960621b6044820152606490fd5b156116c057565b60405162461bcd60e51b815260206004820152601d60248201527f556e61626c6520746f20726574726965766520626c6f636b20686173680000006044820152606490fd5b9291926117118261103c565b9161171f6040519384610ff2565b8294818452818301116101d4578281602093845f960137010152565b1561174257565b60405162461bcd60e51b815260206004820152601a60248201527f426c6f636b206865616465722068617368206d69736d617463680000000000006044820152606490fd5b1561178e57565b60405162461bcd60e51b815260206004820152601c60248201527f48656164657220626c6f636b206e756d626572206d69736d61746368000000006044820152606490fd5b9190916117e760ff60075460081c16610ea3565b6003546001600160a01b03163314806118c2575b1561187e5761187c926118769161181443851115611600565b6118496118218543611669565b7f00000000000000000000000000000000000000000000000000000000000000001015611676565b61187184406118598115156116b9565b611864368585611705565b602081519101201461173b565b612375565b14611787565b565b606460405162461bcd60e51b815260206004820152602060248201527f4f6e6c7920626f6e646564206578656375746f722063616e20636f6c6c6563746044820152fd5b506118cb6114e4565b6117fb565b634e487b7160e01b5f52603260045260245ffd5b90156118ed5790565b6118d0565b908210156118ed570190565b1561190557565b60405162461bcd60e51b815260206004820152601060248201526f125b9d985b1a5908149314081b1a5cdd60821b6044820152606490fd5b60ff60f6199116019060ff8211610f5e57565b60ff607f199116019060ff8211610f5e57565b60ff60bf199116019060ff8211610f5e57565b60ff60b6199116019060ff8211610f5e57565b60ff166001019060ff8211610f5e57565b156119a157565b60405162461bcd60e51b815260206004820152602560248201527f496e76616c6964207472616e73616374696f6e73526f6f7420524c5020656e636044820152646f64696e6760d81b6064820152608490fd5b9091905f611a2c600360fe1b6001600160f81b0319611a24611a1688876118e4565b356001600160f81b03191690565b1610156118fe565b601f60fb1b6001600160f81b0319611a47611a1687866118e4565b1610611ad45780611a7b6107f8611a76611a71611a6b611a16611a81978b8a6118f2565b60f81c90565b61193d565b611989565b90610f8d565b5f5b60048110611abf5750611ab5611aba929394600560fd1b90611aae611a168560ff60f81b93896118f2565b161461199a565b610f63565b013590565b90611acd6001918685612429565b9101611a83565b506001611a81565b611af2611afa92939495611b0098973691611705565b923691611705565b906125dd565b90565b90611b0e81836127d9565b905f5b60058110611b955750600560fd1b906001600160f81b031990611b36908490866118f2565b351603611b4657611aba90610f63565b60405162461bcd60e51b815260206004820152602160248201527f496e76616c6964207265636569707473526f6f7420524c5020656e636f64696e6044820152606760f81b6064820152608490fd5b91611ba36001918386612429565b9201611b11565b15611bb157565b60405162461bcd60e51b81526020600482015260136024820152720496e76616c6964207265636569707420524c5606c1b6044820152606490fd5b15611bf357565b60405162461bcd60e51b815260206004820152601d60248201527f5265636569707420737461747573206973206e6f7420737563636573730000006044820152606490fd5b60ff611cb6611a6b611a16600194611cbd965f81151580611cd2575b611ccb575b611c7860c088611c70611a6b611a1686888a6118f2565b161015611baa565b60f887611c8c611a6b611a168587896118f2565b1610611cc25780611a7b6107f8611a76611a71611a6b611a16611cb097898b6118f2565b916118f2565b1614611bec565b600190565b611cb090610f63565b5086611c59565b50608087611ce6611a6b611a1686886118e4565b1610611c54565b15611cf457565b60405162461bcd60e51b815260206004820152600e60248201526d0496e76616c696420747820524c560941b6044820152606490fd5b15611d3157565b60405162461bcd60e51b8152602060048201526012602482015271496e76616c696420746f206164647265737360701b6044820152606490fd5b15611d7257565b60405162461bcd60e51b81526020600482015260126024820152710a4cac6d2e0d2cadce840dad2e6dac2e8c6d60731b6044820152606490fd5b15611db357565b60405162461bcd60e51b815260206004820152600f60248201526e082dadeeadce840dad2e6dac2e8c6d608b1b6044820152606490fd5b90916003905f84151580612009575b611f8c575b80611e2260c060ff611e1a611a6b611a16611e5d978c8c6118f2565b161015611ced565b60f860ff611e37611a6b611a16858b8b6118f2565b1610611f835760ff611e56611a76611a71611a6b611a16868c8c6118f2565b1690610f8d565b915f905b808210611f6c57505090611eaa611eaf92611e91609460ff611e8a611a6b611a16888c8c6118f2565b1614611d2a565b6001600160a01b03166001838601013560601c14611d6b565b610f71565b91611ec1611a6b611a168584866118f2565b925f9260ff851694608086105f14611ee457505050505090611cbd915b14611dac565b90919293946080145f14611f01575050505050611cbd905f611ede565b6107f8611f1091939293611950565b915f935b838510611f2a57505050505090611cbd91611ede565b9091929394611f3b60019160081b90565b611f606107f8611a6b611a16611f598b611f548b610f63565b610f8d565b87896118f2565b17950193929190611f14565b9092611f7b6001918787612429565b930190611e61565b60ff6001611e56565b509050611f9f611a6b611a1685856118e4565b6001919060ff16808303611fbc5750611e5d6004925b9050611dfe565b600203611fce57611e5d600592611fb5565b60405162461bcd60e51b8152602060048201526013602482015272556e737570706f72746564207478207479706560681b6044820152606490fd5b50608060ff61201e611a6b611a1689896118e4565b1610611df9565b6005545f548101809111610f5e576001548101809111610f5e575f80808061187c946003546bffffffffffffffffffffffff60a01b8116600355826005558260045561207761ff001960075416600755565b60018390558280556001600160a01b03165af1610489611058565b1561209957565b60405162461bcd60e51b815260206004820152601060248201526f0496e76616c6964206c6f677320524c560841b6044820152606490fd5b959493929190805f818981151580612216575b61220d575b60ff611c70611a6b611a16866121019660c0966118f2565b8860f860ff612117611a6b611a168688876118f2565b16106121fb576107f8611a76611a71611a6b611a168661213a98611a7b976118f2565b81905b885f5b600381106121e2575060c06121626107f8611a6b611a168688612169976118f2565b1015612092565b8860f86121806107f8611a6b611a168688876118f2565b106121d1576107f8611a76611a71611a6b611a16866121a298611a7b976118f2565b915b5f905b8082106121ba575050611b0095966129c0565b90926121c9600191848b612429565b9301906121a7565b506121dc9150610f63565b916121a4565b92916001926121f092612429565b910190888392612140565b506122069150610f63565b819061213d565b600192506120e9565b50608060ff61222b611a6b611a1686866118e4565b16106120e4565b61224c6122436005545f5490610f8d565b60015490610f8d565b6003546001600160a01b0316600380546001600160a01b03191690556122715f600555565b61227a5f600455565b61228a61ff001960075416600755565b6122935f600155565b5f80554662aa36a70361232557604051633419e74d60e21b81526001600160a01b039091166004820152602481019190915260208180604481015b03815f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165af180156103b15761230a5750565b6123229060203d6020116103aa576103a08183610ff2565b50565b60405163a9059cbb60e01b81526001600160a01b039091166004820152602481019190915260208180604481016122ce565b8051156118ed5760200190565b9081518110156118ed570160200190565b919061238181846127d9565b905f5b600881106123c857506123979293612aeb565b50905f805b83518210156123c3576001906123b28386612364565b5160f81c9060081b1791019061239c565b925050565b916123d66001918387612429565b9201612384565b156123e457565b60405162461bcd60e51b815260206004820152601860248201527f524c50206f6666736574206f7574206f6620626f756e647300000000000000006044820152606490fd5b91906124368183106123dd565b612447611a6b611a168484876118f2565b9060ff8216608081101561246257505050611b009150610f63565b91929160b881101561248a575050611b0092506107f8612484611a7b92610f63565b92611950565b90929060c081101561250057506107f86124a691949394611976565b915f935f915b8483106124c757505050611b009291611f54611f5492610f63565b9091946124d660019160081b90565b6124f66107f8611a6b611a166124ef8b611f548b610f63565b88886118f2565b17950191906124ac565b90929060f811156125265750611b0092506107f8612520611a7b92610f63565b92611963565b92916107f86125349161193d565b915f935f915b84831061255557505050611b009291611f54611f5492610f63565b90919461256460019160081b90565b61257d6107f8611a6b611a166124ef8b611f548b610f63565b179501919061253a565b1561258e57565b60405162461bcd60e51b815260206004820152602160248201527f457870656374656420524c50206c69737420666f722070726f6f66206e6f64656044820152607360f81b6064820152608490fd5b919390929190612609600360fe1b6001600160f81b0319612601611a16878a6118e4565b161015612587565b601f60fb1b6001600160f81b0319612624611a1686896118e4565b1610612783576126486126436107f8611a71611a6b611a16888b6118e4565b610f7f565b9492905b945f5b82821061266157505050505050505f90565b61267f6126788361267336878a611705565b612c95565b9093610f8d565b96825160208401200361272157600360fe1b6126bb6126ae6126a085612357565b516001600160f81b03191690565b6001600160f81b03191690565b10612721578590846001601f60fb1b6126d96126ae6126a088612357565b1015612765575b6126ea8186612e1f565b6011810361272c57506126fc94612fb1565b9491156127215784156127155793915b9195909361264f565b50505050505050600190565b505050505050505f90565b9093506002141590506127595784879261274594612e6b565b94911561272157841561271557939161270c565b50505050505050505f90565b5061277e6126436107f8611a71611a6b6126a089612357565b6126e0565b600194929061264c565b1561279457565b60405162461bcd60e51b815260206004820152601d60248201527f496e76616c696420696e6e65722068656164657220524c50206c6973740000006044820152606490fd5b5f6127f8600360fe1b6001600160f81b0319611a24611a1687876118e4565b601f60fb1b6001600160f81b0319612813611a1686866118e4565b16106128ea5780611a7b6107f8611a76611a71611a6b611a16612837978a8a6118f2565b905b61a5bd461480156128df575b612850575b50905090565b5f5b600381106128ca575061287b600360fe1b6128746126ae611a168688876118f2565b101561278d565b601f60fb1b6128916126ae611a168587866118f2565b106128ba576107f8611a76611a71611a6b611a16866128b398611a7b976118f2565b805f61284a565b506128c59150610f63565b6128b3565b916128d86001918584612429565b9201612852565b5061a5bf4614612845565b50600190612839565b156128fa57565b60405162461bcd60e51b815260206004820152600f60248201526e0496e76616c6964206c6f6720524c5608c1b6044820152606490fd5b1561293857565b60405162461bcd60e51b815260206004820152601e60248201527f496e76616c696420656d69747465722061646472657373206c656e67746800006044820152606490fd5b1561298457565b60405162461bcd60e51b815260206004820152601460248201527315dc9bdb99c81d1bdad95b8818dbdb9d1c9858dd60621b6044820152606490fd5b916014611b00969594611f5484612a5c9487816129f360c060ff6129eb611a6b611a16868a896118f2565b1610156128f3565b60f860ff612a08611a6b611a168589886118f2565b1610612a6257506107f8611a76611a71611a6b611a1686612a2c98611a7b976118f2565b915b612a398387896130c6565b9490612a4782825114612931565b01516001600160a01b0390811691161461297d565b916132d0565b915050612a6f9150610f63565b91612a2e565b60408051909190612a868382610ff2565b6001815291601f1901366020840137565b60408051909190612aa88382610ff2565b6014815291601f1901366020840137565b90612ac38261103c565b612ad06040519182610ff2565b8281528092612ae1601f199161103c565b0190602036910137565b612af68284106123dd565b612b07611a6b611a168585856118f2565b9260ff84166080811015612b415750505050612b21612a75565b9060f81b6001600160f81b0319165f1a612b3a82612357565b5390600190565b60b881969592939496105f14612baf57506107f8612b5e91611950565b91612b6883612ab9565b945f5b848110612b7f5750505050611b0090610f7f565b80612b9c611a16612b95600194611f5489610f63565b85876118f2565b5f1a612ba8828a612364565b5301612b6b565b60c01115612c50576107f8612bc391611976565b905f925f5b838110612c215750612bd984612ab9565b955f5b858110612bf4575050505090611f54611b0092610f7f565b80612c0e611a16612b95600194611f548a611f548b610f63565b5f1a612c1a828b612364565b5301612bdc565b9360019060081b612c486107f8611a6b611a16612c418a611f548a610f63565b8c886118f2565b179401612bc8565b60405162461bcd60e51b815260206004820152601e60248201527f457870656374656420737472696e67206974656d2c20676f74206c69737400006044820152606490fd5b612ca1815183106123dd565b612cb1611a6b6126a08484612364565b9160ff83166080811015612cca57505050612b21612a75565b919392909160b8811015612d3457506107f8612ce591611950565b90612cef82612ab9565b935f5b838110612d0557505050611b0090610f7f565b80612d216126a0612d1b600194611f5488610f63565b85612364565b5f1a612d2d8289612364565b5301612cf2565b60c01115612dd2576107f8612d4891611976565b5f915f5b828110612da45750612d5d83612ab9565b945f5b848110612d775750505090611f54611b0092610f7f565b80612d916126a0612d1b600194611f5489611f548a610f63565b5f1a612d9d828a612364565b5301612d60565b9260019060081b612dca6107f8611a6b6126a0612dc489611f5489610f63565b8b612364565b179301612d4c565b5091612dde8382613416565b92612de884612ab9565b915f5b858110612df9575050509190565b80612e0c6126a0612d1b60019487610f8d565b5f1a612e188287612364565b5301612deb565b5f915b8151811015612e5057612e358183613416565b8101809111610f5e57915f198114610f5e5760010191612e22565b505090565b908160011b9180830460021490151715610f5e57565b83949291612e798183612c95565b9390612e986020612e8f611a6b6126a085612357565b16151591613546565b97889115612f3a5750612eac905187610f8d565b612eb68251612e55565b14612ecb575b505050505050505f905f905f90565b86866001928251612f28575b505050612ee5575b80612ebc565b612ef892612ef291610f8d565b90612c95565b5060208151910120906020815191012014612f165780808080612edf565b612f21915190610f8d565b6001915f90565b612f3293506136aa565b86865f612ed7565b612f4b93949596506107fe926136aa565b612fa457612f5c92612ef291610f8d565b50908151602081145f14612f8457506020612f7c920151925b5190610f8d565b916001929190565b8015612f98576020612f7c93012092612f75565b505050505f905f905f90565b50505050505f905f905f90565b91909293612fbf8251612e55565b8510156130695750611a6b6126a0612fe192612fdb8760011c90565b90612364565b600184166130605760041c600f16915b905f925b60ff81168410613040575061300a9250612c95565b508051801561303557612f7c916020820361302b5760209150015191610f63565b6020012091610f63565b5050505f905f905f90565b9091600161305482611a7b60ff9487613416565b94019392919050612ff5565b600f1691612ff1565b9290509392935f915b601083106130ac576130849250612c95565b50602081519101209060208151910120145f146130a357600191905f90565b5f915081908190565b906130bd81611a7b60019385613416565b92019190613072565b9190916130d48383106123dd565b609460ff6130e9611a6b611a168688876118f2565b1603613135576130f7612a97565b925f5b6014811061310c575050505090601590565b80613122611a16612b95600194611f5489610f63565b5f1a61312e8288612364565b53016130fa565b60405162461bcd60e51b815260206004820152601c60248201527f496e76616c6964206164647265737320524c5020656e636f64696e67000000006044820152606490fd5b1561318157565b60405162461bcd60e51b81526020600482015260126024820152710496e76616c696420746f7069637320524c560741b6044820152606490fd5b156131c257565b60405162461bcd60e51b815260206004820152601560248201527457726f6e67206576656e74207369676e617475726560581b6044820152606490fd5b1561320657565b60405162461bcd60e51b81526020600482015260136024820152720a8de40c2c8c8e4cae6e640dad2e6dac2e8c6d606b1b6044820152606490fd5b1561324857565b60405162461bcd60e51b8152602060048201526014602482015273416d6f756e74206461746120746f6f206c6f6e6760601b6044820152606490fd5b1561328b57565b60405162461bcd60e51b815260206004820152601860248201527f5472616e7366657220616d6f756e74206d69736d6174636800000000000000006044820152606490fd5b91806133b26133bf9561339f61339361339361338c6133858961337e7fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef6133788e8060f86133b99f61334c611a6b611a168361334560c060ff61333d8f611a16839a611a6b92819e6118f2565b16101561317a565b8b886118f2565b161061340c5780611a7b6107f8611a76611a71611a6b611a16613370978d8a6118f2565b948591613768565b146131bb565b8a8c612429565b898b612429565b888a613768565b6001600160a01b031690565b6001600160a01b039081169116146131ff565b8284612429565b916137da565b506133ce602082511115613241565b5f92835b82518510156133fd5760019060081b6133f46107f8611a6b6126a08988612364565b179401936133d2565b909350611cbd92915014613284565b506133708d610f63565b90613423825182106123dd565b613433611a6b6126a08385612364565b9160ff8316608081101561344a5750505050600190565b60b8811015613465575050506107f8611a76611b0092611950565b60c08110156134d15750916107f861347c91611976565b905f925f915b8383106134995750505090611f54611b0092610f7f565b9091936134a860019160081b90565b6134c76107f8611a6b6126a06134c18a611f5489610f63565b88612364565b1794019190613482565b60f811156134ea5750506107f8611a76611b0092611963565b916107f86134f79161193d565b905f925f915b8383106135145750505090611f54611b0092610f7f565b90919361352360019160081b90565b61353c6107f8611a6b6126a06134c18a611f5489610f63565b17940191906134fd565b9081511561187c5761355d611a6b6126a084612357565b601081161561362c5761358061357b6135768551612e55565b61165b565b612ab9565b9060f81b600f60f81b165f1a61359582612357565b5360015b835181101561362757806135d46135c46135bb611a6b6126a06001968a612364565b60041c600f1690565b60f81b6001600160f81b03191690565b6135ed6135e361357684612e55565b915f1a9185612364565b53613614600f613603611a6b6126a0858a612364565b1660f81b6001600160f81b03191690565b6136206135e383612e55565b5301613599565b509150565b5061364261357b61363d8451612e55565b61164c565b60015b835181101561362757806136676135c46135bb611a6b6126a06001968a612364565b61367b6135e36136768461165b565b612e55565b53613691600f613603611a6b6126a0858a612364565b6136a36135e3611ab56136768561165b565b5301613645565b9190916136b8825184610f8d565b6136c28251612e55565b10613761575f5b8251811015613758576136e56136df8286610f8d565b60011690565b61373a5761370e6135bb611a6b6126a0613708613702868a610f8d565b60011c90565b86612364565b60ff6137236107f8611a6b6126a08689612364565b911603613732576001016136c9565b505050505f90565b600f613752611a6b6126a0613708613702868a610f8d565b1661370e565b50505050600190565b5050505f90565b9190600560fd1b906001600160f81b031990613786908490866118f2565b35160361379557016001013590565b60405162461bcd60e51b815260206004820152601760248201527f45787065637465642033322d6279746520737472696e670000000000000000006044820152606490fd5b6137e58284106123dd565b6137f6611a6b611a168585856118f2565b9260ff841660808110156138105750505050612b21612a75565b60b881969592939496105f1461387757506107f861382d91611950565b9161383783612ab9565b945f5b84811061384e5750505050611b0090610f7f565b80613864611a16612b95600194611f5489610f63565b5f1a613870828a612364565b530161383a565b60c01115613911576107f861388b91611976565b905f925f5b8381106138e957506138a184612ab9565b955f5b8581106138bc575050505090611f54611b0092610f7f565b806138d6611a16612b95600194611f548a611f548b610f63565b5f1a6138e2828b612364565b53016138a4565b9360019060081b6139096107f8611a6b611a16612c418a611f548a610f63565b179401613890565b60405162461bcd60e51b815260206004820152601e60248201527f457870656374656420737472696e6720646174612c20676f74206c69737400006044820152606490fdfea2646970667358221220cf5d410282956f49525d49e939275e5accc13b9b670073f101b75a932c70f62364736f6c634300081e0033","sourceMap":"494:13789:20:-:0;;;;-1:-1:-1;494:13789:20;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;2822:30;;494:13789;2822:30;2862:38;;2910:32;;2970:10;494:13789;2952:28;3009:3;2990:22;;3027:24;;;;;:53;;;-1:-1:-1;3023:642:20;;-1:-1:-1;494:13789:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2862:38;494:13789;;;;;;;;;;;;;;;2910:32;494:13789;;;;;;;;;;;;;;;3009:3;494:13789;;;;;;;;;;;3023:642;-1:-1:-1;;;;;494:13789:20;;;3237:44;;;;;:::i;:::-;3224:9;:57;494:13789;;;;;3384:43;494:13789;;;3009:3;494:13789;;3507:13;494:13789;;;3507:13;494:13789;3096:559;3023:642;;;;;;;494:13789;;;-1:-1:-1;;;494:13789:20;;;;;;;;;;;;;;;;;;;;3096:559;3967:6;494:13789;;;;;;-1:-1:-1;494:13789:20;;;;;;;;-1:-1:-1;;;;;494:13789:20;4019:27;494:13789;;;;4175:25;;494:13789;;;4406:106;4468:43;494:13789;;-1:-1:-1;494:13789:20;;;;4299:43;494:13789;;;;;;;;;;;;4468:43;;:::i;:::-;494:13789;;;;;;;;;;4406:106;;2970:10;4406:106;;;494:13789;4461:4;494:13789;;;;;;;;4406:106;;;;;;;;3096:559;494:13789;3009:3;494:13789;;3967:6;494:13789;;;3967:6;494:13789;3096:559;;4406:106;494:13789;4406:106;;494:13789;4406:106;;;;;;494:13789;4406:106;;;:::i;:::-;;;494:13789;;;;;;;;;;4406:106;494:13789;;-1:-1:-1;494:13789:20;;4406:106;;;-1:-1:-1;4406:106:20;;;494:13789;;;-1:-1:-1;494:13789:20;;;;;;;;-1:-1:-1;;;494:13789:20;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;494:13789:20;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;494:13789:20;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;494:13789:20;;;;;;;;;;;;;;;;;;;;3027:53;3055:25;;;;3027:53;;494:13789;;;;;-1:-1:-1;;494:13789:20;;;;-1:-1:-1;;;;;494:13789:20;;;;;;;;;;:::o;:::-;;;;-1:-1:-1;494:13789:20;;;;;-1:-1:-1;494:13789:20;;;;-1:-1:-1;;;;;494:13789:20;;;;;;:::o;:::-;;;;;;;;;;:::o;:::-;;;;;;;;;;;","linkReferences":{}},"deployedBytecode":{"object":"0x60806040526004361015610011575f80fd5b5f3560e01c8063046f7da2146101845780631aa7c0ec1461017f5780632feef2ec1461017a578063308657d71461017557806333ee5f35146101705780633ccfd60b1461016b57806350431ce4146101665780635922e8f8146101615780635a4fd6451461015c57806380f323a71461015757806381972d00146101525780638677ab231461014d5780638bd03d0a146101485780639940686e14610143578063a65e2cfd1461013e578063ae6c3fcf14610139578063cb766a5614610134578063d415b3f91461012f578063d4899a621461012a578063df23579414610125578063ede7f6a314610120578063f3a504f21461011b5763fe03a46014610116575f80fd5b610e3a565b610e15565b610cb3565b610bba565b610b80565b610b63565b610b3f565b610a4f565b610904565b61078f565b610772565b61072e565b6106db565b6106be565b6106a2565b6104cd565b6103b6565b610279565b61025c565b61023a565b610200565b6101d8565b346101d4575f3660031901126101d4576101c8337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031614610e57565b6007805460ff19169055005b5f80fd5b346101d4575f3660031901126101d4576003546040516001600160a01b039091168152602090f35b346101d4575f3660031901126101d45760206040517f00000000000000000000000000000000000000000000000000000000000000008152f35b346101d4575f3660031901126101d457602060ff600754166040519015158152f35b346101d4575f3660031901126101d4576020600454604051908152f35b346101d4575f3660031901126101d4576007546102a09060081c60ff16610ea3565b610ea3565b5f60206103777f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166102db811515610ee5565b61030f337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031614610e57565b610317611584565b61032660015460025490610f8d565b61033661ff001960075416600755565b61033f5f600155565b84805561034d811515610f9a565b60405163a9059cbb60e01b8152336004820152602481019190915293849283919082906044820190565b03925af180156103b15761038757005b6103a89060203d6020116103aa575b6103a08183610ff2565b810190611019565b005b503d610396565b611031565b346101d4575f3660031901126101d4576103d760ff60075460081c16610ea3565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031661048f57610439337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031614610e57565b610441611584565b6103a85f80808061045760015460025490610f8d565b61046761ff001960075416600755565b6104705f600155565b81805561047e811515610f9a565b335af1610489611058565b50611087565b60405162461bcd60e51b8152602060048201526016602482015275055736520776974686472617720666f722045524332360541b6044820152606490fd5b346101d45760403660031901126101d45760043567ffffffffffffffff81116101d4578060040160c060031983360301126101d457602435917f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166106655761058e826106096106046105fe836105f86105f382608461060e9a61056961065d9e6105636106589f806110c9565b906117d3565b6105b86105b361058261057c86806110c9565b906119f4565b602484019d8e876110c9565b9061059c60448701896110c9565b906105ab60a48901809b6110c9565b949093611adc565b6110fc565b6105ab6105ce6105c888806110c9565b90611b03565b936105ea6105e060648501809a6110c9565b959094018d6110c9565b9290918d6110c9565b611148565b846110c9565b90611c38565b611194565b6110c9565b907f0000000000000000000000000000000000000000000000000000000000000000917f000000000000000000000000000000000000000000000000000000000000000091611dea565b6111df565b6103a8612025565b60405162461bcd60e51b8152602060048201526015602482015274055736520636f6c6c65637420666f7220455243323605c1b6044820152606490fd5b346101d4575f3660031901126101d45760205f54604051908152f35b346101d4575f3660031901126101d4576020600554604051908152f35b346101d4575f3660031901126101d45761071f337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031614610e57565b6007805460ff19166001179055005b346101d4575f3660031901126101d4576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b346101d4575f3660031901126101d4576020600154604051908152f35b346101d45760203660031901126101d4576007546004356107b660ff600884901c16610ea3565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169161080790610802906107fe906107f886151561122b565b60ff1690565b1590565b611277565b60045480151590816108fa575b506108c8575b61082d6108286107fe6114e4565b6112bc565b61084361083b5f5460011c90565b821015611313565b6040516323b872dd60e01b81523360048201523060248201526044810182905291602090839060649082905f905af19182156103b1576103a8926108ab575b50600380546001600160a01b031916331790556108a66108a142610f4f565b600455565b600555565b6108c39060203d6020116103aa576103a08183610ff2565b610882565b6108d56005545f54610f8d565b5f556108ed6108e8600554600654610f8d565b600655565b6108f5611584565b61081a565b905042115f610814565b346101d45760403660031901126101d4575f6020610a0f6004356109d0602435610958337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031614610e57565b61097361096e6107fe60075460ff9060081c1690565b611373565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316926109cb906109ad8515156113bf565b6109b881151561140b565b6109c3831515611457565b808855600255565b600155565b6109df60025460015490610f8d565b6040516323b872dd60e01b8152336004820152306024820152604481019190915293849283919082906064820190565b03925af180156103b157610a32575b6103a861010061ff00196007541617600755565b610a4a9060203d6020116103aa576103a08183610ff2565b610a1e565b5f3660031901126101d457610aaa6108026107fe600754610a7761029b8260ff9060081c1690565b6107f87f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316156114a3565b6004548015159081610b35575b50610b08575b610acb6108286107fe6114e4565b610ae1610ad95f5460011c90565b341015611313565b600380546001600160a01b03191633179055610aff6108a142610f4f565b6103a834600555565b610b156005545f54610f8d565b5f55610b286108e8600554600654610f8d565b610b30611584565b610abd565b905042115f610ab7565b346101d4575f3660031901126101d4576020610b596114e4565b6040519015158152f35b346101d4575f3660031901126101d4576020600254604051908152f35b346101d4575f3660031901126101d45760206040517f00000000000000000000000000000000000000000000000000000000000000008152f35b60403660031901126101d457600435602435610c00337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031614610e57565b610c1260ff60075460081c1615611373565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316610c79576109cb82610c52610a1e94151561140b565b610c5d831515611457565b610c71610c6a8483610f8d565b34146114fc565b805f55600255565b60405162461bcd60e51b815260206004820152601260248201527105573652066756e6420666f722045524332360741b6044820152606490fd5b346101d45760403660031901126101d45760043567ffffffffffffffff81116101d4578060040160a060031983360301126101d4577f00000000000000000000000000000000000000000000000000000000000000009160243591906001600160a01b03841615610dd157610dc993610d7883610d39610dc496610563836084986110c9565b610d466105c882806110c9565b906106096105f36024870193610d5c85856110c9565b90610d6a60448b01876110c9565b906105ab60648d01896110c9565b7f0000000000000000000000000000000000000000000000000000000000000000947f0000000000000000000000000000000000000000000000000000000000000000940135916120d1565b61153f565b6103a8612232565b606460405162461bcd60e51b815260206004820152602060248201527f55736520636f6c6c6563744e617469766520666f72206e6174697665204554486044820152fd5b346101d4575f3660031901126101d457602060ff60075460081c166040519015158152f35b346101d4575f3660031901126101d4576020600654604051908152f35b15610e5e57565b60405162461bcd60e51b815260206004820152601d60248201527f4f6e6c792063616c6c61626c6520627920746865206465706c6f7965720000006044820152606490fd5b15610eaa57565b60405162461bcd60e51b815260206004820152601360248201527210dbdb9d1c9858dd081b9bdd08199d5b991959606a1b6044820152606490fd5b15610eec57565b60405162461bcd60e51b815260206004820152602160248201527f5573652077697468647261774e617469766520666f72206e61746976652045546044820152600960fb1b6064820152608490fd5b634e487b7160e01b5f52601160045260245ffd5b9061012c8201809211610f5e57565b610f3b565b9060018201809211610f5e57565b9060158201809211610f5e57565b6001019081600111610f5e57565b91908201809211610f5e57565b15610fa157565b60405162461bcd60e51b81526020600482015260156024820152744e6f20776974686472617761626c652066756e647360581b6044820152606490fd5b634e487b7160e01b5f52604160045260245ffd5b90601f8019910116810190811067ffffffffffffffff82111761101457604052565b610fde565b908160209103126101d4575180151581036101d45790565b6040513d5f823e3d90fd5b67ffffffffffffffff811161101457601f01601f191660200190565b3d15611082573d906110698261103c565b916110776040519384610ff2565b82523d5f602084013e565b606090565b1561108e57565b60405162461bcd60e51b8152602060048201526013602482015272115512081d1c985b9cd9995c8819985a5b1959606a1b6044820152606490fd5b903590601e19813603018212156101d4570180359067ffffffffffffffff82116101d4576020019181360383136101d457565b1561110357565b60405162461bcd60e51b815260206004820152601d60248201527f496e76616c6964207472616e73616374696f6e204d50542070726f6f660000006044820152606490fd5b1561114f57565b60405162461bcd60e51b815260206004820152601960248201527f496e76616c69642072656365697074204d50542070726f6f66000000000000006044820152606490fd5b1561119b57565b606460405162461bcd60e51b815260206004820152602060248201527f5472616e73616374696f6e206661696c6564202873746174757320213d2031296044820152fd5b156111e657565b60405162461bcd60e51b815260206004820152601760248201527f496e76616c6964206e6174697665207472616e736665720000000000000000006044820152606490fd5b1561123257565b60405162461bcd60e51b815260206004820152601d60248201527f55736520626f6e644e617469766520666f72206e6174697665204554480000006044820152606490fd5b1561127e57565b60405162461bcd60e51b815260206004820152601660248201527510d85b98d95b1b185d1a5bdb881c995c5d595cdd195960521b6044820152606490fd5b156112c357565b60405162461bcd60e51b815260206004820152602260248201527f416e6f74686572206578656375746f7220697320616c726561647920626f6e64604482015261195960f21b6064820152608490fd5b1561131a57565b60405162461bcd60e51b815260206004820152602b60248201527f426f6e64206d757374206265206174206c656173742068616c66206f6620726560448201526a1dd85c9908185b5bdd5b9d60aa1b6064820152608490fd5b1561137a57565b60405162461bcd60e51b815260206004820152601760248201527f436f6e747261637420616c72656164792066756e6465640000000000000000006044820152606490fd5b156113c657565b60405162461bcd60e51b815260206004820152601d60248201527f5573652066756e644e617469766520666f72206e6174697665204554480000006044820152606490fd5b1561141257565b60405162461bcd60e51b815260206004820152601e60248201527f52657761726420616d6f756e74206d757374206265206e6f6e2d7a65726f00006044820152606490fd5b1561145e57565b60405162461bcd60e51b815260206004820152601f60248201527f5061796d656e7420616d6f756e74206d757374206265206e6f6e2d7a65726f006044820152606490fd5b156114aa57565b60405162461bcd60e51b8152602060048201526012602482015271055736520626f6e6420666f722045524332360741b6044820152606490fd5b60045480151590816114f4575090565b905042111590565b1561150357565b60405162461bcd60e51b8152602060048201526014602482015273125b98dbdc9c9958dd0811551208185b5bdd5b9d60621b6044820152606490fd5b1561154657565b60405162461bcd60e51b8152602060048201526016602482015275125b9d985b1a5908151c985b9cd9995c88195d995b9d60521b6044820152606490fd5b61158c6114e4565b6115b1576bffffffffffffffffffffffff60a01b600354166003555f6005555f600455565b60405162461bcd60e51b815260206004820152602160248201527f43616e6e6f74207265736574207768696c6520626f6e642069732061637469766044820152606560f81b6064820152608490fd5b1561160757565b60405162461bcd60e51b815260206004820152601d60248201527f54617267657420626c6f636b20697320696e20746865206675747572650000006044820152606490fd5b600119810191908211610f5e57565b5f19810191908211610f5e57565b91908203918211610f5e57565b1561167d57565b60405162461bcd60e51b815260206004820152601460248201527315185c99d95d08189b1bd8dac81d1bdbc81bdb1960621b6044820152606490fd5b156116c057565b60405162461bcd60e51b815260206004820152601d60248201527f556e61626c6520746f20726574726965766520626c6f636b20686173680000006044820152606490fd5b9291926117118261103c565b9161171f6040519384610ff2565b8294818452818301116101d4578281602093845f960137010152565b1561174257565b60405162461bcd60e51b815260206004820152601a60248201527f426c6f636b206865616465722068617368206d69736d617463680000000000006044820152606490fd5b1561178e57565b60405162461bcd60e51b815260206004820152601c60248201527f48656164657220626c6f636b206e756d626572206d69736d61746368000000006044820152606490fd5b9190916117e760ff60075460081c16610ea3565b6003546001600160a01b03163314806118c2575b1561187e5761187c926118769161181443851115611600565b6118496118218543611669565b7f00000000000000000000000000000000000000000000000000000000000000001015611676565b61187184406118598115156116b9565b611864368585611705565b602081519101201461173b565b612375565b14611787565b565b606460405162461bcd60e51b815260206004820152602060248201527f4f6e6c7920626f6e646564206578656375746f722063616e20636f6c6c6563746044820152fd5b506118cb6114e4565b6117fb565b634e487b7160e01b5f52603260045260245ffd5b90156118ed5790565b6118d0565b908210156118ed570190565b1561190557565b60405162461bcd60e51b815260206004820152601060248201526f125b9d985b1a5908149314081b1a5cdd60821b6044820152606490fd5b60ff60f6199116019060ff8211610f5e57565b60ff607f199116019060ff8211610f5e57565b60ff60bf199116019060ff8211610f5e57565b60ff60b6199116019060ff8211610f5e57565b60ff166001019060ff8211610f5e57565b156119a157565b60405162461bcd60e51b815260206004820152602560248201527f496e76616c6964207472616e73616374696f6e73526f6f7420524c5020656e636044820152646f64696e6760d81b6064820152608490fd5b9091905f611a2c600360fe1b6001600160f81b0319611a24611a1688876118e4565b356001600160f81b03191690565b1610156118fe565b601f60fb1b6001600160f81b0319611a47611a1687866118e4565b1610611ad45780611a7b6107f8611a76611a71611a6b611a16611a81978b8a6118f2565b60f81c90565b61193d565b611989565b90610f8d565b5f5b60048110611abf5750611ab5611aba929394600560fd1b90611aae611a168560ff60f81b93896118f2565b161461199a565b610f63565b013590565b90611acd6001918685612429565b9101611a83565b506001611a81565b611af2611afa92939495611b0098973691611705565b923691611705565b906125dd565b90565b90611b0e81836127d9565b905f5b60058110611b955750600560fd1b906001600160f81b031990611b36908490866118f2565b351603611b4657611aba90610f63565b60405162461bcd60e51b815260206004820152602160248201527f496e76616c6964207265636569707473526f6f7420524c5020656e636f64696e6044820152606760f81b6064820152608490fd5b91611ba36001918386612429565b9201611b11565b15611bb157565b60405162461bcd60e51b81526020600482015260136024820152720496e76616c6964207265636569707420524c5606c1b6044820152606490fd5b15611bf357565b60405162461bcd60e51b815260206004820152601d60248201527f5265636569707420737461747573206973206e6f7420737563636573730000006044820152606490fd5b60ff611cb6611a6b611a16600194611cbd965f81151580611cd2575b611ccb575b611c7860c088611c70611a6b611a1686888a6118f2565b161015611baa565b60f887611c8c611a6b611a168587896118f2565b1610611cc25780611a7b6107f8611a76611a71611a6b611a16611cb097898b6118f2565b916118f2565b1614611bec565b600190565b611cb090610f63565b5086611c59565b50608087611ce6611a6b611a1686886118e4565b1610611c54565b15611cf457565b60405162461bcd60e51b815260206004820152600e60248201526d0496e76616c696420747820524c560941b6044820152606490fd5b15611d3157565b60405162461bcd60e51b8152602060048201526012602482015271496e76616c696420746f206164647265737360701b6044820152606490fd5b15611d7257565b60405162461bcd60e51b81526020600482015260126024820152710a4cac6d2e0d2cadce840dad2e6dac2e8c6d60731b6044820152606490fd5b15611db357565b60405162461bcd60e51b815260206004820152600f60248201526e082dadeeadce840dad2e6dac2e8c6d608b1b6044820152606490fd5b90916003905f84151580612009575b611f8c575b80611e2260c060ff611e1a611a6b611a16611e5d978c8c6118f2565b161015611ced565b60f860ff611e37611a6b611a16858b8b6118f2565b1610611f835760ff611e56611a76611a71611a6b611a16868c8c6118f2565b1690610f8d565b915f905b808210611f6c57505090611eaa611eaf92611e91609460ff611e8a611a6b611a16888c8c6118f2565b1614611d2a565b6001600160a01b03166001838601013560601c14611d6b565b610f71565b91611ec1611a6b611a168584866118f2565b925f9260ff851694608086105f14611ee457505050505090611cbd915b14611dac565b90919293946080145f14611f01575050505050611cbd905f611ede565b6107f8611f1091939293611950565b915f935b838510611f2a57505050505090611cbd91611ede565b9091929394611f3b60019160081b90565b611f606107f8611a6b611a16611f598b611f548b610f63565b610f8d565b87896118f2565b17950193929190611f14565b9092611f7b6001918787612429565b930190611e61565b60ff6001611e56565b509050611f9f611a6b611a1685856118e4565b6001919060ff16808303611fbc5750611e5d6004925b9050611dfe565b600203611fce57611e5d600592611fb5565b60405162461bcd60e51b8152602060048201526013602482015272556e737570706f72746564207478207479706560681b6044820152606490fd5b50608060ff61201e611a6b611a1689896118e4565b1610611df9565b6005545f548101809111610f5e576001548101809111610f5e575f80808061187c946003546bffffffffffffffffffffffff60a01b8116600355826005558260045561207761ff001960075416600755565b60018390558280556001600160a01b03165af1610489611058565b1561209957565b60405162461bcd60e51b815260206004820152601060248201526f0496e76616c6964206c6f677320524c560841b6044820152606490fd5b959493929190805f818981151580612216575b61220d575b60ff611c70611a6b611a16866121019660c0966118f2565b8860f860ff612117611a6b611a168688876118f2565b16106121fb576107f8611a76611a71611a6b611a168661213a98611a7b976118f2565b81905b885f5b600381106121e2575060c06121626107f8611a6b611a168688612169976118f2565b1015612092565b8860f86121806107f8611a6b611a168688876118f2565b106121d1576107f8611a76611a71611a6b611a16866121a298611a7b976118f2565b915b5f905b8082106121ba575050611b0095966129c0565b90926121c9600191848b612429565b9301906121a7565b506121dc9150610f63565b916121a4565b92916001926121f092612429565b910190888392612140565b506122069150610f63565b819061213d565b600192506120e9565b50608060ff61222b611a6b611a1686866118e4565b16106120e4565b61224c6122436005545f5490610f8d565b60015490610f8d565b6003546001600160a01b0316600380546001600160a01b03191690556122715f600555565b61227a5f600455565b61228a61ff001960075416600755565b6122935f600155565b5f80554662aa36a70361232557604051633419e74d60e21b81526001600160a01b039091166004820152602481019190915260208180604481015b03815f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165af180156103b15761230a5750565b6123229060203d6020116103aa576103a08183610ff2565b50565b60405163a9059cbb60e01b81526001600160a01b039091166004820152602481019190915260208180604481016122ce565b8051156118ed5760200190565b9081518110156118ed570160200190565b919061238181846127d9565b905f5b600881106123c857506123979293612aeb565b50905f805b83518210156123c3576001906123b28386612364565b5160f81c9060081b1791019061239c565b925050565b916123d66001918387612429565b9201612384565b156123e457565b60405162461bcd60e51b815260206004820152601860248201527f524c50206f6666736574206f7574206f6620626f756e647300000000000000006044820152606490fd5b91906124368183106123dd565b612447611a6b611a168484876118f2565b9060ff8216608081101561246257505050611b009150610f63565b91929160b881101561248a575050611b0092506107f8612484611a7b92610f63565b92611950565b90929060c081101561250057506107f86124a691949394611976565b915f935f915b8483106124c757505050611b009291611f54611f5492610f63565b9091946124d660019160081b90565b6124f66107f8611a6b611a166124ef8b611f548b610f63565b88886118f2565b17950191906124ac565b90929060f811156125265750611b0092506107f8612520611a7b92610f63565b92611963565b92916107f86125349161193d565b915f935f915b84831061255557505050611b009291611f54611f5492610f63565b90919461256460019160081b90565b61257d6107f8611a6b611a166124ef8b611f548b610f63565b179501919061253a565b1561258e57565b60405162461bcd60e51b815260206004820152602160248201527f457870656374656420524c50206c69737420666f722070726f6f66206e6f64656044820152607360f81b6064820152608490fd5b919390929190612609600360fe1b6001600160f81b0319612601611a16878a6118e4565b161015612587565b601f60fb1b6001600160f81b0319612624611a1686896118e4565b1610612783576126486126436107f8611a71611a6b611a16888b6118e4565b610f7f565b9492905b945f5b82821061266157505050505050505f90565b61267f6126788361267336878a611705565b612c95565b9093610f8d565b96825160208401200361272157600360fe1b6126bb6126ae6126a085612357565b516001600160f81b03191690565b6001600160f81b03191690565b10612721578590846001601f60fb1b6126d96126ae6126a088612357565b1015612765575b6126ea8186612e1f565b6011810361272c57506126fc94612fb1565b9491156127215784156127155793915b9195909361264f565b50505050505050600190565b505050505050505f90565b9093506002141590506127595784879261274594612e6b565b94911561272157841561271557939161270c565b50505050505050505f90565b5061277e6126436107f8611a71611a6b6126a089612357565b6126e0565b600194929061264c565b1561279457565b60405162461bcd60e51b815260206004820152601d60248201527f496e76616c696420696e6e65722068656164657220524c50206c6973740000006044820152606490fd5b5f6127f8600360fe1b6001600160f81b0319611a24611a1687876118e4565b601f60fb1b6001600160f81b0319612813611a1686866118e4565b16106128ea5780611a7b6107f8611a76611a71611a6b611a16612837978a8a6118f2565b905b61a5bd461480156128df575b612850575b50905090565b5f5b600381106128ca575061287b600360fe1b6128746126ae611a168688876118f2565b101561278d565b601f60fb1b6128916126ae611a168587866118f2565b106128ba576107f8611a76611a71611a6b611a16866128b398611a7b976118f2565b805f61284a565b506128c59150610f63565b6128b3565b916128d86001918584612429565b9201612852565b5061a5bf4614612845565b50600190612839565b156128fa57565b60405162461bcd60e51b815260206004820152600f60248201526e0496e76616c6964206c6f6720524c5608c1b6044820152606490fd5b1561293857565b60405162461bcd60e51b815260206004820152601e60248201527f496e76616c696420656d69747465722061646472657373206c656e67746800006044820152606490fd5b1561298457565b60405162461bcd60e51b815260206004820152601460248201527315dc9bdb99c81d1bdad95b8818dbdb9d1c9858dd60621b6044820152606490fd5b916014611b00969594611f5484612a5c9487816129f360c060ff6129eb611a6b611a16868a896118f2565b1610156128f3565b60f860ff612a08611a6b611a168589886118f2565b1610612a6257506107f8611a76611a71611a6b611a1686612a2c98611a7b976118f2565b915b612a398387896130c6565b9490612a4782825114612931565b01516001600160a01b0390811691161461297d565b916132d0565b915050612a6f9150610f63565b91612a2e565b60408051909190612a868382610ff2565b6001815291601f1901366020840137565b60408051909190612aa88382610ff2565b6014815291601f1901366020840137565b90612ac38261103c565b612ad06040519182610ff2565b8281528092612ae1601f199161103c565b0190602036910137565b612af68284106123dd565b612b07611a6b611a168585856118f2565b9260ff84166080811015612b415750505050612b21612a75565b9060f81b6001600160f81b0319165f1a612b3a82612357565b5390600190565b60b881969592939496105f14612baf57506107f8612b5e91611950565b91612b6883612ab9565b945f5b848110612b7f5750505050611b0090610f7f565b80612b9c611a16612b95600194611f5489610f63565b85876118f2565b5f1a612ba8828a612364565b5301612b6b565b60c01115612c50576107f8612bc391611976565b905f925f5b838110612c215750612bd984612ab9565b955f5b858110612bf4575050505090611f54611b0092610f7f565b80612c0e611a16612b95600194611f548a611f548b610f63565b5f1a612c1a828b612364565b5301612bdc565b9360019060081b612c486107f8611a6b611a16612c418a611f548a610f63565b8c886118f2565b179401612bc8565b60405162461bcd60e51b815260206004820152601e60248201527f457870656374656420737472696e67206974656d2c20676f74206c69737400006044820152606490fd5b612ca1815183106123dd565b612cb1611a6b6126a08484612364565b9160ff83166080811015612cca57505050612b21612a75565b919392909160b8811015612d3457506107f8612ce591611950565b90612cef82612ab9565b935f5b838110612d0557505050611b0090610f7f565b80612d216126a0612d1b600194611f5488610f63565b85612364565b5f1a612d2d8289612364565b5301612cf2565b60c01115612dd2576107f8612d4891611976565b5f915f5b828110612da45750612d5d83612ab9565b945f5b848110612d775750505090611f54611b0092610f7f565b80612d916126a0612d1b600194611f5489611f548a610f63565b5f1a612d9d828a612364565b5301612d60565b9260019060081b612dca6107f8611a6b6126a0612dc489611f5489610f63565b8b612364565b179301612d4c565b5091612dde8382613416565b92612de884612ab9565b915f5b858110612df9575050509190565b80612e0c6126a0612d1b60019487610f8d565b5f1a612e188287612364565b5301612deb565b5f915b8151811015612e5057612e358183613416565b8101809111610f5e57915f198114610f5e5760010191612e22565b505090565b908160011b9180830460021490151715610f5e57565b83949291612e798183612c95565b9390612e986020612e8f611a6b6126a085612357565b16151591613546565b97889115612f3a5750612eac905187610f8d565b612eb68251612e55565b14612ecb575b505050505050505f905f905f90565b86866001928251612f28575b505050612ee5575b80612ebc565b612ef892612ef291610f8d565b90612c95565b5060208151910120906020815191012014612f165780808080612edf565b612f21915190610f8d565b6001915f90565b612f3293506136aa565b86865f612ed7565b612f4b93949596506107fe926136aa565b612fa457612f5c92612ef291610f8d565b50908151602081145f14612f8457506020612f7c920151925b5190610f8d565b916001929190565b8015612f98576020612f7c93012092612f75565b505050505f905f905f90565b50505050505f905f905f90565b91909293612fbf8251612e55565b8510156130695750611a6b6126a0612fe192612fdb8760011c90565b90612364565b600184166130605760041c600f16915b905f925b60ff81168410613040575061300a9250612c95565b508051801561303557612f7c916020820361302b5760209150015191610f63565b6020012091610f63565b5050505f905f905f90565b9091600161305482611a7b60ff9487613416565b94019392919050612ff5565b600f1691612ff1565b9290509392935f915b601083106130ac576130849250612c95565b50602081519101209060208151910120145f146130a357600191905f90565b5f915081908190565b906130bd81611a7b60019385613416565b92019190613072565b9190916130d48383106123dd565b609460ff6130e9611a6b611a168688876118f2565b1603613135576130f7612a97565b925f5b6014811061310c575050505090601590565b80613122611a16612b95600194611f5489610f63565b5f1a61312e8288612364565b53016130fa565b60405162461bcd60e51b815260206004820152601c60248201527f496e76616c6964206164647265737320524c5020656e636f64696e67000000006044820152606490fd5b1561318157565b60405162461bcd60e51b81526020600482015260126024820152710496e76616c696420746f7069637320524c560741b6044820152606490fd5b156131c257565b60405162461bcd60e51b815260206004820152601560248201527457726f6e67206576656e74207369676e617475726560581b6044820152606490fd5b1561320657565b60405162461bcd60e51b81526020600482015260136024820152720a8de40c2c8c8e4cae6e640dad2e6dac2e8c6d606b1b6044820152606490fd5b1561324857565b60405162461bcd60e51b8152602060048201526014602482015273416d6f756e74206461746120746f6f206c6f6e6760601b6044820152606490fd5b1561328b57565b60405162461bcd60e51b815260206004820152601860248201527f5472616e7366657220616d6f756e74206d69736d6174636800000000000000006044820152606490fd5b91806133b26133bf9561339f61339361339361338c6133858961337e7fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef6133788e8060f86133b99f61334c611a6b611a168361334560c060ff61333d8f611a16839a611a6b92819e6118f2565b16101561317a565b8b886118f2565b161061340c5780611a7b6107f8611a76611a71611a6b611a16613370978d8a6118f2565b948591613768565b146131bb565b8a8c612429565b898b612429565b888a613768565b6001600160a01b031690565b6001600160a01b039081169116146131ff565b8284612429565b916137da565b506133ce602082511115613241565b5f92835b82518510156133fd5760019060081b6133f46107f8611a6b6126a08988612364565b179401936133d2565b909350611cbd92915014613284565b506133708d610f63565b90613423825182106123dd565b613433611a6b6126a08385612364565b9160ff8316608081101561344a5750505050600190565b60b8811015613465575050506107f8611a76611b0092611950565b60c08110156134d15750916107f861347c91611976565b905f925f915b8383106134995750505090611f54611b0092610f7f565b9091936134a860019160081b90565b6134c76107f8611a6b6126a06134c18a611f5489610f63565b88612364565b1794019190613482565b60f811156134ea5750506107f8611a76611b0092611963565b916107f86134f79161193d565b905f925f915b8383106135145750505090611f54611b0092610f7f565b90919361352360019160081b90565b61353c6107f8611a6b6126a06134c18a611f5489610f63565b17940191906134fd565b9081511561187c5761355d611a6b6126a084612357565b601081161561362c5761358061357b6135768551612e55565b61165b565b612ab9565b9060f81b600f60f81b165f1a61359582612357565b5360015b835181101561362757806135d46135c46135bb611a6b6126a06001968a612364565b60041c600f1690565b60f81b6001600160f81b03191690565b6135ed6135e361357684612e55565b915f1a9185612364565b53613614600f613603611a6b6126a0858a612364565b1660f81b6001600160f81b03191690565b6136206135e383612e55565b5301613599565b509150565b5061364261357b61363d8451612e55565b61164c565b60015b835181101561362757806136676135c46135bb611a6b6126a06001968a612364565b61367b6135e36136768461165b565b612e55565b53613691600f613603611a6b6126a0858a612364565b6136a36135e3611ab56136768561165b565b5301613645565b9190916136b8825184610f8d565b6136c28251612e55565b10613761575f5b8251811015613758576136e56136df8286610f8d565b60011690565b61373a5761370e6135bb611a6b6126a0613708613702868a610f8d565b60011c90565b86612364565b60ff6137236107f8611a6b6126a08689612364565b911603613732576001016136c9565b505050505f90565b600f613752611a6b6126a0613708613702868a610f8d565b1661370e565b50505050600190565b5050505f90565b9190600560fd1b906001600160f81b031990613786908490866118f2565b35160361379557016001013590565b60405162461bcd60e51b815260206004820152601760248201527f45787065637465642033322d6279746520737472696e670000000000000000006044820152606490fd5b6137e58284106123dd565b6137f6611a6b611a168585856118f2565b9260ff841660808110156138105750505050612b21612a75565b60b881969592939496105f1461387757506107f861382d91611950565b9161383783612ab9565b945f5b84811061384e5750505050611b0090610f7f565b80613864611a16612b95600194611f5489610f63565b5f1a613870828a612364565b530161383a565b60c01115613911576107f861388b91611976565b905f925f5b8381106138e957506138a184612ab9565b955f5b8581106138bc575050505090611f54611b0092610f7f565b806138d6611a16612b95600194611f548a611f548b610f63565b5f1a6138e2828b612364565b53016138a4565b9360019060081b6139096107f8611a6b611a16612c418a611f548a610f63565b179401613890565b60405162461bcd60e51b815260206004820152601e60248201527f457870656374656420737472696e6720646174612c20676f74206c69737400006044820152606490fdfea2646970667358221220cf5d410282956f49525d49e939275e5accc13b9b670073f101b75a932c70f62364736f6c634300081e0033","sourceMap":"494:13789:20:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;;;;;-1:-1:-1;;494:13789:20;;;;7903:71;7911:10;7925:15;-1:-1:-1;;;;;494:13789:20;7911:29;7903:71;:::i;:::-;7984:27;494:13789;;-1:-1:-1;;494:13789:20;;;;;;;;;;;;;;-1:-1:-1;;494:13789:20;;;;1354:29;494:13789;;;-1:-1:-1;;;;;494:13789:20;;;;;;;;;;;;;;-1:-1:-1;;494:13789:20;;;;;;;1061:39;494:13789;;;;;;;;;-1:-1:-1;;494:13789:20;;;;;;1498:31;494:13789;;;;;;;;;;;;;;;;-1:-1:-1;;494:13789:20;;;;;;;;;;;;;;;;;;;-1:-1:-1;;494:13789:20;;;;12885:6;494:13789;12877:38;;494:13789;;;;12877:38;:::i;494:13789::-;12877:38;:::i;:::-;494:13789;13360:62;;12933:13;-1:-1:-1;;;;;494:13789:20;12925:73;12933:27;;;12925:73;:::i;:::-;13008:71;13016:10;13030:15;-1:-1:-1;;;;;494:13789:20;13016:29;13008:71;:::i;:::-;;;:::i;:::-;13147:43;:20;494:13789;13170:20;494:13789;13147:43;;:::i;:::-;13201:14;494:13789;;12885:6;494:13789;;12885:6;494:13789;;13201:14;13225:24;494:13789;13147:20;494:13789;;13225:24;494:13789;;;13293:56;13301:22;;;13293:56;:::i;:::-;494:13789;;-1:-1:-1;;;13360:62:20;;13016:10;494:13789;13360:62;;494:13789;;;;;;;;;;;;;;;;;;;;;13360:62;;;;;;;;;;;494:13789;13360:62;;;;;;;;;;;;;;:::i;:::-;;;;;:::i;:::-;494:13789;13360:62;;;;;;;:::i;494:13789::-;;;;;;-1:-1:-1;;494:13789:20;;;;13478:38;494:13789;13486:6;494:13789;;;;13478:38;:::i;:::-;13534:13;-1:-1:-1;;;;;494:13789:20;;;13598:71;13606:10;13620:15;-1:-1:-1;;;;;494:13789:20;13606:29;13598:71;:::i;:::-;;;:::i;:::-;14024:39;494:13789;;;;13737:43;:20;494:13789;13760:20;494:13789;13737:43;;:::i;:::-;13791:14;494:13789;;12885:6;494:13789;;12885:6;494:13789;;13791:14;13815:24;494:13789;13147:20;494:13789;;13815:24;494:13789;;;13883:56;13891:22;;;13883:56;:::i;:::-;13606:10;13968:46;;;;:::i;:::-;;14024:39;:::i;494:13789::-;;;-1:-1:-1;;;494:13789:20;;;;;;;;;;;;-1:-1:-1;;;494:13789:20;;;;;;;;;;;;;-1:-1:-1;;494:13789:20;;;;;;;;;;;;;;;;;;;;;;;;;;;9278:13;-1:-1:-1;;;;;494:13789:20;;;9620:20;9362:17;10137:101;10145:56;10184:16;9362:17;9899:171;9920:99;9362:17;9969:23;10376:20;9362:17;9381;10315:166;9362:17;;10336:96;9362:17;;;:::i;:::-;9381;;:::i;:::-;9568:178;9589:102;9498:60;9540:17;;;;:::i;:::-;9498:60;;:::i;:::-;494:13789;9620:20;;;;;;:::i;:::-;9642:18;;;;;;;:::i;:::-;9662:10;;;;;;;;:::i;:::-;9589:102;;;;:::i;:::-;9568:178;:::i;:::-;9994:10;9833:56;9871:17;;;;:::i;:::-;9833:56;;:::i;:::-;9951:16;9969:23;9951:16;;;;;;;:::i;:::-;9969:23;;;;;;:::i;:::-;9994:10;;;;;:::i;9920:99::-;9899:171;:::i;:::-;10184:16;;:::i;:::-;10145:56;;:::i;:::-;10137:101;:::i;:::-;10376:20;:::i;:::-;10417:14;;10398:17;;10336:96;;:::i;:::-;10315:166;:::i;:::-;;;:::i;494:13789::-;;;-1:-1:-1;;;494:13789:20;;;;;;;;;;;;-1:-1:-1;;;494:13789:20;;;;;;;;;;;;;-1:-1:-1;;494:13789:20;;;;;;;;;;;;;;;;;;;-1:-1:-1;;494:13789:20;;;;;1427:25;494:13789;;;;;;;;;;;;;-1:-1:-1;;494:13789:20;;;;7640:71;7648:10;7662:15;-1:-1:-1;;;;;494:13789:20;7648:29;7640:71;:::i;:::-;7721:26;494:13789;;-1:-1:-1;;494:13789:20;7743:4;494:13789;;;;;;;;;;-1:-1:-1;;494:13789:20;;;;;;971:42;-1:-1:-1;;;;;494:13789:20;;;;;;;;;;;;-1:-1:-1;;494:13789:20;;;;;825:35;494:13789;;;;;;;;;;;;;-1:-1:-1;;494:13789:20;;;;5645:6;494:13789;;;5637:38;494:13789;;;;;;12877:38;:::i;5637:::-;5693:13;-1:-1:-1;;;;;494:13789:20;;5764:55;;5772:20;;494:13789;;5685:69;5693:27;;;5685:69;:::i;:::-;494:13789;;;;;5772:20;;494:13789;5772:20;5764:55;:::i;:::-;494:13789;;5912:21;;;:60;;;;494:13789;5908:203;;;494:13789;6215:59;6223:12;6224:11;;:::i;6223:12::-;6215:59;:::i;:::-;6284:94;6307:23;-1:-1:-1;494:13789:20;;;;;6307:23;6292:38;;;6284:94;:::i;:::-;494:13789;;-1:-1:-1;;;6389:74:20;;6424:10;494:13789;6389:74;;494:13789;6444:4;494:13789;;;;;;;;;;;;;;;;;;;-1:-1:-1;;6389:74:20;;;;;;;6568:24;6389:74;;;494:13789;-1:-1:-1;6474:27:20;494:13789;;-1:-1:-1;;;;;;494:13789:20;6424:10;494:13789;;;6511:47;6531:27;:15;:27;:::i;:::-;494:13789;;;6511:47;6568:24;494:13789;;6389:74;;;494:13789;6389:74;494:13789;6389:74;;;;;;;:::i;:::-;;;5908:203;5988:33;6011:10;494:13789;-1:-1:-1;494:13789:20;5988:33;:::i;:::-;-1:-1:-1;494:13789:20;6035:33;;6011:10;494:13789;6035:33;494:13789;6035:33;:::i;:::-;;494:13789;;6035:33;;;:::i;:::-;5908:203;;5912:60;5937:15;;;:35;5912:60;;;494:13789;;;;;;-1:-1:-1;;494:13789:20;;;;-1:-1:-1;494:13789:20;4406:106;494:13789;;4352:44;494:13789;;3877:71;3885:10;3899:15;-1:-1:-1;;;;;494:13789:20;3885:29;3877:71;:::i;:::-;3958:43;3966:7;494:13789;3967:6;494:13789;;;;;;;;3966:7;3958:43;:::i;:::-;4019:13;-1:-1:-1;;;;;494:13789:20;;4299:43;;4011:69;4019:27;;;4011:69;:::i;:::-;4090:67;4098:24;;;4090:67;:::i;:::-;4167:69;4175:25;;;4167:69;:::i;:::-;494:13789;;;4299:43;494:13789;;4299:43;4352:44;494:13789;;4352:44;4468:43;4299;494:13789;4352:44;494:13789;4468:43;;:::i;:::-;494:13789;;-1:-1:-1;;;4406:106:20;;3885:10;494:13789;4406:106;;494:13789;4461:4;494:13789;;;;;;;;;;;;;;;;;;;;;;;;4406:106;;;;;;;;;;;494:13789;4522:13;494:13789;;;3967:6;494:13789;;;3967:6;494:13789;;4406:106;;;494:13789;4406:106;494:13789;4406:106;;;;;;;:::i;:::-;;;494:13789;;;-1:-1:-1;;494:13789:20;;;;6768:55;6776:20;494:13789;6660:6;494:13789;6652:38;494:13789;;;;;;;;;6652:38;6700:58;6708:13;-1:-1:-1;;;;;494:13789:20;6708:27;6700:58;:::i;6768:55::-;494:13789;;6838:21;;;:60;;;;494:13789;6834:203;;;494:13789;7047:59;7055:12;7056:11;;:::i;7047:59::-;7116:92;7137:23;494:13789;;;;;;7137:23;7124:9;:36;;7116:92;:::i;:::-;6474:27;494:13789;;-1:-1:-1;;;;;;494:13789:20;7236:10;494:13789;;;7256:47;7276:27;:15;:27;:::i;7256:47::-;7313:22;7124:9;6568:24;494:13789;;6834:203;6914:33;6937:10;494:13789;;;6914:33;:::i;:::-;494:13789;;6961:33;;6937:10;494:13789;6961:33;494:13789;6961:33;:::i;:::-;;;:::i;:::-;6834:203;;6838:60;6863:15;;;:35;6838:60;;;494:13789;;;;;;-1:-1:-1;;494:13789:20;;;;;;;:::i;:::-;;;;;;;;;;;;;;;-1:-1:-1;;494:13789:20;;;;;866:35;494:13789;;;;;;;;;;;;;-1:-1:-1;;494:13789:20;;;;;;;1138:41;494:13789;;;;;;-1:-1:-1;;494:13789:20;;;;;;;;4654:71;4662:10;4676:15;-1:-1:-1;;;;;494:13789:20;4662:29;4654:71;:::i;:::-;4735:43;494:13789;4744:6;494:13789;;;;4743:7;4735:43;:::i;:::-;4796:13;-1:-1:-1;;;;;494:13789:20;;;5165:43;4864:24;4856:67;5218:44;4864:24;;;4856:67;:::i;:::-;4933:69;4941:25;;;4933:69;:::i;:::-;5012:90;5033:44;;;;:::i;:::-;5020:9;:57;5012:90;:::i;:::-;494:13789;-1:-1:-1;494:13789:20;4299:43;494:13789;;;;;-1:-1:-1;;;494:13789:20;;;;;;;;;;;;-1:-1:-1;;;494:13789:20;;;;;;;;;;;;;-1:-1:-1;;494:13789:20;;;;;;;;;;;;;;;;;;;;;;;;8229:13;;494:13789;;;8229:13;-1:-1:-1;;;;;494:13789:20;;8229:27;494:13789;;8744:225;8324:17;8825:16;8324:17;8343;8765:156;8324:17;;;8843:14;8324:17;;:::i;8343:::-;8457:56;8495:17;;;;:::i;8457:56::-;8575:16;8523:171;8544:99;494:13789;8575:16;;;;;;;:::i;:::-;8593;;;;;;;:::i;:::-;8611:17;;;;;;;:::i;8825:16::-;8893:14;;8874:17;;8843:14;494:13789;;8765:156;:::i;:::-;8744:225;:::i;:::-;;;:::i;494:13789::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;494:13789:20;;;;;;1535:18;494:13789;;;;;;;;;;;;;;;;;;-1:-1:-1;;494:13789:20;;;;;1458:34;494:13789;;;;;;;;;;;:::o;:::-;;;-1:-1:-1;;;494:13789:20;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;-1:-1:-1;;;494:13789:20;;;;;;;;;;;;-1:-1:-1;;;494:13789:20;;;;;;;;;;;:::o;:::-;;;-1:-1:-1;;;494:13789:20;;;;;;;;;;;;;;;;;-1:-1:-1;;;494:13789:20;;;;;;;;;;;;;;;;;;;;;6549:9;494:13789;;;;;;;:::o;:::-;;:::i;:::-;;;;;;;;;;:::o;:::-;;10821:2:23;494:13789:20;;;;;;;:::o;:::-;1971:1:21;494:13789:20;;;1971:1:21;494:13789:20;;;:::o;:::-;;;;;;;;;;:::o;:::-;;;;:::o;:::-;;;-1:-1:-1;;;494:13789:20;;;;;;;;;;;;-1:-1:-1;;;494:13789:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;:::i;:::-;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;-1:-1:-1;;494:13789:20;;;;:::o;:::-;;;;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;-1:-1:-1;494:13789:20;;;;:::o;:::-;;;:::o;:::-;;;;:::o;:::-;;;-1:-1:-1;;;494:13789:20;;;;;;;;;;;;-1:-1:-1;;;494:13789:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;:::o;:::-;;;-1:-1:-1;;;494:13789:20;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;-1:-1:-1;;;494:13789:20;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;-1:-1:-1;;;494:13789:20;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;-1:-1:-1;;;494:13789:20;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;-1:-1:-1;;;494:13789:20;;;;;;;;;;;;-1:-1:-1;;;494:13789:20;;;;;;;;;;;:::o;:::-;;;-1:-1:-1;;;494:13789:20;;;;;;;;;;;;;;;;;-1:-1:-1;;;494:13789:20;;;;;;;;;;;:::o;:::-;;;-1:-1:-1;;;494:13789:20;;;;;;;;;;;;;;;;;-1:-1:-1;;;494:13789:20;;;;;;;;;;;:::o;:::-;;;-1:-1:-1;;;494:13789:20;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;-1:-1:-1;;;494:13789:20;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;-1:-1:-1;;;494:13789:20;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;-1:-1:-1;;;494:13789:20;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;-1:-1:-1;;;494:13789:20;;;;;;;;;;;;-1:-1:-1;;;494:13789:20;;;;;;;12442:133;12507:17;494:13789;12507:21;;;:61;;;;12500:68;12442:133;:::o;12507:61::-;12532:15;;;:36;;12442:133;:::o;494:13789::-;;;;:::o;:::-;;;-1:-1:-1;;;494:13789:20;;;;;;;;;;;;-1:-1:-1;;;494:13789:20;;;;;;;;;;;:::o;:::-;;;-1:-1:-1;;;494:13789:20;;;;;;;;;;;;-1:-1:-1;;;494:13789:20;;;;;;;14076:205;14132:11;;:::i;:::-;494:13789;;;;;14192:27;494:13789;;14192:27;494:13789;14217:1;14229:14;494:13789;14217:1;14253:21;494:13789;14076:205::o;494:13789::-;;;-1:-1:-1;;;494:13789:20;;;;;;;;;;;;;;;;;-1:-1:-1;;;494:13789:20;;;;;;;;;;;:::o;:::-;;;-1:-1:-1;;;494:13789:20;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;494:13789:20;;;;;;;;:::o;:::-;-1:-1:-1;;494:13789:20;;;;;;;;:::o;:::-;;;;;;;;;;:::o;:::-;;;;:::o;:::-;;;-1:-1:-1;;;494:13789:20;;;;;;;;;;;;-1:-1:-1;;;494:13789:20;;;;;;;;;;;:::o;:::-;;;-1:-1:-1;;;494:13789:20;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;-1:-1:-1;494:13789:20;;;;;;:::o;:::-;;;;:::o;:::-;;;-1:-1:-1;;;494:13789:20;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;-1:-1:-1;;;494:13789:20;;;;;;;;;;;;;;;;;;;;10520:789;;;;10629:38;494:13789;10637:6;494:13789;;;;10629:38;:::i;:::-;10699:14;494:13789;-1:-1:-1;;;;;494:13789:20;10685:10;:28;;:43;;10520:789;494:13789;;;11191:111;10804:12;11199:49;10804:12;10775:75;10804:12;10783:33;;;10775:75;:::i;:::-;10860:85;10868:32;10804:12;;10868:32;:::i;:::-;10904:16;-1:-1:-1;10868:52:20;10860:85;:::i;:::-;11101:80;10982:28;;11020:71;11028:29;;;11020:71;:::i;:::-;494:13789;;;;;:::i;:::-;;;;;;11109:22;:41;11101:80;:::i;:::-;11199:49;:::i;:::-;:70;11191:111;:::i;:::-;10520:789::o;494:13789::-;;;;;;;;;;;;;;;;;;;;;;;;;10685:43;10717:11;;;:::i;:::-;10685:43;;494:13789;;;;;;;;;;;;;;;;;;:::o;:::-;;:::i;:::-;;;;;;;;;:::o;:::-;;;;:::o;:::-;;;-1:-1:-1;;;494:13789:20;;;;;;;;;;;;-1:-1:-1;;;494:13789:20;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;:::o;:::-;;;;:::o;:::-;;;-1:-1:-1;;;494:13789:20;;;;;;;;;;;;;;;;;-1:-1:-1;;;494:13789:20;;;;;;;6404:889:19;;;;6524:1;6568:56;-1:-1:-1;;;;;;;;;6576:19:19;;6404:889;;6576:19;:::i;:::-;;-1:-1:-1;;;;;;494:13789:20;;;6576:19:19;494:13789:20;6576:27:19;;6568:56;:::i;:::-;-1:-1:-1;;;;;;;;;6638:19:19;;;;;:::i;:::-;494:13789:20;6638:27:19;494:13789:20;;6702:19:19;6681:49;6691:39;6696:33;:26;6702:19;;6681:49;6702:19;;;;:::i;:::-;494:13789:20;;;;6696:26:19;:33;:::i;:::-;6691:39;:::i;6681:49::-;;;:::i;:::-;6524:1;6881:5;6885:1;6881:5;;;;494:13789:20;7012:77:19;7099:11;494:13789:20;;;;;;;7020:19:19;;494:13789:20;;;;7020:19:19;;;:::i;:::-;494:13789:20;7020:27:19;7012:77;:::i;:::-;7099:11;:::i;:::-;7155:98;;6404:889;:::o;6888:3::-;6916:28;;494:13789:20;6916:28:19;;;;:::i;:::-;6888:3;494:13789:20;6866:13:19;;6634:149;6761:11;6771:1;6634:149;;690:484:21;494:13789:20;;690:484:21;;;;1118:49;690:484;;494:13789:20;;;:::i;:::-;;;;;:::i;:::-;1118:49:21;;:::i;:::-;690:484;:::o;2883:727:19:-;;2999:33;;;;:::i;:::-;3203:13;3215:1;3218:5;3222:1;3218:5;;;;-1:-1:-1;;;;494:13789:20;-1:-1:-1;;;;;;494:13789:20;3353:19:19;;494:13789:20;;3353:19:19;;:::i;:::-;;494:13789:20;3353:27:19;494:13789:20;;3428:11:19;;;:::i;494:13789:20:-;;;-1:-1:-1;;;494:13789:20;;;;;;;;;;;;;;;;;-1:-1:-1;;;494:13789:20;;;;;;;3225:3:19;3253:28;;494:13789:20;3253:28:19;;;;:::i;:::-;3225:3;494:13789:20;3203:13:19;;494:13789:20;;;;:::o;:::-;;;-1:-1:-1;;;494:13789:20;;;;;;;;;;;;-1:-1:-1;;;494:13789:20;;;;;;;;;;;:::o;:::-;;;-1:-1:-1;;;494:13789:20;;;;;;;;;;;;;;;;;;;;8222:1005:23;494:13789:20;8943:25:23;8949:18;;9160:4;8222:1005;9138:60;8222:1005;8336:1;8396:21;;;:52;;;8222:1005;8392:123;;8222:1005;8557:65;8594:4;8571:18;8565:25;8571:18;;;;;;:::i;8565:25::-;494:13789:20;8565:33:23;;8557:65;:::i;:::-;8665:4;8642:18;8636:25;8642:18;;;;;;:::i;8636:25::-;494:13789:20;8636:33:23;8665:4;;8706:18;8685:48;8695:38;8700:32;:25;8706:18;;8685:48;8706:18;;;;:::i;8685:48::-;8632:154;8949:18;:::i;8943:25::-;494:13789:20;9146:18:23;9138:60;:::i;:::-;9160:4;8222:1005;:::o;8632:154::-;8764:11;;;:::i;8392:123::-;8464:11;;8392:123;;8396:52;8427:13;8444:4;8427:13;8421:20;8427:13;;;;;:::i;8421:20::-;494:13789:20;8421:27:23;8396:52;;494:13789:20;;;;:::o;:::-;;;-1:-1:-1;;;494:13789:20;;;;;;;;;;;;-1:-1:-1;;;494:13789:20;;;;;;;;;;;:::o;:::-;;;-1:-1:-1;;;494:13789:20;;;;;;;;;;;;-1:-1:-1;;;494:13789:20;;;;;;;;;;;:::o;:::-;;;-1:-1:-1;;;494:13789:20;;;;;;;;;;;;-1:-1:-1;;;494:13789:20;;;;;;;;;;;:::o;:::-;;;-1:-1:-1;;;494:13789:20;;;;;;;;;;;;-1:-1:-1;;;494:13789:20;;;;;;;9329:1997:23;;;9610:1;;494:13789:20;9680:16:23;;;;:42;;9329:1997;9676:488;;9329:1997;10216:13;10202:55;10234:4;494:13789:20;10210:20:23;10216:13;;10267:78;10216:13;;;;:::i;10210:20::-;494:13789:20;10210:28:23;;10202:55;:::i;:::-;10301:4;494:13789:20;10277:20:23;10283:13;;;;;;:::i;10277:20::-;494:13789:20;10277:28:23;:68;;494:13789:20;10308:33:23;10313:27;:20;10319:13;;;;;;:::i;10308:33::-;494:13789:20;10267:78:23;;:::i;:::-;10391:13;494:13789:20;10386:94:23;10406:11;;;;;;10568:13;;;10747:54;10811:12;10568:13;10554:59;10586:4;494:13789:20;10562:20:23;10568:13;;;;;;:::i;10562:20::-;494:13789:20;10562:28:23;10554:59;:::i;:::-;-1:-1:-1;;;;;494:13789:20;;10643:95:23;;;;;;;10755:23;10747:54;:::i;:::-;10811:12;:::i;:::-;10883:13;10877:20;10883:13;;;;;;:::i;10877:20::-;10907:13;494:13789:20;;;;;10934:13:23;10943:4;10934:13;;10930:307;10943:4;;;10963:14;;;;;;11246:51;10963:14;10930:307;11254:23;11246:51;:::i;10930:307::-;10998:14;;;;;10943:4;10998:14;10994:243;10943:4;;;11028:9;;;;;11246:51;11028:9;494:13789:20;10930:307:23;;10994:243;11082:13;11068:27;11082:13;;;;;:::i;11068:27::-;11114:13;494:13789:20;11109:118:23;11129:7;;;;;;10994:243;;;;;;11246:51;10994:243;10930:307;;11138:3;11170:10;;;;;;494:13789:20;11170:10:23;494:13789:20;;;;11170:10:23;11169:43;11184:28;11190:21;;11196:14;:10;;;;:::i;:::-;:14;:::i;:::-;11190:21;;;:::i;11169:43::-;;11138:3;494:13789:20;11114:13:23;;;;;;10419:3;10447:22;;;494:13789:20;10447:22:23;;;;:::i;:::-;10419:3;494:13789:20;10391:13:23;;;10277:68;494:13789:20;10344:1:23;10277:68;;9676:488;9759:8;;;9753:15;9759:8;;;;;:::i;9753:15::-;9791:1;;9782:10;494:13789:20;;9810:14:23;;;9791:1;;9844:11;10267:78;9854:1;9806:348;;9676:488;;;;9806:348;9956:4;9946:14;9956:4;;10267:78;9990:1;9942:212;9806:348;;9942:212;494:13789:20;;-1:-1:-1;;;10110:29:23;;494:13789:20;10110:29:23;;;494:13789:20;;;;;;-1:-1:-1;;;494:13789:20;;;;;;10110:29:23;9680:42;9706:8;9718:4;494:13789:20;9700:15:23;9706:8;;;;;:::i;9700:15::-;494:13789:20;9700:22:23;9680:42;;11908:460:20;11969:10;494:13789;-1:-1:-1;494:13789:20;;;;;;;;12004:20;494:13789;;;;;;;;-1:-1:-1;494:13789:20;;;12322:39;494:13789;12053:14;494:13789;;;;;;12053:14;494:13789;;11969:10;494:13789;;14253:21;494:13789;12170:14;494:13789;;12885:6;494:13789;;12885:6;494:13789;;12170:14;12004:20;494:13789;;;;;;-1:-1:-1;;;;;494:13789:20;12280:32;;;;:::i;494:13789::-;;;;:::o;:::-;;;-1:-1:-1;;;494:13789:20;;;;;;;;;;;;-1:-1:-1;;;494:13789:20;;;;;;;650:1414:23;;;;;;;881:18;898:1;958:21;;;;;:52;;;650:1414;954:123;;650:1414;494:13789:20;1127:25:23;1133:18;;;1119:65;1133:18;1156:4;1133:18;;:::i;1119:65::-;1204:18;1227:4;494:13789:20;1198:25:23;1204:18;;;;;;:::i;1198:25::-;494:13789:20;1198:33:23;1227:4;;1257:38;1262:32;:25;1268:18;;;1247:48;1268:18;1247:48;1268:18;;:::i;1247:48::-;1194:154;;;1427:13;898:1;1442:5;1446:1;1442:5;;;;1568:18;1156:4;1562:33;:25;1568:18;;;;1554:62;1568:18;;:::i;1562:33::-;;;1554:62;:::i;:::-;1636:18;1227:4;1630:33;:25;1636:18;;;;;;:::i;1630:33::-;;1227:4;;1689:38;1694:32;:25;1700:18;;;1679:48;1700:18;1679:48;1700:18;;:::i;1679:48::-;1626:154;;898:1;1824:100;1844:12;;;;;;1976:81;;;;;;:::i;1858:3::-;1886:27;;;494:13789:20;1886:27:23;;;;:::i;:::-;1858:3;494:13789:20;1829:13:23;;;1626:154;1758:11;;;;;:::i;:::-;1626:154;;;1449:3;1477:27;;494:13789:20;1477:27:23;;;;:::i;:::-;1449:3;494:13789:20;1427:13:23;;;;;;1194:154;1326:11;;;;;:::i;:::-;1194:154;;;;954:123;6771:1:19;;-1:-1:-1;954:123:23;;958:52;989:13;1006:4;494:13789:20;983:20:23;989:13;;;;;:::i;983:20::-;494:13789:20;983:27:23;958:52;;11315:587:20;11370:55;:32;:10;494:13789;-1:-1:-1;494:13789:20;11370:32;;:::i;:::-;11405:20;494:13789;11370:55;;:::i;:::-;11454:14;494:13789;-1:-1:-1;;;;;494:13789:20;11454:14;494:13789;;-1:-1:-1;;;;;;494:13789:20;;;11516:14;14217:1;14229:14;494:13789;;11516:14;11540:21;14217:1;14253:21;494:13789;;11540:21;11571:14;494:13789;;12885:6;494:13789;;12885:6;494:13789;;11571:14;11595:24;494:13789;13147:20;494:13789;;11595:24;-1:-1:-1;494:13789:20;;11667:13;11684:8;11667:25;11684:8;;494:13789;;-1:-1:-1;;;11762:44:20;;-1:-1:-1;;;;;494:13789:20;;;11540:21;11762:44;;494:13789;;;;;;;;11762:44;494:13789;;;;;11762:44;;494:13789;-1:-1:-1;11769:13:20;-1:-1:-1;;;;;494:13789:20;11762:44;;;;;;;;11663:233;11315:587::o;11762:44::-;;;;;;;;;;;;;:::i;:::-;;11315:587::o;11663:233::-;494:13789;;-1:-1:-1;;;11837:48:20;;-1:-1:-1;;;;;494:13789:20;;;11540:21;11837:48;;494:13789;;;;;;;;11837:48;494:13789;;;;;11837:48;494:13789;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;:::o;1923:789:19:-;;;2038:33;;;;:::i;:::-;2273:13;2285:1;2288:5;2292:1;2288:5;;;;2431:42;;;;;:::i;:::-;-1:-1:-1;2520:23:19;2285:1;;2594:3;494:13789:20;;2573:19:19;;;;;494:13789:20;2654:11:19;;;;;:::i;:::-;494:13789:20;;;2627:39:19;2292:1;494:13789:20;2627:39:19;2594:3;494:13789:20;2558:13:19;;;2573:19;;-1:-1:-1;;1923:789:19:o;2295:3::-;2323:28;;494:13789:20;2323:28:19;;;;:::i;:::-;2295:3;494:13789:20;2273:13:19;;494:13789:20;;;;:::o;:::-;;;-1:-1:-1;;;494:13789:20;;;;;;;;;;;;;;;;;;;;477:1183:22;;;574:57;582:20;;;574:57;:::i;:::-;657:19;663:12;;;;;;:::i;657:19::-;494:13789:20;;;;700:4:22;691:13;;700:4;;;754:10;;;;;;;:::i;687:967::-;785:13;;;794:4;785:13;;794:4;;;849:10;;:28;:10;;863:13;849:10;:28;:10;;:::i;:::-;863:13;;:::i;781:873::-;898:13;;;907:4;898:13;;907:4;;;976:13;;954:35;976:13;;;;;:::i;954:35::-;1003:18;494:13789:20;1040:13:22;494:13789:20;1035:127:22;1055:15;;;;;;1182:10;;;:33;:10;;;:24;:10;;:::i;1072:3::-;1105:11;;;;1140:1;1105:11;494:13789:20;;;;1105:11:22;1104:43;1120:27;1126:20;;1131:14;:10;;;;:::i;:14::-;1126:20;;;:::i;1104:43::-;;1072:3;494:13789:20;1040:13:22;;;;894:760;1236:13;;;1245:4;-1:-1:-1;1245:4:22;;;1298:10;:28;:10;;1312:13;1298:10;:28;:10;;:::i;:::-;1312:13;;:::i;1232:422::-;1404:13;;;1382:35;1404:13;;:::i;1382:35::-;1431:18;494:13789:20;1468:13:22;494:13789:20;1463:127:22;1483:15;;;;;;1610:10;;;:33;:10;;;:24;:10;;:::i;1500:3::-;1533:11;;;;1568:1;1533:11;494:13789:20;;;;1533:11:22;1532:43;1548:27;1554:20;;1559:14;:10;;;;:::i;1532:43::-;;1500:3;494:13789:20;1468:13:22;;;;494:13789:20;;;;:::o;:::-;;;-1:-1:-1;;;494:13789:20;;;;;;;;;;;;;;;;;-1:-1:-1;;;494:13789:20;;;;;;;1537:2484:21;;;;;;;1775:67;-1:-1:-1;;;;;;;;;1783:13:21;;1537:2484;;1783:13;:::i;:::-;494:13789:20;1783:21:21;;1775:67;:::i;:::-;-1:-1:-1;;;;;;;;;1857:13:21;;;;;:::i;:::-;494:13789:20;1857:21:21;494:13789:20;;1971:15:21;1894:49;1916:27;:20;1922:13;;;;;:::i;1894:49::-;1971:15;:::i;:::-;1853:190;;;;2089:33;494:13789:20;2171:31:21;;;;;;4002:12;;;;;;;494:13789:20;1537:2484:21;:::o;2164:1828::-;2355:25;2308:33;494:13789:20;;;;;;:::i;:::-;2308:33:21;:::i;:::-;2355:25;;;:::i;:::-;494:13789:20;;;;;;2452:15:21;:30;2448:81;;-1:-1:-1;;;2628:15:21;:7;;;;:::i;:::-;494:13789:20;-1:-1:-1;;;;;;494:13789:20;;;2628:7:21;-1:-1:-1;;;;;;494:13789:20;;;2628:15:21;;494:13789:20;;2663:14:21;;;2676:1;-1:-1:-1;;;2699:15:21;:7;;;;:::i;:15::-;;;2695:97;;2624:1358;2826:32;;;;:::i;:::-;2890:2;2881:11;;2890:2;;3031:58;;;;:::i;:::-;3116:8;;;3112:26;;3164:21;;3160:38;;3267:21;2877:1040;;2164:1828;;;;;;3160:38;3187:11;;;;;;;2676:1;3187:11;:::o;3112:26::-;3126:12;;;;;;;494:13789:20;3126:12:21;:::o;2877:1040::-;3317:10;;-1:-1:-1;3326:1:21;3317:10;3326:1;;-1:-1:-1;3326:1:21;;3477:67;;;;;;:::i;:::-;3571:8;;;3567:75;;3667:21;;3663:87;;3818:21;3313:604;2877:1040;;3313:604;3886:12;;;;;;;;494:13789:20;3886:12:21;:::o;2695:97::-;2758:7;2738:35;;2752:21;:14;2758:7;;;;:::i;2738:35::-;2695:97;;1853:190;2031:1;1853:190;;;;;494:13789:20;;;;:::o;:::-;;;-1:-1:-1;;;494:13789:20;;;;;;;;;;;;;;;;;;;;677:1082:19;793:1;843:56;-1:-1:-1;;;;;;;;;851:19:19;;;;;:::i;843:56::-;-1:-1:-1;;;;;;;;;913:19:19;;;;;:::i;:::-;494:13789:20;913:27:19;494:13789:20;;977:19:19;956:49;966:39;971:33;:26;977:19;;956:49;977:19;;;;:::i;956:49::-;909:149;;1161:5;1144:13;:22;:48;;;;909:149;1140:589;;909:149;1739:13;;;677:1082;:::o;1140:589::-;793:1;1320:5;1324:1;1320:5;;;;-1:-1:-1;1471:69:19;-1:-1:-1;;;1479:27:19;:19;;;;;;:::i;:27::-;;;1471:69;:::i;:::-;-1:-1:-1;;;1558:27:19;:19;;;;;;:::i;:27::-;;494:13789:20;;1615:39:19;1620:33;:26;1626:19;;;1605:49;1626:19;1605:49;1626:19;;:::i;1605:49::-;1140:589;;;;1554:165;1693:11;;;;;:::i;:::-;1554:165;;1327:3;1359:28;;494:13789:20;1359:28:19;;;;:::i;:::-;1327:3;494:13789:20;1305:13:19;;1144:48;:13;1187:5;1144:13;1170:22;1144:48;;909:149;1036:11;6771:1;909:149;;;494:13789:20;;;;:::o;:::-;;;-1:-1:-1;;;494:13789:20;;;;;;;;;;;;-1:-1:-1;;;494:13789:20;;;;;;;;;;;:::o;:::-;;;-1:-1:-1;;;494:13789:20;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;-1:-1:-1;;;494:13789:20;;;;;;;;;;;;-1:-1:-1;;;494:13789:20;;;;;;;2425:1138:23;;3162:2;3487:69;2425:1138;;;3348:57;2425:1138;3415:17;2425:1138;2650:26;;2742:61;2779:4;494:13789:20;2750:25:23;2756:18;;;;;;:::i;2750:25::-;494:13789:20;2750:33:23;;2742:61;:::i;:::-;2846:4;494:13789:20;2817:25:23;2823:18;;;;;;:::i;2817:25::-;494:13789:20;2817:33:23;2846:4;;2887:18;2876:38;2881:32;:25;2887:18;;;2866:48;2887:18;2866:48;2887:18;;:::i;2866:48::-;2813:154;;3085:39;;;;;:::i;:::-;494:13789:20;;3134:65:23;494:13789:20;;;3142:22:23;3134:65;:::i;:::-;3270:69;;-1:-1:-1;;;;;494:13789:20;;;;;3356:24:23;3348:57;:::i;3415:17::-;3487:69;;:::i;2813:154::-;2945:11;;;;;;;:::i;:::-;2813:154;;;494:13789:20;;;;;;;;;;;:::i;:::-;4230:1:19;494:13789:20;;;-1:-1:-1;;494:13789:20;;;;;;:::o;:::-;;;;;;;;;;;:::i;:::-;4159:2:23;494:13789:20;;;-1:-1:-1;;494:13789:20;;;;;;:::o;:::-;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;;;;:::i;:::-;;;;;;;;:::o;3873:1371:19:-;4038:57;4046:20;;;4038:57;:::i;:::-;4121:19;4127:12;;;;;;:::i;4121:19::-;494:13789:20;;;;4164:4:19;4155:13;;4164:4;;;4220:12;;;;;;:::i;:::-;494:13789:20;;;-1:-1:-1;;;;;;494:13789:20;;4246:26:19;;494:13789:20;4246:26:19;:::i;:::-;;4286:18;4230:1;4286:18;:::o;4151:1087::-;4334:4;4325:13;;;;;;;;4321:917;4334:4;;;4403:13;;4382:34;4403:13;;:::i;4382:34::-;4439:21;;;;:::i;:::-;4479:13;494:13789:20;4494:14:19;;;;;;4609;;;;;;;:::i;4510:3::-;4550:10;4545:20;;4550:14;4559:1;4550:10;;;;:::i;:14::-;4545:20;;;:::i;:::-;494:13789:20;4533:32:19;;;;;:::i;:::-;;494:13789:20;4479:13:19;;4321:917;4654:4;-1:-1:-1;4654:4:19;;;4723:13;4701:35;4723:13;;:::i;4701:35::-;4750:22;494:13789:20;4791:13:19;494:13789:20;4806:15:19;;;;;;4943:21;;;;:::i;:::-;4983:13;494:13789:20;4998:14:19;;;;;;5127:15;;;;;;:28;:15;;:::i;5014:3::-;5054:10;5049:34;;5054:28;4899:1;5054:10;:24;:10;;;;:::i;5049:34::-;494:13789:20;5037:46:19;;;;;:::i;:::-;;494:13789:20;4983:13:19;;4823:3;4860:15;4899:1;;494:13789:20;;4859:47:19;4879:27;4885:20;;4890:14;:10;;;;:::i;:14::-;4885:20;;;:::i;4859:47::-;;4823:3;494:13789:20;4791:13:19;;4641:597;494:13789:20;;-1:-1:-1;;;5187:40:19;;494:13789:20;5187:40:19;;;494:13789:20;;;;;;;;;;;;;10110:29:23;1946:1593:22;2056:57;494:13789:20;;2064:20:22;;2056:57;:::i;:::-;2139:19;2145:12;;;;;:::i;2139:19::-;494:13789:20;;;;2182:4:22;2173:13;;2182:4;;;2251:12;;;;;:::i;2169:1364::-;2356:13;;;;;2365:4;2356:13;;2365:4;;;2430:13;;2413:30;2430:13;;:::i;2413:30::-;2479:17;;;;:::i;:::-;2515:13;494:13789:20;2530:10:22;;;;;;2641;;;;;;:::i;2542:3::-;2582:10;2577:20;;2582:14;2591:1;2582:10;;;;:::i;:14::-;2577:20;;:::i;:::-;494:13789:20;2565:32:22;;;;;:::i;:::-;;494:13789:20;2515:13:22;;2352:1181;2682:4;-1:-1:-1;2682:4:22;;;2751:13;2729:35;2751:13;;:::i;2729:35::-;494:13789:20;2815:13:22;494:13789:20;2830:15:22;;;;;;2972:17;;;;:::i;:::-;3008:13;494:13789:20;3023:10:22;;;;;;3148:15;;;;;:24;:15;;:::i;3035:3::-;3075:10;3070:34;;3075:28;2915:1;3075:10;:24;:10;;;;:::i;3070:34::-;494:13789:20;3058:46:22;;;;;:::i;:::-;;494:13789:20;3008:13:22;;2847:3;2880:11;2915:1;;494:13789:20;;2879:43:22;2895:27;2901:20;;2906:14;:10;;;;:::i;:14::-;2901:20;;:::i;2879:43::-;;2847:3;494:13789:20;2815:13:22;;2669:864;3279:27;;;;;;:::i;:::-;3342:22;;;;:::i;:::-;3383:13;494:13789:20;3398:15:22;;;;;;3494:28;;;;;:::o;3415:3::-;3455:10;3450:16;;3455:10;494:13789:20;3455:10:22;;;:::i;3450:16::-;494:13789:20;3438:28:22;;;;;:::i;:::-;;494:13789:20;3383:13:22;;4220:309:21;4379:1;4390:111;;494:13789:20;;4397:20:21;;;;;4443:26;;;;:::i;:::-;494:13789:20;;;;;;;;-1:-1:-1;;494:13789:20;;;;;;4390:111:21;;;4397:20;;;4220:309;:::o;494:13789:20:-;;;;;;;;;7751:1:21;494:13789:20;;;;;;;:::o;7133:1816:21:-;;;;;7439:26;;;;:::i;:::-;7496:9;;7563:26;7509:4;7490:16;7496:9;;;;:::i;7490:16::-;:23;7489:30;;7563:26;;:::i;:::-;7600:1343;;;;;;494:13789:20;7708:26:21;494:13789:20;;7708:26:21;;:::i;:::-;7738:14;494:13789:20;;7738:14:21;:::i;:::-;7708:44;7704:546;;7600:1343;8264:29;;;;;;;7503:1;8264:29;7503:1;8264:29;7503:1;8264:29;:::o;7704:546::-;7772:22;;7790:4;494:13789:20;;;7812:114:21;;7704:546;7944:292;;;;;7704:546;;;;7944:292;8010:38;8025:22;;;;:::i;:::-;8010:38;;:::i;:::-;494:13789:20;7509:4:21;494:13789:20;;;;8074:20:21;494:13789:20;7509:4:21;494:13789:20;;;;8098:16:21;8074:40;8070:148;;7944:292;;;;;;8070:148;8156:26;494:13789:20;;8156:26:21;;:::i;:::-;7790:4;;7503:1;;8142:53::o;7812:114::-;7871:36;;;;:::i;:::-;7812:114;;;;;7600:1343;8358:37;8359:36;;;;;;;;:::i;8358:37::-;8354:105;;8499:38;8514:22;;;;:::i;8499:38::-;8551:12;;494:13789:20;;7509:4:21;8581:20;;8577:294;7509:4;;;8621:80;7509:4;8899:26;8621:80;;;8577:294;;494:13789:20;8899:26:21;;:::i;:::-;8885:47;8893:4;8885:47;;;:::o;8577:294::-;8725:18;;;;7509:4;8899:26;494:13789:20;;8770:18:21;8721:150;8577:294;;8721:150;8827:29;;;;7503:1;8827:29;7503:1;8827:29;7503:1;8827:29;:::o;8354:105::-;8415:29;;;;;7503:1;8415:29;7503:1;8415:29;7503:1;8415:29;:::o;4989:1673::-;;;;;5260:14;494:13789:20;;5260:14:21;:::i;:::-;5247:27;;;5243:563;;5876:13;5872:18;;5866:25;5876:13;;;494:13789:20;;;;5876:13:21;5872:18;;:::i;5866:25::-;494:13789:20;;;5905:13:21;;494:13789:20;;;;5901:122:21;;6122:13;-1:-1:-1;6117:110:21;6137:10;494:13789:20;;;6137:10:21;;;;6264:28;;;;;:::i;:::-;494:13789:20;;;6306:20:21;;6302:96;;6635:13;;6453:2;6434:21;;6453:2;;;6471:73;;;;6430:181;6635:13;:::i;6430:181::-;6453:2;494:13789:20;6581:19:21;6430:181;6635:13;:::i;6302:96::-;6342:29;;;-1:-1:-1;6342:29:21;-1:-1:-1;6342:29:21;-1:-1:-1;6342:29:21;:::o;6149:3::-;6184:32;;494:13789:20;6168:48:21;6184:32;;494:13789:20;6184:32:21;;;:::i;6168:48::-;6149:3;494:13789:20;6122:13:21;;;;;;;5901:122;6008:4;5999:13;5901:122;;;5243:563;5346:32;;;;;;-1:-1:-1;5392:112:21;5412:6;5416:2;5412:6;;;;5545:27;;;;:::i;:::-;494:13789:20;;;;;;5590:20:21;494:13789:20;;;;;;5614:16:21;5590:40;5586:210;5614:16;;;494:13789:20;5650:36:21;;-1:-1:-1;5650:36:21;:::o;5586:210::-;-1:-1:-1;;;;;;;5752:29:21:o;5420:3::-;5458:31;5443:46;5458:31;;494:13789:20;5458:31:21;;;:::i;5443:46::-;5420:3;494:13789:20;5397:13:21;;;;3778:614:23;;;;3941:57;3949:20;;;3941:57;:::i;:::-;4068:4;494:13789:20;4024:19:23;4030:12;;;;;;:::i;4024:19::-;494:13789:20;4058:14:23;4068:4;;4149:13;;:::i;:::-;4181;4193:1;4196:6;4159:2;4196:6;;;;4287:19;;;;;4303:2;4287:19;:::o;4204:3::-;4244:10;4239:20;;4244:14;4253:1;4244:10;;;;:::i;4239:20::-;4193:1;4227:32;;;;;:::i;:::-;;494:13789:20;4181:13:23;;4054:332;494:13789:20;;-1:-1:-1;;;4337:38:23;;494:13789:20;4337:38:23;;;494:13789:20;;;;;;;;;;;;;10110:29:23;494:13789:20;;;;:::o;:::-;;;-1:-1:-1;;;494:13789:20;;;;;;;;;;;;-1:-1:-1;;;494:13789:20;;;;;;;;;;;:::o;:::-;;;-1:-1:-1;;;494:13789:20;;;;;;;;;;;;-1:-1:-1;;;494:13789:20;;;;;;;;;;;:::o;:::-;;;-1:-1:-1;;;494:13789:20;;;;;;;;;;;;-1:-1:-1;;;494:13789:20;;;;;;;;;;;:::o;:::-;;;-1:-1:-1;;;494:13789:20;;;;;;;;;;;;-1:-1:-1;;;494:13789:20;;;;;;;;;;;:::o;:::-;;;-1:-1:-1;;;494:13789:20;;;;;;;;;;;;;;;;;;;;4709:1693:23;;;5733:81;5985:36;4709:1693;5741:36;5749:27;5690:33;5633:27;5544;4709:1693;5404:57;5348:46;5283:33;4709:1693;;5086:4;5886:33;4709:1693;5057:25;5063:18;;4709:1693;4979:64;5016:4;494:13789:20;4987:25:23;4709:1693;4993:18;4709:1693;;4993:18;4709:1693;4909:29;4993:18;;:::i;4987:25::-;494:13789:20;4987:33:23;;4979:64;:::i;:::-;5063:18;;;:::i;5057:25::-;494:13789:20;5057:33:23;5086:4;;5127:18;5106:48;5116:38;5121:32;:25;5127:18;;5106:48;5127:18;;;;:::i;5106:48::-;5053:154;;;5283:33;:::i;:::-;5412:23;5404:57;:::i;:::-;5544:27;;;:::i;:::-;5633;;;:::i;:::-;5690:33;;;:::i;:::-;-1:-1:-1;;;;;494:13789:20;;;5741:36:23;-1:-1:-1;;;;;494:13789:20;;;;;5741:49:23;5733:81;:::i;:::-;5886:33;;;:::i;:::-;5985:36;;:::i;:::-;494:13789:20;6082:55:23;6110:2;494:13789:20;;6090:22:23;;6082:55;:::i;:::-;-1:-1:-1;;;6220:3:23;494:13789:20;;6198:20:23;;;;;494:13789:20;;;;6251:38:23;6270:19;6276:12;;;;;:::i;6251:38::-;;6220:3;494:13789:20;6183:13:23;;;6198:20;;;;6309:64;6198:20;;;6317:27;6309:64;:::i;5053:154::-;5185:11;;;;:::i;3753:1008:22:-;;3853:57;494:13789:20;;3861:20:22;;3853:57;:::i;:::-;3936:19;3942:12;;;;;:::i;3936:19::-;494:13789:20;;;;3979:4:22;3970:13;;3979:4;;;3999:8;;;;4006:1;3999:8;:::o;3966:789::-;4037:4;4028:13;;4037:4;;;4069:13;;;4064:19;4069:13;4057:26;4069:13;;:::i;4024:731::-;4113:4;4104:13;;4113:4;;;4155:13;;;4133:35;4155:13;;:::i;4133:35::-;4182:18;494:13789:20;4219:13:22;494:13789:20;4214:127:22;4234:15;;;;;;4361;;;;;:24;:15;;:::i;4251:3::-;4284:11;;;;4319:1;4284:11;494:13789:20;;;;4284:11:22;4283:43;4299:27;4305:20;;4310:14;:10;;;;:::i;:14::-;4305:20;;:::i;4283:43::-;;4251:3;494:13789:20;4219:13:22;;;;4100:655;4415:4;-1:-1:-1;4415:4:22;;;4447:13;;4442:19;4447:13;4435:26;4447:13;;:::i;4402:353::-;4514:13;;4492:35;4514:13;;:::i;4492:35::-;4541:18;494:13789:20;4578:13:22;494:13789:20;4573:127:22;4593:15;;;;;;4720;;;;;:24;:15;;:::i;4610:3::-;4643:11;;;;4678:1;4643:11;494:13789:20;;;;4643:11:22;4642:43;4658:27;4664:20;;4669:14;:10;;;;:::i;4642:43::-;;4610:3;494:13789:20;4578:13:22;;;;9118:924:21;;494:13789:20;;9218:19:21;9214:39;;9282:17;9288:10;;;;:::i;9282:17::-;9335:4;9323:16;;9322:23;9335:4;;9419:33;9429:22;:18;494:13789:20;;9429:18:21;:::i;:::-;:22;:::i;:::-;9419:33;:::i;:::-;494:13789:20;;;-1:-1:-1;;;494:13789:20;9236:1:21;9466:36;;494:13789:20;9466:36:21;:::i;:::-;;9450:1;9556:3;494:13789:20;;9536:18:21;;;;;9612:10;9599:30;9606:22;:17;9612:10;;9450:1;9612:10;;;:::i;9606:17::-;494:13789:20;;;;;;9606:22:21;494:13789:20;;-1:-1:-1;;;;;;494:13789:20;;;9599:30:21;9579:50;9586:9;:5;;;:::i;:9::-;9579:50;9236:1;9579:50;;;;:::i;:::-;;9663:32;9497:4;9670:17;9676:10;;;;;:::i;9670:17::-;:24;494:13789:20;;-1:-1:-1;;;;;;494:13789:20;;;9663:32:21;9647:48;9654:5;;;:::i;9647:48::-;;494:13789:20;9521:13:21;;9536:18;-1:-1:-1;9536:18:21;-1:-1:-1;9118:924:21:o;9385:627::-;494:13789:20;9749:33:21;9759:22;:18;494:13789:20;;9759:18:21;:::i;:::-;:22;:::i;9749:33::-;9813:1;9836:3;494:13789:20;;9816:18:21;;;;;9894:10;9881:30;9888:22;:17;9894:10;;9813:1;9894:10;;;:::i;9881:30::-;9859:52;9866:11;9867:5;;;:::i;:::-;9866:11;:::i;9859:52::-;;9955:32;9982:4;9962:17;9968:10;;;;;:::i;9955:32::-;9929:58;9936:15;:11;9937:5;;;:::i;9929:58::-;;494:13789:20;9801:13:21;;10279:596;;;;10398:23;494:13789:20;;10398:23:21;;:::i;:::-;10424:14;494:13789:20;;10424:14:21;:::i;:::-;-1:-1:-1;10394:58:21;;-1:-1:-1;10503:3:21;494:13789:20;;10483:18:21;;;;;10555:16;10556:10;;;;:::i;:::-;494:13789:20;;;;10555:16:21;10556:10;;10608:33;:28;10614:21;;10618:16;10619:10;;;;:::i;:::-;494:13789:20;;;;10618:16:21;10614:21;;:::i;10608:33::-;494:13789:20;10760:30:21;10773:17;10779:10;;;;;:::i;10760:30::-;494:13789:20;;10760:30:21;10756:81;;494:13789:20;;10468:13:21;;10756:81;10810:12;;;;-1:-1:-1;10810:12:21;:::o;10551:191::-;10723:4;10692:28;10698:21;;10702:16;10703:10;;;;:::i;10692:28::-;:35;10551:191;;10483:18;;;;;494:13789:20;10279:596:21;:::o;10394:58::-;10440:12;;;-1:-1:-1;10440:12:21;:::o;4966:311:22:-;;;-1:-1:-1;;;494:13789:20;-1:-1:-1;;;;;;494:13789:20;5077:12:22;;4966:311;;;5077:12;:::i;:::-;;494:13789:20;5077:20:22;494:13789:20;;5159:89:22;;;;;4966:311::o;494:13789:20:-;;;-1:-1:-1;;;494:13789:20;;;;;;;;;;;;;;;;;;;;6612:1366:23;6772:57;6780:20;;;6772:57;:::i;:::-;6855:19;6861:12;;;;;;:::i;6855:19::-;494:13789:20;;;;6898:4:23;6889:13;;6898:4;;;6954:12;;;;;;:::i;6885:1087::-;7068:4;7059:13;;;;;;;;7055:917;7068:4;;;7137:13;;7116:34;7137:13;;:::i;7116:34::-;7173:21;;;;:::i;:::-;7213:13;494:13789:20;7228:14:23;;;;;;7343;;;;;;;:::i;7244:3::-;7284:10;7279:20;;7284:14;7293:1;7284:10;;;;:::i;7279:20::-;494:13789:20;7267:32:23;;;;;:::i;:::-;;494:13789:20;7213:13:23;;7055:917;7388:4;-1:-1:-1;7388:4:23;;;7457:13;7435:35;7457:13;;:::i;7435:35::-;7484:22;494:13789:20;7525:13:23;494:13789:20;7540:15:23;;;;;;7677:21;;;;:::i;:::-;7717:13;494:13789:20;7732:14:23;;;;;;7861:15;;;;;;:28;:15;;:::i;7748:3::-;7788:10;7783:34;;7788:28;7633:1;7788:10;:24;:10;;;;:::i;7783:34::-;494:13789:20;7771:46:23;;;;;:::i;:::-;;494:13789:20;7717:13:23;;7557:3;7594:15;7633:1;;494:13789:20;;7593:47:23;7613:27;7619:20;;7624:14;:10;;;;:::i;7593:47::-;;7557:3;494:13789:20;7525:13:23;;7375:597;494:13789:20;;-1:-1:-1;;;7921:40:23;;494:13789:20;7921:40:23;;;494:13789:20;;;;;;;;;;;;;10110:29:23","linkReferences":{},"immutableReferences":{"40447":[{"start":410,"length":32},{"start":737,"length":32},{"start":1035,"length":32},{"start":1777,"length":32},{"start":2346,"length":32},{"start":3026,"length":32}],"40449":[{"start":680,"length":32},{"start":985,"length":32},{"start":1288,"length":32},{"start":1976,"length":32},{"start":2421,"length":32},{"start":2684,"length":32},{"start":3092,"length":32},{"start":3306,"length":32},{"start":8915,"length":32}],"40457":[{"start":1587,"length":32},{"start":1859,"length":32},{"start":3484,"length":32}],"40459":[{"start":535,"length":32},{"start":1553,"length":32},{"start":3450,"length":32}],"40461":[{"start":2967,"length":32},{"start":6179,"length":32}]}},"methodIdentifiers":{"bond(uint256)":"9940686e","bondAmount()":"80f323a7","bondNative()":"ae6c3fcf","bondedExecutor()":"1aa7c0ec","cancellationRequest()":"308657d7","collect((bytes,bytes,bytes,bytes,uint256),uint256)":"ede7f6a3","collectNative((bytes,bytes,bytes,bytes,bytes,bytes),uint256)":"5922e8f8","currentPaymentAmount()":"8bd03d0a","currentRewardAmount()":"5a4fd645","executionDeadline()":"33ee5f35","expectedAmount()":"2feef2ec","expectedRecipient()":"8677ab23","fund(uint256,uint256)":"a65e2cfd","fundNative(uint256,uint256)":"df235794","funded()":"f3a504f2","is_bonded()":"cb766a56","maxBlockLookback()":"d4899a62","originalRewardAmount()":"d415b3f9","requestCancellation()":"81972d00","resume()":"046f7da2","totalBondsDeposited()":"fe03a460","withdraw()":"3ccfd60b","withdrawNative()":"50431ce4"},"rawMetadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_tokenContract\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_expectedRecipient\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_expectedAmount\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_currentRewardAmount\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_currentPaymentAmount\",\"type\":\"uint256\"}],\"stateMutability\":\"payable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_bondAmount\",\"type\":\"uint256\"}],\"name\":\"bond\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"bondAmount\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"bondNative\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"bondedExecutor\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"cancellationRequest\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes\",\"name\":\"blockHeader\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"receiptRlp\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"proofNodes\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"receiptPath\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"logIndex\",\"type\":\"uint256\"}],\"internalType\":\"struct Escrow.ReceiptProof\",\"name\":\"proof\",\"type\":\"tuple\"},{\"internalType\":\"uint256\",\"name\":\"targetBlockNumber\",\"type\":\"uint256\"}],\"name\":\"collect\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes\",\"name\":\"blockHeader\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"transactionRlp\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"txProofNodes\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"receiptRlp\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"receiptProofNodes\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"path\",\"type\":\"bytes\"}],\"internalType\":\"struct Escrow.NativeTransferProof\",\"name\":\"proof\",\"type\":\"tuple\"},{\"internalType\":\"uint256\",\"name\":\"targetBlockNumber\",\"type\":\"uint256\"}],\"name\":\"collectNative\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"currentPaymentAmount\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"currentRewardAmount\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"executionDeadline\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"expectedAmount\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"expectedRecipient\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_currentRewardAmount\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_currentPaymentAmount\",\"type\":\"uint256\"}],\"name\":\"fund\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_currentRewardAmount\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_currentPaymentAmount\",\"type\":\"uint256\"}],\"name\":\"fundNative\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"funded\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"is_bonded\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"maxBlockLookback\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"originalRewardAmount\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"requestCancellation\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"resume\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"totalBondsDeposited\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"withdraw\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"withdrawNative\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"src/Escrow.sol\":\"Escrow\"},\"evmVersion\":\"prague\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[\":forge-std/=lib/forge-std/src/\"],\"viaIR\":true},\"sources\":{\"src/BlockHeaderParser.sol\":{\"keccak256\":\"0x6f5550e19d8711a0ebcd27a7fb2bdf87e9c9f41fc2623ca004605f21e1139ba4\",\"license\":\"UNLICENSED\",\"urls\":[\"bzz-raw://50a3072ea8e3689a2252c09edb440be879dfcef2c92857ef891cb426f42cba0b\",\"dweb:/ipfs/QmNaMw8NzaYYoBWah1hVQcpaSPbQi6SZbrV5AVRsqz9poX\"]},\"src/Escrow.sol\":{\"keccak256\":\"0x617dd0316b4b805648b9a715f9823473a7ed333316cfb3e8f3a2ad0e9d0a907c\",\"license\":\"UNLICENSED\",\"urls\":[\"bzz-raw://61f9df9258a76b42d2d342daeaf19602467d2b715e7a2b09534dce14181342e0\",\"dweb:/ipfs/QmZFuaarzH9tTWTgwfotytS1EHYEV146YbUEPHsii9sKEY\"]},\"src/MPTVerifier.sol\":{\"keccak256\":\"0xf6f6e91c996948cd2fc77fbf0f53b1314ac9a0704d671f4124a5a990a6716442\",\"license\":\"UNLICENSED\",\"urls\":[\"bzz-raw://e282f9a776c64a59fafc0844c192b81e73498ed7afcbdf3e8628b2cabd7934ec\",\"dweb:/ipfs/QmePuVGszzsDSTntYgNnh4zwk4aC3GMtvnemmB3WcE5izs\"]},\"src/RLPParser.sol\":{\"keccak256\":\"0x2686245a6eeb4a3f2b60f049eb871993e6367688c02e8d7e53b80d0b2fe969c8\",\"license\":\"UNLICENSED\",\"urls\":[\"bzz-raw://2e767c2d7d3fd9957c750c9f51af888a8f3a2f3c3c2e6c350832cc89477dc852\",\"dweb:/ipfs/QmQcHMjPVMB1rJQBida3nqphr5rsVEeuWzhnwiMhbr97nH\"]},\"src/ReceiptValidator.sol\":{\"keccak256\":\"0x897fee38472a32ee5a92fa68b7360345c423bd5065e0598c055c7ef54fd30c7e\",\"license\":\"UNLICENSED\",\"urls\":[\"bzz-raw://e3fcee2dcc364cd44d26008d7fc560ae08c9a44ee77d87c85c1ff5edb6ea4afe\",\"dweb:/ipfs/QmWva9m8yunqododso4P9WTMdvEFvqtpe689vU1Rrvg9kA\"]}},\"version\":1}","metadata":{"compiler":{"version":"0.8.30+commit.73712a01"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"address","name":"_tokenContract","type":"address"},{"internalType":"address","name":"_expectedRecipient","type":"address"},{"internalType":"uint256","name":"_expectedAmount","type":"uint256"},{"internalType":"uint256","name":"_currentRewardAmount","type":"uint256"},{"internalType":"uint256","name":"_currentPaymentAmount","type":"uint256"}],"stateMutability":"payable","type":"constructor"},{"inputs":[{"internalType":"uint256","name":"_bondAmount","type":"uint256"}],"stateMutability":"nonpayable","type":"function","name":"bond"},{"inputs":[],"stateMutability":"view","type":"function","name":"bondAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[],"stateMutability":"payable","type":"function","name":"bondNative"},{"inputs":[],"stateMutability":"view","type":"function","name":"bondedExecutor","outputs":[{"internalType":"address","name":"","type":"address"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"cancellationRequest","outputs":[{"internalType":"bool","name":"","type":"bool"}]},{"inputs":[{"internalType":"struct Escrow.ReceiptProof","name":"proof","type":"tuple","components":[{"internalType":"bytes","name":"blockHeader","type":"bytes"},{"internalType":"bytes","name":"receiptRlp","type":"bytes"},{"internalType":"bytes","name":"proofNodes","type":"bytes"},{"internalType":"bytes","name":"receiptPath","type":"bytes"},{"internalType":"uint256","name":"logIndex","type":"uint256"}]},{"internalType":"uint256","name":"targetBlockNumber","type":"uint256"}],"stateMutability":"nonpayable","type":"function","name":"collect"},{"inputs":[{"internalType":"struct Escrow.NativeTransferProof","name":"proof","type":"tuple","components":[{"internalType":"bytes","name":"blockHeader","type":"bytes"},{"internalType":"bytes","name":"transactionRlp","type":"bytes"},{"internalType":"bytes","name":"txProofNodes","type":"bytes"},{"internalType":"bytes","name":"receiptRlp","type":"bytes"},{"internalType":"bytes","name":"receiptProofNodes","type":"bytes"},{"internalType":"bytes","name":"path","type":"bytes"}]},{"internalType":"uint256","name":"targetBlockNumber","type":"uint256"}],"stateMutability":"nonpayable","type":"function","name":"collectNative"},{"inputs":[],"stateMutability":"view","type":"function","name":"currentPaymentAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"currentRewardAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"executionDeadline","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"expectedAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"expectedRecipient","outputs":[{"internalType":"address","name":"","type":"address"}]},{"inputs":[{"internalType":"uint256","name":"_currentRewardAmount","type":"uint256"},{"internalType":"uint256","name":"_currentPaymentAmount","type":"uint256"}],"stateMutability":"nonpayable","type":"function","name":"fund"},{"inputs":[{"internalType":"uint256","name":"_currentRewardAmount","type":"uint256"},{"internalType":"uint256","name":"_currentPaymentAmount","type":"uint256"}],"stateMutability":"payable","type":"function","name":"fundNative"},{"inputs":[],"stateMutability":"view","type":"function","name":"funded","outputs":[{"internalType":"bool","name":"","type":"bool"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"is_bonded","outputs":[{"internalType":"bool","name":"","type":"bool"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"maxBlockLookback","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"originalRewardAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[],"stateMutability":"nonpayable","type":"function","name":"requestCancellation"},{"inputs":[],"stateMutability":"nonpayable","type":"function","name":"resume"},{"inputs":[],"stateMutability":"view","type":"function","name":"totalBondsDeposited","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[],"stateMutability":"nonpayable","type":"function","name":"withdraw"},{"inputs":[],"stateMutability":"nonpayable","type":"function","name":"withdrawNative"}],"devdoc":{"kind":"dev","methods":{},"version":1},"userdoc":{"kind":"user","methods":{},"version":1}},"settings":{"remappings":["forge-std/=lib/forge-std/src/"],"optimizer":{"enabled":true,"runs":200},"metadata":{"bytecodeHash":"ipfs"},"compilationTarget":{"src/Escrow.sol":"Escrow"},"evmVersion":"prague","libraries":{},"viaIR":true},"sources":{"src/BlockHeaderParser.sol":{"keccak256":"0x6f5550e19d8711a0ebcd27a7fb2bdf87e9c9f41fc2623ca004605f21e1139ba4","urls":["bzz-raw://50a3072ea8e3689a2252c09edb440be879dfcef2c92857ef891cb426f42cba0b","dweb:/ipfs/QmNaMw8NzaYYoBWah1hVQcpaSPbQi6SZbrV5AVRsqz9poX"],"license":"UNLICENSED"},"src/Escrow.sol":{"keccak256":"0x617dd0316b4b805648b9a715f9823473a7ed333316cfb3e8f3a2ad0e9d0a907c","urls":["bzz-raw://61f9df9258a76b42d2d342daeaf19602467d2b715e7a2b09534dce14181342e0","dweb:/ipfs/QmZFuaarzH9tTWTgwfotytS1EHYEV146YbUEPHsii9sKEY"],"license":"UNLICENSED"},"src/MPTVerifier.sol":{"keccak256":"0xf6f6e91c996948cd2fc77fbf0f53b1314ac9a0704d671f4124a5a990a6716442","urls":["bzz-raw://e282f9a776c64a59fafc0844c192b81e73498ed7afcbdf3e8628b2cabd7934ec","dweb:/ipfs/QmePuVGszzsDSTntYgNnh4zwk4aC3GMtvnemmB3WcE5izs"],"license":"UNLICENSED"},"src/RLPParser.sol":{"keccak256":"0x2686245a6eeb4a3f2b60f049eb871993e6367688c02e8d7e53b80d0b2fe969c8","urls":["bzz-raw://2e767c2d7d3fd9957c750c9f51af888a8f3a2f3c3c2e6c350832cc89477dc852","dweb:/ipfs/QmQcHMjPVMB1rJQBida3nqphr5rsVEeuWzhnwiMhbr97nH"],"license":"UNLICENSED"},"src/ReceiptValidator.sol":{"keccak256":"0x897fee38472a32ee5a92fa68b7360345c423bd5065e0598c055c7ef54fd30c7e","urls":["bzz-raw://e3fcee2dcc364cd44d26008d7fc560ae08c9a44ee77d87c85c1ff5edb6ea4afe","dweb:/ipfs/QmWva9m8yunqododso4P9WTMdvEFvqtpe689vU1Rrvg9kA"],"license":"UNLICENSED"}},"version":1},"id":20} \ No newline at end of file diff --git a/out/EscrowERC20.sol/EscrowERC20.json b/out/EscrowERC20.sol/EscrowERC20.json new file mode 100644 index 0000000..5f96b29 --- /dev/null +++ b/out/EscrowERC20.sol/EscrowERC20.json @@ -0,0 +1 @@ +{"abi":[{"type":"constructor","inputs":[{"name":"_tokenContract","type":"address","internalType":"address"},{"name":"_expectedRecipient","type":"address","internalType":"address"},{"name":"_expectedAmount","type":"uint256","internalType":"uint256"},{"name":"_currentRewardAmount","type":"uint256","internalType":"uint256"},{"name":"_currentPaymentAmount","type":"uint256","internalType":"uint256"}],"stateMutability":"nonpayable"},{"type":"function","name":"MAX_BLOCK_LOOKBACK","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"bond","inputs":[{"name":"_bondAmount","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"bondAmount","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"bondedExecutor","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"type":"function","name":"cancellationRequest","inputs":[],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"collect","inputs":[{"name":"proof","type":"tuple","internalType":"struct EscrowERC20.ReceiptProof","components":[{"name":"blockHeader","type":"bytes","internalType":"bytes"},{"name":"receiptRlp","type":"bytes","internalType":"bytes"},{"name":"proofNodes","type":"bytes","internalType":"bytes"},{"name":"receiptPath","type":"bytes","internalType":"bytes"},{"name":"logIndex","type":"uint256","internalType":"uint256"}]},{"name":"targetBlockNumber","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"currentPaymentAmount","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"currentRewardAmount","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"executionDeadline","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"expectedAmount","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"expectedRecipient","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"type":"function","name":"fund","inputs":[{"name":"_currentRewardAmount","type":"uint256","internalType":"uint256"},{"name":"_currentPaymentAmount","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"funded","inputs":[],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"is_bonded","inputs":[],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"originalRewardAmount","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"requestCancellation","inputs":[],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"resume","inputs":[],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"tokenContract","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"type":"function","name":"totalBondsDeposited","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"withdraw","inputs":[],"outputs":[],"stateMutability":"nonpayable"},{"type":"error","name":"AlreadyFunded","inputs":[]},{"type":"error","name":"AmountMismatch","inputs":[]},{"type":"error","name":"BlockHashUnavailable","inputs":[]},{"type":"error","name":"BlockHeaderMismatch","inputs":[]},{"type":"error","name":"BlockNumberMismatch","inputs":[]},{"type":"error","name":"BondActive","inputs":[]},{"type":"error","name":"CancellationRequested","inputs":[]},{"type":"error","name":"ExecutorAlreadyBonded","inputs":[]},{"type":"error","name":"ExpectedBytes32","inputs":[]},{"type":"error","name":"ExpectedRLPList","inputs":[]},{"type":"error","name":"ExpectedStringData","inputs":[]},{"type":"error","name":"ExpectedStringItem","inputs":[]},{"type":"error","name":"InsufficientBond","inputs":[]},{"type":"error","name":"InvalidAddress","inputs":[]},{"type":"error","name":"InvalidRLP","inputs":[]},{"type":"error","name":"InvalidRLPEncoding","inputs":[]},{"type":"error","name":"InvalidRLPList","inputs":[]},{"type":"error","name":"InvalidReceiptProof","inputs":[]},{"type":"error","name":"InvalidTransferEvent","inputs":[]},{"type":"error","name":"NoWithdrawableFunds","inputs":[]},{"type":"error","name":"NotFunded","inputs":[]},{"type":"error","name":"OnlyBondedExecutor","inputs":[]},{"type":"error","name":"OnlyDeployer","inputs":[]},{"type":"error","name":"RLPOffsetOutOfBounds","inputs":[]},{"type":"error","name":"RLPOffsetOutOfBounds","inputs":[]},{"type":"error","name":"TargetBlockInFuture","inputs":[]},{"type":"error","name":"TargetBlockTooOld","inputs":[]},{"type":"error","name":"ToAddressMismatch","inputs":[]},{"type":"error","name":"TokenTransferFailed","inputs":[]},{"type":"error","name":"WrongEventSignature","inputs":[]},{"type":"error","name":"WrongTokenContract","inputs":[]},{"type":"error","name":"ZeroAddress","inputs":[]},{"type":"error","name":"ZeroPaymentAmount","inputs":[]},{"type":"error","name":"ZeroRewardAmount","inputs":[]}],"bytecode":{"object":"0x61010080604052346101c15760a08161256580380380916100208285610231565b8339810103126101c15761003381610268565b9061004060208201610268565b6040820151608060608401519301519160a05260c0523360805260018060a01b0383169283156102225760e0528115801580610219575b6100fc575b6040516122e8908161027d8239608051818181610166015281816103fa015281816105670152610a67015260a05181818161044c015261083a015260c0518181816101f20152610818015260e0518181816102c501528181610380015281816104ee015281816106080152818161085c01528181610f650152610ff70152f35b60ff60075460081c1661020a576101fb5780156101ec57815f55816002558060015581018091116101d8575f91606460209260405194859384926323b872dd60e01b845233600485015230602485015260448401525af19081156101cd575f9161018e575b501561017f5761010061ff001960075416176007555f80808061007c565b63022e258160e11b5f5260045ffd5b90506020813d6020116101c5575b816101a960209383610231565b810103126101c1575180151581036101c1575f610161565b5f80fd5b3d915061019c565b6040513d5f823e3d90fd5b634e487b7160e01b5f52601160045260245ffd5b63932ca0a360e01b5f5260045ffd5b63ea1083a760e01b5f5260045ffd5b635adf638760e01b5f5260045ffd5b50811515610077565b63d92e233d60e01b5f5260045ffd5b601f909101601f19168101906001600160401b0382119082101761025457604052565b634e487b7160e01b5f52604160045260245ffd5b51906001600160a01b03821682036101c15756fe60806040526004361015610011575f80fd5b5f3560e01c8063046f7da2146101545780631aa7c0ec1461014f5780632feef2ec1461014a578063308657d71461014557806333ee5f35146101405780633ccfd60b1461013b5780633d2691bc1461013657806355a373d6146101315780635a4fd6451461012c57806380f323a71461012757806381972d00146101225780638677ab231461011d5780638bd03d0a146101185780639940686e14610113578063a65e2cfd1461010e578063cb766a5614610109578063d415b3f914610104578063ede7f6a3146100ff578063f3a504f2146100fa5763fe03a460146100f5575f80fd5b61094f565b61092a565b6106e7565b6106ca565b6106a6565b61054e565b610498565b61047b565b610437565b6103e8565b6103cb565b6103af565b61036b565b61034f565b610254565b610237565b610215565b6101db565b6101b3565b346101af575f3660031901126101af577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031633036101a0576007805460ff19169055005b63618bbdd560e01b5f5260045ffd5b5f80fd5b346101af575f3660031901126101af576003546040516001600160a01b039091168152602090f35b346101af575f3660031901126101af5760206040517f00000000000000000000000000000000000000000000000000000000000000008152f35b346101af575f3660031901126101af57602060ff600754166040519015158152f35b346101af575f3660031901126101af576020600454604051908152f35b346101af575f3660031901126101af5761026c610a57565b610274610a97565b61027c610ace565b61029361ff0019600754166007555f6001555f8055565b80156103405760405163a9059cbb60e01b815233600482015260248101919091526020816044815f6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000165af190811561033b575f9161030c575b50156102fd57005b63022e258160e11b5f5260045ffd5b61032e915060203d602011610334575b6103268183610980565b8101906109a7565b5f6102f5565b503d61031c565b6109bf565b6353cd7f7960e01b5f5260045ffd5b346101af575f3660031901126101af5760206040516101008152f35b346101af575f3660031901126101af576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b346101af575f3660031901126101af5760205f54604051908152f35b346101af575f3660031901126101af576020600554604051908152f35b346101af575f3660031901126101af577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031633036101a0576007805460ff19166001179055005b346101af575f3660031901126101af576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b346101af575f3660031901126101af576020600154604051908152f35b346101af5760203660031901126101af576004356104b4610ae0565b6104bd81610b29565b6040516323b872dd60e01b8152336004820152306024820152604481018290526020816064815f6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000165af190811561033b575f9161052f575b50156102fd5761052d90610b84565b005b610548915060203d602011610334576103268183610980565b5f61051e565b346101af5760403660031901126101af576004356024357f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031633036101a05760075460081c60ff16610697578115610688578015610679576105bd826105c2935f55600255565b600155565b61060360206105d6600254600154906109ff565b6040516323b872dd60e01b8152336004820152306024820152604481019190915291829081906064820190565b03815f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165af190811561033b575f9161065a575b50156102fd5761052d61010061ff00196007541617600755565b610673915060203d602011610334576103268183610980565b5f610640565b63932ca0a360e01b5f5260045ffd5b63ea1083a760e01b5f5260045ffd5b635adf638760e01b5f5260045ffd5b346101af575f3660031901126101af5760206106c0610a0c565b6040519015158152f35b346101af575f3660031901126101af576020600254604051908152f35b346101af5760403660031901126101af5760043567ffffffffffffffff81116101af578060040160a060031983360301126101af576024356107298280610a24565b60075461073e9060081c60ff161590565b1590565b61091b5760035461075f906001600160a01b03165b6001600160a01b031690565b331480159061090a575b6108fb574383116108ec576101006107818443610bc9565b116108dd57824080156108ce57610799368385610bf2565b60208151910120036108bf576107ae91611072565b036108b0576107c66107c08280610a24565b90610c56565b9161080061073a60248301946107dc8686610a24565b906107ea6044870188610a24565b906107f8606489018a610a24565b949093610cc6565b6108a15760846108166108869461073a94610a24565b7f0000000000000000000000000000000000000000000000000000000000000000937f0000000000000000000000000000000000000000000000000000000000000000937f0000000000000000000000000000000000000000000000000000000000000000939101359190610d4a565b6108925761052d610ee4565b6364fa89e160e11b5f5260045ffd5b637b374dd160e01b5f5260045ffd5b63048a12f560e11b5f5260045ffd5b63ff28378760e01b5f5260045ffd5b63bfc9f0d360e01b5f5260045ffd5b63c42a018560e01b5f5260045ffd5b63058968cf60e41b5f5260045ffd5b6337b5f20360e21b5f5260045ffd5b5061091661073a610a0c565b610769565b636af784dd60e11b5f5260045ffd5b346101af575f3660031901126101af57602060ff60075460081c166040519015158152f35b346101af575f3660031901126101af576020600654604051908152f35b634e487b7160e01b5f52604160045260245ffd5b90601f8019910116810190811067ffffffffffffffff8211176109a257604052565b61096c565b908160209103126101af575180151581036101af5790565b6040513d5f823e3d90fd5b634e487b7160e01b5f52601160045260245ffd5b90600182018092116109ec57565b6109ca565b60010190816001116109ec57565b919082018092116109ec57565b6004548015159081610a1c575090565b905042111590565b903590601e19813603018212156101af570180359067ffffffffffffffff82116101af576020019181360383136101af57565b60ff60075460081c161561091b577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031633036101a057565b610a9f610a0c565b610abf576001600160601b0360a01b600354166003555f6005555f600455565b639cbc1de160e01b5f5260045ffd5b60015460025481018091116109ec5790565b6004548015159081610b1f575b50610af457565b6005545f548181018091116109ec575f556006549081018091116109ec57600655610b1d610a97565b565b905042115f610aed565b60075460ff8160081c161561091b5760ff16610b7557610b47610a0c565b610b66575f5460011c11610b5757565b63e92c469f60e01b5f5260045ffd5b63129f78e960e11b5f5260045ffd5b632479328960e01b5f5260045ffd5b336001600160601b0360a01b600354161760035561012c42018042116109ec57600455600555565b6001198101919082116109ec57565b5f198101919082116109ec57565b919082039182116109ec57565b67ffffffffffffffff81116109a257601f01601f191660200190565b929192610bfe82610bd6565b91610c0c6040519384610980565b8294818452818301116101af578281602093845f960137010152565b634e487b7160e01b5f52603260045260245ffd5b9015610c455790565b610c28565b90821015610c45570190565b90610c6181836110da565b905f5b60058110610cb15750600560fd1b906001600160f81b031990610c8990849086610c4a565b351603610ca2576001810181116109ec57016001013590565b633954003560e11b5f5260045ffd5b91610cbf600191838661120e565b9201610c64565b610cdc610ce492939495610cea98973691610bf2565b923691610bf2565b9061137d565b90565b60ff60f6199116019060ff82116109ec57565b60ff60bf199116019060ff82116109ec57565b60ff60b6199116019060ff82116109ec57565b60ff607f199116019060ff82116109ec57565b60ff166001019060ff82116109ec57565b9594939291905f818881151580610ec8575b610eba575b610d8a610d84610d768560c09560ff95610c4a565b356001600160f81b03191690565b60f81c90565b1610610e8457808860f860ff610da8610d84610d7688978887610c4a565b1610610eaa57610dd5610dd0610dcb610d84610d7686610de198610ddb97610c4a565b610ced565b610d39565b60ff1690565b906109ff565b81885f5b60038110610e935750610dd5610d84610d768560c095610e0495610c4a565b10610e8457808860f8610e22610dd5610d84610d7688978887610c4a565b10610e7357610dd5610dd0610dcb610d84610d7686610e4498610ddb97610c4a565b915b5f905b808210610e5c575050610cea959661152a565b9092610e6b600191848b61120e565b930190610e49565b50610e7e91506109de565b91610e46565b631bd5dcf760e31b5f5260045ffd5b92600192610ea09261120e565b9101888391610de5565b50610eb591506109de565b610de1565b506001915082905088610d61565b50608060ff610edd610d84610d768686610c3c565b1610610d5c565b610eec6115f1565b6003546001600160a01b0316610f296001600160601b0360a01b600354166003555f6005555f60045561ff0019600754166007555f6001555f8055565b4662aa36a703610fc557604051633419e74d60e21b81526001600160a01b0390911660048201526024810191909152602081806044810103815f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165af190811561033b575f91610fa6575b505b156102fd57565b610fbf915060203d602011610334576103268183610980565b5f610f9d565b60405163a9059cbb60e01b81526001600160a01b0390911660048201526024810191909152602081806044810103815f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165af190811561033b575f91611035575b50610f9f565b61104e915060203d602011610334576103268183610980565b5f61102f565b805115610c455760200190565b908151811015610c45570160200190565b919061107e81846110da565b905f5b600881106110c557506110949293611684565b50905f805b83518210156110c0576001906110af8386611061565b5160f81c9060081b17910190611099565b925050565b916110d3600191838761120e565b9201611081565b5f600360fe1b6001600160f81b03196110f6610d768686610c3c565b16106111d657601f60fb1b6001600160f81b0319611117610d768686610c3c565b16106112055780610ddb610dd5610dd0610dcb610d84610d7661113b978a8a610c4a565b905b61a5bd461480156111fa575b611154575b50905090565b5f5b600381106111e55750600360fe1b611182611175610d76858786610c4a565b6001600160f81b03191690565b106111d657601f60fb1b61119d611175610d76858786610c4a565b106111c657610dd5610dd0610dcb610d84610d76866111bf98610ddb97610c4a565b805f61114e565b506111d191506109de565b6111bf565b63c0098bd960e01b5f5260045ffd5b916111f3600191858461120e565b9201611156565b5061a5bf4614611149565b5060019061113d565b91908082101561136e57611229610d84610d76848487610c4a565b9060ff8216608081101561124457505050610cea91506109de565b91929160b881101561126c575050610cea9250610dd5611266610ddb926109de565b92610d26565b90929060c08110156112e75750610dd561128891949394610d13565b915f935f915b8483106112ae57505050610cea92916112a96112a9926109de565b6109ff565b9091946112bd60019160081b90565b6112dd610dd5610d84610d766112d68b6112a98b6109de565b8888610c4a565b179501919061128e565b90929060f8111561130d5750610cea9250610dd5611307610ddb926109de565b92610d00565b9291610dd561131b91610ced565b915f935f915b84831061133c57505050610cea92916112a96112a9926109de565b90919461134b60019160081b90565b611364610dd5610d84610d766112d68b6112a98b6109de565b1795019190611321565b6318d76ae160e11b5f5260045ffd5b919390929190600360fe1b6001600160f81b031961139e610d768689610c3c565b161061151b57601f60fb1b6001600160f81b03196113bf610d768689610c3c565b1610611511576113e36113de610dd5610dcb610d84610d76888b610c3c565b6109f1565b9492905b945f5b8282106113fc57505050505050505f90565b61141a6114138361140e36878a610bf2565b6117f5565b90936109ff565b9682516020840120036114af57600360fe1b61144961117561143b85611054565b516001600160f81b03191690565b106114af578590846001601f60fb1b61146761117561143b88611054565b10156114f3575b611478818661197c565b601181036114ba575061148a94611b07565b9491156114af5784156114a35793915b919590936113ea565b50505050505050600190565b505050505050505f90565b9093506002141590506114e7578487926114d3946119c1565b9491156114af5784156114a357939161149a565b50505050505050505f90565b5061150c6113de610dd5610dcb610d8461143b89611054565b61146e565b60019492906113e7565b63ebb47d1d60e01b5f5260045ffd5b91949392948060c060ff611545610d84610d7685888a610c4a565b1610610e845760f860ff611560610d84610d7685888a610c4a565b16106115e2575080610ddb610dd5610dd0610dcb610d84610d7661158597898b610c4a565b611590818385611c1c565b969060148151036115d357601401516001600160a01b039182169116036115c457610cea956115be916109ff565b91611c88565b63a087f96f60e01b5f5260045ffd5b63e6c4247b60e01b5f5260045ffd5b6115ec91506109de565b611585565b6005545f5481018091116109ec5760015481018091116109ec5790565b6040805190919061161f8382610980565b6001815291601f1901366020840137565b604080519091906116418382610980565b6014815291601f1901366020840137565b9061165c82610bd6565b6116696040519182610980565b828152809261167a601f1991610bd6565b0190602036910137565b8183101561136e5761169d610d84610d76858585610c4a565b9260ff841660808110156116d757505050506116b761160e565b9060f81b6001600160f81b0319165f1a6116d082611054565b5390600190565b60b881969592939496105f146117455750610dd56116f491610d26565b916116fe83611652565b945f5b8481106117155750505050610cea906109f1565b80611732610d7661172b6001946112a9896109de565b8587610c4a565b5f1a61173e828a611061565b5301611701565b60c011156117e657610dd561175991610d13565b905f925f5b8381106117b7575061176f84611652565b955f5b85811061178a5750505050906112a9610cea926109f1565b806117a4610d7661172b6001946112a98a6112a98b6109de565b5f1a6117b0828b611061565b5301611772565b9360019060081b6117de610dd5610d84610d766117d78a6112a98a6109de565b8c88610c4a565b17940161175e565b636b2e9c5f60e11b5f5260045ffd5b805182101561136e5761180e610d8461143b8484611061565b9160ff83166080811015611827575050506116b761160e565b919392909160b88110156118915750610dd561184291610d26565b9061184c82611652565b935f5b83811061186257505050610cea906109f1565b8061187e61143b6118786001946112a9886109de565b85611061565b5f1a61188a8289611061565b530161184f565b60c0111561192f57610dd56118a591610d13565b5f915f5b82811061190157506118ba83611652565b945f5b8481106118d457505050906112a9610cea926109f1565b806118ee61143b6118786001946112a9896112a98a6109de565b5f1a6118fa828a611061565b53016118bd565b9260019060081b611927610dd5610d8461143b611921896112a9896109de565b8b611061565b1793016118a9565b509161193b8382611ddf565b9261194584611652565b915f5b858110611956575050509190565b8061196961143b611878600194876109ff565b5f1a6119758287611061565b5301611948565b5f92915b81518110156119a7576119938183611ddf565b81018091116109ec57600190930192611980565b5050565b908160011b91808304600214901517156109ec57565b839492916119cf81836117f5565b93906119ee60206119e5610d8461143b85611054565b16151591611f0c565b97889115611a905750611a029051876109ff565b611a0c82516119ab565b14611a21575b505050505050505f905f905f90565b86866001928251611a7e575b505050611a3b575b80611a12565b611a4e92611a48916109ff565b906117f5565b5060208151910120906020815191012014611a6c5780808080611a35565b611a779151906109ff565b6001915f90565b611a889350612075565b86865f611a2d565b611aa1939495965061073a92612075565b611afa57611ab292611a48916109ff565b50908151602081145f14611ada57506020611ad2920151925b51906109ff565b916001929190565b8015611aee576020611ad293012092611acb565b505050505f905f905f90565b50505050505f905f905f90565b91909293611b1582516119ab565b851015611bbf5750610d8461143b611b3792611b318760011c90565b90611061565b60018416611bb65760041c600f16915b905f925b60ff81168410611b965750611b6092506117f5565b5080518015611b8b57611ad29160208203611b8157602091500151916109de565b60200120916109de565b5050505f905f905f90565b90916001611baa82610ddb60ff9487611ddf565b94019392919050611b4b565b600f1691611b47565b9290509392935f915b60108310611c0257611bda92506117f5565b50602081519101209060208151910120145f14611bf957600191905f90565b5f915081908190565b90611c1381610ddb60019385611ddf565b92019190611bc8565b91909182821015610e8457609460ff611c3c610d84610d76868887610c4a565b16036115d357611c4a611630565b925f5b60148110611c5f575050505090601590565b80611c75610d7661172b6001946112a9896109de565b5f1a611c818288611061565b5301611c4d565b91928360c060ff611ca0610d84610d7689888a610c4a565b1610610e845760f860ff611cbb610d84610d7689888a610c4a565b1610611dd05780610ddb610dd5610dd0610dcb610d84610d76611cdf978a8c610c4a565b7fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef611d0b828587612133565b03611dc157610753610753611d2e611d27611d3594878961120e565b868861120e565b8587612133565b6001600160a01b03918216911603611db257611d55611d5b93828461120e565b9161216f565b50916020835111610e84575f90815b8451831015611d955760019060081b611d8c610dd5610d8461143b878a611061565b17920191611d6a565b9150925003611da357600190565b6355e97b0d60e01b5f5260045ffd5b634cd4b7b160e01b5f5260045ffd5b6324da545d60e11b5f5260045ffd5b50611dda846109de565b611cdf565b90815181101561136e57611df9610d8461143b8385611061565b9160ff83166080811015611e105750505050600190565b60b8811015611e2b57505050610dd5610dd0610cea92610d26565b60c0811015611e97575091610dd5611e4291610d13565b905f925f915b838310611e5f57505050906112a9610cea926109f1565b909193611e6e60019160081b90565b611e8d610dd5610d8461143b611e878a6112a9896109de565b88611061565b1794019190611e48565b60f81115611eb0575050610dd5610dd0610cea92610d00565b91610dd5611ebd91610ced565b905f925f915b838310611eda57505050906112a9610cea926109f1565b909193611ee960019160081b90565b611f02610dd5610d8461143b611e878a6112a9896109de565b1794019190611ec3565b90815115610b1d57611f23610d8461143b84611054565b6010811615611ff257611f46611f41611f3c85516119ab565b610bbb565b611652565b9060f81b600f60f81b165f1a611f5b82611054565b5360015b8351811015611fed5780611f9a611f8a611f81610d8461143b6001968a611061565b60041c600f1690565b60f81b6001600160f81b03191690565b611fb3611fa9611f3c846119ab565b915f1a9185611061565b53611fda600f611fc9610d8461143b858a611061565b1660f81b6001600160f81b03191690565b611fe6611fa9836119ab565b5301611f5f565b509150565b50612008611f4161200384516119ab565b610bac565b60015b8351811015611fed578061202d611f8a611f81610d8461143b6001968a611061565b612041611fa961203c84610bbb565b6119ab565b53612057600f611fc9610d8461143b858a611061565b61206e611fa961206961203c85610bbb565b6109de565b530161200b565b9190916120838251846109ff565b61208d82516119ab565b1061212c575f5b8251811015612123576120b06120aa82866109ff565b60011690565b612105576120d9611f81610d8461143b6120d36120cd868a6109ff565b60011c90565b86611061565b60ff6120ee610dd5610d8461143b8689611061565b9116036120fd57600101612094565b505050505f90565b600f61211d610d8461143b6120d36120cd868a6109ff565b166120d9565b50505050600190565b5050505f90565b9190600560fd1b906001600160f81b03199061215190849086610c4a565b35160361216057016001013590565b63f0ff325b60e01b5f5260045ffd5b81831015610e8457612188610d84610d76858585610c4a565b9260ff841660808110156121a257505050506116b761160e565b60b881969592939496105f146122095750610dd56121bf91610d26565b916121c983611652565b945f5b8481106121e05750505050610cea906109f1565b806121f6610d7661172b6001946112a9896109de565b5f1a612202828a611061565b53016121cc565b60c011156122a357610dd561221d91610d13565b905f925f5b83811061227b575061223384611652565b955f5b85811061224e5750505050906112a9610cea926109f1565b80612268610d7661172b6001946112a98a6112a98b6109de565b5f1a612274828b611061565b5301612236565b9360019060081b61229b610dd5610d84610d766117d78a6112a98a6109de565b179401612222565b6336459a5b60e21b5f5260045ffdfea2646970667358221220f111dda4228930ff7fcf5360c1e823b8ddcd3e1621a6c54215af8789b55a438f64736f6c634300081e0033","sourceMap":"426:4780:21:-:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;1670:38:20;426:4780:21;1670:38:20;1718:32;;1778:10;426:4780:21;1760:28:20;426:4780:21;;;;;;;1437:28;;;1433:54;;1497:30;;1542:24;;;;:53;;;-1:-1:-1;1538:133:21;;-1:-1:-1;426:4780:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1718:32:20;426:4780:21;;;;;;;;;;1497:30;426:4780;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1538:133;426:4780;1953:6;426:4780;;;;1949:34;;1993:56;;2063:26;;2059:58;;426:4780;-1:-1:-1;426:4780:21;;2180:43;426:4780;;;;;;;;;;;-1:-1:-1;426:4780:21;2292:106;426:4780;;;;;;;;;;;;2292:106;;1778:10:20;2292:106:21;;;426:4780;2347:4;426:4780;;;;;;;;2292:106;;;;;;;-1:-1:-1;2292:106:21;;;1538:133;2291:107;;2287:174;;426:4780;;;1953:6;426:4780;;;1953:6;426:4780;1538:133;;;;;;2287:174;2429:21;;;-1:-1:-1;2429:21:21;2292:106;-1:-1:-1;2429:21:21;2292:106;;;426:4780;2292:106;;426:4780;2292:106;;;;;;426:4780;2292:106;;;:::i;:::-;;;426:4780;;;;;;;;;;;;2292:106;;;426:4780;-1:-1:-1;426:4780:21;;2292:106;;;-1:-1:-1;2292:106:21;;;426:4780;;;-1:-1:-1;426:4780:21;;;;;;;;;-1:-1:-1;426:4780:21;;;;;-1:-1:-1;426:4780:21;2059:58;2098:19;;;-1:-1:-1;2098:19:21;;-1:-1:-1;2098:19:21;1993:56;2031:18;;;-1:-1:-1;2031:18:21;;-1:-1:-1;2031:18:21;1949:34;1968:15;;;-1:-1:-1;1968:15:21;;-1:-1:-1;1968:15:21;1542:53;1570:25;;;;1542:53;;1433:54;1474:13;;;-1:-1:-1;1474:13:21;;-1:-1:-1;1474:13:21;426:4780;;;;;-1:-1:-1;;426:4780:21;;;;-1:-1:-1;;;;;426:4780:21;;;;;;;;;;:::o;:::-;;;;-1:-1:-1;426:4780:21;;;;;-1:-1:-1;426:4780:21;;;;-1:-1:-1;;;;;426:4780:21;;;;;;:::o","linkReferences":{}},"deployedBytecode":{"object":"0x60806040526004361015610011575f80fd5b5f3560e01c8063046f7da2146101545780631aa7c0ec1461014f5780632feef2ec1461014a578063308657d71461014557806333ee5f35146101405780633ccfd60b1461013b5780633d2691bc1461013657806355a373d6146101315780635a4fd6451461012c57806380f323a71461012757806381972d00146101225780638677ab231461011d5780638bd03d0a146101185780639940686e14610113578063a65e2cfd1461010e578063cb766a5614610109578063d415b3f914610104578063ede7f6a3146100ff578063f3a504f2146100fa5763fe03a460146100f5575f80fd5b61094f565b61092a565b6106e7565b6106ca565b6106a6565b61054e565b610498565b61047b565b610437565b6103e8565b6103cb565b6103af565b61036b565b61034f565b610254565b610237565b610215565b6101db565b6101b3565b346101af575f3660031901126101af577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031633036101a0576007805460ff19169055005b63618bbdd560e01b5f5260045ffd5b5f80fd5b346101af575f3660031901126101af576003546040516001600160a01b039091168152602090f35b346101af575f3660031901126101af5760206040517f00000000000000000000000000000000000000000000000000000000000000008152f35b346101af575f3660031901126101af57602060ff600754166040519015158152f35b346101af575f3660031901126101af576020600454604051908152f35b346101af575f3660031901126101af5761026c610a57565b610274610a97565b61027c610ace565b61029361ff0019600754166007555f6001555f8055565b80156103405760405163a9059cbb60e01b815233600482015260248101919091526020816044815f6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000165af190811561033b575f9161030c575b50156102fd57005b63022e258160e11b5f5260045ffd5b61032e915060203d602011610334575b6103268183610980565b8101906109a7565b5f6102f5565b503d61031c565b6109bf565b6353cd7f7960e01b5f5260045ffd5b346101af575f3660031901126101af5760206040516101008152f35b346101af575f3660031901126101af576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b346101af575f3660031901126101af5760205f54604051908152f35b346101af575f3660031901126101af576020600554604051908152f35b346101af575f3660031901126101af577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031633036101a0576007805460ff19166001179055005b346101af575f3660031901126101af576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b346101af575f3660031901126101af576020600154604051908152f35b346101af5760203660031901126101af576004356104b4610ae0565b6104bd81610b29565b6040516323b872dd60e01b8152336004820152306024820152604481018290526020816064815f6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000165af190811561033b575f9161052f575b50156102fd5761052d90610b84565b005b610548915060203d602011610334576103268183610980565b5f61051e565b346101af5760403660031901126101af576004356024357f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031633036101a05760075460081c60ff16610697578115610688578015610679576105bd826105c2935f55600255565b600155565b61060360206105d6600254600154906109ff565b6040516323b872dd60e01b8152336004820152306024820152604481019190915291829081906064820190565b03815f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165af190811561033b575f9161065a575b50156102fd5761052d61010061ff00196007541617600755565b610673915060203d602011610334576103268183610980565b5f610640565b63932ca0a360e01b5f5260045ffd5b63ea1083a760e01b5f5260045ffd5b635adf638760e01b5f5260045ffd5b346101af575f3660031901126101af5760206106c0610a0c565b6040519015158152f35b346101af575f3660031901126101af576020600254604051908152f35b346101af5760403660031901126101af5760043567ffffffffffffffff81116101af578060040160a060031983360301126101af576024356107298280610a24565b60075461073e9060081c60ff161590565b1590565b61091b5760035461075f906001600160a01b03165b6001600160a01b031690565b331480159061090a575b6108fb574383116108ec576101006107818443610bc9565b116108dd57824080156108ce57610799368385610bf2565b60208151910120036108bf576107ae91611072565b036108b0576107c66107c08280610a24565b90610c56565b9161080061073a60248301946107dc8686610a24565b906107ea6044870188610a24565b906107f8606489018a610a24565b949093610cc6565b6108a15760846108166108869461073a94610a24565b7f0000000000000000000000000000000000000000000000000000000000000000937f0000000000000000000000000000000000000000000000000000000000000000937f0000000000000000000000000000000000000000000000000000000000000000939101359190610d4a565b6108925761052d610ee4565b6364fa89e160e11b5f5260045ffd5b637b374dd160e01b5f5260045ffd5b63048a12f560e11b5f5260045ffd5b63ff28378760e01b5f5260045ffd5b63bfc9f0d360e01b5f5260045ffd5b63c42a018560e01b5f5260045ffd5b63058968cf60e41b5f5260045ffd5b6337b5f20360e21b5f5260045ffd5b5061091661073a610a0c565b610769565b636af784dd60e11b5f5260045ffd5b346101af575f3660031901126101af57602060ff60075460081c166040519015158152f35b346101af575f3660031901126101af576020600654604051908152f35b634e487b7160e01b5f52604160045260245ffd5b90601f8019910116810190811067ffffffffffffffff8211176109a257604052565b61096c565b908160209103126101af575180151581036101af5790565b6040513d5f823e3d90fd5b634e487b7160e01b5f52601160045260245ffd5b90600182018092116109ec57565b6109ca565b60010190816001116109ec57565b919082018092116109ec57565b6004548015159081610a1c575090565b905042111590565b903590601e19813603018212156101af570180359067ffffffffffffffff82116101af576020019181360383136101af57565b60ff60075460081c161561091b577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031633036101a057565b610a9f610a0c565b610abf576001600160601b0360a01b600354166003555f6005555f600455565b639cbc1de160e01b5f5260045ffd5b60015460025481018091116109ec5790565b6004548015159081610b1f575b50610af457565b6005545f548181018091116109ec575f556006549081018091116109ec57600655610b1d610a97565b565b905042115f610aed565b60075460ff8160081c161561091b5760ff16610b7557610b47610a0c565b610b66575f5460011c11610b5757565b63e92c469f60e01b5f5260045ffd5b63129f78e960e11b5f5260045ffd5b632479328960e01b5f5260045ffd5b336001600160601b0360a01b600354161760035561012c42018042116109ec57600455600555565b6001198101919082116109ec57565b5f198101919082116109ec57565b919082039182116109ec57565b67ffffffffffffffff81116109a257601f01601f191660200190565b929192610bfe82610bd6565b91610c0c6040519384610980565b8294818452818301116101af578281602093845f960137010152565b634e487b7160e01b5f52603260045260245ffd5b9015610c455790565b610c28565b90821015610c45570190565b90610c6181836110da565b905f5b60058110610cb15750600560fd1b906001600160f81b031990610c8990849086610c4a565b351603610ca2576001810181116109ec57016001013590565b633954003560e11b5f5260045ffd5b91610cbf600191838661120e565b9201610c64565b610cdc610ce492939495610cea98973691610bf2565b923691610bf2565b9061137d565b90565b60ff60f6199116019060ff82116109ec57565b60ff60bf199116019060ff82116109ec57565b60ff60b6199116019060ff82116109ec57565b60ff607f199116019060ff82116109ec57565b60ff166001019060ff82116109ec57565b9594939291905f818881151580610ec8575b610eba575b610d8a610d84610d768560c09560ff95610c4a565b356001600160f81b03191690565b60f81c90565b1610610e8457808860f860ff610da8610d84610d7688978887610c4a565b1610610eaa57610dd5610dd0610dcb610d84610d7686610de198610ddb97610c4a565b610ced565b610d39565b60ff1690565b906109ff565b81885f5b60038110610e935750610dd5610d84610d768560c095610e0495610c4a565b10610e8457808860f8610e22610dd5610d84610d7688978887610c4a565b10610e7357610dd5610dd0610dcb610d84610d7686610e4498610ddb97610c4a565b915b5f905b808210610e5c575050610cea959661152a565b9092610e6b600191848b61120e565b930190610e49565b50610e7e91506109de565b91610e46565b631bd5dcf760e31b5f5260045ffd5b92600192610ea09261120e565b9101888391610de5565b50610eb591506109de565b610de1565b506001915082905088610d61565b50608060ff610edd610d84610d768686610c3c565b1610610d5c565b610eec6115f1565b6003546001600160a01b0316610f296001600160601b0360a01b600354166003555f6005555f60045561ff0019600754166007555f6001555f8055565b4662aa36a703610fc557604051633419e74d60e21b81526001600160a01b0390911660048201526024810191909152602081806044810103815f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165af190811561033b575f91610fa6575b505b156102fd57565b610fbf915060203d602011610334576103268183610980565b5f610f9d565b60405163a9059cbb60e01b81526001600160a01b0390911660048201526024810191909152602081806044810103815f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165af190811561033b575f91611035575b50610f9f565b61104e915060203d602011610334576103268183610980565b5f61102f565b805115610c455760200190565b908151811015610c45570160200190565b919061107e81846110da565b905f5b600881106110c557506110949293611684565b50905f805b83518210156110c0576001906110af8386611061565b5160f81c9060081b17910190611099565b925050565b916110d3600191838761120e565b9201611081565b5f600360fe1b6001600160f81b03196110f6610d768686610c3c565b16106111d657601f60fb1b6001600160f81b0319611117610d768686610c3c565b16106112055780610ddb610dd5610dd0610dcb610d84610d7661113b978a8a610c4a565b905b61a5bd461480156111fa575b611154575b50905090565b5f5b600381106111e55750600360fe1b611182611175610d76858786610c4a565b6001600160f81b03191690565b106111d657601f60fb1b61119d611175610d76858786610c4a565b106111c657610dd5610dd0610dcb610d84610d76866111bf98610ddb97610c4a565b805f61114e565b506111d191506109de565b6111bf565b63c0098bd960e01b5f5260045ffd5b916111f3600191858461120e565b9201611156565b5061a5bf4614611149565b5060019061113d565b91908082101561136e57611229610d84610d76848487610c4a565b9060ff8216608081101561124457505050610cea91506109de565b91929160b881101561126c575050610cea9250610dd5611266610ddb926109de565b92610d26565b90929060c08110156112e75750610dd561128891949394610d13565b915f935f915b8483106112ae57505050610cea92916112a96112a9926109de565b6109ff565b9091946112bd60019160081b90565b6112dd610dd5610d84610d766112d68b6112a98b6109de565b8888610c4a565b179501919061128e565b90929060f8111561130d5750610cea9250610dd5611307610ddb926109de565b92610d00565b9291610dd561131b91610ced565b915f935f915b84831061133c57505050610cea92916112a96112a9926109de565b90919461134b60019160081b90565b611364610dd5610d84610d766112d68b6112a98b6109de565b1795019190611321565b6318d76ae160e11b5f5260045ffd5b919390929190600360fe1b6001600160f81b031961139e610d768689610c3c565b161061151b57601f60fb1b6001600160f81b03196113bf610d768689610c3c565b1610611511576113e36113de610dd5610dcb610d84610d76888b610c3c565b6109f1565b9492905b945f5b8282106113fc57505050505050505f90565b61141a6114138361140e36878a610bf2565b6117f5565b90936109ff565b9682516020840120036114af57600360fe1b61144961117561143b85611054565b516001600160f81b03191690565b106114af578590846001601f60fb1b61146761117561143b88611054565b10156114f3575b611478818661197c565b601181036114ba575061148a94611b07565b9491156114af5784156114a35793915b919590936113ea565b50505050505050600190565b505050505050505f90565b9093506002141590506114e7578487926114d3946119c1565b9491156114af5784156114a357939161149a565b50505050505050505f90565b5061150c6113de610dd5610dcb610d8461143b89611054565b61146e565b60019492906113e7565b63ebb47d1d60e01b5f5260045ffd5b91949392948060c060ff611545610d84610d7685888a610c4a565b1610610e845760f860ff611560610d84610d7685888a610c4a565b16106115e2575080610ddb610dd5610dd0610dcb610d84610d7661158597898b610c4a565b611590818385611c1c565b969060148151036115d357601401516001600160a01b039182169116036115c457610cea956115be916109ff565b91611c88565b63a087f96f60e01b5f5260045ffd5b63e6c4247b60e01b5f5260045ffd5b6115ec91506109de565b611585565b6005545f5481018091116109ec5760015481018091116109ec5790565b6040805190919061161f8382610980565b6001815291601f1901366020840137565b604080519091906116418382610980565b6014815291601f1901366020840137565b9061165c82610bd6565b6116696040519182610980565b828152809261167a601f1991610bd6565b0190602036910137565b8183101561136e5761169d610d84610d76858585610c4a565b9260ff841660808110156116d757505050506116b761160e565b9060f81b6001600160f81b0319165f1a6116d082611054565b5390600190565b60b881969592939496105f146117455750610dd56116f491610d26565b916116fe83611652565b945f5b8481106117155750505050610cea906109f1565b80611732610d7661172b6001946112a9896109de565b8587610c4a565b5f1a61173e828a611061565b5301611701565b60c011156117e657610dd561175991610d13565b905f925f5b8381106117b7575061176f84611652565b955f5b85811061178a5750505050906112a9610cea926109f1565b806117a4610d7661172b6001946112a98a6112a98b6109de565b5f1a6117b0828b611061565b5301611772565b9360019060081b6117de610dd5610d84610d766117d78a6112a98a6109de565b8c88610c4a565b17940161175e565b636b2e9c5f60e11b5f5260045ffd5b805182101561136e5761180e610d8461143b8484611061565b9160ff83166080811015611827575050506116b761160e565b919392909160b88110156118915750610dd561184291610d26565b9061184c82611652565b935f5b83811061186257505050610cea906109f1565b8061187e61143b6118786001946112a9886109de565b85611061565b5f1a61188a8289611061565b530161184f565b60c0111561192f57610dd56118a591610d13565b5f915f5b82811061190157506118ba83611652565b945f5b8481106118d457505050906112a9610cea926109f1565b806118ee61143b6118786001946112a9896112a98a6109de565b5f1a6118fa828a611061565b53016118bd565b9260019060081b611927610dd5610d8461143b611921896112a9896109de565b8b611061565b1793016118a9565b509161193b8382611ddf565b9261194584611652565b915f5b858110611956575050509190565b8061196961143b611878600194876109ff565b5f1a6119758287611061565b5301611948565b5f92915b81518110156119a7576119938183611ddf565b81018091116109ec57600190930192611980565b5050565b908160011b91808304600214901517156109ec57565b839492916119cf81836117f5565b93906119ee60206119e5610d8461143b85611054565b16151591611f0c565b97889115611a905750611a029051876109ff565b611a0c82516119ab565b14611a21575b505050505050505f905f905f90565b86866001928251611a7e575b505050611a3b575b80611a12565b611a4e92611a48916109ff565b906117f5565b5060208151910120906020815191012014611a6c5780808080611a35565b611a779151906109ff565b6001915f90565b611a889350612075565b86865f611a2d565b611aa1939495965061073a92612075565b611afa57611ab292611a48916109ff565b50908151602081145f14611ada57506020611ad2920151925b51906109ff565b916001929190565b8015611aee576020611ad293012092611acb565b505050505f905f905f90565b50505050505f905f905f90565b91909293611b1582516119ab565b851015611bbf5750610d8461143b611b3792611b318760011c90565b90611061565b60018416611bb65760041c600f16915b905f925b60ff81168410611b965750611b6092506117f5565b5080518015611b8b57611ad29160208203611b8157602091500151916109de565b60200120916109de565b5050505f905f905f90565b90916001611baa82610ddb60ff9487611ddf565b94019392919050611b4b565b600f1691611b47565b9290509392935f915b60108310611c0257611bda92506117f5565b50602081519101209060208151910120145f14611bf957600191905f90565b5f915081908190565b90611c1381610ddb60019385611ddf565b92019190611bc8565b91909182821015610e8457609460ff611c3c610d84610d76868887610c4a565b16036115d357611c4a611630565b925f5b60148110611c5f575050505090601590565b80611c75610d7661172b6001946112a9896109de565b5f1a611c818288611061565b5301611c4d565b91928360c060ff611ca0610d84610d7689888a610c4a565b1610610e845760f860ff611cbb610d84610d7689888a610c4a565b1610611dd05780610ddb610dd5610dd0610dcb610d84610d76611cdf978a8c610c4a565b7fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef611d0b828587612133565b03611dc157610753610753611d2e611d27611d3594878961120e565b868861120e565b8587612133565b6001600160a01b03918216911603611db257611d55611d5b93828461120e565b9161216f565b50916020835111610e84575f90815b8451831015611d955760019060081b611d8c610dd5610d8461143b878a611061565b17920191611d6a565b9150925003611da357600190565b6355e97b0d60e01b5f5260045ffd5b634cd4b7b160e01b5f5260045ffd5b6324da545d60e11b5f5260045ffd5b50611dda846109de565b611cdf565b90815181101561136e57611df9610d8461143b8385611061565b9160ff83166080811015611e105750505050600190565b60b8811015611e2b57505050610dd5610dd0610cea92610d26565b60c0811015611e97575091610dd5611e4291610d13565b905f925f915b838310611e5f57505050906112a9610cea926109f1565b909193611e6e60019160081b90565b611e8d610dd5610d8461143b611e878a6112a9896109de565b88611061565b1794019190611e48565b60f81115611eb0575050610dd5610dd0610cea92610d00565b91610dd5611ebd91610ced565b905f925f915b838310611eda57505050906112a9610cea926109f1565b909193611ee960019160081b90565b611f02610dd5610d8461143b611e878a6112a9896109de565b1794019190611ec3565b90815115610b1d57611f23610d8461143b84611054565b6010811615611ff257611f46611f41611f3c85516119ab565b610bbb565b611652565b9060f81b600f60f81b165f1a611f5b82611054565b5360015b8351811015611fed5780611f9a611f8a611f81610d8461143b6001968a611061565b60041c600f1690565b60f81b6001600160f81b03191690565b611fb3611fa9611f3c846119ab565b915f1a9185611061565b53611fda600f611fc9610d8461143b858a611061565b1660f81b6001600160f81b03191690565b611fe6611fa9836119ab565b5301611f5f565b509150565b50612008611f4161200384516119ab565b610bac565b60015b8351811015611fed578061202d611f8a611f81610d8461143b6001968a611061565b612041611fa961203c84610bbb565b6119ab565b53612057600f611fc9610d8461143b858a611061565b61206e611fa961206961203c85610bbb565b6109de565b530161200b565b9190916120838251846109ff565b61208d82516119ab565b1061212c575f5b8251811015612123576120b06120aa82866109ff565b60011690565b612105576120d9611f81610d8461143b6120d36120cd868a6109ff565b60011c90565b86611061565b60ff6120ee610dd5610d8461143b8689611061565b9116036120fd57600101612094565b505050505f90565b600f61211d610d8461143b6120d36120cd868a6109ff565b166120d9565b50505050600190565b5050505f90565b9190600560fd1b906001600160f81b03199061215190849086610c4a565b35160361216057016001013590565b63f0ff325b60e01b5f5260045ffd5b81831015610e8457612188610d84610d76858585610c4a565b9260ff841660808110156121a257505050506116b761160e565b60b881969592939496105f146122095750610dd56121bf91610d26565b916121c983611652565b945f5b8481106121e05750505050610cea906109f1565b806121f6610d7661172b6001946112a9896109de565b5f1a612202828a611061565b53016121cc565b60c011156122a357610dd561221d91610d13565b905f925f5b83811061227b575061223384611652565b955f5b85811061224e5750505050906112a9610cea926109f1565b80612268610d7661172b6001946112a98a6112a98b6109de565b5f1a612274828b611061565b5301612236565b9360019060081b61229b610dd5610d84610d766117d78a6112a98a6109de565b179401612222565b6336459a5b60e21b5f5260045ffdfea2646970667358221220f111dda4228930ff7fcf5360c1e823b8ddcd3e1621a6c54215af8789b55a438f64736f6c634300081e0033","sourceMap":"426:4780:21:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;;;;;-1:-1:-1;;426:4780:21;;;;2363:15:20;-1:-1:-1;;;;;426:4780:21;2349:10:20;:29;2345:56;;2411:27;426:4780:21;;-1:-1:-1;;426:4780:21;;;;2345:56:20;2387:14;;;426:4780:21;2387:14:20;426:4780:21;;2387:14:20;426:4780:21;;;;;;;;;;-1:-1:-1;;426:4780:21;;;;1263:29:20;426:4780:21;;;-1:-1:-1;;;;;426:4780:21;;;;;;;;;;;;;;-1:-1:-1;;426:4780:21;;;;;;;963:39:20;426:4780:21;;;;;;;;;-1:-1:-1;;426:4780:21;;;;;;1407:31:20;426:4780:21;;;;;;;;;;;;;;;;-1:-1:-1;;426:4780:21;;;;;;;;;;;;;;;;;;;-1:-1:-1;;426:4780:21;;;;4808:396;;:::i;:::-;;;:::i;:::-;4935:30;;:::i;:::-;4906:59;426:4780;;5686:14:20;426:4780:21;;5686:14:20;426:4780:21;5695:5:20;426:4780:21;;5695:5:20;426:4780:21;;5636:138:20;4906:59:21;5012:23;;5008:57;;426:4780;;-1:-1:-1;;;5081:62:21;;5112:10;426:4780;5081:62;;426:4780;;;;;;;;5081:62;426:4780;;;-1:-1:-1;;;;;;5088:13:21;426:4780;5081:62;;;;;;;426:4780;5081:62;;;426:4780;5080:63;;5076:122;;426:4780;5076:122;5166:21;;;426:4780;5166:21;426:4780;;5166:21;5081:62;;;;;;;;;;;;;;;:::i;:::-;;;;;:::i;:::-;;;;;;;;;;;:::i;5008:57::-;5044:21;;;426:4780;5044:21;426:4780;;5044:21;426:4780;;;;;;-1:-1:-1;;426:4780:21;;;;;;;1085:3:20;426:4780:21;;;;;;;;;-1:-1:-1;;426:4780:21;;;;;;735:38;-1:-1:-1;;;;;426:4780:21;;;;;;;;;;;;-1:-1:-1;;426:4780:21;;;;;;;;;;;;;;;;;;;-1:-1:-1;;426:4780:21;;;;;1336:25:20;426:4780:21;;;;;;;;;;;;;-1:-1:-1;;426:4780:21;;;;2113:15:20;-1:-1:-1;;;;;426:4780:21;2099:10:20;:29;2095:56;;2161:26;426:4780:21;;-1:-1:-1;;426:4780:21;2183:4:20;426:4780:21;;;;;;;;;;-1:-1:-1;;426:4780:21;;;;;;873:42:20;-1:-1:-1;;;;;426:4780:21;;;;;;;;;;;;-1:-1:-1;;426:4780:21;;;;;727:35:20;426:4780:21;;;;;;;;;;;;;-1:-1:-1;;426:4780:21;;;;;;2783:388;;:::i;:::-;2972:11;;;:::i;:::-;426:4780;;-1:-1:-1;;;3000:74:21;;3035:10;426:4780;3000:74;;426:4780;3055:4;426:4780;;;;;;;;;;;;;;-1:-1:-1;;;;;;3007:13:21;426:4780;3000:74;;;;;;;-1:-1:-1;3000:74:21;;;426:4780;2999:75;;2995:134;;3152:11;;;:::i;:::-;426:4780;3000:74;;;;426:4780;3000:74;426:4780;3000:74;;;;;;;:::i;:::-;;;;426:4780;;;;;;-1:-1:-1;;426:4780:21;;;;;;;;1901:15;-1:-1:-1;;;;;426:4780:21;1887:10;:29;1883:56;;1953:6;426:4780;;;;;1949:34;;1997:25;;1993:56;;2063:26;;2059:58;;2180:43;426:4780;2233:44;426:4780;-1:-1:-1;426:4780:21;2180:43;426:4780;;2180:43;2233:44;426:4780;;2233:44;2292:106;426:4780;2354:43;2180;426:4780;2233:44;426:4780;2354:43;;:::i;:::-;426:4780;;-1:-1:-1;;;2292:106:21;;1887:10;426:4780;2292:106;;426:4780;2347:4;426:4780;;;;;;;;;;;;;;;;;;;;;2292:106;;426:4780;-1:-1:-1;2299:13:21;-1:-1:-1;;;;;426:4780:21;2292:106;;;;;;;-1:-1:-1;2292:106:21;;;426:4780;2291:107;;2287:174;;2470:13;426:4780;;;1953:6;426:4780;;;1953:6;426:4780;;2292:106;;;;426:4780;2292:106;426:4780;2292:106;;;;;;;:::i;:::-;;;;2059:58;2098:19;;;-1:-1:-1;2098:19:21;426:4780;-1:-1:-1;2098:19:21;1993:56;2031:18;;;-1:-1:-1;2031:18:21;426:4780;-1:-1:-1;2031:18:21;1949:34;1968:15;;;-1:-1:-1;1968:15:21;426:4780;-1:-1:-1;1968:15:21;426:4780;;;;;;-1:-1:-1;;426:4780:21;;;;;;;:::i;:::-;;;;;;;;;;;;;;;-1:-1:-1;;426:4780:21;;;;;768:35:20;426:4780:21;;;;;;;;;;;;;-1:-1:-1;;426:4780:21;;;;;;;;;;;;;;;;;;;;;;;;;;3397:17;;;;:::i;:::-;2843:6:20;426:4780:21;2842:7:20;;426:4780:21;;;;2842:7:20;;426:4780:21;;2842:7:20;;426:4780:21;2842:7:20;2838:31;;2897:14;426:4780:21;2883:28:20;;-1:-1:-1;;;;;426:4780:21;;-1:-1:-1;;;;;426:4780:21;;;2883:28:20;:10;:28;;;:44;;;426:4780:21;2879:77:20;;2990:12;2970:32;;2966:66;;1085:3;3046:32;2990:12;;3046:32;:::i;:::-;:53;3042:85;;3164:28;;3206:29;;3202:64;;426:4780:21;;;;;:::i;:::-;;;;;;3280:22:20;:41;3276:75;;3365:49;;;:::i;:::-;:70;3361:104;;3530:56:21;3568:17;;;;:::i;:::-;3530:56;;:::i;:::-;3632:16;3600:100;3601:99;426:4780;3632:16;;;;;;;:::i;:::-;3650;;;;;;;:::i;:::-;3668:17;;;;;;;:::i;:::-;3601:99;;;;:::i;3600:100::-;3596:159;;3887:14;3869:16;3808:157;3869:16;3809:156;3869:16;;:::i;:::-;3937:14;;3918:17;;3903:13;;3887:14;;426:4780;;3887:14;3809:156;:::i;3808:157::-;3804:217;;;;:::i;:::-;3988:22;;;-1:-1:-1;3988:22:21;426:4780;-1:-1:-1;3988:22:21;3596:159;3723:21;;;-1:-1:-1;3723:21:21;426:4780;-1:-1:-1;3723:21:21;3361:104:20;3444:21;;;-1:-1:-1;3444:21:20;426:4780:21;-1:-1:-1;3444:21:20;3276:75;3330:21;;;-1:-1:-1;3330:21:20;426:4780:21;-1:-1:-1;3330:21:20;3202:64;3244:22;;;-1:-1:-1;3244:22:20;426:4780:21;-1:-1:-1;3244:22:20;3042:85;3108:19;;;-1:-1:-1;3108:19:20;426:4780:21;-1:-1:-1;3108:19:20;2966:66;3011:21;;;-1:-1:-1;3011:21:20;426:4780:21;-1:-1:-1;3011:21:20;2879:77;2936:20;;;-1:-1:-1;2936:20:20;426:4780:21;-1:-1:-1;2936:20:20;2883:44;2916:11;2915:12;2916:11;;:::i;2915:12::-;2883:44;;2838:31;2858:11;;;-1:-1:-1;2858:11:20;426:4780:21;-1:-1:-1;2858:11:20;426:4780:21;;;;;;-1:-1:-1;;426:4780:21;;;;;;1444:18:20;426:4780:21;;;;;;;;;;;;;;;;;;-1:-1:-1;;426:4780:21;;;;;1367:34:20;426:4780:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;:::i;:::-;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;1846:1:25;426:4780:21;;;;;;;:::o;:::-;;:::i;:::-;1984:1:23;426:4780:21;;;1984:1:23;426:4780:21;;;:::o;:::-;;;;;;;;;;:::o;2519:133:20:-;2584:17;426:4780:21;2584:21:20;;;:61;;;;2577:68;2519:133;:::o;2584:61::-;2609:15;;;:36;;2519:133;:::o;426:4780:21:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;5203:157:20:-;426:4780:21;5261:6:20;426:4780:21;;;;5260:7:20;5256:31;;5315:15;-1:-1:-1;;;;;426:4780:21;5301:10:20;:29;5297:56;;5203:157::o;3533:184::-;3585:11;;:::i;:::-;3581:36;;-1:-1:-1;;;;;426:4780:21;;3628:27:20;426:4780:21;;3628:27:20;426:4780:21;3653:1:20;3665:14;426:4780:21;3653:1:20;3689:21;426:4780:21;3533:184:20:o;3581:36::-;3605:12;;;;;;;;5438:139;5527:20;426:4780:21;5550:20:20;426:4780:21;;;;;;;;5438:139:20;:::o;3797:259::-;3850:17;426:4780:21;3850:21:20;;;:60;;;;3797:259;3846:204;;;3797:259::o;3846:204::-;3949:10;426:4780:21;-1:-1:-1;426:4780:21;;;;;;;;;-1:-1:-1;426:4780:21;3973:33:20;426:4780:21;;;;;;;;;3973:33:20;426:4780:21;3973:33:20;;:::i;:::-;3797:259::o;3850:60::-;3875:15;;;:35;3850:60;;;4115:318;4200:6;426:4780:21;;;;;;4199:7:20;4195:31;;426:4780:21;;4236:55:20;;4305:11;;:::i;:::-;4301:47;;-1:-1:-1;426:4780:21;;;-1:-1:-1;4358:68:20;;4115:318::o;4358:68::-;4408:18;;;-1:-1:-1;4408:18:20;;-1:-1:-1;4408:18:20;4301:47;4325:23;;;-1:-1:-1;4325:23:20;;-1:-1:-1;4325:23:20;4236:55;4268:23;;;-1:-1:-1;4268:23:20;;-1:-1:-1;4268:23:20;4479:187;4558:10;-1:-1:-1;;;;;426:4780:21;;4541:27:20;426:4780:21;;;4541:27:20;426:4780:21;4616:9:20;4598:15;426:4780:21;4598:15:20;;426:4780:21;;;4578:47:20;426:4780:21;4635:24:20;426:4780:21;4479:187:20:o;426:4780:21:-;-1:-1:-1;;426:4780:21;;;;;;;;:::o;:::-;-1:-1:-1;;426:4780:21;;;;;;;;:::o;:::-;;;;;;;;;;:::o;:::-;;;;;;;;-1:-1:-1;;426:4780:21;;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;-1:-1:-1;426:4780:21;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;:::o;:::-;;:::i;:::-;;;;;;;;;:::o;3172:769:19:-;;3288:33;;;;:::i;:::-;3492:13;3504:1;3507:5;3511:1;3507:5;;;;-1:-1:-1;;;;426:4780:21;-1:-1:-1;;;;;;426:4780:21;3693:19:19;;426:4780:21;;3693:19:19;;:::i;:::-;;426:4780:21;3693:27:19;3689:60;;426:4780:21;;;;;;;3811:94:19;426:4780:21;3811:94:19;;;3172:769::o;3689:60::-;3729:20;;;3504:1;3729:20;;3504:1;3729:20;3492:13;3538:28;;426:4780:21;3538:28:19;;;;:::i;:::-;426:4780:21;;3492:13:19;;720:484:23;426:4780:21;;720:484:23;;;;1148:49;720:484;;426:4780:21;;;:::i;:::-;;;;;:::i;:::-;1148:49:23;;:::i;:::-;720:484;:::o;426:4780:21:-;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;:::o;1168:1511:25:-;;;;;;;1416:1;1476:21;;;;;:52;;;1168:1511;1472:123;;1168:1511;1641:25;1647:18;;;1669:4;1647:18;426:4780:21;1647:18:25;;:::i;:::-;;-1:-1:-1;;;;;;426:4780:21;;;1647:18:25;426:4780:21;;;;1641:25:25;426:4780:21;1641:32:25;1637:57;;1714:18;;1737:4;426:4780:21;1708:25:25;1714:18;;;;;;;:::i;1708:25::-;426:4780:21;1708:33:25;1737:4;;1767:38;1772:32;:25;1778:18;;;1757:48;1778:18;1757:48;1778:18;;:::i;1772:25::-;:32;:::i;:::-;1767:38;:::i;:::-;426:4780:21;;;;1757:48:25;;;:::i;:::-;1937:13;;1416:1;1952:5;1956:1;1952:5;;;;2129:18;2123:25;2129:18;;;1669:4;2129:18;2123:32;2129:18;;:::i;2123:32::-;;2119:57;;2196:18;;1737:4;2190:33;:25;2196:18;;;;;;;:::i;2190:33::-;;1737:4;;2249:38;2254:32;:25;2260:18;;;2239:48;2260:18;2239:48;2260:18;;:::i;2239:48::-;2186:154;;1416:1;2384:155;2404:12;;;;;;2591:81;;;;;;:::i;2389:13::-;2442:27;;;426:4780:21;2442:27:25;;;;:::i;:::-;426:4780:21;;2389:13:25;;;2186:154;2318:11;;;;;:::i;:::-;2186:154;;;2119:57;1682:12;;;1416:1;2164:12;;1416:1;2164:12;1937:13;1983:27;426:4780:21;1983:27:25;;;;:::i;:::-;426:4780:21;;1937:13:25;;;;;1704:154;1836:11;;;;;:::i;:::-;1704:154;;1472:123;-1:-1:-1;1554:1:25;;-1:-1:-1;1544:11:25;;-1:-1:-1;1544:11:25;1472:123;;1476:52;1507:13;1524:4;426:4780:21;1501:20:25;1507:13;;;;;:::i;1501:20::-;426:4780:21;1501:27:25;1476:52;;4053:490:21;4108:18;;:::i;:::-;4155:14;426:4780;-1:-1:-1;;;;;426:4780:21;4136:33;-1:-1:-1;;;;;426:4780:21;;4765:27:20;426:4780:21;;4765:27:20;426:4780:21;4790:1:20;4802:14;426:4780:21;4790:1:20;4826:21;426:4780:21;;;4857:14:20;426:4780:21;;4857:14:20;426:4780:21;4790:1:20;426:4780:21;;4790:1:20;426:4780:21;;4717:228:20;4136:33:21;4236:13;4253:8;4236:25;4253:8;;426:4780;;-1:-1:-1;;;4341:44:21;;-1:-1:-1;;;;;426:4780:21;;;4341:44;;;426:4780;;;;;;;;4341:44;426:4780;;;;;4341:44;426:4780;-1:-1:-1;4348:13:21;-1:-1:-1;;;;;426:4780:21;4341:44;;;;;;;-1:-1:-1;4341:44:21;;;4232:253;4331:54;4232:253;4498:8;4494:42;;4053:490::o;4341:44::-;;;;;;;;;;;;;;:::i;:::-;;;;4232:253;426:4780;;-1:-1:-1;;;4426:48:21;;-1:-1:-1;;;;;426:4780:21;;;4426:48;;;426:4780;;;;;;;;4426:48;426:4780;;;;;4426:48;426:4780;-1:-1:-1;4433:13:21;-1:-1:-1;;;;;426:4780:21;4426:48;;;;;;;-1:-1:-1;4426:48:21;;;4232:253;4416:58;4232:253;;4426:48;;;;;;;;;;;;;;:::i;:::-;;;;426:4780;;;;;;;;;:::o;:::-;;;;;;;;;;;;;:::o;2102:899:19:-;;;2217:33;;;;:::i;:::-;2452:13;2464:1;2467:5;2471:1;2467:5;;;;2665:42;;;;;:::i;:::-;-1:-1:-1;2754:23:19;2464:1;;2792:13;426:4780:21;;2807:19:19;;;;;426:4780:21;2884:11:19;;;;;:::i;:::-;426:4780:21;;;2857:39:19;2471:1;426:4780:21;2857:39:19;426:4780:21;;2792:13:19;;;2807:19;;-1:-1:-1;;2102:899:19:o;2452:13::-;2498:28;;426:4780:21;2498:28:19;;;;:::i;:::-;426:4780:21;;2452:13:19;;804:1134;920:1;-1:-1:-1;;;;;;;;;974:19:19;;;;;:::i;:::-;426:4780:21;974:26:19;970:55;;-1:-1:-1;;;;;;;;;1039:19:19;;;;;:::i;:::-;426:4780:21;1039:27:19;426:4780:21;;1103:19:19;1082:49;1092:39;1097:33;:26;1103:19;;1082:49;1103:19;;;;:::i;1082:49::-;1035:149;;1287:5;1270:13;:22;:48;;;;1035:149;1266:642;;1035:149;1918:13;;;804:1134;:::o;1266:642::-;920:1;1446:5;1450:1;1446:5;;;;-1:-1:-1;;;;1668:26:19;:19;;;;;;:::i;:::-;-1:-1:-1;;;;;;426:4780:21;;;1668:26:19;;1664:55;;-1:-1:-1;;;1737:27:19;:19;;;;;;:::i;:27::-;;426:4780:21;;1794:39:19;1799:33;:26;1805:19;;;1784:49;1805:19;1784:49;1805:19;;:::i;1784:49::-;1266:642;;;;1733:165;1872:11;;;;;:::i;:::-;1733:165;;1664:55;1009:16;;;920:1;1703:16;;920:1;1703:16;1431:13;1481:28;;426:4780:21;1481:28:19;;;;:::i;:::-;426:4780:21;;1431:13:19;;1270:48;:13;1313:5;1270:13;1296:22;1270:48;;1035:149;1162:11;1554:1:25;1035:149:19;;;541:1316:24;;;642:21;;;;638:56;;720:19;726:12;;;;;;:::i;720:19::-;426:4780:21;;;;763:4:24;754:13;;763:4;;;817:10;;;;;;;:::i;750:1101::-;848:13;;;857:4;848:13;;857:4;;;912:10;;:28;:10;;926:13;912:10;:28;:10;;:::i;:::-;926:13;;:::i;844:1007::-;961:13;;;970:4;961:13;;970:4;;;1039:13;;1017:35;1039:13;;;;;:::i;1017:35::-;1066:18;426:4780:21;1103:13:24;426:4780:21;1098:194:24;1118:15;;;;;;1312:10;;;:33;:10;;;:24;:10;;:::i;:::-;:24;:::i;1103:13::-;1164:11;;;;1199:1;1164:11;426:4780:21;;;;1164:11:24;1163:43;1179:27;1185:20;;1190:14;:10;;;;:::i;:14::-;1185:20;;;:::i;1163:43::-;;426:4780:21;;1103:13:24;;;;957:894;1366:13;;;1375:4;-1:-1:-1;1375:4:24;;;1428:10;:28;:10;;1442:13;1428:10;:28;:10;;:::i;:::-;1442:13;;:::i;1362:489::-;1534:13;;;1512:35;1534:13;;:::i;1512:35::-;1561:18;426:4780:21;1598:13:24;426:4780:21;1593:194:24;1613:15;;;;;;1807:10;;;:33;:10;;;:24;:10;;:::i;1598:13::-;1659:11;;;;1694:1;1659:11;426:4780:21;;;;1659:11:24;1658:43;1674:27;1680:20;;1685:14;:10;;;;:::i;1658:43::-;;426:4780:21;;1598:13:24;;;;638:56;672:22;;;426:4780:21;672:22:24;;426:4780:21;672:22:24;1567:2467:23;;;;;;;-1:-1:-1;;;;;;;;;1809:13:23;;1567:2467;;1809:13;:::i;:::-;426:4780:21;1809:20:23;1805:50;;-1:-1:-1;;;;;;;;;1870:13:23;;;;;:::i;:::-;426:4780:21;1870:21:23;426:4780:21;;1984:15:23;1907:49;1929:27;:20;1935:13;;;;;:::i;1907:49::-;1984:15;:::i;:::-;1866:190;;;;2102:33;426:4780:21;2184:31:23;;;;;;4015:12;;;;;;;426:4780:21;1567:2467:23;:::o;2177:1828::-;2368:25;2321:33;426:4780:21;;;;;;:::i;:::-;2321:33:23;:::i;:::-;2368:25;;;:::i;:::-;426:4780:21;;;;;;2465:15:23;:30;2461:81;;-1:-1:-1;;;2641:15:23;:7;;;;:::i;:::-;426:4780:21;-1:-1:-1;;;;;;426:4780:21;;;2641:15:23;;426:4780:21;;2676:14:23;;;2689:1;-1:-1:-1;;;2712:15:23;:7;;;;:::i;:15::-;;;2708:97;;2637:1358;2839:32;;;;:::i;:::-;2903:2;2894:11;;2903:2;;3044:58;;;;:::i;:::-;3129:8;;;3125:26;;3177:21;;3173:38;;3280:21;2890:1040;;2177:1828;;;;;;3173:38;3200:11;;;;;;;2689:1;3200:11;:::o;3125:26::-;3139:12;;;;;;;426:4780:21;3139:12:23;:::o;2890:1040::-;3330:10;;-1:-1:-1;3339:1:23;3330:10;3339:1;;-1:-1:-1;3339:1:23;;3490:67;;;;;;:::i;:::-;3584:8;;;3580:75;;3680:21;;3676:87;;3831:21;3326:604;2890:1040;;3326:604;3899:12;;;;;;;;426:4780:21;3899:12:23;:::o;2708:97::-;2771:7;2751:35;;2765:21;:14;2771:7;;;;:::i;2751:35::-;2708:97;;1866:190;2044:1;1866:190;;;;;1805:50;1838:17;;;426:4780:21;1838:17:23;;426:4780:21;1838:17:23;3040:1120:25;;;;;;3265:26;3389:4;426:4780:21;3361:25:25;3367:18;;;;;;:::i;3361:25::-;426:4780:21;3361:32:25;3357:57;;3457:4;426:4780:21;3428:25:25;3434:18;;;;;;:::i;3428:25::-;426:4780:21;3428:33:25;3457:4;;3498:18;;3477:48;3487:38;3492:32;:25;3498:18;;3477:48;3498:18;;;;:::i;3477:48::-;3696:39;;;;;:::i;:::-;426:4780:21;;3769:2:25;426:4780:21;;3749:22:25;3745:51;;3769:2;3867:69;;-1:-1:-1;;;;;426:4780:21;;;;;3949:24:25;3945:57;;4084:69;4012:17;;;;:::i;:::-;4084:69;;:::i;3945:57::-;3982:20;;;-1:-1:-1;3982:20:25;;-1:-1:-1;3982:20:25;3745:51;3780:16;;;;;;;;3424:154;3556:11;;;;:::i;:::-;3424:154;;5001:139:20;5078:10;426:4780:21;-1:-1:-1;426:4780:21;;;;;;;;5113:20:20;426:4780:21;;;;;;;;5001:139:20;:::o;426:4780:21:-;;;;;;;;;;;:::i;:::-;4560:1:19;426:4780:21;;;-1:-1:-1;;426:4780:21;;;;;;:::o;:::-;;;;;;;;;;;:::i;:::-;4745:2:25;426:4780:21;;;-1:-1:-1;;426:4780:21;;;;;;:::o;:::-;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;;;;:::i;:::-;;;;;;;;:::o;4204:1558:19:-;4373:21;;;;4369:56;;4451:19;4457:12;;;;;;:::i;4451:19::-;426:4780:21;;;;4494:4:19;4485:13;;4494:4;;;4550:12;;;;;;:::i;:::-;426:4780:21;;;-1:-1:-1;;;;;;426:4780:21;;4576:26:19;;426:4780:21;4576:26:19;:::i;:::-;;4616:18;4560:1;4616:18;:::o;4481:1275::-;4664:4;4655:13;;;;;;;;4651:1105;4664:4;;;4733:13;;4712:34;4733:13;;:::i;4712:34::-;4769:21;;;;:::i;:::-;4809:13;426:4780:21;4824:14:19;;;;;;5006;;;;;;;:::i;4809:13::-;4876:10;4871:20;;4876:14;4885:1;4876:10;;;;:::i;:14::-;4871:20;;;:::i;:::-;426:4780:21;4859:32:19;;;;;:::i;:::-;;426:4780:21;4809:13:19;;4651:1105;5051:4;-1:-1:-1;5051:4:19;;;5120:13;5098:35;5120:13;;:::i;5098:35::-;5147:22;426:4780:21;5188:13:19;426:4780:21;5203:15:19;;;;;;5407:21;;;;:::i;:::-;5447:13;426:4780:21;5462:14:19;;;;;;5658:15;;;;;;:28;:15;;:::i;5447:13::-;5514:10;5509:34;;5514:28;5292:1;5514:10;:24;:10;;;;:::i;5509:34::-;426:4780:21;5497:46:19;;;;;:::i;:::-;;426:4780:21;5447:13:19;;5188;5253:15;5292:1;;426:4780:21;;5252:47:19;5272:27;5278:20;;5283:14;:10;;;;:::i;:14::-;5278:20;;;:::i;5252:47::-;;426:4780:21;;5188:13:19;;5038:718;5725:20;;;426:4780:21;5725:20:19;;426:4780:21;5725:20:19;2143:1860:24;426:4780:21;;2257:21:24;;;2253:56;;2335:19;2341:12;;;;;:::i;2335:19::-;426:4780:21;;;;2378:4:24;2369:13;;2378:4;;;2447:12;;;;;:::i;2365:1632::-;2552:13;;;;;2561:4;2552:13;;2561:4;;;2626:13;;2609:30;2626:13;;:::i;2609:30::-;2675:17;;;;:::i;:::-;2711:13;426:4780:21;2726:10:24;;;;;;2904;;;;;;:::i;2711:13::-;2774:10;2769:20;;2774:14;2783:1;2774:10;;;;:::i;:14::-;2769:20;;:::i;:::-;426:4780:21;2757:32:24;;;;;:::i;:::-;;426:4780:21;2711:13:24;;2548:1449;2945:4;-1:-1:-1;2945:4:24;;;3014:13;2992:35;3014:13;;:::i;2992:35::-;426:4780:21;3078:13:24;426:4780:21;3093:15:24;;;;;;3302:17;;;;:::i;:::-;3338:13;426:4780:21;3353:10:24;;;;;;3545:15;;;;;:24;:15;;:::i;3338:13::-;3401:10;3396:34;;3401:28;3174:1;3401:10;:24;:10;;;;:::i;3396:34::-;426:4780:21;3384:46:24;;;;;:::i;:::-;;426:4780:21;3338:13:24;;3078;3139:11;3174:1;;426:4780:21;;3138:43:24;3154:27;3160:20;;3165:14;:10;;;;:::i;:14::-;3160:20;;:::i;3138:43::-;;426:4780:21;;3078:13:24;;2932:1065;3676:27;;;;;;:::i;:::-;3739:22;;;;:::i;:::-;3780:13;426:4780:21;3795:15:24;;;;;;3958:28;;;;;:::o;3780:13::-;3848:10;3843:16;;3848:10;426:4780:21;3848:10:24;;;:::i;3843:16::-;426:4780:21;3831:28:24;;;;;:::i;:::-;;426:4780:21;3780:13:24;;4233:351:23;4392:1;;4233:351;4403:153;426:4780:21;;4410:20:23;;;;;4456:26;;;;:::i;:::-;426:4780:21;;;;;;;;4446:36:23;426:4780:21;;4403:153:23;;;4410:20;;;4233:351::o;426:4780:21:-;;;;;;;;;7928:1:23;426:4780:21;;;;;;;:::o;7310:1816:23:-;;;;;7616:26;;;;:::i;:::-;7673:9;;7740:26;7686:4;7667:16;7673:9;;;;:::i;7667:16::-;:23;7666:30;;7740:26;;:::i;:::-;7777:1343;;;;;;426:4780:21;7885:26:23;426:4780:21;;7885:26:23;;:::i;:::-;7915:14;426:4780:21;;7915:14:23;:::i;:::-;7885:44;7881:546;;7777:1343;8441:29;;;;;;;7680:1;8441:29;7680:1;8441:29;7680:1;8441:29;:::o;7881:546::-;7949:22;;7967:4;426:4780:21;;;7989:114:23;;7881:546;8121:292;;;;;7881:546;;;;8121:292;8187:38;8202:22;;;;:::i;:::-;8187:38;;:::i;:::-;426:4780:21;7686:4:23;426:4780:21;;;;8251:20:23;426:4780:21;7686:4:23;426:4780:21;;;;8275:16:23;8251:40;8247:148;;8121:292;;;;;;8247:148;8333:26;426:4780:21;;8333:26:23;;:::i;:::-;7967:4;;7680:1;;8319:53::o;7989:114::-;8048:36;;;;:::i;:::-;7989:114;;;;;7777:1343;8535:37;8536:36;;;;;;;;:::i;8535:37::-;8531:105;;8676:38;8691:22;;;;:::i;8676:38::-;8728:12;;426:4780:21;;7686:4:23;8758:20;;8754:294;7686:4;;;8798:80;7686:4;9076:26;8798:80;;;8754:294;;426:4780:21;9076:26:23;;:::i;:::-;9062:47;9070:4;9062:47;;;:::o;8754:294::-;8902:18;;;;7686:4;9076:26;426:4780:21;;8947:18:23;8898:150;8754:294;;8898:150;9004:29;;;;7680:1;9004:29;7680:1;9004:29;7680:1;9004:29;:::o;8531:105::-;8592:29;;;;;7680:1;8592:29;7680:1;8592:29;7680:1;8592:29;:::o;5044:1795::-;;;;;5315:14;426:4780:21;;5315:14:23;:::i;:::-;5302:27;;;5298:630;;5998:13;5994:18;;5988:25;5998:13;;;426:4780:21;;;;5998:13:23;5994:18;;:::i;5988:25::-;426:4780:21;;;6027:13:23;;426:4780:21;;;;6023:122:23;;6244:13;-1:-1:-1;6239:165:23;6259:10;426:4780:21;;;6259:10:23;;;;6441:28;;;;;:::i;:::-;426:4780:21;;;6483:20:23;;6479:96;;6812:13;;6630:2;6611:21;;6630:2;;;6648:73;;;;6607:181;6812:13;:::i;6607:181::-;6630:2;426:4780:21;6758:19:23;6607:181;6812:13;:::i;6479:96::-;6519:29;;;-1:-1:-1;6519:29:23;-1:-1:-1;6519:29:23;-1:-1:-1;6519:29:23;:::o;6244:13::-;6302:32;;426:4780:21;6286:48:23;6302:32;;426:4780:21;6302:32:23;;;:::i;6286:48::-;426:4780:21;;;;6244:13:23;;-1:-1:-1;6244:13:23;;6023:122;6130:4;6121:13;6023:122;;;5298:630;5401:32;;;;;;-1:-1:-1;5447:179:23;5467:6;5471:2;5467:6;;;;5667:27;;;;:::i;:::-;426:4780:21;;;;;;5712:20:23;426:4780:21;;;;;;5736:16:23;5712:40;5708:210;5736:16;;;426:4780:21;5772:36:23;;-1:-1:-1;5772:36:23;:::o;5708:210::-;-1:-1:-1;;;;;;;5874:29:23:o;5452:13::-;5509:31;5494:46;5509:31;;426:4780:21;5509:31:23;;;:::i;5494:46::-;426:4780:21;;5452:13:23;;;;4375:655:25;;;;4542:21;;;;4538:46;;4654:4;426:4780:21;4610:19:25;4616:12;;;;;;:::i;4610:19::-;426:4780:21;4644:14:25;4654:4;;4735:13;;:::i;:::-;4767;4779:1;4782:6;4745:2;4782:6;;;;4940:19;;;;;4956:2;4940:19;:::o;4767:13::-;4826:10;4821:20;;4826:14;4835:1;4826:10;;;;:::i;4821:20::-;4779:1;4809:32;;;;;:::i;:::-;;426:4780:21;4767:13:25;;5347:1653;;;5547:29;5649:4;426:4780:21;5621:25:25;5627:18;;;;;;:::i;5621:25::-;426:4780:21;5621:32:25;5617:57;;5717:4;426:4780:21;5688:25:25;5694:18;;;;;;:::i;5688:25::-;426:4780:21;5688:33:25;5717:4;;5758:18;5737:48;5747:38;5752:32;:25;5758:18;;5737:48;5758:18;;;;:::i;5737:48::-;767:66;5914:33;;;;;:::i;:::-;5961:30;5957:64;;6305:27;6250:33;6193:27;6104;6297:36;6104:27;;;;:::i;:::-;6193;;;:::i;:::-;6250:33;;;:::i;6297:36::-;-1:-1:-1;;;;;426:4780:21;;;;;6297:49:25;6293:81;;6446:33;6545:36;6446:33;;;;:::i;:::-;6545:36;;:::i;:::-;426:4780:21;;6665:2:25;426:4780:21;;6646:21:25;6642:46;;-1:-1:-1;;;6734:13:25;426:4780:21;;6749:20:25;;;;;426:4780:21;;;;6798:38:25;6817:19;6823:12;;;;;:::i;6798:38::-;;426:4780:21;;6734:13:25;;;6749:20;;;;;6919:27;6915:56;;426:4780:21;5347:1653:25;:::o;6915:56::-;6955:16;;;-1:-1:-1;6955:16:25;;-1:-1:-1;6955:16:25;6293:81;6355:19;;;-1:-1:-1;6355:19:25;;-1:-1:-1;6355:19:25;5957:64;6000:21;;;;;;;;5684:154;5816:11;;;;:::i;:::-;5684:154;;4217:1141:24;;426:4780:21;;4321:21:24;;;4317:56;;4399:19;4405:12;;;;;:::i;4399:19::-;426:4780:21;;;;4442:4:24;4433:13;;4442:4;;;4462:8;;;;4469:1;4462:8;:::o;4429:923::-;4500:4;4491:13;;4500:4;;;4532:13;;;4527:19;4532:13;4520:26;4532:13;;:::i;4487:865::-;4576:4;4567:13;;4576:4;;;4618:13;;;4596:35;4618:13;;:::i;4596:35::-;4645:18;426:4780:21;4682:13:24;426:4780:21;4677:194:24;4697:15;;;;;;4891;;;;;:24;:15;;:::i;4682:13::-;4743:11;;;;4778:1;4743:11;426:4780:21;;;;4743:11:24;4742:43;4758:27;4764:20;;4769:14;:10;;;;:::i;:14::-;4764:20;;:::i;4742:43::-;;426:4780:21;;4682:13:24;;;;4563:789;4945:4;-1:-1:-1;4945:4:24;;;4977:13;;4972:19;4977:13;4965:26;4977:13;;:::i;4932:420::-;5044:13;;5022:35;5044:13;;:::i;5022:35::-;5071:18;426:4780:21;5108:13:24;426:4780:21;5103:194:24;5123:15;;;;;;5317;;;;;:24;:15;;:::i;5108:13::-;5169:11;;;;5204:1;5169:11;426:4780:21;;;;5169:11:24;5168:43;5184:27;5190:20;;5195:14;:10;;;;:::i;5168:43::-;;426:4780:21;;5108:13:24;;;;9295:1058:23;;426:4780:21;;9395:19:23;9391:39;;9459:17;9465:10;;;;:::i;9459:17::-;9512:4;9500:16;;9499:23;9512:4;;9596:33;9606:22;:18;426:4780:21;;9606:18:23;:::i;:::-;:22;:::i;:::-;9596:33;:::i;:::-;426:4780:21;;;-1:-1:-1;;;426:4780:21;9413:1:23;9643:36;;426:4780:21;9643:36:23;:::i;:::-;;9627:1;9698:13;426:4780:21;;9713:18:23;;;;;9785:10;9772:30;9779:22;:17;9785:10;;9627:1;9785:10;;;:::i;9779:17::-;426:4780:21;;;;;;9779:22:23;426:4780:21;;-1:-1:-1;;;;;;426:4780:21;;;9772:30:23;9752:50;9759:9;:5;;;:::i;:9::-;9752:50;9413:1;9752:50;;;;:::i;:::-;;9836:32;9674:4;9843:17;9849:10;;;;;:::i;9843:17::-;:24;426:4780:21;;-1:-1:-1;;;;;;426:4780:21;;;9836:32:23;9820:48;9827:5;;;:::i;9820:48::-;;426:4780:21;9698:13:23;;9713:18;-1:-1:-1;9713:18:23;-1:-1:-1;9295:1058:23:o;9562:761::-;426:4780:21;9993:33:23;10003:22;:18;426:4780:21;;10003:18:23;:::i;:::-;:22;:::i;9993:33::-;10057:1;10045:13;426:4780:21;;10060:18:23;;;;;10134:10;10121:30;10128:22;:17;10134:10;;10057:1;10134:10;;;:::i;10121:30::-;10099:52;10106:11;10107:5;;;:::i;:::-;10106:11;:::i;10099:52::-;;10195:32;10222:4;10202:17;10208:10;;;;;:::i;10195:32::-;10169:58;10176:15;:11;10177:5;;;:::i;10176:11::-;:15;:::i;10169:58::-;;426:4780:21;10045:13:23;;10590:651;;;;10709:23;426:4780:21;;10709:23:23;;:::i;:::-;10735:14;426:4780:21;;10735:14:23;:::i;:::-;-1:-1:-1;10705:58:23;;-1:-1:-1;10779:13:23;426:4780:21;;10794:18:23;;;;;10862:16;10863:10;;;;:::i;:::-;426:4780:21;;;;10862:16:23;10863:10;;10915:33;:28;10921:21;;10925:16;10926:10;;;;:::i;:::-;426:4780:21;;;;10925:16:23;10921:21;;:::i;10915:33::-;426:4780:21;11067:30:23;11080:17;11086:10;;;;;:::i;11067:30::-;426:4780:21;;11067:30:23;11063:81;;426:4780:21;;10779:13:23;;11063:81;11117:12;;;;-1:-1:-1;11117:12:23;:::o;10858:191::-;11030:4;10999:28;11005:21;;11009:16;11010:10;;;;:::i;10999:28::-;:35;10858:191;;10794:18;;;;;426:4780:21;10590:651:23;:::o;10705:58::-;10751:12;;;-1:-1:-1;10751:12:23;:::o;5563:305:24:-;;;-1:-1:-1;;;426:4780:21;-1:-1:-1;;;;;;426:4780:21;5670:12:24;;5563:305;;;5670:12;:::i;:::-;;426:4780:21;5670:20:24;5666:50;;5750:89;;;;;5563:305::o;5666:50::-;5699:17;;;-1:-1:-1;5699:17:24;;-1:-1:-1;5699:17:24;7210:1543:25;7374:21;;;;7370:46;;7442:19;7448:12;;;;;;:::i;7442:19::-;426:4780:21;;;;7485:4:25;7476:13;;7485:4;;;7541:12;;;;;;:::i;7472:1275::-;7655:4;7646:13;;;;;;;;7642:1105;7655:4;;;7724:13;;7703:34;7724:13;;:::i;7703:34::-;7760:21;;;;:::i;:::-;7800:13;426:4780:21;7815:14:25;;;;;;7997;;;;;;;:::i;7800:13::-;7867:10;7862:20;;7867:14;7876:1;7867:10;;;;:::i;7862:20::-;426:4780:21;7850:32:25;;;;;:::i;:::-;;426:4780:21;7800:13:25;;7642:1105;8042:4;-1:-1:-1;8042:4:25;;;8111:13;8089:35;8111:13;;:::i;8089:35::-;8138:22;426:4780:21;8179:13:25;426:4780:21;8194:15:25;;;;;;8398:21;;;;:::i;:::-;8438:13;426:4780:21;8453:14:25;;;;;;8649:15;;;;;;:28;:15;;:::i;8438:13::-;8505:10;8500:34;;8505:28;8283:1;8505:10;:24;:10;;;;:::i;8500:34::-;426:4780:21;8488:46:25;;;;;:::i;:::-;;426:4780:21;8438:13:25;;8179;8244:15;8283:1;;426:4780:21;;8243:47:25;8263:27;8269:20;;8274:14;:10;;;;:::i;8243:47::-;;426:4780:21;;8179:13:25;;8029:718;8716:20;;;426:4780:21;8716:20:25;;426:4780:21;8716:20:25","linkReferences":{},"immutableReferences":{"40450":[{"start":358,"length":32},{"start":1018,"length":32},{"start":1383,"length":32},{"start":2663,"length":32}],"40458":[{"start":1100,"length":32},{"start":2106,"length":32}],"40460":[{"start":498,"length":32},{"start":2072,"length":32}],"40874":[{"start":709,"length":32},{"start":896,"length":32},{"start":1262,"length":32},{"start":1544,"length":32},{"start":2140,"length":32},{"start":3941,"length":32},{"start":4087,"length":32}]}},"methodIdentifiers":{"MAX_BLOCK_LOOKBACK()":"3d2691bc","bond(uint256)":"9940686e","bondAmount()":"80f323a7","bondedExecutor()":"1aa7c0ec","cancellationRequest()":"308657d7","collect((bytes,bytes,bytes,bytes,uint256),uint256)":"ede7f6a3","currentPaymentAmount()":"8bd03d0a","currentRewardAmount()":"5a4fd645","executionDeadline()":"33ee5f35","expectedAmount()":"2feef2ec","expectedRecipient()":"8677ab23","fund(uint256,uint256)":"a65e2cfd","funded()":"f3a504f2","is_bonded()":"cb766a56","originalRewardAmount()":"d415b3f9","requestCancellation()":"81972d00","resume()":"046f7da2","tokenContract()":"55a373d6","totalBondsDeposited()":"fe03a460","withdraw()":"3ccfd60b"},"rawMetadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_tokenContract\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_expectedRecipient\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_expectedAmount\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_currentRewardAmount\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_currentPaymentAmount\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"AlreadyFunded\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"AmountMismatch\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"BlockHashUnavailable\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"BlockHeaderMismatch\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"BlockNumberMismatch\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"BondActive\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"CancellationRequested\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ExecutorAlreadyBonded\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ExpectedBytes32\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ExpectedRLPList\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ExpectedStringData\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ExpectedStringItem\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InsufficientBond\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidAddress\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidRLP\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidRLPEncoding\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidRLPList\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidReceiptProof\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidTransferEvent\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"NoWithdrawableFunds\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"NotFunded\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OnlyBondedExecutor\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OnlyDeployer\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"RLPOffsetOutOfBounds\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"RLPOffsetOutOfBounds\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"TargetBlockInFuture\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"TargetBlockTooOld\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ToAddressMismatch\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"TokenTransferFailed\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"WrongEventSignature\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"WrongTokenContract\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ZeroAddress\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ZeroPaymentAmount\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ZeroRewardAmount\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"MAX_BLOCK_LOOKBACK\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_bondAmount\",\"type\":\"uint256\"}],\"name\":\"bond\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"bondAmount\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"bondedExecutor\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"cancellationRequest\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes\",\"name\":\"blockHeader\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"receiptRlp\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"proofNodes\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"receiptPath\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"logIndex\",\"type\":\"uint256\"}],\"internalType\":\"struct EscrowERC20.ReceiptProof\",\"name\":\"proof\",\"type\":\"tuple\"},{\"internalType\":\"uint256\",\"name\":\"targetBlockNumber\",\"type\":\"uint256\"}],\"name\":\"collect\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"currentPaymentAmount\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"currentRewardAmount\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"executionDeadline\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"expectedAmount\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"expectedRecipient\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_currentRewardAmount\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_currentPaymentAmount\",\"type\":\"uint256\"}],\"name\":\"fund\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"funded\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"is_bonded\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"originalRewardAmount\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"requestCancellation\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"resume\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"tokenContract\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"totalBondsDeposited\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"withdraw\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"src/EscrowERC20.sol\":\"EscrowERC20\"},\"evmVersion\":\"prague\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[\":forge-std/=lib/forge-std/src/\"],\"viaIR\":true},\"sources\":{\"src/BlockHeaderParser.sol\":{\"keccak256\":\"0x10923e70f1bcc22107b31b5bd580dc0e58fb634dfc07baefb34609e3a3c3cee7\",\"license\":\"UNLICENSED\",\"urls\":[\"bzz-raw://2b3ba3998470d6c0aaf7906d21d8787dfbdded50a4683c89915295b2c2fe0ea5\",\"dweb:/ipfs/QmRiFmEeNN2HgXzabtyMVsVUBUCTrknW7ZiKTdajyQSscp\"]},\"src/EscrowBase.sol\":{\"keccak256\":\"0x53fd262562c9dbc7779339bafbeca6b86b690aec7ac864e30c57e0e42288a11d\",\"license\":\"UNLICENSED\",\"urls\":[\"bzz-raw://cb43380f5b0a131e1ac4405a43a67b9d2b07718eb05ba675fe46c106b8a12649\",\"dweb:/ipfs/QmNk5QkryXnDspEGc8mdyFYJSRXWRSP8V6yirLC98EKZYG\"]},\"src/EscrowERC20.sol\":{\"keccak256\":\"0xa89659e0421fe81fdfeccaaf40ba35578a6fb702a5599fe9a480eb7a2f85854d\",\"license\":\"UNLICENSED\",\"urls\":[\"bzz-raw://72ca9d806f4b8e56594d971dc4064c0819bf605543c3d88d997ecb16526b094c\",\"dweb:/ipfs/QmTccPEBt3CruNEFZfGpHB2weSnN4Fe2Nc88pvdc4wtxw4\"]},\"src/MPTVerifier.sol\":{\"keccak256\":\"0xf71ff6fc0fa054681fc67b7ca3c187141749b04895defd977d6989271b35ebeb\",\"license\":\"UNLICENSED\",\"urls\":[\"bzz-raw://6e2efbdee9d872e22febc5d29894e3759e72ed43850a512c9eed56a9f5e7ff3b\",\"dweb:/ipfs/QmShY9TstL2zXVSYH7ux8D6ByW22ptm7JfiEWy2qs7bHZU\"]},\"src/RLPParser.sol\":{\"keccak256\":\"0x403e6fd0cbf2e3599530d724d26e75b136bd7947e35e1cf5f79b30841b2c4c6c\",\"license\":\"UNLICENSED\",\"urls\":[\"bzz-raw://b24f44c75ae8db00297a940d0badb6b0fd9114b494b1a5c097a04f4bccde5e1d\",\"dweb:/ipfs/QmSoxh5vZu41RzAs8RTLXgQ5cD5pQBeQo68nYSFh4Dk5Xk\"]},\"src/ReceiptValidator.sol\":{\"keccak256\":\"0xd6deda056e80a69708354d192fa2e336841bf2a4d98dfa68eee4c3f550306015\",\"license\":\"UNLICENSED\",\"urls\":[\"bzz-raw://84686c66f4f5b66b3dc0315840aacb037f9fc21c60b6a58b298c6480d9ce0929\",\"dweb:/ipfs/QmSavcuzdBkNUXVyzCa4ysZY1kM7Tmt82wWFq2F3kTvwZo\"]}},\"version\":1}","metadata":{"compiler":{"version":"0.8.30+commit.73712a01"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"address","name":"_tokenContract","type":"address"},{"internalType":"address","name":"_expectedRecipient","type":"address"},{"internalType":"uint256","name":"_expectedAmount","type":"uint256"},{"internalType":"uint256","name":"_currentRewardAmount","type":"uint256"},{"internalType":"uint256","name":"_currentPaymentAmount","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"type":"error","name":"AlreadyFunded"},{"inputs":[],"type":"error","name":"AmountMismatch"},{"inputs":[],"type":"error","name":"BlockHashUnavailable"},{"inputs":[],"type":"error","name":"BlockHeaderMismatch"},{"inputs":[],"type":"error","name":"BlockNumberMismatch"},{"inputs":[],"type":"error","name":"BondActive"},{"inputs":[],"type":"error","name":"CancellationRequested"},{"inputs":[],"type":"error","name":"ExecutorAlreadyBonded"},{"inputs":[],"type":"error","name":"ExpectedBytes32"},{"inputs":[],"type":"error","name":"ExpectedRLPList"},{"inputs":[],"type":"error","name":"ExpectedStringData"},{"inputs":[],"type":"error","name":"ExpectedStringItem"},{"inputs":[],"type":"error","name":"InsufficientBond"},{"inputs":[],"type":"error","name":"InvalidAddress"},{"inputs":[],"type":"error","name":"InvalidRLP"},{"inputs":[],"type":"error","name":"InvalidRLPEncoding"},{"inputs":[],"type":"error","name":"InvalidRLPList"},{"inputs":[],"type":"error","name":"InvalidReceiptProof"},{"inputs":[],"type":"error","name":"InvalidTransferEvent"},{"inputs":[],"type":"error","name":"NoWithdrawableFunds"},{"inputs":[],"type":"error","name":"NotFunded"},{"inputs":[],"type":"error","name":"OnlyBondedExecutor"},{"inputs":[],"type":"error","name":"OnlyDeployer"},{"inputs":[],"type":"error","name":"RLPOffsetOutOfBounds"},{"inputs":[],"type":"error","name":"RLPOffsetOutOfBounds"},{"inputs":[],"type":"error","name":"TargetBlockInFuture"},{"inputs":[],"type":"error","name":"TargetBlockTooOld"},{"inputs":[],"type":"error","name":"ToAddressMismatch"},{"inputs":[],"type":"error","name":"TokenTransferFailed"},{"inputs":[],"type":"error","name":"WrongEventSignature"},{"inputs":[],"type":"error","name":"WrongTokenContract"},{"inputs":[],"type":"error","name":"ZeroAddress"},{"inputs":[],"type":"error","name":"ZeroPaymentAmount"},{"inputs":[],"type":"error","name":"ZeroRewardAmount"},{"inputs":[],"stateMutability":"view","type":"function","name":"MAX_BLOCK_LOOKBACK","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[{"internalType":"uint256","name":"_bondAmount","type":"uint256"}],"stateMutability":"nonpayable","type":"function","name":"bond"},{"inputs":[],"stateMutability":"view","type":"function","name":"bondAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"bondedExecutor","outputs":[{"internalType":"address","name":"","type":"address"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"cancellationRequest","outputs":[{"internalType":"bool","name":"","type":"bool"}]},{"inputs":[{"internalType":"struct EscrowERC20.ReceiptProof","name":"proof","type":"tuple","components":[{"internalType":"bytes","name":"blockHeader","type":"bytes"},{"internalType":"bytes","name":"receiptRlp","type":"bytes"},{"internalType":"bytes","name":"proofNodes","type":"bytes"},{"internalType":"bytes","name":"receiptPath","type":"bytes"},{"internalType":"uint256","name":"logIndex","type":"uint256"}]},{"internalType":"uint256","name":"targetBlockNumber","type":"uint256"}],"stateMutability":"nonpayable","type":"function","name":"collect"},{"inputs":[],"stateMutability":"view","type":"function","name":"currentPaymentAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"currentRewardAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"executionDeadline","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"expectedAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"expectedRecipient","outputs":[{"internalType":"address","name":"","type":"address"}]},{"inputs":[{"internalType":"uint256","name":"_currentRewardAmount","type":"uint256"},{"internalType":"uint256","name":"_currentPaymentAmount","type":"uint256"}],"stateMutability":"nonpayable","type":"function","name":"fund"},{"inputs":[],"stateMutability":"view","type":"function","name":"funded","outputs":[{"internalType":"bool","name":"","type":"bool"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"is_bonded","outputs":[{"internalType":"bool","name":"","type":"bool"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"originalRewardAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[],"stateMutability":"nonpayable","type":"function","name":"requestCancellation"},{"inputs":[],"stateMutability":"nonpayable","type":"function","name":"resume"},{"inputs":[],"stateMutability":"view","type":"function","name":"tokenContract","outputs":[{"internalType":"address","name":"","type":"address"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"totalBondsDeposited","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[],"stateMutability":"nonpayable","type":"function","name":"withdraw"}],"devdoc":{"kind":"dev","methods":{},"version":1},"userdoc":{"kind":"user","methods":{},"version":1}},"settings":{"remappings":["forge-std/=lib/forge-std/src/"],"optimizer":{"enabled":true,"runs":200},"metadata":{"bytecodeHash":"ipfs"},"compilationTarget":{"src/EscrowERC20.sol":"EscrowERC20"},"evmVersion":"prague","libraries":{},"viaIR":true},"sources":{"src/BlockHeaderParser.sol":{"keccak256":"0x10923e70f1bcc22107b31b5bd580dc0e58fb634dfc07baefb34609e3a3c3cee7","urls":["bzz-raw://2b3ba3998470d6c0aaf7906d21d8787dfbdded50a4683c89915295b2c2fe0ea5","dweb:/ipfs/QmRiFmEeNN2HgXzabtyMVsVUBUCTrknW7ZiKTdajyQSscp"],"license":"UNLICENSED"},"src/EscrowBase.sol":{"keccak256":"0x53fd262562c9dbc7779339bafbeca6b86b690aec7ac864e30c57e0e42288a11d","urls":["bzz-raw://cb43380f5b0a131e1ac4405a43a67b9d2b07718eb05ba675fe46c106b8a12649","dweb:/ipfs/QmNk5QkryXnDspEGc8mdyFYJSRXWRSP8V6yirLC98EKZYG"],"license":"UNLICENSED"},"src/EscrowERC20.sol":{"keccak256":"0xa89659e0421fe81fdfeccaaf40ba35578a6fb702a5599fe9a480eb7a2f85854d","urls":["bzz-raw://72ca9d806f4b8e56594d971dc4064c0819bf605543c3d88d997ecb16526b094c","dweb:/ipfs/QmTccPEBt3CruNEFZfGpHB2weSnN4Fe2Nc88pvdc4wtxw4"],"license":"UNLICENSED"},"src/MPTVerifier.sol":{"keccak256":"0xf71ff6fc0fa054681fc67b7ca3c187141749b04895defd977d6989271b35ebeb","urls":["bzz-raw://6e2efbdee9d872e22febc5d29894e3759e72ed43850a512c9eed56a9f5e7ff3b","dweb:/ipfs/QmShY9TstL2zXVSYH7ux8D6ByW22ptm7JfiEWy2qs7bHZU"],"license":"UNLICENSED"},"src/RLPParser.sol":{"keccak256":"0x403e6fd0cbf2e3599530d724d26e75b136bd7947e35e1cf5f79b30841b2c4c6c","urls":["bzz-raw://b24f44c75ae8db00297a940d0badb6b0fd9114b494b1a5c097a04f4bccde5e1d","dweb:/ipfs/QmSoxh5vZu41RzAs8RTLXgQ5cD5pQBeQo68nYSFh4Dk5Xk"],"license":"UNLICENSED"},"src/ReceiptValidator.sol":{"keccak256":"0xd6deda056e80a69708354d192fa2e336841bf2a4d98dfa68eee4c3f550306015","urls":["bzz-raw://84686c66f4f5b66b3dc0315840aacb037f9fc21c60b6a58b298c6480d9ce0929","dweb:/ipfs/QmSavcuzdBkNUXVyzCa4ysZY1kM7Tmt82wWFq2F3kTvwZo"],"license":"UNLICENSED"}},"version":1},"id":21} \ No newline at end of file diff --git a/out/EscrowNative.sol/EscrowNative.json b/out/EscrowNative.sol/EscrowNative.json new file mode 100644 index 0000000..7726a21 --- /dev/null +++ b/out/EscrowNative.sol/EscrowNative.json @@ -0,0 +1 @@ +{"abi":[{"type":"constructor","inputs":[{"name":"_expectedRecipient","type":"address","internalType":"address"},{"name":"_expectedAmount","type":"uint256","internalType":"uint256"},{"name":"_currentRewardAmount","type":"uint256","internalType":"uint256"},{"name":"_currentPaymentAmount","type":"uint256","internalType":"uint256"}],"stateMutability":"payable"},{"type":"function","name":"MAX_BLOCK_LOOKBACK","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"bond","inputs":[],"outputs":[],"stateMutability":"payable"},{"type":"function","name":"bondAmount","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"bondedExecutor","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"type":"function","name":"cancellationRequest","inputs":[],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"collect","inputs":[{"name":"proof","type":"tuple","internalType":"struct EscrowNative.NativeTransferProof","components":[{"name":"blockHeader","type":"bytes","internalType":"bytes"},{"name":"transactionRlp","type":"bytes","internalType":"bytes"},{"name":"txProofNodes","type":"bytes","internalType":"bytes"},{"name":"receiptRlp","type":"bytes","internalType":"bytes"},{"name":"receiptProofNodes","type":"bytes","internalType":"bytes"},{"name":"path","type":"bytes","internalType":"bytes"}]},{"name":"targetBlockNumber","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"currentPaymentAmount","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"currentRewardAmount","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"executionDeadline","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"expectedAmount","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"expectedRecipient","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"type":"function","name":"fund","inputs":[{"name":"_currentRewardAmount","type":"uint256","internalType":"uint256"},{"name":"_currentPaymentAmount","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"payable"},{"type":"function","name":"funded","inputs":[],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"is_bonded","inputs":[],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"originalRewardAmount","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"requestCancellation","inputs":[],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"resume","inputs":[],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"totalBondsDeposited","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"withdraw","inputs":[],"outputs":[],"stateMutability":"nonpayable"},{"type":"error","name":"AlreadyFunded","inputs":[]},{"type":"error","name":"AmountMismatch","inputs":[]},{"type":"error","name":"BlockHashUnavailable","inputs":[]},{"type":"error","name":"BlockHeaderMismatch","inputs":[]},{"type":"error","name":"BlockNumberMismatch","inputs":[]},{"type":"error","name":"BondActive","inputs":[]},{"type":"error","name":"CancellationRequested","inputs":[]},{"type":"error","name":"ETHTransferFailed","inputs":[]},{"type":"error","name":"ExecutorAlreadyBonded","inputs":[]},{"type":"error","name":"ExpectedRLPList","inputs":[]},{"type":"error","name":"ExpectedStringItem","inputs":[]},{"type":"error","name":"IncorrectETHAmount","inputs":[]},{"type":"error","name":"InsufficientBond","inputs":[]},{"type":"error","name":"InvalidAddress","inputs":[]},{"type":"error","name":"InvalidNativeTransfer","inputs":[]},{"type":"error","name":"InvalidRLP","inputs":[]},{"type":"error","name":"InvalidRLPEncoding","inputs":[]},{"type":"error","name":"InvalidRLPList","inputs":[]},{"type":"error","name":"InvalidReceiptProof","inputs":[]},{"type":"error","name":"InvalidTxProof","inputs":[]},{"type":"error","name":"NoWithdrawableFunds","inputs":[]},{"type":"error","name":"NotFunded","inputs":[]},{"type":"error","name":"OnlyBondedExecutor","inputs":[]},{"type":"error","name":"OnlyDeployer","inputs":[]},{"type":"error","name":"RLPOffsetOutOfBounds","inputs":[]},{"type":"error","name":"RLPOffsetOutOfBounds","inputs":[]},{"type":"error","name":"ReceiptStatusNotSuccess","inputs":[]},{"type":"error","name":"RecipientMismatch","inputs":[]},{"type":"error","name":"TargetBlockInFuture","inputs":[]},{"type":"error","name":"TargetBlockTooOld","inputs":[]},{"type":"error","name":"TxFailed","inputs":[]},{"type":"error","name":"UnsupportedTxType","inputs":[]},{"type":"error","name":"ZeroPaymentAmount","inputs":[]},{"type":"error","name":"ZeroRewardAmount","inputs":[]}],"bytecode":{"object":"0x60e0601f611f5738819003918201601f19168301916001600160401b038311848410176101205780849260809460405283398101031261011c578051906001600160a01b038216820361011c576020810151606060408301519201519260a05260c0523360805280151580610113575b6100c1575b604051611e22908161013582396080518181816101560152818161040f015281816105d40152610686015260a0518181816103070152610626015260c0518181816102e5015261038d0152f35b8181018082116100ff5734036100f057805f5560025560015561010061ff001960075416176007555f80610074565b63201c04ab60e01b5f5260045ffd5b634e487b7160e01b5f52601160045260245ffd5b5081151561006f565b5f80fd5b634e487b7160e01b5f52604160045260245ffdfe60806040526004361015610011575f80fd5b5f3560e01c8063046f7da2146101445780631aa7c0ec1461013f57806323a8b41a1461013a5780632feef2ec14610135578063308657d71461013057806333ee5f351461012b5780633ccfd60b146101265780633d2691bc146101215780635a4fd6451461011c57806364c9ec6f1461011757806380f323a71461011257806381972d001461010d5780638677ab23146101085780638bd03d0a14610103578063a65e2cfd146100fe578063cb766a56146100f9578063d415b3f9146100f4578063f3a504f2146100ef5763fe03a460146100ea575f80fd5b6107a7565b610782565b610765565b610741565b610672565b610655565b610611565b6105c2565b6105a5565b6104e7565b6104cb565b6104af565b6103ef565b6103d2565b6103b0565b610376565b6101cb565b6101a3565b3461019f575f36600319011261019f577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03163303610190576007805460ff19169055005b63618bbdd560e01b5f5260045ffd5b5f80fd5b3461019f575f36600319011261019f576003546040516001600160a01b039091168152602090f35b3461019f57604036600319011261019f5760043567ffffffffffffffff811161019f57806004019060c0600319823603011261019f5761021760243561021184806107c4565b90610934565b61022a61022483806107c4565b90610aa4565b602482019161026b61026761023f85876107c4565b61024f60448697939701896107c4565b60a48701979161025f898c6107c4565b949093610bad565b1590565b610367576102676102b491608461028b61028588806107c4565b90610bd4565b9161025f60648201966102ab6102a1898c6107c4565b959094018b6107c4565b9290918b6107c4565b610358576102676102c86102ce92856107c4565b90610c35565b610349576102e26102679161032c936107c4565b907f0000000000000000000000000000000000000000000000000000000000000000917f000000000000000000000000000000000000000000000000000000000000000091610d05565b61033a57610338610f20565b005b633cff557560e11b5f5260045ffd5b632b96f51360e01b5f5260045ffd5b637b374dd160e01b5f5260045ffd5b63c89e37db60e01b5f5260045ffd5b3461019f575f36600319011261019f5760206040517f00000000000000000000000000000000000000000000000000000000000000008152f35b3461019f575f36600319011261019f57602060ff600754166040519015158152f35b3461019f575f36600319011261019f576020600454604051908152f35b3461019f575f36600319011261019f5760ff60075460081c16156104a0577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316330361019057610445610f86565b61044d610fbd565b61046461ff0019600754166007555f6001555f8055565b8015610491575f80808093335af161047a610852565b501561048257005b63b12d13eb60e01b5f5260045ffd5b6353cd7f7960e01b5f5260045ffd5b636af784dd60e11b5f5260045ffd5b3461019f575f36600319011261019f5760206040516101008152f35b3461019f575f36600319011261019f5760205f54604051908152f35b5f36600319011261019f57600454801515908161059b575b50610568575b60075460ff8160081c16156104a05760ff16610559576105236108c7565b61054a575f5460011c341061053b5761033834610fcf565b63e92c469f60e01b5f5260045ffd5b63129f78e960e11b5f5260045ffd5b632479328960e01b5f5260045ffd5b6005545f54818101809111610596575f5560065490810180911161059657600655610591610f86565b610505565b61087c565b905042115f6104ff565b3461019f575f36600319011261019f576020600554604051908152f35b3461019f575f36600319011261019f577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03163303610190576007805460ff19166001179055005b3461019f575f36600319011261019f576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b3461019f575f36600319011261019f576020600154604051908152f35b604036600319011261019f576004356024357f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031633036101905760075460081c60ff16610732578115610723578015610714576106d781836108ba565b3403610705576106ec826106f1935f55600255565b600155565b61033861010061ff00196007541617600755565b63201c04ab60e01b5f5260045ffd5b63932ca0a360e01b5f5260045ffd5b63ea1083a760e01b5f5260045ffd5b635adf638760e01b5f5260045ffd5b3461019f575f36600319011261019f57602061075b6108c7565b6040519015158152f35b3461019f575f36600319011261019f576020600254604051908152f35b3461019f575f36600319011261019f57602060ff60075460081c166040519015158152f35b3461019f575f36600319011261019f576020600654604051908152f35b903590601e198136030182121561019f570180359067ffffffffffffffff821161019f5760200191813603831361019f57565b634e487b7160e01b5f52604160045260245ffd5b6040519190601f01601f1916820167ffffffffffffffff81118382101761083157604052565b6107f7565b67ffffffffffffffff811161083157601f01601f191660200190565b3d15610877573d9061086b61086683610836565b61080b565b9182523d5f602084013e565b606090565b634e487b7160e01b5f52601160045260245ffd5b906001820180921161059657565b906015820180921161059657565b600101908160011161059657565b9190820180921161059657565b60045480151590816108d7575090565b905042111590565b60011981019190821161059657565b5f1981019190821161059657565b9190820391821161059657565b92919261091861086683610836565b938285528282011161019f57815f926020928387013784010152565b9061094861026760075460ff9060081c1690565b6104a0576003546001600160a01b03163314801590610a08575b6109f9574383116109ea5761010061097a84436108fc565b116109db57824080156109cc57610992368385610909565b60208151910120036109bd576109a791611015565b036109ae57565b63048a12f560e11b5f5260045ffd5b63ff28378760e01b5f5260045ffd5b63bfc9f0d360e01b5f5260045ffd5b63c42a018560e01b5f5260045ffd5b63058968cf60e41b5f5260045ffd5b6337b5f20360e21b5f5260045ffd5b50610a146102676108c7565b610962565b634e487b7160e01b5f52603260045260245ffd5b9015610a365790565b610a19565b90821015610a36570190565b60ff60f6199116019060ff821161059657565b60ff607f199116019060ff821161059657565b60ff60bf199116019060ff821161059657565b60ff60b6199116019060ff821161059657565b60ff166001019060ff821161059657565b905f600360fe1b6001600160f81b0319610acf610ac18587610a2d565b356001600160f81b03191690565b1610610b9e57601f60fb1b6001600160f81b0319610af0610ac18587610a2d565b1610610b955780610b2a610b24610b1f610b1a610b14610ac1610b3097898b610a3b565b60f81c90565b610a47565b610a93565b60ff1690565b906108ba565b905b5f5b60048110610b805750600560fd1b906001600160f81b031990610b5d90610ac190859087610a3b565b1603610b7157610b6c90610890565b013590565b633954003560e11b5f5260045ffd5b91610b8e600191838661107d565b9201610b34565b50600190610b32565b63c0098bd960e01b5f5260045ffd5b610bc3610bcb92939495610bd198973691610909565b923691610909565b906111e7565b90565b90610bdf81836113a1565b905f5b60058110610c205750600560fd1b906001600160f81b031990610c0790849086610a3b565b351603610b715760018101811161059657016001013590565b91610c2e600191838661107d565b9201610be2565b5f9082151580610ce9575b610ce0575b60c060ff610c5a610b14610ac1868887610a3b565b1610610cd157610b14610ac182858560f860ff610c84610b14610ac1839b60019d610cae9c610a3b565b1610610cc85780610b2a610b24610b1f610b1a610b14610ac1610ca897898b610a3b565b91610a3b565b1603610cb957600190565b63e9dd8a9d60e01b5f5260045ffd5b610ca890610890565b631bd5dcf760e31b5f5260045ffd5b60019150610c45565b50608060ff610cfe610b14610ac18786610a2d565b1610610c40565b90916003905f84151580610f04575b610ebc575b60c060ff610d2e610b14610ac1858a8a610a3b565b1610610cd1578060f860ff610d4d610b14610ac1610d73968b8b610a3b565b1610610eb35760ff610d6c610b1f610b1a610b14610ac1868c8c610a3b565b16906108ba565b915f905b808210610e9c575050609460ff610d95610b14610ac1868989610a3b565b1603610e8d576001600160a01b03168282016001013560601c03610e7e57610dbc9061089e565b91610dce610b14610ac1858486610a3b565b925f9260ff851694608086105f14610dff5750505050505b03610df057600190565b6355e97b0d60e01b5f5260045ffd5b90919293946080145f14610e185750505050505f610de6565b610b24610e2791939293610a5a565b915f935b838510610e3c575050505050610de6565b9091929394610e4d60019160081b90565b610e72610b24610b14610ac1610e6b8b610e668b610890565b6108ba565b8789610a3b565b17950193929190610e2b565b63c0ee95bb60e01b5f5260045ffd5b63e6c4247b60e01b5f5260045ffd5b9092610eab600191878761107d565b930190610d77565b60ff6001610d6c565b509050610ecf610b14610ac18585610a2d565b6001919060ff16808303610ee65750600491610d19565b600203610ef557600591610d19565b636fc3daa360e11b5f5260045ffd5b50608060ff610f19610b14610ac18989610a2d565b1610610d14565b6005545f548101809111610596576001548101809111610596575f808080936003546001600160601b0360a01b8116600355826005558260045561ff0019600754166007558260015582805560018060a01b03165af1610f7e610852565b501561048257565b610f8e6108c7565b610fae576001600160601b0360a01b600354166003555f6005555f600455565b639cbc1de160e01b5f5260045ffd5b60015460025481018091116105965790565b336001600160601b0360a01b600354161760035561012c420180421161059657600455600555565b805115610a365760200190565b908151811015610a36570160200190565b919061102181846113a1565b905f5b60088110611068575061103792936114fe565b50905f805b8351821015611063576001906110528386611004565b5160f81c9060081b1791019061103c565b925050565b91611076600191838761107d565b9201611024565b9190808210156111d857611098610b14610ac1848487610a3b565b9060ff821660808110156110b357505050610bd19150610890565b91929160b88110156110db575050610bd19250610b246110d5610b2a92610890565b92610a5a565b90929060c08110156111515750610b246110f791949394610a80565b915f935f915b84831061111857505050610bd19291610e66610e6692610890565b90919461112760019160081b90565b611147610b24610b14610ac16111408b610e668b610890565b8888610a3b565b17950191906110fd565b90929060f811156111775750610bd19250610b24611171610b2a92610890565b92610a6d565b9291610b2461118591610a47565b915f935f915b8483106111a657505050610bd19291610e66610e6692610890565b9091946111b560019160081b90565b6111ce610b24610b14610ac16111408b610e668b610890565b179501919061118b565b6318d76ae160e11b5f5260045ffd5b919390929190600360fe1b6001600160f81b0319611208610ac18689610a2d565b161061139257601f60fb1b6001600160f81b0319611229610ac18689610a2d565b16106113885761124d611248610b24610b1a610b14610ac1888b610a2d565b6108ac565b9492905b945f5b82821061126657505050505050505f90565b61128461127d8361127836878a610909565b61166f565b90936108ba565b96825160208401200361132657600360fe1b6112c06112b36112a585610ff7565b516001600160f81b03191690565b6001600160f81b03191690565b10611326578590846001601f60fb1b6112de6112b36112a588610ff7565b101561136a575b6112ef81866117f6565b60118103611331575061130194611981565b94911561132657841561131a5793915b91959093611254565b50505050505050600190565b505050505050505f90565b90935060021415905061135e5784879261134a9461183b565b94911561132657841561131a579391611311565b50505050505050505f90565b50611383611248610b24610b1a610b146112a589610ff7565b6112e5565b6001949290611251565b63ebb47d1d60e01b5f5260045ffd5b5f600360fe1b6001600160f81b03196113bd610ac18686610a2d565b1610610b9e57601f60fb1b6001600160f81b03196113de610ac18686610a2d565b16106114b05780610b2a610b24610b1f610b1a610b14610ac1611402978a8a610a3b565b905b61a5bd461480156114a5575b61141b575b50905090565b5f5b600381106114905750600360fe1b61143c6112b3610ac1858786610a3b565b10610b9e57601f60fb1b6114576112b3610ac1858786610a3b565b1061148057610b24610b1f610b1a610b14610ac18661147998610b2a97610a3b565b805f611415565b5061148b9150610890565b611479565b9161149e600191858461107d565b920161141d565b5061a5bf4614611410565b50600190611404565b6040906114c58261080b565b6001815291601f1901366020840137565b906114e361086683610836565b82815280926114f4601f1991610836565b0190602036910137565b818310156111d857611517610b14610ac1858585610a3b565b9260ff8416608081101561155157505050506115316114b9565b9060f81b6001600160f81b0319165f1a61154a82610ff7565b5390600190565b60b881969592939496105f146115bf5750610b2461156e91610a5a565b91611578836114d6565b945f5b84811061158f5750505050610bd1906108ac565b806115ac610ac16115a5600194610e6689610890565b8587610a3b565b5f1a6115b8828a611004565b530161157b565b60c0111561166057610b246115d391610a80565b905f925f5b83811061163157506115e9846114d6565b955f5b858110611604575050505090610e66610bd1926108ac565b8061161e610ac16115a5600194610e668a610e668b610890565b5f1a61162a828b611004565b53016115ec565b9360019060081b611658610b24610b14610ac16116518a610e668a610890565b8c88610a3b565b1794016115d8565b636b2e9c5f60e11b5f5260045ffd5b80518210156111d857611688610b146112a58484611004565b9160ff831660808110156116a1575050506115316114b9565b919392909160b881101561170b5750610b246116bc91610a5a565b906116c6826114d6565b935f5b8381106116dc57505050610bd1906108ac565b806116f86112a56116f2600194610e6688610890565b85611004565b5f1a6117048289611004565b53016116c9565b60c011156117a957610b2461171f91610a80565b5f915f5b82811061177b5750611734836114d6565b945f5b84811061174e5750505090610e66610bd1926108ac565b806117686112a56116f2600194610e6689610e668a610890565b5f1a611774828a611004565b5301611737565b9260019060081b6117a1610b24610b146112a561179b89610e6689610890565b8b611004565b179301611723565b50916117b58382611a96565b926117bf846114d6565b915f5b8581106117d0575050509190565b806117e36112a56116f2600194876108ba565b5f1a6117ef8287611004565b53016117c2565b5f92915b81518110156118215761180d8183611a96565b8101809111610596576001909301926117fa565b5050565b908160011b918083046002149015171561059657565b83949291611849818361166f565b9390611868602061185f610b146112a585610ff7565b16151591611bc3565b9788911561190a575061187c9051876108ba565b6118868251611825565b1461189b575b505050505050505f905f905f90565b868660019282516118f8575b5050506118b5575b8061188c565b6118c8926118c2916108ba565b9061166f565b50602081519101209060208151910120146118e657808080806118af565b6118f19151906108ba565b6001915f90565b6119029350611d2e565b86865f6118a7565b61191b939495965061026792611d2e565b6119745761192c926118c2916108ba565b50908151602081145f146119545750602061194c920151925b51906108ba565b916001929190565b801561196857602061194c93012092611945565b505050505f905f905f90565b50505050505f905f905f90565b9190929361198f8251611825565b851015611a395750610b146112a56119b1926119ab8760011c90565b90611004565b60018416611a305760041c600f16915b905f925b60ff81168410611a1057506119da925061166f565b5080518015611a055761194c91602082036119fb5760209150015191610890565b6020012091610890565b5050505f905f905f90565b90916001611a2482610b2a60ff9487611a96565b940193929190506119c5565b600f16916119c1565b9290509392935f915b60108310611a7c57611a54925061166f565b50602081519101209060208151910120145f14611a7357600191905f90565b5f915081908190565b90611a8d81610b2a60019385611a96565b92019190611a42565b9081518110156111d857611ab0610b146112a58385611004565b9160ff83166080811015611ac75750505050600190565b60b8811015611ae257505050610b24610b1f610bd192610a5a565b60c0811015611b4e575091610b24611af991610a80565b905f925f915b838310611b165750505090610e66610bd1926108ac565b909193611b2560019160081b90565b611b44610b24610b146112a5611b3e8a610e6689610890565b88611004565b1794019190611aff565b60f81115611b67575050610b24610b1f610bd192610a6d565b91610b24611b7491610a47565b905f925f915b838310611b915750505090610e66610bd1926108ac565b909193611ba060019160081b90565b611bb9610b24610b146112a5611b3e8a610e6689610890565b1794019190611b7a565b90815115611d2c57611bda610b146112a584610ff7565b6010811615611ca957611bfd611bf8611bf38551611825565b6108ee565b6114d6565b9060f81b600f60f81b165f1a611c1282610ff7565b5360015b8351811015611ca45780611c51611c41611c38610b146112a56001968a611004565b60041c600f1690565b60f81b6001600160f81b03191690565b611c6a611c60611bf384611825565b915f1a9185611004565b53611c91600f611c80610b146112a5858a611004565b1660f81b6001600160f81b03191690565b611c9d611c6083611825565b5301611c16565b509150565b50611cbf611bf8611cba8451611825565b6108df565b60015b8351811015611ca45780611ce4611c41611c38610b146112a56001968a611004565b611cf8611c60611cf3846108ee565b611825565b53611d0e600f611c80610b146112a5858a611004565b611d25611c60611d20611cf3856108ee565b610890565b5301611cc2565b565b919091611d3c8251846108ba565b611d468251611825565b10611de5575f5b8251811015611ddc57611d69611d6382866108ba565b60011690565b611dbe57611d92611c38610b146112a5611d8c611d86868a6108ba565b60011c90565b86611004565b60ff611da7610b24610b146112a58689611004565b911603611db657600101611d4d565b505050505f90565b600f611dd6610b146112a5611d8c611d86868a6108ba565b16611d92565b50505050600190565b5050505f9056fea2646970667358221220290b4349508c088a1ee4b25b8002172ad42ab21d1e2ad16b6e9456f82cd5a8db64736f6c634300081e0033","sourceMap":"92:4695:22:-:0;;;;;;;;;;-1:-1:-1;;92:4695:22;;;;-1:-1:-1;;;;;92:4695:22;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;92:4695:22;;;;;;;;;;;;;;;;;;1670:38:20;;;1718:32;;1778:10;92:4695:22;1760:28:20;1248:24:22;;;:53;;;-1:-1:-1;1244:372:22;;-1:-1:-1;92:4695:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1670:38:20;92:4695:22;;;;;;;;;;1718:32:20;92:4695:22;;;;;;;;;;;1244:372;92:4695;;;;;;;;1321:9;:57;1317:90;;92:4695;-1:-1:-1;92:4695:22;1477:43;92:4695;;;;;;1592:13;92:4695;;;1592:13;92:4695;1244:372;;;;1317:90;1387:20;;;-1:-1:-1;1387:20:22;;-1:-1:-1;1387:20:22;92:4695;;;;-1:-1:-1;92:4695:22;;;;;-1:-1:-1;92:4695:22;1248:53;1276:25;;;;1248:53;;92:4695;-1:-1:-1;92:4695:22;;;;;;-1:-1:-1;92:4695:22;;;;;-1:-1:-1;92:4695:22","linkReferences":{}},"deployedBytecode":{"object":"0x60806040526004361015610011575f80fd5b5f3560e01c8063046f7da2146101445780631aa7c0ec1461013f57806323a8b41a1461013a5780632feef2ec14610135578063308657d71461013057806333ee5f351461012b5780633ccfd60b146101265780633d2691bc146101215780635a4fd6451461011c57806364c9ec6f1461011757806380f323a71461011257806381972d001461010d5780638677ab23146101085780638bd03d0a14610103578063a65e2cfd146100fe578063cb766a56146100f9578063d415b3f9146100f4578063f3a504f2146100ef5763fe03a460146100ea575f80fd5b6107a7565b610782565b610765565b610741565b610672565b610655565b610611565b6105c2565b6105a5565b6104e7565b6104cb565b6104af565b6103ef565b6103d2565b6103b0565b610376565b6101cb565b6101a3565b3461019f575f36600319011261019f577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03163303610190576007805460ff19169055005b63618bbdd560e01b5f5260045ffd5b5f80fd5b3461019f575f36600319011261019f576003546040516001600160a01b039091168152602090f35b3461019f57604036600319011261019f5760043567ffffffffffffffff811161019f57806004019060c0600319823603011261019f5761021760243561021184806107c4565b90610934565b61022a61022483806107c4565b90610aa4565b602482019161026b61026761023f85876107c4565b61024f60448697939701896107c4565b60a48701979161025f898c6107c4565b949093610bad565b1590565b610367576102676102b491608461028b61028588806107c4565b90610bd4565b9161025f60648201966102ab6102a1898c6107c4565b959094018b6107c4565b9290918b6107c4565b610358576102676102c86102ce92856107c4565b90610c35565b610349576102e26102679161032c936107c4565b907f0000000000000000000000000000000000000000000000000000000000000000917f000000000000000000000000000000000000000000000000000000000000000091610d05565b61033a57610338610f20565b005b633cff557560e11b5f5260045ffd5b632b96f51360e01b5f5260045ffd5b637b374dd160e01b5f5260045ffd5b63c89e37db60e01b5f5260045ffd5b3461019f575f36600319011261019f5760206040517f00000000000000000000000000000000000000000000000000000000000000008152f35b3461019f575f36600319011261019f57602060ff600754166040519015158152f35b3461019f575f36600319011261019f576020600454604051908152f35b3461019f575f36600319011261019f5760ff60075460081c16156104a0577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316330361019057610445610f86565b61044d610fbd565b61046461ff0019600754166007555f6001555f8055565b8015610491575f80808093335af161047a610852565b501561048257005b63b12d13eb60e01b5f5260045ffd5b6353cd7f7960e01b5f5260045ffd5b636af784dd60e11b5f5260045ffd5b3461019f575f36600319011261019f5760206040516101008152f35b3461019f575f36600319011261019f5760205f54604051908152f35b5f36600319011261019f57600454801515908161059b575b50610568575b60075460ff8160081c16156104a05760ff16610559576105236108c7565b61054a575f5460011c341061053b5761033834610fcf565b63e92c469f60e01b5f5260045ffd5b63129f78e960e11b5f5260045ffd5b632479328960e01b5f5260045ffd5b6005545f54818101809111610596575f5560065490810180911161059657600655610591610f86565b610505565b61087c565b905042115f6104ff565b3461019f575f36600319011261019f576020600554604051908152f35b3461019f575f36600319011261019f577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03163303610190576007805460ff19166001179055005b3461019f575f36600319011261019f576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b3461019f575f36600319011261019f576020600154604051908152f35b604036600319011261019f576004356024357f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031633036101905760075460081c60ff16610732578115610723578015610714576106d781836108ba565b3403610705576106ec826106f1935f55600255565b600155565b61033861010061ff00196007541617600755565b63201c04ab60e01b5f5260045ffd5b63932ca0a360e01b5f5260045ffd5b63ea1083a760e01b5f5260045ffd5b635adf638760e01b5f5260045ffd5b3461019f575f36600319011261019f57602061075b6108c7565b6040519015158152f35b3461019f575f36600319011261019f576020600254604051908152f35b3461019f575f36600319011261019f57602060ff60075460081c166040519015158152f35b3461019f575f36600319011261019f576020600654604051908152f35b903590601e198136030182121561019f570180359067ffffffffffffffff821161019f5760200191813603831361019f57565b634e487b7160e01b5f52604160045260245ffd5b6040519190601f01601f1916820167ffffffffffffffff81118382101761083157604052565b6107f7565b67ffffffffffffffff811161083157601f01601f191660200190565b3d15610877573d9061086b61086683610836565b61080b565b9182523d5f602084013e565b606090565b634e487b7160e01b5f52601160045260245ffd5b906001820180921161059657565b906015820180921161059657565b600101908160011161059657565b9190820180921161059657565b60045480151590816108d7575090565b905042111590565b60011981019190821161059657565b5f1981019190821161059657565b9190820391821161059657565b92919261091861086683610836565b938285528282011161019f57815f926020928387013784010152565b9061094861026760075460ff9060081c1690565b6104a0576003546001600160a01b03163314801590610a08575b6109f9574383116109ea5761010061097a84436108fc565b116109db57824080156109cc57610992368385610909565b60208151910120036109bd576109a791611015565b036109ae57565b63048a12f560e11b5f5260045ffd5b63ff28378760e01b5f5260045ffd5b63bfc9f0d360e01b5f5260045ffd5b63c42a018560e01b5f5260045ffd5b63058968cf60e41b5f5260045ffd5b6337b5f20360e21b5f5260045ffd5b50610a146102676108c7565b610962565b634e487b7160e01b5f52603260045260245ffd5b9015610a365790565b610a19565b90821015610a36570190565b60ff60f6199116019060ff821161059657565b60ff607f199116019060ff821161059657565b60ff60bf199116019060ff821161059657565b60ff60b6199116019060ff821161059657565b60ff166001019060ff821161059657565b905f600360fe1b6001600160f81b0319610acf610ac18587610a2d565b356001600160f81b03191690565b1610610b9e57601f60fb1b6001600160f81b0319610af0610ac18587610a2d565b1610610b955780610b2a610b24610b1f610b1a610b14610ac1610b3097898b610a3b565b60f81c90565b610a47565b610a93565b60ff1690565b906108ba565b905b5f5b60048110610b805750600560fd1b906001600160f81b031990610b5d90610ac190859087610a3b565b1603610b7157610b6c90610890565b013590565b633954003560e11b5f5260045ffd5b91610b8e600191838661107d565b9201610b34565b50600190610b32565b63c0098bd960e01b5f5260045ffd5b610bc3610bcb92939495610bd198973691610909565b923691610909565b906111e7565b90565b90610bdf81836113a1565b905f5b60058110610c205750600560fd1b906001600160f81b031990610c0790849086610a3b565b351603610b715760018101811161059657016001013590565b91610c2e600191838661107d565b9201610be2565b5f9082151580610ce9575b610ce0575b60c060ff610c5a610b14610ac1868887610a3b565b1610610cd157610b14610ac182858560f860ff610c84610b14610ac1839b60019d610cae9c610a3b565b1610610cc85780610b2a610b24610b1f610b1a610b14610ac1610ca897898b610a3b565b91610a3b565b1603610cb957600190565b63e9dd8a9d60e01b5f5260045ffd5b610ca890610890565b631bd5dcf760e31b5f5260045ffd5b60019150610c45565b50608060ff610cfe610b14610ac18786610a2d565b1610610c40565b90916003905f84151580610f04575b610ebc575b60c060ff610d2e610b14610ac1858a8a610a3b565b1610610cd1578060f860ff610d4d610b14610ac1610d73968b8b610a3b565b1610610eb35760ff610d6c610b1f610b1a610b14610ac1868c8c610a3b565b16906108ba565b915f905b808210610e9c575050609460ff610d95610b14610ac1868989610a3b565b1603610e8d576001600160a01b03168282016001013560601c03610e7e57610dbc9061089e565b91610dce610b14610ac1858486610a3b565b925f9260ff851694608086105f14610dff5750505050505b03610df057600190565b6355e97b0d60e01b5f5260045ffd5b90919293946080145f14610e185750505050505f610de6565b610b24610e2791939293610a5a565b915f935b838510610e3c575050505050610de6565b9091929394610e4d60019160081b90565b610e72610b24610b14610ac1610e6b8b610e668b610890565b6108ba565b8789610a3b565b17950193929190610e2b565b63c0ee95bb60e01b5f5260045ffd5b63e6c4247b60e01b5f5260045ffd5b9092610eab600191878761107d565b930190610d77565b60ff6001610d6c565b509050610ecf610b14610ac18585610a2d565b6001919060ff16808303610ee65750600491610d19565b600203610ef557600591610d19565b636fc3daa360e11b5f5260045ffd5b50608060ff610f19610b14610ac18989610a2d565b1610610d14565b6005545f548101809111610596576001548101809111610596575f808080936003546001600160601b0360a01b8116600355826005558260045561ff0019600754166007558260015582805560018060a01b03165af1610f7e610852565b501561048257565b610f8e6108c7565b610fae576001600160601b0360a01b600354166003555f6005555f600455565b639cbc1de160e01b5f5260045ffd5b60015460025481018091116105965790565b336001600160601b0360a01b600354161760035561012c420180421161059657600455600555565b805115610a365760200190565b908151811015610a36570160200190565b919061102181846113a1565b905f5b60088110611068575061103792936114fe565b50905f805b8351821015611063576001906110528386611004565b5160f81c9060081b1791019061103c565b925050565b91611076600191838761107d565b9201611024565b9190808210156111d857611098610b14610ac1848487610a3b565b9060ff821660808110156110b357505050610bd19150610890565b91929160b88110156110db575050610bd19250610b246110d5610b2a92610890565b92610a5a565b90929060c08110156111515750610b246110f791949394610a80565b915f935f915b84831061111857505050610bd19291610e66610e6692610890565b90919461112760019160081b90565b611147610b24610b14610ac16111408b610e668b610890565b8888610a3b565b17950191906110fd565b90929060f811156111775750610bd19250610b24611171610b2a92610890565b92610a6d565b9291610b2461118591610a47565b915f935f915b8483106111a657505050610bd19291610e66610e6692610890565b9091946111b560019160081b90565b6111ce610b24610b14610ac16111408b610e668b610890565b179501919061118b565b6318d76ae160e11b5f5260045ffd5b919390929190600360fe1b6001600160f81b0319611208610ac18689610a2d565b161061139257601f60fb1b6001600160f81b0319611229610ac18689610a2d565b16106113885761124d611248610b24610b1a610b14610ac1888b610a2d565b6108ac565b9492905b945f5b82821061126657505050505050505f90565b61128461127d8361127836878a610909565b61166f565b90936108ba565b96825160208401200361132657600360fe1b6112c06112b36112a585610ff7565b516001600160f81b03191690565b6001600160f81b03191690565b10611326578590846001601f60fb1b6112de6112b36112a588610ff7565b101561136a575b6112ef81866117f6565b60118103611331575061130194611981565b94911561132657841561131a5793915b91959093611254565b50505050505050600190565b505050505050505f90565b90935060021415905061135e5784879261134a9461183b565b94911561132657841561131a579391611311565b50505050505050505f90565b50611383611248610b24610b1a610b146112a589610ff7565b6112e5565b6001949290611251565b63ebb47d1d60e01b5f5260045ffd5b5f600360fe1b6001600160f81b03196113bd610ac18686610a2d565b1610610b9e57601f60fb1b6001600160f81b03196113de610ac18686610a2d565b16106114b05780610b2a610b24610b1f610b1a610b14610ac1611402978a8a610a3b565b905b61a5bd461480156114a5575b61141b575b50905090565b5f5b600381106114905750600360fe1b61143c6112b3610ac1858786610a3b565b10610b9e57601f60fb1b6114576112b3610ac1858786610a3b565b1061148057610b24610b1f610b1a610b14610ac18661147998610b2a97610a3b565b805f611415565b5061148b9150610890565b611479565b9161149e600191858461107d565b920161141d565b5061a5bf4614611410565b50600190611404565b6040906114c58261080b565b6001815291601f1901366020840137565b906114e361086683610836565b82815280926114f4601f1991610836565b0190602036910137565b818310156111d857611517610b14610ac1858585610a3b565b9260ff8416608081101561155157505050506115316114b9565b9060f81b6001600160f81b0319165f1a61154a82610ff7565b5390600190565b60b881969592939496105f146115bf5750610b2461156e91610a5a565b91611578836114d6565b945f5b84811061158f5750505050610bd1906108ac565b806115ac610ac16115a5600194610e6689610890565b8587610a3b565b5f1a6115b8828a611004565b530161157b565b60c0111561166057610b246115d391610a80565b905f925f5b83811061163157506115e9846114d6565b955f5b858110611604575050505090610e66610bd1926108ac565b8061161e610ac16115a5600194610e668a610e668b610890565b5f1a61162a828b611004565b53016115ec565b9360019060081b611658610b24610b14610ac16116518a610e668a610890565b8c88610a3b565b1794016115d8565b636b2e9c5f60e11b5f5260045ffd5b80518210156111d857611688610b146112a58484611004565b9160ff831660808110156116a1575050506115316114b9565b919392909160b881101561170b5750610b246116bc91610a5a565b906116c6826114d6565b935f5b8381106116dc57505050610bd1906108ac565b806116f86112a56116f2600194610e6688610890565b85611004565b5f1a6117048289611004565b53016116c9565b60c011156117a957610b2461171f91610a80565b5f915f5b82811061177b5750611734836114d6565b945f5b84811061174e5750505090610e66610bd1926108ac565b806117686112a56116f2600194610e6689610e668a610890565b5f1a611774828a611004565b5301611737565b9260019060081b6117a1610b24610b146112a561179b89610e6689610890565b8b611004565b179301611723565b50916117b58382611a96565b926117bf846114d6565b915f5b8581106117d0575050509190565b806117e36112a56116f2600194876108ba565b5f1a6117ef8287611004565b53016117c2565b5f92915b81518110156118215761180d8183611a96565b8101809111610596576001909301926117fa565b5050565b908160011b918083046002149015171561059657565b83949291611849818361166f565b9390611868602061185f610b146112a585610ff7565b16151591611bc3565b9788911561190a575061187c9051876108ba565b6118868251611825565b1461189b575b505050505050505f905f905f90565b868660019282516118f8575b5050506118b5575b8061188c565b6118c8926118c2916108ba565b9061166f565b50602081519101209060208151910120146118e657808080806118af565b6118f19151906108ba565b6001915f90565b6119029350611d2e565b86865f6118a7565b61191b939495965061026792611d2e565b6119745761192c926118c2916108ba565b50908151602081145f146119545750602061194c920151925b51906108ba565b916001929190565b801561196857602061194c93012092611945565b505050505f905f905f90565b50505050505f905f905f90565b9190929361198f8251611825565b851015611a395750610b146112a56119b1926119ab8760011c90565b90611004565b60018416611a305760041c600f16915b905f925b60ff81168410611a1057506119da925061166f565b5080518015611a055761194c91602082036119fb5760209150015191610890565b6020012091610890565b5050505f905f905f90565b90916001611a2482610b2a60ff9487611a96565b940193929190506119c5565b600f16916119c1565b9290509392935f915b60108310611a7c57611a54925061166f565b50602081519101209060208151910120145f14611a7357600191905f90565b5f915081908190565b90611a8d81610b2a60019385611a96565b92019190611a42565b9081518110156111d857611ab0610b146112a58385611004565b9160ff83166080811015611ac75750505050600190565b60b8811015611ae257505050610b24610b1f610bd192610a5a565b60c0811015611b4e575091610b24611af991610a80565b905f925f915b838310611b165750505090610e66610bd1926108ac565b909193611b2560019160081b90565b611b44610b24610b146112a5611b3e8a610e6689610890565b88611004565b1794019190611aff565b60f81115611b67575050610b24610b1f610bd192610a6d565b91610b24611b7491610a47565b905f925f915b838310611b915750505090610e66610bd1926108ac565b909193611ba060019160081b90565b611bb9610b24610b146112a5611b3e8a610e6689610890565b1794019190611b7a565b90815115611d2c57611bda610b146112a584610ff7565b6010811615611ca957611bfd611bf8611bf38551611825565b6108ee565b6114d6565b9060f81b600f60f81b165f1a611c1282610ff7565b5360015b8351811015611ca45780611c51611c41611c38610b146112a56001968a611004565b60041c600f1690565b60f81b6001600160f81b03191690565b611c6a611c60611bf384611825565b915f1a9185611004565b53611c91600f611c80610b146112a5858a611004565b1660f81b6001600160f81b03191690565b611c9d611c6083611825565b5301611c16565b509150565b50611cbf611bf8611cba8451611825565b6108df565b60015b8351811015611ca45780611ce4611c41611c38610b146112a56001968a611004565b611cf8611c60611cf3846108ee565b611825565b53611d0e600f611c80610b146112a5858a611004565b611d25611c60611d20611cf3856108ee565b610890565b5301611cc2565b565b919091611d3c8251846108ba565b611d468251611825565b10611de5575f5b8251811015611ddc57611d69611d6382866108ba565b60011690565b611dbe57611d92611c38610b146112a5611d8c611d86868a6108ba565b60011c90565b86611004565b60ff611da7610b24610b146112a58689611004565b911603611db657600101611d4d565b505050505f90565b600f611dd6610b146112a5611d8c611d86868a6108ba565b16611d92565b50505050600190565b5050505f9056fea2646970667358221220290b4349508c088a1ee4b25b8002172ad42ab21d1e2ad16b6e9456f82cd5a8db64736f6c634300081e0033","sourceMap":"92:4695:22:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;;;;;-1:-1:-1;;92:4695:22;;;;2363:15:20;-1:-1:-1;;;;;92:4695:22;2349:10:20;:29;2345:56;;2411:27;92:4695:22;;-1:-1:-1;;92:4695:22;;;;2345:56:20;2387:14;;;92:4695:22;2387:14:20;92:4695:22;;2387:14:20;92:4695:22;;;;;;;;;;-1:-1:-1;;92:4695:22;;;;1263:29:20;92:4695:22;;;-1:-1:-1;;;;;92:4695:22;;;;;;;;;;;;;;-1:-1:-1;;92:4695:22;;;;;;;;;;;;;;;;;;;;;;;;;2799:17;92:4695;;2780:17;;;;:::i;:::-;2799;;:::i;:::-;2916:60;2958:17;;;;:::i;:::-;2916:60;;:::i;:::-;92:4695;3022:20;;;2990:103;2991:102;3022:20;;;;:::i;:::-;3044:18;;;;;;;;;:::i;:::-;3064:10;;;;;;;;;:::i;:::-;2991:102;;;;:::i;:::-;2990:103;;92:4695;2990:103;2986:157;;3300:99;3299:100;3267:17;3349:23;3229:56;3267:17;;;;:::i;:::-;3229:56;;:::i;:::-;3331:16;3374:10;3331:16;;;;3349:23;3331:16;;;;:::i;:::-;3349:23;;;;;;:::i;:::-;3374:10;;;;;:::i;3299:100::-;3295:159;;3525:56;3564:16;3524:57;3564:16;;;:::i;:::-;3525:56;;:::i;3524:57::-;3520:80;;3722:20;3682:96;3722:20;3681:97;3722:20;;:::i;:::-;3763:14;;3744:17;;3682:96;;:::i;3681:97::-;3677:158;;;;:::i;:::-;92:4695;3677:158;3801:23;;;-1:-1:-1;3801:23:22;92:4695;-1:-1:-1;3801:23:22;3520:80;3590:10;;;-1:-1:-1;3590:10:22;92:4695;-1:-1:-1;3590:10:22;3295:159;3422:21;;;-1:-1:-1;3422:21:22;92:4695;-1:-1:-1;3422:21:22;2986:157;3116:16;;;-1:-1:-1;3116:16:22;92:4695;-1:-1:-1;3116:16:22;92:4695;;;;;;-1:-1:-1;;92:4695:22;;;;;;;963:39:20;92:4695:22;;;;;;;;;-1:-1:-1;;92:4695:22;;;;;;1407:31:20;92:4695:22;;;;;;;;;;;;;;;;-1:-1:-1;;92:4695:22;;;;;;;;;;;;;;;;;;;-1:-1:-1;;92:4695:22;;;;;5261:6:20;92:4695:22;;;;5260:7:20;5256:31;;5315:15;-1:-1:-1;;;;;92:4695:22;5301:10:20;:29;5297:56;;4396:389:22;;:::i;:::-;4523:30;;:::i;:::-;4494:59;92:4695;;5686:14:20;92:4695:22;;5686:14:20;92:4695:22;5695:5:20;92:4695:22;;5695:5:20;92:4695:22;;5636:138:20;4494:59:22;4600:23;;4596:57;;92:4695;5301:10:20;;;;;4682:46:22;;;;:::i;:::-;;4742:8;4738:40;;92:4695;4738:40;4759:19;;;92:4695;4759:19;92:4695;;4759:19;4596:57;4632:21;;;92:4695;4632:21;92:4695;;4632:21;5256:31:20;5276:11;;;92:4695:22;5276:11:20;92:4695:22;;5276:11:20;92:4695:22;;;;;;-1:-1:-1;;92:4695:22;;;;;;;1085:3:20;92:4695:22;;;;;;;;;-1:-1:-1;;92:4695:22;;;;;;;;;;;;;;;;-1:-1:-1;;92:4695:22;;;;;;3850:21:20;;;:60;;;;92:4695:22;3846:204:20;;;92:4695:22;4200:6:20;92:4695:22;;;;;;4199:7:20;4195:31;;92:4695:22;;4236:55:20;;4305:11;;:::i;:::-;4301:47;;92:4695:22;;;;2438:9;4362:37:20;4358:68;;2472:9:22;2438;2472;:::i;4358:68:20:-;4408:18;;;92:4695:22;4408:18:20;92:4695:22;;4408:18:20;4301:47;4325:23;;;92:4695:22;4325:23:20;92:4695:22;;4325:23:20;4236:55;4268:23;;;92:4695:22;4268:23:20;92:4695:22;;4268:23:20;3846:204;3949:10;92:4695:22;;;;;;;;;;;;;3973:33:20;92:4695:22;;;;;;;;;3973:33:20;92:4695:22;3973:33:20;;:::i;:::-;3846:204;;92:4695:22;;:::i;3850:60:20:-;3875:15;;;:35;3850:60;;;92:4695:22;;;;;;-1:-1:-1;;92:4695:22;;;;;1336:25:20;92:4695:22;;;;;;;;;;;;;-1:-1:-1;;92:4695:22;;;;2113:15:20;-1:-1:-1;;;;;92:4695:22;2099:10:20;:29;2095:56;;2161:26;92:4695:22;;-1:-1:-1;;92:4695:22;2183:4:20;92:4695:22;;;;;;;;;;-1:-1:-1;;92:4695:22;;;;;;873:42:20;-1:-1:-1;;;;;92:4695:22;;;;;;;;;;;;-1:-1:-1;;92:4695:22;;;;;727:35:20;92:4695:22;;;;;;;;;;-1:-1:-1;;92:4695:22;;;;;;;;1748:15;-1:-1:-1;;;;;92:4695:22;1734:10;:29;1730:56;;1800:6;92:4695;;;;;1796:34;;1844:25;;1840:56;;1910:26;;1906:58;;1991:44;;;;:::i;:::-;1978:9;:57;1974:90;;2127:43;92:4695;2180:44;92:4695;-1:-1:-1;92:4695:22;2127:43;92:4695;;2127:43;2180:44;92:4695;;2180:44;2234:13;92:4695;;;1800:6;92:4695;;;1800:6;92:4695;;1974:90;2044:20;;;-1:-1:-1;2044:20:22;92:4695;-1:-1:-1;2044:20:22;1906:58;1945:19;;;-1:-1:-1;1945:19:22;92:4695;-1:-1:-1;1945:19:22;1840:56;1878:18;;;-1:-1:-1;1878:18:22;92:4695;-1:-1:-1;1878:18:22;1796:34;1815:15;;;-1:-1:-1;1815:15:22;92:4695;-1:-1:-1;1815:15:22;92:4695;;;;;;-1:-1:-1;;92:4695:22;;;;;;;:::i;:::-;;;;;;;;;;;;;;;-1:-1:-1;;92:4695:22;;;;;768:35:20;92:4695:22;;;;;;;;;;;;;-1:-1:-1;;92:4695:22;;;;;;1444:18:20;92:4695:22;;;;;;;;;;;;;;;;;;-1:-1:-1;;92:4695:22;;;;;1367:34:20;92:4695:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;-1:-1:-1;;92:4695:22;;;;;;;;;;;;;;:::o;:::-;;:::i;:::-;;;;;;;;-1:-1:-1;;92:4695:22;;;;:::o;:::-;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;-1:-1:-1;92:4695:22;;;;:::o;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;11632:2:25;92:4695:22;;;;;;;:::o;:::-;1984:1:23;92:4695:22;;;1984:1:23;92:4695:22;;;:::o;:::-;;;;;;;;;;:::o;2519:133:20:-;2584:17;92:4695:22;2584:21:20;;;:61;;;;2577:68;2519:133;:::o;2584:61::-;2609:15;;;:36;;2519:133;:::o;92:4695:22:-;-1:-1:-1;;92:4695:22;;;;;;;;:::o;:::-;-1:-1:-1;;92:4695:22;;;;;;;;:::o;:::-;;;;;;;;;;:::o;:::-;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;:::o;2729:743:20:-;;2842:7;92:4695:22;2843:6:20;92:4695:22;;;;;;;;2842:7:20;2838:31;;2897:14;92:4695:22;-1:-1:-1;;;;;92:4695:22;2883:10:20;:28;;;:44;;;2729:743;2879:77;;2990:12;2970:32;;2966:66;;1085:3;3046:32;2990:12;;3046:32;:::i;:::-;:53;3042:85;;3164:28;;3206:29;;3202:64;;92:4695:22;;;;;:::i;:::-;;;;;;3280:22:20;:41;3276:75;;3365:49;;;:::i;:::-;:70;3361:104;;2729:743::o;3361:104::-;3444:21;;;3233:1;3444:21;;3233:1;3444:21;3276:75;3330:21;;;3233:1;3330:21;;3233:1;3330:21;3202:64;3244:22;;;3233:1;3244:22;;3233:1;3244:22;3042:85;3108:19;;;;;;;;2966:66;3011:21;;;;;;;;2879:77;2936:20;;;;;;;;2883:44;2916:11;2915:12;2916:11;;:::i;2915:12::-;2883:44;;92:4695:22;;;;;;;;;;;;;;;;;;:::o;:::-;;:::i;:::-;;;;;;;;;:::o;:::-;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;:::o;6966:926:19:-;;7086:1;-1:-1:-1;;;;;;;;;7134:19:19;;6966:926;;7134:19;:::i;:::-;;-1:-1:-1;;;;;;92:4695:22;;;7134:19:19;92:4695:22;7134:26:19;7130:55;;-1:-1:-1;;;;;;;;;7199:19:19;;;;;:::i;:::-;92:4695:22;7199:27:19;92:4695:22;;7263:19:19;7242:49;7252:39;7257:33;:26;7263:19;;7242:49;7263:19;;;;:::i;:::-;92:4695:22;;;;7257:26:19;:33;:::i;:::-;7252:39;:::i;:::-;92:4695:22;;;;7242:49:19;;;:::i;:::-;7195:149;;7086:1;7442:5;7446:1;7442:5;;;;-1:-1:-1;;;;92:4695:22;-1:-1:-1;;;;;;92:4695:22;7632:19:19;;;;92:4695:22;;7632:19:19;;:::i;:::-;92:4695:22;7632:27:19;7628:60;;7698:11;;;:::i;:::-;7754:98;;6966:926;:::o;7628:60::-;7668:20;;;7086:1;7668:20;7446:1;7086;7668:20;7427:13;7473:28;;92:4695:22;7473:28:19;;;;:::i;:::-;92:4695:22;;7427:13:19;;7195:149;7322:11;7332:1;7195:149;;;7130:55;7169:16;;;7086:1;7169:16;;7086:1;7169:16;720:484:23;92:4695:22;;720:484:23;;;;1148:49;720:484;;92:4695:22;;;:::i;:::-;;;;;:::i;:::-;1148:49:23;;:::i;:::-;720:484;:::o;3172:769:19:-;;3288:33;;;;:::i;:::-;3492:13;3504:1;3507:5;3511:1;3507:5;;;;-1:-1:-1;;;;92:4695:22;-1:-1:-1;;;;;;92:4695:22;3693:19:19;;92:4695:22;;3693:19:19;;:::i;:::-;;92:4695:22;3693:27:19;3689:60;;92:4695:22;;;;;;;3811:94:19;92:4695:22;3811:94:19;;;3172:769::o;3492:13::-;3538:28;;92:4695:22;3538:28:19;;;;:::i;:::-;92:4695:22;;3492:13:19;;8997:993:25;9111:1;9171:21;;;;:52;;;8997:993;9167:123;;8997:993;9364:4;92:4695:22;9336:25:25;9342:18;;;;;;:::i;9336:25::-;92:4695:22;9336:32:25;9332:57;;9716:18;;9409;;;9432:4;92:4695:22;9403:25:25;9409:18;;;;9923:4;9409:18;9710:25;9409:18;;:::i;9403:25::-;92:4695:22;9403:33:25;9432:4;;9473:18;9452:48;9462:38;9467:32;:25;9473:18;;9452:48;9473:18;;;;:::i;9452:48::-;9399:154;9716:18;:::i;9710:25::-;92:4695:22;9909:18:25;9905:56;;9923:4;8997:993;:::o;9905:56::-;9936:25;;;9111:1;9936:25;;9111:1;9936:25;9399:154;9531:11;;;:::i;9332:57::-;9377:12;;;9111:1;9377:12;;9111:1;9377:12;9167:123;7332:1:19;;-1:-1:-1;9167:123:25;;9171:52;9202:13;9219:4;92:4695:22;9196:20:25;9202:13;;;;;:::i;9196:20::-;92:4695:22;9196:27:25;9171:52;;10092:2113;;;10373:1;;92:4695:22;10443:16:25;;;;:42;;10092:2113;10439:485;;10092:2113;10989:4;92:4695:22;10966:20:25;10972:13;;;;;;:::i;10966:20::-;92:4695:22;10966:27:25;10962:52;;11040:13;11058:4;92:4695:22;11034:20:25;11040:13;;11024:78;11040:13;;;;:::i;11034:20::-;92:4695:22;11034:28:25;:68;;92:4695:22;11065:33:25;11070:27;:20;11076:13;;;;;;:::i;11065:33::-;92:4695:22;11024:78:25;;:::i;:::-;11148:13;92:4695:22;11143:149:25;11163:11;;;;;;11376:13;;11394:4;92:4695:22;11370:20:25;11376:13;;;;;;:::i;11370:20::-;92:4695:22;11370:28:25;11366:57;;-1:-1:-1;;;;;92:4695:22;11453:95:25;;;92:4695:22;11453:95:25;;;;11561:23;11557:55;;11622:12;;;:::i;:::-;11694:13;11688:20;11694:13;;;;;;:::i;11688:20::-;11718:13;92:4695:22;;;;;11745:13:25;11754:4;11745:13;;11741:374;11754:4;;;11774:14;;;;;11741:374;12128:23;12124:52;;92:4695:22;10092:2113:25;:::o;12124:52::-;12160:16;;;92:4695:22;12160:16:25;;92:4695:22;12160:16:25;11741:374;11809:14;;;;;11754:4;11809:14;11805:310;11754:4;;;11839:9;;;;;92:4695:22;11741:374:25;;11805:310;11893:13;11879:27;11893:13;;;;;:::i;11879:27::-;11925:13;92:4695:22;11920:185:25;11940:7;;;;;;11805:310;;;;;11741:374;;11925:13;11977:10;;;;;;92:4695:22;11977:10:25;92:4695:22;;;;11977:10:25;11976:43;11991:28;11997:21;;12003:14;:10;;;;:::i;:::-;:14;:::i;:::-;11997:21;;;:::i;11976:43::-;;92:4695:22;;11925:13:25;;;;;;11557:55;11593:19;;;92:4695:22;11593:19:25;;92:4695:22;11593:19:25;11366:57;11407:16;;;92:4695:22;11407:16:25;;92:4695:22;11407:16:25;11148:13;11200:22;;;92:4695:22;11200:22:25;;;;:::i;:::-;92:4695:22;;11148:13:25;;;11034:68;92:4695:22;11101:1:25;11034:68;;10439:485;10522:8;;;10516:15;10522:8;;;;;:::i;10516:15::-;10554:1;;10545:10;92:4695:22;;10573:14:25;;;10554:1;;10607:11;10617:1;10569:345;10439:485;;10569:345;10719:4;10709:14;10719:4;;10753:1;10705:209;10439:485;;10705:209;10880:19;;;92:4695:22;10880:19:25;;92:4695:22;10880:19:25;10443:42;10469:8;10481:4;92:4695:22;10463:15:25;10469:8;;;;;:::i;10463:15::-;92:4695:22;10463:22:25;10443:42;;3867:264:22;5078:10:20;92:4695:22;-1:-1:-1;92:4695:22;;;;;;;;5113:20:20;92:4695:22;;;;;;;;-1:-1:-1;92:4695:22;;;;3969:14;92:4695;-1:-1:-1;;;;;92:4695:22;;;;3969:14;92:4695;;5078:10:20;92:4695:22;;4826:21:20;92:4695:22;;;4857:14:20;92:4695:22;;4857:14:20;92:4695:22;;5113:20:20;92:4695:22;;;;;;;;;;4042:32;;;;:::i;:::-;;4088:8;4084:40;;3867:264::o;3533:184:20:-;3585:11;;:::i;:::-;3581:36;;-1:-1:-1;;;;;92:4695:22;;3628:27:20;92:4695:22;;3628:27:20;92:4695:22;3653:1:20;3665:14;92:4695:22;3653:1:20;3689:21;92:4695:22;3533:184:20:o;3581:36::-;3605:12;;;;;;;;5438:139;5527:20;92:4695:22;5550:20:20;92:4695:22;;;;;;;;5438:139:20;:::o;4479:187::-;4558:10;-1:-1:-1;;;;;92:4695:22;;4541:27:20;92:4695:22;;;4541:27:20;92:4695:22;4616:9:20;4598:15;92:4695:22;4598:15:20;;92:4695:22;;;4578:47:20;92:4695:22;4635:24:20;92:4695:22;4479:187:20:o;92:4695:22:-;;;;;;;;;:::o;:::-;;;;;;;;;;;;;:::o;2102:899:19:-;;;2217:33;;;;:::i;:::-;2452:13;2464:1;2467:5;2471:1;2467:5;;;;2665:42;;;;;:::i;:::-;-1:-1:-1;2754:23:19;2464:1;;2792:13;92:4695:22;;2807:19:19;;;;;92:4695:22;2884:11:19;;;;;:::i;:::-;92:4695:22;;;2857:39:19;2471:1;92:4695:22;2857:39:19;92:4695:22;;2792:13:19;;;2807:19;;-1:-1:-1;;2102:899:19:o;2452:13::-;2498:28;;92:4695:22;2498:28:19;;;;:::i;:::-;92:4695:22;;2452:13:19;;541:1316:24;;;642:21;;;;638:56;;720:19;726:12;;;;;;:::i;720:19::-;92:4695:22;;;;763:4:24;754:13;;763:4;;;817:10;;;;;;;:::i;750:1101::-;848:13;;;857:4;848:13;;857:4;;;912:10;;:28;:10;;926:13;912:10;:28;:10;;:::i;:::-;926:13;;:::i;844:1007::-;961:13;;;970:4;961:13;;970:4;;;1039:13;;1017:35;1039:13;;;;;:::i;1017:35::-;1066:18;92:4695:22;1103:13:24;92:4695:22;1098:194:24;1118:15;;;;;;1312:10;;;:33;:10;;;:24;:10;;:::i;1103:13::-;1164:11;;;;1199:1;1164:11;92:4695:22;;;;1164:11:24;1163:43;1179:27;1185:20;;1190:14;:10;;;;:::i;:14::-;1185:20;;;:::i;1163:43::-;;92:4695:22;;1103:13:24;;;;957:894;1366:13;;;1375:4;-1:-1:-1;1375:4:24;;;1428:10;:28;:10;;1442:13;1428:10;:28;:10;;:::i;:::-;1442:13;;:::i;1362:489::-;1534:13;;;1512:35;1534:13;;:::i;1512:35::-;1561:18;92:4695:22;1598:13:24;92:4695:22;1593:194:24;1613:15;;;;;;1807:10;;;:33;:10;;;:24;:10;;:::i;1598:13::-;1659:11;;;;1694:1;1659:11;92:4695:22;;;;1659:11:24;1658:43;1674:27;1680:20;;1685:14;:10;;;;:::i;1658:43::-;;92:4695:22;;1598:13:24;;;;638:56;672:22;;;92:4695:22;672:22:24;;92:4695:22;672:22:24;1567:2467:23;;;;;;;-1:-1:-1;;;;;;;;;1809:13:23;;1567:2467;;1809:13;:::i;:::-;92:4695:22;1809:20:23;1805:50;;-1:-1:-1;;;;;;;;;1870:13:23;;;;;:::i;:::-;92:4695:22;1870:21:23;92:4695:22;;1984:15:23;1907:49;1929:27;:20;1935:13;;;;;:::i;1907:49::-;1984:15;:::i;:::-;1866:190;;;;2102:33;92:4695:22;2184:31:23;;;;;;4015:12;;;;;;;92:4695:22;1567:2467:23;:::o;2177:1828::-;2368:25;2321:33;92:4695:22;;;;;;:::i;:::-;2321:33:23;:::i;:::-;2368:25;;;:::i;:::-;92:4695:22;;;;;;2465:15:23;:30;2461:81;;-1:-1:-1;;;2641:15:23;:7;;;;:::i;:::-;92:4695:22;-1:-1:-1;;;;;;92:4695:22;;;2641:7:23;-1:-1:-1;;;;;;92:4695:22;;;2641:15:23;;92:4695:22;;2676:14:23;;;2689:1;-1:-1:-1;;;2712:15:23;:7;;;;:::i;:15::-;;;2708:97;;2637:1358;2839:32;;;;:::i;:::-;2903:2;2894:11;;2903:2;;3044:58;;;;:::i;:::-;3129:8;;;3125:26;;3177:21;;3173:38;;3280:21;2890:1040;;2177:1828;;;;;;3173:38;3200:11;;;;;;;2689:1;3200:11;:::o;3125:26::-;3139:12;;;;;;;92:4695:22;3139:12:23;:::o;2890:1040::-;3330:10;;-1:-1:-1;3339:1:23;3330:10;3339:1;;-1:-1:-1;3339:1:23;;3490:67;;;;;;:::i;:::-;3584:8;;;3580:75;;3680:21;;3676:87;;3831:21;3326:604;2890:1040;;3326:604;3899:12;;;;;;;;92:4695:22;3899:12:23;:::o;2708:97::-;2771:7;2751:35;;2765:21;:14;2771:7;;;;:::i;2751:35::-;2708:97;;1866:190;2044:1;1866:190;;;;;1805:50;1838:17;;;92:4695:22;1838:17:23;;92:4695:22;1838:17:23;804:1134:19;920:1;-1:-1:-1;;;;;;;;;974:19:19;;;;;:::i;:::-;92:4695:22;974:26:19;970:55;;-1:-1:-1;;;;;;;;;1039:19:19;;;;;:::i;:::-;92:4695:22;1039:27:19;92:4695:22;;1103:19:19;1082:49;1092:39;1097:33;:26;1103:19;;1082:49;1103:19;;;;:::i;1082:49::-;1035:149;;1287:5;1270:13;:22;:48;;;;1035:149;1266:642;;1035:149;1918:13;;;804:1134;:::o;1266:642::-;920:1;1446:5;1450:1;1446:5;;;;-1:-1:-1;;;;1668:26:19;:19;;;;;;:::i;:26::-;;1664:55;;-1:-1:-1;;;1737:27:19;:19;;;;;;:::i;:27::-;;92:4695:22;;1794:39:19;1799:33;:26;1805:19;;;1784:49;1805:19;1784:49;1805:19;;:::i;1784:49::-;1266:642;;;;1733:165;1872:11;;;;;:::i;:::-;1733:165;;1431:13;1481:28;;92:4695:22;1481:28:19;;;;:::i;:::-;92:4695:22;;1431:13:19;;1270:48;:13;1313:5;1270:13;1296:22;1270:48;;1035:149;1162:11;7332:1;1035:149;;;92:4695:22;;;;;;:::i;:::-;4560:1:19;92:4695:22;;;-1:-1:-1;;92:4695:22;;;;;;:::o;:::-;;;;;;:::i;:::-;;;;;;;;;;;:::i;:::-;;;;;;;;:::o;4204:1558:19:-;4373:21;;;;4369:56;;4451:19;4457:12;;;;;;:::i;4451:19::-;92:4695:22;;;;4494:4:19;4485:13;;4494:4;;;4550:12;;;;;;:::i;:::-;92:4695:22;;;-1:-1:-1;;;;;;92:4695:22;;4576:26:19;;92:4695:22;4576:26:19;:::i;:::-;;4616:18;4560:1;4616:18;:::o;4481:1275::-;4664:4;4655:13;;;;;;;;4651:1105;4664:4;;;4733:13;;4712:34;4733:13;;:::i;4712:34::-;4769:21;;;;:::i;:::-;4809:13;92:4695:22;4824:14:19;;;;;;5006;;;;;;;:::i;4809:13::-;4876:10;4871:20;;4876:14;4885:1;4876:10;;;;:::i;:14::-;4871:20;;;:::i;:::-;92:4695:22;4859:32:19;;;;;:::i;:::-;;92:4695:22;4809:13:19;;4651:1105;5051:4;-1:-1:-1;5051:4:19;;;5120:13;5098:35;5120:13;;:::i;5098:35::-;5147:22;92:4695:22;5188:13:19;92:4695:22;5203:15:19;;;;;;5407:21;;;;:::i;:::-;5447:13;92:4695:22;5462:14:19;;;;;;5658:15;;;;;;:28;:15;;:::i;5447:13::-;5514:10;5509:34;;5514:28;5292:1;5514:10;:24;:10;;;;:::i;5509:34::-;92:4695:22;5497:46:19;;;;;:::i;:::-;;92:4695:22;5447:13:19;;5188;5253:15;5292:1;;92:4695:22;;5252:47:19;5272:27;5278:20;;5283:14;:10;;;;:::i;:14::-;5278:20;;;:::i;5252:47::-;;92:4695:22;;5188:13:19;;5038:718;5725:20;;;92:4695:22;5725:20:19;;92:4695:22;5725:20:19;2143:1860:24;92:4695:22;;2257:21:24;;;2253:56;;2335:19;2341:12;;;;;:::i;2335:19::-;92:4695:22;;;;2378:4:24;2369:13;;2378:4;;;2447:12;;;;;:::i;2365:1632::-;2552:13;;;;;2561:4;2552:13;;2561:4;;;2626:13;;2609:30;2626:13;;:::i;2609:30::-;2675:17;;;;:::i;:::-;2711:13;92:4695:22;2726:10:24;;;;;;2904;;;;;;:::i;2711:13::-;2774:10;2769:20;;2774:14;2783:1;2774:10;;;;:::i;:14::-;2769:20;;:::i;:::-;92:4695:22;2757:32:24;;;;;:::i;:::-;;92:4695:22;2711:13:24;;2548:1449;2945:4;-1:-1:-1;2945:4:24;;;3014:13;2992:35;3014:13;;:::i;2992:35::-;92:4695:22;3078:13:24;92:4695:22;3093:15:24;;;;;;3302:17;;;;:::i;:::-;3338:13;92:4695:22;3353:10:24;;;;;;3545:15;;;;;:24;:15;;:::i;3338:13::-;3401:10;3396:34;;3401:28;3174:1;3401:10;:24;:10;;;;:::i;3396:34::-;92:4695:22;3384:46:24;;;;;:::i;:::-;;92:4695:22;3338:13:24;;3078;3139:11;3174:1;;92:4695:22;;3138:43:24;3154:27;3160:20;;3165:14;:10;;;;:::i;:14::-;3160:20;;:::i;3138:43::-;;92:4695:22;;3078:13:24;;2932:1065;3676:27;;;;;;:::i;:::-;3739:22;;;;:::i;:::-;3780:13;92:4695:22;3795:15:24;;;;;;3958:28;;;;;:::o;3780:13::-;3848:10;3843:16;;3848:10;92:4695:22;3848:10:24;;;:::i;3843:16::-;92:4695:22;3831:28:24;;;;;:::i;:::-;;92:4695:22;3780:13:24;;4233:351:23;4392:1;;4233:351;4403:153;92:4695:22;;4410:20:23;;;;;4456:26;;;;:::i;:::-;92:4695:22;;;;;;;;4446:36:23;92:4695:22;;4403:153:23;;;4410:20;;;4233:351::o;92:4695:22:-;;;;;;;;;7928:1:23;92:4695:22;;;;;;;:::o;7310:1816:23:-;;;;;7616:26;;;;:::i;:::-;7673:9;;7740:26;7686:4;7667:16;7673:9;;;;:::i;7667:16::-;:23;7666:30;;7740:26;;:::i;:::-;7777:1343;;;;;;92:4695:22;7885:26:23;92:4695:22;;7885:26:23;;:::i;:::-;7915:14;92:4695:22;;7915:14:23;:::i;:::-;7885:44;7881:546;;7777:1343;8441:29;;;;;;;7680:1;8441:29;7680:1;8441:29;7680:1;8441:29;:::o;7881:546::-;7949:22;;7967:4;92:4695:22;;;7989:114:23;;7881:546;8121:292;;;;;7881:546;;;;8121:292;8187:38;8202:22;;;;:::i;:::-;8187:38;;:::i;:::-;92:4695:22;7686:4:23;92:4695:22;;;;8251:20:23;92:4695:22;7686:4:23;92:4695:22;;;;8275:16:23;8251:40;8247:148;;8121:292;;;;;;8247:148;8333:26;92:4695:22;;8333:26:23;;:::i;:::-;7967:4;;7680:1;;8319:53::o;7989:114::-;8048:36;;;;:::i;:::-;7989:114;;;;;7777:1343;8535:37;8536:36;;;;;;;;:::i;8535:37::-;8531:105;;8676:38;8691:22;;;;:::i;8676:38::-;8728:12;;92:4695:22;;7686:4:23;8758:20;;8754:294;7686:4;;;8798:80;7686:4;9076:26;8798:80;;;8754:294;;92:4695:22;9076:26:23;;:::i;:::-;9062:47;9070:4;9062:47;;;:::o;8754:294::-;8902:18;;;;7686:4;9076:26;92:4695:22;;8947:18:23;8898:150;8754:294;;8898:150;9004:29;;;;7680:1;9004:29;7680:1;9004:29;7680:1;9004:29;:::o;8531:105::-;8592:29;;;;;7680:1;8592:29;7680:1;8592:29;7680:1;8592:29;:::o;5044:1795::-;;;;;5315:14;92:4695:22;;5315:14:23;:::i;:::-;5302:27;;;5298:630;;5998:13;5994:18;;5988:25;5998:13;;;92:4695:22;;;;5998:13:23;5994:18;;:::i;5988:25::-;92:4695:22;;;6027:13:23;;92:4695:22;;;;6023:122:23;;6244:13;-1:-1:-1;6239:165:23;6259:10;92:4695:22;;;6259:10:23;;;;6441:28;;;;;:::i;:::-;92:4695:22;;;6483:20:23;;6479:96;;6812:13;;6630:2;6611:21;;6630:2;;;6648:73;;;;6607:181;6812:13;:::i;6607:181::-;6630:2;92:4695:22;6758:19:23;6607:181;6812:13;:::i;6479:96::-;6519:29;;;-1:-1:-1;6519:29:23;-1:-1:-1;6519:29:23;-1:-1:-1;6519:29:23;:::o;6244:13::-;6302:32;;92:4695:22;6286:48:23;6302:32;;92:4695:22;6302:32:23;;;:::i;6286:48::-;92:4695:22;;;;6244:13:23;;-1:-1:-1;6244:13:23;;6023:122;6130:4;6121:13;6023:122;;;5298:630;5401:32;;;;;;-1:-1:-1;5447:179:23;5467:6;5471:2;5467:6;;;;5667:27;;;;:::i;:::-;92:4695:22;;;;;;5712:20:23;92:4695:22;;;;;;5736:16:23;5712:40;5708:210;5736:16;;;92:4695:22;5772:36:23;;-1:-1:-1;5772:36:23;:::o;5708:210::-;-1:-1:-1;;;;;;;5874:29:23:o;5452:13::-;5509:31;5494:46;5509:31;;92:4695:22;5509:31:23;;;:::i;5494:46::-;92:4695:22;;5452:13:23;;;;4217:1141:24;;92:4695:22;;4321:21:24;;;4317:56;;4399:19;4405:12;;;;;:::i;4399:19::-;92:4695:22;;;;4442:4:24;4433:13;;4442:4;;;4462:8;;;;4469:1;4462:8;:::o;4429:923::-;4500:4;4491:13;;4500:4;;;4532:13;;;4527:19;4532:13;4520:26;4532:13;;:::i;4487:865::-;4576:4;4567:13;;4576:4;;;4618:13;;;4596:35;4618:13;;:::i;4596:35::-;4645:18;92:4695:22;4682:13:24;92:4695:22;4677:194:24;4697:15;;;;;;4891;;;;;:24;:15;;:::i;4682:13::-;4743:11;;;;4778:1;4743:11;92:4695:22;;;;4743:11:24;4742:43;4758:27;4764:20;;4769:14;:10;;;;:::i;:14::-;4764:20;;:::i;4742:43::-;;92:4695:22;;4682:13:24;;;;4563:789;4945:4;-1:-1:-1;4945:4:24;;;4977:13;;4972:19;4977:13;4965:26;4977:13;;:::i;4932:420::-;5044:13;;5022:35;5044:13;;:::i;5022:35::-;5071:18;92:4695:22;5108:13:24;92:4695:22;5103:194:24;5123:15;;;;;;5317;;;;;:24;:15;;:::i;5108:13::-;5169:11;;;;5204:1;5169:11;92:4695:22;;;;5169:11:24;5168:43;5184:27;5190:20;;5195:14;:10;;;;:::i;5168:43::-;;92:4695:22;;5108:13:24;;;;9295:1058:23;;92:4695:22;;9395:19:23;9391:39;;9459:17;9465:10;;;;:::i;9459:17::-;9512:4;9500:16;;9499:23;9512:4;;9596:33;9606:22;:18;92:4695:22;;9606:18:23;:::i;:::-;:22;:::i;:::-;9596:33;:::i;:::-;92:4695:22;;;-1:-1:-1;;;92:4695:22;9413:1:23;9643:36;;92:4695:22;9643:36:23;:::i;:::-;;9627:1;9698:13;92:4695:22;;9713:18:23;;;;;9785:10;9772:30;9779:22;:17;9785:10;;9627:1;9785:10;;;:::i;9779:17::-;92:4695:22;;;;;;9779:22:23;92:4695:22;;-1:-1:-1;;;;;;92:4695:22;;;9772:30:23;9752:50;9759:9;:5;;;:::i;:9::-;9752:50;9413:1;9752:50;;;;:::i;:::-;;9836:32;9674:4;9843:17;9849:10;;;;;:::i;9843:17::-;:24;92:4695:22;;-1:-1:-1;;;;;;92:4695:22;;;9836:32:23;9820:48;9827:5;;;:::i;9820:48::-;;92:4695:22;9698:13:23;;9713:18;-1:-1:-1;9713:18:23;-1:-1:-1;9295:1058:23:o;9562:761::-;92:4695:22;9993:33:23;10003:22;:18;92:4695:22;;10003:18:23;:::i;:::-;:22;:::i;9993:33::-;10057:1;10045:13;92:4695:22;;10060:18:23;;;;;10134:10;10121:30;10128:22;:17;10134:10;;10057:1;10134:10;;;:::i;10121:30::-;10099:52;10106:11;10107:5;;;:::i;:::-;10106:11;:::i;10099:52::-;;10195:32;10222:4;10202:17;10208:10;;;;;:::i;10195:32::-;10169:58;10176:15;:11;10177:5;;;:::i;10176:11::-;:15;:::i;10169:58::-;;92:4695:22;10045:13:23;;9391:39;9416:14::o;10590:651::-;;;;10709:23;92:4695:22;;10709:23:23;;:::i;:::-;10735:14;92:4695:22;;10735:14:23;:::i;:::-;-1:-1:-1;10705:58:23;;-1:-1:-1;10779:13:23;92:4695:22;;10794:18:23;;;;;10862:16;10863:10;;;;:::i;:::-;92:4695:22;;;;10862:16:23;10863:10;;10915:33;:28;10921:21;;10925:16;10926:10;;;;:::i;:::-;92:4695:22;;;;10925:16:23;10921:21;;:::i;10915:33::-;92:4695:22;11067:30:23;11080:17;11086:10;;;;;:::i;11067:30::-;92:4695:22;;11067:30:23;11063:81;;92:4695:22;;10779:13:23;;11063:81;11117:12;;;;-1:-1:-1;11117:12:23;:::o;10858:191::-;11030:4;10999:28;11005:21;;11009:16;11010:10;;;;:::i;10999:28::-;:35;10858:191;;10794:18;;;;;92:4695:22;10590:651:23;:::o;10705:58::-;10751:12;;;-1:-1:-1;10751:12:23;:::o","linkReferences":{},"immutableReferences":{"40450":[{"start":342,"length":32},{"start":1039,"length":32},{"start":1492,"length":32},{"start":1670,"length":32}],"40458":[{"start":775,"length":32},{"start":1574,"length":32}],"40460":[{"start":741,"length":32},{"start":909,"length":32}]}},"methodIdentifiers":{"MAX_BLOCK_LOOKBACK()":"3d2691bc","bond()":"64c9ec6f","bondAmount()":"80f323a7","bondedExecutor()":"1aa7c0ec","cancellationRequest()":"308657d7","collect((bytes,bytes,bytes,bytes,bytes,bytes),uint256)":"23a8b41a","currentPaymentAmount()":"8bd03d0a","currentRewardAmount()":"5a4fd645","executionDeadline()":"33ee5f35","expectedAmount()":"2feef2ec","expectedRecipient()":"8677ab23","fund(uint256,uint256)":"a65e2cfd","funded()":"f3a504f2","is_bonded()":"cb766a56","originalRewardAmount()":"d415b3f9","requestCancellation()":"81972d00","resume()":"046f7da2","totalBondsDeposited()":"fe03a460","withdraw()":"3ccfd60b"},"rawMetadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_expectedRecipient\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_expectedAmount\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_currentRewardAmount\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_currentPaymentAmount\",\"type\":\"uint256\"}],\"stateMutability\":\"payable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"AlreadyFunded\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"AmountMismatch\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"BlockHashUnavailable\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"BlockHeaderMismatch\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"BlockNumberMismatch\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"BondActive\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"CancellationRequested\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ETHTransferFailed\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ExecutorAlreadyBonded\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ExpectedRLPList\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ExpectedStringItem\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"IncorrectETHAmount\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InsufficientBond\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidAddress\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidNativeTransfer\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidRLP\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidRLPEncoding\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidRLPList\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidReceiptProof\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidTxProof\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"NoWithdrawableFunds\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"NotFunded\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OnlyBondedExecutor\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OnlyDeployer\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"RLPOffsetOutOfBounds\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"RLPOffsetOutOfBounds\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ReceiptStatusNotSuccess\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"RecipientMismatch\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"TargetBlockInFuture\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"TargetBlockTooOld\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"TxFailed\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"UnsupportedTxType\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ZeroPaymentAmount\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ZeroRewardAmount\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"MAX_BLOCK_LOOKBACK\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"bond\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"bondAmount\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"bondedExecutor\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"cancellationRequest\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes\",\"name\":\"blockHeader\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"transactionRlp\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"txProofNodes\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"receiptRlp\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"receiptProofNodes\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"path\",\"type\":\"bytes\"}],\"internalType\":\"struct EscrowNative.NativeTransferProof\",\"name\":\"proof\",\"type\":\"tuple\"},{\"internalType\":\"uint256\",\"name\":\"targetBlockNumber\",\"type\":\"uint256\"}],\"name\":\"collect\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"currentPaymentAmount\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"currentRewardAmount\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"executionDeadline\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"expectedAmount\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"expectedRecipient\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_currentRewardAmount\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_currentPaymentAmount\",\"type\":\"uint256\"}],\"name\":\"fund\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"funded\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"is_bonded\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"originalRewardAmount\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"requestCancellation\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"resume\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"totalBondsDeposited\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"withdraw\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"src/EscrowNative.sol\":\"EscrowNative\"},\"evmVersion\":\"prague\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[\":forge-std/=lib/forge-std/src/\"],\"viaIR\":true},\"sources\":{\"src/BlockHeaderParser.sol\":{\"keccak256\":\"0x10923e70f1bcc22107b31b5bd580dc0e58fb634dfc07baefb34609e3a3c3cee7\",\"license\":\"UNLICENSED\",\"urls\":[\"bzz-raw://2b3ba3998470d6c0aaf7906d21d8787dfbdded50a4683c89915295b2c2fe0ea5\",\"dweb:/ipfs/QmRiFmEeNN2HgXzabtyMVsVUBUCTrknW7ZiKTdajyQSscp\"]},\"src/EscrowBase.sol\":{\"keccak256\":\"0x53fd262562c9dbc7779339bafbeca6b86b690aec7ac864e30c57e0e42288a11d\",\"license\":\"UNLICENSED\",\"urls\":[\"bzz-raw://cb43380f5b0a131e1ac4405a43a67b9d2b07718eb05ba675fe46c106b8a12649\",\"dweb:/ipfs/QmNk5QkryXnDspEGc8mdyFYJSRXWRSP8V6yirLC98EKZYG\"]},\"src/EscrowNative.sol\":{\"keccak256\":\"0x97b788773c848491254bba688d24b146ca839c61c4fe411bd059d9722c6e8730\",\"license\":\"UNLICENSED\",\"urls\":[\"bzz-raw://ca169e73078a27043f1659a97210b1575edadcf74f3436c4acaafd08409f6623\",\"dweb:/ipfs/QmSAsWN2ioPa22Mv86LnAtN4rCECdUnrz5dPT6aLCZAhU3\"]},\"src/MPTVerifier.sol\":{\"keccak256\":\"0xf71ff6fc0fa054681fc67b7ca3c187141749b04895defd977d6989271b35ebeb\",\"license\":\"UNLICENSED\",\"urls\":[\"bzz-raw://6e2efbdee9d872e22febc5d29894e3759e72ed43850a512c9eed56a9f5e7ff3b\",\"dweb:/ipfs/QmShY9TstL2zXVSYH7ux8D6ByW22ptm7JfiEWy2qs7bHZU\"]},\"src/RLPParser.sol\":{\"keccak256\":\"0x403e6fd0cbf2e3599530d724d26e75b136bd7947e35e1cf5f79b30841b2c4c6c\",\"license\":\"UNLICENSED\",\"urls\":[\"bzz-raw://b24f44c75ae8db00297a940d0badb6b0fd9114b494b1a5c097a04f4bccde5e1d\",\"dweb:/ipfs/QmSoxh5vZu41RzAs8RTLXgQ5cD5pQBeQo68nYSFh4Dk5Xk\"]},\"src/ReceiptValidator.sol\":{\"keccak256\":\"0xd6deda056e80a69708354d192fa2e336841bf2a4d98dfa68eee4c3f550306015\",\"license\":\"UNLICENSED\",\"urls\":[\"bzz-raw://84686c66f4f5b66b3dc0315840aacb037f9fc21c60b6a58b298c6480d9ce0929\",\"dweb:/ipfs/QmSavcuzdBkNUXVyzCa4ysZY1kM7Tmt82wWFq2F3kTvwZo\"]}},\"version\":1}","metadata":{"compiler":{"version":"0.8.30+commit.73712a01"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"address","name":"_expectedRecipient","type":"address"},{"internalType":"uint256","name":"_expectedAmount","type":"uint256"},{"internalType":"uint256","name":"_currentRewardAmount","type":"uint256"},{"internalType":"uint256","name":"_currentPaymentAmount","type":"uint256"}],"stateMutability":"payable","type":"constructor"},{"inputs":[],"type":"error","name":"AlreadyFunded"},{"inputs":[],"type":"error","name":"AmountMismatch"},{"inputs":[],"type":"error","name":"BlockHashUnavailable"},{"inputs":[],"type":"error","name":"BlockHeaderMismatch"},{"inputs":[],"type":"error","name":"BlockNumberMismatch"},{"inputs":[],"type":"error","name":"BondActive"},{"inputs":[],"type":"error","name":"CancellationRequested"},{"inputs":[],"type":"error","name":"ETHTransferFailed"},{"inputs":[],"type":"error","name":"ExecutorAlreadyBonded"},{"inputs":[],"type":"error","name":"ExpectedRLPList"},{"inputs":[],"type":"error","name":"ExpectedStringItem"},{"inputs":[],"type":"error","name":"IncorrectETHAmount"},{"inputs":[],"type":"error","name":"InsufficientBond"},{"inputs":[],"type":"error","name":"InvalidAddress"},{"inputs":[],"type":"error","name":"InvalidNativeTransfer"},{"inputs":[],"type":"error","name":"InvalidRLP"},{"inputs":[],"type":"error","name":"InvalidRLPEncoding"},{"inputs":[],"type":"error","name":"InvalidRLPList"},{"inputs":[],"type":"error","name":"InvalidReceiptProof"},{"inputs":[],"type":"error","name":"InvalidTxProof"},{"inputs":[],"type":"error","name":"NoWithdrawableFunds"},{"inputs":[],"type":"error","name":"NotFunded"},{"inputs":[],"type":"error","name":"OnlyBondedExecutor"},{"inputs":[],"type":"error","name":"OnlyDeployer"},{"inputs":[],"type":"error","name":"RLPOffsetOutOfBounds"},{"inputs":[],"type":"error","name":"RLPOffsetOutOfBounds"},{"inputs":[],"type":"error","name":"ReceiptStatusNotSuccess"},{"inputs":[],"type":"error","name":"RecipientMismatch"},{"inputs":[],"type":"error","name":"TargetBlockInFuture"},{"inputs":[],"type":"error","name":"TargetBlockTooOld"},{"inputs":[],"type":"error","name":"TxFailed"},{"inputs":[],"type":"error","name":"UnsupportedTxType"},{"inputs":[],"type":"error","name":"ZeroPaymentAmount"},{"inputs":[],"type":"error","name":"ZeroRewardAmount"},{"inputs":[],"stateMutability":"view","type":"function","name":"MAX_BLOCK_LOOKBACK","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[],"stateMutability":"payable","type":"function","name":"bond"},{"inputs":[],"stateMutability":"view","type":"function","name":"bondAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"bondedExecutor","outputs":[{"internalType":"address","name":"","type":"address"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"cancellationRequest","outputs":[{"internalType":"bool","name":"","type":"bool"}]},{"inputs":[{"internalType":"struct EscrowNative.NativeTransferProof","name":"proof","type":"tuple","components":[{"internalType":"bytes","name":"blockHeader","type":"bytes"},{"internalType":"bytes","name":"transactionRlp","type":"bytes"},{"internalType":"bytes","name":"txProofNodes","type":"bytes"},{"internalType":"bytes","name":"receiptRlp","type":"bytes"},{"internalType":"bytes","name":"receiptProofNodes","type":"bytes"},{"internalType":"bytes","name":"path","type":"bytes"}]},{"internalType":"uint256","name":"targetBlockNumber","type":"uint256"}],"stateMutability":"nonpayable","type":"function","name":"collect"},{"inputs":[],"stateMutability":"view","type":"function","name":"currentPaymentAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"currentRewardAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"executionDeadline","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"expectedAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"expectedRecipient","outputs":[{"internalType":"address","name":"","type":"address"}]},{"inputs":[{"internalType":"uint256","name":"_currentRewardAmount","type":"uint256"},{"internalType":"uint256","name":"_currentPaymentAmount","type":"uint256"}],"stateMutability":"payable","type":"function","name":"fund"},{"inputs":[],"stateMutability":"view","type":"function","name":"funded","outputs":[{"internalType":"bool","name":"","type":"bool"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"is_bonded","outputs":[{"internalType":"bool","name":"","type":"bool"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"originalRewardAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[],"stateMutability":"nonpayable","type":"function","name":"requestCancellation"},{"inputs":[],"stateMutability":"nonpayable","type":"function","name":"resume"},{"inputs":[],"stateMutability":"view","type":"function","name":"totalBondsDeposited","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[],"stateMutability":"nonpayable","type":"function","name":"withdraw"}],"devdoc":{"kind":"dev","methods":{},"version":1},"userdoc":{"kind":"user","methods":{},"version":1}},"settings":{"remappings":["forge-std/=lib/forge-std/src/"],"optimizer":{"enabled":true,"runs":200},"metadata":{"bytecodeHash":"ipfs"},"compilationTarget":{"src/EscrowNative.sol":"EscrowNative"},"evmVersion":"prague","libraries":{},"viaIR":true},"sources":{"src/BlockHeaderParser.sol":{"keccak256":"0x10923e70f1bcc22107b31b5bd580dc0e58fb634dfc07baefb34609e3a3c3cee7","urls":["bzz-raw://2b3ba3998470d6c0aaf7906d21d8787dfbdded50a4683c89915295b2c2fe0ea5","dweb:/ipfs/QmRiFmEeNN2HgXzabtyMVsVUBUCTrknW7ZiKTdajyQSscp"],"license":"UNLICENSED"},"src/EscrowBase.sol":{"keccak256":"0x53fd262562c9dbc7779339bafbeca6b86b690aec7ac864e30c57e0e42288a11d","urls":["bzz-raw://cb43380f5b0a131e1ac4405a43a67b9d2b07718eb05ba675fe46c106b8a12649","dweb:/ipfs/QmNk5QkryXnDspEGc8mdyFYJSRXWRSP8V6yirLC98EKZYG"],"license":"UNLICENSED"},"src/EscrowNative.sol":{"keccak256":"0x97b788773c848491254bba688d24b146ca839c61c4fe411bd059d9722c6e8730","urls":["bzz-raw://ca169e73078a27043f1659a97210b1575edadcf74f3436c4acaafd08409f6623","dweb:/ipfs/QmSAsWN2ioPa22Mv86LnAtN4rCECdUnrz5dPT6aLCZAhU3"],"license":"UNLICENSED"},"src/MPTVerifier.sol":{"keccak256":"0xf71ff6fc0fa054681fc67b7ca3c187141749b04895defd977d6989271b35ebeb","urls":["bzz-raw://6e2efbdee9d872e22febc5d29894e3759e72ed43850a512c9eed56a9f5e7ff3b","dweb:/ipfs/QmShY9TstL2zXVSYH7ux8D6ByW22ptm7JfiEWy2qs7bHZU"],"license":"UNLICENSED"},"src/RLPParser.sol":{"keccak256":"0x403e6fd0cbf2e3599530d724d26e75b136bd7947e35e1cf5f79b30841b2c4c6c","urls":["bzz-raw://b24f44c75ae8db00297a940d0badb6b0fd9114b494b1a5c097a04f4bccde5e1d","dweb:/ipfs/QmSoxh5vZu41RzAs8RTLXgQ5cD5pQBeQo68nYSFh4Dk5Xk"],"license":"UNLICENSED"},"src/ReceiptValidator.sol":{"keccak256":"0xd6deda056e80a69708354d192fa2e336841bf2a4d98dfa68eee4c3f550306015","urls":["bzz-raw://84686c66f4f5b66b3dc0315840aacb037f9fc21c60b6a58b298c6480d9ce0929","dweb:/ipfs/QmSavcuzdBkNUXVyzCa4ysZY1kM7Tmt82wWFq2F3kTvwZo"],"license":"UNLICENSED"}},"version":1},"id":22} \ No newline at end of file From 0b387692e084dac13b7ef797f2dafcaa16d5c55f Mon Sep 17 00:00:00 2001 From: alake Date: Tue, 10 Feb 2026 20:24:13 +0100 Subject: [PATCH 9/9] refactor: eliminate memory allocations in calldata parsing (#18) * refactor: eliminate memory allocations in calldata parsing * chore: update artifacts --- artifacts/erc20_deployment.hex | 2 +- artifacts/erc20_runtime.hex | 2 +- artifacts/native_deployment.hex | 2 +- artifacts/native_runtime.hex | 2 +- out/EscrowERC20.sol/EscrowERC20.json | 2 +- out/EscrowNative.sol/EscrowNative.json | 2 +- src/BlockHeaderParser.sol | 114 +++-------------------- src/ReceiptValidator.sol | 122 ++++--------------------- 8 files changed, 38 insertions(+), 210 deletions(-) diff --git a/artifacts/erc20_deployment.hex b/artifacts/erc20_deployment.hex index b9552f3..5e9c2ad 100644 --- a/artifacts/erc20_deployment.hex +++ b/artifacts/erc20_deployment.hex @@ -1 +1 @@ -0x61010080604052346101c15760a08161256580380380916100208285610231565b8339810103126101c15761003381610268565b9061004060208201610268565b6040820151608060608401519301519160a05260c0523360805260018060a01b0383169283156102225760e0528115801580610219575b6100fc575b6040516122e8908161027d8239608051818181610166015281816103fa015281816105670152610a67015260a05181818161044c015261083a015260c0518181816101f20152610818015260e0518181816102c501528181610380015281816104ee015281816106080152818161085c01528181610f650152610ff70152f35b60ff60075460081c1661020a576101fb5780156101ec57815f55816002558060015581018091116101d8575f91606460209260405194859384926323b872dd60e01b845233600485015230602485015260448401525af19081156101cd575f9161018e575b501561017f5761010061ff001960075416176007555f80808061007c565b63022e258160e11b5f5260045ffd5b90506020813d6020116101c5575b816101a960209383610231565b810103126101c1575180151581036101c1575f610161565b5f80fd5b3d915061019c565b6040513d5f823e3d90fd5b634e487b7160e01b5f52601160045260245ffd5b63932ca0a360e01b5f5260045ffd5b63ea1083a760e01b5f5260045ffd5b635adf638760e01b5f5260045ffd5b50811515610077565b63d92e233d60e01b5f5260045ffd5b601f909101601f19168101906001600160401b0382119082101761025457604052565b634e487b7160e01b5f52604160045260245ffd5b51906001600160a01b03821682036101c15756fe60806040526004361015610011575f80fd5b5f3560e01c8063046f7da2146101545780631aa7c0ec1461014f5780632feef2ec1461014a578063308657d71461014557806333ee5f35146101405780633ccfd60b1461013b5780633d2691bc1461013657806355a373d6146101315780635a4fd6451461012c57806380f323a71461012757806381972d00146101225780638677ab231461011d5780638bd03d0a146101185780639940686e14610113578063a65e2cfd1461010e578063cb766a5614610109578063d415b3f914610104578063ede7f6a3146100ff578063f3a504f2146100fa5763fe03a460146100f5575f80fd5b61094f565b61092a565b6106e7565b6106ca565b6106a6565b61054e565b610498565b61047b565b610437565b6103e8565b6103cb565b6103af565b61036b565b61034f565b610254565b610237565b610215565b6101db565b6101b3565b346101af575f3660031901126101af577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031633036101a0576007805460ff19169055005b63618bbdd560e01b5f5260045ffd5b5f80fd5b346101af575f3660031901126101af576003546040516001600160a01b039091168152602090f35b346101af575f3660031901126101af5760206040517f00000000000000000000000000000000000000000000000000000000000000008152f35b346101af575f3660031901126101af57602060ff600754166040519015158152f35b346101af575f3660031901126101af576020600454604051908152f35b346101af575f3660031901126101af5761026c610a57565b610274610a97565b61027c610ace565b61029361ff0019600754166007555f6001555f8055565b80156103405760405163a9059cbb60e01b815233600482015260248101919091526020816044815f6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000165af190811561033b575f9161030c575b50156102fd57005b63022e258160e11b5f5260045ffd5b61032e915060203d602011610334575b6103268183610980565b8101906109a7565b5f6102f5565b503d61031c565b6109bf565b6353cd7f7960e01b5f5260045ffd5b346101af575f3660031901126101af5760206040516101008152f35b346101af575f3660031901126101af576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b346101af575f3660031901126101af5760205f54604051908152f35b346101af575f3660031901126101af576020600554604051908152f35b346101af575f3660031901126101af577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031633036101a0576007805460ff19166001179055005b346101af575f3660031901126101af576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b346101af575f3660031901126101af576020600154604051908152f35b346101af5760203660031901126101af576004356104b4610ae0565b6104bd81610b29565b6040516323b872dd60e01b8152336004820152306024820152604481018290526020816064815f6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000165af190811561033b575f9161052f575b50156102fd5761052d90610b84565b005b610548915060203d602011610334576103268183610980565b5f61051e565b346101af5760403660031901126101af576004356024357f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031633036101a05760075460081c60ff16610697578115610688578015610679576105bd826105c2935f55600255565b600155565b61060360206105d6600254600154906109ff565b6040516323b872dd60e01b8152336004820152306024820152604481019190915291829081906064820190565b03815f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165af190811561033b575f9161065a575b50156102fd5761052d61010061ff00196007541617600755565b610673915060203d602011610334576103268183610980565b5f610640565b63932ca0a360e01b5f5260045ffd5b63ea1083a760e01b5f5260045ffd5b635adf638760e01b5f5260045ffd5b346101af575f3660031901126101af5760206106c0610a0c565b6040519015158152f35b346101af575f3660031901126101af576020600254604051908152f35b346101af5760403660031901126101af5760043567ffffffffffffffff81116101af578060040160a060031983360301126101af576024356107298280610a24565b60075461073e9060081c60ff161590565b1590565b61091b5760035461075f906001600160a01b03165b6001600160a01b031690565b331480159061090a575b6108fb574383116108ec576101006107818443610bc9565b116108dd57824080156108ce57610799368385610bf2565b60208151910120036108bf576107ae91611072565b036108b0576107c66107c08280610a24565b90610c56565b9161080061073a60248301946107dc8686610a24565b906107ea6044870188610a24565b906107f8606489018a610a24565b949093610cc6565b6108a15760846108166108869461073a94610a24565b7f0000000000000000000000000000000000000000000000000000000000000000937f0000000000000000000000000000000000000000000000000000000000000000937f0000000000000000000000000000000000000000000000000000000000000000939101359190610d4a565b6108925761052d610ee4565b6364fa89e160e11b5f5260045ffd5b637b374dd160e01b5f5260045ffd5b63048a12f560e11b5f5260045ffd5b63ff28378760e01b5f5260045ffd5b63bfc9f0d360e01b5f5260045ffd5b63c42a018560e01b5f5260045ffd5b63058968cf60e41b5f5260045ffd5b6337b5f20360e21b5f5260045ffd5b5061091661073a610a0c565b610769565b636af784dd60e11b5f5260045ffd5b346101af575f3660031901126101af57602060ff60075460081c166040519015158152f35b346101af575f3660031901126101af576020600654604051908152f35b634e487b7160e01b5f52604160045260245ffd5b90601f8019910116810190811067ffffffffffffffff8211176109a257604052565b61096c565b908160209103126101af575180151581036101af5790565b6040513d5f823e3d90fd5b634e487b7160e01b5f52601160045260245ffd5b90600182018092116109ec57565b6109ca565b60010190816001116109ec57565b919082018092116109ec57565b6004548015159081610a1c575090565b905042111590565b903590601e19813603018212156101af570180359067ffffffffffffffff82116101af576020019181360383136101af57565b60ff60075460081c161561091b577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031633036101a057565b610a9f610a0c565b610abf576001600160601b0360a01b600354166003555f6005555f600455565b639cbc1de160e01b5f5260045ffd5b60015460025481018091116109ec5790565b6004548015159081610b1f575b50610af457565b6005545f548181018091116109ec575f556006549081018091116109ec57600655610b1d610a97565b565b905042115f610aed565b60075460ff8160081c161561091b5760ff16610b7557610b47610a0c565b610b66575f5460011c11610b5757565b63e92c469f60e01b5f5260045ffd5b63129f78e960e11b5f5260045ffd5b632479328960e01b5f5260045ffd5b336001600160601b0360a01b600354161760035561012c42018042116109ec57600455600555565b6001198101919082116109ec57565b5f198101919082116109ec57565b919082039182116109ec57565b67ffffffffffffffff81116109a257601f01601f191660200190565b929192610bfe82610bd6565b91610c0c6040519384610980565b8294818452818301116101af578281602093845f960137010152565b634e487b7160e01b5f52603260045260245ffd5b9015610c455790565b610c28565b90821015610c45570190565b90610c6181836110da565b905f5b60058110610cb15750600560fd1b906001600160f81b031990610c8990849086610c4a565b351603610ca2576001810181116109ec57016001013590565b633954003560e11b5f5260045ffd5b91610cbf600191838661120e565b9201610c64565b610cdc610ce492939495610cea98973691610bf2565b923691610bf2565b9061137d565b90565b60ff60f6199116019060ff82116109ec57565b60ff60bf199116019060ff82116109ec57565b60ff60b6199116019060ff82116109ec57565b60ff607f199116019060ff82116109ec57565b60ff166001019060ff82116109ec57565b9594939291905f818881151580610ec8575b610eba575b610d8a610d84610d768560c09560ff95610c4a565b356001600160f81b03191690565b60f81c90565b1610610e8457808860f860ff610da8610d84610d7688978887610c4a565b1610610eaa57610dd5610dd0610dcb610d84610d7686610de198610ddb97610c4a565b610ced565b610d39565b60ff1690565b906109ff565b81885f5b60038110610e935750610dd5610d84610d768560c095610e0495610c4a565b10610e8457808860f8610e22610dd5610d84610d7688978887610c4a565b10610e7357610dd5610dd0610dcb610d84610d7686610e4498610ddb97610c4a565b915b5f905b808210610e5c575050610cea959661152a565b9092610e6b600191848b61120e565b930190610e49565b50610e7e91506109de565b91610e46565b631bd5dcf760e31b5f5260045ffd5b92600192610ea09261120e565b9101888391610de5565b50610eb591506109de565b610de1565b506001915082905088610d61565b50608060ff610edd610d84610d768686610c3c565b1610610d5c565b610eec6115f1565b6003546001600160a01b0316610f296001600160601b0360a01b600354166003555f6005555f60045561ff0019600754166007555f6001555f8055565b4662aa36a703610fc557604051633419e74d60e21b81526001600160a01b0390911660048201526024810191909152602081806044810103815f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165af190811561033b575f91610fa6575b505b156102fd57565b610fbf915060203d602011610334576103268183610980565b5f610f9d565b60405163a9059cbb60e01b81526001600160a01b0390911660048201526024810191909152602081806044810103815f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165af190811561033b575f91611035575b50610f9f565b61104e915060203d602011610334576103268183610980565b5f61102f565b805115610c455760200190565b908151811015610c45570160200190565b919061107e81846110da565b905f5b600881106110c557506110949293611684565b50905f805b83518210156110c0576001906110af8386611061565b5160f81c9060081b17910190611099565b925050565b916110d3600191838761120e565b9201611081565b5f600360fe1b6001600160f81b03196110f6610d768686610c3c565b16106111d657601f60fb1b6001600160f81b0319611117610d768686610c3c565b16106112055780610ddb610dd5610dd0610dcb610d84610d7661113b978a8a610c4a565b905b61a5bd461480156111fa575b611154575b50905090565b5f5b600381106111e55750600360fe1b611182611175610d76858786610c4a565b6001600160f81b03191690565b106111d657601f60fb1b61119d611175610d76858786610c4a565b106111c657610dd5610dd0610dcb610d84610d76866111bf98610ddb97610c4a565b805f61114e565b506111d191506109de565b6111bf565b63c0098bd960e01b5f5260045ffd5b916111f3600191858461120e565b9201611156565b5061a5bf4614611149565b5060019061113d565b91908082101561136e57611229610d84610d76848487610c4a565b9060ff8216608081101561124457505050610cea91506109de565b91929160b881101561126c575050610cea9250610dd5611266610ddb926109de565b92610d26565b90929060c08110156112e75750610dd561128891949394610d13565b915f935f915b8483106112ae57505050610cea92916112a96112a9926109de565b6109ff565b9091946112bd60019160081b90565b6112dd610dd5610d84610d766112d68b6112a98b6109de565b8888610c4a565b179501919061128e565b90929060f8111561130d5750610cea9250610dd5611307610ddb926109de565b92610d00565b9291610dd561131b91610ced565b915f935f915b84831061133c57505050610cea92916112a96112a9926109de565b90919461134b60019160081b90565b611364610dd5610d84610d766112d68b6112a98b6109de565b1795019190611321565b6318d76ae160e11b5f5260045ffd5b919390929190600360fe1b6001600160f81b031961139e610d768689610c3c565b161061151b57601f60fb1b6001600160f81b03196113bf610d768689610c3c565b1610611511576113e36113de610dd5610dcb610d84610d76888b610c3c565b6109f1565b9492905b945f5b8282106113fc57505050505050505f90565b61141a6114138361140e36878a610bf2565b6117f5565b90936109ff565b9682516020840120036114af57600360fe1b61144961117561143b85611054565b516001600160f81b03191690565b106114af578590846001601f60fb1b61146761117561143b88611054565b10156114f3575b611478818661197c565b601181036114ba575061148a94611b07565b9491156114af5784156114a35793915b919590936113ea565b50505050505050600190565b505050505050505f90565b9093506002141590506114e7578487926114d3946119c1565b9491156114af5784156114a357939161149a565b50505050505050505f90565b5061150c6113de610dd5610dcb610d8461143b89611054565b61146e565b60019492906113e7565b63ebb47d1d60e01b5f5260045ffd5b91949392948060c060ff611545610d84610d7685888a610c4a565b1610610e845760f860ff611560610d84610d7685888a610c4a565b16106115e2575080610ddb610dd5610dd0610dcb610d84610d7661158597898b610c4a565b611590818385611c1c565b969060148151036115d357601401516001600160a01b039182169116036115c457610cea956115be916109ff565b91611c88565b63a087f96f60e01b5f5260045ffd5b63e6c4247b60e01b5f5260045ffd5b6115ec91506109de565b611585565b6005545f5481018091116109ec5760015481018091116109ec5790565b6040805190919061161f8382610980565b6001815291601f1901366020840137565b604080519091906116418382610980565b6014815291601f1901366020840137565b9061165c82610bd6565b6116696040519182610980565b828152809261167a601f1991610bd6565b0190602036910137565b8183101561136e5761169d610d84610d76858585610c4a565b9260ff841660808110156116d757505050506116b761160e565b9060f81b6001600160f81b0319165f1a6116d082611054565b5390600190565b60b881969592939496105f146117455750610dd56116f491610d26565b916116fe83611652565b945f5b8481106117155750505050610cea906109f1565b80611732610d7661172b6001946112a9896109de565b8587610c4a565b5f1a61173e828a611061565b5301611701565b60c011156117e657610dd561175991610d13565b905f925f5b8381106117b7575061176f84611652565b955f5b85811061178a5750505050906112a9610cea926109f1565b806117a4610d7661172b6001946112a98a6112a98b6109de565b5f1a6117b0828b611061565b5301611772565b9360019060081b6117de610dd5610d84610d766117d78a6112a98a6109de565b8c88610c4a565b17940161175e565b636b2e9c5f60e11b5f5260045ffd5b805182101561136e5761180e610d8461143b8484611061565b9160ff83166080811015611827575050506116b761160e565b919392909160b88110156118915750610dd561184291610d26565b9061184c82611652565b935f5b83811061186257505050610cea906109f1565b8061187e61143b6118786001946112a9886109de565b85611061565b5f1a61188a8289611061565b530161184f565b60c0111561192f57610dd56118a591610d13565b5f915f5b82811061190157506118ba83611652565b945f5b8481106118d457505050906112a9610cea926109f1565b806118ee61143b6118786001946112a9896112a98a6109de565b5f1a6118fa828a611061565b53016118bd565b9260019060081b611927610dd5610d8461143b611921896112a9896109de565b8b611061565b1793016118a9565b509161193b8382611ddf565b9261194584611652565b915f5b858110611956575050509190565b8061196961143b611878600194876109ff565b5f1a6119758287611061565b5301611948565b5f92915b81518110156119a7576119938183611ddf565b81018091116109ec57600190930192611980565b5050565b908160011b91808304600214901517156109ec57565b839492916119cf81836117f5565b93906119ee60206119e5610d8461143b85611054565b16151591611f0c565b97889115611a905750611a029051876109ff565b611a0c82516119ab565b14611a21575b505050505050505f905f905f90565b86866001928251611a7e575b505050611a3b575b80611a12565b611a4e92611a48916109ff565b906117f5565b5060208151910120906020815191012014611a6c5780808080611a35565b611a779151906109ff565b6001915f90565b611a889350612075565b86865f611a2d565b611aa1939495965061073a92612075565b611afa57611ab292611a48916109ff565b50908151602081145f14611ada57506020611ad2920151925b51906109ff565b916001929190565b8015611aee576020611ad293012092611acb565b505050505f905f905f90565b50505050505f905f905f90565b91909293611b1582516119ab565b851015611bbf5750610d8461143b611b3792611b318760011c90565b90611061565b60018416611bb65760041c600f16915b905f925b60ff81168410611b965750611b6092506117f5565b5080518015611b8b57611ad29160208203611b8157602091500151916109de565b60200120916109de565b5050505f905f905f90565b90916001611baa82610ddb60ff9487611ddf565b94019392919050611b4b565b600f1691611b47565b9290509392935f915b60108310611c0257611bda92506117f5565b50602081519101209060208151910120145f14611bf957600191905f90565b5f915081908190565b90611c1381610ddb60019385611ddf565b92019190611bc8565b91909182821015610e8457609460ff611c3c610d84610d76868887610c4a565b16036115d357611c4a611630565b925f5b60148110611c5f575050505090601590565b80611c75610d7661172b6001946112a9896109de565b5f1a611c818288611061565b5301611c4d565b91928360c060ff611ca0610d84610d7689888a610c4a565b1610610e845760f860ff611cbb610d84610d7689888a610c4a565b1610611dd05780610ddb610dd5610dd0610dcb610d84610d76611cdf978a8c610c4a565b7fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef611d0b828587612133565b03611dc157610753610753611d2e611d27611d3594878961120e565b868861120e565b8587612133565b6001600160a01b03918216911603611db257611d55611d5b93828461120e565b9161216f565b50916020835111610e84575f90815b8451831015611d955760019060081b611d8c610dd5610d8461143b878a611061565b17920191611d6a565b9150925003611da357600190565b6355e97b0d60e01b5f5260045ffd5b634cd4b7b160e01b5f5260045ffd5b6324da545d60e11b5f5260045ffd5b50611dda846109de565b611cdf565b90815181101561136e57611df9610d8461143b8385611061565b9160ff83166080811015611e105750505050600190565b60b8811015611e2b57505050610dd5610dd0610cea92610d26565b60c0811015611e97575091610dd5611e4291610d13565b905f925f915b838310611e5f57505050906112a9610cea926109f1565b909193611e6e60019160081b90565b611e8d610dd5610d8461143b611e878a6112a9896109de565b88611061565b1794019190611e48565b60f81115611eb0575050610dd5610dd0610cea92610d00565b91610dd5611ebd91610ced565b905f925f915b838310611eda57505050906112a9610cea926109f1565b909193611ee960019160081b90565b611f02610dd5610d8461143b611e878a6112a9896109de565b1794019190611ec3565b90815115610b1d57611f23610d8461143b84611054565b6010811615611ff257611f46611f41611f3c85516119ab565b610bbb565b611652565b9060f81b600f60f81b165f1a611f5b82611054565b5360015b8351811015611fed5780611f9a611f8a611f81610d8461143b6001968a611061565b60041c600f1690565b60f81b6001600160f81b03191690565b611fb3611fa9611f3c846119ab565b915f1a9185611061565b53611fda600f611fc9610d8461143b858a611061565b1660f81b6001600160f81b03191690565b611fe6611fa9836119ab565b5301611f5f565b509150565b50612008611f4161200384516119ab565b610bac565b60015b8351811015611fed578061202d611f8a611f81610d8461143b6001968a611061565b612041611fa961203c84610bbb565b6119ab565b53612057600f611fc9610d8461143b858a611061565b61206e611fa961206961203c85610bbb565b6109de565b530161200b565b9190916120838251846109ff565b61208d82516119ab565b1061212c575f5b8251811015612123576120b06120aa82866109ff565b60011690565b612105576120d9611f81610d8461143b6120d36120cd868a6109ff565b60011c90565b86611061565b60ff6120ee610dd5610d8461143b8689611061565b9116036120fd57600101612094565b505050505f90565b600f61211d610d8461143b6120d36120cd868a6109ff565b166120d9565b50505050600190565b5050505f90565b9190600560fd1b906001600160f81b03199061215190849086610c4a565b35160361216057016001013590565b63f0ff325b60e01b5f5260045ffd5b81831015610e8457612188610d84610d76858585610c4a565b9260ff841660808110156121a257505050506116b761160e565b60b881969592939496105f146122095750610dd56121bf91610d26565b916121c983611652565b945f5b8481106121e05750505050610cea906109f1565b806121f6610d7661172b6001946112a9896109de565b5f1a612202828a611061565b53016121cc565b60c011156122a357610dd561221d91610d13565b905f925f5b83811061227b575061223384611652565b955f5b85811061224e5750505050906112a9610cea926109f1565b80612268610d7661172b6001946112a98a6112a98b6109de565b5f1a612274828b611061565b5301612236565b9360019060081b61229b610dd5610d84610d766117d78a6112a98a6109de565b179401612222565b6336459a5b60e21b5f5260045ffdfea2646970667358221220f111dda4228930ff7fcf5360c1e823b8ddcd3e1621a6c54215af8789b55a438f64736f6c634300081e0033 +0x61010080604052346101c15760a08161230980380380916100208285610231565b8339810103126101c15761003381610268565b9061004060208201610268565b6040820151608060608401519301519160a05260c0523360805260018060a01b0383169283156102225760e0528115801580610219575b6100fc575b60405161208c908161027d8239608051818181610166015281816103fa015281816105670152610a75015260a05181818161044c015261083a015260c0518181816101f20152610818015260e0518181816102c501528181610380015281816104ee015281816106080152818161085c01528181610f7301526110050152f35b60ff60075460081c1661020a576101fb5780156101ec57815f55816002558060015581018091116101d8575f91606460209260405194859384926323b872dd60e01b845233600485015230602485015260448401525af19081156101cd575f9161018e575b501561017f5761010061ff001960075416176007555f80808061007c565b63022e258160e11b5f5260045ffd5b90506020813d6020116101c5575b816101a960209383610231565b810103126101c1575180151581036101c1575f610161565b5f80fd5b3d915061019c565b6040513d5f823e3d90fd5b634e487b7160e01b5f52601160045260245ffd5b63932ca0a360e01b5f5260045ffd5b63ea1083a760e01b5f5260045ffd5b635adf638760e01b5f5260045ffd5b50811515610077565b63d92e233d60e01b5f5260045ffd5b601f909101601f19168101906001600160401b0382119082101761025457604052565b634e487b7160e01b5f52604160045260245ffd5b51906001600160a01b03821682036101c15756fe60806040526004361015610011575f80fd5b5f3560e01c8063046f7da2146101545780631aa7c0ec1461014f5780632feef2ec1461014a578063308657d71461014557806333ee5f35146101405780633ccfd60b1461013b5780633d2691bc1461013657806355a373d6146101315780635a4fd6451461012c57806380f323a71461012757806381972d00146101225780638677ab231461011d5780638bd03d0a146101185780639940686e14610113578063a65e2cfd1461010e578063cb766a5614610109578063d415b3f914610104578063ede7f6a3146100ff578063f3a504f2146100fa5763fe03a460146100f5575f80fd5b61094f565b61092a565b6106e7565b6106ca565b6106a6565b61054e565b610498565b61047b565b610437565b6103e8565b6103cb565b6103af565b61036b565b61034f565b610254565b610237565b610215565b6101db565b6101b3565b346101af575f3660031901126101af577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031633036101a0576007805460ff19169055005b63618bbdd560e01b5f5260045ffd5b5f80fd5b346101af575f3660031901126101af576003546040516001600160a01b039091168152602090f35b346101af575f3660031901126101af5760206040517f00000000000000000000000000000000000000000000000000000000000000008152f35b346101af575f3660031901126101af57602060ff600754166040519015158152f35b346101af575f3660031901126101af576020600454604051908152f35b346101af575f3660031901126101af5761026c610a65565b610274610aa5565b61027c610adc565b61029361ff0019600754166007555f6001555f8055565b80156103405760405163a9059cbb60e01b815233600482015260248101919091526020816044815f6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000165af190811561033b575f9161030c575b50156102fd57005b63022e258160e11b5f5260045ffd5b61032e915060203d602011610334575b6103268183610980565b8101906109a7565b5f6102f5565b503d61031c565b6109bf565b6353cd7f7960e01b5f5260045ffd5b346101af575f3660031901126101af5760206040516101008152f35b346101af575f3660031901126101af576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b346101af575f3660031901126101af5760205f54604051908152f35b346101af575f3660031901126101af576020600554604051908152f35b346101af575f3660031901126101af577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031633036101a0576007805460ff19166001179055005b346101af575f3660031901126101af576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b346101af575f3660031901126101af576020600154604051908152f35b346101af5760203660031901126101af576004356104b4610aee565b6104bd81610b37565b6040516323b872dd60e01b8152336004820152306024820152604481018290526020816064815f6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000165af190811561033b575f9161052f575b50156102fd5761052d90610b92565b005b610548915060203d602011610334576103268183610980565b5f61051e565b346101af5760403660031901126101af576004356024357f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031633036101a05760075460081c60ff16610697578115610688578015610679576105bd826105c2935f55600255565b600155565b61060360206105d660025460015490610a0d565b6040516323b872dd60e01b8152336004820152306024820152604481019190915291829081906064820190565b03815f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165af190811561033b575f9161065a575b50156102fd5761052d61010061ff00196007541617600755565b610673915060203d602011610334576103268183610980565b5f610640565b63932ca0a360e01b5f5260045ffd5b63ea1083a760e01b5f5260045ffd5b635adf638760e01b5f5260045ffd5b346101af575f3660031901126101af5760206106c0610a1a565b6040519015158152f35b346101af575f3660031901126101af576020600254604051908152f35b346101af5760403660031901126101af5760043567ffffffffffffffff81116101af578060040160a060031983360301126101af576024356107298280610a32565b60075461073e9060081c60ff161590565b1590565b61091b5760035461075f906001600160a01b03165b6001600160a01b031690565b331480159061090a575b6108fb574383116108ec576101006107818443610bd7565b116108dd57824080156108ce57610799368385610c00565b60208151910120036108bf576107ae91611062565b036108b0576107c66107c08280610a32565b90610c64565b9161080061073a60248301946107dc8686610a32565b906107ea6044870188610a32565b906107f8606489018a610a32565b949093610cd4565b6108a15760846108166108869461073a94610a32565b7f0000000000000000000000000000000000000000000000000000000000000000937f0000000000000000000000000000000000000000000000000000000000000000937f0000000000000000000000000000000000000000000000000000000000000000939101359190610d58565b6108925761052d610ef2565b6364fa89e160e11b5f5260045ffd5b637b374dd160e01b5f5260045ffd5b63048a12f560e11b5f5260045ffd5b63ff28378760e01b5f5260045ffd5b63bfc9f0d360e01b5f5260045ffd5b63c42a018560e01b5f5260045ffd5b63058968cf60e41b5f5260045ffd5b6337b5f20360e21b5f5260045ffd5b5061091661073a610a1a565b610769565b636af784dd60e11b5f5260045ffd5b346101af575f3660031901126101af57602060ff60075460081c166040519015158152f35b346101af575f3660031901126101af576020600654604051908152f35b634e487b7160e01b5f52604160045260245ffd5b90601f8019910116810190811067ffffffffffffffff8211176109a257604052565b61096c565b908160209103126101af575180151581036101af5790565b6040513d5f823e3d90fd5b634e487b7160e01b5f52601160045260245ffd5b90600182018092116109ec57565b6109ca565b60010190816001116109ec57565b90601582018092116109ec57565b919082018092116109ec57565b6004548015159081610a2a575090565b905042111590565b903590601e19813603018212156101af570180359067ffffffffffffffff82116101af576020019181360383136101af57565b60ff60075460081c161561091b577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031633036101a057565b610aad610a1a565b610acd576001600160601b0360a01b600354166003555f6005555f600455565b639cbc1de160e01b5f5260045ffd5b60015460025481018091116109ec5790565b6004548015159081610b2d575b50610b0257565b6005545f548181018091116109ec575f556006549081018091116109ec57600655610b2b610aa5565b565b905042115f610afb565b60075460ff8160081c161561091b5760ff16610b8357610b55610a1a565b610b74575f5460011c11610b6557565b63e92c469f60e01b5f5260045ffd5b63129f78e960e11b5f5260045ffd5b632479328960e01b5f5260045ffd5b336001600160601b0360a01b600354161760035561012c42018042116109ec57600455600555565b6001198101919082116109ec57565b5f198101919082116109ec57565b919082039182116109ec57565b67ffffffffffffffff81116109a257601f01601f191660200190565b929192610c0c82610be4565b91610c1a6040519384610980565b8294818452818301116101af578281602093845f960137010152565b634e487b7160e01b5f52603260045260245ffd5b9015610c535790565b610c36565b90821015610c53570190565b90610c6f818361111e565b905f5b60058110610cbf5750600560fd1b906001600160f81b031990610c9790849086610c58565b351603610cb0576001810181116109ec57016001013590565b633954003560e11b5f5260045ffd5b91610ccd6001918386611252565b9201610c72565b610cea610cf292939495610cf898973691610c00565b923691610c00565b906113da565b90565b60ff60f6199116019060ff82116109ec57565b60ff607f199116019060ff82116109ec57565b60ff60bf199116019060ff82116109ec57565b60ff60b6199116019060ff82116109ec57565b60ff166001019060ff82116109ec57565b9594939291905f818881151580610ed6575b610ec8575b610d98610d92610d848560c09560ff95610c58565b356001600160f81b03191690565b60f81c90565b1610610e9257808860f860ff610db6610d92610d8488978887610c58565b1610610eb857610de3610dde610dd9610d92610d8486610def98610de997610c58565b610cfb565b610d47565b60ff1690565b90610a0d565b81885f5b60038110610ea15750610de3610d92610d848560c095610e1295610c58565b10610e9257808860f8610e30610de3610d92610d8488978887610c58565b10610e8157610de3610dde610dd9610d92610d8486610e5298610de997610c58565b915b5f905b808210610e6a575050610cf89596611587565b9092610e79600191848b611252565b930190610e57565b50610e8c91506109de565b91610e54565b631bd5dcf760e31b5f5260045ffd5b92600192610eae92611252565b9101888391610df3565b50610ec391506109de565b610def565b506001915082905088610d6f565b50608060ff610eeb610d92610d848686610c4a565b1610610d6a565b610efa611657565b6003546001600160a01b0316610f376001600160601b0360a01b600354166003555f6005555f60045561ff0019600754166007555f6001555f8055565b4662aa36a703610fd357604051633419e74d60e21b81526001600160a01b0390911660048201526024810191909152602081806044810103815f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165af190811561033b575f91610fb4575b505b156102fd57565b610fcd915060203d602011610334576103268183610980565b5f610fab565b60405163a9059cbb60e01b81526001600160a01b0390911660048201526024810191909152602081806044810103815f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165af190811561033b575f91611043575b50610fad565b61105c915060203d602011610334576103268183610980565b5f61103d565b61106c828261111e565b915f5b600881106111095750611089610d92610d84858486610c58565b925f9260ff851694608086105f146110a357505050505090565b6110b49193949550610de390610d0e565b915f935b8385106110c757505050505090565b90919293946110d860019160081b90565b6110fd610de3610d92610d846110f68b6110f18b6109de565b610a0d565b8789610c58565b179501939291906110b8565b926111176001918385611252565b930161106f565b5f600360fe1b6001600160f81b031961113a610d848686610c4a565b161061121a57601f60fb1b6001600160f81b031961115b610d848686610c4a565b16106112495780610de9610de3610dde610dd9610d92610d8461117f978a8a610c58565b905b61a5bd4614801561123e575b611198575b50905090565b5f5b600381106112295750600360fe1b6111c66111b9610d84858786610c58565b6001600160f81b03191690565b1061121a57601f60fb1b6111e16111b9610d84858786610c58565b1061120a57610de3610dde610dd9610d92610d848661120398610de997610c58565b805f611192565b5061121591506109de565b611203565b63c0098bd960e01b5f5260045ffd5b916112376001918584611252565b920161119a565b5061a5bf461461118d565b50600190611181565b9190808210156113ad5761126d610d92610d84848487610c58565b9060ff8216608081101561128857505050610cf891506109de565b91929160b88110156112b0575050610cf89250610de36112aa610de9926109de565b92610d0e565b90929060c08110156113265750610de36112cc91949394610d34565b915f935f915b8483106112ed57505050610cf892916110f16110f1926109de565b9091946112fc60019160081b90565b61131c610de3610d92610d846113158b6110f18b6109de565b8888610c58565b17950191906112d2565b90929060f8111561134c5750610cf89250610de3611346610de9926109de565b92610d21565b9291610de361135a91610cfb565b915f935f915b84831061137b57505050610cf892916110f16110f1926109de565b90919461138a60019160081b90565b6113a3610de3610d92610d846113158b6110f18b6109de565b1795019190611360565b6318d76ae160e11b5f5260045ffd5b805115610c535760200190565b908151811015610c53570160200190565b919390929190600360fe1b6001600160f81b03196113fb610d848689610c4a565b161061157857601f60fb1b6001600160f81b031961141c610d848689610c4a565b161061156e5761144061143b610de3610dd9610d92610d84888b610c4a565b6109f1565b9492905b945f5b82821061145957505050505050505f90565b6114776114708361146b36878a610c00565b6116c8565b9093610a0d565b96825160208401200361150c57600360fe1b6114a66111b9611498856113bc565b516001600160f81b03191690565b1061150c578590846001601f60fb1b6114c46111b9611498886113bc565b1015611550575b6114d5818661186f565b6011810361151757506114e7946119fa565b94911561150c5784156115005793915b91959093611447565b50505050505050600190565b505050505050505f90565b90935060021415905061154457848792611530946118b4565b94911561150c5784156115005793916114f7565b50505050505050505f90565b5061156961143b610de3610dd9610d92611498896113bc565b6114cb565b6001949290611444565b63ebb47d1d60e01b5f5260045ffd5b91949392948060c060ff6115a2610d92610d8485888a610c58565b1610610e925760f860ff6115bd610d92610d8485888a610c58565b1610611647575080610de9610de3610dde610dd9610d92610d846115e297898b610c58565b945b609460ff6115f9610d92610d848a8789610c58565b1603611638576001600160a01b03168286016001013560601c0361162957611623610cf8956109ff565b91611b0f565b63a087f96f60e01b5f5260045ffd5b63e6c4247b60e01b5f5260045ffd5b61165191506109de565b946115e4565b6005545f5481018091116109ec5760015481018091116109ec5790565b604080519091906116858382610980565b6001815291601f1901366020840137565b906116a082610be4565b6116ad6040519182610980565b82815280926116be601f1991610be4565b0190602036910137565b80518210156113ad576116e1610d9261149884846113c9565b9160ff8316608081101561171a575050506116fa611674565b9060f81b6001600160f81b0319165f1a611713826113bc565b5390600190565b919392909160b88110156117845750610de361173591610d0e565b9061173f82611696565b935f5b83811061175557505050610cf8906109f1565b8061177161149861176b6001946110f1886109de565b856113c9565b5f1a61177d82896113c9565b5301611742565b60c0111561182257610de361179891610d34565b5f915f5b8281106117f457506117ad83611696565b945f5b8481106117c757505050906110f1610cf8926109f1565b806117e161149861176b6001946110f1896110f18a6109de565b5f1a6117ed828a6113c9565b53016117b0565b9260019060081b61181a610de3610d92611498611814896110f1896109de565b8b6113c9565b17930161179c565b509161182e8382611cc6565b9261183884611696565b915f5b858110611849575050509190565b8061185c61149861176b60019487610a0d565b5f1a61186882876113c9565b530161183b565b5f92915b815181101561189a576118868183611cc6565b81018091116109ec57600190930192611873565b5050565b908160011b91808304600214901517156109ec57565b839492916118c281836116c8565b93906118e160206118d8610d92611498856113bc565b16151591611df3565b9788911561198357506118f5905187610a0d565b6118ff825161189e565b14611914575b505050505050505f905f905f90565b86866001928251611971575b50505061192e575b80611905565b6119419261193b91610a0d565b906116c8565b506020815191012090602081519101201461195f5780808080611928565b61196a915190610a0d565b6001915f90565b61197b9350611f5c565b86865f611920565b611994939495965061073a92611f5c565b6119ed576119a59261193b91610a0d565b50908151602081145f146119cd575060206119c5920151925b5190610a0d565b916001929190565b80156119e15760206119c5930120926119be565b505050505f905f905f90565b50505050505f905f905f90565b91909293611a08825161189e565b851015611ab25750610d92611498611a2a92611a248760011c90565b906113c9565b60018416611aa95760041c600f16915b905f925b60ff81168410611a895750611a5392506116c8565b5080518015611a7e576119c59160208203611a7457602091500151916109de565b60200120916109de565b5050505f905f905f90565b90916001611a9d82610de960ff9487611cc6565b94019392919050611a3e565b600f1691611a3a565b9290509392935f915b60108310611af557611acd92506116c8565b50602081519101209060208151910120145f14611aec57600191905f90565b5f915081908190565b90611b0681610de960019385611cc6565b92019190611abb565b929190918160c060ff611b29610d92610d8487898b610c58565b1610610e925760f860ff611b44610d92610d8487898b610c58565b1610611cb75780610de9610de3610dde610dd9610d92610d84611b68978b8d610c58565b7fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef611b9482868861201a565b03611ca857610753610753611bb7611bb0611bbe94888a611252565b8789611252565b868861201a565b6001600160a01b03918216911603611c9957611bdb908284611252565b905f91611bef610d92610d84838588610c58565b60ff811694906080861015611c1d5750505050505b03611c0e57600190565b6355e97b0d60e01b5f5260045ffd5b9091929394608081145f14611c38575050505050505f611c04565b60a010610e9257610de3611c4e91939293610d0e565b915f935b838510611c63575050505050611c04565b9091929394611c7460019160081b90565b611c8d610de3610d92610d846110f68b6110f18b6109de565b17950193929190611c52565b634cd4b7b160e01b5f5260045ffd5b6324da545d60e11b5f5260045ffd5b50611cc1826109de565b611b68565b9081518110156113ad57611ce0610d9261149883856113c9565b9160ff83166080811015611cf75750505050600190565b60b8811015611d1257505050610de3610dde610cf892610d0e565b60c0811015611d7e575091610de3611d2991610d34565b905f925f915b838310611d4657505050906110f1610cf8926109f1565b909193611d5560019160081b90565b611d74610de3610d92611498611d6e8a6110f1896109de565b886113c9565b1794019190611d2f565b60f81115611d97575050610de3610dde610cf892610d21565b91610de3611da491610cfb565b905f925f915b838310611dc157505050906110f1610cf8926109f1565b909193611dd060019160081b90565b611de9610de3610d92611498611d6e8a6110f1896109de565b1794019190611daa565b90815115610b2b57611e0a610d92611498846113bc565b6010811615611ed957611e2d611e28611e23855161189e565b610bc9565b611696565b9060f81b600f60f81b165f1a611e42826113bc565b5360015b8351811015611ed45780611e81611e71611e68610d926114986001968a6113c9565b60041c600f1690565b60f81b6001600160f81b03191690565b611e9a611e90611e238461189e565b915f1a91856113c9565b53611ec1600f611eb0610d92611498858a6113c9565b1660f81b6001600160f81b03191690565b611ecd611e908361189e565b5301611e46565b509150565b50611eef611e28611eea845161189e565b610bba565b60015b8351811015611ed45780611f14611e71611e68610d926114986001968a6113c9565b611f28611e90611f2384610bc9565b61189e565b53611f3e600f611eb0610d92611498858a6113c9565b611f55611e90611f50611f2385610bc9565b6109de565b5301611ef2565b919091611f6a825184610a0d565b611f74825161189e565b10612013575f5b825181101561200a57611f97611f918286610a0d565b60011690565b611fec57611fc0611e68610d92611498611fba611fb4868a610a0d565b60011c90565b866113c9565b60ff611fd5610de3610d9261149886896113c9565b911603611fe457600101611f7b565b505050505f90565b600f612004610d92611498611fba611fb4868a610a0d565b16611fc0565b50505050600190565b5050505f90565b9190600560fd1b906001600160f81b03199061203890849086610c58565b35160361204757016001013590565b63f0ff325b60e01b5f5260045ffdfea26469706673582212209a126280f4165fa90c369d1d37a2ccf7a3b954b2d3507912d0882b0a958f5f3a64736f6c634300081e0033 diff --git a/artifacts/erc20_runtime.hex b/artifacts/erc20_runtime.hex index 7815466..2b3b03b 100644 --- a/artifacts/erc20_runtime.hex +++ b/artifacts/erc20_runtime.hex @@ -1 +1 @@ -0x60806040526004361015610011575f80fd5b5f3560e01c8063046f7da2146101545780631aa7c0ec1461014f5780632feef2ec1461014a578063308657d71461014557806333ee5f35146101405780633ccfd60b1461013b5780633d2691bc1461013657806355a373d6146101315780635a4fd6451461012c57806380f323a71461012757806381972d00146101225780638677ab231461011d5780638bd03d0a146101185780639940686e14610113578063a65e2cfd1461010e578063cb766a5614610109578063d415b3f914610104578063ede7f6a3146100ff578063f3a504f2146100fa5763fe03a460146100f5575f80fd5b61094f565b61092a565b6106e7565b6106ca565b6106a6565b61054e565b610498565b61047b565b610437565b6103e8565b6103cb565b6103af565b61036b565b61034f565b610254565b610237565b610215565b6101db565b6101b3565b346101af575f3660031901126101af577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031633036101a0576007805460ff19169055005b63618bbdd560e01b5f5260045ffd5b5f80fd5b346101af575f3660031901126101af576003546040516001600160a01b039091168152602090f35b346101af575f3660031901126101af5760206040517f00000000000000000000000000000000000000000000000000000000000000008152f35b346101af575f3660031901126101af57602060ff600754166040519015158152f35b346101af575f3660031901126101af576020600454604051908152f35b346101af575f3660031901126101af5761026c610a57565b610274610a97565b61027c610ace565b61029361ff0019600754166007555f6001555f8055565b80156103405760405163a9059cbb60e01b815233600482015260248101919091526020816044815f6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000165af190811561033b575f9161030c575b50156102fd57005b63022e258160e11b5f5260045ffd5b61032e915060203d602011610334575b6103268183610980565b8101906109a7565b5f6102f5565b503d61031c565b6109bf565b6353cd7f7960e01b5f5260045ffd5b346101af575f3660031901126101af5760206040516101008152f35b346101af575f3660031901126101af576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b346101af575f3660031901126101af5760205f54604051908152f35b346101af575f3660031901126101af576020600554604051908152f35b346101af575f3660031901126101af577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031633036101a0576007805460ff19166001179055005b346101af575f3660031901126101af576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b346101af575f3660031901126101af576020600154604051908152f35b346101af5760203660031901126101af576004356104b4610ae0565b6104bd81610b29565b6040516323b872dd60e01b8152336004820152306024820152604481018290526020816064815f6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000165af190811561033b575f9161052f575b50156102fd5761052d90610b84565b005b610548915060203d602011610334576103268183610980565b5f61051e565b346101af5760403660031901126101af576004356024357f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031633036101a05760075460081c60ff16610697578115610688578015610679576105bd826105c2935f55600255565b600155565b61060360206105d6600254600154906109ff565b6040516323b872dd60e01b8152336004820152306024820152604481019190915291829081906064820190565b03815f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165af190811561033b575f9161065a575b50156102fd5761052d61010061ff00196007541617600755565b610673915060203d602011610334576103268183610980565b5f610640565b63932ca0a360e01b5f5260045ffd5b63ea1083a760e01b5f5260045ffd5b635adf638760e01b5f5260045ffd5b346101af575f3660031901126101af5760206106c0610a0c565b6040519015158152f35b346101af575f3660031901126101af576020600254604051908152f35b346101af5760403660031901126101af5760043567ffffffffffffffff81116101af578060040160a060031983360301126101af576024356107298280610a24565b60075461073e9060081c60ff161590565b1590565b61091b5760035461075f906001600160a01b03165b6001600160a01b031690565b331480159061090a575b6108fb574383116108ec576101006107818443610bc9565b116108dd57824080156108ce57610799368385610bf2565b60208151910120036108bf576107ae91611072565b036108b0576107c66107c08280610a24565b90610c56565b9161080061073a60248301946107dc8686610a24565b906107ea6044870188610a24565b906107f8606489018a610a24565b949093610cc6565b6108a15760846108166108869461073a94610a24565b7f0000000000000000000000000000000000000000000000000000000000000000937f0000000000000000000000000000000000000000000000000000000000000000937f0000000000000000000000000000000000000000000000000000000000000000939101359190610d4a565b6108925761052d610ee4565b6364fa89e160e11b5f5260045ffd5b637b374dd160e01b5f5260045ffd5b63048a12f560e11b5f5260045ffd5b63ff28378760e01b5f5260045ffd5b63bfc9f0d360e01b5f5260045ffd5b63c42a018560e01b5f5260045ffd5b63058968cf60e41b5f5260045ffd5b6337b5f20360e21b5f5260045ffd5b5061091661073a610a0c565b610769565b636af784dd60e11b5f5260045ffd5b346101af575f3660031901126101af57602060ff60075460081c166040519015158152f35b346101af575f3660031901126101af576020600654604051908152f35b634e487b7160e01b5f52604160045260245ffd5b90601f8019910116810190811067ffffffffffffffff8211176109a257604052565b61096c565b908160209103126101af575180151581036101af5790565b6040513d5f823e3d90fd5b634e487b7160e01b5f52601160045260245ffd5b90600182018092116109ec57565b6109ca565b60010190816001116109ec57565b919082018092116109ec57565b6004548015159081610a1c575090565b905042111590565b903590601e19813603018212156101af570180359067ffffffffffffffff82116101af576020019181360383136101af57565b60ff60075460081c161561091b577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031633036101a057565b610a9f610a0c565b610abf576001600160601b0360a01b600354166003555f6005555f600455565b639cbc1de160e01b5f5260045ffd5b60015460025481018091116109ec5790565b6004548015159081610b1f575b50610af457565b6005545f548181018091116109ec575f556006549081018091116109ec57600655610b1d610a97565b565b905042115f610aed565b60075460ff8160081c161561091b5760ff16610b7557610b47610a0c565b610b66575f5460011c11610b5757565b63e92c469f60e01b5f5260045ffd5b63129f78e960e11b5f5260045ffd5b632479328960e01b5f5260045ffd5b336001600160601b0360a01b600354161760035561012c42018042116109ec57600455600555565b6001198101919082116109ec57565b5f198101919082116109ec57565b919082039182116109ec57565b67ffffffffffffffff81116109a257601f01601f191660200190565b929192610bfe82610bd6565b91610c0c6040519384610980565b8294818452818301116101af578281602093845f960137010152565b634e487b7160e01b5f52603260045260245ffd5b9015610c455790565b610c28565b90821015610c45570190565b90610c6181836110da565b905f5b60058110610cb15750600560fd1b906001600160f81b031990610c8990849086610c4a565b351603610ca2576001810181116109ec57016001013590565b633954003560e11b5f5260045ffd5b91610cbf600191838661120e565b9201610c64565b610cdc610ce492939495610cea98973691610bf2565b923691610bf2565b9061137d565b90565b60ff60f6199116019060ff82116109ec57565b60ff60bf199116019060ff82116109ec57565b60ff60b6199116019060ff82116109ec57565b60ff607f199116019060ff82116109ec57565b60ff166001019060ff82116109ec57565b9594939291905f818881151580610ec8575b610eba575b610d8a610d84610d768560c09560ff95610c4a565b356001600160f81b03191690565b60f81c90565b1610610e8457808860f860ff610da8610d84610d7688978887610c4a565b1610610eaa57610dd5610dd0610dcb610d84610d7686610de198610ddb97610c4a565b610ced565b610d39565b60ff1690565b906109ff565b81885f5b60038110610e935750610dd5610d84610d768560c095610e0495610c4a565b10610e8457808860f8610e22610dd5610d84610d7688978887610c4a565b10610e7357610dd5610dd0610dcb610d84610d7686610e4498610ddb97610c4a565b915b5f905b808210610e5c575050610cea959661152a565b9092610e6b600191848b61120e565b930190610e49565b50610e7e91506109de565b91610e46565b631bd5dcf760e31b5f5260045ffd5b92600192610ea09261120e565b9101888391610de5565b50610eb591506109de565b610de1565b506001915082905088610d61565b50608060ff610edd610d84610d768686610c3c565b1610610d5c565b610eec6115f1565b6003546001600160a01b0316610f296001600160601b0360a01b600354166003555f6005555f60045561ff0019600754166007555f6001555f8055565b4662aa36a703610fc557604051633419e74d60e21b81526001600160a01b0390911660048201526024810191909152602081806044810103815f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165af190811561033b575f91610fa6575b505b156102fd57565b610fbf915060203d602011610334576103268183610980565b5f610f9d565b60405163a9059cbb60e01b81526001600160a01b0390911660048201526024810191909152602081806044810103815f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165af190811561033b575f91611035575b50610f9f565b61104e915060203d602011610334576103268183610980565b5f61102f565b805115610c455760200190565b908151811015610c45570160200190565b919061107e81846110da565b905f5b600881106110c557506110949293611684565b50905f805b83518210156110c0576001906110af8386611061565b5160f81c9060081b17910190611099565b925050565b916110d3600191838761120e565b9201611081565b5f600360fe1b6001600160f81b03196110f6610d768686610c3c565b16106111d657601f60fb1b6001600160f81b0319611117610d768686610c3c565b16106112055780610ddb610dd5610dd0610dcb610d84610d7661113b978a8a610c4a565b905b61a5bd461480156111fa575b611154575b50905090565b5f5b600381106111e55750600360fe1b611182611175610d76858786610c4a565b6001600160f81b03191690565b106111d657601f60fb1b61119d611175610d76858786610c4a565b106111c657610dd5610dd0610dcb610d84610d76866111bf98610ddb97610c4a565b805f61114e565b506111d191506109de565b6111bf565b63c0098bd960e01b5f5260045ffd5b916111f3600191858461120e565b9201611156565b5061a5bf4614611149565b5060019061113d565b91908082101561136e57611229610d84610d76848487610c4a565b9060ff8216608081101561124457505050610cea91506109de565b91929160b881101561126c575050610cea9250610dd5611266610ddb926109de565b92610d26565b90929060c08110156112e75750610dd561128891949394610d13565b915f935f915b8483106112ae57505050610cea92916112a96112a9926109de565b6109ff565b9091946112bd60019160081b90565b6112dd610dd5610d84610d766112d68b6112a98b6109de565b8888610c4a565b179501919061128e565b90929060f8111561130d5750610cea9250610dd5611307610ddb926109de565b92610d00565b9291610dd561131b91610ced565b915f935f915b84831061133c57505050610cea92916112a96112a9926109de565b90919461134b60019160081b90565b611364610dd5610d84610d766112d68b6112a98b6109de565b1795019190611321565b6318d76ae160e11b5f5260045ffd5b919390929190600360fe1b6001600160f81b031961139e610d768689610c3c565b161061151b57601f60fb1b6001600160f81b03196113bf610d768689610c3c565b1610611511576113e36113de610dd5610dcb610d84610d76888b610c3c565b6109f1565b9492905b945f5b8282106113fc57505050505050505f90565b61141a6114138361140e36878a610bf2565b6117f5565b90936109ff565b9682516020840120036114af57600360fe1b61144961117561143b85611054565b516001600160f81b03191690565b106114af578590846001601f60fb1b61146761117561143b88611054565b10156114f3575b611478818661197c565b601181036114ba575061148a94611b07565b9491156114af5784156114a35793915b919590936113ea565b50505050505050600190565b505050505050505f90565b9093506002141590506114e7578487926114d3946119c1565b9491156114af5784156114a357939161149a565b50505050505050505f90565b5061150c6113de610dd5610dcb610d8461143b89611054565b61146e565b60019492906113e7565b63ebb47d1d60e01b5f5260045ffd5b91949392948060c060ff611545610d84610d7685888a610c4a565b1610610e845760f860ff611560610d84610d7685888a610c4a565b16106115e2575080610ddb610dd5610dd0610dcb610d84610d7661158597898b610c4a565b611590818385611c1c565b969060148151036115d357601401516001600160a01b039182169116036115c457610cea956115be916109ff565b91611c88565b63a087f96f60e01b5f5260045ffd5b63e6c4247b60e01b5f5260045ffd5b6115ec91506109de565b611585565b6005545f5481018091116109ec5760015481018091116109ec5790565b6040805190919061161f8382610980565b6001815291601f1901366020840137565b604080519091906116418382610980565b6014815291601f1901366020840137565b9061165c82610bd6565b6116696040519182610980565b828152809261167a601f1991610bd6565b0190602036910137565b8183101561136e5761169d610d84610d76858585610c4a565b9260ff841660808110156116d757505050506116b761160e565b9060f81b6001600160f81b0319165f1a6116d082611054565b5390600190565b60b881969592939496105f146117455750610dd56116f491610d26565b916116fe83611652565b945f5b8481106117155750505050610cea906109f1565b80611732610d7661172b6001946112a9896109de565b8587610c4a565b5f1a61173e828a611061565b5301611701565b60c011156117e657610dd561175991610d13565b905f925f5b8381106117b7575061176f84611652565b955f5b85811061178a5750505050906112a9610cea926109f1565b806117a4610d7661172b6001946112a98a6112a98b6109de565b5f1a6117b0828b611061565b5301611772565b9360019060081b6117de610dd5610d84610d766117d78a6112a98a6109de565b8c88610c4a565b17940161175e565b636b2e9c5f60e11b5f5260045ffd5b805182101561136e5761180e610d8461143b8484611061565b9160ff83166080811015611827575050506116b761160e565b919392909160b88110156118915750610dd561184291610d26565b9061184c82611652565b935f5b83811061186257505050610cea906109f1565b8061187e61143b6118786001946112a9886109de565b85611061565b5f1a61188a8289611061565b530161184f565b60c0111561192f57610dd56118a591610d13565b5f915f5b82811061190157506118ba83611652565b945f5b8481106118d457505050906112a9610cea926109f1565b806118ee61143b6118786001946112a9896112a98a6109de565b5f1a6118fa828a611061565b53016118bd565b9260019060081b611927610dd5610d8461143b611921896112a9896109de565b8b611061565b1793016118a9565b509161193b8382611ddf565b9261194584611652565b915f5b858110611956575050509190565b8061196961143b611878600194876109ff565b5f1a6119758287611061565b5301611948565b5f92915b81518110156119a7576119938183611ddf565b81018091116109ec57600190930192611980565b5050565b908160011b91808304600214901517156109ec57565b839492916119cf81836117f5565b93906119ee60206119e5610d8461143b85611054565b16151591611f0c565b97889115611a905750611a029051876109ff565b611a0c82516119ab565b14611a21575b505050505050505f905f905f90565b86866001928251611a7e575b505050611a3b575b80611a12565b611a4e92611a48916109ff565b906117f5565b5060208151910120906020815191012014611a6c5780808080611a35565b611a779151906109ff565b6001915f90565b611a889350612075565b86865f611a2d565b611aa1939495965061073a92612075565b611afa57611ab292611a48916109ff565b50908151602081145f14611ada57506020611ad2920151925b51906109ff565b916001929190565b8015611aee576020611ad293012092611acb565b505050505f905f905f90565b50505050505f905f905f90565b91909293611b1582516119ab565b851015611bbf5750610d8461143b611b3792611b318760011c90565b90611061565b60018416611bb65760041c600f16915b905f925b60ff81168410611b965750611b6092506117f5565b5080518015611b8b57611ad29160208203611b8157602091500151916109de565b60200120916109de565b5050505f905f905f90565b90916001611baa82610ddb60ff9487611ddf565b94019392919050611b4b565b600f1691611b47565b9290509392935f915b60108310611c0257611bda92506117f5565b50602081519101209060208151910120145f14611bf957600191905f90565b5f915081908190565b90611c1381610ddb60019385611ddf565b92019190611bc8565b91909182821015610e8457609460ff611c3c610d84610d76868887610c4a565b16036115d357611c4a611630565b925f5b60148110611c5f575050505090601590565b80611c75610d7661172b6001946112a9896109de565b5f1a611c818288611061565b5301611c4d565b91928360c060ff611ca0610d84610d7689888a610c4a565b1610610e845760f860ff611cbb610d84610d7689888a610c4a565b1610611dd05780610ddb610dd5610dd0610dcb610d84610d76611cdf978a8c610c4a565b7fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef611d0b828587612133565b03611dc157610753610753611d2e611d27611d3594878961120e565b868861120e565b8587612133565b6001600160a01b03918216911603611db257611d55611d5b93828461120e565b9161216f565b50916020835111610e84575f90815b8451831015611d955760019060081b611d8c610dd5610d8461143b878a611061565b17920191611d6a565b9150925003611da357600190565b6355e97b0d60e01b5f5260045ffd5b634cd4b7b160e01b5f5260045ffd5b6324da545d60e11b5f5260045ffd5b50611dda846109de565b611cdf565b90815181101561136e57611df9610d8461143b8385611061565b9160ff83166080811015611e105750505050600190565b60b8811015611e2b57505050610dd5610dd0610cea92610d26565b60c0811015611e97575091610dd5611e4291610d13565b905f925f915b838310611e5f57505050906112a9610cea926109f1565b909193611e6e60019160081b90565b611e8d610dd5610d8461143b611e878a6112a9896109de565b88611061565b1794019190611e48565b60f81115611eb0575050610dd5610dd0610cea92610d00565b91610dd5611ebd91610ced565b905f925f915b838310611eda57505050906112a9610cea926109f1565b909193611ee960019160081b90565b611f02610dd5610d8461143b611e878a6112a9896109de565b1794019190611ec3565b90815115610b1d57611f23610d8461143b84611054565b6010811615611ff257611f46611f41611f3c85516119ab565b610bbb565b611652565b9060f81b600f60f81b165f1a611f5b82611054565b5360015b8351811015611fed5780611f9a611f8a611f81610d8461143b6001968a611061565b60041c600f1690565b60f81b6001600160f81b03191690565b611fb3611fa9611f3c846119ab565b915f1a9185611061565b53611fda600f611fc9610d8461143b858a611061565b1660f81b6001600160f81b03191690565b611fe6611fa9836119ab565b5301611f5f565b509150565b50612008611f4161200384516119ab565b610bac565b60015b8351811015611fed578061202d611f8a611f81610d8461143b6001968a611061565b612041611fa961203c84610bbb565b6119ab565b53612057600f611fc9610d8461143b858a611061565b61206e611fa961206961203c85610bbb565b6109de565b530161200b565b9190916120838251846109ff565b61208d82516119ab565b1061212c575f5b8251811015612123576120b06120aa82866109ff565b60011690565b612105576120d9611f81610d8461143b6120d36120cd868a6109ff565b60011c90565b86611061565b60ff6120ee610dd5610d8461143b8689611061565b9116036120fd57600101612094565b505050505f90565b600f61211d610d8461143b6120d36120cd868a6109ff565b166120d9565b50505050600190565b5050505f90565b9190600560fd1b906001600160f81b03199061215190849086610c4a565b35160361216057016001013590565b63f0ff325b60e01b5f5260045ffd5b81831015610e8457612188610d84610d76858585610c4a565b9260ff841660808110156121a257505050506116b761160e565b60b881969592939496105f146122095750610dd56121bf91610d26565b916121c983611652565b945f5b8481106121e05750505050610cea906109f1565b806121f6610d7661172b6001946112a9896109de565b5f1a612202828a611061565b53016121cc565b60c011156122a357610dd561221d91610d13565b905f925f5b83811061227b575061223384611652565b955f5b85811061224e5750505050906112a9610cea926109f1565b80612268610d7661172b6001946112a98a6112a98b6109de565b5f1a612274828b611061565b5301612236565b9360019060081b61229b610dd5610d84610d766117d78a6112a98a6109de565b179401612222565b6336459a5b60e21b5f5260045ffdfea2646970667358221220f111dda4228930ff7fcf5360c1e823b8ddcd3e1621a6c54215af8789b55a438f64736f6c634300081e0033 +0x60806040526004361015610011575f80fd5b5f3560e01c8063046f7da2146101545780631aa7c0ec1461014f5780632feef2ec1461014a578063308657d71461014557806333ee5f35146101405780633ccfd60b1461013b5780633d2691bc1461013657806355a373d6146101315780635a4fd6451461012c57806380f323a71461012757806381972d00146101225780638677ab231461011d5780638bd03d0a146101185780639940686e14610113578063a65e2cfd1461010e578063cb766a5614610109578063d415b3f914610104578063ede7f6a3146100ff578063f3a504f2146100fa5763fe03a460146100f5575f80fd5b61094f565b61092a565b6106e7565b6106ca565b6106a6565b61054e565b610498565b61047b565b610437565b6103e8565b6103cb565b6103af565b61036b565b61034f565b610254565b610237565b610215565b6101db565b6101b3565b346101af575f3660031901126101af577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031633036101a0576007805460ff19169055005b63618bbdd560e01b5f5260045ffd5b5f80fd5b346101af575f3660031901126101af576003546040516001600160a01b039091168152602090f35b346101af575f3660031901126101af5760206040517f00000000000000000000000000000000000000000000000000000000000000008152f35b346101af575f3660031901126101af57602060ff600754166040519015158152f35b346101af575f3660031901126101af576020600454604051908152f35b346101af575f3660031901126101af5761026c610a65565b610274610aa5565b61027c610adc565b61029361ff0019600754166007555f6001555f8055565b80156103405760405163a9059cbb60e01b815233600482015260248101919091526020816044815f6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000165af190811561033b575f9161030c575b50156102fd57005b63022e258160e11b5f5260045ffd5b61032e915060203d602011610334575b6103268183610980565b8101906109a7565b5f6102f5565b503d61031c565b6109bf565b6353cd7f7960e01b5f5260045ffd5b346101af575f3660031901126101af5760206040516101008152f35b346101af575f3660031901126101af576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b346101af575f3660031901126101af5760205f54604051908152f35b346101af575f3660031901126101af576020600554604051908152f35b346101af575f3660031901126101af577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031633036101a0576007805460ff19166001179055005b346101af575f3660031901126101af576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b346101af575f3660031901126101af576020600154604051908152f35b346101af5760203660031901126101af576004356104b4610aee565b6104bd81610b37565b6040516323b872dd60e01b8152336004820152306024820152604481018290526020816064815f6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000165af190811561033b575f9161052f575b50156102fd5761052d90610b92565b005b610548915060203d602011610334576103268183610980565b5f61051e565b346101af5760403660031901126101af576004356024357f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031633036101a05760075460081c60ff16610697578115610688578015610679576105bd826105c2935f55600255565b600155565b61060360206105d660025460015490610a0d565b6040516323b872dd60e01b8152336004820152306024820152604481019190915291829081906064820190565b03815f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165af190811561033b575f9161065a575b50156102fd5761052d61010061ff00196007541617600755565b610673915060203d602011610334576103268183610980565b5f610640565b63932ca0a360e01b5f5260045ffd5b63ea1083a760e01b5f5260045ffd5b635adf638760e01b5f5260045ffd5b346101af575f3660031901126101af5760206106c0610a1a565b6040519015158152f35b346101af575f3660031901126101af576020600254604051908152f35b346101af5760403660031901126101af5760043567ffffffffffffffff81116101af578060040160a060031983360301126101af576024356107298280610a32565b60075461073e9060081c60ff161590565b1590565b61091b5760035461075f906001600160a01b03165b6001600160a01b031690565b331480159061090a575b6108fb574383116108ec576101006107818443610bd7565b116108dd57824080156108ce57610799368385610c00565b60208151910120036108bf576107ae91611062565b036108b0576107c66107c08280610a32565b90610c64565b9161080061073a60248301946107dc8686610a32565b906107ea6044870188610a32565b906107f8606489018a610a32565b949093610cd4565b6108a15760846108166108869461073a94610a32565b7f0000000000000000000000000000000000000000000000000000000000000000937f0000000000000000000000000000000000000000000000000000000000000000937f0000000000000000000000000000000000000000000000000000000000000000939101359190610d58565b6108925761052d610ef2565b6364fa89e160e11b5f5260045ffd5b637b374dd160e01b5f5260045ffd5b63048a12f560e11b5f5260045ffd5b63ff28378760e01b5f5260045ffd5b63bfc9f0d360e01b5f5260045ffd5b63c42a018560e01b5f5260045ffd5b63058968cf60e41b5f5260045ffd5b6337b5f20360e21b5f5260045ffd5b5061091661073a610a1a565b610769565b636af784dd60e11b5f5260045ffd5b346101af575f3660031901126101af57602060ff60075460081c166040519015158152f35b346101af575f3660031901126101af576020600654604051908152f35b634e487b7160e01b5f52604160045260245ffd5b90601f8019910116810190811067ffffffffffffffff8211176109a257604052565b61096c565b908160209103126101af575180151581036101af5790565b6040513d5f823e3d90fd5b634e487b7160e01b5f52601160045260245ffd5b90600182018092116109ec57565b6109ca565b60010190816001116109ec57565b90601582018092116109ec57565b919082018092116109ec57565b6004548015159081610a2a575090565b905042111590565b903590601e19813603018212156101af570180359067ffffffffffffffff82116101af576020019181360383136101af57565b60ff60075460081c161561091b577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031633036101a057565b610aad610a1a565b610acd576001600160601b0360a01b600354166003555f6005555f600455565b639cbc1de160e01b5f5260045ffd5b60015460025481018091116109ec5790565b6004548015159081610b2d575b50610b0257565b6005545f548181018091116109ec575f556006549081018091116109ec57600655610b2b610aa5565b565b905042115f610afb565b60075460ff8160081c161561091b5760ff16610b8357610b55610a1a565b610b74575f5460011c11610b6557565b63e92c469f60e01b5f5260045ffd5b63129f78e960e11b5f5260045ffd5b632479328960e01b5f5260045ffd5b336001600160601b0360a01b600354161760035561012c42018042116109ec57600455600555565b6001198101919082116109ec57565b5f198101919082116109ec57565b919082039182116109ec57565b67ffffffffffffffff81116109a257601f01601f191660200190565b929192610c0c82610be4565b91610c1a6040519384610980565b8294818452818301116101af578281602093845f960137010152565b634e487b7160e01b5f52603260045260245ffd5b9015610c535790565b610c36565b90821015610c53570190565b90610c6f818361111e565b905f5b60058110610cbf5750600560fd1b906001600160f81b031990610c9790849086610c58565b351603610cb0576001810181116109ec57016001013590565b633954003560e11b5f5260045ffd5b91610ccd6001918386611252565b9201610c72565b610cea610cf292939495610cf898973691610c00565b923691610c00565b906113da565b90565b60ff60f6199116019060ff82116109ec57565b60ff607f199116019060ff82116109ec57565b60ff60bf199116019060ff82116109ec57565b60ff60b6199116019060ff82116109ec57565b60ff166001019060ff82116109ec57565b9594939291905f818881151580610ed6575b610ec8575b610d98610d92610d848560c09560ff95610c58565b356001600160f81b03191690565b60f81c90565b1610610e9257808860f860ff610db6610d92610d8488978887610c58565b1610610eb857610de3610dde610dd9610d92610d8486610def98610de997610c58565b610cfb565b610d47565b60ff1690565b90610a0d565b81885f5b60038110610ea15750610de3610d92610d848560c095610e1295610c58565b10610e9257808860f8610e30610de3610d92610d8488978887610c58565b10610e8157610de3610dde610dd9610d92610d8486610e5298610de997610c58565b915b5f905b808210610e6a575050610cf89596611587565b9092610e79600191848b611252565b930190610e57565b50610e8c91506109de565b91610e54565b631bd5dcf760e31b5f5260045ffd5b92600192610eae92611252565b9101888391610df3565b50610ec391506109de565b610def565b506001915082905088610d6f565b50608060ff610eeb610d92610d848686610c4a565b1610610d6a565b610efa611657565b6003546001600160a01b0316610f376001600160601b0360a01b600354166003555f6005555f60045561ff0019600754166007555f6001555f8055565b4662aa36a703610fd357604051633419e74d60e21b81526001600160a01b0390911660048201526024810191909152602081806044810103815f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165af190811561033b575f91610fb4575b505b156102fd57565b610fcd915060203d602011610334576103268183610980565b5f610fab565b60405163a9059cbb60e01b81526001600160a01b0390911660048201526024810191909152602081806044810103815f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165af190811561033b575f91611043575b50610fad565b61105c915060203d602011610334576103268183610980565b5f61103d565b61106c828261111e565b915f5b600881106111095750611089610d92610d84858486610c58565b925f9260ff851694608086105f146110a357505050505090565b6110b49193949550610de390610d0e565b915f935b8385106110c757505050505090565b90919293946110d860019160081b90565b6110fd610de3610d92610d846110f68b6110f18b6109de565b610a0d565b8789610c58565b179501939291906110b8565b926111176001918385611252565b930161106f565b5f600360fe1b6001600160f81b031961113a610d848686610c4a565b161061121a57601f60fb1b6001600160f81b031961115b610d848686610c4a565b16106112495780610de9610de3610dde610dd9610d92610d8461117f978a8a610c58565b905b61a5bd4614801561123e575b611198575b50905090565b5f5b600381106112295750600360fe1b6111c66111b9610d84858786610c58565b6001600160f81b03191690565b1061121a57601f60fb1b6111e16111b9610d84858786610c58565b1061120a57610de3610dde610dd9610d92610d848661120398610de997610c58565b805f611192565b5061121591506109de565b611203565b63c0098bd960e01b5f5260045ffd5b916112376001918584611252565b920161119a565b5061a5bf461461118d565b50600190611181565b9190808210156113ad5761126d610d92610d84848487610c58565b9060ff8216608081101561128857505050610cf891506109de565b91929160b88110156112b0575050610cf89250610de36112aa610de9926109de565b92610d0e565b90929060c08110156113265750610de36112cc91949394610d34565b915f935f915b8483106112ed57505050610cf892916110f16110f1926109de565b9091946112fc60019160081b90565b61131c610de3610d92610d846113158b6110f18b6109de565b8888610c58565b17950191906112d2565b90929060f8111561134c5750610cf89250610de3611346610de9926109de565b92610d21565b9291610de361135a91610cfb565b915f935f915b84831061137b57505050610cf892916110f16110f1926109de565b90919461138a60019160081b90565b6113a3610de3610d92610d846113158b6110f18b6109de565b1795019190611360565b6318d76ae160e11b5f5260045ffd5b805115610c535760200190565b908151811015610c53570160200190565b919390929190600360fe1b6001600160f81b03196113fb610d848689610c4a565b161061157857601f60fb1b6001600160f81b031961141c610d848689610c4a565b161061156e5761144061143b610de3610dd9610d92610d84888b610c4a565b6109f1565b9492905b945f5b82821061145957505050505050505f90565b6114776114708361146b36878a610c00565b6116c8565b9093610a0d565b96825160208401200361150c57600360fe1b6114a66111b9611498856113bc565b516001600160f81b03191690565b1061150c578590846001601f60fb1b6114c46111b9611498886113bc565b1015611550575b6114d5818661186f565b6011810361151757506114e7946119fa565b94911561150c5784156115005793915b91959093611447565b50505050505050600190565b505050505050505f90565b90935060021415905061154457848792611530946118b4565b94911561150c5784156115005793916114f7565b50505050505050505f90565b5061156961143b610de3610dd9610d92611498896113bc565b6114cb565b6001949290611444565b63ebb47d1d60e01b5f5260045ffd5b91949392948060c060ff6115a2610d92610d8485888a610c58565b1610610e925760f860ff6115bd610d92610d8485888a610c58565b1610611647575080610de9610de3610dde610dd9610d92610d846115e297898b610c58565b945b609460ff6115f9610d92610d848a8789610c58565b1603611638576001600160a01b03168286016001013560601c0361162957611623610cf8956109ff565b91611b0f565b63a087f96f60e01b5f5260045ffd5b63e6c4247b60e01b5f5260045ffd5b61165191506109de565b946115e4565b6005545f5481018091116109ec5760015481018091116109ec5790565b604080519091906116858382610980565b6001815291601f1901366020840137565b906116a082610be4565b6116ad6040519182610980565b82815280926116be601f1991610be4565b0190602036910137565b80518210156113ad576116e1610d9261149884846113c9565b9160ff8316608081101561171a575050506116fa611674565b9060f81b6001600160f81b0319165f1a611713826113bc565b5390600190565b919392909160b88110156117845750610de361173591610d0e565b9061173f82611696565b935f5b83811061175557505050610cf8906109f1565b8061177161149861176b6001946110f1886109de565b856113c9565b5f1a61177d82896113c9565b5301611742565b60c0111561182257610de361179891610d34565b5f915f5b8281106117f457506117ad83611696565b945f5b8481106117c757505050906110f1610cf8926109f1565b806117e161149861176b6001946110f1896110f18a6109de565b5f1a6117ed828a6113c9565b53016117b0565b9260019060081b61181a610de3610d92611498611814896110f1896109de565b8b6113c9565b17930161179c565b509161182e8382611cc6565b9261183884611696565b915f5b858110611849575050509190565b8061185c61149861176b60019487610a0d565b5f1a61186882876113c9565b530161183b565b5f92915b815181101561189a576118868183611cc6565b81018091116109ec57600190930192611873565b5050565b908160011b91808304600214901517156109ec57565b839492916118c281836116c8565b93906118e160206118d8610d92611498856113bc565b16151591611df3565b9788911561198357506118f5905187610a0d565b6118ff825161189e565b14611914575b505050505050505f905f905f90565b86866001928251611971575b50505061192e575b80611905565b6119419261193b91610a0d565b906116c8565b506020815191012090602081519101201461195f5780808080611928565b61196a915190610a0d565b6001915f90565b61197b9350611f5c565b86865f611920565b611994939495965061073a92611f5c565b6119ed576119a59261193b91610a0d565b50908151602081145f146119cd575060206119c5920151925b5190610a0d565b916001929190565b80156119e15760206119c5930120926119be565b505050505f905f905f90565b50505050505f905f905f90565b91909293611a08825161189e565b851015611ab25750610d92611498611a2a92611a248760011c90565b906113c9565b60018416611aa95760041c600f16915b905f925b60ff81168410611a895750611a5392506116c8565b5080518015611a7e576119c59160208203611a7457602091500151916109de565b60200120916109de565b5050505f905f905f90565b90916001611a9d82610de960ff9487611cc6565b94019392919050611a3e565b600f1691611a3a565b9290509392935f915b60108310611af557611acd92506116c8565b50602081519101209060208151910120145f14611aec57600191905f90565b5f915081908190565b90611b0681610de960019385611cc6565b92019190611abb565b929190918160c060ff611b29610d92610d8487898b610c58565b1610610e925760f860ff611b44610d92610d8487898b610c58565b1610611cb75780610de9610de3610dde610dd9610d92610d84611b68978b8d610c58565b7fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef611b9482868861201a565b03611ca857610753610753611bb7611bb0611bbe94888a611252565b8789611252565b868861201a565b6001600160a01b03918216911603611c9957611bdb908284611252565b905f91611bef610d92610d84838588610c58565b60ff811694906080861015611c1d5750505050505b03611c0e57600190565b6355e97b0d60e01b5f5260045ffd5b9091929394608081145f14611c38575050505050505f611c04565b60a010610e9257610de3611c4e91939293610d0e565b915f935b838510611c63575050505050611c04565b9091929394611c7460019160081b90565b611c8d610de3610d92610d846110f68b6110f18b6109de565b17950193929190611c52565b634cd4b7b160e01b5f5260045ffd5b6324da545d60e11b5f5260045ffd5b50611cc1826109de565b611b68565b9081518110156113ad57611ce0610d9261149883856113c9565b9160ff83166080811015611cf75750505050600190565b60b8811015611d1257505050610de3610dde610cf892610d0e565b60c0811015611d7e575091610de3611d2991610d34565b905f925f915b838310611d4657505050906110f1610cf8926109f1565b909193611d5560019160081b90565b611d74610de3610d92611498611d6e8a6110f1896109de565b886113c9565b1794019190611d2f565b60f81115611d97575050610de3610dde610cf892610d21565b91610de3611da491610cfb565b905f925f915b838310611dc157505050906110f1610cf8926109f1565b909193611dd060019160081b90565b611de9610de3610d92611498611d6e8a6110f1896109de565b1794019190611daa565b90815115610b2b57611e0a610d92611498846113bc565b6010811615611ed957611e2d611e28611e23855161189e565b610bc9565b611696565b9060f81b600f60f81b165f1a611e42826113bc565b5360015b8351811015611ed45780611e81611e71611e68610d926114986001968a6113c9565b60041c600f1690565b60f81b6001600160f81b03191690565b611e9a611e90611e238461189e565b915f1a91856113c9565b53611ec1600f611eb0610d92611498858a6113c9565b1660f81b6001600160f81b03191690565b611ecd611e908361189e565b5301611e46565b509150565b50611eef611e28611eea845161189e565b610bba565b60015b8351811015611ed45780611f14611e71611e68610d926114986001968a6113c9565b611f28611e90611f2384610bc9565b61189e565b53611f3e600f611eb0610d92611498858a6113c9565b611f55611e90611f50611f2385610bc9565b6109de565b5301611ef2565b919091611f6a825184610a0d565b611f74825161189e565b10612013575f5b825181101561200a57611f97611f918286610a0d565b60011690565b611fec57611fc0611e68610d92611498611fba611fb4868a610a0d565b60011c90565b866113c9565b60ff611fd5610de3610d9261149886896113c9565b911603611fe457600101611f7b565b505050505f90565b600f612004610d92611498611fba611fb4868a610a0d565b16611fc0565b50505050600190565b5050505f90565b9190600560fd1b906001600160f81b03199061203890849086610c58565b35160361204757016001013590565b63f0ff325b60e01b5f5260045ffdfea26469706673582212209a126280f4165fa90c369d1d37a2ccf7a3b954b2d3507912d0882b0a958f5f3a64736f6c634300081e0033 diff --git a/artifacts/native_deployment.hex b/artifacts/native_deployment.hex index 7ef4965..eb06137 100644 --- a/artifacts/native_deployment.hex +++ b/artifacts/native_deployment.hex @@ -1 +1 @@ -0x60e0601f611f5738819003918201601f19168301916001600160401b038311848410176101205780849260809460405283398101031261011c578051906001600160a01b038216820361011c576020810151606060408301519201519260a05260c0523360805280151580610113575b6100c1575b604051611e22908161013582396080518181816101560152818161040f015281816105d40152610686015260a0518181816103070152610626015260c0518181816102e5015261038d0152f35b8181018082116100ff5734036100f057805f5560025560015561010061ff001960075416176007555f80610074565b63201c04ab60e01b5f5260045ffd5b634e487b7160e01b5f52601160045260245ffd5b5081151561006f565b5f80fd5b634e487b7160e01b5f52604160045260245ffdfe60806040526004361015610011575f80fd5b5f3560e01c8063046f7da2146101445780631aa7c0ec1461013f57806323a8b41a1461013a5780632feef2ec14610135578063308657d71461013057806333ee5f351461012b5780633ccfd60b146101265780633d2691bc146101215780635a4fd6451461011c57806364c9ec6f1461011757806380f323a71461011257806381972d001461010d5780638677ab23146101085780638bd03d0a14610103578063a65e2cfd146100fe578063cb766a56146100f9578063d415b3f9146100f4578063f3a504f2146100ef5763fe03a460146100ea575f80fd5b6107a7565b610782565b610765565b610741565b610672565b610655565b610611565b6105c2565b6105a5565b6104e7565b6104cb565b6104af565b6103ef565b6103d2565b6103b0565b610376565b6101cb565b6101a3565b3461019f575f36600319011261019f577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03163303610190576007805460ff19169055005b63618bbdd560e01b5f5260045ffd5b5f80fd5b3461019f575f36600319011261019f576003546040516001600160a01b039091168152602090f35b3461019f57604036600319011261019f5760043567ffffffffffffffff811161019f57806004019060c0600319823603011261019f5761021760243561021184806107c4565b90610934565b61022a61022483806107c4565b90610aa4565b602482019161026b61026761023f85876107c4565b61024f60448697939701896107c4565b60a48701979161025f898c6107c4565b949093610bad565b1590565b610367576102676102b491608461028b61028588806107c4565b90610bd4565b9161025f60648201966102ab6102a1898c6107c4565b959094018b6107c4565b9290918b6107c4565b610358576102676102c86102ce92856107c4565b90610c35565b610349576102e26102679161032c936107c4565b907f0000000000000000000000000000000000000000000000000000000000000000917f000000000000000000000000000000000000000000000000000000000000000091610d05565b61033a57610338610f20565b005b633cff557560e11b5f5260045ffd5b632b96f51360e01b5f5260045ffd5b637b374dd160e01b5f5260045ffd5b63c89e37db60e01b5f5260045ffd5b3461019f575f36600319011261019f5760206040517f00000000000000000000000000000000000000000000000000000000000000008152f35b3461019f575f36600319011261019f57602060ff600754166040519015158152f35b3461019f575f36600319011261019f576020600454604051908152f35b3461019f575f36600319011261019f5760ff60075460081c16156104a0577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316330361019057610445610f86565b61044d610fbd565b61046461ff0019600754166007555f6001555f8055565b8015610491575f80808093335af161047a610852565b501561048257005b63b12d13eb60e01b5f5260045ffd5b6353cd7f7960e01b5f5260045ffd5b636af784dd60e11b5f5260045ffd5b3461019f575f36600319011261019f5760206040516101008152f35b3461019f575f36600319011261019f5760205f54604051908152f35b5f36600319011261019f57600454801515908161059b575b50610568575b60075460ff8160081c16156104a05760ff16610559576105236108c7565b61054a575f5460011c341061053b5761033834610fcf565b63e92c469f60e01b5f5260045ffd5b63129f78e960e11b5f5260045ffd5b632479328960e01b5f5260045ffd5b6005545f54818101809111610596575f5560065490810180911161059657600655610591610f86565b610505565b61087c565b905042115f6104ff565b3461019f575f36600319011261019f576020600554604051908152f35b3461019f575f36600319011261019f577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03163303610190576007805460ff19166001179055005b3461019f575f36600319011261019f576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b3461019f575f36600319011261019f576020600154604051908152f35b604036600319011261019f576004356024357f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031633036101905760075460081c60ff16610732578115610723578015610714576106d781836108ba565b3403610705576106ec826106f1935f55600255565b600155565b61033861010061ff00196007541617600755565b63201c04ab60e01b5f5260045ffd5b63932ca0a360e01b5f5260045ffd5b63ea1083a760e01b5f5260045ffd5b635adf638760e01b5f5260045ffd5b3461019f575f36600319011261019f57602061075b6108c7565b6040519015158152f35b3461019f575f36600319011261019f576020600254604051908152f35b3461019f575f36600319011261019f57602060ff60075460081c166040519015158152f35b3461019f575f36600319011261019f576020600654604051908152f35b903590601e198136030182121561019f570180359067ffffffffffffffff821161019f5760200191813603831361019f57565b634e487b7160e01b5f52604160045260245ffd5b6040519190601f01601f1916820167ffffffffffffffff81118382101761083157604052565b6107f7565b67ffffffffffffffff811161083157601f01601f191660200190565b3d15610877573d9061086b61086683610836565b61080b565b9182523d5f602084013e565b606090565b634e487b7160e01b5f52601160045260245ffd5b906001820180921161059657565b906015820180921161059657565b600101908160011161059657565b9190820180921161059657565b60045480151590816108d7575090565b905042111590565b60011981019190821161059657565b5f1981019190821161059657565b9190820391821161059657565b92919261091861086683610836565b938285528282011161019f57815f926020928387013784010152565b9061094861026760075460ff9060081c1690565b6104a0576003546001600160a01b03163314801590610a08575b6109f9574383116109ea5761010061097a84436108fc565b116109db57824080156109cc57610992368385610909565b60208151910120036109bd576109a791611015565b036109ae57565b63048a12f560e11b5f5260045ffd5b63ff28378760e01b5f5260045ffd5b63bfc9f0d360e01b5f5260045ffd5b63c42a018560e01b5f5260045ffd5b63058968cf60e41b5f5260045ffd5b6337b5f20360e21b5f5260045ffd5b50610a146102676108c7565b610962565b634e487b7160e01b5f52603260045260245ffd5b9015610a365790565b610a19565b90821015610a36570190565b60ff60f6199116019060ff821161059657565b60ff607f199116019060ff821161059657565b60ff60bf199116019060ff821161059657565b60ff60b6199116019060ff821161059657565b60ff166001019060ff821161059657565b905f600360fe1b6001600160f81b0319610acf610ac18587610a2d565b356001600160f81b03191690565b1610610b9e57601f60fb1b6001600160f81b0319610af0610ac18587610a2d565b1610610b955780610b2a610b24610b1f610b1a610b14610ac1610b3097898b610a3b565b60f81c90565b610a47565b610a93565b60ff1690565b906108ba565b905b5f5b60048110610b805750600560fd1b906001600160f81b031990610b5d90610ac190859087610a3b565b1603610b7157610b6c90610890565b013590565b633954003560e11b5f5260045ffd5b91610b8e600191838661107d565b9201610b34565b50600190610b32565b63c0098bd960e01b5f5260045ffd5b610bc3610bcb92939495610bd198973691610909565b923691610909565b906111e7565b90565b90610bdf81836113a1565b905f5b60058110610c205750600560fd1b906001600160f81b031990610c0790849086610a3b565b351603610b715760018101811161059657016001013590565b91610c2e600191838661107d565b9201610be2565b5f9082151580610ce9575b610ce0575b60c060ff610c5a610b14610ac1868887610a3b565b1610610cd157610b14610ac182858560f860ff610c84610b14610ac1839b60019d610cae9c610a3b565b1610610cc85780610b2a610b24610b1f610b1a610b14610ac1610ca897898b610a3b565b91610a3b565b1603610cb957600190565b63e9dd8a9d60e01b5f5260045ffd5b610ca890610890565b631bd5dcf760e31b5f5260045ffd5b60019150610c45565b50608060ff610cfe610b14610ac18786610a2d565b1610610c40565b90916003905f84151580610f04575b610ebc575b60c060ff610d2e610b14610ac1858a8a610a3b565b1610610cd1578060f860ff610d4d610b14610ac1610d73968b8b610a3b565b1610610eb35760ff610d6c610b1f610b1a610b14610ac1868c8c610a3b565b16906108ba565b915f905b808210610e9c575050609460ff610d95610b14610ac1868989610a3b565b1603610e8d576001600160a01b03168282016001013560601c03610e7e57610dbc9061089e565b91610dce610b14610ac1858486610a3b565b925f9260ff851694608086105f14610dff5750505050505b03610df057600190565b6355e97b0d60e01b5f5260045ffd5b90919293946080145f14610e185750505050505f610de6565b610b24610e2791939293610a5a565b915f935b838510610e3c575050505050610de6565b9091929394610e4d60019160081b90565b610e72610b24610b14610ac1610e6b8b610e668b610890565b6108ba565b8789610a3b565b17950193929190610e2b565b63c0ee95bb60e01b5f5260045ffd5b63e6c4247b60e01b5f5260045ffd5b9092610eab600191878761107d565b930190610d77565b60ff6001610d6c565b509050610ecf610b14610ac18585610a2d565b6001919060ff16808303610ee65750600491610d19565b600203610ef557600591610d19565b636fc3daa360e11b5f5260045ffd5b50608060ff610f19610b14610ac18989610a2d565b1610610d14565b6005545f548101809111610596576001548101809111610596575f808080936003546001600160601b0360a01b8116600355826005558260045561ff0019600754166007558260015582805560018060a01b03165af1610f7e610852565b501561048257565b610f8e6108c7565b610fae576001600160601b0360a01b600354166003555f6005555f600455565b639cbc1de160e01b5f5260045ffd5b60015460025481018091116105965790565b336001600160601b0360a01b600354161760035561012c420180421161059657600455600555565b805115610a365760200190565b908151811015610a36570160200190565b919061102181846113a1565b905f5b60088110611068575061103792936114fe565b50905f805b8351821015611063576001906110528386611004565b5160f81c9060081b1791019061103c565b925050565b91611076600191838761107d565b9201611024565b9190808210156111d857611098610b14610ac1848487610a3b565b9060ff821660808110156110b357505050610bd19150610890565b91929160b88110156110db575050610bd19250610b246110d5610b2a92610890565b92610a5a565b90929060c08110156111515750610b246110f791949394610a80565b915f935f915b84831061111857505050610bd19291610e66610e6692610890565b90919461112760019160081b90565b611147610b24610b14610ac16111408b610e668b610890565b8888610a3b565b17950191906110fd565b90929060f811156111775750610bd19250610b24611171610b2a92610890565b92610a6d565b9291610b2461118591610a47565b915f935f915b8483106111a657505050610bd19291610e66610e6692610890565b9091946111b560019160081b90565b6111ce610b24610b14610ac16111408b610e668b610890565b179501919061118b565b6318d76ae160e11b5f5260045ffd5b919390929190600360fe1b6001600160f81b0319611208610ac18689610a2d565b161061139257601f60fb1b6001600160f81b0319611229610ac18689610a2d565b16106113885761124d611248610b24610b1a610b14610ac1888b610a2d565b6108ac565b9492905b945f5b82821061126657505050505050505f90565b61128461127d8361127836878a610909565b61166f565b90936108ba565b96825160208401200361132657600360fe1b6112c06112b36112a585610ff7565b516001600160f81b03191690565b6001600160f81b03191690565b10611326578590846001601f60fb1b6112de6112b36112a588610ff7565b101561136a575b6112ef81866117f6565b60118103611331575061130194611981565b94911561132657841561131a5793915b91959093611254565b50505050505050600190565b505050505050505f90565b90935060021415905061135e5784879261134a9461183b565b94911561132657841561131a579391611311565b50505050505050505f90565b50611383611248610b24610b1a610b146112a589610ff7565b6112e5565b6001949290611251565b63ebb47d1d60e01b5f5260045ffd5b5f600360fe1b6001600160f81b03196113bd610ac18686610a2d565b1610610b9e57601f60fb1b6001600160f81b03196113de610ac18686610a2d565b16106114b05780610b2a610b24610b1f610b1a610b14610ac1611402978a8a610a3b565b905b61a5bd461480156114a5575b61141b575b50905090565b5f5b600381106114905750600360fe1b61143c6112b3610ac1858786610a3b565b10610b9e57601f60fb1b6114576112b3610ac1858786610a3b565b1061148057610b24610b1f610b1a610b14610ac18661147998610b2a97610a3b565b805f611415565b5061148b9150610890565b611479565b9161149e600191858461107d565b920161141d565b5061a5bf4614611410565b50600190611404565b6040906114c58261080b565b6001815291601f1901366020840137565b906114e361086683610836565b82815280926114f4601f1991610836565b0190602036910137565b818310156111d857611517610b14610ac1858585610a3b565b9260ff8416608081101561155157505050506115316114b9565b9060f81b6001600160f81b0319165f1a61154a82610ff7565b5390600190565b60b881969592939496105f146115bf5750610b2461156e91610a5a565b91611578836114d6565b945f5b84811061158f5750505050610bd1906108ac565b806115ac610ac16115a5600194610e6689610890565b8587610a3b565b5f1a6115b8828a611004565b530161157b565b60c0111561166057610b246115d391610a80565b905f925f5b83811061163157506115e9846114d6565b955f5b858110611604575050505090610e66610bd1926108ac565b8061161e610ac16115a5600194610e668a610e668b610890565b5f1a61162a828b611004565b53016115ec565b9360019060081b611658610b24610b14610ac16116518a610e668a610890565b8c88610a3b565b1794016115d8565b636b2e9c5f60e11b5f5260045ffd5b80518210156111d857611688610b146112a58484611004565b9160ff831660808110156116a1575050506115316114b9565b919392909160b881101561170b5750610b246116bc91610a5a565b906116c6826114d6565b935f5b8381106116dc57505050610bd1906108ac565b806116f86112a56116f2600194610e6688610890565b85611004565b5f1a6117048289611004565b53016116c9565b60c011156117a957610b2461171f91610a80565b5f915f5b82811061177b5750611734836114d6565b945f5b84811061174e5750505090610e66610bd1926108ac565b806117686112a56116f2600194610e6689610e668a610890565b5f1a611774828a611004565b5301611737565b9260019060081b6117a1610b24610b146112a561179b89610e6689610890565b8b611004565b179301611723565b50916117b58382611a96565b926117bf846114d6565b915f5b8581106117d0575050509190565b806117e36112a56116f2600194876108ba565b5f1a6117ef8287611004565b53016117c2565b5f92915b81518110156118215761180d8183611a96565b8101809111610596576001909301926117fa565b5050565b908160011b918083046002149015171561059657565b83949291611849818361166f565b9390611868602061185f610b146112a585610ff7565b16151591611bc3565b9788911561190a575061187c9051876108ba565b6118868251611825565b1461189b575b505050505050505f905f905f90565b868660019282516118f8575b5050506118b5575b8061188c565b6118c8926118c2916108ba565b9061166f565b50602081519101209060208151910120146118e657808080806118af565b6118f19151906108ba565b6001915f90565b6119029350611d2e565b86865f6118a7565b61191b939495965061026792611d2e565b6119745761192c926118c2916108ba565b50908151602081145f146119545750602061194c920151925b51906108ba565b916001929190565b801561196857602061194c93012092611945565b505050505f905f905f90565b50505050505f905f905f90565b9190929361198f8251611825565b851015611a395750610b146112a56119b1926119ab8760011c90565b90611004565b60018416611a305760041c600f16915b905f925b60ff81168410611a1057506119da925061166f565b5080518015611a055761194c91602082036119fb5760209150015191610890565b6020012091610890565b5050505f905f905f90565b90916001611a2482610b2a60ff9487611a96565b940193929190506119c5565b600f16916119c1565b9290509392935f915b60108310611a7c57611a54925061166f565b50602081519101209060208151910120145f14611a7357600191905f90565b5f915081908190565b90611a8d81610b2a60019385611a96565b92019190611a42565b9081518110156111d857611ab0610b146112a58385611004565b9160ff83166080811015611ac75750505050600190565b60b8811015611ae257505050610b24610b1f610bd192610a5a565b60c0811015611b4e575091610b24611af991610a80565b905f925f915b838310611b165750505090610e66610bd1926108ac565b909193611b2560019160081b90565b611b44610b24610b146112a5611b3e8a610e6689610890565b88611004565b1794019190611aff565b60f81115611b67575050610b24610b1f610bd192610a6d565b91610b24611b7491610a47565b905f925f915b838310611b915750505090610e66610bd1926108ac565b909193611ba060019160081b90565b611bb9610b24610b146112a5611b3e8a610e6689610890565b1794019190611b7a565b90815115611d2c57611bda610b146112a584610ff7565b6010811615611ca957611bfd611bf8611bf38551611825565b6108ee565b6114d6565b9060f81b600f60f81b165f1a611c1282610ff7565b5360015b8351811015611ca45780611c51611c41611c38610b146112a56001968a611004565b60041c600f1690565b60f81b6001600160f81b03191690565b611c6a611c60611bf384611825565b915f1a9185611004565b53611c91600f611c80610b146112a5858a611004565b1660f81b6001600160f81b03191690565b611c9d611c6083611825565b5301611c16565b509150565b50611cbf611bf8611cba8451611825565b6108df565b60015b8351811015611ca45780611ce4611c41611c38610b146112a56001968a611004565b611cf8611c60611cf3846108ee565b611825565b53611d0e600f611c80610b146112a5858a611004565b611d25611c60611d20611cf3856108ee565b610890565b5301611cc2565b565b919091611d3c8251846108ba565b611d468251611825565b10611de5575f5b8251811015611ddc57611d69611d6382866108ba565b60011690565b611dbe57611d92611c38610b146112a5611d8c611d86868a6108ba565b60011c90565b86611004565b60ff611da7610b24610b146112a58689611004565b911603611db657600101611d4d565b505050505f90565b600f611dd6610b146112a5611d8c611d86868a6108ba565b16611d92565b50505050600190565b5050505f9056fea2646970667358221220290b4349508c088a1ee4b25b8002172ad42ab21d1e2ad16b6e9456f82cd5a8db64736f6c634300081e0033 +0x60e0601f611e4e38819003918201601f19168301916001600160401b038311848410176101205780849260809460405283398101031261011c578051906001600160a01b038216820361011c576020810151606060408301519201519260a05260c0523360805280151580610113575b6100c1575b604051611d19908161013582396080518181816101560152818161040f015281816105d40152610686015260a0518181816103070152610626015260c0518181816102e5015261038d0152f35b8181018082116100ff5734036100f057805f5560025560015561010061ff001960075416176007555f80610074565b63201c04ab60e01b5f5260045ffd5b634e487b7160e01b5f52601160045260245ffd5b5081151561006f565b5f80fd5b634e487b7160e01b5f52604160045260245ffdfe60806040526004361015610011575f80fd5b5f3560e01c8063046f7da2146101445780631aa7c0ec1461013f57806323a8b41a1461013a5780632feef2ec14610135578063308657d71461013057806333ee5f351461012b5780633ccfd60b146101265780633d2691bc146101215780635a4fd6451461011c57806364c9ec6f1461011757806380f323a71461011257806381972d001461010d5780638677ab23146101085780638bd03d0a14610103578063a65e2cfd146100fe578063cb766a56146100f9578063d415b3f9146100f4578063f3a504f2146100ef5763fe03a460146100ea575f80fd5b6107a7565b610782565b610765565b610741565b610672565b610655565b610611565b6105c2565b6105a5565b6104e7565b6104cb565b6104af565b6103ef565b6103d2565b6103b0565b610376565b6101cb565b6101a3565b3461019f575f36600319011261019f577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03163303610190576007805460ff19169055005b63618bbdd560e01b5f5260045ffd5b5f80fd5b3461019f575f36600319011261019f576003546040516001600160a01b039091168152602090f35b3461019f57604036600319011261019f5760043567ffffffffffffffff811161019f57806004019060c0600319823603011261019f5761021760243561021184806107c4565b90610934565b61022a61022483806107c4565b90610aa4565b602482019161026b61026761023f85876107c4565b61024f60448697939701896107c4565b60a48701979161025f898c6107c4565b949093610bad565b1590565b610367576102676102b491608461028b61028588806107c4565b90610bd4565b9161025f60648201966102ab6102a1898c6107c4565b959094018b6107c4565b9290918b6107c4565b610358576102676102c86102ce92856107c4565b90610c35565b610349576102e26102679161032c936107c4565b907f0000000000000000000000000000000000000000000000000000000000000000917f000000000000000000000000000000000000000000000000000000000000000091610d05565b61033a57610338610f20565b005b633cff557560e11b5f5260045ffd5b632b96f51360e01b5f5260045ffd5b637b374dd160e01b5f5260045ffd5b63c89e37db60e01b5f5260045ffd5b3461019f575f36600319011261019f5760206040517f00000000000000000000000000000000000000000000000000000000000000008152f35b3461019f575f36600319011261019f57602060ff600754166040519015158152f35b3461019f575f36600319011261019f576020600454604051908152f35b3461019f575f36600319011261019f5760ff60075460081c16156104a0577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316330361019057610445610f86565b61044d610fbd565b61046461ff0019600754166007555f6001555f8055565b8015610491575f80808093335af161047a610852565b501561048257005b63b12d13eb60e01b5f5260045ffd5b6353cd7f7960e01b5f5260045ffd5b636af784dd60e11b5f5260045ffd5b3461019f575f36600319011261019f5760206040516101008152f35b3461019f575f36600319011261019f5760205f54604051908152f35b5f36600319011261019f57600454801515908161059b575b50610568575b60075460ff8160081c16156104a05760ff16610559576105236108c7565b61054a575f5460011c341061053b5761033834610fcf565b63e92c469f60e01b5f5260045ffd5b63129f78e960e11b5f5260045ffd5b632479328960e01b5f5260045ffd5b6005545f54818101809111610596575f5560065490810180911161059657600655610591610f86565b610505565b61087c565b905042115f6104ff565b3461019f575f36600319011261019f576020600554604051908152f35b3461019f575f36600319011261019f577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03163303610190576007805460ff19166001179055005b3461019f575f36600319011261019f576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b3461019f575f36600319011261019f576020600154604051908152f35b604036600319011261019f576004356024357f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031633036101905760075460081c60ff16610732578115610723578015610714576106d781836108ba565b3403610705576106ec826106f1935f55600255565b600155565b61033861010061ff00196007541617600755565b63201c04ab60e01b5f5260045ffd5b63932ca0a360e01b5f5260045ffd5b63ea1083a760e01b5f5260045ffd5b635adf638760e01b5f5260045ffd5b3461019f575f36600319011261019f57602061075b6108c7565b6040519015158152f35b3461019f575f36600319011261019f576020600254604051908152f35b3461019f575f36600319011261019f57602060ff60075460081c166040519015158152f35b3461019f575f36600319011261019f576020600654604051908152f35b903590601e198136030182121561019f570180359067ffffffffffffffff821161019f5760200191813603831361019f57565b634e487b7160e01b5f52604160045260245ffd5b6040519190601f01601f1916820167ffffffffffffffff81118382101761083157604052565b6107f7565b67ffffffffffffffff811161083157601f01601f191660200190565b3d15610877573d9061086b61086683610836565b61080b565b9182523d5f602084013e565b606090565b634e487b7160e01b5f52601160045260245ffd5b906001820180921161059657565b906015820180921161059657565b600101908160011161059657565b9190820180921161059657565b60045480151590816108d7575090565b905042111590565b60011981019190821161059657565b5f1981019190821161059657565b9190820391821161059657565b92919261091861086683610836565b938285528282011161019f57815f926020928387013784010152565b9061094861026760075460ff9060081c1690565b6104a0576003546001600160a01b03163314801590610a08575b6109f9574383116109ea5761010061097a84436108fc565b116109db57824080156109cc57610992368385610909565b60208151910120036109bd576109a791610ff7565b036109ae57565b63048a12f560e11b5f5260045ffd5b63ff28378760e01b5f5260045ffd5b63bfc9f0d360e01b5f5260045ffd5b63c42a018560e01b5f5260045ffd5b63058968cf60e41b5f5260045ffd5b6337b5f20360e21b5f5260045ffd5b50610a146102676108c7565b610962565b634e487b7160e01b5f52603260045260245ffd5b9015610a365790565b610a19565b90821015610a36570190565b60ff60f6199116019060ff821161059657565b60ff607f199116019060ff821161059657565b60ff60bf199116019060ff821161059657565b60ff60b6199116019060ff821161059657565b60ff166001019060ff821161059657565b905f600360fe1b6001600160f81b0319610acf610ac18587610a2d565b356001600160f81b03191690565b1610610b9e57601f60fb1b6001600160f81b0319610af0610ac18587610a2d565b1610610b955780610b2a610b24610b1f610b1a610b14610ac1610b3097898b610a3b565b60f81c90565b610a47565b610a93565b60ff1690565b906108ba565b905b5f5b60048110610b805750600560fd1b906001600160f81b031990610b5d90610ac190859087610a3b565b1603610b7157610b6c90610890565b013590565b633954003560e11b5f5260045ffd5b91610b8e60019183866110a7565b9201610b34565b50600190610b32565b63c0098bd960e01b5f5260045ffd5b610bc3610bcb92939495610bd198973691610909565b923691610909565b9061122f565b90565b90610bdf81836113e9565b905f5b60058110610c205750600560fd1b906001600160f81b031990610c0790849086610a3b565b351603610b715760018101811161059657016001013590565b91610c2e60019183866110a7565b9201610be2565b5f9082151580610ce9575b610ce0575b60c060ff610c5a610b14610ac1868887610a3b565b1610610cd157610b14610ac182858560f860ff610c84610b14610ac1839b60019d610cae9c610a3b565b1610610cc85780610b2a610b24610b1f610b1a610b14610ac1610ca897898b610a3b565b91610a3b565b1603610cb957600190565b63e9dd8a9d60e01b5f5260045ffd5b610ca890610890565b631bd5dcf760e31b5f5260045ffd5b60019150610c45565b50608060ff610cfe610b14610ac18786610a2d565b1610610c40565b90916003905f84151580610f04575b610ebc575b60c060ff610d2e610b14610ac1858a8a610a3b565b1610610cd1578060f860ff610d4d610b14610ac1610d73968b8b610a3b565b1610610eb35760ff610d6c610b1f610b1a610b14610ac1868c8c610a3b565b16906108ba565b915f905b808210610e9c575050609460ff610d95610b14610ac1868989610a3b565b1603610e8d576001600160a01b03168282016001013560601c03610e7e57610dbc9061089e565b91610dce610b14610ac1858486610a3b565b925f9260ff851694608086105f14610dff5750505050505b03610df057600190565b6355e97b0d60e01b5f5260045ffd5b90919293946080145f14610e185750505050505f610de6565b610b24610e2791939293610a5a565b915f935b838510610e3c575050505050610de6565b9091929394610e4d60019160081b90565b610e72610b24610b14610ac1610e6b8b610e668b610890565b6108ba565b8789610a3b565b17950193929190610e2b565b63c0ee95bb60e01b5f5260045ffd5b63e6c4247b60e01b5f5260045ffd5b9092610eab60019187876110a7565b930190610d77565b60ff6001610d6c565b509050610ecf610b14610ac18585610a2d565b6001919060ff16808303610ee65750600491610d19565b600203610ef557600591610d19565b636fc3daa360e11b5f5260045ffd5b50608060ff610f19610b14610ac18989610a2d565b1610610d14565b6005545f548101809111610596576001548101809111610596575f808080936003546001600160601b0360a01b8116600355826005558260045561ff0019600754166007558260015582805560018060a01b03165af1610f7e610852565b501561048257565b610f8e6108c7565b610fae576001600160601b0360a01b600354166003555f6005555f600455565b639cbc1de160e01b5f5260045ffd5b60015460025481018091116105965790565b336001600160601b0360a01b600354161760035561012c420180421161059657600455600555565b61100182826113e9565b915f5b60088110611092575061101e610b14610ac1858486610a3b565b925f9260ff851694608086105f1461103857505050505090565b6110499193949550610b2490610a5a565b915f935b83851061105c57505050505090565b909192939461106d60019160081b90565b611086610b24610b14610ac1610e6b8b610e668b610890565b1795019392919061104d565b926110a060019183856110a7565b9301611004565b919080821015611202576110c2610b14610ac1848487610a3b565b9060ff821660808110156110dd57505050610bd19150610890565b91929160b8811015611105575050610bd19250610b246110ff610b2a92610890565b92610a5a565b90929060c081101561117b5750610b2461112191949394610a80565b915f935f915b84831061114257505050610bd19291610e66610e6692610890565b90919461115160019160081b90565b611171610b24610b14610ac161116a8b610e668b610890565b8888610a3b565b1795019190611127565b90929060f811156111a15750610bd19250610b2461119b610b2a92610890565b92610a6d565b9291610b246111af91610a47565b915f935f915b8483106111d057505050610bd19291610e66610e6692610890565b9091946111df60019160081b90565b6111f8610b24610b14610ac161116a8b610e668b610890565b17950191906111b5565b6318d76ae160e11b5f5260045ffd5b805115610a365760200190565b908151811015610a36570160200190565b919390929190600360fe1b6001600160f81b0319611250610ac18689610a2d565b16106113da57601f60fb1b6001600160f81b0319611271610ac18689610a2d565b16106113d057611295611290610b24610b1a610b14610ac1888b610a2d565b6108ac565b9492905b945f5b8282106112ae57505050505050505f90565b6112cc6112c5836112c036878a610909565b611546565b90936108ba565b96825160208401200361136e57600360fe1b6113086112fb6112ed85611211565b516001600160f81b03191690565b6001600160f81b03191690565b1061136e578590846001601f60fb1b6113266112fb6112ed88611211565b10156113b2575b61133781866116ed565b60118103611379575061134994611878565b94911561136e5784156113625793915b9195909361129c565b50505050505050600190565b505050505050505f90565b9093506002141590506113a65784879261139294611732565b94911561136e578415611362579391611359565b50505050505050505f90565b506113cb611290610b24610b1a610b146112ed89611211565b61132d565b6001949290611299565b63ebb47d1d60e01b5f5260045ffd5b5f600360fe1b6001600160f81b0319611405610ac18686610a2d565b1610610b9e57601f60fb1b6001600160f81b0319611426610ac18686610a2d565b16106114f85780610b2a610b24610b1f610b1a610b14610ac161144a978a8a610a3b565b905b61a5bd461480156114ed575b611463575b50905090565b5f5b600381106114d85750600360fe1b6114846112fb610ac1858786610a3b565b10610b9e57601f60fb1b61149f6112fb610ac1858786610a3b565b106114c857610b24610b1f610b1a610b14610ac1866114c198610b2a97610a3b565b805f61145d565b506114d39150610890565b6114c1565b916114e660019185846110a7565b9201611465565b5061a5bf4614611458565b5060019061144c565b60409061150d8261080b565b6001815291601f1901366020840137565b9061152b61086683610836565b828152809261153c601f1991610836565b0190602036910137565b80518210156112025761155f610b146112ed848461121e565b9160ff8316608081101561159857505050611578611501565b9060f81b6001600160f81b0319165f1a61159182611211565b5390600190565b919392909160b88110156116025750610b246115b391610a5a565b906115bd8261151e565b935f5b8381106115d357505050610bd1906108ac565b806115ef6112ed6115e9600194610e6688610890565b8561121e565b5f1a6115fb828961121e565b53016115c0565b60c011156116a057610b2461161691610a80565b5f915f5b828110611672575061162b8361151e565b945f5b8481106116455750505090610e66610bd1926108ac565b8061165f6112ed6115e9600194610e6689610e668a610890565b5f1a61166b828a61121e565b530161162e565b9260019060081b611698610b24610b146112ed61169289610e6689610890565b8b61121e565b17930161161a565b50916116ac838261198d565b926116b68461151e565b915f5b8581106116c7575050509190565b806116da6112ed6115e9600194876108ba565b5f1a6116e6828761121e565b53016116b9565b5f92915b815181101561171857611704818361198d565b8101809111610596576001909301926116f1565b5050565b908160011b918083046002149015171561059657565b839492916117408183611546565b939061175f6020611756610b146112ed85611211565b16151591611aba565b9788911561180157506117739051876108ba565b61177d825161171c565b14611792575b505050505050505f905f905f90565b868660019282516117ef575b5050506117ac575b80611783565b6117bf926117b9916108ba565b90611546565b50602081519101209060208151910120146117dd57808080806117a6565b6117e89151906108ba565b6001915f90565b6117f99350611c25565b86865f61179e565b611812939495965061026792611c25565b61186b57611823926117b9916108ba565b50908151602081145f1461184b57506020611843920151925b51906108ba565b916001929190565b801561185f5760206118439301209261183c565b505050505f905f905f90565b50505050505f905f905f90565b91909293611886825161171c565b8510156119305750610b146112ed6118a8926118a28760011c90565b9061121e565b600184166119275760041c600f16915b905f925b60ff8116841061190757506118d19250611546565b50805180156118fc5761184391602082036118f25760209150015191610890565b6020012091610890565b5050505f905f905f90565b9091600161191b82610b2a60ff948761198d565b940193929190506118bc565b600f16916118b8565b9290509392935f915b601083106119735761194b9250611546565b50602081519101209060208151910120145f1461196a57600191905f90565b5f915081908190565b9061198481610b2a6001938561198d565b92019190611939565b908151811015611202576119a7610b146112ed838561121e565b9160ff831660808110156119be5750505050600190565b60b88110156119d957505050610b24610b1f610bd192610a5a565b60c0811015611a45575091610b246119f091610a80565b905f925f915b838310611a0d5750505090610e66610bd1926108ac565b909193611a1c60019160081b90565b611a3b610b24610b146112ed611a358a610e6689610890565b8861121e565b17940191906119f6565b60f81115611a5e575050610b24610b1f610bd192610a6d565b91610b24611a6b91610a47565b905f925f915b838310611a885750505090610e66610bd1926108ac565b909193611a9760019160081b90565b611ab0610b24610b146112ed611a358a610e6689610890565b1794019190611a71565b90815115611c2357611ad1610b146112ed84611211565b6010811615611ba057611af4611aef611aea855161171c565b6108ee565b61151e565b9060f81b600f60f81b165f1a611b0982611211565b5360015b8351811015611b9b5780611b48611b38611b2f610b146112ed6001968a61121e565b60041c600f1690565b60f81b6001600160f81b03191690565b611b61611b57611aea8461171c565b915f1a918561121e565b53611b88600f611b77610b146112ed858a61121e565b1660f81b6001600160f81b03191690565b611b94611b578361171c565b5301611b0d565b509150565b50611bb6611aef611bb1845161171c565b6108df565b60015b8351811015611b9b5780611bdb611b38611b2f610b146112ed6001968a61121e565b611bef611b57611bea846108ee565b61171c565b53611c05600f611b77610b146112ed858a61121e565b611c1c611b57611c17611bea856108ee565b610890565b5301611bb9565b565b919091611c338251846108ba565b611c3d825161171c565b10611cdc575f5b8251811015611cd357611c60611c5a82866108ba565b60011690565b611cb557611c89611b2f610b146112ed611c83611c7d868a6108ba565b60011c90565b8661121e565b60ff611c9e610b24610b146112ed868961121e565b911603611cad57600101611c44565b505050505f90565b600f611ccd610b146112ed611c83611c7d868a6108ba565b16611c89565b50505050600190565b5050505f9056fea2646970667358221220551b080203e39849c48692aeaf0c14462bab43e541853bdf873a521ef4a4fef064736f6c634300081e0033 diff --git a/artifacts/native_runtime.hex b/artifacts/native_runtime.hex index d565629..e0b035d 100644 --- a/artifacts/native_runtime.hex +++ b/artifacts/native_runtime.hex @@ -1 +1 @@ -0x60806040526004361015610011575f80fd5b5f3560e01c8063046f7da2146101445780631aa7c0ec1461013f57806323a8b41a1461013a5780632feef2ec14610135578063308657d71461013057806333ee5f351461012b5780633ccfd60b146101265780633d2691bc146101215780635a4fd6451461011c57806364c9ec6f1461011757806380f323a71461011257806381972d001461010d5780638677ab23146101085780638bd03d0a14610103578063a65e2cfd146100fe578063cb766a56146100f9578063d415b3f9146100f4578063f3a504f2146100ef5763fe03a460146100ea575f80fd5b6107a7565b610782565b610765565b610741565b610672565b610655565b610611565b6105c2565b6105a5565b6104e7565b6104cb565b6104af565b6103ef565b6103d2565b6103b0565b610376565b6101cb565b6101a3565b3461019f575f36600319011261019f577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03163303610190576007805460ff19169055005b63618bbdd560e01b5f5260045ffd5b5f80fd5b3461019f575f36600319011261019f576003546040516001600160a01b039091168152602090f35b3461019f57604036600319011261019f5760043567ffffffffffffffff811161019f57806004019060c0600319823603011261019f5761021760243561021184806107c4565b90610934565b61022a61022483806107c4565b90610aa4565b602482019161026b61026761023f85876107c4565b61024f60448697939701896107c4565b60a48701979161025f898c6107c4565b949093610bad565b1590565b610367576102676102b491608461028b61028588806107c4565b90610bd4565b9161025f60648201966102ab6102a1898c6107c4565b959094018b6107c4565b9290918b6107c4565b610358576102676102c86102ce92856107c4565b90610c35565b610349576102e26102679161032c936107c4565b907f0000000000000000000000000000000000000000000000000000000000000000917f000000000000000000000000000000000000000000000000000000000000000091610d05565b61033a57610338610f20565b005b633cff557560e11b5f5260045ffd5b632b96f51360e01b5f5260045ffd5b637b374dd160e01b5f5260045ffd5b63c89e37db60e01b5f5260045ffd5b3461019f575f36600319011261019f5760206040517f00000000000000000000000000000000000000000000000000000000000000008152f35b3461019f575f36600319011261019f57602060ff600754166040519015158152f35b3461019f575f36600319011261019f576020600454604051908152f35b3461019f575f36600319011261019f5760ff60075460081c16156104a0577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316330361019057610445610f86565b61044d610fbd565b61046461ff0019600754166007555f6001555f8055565b8015610491575f80808093335af161047a610852565b501561048257005b63b12d13eb60e01b5f5260045ffd5b6353cd7f7960e01b5f5260045ffd5b636af784dd60e11b5f5260045ffd5b3461019f575f36600319011261019f5760206040516101008152f35b3461019f575f36600319011261019f5760205f54604051908152f35b5f36600319011261019f57600454801515908161059b575b50610568575b60075460ff8160081c16156104a05760ff16610559576105236108c7565b61054a575f5460011c341061053b5761033834610fcf565b63e92c469f60e01b5f5260045ffd5b63129f78e960e11b5f5260045ffd5b632479328960e01b5f5260045ffd5b6005545f54818101809111610596575f5560065490810180911161059657600655610591610f86565b610505565b61087c565b905042115f6104ff565b3461019f575f36600319011261019f576020600554604051908152f35b3461019f575f36600319011261019f577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03163303610190576007805460ff19166001179055005b3461019f575f36600319011261019f576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b3461019f575f36600319011261019f576020600154604051908152f35b604036600319011261019f576004356024357f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031633036101905760075460081c60ff16610732578115610723578015610714576106d781836108ba565b3403610705576106ec826106f1935f55600255565b600155565b61033861010061ff00196007541617600755565b63201c04ab60e01b5f5260045ffd5b63932ca0a360e01b5f5260045ffd5b63ea1083a760e01b5f5260045ffd5b635adf638760e01b5f5260045ffd5b3461019f575f36600319011261019f57602061075b6108c7565b6040519015158152f35b3461019f575f36600319011261019f576020600254604051908152f35b3461019f575f36600319011261019f57602060ff60075460081c166040519015158152f35b3461019f575f36600319011261019f576020600654604051908152f35b903590601e198136030182121561019f570180359067ffffffffffffffff821161019f5760200191813603831361019f57565b634e487b7160e01b5f52604160045260245ffd5b6040519190601f01601f1916820167ffffffffffffffff81118382101761083157604052565b6107f7565b67ffffffffffffffff811161083157601f01601f191660200190565b3d15610877573d9061086b61086683610836565b61080b565b9182523d5f602084013e565b606090565b634e487b7160e01b5f52601160045260245ffd5b906001820180921161059657565b906015820180921161059657565b600101908160011161059657565b9190820180921161059657565b60045480151590816108d7575090565b905042111590565b60011981019190821161059657565b5f1981019190821161059657565b9190820391821161059657565b92919261091861086683610836565b938285528282011161019f57815f926020928387013784010152565b9061094861026760075460ff9060081c1690565b6104a0576003546001600160a01b03163314801590610a08575b6109f9574383116109ea5761010061097a84436108fc565b116109db57824080156109cc57610992368385610909565b60208151910120036109bd576109a791611015565b036109ae57565b63048a12f560e11b5f5260045ffd5b63ff28378760e01b5f5260045ffd5b63bfc9f0d360e01b5f5260045ffd5b63c42a018560e01b5f5260045ffd5b63058968cf60e41b5f5260045ffd5b6337b5f20360e21b5f5260045ffd5b50610a146102676108c7565b610962565b634e487b7160e01b5f52603260045260245ffd5b9015610a365790565b610a19565b90821015610a36570190565b60ff60f6199116019060ff821161059657565b60ff607f199116019060ff821161059657565b60ff60bf199116019060ff821161059657565b60ff60b6199116019060ff821161059657565b60ff166001019060ff821161059657565b905f600360fe1b6001600160f81b0319610acf610ac18587610a2d565b356001600160f81b03191690565b1610610b9e57601f60fb1b6001600160f81b0319610af0610ac18587610a2d565b1610610b955780610b2a610b24610b1f610b1a610b14610ac1610b3097898b610a3b565b60f81c90565b610a47565b610a93565b60ff1690565b906108ba565b905b5f5b60048110610b805750600560fd1b906001600160f81b031990610b5d90610ac190859087610a3b565b1603610b7157610b6c90610890565b013590565b633954003560e11b5f5260045ffd5b91610b8e600191838661107d565b9201610b34565b50600190610b32565b63c0098bd960e01b5f5260045ffd5b610bc3610bcb92939495610bd198973691610909565b923691610909565b906111e7565b90565b90610bdf81836113a1565b905f5b60058110610c205750600560fd1b906001600160f81b031990610c0790849086610a3b565b351603610b715760018101811161059657016001013590565b91610c2e600191838661107d565b9201610be2565b5f9082151580610ce9575b610ce0575b60c060ff610c5a610b14610ac1868887610a3b565b1610610cd157610b14610ac182858560f860ff610c84610b14610ac1839b60019d610cae9c610a3b565b1610610cc85780610b2a610b24610b1f610b1a610b14610ac1610ca897898b610a3b565b91610a3b565b1603610cb957600190565b63e9dd8a9d60e01b5f5260045ffd5b610ca890610890565b631bd5dcf760e31b5f5260045ffd5b60019150610c45565b50608060ff610cfe610b14610ac18786610a2d565b1610610c40565b90916003905f84151580610f04575b610ebc575b60c060ff610d2e610b14610ac1858a8a610a3b565b1610610cd1578060f860ff610d4d610b14610ac1610d73968b8b610a3b565b1610610eb35760ff610d6c610b1f610b1a610b14610ac1868c8c610a3b565b16906108ba565b915f905b808210610e9c575050609460ff610d95610b14610ac1868989610a3b565b1603610e8d576001600160a01b03168282016001013560601c03610e7e57610dbc9061089e565b91610dce610b14610ac1858486610a3b565b925f9260ff851694608086105f14610dff5750505050505b03610df057600190565b6355e97b0d60e01b5f5260045ffd5b90919293946080145f14610e185750505050505f610de6565b610b24610e2791939293610a5a565b915f935b838510610e3c575050505050610de6565b9091929394610e4d60019160081b90565b610e72610b24610b14610ac1610e6b8b610e668b610890565b6108ba565b8789610a3b565b17950193929190610e2b565b63c0ee95bb60e01b5f5260045ffd5b63e6c4247b60e01b5f5260045ffd5b9092610eab600191878761107d565b930190610d77565b60ff6001610d6c565b509050610ecf610b14610ac18585610a2d565b6001919060ff16808303610ee65750600491610d19565b600203610ef557600591610d19565b636fc3daa360e11b5f5260045ffd5b50608060ff610f19610b14610ac18989610a2d565b1610610d14565b6005545f548101809111610596576001548101809111610596575f808080936003546001600160601b0360a01b8116600355826005558260045561ff0019600754166007558260015582805560018060a01b03165af1610f7e610852565b501561048257565b610f8e6108c7565b610fae576001600160601b0360a01b600354166003555f6005555f600455565b639cbc1de160e01b5f5260045ffd5b60015460025481018091116105965790565b336001600160601b0360a01b600354161760035561012c420180421161059657600455600555565b805115610a365760200190565b908151811015610a36570160200190565b919061102181846113a1565b905f5b60088110611068575061103792936114fe565b50905f805b8351821015611063576001906110528386611004565b5160f81c9060081b1791019061103c565b925050565b91611076600191838761107d565b9201611024565b9190808210156111d857611098610b14610ac1848487610a3b565b9060ff821660808110156110b357505050610bd19150610890565b91929160b88110156110db575050610bd19250610b246110d5610b2a92610890565b92610a5a565b90929060c08110156111515750610b246110f791949394610a80565b915f935f915b84831061111857505050610bd19291610e66610e6692610890565b90919461112760019160081b90565b611147610b24610b14610ac16111408b610e668b610890565b8888610a3b565b17950191906110fd565b90929060f811156111775750610bd19250610b24611171610b2a92610890565b92610a6d565b9291610b2461118591610a47565b915f935f915b8483106111a657505050610bd19291610e66610e6692610890565b9091946111b560019160081b90565b6111ce610b24610b14610ac16111408b610e668b610890565b179501919061118b565b6318d76ae160e11b5f5260045ffd5b919390929190600360fe1b6001600160f81b0319611208610ac18689610a2d565b161061139257601f60fb1b6001600160f81b0319611229610ac18689610a2d565b16106113885761124d611248610b24610b1a610b14610ac1888b610a2d565b6108ac565b9492905b945f5b82821061126657505050505050505f90565b61128461127d8361127836878a610909565b61166f565b90936108ba565b96825160208401200361132657600360fe1b6112c06112b36112a585610ff7565b516001600160f81b03191690565b6001600160f81b03191690565b10611326578590846001601f60fb1b6112de6112b36112a588610ff7565b101561136a575b6112ef81866117f6565b60118103611331575061130194611981565b94911561132657841561131a5793915b91959093611254565b50505050505050600190565b505050505050505f90565b90935060021415905061135e5784879261134a9461183b565b94911561132657841561131a579391611311565b50505050505050505f90565b50611383611248610b24610b1a610b146112a589610ff7565b6112e5565b6001949290611251565b63ebb47d1d60e01b5f5260045ffd5b5f600360fe1b6001600160f81b03196113bd610ac18686610a2d565b1610610b9e57601f60fb1b6001600160f81b03196113de610ac18686610a2d565b16106114b05780610b2a610b24610b1f610b1a610b14610ac1611402978a8a610a3b565b905b61a5bd461480156114a5575b61141b575b50905090565b5f5b600381106114905750600360fe1b61143c6112b3610ac1858786610a3b565b10610b9e57601f60fb1b6114576112b3610ac1858786610a3b565b1061148057610b24610b1f610b1a610b14610ac18661147998610b2a97610a3b565b805f611415565b5061148b9150610890565b611479565b9161149e600191858461107d565b920161141d565b5061a5bf4614611410565b50600190611404565b6040906114c58261080b565b6001815291601f1901366020840137565b906114e361086683610836565b82815280926114f4601f1991610836565b0190602036910137565b818310156111d857611517610b14610ac1858585610a3b565b9260ff8416608081101561155157505050506115316114b9565b9060f81b6001600160f81b0319165f1a61154a82610ff7565b5390600190565b60b881969592939496105f146115bf5750610b2461156e91610a5a565b91611578836114d6565b945f5b84811061158f5750505050610bd1906108ac565b806115ac610ac16115a5600194610e6689610890565b8587610a3b565b5f1a6115b8828a611004565b530161157b565b60c0111561166057610b246115d391610a80565b905f925f5b83811061163157506115e9846114d6565b955f5b858110611604575050505090610e66610bd1926108ac565b8061161e610ac16115a5600194610e668a610e668b610890565b5f1a61162a828b611004565b53016115ec565b9360019060081b611658610b24610b14610ac16116518a610e668a610890565b8c88610a3b565b1794016115d8565b636b2e9c5f60e11b5f5260045ffd5b80518210156111d857611688610b146112a58484611004565b9160ff831660808110156116a1575050506115316114b9565b919392909160b881101561170b5750610b246116bc91610a5a565b906116c6826114d6565b935f5b8381106116dc57505050610bd1906108ac565b806116f86112a56116f2600194610e6688610890565b85611004565b5f1a6117048289611004565b53016116c9565b60c011156117a957610b2461171f91610a80565b5f915f5b82811061177b5750611734836114d6565b945f5b84811061174e5750505090610e66610bd1926108ac565b806117686112a56116f2600194610e6689610e668a610890565b5f1a611774828a611004565b5301611737565b9260019060081b6117a1610b24610b146112a561179b89610e6689610890565b8b611004565b179301611723565b50916117b58382611a96565b926117bf846114d6565b915f5b8581106117d0575050509190565b806117e36112a56116f2600194876108ba565b5f1a6117ef8287611004565b53016117c2565b5f92915b81518110156118215761180d8183611a96565b8101809111610596576001909301926117fa565b5050565b908160011b918083046002149015171561059657565b83949291611849818361166f565b9390611868602061185f610b146112a585610ff7565b16151591611bc3565b9788911561190a575061187c9051876108ba565b6118868251611825565b1461189b575b505050505050505f905f905f90565b868660019282516118f8575b5050506118b5575b8061188c565b6118c8926118c2916108ba565b9061166f565b50602081519101209060208151910120146118e657808080806118af565b6118f19151906108ba565b6001915f90565b6119029350611d2e565b86865f6118a7565b61191b939495965061026792611d2e565b6119745761192c926118c2916108ba565b50908151602081145f146119545750602061194c920151925b51906108ba565b916001929190565b801561196857602061194c93012092611945565b505050505f905f905f90565b50505050505f905f905f90565b9190929361198f8251611825565b851015611a395750610b146112a56119b1926119ab8760011c90565b90611004565b60018416611a305760041c600f16915b905f925b60ff81168410611a1057506119da925061166f565b5080518015611a055761194c91602082036119fb5760209150015191610890565b6020012091610890565b5050505f905f905f90565b90916001611a2482610b2a60ff9487611a96565b940193929190506119c5565b600f16916119c1565b9290509392935f915b60108310611a7c57611a54925061166f565b50602081519101209060208151910120145f14611a7357600191905f90565b5f915081908190565b90611a8d81610b2a60019385611a96565b92019190611a42565b9081518110156111d857611ab0610b146112a58385611004565b9160ff83166080811015611ac75750505050600190565b60b8811015611ae257505050610b24610b1f610bd192610a5a565b60c0811015611b4e575091610b24611af991610a80565b905f925f915b838310611b165750505090610e66610bd1926108ac565b909193611b2560019160081b90565b611b44610b24610b146112a5611b3e8a610e6689610890565b88611004565b1794019190611aff565b60f81115611b67575050610b24610b1f610bd192610a6d565b91610b24611b7491610a47565b905f925f915b838310611b915750505090610e66610bd1926108ac565b909193611ba060019160081b90565b611bb9610b24610b146112a5611b3e8a610e6689610890565b1794019190611b7a565b90815115611d2c57611bda610b146112a584610ff7565b6010811615611ca957611bfd611bf8611bf38551611825565b6108ee565b6114d6565b9060f81b600f60f81b165f1a611c1282610ff7565b5360015b8351811015611ca45780611c51611c41611c38610b146112a56001968a611004565b60041c600f1690565b60f81b6001600160f81b03191690565b611c6a611c60611bf384611825565b915f1a9185611004565b53611c91600f611c80610b146112a5858a611004565b1660f81b6001600160f81b03191690565b611c9d611c6083611825565b5301611c16565b509150565b50611cbf611bf8611cba8451611825565b6108df565b60015b8351811015611ca45780611ce4611c41611c38610b146112a56001968a611004565b611cf8611c60611cf3846108ee565b611825565b53611d0e600f611c80610b146112a5858a611004565b611d25611c60611d20611cf3856108ee565b610890565b5301611cc2565b565b919091611d3c8251846108ba565b611d468251611825565b10611de5575f5b8251811015611ddc57611d69611d6382866108ba565b60011690565b611dbe57611d92611c38610b146112a5611d8c611d86868a6108ba565b60011c90565b86611004565b60ff611da7610b24610b146112a58689611004565b911603611db657600101611d4d565b505050505f90565b600f611dd6610b146112a5611d8c611d86868a6108ba565b16611d92565b50505050600190565b5050505f9056fea2646970667358221220290b4349508c088a1ee4b25b8002172ad42ab21d1e2ad16b6e9456f82cd5a8db64736f6c634300081e0033 +0x60806040526004361015610011575f80fd5b5f3560e01c8063046f7da2146101445780631aa7c0ec1461013f57806323a8b41a1461013a5780632feef2ec14610135578063308657d71461013057806333ee5f351461012b5780633ccfd60b146101265780633d2691bc146101215780635a4fd6451461011c57806364c9ec6f1461011757806380f323a71461011257806381972d001461010d5780638677ab23146101085780638bd03d0a14610103578063a65e2cfd146100fe578063cb766a56146100f9578063d415b3f9146100f4578063f3a504f2146100ef5763fe03a460146100ea575f80fd5b6107a7565b610782565b610765565b610741565b610672565b610655565b610611565b6105c2565b6105a5565b6104e7565b6104cb565b6104af565b6103ef565b6103d2565b6103b0565b610376565b6101cb565b6101a3565b3461019f575f36600319011261019f577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03163303610190576007805460ff19169055005b63618bbdd560e01b5f5260045ffd5b5f80fd5b3461019f575f36600319011261019f576003546040516001600160a01b039091168152602090f35b3461019f57604036600319011261019f5760043567ffffffffffffffff811161019f57806004019060c0600319823603011261019f5761021760243561021184806107c4565b90610934565b61022a61022483806107c4565b90610aa4565b602482019161026b61026761023f85876107c4565b61024f60448697939701896107c4565b60a48701979161025f898c6107c4565b949093610bad565b1590565b610367576102676102b491608461028b61028588806107c4565b90610bd4565b9161025f60648201966102ab6102a1898c6107c4565b959094018b6107c4565b9290918b6107c4565b610358576102676102c86102ce92856107c4565b90610c35565b610349576102e26102679161032c936107c4565b907f0000000000000000000000000000000000000000000000000000000000000000917f000000000000000000000000000000000000000000000000000000000000000091610d05565b61033a57610338610f20565b005b633cff557560e11b5f5260045ffd5b632b96f51360e01b5f5260045ffd5b637b374dd160e01b5f5260045ffd5b63c89e37db60e01b5f5260045ffd5b3461019f575f36600319011261019f5760206040517f00000000000000000000000000000000000000000000000000000000000000008152f35b3461019f575f36600319011261019f57602060ff600754166040519015158152f35b3461019f575f36600319011261019f576020600454604051908152f35b3461019f575f36600319011261019f5760ff60075460081c16156104a0577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316330361019057610445610f86565b61044d610fbd565b61046461ff0019600754166007555f6001555f8055565b8015610491575f80808093335af161047a610852565b501561048257005b63b12d13eb60e01b5f5260045ffd5b6353cd7f7960e01b5f5260045ffd5b636af784dd60e11b5f5260045ffd5b3461019f575f36600319011261019f5760206040516101008152f35b3461019f575f36600319011261019f5760205f54604051908152f35b5f36600319011261019f57600454801515908161059b575b50610568575b60075460ff8160081c16156104a05760ff16610559576105236108c7565b61054a575f5460011c341061053b5761033834610fcf565b63e92c469f60e01b5f5260045ffd5b63129f78e960e11b5f5260045ffd5b632479328960e01b5f5260045ffd5b6005545f54818101809111610596575f5560065490810180911161059657600655610591610f86565b610505565b61087c565b905042115f6104ff565b3461019f575f36600319011261019f576020600554604051908152f35b3461019f575f36600319011261019f577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03163303610190576007805460ff19166001179055005b3461019f575f36600319011261019f576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b3461019f575f36600319011261019f576020600154604051908152f35b604036600319011261019f576004356024357f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031633036101905760075460081c60ff16610732578115610723578015610714576106d781836108ba565b3403610705576106ec826106f1935f55600255565b600155565b61033861010061ff00196007541617600755565b63201c04ab60e01b5f5260045ffd5b63932ca0a360e01b5f5260045ffd5b63ea1083a760e01b5f5260045ffd5b635adf638760e01b5f5260045ffd5b3461019f575f36600319011261019f57602061075b6108c7565b6040519015158152f35b3461019f575f36600319011261019f576020600254604051908152f35b3461019f575f36600319011261019f57602060ff60075460081c166040519015158152f35b3461019f575f36600319011261019f576020600654604051908152f35b903590601e198136030182121561019f570180359067ffffffffffffffff821161019f5760200191813603831361019f57565b634e487b7160e01b5f52604160045260245ffd5b6040519190601f01601f1916820167ffffffffffffffff81118382101761083157604052565b6107f7565b67ffffffffffffffff811161083157601f01601f191660200190565b3d15610877573d9061086b61086683610836565b61080b565b9182523d5f602084013e565b606090565b634e487b7160e01b5f52601160045260245ffd5b906001820180921161059657565b906015820180921161059657565b600101908160011161059657565b9190820180921161059657565b60045480151590816108d7575090565b905042111590565b60011981019190821161059657565b5f1981019190821161059657565b9190820391821161059657565b92919261091861086683610836565b938285528282011161019f57815f926020928387013784010152565b9061094861026760075460ff9060081c1690565b6104a0576003546001600160a01b03163314801590610a08575b6109f9574383116109ea5761010061097a84436108fc565b116109db57824080156109cc57610992368385610909565b60208151910120036109bd576109a791610ff7565b036109ae57565b63048a12f560e11b5f5260045ffd5b63ff28378760e01b5f5260045ffd5b63bfc9f0d360e01b5f5260045ffd5b63c42a018560e01b5f5260045ffd5b63058968cf60e41b5f5260045ffd5b6337b5f20360e21b5f5260045ffd5b50610a146102676108c7565b610962565b634e487b7160e01b5f52603260045260245ffd5b9015610a365790565b610a19565b90821015610a36570190565b60ff60f6199116019060ff821161059657565b60ff607f199116019060ff821161059657565b60ff60bf199116019060ff821161059657565b60ff60b6199116019060ff821161059657565b60ff166001019060ff821161059657565b905f600360fe1b6001600160f81b0319610acf610ac18587610a2d565b356001600160f81b03191690565b1610610b9e57601f60fb1b6001600160f81b0319610af0610ac18587610a2d565b1610610b955780610b2a610b24610b1f610b1a610b14610ac1610b3097898b610a3b565b60f81c90565b610a47565b610a93565b60ff1690565b906108ba565b905b5f5b60048110610b805750600560fd1b906001600160f81b031990610b5d90610ac190859087610a3b565b1603610b7157610b6c90610890565b013590565b633954003560e11b5f5260045ffd5b91610b8e60019183866110a7565b9201610b34565b50600190610b32565b63c0098bd960e01b5f5260045ffd5b610bc3610bcb92939495610bd198973691610909565b923691610909565b9061122f565b90565b90610bdf81836113e9565b905f5b60058110610c205750600560fd1b906001600160f81b031990610c0790849086610a3b565b351603610b715760018101811161059657016001013590565b91610c2e60019183866110a7565b9201610be2565b5f9082151580610ce9575b610ce0575b60c060ff610c5a610b14610ac1868887610a3b565b1610610cd157610b14610ac182858560f860ff610c84610b14610ac1839b60019d610cae9c610a3b565b1610610cc85780610b2a610b24610b1f610b1a610b14610ac1610ca897898b610a3b565b91610a3b565b1603610cb957600190565b63e9dd8a9d60e01b5f5260045ffd5b610ca890610890565b631bd5dcf760e31b5f5260045ffd5b60019150610c45565b50608060ff610cfe610b14610ac18786610a2d565b1610610c40565b90916003905f84151580610f04575b610ebc575b60c060ff610d2e610b14610ac1858a8a610a3b565b1610610cd1578060f860ff610d4d610b14610ac1610d73968b8b610a3b565b1610610eb35760ff610d6c610b1f610b1a610b14610ac1868c8c610a3b565b16906108ba565b915f905b808210610e9c575050609460ff610d95610b14610ac1868989610a3b565b1603610e8d576001600160a01b03168282016001013560601c03610e7e57610dbc9061089e565b91610dce610b14610ac1858486610a3b565b925f9260ff851694608086105f14610dff5750505050505b03610df057600190565b6355e97b0d60e01b5f5260045ffd5b90919293946080145f14610e185750505050505f610de6565b610b24610e2791939293610a5a565b915f935b838510610e3c575050505050610de6565b9091929394610e4d60019160081b90565b610e72610b24610b14610ac1610e6b8b610e668b610890565b6108ba565b8789610a3b565b17950193929190610e2b565b63c0ee95bb60e01b5f5260045ffd5b63e6c4247b60e01b5f5260045ffd5b9092610eab60019187876110a7565b930190610d77565b60ff6001610d6c565b509050610ecf610b14610ac18585610a2d565b6001919060ff16808303610ee65750600491610d19565b600203610ef557600591610d19565b636fc3daa360e11b5f5260045ffd5b50608060ff610f19610b14610ac18989610a2d565b1610610d14565b6005545f548101809111610596576001548101809111610596575f808080936003546001600160601b0360a01b8116600355826005558260045561ff0019600754166007558260015582805560018060a01b03165af1610f7e610852565b501561048257565b610f8e6108c7565b610fae576001600160601b0360a01b600354166003555f6005555f600455565b639cbc1de160e01b5f5260045ffd5b60015460025481018091116105965790565b336001600160601b0360a01b600354161760035561012c420180421161059657600455600555565b61100182826113e9565b915f5b60088110611092575061101e610b14610ac1858486610a3b565b925f9260ff851694608086105f1461103857505050505090565b6110499193949550610b2490610a5a565b915f935b83851061105c57505050505090565b909192939461106d60019160081b90565b611086610b24610b14610ac1610e6b8b610e668b610890565b1795019392919061104d565b926110a060019183856110a7565b9301611004565b919080821015611202576110c2610b14610ac1848487610a3b565b9060ff821660808110156110dd57505050610bd19150610890565b91929160b8811015611105575050610bd19250610b246110ff610b2a92610890565b92610a5a565b90929060c081101561117b5750610b2461112191949394610a80565b915f935f915b84831061114257505050610bd19291610e66610e6692610890565b90919461115160019160081b90565b611171610b24610b14610ac161116a8b610e668b610890565b8888610a3b565b1795019190611127565b90929060f811156111a15750610bd19250610b2461119b610b2a92610890565b92610a6d565b9291610b246111af91610a47565b915f935f915b8483106111d057505050610bd19291610e66610e6692610890565b9091946111df60019160081b90565b6111f8610b24610b14610ac161116a8b610e668b610890565b17950191906111b5565b6318d76ae160e11b5f5260045ffd5b805115610a365760200190565b908151811015610a36570160200190565b919390929190600360fe1b6001600160f81b0319611250610ac18689610a2d565b16106113da57601f60fb1b6001600160f81b0319611271610ac18689610a2d565b16106113d057611295611290610b24610b1a610b14610ac1888b610a2d565b6108ac565b9492905b945f5b8282106112ae57505050505050505f90565b6112cc6112c5836112c036878a610909565b611546565b90936108ba565b96825160208401200361136e57600360fe1b6113086112fb6112ed85611211565b516001600160f81b03191690565b6001600160f81b03191690565b1061136e578590846001601f60fb1b6113266112fb6112ed88611211565b10156113b2575b61133781866116ed565b60118103611379575061134994611878565b94911561136e5784156113625793915b9195909361129c565b50505050505050600190565b505050505050505f90565b9093506002141590506113a65784879261139294611732565b94911561136e578415611362579391611359565b50505050505050505f90565b506113cb611290610b24610b1a610b146112ed89611211565b61132d565b6001949290611299565b63ebb47d1d60e01b5f5260045ffd5b5f600360fe1b6001600160f81b0319611405610ac18686610a2d565b1610610b9e57601f60fb1b6001600160f81b0319611426610ac18686610a2d565b16106114f85780610b2a610b24610b1f610b1a610b14610ac161144a978a8a610a3b565b905b61a5bd461480156114ed575b611463575b50905090565b5f5b600381106114d85750600360fe1b6114846112fb610ac1858786610a3b565b10610b9e57601f60fb1b61149f6112fb610ac1858786610a3b565b106114c857610b24610b1f610b1a610b14610ac1866114c198610b2a97610a3b565b805f61145d565b506114d39150610890565b6114c1565b916114e660019185846110a7565b9201611465565b5061a5bf4614611458565b5060019061144c565b60409061150d8261080b565b6001815291601f1901366020840137565b9061152b61086683610836565b828152809261153c601f1991610836565b0190602036910137565b80518210156112025761155f610b146112ed848461121e565b9160ff8316608081101561159857505050611578611501565b9060f81b6001600160f81b0319165f1a61159182611211565b5390600190565b919392909160b88110156116025750610b246115b391610a5a565b906115bd8261151e565b935f5b8381106115d357505050610bd1906108ac565b806115ef6112ed6115e9600194610e6688610890565b8561121e565b5f1a6115fb828961121e565b53016115c0565b60c011156116a057610b2461161691610a80565b5f915f5b828110611672575061162b8361151e565b945f5b8481106116455750505090610e66610bd1926108ac565b8061165f6112ed6115e9600194610e6689610e668a610890565b5f1a61166b828a61121e565b530161162e565b9260019060081b611698610b24610b146112ed61169289610e6689610890565b8b61121e565b17930161161a565b50916116ac838261198d565b926116b68461151e565b915f5b8581106116c7575050509190565b806116da6112ed6115e9600194876108ba565b5f1a6116e6828761121e565b53016116b9565b5f92915b815181101561171857611704818361198d565b8101809111610596576001909301926116f1565b5050565b908160011b918083046002149015171561059657565b839492916117408183611546565b939061175f6020611756610b146112ed85611211565b16151591611aba565b9788911561180157506117739051876108ba565b61177d825161171c565b14611792575b505050505050505f905f905f90565b868660019282516117ef575b5050506117ac575b80611783565b6117bf926117b9916108ba565b90611546565b50602081519101209060208151910120146117dd57808080806117a6565b6117e89151906108ba565b6001915f90565b6117f99350611c25565b86865f61179e565b611812939495965061026792611c25565b61186b57611823926117b9916108ba565b50908151602081145f1461184b57506020611843920151925b51906108ba565b916001929190565b801561185f5760206118439301209261183c565b505050505f905f905f90565b50505050505f905f905f90565b91909293611886825161171c565b8510156119305750610b146112ed6118a8926118a28760011c90565b9061121e565b600184166119275760041c600f16915b905f925b60ff8116841061190757506118d19250611546565b50805180156118fc5761184391602082036118f25760209150015191610890565b6020012091610890565b5050505f905f905f90565b9091600161191b82610b2a60ff948761198d565b940193929190506118bc565b600f16916118b8565b9290509392935f915b601083106119735761194b9250611546565b50602081519101209060208151910120145f1461196a57600191905f90565b5f915081908190565b9061198481610b2a6001938561198d565b92019190611939565b908151811015611202576119a7610b146112ed838561121e565b9160ff831660808110156119be5750505050600190565b60b88110156119d957505050610b24610b1f610bd192610a5a565b60c0811015611a45575091610b246119f091610a80565b905f925f915b838310611a0d5750505090610e66610bd1926108ac565b909193611a1c60019160081b90565b611a3b610b24610b146112ed611a358a610e6689610890565b8861121e565b17940191906119f6565b60f81115611a5e575050610b24610b1f610bd192610a6d565b91610b24611a6b91610a47565b905f925f915b838310611a885750505090610e66610bd1926108ac565b909193611a9760019160081b90565b611ab0610b24610b146112ed611a358a610e6689610890565b1794019190611a71565b90815115611c2357611ad1610b146112ed84611211565b6010811615611ba057611af4611aef611aea855161171c565b6108ee565b61151e565b9060f81b600f60f81b165f1a611b0982611211565b5360015b8351811015611b9b5780611b48611b38611b2f610b146112ed6001968a61121e565b60041c600f1690565b60f81b6001600160f81b03191690565b611b61611b57611aea8461171c565b915f1a918561121e565b53611b88600f611b77610b146112ed858a61121e565b1660f81b6001600160f81b03191690565b611b94611b578361171c565b5301611b0d565b509150565b50611bb6611aef611bb1845161171c565b6108df565b60015b8351811015611b9b5780611bdb611b38611b2f610b146112ed6001968a61121e565b611bef611b57611bea846108ee565b61171c565b53611c05600f611b77610b146112ed858a61121e565b611c1c611b57611c17611bea856108ee565b610890565b5301611bb9565b565b919091611c338251846108ba565b611c3d825161171c565b10611cdc575f5b8251811015611cd357611c60611c5a82866108ba565b60011690565b611cb557611c89611b2f610b146112ed611c83611c7d868a6108ba565b60011c90565b8661121e565b60ff611c9e610b24610b146112ed868961121e565b911603611cad57600101611c44565b505050505f90565b600f611ccd610b146112ed611c83611c7d868a6108ba565b16611c89565b50505050600190565b5050505f9056fea2646970667358221220551b080203e39849c48692aeaf0c14462bab43e541853bdf873a521ef4a4fef064736f6c634300081e0033 diff --git a/out/EscrowERC20.sol/EscrowERC20.json b/out/EscrowERC20.sol/EscrowERC20.json index 5f96b29..c0d7e01 100644 --- a/out/EscrowERC20.sol/EscrowERC20.json +++ b/out/EscrowERC20.sol/EscrowERC20.json @@ -1 +1 @@ -{"abi":[{"type":"constructor","inputs":[{"name":"_tokenContract","type":"address","internalType":"address"},{"name":"_expectedRecipient","type":"address","internalType":"address"},{"name":"_expectedAmount","type":"uint256","internalType":"uint256"},{"name":"_currentRewardAmount","type":"uint256","internalType":"uint256"},{"name":"_currentPaymentAmount","type":"uint256","internalType":"uint256"}],"stateMutability":"nonpayable"},{"type":"function","name":"MAX_BLOCK_LOOKBACK","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"bond","inputs":[{"name":"_bondAmount","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"bondAmount","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"bondedExecutor","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"type":"function","name":"cancellationRequest","inputs":[],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"collect","inputs":[{"name":"proof","type":"tuple","internalType":"struct EscrowERC20.ReceiptProof","components":[{"name":"blockHeader","type":"bytes","internalType":"bytes"},{"name":"receiptRlp","type":"bytes","internalType":"bytes"},{"name":"proofNodes","type":"bytes","internalType":"bytes"},{"name":"receiptPath","type":"bytes","internalType":"bytes"},{"name":"logIndex","type":"uint256","internalType":"uint256"}]},{"name":"targetBlockNumber","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"currentPaymentAmount","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"currentRewardAmount","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"executionDeadline","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"expectedAmount","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"expectedRecipient","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"type":"function","name":"fund","inputs":[{"name":"_currentRewardAmount","type":"uint256","internalType":"uint256"},{"name":"_currentPaymentAmount","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"funded","inputs":[],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"is_bonded","inputs":[],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"originalRewardAmount","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"requestCancellation","inputs":[],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"resume","inputs":[],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"tokenContract","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"type":"function","name":"totalBondsDeposited","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"withdraw","inputs":[],"outputs":[],"stateMutability":"nonpayable"},{"type":"error","name":"AlreadyFunded","inputs":[]},{"type":"error","name":"AmountMismatch","inputs":[]},{"type":"error","name":"BlockHashUnavailable","inputs":[]},{"type":"error","name":"BlockHeaderMismatch","inputs":[]},{"type":"error","name":"BlockNumberMismatch","inputs":[]},{"type":"error","name":"BondActive","inputs":[]},{"type":"error","name":"CancellationRequested","inputs":[]},{"type":"error","name":"ExecutorAlreadyBonded","inputs":[]},{"type":"error","name":"ExpectedBytes32","inputs":[]},{"type":"error","name":"ExpectedRLPList","inputs":[]},{"type":"error","name":"ExpectedStringData","inputs":[]},{"type":"error","name":"ExpectedStringItem","inputs":[]},{"type":"error","name":"InsufficientBond","inputs":[]},{"type":"error","name":"InvalidAddress","inputs":[]},{"type":"error","name":"InvalidRLP","inputs":[]},{"type":"error","name":"InvalidRLPEncoding","inputs":[]},{"type":"error","name":"InvalidRLPList","inputs":[]},{"type":"error","name":"InvalidReceiptProof","inputs":[]},{"type":"error","name":"InvalidTransferEvent","inputs":[]},{"type":"error","name":"NoWithdrawableFunds","inputs":[]},{"type":"error","name":"NotFunded","inputs":[]},{"type":"error","name":"OnlyBondedExecutor","inputs":[]},{"type":"error","name":"OnlyDeployer","inputs":[]},{"type":"error","name":"RLPOffsetOutOfBounds","inputs":[]},{"type":"error","name":"RLPOffsetOutOfBounds","inputs":[]},{"type":"error","name":"TargetBlockInFuture","inputs":[]},{"type":"error","name":"TargetBlockTooOld","inputs":[]},{"type":"error","name":"ToAddressMismatch","inputs":[]},{"type":"error","name":"TokenTransferFailed","inputs":[]},{"type":"error","name":"WrongEventSignature","inputs":[]},{"type":"error","name":"WrongTokenContract","inputs":[]},{"type":"error","name":"ZeroAddress","inputs":[]},{"type":"error","name":"ZeroPaymentAmount","inputs":[]},{"type":"error","name":"ZeroRewardAmount","inputs":[]}],"bytecode":{"object":"0x61010080604052346101c15760a08161256580380380916100208285610231565b8339810103126101c15761003381610268565b9061004060208201610268565b6040820151608060608401519301519160a05260c0523360805260018060a01b0383169283156102225760e0528115801580610219575b6100fc575b6040516122e8908161027d8239608051818181610166015281816103fa015281816105670152610a67015260a05181818161044c015261083a015260c0518181816101f20152610818015260e0518181816102c501528181610380015281816104ee015281816106080152818161085c01528181610f650152610ff70152f35b60ff60075460081c1661020a576101fb5780156101ec57815f55816002558060015581018091116101d8575f91606460209260405194859384926323b872dd60e01b845233600485015230602485015260448401525af19081156101cd575f9161018e575b501561017f5761010061ff001960075416176007555f80808061007c565b63022e258160e11b5f5260045ffd5b90506020813d6020116101c5575b816101a960209383610231565b810103126101c1575180151581036101c1575f610161565b5f80fd5b3d915061019c565b6040513d5f823e3d90fd5b634e487b7160e01b5f52601160045260245ffd5b63932ca0a360e01b5f5260045ffd5b63ea1083a760e01b5f5260045ffd5b635adf638760e01b5f5260045ffd5b50811515610077565b63d92e233d60e01b5f5260045ffd5b601f909101601f19168101906001600160401b0382119082101761025457604052565b634e487b7160e01b5f52604160045260245ffd5b51906001600160a01b03821682036101c15756fe60806040526004361015610011575f80fd5b5f3560e01c8063046f7da2146101545780631aa7c0ec1461014f5780632feef2ec1461014a578063308657d71461014557806333ee5f35146101405780633ccfd60b1461013b5780633d2691bc1461013657806355a373d6146101315780635a4fd6451461012c57806380f323a71461012757806381972d00146101225780638677ab231461011d5780638bd03d0a146101185780639940686e14610113578063a65e2cfd1461010e578063cb766a5614610109578063d415b3f914610104578063ede7f6a3146100ff578063f3a504f2146100fa5763fe03a460146100f5575f80fd5b61094f565b61092a565b6106e7565b6106ca565b6106a6565b61054e565b610498565b61047b565b610437565b6103e8565b6103cb565b6103af565b61036b565b61034f565b610254565b610237565b610215565b6101db565b6101b3565b346101af575f3660031901126101af577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031633036101a0576007805460ff19169055005b63618bbdd560e01b5f5260045ffd5b5f80fd5b346101af575f3660031901126101af576003546040516001600160a01b039091168152602090f35b346101af575f3660031901126101af5760206040517f00000000000000000000000000000000000000000000000000000000000000008152f35b346101af575f3660031901126101af57602060ff600754166040519015158152f35b346101af575f3660031901126101af576020600454604051908152f35b346101af575f3660031901126101af5761026c610a57565b610274610a97565b61027c610ace565b61029361ff0019600754166007555f6001555f8055565b80156103405760405163a9059cbb60e01b815233600482015260248101919091526020816044815f6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000165af190811561033b575f9161030c575b50156102fd57005b63022e258160e11b5f5260045ffd5b61032e915060203d602011610334575b6103268183610980565b8101906109a7565b5f6102f5565b503d61031c565b6109bf565b6353cd7f7960e01b5f5260045ffd5b346101af575f3660031901126101af5760206040516101008152f35b346101af575f3660031901126101af576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b346101af575f3660031901126101af5760205f54604051908152f35b346101af575f3660031901126101af576020600554604051908152f35b346101af575f3660031901126101af577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031633036101a0576007805460ff19166001179055005b346101af575f3660031901126101af576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b346101af575f3660031901126101af576020600154604051908152f35b346101af5760203660031901126101af576004356104b4610ae0565b6104bd81610b29565b6040516323b872dd60e01b8152336004820152306024820152604481018290526020816064815f6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000165af190811561033b575f9161052f575b50156102fd5761052d90610b84565b005b610548915060203d602011610334576103268183610980565b5f61051e565b346101af5760403660031901126101af576004356024357f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031633036101a05760075460081c60ff16610697578115610688578015610679576105bd826105c2935f55600255565b600155565b61060360206105d6600254600154906109ff565b6040516323b872dd60e01b8152336004820152306024820152604481019190915291829081906064820190565b03815f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165af190811561033b575f9161065a575b50156102fd5761052d61010061ff00196007541617600755565b610673915060203d602011610334576103268183610980565b5f610640565b63932ca0a360e01b5f5260045ffd5b63ea1083a760e01b5f5260045ffd5b635adf638760e01b5f5260045ffd5b346101af575f3660031901126101af5760206106c0610a0c565b6040519015158152f35b346101af575f3660031901126101af576020600254604051908152f35b346101af5760403660031901126101af5760043567ffffffffffffffff81116101af578060040160a060031983360301126101af576024356107298280610a24565b60075461073e9060081c60ff161590565b1590565b61091b5760035461075f906001600160a01b03165b6001600160a01b031690565b331480159061090a575b6108fb574383116108ec576101006107818443610bc9565b116108dd57824080156108ce57610799368385610bf2565b60208151910120036108bf576107ae91611072565b036108b0576107c66107c08280610a24565b90610c56565b9161080061073a60248301946107dc8686610a24565b906107ea6044870188610a24565b906107f8606489018a610a24565b949093610cc6565b6108a15760846108166108869461073a94610a24565b7f0000000000000000000000000000000000000000000000000000000000000000937f0000000000000000000000000000000000000000000000000000000000000000937f0000000000000000000000000000000000000000000000000000000000000000939101359190610d4a565b6108925761052d610ee4565b6364fa89e160e11b5f5260045ffd5b637b374dd160e01b5f5260045ffd5b63048a12f560e11b5f5260045ffd5b63ff28378760e01b5f5260045ffd5b63bfc9f0d360e01b5f5260045ffd5b63c42a018560e01b5f5260045ffd5b63058968cf60e41b5f5260045ffd5b6337b5f20360e21b5f5260045ffd5b5061091661073a610a0c565b610769565b636af784dd60e11b5f5260045ffd5b346101af575f3660031901126101af57602060ff60075460081c166040519015158152f35b346101af575f3660031901126101af576020600654604051908152f35b634e487b7160e01b5f52604160045260245ffd5b90601f8019910116810190811067ffffffffffffffff8211176109a257604052565b61096c565b908160209103126101af575180151581036101af5790565b6040513d5f823e3d90fd5b634e487b7160e01b5f52601160045260245ffd5b90600182018092116109ec57565b6109ca565b60010190816001116109ec57565b919082018092116109ec57565b6004548015159081610a1c575090565b905042111590565b903590601e19813603018212156101af570180359067ffffffffffffffff82116101af576020019181360383136101af57565b60ff60075460081c161561091b577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031633036101a057565b610a9f610a0c565b610abf576001600160601b0360a01b600354166003555f6005555f600455565b639cbc1de160e01b5f5260045ffd5b60015460025481018091116109ec5790565b6004548015159081610b1f575b50610af457565b6005545f548181018091116109ec575f556006549081018091116109ec57600655610b1d610a97565b565b905042115f610aed565b60075460ff8160081c161561091b5760ff16610b7557610b47610a0c565b610b66575f5460011c11610b5757565b63e92c469f60e01b5f5260045ffd5b63129f78e960e11b5f5260045ffd5b632479328960e01b5f5260045ffd5b336001600160601b0360a01b600354161760035561012c42018042116109ec57600455600555565b6001198101919082116109ec57565b5f198101919082116109ec57565b919082039182116109ec57565b67ffffffffffffffff81116109a257601f01601f191660200190565b929192610bfe82610bd6565b91610c0c6040519384610980565b8294818452818301116101af578281602093845f960137010152565b634e487b7160e01b5f52603260045260245ffd5b9015610c455790565b610c28565b90821015610c45570190565b90610c6181836110da565b905f5b60058110610cb15750600560fd1b906001600160f81b031990610c8990849086610c4a565b351603610ca2576001810181116109ec57016001013590565b633954003560e11b5f5260045ffd5b91610cbf600191838661120e565b9201610c64565b610cdc610ce492939495610cea98973691610bf2565b923691610bf2565b9061137d565b90565b60ff60f6199116019060ff82116109ec57565b60ff60bf199116019060ff82116109ec57565b60ff60b6199116019060ff82116109ec57565b60ff607f199116019060ff82116109ec57565b60ff166001019060ff82116109ec57565b9594939291905f818881151580610ec8575b610eba575b610d8a610d84610d768560c09560ff95610c4a565b356001600160f81b03191690565b60f81c90565b1610610e8457808860f860ff610da8610d84610d7688978887610c4a565b1610610eaa57610dd5610dd0610dcb610d84610d7686610de198610ddb97610c4a565b610ced565b610d39565b60ff1690565b906109ff565b81885f5b60038110610e935750610dd5610d84610d768560c095610e0495610c4a565b10610e8457808860f8610e22610dd5610d84610d7688978887610c4a565b10610e7357610dd5610dd0610dcb610d84610d7686610e4498610ddb97610c4a565b915b5f905b808210610e5c575050610cea959661152a565b9092610e6b600191848b61120e565b930190610e49565b50610e7e91506109de565b91610e46565b631bd5dcf760e31b5f5260045ffd5b92600192610ea09261120e565b9101888391610de5565b50610eb591506109de565b610de1565b506001915082905088610d61565b50608060ff610edd610d84610d768686610c3c565b1610610d5c565b610eec6115f1565b6003546001600160a01b0316610f296001600160601b0360a01b600354166003555f6005555f60045561ff0019600754166007555f6001555f8055565b4662aa36a703610fc557604051633419e74d60e21b81526001600160a01b0390911660048201526024810191909152602081806044810103815f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165af190811561033b575f91610fa6575b505b156102fd57565b610fbf915060203d602011610334576103268183610980565b5f610f9d565b60405163a9059cbb60e01b81526001600160a01b0390911660048201526024810191909152602081806044810103815f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165af190811561033b575f91611035575b50610f9f565b61104e915060203d602011610334576103268183610980565b5f61102f565b805115610c455760200190565b908151811015610c45570160200190565b919061107e81846110da565b905f5b600881106110c557506110949293611684565b50905f805b83518210156110c0576001906110af8386611061565b5160f81c9060081b17910190611099565b925050565b916110d3600191838761120e565b9201611081565b5f600360fe1b6001600160f81b03196110f6610d768686610c3c565b16106111d657601f60fb1b6001600160f81b0319611117610d768686610c3c565b16106112055780610ddb610dd5610dd0610dcb610d84610d7661113b978a8a610c4a565b905b61a5bd461480156111fa575b611154575b50905090565b5f5b600381106111e55750600360fe1b611182611175610d76858786610c4a565b6001600160f81b03191690565b106111d657601f60fb1b61119d611175610d76858786610c4a565b106111c657610dd5610dd0610dcb610d84610d76866111bf98610ddb97610c4a565b805f61114e565b506111d191506109de565b6111bf565b63c0098bd960e01b5f5260045ffd5b916111f3600191858461120e565b9201611156565b5061a5bf4614611149565b5060019061113d565b91908082101561136e57611229610d84610d76848487610c4a565b9060ff8216608081101561124457505050610cea91506109de565b91929160b881101561126c575050610cea9250610dd5611266610ddb926109de565b92610d26565b90929060c08110156112e75750610dd561128891949394610d13565b915f935f915b8483106112ae57505050610cea92916112a96112a9926109de565b6109ff565b9091946112bd60019160081b90565b6112dd610dd5610d84610d766112d68b6112a98b6109de565b8888610c4a565b179501919061128e565b90929060f8111561130d5750610cea9250610dd5611307610ddb926109de565b92610d00565b9291610dd561131b91610ced565b915f935f915b84831061133c57505050610cea92916112a96112a9926109de565b90919461134b60019160081b90565b611364610dd5610d84610d766112d68b6112a98b6109de565b1795019190611321565b6318d76ae160e11b5f5260045ffd5b919390929190600360fe1b6001600160f81b031961139e610d768689610c3c565b161061151b57601f60fb1b6001600160f81b03196113bf610d768689610c3c565b1610611511576113e36113de610dd5610dcb610d84610d76888b610c3c565b6109f1565b9492905b945f5b8282106113fc57505050505050505f90565b61141a6114138361140e36878a610bf2565b6117f5565b90936109ff565b9682516020840120036114af57600360fe1b61144961117561143b85611054565b516001600160f81b03191690565b106114af578590846001601f60fb1b61146761117561143b88611054565b10156114f3575b611478818661197c565b601181036114ba575061148a94611b07565b9491156114af5784156114a35793915b919590936113ea565b50505050505050600190565b505050505050505f90565b9093506002141590506114e7578487926114d3946119c1565b9491156114af5784156114a357939161149a565b50505050505050505f90565b5061150c6113de610dd5610dcb610d8461143b89611054565b61146e565b60019492906113e7565b63ebb47d1d60e01b5f5260045ffd5b91949392948060c060ff611545610d84610d7685888a610c4a565b1610610e845760f860ff611560610d84610d7685888a610c4a565b16106115e2575080610ddb610dd5610dd0610dcb610d84610d7661158597898b610c4a565b611590818385611c1c565b969060148151036115d357601401516001600160a01b039182169116036115c457610cea956115be916109ff565b91611c88565b63a087f96f60e01b5f5260045ffd5b63e6c4247b60e01b5f5260045ffd5b6115ec91506109de565b611585565b6005545f5481018091116109ec5760015481018091116109ec5790565b6040805190919061161f8382610980565b6001815291601f1901366020840137565b604080519091906116418382610980565b6014815291601f1901366020840137565b9061165c82610bd6565b6116696040519182610980565b828152809261167a601f1991610bd6565b0190602036910137565b8183101561136e5761169d610d84610d76858585610c4a565b9260ff841660808110156116d757505050506116b761160e565b9060f81b6001600160f81b0319165f1a6116d082611054565b5390600190565b60b881969592939496105f146117455750610dd56116f491610d26565b916116fe83611652565b945f5b8481106117155750505050610cea906109f1565b80611732610d7661172b6001946112a9896109de565b8587610c4a565b5f1a61173e828a611061565b5301611701565b60c011156117e657610dd561175991610d13565b905f925f5b8381106117b7575061176f84611652565b955f5b85811061178a5750505050906112a9610cea926109f1565b806117a4610d7661172b6001946112a98a6112a98b6109de565b5f1a6117b0828b611061565b5301611772565b9360019060081b6117de610dd5610d84610d766117d78a6112a98a6109de565b8c88610c4a565b17940161175e565b636b2e9c5f60e11b5f5260045ffd5b805182101561136e5761180e610d8461143b8484611061565b9160ff83166080811015611827575050506116b761160e565b919392909160b88110156118915750610dd561184291610d26565b9061184c82611652565b935f5b83811061186257505050610cea906109f1565b8061187e61143b6118786001946112a9886109de565b85611061565b5f1a61188a8289611061565b530161184f565b60c0111561192f57610dd56118a591610d13565b5f915f5b82811061190157506118ba83611652565b945f5b8481106118d457505050906112a9610cea926109f1565b806118ee61143b6118786001946112a9896112a98a6109de565b5f1a6118fa828a611061565b53016118bd565b9260019060081b611927610dd5610d8461143b611921896112a9896109de565b8b611061565b1793016118a9565b509161193b8382611ddf565b9261194584611652565b915f5b858110611956575050509190565b8061196961143b611878600194876109ff565b5f1a6119758287611061565b5301611948565b5f92915b81518110156119a7576119938183611ddf565b81018091116109ec57600190930192611980565b5050565b908160011b91808304600214901517156109ec57565b839492916119cf81836117f5565b93906119ee60206119e5610d8461143b85611054565b16151591611f0c565b97889115611a905750611a029051876109ff565b611a0c82516119ab565b14611a21575b505050505050505f905f905f90565b86866001928251611a7e575b505050611a3b575b80611a12565b611a4e92611a48916109ff565b906117f5565b5060208151910120906020815191012014611a6c5780808080611a35565b611a779151906109ff565b6001915f90565b611a889350612075565b86865f611a2d565b611aa1939495965061073a92612075565b611afa57611ab292611a48916109ff565b50908151602081145f14611ada57506020611ad2920151925b51906109ff565b916001929190565b8015611aee576020611ad293012092611acb565b505050505f905f905f90565b50505050505f905f905f90565b91909293611b1582516119ab565b851015611bbf5750610d8461143b611b3792611b318760011c90565b90611061565b60018416611bb65760041c600f16915b905f925b60ff81168410611b965750611b6092506117f5565b5080518015611b8b57611ad29160208203611b8157602091500151916109de565b60200120916109de565b5050505f905f905f90565b90916001611baa82610ddb60ff9487611ddf565b94019392919050611b4b565b600f1691611b47565b9290509392935f915b60108310611c0257611bda92506117f5565b50602081519101209060208151910120145f14611bf957600191905f90565b5f915081908190565b90611c1381610ddb60019385611ddf565b92019190611bc8565b91909182821015610e8457609460ff611c3c610d84610d76868887610c4a565b16036115d357611c4a611630565b925f5b60148110611c5f575050505090601590565b80611c75610d7661172b6001946112a9896109de565b5f1a611c818288611061565b5301611c4d565b91928360c060ff611ca0610d84610d7689888a610c4a565b1610610e845760f860ff611cbb610d84610d7689888a610c4a565b1610611dd05780610ddb610dd5610dd0610dcb610d84610d76611cdf978a8c610c4a565b7fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef611d0b828587612133565b03611dc157610753610753611d2e611d27611d3594878961120e565b868861120e565b8587612133565b6001600160a01b03918216911603611db257611d55611d5b93828461120e565b9161216f565b50916020835111610e84575f90815b8451831015611d955760019060081b611d8c610dd5610d8461143b878a611061565b17920191611d6a565b9150925003611da357600190565b6355e97b0d60e01b5f5260045ffd5b634cd4b7b160e01b5f5260045ffd5b6324da545d60e11b5f5260045ffd5b50611dda846109de565b611cdf565b90815181101561136e57611df9610d8461143b8385611061565b9160ff83166080811015611e105750505050600190565b60b8811015611e2b57505050610dd5610dd0610cea92610d26565b60c0811015611e97575091610dd5611e4291610d13565b905f925f915b838310611e5f57505050906112a9610cea926109f1565b909193611e6e60019160081b90565b611e8d610dd5610d8461143b611e878a6112a9896109de565b88611061565b1794019190611e48565b60f81115611eb0575050610dd5610dd0610cea92610d00565b91610dd5611ebd91610ced565b905f925f915b838310611eda57505050906112a9610cea926109f1565b909193611ee960019160081b90565b611f02610dd5610d8461143b611e878a6112a9896109de565b1794019190611ec3565b90815115610b1d57611f23610d8461143b84611054565b6010811615611ff257611f46611f41611f3c85516119ab565b610bbb565b611652565b9060f81b600f60f81b165f1a611f5b82611054565b5360015b8351811015611fed5780611f9a611f8a611f81610d8461143b6001968a611061565b60041c600f1690565b60f81b6001600160f81b03191690565b611fb3611fa9611f3c846119ab565b915f1a9185611061565b53611fda600f611fc9610d8461143b858a611061565b1660f81b6001600160f81b03191690565b611fe6611fa9836119ab565b5301611f5f565b509150565b50612008611f4161200384516119ab565b610bac565b60015b8351811015611fed578061202d611f8a611f81610d8461143b6001968a611061565b612041611fa961203c84610bbb565b6119ab565b53612057600f611fc9610d8461143b858a611061565b61206e611fa961206961203c85610bbb565b6109de565b530161200b565b9190916120838251846109ff565b61208d82516119ab565b1061212c575f5b8251811015612123576120b06120aa82866109ff565b60011690565b612105576120d9611f81610d8461143b6120d36120cd868a6109ff565b60011c90565b86611061565b60ff6120ee610dd5610d8461143b8689611061565b9116036120fd57600101612094565b505050505f90565b600f61211d610d8461143b6120d36120cd868a6109ff565b166120d9565b50505050600190565b5050505f90565b9190600560fd1b906001600160f81b03199061215190849086610c4a565b35160361216057016001013590565b63f0ff325b60e01b5f5260045ffd5b81831015610e8457612188610d84610d76858585610c4a565b9260ff841660808110156121a257505050506116b761160e565b60b881969592939496105f146122095750610dd56121bf91610d26565b916121c983611652565b945f5b8481106121e05750505050610cea906109f1565b806121f6610d7661172b6001946112a9896109de565b5f1a612202828a611061565b53016121cc565b60c011156122a357610dd561221d91610d13565b905f925f5b83811061227b575061223384611652565b955f5b85811061224e5750505050906112a9610cea926109f1565b80612268610d7661172b6001946112a98a6112a98b6109de565b5f1a612274828b611061565b5301612236565b9360019060081b61229b610dd5610d84610d766117d78a6112a98a6109de565b179401612222565b6336459a5b60e21b5f5260045ffdfea2646970667358221220f111dda4228930ff7fcf5360c1e823b8ddcd3e1621a6c54215af8789b55a438f64736f6c634300081e0033","sourceMap":"426:4780:21:-:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;1670:38:20;426:4780:21;1670:38:20;1718:32;;1778:10;426:4780:21;1760:28:20;426:4780:21;;;;;;;1437:28;;;1433:54;;1497:30;;1542:24;;;;:53;;;-1:-1:-1;1538:133:21;;-1:-1:-1;426:4780:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1718:32:20;426:4780:21;;;;;;;;;;1497:30;426:4780;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1538:133;426:4780;1953:6;426:4780;;;;1949:34;;1993:56;;2063:26;;2059:58;;426:4780;-1:-1:-1;426:4780:21;;2180:43;426:4780;;;;;;;;;;;-1:-1:-1;426:4780:21;2292:106;426:4780;;;;;;;;;;;;2292:106;;1778:10:20;2292:106:21;;;426:4780;2347:4;426:4780;;;;;;;;2292:106;;;;;;;-1:-1:-1;2292:106:21;;;1538:133;2291:107;;2287:174;;426:4780;;;1953:6;426:4780;;;1953:6;426:4780;1538:133;;;;;;2287:174;2429:21;;;-1:-1:-1;2429:21:21;2292:106;-1:-1:-1;2429:21:21;2292:106;;;426:4780;2292:106;;426:4780;2292:106;;;;;;426:4780;2292:106;;;:::i;:::-;;;426:4780;;;;;;;;;;;;2292:106;;;426:4780;-1:-1:-1;426:4780:21;;2292:106;;;-1:-1:-1;2292:106:21;;;426:4780;;;-1:-1:-1;426:4780:21;;;;;;;;;-1:-1:-1;426:4780:21;;;;;-1:-1:-1;426:4780:21;2059:58;2098:19;;;-1:-1:-1;2098:19:21;;-1:-1:-1;2098:19:21;1993:56;2031:18;;;-1:-1:-1;2031:18:21;;-1:-1:-1;2031:18:21;1949:34;1968:15;;;-1:-1:-1;1968:15:21;;-1:-1:-1;1968:15:21;1542:53;1570:25;;;;1542:53;;1433:54;1474:13;;;-1:-1:-1;1474:13:21;;-1:-1:-1;1474:13:21;426:4780;;;;;-1:-1:-1;;426:4780:21;;;;-1:-1:-1;;;;;426:4780:21;;;;;;;;;;:::o;:::-;;;;-1:-1:-1;426:4780:21;;;;;-1:-1:-1;426:4780:21;;;;-1:-1:-1;;;;;426:4780:21;;;;;;:::o","linkReferences":{}},"deployedBytecode":{"object":"0x60806040526004361015610011575f80fd5b5f3560e01c8063046f7da2146101545780631aa7c0ec1461014f5780632feef2ec1461014a578063308657d71461014557806333ee5f35146101405780633ccfd60b1461013b5780633d2691bc1461013657806355a373d6146101315780635a4fd6451461012c57806380f323a71461012757806381972d00146101225780638677ab231461011d5780638bd03d0a146101185780639940686e14610113578063a65e2cfd1461010e578063cb766a5614610109578063d415b3f914610104578063ede7f6a3146100ff578063f3a504f2146100fa5763fe03a460146100f5575f80fd5b61094f565b61092a565b6106e7565b6106ca565b6106a6565b61054e565b610498565b61047b565b610437565b6103e8565b6103cb565b6103af565b61036b565b61034f565b610254565b610237565b610215565b6101db565b6101b3565b346101af575f3660031901126101af577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031633036101a0576007805460ff19169055005b63618bbdd560e01b5f5260045ffd5b5f80fd5b346101af575f3660031901126101af576003546040516001600160a01b039091168152602090f35b346101af575f3660031901126101af5760206040517f00000000000000000000000000000000000000000000000000000000000000008152f35b346101af575f3660031901126101af57602060ff600754166040519015158152f35b346101af575f3660031901126101af576020600454604051908152f35b346101af575f3660031901126101af5761026c610a57565b610274610a97565b61027c610ace565b61029361ff0019600754166007555f6001555f8055565b80156103405760405163a9059cbb60e01b815233600482015260248101919091526020816044815f6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000165af190811561033b575f9161030c575b50156102fd57005b63022e258160e11b5f5260045ffd5b61032e915060203d602011610334575b6103268183610980565b8101906109a7565b5f6102f5565b503d61031c565b6109bf565b6353cd7f7960e01b5f5260045ffd5b346101af575f3660031901126101af5760206040516101008152f35b346101af575f3660031901126101af576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b346101af575f3660031901126101af5760205f54604051908152f35b346101af575f3660031901126101af576020600554604051908152f35b346101af575f3660031901126101af577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031633036101a0576007805460ff19166001179055005b346101af575f3660031901126101af576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b346101af575f3660031901126101af576020600154604051908152f35b346101af5760203660031901126101af576004356104b4610ae0565b6104bd81610b29565b6040516323b872dd60e01b8152336004820152306024820152604481018290526020816064815f6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000165af190811561033b575f9161052f575b50156102fd5761052d90610b84565b005b610548915060203d602011610334576103268183610980565b5f61051e565b346101af5760403660031901126101af576004356024357f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031633036101a05760075460081c60ff16610697578115610688578015610679576105bd826105c2935f55600255565b600155565b61060360206105d6600254600154906109ff565b6040516323b872dd60e01b8152336004820152306024820152604481019190915291829081906064820190565b03815f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165af190811561033b575f9161065a575b50156102fd5761052d61010061ff00196007541617600755565b610673915060203d602011610334576103268183610980565b5f610640565b63932ca0a360e01b5f5260045ffd5b63ea1083a760e01b5f5260045ffd5b635adf638760e01b5f5260045ffd5b346101af575f3660031901126101af5760206106c0610a0c565b6040519015158152f35b346101af575f3660031901126101af576020600254604051908152f35b346101af5760403660031901126101af5760043567ffffffffffffffff81116101af578060040160a060031983360301126101af576024356107298280610a24565b60075461073e9060081c60ff161590565b1590565b61091b5760035461075f906001600160a01b03165b6001600160a01b031690565b331480159061090a575b6108fb574383116108ec576101006107818443610bc9565b116108dd57824080156108ce57610799368385610bf2565b60208151910120036108bf576107ae91611072565b036108b0576107c66107c08280610a24565b90610c56565b9161080061073a60248301946107dc8686610a24565b906107ea6044870188610a24565b906107f8606489018a610a24565b949093610cc6565b6108a15760846108166108869461073a94610a24565b7f0000000000000000000000000000000000000000000000000000000000000000937f0000000000000000000000000000000000000000000000000000000000000000937f0000000000000000000000000000000000000000000000000000000000000000939101359190610d4a565b6108925761052d610ee4565b6364fa89e160e11b5f5260045ffd5b637b374dd160e01b5f5260045ffd5b63048a12f560e11b5f5260045ffd5b63ff28378760e01b5f5260045ffd5b63bfc9f0d360e01b5f5260045ffd5b63c42a018560e01b5f5260045ffd5b63058968cf60e41b5f5260045ffd5b6337b5f20360e21b5f5260045ffd5b5061091661073a610a0c565b610769565b636af784dd60e11b5f5260045ffd5b346101af575f3660031901126101af57602060ff60075460081c166040519015158152f35b346101af575f3660031901126101af576020600654604051908152f35b634e487b7160e01b5f52604160045260245ffd5b90601f8019910116810190811067ffffffffffffffff8211176109a257604052565b61096c565b908160209103126101af575180151581036101af5790565b6040513d5f823e3d90fd5b634e487b7160e01b5f52601160045260245ffd5b90600182018092116109ec57565b6109ca565b60010190816001116109ec57565b919082018092116109ec57565b6004548015159081610a1c575090565b905042111590565b903590601e19813603018212156101af570180359067ffffffffffffffff82116101af576020019181360383136101af57565b60ff60075460081c161561091b577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031633036101a057565b610a9f610a0c565b610abf576001600160601b0360a01b600354166003555f6005555f600455565b639cbc1de160e01b5f5260045ffd5b60015460025481018091116109ec5790565b6004548015159081610b1f575b50610af457565b6005545f548181018091116109ec575f556006549081018091116109ec57600655610b1d610a97565b565b905042115f610aed565b60075460ff8160081c161561091b5760ff16610b7557610b47610a0c565b610b66575f5460011c11610b5757565b63e92c469f60e01b5f5260045ffd5b63129f78e960e11b5f5260045ffd5b632479328960e01b5f5260045ffd5b336001600160601b0360a01b600354161760035561012c42018042116109ec57600455600555565b6001198101919082116109ec57565b5f198101919082116109ec57565b919082039182116109ec57565b67ffffffffffffffff81116109a257601f01601f191660200190565b929192610bfe82610bd6565b91610c0c6040519384610980565b8294818452818301116101af578281602093845f960137010152565b634e487b7160e01b5f52603260045260245ffd5b9015610c455790565b610c28565b90821015610c45570190565b90610c6181836110da565b905f5b60058110610cb15750600560fd1b906001600160f81b031990610c8990849086610c4a565b351603610ca2576001810181116109ec57016001013590565b633954003560e11b5f5260045ffd5b91610cbf600191838661120e565b9201610c64565b610cdc610ce492939495610cea98973691610bf2565b923691610bf2565b9061137d565b90565b60ff60f6199116019060ff82116109ec57565b60ff60bf199116019060ff82116109ec57565b60ff60b6199116019060ff82116109ec57565b60ff607f199116019060ff82116109ec57565b60ff166001019060ff82116109ec57565b9594939291905f818881151580610ec8575b610eba575b610d8a610d84610d768560c09560ff95610c4a565b356001600160f81b03191690565b60f81c90565b1610610e8457808860f860ff610da8610d84610d7688978887610c4a565b1610610eaa57610dd5610dd0610dcb610d84610d7686610de198610ddb97610c4a565b610ced565b610d39565b60ff1690565b906109ff565b81885f5b60038110610e935750610dd5610d84610d768560c095610e0495610c4a565b10610e8457808860f8610e22610dd5610d84610d7688978887610c4a565b10610e7357610dd5610dd0610dcb610d84610d7686610e4498610ddb97610c4a565b915b5f905b808210610e5c575050610cea959661152a565b9092610e6b600191848b61120e565b930190610e49565b50610e7e91506109de565b91610e46565b631bd5dcf760e31b5f5260045ffd5b92600192610ea09261120e565b9101888391610de5565b50610eb591506109de565b610de1565b506001915082905088610d61565b50608060ff610edd610d84610d768686610c3c565b1610610d5c565b610eec6115f1565b6003546001600160a01b0316610f296001600160601b0360a01b600354166003555f6005555f60045561ff0019600754166007555f6001555f8055565b4662aa36a703610fc557604051633419e74d60e21b81526001600160a01b0390911660048201526024810191909152602081806044810103815f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165af190811561033b575f91610fa6575b505b156102fd57565b610fbf915060203d602011610334576103268183610980565b5f610f9d565b60405163a9059cbb60e01b81526001600160a01b0390911660048201526024810191909152602081806044810103815f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165af190811561033b575f91611035575b50610f9f565b61104e915060203d602011610334576103268183610980565b5f61102f565b805115610c455760200190565b908151811015610c45570160200190565b919061107e81846110da565b905f5b600881106110c557506110949293611684565b50905f805b83518210156110c0576001906110af8386611061565b5160f81c9060081b17910190611099565b925050565b916110d3600191838761120e565b9201611081565b5f600360fe1b6001600160f81b03196110f6610d768686610c3c565b16106111d657601f60fb1b6001600160f81b0319611117610d768686610c3c565b16106112055780610ddb610dd5610dd0610dcb610d84610d7661113b978a8a610c4a565b905b61a5bd461480156111fa575b611154575b50905090565b5f5b600381106111e55750600360fe1b611182611175610d76858786610c4a565b6001600160f81b03191690565b106111d657601f60fb1b61119d611175610d76858786610c4a565b106111c657610dd5610dd0610dcb610d84610d76866111bf98610ddb97610c4a565b805f61114e565b506111d191506109de565b6111bf565b63c0098bd960e01b5f5260045ffd5b916111f3600191858461120e565b9201611156565b5061a5bf4614611149565b5060019061113d565b91908082101561136e57611229610d84610d76848487610c4a565b9060ff8216608081101561124457505050610cea91506109de565b91929160b881101561126c575050610cea9250610dd5611266610ddb926109de565b92610d26565b90929060c08110156112e75750610dd561128891949394610d13565b915f935f915b8483106112ae57505050610cea92916112a96112a9926109de565b6109ff565b9091946112bd60019160081b90565b6112dd610dd5610d84610d766112d68b6112a98b6109de565b8888610c4a565b179501919061128e565b90929060f8111561130d5750610cea9250610dd5611307610ddb926109de565b92610d00565b9291610dd561131b91610ced565b915f935f915b84831061133c57505050610cea92916112a96112a9926109de565b90919461134b60019160081b90565b611364610dd5610d84610d766112d68b6112a98b6109de565b1795019190611321565b6318d76ae160e11b5f5260045ffd5b919390929190600360fe1b6001600160f81b031961139e610d768689610c3c565b161061151b57601f60fb1b6001600160f81b03196113bf610d768689610c3c565b1610611511576113e36113de610dd5610dcb610d84610d76888b610c3c565b6109f1565b9492905b945f5b8282106113fc57505050505050505f90565b61141a6114138361140e36878a610bf2565b6117f5565b90936109ff565b9682516020840120036114af57600360fe1b61144961117561143b85611054565b516001600160f81b03191690565b106114af578590846001601f60fb1b61146761117561143b88611054565b10156114f3575b611478818661197c565b601181036114ba575061148a94611b07565b9491156114af5784156114a35793915b919590936113ea565b50505050505050600190565b505050505050505f90565b9093506002141590506114e7578487926114d3946119c1565b9491156114af5784156114a357939161149a565b50505050505050505f90565b5061150c6113de610dd5610dcb610d8461143b89611054565b61146e565b60019492906113e7565b63ebb47d1d60e01b5f5260045ffd5b91949392948060c060ff611545610d84610d7685888a610c4a565b1610610e845760f860ff611560610d84610d7685888a610c4a565b16106115e2575080610ddb610dd5610dd0610dcb610d84610d7661158597898b610c4a565b611590818385611c1c565b969060148151036115d357601401516001600160a01b039182169116036115c457610cea956115be916109ff565b91611c88565b63a087f96f60e01b5f5260045ffd5b63e6c4247b60e01b5f5260045ffd5b6115ec91506109de565b611585565b6005545f5481018091116109ec5760015481018091116109ec5790565b6040805190919061161f8382610980565b6001815291601f1901366020840137565b604080519091906116418382610980565b6014815291601f1901366020840137565b9061165c82610bd6565b6116696040519182610980565b828152809261167a601f1991610bd6565b0190602036910137565b8183101561136e5761169d610d84610d76858585610c4a565b9260ff841660808110156116d757505050506116b761160e565b9060f81b6001600160f81b0319165f1a6116d082611054565b5390600190565b60b881969592939496105f146117455750610dd56116f491610d26565b916116fe83611652565b945f5b8481106117155750505050610cea906109f1565b80611732610d7661172b6001946112a9896109de565b8587610c4a565b5f1a61173e828a611061565b5301611701565b60c011156117e657610dd561175991610d13565b905f925f5b8381106117b7575061176f84611652565b955f5b85811061178a5750505050906112a9610cea926109f1565b806117a4610d7661172b6001946112a98a6112a98b6109de565b5f1a6117b0828b611061565b5301611772565b9360019060081b6117de610dd5610d84610d766117d78a6112a98a6109de565b8c88610c4a565b17940161175e565b636b2e9c5f60e11b5f5260045ffd5b805182101561136e5761180e610d8461143b8484611061565b9160ff83166080811015611827575050506116b761160e565b919392909160b88110156118915750610dd561184291610d26565b9061184c82611652565b935f5b83811061186257505050610cea906109f1565b8061187e61143b6118786001946112a9886109de565b85611061565b5f1a61188a8289611061565b530161184f565b60c0111561192f57610dd56118a591610d13565b5f915f5b82811061190157506118ba83611652565b945f5b8481106118d457505050906112a9610cea926109f1565b806118ee61143b6118786001946112a9896112a98a6109de565b5f1a6118fa828a611061565b53016118bd565b9260019060081b611927610dd5610d8461143b611921896112a9896109de565b8b611061565b1793016118a9565b509161193b8382611ddf565b9261194584611652565b915f5b858110611956575050509190565b8061196961143b611878600194876109ff565b5f1a6119758287611061565b5301611948565b5f92915b81518110156119a7576119938183611ddf565b81018091116109ec57600190930192611980565b5050565b908160011b91808304600214901517156109ec57565b839492916119cf81836117f5565b93906119ee60206119e5610d8461143b85611054565b16151591611f0c565b97889115611a905750611a029051876109ff565b611a0c82516119ab565b14611a21575b505050505050505f905f905f90565b86866001928251611a7e575b505050611a3b575b80611a12565b611a4e92611a48916109ff565b906117f5565b5060208151910120906020815191012014611a6c5780808080611a35565b611a779151906109ff565b6001915f90565b611a889350612075565b86865f611a2d565b611aa1939495965061073a92612075565b611afa57611ab292611a48916109ff565b50908151602081145f14611ada57506020611ad2920151925b51906109ff565b916001929190565b8015611aee576020611ad293012092611acb565b505050505f905f905f90565b50505050505f905f905f90565b91909293611b1582516119ab565b851015611bbf5750610d8461143b611b3792611b318760011c90565b90611061565b60018416611bb65760041c600f16915b905f925b60ff81168410611b965750611b6092506117f5565b5080518015611b8b57611ad29160208203611b8157602091500151916109de565b60200120916109de565b5050505f905f905f90565b90916001611baa82610ddb60ff9487611ddf565b94019392919050611b4b565b600f1691611b47565b9290509392935f915b60108310611c0257611bda92506117f5565b50602081519101209060208151910120145f14611bf957600191905f90565b5f915081908190565b90611c1381610ddb60019385611ddf565b92019190611bc8565b91909182821015610e8457609460ff611c3c610d84610d76868887610c4a565b16036115d357611c4a611630565b925f5b60148110611c5f575050505090601590565b80611c75610d7661172b6001946112a9896109de565b5f1a611c818288611061565b5301611c4d565b91928360c060ff611ca0610d84610d7689888a610c4a565b1610610e845760f860ff611cbb610d84610d7689888a610c4a565b1610611dd05780610ddb610dd5610dd0610dcb610d84610d76611cdf978a8c610c4a565b7fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef611d0b828587612133565b03611dc157610753610753611d2e611d27611d3594878961120e565b868861120e565b8587612133565b6001600160a01b03918216911603611db257611d55611d5b93828461120e565b9161216f565b50916020835111610e84575f90815b8451831015611d955760019060081b611d8c610dd5610d8461143b878a611061565b17920191611d6a565b9150925003611da357600190565b6355e97b0d60e01b5f5260045ffd5b634cd4b7b160e01b5f5260045ffd5b6324da545d60e11b5f5260045ffd5b50611dda846109de565b611cdf565b90815181101561136e57611df9610d8461143b8385611061565b9160ff83166080811015611e105750505050600190565b60b8811015611e2b57505050610dd5610dd0610cea92610d26565b60c0811015611e97575091610dd5611e4291610d13565b905f925f915b838310611e5f57505050906112a9610cea926109f1565b909193611e6e60019160081b90565b611e8d610dd5610d8461143b611e878a6112a9896109de565b88611061565b1794019190611e48565b60f81115611eb0575050610dd5610dd0610cea92610d00565b91610dd5611ebd91610ced565b905f925f915b838310611eda57505050906112a9610cea926109f1565b909193611ee960019160081b90565b611f02610dd5610d8461143b611e878a6112a9896109de565b1794019190611ec3565b90815115610b1d57611f23610d8461143b84611054565b6010811615611ff257611f46611f41611f3c85516119ab565b610bbb565b611652565b9060f81b600f60f81b165f1a611f5b82611054565b5360015b8351811015611fed5780611f9a611f8a611f81610d8461143b6001968a611061565b60041c600f1690565b60f81b6001600160f81b03191690565b611fb3611fa9611f3c846119ab565b915f1a9185611061565b53611fda600f611fc9610d8461143b858a611061565b1660f81b6001600160f81b03191690565b611fe6611fa9836119ab565b5301611f5f565b509150565b50612008611f4161200384516119ab565b610bac565b60015b8351811015611fed578061202d611f8a611f81610d8461143b6001968a611061565b612041611fa961203c84610bbb565b6119ab565b53612057600f611fc9610d8461143b858a611061565b61206e611fa961206961203c85610bbb565b6109de565b530161200b565b9190916120838251846109ff565b61208d82516119ab565b1061212c575f5b8251811015612123576120b06120aa82866109ff565b60011690565b612105576120d9611f81610d8461143b6120d36120cd868a6109ff565b60011c90565b86611061565b60ff6120ee610dd5610d8461143b8689611061565b9116036120fd57600101612094565b505050505f90565b600f61211d610d8461143b6120d36120cd868a6109ff565b166120d9565b50505050600190565b5050505f90565b9190600560fd1b906001600160f81b03199061215190849086610c4a565b35160361216057016001013590565b63f0ff325b60e01b5f5260045ffd5b81831015610e8457612188610d84610d76858585610c4a565b9260ff841660808110156121a257505050506116b761160e565b60b881969592939496105f146122095750610dd56121bf91610d26565b916121c983611652565b945f5b8481106121e05750505050610cea906109f1565b806121f6610d7661172b6001946112a9896109de565b5f1a612202828a611061565b53016121cc565b60c011156122a357610dd561221d91610d13565b905f925f5b83811061227b575061223384611652565b955f5b85811061224e5750505050906112a9610cea926109f1565b80612268610d7661172b6001946112a98a6112a98b6109de565b5f1a612274828b611061565b5301612236565b9360019060081b61229b610dd5610d84610d766117d78a6112a98a6109de565b179401612222565b6336459a5b60e21b5f5260045ffdfea2646970667358221220f111dda4228930ff7fcf5360c1e823b8ddcd3e1621a6c54215af8789b55a438f64736f6c634300081e0033","sourceMap":"426:4780:21:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;;;;;-1:-1:-1;;426:4780:21;;;;2363:15:20;-1:-1:-1;;;;;426:4780:21;2349:10:20;:29;2345:56;;2411:27;426:4780:21;;-1:-1:-1;;426:4780:21;;;;2345:56:20;2387:14;;;426:4780:21;2387:14:20;426:4780:21;;2387:14:20;426:4780:21;;;;;;;;;;-1:-1:-1;;426:4780:21;;;;1263:29:20;426:4780:21;;;-1:-1:-1;;;;;426:4780:21;;;;;;;;;;;;;;-1:-1:-1;;426:4780:21;;;;;;;963:39:20;426:4780:21;;;;;;;;;-1:-1:-1;;426:4780:21;;;;;;1407:31:20;426:4780:21;;;;;;;;;;;;;;;;-1:-1:-1;;426:4780:21;;;;;;;;;;;;;;;;;;;-1:-1:-1;;426:4780:21;;;;4808:396;;:::i;:::-;;;:::i;:::-;4935:30;;:::i;:::-;4906:59;426:4780;;5686:14:20;426:4780:21;;5686:14:20;426:4780:21;5695:5:20;426:4780:21;;5695:5:20;426:4780:21;;5636:138:20;4906:59:21;5012:23;;5008:57;;426:4780;;-1:-1:-1;;;5081:62:21;;5112:10;426:4780;5081:62;;426:4780;;;;;;;;5081:62;426:4780;;;-1:-1:-1;;;;;;5088:13:21;426:4780;5081:62;;;;;;;426:4780;5081:62;;;426:4780;5080:63;;5076:122;;426:4780;5076:122;5166:21;;;426:4780;5166:21;426:4780;;5166:21;5081:62;;;;;;;;;;;;;;;:::i;:::-;;;;;:::i;:::-;;;;;;;;;;;:::i;5008:57::-;5044:21;;;426:4780;5044:21;426:4780;;5044:21;426:4780;;;;;;-1:-1:-1;;426:4780:21;;;;;;;1085:3:20;426:4780:21;;;;;;;;;-1:-1:-1;;426:4780:21;;;;;;735:38;-1:-1:-1;;;;;426:4780:21;;;;;;;;;;;;-1:-1:-1;;426:4780:21;;;;;;;;;;;;;;;;;;;-1:-1:-1;;426:4780:21;;;;;1336:25:20;426:4780:21;;;;;;;;;;;;;-1:-1:-1;;426:4780:21;;;;2113:15:20;-1:-1:-1;;;;;426:4780:21;2099:10:20;:29;2095:56;;2161:26;426:4780:21;;-1:-1:-1;;426:4780:21;2183:4:20;426:4780:21;;;;;;;;;;-1:-1:-1;;426:4780:21;;;;;;873:42:20;-1:-1:-1;;;;;426:4780:21;;;;;;;;;;;;-1:-1:-1;;426:4780:21;;;;;727:35:20;426:4780:21;;;;;;;;;;;;;-1:-1:-1;;426:4780:21;;;;;;2783:388;;:::i;:::-;2972:11;;;:::i;:::-;426:4780;;-1:-1:-1;;;3000:74:21;;3035:10;426:4780;3000:74;;426:4780;3055:4;426:4780;;;;;;;;;;;;;;-1:-1:-1;;;;;;3007:13:21;426:4780;3000:74;;;;;;;-1:-1:-1;3000:74:21;;;426:4780;2999:75;;2995:134;;3152:11;;;:::i;:::-;426:4780;3000:74;;;;426:4780;3000:74;426:4780;3000:74;;;;;;;:::i;:::-;;;;426:4780;;;;;;-1:-1:-1;;426:4780:21;;;;;;;;1901:15;-1:-1:-1;;;;;426:4780:21;1887:10;:29;1883:56;;1953:6;426:4780;;;;;1949:34;;1997:25;;1993:56;;2063:26;;2059:58;;2180:43;426:4780;2233:44;426:4780;-1:-1:-1;426:4780:21;2180:43;426:4780;;2180:43;2233:44;426:4780;;2233:44;2292:106;426:4780;2354:43;2180;426:4780;2233:44;426:4780;2354:43;;:::i;:::-;426:4780;;-1:-1:-1;;;2292:106:21;;1887:10;426:4780;2292:106;;426:4780;2347:4;426:4780;;;;;;;;;;;;;;;;;;;;;2292:106;;426:4780;-1:-1:-1;2299:13:21;-1:-1:-1;;;;;426:4780:21;2292:106;;;;;;;-1:-1:-1;2292:106:21;;;426:4780;2291:107;;2287:174;;2470:13;426:4780;;;1953:6;426:4780;;;1953:6;426:4780;;2292:106;;;;426:4780;2292:106;426:4780;2292:106;;;;;;;:::i;:::-;;;;2059:58;2098:19;;;-1:-1:-1;2098:19:21;426:4780;-1:-1:-1;2098:19:21;1993:56;2031:18;;;-1:-1:-1;2031:18:21;426:4780;-1:-1:-1;2031:18:21;1949:34;1968:15;;;-1:-1:-1;1968:15:21;426:4780;-1:-1:-1;1968:15:21;426:4780;;;;;;-1:-1:-1;;426:4780:21;;;;;;;:::i;:::-;;;;;;;;;;;;;;;-1:-1:-1;;426:4780:21;;;;;768:35:20;426:4780:21;;;;;;;;;;;;;-1:-1:-1;;426:4780:21;;;;;;;;;;;;;;;;;;;;;;;;;;3397:17;;;;:::i;:::-;2843:6:20;426:4780:21;2842:7:20;;426:4780:21;;;;2842:7:20;;426:4780:21;;2842:7:20;;426:4780:21;2842:7:20;2838:31;;2897:14;426:4780:21;2883:28:20;;-1:-1:-1;;;;;426:4780:21;;-1:-1:-1;;;;;426:4780:21;;;2883:28:20;:10;:28;;;:44;;;426:4780:21;2879:77:20;;2990:12;2970:32;;2966:66;;1085:3;3046:32;2990:12;;3046:32;:::i;:::-;:53;3042:85;;3164:28;;3206:29;;3202:64;;426:4780:21;;;;;:::i;:::-;;;;;;3280:22:20;:41;3276:75;;3365:49;;;:::i;:::-;:70;3361:104;;3530:56:21;3568:17;;;;:::i;:::-;3530:56;;:::i;:::-;3632:16;3600:100;3601:99;426:4780;3632:16;;;;;;;:::i;:::-;3650;;;;;;;:::i;:::-;3668:17;;;;;;;:::i;:::-;3601:99;;;;:::i;3600:100::-;3596:159;;3887:14;3869:16;3808:157;3869:16;3809:156;3869:16;;:::i;:::-;3937:14;;3918:17;;3903:13;;3887:14;;426:4780;;3887:14;3809:156;:::i;3808:157::-;3804:217;;;;:::i;:::-;3988:22;;;-1:-1:-1;3988:22:21;426:4780;-1:-1:-1;3988:22:21;3596:159;3723:21;;;-1:-1:-1;3723:21:21;426:4780;-1:-1:-1;3723:21:21;3361:104:20;3444:21;;;-1:-1:-1;3444:21:20;426:4780:21;-1:-1:-1;3444:21:20;3276:75;3330:21;;;-1:-1:-1;3330:21:20;426:4780:21;-1:-1:-1;3330:21:20;3202:64;3244:22;;;-1:-1:-1;3244:22:20;426:4780:21;-1:-1:-1;3244:22:20;3042:85;3108:19;;;-1:-1:-1;3108:19:20;426:4780:21;-1:-1:-1;3108:19:20;2966:66;3011:21;;;-1:-1:-1;3011:21:20;426:4780:21;-1:-1:-1;3011:21:20;2879:77;2936:20;;;-1:-1:-1;2936:20:20;426:4780:21;-1:-1:-1;2936:20:20;2883:44;2916:11;2915:12;2916:11;;:::i;2915:12::-;2883:44;;2838:31;2858:11;;;-1:-1:-1;2858:11:20;426:4780:21;-1:-1:-1;2858:11:20;426:4780:21;;;;;;-1:-1:-1;;426:4780:21;;;;;;1444:18:20;426:4780:21;;;;;;;;;;;;;;;;;;-1:-1:-1;;426:4780:21;;;;;1367:34:20;426:4780:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;:::i;:::-;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;1846:1:25;426:4780:21;;;;;;;:::o;:::-;;:::i;:::-;1984:1:23;426:4780:21;;;1984:1:23;426:4780:21;;;:::o;:::-;;;;;;;;;;:::o;2519:133:20:-;2584:17;426:4780:21;2584:21:20;;;:61;;;;2577:68;2519:133;:::o;2584:61::-;2609:15;;;:36;;2519:133;:::o;426:4780:21:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;5203:157:20:-;426:4780:21;5261:6:20;426:4780:21;;;;5260:7:20;5256:31;;5315:15;-1:-1:-1;;;;;426:4780:21;5301:10:20;:29;5297:56;;5203:157::o;3533:184::-;3585:11;;:::i;:::-;3581:36;;-1:-1:-1;;;;;426:4780:21;;3628:27:20;426:4780:21;;3628:27:20;426:4780:21;3653:1:20;3665:14;426:4780:21;3653:1:20;3689:21;426:4780:21;3533:184:20:o;3581:36::-;3605:12;;;;;;;;5438:139;5527:20;426:4780:21;5550:20:20;426:4780:21;;;;;;;;5438:139:20;:::o;3797:259::-;3850:17;426:4780:21;3850:21:20;;;:60;;;;3797:259;3846:204;;;3797:259::o;3846:204::-;3949:10;426:4780:21;-1:-1:-1;426:4780:21;;;;;;;;;-1:-1:-1;426:4780:21;3973:33:20;426:4780:21;;;;;;;;;3973:33:20;426:4780:21;3973:33:20;;:::i;:::-;3797:259::o;3850:60::-;3875:15;;;:35;3850:60;;;4115:318;4200:6;426:4780:21;;;;;;4199:7:20;4195:31;;426:4780:21;;4236:55:20;;4305:11;;:::i;:::-;4301:47;;-1:-1:-1;426:4780:21;;;-1:-1:-1;4358:68:20;;4115:318::o;4358:68::-;4408:18;;;-1:-1:-1;4408:18:20;;-1:-1:-1;4408:18:20;4301:47;4325:23;;;-1:-1:-1;4325:23:20;;-1:-1:-1;4325:23:20;4236:55;4268:23;;;-1:-1:-1;4268:23:20;;-1:-1:-1;4268:23:20;4479:187;4558:10;-1:-1:-1;;;;;426:4780:21;;4541:27:20;426:4780:21;;;4541:27:20;426:4780:21;4616:9:20;4598:15;426:4780:21;4598:15:20;;426:4780:21;;;4578:47:20;426:4780:21;4635:24:20;426:4780:21;4479:187:20:o;426:4780:21:-;-1:-1:-1;;426:4780:21;;;;;;;;:::o;:::-;-1:-1:-1;;426:4780:21;;;;;;;;:::o;:::-;;;;;;;;;;:::o;:::-;;;;;;;;-1:-1:-1;;426:4780:21;;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;-1:-1:-1;426:4780:21;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;:::o;:::-;;:::i;:::-;;;;;;;;;:::o;3172:769:19:-;;3288:33;;;;:::i;:::-;3492:13;3504:1;3507:5;3511:1;3507:5;;;;-1:-1:-1;;;;426:4780:21;-1:-1:-1;;;;;;426:4780:21;3693:19:19;;426:4780:21;;3693:19:19;;:::i;:::-;;426:4780:21;3693:27:19;3689:60;;426:4780:21;;;;;;;3811:94:19;426:4780:21;3811:94:19;;;3172:769::o;3689:60::-;3729:20;;;3504:1;3729:20;;3504:1;3729:20;3492:13;3538:28;;426:4780:21;3538:28:19;;;;:::i;:::-;426:4780:21;;3492:13:19;;720:484:23;426:4780:21;;720:484:23;;;;1148:49;720:484;;426:4780:21;;;:::i;:::-;;;;;:::i;:::-;1148:49:23;;:::i;:::-;720:484;:::o;426:4780:21:-;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;:::o;1168:1511:25:-;;;;;;;1416:1;1476:21;;;;;:52;;;1168:1511;1472:123;;1168:1511;1641:25;1647:18;;;1669:4;1647:18;426:4780:21;1647:18:25;;:::i;:::-;;-1:-1:-1;;;;;;426:4780:21;;;1647:18:25;426:4780:21;;;;1641:25:25;426:4780:21;1641:32:25;1637:57;;1714:18;;1737:4;426:4780:21;1708:25:25;1714:18;;;;;;;:::i;1708:25::-;426:4780:21;1708:33:25;1737:4;;1767:38;1772:32;:25;1778:18;;;1757:48;1778:18;1757:48;1778:18;;:::i;1772:25::-;:32;:::i;:::-;1767:38;:::i;:::-;426:4780:21;;;;1757:48:25;;;:::i;:::-;1937:13;;1416:1;1952:5;1956:1;1952:5;;;;2129:18;2123:25;2129:18;;;1669:4;2129:18;2123:32;2129:18;;:::i;2123:32::-;;2119:57;;2196:18;;1737:4;2190:33;:25;2196:18;;;;;;;:::i;2190:33::-;;1737:4;;2249:38;2254:32;:25;2260:18;;;2239:48;2260:18;2239:48;2260:18;;:::i;2239:48::-;2186:154;;1416:1;2384:155;2404:12;;;;;;2591:81;;;;;;:::i;2389:13::-;2442:27;;;426:4780:21;2442:27:25;;;;:::i;:::-;426:4780:21;;2389:13:25;;;2186:154;2318:11;;;;;:::i;:::-;2186:154;;;2119:57;1682:12;;;1416:1;2164:12;;1416:1;2164:12;1937:13;1983:27;426:4780:21;1983:27:25;;;;:::i;:::-;426:4780:21;;1937:13:25;;;;;1704:154;1836:11;;;;;:::i;:::-;1704:154;;1472:123;-1:-1:-1;1554:1:25;;-1:-1:-1;1544:11:25;;-1:-1:-1;1544:11:25;1472:123;;1476:52;1507:13;1524:4;426:4780:21;1501:20:25;1507:13;;;;;:::i;1501:20::-;426:4780:21;1501:27:25;1476:52;;4053:490:21;4108:18;;:::i;:::-;4155:14;426:4780;-1:-1:-1;;;;;426:4780:21;4136:33;-1:-1:-1;;;;;426:4780:21;;4765:27:20;426:4780:21;;4765:27:20;426:4780:21;4790:1:20;4802:14;426:4780:21;4790:1:20;4826:21;426:4780:21;;;4857:14:20;426:4780:21;;4857:14:20;426:4780:21;4790:1:20;426:4780:21;;4790:1:20;426:4780:21;;4717:228:20;4136:33:21;4236:13;4253:8;4236:25;4253:8;;426:4780;;-1:-1:-1;;;4341:44:21;;-1:-1:-1;;;;;426:4780:21;;;4341:44;;;426:4780;;;;;;;;4341:44;426:4780;;;;;4341:44;426:4780;-1:-1:-1;4348:13:21;-1:-1:-1;;;;;426:4780:21;4341:44;;;;;;;-1:-1:-1;4341:44:21;;;4232:253;4331:54;4232:253;4498:8;4494:42;;4053:490::o;4341:44::-;;;;;;;;;;;;;;:::i;:::-;;;;4232:253;426:4780;;-1:-1:-1;;;4426:48:21;;-1:-1:-1;;;;;426:4780:21;;;4426:48;;;426:4780;;;;;;;;4426:48;426:4780;;;;;4426:48;426:4780;-1:-1:-1;4433:13:21;-1:-1:-1;;;;;426:4780:21;4426:48;;;;;;;-1:-1:-1;4426:48:21;;;4232:253;4416:58;4232:253;;4426:48;;;;;;;;;;;;;;:::i;:::-;;;;426:4780;;;;;;;;;:::o;:::-;;;;;;;;;;;;;:::o;2102:899:19:-;;;2217:33;;;;:::i;:::-;2452:13;2464:1;2467:5;2471:1;2467:5;;;;2665:42;;;;;:::i;:::-;-1:-1:-1;2754:23:19;2464:1;;2792:13;426:4780:21;;2807:19:19;;;;;426:4780:21;2884:11:19;;;;;:::i;:::-;426:4780:21;;;2857:39:19;2471:1;426:4780:21;2857:39:19;426:4780:21;;2792:13:19;;;2807:19;;-1:-1:-1;;2102:899:19:o;2452:13::-;2498:28;;426:4780:21;2498:28:19;;;;:::i;:::-;426:4780:21;;2452:13:19;;804:1134;920:1;-1:-1:-1;;;;;;;;;974:19:19;;;;;:::i;:::-;426:4780:21;974:26:19;970:55;;-1:-1:-1;;;;;;;;;1039:19:19;;;;;:::i;:::-;426:4780:21;1039:27:19;426:4780:21;;1103:19:19;1082:49;1092:39;1097:33;:26;1103:19;;1082:49;1103:19;;;;:::i;1082:49::-;1035:149;;1287:5;1270:13;:22;:48;;;;1035:149;1266:642;;1035:149;1918:13;;;804:1134;:::o;1266:642::-;920:1;1446:5;1450:1;1446:5;;;;-1:-1:-1;;;;1668:26:19;:19;;;;;;:::i;:::-;-1:-1:-1;;;;;;426:4780:21;;;1668:26:19;;1664:55;;-1:-1:-1;;;1737:27:19;:19;;;;;;:::i;:27::-;;426:4780:21;;1794:39:19;1799:33;:26;1805:19;;;1784:49;1805:19;1784:49;1805:19;;:::i;1784:49::-;1266:642;;;;1733:165;1872:11;;;;;:::i;:::-;1733:165;;1664:55;1009:16;;;920:1;1703:16;;920:1;1703:16;1431:13;1481:28;;426:4780:21;1481:28:19;;;;:::i;:::-;426:4780:21;;1431:13:19;;1270:48;:13;1313:5;1270:13;1296:22;1270:48;;1035:149;1162:11;1554:1:25;1035:149:19;;;541:1316:24;;;642:21;;;;638:56;;720:19;726:12;;;;;;:::i;720:19::-;426:4780:21;;;;763:4:24;754:13;;763:4;;;817:10;;;;;;;:::i;750:1101::-;848:13;;;857:4;848:13;;857:4;;;912:10;;:28;:10;;926:13;912:10;:28;:10;;:::i;:::-;926:13;;:::i;844:1007::-;961:13;;;970:4;961:13;;970:4;;;1039:13;;1017:35;1039:13;;;;;:::i;1017:35::-;1066:18;426:4780:21;1103:13:24;426:4780:21;1098:194:24;1118:15;;;;;;1312:10;;;:33;:10;;;:24;:10;;:::i;:::-;:24;:::i;1103:13::-;1164:11;;;;1199:1;1164:11;426:4780:21;;;;1164:11:24;1163:43;1179:27;1185:20;;1190:14;:10;;;;:::i;:14::-;1185:20;;;:::i;1163:43::-;;426:4780:21;;1103:13:24;;;;957:894;1366:13;;;1375:4;-1:-1:-1;1375:4:24;;;1428:10;:28;:10;;1442:13;1428:10;:28;:10;;:::i;:::-;1442:13;;:::i;1362:489::-;1534:13;;;1512:35;1534:13;;:::i;1512:35::-;1561:18;426:4780:21;1598:13:24;426:4780:21;1593:194:24;1613:15;;;;;;1807:10;;;:33;:10;;;:24;:10;;:::i;1598:13::-;1659:11;;;;1694:1;1659:11;426:4780:21;;;;1659:11:24;1658:43;1674:27;1680:20;;1685:14;:10;;;;:::i;1658:43::-;;426:4780:21;;1598:13:24;;;;638:56;672:22;;;426:4780:21;672:22:24;;426:4780:21;672:22:24;1567:2467:23;;;;;;;-1:-1:-1;;;;;;;;;1809:13:23;;1567:2467;;1809:13;:::i;:::-;426:4780:21;1809:20:23;1805:50;;-1:-1:-1;;;;;;;;;1870:13:23;;;;;:::i;:::-;426:4780:21;1870:21:23;426:4780:21;;1984:15:23;1907:49;1929:27;:20;1935:13;;;;;:::i;1907:49::-;1984:15;:::i;:::-;1866:190;;;;2102:33;426:4780:21;2184:31:23;;;;;;4015:12;;;;;;;426:4780:21;1567:2467:23;:::o;2177:1828::-;2368:25;2321:33;426:4780:21;;;;;;:::i;:::-;2321:33:23;:::i;:::-;2368:25;;;:::i;:::-;426:4780:21;;;;;;2465:15:23;:30;2461:81;;-1:-1:-1;;;2641:15:23;:7;;;;:::i;:::-;426:4780:21;-1:-1:-1;;;;;;426:4780:21;;;2641:15:23;;426:4780:21;;2676:14:23;;;2689:1;-1:-1:-1;;;2712:15:23;:7;;;;:::i;:15::-;;;2708:97;;2637:1358;2839:32;;;;:::i;:::-;2903:2;2894:11;;2903:2;;3044:58;;;;:::i;:::-;3129:8;;;3125:26;;3177:21;;3173:38;;3280:21;2890:1040;;2177:1828;;;;;;3173:38;3200:11;;;;;;;2689:1;3200:11;:::o;3125:26::-;3139:12;;;;;;;426:4780:21;3139:12:23;:::o;2890:1040::-;3330:10;;-1:-1:-1;3339:1:23;3330:10;3339:1;;-1:-1:-1;3339:1:23;;3490:67;;;;;;:::i;:::-;3584:8;;;3580:75;;3680:21;;3676:87;;3831:21;3326:604;2890:1040;;3326:604;3899:12;;;;;;;;426:4780:21;3899:12:23;:::o;2708:97::-;2771:7;2751:35;;2765:21;:14;2771:7;;;;:::i;2751:35::-;2708:97;;1866:190;2044:1;1866:190;;;;;1805:50;1838:17;;;426:4780:21;1838:17:23;;426:4780:21;1838:17:23;3040:1120:25;;;;;;3265:26;3389:4;426:4780:21;3361:25:25;3367:18;;;;;;:::i;3361:25::-;426:4780:21;3361:32:25;3357:57;;3457:4;426:4780:21;3428:25:25;3434:18;;;;;;:::i;3428:25::-;426:4780:21;3428:33:25;3457:4;;3498:18;;3477:48;3487:38;3492:32;:25;3498:18;;3477:48;3498:18;;;;:::i;3477:48::-;3696:39;;;;;:::i;:::-;426:4780:21;;3769:2:25;426:4780:21;;3749:22:25;3745:51;;3769:2;3867:69;;-1:-1:-1;;;;;426:4780:21;;;;;3949:24:25;3945:57;;4084:69;4012:17;;;;:::i;:::-;4084:69;;:::i;3945:57::-;3982:20;;;-1:-1:-1;3982:20:25;;-1:-1:-1;3982:20:25;3745:51;3780:16;;;;;;;;3424:154;3556:11;;;;:::i;:::-;3424:154;;5001:139:20;5078:10;426:4780:21;-1:-1:-1;426:4780:21;;;;;;;;5113:20:20;426:4780:21;;;;;;;;5001:139:20;:::o;426:4780:21:-;;;;;;;;;;;:::i;:::-;4560:1:19;426:4780:21;;;-1:-1:-1;;426:4780:21;;;;;;:::o;:::-;;;;;;;;;;;:::i;:::-;4745:2:25;426:4780:21;;;-1:-1:-1;;426:4780:21;;;;;;:::o;:::-;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;;;;:::i;:::-;;;;;;;;:::o;4204:1558:19:-;4373:21;;;;4369:56;;4451:19;4457:12;;;;;;:::i;4451:19::-;426:4780:21;;;;4494:4:19;4485:13;;4494:4;;;4550:12;;;;;;:::i;:::-;426:4780:21;;;-1:-1:-1;;;;;;426:4780:21;;4576:26:19;;426:4780:21;4576:26:19;:::i;:::-;;4616:18;4560:1;4616:18;:::o;4481:1275::-;4664:4;4655:13;;;;;;;;4651:1105;4664:4;;;4733:13;;4712:34;4733:13;;:::i;4712:34::-;4769:21;;;;:::i;:::-;4809:13;426:4780:21;4824:14:19;;;;;;5006;;;;;;;:::i;4809:13::-;4876:10;4871:20;;4876:14;4885:1;4876:10;;;;:::i;:14::-;4871:20;;;:::i;:::-;426:4780:21;4859:32:19;;;;;:::i;:::-;;426:4780:21;4809:13:19;;4651:1105;5051:4;-1:-1:-1;5051:4:19;;;5120:13;5098:35;5120:13;;:::i;5098:35::-;5147:22;426:4780:21;5188:13:19;426:4780:21;5203:15:19;;;;;;5407:21;;;;:::i;:::-;5447:13;426:4780:21;5462:14:19;;;;;;5658:15;;;;;;:28;:15;;:::i;5447:13::-;5514:10;5509:34;;5514:28;5292:1;5514:10;:24;:10;;;;:::i;5509:34::-;426:4780:21;5497:46:19;;;;;:::i;:::-;;426:4780:21;5447:13:19;;5188;5253:15;5292:1;;426:4780:21;;5252:47:19;5272:27;5278:20;;5283:14;:10;;;;:::i;:14::-;5278:20;;;:::i;5252:47::-;;426:4780:21;;5188:13:19;;5038:718;5725:20;;;426:4780:21;5725:20:19;;426:4780:21;5725:20:19;2143:1860:24;426:4780:21;;2257:21:24;;;2253:56;;2335:19;2341:12;;;;;:::i;2335:19::-;426:4780:21;;;;2378:4:24;2369:13;;2378:4;;;2447:12;;;;;:::i;2365:1632::-;2552:13;;;;;2561:4;2552:13;;2561:4;;;2626:13;;2609:30;2626:13;;:::i;2609:30::-;2675:17;;;;:::i;:::-;2711:13;426:4780:21;2726:10:24;;;;;;2904;;;;;;:::i;2711:13::-;2774:10;2769:20;;2774:14;2783:1;2774:10;;;;:::i;:14::-;2769:20;;:::i;:::-;426:4780:21;2757:32:24;;;;;:::i;:::-;;426:4780:21;2711:13:24;;2548:1449;2945:4;-1:-1:-1;2945:4:24;;;3014:13;2992:35;3014:13;;:::i;2992:35::-;426:4780:21;3078:13:24;426:4780:21;3093:15:24;;;;;;3302:17;;;;:::i;:::-;3338:13;426:4780:21;3353:10:24;;;;;;3545:15;;;;;:24;:15;;:::i;3338:13::-;3401:10;3396:34;;3401:28;3174:1;3401:10;:24;:10;;;;:::i;3396:34::-;426:4780:21;3384:46:24;;;;;:::i;:::-;;426:4780:21;3338:13:24;;3078;3139:11;3174:1;;426:4780:21;;3138:43:24;3154:27;3160:20;;3165:14;:10;;;;:::i;:14::-;3160:20;;:::i;3138:43::-;;426:4780:21;;3078:13:24;;2932:1065;3676:27;;;;;;:::i;:::-;3739:22;;;;:::i;:::-;3780:13;426:4780:21;3795:15:24;;;;;;3958:28;;;;;:::o;3780:13::-;3848:10;3843:16;;3848:10;426:4780:21;3848:10:24;;;:::i;3843:16::-;426:4780:21;3831:28:24;;;;;:::i;:::-;;426:4780:21;3780:13:24;;4233:351:23;4392:1;;4233:351;4403:153;426:4780:21;;4410:20:23;;;;;4456:26;;;;:::i;:::-;426:4780:21;;;;;;;;4446:36:23;426:4780:21;;4403:153:23;;;4410:20;;;4233:351::o;426:4780:21:-;;;;;;;;;7928:1:23;426:4780:21;;;;;;;:::o;7310:1816:23:-;;;;;7616:26;;;;:::i;:::-;7673:9;;7740:26;7686:4;7667:16;7673:9;;;;:::i;7667:16::-;:23;7666:30;;7740:26;;:::i;:::-;7777:1343;;;;;;426:4780:21;7885:26:23;426:4780:21;;7885:26:23;;:::i;:::-;7915:14;426:4780:21;;7915:14:23;:::i;:::-;7885:44;7881:546;;7777:1343;8441:29;;;;;;;7680:1;8441:29;7680:1;8441:29;7680:1;8441:29;:::o;7881:546::-;7949:22;;7967:4;426:4780:21;;;7989:114:23;;7881:546;8121:292;;;;;7881:546;;;;8121:292;8187:38;8202:22;;;;:::i;:::-;8187:38;;:::i;:::-;426:4780:21;7686:4:23;426:4780:21;;;;8251:20:23;426:4780:21;7686:4:23;426:4780:21;;;;8275:16:23;8251:40;8247:148;;8121:292;;;;;;8247:148;8333:26;426:4780:21;;8333:26:23;;:::i;:::-;7967:4;;7680:1;;8319:53::o;7989:114::-;8048:36;;;;:::i;:::-;7989:114;;;;;7777:1343;8535:37;8536:36;;;;;;;;:::i;8535:37::-;8531:105;;8676:38;8691:22;;;;:::i;8676:38::-;8728:12;;426:4780:21;;7686:4:23;8758:20;;8754:294;7686:4;;;8798:80;7686:4;9076:26;8798:80;;;8754:294;;426:4780:21;9076:26:23;;:::i;:::-;9062:47;9070:4;9062:47;;;:::o;8754:294::-;8902:18;;;;7686:4;9076:26;426:4780:21;;8947:18:23;8898:150;8754:294;;8898:150;9004:29;;;;7680:1;9004:29;7680:1;9004:29;7680:1;9004:29;:::o;8531:105::-;8592:29;;;;;7680:1;8592:29;7680:1;8592:29;7680:1;8592:29;:::o;5044:1795::-;;;;;5315:14;426:4780:21;;5315:14:23;:::i;:::-;5302:27;;;5298:630;;5998:13;5994:18;;5988:25;5998:13;;;426:4780:21;;;;5998:13:23;5994:18;;:::i;5988:25::-;426:4780:21;;;6027:13:23;;426:4780:21;;;;6023:122:23;;6244:13;-1:-1:-1;6239:165:23;6259:10;426:4780:21;;;6259:10:23;;;;6441:28;;;;;:::i;:::-;426:4780:21;;;6483:20:23;;6479:96;;6812:13;;6630:2;6611:21;;6630:2;;;6648:73;;;;6607:181;6812:13;:::i;6607:181::-;6630:2;426:4780:21;6758:19:23;6607:181;6812:13;:::i;6479:96::-;6519:29;;;-1:-1:-1;6519:29:23;-1:-1:-1;6519:29:23;-1:-1:-1;6519:29:23;:::o;6244:13::-;6302:32;;426:4780:21;6286:48:23;6302:32;;426:4780:21;6302:32:23;;;:::i;6286:48::-;426:4780:21;;;;6244:13:23;;-1:-1:-1;6244:13:23;;6023:122;6130:4;6121:13;6023:122;;;5298:630;5401:32;;;;;;-1:-1:-1;5447:179:23;5467:6;5471:2;5467:6;;;;5667:27;;;;:::i;:::-;426:4780:21;;;;;;5712:20:23;426:4780:21;;;;;;5736:16:23;5712:40;5708:210;5736:16;;;426:4780:21;5772:36:23;;-1:-1:-1;5772:36:23;:::o;5708:210::-;-1:-1:-1;;;;;;;5874:29:23:o;5452:13::-;5509:31;5494:46;5509:31;;426:4780:21;5509:31:23;;;:::i;5494:46::-;426:4780:21;;5452:13:23;;;;4375:655:25;;;;4542:21;;;;4538:46;;4654:4;426:4780:21;4610:19:25;4616:12;;;;;;:::i;4610:19::-;426:4780:21;4644:14:25;4654:4;;4735:13;;:::i;:::-;4767;4779:1;4782:6;4745:2;4782:6;;;;4940:19;;;;;4956:2;4940:19;:::o;4767:13::-;4826:10;4821:20;;4826:14;4835:1;4826:10;;;;:::i;4821:20::-;4779:1;4809:32;;;;;:::i;:::-;;426:4780:21;4767:13:25;;5347:1653;;;5547:29;5649:4;426:4780:21;5621:25:25;5627:18;;;;;;:::i;5621:25::-;426:4780:21;5621:32:25;5617:57;;5717:4;426:4780:21;5688:25:25;5694:18;;;;;;:::i;5688:25::-;426:4780:21;5688:33:25;5717:4;;5758:18;5737:48;5747:38;5752:32;:25;5758:18;;5737:48;5758:18;;;;:::i;5737:48::-;767:66;5914:33;;;;;:::i;:::-;5961:30;5957:64;;6305:27;6250:33;6193:27;6104;6297:36;6104:27;;;;:::i;:::-;6193;;;:::i;:::-;6250:33;;;:::i;6297:36::-;-1:-1:-1;;;;;426:4780:21;;;;;6297:49:25;6293:81;;6446:33;6545:36;6446:33;;;;:::i;:::-;6545:36;;:::i;:::-;426:4780:21;;6665:2:25;426:4780:21;;6646:21:25;6642:46;;-1:-1:-1;;;6734:13:25;426:4780:21;;6749:20:25;;;;;426:4780:21;;;;6798:38:25;6817:19;6823:12;;;;;:::i;6798:38::-;;426:4780:21;;6734:13:25;;;6749:20;;;;;6919:27;6915:56;;426:4780:21;5347:1653:25;:::o;6915:56::-;6955:16;;;-1:-1:-1;6955:16:25;;-1:-1:-1;6955:16:25;6293:81;6355:19;;;-1:-1:-1;6355:19:25;;-1:-1:-1;6355:19:25;5957:64;6000:21;;;;;;;;5684:154;5816:11;;;;:::i;:::-;5684:154;;4217:1141:24;;426:4780:21;;4321:21:24;;;4317:56;;4399:19;4405:12;;;;;:::i;4399:19::-;426:4780:21;;;;4442:4:24;4433:13;;4442:4;;;4462:8;;;;4469:1;4462:8;:::o;4429:923::-;4500:4;4491:13;;4500:4;;;4532:13;;;4527:19;4532:13;4520:26;4532:13;;:::i;4487:865::-;4576:4;4567:13;;4576:4;;;4618:13;;;4596:35;4618:13;;:::i;4596:35::-;4645:18;426:4780:21;4682:13:24;426:4780:21;4677:194:24;4697:15;;;;;;4891;;;;;:24;:15;;:::i;4682:13::-;4743:11;;;;4778:1;4743:11;426:4780:21;;;;4743:11:24;4742:43;4758:27;4764:20;;4769:14;:10;;;;:::i;:14::-;4764:20;;:::i;4742:43::-;;426:4780:21;;4682:13:24;;;;4563:789;4945:4;-1:-1:-1;4945:4:24;;;4977:13;;4972:19;4977:13;4965:26;4977:13;;:::i;4932:420::-;5044:13;;5022:35;5044:13;;:::i;5022:35::-;5071:18;426:4780:21;5108:13:24;426:4780:21;5103:194:24;5123:15;;;;;;5317;;;;;:24;:15;;:::i;5108:13::-;5169:11;;;;5204:1;5169:11;426:4780:21;;;;5169:11:24;5168:43;5184:27;5190:20;;5195:14;:10;;;;:::i;5168:43::-;;426:4780:21;;5108:13:24;;;;9295:1058:23;;426:4780:21;;9395:19:23;9391:39;;9459:17;9465:10;;;;:::i;9459:17::-;9512:4;9500:16;;9499:23;9512:4;;9596:33;9606:22;:18;426:4780:21;;9606:18:23;:::i;:::-;:22;:::i;:::-;9596:33;:::i;:::-;426:4780:21;;;-1:-1:-1;;;426:4780:21;9413:1:23;9643:36;;426:4780:21;9643:36:23;:::i;:::-;;9627:1;9698:13;426:4780:21;;9713:18:23;;;;;9785:10;9772:30;9779:22;:17;9785:10;;9627:1;9785:10;;;:::i;9779:17::-;426:4780:21;;;;;;9779:22:23;426:4780:21;;-1:-1:-1;;;;;;426:4780:21;;;9772:30:23;9752:50;9759:9;:5;;;:::i;:9::-;9752:50;9413:1;9752:50;;;;:::i;:::-;;9836:32;9674:4;9843:17;9849:10;;;;;:::i;9843:17::-;:24;426:4780:21;;-1:-1:-1;;;;;;426:4780:21;;;9836:32:23;9820:48;9827:5;;;:::i;9820:48::-;;426:4780:21;9698:13:23;;9713:18;-1:-1:-1;9713:18:23;-1:-1:-1;9295:1058:23:o;9562:761::-;426:4780:21;9993:33:23;10003:22;:18;426:4780:21;;10003:18:23;:::i;:::-;:22;:::i;9993:33::-;10057:1;10045:13;426:4780:21;;10060:18:23;;;;;10134:10;10121:30;10128:22;:17;10134:10;;10057:1;10134:10;;;:::i;10121:30::-;10099:52;10106:11;10107:5;;;:::i;:::-;10106:11;:::i;10099:52::-;;10195:32;10222:4;10202:17;10208:10;;;;;:::i;10195:32::-;10169:58;10176:15;:11;10177:5;;;:::i;10176:11::-;:15;:::i;10169:58::-;;426:4780:21;10045:13:23;;10590:651;;;;10709:23;426:4780:21;;10709:23:23;;:::i;:::-;10735:14;426:4780:21;;10735:14:23;:::i;:::-;-1:-1:-1;10705:58:23;;-1:-1:-1;10779:13:23;426:4780:21;;10794:18:23;;;;;10862:16;10863:10;;;;:::i;:::-;426:4780:21;;;;10862:16:23;10863:10;;10915:33;:28;10921:21;;10925:16;10926:10;;;;:::i;:::-;426:4780:21;;;;10925:16:23;10921:21;;:::i;10915:33::-;426:4780:21;11067:30:23;11080:17;11086:10;;;;;:::i;11067:30::-;426:4780:21;;11067:30:23;11063:81;;426:4780:21;;10779:13:23;;11063:81;11117:12;;;;-1:-1:-1;11117:12:23;:::o;10858:191::-;11030:4;10999:28;11005:21;;11009:16;11010:10;;;;:::i;10999:28::-;:35;10858:191;;10794:18;;;;;426:4780:21;10590:651:23;:::o;10705:58::-;10751:12;;;-1:-1:-1;10751:12:23;:::o;5563:305:24:-;;;-1:-1:-1;;;426:4780:21;-1:-1:-1;;;;;;426:4780:21;5670:12:24;;5563:305;;;5670:12;:::i;:::-;;426:4780:21;5670:20:24;5666:50;;5750:89;;;;;5563:305::o;5666:50::-;5699:17;;;-1:-1:-1;5699:17:24;;-1:-1:-1;5699:17:24;7210:1543:25;7374:21;;;;7370:46;;7442:19;7448:12;;;;;;:::i;7442:19::-;426:4780:21;;;;7485:4:25;7476:13;;7485:4;;;7541:12;;;;;;:::i;7472:1275::-;7655:4;7646:13;;;;;;;;7642:1105;7655:4;;;7724:13;;7703:34;7724:13;;:::i;7703:34::-;7760:21;;;;:::i;:::-;7800:13;426:4780:21;7815:14:25;;;;;;7997;;;;;;;:::i;7800:13::-;7867:10;7862:20;;7867:14;7876:1;7867:10;;;;:::i;7862:20::-;426:4780:21;7850:32:25;;;;;:::i;:::-;;426:4780:21;7800:13:25;;7642:1105;8042:4;-1:-1:-1;8042:4:25;;;8111:13;8089:35;8111:13;;:::i;8089:35::-;8138:22;426:4780:21;8179:13:25;426:4780:21;8194:15:25;;;;;;8398:21;;;;:::i;:::-;8438:13;426:4780:21;8453:14:25;;;;;;8649:15;;;;;;:28;:15;;:::i;8438:13::-;8505:10;8500:34;;8505:28;8283:1;8505:10;:24;:10;;;;:::i;8500:34::-;426:4780:21;8488:46:25;;;;;:::i;:::-;;426:4780:21;8438:13:25;;8179;8244:15;8283:1;;426:4780:21;;8243:47:25;8263:27;8269:20;;8274:14;:10;;;;:::i;8243:47::-;;426:4780:21;;8179:13:25;;8029:718;8716:20;;;426:4780:21;8716:20:25;;426:4780:21;8716:20:25","linkReferences":{},"immutableReferences":{"40450":[{"start":358,"length":32},{"start":1018,"length":32},{"start":1383,"length":32},{"start":2663,"length":32}],"40458":[{"start":1100,"length":32},{"start":2106,"length":32}],"40460":[{"start":498,"length":32},{"start":2072,"length":32}],"40874":[{"start":709,"length":32},{"start":896,"length":32},{"start":1262,"length":32},{"start":1544,"length":32},{"start":2140,"length":32},{"start":3941,"length":32},{"start":4087,"length":32}]}},"methodIdentifiers":{"MAX_BLOCK_LOOKBACK()":"3d2691bc","bond(uint256)":"9940686e","bondAmount()":"80f323a7","bondedExecutor()":"1aa7c0ec","cancellationRequest()":"308657d7","collect((bytes,bytes,bytes,bytes,uint256),uint256)":"ede7f6a3","currentPaymentAmount()":"8bd03d0a","currentRewardAmount()":"5a4fd645","executionDeadline()":"33ee5f35","expectedAmount()":"2feef2ec","expectedRecipient()":"8677ab23","fund(uint256,uint256)":"a65e2cfd","funded()":"f3a504f2","is_bonded()":"cb766a56","originalRewardAmount()":"d415b3f9","requestCancellation()":"81972d00","resume()":"046f7da2","tokenContract()":"55a373d6","totalBondsDeposited()":"fe03a460","withdraw()":"3ccfd60b"},"rawMetadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_tokenContract\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_expectedRecipient\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_expectedAmount\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_currentRewardAmount\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_currentPaymentAmount\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"AlreadyFunded\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"AmountMismatch\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"BlockHashUnavailable\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"BlockHeaderMismatch\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"BlockNumberMismatch\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"BondActive\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"CancellationRequested\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ExecutorAlreadyBonded\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ExpectedBytes32\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ExpectedRLPList\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ExpectedStringData\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ExpectedStringItem\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InsufficientBond\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidAddress\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidRLP\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidRLPEncoding\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidRLPList\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidReceiptProof\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidTransferEvent\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"NoWithdrawableFunds\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"NotFunded\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OnlyBondedExecutor\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OnlyDeployer\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"RLPOffsetOutOfBounds\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"RLPOffsetOutOfBounds\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"TargetBlockInFuture\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"TargetBlockTooOld\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ToAddressMismatch\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"TokenTransferFailed\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"WrongEventSignature\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"WrongTokenContract\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ZeroAddress\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ZeroPaymentAmount\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ZeroRewardAmount\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"MAX_BLOCK_LOOKBACK\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_bondAmount\",\"type\":\"uint256\"}],\"name\":\"bond\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"bondAmount\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"bondedExecutor\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"cancellationRequest\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes\",\"name\":\"blockHeader\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"receiptRlp\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"proofNodes\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"receiptPath\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"logIndex\",\"type\":\"uint256\"}],\"internalType\":\"struct EscrowERC20.ReceiptProof\",\"name\":\"proof\",\"type\":\"tuple\"},{\"internalType\":\"uint256\",\"name\":\"targetBlockNumber\",\"type\":\"uint256\"}],\"name\":\"collect\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"currentPaymentAmount\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"currentRewardAmount\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"executionDeadline\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"expectedAmount\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"expectedRecipient\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_currentRewardAmount\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_currentPaymentAmount\",\"type\":\"uint256\"}],\"name\":\"fund\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"funded\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"is_bonded\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"originalRewardAmount\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"requestCancellation\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"resume\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"tokenContract\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"totalBondsDeposited\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"withdraw\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"src/EscrowERC20.sol\":\"EscrowERC20\"},\"evmVersion\":\"prague\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[\":forge-std/=lib/forge-std/src/\"],\"viaIR\":true},\"sources\":{\"src/BlockHeaderParser.sol\":{\"keccak256\":\"0x10923e70f1bcc22107b31b5bd580dc0e58fb634dfc07baefb34609e3a3c3cee7\",\"license\":\"UNLICENSED\",\"urls\":[\"bzz-raw://2b3ba3998470d6c0aaf7906d21d8787dfbdded50a4683c89915295b2c2fe0ea5\",\"dweb:/ipfs/QmRiFmEeNN2HgXzabtyMVsVUBUCTrknW7ZiKTdajyQSscp\"]},\"src/EscrowBase.sol\":{\"keccak256\":\"0x53fd262562c9dbc7779339bafbeca6b86b690aec7ac864e30c57e0e42288a11d\",\"license\":\"UNLICENSED\",\"urls\":[\"bzz-raw://cb43380f5b0a131e1ac4405a43a67b9d2b07718eb05ba675fe46c106b8a12649\",\"dweb:/ipfs/QmNk5QkryXnDspEGc8mdyFYJSRXWRSP8V6yirLC98EKZYG\"]},\"src/EscrowERC20.sol\":{\"keccak256\":\"0xa89659e0421fe81fdfeccaaf40ba35578a6fb702a5599fe9a480eb7a2f85854d\",\"license\":\"UNLICENSED\",\"urls\":[\"bzz-raw://72ca9d806f4b8e56594d971dc4064c0819bf605543c3d88d997ecb16526b094c\",\"dweb:/ipfs/QmTccPEBt3CruNEFZfGpHB2weSnN4Fe2Nc88pvdc4wtxw4\"]},\"src/MPTVerifier.sol\":{\"keccak256\":\"0xf71ff6fc0fa054681fc67b7ca3c187141749b04895defd977d6989271b35ebeb\",\"license\":\"UNLICENSED\",\"urls\":[\"bzz-raw://6e2efbdee9d872e22febc5d29894e3759e72ed43850a512c9eed56a9f5e7ff3b\",\"dweb:/ipfs/QmShY9TstL2zXVSYH7ux8D6ByW22ptm7JfiEWy2qs7bHZU\"]},\"src/RLPParser.sol\":{\"keccak256\":\"0x403e6fd0cbf2e3599530d724d26e75b136bd7947e35e1cf5f79b30841b2c4c6c\",\"license\":\"UNLICENSED\",\"urls\":[\"bzz-raw://b24f44c75ae8db00297a940d0badb6b0fd9114b494b1a5c097a04f4bccde5e1d\",\"dweb:/ipfs/QmSoxh5vZu41RzAs8RTLXgQ5cD5pQBeQo68nYSFh4Dk5Xk\"]},\"src/ReceiptValidator.sol\":{\"keccak256\":\"0xd6deda056e80a69708354d192fa2e336841bf2a4d98dfa68eee4c3f550306015\",\"license\":\"UNLICENSED\",\"urls\":[\"bzz-raw://84686c66f4f5b66b3dc0315840aacb037f9fc21c60b6a58b298c6480d9ce0929\",\"dweb:/ipfs/QmSavcuzdBkNUXVyzCa4ysZY1kM7Tmt82wWFq2F3kTvwZo\"]}},\"version\":1}","metadata":{"compiler":{"version":"0.8.30+commit.73712a01"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"address","name":"_tokenContract","type":"address"},{"internalType":"address","name":"_expectedRecipient","type":"address"},{"internalType":"uint256","name":"_expectedAmount","type":"uint256"},{"internalType":"uint256","name":"_currentRewardAmount","type":"uint256"},{"internalType":"uint256","name":"_currentPaymentAmount","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"type":"error","name":"AlreadyFunded"},{"inputs":[],"type":"error","name":"AmountMismatch"},{"inputs":[],"type":"error","name":"BlockHashUnavailable"},{"inputs":[],"type":"error","name":"BlockHeaderMismatch"},{"inputs":[],"type":"error","name":"BlockNumberMismatch"},{"inputs":[],"type":"error","name":"BondActive"},{"inputs":[],"type":"error","name":"CancellationRequested"},{"inputs":[],"type":"error","name":"ExecutorAlreadyBonded"},{"inputs":[],"type":"error","name":"ExpectedBytes32"},{"inputs":[],"type":"error","name":"ExpectedRLPList"},{"inputs":[],"type":"error","name":"ExpectedStringData"},{"inputs":[],"type":"error","name":"ExpectedStringItem"},{"inputs":[],"type":"error","name":"InsufficientBond"},{"inputs":[],"type":"error","name":"InvalidAddress"},{"inputs":[],"type":"error","name":"InvalidRLP"},{"inputs":[],"type":"error","name":"InvalidRLPEncoding"},{"inputs":[],"type":"error","name":"InvalidRLPList"},{"inputs":[],"type":"error","name":"InvalidReceiptProof"},{"inputs":[],"type":"error","name":"InvalidTransferEvent"},{"inputs":[],"type":"error","name":"NoWithdrawableFunds"},{"inputs":[],"type":"error","name":"NotFunded"},{"inputs":[],"type":"error","name":"OnlyBondedExecutor"},{"inputs":[],"type":"error","name":"OnlyDeployer"},{"inputs":[],"type":"error","name":"RLPOffsetOutOfBounds"},{"inputs":[],"type":"error","name":"RLPOffsetOutOfBounds"},{"inputs":[],"type":"error","name":"TargetBlockInFuture"},{"inputs":[],"type":"error","name":"TargetBlockTooOld"},{"inputs":[],"type":"error","name":"ToAddressMismatch"},{"inputs":[],"type":"error","name":"TokenTransferFailed"},{"inputs":[],"type":"error","name":"WrongEventSignature"},{"inputs":[],"type":"error","name":"WrongTokenContract"},{"inputs":[],"type":"error","name":"ZeroAddress"},{"inputs":[],"type":"error","name":"ZeroPaymentAmount"},{"inputs":[],"type":"error","name":"ZeroRewardAmount"},{"inputs":[],"stateMutability":"view","type":"function","name":"MAX_BLOCK_LOOKBACK","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[{"internalType":"uint256","name":"_bondAmount","type":"uint256"}],"stateMutability":"nonpayable","type":"function","name":"bond"},{"inputs":[],"stateMutability":"view","type":"function","name":"bondAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"bondedExecutor","outputs":[{"internalType":"address","name":"","type":"address"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"cancellationRequest","outputs":[{"internalType":"bool","name":"","type":"bool"}]},{"inputs":[{"internalType":"struct EscrowERC20.ReceiptProof","name":"proof","type":"tuple","components":[{"internalType":"bytes","name":"blockHeader","type":"bytes"},{"internalType":"bytes","name":"receiptRlp","type":"bytes"},{"internalType":"bytes","name":"proofNodes","type":"bytes"},{"internalType":"bytes","name":"receiptPath","type":"bytes"},{"internalType":"uint256","name":"logIndex","type":"uint256"}]},{"internalType":"uint256","name":"targetBlockNumber","type":"uint256"}],"stateMutability":"nonpayable","type":"function","name":"collect"},{"inputs":[],"stateMutability":"view","type":"function","name":"currentPaymentAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"currentRewardAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"executionDeadline","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"expectedAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"expectedRecipient","outputs":[{"internalType":"address","name":"","type":"address"}]},{"inputs":[{"internalType":"uint256","name":"_currentRewardAmount","type":"uint256"},{"internalType":"uint256","name":"_currentPaymentAmount","type":"uint256"}],"stateMutability":"nonpayable","type":"function","name":"fund"},{"inputs":[],"stateMutability":"view","type":"function","name":"funded","outputs":[{"internalType":"bool","name":"","type":"bool"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"is_bonded","outputs":[{"internalType":"bool","name":"","type":"bool"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"originalRewardAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[],"stateMutability":"nonpayable","type":"function","name":"requestCancellation"},{"inputs":[],"stateMutability":"nonpayable","type":"function","name":"resume"},{"inputs":[],"stateMutability":"view","type":"function","name":"tokenContract","outputs":[{"internalType":"address","name":"","type":"address"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"totalBondsDeposited","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[],"stateMutability":"nonpayable","type":"function","name":"withdraw"}],"devdoc":{"kind":"dev","methods":{},"version":1},"userdoc":{"kind":"user","methods":{},"version":1}},"settings":{"remappings":["forge-std/=lib/forge-std/src/"],"optimizer":{"enabled":true,"runs":200},"metadata":{"bytecodeHash":"ipfs"},"compilationTarget":{"src/EscrowERC20.sol":"EscrowERC20"},"evmVersion":"prague","libraries":{},"viaIR":true},"sources":{"src/BlockHeaderParser.sol":{"keccak256":"0x10923e70f1bcc22107b31b5bd580dc0e58fb634dfc07baefb34609e3a3c3cee7","urls":["bzz-raw://2b3ba3998470d6c0aaf7906d21d8787dfbdded50a4683c89915295b2c2fe0ea5","dweb:/ipfs/QmRiFmEeNN2HgXzabtyMVsVUBUCTrknW7ZiKTdajyQSscp"],"license":"UNLICENSED"},"src/EscrowBase.sol":{"keccak256":"0x53fd262562c9dbc7779339bafbeca6b86b690aec7ac864e30c57e0e42288a11d","urls":["bzz-raw://cb43380f5b0a131e1ac4405a43a67b9d2b07718eb05ba675fe46c106b8a12649","dweb:/ipfs/QmNk5QkryXnDspEGc8mdyFYJSRXWRSP8V6yirLC98EKZYG"],"license":"UNLICENSED"},"src/EscrowERC20.sol":{"keccak256":"0xa89659e0421fe81fdfeccaaf40ba35578a6fb702a5599fe9a480eb7a2f85854d","urls":["bzz-raw://72ca9d806f4b8e56594d971dc4064c0819bf605543c3d88d997ecb16526b094c","dweb:/ipfs/QmTccPEBt3CruNEFZfGpHB2weSnN4Fe2Nc88pvdc4wtxw4"],"license":"UNLICENSED"},"src/MPTVerifier.sol":{"keccak256":"0xf71ff6fc0fa054681fc67b7ca3c187141749b04895defd977d6989271b35ebeb","urls":["bzz-raw://6e2efbdee9d872e22febc5d29894e3759e72ed43850a512c9eed56a9f5e7ff3b","dweb:/ipfs/QmShY9TstL2zXVSYH7ux8D6ByW22ptm7JfiEWy2qs7bHZU"],"license":"UNLICENSED"},"src/RLPParser.sol":{"keccak256":"0x403e6fd0cbf2e3599530d724d26e75b136bd7947e35e1cf5f79b30841b2c4c6c","urls":["bzz-raw://b24f44c75ae8db00297a940d0badb6b0fd9114b494b1a5c097a04f4bccde5e1d","dweb:/ipfs/QmSoxh5vZu41RzAs8RTLXgQ5cD5pQBeQo68nYSFh4Dk5Xk"],"license":"UNLICENSED"},"src/ReceiptValidator.sol":{"keccak256":"0xd6deda056e80a69708354d192fa2e336841bf2a4d98dfa68eee4c3f550306015","urls":["bzz-raw://84686c66f4f5b66b3dc0315840aacb037f9fc21c60b6a58b298c6480d9ce0929","dweb:/ipfs/QmSavcuzdBkNUXVyzCa4ysZY1kM7Tmt82wWFq2F3kTvwZo"],"license":"UNLICENSED"}},"version":1},"id":21} \ No newline at end of file +{"abi":[{"type":"constructor","inputs":[{"name":"_tokenContract","type":"address","internalType":"address"},{"name":"_expectedRecipient","type":"address","internalType":"address"},{"name":"_expectedAmount","type":"uint256","internalType":"uint256"},{"name":"_currentRewardAmount","type":"uint256","internalType":"uint256"},{"name":"_currentPaymentAmount","type":"uint256","internalType":"uint256"}],"stateMutability":"nonpayable"},{"type":"function","name":"MAX_BLOCK_LOOKBACK","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"bond","inputs":[{"name":"_bondAmount","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"bondAmount","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"bondedExecutor","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"type":"function","name":"cancellationRequest","inputs":[],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"collect","inputs":[{"name":"proof","type":"tuple","internalType":"struct EscrowERC20.ReceiptProof","components":[{"name":"blockHeader","type":"bytes","internalType":"bytes"},{"name":"receiptRlp","type":"bytes","internalType":"bytes"},{"name":"proofNodes","type":"bytes","internalType":"bytes"},{"name":"receiptPath","type":"bytes","internalType":"bytes"},{"name":"logIndex","type":"uint256","internalType":"uint256"}]},{"name":"targetBlockNumber","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"currentPaymentAmount","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"currentRewardAmount","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"executionDeadline","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"expectedAmount","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"expectedRecipient","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"type":"function","name":"fund","inputs":[{"name":"_currentRewardAmount","type":"uint256","internalType":"uint256"},{"name":"_currentPaymentAmount","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"funded","inputs":[],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"is_bonded","inputs":[],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"originalRewardAmount","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"requestCancellation","inputs":[],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"resume","inputs":[],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"tokenContract","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"type":"function","name":"totalBondsDeposited","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"withdraw","inputs":[],"outputs":[],"stateMutability":"nonpayable"},{"type":"error","name":"AlreadyFunded","inputs":[]},{"type":"error","name":"AmountMismatch","inputs":[]},{"type":"error","name":"BlockHashUnavailable","inputs":[]},{"type":"error","name":"BlockHeaderMismatch","inputs":[]},{"type":"error","name":"BlockNumberMismatch","inputs":[]},{"type":"error","name":"BondActive","inputs":[]},{"type":"error","name":"CancellationRequested","inputs":[]},{"type":"error","name":"ExecutorAlreadyBonded","inputs":[]},{"type":"error","name":"ExpectedBytes32","inputs":[]},{"type":"error","name":"ExpectedRLPList","inputs":[]},{"type":"error","name":"InsufficientBond","inputs":[]},{"type":"error","name":"InvalidAddress","inputs":[]},{"type":"error","name":"InvalidRLP","inputs":[]},{"type":"error","name":"InvalidRLPEncoding","inputs":[]},{"type":"error","name":"InvalidRLPList","inputs":[]},{"type":"error","name":"InvalidReceiptProof","inputs":[]},{"type":"error","name":"InvalidTransferEvent","inputs":[]},{"type":"error","name":"NoWithdrawableFunds","inputs":[]},{"type":"error","name":"NotFunded","inputs":[]},{"type":"error","name":"OnlyBondedExecutor","inputs":[]},{"type":"error","name":"OnlyDeployer","inputs":[]},{"type":"error","name":"RLPOffsetOutOfBounds","inputs":[]},{"type":"error","name":"TargetBlockInFuture","inputs":[]},{"type":"error","name":"TargetBlockTooOld","inputs":[]},{"type":"error","name":"ToAddressMismatch","inputs":[]},{"type":"error","name":"TokenTransferFailed","inputs":[]},{"type":"error","name":"WrongEventSignature","inputs":[]},{"type":"error","name":"WrongTokenContract","inputs":[]},{"type":"error","name":"ZeroAddress","inputs":[]},{"type":"error","name":"ZeroPaymentAmount","inputs":[]},{"type":"error","name":"ZeroRewardAmount","inputs":[]}],"bytecode":{"object":"0x61010080604052346101c15760a08161230980380380916100208285610231565b8339810103126101c15761003381610268565b9061004060208201610268565b6040820151608060608401519301519160a05260c0523360805260018060a01b0383169283156102225760e0528115801580610219575b6100fc575b60405161208c908161027d8239608051818181610166015281816103fa015281816105670152610a75015260a05181818161044c015261083a015260c0518181816101f20152610818015260e0518181816102c501528181610380015281816104ee015281816106080152818161085c01528181610f7301526110050152f35b60ff60075460081c1661020a576101fb5780156101ec57815f55816002558060015581018091116101d8575f91606460209260405194859384926323b872dd60e01b845233600485015230602485015260448401525af19081156101cd575f9161018e575b501561017f5761010061ff001960075416176007555f80808061007c565b63022e258160e11b5f5260045ffd5b90506020813d6020116101c5575b816101a960209383610231565b810103126101c1575180151581036101c1575f610161565b5f80fd5b3d915061019c565b6040513d5f823e3d90fd5b634e487b7160e01b5f52601160045260245ffd5b63932ca0a360e01b5f5260045ffd5b63ea1083a760e01b5f5260045ffd5b635adf638760e01b5f5260045ffd5b50811515610077565b63d92e233d60e01b5f5260045ffd5b601f909101601f19168101906001600160401b0382119082101761025457604052565b634e487b7160e01b5f52604160045260245ffd5b51906001600160a01b03821682036101c15756fe60806040526004361015610011575f80fd5b5f3560e01c8063046f7da2146101545780631aa7c0ec1461014f5780632feef2ec1461014a578063308657d71461014557806333ee5f35146101405780633ccfd60b1461013b5780633d2691bc1461013657806355a373d6146101315780635a4fd6451461012c57806380f323a71461012757806381972d00146101225780638677ab231461011d5780638bd03d0a146101185780639940686e14610113578063a65e2cfd1461010e578063cb766a5614610109578063d415b3f914610104578063ede7f6a3146100ff578063f3a504f2146100fa5763fe03a460146100f5575f80fd5b61094f565b61092a565b6106e7565b6106ca565b6106a6565b61054e565b610498565b61047b565b610437565b6103e8565b6103cb565b6103af565b61036b565b61034f565b610254565b610237565b610215565b6101db565b6101b3565b346101af575f3660031901126101af577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031633036101a0576007805460ff19169055005b63618bbdd560e01b5f5260045ffd5b5f80fd5b346101af575f3660031901126101af576003546040516001600160a01b039091168152602090f35b346101af575f3660031901126101af5760206040517f00000000000000000000000000000000000000000000000000000000000000008152f35b346101af575f3660031901126101af57602060ff600754166040519015158152f35b346101af575f3660031901126101af576020600454604051908152f35b346101af575f3660031901126101af5761026c610a65565b610274610aa5565b61027c610adc565b61029361ff0019600754166007555f6001555f8055565b80156103405760405163a9059cbb60e01b815233600482015260248101919091526020816044815f6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000165af190811561033b575f9161030c575b50156102fd57005b63022e258160e11b5f5260045ffd5b61032e915060203d602011610334575b6103268183610980565b8101906109a7565b5f6102f5565b503d61031c565b6109bf565b6353cd7f7960e01b5f5260045ffd5b346101af575f3660031901126101af5760206040516101008152f35b346101af575f3660031901126101af576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b346101af575f3660031901126101af5760205f54604051908152f35b346101af575f3660031901126101af576020600554604051908152f35b346101af575f3660031901126101af577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031633036101a0576007805460ff19166001179055005b346101af575f3660031901126101af576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b346101af575f3660031901126101af576020600154604051908152f35b346101af5760203660031901126101af576004356104b4610aee565b6104bd81610b37565b6040516323b872dd60e01b8152336004820152306024820152604481018290526020816064815f6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000165af190811561033b575f9161052f575b50156102fd5761052d90610b92565b005b610548915060203d602011610334576103268183610980565b5f61051e565b346101af5760403660031901126101af576004356024357f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031633036101a05760075460081c60ff16610697578115610688578015610679576105bd826105c2935f55600255565b600155565b61060360206105d660025460015490610a0d565b6040516323b872dd60e01b8152336004820152306024820152604481019190915291829081906064820190565b03815f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165af190811561033b575f9161065a575b50156102fd5761052d61010061ff00196007541617600755565b610673915060203d602011610334576103268183610980565b5f610640565b63932ca0a360e01b5f5260045ffd5b63ea1083a760e01b5f5260045ffd5b635adf638760e01b5f5260045ffd5b346101af575f3660031901126101af5760206106c0610a1a565b6040519015158152f35b346101af575f3660031901126101af576020600254604051908152f35b346101af5760403660031901126101af5760043567ffffffffffffffff81116101af578060040160a060031983360301126101af576024356107298280610a32565b60075461073e9060081c60ff161590565b1590565b61091b5760035461075f906001600160a01b03165b6001600160a01b031690565b331480159061090a575b6108fb574383116108ec576101006107818443610bd7565b116108dd57824080156108ce57610799368385610c00565b60208151910120036108bf576107ae91611062565b036108b0576107c66107c08280610a32565b90610c64565b9161080061073a60248301946107dc8686610a32565b906107ea6044870188610a32565b906107f8606489018a610a32565b949093610cd4565b6108a15760846108166108869461073a94610a32565b7f0000000000000000000000000000000000000000000000000000000000000000937f0000000000000000000000000000000000000000000000000000000000000000937f0000000000000000000000000000000000000000000000000000000000000000939101359190610d58565b6108925761052d610ef2565b6364fa89e160e11b5f5260045ffd5b637b374dd160e01b5f5260045ffd5b63048a12f560e11b5f5260045ffd5b63ff28378760e01b5f5260045ffd5b63bfc9f0d360e01b5f5260045ffd5b63c42a018560e01b5f5260045ffd5b63058968cf60e41b5f5260045ffd5b6337b5f20360e21b5f5260045ffd5b5061091661073a610a1a565b610769565b636af784dd60e11b5f5260045ffd5b346101af575f3660031901126101af57602060ff60075460081c166040519015158152f35b346101af575f3660031901126101af576020600654604051908152f35b634e487b7160e01b5f52604160045260245ffd5b90601f8019910116810190811067ffffffffffffffff8211176109a257604052565b61096c565b908160209103126101af575180151581036101af5790565b6040513d5f823e3d90fd5b634e487b7160e01b5f52601160045260245ffd5b90600182018092116109ec57565b6109ca565b60010190816001116109ec57565b90601582018092116109ec57565b919082018092116109ec57565b6004548015159081610a2a575090565b905042111590565b903590601e19813603018212156101af570180359067ffffffffffffffff82116101af576020019181360383136101af57565b60ff60075460081c161561091b577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031633036101a057565b610aad610a1a565b610acd576001600160601b0360a01b600354166003555f6005555f600455565b639cbc1de160e01b5f5260045ffd5b60015460025481018091116109ec5790565b6004548015159081610b2d575b50610b0257565b6005545f548181018091116109ec575f556006549081018091116109ec57600655610b2b610aa5565b565b905042115f610afb565b60075460ff8160081c161561091b5760ff16610b8357610b55610a1a565b610b74575f5460011c11610b6557565b63e92c469f60e01b5f5260045ffd5b63129f78e960e11b5f5260045ffd5b632479328960e01b5f5260045ffd5b336001600160601b0360a01b600354161760035561012c42018042116109ec57600455600555565b6001198101919082116109ec57565b5f198101919082116109ec57565b919082039182116109ec57565b67ffffffffffffffff81116109a257601f01601f191660200190565b929192610c0c82610be4565b91610c1a6040519384610980565b8294818452818301116101af578281602093845f960137010152565b634e487b7160e01b5f52603260045260245ffd5b9015610c535790565b610c36565b90821015610c53570190565b90610c6f818361111e565b905f5b60058110610cbf5750600560fd1b906001600160f81b031990610c9790849086610c58565b351603610cb0576001810181116109ec57016001013590565b633954003560e11b5f5260045ffd5b91610ccd6001918386611252565b9201610c72565b610cea610cf292939495610cf898973691610c00565b923691610c00565b906113da565b90565b60ff60f6199116019060ff82116109ec57565b60ff607f199116019060ff82116109ec57565b60ff60bf199116019060ff82116109ec57565b60ff60b6199116019060ff82116109ec57565b60ff166001019060ff82116109ec57565b9594939291905f818881151580610ed6575b610ec8575b610d98610d92610d848560c09560ff95610c58565b356001600160f81b03191690565b60f81c90565b1610610e9257808860f860ff610db6610d92610d8488978887610c58565b1610610eb857610de3610dde610dd9610d92610d8486610def98610de997610c58565b610cfb565b610d47565b60ff1690565b90610a0d565b81885f5b60038110610ea15750610de3610d92610d848560c095610e1295610c58565b10610e9257808860f8610e30610de3610d92610d8488978887610c58565b10610e8157610de3610dde610dd9610d92610d8486610e5298610de997610c58565b915b5f905b808210610e6a575050610cf89596611587565b9092610e79600191848b611252565b930190610e57565b50610e8c91506109de565b91610e54565b631bd5dcf760e31b5f5260045ffd5b92600192610eae92611252565b9101888391610df3565b50610ec391506109de565b610def565b506001915082905088610d6f565b50608060ff610eeb610d92610d848686610c4a565b1610610d6a565b610efa611657565b6003546001600160a01b0316610f376001600160601b0360a01b600354166003555f6005555f60045561ff0019600754166007555f6001555f8055565b4662aa36a703610fd357604051633419e74d60e21b81526001600160a01b0390911660048201526024810191909152602081806044810103815f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165af190811561033b575f91610fb4575b505b156102fd57565b610fcd915060203d602011610334576103268183610980565b5f610fab565b60405163a9059cbb60e01b81526001600160a01b0390911660048201526024810191909152602081806044810103815f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165af190811561033b575f91611043575b50610fad565b61105c915060203d602011610334576103268183610980565b5f61103d565b61106c828261111e565b915f5b600881106111095750611089610d92610d84858486610c58565b925f9260ff851694608086105f146110a357505050505090565b6110b49193949550610de390610d0e565b915f935b8385106110c757505050505090565b90919293946110d860019160081b90565b6110fd610de3610d92610d846110f68b6110f18b6109de565b610a0d565b8789610c58565b179501939291906110b8565b926111176001918385611252565b930161106f565b5f600360fe1b6001600160f81b031961113a610d848686610c4a565b161061121a57601f60fb1b6001600160f81b031961115b610d848686610c4a565b16106112495780610de9610de3610dde610dd9610d92610d8461117f978a8a610c58565b905b61a5bd4614801561123e575b611198575b50905090565b5f5b600381106112295750600360fe1b6111c66111b9610d84858786610c58565b6001600160f81b03191690565b1061121a57601f60fb1b6111e16111b9610d84858786610c58565b1061120a57610de3610dde610dd9610d92610d848661120398610de997610c58565b805f611192565b5061121591506109de565b611203565b63c0098bd960e01b5f5260045ffd5b916112376001918584611252565b920161119a565b5061a5bf461461118d565b50600190611181565b9190808210156113ad5761126d610d92610d84848487610c58565b9060ff8216608081101561128857505050610cf891506109de565b91929160b88110156112b0575050610cf89250610de36112aa610de9926109de565b92610d0e565b90929060c08110156113265750610de36112cc91949394610d34565b915f935f915b8483106112ed57505050610cf892916110f16110f1926109de565b9091946112fc60019160081b90565b61131c610de3610d92610d846113158b6110f18b6109de565b8888610c58565b17950191906112d2565b90929060f8111561134c5750610cf89250610de3611346610de9926109de565b92610d21565b9291610de361135a91610cfb565b915f935f915b84831061137b57505050610cf892916110f16110f1926109de565b90919461138a60019160081b90565b6113a3610de3610d92610d846113158b6110f18b6109de565b1795019190611360565b6318d76ae160e11b5f5260045ffd5b805115610c535760200190565b908151811015610c53570160200190565b919390929190600360fe1b6001600160f81b03196113fb610d848689610c4a565b161061157857601f60fb1b6001600160f81b031961141c610d848689610c4a565b161061156e5761144061143b610de3610dd9610d92610d84888b610c4a565b6109f1565b9492905b945f5b82821061145957505050505050505f90565b6114776114708361146b36878a610c00565b6116c8565b9093610a0d565b96825160208401200361150c57600360fe1b6114a66111b9611498856113bc565b516001600160f81b03191690565b1061150c578590846001601f60fb1b6114c46111b9611498886113bc565b1015611550575b6114d5818661186f565b6011810361151757506114e7946119fa565b94911561150c5784156115005793915b91959093611447565b50505050505050600190565b505050505050505f90565b90935060021415905061154457848792611530946118b4565b94911561150c5784156115005793916114f7565b50505050505050505f90565b5061156961143b610de3610dd9610d92611498896113bc565b6114cb565b6001949290611444565b63ebb47d1d60e01b5f5260045ffd5b91949392948060c060ff6115a2610d92610d8485888a610c58565b1610610e925760f860ff6115bd610d92610d8485888a610c58565b1610611647575080610de9610de3610dde610dd9610d92610d846115e297898b610c58565b945b609460ff6115f9610d92610d848a8789610c58565b1603611638576001600160a01b03168286016001013560601c0361162957611623610cf8956109ff565b91611b0f565b63a087f96f60e01b5f5260045ffd5b63e6c4247b60e01b5f5260045ffd5b61165191506109de565b946115e4565b6005545f5481018091116109ec5760015481018091116109ec5790565b604080519091906116858382610980565b6001815291601f1901366020840137565b906116a082610be4565b6116ad6040519182610980565b82815280926116be601f1991610be4565b0190602036910137565b80518210156113ad576116e1610d9261149884846113c9565b9160ff8316608081101561171a575050506116fa611674565b9060f81b6001600160f81b0319165f1a611713826113bc565b5390600190565b919392909160b88110156117845750610de361173591610d0e565b9061173f82611696565b935f5b83811061175557505050610cf8906109f1565b8061177161149861176b6001946110f1886109de565b856113c9565b5f1a61177d82896113c9565b5301611742565b60c0111561182257610de361179891610d34565b5f915f5b8281106117f457506117ad83611696565b945f5b8481106117c757505050906110f1610cf8926109f1565b806117e161149861176b6001946110f1896110f18a6109de565b5f1a6117ed828a6113c9565b53016117b0565b9260019060081b61181a610de3610d92611498611814896110f1896109de565b8b6113c9565b17930161179c565b509161182e8382611cc6565b9261183884611696565b915f5b858110611849575050509190565b8061185c61149861176b60019487610a0d565b5f1a61186882876113c9565b530161183b565b5f92915b815181101561189a576118868183611cc6565b81018091116109ec57600190930192611873565b5050565b908160011b91808304600214901517156109ec57565b839492916118c281836116c8565b93906118e160206118d8610d92611498856113bc565b16151591611df3565b9788911561198357506118f5905187610a0d565b6118ff825161189e565b14611914575b505050505050505f905f905f90565b86866001928251611971575b50505061192e575b80611905565b6119419261193b91610a0d565b906116c8565b506020815191012090602081519101201461195f5780808080611928565b61196a915190610a0d565b6001915f90565b61197b9350611f5c565b86865f611920565b611994939495965061073a92611f5c565b6119ed576119a59261193b91610a0d565b50908151602081145f146119cd575060206119c5920151925b5190610a0d565b916001929190565b80156119e15760206119c5930120926119be565b505050505f905f905f90565b50505050505f905f905f90565b91909293611a08825161189e565b851015611ab25750610d92611498611a2a92611a248760011c90565b906113c9565b60018416611aa95760041c600f16915b905f925b60ff81168410611a895750611a5392506116c8565b5080518015611a7e576119c59160208203611a7457602091500151916109de565b60200120916109de565b5050505f905f905f90565b90916001611a9d82610de960ff9487611cc6565b94019392919050611a3e565b600f1691611a3a565b9290509392935f915b60108310611af557611acd92506116c8565b50602081519101209060208151910120145f14611aec57600191905f90565b5f915081908190565b90611b0681610de960019385611cc6565b92019190611abb565b929190918160c060ff611b29610d92610d8487898b610c58565b1610610e925760f860ff611b44610d92610d8487898b610c58565b1610611cb75780610de9610de3610dde610dd9610d92610d84611b68978b8d610c58565b7fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef611b9482868861201a565b03611ca857610753610753611bb7611bb0611bbe94888a611252565b8789611252565b868861201a565b6001600160a01b03918216911603611c9957611bdb908284611252565b905f91611bef610d92610d84838588610c58565b60ff811694906080861015611c1d5750505050505b03611c0e57600190565b6355e97b0d60e01b5f5260045ffd5b9091929394608081145f14611c38575050505050505f611c04565b60a010610e9257610de3611c4e91939293610d0e565b915f935b838510611c63575050505050611c04565b9091929394611c7460019160081b90565b611c8d610de3610d92610d846110f68b6110f18b6109de565b17950193929190611c52565b634cd4b7b160e01b5f5260045ffd5b6324da545d60e11b5f5260045ffd5b50611cc1826109de565b611b68565b9081518110156113ad57611ce0610d9261149883856113c9565b9160ff83166080811015611cf75750505050600190565b60b8811015611d1257505050610de3610dde610cf892610d0e565b60c0811015611d7e575091610de3611d2991610d34565b905f925f915b838310611d4657505050906110f1610cf8926109f1565b909193611d5560019160081b90565b611d74610de3610d92611498611d6e8a6110f1896109de565b886113c9565b1794019190611d2f565b60f81115611d97575050610de3610dde610cf892610d21565b91610de3611da491610cfb565b905f925f915b838310611dc157505050906110f1610cf8926109f1565b909193611dd060019160081b90565b611de9610de3610d92611498611d6e8a6110f1896109de565b1794019190611daa565b90815115610b2b57611e0a610d92611498846113bc565b6010811615611ed957611e2d611e28611e23855161189e565b610bc9565b611696565b9060f81b600f60f81b165f1a611e42826113bc565b5360015b8351811015611ed45780611e81611e71611e68610d926114986001968a6113c9565b60041c600f1690565b60f81b6001600160f81b03191690565b611e9a611e90611e238461189e565b915f1a91856113c9565b53611ec1600f611eb0610d92611498858a6113c9565b1660f81b6001600160f81b03191690565b611ecd611e908361189e565b5301611e46565b509150565b50611eef611e28611eea845161189e565b610bba565b60015b8351811015611ed45780611f14611e71611e68610d926114986001968a6113c9565b611f28611e90611f2384610bc9565b61189e565b53611f3e600f611eb0610d92611498858a6113c9565b611f55611e90611f50611f2385610bc9565b6109de565b5301611ef2565b919091611f6a825184610a0d565b611f74825161189e565b10612013575f5b825181101561200a57611f97611f918286610a0d565b60011690565b611fec57611fc0611e68610d92611498611fba611fb4868a610a0d565b60011c90565b866113c9565b60ff611fd5610de3610d9261149886896113c9565b911603611fe457600101611f7b565b505050505f90565b600f612004610d92611498611fba611fb4868a610a0d565b16611fc0565b50505050600190565b5050505f90565b9190600560fd1b906001600160f81b03199061203890849086610c58565b35160361204757016001013590565b63f0ff325b60e01b5f5260045ffdfea26469706673582212209a126280f4165fa90c369d1d37a2ccf7a3b954b2d3507912d0882b0a958f5f3a64736f6c634300081e0033","sourceMap":"426:4780:21:-:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;1670:38:20;426:4780:21;1670:38:20;1718:32;;1778:10;426:4780:21;1760:28:20;426:4780:21;;;;;;;1437:28;;;1433:54;;1497:30;;1542:24;;;;:53;;;-1:-1:-1;1538:133:21;;-1:-1:-1;426:4780:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1718:32:20;426:4780:21;;;;;;;;;;1497:30;426:4780;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1538:133;426:4780;1953:6;426:4780;;;;1949:34;;1993:56;;2063:26;;2059:58;;426:4780;-1:-1:-1;426:4780:21;;2180:43;426:4780;;;;;;;;;;;-1:-1:-1;426:4780:21;2292:106;426:4780;;;;;;;;;;;;2292:106;;1778:10:20;2292:106:21;;;426:4780;2347:4;426:4780;;;;;;;;2292:106;;;;;;;-1:-1:-1;2292:106:21;;;1538:133;2291:107;;2287:174;;426:4780;;;1953:6;426:4780;;;1953:6;426:4780;1538:133;;;;;;2287:174;2429:21;;;-1:-1:-1;2429:21:21;2292:106;-1:-1:-1;2429:21:21;2292:106;;;426:4780;2292:106;;426:4780;2292:106;;;;;;426:4780;2292:106;;;:::i;:::-;;;426:4780;;;;;;;;;;;;2292:106;;;426:4780;-1:-1:-1;426:4780:21;;2292:106;;;-1:-1:-1;2292:106:21;;;426:4780;;;-1:-1:-1;426:4780:21;;;;;;;;;-1:-1:-1;426:4780:21;;;;;-1:-1:-1;426:4780:21;2059:58;2098:19;;;-1:-1:-1;2098:19:21;;-1:-1:-1;2098:19:21;1993:56;2031:18;;;-1:-1:-1;2031:18:21;;-1:-1:-1;2031:18:21;1949:34;1968:15;;;-1:-1:-1;1968:15:21;;-1:-1:-1;1968:15:21;1542:53;1570:25;;;;1542:53;;1433:54;1474:13;;;-1:-1:-1;1474:13:21;;-1:-1:-1;1474:13:21;426:4780;;;;;-1:-1:-1;;426:4780:21;;;;-1:-1:-1;;;;;426:4780:21;;;;;;;;;;:::o;:::-;;;;-1:-1:-1;426:4780:21;;;;;-1:-1:-1;426:4780:21;;;;-1:-1:-1;;;;;426:4780:21;;;;;;:::o","linkReferences":{}},"deployedBytecode":{"object":"0x60806040526004361015610011575f80fd5b5f3560e01c8063046f7da2146101545780631aa7c0ec1461014f5780632feef2ec1461014a578063308657d71461014557806333ee5f35146101405780633ccfd60b1461013b5780633d2691bc1461013657806355a373d6146101315780635a4fd6451461012c57806380f323a71461012757806381972d00146101225780638677ab231461011d5780638bd03d0a146101185780639940686e14610113578063a65e2cfd1461010e578063cb766a5614610109578063d415b3f914610104578063ede7f6a3146100ff578063f3a504f2146100fa5763fe03a460146100f5575f80fd5b61094f565b61092a565b6106e7565b6106ca565b6106a6565b61054e565b610498565b61047b565b610437565b6103e8565b6103cb565b6103af565b61036b565b61034f565b610254565b610237565b610215565b6101db565b6101b3565b346101af575f3660031901126101af577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031633036101a0576007805460ff19169055005b63618bbdd560e01b5f5260045ffd5b5f80fd5b346101af575f3660031901126101af576003546040516001600160a01b039091168152602090f35b346101af575f3660031901126101af5760206040517f00000000000000000000000000000000000000000000000000000000000000008152f35b346101af575f3660031901126101af57602060ff600754166040519015158152f35b346101af575f3660031901126101af576020600454604051908152f35b346101af575f3660031901126101af5761026c610a65565b610274610aa5565b61027c610adc565b61029361ff0019600754166007555f6001555f8055565b80156103405760405163a9059cbb60e01b815233600482015260248101919091526020816044815f6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000165af190811561033b575f9161030c575b50156102fd57005b63022e258160e11b5f5260045ffd5b61032e915060203d602011610334575b6103268183610980565b8101906109a7565b5f6102f5565b503d61031c565b6109bf565b6353cd7f7960e01b5f5260045ffd5b346101af575f3660031901126101af5760206040516101008152f35b346101af575f3660031901126101af576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b346101af575f3660031901126101af5760205f54604051908152f35b346101af575f3660031901126101af576020600554604051908152f35b346101af575f3660031901126101af577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031633036101a0576007805460ff19166001179055005b346101af575f3660031901126101af576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b346101af575f3660031901126101af576020600154604051908152f35b346101af5760203660031901126101af576004356104b4610aee565b6104bd81610b37565b6040516323b872dd60e01b8152336004820152306024820152604481018290526020816064815f6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000165af190811561033b575f9161052f575b50156102fd5761052d90610b92565b005b610548915060203d602011610334576103268183610980565b5f61051e565b346101af5760403660031901126101af576004356024357f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031633036101a05760075460081c60ff16610697578115610688578015610679576105bd826105c2935f55600255565b600155565b61060360206105d660025460015490610a0d565b6040516323b872dd60e01b8152336004820152306024820152604481019190915291829081906064820190565b03815f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165af190811561033b575f9161065a575b50156102fd5761052d61010061ff00196007541617600755565b610673915060203d602011610334576103268183610980565b5f610640565b63932ca0a360e01b5f5260045ffd5b63ea1083a760e01b5f5260045ffd5b635adf638760e01b5f5260045ffd5b346101af575f3660031901126101af5760206106c0610a1a565b6040519015158152f35b346101af575f3660031901126101af576020600254604051908152f35b346101af5760403660031901126101af5760043567ffffffffffffffff81116101af578060040160a060031983360301126101af576024356107298280610a32565b60075461073e9060081c60ff161590565b1590565b61091b5760035461075f906001600160a01b03165b6001600160a01b031690565b331480159061090a575b6108fb574383116108ec576101006107818443610bd7565b116108dd57824080156108ce57610799368385610c00565b60208151910120036108bf576107ae91611062565b036108b0576107c66107c08280610a32565b90610c64565b9161080061073a60248301946107dc8686610a32565b906107ea6044870188610a32565b906107f8606489018a610a32565b949093610cd4565b6108a15760846108166108869461073a94610a32565b7f0000000000000000000000000000000000000000000000000000000000000000937f0000000000000000000000000000000000000000000000000000000000000000937f0000000000000000000000000000000000000000000000000000000000000000939101359190610d58565b6108925761052d610ef2565b6364fa89e160e11b5f5260045ffd5b637b374dd160e01b5f5260045ffd5b63048a12f560e11b5f5260045ffd5b63ff28378760e01b5f5260045ffd5b63bfc9f0d360e01b5f5260045ffd5b63c42a018560e01b5f5260045ffd5b63058968cf60e41b5f5260045ffd5b6337b5f20360e21b5f5260045ffd5b5061091661073a610a1a565b610769565b636af784dd60e11b5f5260045ffd5b346101af575f3660031901126101af57602060ff60075460081c166040519015158152f35b346101af575f3660031901126101af576020600654604051908152f35b634e487b7160e01b5f52604160045260245ffd5b90601f8019910116810190811067ffffffffffffffff8211176109a257604052565b61096c565b908160209103126101af575180151581036101af5790565b6040513d5f823e3d90fd5b634e487b7160e01b5f52601160045260245ffd5b90600182018092116109ec57565b6109ca565b60010190816001116109ec57565b90601582018092116109ec57565b919082018092116109ec57565b6004548015159081610a2a575090565b905042111590565b903590601e19813603018212156101af570180359067ffffffffffffffff82116101af576020019181360383136101af57565b60ff60075460081c161561091b577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031633036101a057565b610aad610a1a565b610acd576001600160601b0360a01b600354166003555f6005555f600455565b639cbc1de160e01b5f5260045ffd5b60015460025481018091116109ec5790565b6004548015159081610b2d575b50610b0257565b6005545f548181018091116109ec575f556006549081018091116109ec57600655610b2b610aa5565b565b905042115f610afb565b60075460ff8160081c161561091b5760ff16610b8357610b55610a1a565b610b74575f5460011c11610b6557565b63e92c469f60e01b5f5260045ffd5b63129f78e960e11b5f5260045ffd5b632479328960e01b5f5260045ffd5b336001600160601b0360a01b600354161760035561012c42018042116109ec57600455600555565b6001198101919082116109ec57565b5f198101919082116109ec57565b919082039182116109ec57565b67ffffffffffffffff81116109a257601f01601f191660200190565b929192610c0c82610be4565b91610c1a6040519384610980565b8294818452818301116101af578281602093845f960137010152565b634e487b7160e01b5f52603260045260245ffd5b9015610c535790565b610c36565b90821015610c53570190565b90610c6f818361111e565b905f5b60058110610cbf5750600560fd1b906001600160f81b031990610c9790849086610c58565b351603610cb0576001810181116109ec57016001013590565b633954003560e11b5f5260045ffd5b91610ccd6001918386611252565b9201610c72565b610cea610cf292939495610cf898973691610c00565b923691610c00565b906113da565b90565b60ff60f6199116019060ff82116109ec57565b60ff607f199116019060ff82116109ec57565b60ff60bf199116019060ff82116109ec57565b60ff60b6199116019060ff82116109ec57565b60ff166001019060ff82116109ec57565b9594939291905f818881151580610ed6575b610ec8575b610d98610d92610d848560c09560ff95610c58565b356001600160f81b03191690565b60f81c90565b1610610e9257808860f860ff610db6610d92610d8488978887610c58565b1610610eb857610de3610dde610dd9610d92610d8486610def98610de997610c58565b610cfb565b610d47565b60ff1690565b90610a0d565b81885f5b60038110610ea15750610de3610d92610d848560c095610e1295610c58565b10610e9257808860f8610e30610de3610d92610d8488978887610c58565b10610e8157610de3610dde610dd9610d92610d8486610e5298610de997610c58565b915b5f905b808210610e6a575050610cf89596611587565b9092610e79600191848b611252565b930190610e57565b50610e8c91506109de565b91610e54565b631bd5dcf760e31b5f5260045ffd5b92600192610eae92611252565b9101888391610df3565b50610ec391506109de565b610def565b506001915082905088610d6f565b50608060ff610eeb610d92610d848686610c4a565b1610610d6a565b610efa611657565b6003546001600160a01b0316610f376001600160601b0360a01b600354166003555f6005555f60045561ff0019600754166007555f6001555f8055565b4662aa36a703610fd357604051633419e74d60e21b81526001600160a01b0390911660048201526024810191909152602081806044810103815f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165af190811561033b575f91610fb4575b505b156102fd57565b610fcd915060203d602011610334576103268183610980565b5f610fab565b60405163a9059cbb60e01b81526001600160a01b0390911660048201526024810191909152602081806044810103815f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165af190811561033b575f91611043575b50610fad565b61105c915060203d602011610334576103268183610980565b5f61103d565b61106c828261111e565b915f5b600881106111095750611089610d92610d84858486610c58565b925f9260ff851694608086105f146110a357505050505090565b6110b49193949550610de390610d0e565b915f935b8385106110c757505050505090565b90919293946110d860019160081b90565b6110fd610de3610d92610d846110f68b6110f18b6109de565b610a0d565b8789610c58565b179501939291906110b8565b926111176001918385611252565b930161106f565b5f600360fe1b6001600160f81b031961113a610d848686610c4a565b161061121a57601f60fb1b6001600160f81b031961115b610d848686610c4a565b16106112495780610de9610de3610dde610dd9610d92610d8461117f978a8a610c58565b905b61a5bd4614801561123e575b611198575b50905090565b5f5b600381106112295750600360fe1b6111c66111b9610d84858786610c58565b6001600160f81b03191690565b1061121a57601f60fb1b6111e16111b9610d84858786610c58565b1061120a57610de3610dde610dd9610d92610d848661120398610de997610c58565b805f611192565b5061121591506109de565b611203565b63c0098bd960e01b5f5260045ffd5b916112376001918584611252565b920161119a565b5061a5bf461461118d565b50600190611181565b9190808210156113ad5761126d610d92610d84848487610c58565b9060ff8216608081101561128857505050610cf891506109de565b91929160b88110156112b0575050610cf89250610de36112aa610de9926109de565b92610d0e565b90929060c08110156113265750610de36112cc91949394610d34565b915f935f915b8483106112ed57505050610cf892916110f16110f1926109de565b9091946112fc60019160081b90565b61131c610de3610d92610d846113158b6110f18b6109de565b8888610c58565b17950191906112d2565b90929060f8111561134c5750610cf89250610de3611346610de9926109de565b92610d21565b9291610de361135a91610cfb565b915f935f915b84831061137b57505050610cf892916110f16110f1926109de565b90919461138a60019160081b90565b6113a3610de3610d92610d846113158b6110f18b6109de565b1795019190611360565b6318d76ae160e11b5f5260045ffd5b805115610c535760200190565b908151811015610c53570160200190565b919390929190600360fe1b6001600160f81b03196113fb610d848689610c4a565b161061157857601f60fb1b6001600160f81b031961141c610d848689610c4a565b161061156e5761144061143b610de3610dd9610d92610d84888b610c4a565b6109f1565b9492905b945f5b82821061145957505050505050505f90565b6114776114708361146b36878a610c00565b6116c8565b9093610a0d565b96825160208401200361150c57600360fe1b6114a66111b9611498856113bc565b516001600160f81b03191690565b1061150c578590846001601f60fb1b6114c46111b9611498886113bc565b1015611550575b6114d5818661186f565b6011810361151757506114e7946119fa565b94911561150c5784156115005793915b91959093611447565b50505050505050600190565b505050505050505f90565b90935060021415905061154457848792611530946118b4565b94911561150c5784156115005793916114f7565b50505050505050505f90565b5061156961143b610de3610dd9610d92611498896113bc565b6114cb565b6001949290611444565b63ebb47d1d60e01b5f5260045ffd5b91949392948060c060ff6115a2610d92610d8485888a610c58565b1610610e925760f860ff6115bd610d92610d8485888a610c58565b1610611647575080610de9610de3610dde610dd9610d92610d846115e297898b610c58565b945b609460ff6115f9610d92610d848a8789610c58565b1603611638576001600160a01b03168286016001013560601c0361162957611623610cf8956109ff565b91611b0f565b63a087f96f60e01b5f5260045ffd5b63e6c4247b60e01b5f5260045ffd5b61165191506109de565b946115e4565b6005545f5481018091116109ec5760015481018091116109ec5790565b604080519091906116858382610980565b6001815291601f1901366020840137565b906116a082610be4565b6116ad6040519182610980565b82815280926116be601f1991610be4565b0190602036910137565b80518210156113ad576116e1610d9261149884846113c9565b9160ff8316608081101561171a575050506116fa611674565b9060f81b6001600160f81b0319165f1a611713826113bc565b5390600190565b919392909160b88110156117845750610de361173591610d0e565b9061173f82611696565b935f5b83811061175557505050610cf8906109f1565b8061177161149861176b6001946110f1886109de565b856113c9565b5f1a61177d82896113c9565b5301611742565b60c0111561182257610de361179891610d34565b5f915f5b8281106117f457506117ad83611696565b945f5b8481106117c757505050906110f1610cf8926109f1565b806117e161149861176b6001946110f1896110f18a6109de565b5f1a6117ed828a6113c9565b53016117b0565b9260019060081b61181a610de3610d92611498611814896110f1896109de565b8b6113c9565b17930161179c565b509161182e8382611cc6565b9261183884611696565b915f5b858110611849575050509190565b8061185c61149861176b60019487610a0d565b5f1a61186882876113c9565b530161183b565b5f92915b815181101561189a576118868183611cc6565b81018091116109ec57600190930192611873565b5050565b908160011b91808304600214901517156109ec57565b839492916118c281836116c8565b93906118e160206118d8610d92611498856113bc565b16151591611df3565b9788911561198357506118f5905187610a0d565b6118ff825161189e565b14611914575b505050505050505f905f905f90565b86866001928251611971575b50505061192e575b80611905565b6119419261193b91610a0d565b906116c8565b506020815191012090602081519101201461195f5780808080611928565b61196a915190610a0d565b6001915f90565b61197b9350611f5c565b86865f611920565b611994939495965061073a92611f5c565b6119ed576119a59261193b91610a0d565b50908151602081145f146119cd575060206119c5920151925b5190610a0d565b916001929190565b80156119e15760206119c5930120926119be565b505050505f905f905f90565b50505050505f905f905f90565b91909293611a08825161189e565b851015611ab25750610d92611498611a2a92611a248760011c90565b906113c9565b60018416611aa95760041c600f16915b905f925b60ff81168410611a895750611a5392506116c8565b5080518015611a7e576119c59160208203611a7457602091500151916109de565b60200120916109de565b5050505f905f905f90565b90916001611a9d82610de960ff9487611cc6565b94019392919050611a3e565b600f1691611a3a565b9290509392935f915b60108310611af557611acd92506116c8565b50602081519101209060208151910120145f14611aec57600191905f90565b5f915081908190565b90611b0681610de960019385611cc6565b92019190611abb565b929190918160c060ff611b29610d92610d8487898b610c58565b1610610e925760f860ff611b44610d92610d8487898b610c58565b1610611cb75780610de9610de3610dde610dd9610d92610d84611b68978b8d610c58565b7fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef611b9482868861201a565b03611ca857610753610753611bb7611bb0611bbe94888a611252565b8789611252565b868861201a565b6001600160a01b03918216911603611c9957611bdb908284611252565b905f91611bef610d92610d84838588610c58565b60ff811694906080861015611c1d5750505050505b03611c0e57600190565b6355e97b0d60e01b5f5260045ffd5b9091929394608081145f14611c38575050505050505f611c04565b60a010610e9257610de3611c4e91939293610d0e565b915f935b838510611c63575050505050611c04565b9091929394611c7460019160081b90565b611c8d610de3610d92610d846110f68b6110f18b6109de565b17950193929190611c52565b634cd4b7b160e01b5f5260045ffd5b6324da545d60e11b5f5260045ffd5b50611cc1826109de565b611b68565b9081518110156113ad57611ce0610d9261149883856113c9565b9160ff83166080811015611cf75750505050600190565b60b8811015611d1257505050610de3610dde610cf892610d0e565b60c0811015611d7e575091610de3611d2991610d34565b905f925f915b838310611d4657505050906110f1610cf8926109f1565b909193611d5560019160081b90565b611d74610de3610d92611498611d6e8a6110f1896109de565b886113c9565b1794019190611d2f565b60f81115611d97575050610de3610dde610cf892610d21565b91610de3611da491610cfb565b905f925f915b838310611dc157505050906110f1610cf8926109f1565b909193611dd060019160081b90565b611de9610de3610d92611498611d6e8a6110f1896109de565b1794019190611daa565b90815115610b2b57611e0a610d92611498846113bc565b6010811615611ed957611e2d611e28611e23855161189e565b610bc9565b611696565b9060f81b600f60f81b165f1a611e42826113bc565b5360015b8351811015611ed45780611e81611e71611e68610d926114986001968a6113c9565b60041c600f1690565b60f81b6001600160f81b03191690565b611e9a611e90611e238461189e565b915f1a91856113c9565b53611ec1600f611eb0610d92611498858a6113c9565b1660f81b6001600160f81b03191690565b611ecd611e908361189e565b5301611e46565b509150565b50611eef611e28611eea845161189e565b610bba565b60015b8351811015611ed45780611f14611e71611e68610d926114986001968a6113c9565b611f28611e90611f2384610bc9565b61189e565b53611f3e600f611eb0610d92611498858a6113c9565b611f55611e90611f50611f2385610bc9565b6109de565b5301611ef2565b919091611f6a825184610a0d565b611f74825161189e565b10612013575f5b825181101561200a57611f97611f918286610a0d565b60011690565b611fec57611fc0611e68610d92611498611fba611fb4868a610a0d565b60011c90565b866113c9565b60ff611fd5610de3610d9261149886896113c9565b911603611fe457600101611f7b565b505050505f90565b600f612004610d92611498611fba611fb4868a610a0d565b16611fc0565b50505050600190565b5050505f90565b9190600560fd1b906001600160f81b03199061203890849086610c58565b35160361204757016001013590565b63f0ff325b60e01b5f5260045ffdfea26469706673582212209a126280f4165fa90c369d1d37a2ccf7a3b954b2d3507912d0882b0a958f5f3a64736f6c634300081e0033","sourceMap":"426:4780:21:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;;;;;-1:-1:-1;;426:4780:21;;;;2363:15:20;-1:-1:-1;;;;;426:4780:21;2349:10:20;:29;2345:56;;2411:27;426:4780:21;;-1:-1:-1;;426:4780:21;;;;2345:56:20;2387:14;;;426:4780:21;2387:14:20;426:4780:21;;2387:14:20;426:4780:21;;;;;;;;;;-1:-1:-1;;426:4780:21;;;;1263:29:20;426:4780:21;;;-1:-1:-1;;;;;426:4780:21;;;;;;;;;;;;;;-1:-1:-1;;426:4780:21;;;;;;;963:39:20;426:4780:21;;;;;;;;;-1:-1:-1;;426:4780:21;;;;;;1407:31:20;426:4780:21;;;;;;;;;;;;;;;;-1:-1:-1;;426:4780:21;;;;;;;;;;;;;;;;;;;-1:-1:-1;;426:4780:21;;;;4808:396;;:::i;:::-;;;:::i;:::-;4935:30;;:::i;:::-;4906:59;426:4780;;5686:14:20;426:4780:21;;5686:14:20;426:4780:21;5695:5:20;426:4780:21;;5695:5:20;426:4780:21;;5636:138:20;4906:59:21;5012:23;;5008:57;;426:4780;;-1:-1:-1;;;5081:62:21;;5112:10;426:4780;5081:62;;426:4780;;;;;;;;5081:62;426:4780;;;-1:-1:-1;;;;;;5088:13:21;426:4780;5081:62;;;;;;;426:4780;5081:62;;;426:4780;5080:63;;5076:122;;426:4780;5076:122;5166:21;;;426:4780;5166:21;426:4780;;5166:21;5081:62;;;;;;;;;;;;;;;:::i;:::-;;;;;:::i;:::-;;;;;;;;;;;:::i;5008:57::-;5044:21;;;426:4780;5044:21;426:4780;;5044:21;426:4780;;;;;;-1:-1:-1;;426:4780:21;;;;;;;1085:3:20;426:4780:21;;;;;;;;;-1:-1:-1;;426:4780:21;;;;;;735:38;-1:-1:-1;;;;;426:4780:21;;;;;;;;;;;;-1:-1:-1;;426:4780:21;;;;;;;;;;;;;;;;;;;-1:-1:-1;;426:4780:21;;;;;1336:25:20;426:4780:21;;;;;;;;;;;;;-1:-1:-1;;426:4780:21;;;;2113:15:20;-1:-1:-1;;;;;426:4780:21;2099:10:20;:29;2095:56;;2161:26;426:4780:21;;-1:-1:-1;;426:4780:21;2183:4:20;426:4780:21;;;;;;;;;;-1:-1:-1;;426:4780:21;;;;;;873:42:20;-1:-1:-1;;;;;426:4780:21;;;;;;;;;;;;-1:-1:-1;;426:4780:21;;;;;727:35:20;426:4780:21;;;;;;;;;;;;;-1:-1:-1;;426:4780:21;;;;;;2783:388;;:::i;:::-;2972:11;;;:::i;:::-;426:4780;;-1:-1:-1;;;3000:74:21;;3035:10;426:4780;3000:74;;426:4780;3055:4;426:4780;;;;;;;;;;;;;;-1:-1:-1;;;;;;3007:13:21;426:4780;3000:74;;;;;;;-1:-1:-1;3000:74:21;;;426:4780;2999:75;;2995:134;;3152:11;;;:::i;:::-;426:4780;3000:74;;;;426:4780;3000:74;426:4780;3000:74;;;;;;;:::i;:::-;;;;426:4780;;;;;;-1:-1:-1;;426:4780:21;;;;;;;;1901:15;-1:-1:-1;;;;;426:4780:21;1887:10;:29;1883:56;;1953:6;426:4780;;;;;1949:34;;1997:25;;1993:56;;2063:26;;2059:58;;2180:43;426:4780;2233:44;426:4780;-1:-1:-1;426:4780:21;2180:43;426:4780;;2180:43;2233:44;426:4780;;2233:44;2292:106;426:4780;2354:43;2180;426:4780;2233:44;426:4780;2354:43;;:::i;:::-;426:4780;;-1:-1:-1;;;2292:106:21;;1887:10;426:4780;2292:106;;426:4780;2347:4;426:4780;;;;;;;;;;;;;;;;;;;;;2292:106;;426:4780;-1:-1:-1;2299:13:21;-1:-1:-1;;;;;426:4780:21;2292:106;;;;;;;-1:-1:-1;2292:106:21;;;426:4780;2291:107;;2287:174;;2470:13;426:4780;;;1953:6;426:4780;;;1953:6;426:4780;;2292:106;;;;426:4780;2292:106;426:4780;2292:106;;;;;;;:::i;:::-;;;;2059:58;2098:19;;;-1:-1:-1;2098:19:21;426:4780;-1:-1:-1;2098:19:21;1993:56;2031:18;;;-1:-1:-1;2031:18:21;426:4780;-1:-1:-1;2031:18:21;1949:34;1968:15;;;-1:-1:-1;1968:15:21;426:4780;-1:-1:-1;1968:15:21;426:4780;;;;;;-1:-1:-1;;426:4780:21;;;;;;;:::i;:::-;;;;;;;;;;;;;;;-1:-1:-1;;426:4780:21;;;;;768:35:20;426:4780:21;;;;;;;;;;;;;-1:-1:-1;;426:4780:21;;;;;;;;;;;;;;;;;;;;;;;;;;3397:17;;;;:::i;:::-;2843:6:20;426:4780:21;2842:7:20;;426:4780:21;;;;2842:7:20;;426:4780:21;;2842:7:20;;426:4780:21;2842:7:20;2838:31;;2897:14;426:4780:21;2883:28:20;;-1:-1:-1;;;;;426:4780:21;;-1:-1:-1;;;;;426:4780:21;;;2883:28:20;:10;:28;;;:44;;;426:4780:21;2879:77:20;;2990:12;2970:32;;2966:66;;1085:3;3046:32;2990:12;;3046:32;:::i;:::-;:53;3042:85;;3164:28;;3206:29;;3202:64;;426:4780:21;;;;;:::i;:::-;;;;;;3280:22:20;:41;3276:75;;3365:49;;;:::i;:::-;:70;3361:104;;3530:56:21;3568:17;;;;:::i;:::-;3530:56;;:::i;:::-;3632:16;3600:100;3601:99;426:4780;3632:16;;;;;;;:::i;:::-;3650;;;;;;;:::i;:::-;3668:17;;;;;;;:::i;:::-;3601:99;;;;:::i;3600:100::-;3596:159;;3887:14;3869:16;3808:157;3869:16;3809:156;3869:16;;:::i;:::-;3937:14;;3918:17;;3903:13;;3887:14;;426:4780;;3887:14;3809:156;:::i;3808:157::-;3804:217;;;;:::i;:::-;3988:22;;;-1:-1:-1;3988:22:21;426:4780;-1:-1:-1;3988:22:21;3596:159;3723:21;;;-1:-1:-1;3723:21:21;426:4780;-1:-1:-1;3723:21:21;3361:104:20;3444:21;;;-1:-1:-1;3444:21:20;426:4780:21;-1:-1:-1;3444:21:20;3276:75;3330:21;;;-1:-1:-1;3330:21:20;426:4780:21;-1:-1:-1;3330:21:20;3202:64;3244:22;;;-1:-1:-1;3244:22:20;426:4780:21;-1:-1:-1;3244:22:20;3042:85;3108:19;;;-1:-1:-1;3108:19:20;426:4780:21;-1:-1:-1;3108:19:20;2966:66;3011:21;;;-1:-1:-1;3011:21:20;426:4780:21;-1:-1:-1;3011:21:20;2879:77;2936:20;;;-1:-1:-1;2936:20:20;426:4780:21;-1:-1:-1;2936:20:20;2883:44;2916:11;2915:12;2916:11;;:::i;2915:12::-;2883:44;;2838:31;2858:11;;;-1:-1:-1;2858:11:20;426:4780:21;-1:-1:-1;2858:11:20;426:4780:21;;;;;;-1:-1:-1;;426:4780:21;;;;;;1444:18:20;426:4780:21;;;;;;;;;;;;;;;;;;-1:-1:-1;;426:4780:21;;;;;1367:34:20;426:4780:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;:::i;:::-;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;1814:1:25;426:4780:21;;;;;;;:::o;:::-;;:::i;:::-;1984:1:23;426:4780:21;;;1984:1:23;426:4780:21;;;:::o;:::-;;3908:2:25;426:4780:21;;;;;;;:::o;:::-;;;;;;;;;;:::o;2519:133:20:-;2584:17;426:4780:21;2584:21:20;;;:61;;;;2577:68;2519:133;:::o;2584:61::-;2609:15;;;:36;;2519:133;:::o;426:4780:21:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;5203:157:20:-;426:4780:21;5261:6:20;426:4780:21;;;;5260:7:20;5256:31;;5315:15;-1:-1:-1;;;;;426:4780:21;5301:10:20;:29;5297:56;;5203:157::o;3533:184::-;3585:11;;:::i;:::-;3581:36;;-1:-1:-1;;;;;426:4780:21;;3628:27:20;426:4780:21;;3628:27:20;426:4780:21;3653:1:20;3665:14;426:4780:21;3653:1:20;3689:21;426:4780:21;3533:184:20:o;3581:36::-;3605:12;;;;;;;;5438:139;5527:20;426:4780:21;5550:20:20;426:4780:21;;;;;;;;5438:139:20;:::o;3797:259::-;3850:17;426:4780:21;3850:21:20;;;:60;;;;3797:259;3846:204;;;3797:259::o;3846:204::-;3949:10;426:4780:21;-1:-1:-1;426:4780:21;;;;;;;;;-1:-1:-1;426:4780:21;3973:33:20;426:4780:21;;;;;;;;;3973:33:20;426:4780:21;3973:33:20;;:::i;:::-;3797:259::o;3850:60::-;3875:15;;;:35;3850:60;;;4115:318;4200:6;426:4780:21;;;;;;4199:7:20;4195:31;;426:4780:21;;4236:55:20;;4305:11;;:::i;:::-;4301:47;;-1:-1:-1;426:4780:21;;;-1:-1:-1;4358:68:20;;4115:318::o;4358:68::-;4408:18;;;-1:-1:-1;4408:18:20;;-1:-1:-1;4408:18:20;4301:47;4325:23;;;-1:-1:-1;4325:23:20;;-1:-1:-1;4325:23:20;4236:55;4268:23;;;-1:-1:-1;4268:23:20;;-1:-1:-1;4268:23:20;4479:187;4558:10;-1:-1:-1;;;;;426:4780:21;;4541:27:20;426:4780:21;;;4541:27:20;426:4780:21;4616:9:20;4598:15;426:4780:21;4598:15:20;;426:4780:21;;;4578:47:20;426:4780:21;4635:24:20;426:4780:21;4479:187:20:o;426:4780:21:-;-1:-1:-1;;426:4780:21;;;;;;;;:::o;:::-;-1:-1:-1;;426:4780:21;;;;;;;;:::o;:::-;;;;;;;;;;:::o;:::-;;;;;;;;-1:-1:-1;;426:4780:21;;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;-1:-1:-1;426:4780:21;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;:::o;:::-;;:::i;:::-;;;;;;;;;:::o;3219:769:19:-;;3335:33;;;;:::i;:::-;3539:13;3551:1;3554:5;3558:1;3554:5;;;;-1:-1:-1;;;;426:4780:21;-1:-1:-1;;;;;;426:4780:21;3740:19:19;;426:4780:21;;3740:19:19;;:::i;:::-;;426:4780:21;3740:27:19;3736:60;;426:4780:21;;;;;;;3858:94:19;426:4780:21;3858:94:19;;;3219:769::o;3736:60::-;3776:20;;;3551:1;3776:20;;3551:1;3776:20;3539:13;3585:28;;426:4780:21;3585:28:19;;;;:::i;:::-;426:4780:21;;3539:13:19;;720:484:23;426:4780:21;;720:484:23;;;;1148:49;720:484;;426:4780:21;;;:::i;:::-;;;;;:::i;:::-;1148:49:23;;:::i;:::-;720:484;:::o;426:4780:21:-;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;:::o;1136:1511:25:-;;;;;;;1384:1;1444:21;;;;;:52;;;1136:1511;1440:123;;1136:1511;1609:25;1615:18;;;1637:4;1615:18;426:4780:21;1615:18:25;;:::i;:::-;;-1:-1:-1;;;;;;426:4780:21;;;1615:18:25;426:4780:21;;;;1609:25:25;426:4780:21;1609:32:25;1605:57;;1682:18;;1705:4;426:4780:21;1676:25:25;1682:18;;;;;;;:::i;1676:25::-;426:4780:21;1676:33:25;1705:4;;1735:38;1740:32;:25;1746:18;;;1725:48;1746:18;1725:48;1746:18;;:::i;1740:25::-;:32;:::i;:::-;1735:38;:::i;:::-;426:4780:21;;;;1725:48:25;;;:::i;:::-;1905:13;;1384:1;1920:5;1924:1;1920:5;;;;2097:18;2091:25;2097:18;;;1637:4;2097:18;2091:32;2097:18;;:::i;2091:32::-;;2087:57;;2164:18;;1705:4;2158:33;:25;2164:18;;;;;;;:::i;2158:33::-;;1705:4;;2217:38;2222:32;:25;2228:18;;;2207:48;2228:18;2207:48;2228:18;;:::i;2207:48::-;2154:154;;1384:1;2352:155;2372:12;;;;;;2559:81;;;;;;:::i;2357:13::-;2410:27;;;426:4780:21;2410:27:25;;;;:::i;:::-;426:4780:21;;2357:13:25;;;2154:154;2286:11;;;;;:::i;:::-;2154:154;;;2087:57;1650:12;;;1384:1;2132:12;;1384:1;2132:12;1905:13;1951:27;426:4780:21;1951:27:25;;;;:::i;:::-;426:4780:21;;1905:13:25;;;;;1672:154;1804:11;;;;;:::i;:::-;1672:154;;1440:123;-1:-1:-1;1522:1:25;;-1:-1:-1;1512:11:25;;-1:-1:-1;1512:11:25;1440:123;;1444:52;1475:13;1492:4;426:4780:21;1469:20:25;1475:13;;;;;:::i;1469:20::-;426:4780:21;1469:27:25;1444:52;;4053:490:21;4108:18;;:::i;:::-;4155:14;426:4780;-1:-1:-1;;;;;426:4780:21;4136:33;-1:-1:-1;;;;;426:4780:21;;4765:27:20;426:4780:21;;4765:27:20;426:4780:21;4790:1:20;4802:14;426:4780:21;4790:1:20;4826:21;426:4780:21;;;4857:14:20;426:4780:21;;4857:14:20;426:4780:21;4790:1:20;426:4780:21;;4790:1:20;426:4780:21;;4717:228:20;4136:33:21;4236:13;4253:8;4236:25;4253:8;;426:4780;;-1:-1:-1;;;4341:44:21;;-1:-1:-1;;;;;426:4780:21;;;4341:44;;;426:4780;;;;;;;;4341:44;426:4780;;;;;4341:44;426:4780;-1:-1:-1;4348:13:21;-1:-1:-1;;;;;426:4780:21;4341:44;;;;;;;-1:-1:-1;4341:44:21;;;4232:253;4331:54;4232:253;4498:8;4494:42;;4053:490::o;4341:44::-;;;;;;;;;;;;;;:::i;:::-;;;;4232:253;426:4780;;-1:-1:-1;;;4426:48:21;;-1:-1:-1;;;;;426:4780:21;;;4426:48;;;426:4780;;;;;;;;4426:48;426:4780;;;;;4426:48;426:4780;-1:-1:-1;4433:13:21;-1:-1:-1;;;;;426:4780:21;4426:48;;;;;;;-1:-1:-1;4426:48:21;;;4232:253;4416:58;4232:253;;4426:48;;;;;;;;;;;;;;:::i;:::-;;;;2036:1012:19;2151:33;;;;:::i;:::-;2386:13;426:4780:21;2401:5:19;2405:1;2401:5;;;;2616:19;2610:26;2616:19;;;;;;:::i;2610:26::-;2646:19;426:4780:21;;;;;2679:13:19;2688:4;2679:13;;2675:338;2688:4;;;2708:20;;;;;2036:1012;:::o;2675:338::-;2759:27;2773:13;;;;;;;;:::i;2759:27::-;2805:13;426:4780:21;2800:203:19;2820:7;;;;;;2675:338;;;;;2036:1012;:::o;2805:13::-;2863:16;;;;;;426:4780:21;2863:16:19;426:4780:21;;;;2863:16:19;2862:55;2883:34;2889:27;;2901:14;:10;;;;:::i;:::-;:14;:::i;:::-;2889:27;;;:::i;2862:55::-;;426:4780:21;;2805:13:19;;;;;;2386;2432:28;;426:4780:21;2432:28:19;;;;:::i;:::-;426:4780:21;;2386:13:19;;738:1134;854:1;-1:-1:-1;;;;;;;;;908:19:19;;;;;:::i;:::-;426:4780:21;908:26:19;904:55;;-1:-1:-1;;;;;;;;;973:19:19;;;;;:::i;:::-;426:4780:21;973:27:19;426:4780:21;;1037:19:19;1016:49;1026:39;1031:33;:26;1037:19;;1016:49;1037:19;;;;:::i;1016:49::-;969:149;;1221:5;1204:13;:22;:48;;;;969:149;1200:642;;969:149;1852:13;;;738:1134;:::o;1200:642::-;854:1;1380:5;1384:1;1380:5;;;;-1:-1:-1;;;;1602:26:19;:19;;;;;;:::i;:::-;-1:-1:-1;;;;;;426:4780:21;;;1602:26:19;;1598:55;;-1:-1:-1;;;1671:27:19;:19;;;;;;:::i;:27::-;;426:4780:21;;1728:39:19;1733:33;:26;1739:19;;;1718:49;1739:19;1718:49;1739:19;;:::i;1718:49::-;1200:642;;;;1667:165;1806:11;;;;;:::i;:::-;1667:165;;1598:55;943:16;;;854:1;1637:16;;854:1;1637:16;1365:13;1415:28;;426:4780:21;1415:28:19;;;;:::i;:::-;426:4780:21;;1365:13:19;;1204:48;:13;1247:5;1204:13;1230:22;1204:48;;969:149;1096:11;1522:1:25;969:149:19;;;541:1316:24;;;642:21;;;;638:56;;720:19;726:12;;;;;;:::i;720:19::-;426:4780:21;;;;763:4:24;754:13;;763:4;;;817:10;;;;;;;:::i;750:1101::-;848:13;;;857:4;848:13;;857:4;;;912:10;;:28;:10;;926:13;912:10;:28;:10;;:::i;:::-;926:13;;:::i;844:1007::-;961:13;;;970:4;961:13;;970:4;;;1039:13;;1017:35;1039:13;;;;;:::i;1017:35::-;1066:18;426:4780:21;1103:13:24;426:4780:21;1098:194:24;1118:15;;;;;;1312:10;;;:33;:10;;;:24;:10;;:::i;1103:13::-;1164:11;;;;1199:1;1164:11;426:4780:21;;;;1164:11:24;1163:43;1179:27;1185:20;;1190:14;:10;;;;:::i;:14::-;1185:20;;;:::i;1163:43::-;;426:4780:21;;1103:13:24;;;;957:894;1366:13;;;1375:4;-1:-1:-1;1375:4:24;;;1428:10;:28;:10;;1442:13;1428:10;:28;:10;;:::i;:::-;1442:13;;:::i;1362:489::-;1534:13;;;1512:35;1534:13;;:::i;1512:35::-;1561:18;426:4780:21;1598:13:24;426:4780:21;1593:194:24;1613:15;;;;;;1807:10;;;:33;:10;;;:24;:10;;:::i;1598:13::-;1659:11;;;;1694:1;1659:11;426:4780:21;;;;1659:11:24;1658:43;1674:27;1680:20;;1685:14;:10;;;;:::i;1658:43::-;;426:4780:21;;1598:13:24;;;;638:56;672:22;;;426:4780:21;672:22:24;;426:4780:21;672:22:24;426:4780:21;;;;;;;;;:::o;:::-;;;;;;;;;;;;;:::o;1567:2467:23:-;;;;;;;-1:-1:-1;;;;;;;;;1809:13:23;;1567:2467;;1809:13;:::i;:::-;426:4780:21;1809:20:23;1805:50;;-1:-1:-1;;;;;;;;;1870:13:23;;;;;:::i;:::-;426:4780:21;1870:21:23;426:4780:21;;1984:15:23;1907:49;1929:27;:20;1935:13;;;;;:::i;1907:49::-;1984:15;:::i;:::-;1866:190;;;;2102:33;426:4780:21;2184:31:23;;;;;;4015:12;;;;;;;426:4780:21;1567:2467:23;:::o;2177:1828::-;2368:25;2321:33;426:4780:21;;;;;;:::i;:::-;2321:33:23;:::i;:::-;2368:25;;;:::i;:::-;426:4780:21;;;;;;2465:15:23;:30;2461:81;;-1:-1:-1;;;2641:15:23;:7;;;;:::i;:::-;426:4780:21;-1:-1:-1;;;;;;426:4780:21;;;2641:15:23;;426:4780:21;;2676:14:23;;;2689:1;-1:-1:-1;;;2712:15:23;:7;;;;:::i;:15::-;;;2708:97;;2637:1358;2839:32;;;;:::i;:::-;2903:2;2894:11;;2903:2;;3044:58;;;;:::i;:::-;3129:8;;;3125:26;;3177:21;;3173:38;;3280:21;2890:1040;;2177:1828;;;;;;3173:38;3200:11;;;;;;;2689:1;3200:11;:::o;3125:26::-;3139:12;;;;;;;426:4780:21;3139:12:23;:::o;2890:1040::-;3330:10;;-1:-1:-1;3339:1:23;3330:10;3339:1;;-1:-1:-1;3339:1:23;;3490:67;;;;;;:::i;:::-;3584:8;;;3580:75;;3680:21;;3676:87;;3831:21;3326:604;2890:1040;;3326:604;3899:12;;;;;;;;426:4780:21;3899:12:23;:::o;2708:97::-;2771:7;2751:35;;2765:21;:14;2771:7;;;;:::i;2751:35::-;2708:97;;1866:190;2044:1;1866:190;;;;;1805:50;1838:17;;;426:4780:21;1838:17:23;;426:4780:21;1838:17:23;3008:1033:25;;;;;;3233:26;3357:4;426:4780:21;3329:25:25;3335:18;;;;;;:::i;3329:25::-;426:4780:21;3329:32:25;3325:57;;3425:4;426:4780:21;3396:25:25;3402:18;;;;;;:::i;3396:25::-;426:4780:21;3396:33:25;3425:4;;3466:18;;3445:48;3455:38;3460:32;:25;3466:18;;3445:48;3466:18;;;;:::i;3445:48::-;3392:154;;3653:4;426:4780:21;3624:25:25;3630:18;;;;;;:::i;3624:25::-;426:4780:21;3624:33:25;3620:62;;-1:-1:-1;;;;;426:4780:21;3717:105:25;;;426:4780:21;3717:105:25;;;;3835:24;3831:57;;3898:12;3965:69;3898:12;;:::i;:::-;3965:69;;:::i;3831:57::-;3868:20;;;-1:-1:-1;3868:20:25;;-1:-1:-1;3868:20:25;3620:62;3666:16;;;;;;;;3392:154;3524:11;;;;:::i;:::-;3392:154;;;5001:139:20;5078:10;426:4780:21;-1:-1:-1;426:4780:21;;;;;;;;5113:20:20;426:4780:21;;;;;;;;5001:139:20;:::o;426:4780:21:-;;;;;;;;;;;:::i;:::-;2457:1:24;426:4780:21;;;-1:-1:-1;;426:4780:21;;;;;;:::o;:::-;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;;;;:::i;:::-;;;;;;;;:::o;2143:1860:24:-;426:4780:21;;2257:21:24;;;2253:56;;2335:19;2341:12;;;;;:::i;2335:19::-;426:4780:21;;;;2378:4:24;2369:13;;2378:4;;;2447:12;;;;;:::i;:::-;426:4780:21;;;-1:-1:-1;;;;;;426:4780:21;;2473:26:24;;426:4780:21;2473:26:24;:::i;:::-;;2513:18;2457:1;2513:18;:::o;2365:1632::-;2552:13;;;;;2561:4;2552:13;;2561:4;;;2626:13;;2609:30;2626:13;;:::i;2609:30::-;2675:17;;;;:::i;:::-;2711:13;426:4780:21;2726:10:24;;;;;;2904;;;;;;:::i;2711:13::-;2774:10;2769:20;;2774:14;2783:1;2774:10;;;;:::i;:14::-;2769:20;;:::i;:::-;426:4780:21;2757:32:24;;;;;:::i;:::-;;426:4780:21;2711:13:24;;2548:1449;2945:4;-1:-1:-1;2945:4:24;;;3014:13;2992:35;3014:13;;:::i;2992:35::-;426:4780:21;3078:13:24;426:4780:21;3093:15:24;;;;;;3302:17;;;;:::i;:::-;3338:13;426:4780:21;3353:10:24;;;;;;3545:15;;;;;:24;:15;;:::i;3338:13::-;3401:10;3396:34;;3401:28;3174:1;3401:10;:24;:10;;;;:::i;3396:34::-;426:4780:21;3384:46:24;;;;;:::i;:::-;;426:4780:21;3338:13:24;;3078;3139:11;3174:1;;426:4780:21;;3138:43:24;3154:27;3160:20;;3165:14;:10;;;;:::i;:14::-;3160:20;;:::i;3138:43::-;;426:4780:21;;3078:13:24;;2932:1065;3676:27;;;;;;:::i;:::-;3739:22;;;;:::i;:::-;3780:13;426:4780:21;3795:15:24;;;;;;3958:28;;;;;:::o;3780:13::-;3848:10;3843:16;;3848:10;426:4780:21;3848:10:24;;;:::i;3843:16::-;426:4780:21;3831:28:24;;;;;:::i;:::-;;426:4780:21;3780:13:24;;4233:351:23;4392:1;;4233:351;4403:153;426:4780:21;;4410:20:23;;;;;4456:26;;;;:::i;:::-;426:4780:21;;;;;;;;4446:36:23;426:4780:21;;4403:153:23;;;4410:20;;;4233:351::o;426:4780:21:-;;;;;;;;;7928:1:23;426:4780:21;;;;;;;:::o;7310:1816:23:-;;;;;7616:26;;;;:::i;:::-;7673:9;;7740:26;7686:4;7667:16;7673:9;;;;:::i;7667:16::-;:23;7666:30;;7740:26;;:::i;:::-;7777:1343;;;;;;426:4780:21;7885:26:23;426:4780:21;;7885:26:23;;:::i;:::-;7915:14;426:4780:21;;7915:14:23;:::i;:::-;7885:44;7881:546;;7777:1343;8441:29;;;;;;;7680:1;8441:29;7680:1;8441:29;7680:1;8441:29;:::o;7881:546::-;7949:22;;7967:4;426:4780:21;;;7989:114:23;;7881:546;8121:292;;;;;7881:546;;;;8121:292;8187:38;8202:22;;;;:::i;:::-;8187:38;;:::i;:::-;426:4780:21;7686:4:23;426:4780:21;;;;8251:20:23;426:4780:21;7686:4:23;426:4780:21;;;;8275:16:23;8251:40;8247:148;;8121:292;;;;;;8247:148;8333:26;426:4780:21;;8333:26:23;;:::i;:::-;7967:4;;7680:1;;8319:53::o;7989:114::-;8048:36;;;;:::i;:::-;7989:114;;;;;7777:1343;8535:37;8536:36;;;;;;;;:::i;8535:37::-;8531:105;;8676:38;8691:22;;;;:::i;8676:38::-;8728:12;;426:4780:21;;7686:4:23;8758:20;;8754:294;7686:4;;;8798:80;7686:4;9076:26;8798:80;;;8754:294;;426:4780:21;9076:26:23;;:::i;:::-;9062:47;9070:4;9062:47;;;:::o;8754:294::-;8902:18;;;;7686:4;9076:26;426:4780:21;;8947:18:23;8898:150;8754:294;;8898:150;9004:29;;;;7680:1;9004:29;7680:1;9004:29;7680:1;9004:29;:::o;8531:105::-;8592:29;;;;;7680:1;8592:29;7680:1;8592:29;7680:1;8592:29;:::o;5044:1795::-;;;;;5315:14;426:4780:21;;5315:14:23;:::i;:::-;5302:27;;;5298:630;;5998:13;5994:18;;5988:25;5998:13;;;426:4780:21;;;;5998:13:23;5994:18;;:::i;5988:25::-;426:4780:21;;;6027:13:23;;426:4780:21;;;;6023:122:23;;6244:13;-1:-1:-1;6239:165:23;6259:10;426:4780:21;;;6259:10:23;;;;6441:28;;;;;:::i;:::-;426:4780:21;;;6483:20:23;;6479:96;;6812:13;;6630:2;6611:21;;6630:2;;;6648:73;;;;6607:181;6812:13;:::i;6607:181::-;6630:2;426:4780:21;6758:19:23;6607:181;6812:13;:::i;6479:96::-;6519:29;;;-1:-1:-1;6519:29:23;-1:-1:-1;6519:29:23;-1:-1:-1;6519:29:23;:::o;6244:13::-;6302:32;;426:4780:21;6286:48:23;6302:32;;426:4780:21;6302:32:23;;;:::i;6286:48::-;426:4780:21;;;;6244:13:23;;-1:-1:-1;6244:13:23;;6023:122;6130:4;6121:13;6023:122;;;5298:630;5401:32;;;;;;-1:-1:-1;5447:179:23;5467:6;5471:2;5467:6;;;;5667:27;;;;:::i;:::-;426:4780:21;;;;;;5712:20:23;426:4780:21;;;;;;5736:16:23;5712:40;5708:210;5736:16;;;426:4780:21;5772:36:23;;-1:-1:-1;5772:36:23;:::o;5708:210::-;-1:-1:-1;;;;;;;5874:29:23:o;5452:13::-;5509:31;5494:46;5509:31;;426:4780:21;5509:31:23;;;:::i;5494:46::-;426:4780:21;;5452:13:23;;;;4358:1914:25;;;;;4558:29;4660:4;426:4780:21;4632:25:25;4638:18;;;;;;:::i;4632:25::-;426:4780:21;4632:32:25;4628:57;;4728:4;426:4780:21;4699:25:25;4705:18;;;;;;:::i;4699:25::-;426:4780:21;4699:33:25;4728:4;;4769:18;4748:48;4758:38;4763:32;:25;4769:18;;4748:48;4769:18;;;;:::i;4748:48::-;735:66;4925:33;;;;;:::i;:::-;4972:30;4968:64;;5316:27;5261:33;5204:27;5115;5308:36;5115:27;;;;:::i;:::-;5204;;;:::i;:::-;5261:33;;;:::i;5308:36::-;-1:-1:-1;;;;;426:4780:21;;;;;5308:49:25;5304:81;;5457:33;;;;;:::i;:::-;5528:17;426:4780:21;5594:18:25;5588:25;5594:18;;;;;;:::i;5588:25::-;426:4780:21;;;;;5644:4:25;5631:17;;5644:4;;;5668:22;;;;;5627:541;6191:27;6187:56;;6261:4;4358:1914;:::o;6187:56::-;6227:16;;;426:4780:21;6227:16:25;;426:4780:21;6227:16:25;5627:541;5715:18;;;;;5644:4;5715:18;;5711:457;5644:4;;;5753:13;;;;;;426:4780:21;5627:541:25;;5711:457;5805:4;-1:-1:-1;5805:4:25;;5843:17;5829:31;5843:17;;;;;:::i;5829:31::-;5883:13;426:4780:21;5878:218:25;5898:7;;;;;;5787:381;;;;;5627:541;;5883:13;5943:14;;;;;;5987:1;5943:14;426:4780:21;;;;5943:14:25;5942:52;5961:33;5967:26;;5978:14;:10;;;;:::i;5942:52::-;;426:4780:21;;5883:13:25;;;;;;5304:81;5366:19;;;426:4780:21;5366:19:25;;426:4780:21;5366:19:25;4968:64;5011:21;;;426:4780:21;5011:21:25;;426:4780:21;5011:21:25;4695:154;4827:11;;;;:::i;:::-;4695:154;;4217:1141:24;;426:4780:21;;4321:21:24;;;4317:56;;4399:19;4405:12;;;;;:::i;4399:19::-;426:4780:21;;;;4442:4:24;4433:13;;4442:4;;;4462:8;;;;4469:1;4462:8;:::o;4429:923::-;4500:4;4491:13;;4500:4;;;4532:13;;;4527:19;4532:13;4520:26;4532:13;;:::i;4487:865::-;4576:4;4567:13;;4576:4;;;4618:13;;;4596:35;4618:13;;:::i;4596:35::-;4645:18;426:4780:21;4682:13:24;426:4780:21;4677:194:24;4697:15;;;;;;4891;;;;;:24;:15;;:::i;4682:13::-;4743:11;;;;4778:1;4743:11;426:4780:21;;;;4743:11:24;4742:43;4758:27;4764:20;;4769:14;:10;;;;:::i;:14::-;4764:20;;:::i;4742:43::-;;426:4780:21;;4682:13:24;;;;4563:789;4945:4;-1:-1:-1;4945:4:24;;;4977:13;;4972:19;4977:13;4965:26;4977:13;;:::i;4932:420::-;5044:13;;5022:35;5044:13;;:::i;5022:35::-;5071:18;426:4780:21;5108:13:24;426:4780:21;5103:194:24;5123:15;;;;;;5317;;;;;:24;:15;;:::i;5108:13::-;5169:11;;;;5204:1;5169:11;426:4780:21;;;;5169:11:24;5168:43;5184:27;5190:20;;5195:14;:10;;;;:::i;5168:43::-;;426:4780:21;;5108:13:24;;;;9295:1058:23;;426:4780:21;;9395:19:23;9391:39;;9459:17;9465:10;;;;:::i;9459:17::-;9512:4;9500:16;;9499:23;9512:4;;9596:33;9606:22;:18;426:4780:21;;9606:18:23;:::i;:::-;:22;:::i;:::-;9596:33;:::i;:::-;426:4780:21;;;-1:-1:-1;;;426:4780:21;9413:1:23;9643:36;;426:4780:21;9643:36:23;:::i;:::-;;9627:1;9698:13;426:4780:21;;9713:18:23;;;;;9785:10;9772:30;9779:22;:17;9785:10;;9627:1;9785:10;;;:::i;9779:17::-;426:4780:21;;;;;;9779:22:23;426:4780:21;;-1:-1:-1;;;;;;426:4780:21;;;9772:30:23;9752:50;9759:9;:5;;;:::i;:9::-;9752:50;9413:1;9752:50;;;;:::i;:::-;;9836:32;9674:4;9843:17;9849:10;;;;;:::i;9843:17::-;:24;426:4780:21;;-1:-1:-1;;;;;;426:4780:21;;;9836:32:23;9820:48;9827:5;;;:::i;9820:48::-;;426:4780:21;9698:13:23;;9713:18;-1:-1:-1;9713:18:23;-1:-1:-1;9295:1058:23:o;9562:761::-;426:4780:21;9993:33:23;10003:22;:18;426:4780:21;;10003:18:23;:::i;:::-;:22;:::i;9993:33::-;10057:1;10045:13;426:4780:21;;10060:18:23;;;;;10134:10;10121:30;10128:22;:17;10134:10;;10057:1;10134:10;;;:::i;10121:30::-;10099:52;10106:11;10107:5;;;:::i;:::-;10106:11;:::i;10099:52::-;;10195:32;10222:4;10202:17;10208:10;;;;;:::i;10195:32::-;10169:58;10176:15;:11;10177:5;;;:::i;10176:11::-;:15;:::i;10169:58::-;;426:4780:21;10045:13:23;;10590:651;;;;10709:23;426:4780:21;;10709:23:23;;:::i;:::-;10735:14;426:4780:21;;10735:14:23;:::i;:::-;-1:-1:-1;10705:58:23;;-1:-1:-1;10779:13:23;426:4780:21;;10794:18:23;;;;;10862:16;10863:10;;;;:::i;:::-;426:4780:21;;;;10862:16:23;10863:10;;10915:33;:28;10921:21;;10925:16;10926:10;;;;:::i;:::-;426:4780:21;;;;10925:16:23;10921:21;;:::i;10915:33::-;426:4780:21;11067:30:23;11080:17;11086:10;;;;;:::i;11067:30::-;426:4780:21;;11067:30:23;11063:81;;426:4780:21;;10779:13:23;;11063:81;11117:12;;;;-1:-1:-1;11117:12:23;:::o;10858:191::-;11030:4;10999:28;11005:21;;11009:16;11010:10;;;;:::i;10999:28::-;:35;10858:191;;10794:18;;;;;426:4780:21;10590:651:23;:::o;10705:58::-;10751:12;;;-1:-1:-1;10751:12:23;:::o;5563:305:24:-;;;-1:-1:-1;;;426:4780:21;-1:-1:-1;;;;;;426:4780:21;5670:12:24;;5563:305;;;5670:12;:::i;:::-;;426:4780:21;5670:20:24;5666:50;;5750:89;;;;;5563:305::o;5666:50::-;5699:17;;;-1:-1:-1;5699:17:24;;-1:-1:-1;5699:17:24","linkReferences":{},"immutableReferences":{"40183":[{"start":358,"length":32},{"start":1018,"length":32},{"start":1383,"length":32},{"start":2677,"length":32}],"40191":[{"start":1100,"length":32},{"start":2106,"length":32}],"40193":[{"start":498,"length":32},{"start":2072,"length":32}],"40607":[{"start":709,"length":32},{"start":896,"length":32},{"start":1262,"length":32},{"start":1544,"length":32},{"start":2140,"length":32},{"start":3955,"length":32},{"start":4101,"length":32}]}},"methodIdentifiers":{"MAX_BLOCK_LOOKBACK()":"3d2691bc","bond(uint256)":"9940686e","bondAmount()":"80f323a7","bondedExecutor()":"1aa7c0ec","cancellationRequest()":"308657d7","collect((bytes,bytes,bytes,bytes,uint256),uint256)":"ede7f6a3","currentPaymentAmount()":"8bd03d0a","currentRewardAmount()":"5a4fd645","executionDeadline()":"33ee5f35","expectedAmount()":"2feef2ec","expectedRecipient()":"8677ab23","fund(uint256,uint256)":"a65e2cfd","funded()":"f3a504f2","is_bonded()":"cb766a56","originalRewardAmount()":"d415b3f9","requestCancellation()":"81972d00","resume()":"046f7da2","tokenContract()":"55a373d6","totalBondsDeposited()":"fe03a460","withdraw()":"3ccfd60b"},"rawMetadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_tokenContract\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_expectedRecipient\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_expectedAmount\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_currentRewardAmount\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_currentPaymentAmount\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"AlreadyFunded\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"AmountMismatch\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"BlockHashUnavailable\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"BlockHeaderMismatch\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"BlockNumberMismatch\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"BondActive\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"CancellationRequested\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ExecutorAlreadyBonded\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ExpectedBytes32\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ExpectedRLPList\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InsufficientBond\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidAddress\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidRLP\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidRLPEncoding\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidRLPList\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidReceiptProof\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidTransferEvent\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"NoWithdrawableFunds\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"NotFunded\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OnlyBondedExecutor\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OnlyDeployer\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"RLPOffsetOutOfBounds\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"TargetBlockInFuture\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"TargetBlockTooOld\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ToAddressMismatch\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"TokenTransferFailed\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"WrongEventSignature\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"WrongTokenContract\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ZeroAddress\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ZeroPaymentAmount\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ZeroRewardAmount\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"MAX_BLOCK_LOOKBACK\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_bondAmount\",\"type\":\"uint256\"}],\"name\":\"bond\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"bondAmount\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"bondedExecutor\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"cancellationRequest\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes\",\"name\":\"blockHeader\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"receiptRlp\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"proofNodes\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"receiptPath\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"logIndex\",\"type\":\"uint256\"}],\"internalType\":\"struct EscrowERC20.ReceiptProof\",\"name\":\"proof\",\"type\":\"tuple\"},{\"internalType\":\"uint256\",\"name\":\"targetBlockNumber\",\"type\":\"uint256\"}],\"name\":\"collect\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"currentPaymentAmount\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"currentRewardAmount\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"executionDeadline\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"expectedAmount\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"expectedRecipient\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_currentRewardAmount\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_currentPaymentAmount\",\"type\":\"uint256\"}],\"name\":\"fund\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"funded\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"is_bonded\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"originalRewardAmount\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"requestCancellation\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"resume\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"tokenContract\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"totalBondsDeposited\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"withdraw\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"src/EscrowERC20.sol\":\"EscrowERC20\"},\"evmVersion\":\"prague\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[\":forge-std/=lib/forge-std/src/\"],\"viaIR\":true},\"sources\":{\"src/BlockHeaderParser.sol\":{\"keccak256\":\"0xf8a84bae1ea886c0519edb32e55f4c661d1e1cb036550967502148d033f08550\",\"license\":\"UNLICENSED\",\"urls\":[\"bzz-raw://766da07581e5dac7eda20d25debe9c381ed466204608502522b53266624bafa6\",\"dweb:/ipfs/QmPyjTUV3zL6h9oeQjbbbw3WiypQQYqdws6vTWSAXRUg7p\"]},\"src/EscrowBase.sol\":{\"keccak256\":\"0x53fd262562c9dbc7779339bafbeca6b86b690aec7ac864e30c57e0e42288a11d\",\"license\":\"UNLICENSED\",\"urls\":[\"bzz-raw://cb43380f5b0a131e1ac4405a43a67b9d2b07718eb05ba675fe46c106b8a12649\",\"dweb:/ipfs/QmNk5QkryXnDspEGc8mdyFYJSRXWRSP8V6yirLC98EKZYG\"]},\"src/EscrowERC20.sol\":{\"keccak256\":\"0xa89659e0421fe81fdfeccaaf40ba35578a6fb702a5599fe9a480eb7a2f85854d\",\"license\":\"UNLICENSED\",\"urls\":[\"bzz-raw://72ca9d806f4b8e56594d971dc4064c0819bf605543c3d88d997ecb16526b094c\",\"dweb:/ipfs/QmTccPEBt3CruNEFZfGpHB2weSnN4Fe2Nc88pvdc4wtxw4\"]},\"src/MPTVerifier.sol\":{\"keccak256\":\"0xf71ff6fc0fa054681fc67b7ca3c187141749b04895defd977d6989271b35ebeb\",\"license\":\"UNLICENSED\",\"urls\":[\"bzz-raw://6e2efbdee9d872e22febc5d29894e3759e72ed43850a512c9eed56a9f5e7ff3b\",\"dweb:/ipfs/QmShY9TstL2zXVSYH7ux8D6ByW22ptm7JfiEWy2qs7bHZU\"]},\"src/RLPParser.sol\":{\"keccak256\":\"0x403e6fd0cbf2e3599530d724d26e75b136bd7947e35e1cf5f79b30841b2c4c6c\",\"license\":\"UNLICENSED\",\"urls\":[\"bzz-raw://b24f44c75ae8db00297a940d0badb6b0fd9114b494b1a5c097a04f4bccde5e1d\",\"dweb:/ipfs/QmSoxh5vZu41RzAs8RTLXgQ5cD5pQBeQo68nYSFh4Dk5Xk\"]},\"src/ReceiptValidator.sol\":{\"keccak256\":\"0x625137f131a6524c06e6c7c6ddc4c3f10256ac8a306b53b2dfed4fe9a3ed9728\",\"license\":\"UNLICENSED\",\"urls\":[\"bzz-raw://611b99fa26ae364ea2e0aa721f62ca043ca6d5b0e2bc1c96278639792242f43f\",\"dweb:/ipfs/QmXFkR6amwaZF1QZqZjsneEXBz8C17QmCFyirmHo7eaUaH\"]}},\"version\":1}","metadata":{"compiler":{"version":"0.8.30+commit.73712a01"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"address","name":"_tokenContract","type":"address"},{"internalType":"address","name":"_expectedRecipient","type":"address"},{"internalType":"uint256","name":"_expectedAmount","type":"uint256"},{"internalType":"uint256","name":"_currentRewardAmount","type":"uint256"},{"internalType":"uint256","name":"_currentPaymentAmount","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"type":"error","name":"AlreadyFunded"},{"inputs":[],"type":"error","name":"AmountMismatch"},{"inputs":[],"type":"error","name":"BlockHashUnavailable"},{"inputs":[],"type":"error","name":"BlockHeaderMismatch"},{"inputs":[],"type":"error","name":"BlockNumberMismatch"},{"inputs":[],"type":"error","name":"BondActive"},{"inputs":[],"type":"error","name":"CancellationRequested"},{"inputs":[],"type":"error","name":"ExecutorAlreadyBonded"},{"inputs":[],"type":"error","name":"ExpectedBytes32"},{"inputs":[],"type":"error","name":"ExpectedRLPList"},{"inputs":[],"type":"error","name":"InsufficientBond"},{"inputs":[],"type":"error","name":"InvalidAddress"},{"inputs":[],"type":"error","name":"InvalidRLP"},{"inputs":[],"type":"error","name":"InvalidRLPEncoding"},{"inputs":[],"type":"error","name":"InvalidRLPList"},{"inputs":[],"type":"error","name":"InvalidReceiptProof"},{"inputs":[],"type":"error","name":"InvalidTransferEvent"},{"inputs":[],"type":"error","name":"NoWithdrawableFunds"},{"inputs":[],"type":"error","name":"NotFunded"},{"inputs":[],"type":"error","name":"OnlyBondedExecutor"},{"inputs":[],"type":"error","name":"OnlyDeployer"},{"inputs":[],"type":"error","name":"RLPOffsetOutOfBounds"},{"inputs":[],"type":"error","name":"TargetBlockInFuture"},{"inputs":[],"type":"error","name":"TargetBlockTooOld"},{"inputs":[],"type":"error","name":"ToAddressMismatch"},{"inputs":[],"type":"error","name":"TokenTransferFailed"},{"inputs":[],"type":"error","name":"WrongEventSignature"},{"inputs":[],"type":"error","name":"WrongTokenContract"},{"inputs":[],"type":"error","name":"ZeroAddress"},{"inputs":[],"type":"error","name":"ZeroPaymentAmount"},{"inputs":[],"type":"error","name":"ZeroRewardAmount"},{"inputs":[],"stateMutability":"view","type":"function","name":"MAX_BLOCK_LOOKBACK","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[{"internalType":"uint256","name":"_bondAmount","type":"uint256"}],"stateMutability":"nonpayable","type":"function","name":"bond"},{"inputs":[],"stateMutability":"view","type":"function","name":"bondAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"bondedExecutor","outputs":[{"internalType":"address","name":"","type":"address"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"cancellationRequest","outputs":[{"internalType":"bool","name":"","type":"bool"}]},{"inputs":[{"internalType":"struct EscrowERC20.ReceiptProof","name":"proof","type":"tuple","components":[{"internalType":"bytes","name":"blockHeader","type":"bytes"},{"internalType":"bytes","name":"receiptRlp","type":"bytes"},{"internalType":"bytes","name":"proofNodes","type":"bytes"},{"internalType":"bytes","name":"receiptPath","type":"bytes"},{"internalType":"uint256","name":"logIndex","type":"uint256"}]},{"internalType":"uint256","name":"targetBlockNumber","type":"uint256"}],"stateMutability":"nonpayable","type":"function","name":"collect"},{"inputs":[],"stateMutability":"view","type":"function","name":"currentPaymentAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"currentRewardAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"executionDeadline","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"expectedAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"expectedRecipient","outputs":[{"internalType":"address","name":"","type":"address"}]},{"inputs":[{"internalType":"uint256","name":"_currentRewardAmount","type":"uint256"},{"internalType":"uint256","name":"_currentPaymentAmount","type":"uint256"}],"stateMutability":"nonpayable","type":"function","name":"fund"},{"inputs":[],"stateMutability":"view","type":"function","name":"funded","outputs":[{"internalType":"bool","name":"","type":"bool"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"is_bonded","outputs":[{"internalType":"bool","name":"","type":"bool"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"originalRewardAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[],"stateMutability":"nonpayable","type":"function","name":"requestCancellation"},{"inputs":[],"stateMutability":"nonpayable","type":"function","name":"resume"},{"inputs":[],"stateMutability":"view","type":"function","name":"tokenContract","outputs":[{"internalType":"address","name":"","type":"address"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"totalBondsDeposited","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[],"stateMutability":"nonpayable","type":"function","name":"withdraw"}],"devdoc":{"kind":"dev","methods":{},"version":1},"userdoc":{"kind":"user","methods":{},"version":1}},"settings":{"remappings":["forge-std/=lib/forge-std/src/"],"optimizer":{"enabled":true,"runs":200},"metadata":{"bytecodeHash":"ipfs"},"compilationTarget":{"src/EscrowERC20.sol":"EscrowERC20"},"evmVersion":"prague","libraries":{},"viaIR":true},"sources":{"src/BlockHeaderParser.sol":{"keccak256":"0xf8a84bae1ea886c0519edb32e55f4c661d1e1cb036550967502148d033f08550","urls":["bzz-raw://766da07581e5dac7eda20d25debe9c381ed466204608502522b53266624bafa6","dweb:/ipfs/QmPyjTUV3zL6h9oeQjbbbw3WiypQQYqdws6vTWSAXRUg7p"],"license":"UNLICENSED"},"src/EscrowBase.sol":{"keccak256":"0x53fd262562c9dbc7779339bafbeca6b86b690aec7ac864e30c57e0e42288a11d","urls":["bzz-raw://cb43380f5b0a131e1ac4405a43a67b9d2b07718eb05ba675fe46c106b8a12649","dweb:/ipfs/QmNk5QkryXnDspEGc8mdyFYJSRXWRSP8V6yirLC98EKZYG"],"license":"UNLICENSED"},"src/EscrowERC20.sol":{"keccak256":"0xa89659e0421fe81fdfeccaaf40ba35578a6fb702a5599fe9a480eb7a2f85854d","urls":["bzz-raw://72ca9d806f4b8e56594d971dc4064c0819bf605543c3d88d997ecb16526b094c","dweb:/ipfs/QmTccPEBt3CruNEFZfGpHB2weSnN4Fe2Nc88pvdc4wtxw4"],"license":"UNLICENSED"},"src/MPTVerifier.sol":{"keccak256":"0xf71ff6fc0fa054681fc67b7ca3c187141749b04895defd977d6989271b35ebeb","urls":["bzz-raw://6e2efbdee9d872e22febc5d29894e3759e72ed43850a512c9eed56a9f5e7ff3b","dweb:/ipfs/QmShY9TstL2zXVSYH7ux8D6ByW22ptm7JfiEWy2qs7bHZU"],"license":"UNLICENSED"},"src/RLPParser.sol":{"keccak256":"0x403e6fd0cbf2e3599530d724d26e75b136bd7947e35e1cf5f79b30841b2c4c6c","urls":["bzz-raw://b24f44c75ae8db00297a940d0badb6b0fd9114b494b1a5c097a04f4bccde5e1d","dweb:/ipfs/QmSoxh5vZu41RzAs8RTLXgQ5cD5pQBeQo68nYSFh4Dk5Xk"],"license":"UNLICENSED"},"src/ReceiptValidator.sol":{"keccak256":"0x625137f131a6524c06e6c7c6ddc4c3f10256ac8a306b53b2dfed4fe9a3ed9728","urls":["bzz-raw://611b99fa26ae364ea2e0aa721f62ca043ca6d5b0e2bc1c96278639792242f43f","dweb:/ipfs/QmXFkR6amwaZF1QZqZjsneEXBz8C17QmCFyirmHo7eaUaH"],"license":"UNLICENSED"}},"version":1},"id":21} \ No newline at end of file diff --git a/out/EscrowNative.sol/EscrowNative.json b/out/EscrowNative.sol/EscrowNative.json index 7726a21..29d6e5a 100644 --- a/out/EscrowNative.sol/EscrowNative.json +++ b/out/EscrowNative.sol/EscrowNative.json @@ -1 +1 @@ -{"abi":[{"type":"constructor","inputs":[{"name":"_expectedRecipient","type":"address","internalType":"address"},{"name":"_expectedAmount","type":"uint256","internalType":"uint256"},{"name":"_currentRewardAmount","type":"uint256","internalType":"uint256"},{"name":"_currentPaymentAmount","type":"uint256","internalType":"uint256"}],"stateMutability":"payable"},{"type":"function","name":"MAX_BLOCK_LOOKBACK","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"bond","inputs":[],"outputs":[],"stateMutability":"payable"},{"type":"function","name":"bondAmount","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"bondedExecutor","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"type":"function","name":"cancellationRequest","inputs":[],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"collect","inputs":[{"name":"proof","type":"tuple","internalType":"struct EscrowNative.NativeTransferProof","components":[{"name":"blockHeader","type":"bytes","internalType":"bytes"},{"name":"transactionRlp","type":"bytes","internalType":"bytes"},{"name":"txProofNodes","type":"bytes","internalType":"bytes"},{"name":"receiptRlp","type":"bytes","internalType":"bytes"},{"name":"receiptProofNodes","type":"bytes","internalType":"bytes"},{"name":"path","type":"bytes","internalType":"bytes"}]},{"name":"targetBlockNumber","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"currentPaymentAmount","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"currentRewardAmount","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"executionDeadline","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"expectedAmount","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"expectedRecipient","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"type":"function","name":"fund","inputs":[{"name":"_currentRewardAmount","type":"uint256","internalType":"uint256"},{"name":"_currentPaymentAmount","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"payable"},{"type":"function","name":"funded","inputs":[],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"is_bonded","inputs":[],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"originalRewardAmount","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"requestCancellation","inputs":[],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"resume","inputs":[],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"totalBondsDeposited","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"withdraw","inputs":[],"outputs":[],"stateMutability":"nonpayable"},{"type":"error","name":"AlreadyFunded","inputs":[]},{"type":"error","name":"AmountMismatch","inputs":[]},{"type":"error","name":"BlockHashUnavailable","inputs":[]},{"type":"error","name":"BlockHeaderMismatch","inputs":[]},{"type":"error","name":"BlockNumberMismatch","inputs":[]},{"type":"error","name":"BondActive","inputs":[]},{"type":"error","name":"CancellationRequested","inputs":[]},{"type":"error","name":"ETHTransferFailed","inputs":[]},{"type":"error","name":"ExecutorAlreadyBonded","inputs":[]},{"type":"error","name":"ExpectedRLPList","inputs":[]},{"type":"error","name":"ExpectedStringItem","inputs":[]},{"type":"error","name":"IncorrectETHAmount","inputs":[]},{"type":"error","name":"InsufficientBond","inputs":[]},{"type":"error","name":"InvalidAddress","inputs":[]},{"type":"error","name":"InvalidNativeTransfer","inputs":[]},{"type":"error","name":"InvalidRLP","inputs":[]},{"type":"error","name":"InvalidRLPEncoding","inputs":[]},{"type":"error","name":"InvalidRLPList","inputs":[]},{"type":"error","name":"InvalidReceiptProof","inputs":[]},{"type":"error","name":"InvalidTxProof","inputs":[]},{"type":"error","name":"NoWithdrawableFunds","inputs":[]},{"type":"error","name":"NotFunded","inputs":[]},{"type":"error","name":"OnlyBondedExecutor","inputs":[]},{"type":"error","name":"OnlyDeployer","inputs":[]},{"type":"error","name":"RLPOffsetOutOfBounds","inputs":[]},{"type":"error","name":"RLPOffsetOutOfBounds","inputs":[]},{"type":"error","name":"ReceiptStatusNotSuccess","inputs":[]},{"type":"error","name":"RecipientMismatch","inputs":[]},{"type":"error","name":"TargetBlockInFuture","inputs":[]},{"type":"error","name":"TargetBlockTooOld","inputs":[]},{"type":"error","name":"TxFailed","inputs":[]},{"type":"error","name":"UnsupportedTxType","inputs":[]},{"type":"error","name":"ZeroPaymentAmount","inputs":[]},{"type":"error","name":"ZeroRewardAmount","inputs":[]}],"bytecode":{"object":"0x60e0601f611f5738819003918201601f19168301916001600160401b038311848410176101205780849260809460405283398101031261011c578051906001600160a01b038216820361011c576020810151606060408301519201519260a05260c0523360805280151580610113575b6100c1575b604051611e22908161013582396080518181816101560152818161040f015281816105d40152610686015260a0518181816103070152610626015260c0518181816102e5015261038d0152f35b8181018082116100ff5734036100f057805f5560025560015561010061ff001960075416176007555f80610074565b63201c04ab60e01b5f5260045ffd5b634e487b7160e01b5f52601160045260245ffd5b5081151561006f565b5f80fd5b634e487b7160e01b5f52604160045260245ffdfe60806040526004361015610011575f80fd5b5f3560e01c8063046f7da2146101445780631aa7c0ec1461013f57806323a8b41a1461013a5780632feef2ec14610135578063308657d71461013057806333ee5f351461012b5780633ccfd60b146101265780633d2691bc146101215780635a4fd6451461011c57806364c9ec6f1461011757806380f323a71461011257806381972d001461010d5780638677ab23146101085780638bd03d0a14610103578063a65e2cfd146100fe578063cb766a56146100f9578063d415b3f9146100f4578063f3a504f2146100ef5763fe03a460146100ea575f80fd5b6107a7565b610782565b610765565b610741565b610672565b610655565b610611565b6105c2565b6105a5565b6104e7565b6104cb565b6104af565b6103ef565b6103d2565b6103b0565b610376565b6101cb565b6101a3565b3461019f575f36600319011261019f577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03163303610190576007805460ff19169055005b63618bbdd560e01b5f5260045ffd5b5f80fd5b3461019f575f36600319011261019f576003546040516001600160a01b039091168152602090f35b3461019f57604036600319011261019f5760043567ffffffffffffffff811161019f57806004019060c0600319823603011261019f5761021760243561021184806107c4565b90610934565b61022a61022483806107c4565b90610aa4565b602482019161026b61026761023f85876107c4565b61024f60448697939701896107c4565b60a48701979161025f898c6107c4565b949093610bad565b1590565b610367576102676102b491608461028b61028588806107c4565b90610bd4565b9161025f60648201966102ab6102a1898c6107c4565b959094018b6107c4565b9290918b6107c4565b610358576102676102c86102ce92856107c4565b90610c35565b610349576102e26102679161032c936107c4565b907f0000000000000000000000000000000000000000000000000000000000000000917f000000000000000000000000000000000000000000000000000000000000000091610d05565b61033a57610338610f20565b005b633cff557560e11b5f5260045ffd5b632b96f51360e01b5f5260045ffd5b637b374dd160e01b5f5260045ffd5b63c89e37db60e01b5f5260045ffd5b3461019f575f36600319011261019f5760206040517f00000000000000000000000000000000000000000000000000000000000000008152f35b3461019f575f36600319011261019f57602060ff600754166040519015158152f35b3461019f575f36600319011261019f576020600454604051908152f35b3461019f575f36600319011261019f5760ff60075460081c16156104a0577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316330361019057610445610f86565b61044d610fbd565b61046461ff0019600754166007555f6001555f8055565b8015610491575f80808093335af161047a610852565b501561048257005b63b12d13eb60e01b5f5260045ffd5b6353cd7f7960e01b5f5260045ffd5b636af784dd60e11b5f5260045ffd5b3461019f575f36600319011261019f5760206040516101008152f35b3461019f575f36600319011261019f5760205f54604051908152f35b5f36600319011261019f57600454801515908161059b575b50610568575b60075460ff8160081c16156104a05760ff16610559576105236108c7565b61054a575f5460011c341061053b5761033834610fcf565b63e92c469f60e01b5f5260045ffd5b63129f78e960e11b5f5260045ffd5b632479328960e01b5f5260045ffd5b6005545f54818101809111610596575f5560065490810180911161059657600655610591610f86565b610505565b61087c565b905042115f6104ff565b3461019f575f36600319011261019f576020600554604051908152f35b3461019f575f36600319011261019f577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03163303610190576007805460ff19166001179055005b3461019f575f36600319011261019f576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b3461019f575f36600319011261019f576020600154604051908152f35b604036600319011261019f576004356024357f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031633036101905760075460081c60ff16610732578115610723578015610714576106d781836108ba565b3403610705576106ec826106f1935f55600255565b600155565b61033861010061ff00196007541617600755565b63201c04ab60e01b5f5260045ffd5b63932ca0a360e01b5f5260045ffd5b63ea1083a760e01b5f5260045ffd5b635adf638760e01b5f5260045ffd5b3461019f575f36600319011261019f57602061075b6108c7565b6040519015158152f35b3461019f575f36600319011261019f576020600254604051908152f35b3461019f575f36600319011261019f57602060ff60075460081c166040519015158152f35b3461019f575f36600319011261019f576020600654604051908152f35b903590601e198136030182121561019f570180359067ffffffffffffffff821161019f5760200191813603831361019f57565b634e487b7160e01b5f52604160045260245ffd5b6040519190601f01601f1916820167ffffffffffffffff81118382101761083157604052565b6107f7565b67ffffffffffffffff811161083157601f01601f191660200190565b3d15610877573d9061086b61086683610836565b61080b565b9182523d5f602084013e565b606090565b634e487b7160e01b5f52601160045260245ffd5b906001820180921161059657565b906015820180921161059657565b600101908160011161059657565b9190820180921161059657565b60045480151590816108d7575090565b905042111590565b60011981019190821161059657565b5f1981019190821161059657565b9190820391821161059657565b92919261091861086683610836565b938285528282011161019f57815f926020928387013784010152565b9061094861026760075460ff9060081c1690565b6104a0576003546001600160a01b03163314801590610a08575b6109f9574383116109ea5761010061097a84436108fc565b116109db57824080156109cc57610992368385610909565b60208151910120036109bd576109a791611015565b036109ae57565b63048a12f560e11b5f5260045ffd5b63ff28378760e01b5f5260045ffd5b63bfc9f0d360e01b5f5260045ffd5b63c42a018560e01b5f5260045ffd5b63058968cf60e41b5f5260045ffd5b6337b5f20360e21b5f5260045ffd5b50610a146102676108c7565b610962565b634e487b7160e01b5f52603260045260245ffd5b9015610a365790565b610a19565b90821015610a36570190565b60ff60f6199116019060ff821161059657565b60ff607f199116019060ff821161059657565b60ff60bf199116019060ff821161059657565b60ff60b6199116019060ff821161059657565b60ff166001019060ff821161059657565b905f600360fe1b6001600160f81b0319610acf610ac18587610a2d565b356001600160f81b03191690565b1610610b9e57601f60fb1b6001600160f81b0319610af0610ac18587610a2d565b1610610b955780610b2a610b24610b1f610b1a610b14610ac1610b3097898b610a3b565b60f81c90565b610a47565b610a93565b60ff1690565b906108ba565b905b5f5b60048110610b805750600560fd1b906001600160f81b031990610b5d90610ac190859087610a3b565b1603610b7157610b6c90610890565b013590565b633954003560e11b5f5260045ffd5b91610b8e600191838661107d565b9201610b34565b50600190610b32565b63c0098bd960e01b5f5260045ffd5b610bc3610bcb92939495610bd198973691610909565b923691610909565b906111e7565b90565b90610bdf81836113a1565b905f5b60058110610c205750600560fd1b906001600160f81b031990610c0790849086610a3b565b351603610b715760018101811161059657016001013590565b91610c2e600191838661107d565b9201610be2565b5f9082151580610ce9575b610ce0575b60c060ff610c5a610b14610ac1868887610a3b565b1610610cd157610b14610ac182858560f860ff610c84610b14610ac1839b60019d610cae9c610a3b565b1610610cc85780610b2a610b24610b1f610b1a610b14610ac1610ca897898b610a3b565b91610a3b565b1603610cb957600190565b63e9dd8a9d60e01b5f5260045ffd5b610ca890610890565b631bd5dcf760e31b5f5260045ffd5b60019150610c45565b50608060ff610cfe610b14610ac18786610a2d565b1610610c40565b90916003905f84151580610f04575b610ebc575b60c060ff610d2e610b14610ac1858a8a610a3b565b1610610cd1578060f860ff610d4d610b14610ac1610d73968b8b610a3b565b1610610eb35760ff610d6c610b1f610b1a610b14610ac1868c8c610a3b565b16906108ba565b915f905b808210610e9c575050609460ff610d95610b14610ac1868989610a3b565b1603610e8d576001600160a01b03168282016001013560601c03610e7e57610dbc9061089e565b91610dce610b14610ac1858486610a3b565b925f9260ff851694608086105f14610dff5750505050505b03610df057600190565b6355e97b0d60e01b5f5260045ffd5b90919293946080145f14610e185750505050505f610de6565b610b24610e2791939293610a5a565b915f935b838510610e3c575050505050610de6565b9091929394610e4d60019160081b90565b610e72610b24610b14610ac1610e6b8b610e668b610890565b6108ba565b8789610a3b565b17950193929190610e2b565b63c0ee95bb60e01b5f5260045ffd5b63e6c4247b60e01b5f5260045ffd5b9092610eab600191878761107d565b930190610d77565b60ff6001610d6c565b509050610ecf610b14610ac18585610a2d565b6001919060ff16808303610ee65750600491610d19565b600203610ef557600591610d19565b636fc3daa360e11b5f5260045ffd5b50608060ff610f19610b14610ac18989610a2d565b1610610d14565b6005545f548101809111610596576001548101809111610596575f808080936003546001600160601b0360a01b8116600355826005558260045561ff0019600754166007558260015582805560018060a01b03165af1610f7e610852565b501561048257565b610f8e6108c7565b610fae576001600160601b0360a01b600354166003555f6005555f600455565b639cbc1de160e01b5f5260045ffd5b60015460025481018091116105965790565b336001600160601b0360a01b600354161760035561012c420180421161059657600455600555565b805115610a365760200190565b908151811015610a36570160200190565b919061102181846113a1565b905f5b60088110611068575061103792936114fe565b50905f805b8351821015611063576001906110528386611004565b5160f81c9060081b1791019061103c565b925050565b91611076600191838761107d565b9201611024565b9190808210156111d857611098610b14610ac1848487610a3b565b9060ff821660808110156110b357505050610bd19150610890565b91929160b88110156110db575050610bd19250610b246110d5610b2a92610890565b92610a5a565b90929060c08110156111515750610b246110f791949394610a80565b915f935f915b84831061111857505050610bd19291610e66610e6692610890565b90919461112760019160081b90565b611147610b24610b14610ac16111408b610e668b610890565b8888610a3b565b17950191906110fd565b90929060f811156111775750610bd19250610b24611171610b2a92610890565b92610a6d565b9291610b2461118591610a47565b915f935f915b8483106111a657505050610bd19291610e66610e6692610890565b9091946111b560019160081b90565b6111ce610b24610b14610ac16111408b610e668b610890565b179501919061118b565b6318d76ae160e11b5f5260045ffd5b919390929190600360fe1b6001600160f81b0319611208610ac18689610a2d565b161061139257601f60fb1b6001600160f81b0319611229610ac18689610a2d565b16106113885761124d611248610b24610b1a610b14610ac1888b610a2d565b6108ac565b9492905b945f5b82821061126657505050505050505f90565b61128461127d8361127836878a610909565b61166f565b90936108ba565b96825160208401200361132657600360fe1b6112c06112b36112a585610ff7565b516001600160f81b03191690565b6001600160f81b03191690565b10611326578590846001601f60fb1b6112de6112b36112a588610ff7565b101561136a575b6112ef81866117f6565b60118103611331575061130194611981565b94911561132657841561131a5793915b91959093611254565b50505050505050600190565b505050505050505f90565b90935060021415905061135e5784879261134a9461183b565b94911561132657841561131a579391611311565b50505050505050505f90565b50611383611248610b24610b1a610b146112a589610ff7565b6112e5565b6001949290611251565b63ebb47d1d60e01b5f5260045ffd5b5f600360fe1b6001600160f81b03196113bd610ac18686610a2d565b1610610b9e57601f60fb1b6001600160f81b03196113de610ac18686610a2d565b16106114b05780610b2a610b24610b1f610b1a610b14610ac1611402978a8a610a3b565b905b61a5bd461480156114a5575b61141b575b50905090565b5f5b600381106114905750600360fe1b61143c6112b3610ac1858786610a3b565b10610b9e57601f60fb1b6114576112b3610ac1858786610a3b565b1061148057610b24610b1f610b1a610b14610ac18661147998610b2a97610a3b565b805f611415565b5061148b9150610890565b611479565b9161149e600191858461107d565b920161141d565b5061a5bf4614611410565b50600190611404565b6040906114c58261080b565b6001815291601f1901366020840137565b906114e361086683610836565b82815280926114f4601f1991610836565b0190602036910137565b818310156111d857611517610b14610ac1858585610a3b565b9260ff8416608081101561155157505050506115316114b9565b9060f81b6001600160f81b0319165f1a61154a82610ff7565b5390600190565b60b881969592939496105f146115bf5750610b2461156e91610a5a565b91611578836114d6565b945f5b84811061158f5750505050610bd1906108ac565b806115ac610ac16115a5600194610e6689610890565b8587610a3b565b5f1a6115b8828a611004565b530161157b565b60c0111561166057610b246115d391610a80565b905f925f5b83811061163157506115e9846114d6565b955f5b858110611604575050505090610e66610bd1926108ac565b8061161e610ac16115a5600194610e668a610e668b610890565b5f1a61162a828b611004565b53016115ec565b9360019060081b611658610b24610b14610ac16116518a610e668a610890565b8c88610a3b565b1794016115d8565b636b2e9c5f60e11b5f5260045ffd5b80518210156111d857611688610b146112a58484611004565b9160ff831660808110156116a1575050506115316114b9565b919392909160b881101561170b5750610b246116bc91610a5a565b906116c6826114d6565b935f5b8381106116dc57505050610bd1906108ac565b806116f86112a56116f2600194610e6688610890565b85611004565b5f1a6117048289611004565b53016116c9565b60c011156117a957610b2461171f91610a80565b5f915f5b82811061177b5750611734836114d6565b945f5b84811061174e5750505090610e66610bd1926108ac565b806117686112a56116f2600194610e6689610e668a610890565b5f1a611774828a611004565b5301611737565b9260019060081b6117a1610b24610b146112a561179b89610e6689610890565b8b611004565b179301611723565b50916117b58382611a96565b926117bf846114d6565b915f5b8581106117d0575050509190565b806117e36112a56116f2600194876108ba565b5f1a6117ef8287611004565b53016117c2565b5f92915b81518110156118215761180d8183611a96565b8101809111610596576001909301926117fa565b5050565b908160011b918083046002149015171561059657565b83949291611849818361166f565b9390611868602061185f610b146112a585610ff7565b16151591611bc3565b9788911561190a575061187c9051876108ba565b6118868251611825565b1461189b575b505050505050505f905f905f90565b868660019282516118f8575b5050506118b5575b8061188c565b6118c8926118c2916108ba565b9061166f565b50602081519101209060208151910120146118e657808080806118af565b6118f19151906108ba565b6001915f90565b6119029350611d2e565b86865f6118a7565b61191b939495965061026792611d2e565b6119745761192c926118c2916108ba565b50908151602081145f146119545750602061194c920151925b51906108ba565b916001929190565b801561196857602061194c93012092611945565b505050505f905f905f90565b50505050505f905f905f90565b9190929361198f8251611825565b851015611a395750610b146112a56119b1926119ab8760011c90565b90611004565b60018416611a305760041c600f16915b905f925b60ff81168410611a1057506119da925061166f565b5080518015611a055761194c91602082036119fb5760209150015191610890565b6020012091610890565b5050505f905f905f90565b90916001611a2482610b2a60ff9487611a96565b940193929190506119c5565b600f16916119c1565b9290509392935f915b60108310611a7c57611a54925061166f565b50602081519101209060208151910120145f14611a7357600191905f90565b5f915081908190565b90611a8d81610b2a60019385611a96565b92019190611a42565b9081518110156111d857611ab0610b146112a58385611004565b9160ff83166080811015611ac75750505050600190565b60b8811015611ae257505050610b24610b1f610bd192610a5a565b60c0811015611b4e575091610b24611af991610a80565b905f925f915b838310611b165750505090610e66610bd1926108ac565b909193611b2560019160081b90565b611b44610b24610b146112a5611b3e8a610e6689610890565b88611004565b1794019190611aff565b60f81115611b67575050610b24610b1f610bd192610a6d565b91610b24611b7491610a47565b905f925f915b838310611b915750505090610e66610bd1926108ac565b909193611ba060019160081b90565b611bb9610b24610b146112a5611b3e8a610e6689610890565b1794019190611b7a565b90815115611d2c57611bda610b146112a584610ff7565b6010811615611ca957611bfd611bf8611bf38551611825565b6108ee565b6114d6565b9060f81b600f60f81b165f1a611c1282610ff7565b5360015b8351811015611ca45780611c51611c41611c38610b146112a56001968a611004565b60041c600f1690565b60f81b6001600160f81b03191690565b611c6a611c60611bf384611825565b915f1a9185611004565b53611c91600f611c80610b146112a5858a611004565b1660f81b6001600160f81b03191690565b611c9d611c6083611825565b5301611c16565b509150565b50611cbf611bf8611cba8451611825565b6108df565b60015b8351811015611ca45780611ce4611c41611c38610b146112a56001968a611004565b611cf8611c60611cf3846108ee565b611825565b53611d0e600f611c80610b146112a5858a611004565b611d25611c60611d20611cf3856108ee565b610890565b5301611cc2565b565b919091611d3c8251846108ba565b611d468251611825565b10611de5575f5b8251811015611ddc57611d69611d6382866108ba565b60011690565b611dbe57611d92611c38610b146112a5611d8c611d86868a6108ba565b60011c90565b86611004565b60ff611da7610b24610b146112a58689611004565b911603611db657600101611d4d565b505050505f90565b600f611dd6610b146112a5611d8c611d86868a6108ba565b16611d92565b50505050600190565b5050505f9056fea2646970667358221220290b4349508c088a1ee4b25b8002172ad42ab21d1e2ad16b6e9456f82cd5a8db64736f6c634300081e0033","sourceMap":"92:4695:22:-:0;;;;;;;;;;-1:-1:-1;;92:4695:22;;;;-1:-1:-1;;;;;92:4695:22;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;92:4695:22;;;;;;;;;;;;;;;;;;1670:38:20;;;1718:32;;1778:10;92:4695:22;1760:28:20;1248:24:22;;;:53;;;-1:-1:-1;1244:372:22;;-1:-1:-1;92:4695:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1670:38:20;92:4695:22;;;;;;;;;;1718:32:20;92:4695:22;;;;;;;;;;;1244:372;92:4695;;;;;;;;1321:9;:57;1317:90;;92:4695;-1:-1:-1;92:4695:22;1477:43;92:4695;;;;;;1592:13;92:4695;;;1592:13;92:4695;1244:372;;;;1317:90;1387:20;;;-1:-1:-1;1387:20:22;;-1:-1:-1;1387:20:22;92:4695;;;;-1:-1:-1;92:4695:22;;;;;-1:-1:-1;92:4695:22;1248:53;1276:25;;;;1248:53;;92:4695;-1:-1:-1;92:4695:22;;;;;;-1:-1:-1;92:4695:22;;;;;-1:-1:-1;92:4695:22","linkReferences":{}},"deployedBytecode":{"object":"0x60806040526004361015610011575f80fd5b5f3560e01c8063046f7da2146101445780631aa7c0ec1461013f57806323a8b41a1461013a5780632feef2ec14610135578063308657d71461013057806333ee5f351461012b5780633ccfd60b146101265780633d2691bc146101215780635a4fd6451461011c57806364c9ec6f1461011757806380f323a71461011257806381972d001461010d5780638677ab23146101085780638bd03d0a14610103578063a65e2cfd146100fe578063cb766a56146100f9578063d415b3f9146100f4578063f3a504f2146100ef5763fe03a460146100ea575f80fd5b6107a7565b610782565b610765565b610741565b610672565b610655565b610611565b6105c2565b6105a5565b6104e7565b6104cb565b6104af565b6103ef565b6103d2565b6103b0565b610376565b6101cb565b6101a3565b3461019f575f36600319011261019f577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03163303610190576007805460ff19169055005b63618bbdd560e01b5f5260045ffd5b5f80fd5b3461019f575f36600319011261019f576003546040516001600160a01b039091168152602090f35b3461019f57604036600319011261019f5760043567ffffffffffffffff811161019f57806004019060c0600319823603011261019f5761021760243561021184806107c4565b90610934565b61022a61022483806107c4565b90610aa4565b602482019161026b61026761023f85876107c4565b61024f60448697939701896107c4565b60a48701979161025f898c6107c4565b949093610bad565b1590565b610367576102676102b491608461028b61028588806107c4565b90610bd4565b9161025f60648201966102ab6102a1898c6107c4565b959094018b6107c4565b9290918b6107c4565b610358576102676102c86102ce92856107c4565b90610c35565b610349576102e26102679161032c936107c4565b907f0000000000000000000000000000000000000000000000000000000000000000917f000000000000000000000000000000000000000000000000000000000000000091610d05565b61033a57610338610f20565b005b633cff557560e11b5f5260045ffd5b632b96f51360e01b5f5260045ffd5b637b374dd160e01b5f5260045ffd5b63c89e37db60e01b5f5260045ffd5b3461019f575f36600319011261019f5760206040517f00000000000000000000000000000000000000000000000000000000000000008152f35b3461019f575f36600319011261019f57602060ff600754166040519015158152f35b3461019f575f36600319011261019f576020600454604051908152f35b3461019f575f36600319011261019f5760ff60075460081c16156104a0577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316330361019057610445610f86565b61044d610fbd565b61046461ff0019600754166007555f6001555f8055565b8015610491575f80808093335af161047a610852565b501561048257005b63b12d13eb60e01b5f5260045ffd5b6353cd7f7960e01b5f5260045ffd5b636af784dd60e11b5f5260045ffd5b3461019f575f36600319011261019f5760206040516101008152f35b3461019f575f36600319011261019f5760205f54604051908152f35b5f36600319011261019f57600454801515908161059b575b50610568575b60075460ff8160081c16156104a05760ff16610559576105236108c7565b61054a575f5460011c341061053b5761033834610fcf565b63e92c469f60e01b5f5260045ffd5b63129f78e960e11b5f5260045ffd5b632479328960e01b5f5260045ffd5b6005545f54818101809111610596575f5560065490810180911161059657600655610591610f86565b610505565b61087c565b905042115f6104ff565b3461019f575f36600319011261019f576020600554604051908152f35b3461019f575f36600319011261019f577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03163303610190576007805460ff19166001179055005b3461019f575f36600319011261019f576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b3461019f575f36600319011261019f576020600154604051908152f35b604036600319011261019f576004356024357f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031633036101905760075460081c60ff16610732578115610723578015610714576106d781836108ba565b3403610705576106ec826106f1935f55600255565b600155565b61033861010061ff00196007541617600755565b63201c04ab60e01b5f5260045ffd5b63932ca0a360e01b5f5260045ffd5b63ea1083a760e01b5f5260045ffd5b635adf638760e01b5f5260045ffd5b3461019f575f36600319011261019f57602061075b6108c7565b6040519015158152f35b3461019f575f36600319011261019f576020600254604051908152f35b3461019f575f36600319011261019f57602060ff60075460081c166040519015158152f35b3461019f575f36600319011261019f576020600654604051908152f35b903590601e198136030182121561019f570180359067ffffffffffffffff821161019f5760200191813603831361019f57565b634e487b7160e01b5f52604160045260245ffd5b6040519190601f01601f1916820167ffffffffffffffff81118382101761083157604052565b6107f7565b67ffffffffffffffff811161083157601f01601f191660200190565b3d15610877573d9061086b61086683610836565b61080b565b9182523d5f602084013e565b606090565b634e487b7160e01b5f52601160045260245ffd5b906001820180921161059657565b906015820180921161059657565b600101908160011161059657565b9190820180921161059657565b60045480151590816108d7575090565b905042111590565b60011981019190821161059657565b5f1981019190821161059657565b9190820391821161059657565b92919261091861086683610836565b938285528282011161019f57815f926020928387013784010152565b9061094861026760075460ff9060081c1690565b6104a0576003546001600160a01b03163314801590610a08575b6109f9574383116109ea5761010061097a84436108fc565b116109db57824080156109cc57610992368385610909565b60208151910120036109bd576109a791611015565b036109ae57565b63048a12f560e11b5f5260045ffd5b63ff28378760e01b5f5260045ffd5b63bfc9f0d360e01b5f5260045ffd5b63c42a018560e01b5f5260045ffd5b63058968cf60e41b5f5260045ffd5b6337b5f20360e21b5f5260045ffd5b50610a146102676108c7565b610962565b634e487b7160e01b5f52603260045260245ffd5b9015610a365790565b610a19565b90821015610a36570190565b60ff60f6199116019060ff821161059657565b60ff607f199116019060ff821161059657565b60ff60bf199116019060ff821161059657565b60ff60b6199116019060ff821161059657565b60ff166001019060ff821161059657565b905f600360fe1b6001600160f81b0319610acf610ac18587610a2d565b356001600160f81b03191690565b1610610b9e57601f60fb1b6001600160f81b0319610af0610ac18587610a2d565b1610610b955780610b2a610b24610b1f610b1a610b14610ac1610b3097898b610a3b565b60f81c90565b610a47565b610a93565b60ff1690565b906108ba565b905b5f5b60048110610b805750600560fd1b906001600160f81b031990610b5d90610ac190859087610a3b565b1603610b7157610b6c90610890565b013590565b633954003560e11b5f5260045ffd5b91610b8e600191838661107d565b9201610b34565b50600190610b32565b63c0098bd960e01b5f5260045ffd5b610bc3610bcb92939495610bd198973691610909565b923691610909565b906111e7565b90565b90610bdf81836113a1565b905f5b60058110610c205750600560fd1b906001600160f81b031990610c0790849086610a3b565b351603610b715760018101811161059657016001013590565b91610c2e600191838661107d565b9201610be2565b5f9082151580610ce9575b610ce0575b60c060ff610c5a610b14610ac1868887610a3b565b1610610cd157610b14610ac182858560f860ff610c84610b14610ac1839b60019d610cae9c610a3b565b1610610cc85780610b2a610b24610b1f610b1a610b14610ac1610ca897898b610a3b565b91610a3b565b1603610cb957600190565b63e9dd8a9d60e01b5f5260045ffd5b610ca890610890565b631bd5dcf760e31b5f5260045ffd5b60019150610c45565b50608060ff610cfe610b14610ac18786610a2d565b1610610c40565b90916003905f84151580610f04575b610ebc575b60c060ff610d2e610b14610ac1858a8a610a3b565b1610610cd1578060f860ff610d4d610b14610ac1610d73968b8b610a3b565b1610610eb35760ff610d6c610b1f610b1a610b14610ac1868c8c610a3b565b16906108ba565b915f905b808210610e9c575050609460ff610d95610b14610ac1868989610a3b565b1603610e8d576001600160a01b03168282016001013560601c03610e7e57610dbc9061089e565b91610dce610b14610ac1858486610a3b565b925f9260ff851694608086105f14610dff5750505050505b03610df057600190565b6355e97b0d60e01b5f5260045ffd5b90919293946080145f14610e185750505050505f610de6565b610b24610e2791939293610a5a565b915f935b838510610e3c575050505050610de6565b9091929394610e4d60019160081b90565b610e72610b24610b14610ac1610e6b8b610e668b610890565b6108ba565b8789610a3b565b17950193929190610e2b565b63c0ee95bb60e01b5f5260045ffd5b63e6c4247b60e01b5f5260045ffd5b9092610eab600191878761107d565b930190610d77565b60ff6001610d6c565b509050610ecf610b14610ac18585610a2d565b6001919060ff16808303610ee65750600491610d19565b600203610ef557600591610d19565b636fc3daa360e11b5f5260045ffd5b50608060ff610f19610b14610ac18989610a2d565b1610610d14565b6005545f548101809111610596576001548101809111610596575f808080936003546001600160601b0360a01b8116600355826005558260045561ff0019600754166007558260015582805560018060a01b03165af1610f7e610852565b501561048257565b610f8e6108c7565b610fae576001600160601b0360a01b600354166003555f6005555f600455565b639cbc1de160e01b5f5260045ffd5b60015460025481018091116105965790565b336001600160601b0360a01b600354161760035561012c420180421161059657600455600555565b805115610a365760200190565b908151811015610a36570160200190565b919061102181846113a1565b905f5b60088110611068575061103792936114fe565b50905f805b8351821015611063576001906110528386611004565b5160f81c9060081b1791019061103c565b925050565b91611076600191838761107d565b9201611024565b9190808210156111d857611098610b14610ac1848487610a3b565b9060ff821660808110156110b357505050610bd19150610890565b91929160b88110156110db575050610bd19250610b246110d5610b2a92610890565b92610a5a565b90929060c08110156111515750610b246110f791949394610a80565b915f935f915b84831061111857505050610bd19291610e66610e6692610890565b90919461112760019160081b90565b611147610b24610b14610ac16111408b610e668b610890565b8888610a3b565b17950191906110fd565b90929060f811156111775750610bd19250610b24611171610b2a92610890565b92610a6d565b9291610b2461118591610a47565b915f935f915b8483106111a657505050610bd19291610e66610e6692610890565b9091946111b560019160081b90565b6111ce610b24610b14610ac16111408b610e668b610890565b179501919061118b565b6318d76ae160e11b5f5260045ffd5b919390929190600360fe1b6001600160f81b0319611208610ac18689610a2d565b161061139257601f60fb1b6001600160f81b0319611229610ac18689610a2d565b16106113885761124d611248610b24610b1a610b14610ac1888b610a2d565b6108ac565b9492905b945f5b82821061126657505050505050505f90565b61128461127d8361127836878a610909565b61166f565b90936108ba565b96825160208401200361132657600360fe1b6112c06112b36112a585610ff7565b516001600160f81b03191690565b6001600160f81b03191690565b10611326578590846001601f60fb1b6112de6112b36112a588610ff7565b101561136a575b6112ef81866117f6565b60118103611331575061130194611981565b94911561132657841561131a5793915b91959093611254565b50505050505050600190565b505050505050505f90565b90935060021415905061135e5784879261134a9461183b565b94911561132657841561131a579391611311565b50505050505050505f90565b50611383611248610b24610b1a610b146112a589610ff7565b6112e5565b6001949290611251565b63ebb47d1d60e01b5f5260045ffd5b5f600360fe1b6001600160f81b03196113bd610ac18686610a2d565b1610610b9e57601f60fb1b6001600160f81b03196113de610ac18686610a2d565b16106114b05780610b2a610b24610b1f610b1a610b14610ac1611402978a8a610a3b565b905b61a5bd461480156114a5575b61141b575b50905090565b5f5b600381106114905750600360fe1b61143c6112b3610ac1858786610a3b565b10610b9e57601f60fb1b6114576112b3610ac1858786610a3b565b1061148057610b24610b1f610b1a610b14610ac18661147998610b2a97610a3b565b805f611415565b5061148b9150610890565b611479565b9161149e600191858461107d565b920161141d565b5061a5bf4614611410565b50600190611404565b6040906114c58261080b565b6001815291601f1901366020840137565b906114e361086683610836565b82815280926114f4601f1991610836565b0190602036910137565b818310156111d857611517610b14610ac1858585610a3b565b9260ff8416608081101561155157505050506115316114b9565b9060f81b6001600160f81b0319165f1a61154a82610ff7565b5390600190565b60b881969592939496105f146115bf5750610b2461156e91610a5a565b91611578836114d6565b945f5b84811061158f5750505050610bd1906108ac565b806115ac610ac16115a5600194610e6689610890565b8587610a3b565b5f1a6115b8828a611004565b530161157b565b60c0111561166057610b246115d391610a80565b905f925f5b83811061163157506115e9846114d6565b955f5b858110611604575050505090610e66610bd1926108ac565b8061161e610ac16115a5600194610e668a610e668b610890565b5f1a61162a828b611004565b53016115ec565b9360019060081b611658610b24610b14610ac16116518a610e668a610890565b8c88610a3b565b1794016115d8565b636b2e9c5f60e11b5f5260045ffd5b80518210156111d857611688610b146112a58484611004565b9160ff831660808110156116a1575050506115316114b9565b919392909160b881101561170b5750610b246116bc91610a5a565b906116c6826114d6565b935f5b8381106116dc57505050610bd1906108ac565b806116f86112a56116f2600194610e6688610890565b85611004565b5f1a6117048289611004565b53016116c9565b60c011156117a957610b2461171f91610a80565b5f915f5b82811061177b5750611734836114d6565b945f5b84811061174e5750505090610e66610bd1926108ac565b806117686112a56116f2600194610e6689610e668a610890565b5f1a611774828a611004565b5301611737565b9260019060081b6117a1610b24610b146112a561179b89610e6689610890565b8b611004565b179301611723565b50916117b58382611a96565b926117bf846114d6565b915f5b8581106117d0575050509190565b806117e36112a56116f2600194876108ba565b5f1a6117ef8287611004565b53016117c2565b5f92915b81518110156118215761180d8183611a96565b8101809111610596576001909301926117fa565b5050565b908160011b918083046002149015171561059657565b83949291611849818361166f565b9390611868602061185f610b146112a585610ff7565b16151591611bc3565b9788911561190a575061187c9051876108ba565b6118868251611825565b1461189b575b505050505050505f905f905f90565b868660019282516118f8575b5050506118b5575b8061188c565b6118c8926118c2916108ba565b9061166f565b50602081519101209060208151910120146118e657808080806118af565b6118f19151906108ba565b6001915f90565b6119029350611d2e565b86865f6118a7565b61191b939495965061026792611d2e565b6119745761192c926118c2916108ba565b50908151602081145f146119545750602061194c920151925b51906108ba565b916001929190565b801561196857602061194c93012092611945565b505050505f905f905f90565b50505050505f905f905f90565b9190929361198f8251611825565b851015611a395750610b146112a56119b1926119ab8760011c90565b90611004565b60018416611a305760041c600f16915b905f925b60ff81168410611a1057506119da925061166f565b5080518015611a055761194c91602082036119fb5760209150015191610890565b6020012091610890565b5050505f905f905f90565b90916001611a2482610b2a60ff9487611a96565b940193929190506119c5565b600f16916119c1565b9290509392935f915b60108310611a7c57611a54925061166f565b50602081519101209060208151910120145f14611a7357600191905f90565b5f915081908190565b90611a8d81610b2a60019385611a96565b92019190611a42565b9081518110156111d857611ab0610b146112a58385611004565b9160ff83166080811015611ac75750505050600190565b60b8811015611ae257505050610b24610b1f610bd192610a5a565b60c0811015611b4e575091610b24611af991610a80565b905f925f915b838310611b165750505090610e66610bd1926108ac565b909193611b2560019160081b90565b611b44610b24610b146112a5611b3e8a610e6689610890565b88611004565b1794019190611aff565b60f81115611b67575050610b24610b1f610bd192610a6d565b91610b24611b7491610a47565b905f925f915b838310611b915750505090610e66610bd1926108ac565b909193611ba060019160081b90565b611bb9610b24610b146112a5611b3e8a610e6689610890565b1794019190611b7a565b90815115611d2c57611bda610b146112a584610ff7565b6010811615611ca957611bfd611bf8611bf38551611825565b6108ee565b6114d6565b9060f81b600f60f81b165f1a611c1282610ff7565b5360015b8351811015611ca45780611c51611c41611c38610b146112a56001968a611004565b60041c600f1690565b60f81b6001600160f81b03191690565b611c6a611c60611bf384611825565b915f1a9185611004565b53611c91600f611c80610b146112a5858a611004565b1660f81b6001600160f81b03191690565b611c9d611c6083611825565b5301611c16565b509150565b50611cbf611bf8611cba8451611825565b6108df565b60015b8351811015611ca45780611ce4611c41611c38610b146112a56001968a611004565b611cf8611c60611cf3846108ee565b611825565b53611d0e600f611c80610b146112a5858a611004565b611d25611c60611d20611cf3856108ee565b610890565b5301611cc2565b565b919091611d3c8251846108ba565b611d468251611825565b10611de5575f5b8251811015611ddc57611d69611d6382866108ba565b60011690565b611dbe57611d92611c38610b146112a5611d8c611d86868a6108ba565b60011c90565b86611004565b60ff611da7610b24610b146112a58689611004565b911603611db657600101611d4d565b505050505f90565b600f611dd6610b146112a5611d8c611d86868a6108ba565b16611d92565b50505050600190565b5050505f9056fea2646970667358221220290b4349508c088a1ee4b25b8002172ad42ab21d1e2ad16b6e9456f82cd5a8db64736f6c634300081e0033","sourceMap":"92:4695:22:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;;;;;-1:-1:-1;;92:4695:22;;;;2363:15:20;-1:-1:-1;;;;;92:4695:22;2349:10:20;:29;2345:56;;2411:27;92:4695:22;;-1:-1:-1;;92:4695:22;;;;2345:56:20;2387:14;;;92:4695:22;2387:14:20;92:4695:22;;2387:14:20;92:4695:22;;;;;;;;;;-1:-1:-1;;92:4695:22;;;;1263:29:20;92:4695:22;;;-1:-1:-1;;;;;92:4695:22;;;;;;;;;;;;;;-1:-1:-1;;92:4695:22;;;;;;;;;;;;;;;;;;;;;;;;;2799:17;92:4695;;2780:17;;;;:::i;:::-;2799;;:::i;:::-;2916:60;2958:17;;;;:::i;:::-;2916:60;;:::i;:::-;92:4695;3022:20;;;2990:103;2991:102;3022:20;;;;:::i;:::-;3044:18;;;;;;;;;:::i;:::-;3064:10;;;;;;;;;:::i;:::-;2991:102;;;;:::i;:::-;2990:103;;92:4695;2990:103;2986:157;;3300:99;3299:100;3267:17;3349:23;3229:56;3267:17;;;;:::i;:::-;3229:56;;:::i;:::-;3331:16;3374:10;3331:16;;;;3349:23;3331:16;;;;:::i;:::-;3349:23;;;;;;:::i;:::-;3374:10;;;;;:::i;3299:100::-;3295:159;;3525:56;3564:16;3524:57;3564:16;;;:::i;:::-;3525:56;;:::i;3524:57::-;3520:80;;3722:20;3682:96;3722:20;3681:97;3722:20;;:::i;:::-;3763:14;;3744:17;;3682:96;;:::i;3681:97::-;3677:158;;;;:::i;:::-;92:4695;3677:158;3801:23;;;-1:-1:-1;3801:23:22;92:4695;-1:-1:-1;3801:23:22;3520:80;3590:10;;;-1:-1:-1;3590:10:22;92:4695;-1:-1:-1;3590:10:22;3295:159;3422:21;;;-1:-1:-1;3422:21:22;92:4695;-1:-1:-1;3422:21:22;2986:157;3116:16;;;-1:-1:-1;3116:16:22;92:4695;-1:-1:-1;3116:16:22;92:4695;;;;;;-1:-1:-1;;92:4695:22;;;;;;;963:39:20;92:4695:22;;;;;;;;;-1:-1:-1;;92:4695:22;;;;;;1407:31:20;92:4695:22;;;;;;;;;;;;;;;;-1:-1:-1;;92:4695:22;;;;;;;;;;;;;;;;;;;-1:-1:-1;;92:4695:22;;;;;5261:6:20;92:4695:22;;;;5260:7:20;5256:31;;5315:15;-1:-1:-1;;;;;92:4695:22;5301:10:20;:29;5297:56;;4396:389:22;;:::i;:::-;4523:30;;:::i;:::-;4494:59;92:4695;;5686:14:20;92:4695:22;;5686:14:20;92:4695:22;5695:5:20;92:4695:22;;5695:5:20;92:4695:22;;5636:138:20;4494:59:22;4600:23;;4596:57;;92:4695;5301:10:20;;;;;4682:46:22;;;;:::i;:::-;;4742:8;4738:40;;92:4695;4738:40;4759:19;;;92:4695;4759:19;92:4695;;4759:19;4596:57;4632:21;;;92:4695;4632:21;92:4695;;4632:21;5256:31:20;5276:11;;;92:4695:22;5276:11:20;92:4695:22;;5276:11:20;92:4695:22;;;;;;-1:-1:-1;;92:4695:22;;;;;;;1085:3:20;92:4695:22;;;;;;;;;-1:-1:-1;;92:4695:22;;;;;;;;;;;;;;;;-1:-1:-1;;92:4695:22;;;;;;3850:21:20;;;:60;;;;92:4695:22;3846:204:20;;;92:4695:22;4200:6:20;92:4695:22;;;;;;4199:7:20;4195:31;;92:4695:22;;4236:55:20;;4305:11;;:::i;:::-;4301:47;;92:4695:22;;;;2438:9;4362:37:20;4358:68;;2472:9:22;2438;2472;:::i;4358:68:20:-;4408:18;;;92:4695:22;4408:18:20;92:4695:22;;4408:18:20;4301:47;4325:23;;;92:4695:22;4325:23:20;92:4695:22;;4325:23:20;4236:55;4268:23;;;92:4695:22;4268:23:20;92:4695:22;;4268:23:20;3846:204;3949:10;92:4695:22;;;;;;;;;;;;;3973:33:20;92:4695:22;;;;;;;;;3973:33:20;92:4695:22;3973:33:20;;:::i;:::-;3846:204;;92:4695:22;;:::i;3850:60:20:-;3875:15;;;:35;3850:60;;;92:4695:22;;;;;;-1:-1:-1;;92:4695:22;;;;;1336:25:20;92:4695:22;;;;;;;;;;;;;-1:-1:-1;;92:4695:22;;;;2113:15:20;-1:-1:-1;;;;;92:4695:22;2099:10:20;:29;2095:56;;2161:26;92:4695:22;;-1:-1:-1;;92:4695:22;2183:4:20;92:4695:22;;;;;;;;;;-1:-1:-1;;92:4695:22;;;;;;873:42:20;-1:-1:-1;;;;;92:4695:22;;;;;;;;;;;;-1:-1:-1;;92:4695:22;;;;;727:35:20;92:4695:22;;;;;;;;;;-1:-1:-1;;92:4695:22;;;;;;;;1748:15;-1:-1:-1;;;;;92:4695:22;1734:10;:29;1730:56;;1800:6;92:4695;;;;;1796:34;;1844:25;;1840:56;;1910:26;;1906:58;;1991:44;;;;:::i;:::-;1978:9;:57;1974:90;;2127:43;92:4695;2180:44;92:4695;-1:-1:-1;92:4695:22;2127:43;92:4695;;2127:43;2180:44;92:4695;;2180:44;2234:13;92:4695;;;1800:6;92:4695;;;1800:6;92:4695;;1974:90;2044:20;;;-1:-1:-1;2044:20:22;92:4695;-1:-1:-1;2044:20:22;1906:58;1945:19;;;-1:-1:-1;1945:19:22;92:4695;-1:-1:-1;1945:19:22;1840:56;1878:18;;;-1:-1:-1;1878:18:22;92:4695;-1:-1:-1;1878:18:22;1796:34;1815:15;;;-1:-1:-1;1815:15:22;92:4695;-1:-1:-1;1815:15:22;92:4695;;;;;;-1:-1:-1;;92:4695:22;;;;;;;:::i;:::-;;;;;;;;;;;;;;;-1:-1:-1;;92:4695:22;;;;;768:35:20;92:4695:22;;;;;;;;;;;;;-1:-1:-1;;92:4695:22;;;;;;1444:18:20;92:4695:22;;;;;;;;;;;;;;;;;;-1:-1:-1;;92:4695:22;;;;;1367:34:20;92:4695:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;-1:-1:-1;;92:4695:22;;;;;;;;;;;;;;:::o;:::-;;:::i;:::-;;;;;;;;-1:-1:-1;;92:4695:22;;;;:::o;:::-;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;-1:-1:-1;92:4695:22;;;;:::o;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;11632:2:25;92:4695:22;;;;;;;:::o;:::-;1984:1:23;92:4695:22;;;1984:1:23;92:4695:22;;;:::o;:::-;;;;;;;;;;:::o;2519:133:20:-;2584:17;92:4695:22;2584:21:20;;;:61;;;;2577:68;2519:133;:::o;2584:61::-;2609:15;;;:36;;2519:133;:::o;92:4695:22:-;-1:-1:-1;;92:4695:22;;;;;;;;:::o;:::-;-1:-1:-1;;92:4695:22;;;;;;;;:::o;:::-;;;;;;;;;;:::o;:::-;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;:::o;2729:743:20:-;;2842:7;92:4695:22;2843:6:20;92:4695:22;;;;;;;;2842:7:20;2838:31;;2897:14;92:4695:22;-1:-1:-1;;;;;92:4695:22;2883:10:20;:28;;;:44;;;2729:743;2879:77;;2990:12;2970:32;;2966:66;;1085:3;3046:32;2990:12;;3046:32;:::i;:::-;:53;3042:85;;3164:28;;3206:29;;3202:64;;92:4695:22;;;;;:::i;:::-;;;;;;3280:22:20;:41;3276:75;;3365:49;;;:::i;:::-;:70;3361:104;;2729:743::o;3361:104::-;3444:21;;;3233:1;3444:21;;3233:1;3444:21;3276:75;3330:21;;;3233:1;3330:21;;3233:1;3330:21;3202:64;3244:22;;;3233:1;3244:22;;3233:1;3244:22;3042:85;3108:19;;;;;;;;2966:66;3011:21;;;;;;;;2879:77;2936:20;;;;;;;;2883:44;2916:11;2915:12;2916:11;;:::i;2915:12::-;2883:44;;92:4695:22;;;;;;;;;;;;;;;;;;:::o;:::-;;:::i;:::-;;;;;;;;;:::o;:::-;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;:::o;6966:926:19:-;;7086:1;-1:-1:-1;;;;;;;;;7134:19:19;;6966:926;;7134:19;:::i;:::-;;-1:-1:-1;;;;;;92:4695:22;;;7134:19:19;92:4695:22;7134:26:19;7130:55;;-1:-1:-1;;;;;;;;;7199:19:19;;;;;:::i;:::-;92:4695:22;7199:27:19;92:4695:22;;7263:19:19;7242:49;7252:39;7257:33;:26;7263:19;;7242:49;7263:19;;;;:::i;:::-;92:4695:22;;;;7257:26:19;:33;:::i;:::-;7252:39;:::i;:::-;92:4695:22;;;;7242:49:19;;;:::i;:::-;7195:149;;7086:1;7442:5;7446:1;7442:5;;;;-1:-1:-1;;;;92:4695:22;-1:-1:-1;;;;;;92:4695:22;7632:19:19;;;;92:4695:22;;7632:19:19;;:::i;:::-;92:4695:22;7632:27:19;7628:60;;7698:11;;;:::i;:::-;7754:98;;6966:926;:::o;7628:60::-;7668:20;;;7086:1;7668:20;7446:1;7086;7668:20;7427:13;7473:28;;92:4695:22;7473:28:19;;;;:::i;:::-;92:4695:22;;7427:13:19;;7195:149;7322:11;7332:1;7195:149;;;7130:55;7169:16;;;7086:1;7169:16;;7086:1;7169:16;720:484:23;92:4695:22;;720:484:23;;;;1148:49;720:484;;92:4695:22;;;:::i;:::-;;;;;:::i;:::-;1148:49:23;;:::i;:::-;720:484;:::o;3172:769:19:-;;3288:33;;;;:::i;:::-;3492:13;3504:1;3507:5;3511:1;3507:5;;;;-1:-1:-1;;;;92:4695:22;-1:-1:-1;;;;;;92:4695:22;3693:19:19;;92:4695:22;;3693:19:19;;:::i;:::-;;92:4695:22;3693:27:19;3689:60;;92:4695:22;;;;;;;3811:94:19;92:4695:22;3811:94:19;;;3172:769::o;3492:13::-;3538:28;;92:4695:22;3538:28:19;;;;:::i;:::-;92:4695:22;;3492:13:19;;8997:993:25;9111:1;9171:21;;;;:52;;;8997:993;9167:123;;8997:993;9364:4;92:4695:22;9336:25:25;9342:18;;;;;;:::i;9336:25::-;92:4695:22;9336:32:25;9332:57;;9716:18;;9409;;;9432:4;92:4695:22;9403:25:25;9409:18;;;;9923:4;9409:18;9710:25;9409:18;;:::i;9403:25::-;92:4695:22;9403:33:25;9432:4;;9473:18;9452:48;9462:38;9467:32;:25;9473:18;;9452:48;9473:18;;;;:::i;9452:48::-;9399:154;9716:18;:::i;9710:25::-;92:4695:22;9909:18:25;9905:56;;9923:4;8997:993;:::o;9905:56::-;9936:25;;;9111:1;9936:25;;9111:1;9936:25;9399:154;9531:11;;;:::i;9332:57::-;9377:12;;;9111:1;9377:12;;9111:1;9377:12;9167:123;7332:1:19;;-1:-1:-1;9167:123:25;;9171:52;9202:13;9219:4;92:4695:22;9196:20:25;9202:13;;;;;:::i;9196:20::-;92:4695:22;9196:27:25;9171:52;;10092:2113;;;10373:1;;92:4695:22;10443:16:25;;;;:42;;10092:2113;10439:485;;10092:2113;10989:4;92:4695:22;10966:20:25;10972:13;;;;;;:::i;10966:20::-;92:4695:22;10966:27:25;10962:52;;11040:13;11058:4;92:4695:22;11034:20:25;11040:13;;11024:78;11040:13;;;;:::i;11034:20::-;92:4695:22;11034:28:25;:68;;92:4695:22;11065:33:25;11070:27;:20;11076:13;;;;;;:::i;11065:33::-;92:4695:22;11024:78:25;;:::i;:::-;11148:13;92:4695:22;11143:149:25;11163:11;;;;;;11376:13;;11394:4;92:4695:22;11370:20:25;11376:13;;;;;;:::i;11370:20::-;92:4695:22;11370:28:25;11366:57;;-1:-1:-1;;;;;92:4695:22;11453:95:25;;;92:4695:22;11453:95:25;;;;11561:23;11557:55;;11622:12;;;:::i;:::-;11694:13;11688:20;11694:13;;;;;;:::i;11688:20::-;11718:13;92:4695:22;;;;;11745:13:25;11754:4;11745:13;;11741:374;11754:4;;;11774:14;;;;;11741:374;12128:23;12124:52;;92:4695:22;10092:2113:25;:::o;12124:52::-;12160:16;;;92:4695:22;12160:16:25;;92:4695:22;12160:16:25;11741:374;11809:14;;;;;11754:4;11809:14;11805:310;11754:4;;;11839:9;;;;;92:4695:22;11741:374:25;;11805:310;11893:13;11879:27;11893:13;;;;;:::i;11879:27::-;11925:13;92:4695:22;11920:185:25;11940:7;;;;;;11805:310;;;;;11741:374;;11925:13;11977:10;;;;;;92:4695:22;11977:10:25;92:4695:22;;;;11977:10:25;11976:43;11991:28;11997:21;;12003:14;:10;;;;:::i;:::-;:14;:::i;:::-;11997:21;;;:::i;11976:43::-;;92:4695:22;;11925:13:25;;;;;;11557:55;11593:19;;;92:4695:22;11593:19:25;;92:4695:22;11593:19:25;11366:57;11407:16;;;92:4695:22;11407:16:25;;92:4695:22;11407:16:25;11148:13;11200:22;;;92:4695:22;11200:22:25;;;;:::i;:::-;92:4695:22;;11148:13:25;;;11034:68;92:4695:22;11101:1:25;11034:68;;10439:485;10522:8;;;10516:15;10522:8;;;;;:::i;10516:15::-;10554:1;;10545:10;92:4695:22;;10573:14:25;;;10554:1;;10607:11;10617:1;10569:345;10439:485;;10569:345;10719:4;10709:14;10719:4;;10753:1;10705:209;10439:485;;10705:209;10880:19;;;92:4695:22;10880:19:25;;92:4695:22;10880:19:25;10443:42;10469:8;10481:4;92:4695:22;10463:15:25;10469:8;;;;;:::i;10463:15::-;92:4695:22;10463:22:25;10443:42;;3867:264:22;5078:10:20;92:4695:22;-1:-1:-1;92:4695:22;;;;;;;;5113:20:20;92:4695:22;;;;;;;;-1:-1:-1;92:4695:22;;;;3969:14;92:4695;-1:-1:-1;;;;;92:4695:22;;;;3969:14;92:4695;;5078:10:20;92:4695:22;;4826:21:20;92:4695:22;;;4857:14:20;92:4695:22;;4857:14:20;92:4695:22;;5113:20:20;92:4695:22;;;;;;;;;;4042:32;;;;:::i;:::-;;4088:8;4084:40;;3867:264::o;3533:184:20:-;3585:11;;:::i;:::-;3581:36;;-1:-1:-1;;;;;92:4695:22;;3628:27:20;92:4695:22;;3628:27:20;92:4695:22;3653:1:20;3665:14;92:4695:22;3653:1:20;3689:21;92:4695:22;3533:184:20:o;3581:36::-;3605:12;;;;;;;;5438:139;5527:20;92:4695:22;5550:20:20;92:4695:22;;;;;;;;5438:139:20;:::o;4479:187::-;4558:10;-1:-1:-1;;;;;92:4695:22;;4541:27:20;92:4695:22;;;4541:27:20;92:4695:22;4616:9:20;4598:15;92:4695:22;4598:15:20;;92:4695:22;;;4578:47:20;92:4695:22;4635:24:20;92:4695:22;4479:187:20:o;92:4695:22:-;;;;;;;;;:::o;:::-;;;;;;;;;;;;;:::o;2102:899:19:-;;;2217:33;;;;:::i;:::-;2452:13;2464:1;2467:5;2471:1;2467:5;;;;2665:42;;;;;:::i;:::-;-1:-1:-1;2754:23:19;2464:1;;2792:13;92:4695:22;;2807:19:19;;;;;92:4695:22;2884:11:19;;;;;:::i;:::-;92:4695:22;;;2857:39:19;2471:1;92:4695:22;2857:39:19;92:4695:22;;2792:13:19;;;2807:19;;-1:-1:-1;;2102:899:19:o;2452:13::-;2498:28;;92:4695:22;2498:28:19;;;;:::i;:::-;92:4695:22;;2452:13:19;;541:1316:24;;;642:21;;;;638:56;;720:19;726:12;;;;;;:::i;720:19::-;92:4695:22;;;;763:4:24;754:13;;763:4;;;817:10;;;;;;;:::i;750:1101::-;848:13;;;857:4;848:13;;857:4;;;912:10;;:28;:10;;926:13;912:10;:28;:10;;:::i;:::-;926:13;;:::i;844:1007::-;961:13;;;970:4;961:13;;970:4;;;1039:13;;1017:35;1039:13;;;;;:::i;1017:35::-;1066:18;92:4695:22;1103:13:24;92:4695:22;1098:194:24;1118:15;;;;;;1312:10;;;:33;:10;;;:24;:10;;:::i;1103:13::-;1164:11;;;;1199:1;1164:11;92:4695:22;;;;1164:11:24;1163:43;1179:27;1185:20;;1190:14;:10;;;;:::i;:14::-;1185:20;;;:::i;1163:43::-;;92:4695:22;;1103:13:24;;;;957:894;1366:13;;;1375:4;-1:-1:-1;1375:4:24;;;1428:10;:28;:10;;1442:13;1428:10;:28;:10;;:::i;:::-;1442:13;;:::i;1362:489::-;1534:13;;;1512:35;1534:13;;:::i;1512:35::-;1561:18;92:4695:22;1598:13:24;92:4695:22;1593:194:24;1613:15;;;;;;1807:10;;;:33;:10;;;:24;:10;;:::i;1598:13::-;1659:11;;;;1694:1;1659:11;92:4695:22;;;;1659:11:24;1658:43;1674:27;1680:20;;1685:14;:10;;;;:::i;1658:43::-;;92:4695:22;;1598:13:24;;;;638:56;672:22;;;92:4695:22;672:22:24;;92:4695:22;672:22:24;1567:2467:23;;;;;;;-1:-1:-1;;;;;;;;;1809:13:23;;1567:2467;;1809:13;:::i;:::-;92:4695:22;1809:20:23;1805:50;;-1:-1:-1;;;;;;;;;1870:13:23;;;;;:::i;:::-;92:4695:22;1870:21:23;92:4695:22;;1984:15:23;1907:49;1929:27;:20;1935:13;;;;;:::i;1907:49::-;1984:15;:::i;:::-;1866:190;;;;2102:33;92:4695:22;2184:31:23;;;;;;4015:12;;;;;;;92:4695:22;1567:2467:23;:::o;2177:1828::-;2368:25;2321:33;92:4695:22;;;;;;:::i;:::-;2321:33:23;:::i;:::-;2368:25;;;:::i;:::-;92:4695:22;;;;;;2465:15:23;:30;2461:81;;-1:-1:-1;;;2641:15:23;:7;;;;:::i;:::-;92:4695:22;-1:-1:-1;;;;;;92:4695:22;;;2641:7:23;-1:-1:-1;;;;;;92:4695:22;;;2641:15:23;;92:4695:22;;2676:14:23;;;2689:1;-1:-1:-1;;;2712:15:23;:7;;;;:::i;:15::-;;;2708:97;;2637:1358;2839:32;;;;:::i;:::-;2903:2;2894:11;;2903:2;;3044:58;;;;:::i;:::-;3129:8;;;3125:26;;3177:21;;3173:38;;3280:21;2890:1040;;2177:1828;;;;;;3173:38;3200:11;;;;;;;2689:1;3200:11;:::o;3125:26::-;3139:12;;;;;;;92:4695:22;3139:12:23;:::o;2890:1040::-;3330:10;;-1:-1:-1;3339:1:23;3330:10;3339:1;;-1:-1:-1;3339:1:23;;3490:67;;;;;;:::i;:::-;3584:8;;;3580:75;;3680:21;;3676:87;;3831:21;3326:604;2890:1040;;3326:604;3899:12;;;;;;;;92:4695:22;3899:12:23;:::o;2708:97::-;2771:7;2751:35;;2765:21;:14;2771:7;;;;:::i;2751:35::-;2708:97;;1866:190;2044:1;1866:190;;;;;1805:50;1838:17;;;92:4695:22;1838:17:23;;92:4695:22;1838:17:23;804:1134:19;920:1;-1:-1:-1;;;;;;;;;974:19:19;;;;;:::i;:::-;92:4695:22;974:26:19;970:55;;-1:-1:-1;;;;;;;;;1039:19:19;;;;;:::i;:::-;92:4695:22;1039:27:19;92:4695:22;;1103:19:19;1082:49;1092:39;1097:33;:26;1103:19;;1082:49;1103:19;;;;:::i;1082:49::-;1035:149;;1287:5;1270:13;:22;:48;;;;1035:149;1266:642;;1035:149;1918:13;;;804:1134;:::o;1266:642::-;920:1;1446:5;1450:1;1446:5;;;;-1:-1:-1;;;;1668:26:19;:19;;;;;;:::i;:26::-;;1664:55;;-1:-1:-1;;;1737:27:19;:19;;;;;;:::i;:27::-;;92:4695:22;;1794:39:19;1799:33;:26;1805:19;;;1784:49;1805:19;1784:49;1805:19;;:::i;1784:49::-;1266:642;;;;1733:165;1872:11;;;;;:::i;:::-;1733:165;;1431:13;1481:28;;92:4695:22;1481:28:19;;;;:::i;:::-;92:4695:22;;1431:13:19;;1270:48;:13;1313:5;1270:13;1296:22;1270:48;;1035:149;1162:11;7332:1;1035:149;;;92:4695:22;;;;;;:::i;:::-;4560:1:19;92:4695:22;;;-1:-1:-1;;92:4695:22;;;;;;:::o;:::-;;;;;;:::i;:::-;;;;;;;;;;;:::i;:::-;;;;;;;;:::o;4204:1558:19:-;4373:21;;;;4369:56;;4451:19;4457:12;;;;;;:::i;4451:19::-;92:4695:22;;;;4494:4:19;4485:13;;4494:4;;;4550:12;;;;;;:::i;:::-;92:4695:22;;;-1:-1:-1;;;;;;92:4695:22;;4576:26:19;;92:4695:22;4576:26:19;:::i;:::-;;4616:18;4560:1;4616:18;:::o;4481:1275::-;4664:4;4655:13;;;;;;;;4651:1105;4664:4;;;4733:13;;4712:34;4733:13;;:::i;4712:34::-;4769:21;;;;:::i;:::-;4809:13;92:4695:22;4824:14:19;;;;;;5006;;;;;;;:::i;4809:13::-;4876:10;4871:20;;4876:14;4885:1;4876:10;;;;:::i;:14::-;4871:20;;;:::i;:::-;92:4695:22;4859:32:19;;;;;:::i;:::-;;92:4695:22;4809:13:19;;4651:1105;5051:4;-1:-1:-1;5051:4:19;;;5120:13;5098:35;5120:13;;:::i;5098:35::-;5147:22;92:4695:22;5188:13:19;92:4695:22;5203:15:19;;;;;;5407:21;;;;:::i;:::-;5447:13;92:4695:22;5462:14:19;;;;;;5658:15;;;;;;:28;:15;;:::i;5447:13::-;5514:10;5509:34;;5514:28;5292:1;5514:10;:24;:10;;;;:::i;5509:34::-;92:4695:22;5497:46:19;;;;;:::i;:::-;;92:4695:22;5447:13:19;;5188;5253:15;5292:1;;92:4695:22;;5252:47:19;5272:27;5278:20;;5283:14;:10;;;;:::i;:14::-;5278:20;;;:::i;5252:47::-;;92:4695:22;;5188:13:19;;5038:718;5725:20;;;92:4695:22;5725:20:19;;92:4695:22;5725:20:19;2143:1860:24;92:4695:22;;2257:21:24;;;2253:56;;2335:19;2341:12;;;;;:::i;2335:19::-;92:4695:22;;;;2378:4:24;2369:13;;2378:4;;;2447:12;;;;;:::i;2365:1632::-;2552:13;;;;;2561:4;2552:13;;2561:4;;;2626:13;;2609:30;2626:13;;:::i;2609:30::-;2675:17;;;;:::i;:::-;2711:13;92:4695:22;2726:10:24;;;;;;2904;;;;;;:::i;2711:13::-;2774:10;2769:20;;2774:14;2783:1;2774:10;;;;:::i;:14::-;2769:20;;:::i;:::-;92:4695:22;2757:32:24;;;;;:::i;:::-;;92:4695:22;2711:13:24;;2548:1449;2945:4;-1:-1:-1;2945:4:24;;;3014:13;2992:35;3014:13;;:::i;2992:35::-;92:4695:22;3078:13:24;92:4695:22;3093:15:24;;;;;;3302:17;;;;:::i;:::-;3338:13;92:4695:22;3353:10:24;;;;;;3545:15;;;;;:24;:15;;:::i;3338:13::-;3401:10;3396:34;;3401:28;3174:1;3401:10;:24;:10;;;;:::i;3396:34::-;92:4695:22;3384:46:24;;;;;:::i;:::-;;92:4695:22;3338:13:24;;3078;3139:11;3174:1;;92:4695:22;;3138:43:24;3154:27;3160:20;;3165:14;:10;;;;:::i;:14::-;3160:20;;:::i;3138:43::-;;92:4695:22;;3078:13:24;;2932:1065;3676:27;;;;;;:::i;:::-;3739:22;;;;:::i;:::-;3780:13;92:4695:22;3795:15:24;;;;;;3958:28;;;;;:::o;3780:13::-;3848:10;3843:16;;3848:10;92:4695:22;3848:10:24;;;:::i;3843:16::-;92:4695:22;3831:28:24;;;;;:::i;:::-;;92:4695:22;3780:13:24;;4233:351:23;4392:1;;4233:351;4403:153;92:4695:22;;4410:20:23;;;;;4456:26;;;;:::i;:::-;92:4695:22;;;;;;;;4446:36:23;92:4695:22;;4403:153:23;;;4410:20;;;4233:351::o;92:4695:22:-;;;;;;;;;7928:1:23;92:4695:22;;;;;;;:::o;7310:1816:23:-;;;;;7616:26;;;;:::i;:::-;7673:9;;7740:26;7686:4;7667:16;7673:9;;;;:::i;7667:16::-;:23;7666:30;;7740:26;;:::i;:::-;7777:1343;;;;;;92:4695:22;7885:26:23;92:4695:22;;7885:26:23;;:::i;:::-;7915:14;92:4695:22;;7915:14:23;:::i;:::-;7885:44;7881:546;;7777:1343;8441:29;;;;;;;7680:1;8441:29;7680:1;8441:29;7680:1;8441:29;:::o;7881:546::-;7949:22;;7967:4;92:4695:22;;;7989:114:23;;7881:546;8121:292;;;;;7881:546;;;;8121:292;8187:38;8202:22;;;;:::i;:::-;8187:38;;:::i;:::-;92:4695:22;7686:4:23;92:4695:22;;;;8251:20:23;92:4695:22;7686:4:23;92:4695:22;;;;8275:16:23;8251:40;8247:148;;8121:292;;;;;;8247:148;8333:26;92:4695:22;;8333:26:23;;:::i;:::-;7967:4;;7680:1;;8319:53::o;7989:114::-;8048:36;;;;:::i;:::-;7989:114;;;;;7777:1343;8535:37;8536:36;;;;;;;;:::i;8535:37::-;8531:105;;8676:38;8691:22;;;;:::i;8676:38::-;8728:12;;92:4695:22;;7686:4:23;8758:20;;8754:294;7686:4;;;8798:80;7686:4;9076:26;8798:80;;;8754:294;;92:4695:22;9076:26:23;;:::i;:::-;9062:47;9070:4;9062:47;;;:::o;8754:294::-;8902:18;;;;7686:4;9076:26;92:4695:22;;8947:18:23;8898:150;8754:294;;8898:150;9004:29;;;;7680:1;9004:29;7680:1;9004:29;7680:1;9004:29;:::o;8531:105::-;8592:29;;;;;7680:1;8592:29;7680:1;8592:29;7680:1;8592:29;:::o;5044:1795::-;;;;;5315:14;92:4695:22;;5315:14:23;:::i;:::-;5302:27;;;5298:630;;5998:13;5994:18;;5988:25;5998:13;;;92:4695:22;;;;5998:13:23;5994:18;;:::i;5988:25::-;92:4695:22;;;6027:13:23;;92:4695:22;;;;6023:122:23;;6244:13;-1:-1:-1;6239:165:23;6259:10;92:4695:22;;;6259:10:23;;;;6441:28;;;;;:::i;:::-;92:4695:22;;;6483:20:23;;6479:96;;6812:13;;6630:2;6611:21;;6630:2;;;6648:73;;;;6607:181;6812:13;:::i;6607:181::-;6630:2;92:4695:22;6758:19:23;6607:181;6812:13;:::i;6479:96::-;6519:29;;;-1:-1:-1;6519:29:23;-1:-1:-1;6519:29:23;-1:-1:-1;6519:29:23;:::o;6244:13::-;6302:32;;92:4695:22;6286:48:23;6302:32;;92:4695:22;6302:32:23;;;:::i;6286:48::-;92:4695:22;;;;6244:13:23;;-1:-1:-1;6244:13:23;;6023:122;6130:4;6121:13;6023:122;;;5298:630;5401:32;;;;;;-1:-1:-1;5447:179:23;5467:6;5471:2;5467:6;;;;5667:27;;;;:::i;:::-;92:4695:22;;;;;;5712:20:23;92:4695:22;;;;;;5736:16:23;5712:40;5708:210;5736:16;;;92:4695:22;5772:36:23;;-1:-1:-1;5772:36:23;:::o;5708:210::-;-1:-1:-1;;;;;;;5874:29:23:o;5452:13::-;5509:31;5494:46;5509:31;;92:4695:22;5509:31:23;;;:::i;5494:46::-;92:4695:22;;5452:13:23;;;;4217:1141:24;;92:4695:22;;4321:21:24;;;4317:56;;4399:19;4405:12;;;;;:::i;4399:19::-;92:4695:22;;;;4442:4:24;4433:13;;4442:4;;;4462:8;;;;4469:1;4462:8;:::o;4429:923::-;4500:4;4491:13;;4500:4;;;4532:13;;;4527:19;4532:13;4520:26;4532:13;;:::i;4487:865::-;4576:4;4567:13;;4576:4;;;4618:13;;;4596:35;4618:13;;:::i;4596:35::-;4645:18;92:4695:22;4682:13:24;92:4695:22;4677:194:24;4697:15;;;;;;4891;;;;;:24;:15;;:::i;4682:13::-;4743:11;;;;4778:1;4743:11;92:4695:22;;;;4743:11:24;4742:43;4758:27;4764:20;;4769:14;:10;;;;:::i;:14::-;4764:20;;:::i;4742:43::-;;92:4695:22;;4682:13:24;;;;4563:789;4945:4;-1:-1:-1;4945:4:24;;;4977:13;;4972:19;4977:13;4965:26;4977:13;;:::i;4932:420::-;5044:13;;5022:35;5044:13;;:::i;5022:35::-;5071:18;92:4695:22;5108:13:24;92:4695:22;5103:194:24;5123:15;;;;;;5317;;;;;:24;:15;;:::i;5108:13::-;5169:11;;;;5204:1;5169:11;92:4695:22;;;;5169:11:24;5168:43;5184:27;5190:20;;5195:14;:10;;;;:::i;5168:43::-;;92:4695:22;;5108:13:24;;;;9295:1058:23;;92:4695:22;;9395:19:23;9391:39;;9459:17;9465:10;;;;:::i;9459:17::-;9512:4;9500:16;;9499:23;9512:4;;9596:33;9606:22;:18;92:4695:22;;9606:18:23;:::i;:::-;:22;:::i;:::-;9596:33;:::i;:::-;92:4695:22;;;-1:-1:-1;;;92:4695:22;9413:1:23;9643:36;;92:4695:22;9643:36:23;:::i;:::-;;9627:1;9698:13;92:4695:22;;9713:18:23;;;;;9785:10;9772:30;9779:22;:17;9785:10;;9627:1;9785:10;;;:::i;9779:17::-;92:4695:22;;;;;;9779:22:23;92:4695:22;;-1:-1:-1;;;;;;92:4695:22;;;9772:30:23;9752:50;9759:9;:5;;;:::i;:9::-;9752:50;9413:1;9752:50;;;;:::i;:::-;;9836:32;9674:4;9843:17;9849:10;;;;;:::i;9843:17::-;:24;92:4695:22;;-1:-1:-1;;;;;;92:4695:22;;;9836:32:23;9820:48;9827:5;;;:::i;9820:48::-;;92:4695:22;9698:13:23;;9713:18;-1:-1:-1;9713:18:23;-1:-1:-1;9295:1058:23:o;9562:761::-;92:4695:22;9993:33:23;10003:22;:18;92:4695:22;;10003:18:23;:::i;:::-;:22;:::i;9993:33::-;10057:1;10045:13;92:4695:22;;10060:18:23;;;;;10134:10;10121:30;10128:22;:17;10134:10;;10057:1;10134:10;;;:::i;10121:30::-;10099:52;10106:11;10107:5;;;:::i;:::-;10106:11;:::i;10099:52::-;;10195:32;10222:4;10202:17;10208:10;;;;;:::i;10195:32::-;10169:58;10176:15;:11;10177:5;;;:::i;10176:11::-;:15;:::i;10169:58::-;;92:4695:22;10045:13:23;;9391:39;9416:14::o;10590:651::-;;;;10709:23;92:4695:22;;10709:23:23;;:::i;:::-;10735:14;92:4695:22;;10735:14:23;:::i;:::-;-1:-1:-1;10705:58:23;;-1:-1:-1;10779:13:23;92:4695:22;;10794:18:23;;;;;10862:16;10863:10;;;;:::i;:::-;92:4695:22;;;;10862:16:23;10863:10;;10915:33;:28;10921:21;;10925:16;10926:10;;;;:::i;:::-;92:4695:22;;;;10925:16:23;10921:21;;:::i;10915:33::-;92:4695:22;11067:30:23;11080:17;11086:10;;;;;:::i;11067:30::-;92:4695:22;;11067:30:23;11063:81;;92:4695:22;;10779:13:23;;11063:81;11117:12;;;;-1:-1:-1;11117:12:23;:::o;10858:191::-;11030:4;10999:28;11005:21;;11009:16;11010:10;;;;:::i;10999:28::-;:35;10858:191;;10794:18;;;;;92:4695:22;10590:651:23;:::o;10705:58::-;10751:12;;;-1:-1:-1;10751:12:23;:::o","linkReferences":{},"immutableReferences":{"40450":[{"start":342,"length":32},{"start":1039,"length":32},{"start":1492,"length":32},{"start":1670,"length":32}],"40458":[{"start":775,"length":32},{"start":1574,"length":32}],"40460":[{"start":741,"length":32},{"start":909,"length":32}]}},"methodIdentifiers":{"MAX_BLOCK_LOOKBACK()":"3d2691bc","bond()":"64c9ec6f","bondAmount()":"80f323a7","bondedExecutor()":"1aa7c0ec","cancellationRequest()":"308657d7","collect((bytes,bytes,bytes,bytes,bytes,bytes),uint256)":"23a8b41a","currentPaymentAmount()":"8bd03d0a","currentRewardAmount()":"5a4fd645","executionDeadline()":"33ee5f35","expectedAmount()":"2feef2ec","expectedRecipient()":"8677ab23","fund(uint256,uint256)":"a65e2cfd","funded()":"f3a504f2","is_bonded()":"cb766a56","originalRewardAmount()":"d415b3f9","requestCancellation()":"81972d00","resume()":"046f7da2","totalBondsDeposited()":"fe03a460","withdraw()":"3ccfd60b"},"rawMetadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_expectedRecipient\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_expectedAmount\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_currentRewardAmount\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_currentPaymentAmount\",\"type\":\"uint256\"}],\"stateMutability\":\"payable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"AlreadyFunded\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"AmountMismatch\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"BlockHashUnavailable\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"BlockHeaderMismatch\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"BlockNumberMismatch\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"BondActive\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"CancellationRequested\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ETHTransferFailed\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ExecutorAlreadyBonded\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ExpectedRLPList\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ExpectedStringItem\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"IncorrectETHAmount\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InsufficientBond\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidAddress\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidNativeTransfer\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidRLP\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidRLPEncoding\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidRLPList\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidReceiptProof\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidTxProof\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"NoWithdrawableFunds\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"NotFunded\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OnlyBondedExecutor\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OnlyDeployer\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"RLPOffsetOutOfBounds\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"RLPOffsetOutOfBounds\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ReceiptStatusNotSuccess\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"RecipientMismatch\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"TargetBlockInFuture\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"TargetBlockTooOld\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"TxFailed\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"UnsupportedTxType\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ZeroPaymentAmount\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ZeroRewardAmount\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"MAX_BLOCK_LOOKBACK\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"bond\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"bondAmount\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"bondedExecutor\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"cancellationRequest\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes\",\"name\":\"blockHeader\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"transactionRlp\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"txProofNodes\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"receiptRlp\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"receiptProofNodes\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"path\",\"type\":\"bytes\"}],\"internalType\":\"struct EscrowNative.NativeTransferProof\",\"name\":\"proof\",\"type\":\"tuple\"},{\"internalType\":\"uint256\",\"name\":\"targetBlockNumber\",\"type\":\"uint256\"}],\"name\":\"collect\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"currentPaymentAmount\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"currentRewardAmount\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"executionDeadline\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"expectedAmount\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"expectedRecipient\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_currentRewardAmount\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_currentPaymentAmount\",\"type\":\"uint256\"}],\"name\":\"fund\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"funded\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"is_bonded\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"originalRewardAmount\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"requestCancellation\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"resume\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"totalBondsDeposited\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"withdraw\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"src/EscrowNative.sol\":\"EscrowNative\"},\"evmVersion\":\"prague\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[\":forge-std/=lib/forge-std/src/\"],\"viaIR\":true},\"sources\":{\"src/BlockHeaderParser.sol\":{\"keccak256\":\"0x10923e70f1bcc22107b31b5bd580dc0e58fb634dfc07baefb34609e3a3c3cee7\",\"license\":\"UNLICENSED\",\"urls\":[\"bzz-raw://2b3ba3998470d6c0aaf7906d21d8787dfbdded50a4683c89915295b2c2fe0ea5\",\"dweb:/ipfs/QmRiFmEeNN2HgXzabtyMVsVUBUCTrknW7ZiKTdajyQSscp\"]},\"src/EscrowBase.sol\":{\"keccak256\":\"0x53fd262562c9dbc7779339bafbeca6b86b690aec7ac864e30c57e0e42288a11d\",\"license\":\"UNLICENSED\",\"urls\":[\"bzz-raw://cb43380f5b0a131e1ac4405a43a67b9d2b07718eb05ba675fe46c106b8a12649\",\"dweb:/ipfs/QmNk5QkryXnDspEGc8mdyFYJSRXWRSP8V6yirLC98EKZYG\"]},\"src/EscrowNative.sol\":{\"keccak256\":\"0x97b788773c848491254bba688d24b146ca839c61c4fe411bd059d9722c6e8730\",\"license\":\"UNLICENSED\",\"urls\":[\"bzz-raw://ca169e73078a27043f1659a97210b1575edadcf74f3436c4acaafd08409f6623\",\"dweb:/ipfs/QmSAsWN2ioPa22Mv86LnAtN4rCECdUnrz5dPT6aLCZAhU3\"]},\"src/MPTVerifier.sol\":{\"keccak256\":\"0xf71ff6fc0fa054681fc67b7ca3c187141749b04895defd977d6989271b35ebeb\",\"license\":\"UNLICENSED\",\"urls\":[\"bzz-raw://6e2efbdee9d872e22febc5d29894e3759e72ed43850a512c9eed56a9f5e7ff3b\",\"dweb:/ipfs/QmShY9TstL2zXVSYH7ux8D6ByW22ptm7JfiEWy2qs7bHZU\"]},\"src/RLPParser.sol\":{\"keccak256\":\"0x403e6fd0cbf2e3599530d724d26e75b136bd7947e35e1cf5f79b30841b2c4c6c\",\"license\":\"UNLICENSED\",\"urls\":[\"bzz-raw://b24f44c75ae8db00297a940d0badb6b0fd9114b494b1a5c097a04f4bccde5e1d\",\"dweb:/ipfs/QmSoxh5vZu41RzAs8RTLXgQ5cD5pQBeQo68nYSFh4Dk5Xk\"]},\"src/ReceiptValidator.sol\":{\"keccak256\":\"0xd6deda056e80a69708354d192fa2e336841bf2a4d98dfa68eee4c3f550306015\",\"license\":\"UNLICENSED\",\"urls\":[\"bzz-raw://84686c66f4f5b66b3dc0315840aacb037f9fc21c60b6a58b298c6480d9ce0929\",\"dweb:/ipfs/QmSavcuzdBkNUXVyzCa4ysZY1kM7Tmt82wWFq2F3kTvwZo\"]}},\"version\":1}","metadata":{"compiler":{"version":"0.8.30+commit.73712a01"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"address","name":"_expectedRecipient","type":"address"},{"internalType":"uint256","name":"_expectedAmount","type":"uint256"},{"internalType":"uint256","name":"_currentRewardAmount","type":"uint256"},{"internalType":"uint256","name":"_currentPaymentAmount","type":"uint256"}],"stateMutability":"payable","type":"constructor"},{"inputs":[],"type":"error","name":"AlreadyFunded"},{"inputs":[],"type":"error","name":"AmountMismatch"},{"inputs":[],"type":"error","name":"BlockHashUnavailable"},{"inputs":[],"type":"error","name":"BlockHeaderMismatch"},{"inputs":[],"type":"error","name":"BlockNumberMismatch"},{"inputs":[],"type":"error","name":"BondActive"},{"inputs":[],"type":"error","name":"CancellationRequested"},{"inputs":[],"type":"error","name":"ETHTransferFailed"},{"inputs":[],"type":"error","name":"ExecutorAlreadyBonded"},{"inputs":[],"type":"error","name":"ExpectedRLPList"},{"inputs":[],"type":"error","name":"ExpectedStringItem"},{"inputs":[],"type":"error","name":"IncorrectETHAmount"},{"inputs":[],"type":"error","name":"InsufficientBond"},{"inputs":[],"type":"error","name":"InvalidAddress"},{"inputs":[],"type":"error","name":"InvalidNativeTransfer"},{"inputs":[],"type":"error","name":"InvalidRLP"},{"inputs":[],"type":"error","name":"InvalidRLPEncoding"},{"inputs":[],"type":"error","name":"InvalidRLPList"},{"inputs":[],"type":"error","name":"InvalidReceiptProof"},{"inputs":[],"type":"error","name":"InvalidTxProof"},{"inputs":[],"type":"error","name":"NoWithdrawableFunds"},{"inputs":[],"type":"error","name":"NotFunded"},{"inputs":[],"type":"error","name":"OnlyBondedExecutor"},{"inputs":[],"type":"error","name":"OnlyDeployer"},{"inputs":[],"type":"error","name":"RLPOffsetOutOfBounds"},{"inputs":[],"type":"error","name":"RLPOffsetOutOfBounds"},{"inputs":[],"type":"error","name":"ReceiptStatusNotSuccess"},{"inputs":[],"type":"error","name":"RecipientMismatch"},{"inputs":[],"type":"error","name":"TargetBlockInFuture"},{"inputs":[],"type":"error","name":"TargetBlockTooOld"},{"inputs":[],"type":"error","name":"TxFailed"},{"inputs":[],"type":"error","name":"UnsupportedTxType"},{"inputs":[],"type":"error","name":"ZeroPaymentAmount"},{"inputs":[],"type":"error","name":"ZeroRewardAmount"},{"inputs":[],"stateMutability":"view","type":"function","name":"MAX_BLOCK_LOOKBACK","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[],"stateMutability":"payable","type":"function","name":"bond"},{"inputs":[],"stateMutability":"view","type":"function","name":"bondAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"bondedExecutor","outputs":[{"internalType":"address","name":"","type":"address"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"cancellationRequest","outputs":[{"internalType":"bool","name":"","type":"bool"}]},{"inputs":[{"internalType":"struct EscrowNative.NativeTransferProof","name":"proof","type":"tuple","components":[{"internalType":"bytes","name":"blockHeader","type":"bytes"},{"internalType":"bytes","name":"transactionRlp","type":"bytes"},{"internalType":"bytes","name":"txProofNodes","type":"bytes"},{"internalType":"bytes","name":"receiptRlp","type":"bytes"},{"internalType":"bytes","name":"receiptProofNodes","type":"bytes"},{"internalType":"bytes","name":"path","type":"bytes"}]},{"internalType":"uint256","name":"targetBlockNumber","type":"uint256"}],"stateMutability":"nonpayable","type":"function","name":"collect"},{"inputs":[],"stateMutability":"view","type":"function","name":"currentPaymentAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"currentRewardAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"executionDeadline","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"expectedAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"expectedRecipient","outputs":[{"internalType":"address","name":"","type":"address"}]},{"inputs":[{"internalType":"uint256","name":"_currentRewardAmount","type":"uint256"},{"internalType":"uint256","name":"_currentPaymentAmount","type":"uint256"}],"stateMutability":"payable","type":"function","name":"fund"},{"inputs":[],"stateMutability":"view","type":"function","name":"funded","outputs":[{"internalType":"bool","name":"","type":"bool"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"is_bonded","outputs":[{"internalType":"bool","name":"","type":"bool"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"originalRewardAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[],"stateMutability":"nonpayable","type":"function","name":"requestCancellation"},{"inputs":[],"stateMutability":"nonpayable","type":"function","name":"resume"},{"inputs":[],"stateMutability":"view","type":"function","name":"totalBondsDeposited","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[],"stateMutability":"nonpayable","type":"function","name":"withdraw"}],"devdoc":{"kind":"dev","methods":{},"version":1},"userdoc":{"kind":"user","methods":{},"version":1}},"settings":{"remappings":["forge-std/=lib/forge-std/src/"],"optimizer":{"enabled":true,"runs":200},"metadata":{"bytecodeHash":"ipfs"},"compilationTarget":{"src/EscrowNative.sol":"EscrowNative"},"evmVersion":"prague","libraries":{},"viaIR":true},"sources":{"src/BlockHeaderParser.sol":{"keccak256":"0x10923e70f1bcc22107b31b5bd580dc0e58fb634dfc07baefb34609e3a3c3cee7","urls":["bzz-raw://2b3ba3998470d6c0aaf7906d21d8787dfbdded50a4683c89915295b2c2fe0ea5","dweb:/ipfs/QmRiFmEeNN2HgXzabtyMVsVUBUCTrknW7ZiKTdajyQSscp"],"license":"UNLICENSED"},"src/EscrowBase.sol":{"keccak256":"0x53fd262562c9dbc7779339bafbeca6b86b690aec7ac864e30c57e0e42288a11d","urls":["bzz-raw://cb43380f5b0a131e1ac4405a43a67b9d2b07718eb05ba675fe46c106b8a12649","dweb:/ipfs/QmNk5QkryXnDspEGc8mdyFYJSRXWRSP8V6yirLC98EKZYG"],"license":"UNLICENSED"},"src/EscrowNative.sol":{"keccak256":"0x97b788773c848491254bba688d24b146ca839c61c4fe411bd059d9722c6e8730","urls":["bzz-raw://ca169e73078a27043f1659a97210b1575edadcf74f3436c4acaafd08409f6623","dweb:/ipfs/QmSAsWN2ioPa22Mv86LnAtN4rCECdUnrz5dPT6aLCZAhU3"],"license":"UNLICENSED"},"src/MPTVerifier.sol":{"keccak256":"0xf71ff6fc0fa054681fc67b7ca3c187141749b04895defd977d6989271b35ebeb","urls":["bzz-raw://6e2efbdee9d872e22febc5d29894e3759e72ed43850a512c9eed56a9f5e7ff3b","dweb:/ipfs/QmShY9TstL2zXVSYH7ux8D6ByW22ptm7JfiEWy2qs7bHZU"],"license":"UNLICENSED"},"src/RLPParser.sol":{"keccak256":"0x403e6fd0cbf2e3599530d724d26e75b136bd7947e35e1cf5f79b30841b2c4c6c","urls":["bzz-raw://b24f44c75ae8db00297a940d0badb6b0fd9114b494b1a5c097a04f4bccde5e1d","dweb:/ipfs/QmSoxh5vZu41RzAs8RTLXgQ5cD5pQBeQo68nYSFh4Dk5Xk"],"license":"UNLICENSED"},"src/ReceiptValidator.sol":{"keccak256":"0xd6deda056e80a69708354d192fa2e336841bf2a4d98dfa68eee4c3f550306015","urls":["bzz-raw://84686c66f4f5b66b3dc0315840aacb037f9fc21c60b6a58b298c6480d9ce0929","dweb:/ipfs/QmSavcuzdBkNUXVyzCa4ysZY1kM7Tmt82wWFq2F3kTvwZo"],"license":"UNLICENSED"}},"version":1},"id":22} \ No newline at end of file +{"abi":[{"type":"constructor","inputs":[{"name":"_expectedRecipient","type":"address","internalType":"address"},{"name":"_expectedAmount","type":"uint256","internalType":"uint256"},{"name":"_currentRewardAmount","type":"uint256","internalType":"uint256"},{"name":"_currentPaymentAmount","type":"uint256","internalType":"uint256"}],"stateMutability":"payable"},{"type":"function","name":"MAX_BLOCK_LOOKBACK","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"bond","inputs":[],"outputs":[],"stateMutability":"payable"},{"type":"function","name":"bondAmount","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"bondedExecutor","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"type":"function","name":"cancellationRequest","inputs":[],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"collect","inputs":[{"name":"proof","type":"tuple","internalType":"struct EscrowNative.NativeTransferProof","components":[{"name":"blockHeader","type":"bytes","internalType":"bytes"},{"name":"transactionRlp","type":"bytes","internalType":"bytes"},{"name":"txProofNodes","type":"bytes","internalType":"bytes"},{"name":"receiptRlp","type":"bytes","internalType":"bytes"},{"name":"receiptProofNodes","type":"bytes","internalType":"bytes"},{"name":"path","type":"bytes","internalType":"bytes"}]},{"name":"targetBlockNumber","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"currentPaymentAmount","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"currentRewardAmount","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"executionDeadline","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"expectedAmount","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"expectedRecipient","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"type":"function","name":"fund","inputs":[{"name":"_currentRewardAmount","type":"uint256","internalType":"uint256"},{"name":"_currentPaymentAmount","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"payable"},{"type":"function","name":"funded","inputs":[],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"is_bonded","inputs":[],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"originalRewardAmount","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"requestCancellation","inputs":[],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"resume","inputs":[],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"totalBondsDeposited","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"withdraw","inputs":[],"outputs":[],"stateMutability":"nonpayable"},{"type":"error","name":"AlreadyFunded","inputs":[]},{"type":"error","name":"AmountMismatch","inputs":[]},{"type":"error","name":"BlockHashUnavailable","inputs":[]},{"type":"error","name":"BlockHeaderMismatch","inputs":[]},{"type":"error","name":"BlockNumberMismatch","inputs":[]},{"type":"error","name":"BondActive","inputs":[]},{"type":"error","name":"CancellationRequested","inputs":[]},{"type":"error","name":"ETHTransferFailed","inputs":[]},{"type":"error","name":"ExecutorAlreadyBonded","inputs":[]},{"type":"error","name":"ExpectedRLPList","inputs":[]},{"type":"error","name":"IncorrectETHAmount","inputs":[]},{"type":"error","name":"InsufficientBond","inputs":[]},{"type":"error","name":"InvalidAddress","inputs":[]},{"type":"error","name":"InvalidNativeTransfer","inputs":[]},{"type":"error","name":"InvalidRLP","inputs":[]},{"type":"error","name":"InvalidRLPEncoding","inputs":[]},{"type":"error","name":"InvalidRLPList","inputs":[]},{"type":"error","name":"InvalidReceiptProof","inputs":[]},{"type":"error","name":"InvalidTxProof","inputs":[]},{"type":"error","name":"NoWithdrawableFunds","inputs":[]},{"type":"error","name":"NotFunded","inputs":[]},{"type":"error","name":"OnlyBondedExecutor","inputs":[]},{"type":"error","name":"OnlyDeployer","inputs":[]},{"type":"error","name":"RLPOffsetOutOfBounds","inputs":[]},{"type":"error","name":"ReceiptStatusNotSuccess","inputs":[]},{"type":"error","name":"RecipientMismatch","inputs":[]},{"type":"error","name":"TargetBlockInFuture","inputs":[]},{"type":"error","name":"TargetBlockTooOld","inputs":[]},{"type":"error","name":"TxFailed","inputs":[]},{"type":"error","name":"UnsupportedTxType","inputs":[]},{"type":"error","name":"ZeroPaymentAmount","inputs":[]},{"type":"error","name":"ZeroRewardAmount","inputs":[]}],"bytecode":{"object":"0x60e0601f611e4e38819003918201601f19168301916001600160401b038311848410176101205780849260809460405283398101031261011c578051906001600160a01b038216820361011c576020810151606060408301519201519260a05260c0523360805280151580610113575b6100c1575b604051611d19908161013582396080518181816101560152818161040f015281816105d40152610686015260a0518181816103070152610626015260c0518181816102e5015261038d0152f35b8181018082116100ff5734036100f057805f5560025560015561010061ff001960075416176007555f80610074565b63201c04ab60e01b5f5260045ffd5b634e487b7160e01b5f52601160045260245ffd5b5081151561006f565b5f80fd5b634e487b7160e01b5f52604160045260245ffdfe60806040526004361015610011575f80fd5b5f3560e01c8063046f7da2146101445780631aa7c0ec1461013f57806323a8b41a1461013a5780632feef2ec14610135578063308657d71461013057806333ee5f351461012b5780633ccfd60b146101265780633d2691bc146101215780635a4fd6451461011c57806364c9ec6f1461011757806380f323a71461011257806381972d001461010d5780638677ab23146101085780638bd03d0a14610103578063a65e2cfd146100fe578063cb766a56146100f9578063d415b3f9146100f4578063f3a504f2146100ef5763fe03a460146100ea575f80fd5b6107a7565b610782565b610765565b610741565b610672565b610655565b610611565b6105c2565b6105a5565b6104e7565b6104cb565b6104af565b6103ef565b6103d2565b6103b0565b610376565b6101cb565b6101a3565b3461019f575f36600319011261019f577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03163303610190576007805460ff19169055005b63618bbdd560e01b5f5260045ffd5b5f80fd5b3461019f575f36600319011261019f576003546040516001600160a01b039091168152602090f35b3461019f57604036600319011261019f5760043567ffffffffffffffff811161019f57806004019060c0600319823603011261019f5761021760243561021184806107c4565b90610934565b61022a61022483806107c4565b90610aa4565b602482019161026b61026761023f85876107c4565b61024f60448697939701896107c4565b60a48701979161025f898c6107c4565b949093610bad565b1590565b610367576102676102b491608461028b61028588806107c4565b90610bd4565b9161025f60648201966102ab6102a1898c6107c4565b959094018b6107c4565b9290918b6107c4565b610358576102676102c86102ce92856107c4565b90610c35565b610349576102e26102679161032c936107c4565b907f0000000000000000000000000000000000000000000000000000000000000000917f000000000000000000000000000000000000000000000000000000000000000091610d05565b61033a57610338610f20565b005b633cff557560e11b5f5260045ffd5b632b96f51360e01b5f5260045ffd5b637b374dd160e01b5f5260045ffd5b63c89e37db60e01b5f5260045ffd5b3461019f575f36600319011261019f5760206040517f00000000000000000000000000000000000000000000000000000000000000008152f35b3461019f575f36600319011261019f57602060ff600754166040519015158152f35b3461019f575f36600319011261019f576020600454604051908152f35b3461019f575f36600319011261019f5760ff60075460081c16156104a0577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316330361019057610445610f86565b61044d610fbd565b61046461ff0019600754166007555f6001555f8055565b8015610491575f80808093335af161047a610852565b501561048257005b63b12d13eb60e01b5f5260045ffd5b6353cd7f7960e01b5f5260045ffd5b636af784dd60e11b5f5260045ffd5b3461019f575f36600319011261019f5760206040516101008152f35b3461019f575f36600319011261019f5760205f54604051908152f35b5f36600319011261019f57600454801515908161059b575b50610568575b60075460ff8160081c16156104a05760ff16610559576105236108c7565b61054a575f5460011c341061053b5761033834610fcf565b63e92c469f60e01b5f5260045ffd5b63129f78e960e11b5f5260045ffd5b632479328960e01b5f5260045ffd5b6005545f54818101809111610596575f5560065490810180911161059657600655610591610f86565b610505565b61087c565b905042115f6104ff565b3461019f575f36600319011261019f576020600554604051908152f35b3461019f575f36600319011261019f577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03163303610190576007805460ff19166001179055005b3461019f575f36600319011261019f576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b3461019f575f36600319011261019f576020600154604051908152f35b604036600319011261019f576004356024357f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031633036101905760075460081c60ff16610732578115610723578015610714576106d781836108ba565b3403610705576106ec826106f1935f55600255565b600155565b61033861010061ff00196007541617600755565b63201c04ab60e01b5f5260045ffd5b63932ca0a360e01b5f5260045ffd5b63ea1083a760e01b5f5260045ffd5b635adf638760e01b5f5260045ffd5b3461019f575f36600319011261019f57602061075b6108c7565b6040519015158152f35b3461019f575f36600319011261019f576020600254604051908152f35b3461019f575f36600319011261019f57602060ff60075460081c166040519015158152f35b3461019f575f36600319011261019f576020600654604051908152f35b903590601e198136030182121561019f570180359067ffffffffffffffff821161019f5760200191813603831361019f57565b634e487b7160e01b5f52604160045260245ffd5b6040519190601f01601f1916820167ffffffffffffffff81118382101761083157604052565b6107f7565b67ffffffffffffffff811161083157601f01601f191660200190565b3d15610877573d9061086b61086683610836565b61080b565b9182523d5f602084013e565b606090565b634e487b7160e01b5f52601160045260245ffd5b906001820180921161059657565b906015820180921161059657565b600101908160011161059657565b9190820180921161059657565b60045480151590816108d7575090565b905042111590565b60011981019190821161059657565b5f1981019190821161059657565b9190820391821161059657565b92919261091861086683610836565b938285528282011161019f57815f926020928387013784010152565b9061094861026760075460ff9060081c1690565b6104a0576003546001600160a01b03163314801590610a08575b6109f9574383116109ea5761010061097a84436108fc565b116109db57824080156109cc57610992368385610909565b60208151910120036109bd576109a791610ff7565b036109ae57565b63048a12f560e11b5f5260045ffd5b63ff28378760e01b5f5260045ffd5b63bfc9f0d360e01b5f5260045ffd5b63c42a018560e01b5f5260045ffd5b63058968cf60e41b5f5260045ffd5b6337b5f20360e21b5f5260045ffd5b50610a146102676108c7565b610962565b634e487b7160e01b5f52603260045260245ffd5b9015610a365790565b610a19565b90821015610a36570190565b60ff60f6199116019060ff821161059657565b60ff607f199116019060ff821161059657565b60ff60bf199116019060ff821161059657565b60ff60b6199116019060ff821161059657565b60ff166001019060ff821161059657565b905f600360fe1b6001600160f81b0319610acf610ac18587610a2d565b356001600160f81b03191690565b1610610b9e57601f60fb1b6001600160f81b0319610af0610ac18587610a2d565b1610610b955780610b2a610b24610b1f610b1a610b14610ac1610b3097898b610a3b565b60f81c90565b610a47565b610a93565b60ff1690565b906108ba565b905b5f5b60048110610b805750600560fd1b906001600160f81b031990610b5d90610ac190859087610a3b565b1603610b7157610b6c90610890565b013590565b633954003560e11b5f5260045ffd5b91610b8e60019183866110a7565b9201610b34565b50600190610b32565b63c0098bd960e01b5f5260045ffd5b610bc3610bcb92939495610bd198973691610909565b923691610909565b9061122f565b90565b90610bdf81836113e9565b905f5b60058110610c205750600560fd1b906001600160f81b031990610c0790849086610a3b565b351603610b715760018101811161059657016001013590565b91610c2e60019183866110a7565b9201610be2565b5f9082151580610ce9575b610ce0575b60c060ff610c5a610b14610ac1868887610a3b565b1610610cd157610b14610ac182858560f860ff610c84610b14610ac1839b60019d610cae9c610a3b565b1610610cc85780610b2a610b24610b1f610b1a610b14610ac1610ca897898b610a3b565b91610a3b565b1603610cb957600190565b63e9dd8a9d60e01b5f5260045ffd5b610ca890610890565b631bd5dcf760e31b5f5260045ffd5b60019150610c45565b50608060ff610cfe610b14610ac18786610a2d565b1610610c40565b90916003905f84151580610f04575b610ebc575b60c060ff610d2e610b14610ac1858a8a610a3b565b1610610cd1578060f860ff610d4d610b14610ac1610d73968b8b610a3b565b1610610eb35760ff610d6c610b1f610b1a610b14610ac1868c8c610a3b565b16906108ba565b915f905b808210610e9c575050609460ff610d95610b14610ac1868989610a3b565b1603610e8d576001600160a01b03168282016001013560601c03610e7e57610dbc9061089e565b91610dce610b14610ac1858486610a3b565b925f9260ff851694608086105f14610dff5750505050505b03610df057600190565b6355e97b0d60e01b5f5260045ffd5b90919293946080145f14610e185750505050505f610de6565b610b24610e2791939293610a5a565b915f935b838510610e3c575050505050610de6565b9091929394610e4d60019160081b90565b610e72610b24610b14610ac1610e6b8b610e668b610890565b6108ba565b8789610a3b565b17950193929190610e2b565b63c0ee95bb60e01b5f5260045ffd5b63e6c4247b60e01b5f5260045ffd5b9092610eab60019187876110a7565b930190610d77565b60ff6001610d6c565b509050610ecf610b14610ac18585610a2d565b6001919060ff16808303610ee65750600491610d19565b600203610ef557600591610d19565b636fc3daa360e11b5f5260045ffd5b50608060ff610f19610b14610ac18989610a2d565b1610610d14565b6005545f548101809111610596576001548101809111610596575f808080936003546001600160601b0360a01b8116600355826005558260045561ff0019600754166007558260015582805560018060a01b03165af1610f7e610852565b501561048257565b610f8e6108c7565b610fae576001600160601b0360a01b600354166003555f6005555f600455565b639cbc1de160e01b5f5260045ffd5b60015460025481018091116105965790565b336001600160601b0360a01b600354161760035561012c420180421161059657600455600555565b61100182826113e9565b915f5b60088110611092575061101e610b14610ac1858486610a3b565b925f9260ff851694608086105f1461103857505050505090565b6110499193949550610b2490610a5a565b915f935b83851061105c57505050505090565b909192939461106d60019160081b90565b611086610b24610b14610ac1610e6b8b610e668b610890565b1795019392919061104d565b926110a060019183856110a7565b9301611004565b919080821015611202576110c2610b14610ac1848487610a3b565b9060ff821660808110156110dd57505050610bd19150610890565b91929160b8811015611105575050610bd19250610b246110ff610b2a92610890565b92610a5a565b90929060c081101561117b5750610b2461112191949394610a80565b915f935f915b84831061114257505050610bd19291610e66610e6692610890565b90919461115160019160081b90565b611171610b24610b14610ac161116a8b610e668b610890565b8888610a3b565b1795019190611127565b90929060f811156111a15750610bd19250610b2461119b610b2a92610890565b92610a6d565b9291610b246111af91610a47565b915f935f915b8483106111d057505050610bd19291610e66610e6692610890565b9091946111df60019160081b90565b6111f8610b24610b14610ac161116a8b610e668b610890565b17950191906111b5565b6318d76ae160e11b5f5260045ffd5b805115610a365760200190565b908151811015610a36570160200190565b919390929190600360fe1b6001600160f81b0319611250610ac18689610a2d565b16106113da57601f60fb1b6001600160f81b0319611271610ac18689610a2d565b16106113d057611295611290610b24610b1a610b14610ac1888b610a2d565b6108ac565b9492905b945f5b8282106112ae57505050505050505f90565b6112cc6112c5836112c036878a610909565b611546565b90936108ba565b96825160208401200361136e57600360fe1b6113086112fb6112ed85611211565b516001600160f81b03191690565b6001600160f81b03191690565b1061136e578590846001601f60fb1b6113266112fb6112ed88611211565b10156113b2575b61133781866116ed565b60118103611379575061134994611878565b94911561136e5784156113625793915b9195909361129c565b50505050505050600190565b505050505050505f90565b9093506002141590506113a65784879261139294611732565b94911561136e578415611362579391611359565b50505050505050505f90565b506113cb611290610b24610b1a610b146112ed89611211565b61132d565b6001949290611299565b63ebb47d1d60e01b5f5260045ffd5b5f600360fe1b6001600160f81b0319611405610ac18686610a2d565b1610610b9e57601f60fb1b6001600160f81b0319611426610ac18686610a2d565b16106114f85780610b2a610b24610b1f610b1a610b14610ac161144a978a8a610a3b565b905b61a5bd461480156114ed575b611463575b50905090565b5f5b600381106114d85750600360fe1b6114846112fb610ac1858786610a3b565b10610b9e57601f60fb1b61149f6112fb610ac1858786610a3b565b106114c857610b24610b1f610b1a610b14610ac1866114c198610b2a97610a3b565b805f61145d565b506114d39150610890565b6114c1565b916114e660019185846110a7565b9201611465565b5061a5bf4614611458565b5060019061144c565b60409061150d8261080b565b6001815291601f1901366020840137565b9061152b61086683610836565b828152809261153c601f1991610836565b0190602036910137565b80518210156112025761155f610b146112ed848461121e565b9160ff8316608081101561159857505050611578611501565b9060f81b6001600160f81b0319165f1a61159182611211565b5390600190565b919392909160b88110156116025750610b246115b391610a5a565b906115bd8261151e565b935f5b8381106115d357505050610bd1906108ac565b806115ef6112ed6115e9600194610e6688610890565b8561121e565b5f1a6115fb828961121e565b53016115c0565b60c011156116a057610b2461161691610a80565b5f915f5b828110611672575061162b8361151e565b945f5b8481106116455750505090610e66610bd1926108ac565b8061165f6112ed6115e9600194610e6689610e668a610890565b5f1a61166b828a61121e565b530161162e565b9260019060081b611698610b24610b146112ed61169289610e6689610890565b8b61121e565b17930161161a565b50916116ac838261198d565b926116b68461151e565b915f5b8581106116c7575050509190565b806116da6112ed6115e9600194876108ba565b5f1a6116e6828761121e565b53016116b9565b5f92915b815181101561171857611704818361198d565b8101809111610596576001909301926116f1565b5050565b908160011b918083046002149015171561059657565b839492916117408183611546565b939061175f6020611756610b146112ed85611211565b16151591611aba565b9788911561180157506117739051876108ba565b61177d825161171c565b14611792575b505050505050505f905f905f90565b868660019282516117ef575b5050506117ac575b80611783565b6117bf926117b9916108ba565b90611546565b50602081519101209060208151910120146117dd57808080806117a6565b6117e89151906108ba565b6001915f90565b6117f99350611c25565b86865f61179e565b611812939495965061026792611c25565b61186b57611823926117b9916108ba565b50908151602081145f1461184b57506020611843920151925b51906108ba565b916001929190565b801561185f5760206118439301209261183c565b505050505f905f905f90565b50505050505f905f905f90565b91909293611886825161171c565b8510156119305750610b146112ed6118a8926118a28760011c90565b9061121e565b600184166119275760041c600f16915b905f925b60ff8116841061190757506118d19250611546565b50805180156118fc5761184391602082036118f25760209150015191610890565b6020012091610890565b5050505f905f905f90565b9091600161191b82610b2a60ff948761198d565b940193929190506118bc565b600f16916118b8565b9290509392935f915b601083106119735761194b9250611546565b50602081519101209060208151910120145f1461196a57600191905f90565b5f915081908190565b9061198481610b2a6001938561198d565b92019190611939565b908151811015611202576119a7610b146112ed838561121e565b9160ff831660808110156119be5750505050600190565b60b88110156119d957505050610b24610b1f610bd192610a5a565b60c0811015611a45575091610b246119f091610a80565b905f925f915b838310611a0d5750505090610e66610bd1926108ac565b909193611a1c60019160081b90565b611a3b610b24610b146112ed611a358a610e6689610890565b8861121e565b17940191906119f6565b60f81115611a5e575050610b24610b1f610bd192610a6d565b91610b24611a6b91610a47565b905f925f915b838310611a885750505090610e66610bd1926108ac565b909193611a9760019160081b90565b611ab0610b24610b146112ed611a358a610e6689610890565b1794019190611a71565b90815115611c2357611ad1610b146112ed84611211565b6010811615611ba057611af4611aef611aea855161171c565b6108ee565b61151e565b9060f81b600f60f81b165f1a611b0982611211565b5360015b8351811015611b9b5780611b48611b38611b2f610b146112ed6001968a61121e565b60041c600f1690565b60f81b6001600160f81b03191690565b611b61611b57611aea8461171c565b915f1a918561121e565b53611b88600f611b77610b146112ed858a61121e565b1660f81b6001600160f81b03191690565b611b94611b578361171c565b5301611b0d565b509150565b50611bb6611aef611bb1845161171c565b6108df565b60015b8351811015611b9b5780611bdb611b38611b2f610b146112ed6001968a61121e565b611bef611b57611bea846108ee565b61171c565b53611c05600f611b77610b146112ed858a61121e565b611c1c611b57611c17611bea856108ee565b610890565b5301611bb9565b565b919091611c338251846108ba565b611c3d825161171c565b10611cdc575f5b8251811015611cd357611c60611c5a82866108ba565b60011690565b611cb557611c89611b2f610b146112ed611c83611c7d868a6108ba565b60011c90565b8661121e565b60ff611c9e610b24610b146112ed868961121e565b911603611cad57600101611c44565b505050505f90565b600f611ccd610b146112ed611c83611c7d868a6108ba565b16611c89565b50505050600190565b5050505f9056fea2646970667358221220551b080203e39849c48692aeaf0c14462bab43e541853bdf873a521ef4a4fef064736f6c634300081e0033","sourceMap":"92:4695:22:-:0;;;;;;;;;;-1:-1:-1;;92:4695:22;;;;-1:-1:-1;;;;;92:4695:22;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;92:4695:22;;;;;;;;;;;;;;;;;;1670:38:20;;;1718:32;;1778:10;92:4695:22;1760:28:20;1248:24:22;;;:53;;;-1:-1:-1;1244:372:22;;-1:-1:-1;92:4695:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1670:38:20;92:4695:22;;;;;;;;;;1718:32:20;92:4695:22;;;;;;;;;;;1244:372;92:4695;;;;;;;;1321:9;:57;1317:90;;92:4695;-1:-1:-1;92:4695:22;1477:43;92:4695;;;;;;1592:13;92:4695;;;1592:13;92:4695;1244:372;;;;1317:90;1387:20;;;-1:-1:-1;1387:20:22;;-1:-1:-1;1387:20:22;92:4695;;;;-1:-1:-1;92:4695:22;;;;;-1:-1:-1;92:4695:22;1248:53;1276:25;;;;1248:53;;92:4695;-1:-1:-1;92:4695:22;;;;;;-1:-1:-1;92:4695:22;;;;;-1:-1:-1;92:4695:22","linkReferences":{}},"deployedBytecode":{"object":"0x60806040526004361015610011575f80fd5b5f3560e01c8063046f7da2146101445780631aa7c0ec1461013f57806323a8b41a1461013a5780632feef2ec14610135578063308657d71461013057806333ee5f351461012b5780633ccfd60b146101265780633d2691bc146101215780635a4fd6451461011c57806364c9ec6f1461011757806380f323a71461011257806381972d001461010d5780638677ab23146101085780638bd03d0a14610103578063a65e2cfd146100fe578063cb766a56146100f9578063d415b3f9146100f4578063f3a504f2146100ef5763fe03a460146100ea575f80fd5b6107a7565b610782565b610765565b610741565b610672565b610655565b610611565b6105c2565b6105a5565b6104e7565b6104cb565b6104af565b6103ef565b6103d2565b6103b0565b610376565b6101cb565b6101a3565b3461019f575f36600319011261019f577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03163303610190576007805460ff19169055005b63618bbdd560e01b5f5260045ffd5b5f80fd5b3461019f575f36600319011261019f576003546040516001600160a01b039091168152602090f35b3461019f57604036600319011261019f5760043567ffffffffffffffff811161019f57806004019060c0600319823603011261019f5761021760243561021184806107c4565b90610934565b61022a61022483806107c4565b90610aa4565b602482019161026b61026761023f85876107c4565b61024f60448697939701896107c4565b60a48701979161025f898c6107c4565b949093610bad565b1590565b610367576102676102b491608461028b61028588806107c4565b90610bd4565b9161025f60648201966102ab6102a1898c6107c4565b959094018b6107c4565b9290918b6107c4565b610358576102676102c86102ce92856107c4565b90610c35565b610349576102e26102679161032c936107c4565b907f0000000000000000000000000000000000000000000000000000000000000000917f000000000000000000000000000000000000000000000000000000000000000091610d05565b61033a57610338610f20565b005b633cff557560e11b5f5260045ffd5b632b96f51360e01b5f5260045ffd5b637b374dd160e01b5f5260045ffd5b63c89e37db60e01b5f5260045ffd5b3461019f575f36600319011261019f5760206040517f00000000000000000000000000000000000000000000000000000000000000008152f35b3461019f575f36600319011261019f57602060ff600754166040519015158152f35b3461019f575f36600319011261019f576020600454604051908152f35b3461019f575f36600319011261019f5760ff60075460081c16156104a0577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316330361019057610445610f86565b61044d610fbd565b61046461ff0019600754166007555f6001555f8055565b8015610491575f80808093335af161047a610852565b501561048257005b63b12d13eb60e01b5f5260045ffd5b6353cd7f7960e01b5f5260045ffd5b636af784dd60e11b5f5260045ffd5b3461019f575f36600319011261019f5760206040516101008152f35b3461019f575f36600319011261019f5760205f54604051908152f35b5f36600319011261019f57600454801515908161059b575b50610568575b60075460ff8160081c16156104a05760ff16610559576105236108c7565b61054a575f5460011c341061053b5761033834610fcf565b63e92c469f60e01b5f5260045ffd5b63129f78e960e11b5f5260045ffd5b632479328960e01b5f5260045ffd5b6005545f54818101809111610596575f5560065490810180911161059657600655610591610f86565b610505565b61087c565b905042115f6104ff565b3461019f575f36600319011261019f576020600554604051908152f35b3461019f575f36600319011261019f577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03163303610190576007805460ff19166001179055005b3461019f575f36600319011261019f576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b3461019f575f36600319011261019f576020600154604051908152f35b604036600319011261019f576004356024357f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031633036101905760075460081c60ff16610732578115610723578015610714576106d781836108ba565b3403610705576106ec826106f1935f55600255565b600155565b61033861010061ff00196007541617600755565b63201c04ab60e01b5f5260045ffd5b63932ca0a360e01b5f5260045ffd5b63ea1083a760e01b5f5260045ffd5b635adf638760e01b5f5260045ffd5b3461019f575f36600319011261019f57602061075b6108c7565b6040519015158152f35b3461019f575f36600319011261019f576020600254604051908152f35b3461019f575f36600319011261019f57602060ff60075460081c166040519015158152f35b3461019f575f36600319011261019f576020600654604051908152f35b903590601e198136030182121561019f570180359067ffffffffffffffff821161019f5760200191813603831361019f57565b634e487b7160e01b5f52604160045260245ffd5b6040519190601f01601f1916820167ffffffffffffffff81118382101761083157604052565b6107f7565b67ffffffffffffffff811161083157601f01601f191660200190565b3d15610877573d9061086b61086683610836565b61080b565b9182523d5f602084013e565b606090565b634e487b7160e01b5f52601160045260245ffd5b906001820180921161059657565b906015820180921161059657565b600101908160011161059657565b9190820180921161059657565b60045480151590816108d7575090565b905042111590565b60011981019190821161059657565b5f1981019190821161059657565b9190820391821161059657565b92919261091861086683610836565b938285528282011161019f57815f926020928387013784010152565b9061094861026760075460ff9060081c1690565b6104a0576003546001600160a01b03163314801590610a08575b6109f9574383116109ea5761010061097a84436108fc565b116109db57824080156109cc57610992368385610909565b60208151910120036109bd576109a791610ff7565b036109ae57565b63048a12f560e11b5f5260045ffd5b63ff28378760e01b5f5260045ffd5b63bfc9f0d360e01b5f5260045ffd5b63c42a018560e01b5f5260045ffd5b63058968cf60e41b5f5260045ffd5b6337b5f20360e21b5f5260045ffd5b50610a146102676108c7565b610962565b634e487b7160e01b5f52603260045260245ffd5b9015610a365790565b610a19565b90821015610a36570190565b60ff60f6199116019060ff821161059657565b60ff607f199116019060ff821161059657565b60ff60bf199116019060ff821161059657565b60ff60b6199116019060ff821161059657565b60ff166001019060ff821161059657565b905f600360fe1b6001600160f81b0319610acf610ac18587610a2d565b356001600160f81b03191690565b1610610b9e57601f60fb1b6001600160f81b0319610af0610ac18587610a2d565b1610610b955780610b2a610b24610b1f610b1a610b14610ac1610b3097898b610a3b565b60f81c90565b610a47565b610a93565b60ff1690565b906108ba565b905b5f5b60048110610b805750600560fd1b906001600160f81b031990610b5d90610ac190859087610a3b565b1603610b7157610b6c90610890565b013590565b633954003560e11b5f5260045ffd5b91610b8e60019183866110a7565b9201610b34565b50600190610b32565b63c0098bd960e01b5f5260045ffd5b610bc3610bcb92939495610bd198973691610909565b923691610909565b9061122f565b90565b90610bdf81836113e9565b905f5b60058110610c205750600560fd1b906001600160f81b031990610c0790849086610a3b565b351603610b715760018101811161059657016001013590565b91610c2e60019183866110a7565b9201610be2565b5f9082151580610ce9575b610ce0575b60c060ff610c5a610b14610ac1868887610a3b565b1610610cd157610b14610ac182858560f860ff610c84610b14610ac1839b60019d610cae9c610a3b565b1610610cc85780610b2a610b24610b1f610b1a610b14610ac1610ca897898b610a3b565b91610a3b565b1603610cb957600190565b63e9dd8a9d60e01b5f5260045ffd5b610ca890610890565b631bd5dcf760e31b5f5260045ffd5b60019150610c45565b50608060ff610cfe610b14610ac18786610a2d565b1610610c40565b90916003905f84151580610f04575b610ebc575b60c060ff610d2e610b14610ac1858a8a610a3b565b1610610cd1578060f860ff610d4d610b14610ac1610d73968b8b610a3b565b1610610eb35760ff610d6c610b1f610b1a610b14610ac1868c8c610a3b565b16906108ba565b915f905b808210610e9c575050609460ff610d95610b14610ac1868989610a3b565b1603610e8d576001600160a01b03168282016001013560601c03610e7e57610dbc9061089e565b91610dce610b14610ac1858486610a3b565b925f9260ff851694608086105f14610dff5750505050505b03610df057600190565b6355e97b0d60e01b5f5260045ffd5b90919293946080145f14610e185750505050505f610de6565b610b24610e2791939293610a5a565b915f935b838510610e3c575050505050610de6565b9091929394610e4d60019160081b90565b610e72610b24610b14610ac1610e6b8b610e668b610890565b6108ba565b8789610a3b565b17950193929190610e2b565b63c0ee95bb60e01b5f5260045ffd5b63e6c4247b60e01b5f5260045ffd5b9092610eab60019187876110a7565b930190610d77565b60ff6001610d6c565b509050610ecf610b14610ac18585610a2d565b6001919060ff16808303610ee65750600491610d19565b600203610ef557600591610d19565b636fc3daa360e11b5f5260045ffd5b50608060ff610f19610b14610ac18989610a2d565b1610610d14565b6005545f548101809111610596576001548101809111610596575f808080936003546001600160601b0360a01b8116600355826005558260045561ff0019600754166007558260015582805560018060a01b03165af1610f7e610852565b501561048257565b610f8e6108c7565b610fae576001600160601b0360a01b600354166003555f6005555f600455565b639cbc1de160e01b5f5260045ffd5b60015460025481018091116105965790565b336001600160601b0360a01b600354161760035561012c420180421161059657600455600555565b61100182826113e9565b915f5b60088110611092575061101e610b14610ac1858486610a3b565b925f9260ff851694608086105f1461103857505050505090565b6110499193949550610b2490610a5a565b915f935b83851061105c57505050505090565b909192939461106d60019160081b90565b611086610b24610b14610ac1610e6b8b610e668b610890565b1795019392919061104d565b926110a060019183856110a7565b9301611004565b919080821015611202576110c2610b14610ac1848487610a3b565b9060ff821660808110156110dd57505050610bd19150610890565b91929160b8811015611105575050610bd19250610b246110ff610b2a92610890565b92610a5a565b90929060c081101561117b5750610b2461112191949394610a80565b915f935f915b84831061114257505050610bd19291610e66610e6692610890565b90919461115160019160081b90565b611171610b24610b14610ac161116a8b610e668b610890565b8888610a3b565b1795019190611127565b90929060f811156111a15750610bd19250610b2461119b610b2a92610890565b92610a6d565b9291610b246111af91610a47565b915f935f915b8483106111d057505050610bd19291610e66610e6692610890565b9091946111df60019160081b90565b6111f8610b24610b14610ac161116a8b610e668b610890565b17950191906111b5565b6318d76ae160e11b5f5260045ffd5b805115610a365760200190565b908151811015610a36570160200190565b919390929190600360fe1b6001600160f81b0319611250610ac18689610a2d565b16106113da57601f60fb1b6001600160f81b0319611271610ac18689610a2d565b16106113d057611295611290610b24610b1a610b14610ac1888b610a2d565b6108ac565b9492905b945f5b8282106112ae57505050505050505f90565b6112cc6112c5836112c036878a610909565b611546565b90936108ba565b96825160208401200361136e57600360fe1b6113086112fb6112ed85611211565b516001600160f81b03191690565b6001600160f81b03191690565b1061136e578590846001601f60fb1b6113266112fb6112ed88611211565b10156113b2575b61133781866116ed565b60118103611379575061134994611878565b94911561136e5784156113625793915b9195909361129c565b50505050505050600190565b505050505050505f90565b9093506002141590506113a65784879261139294611732565b94911561136e578415611362579391611359565b50505050505050505f90565b506113cb611290610b24610b1a610b146112ed89611211565b61132d565b6001949290611299565b63ebb47d1d60e01b5f5260045ffd5b5f600360fe1b6001600160f81b0319611405610ac18686610a2d565b1610610b9e57601f60fb1b6001600160f81b0319611426610ac18686610a2d565b16106114f85780610b2a610b24610b1f610b1a610b14610ac161144a978a8a610a3b565b905b61a5bd461480156114ed575b611463575b50905090565b5f5b600381106114d85750600360fe1b6114846112fb610ac1858786610a3b565b10610b9e57601f60fb1b61149f6112fb610ac1858786610a3b565b106114c857610b24610b1f610b1a610b14610ac1866114c198610b2a97610a3b565b805f61145d565b506114d39150610890565b6114c1565b916114e660019185846110a7565b9201611465565b5061a5bf4614611458565b5060019061144c565b60409061150d8261080b565b6001815291601f1901366020840137565b9061152b61086683610836565b828152809261153c601f1991610836565b0190602036910137565b80518210156112025761155f610b146112ed848461121e565b9160ff8316608081101561159857505050611578611501565b9060f81b6001600160f81b0319165f1a61159182611211565b5390600190565b919392909160b88110156116025750610b246115b391610a5a565b906115bd8261151e565b935f5b8381106115d357505050610bd1906108ac565b806115ef6112ed6115e9600194610e6688610890565b8561121e565b5f1a6115fb828961121e565b53016115c0565b60c011156116a057610b2461161691610a80565b5f915f5b828110611672575061162b8361151e565b945f5b8481106116455750505090610e66610bd1926108ac565b8061165f6112ed6115e9600194610e6689610e668a610890565b5f1a61166b828a61121e565b530161162e565b9260019060081b611698610b24610b146112ed61169289610e6689610890565b8b61121e565b17930161161a565b50916116ac838261198d565b926116b68461151e565b915f5b8581106116c7575050509190565b806116da6112ed6115e9600194876108ba565b5f1a6116e6828761121e565b53016116b9565b5f92915b815181101561171857611704818361198d565b8101809111610596576001909301926116f1565b5050565b908160011b918083046002149015171561059657565b839492916117408183611546565b939061175f6020611756610b146112ed85611211565b16151591611aba565b9788911561180157506117739051876108ba565b61177d825161171c565b14611792575b505050505050505f905f905f90565b868660019282516117ef575b5050506117ac575b80611783565b6117bf926117b9916108ba565b90611546565b50602081519101209060208151910120146117dd57808080806117a6565b6117e89151906108ba565b6001915f90565b6117f99350611c25565b86865f61179e565b611812939495965061026792611c25565b61186b57611823926117b9916108ba565b50908151602081145f1461184b57506020611843920151925b51906108ba565b916001929190565b801561185f5760206118439301209261183c565b505050505f905f905f90565b50505050505f905f905f90565b91909293611886825161171c565b8510156119305750610b146112ed6118a8926118a28760011c90565b9061121e565b600184166119275760041c600f16915b905f925b60ff8116841061190757506118d19250611546565b50805180156118fc5761184391602082036118f25760209150015191610890565b6020012091610890565b5050505f905f905f90565b9091600161191b82610b2a60ff948761198d565b940193929190506118bc565b600f16916118b8565b9290509392935f915b601083106119735761194b9250611546565b50602081519101209060208151910120145f1461196a57600191905f90565b5f915081908190565b9061198481610b2a6001938561198d565b92019190611939565b908151811015611202576119a7610b146112ed838561121e565b9160ff831660808110156119be5750505050600190565b60b88110156119d957505050610b24610b1f610bd192610a5a565b60c0811015611a45575091610b246119f091610a80565b905f925f915b838310611a0d5750505090610e66610bd1926108ac565b909193611a1c60019160081b90565b611a3b610b24610b146112ed611a358a610e6689610890565b8861121e565b17940191906119f6565b60f81115611a5e575050610b24610b1f610bd192610a6d565b91610b24611a6b91610a47565b905f925f915b838310611a885750505090610e66610bd1926108ac565b909193611a9760019160081b90565b611ab0610b24610b146112ed611a358a610e6689610890565b1794019190611a71565b90815115611c2357611ad1610b146112ed84611211565b6010811615611ba057611af4611aef611aea855161171c565b6108ee565b61151e565b9060f81b600f60f81b165f1a611b0982611211565b5360015b8351811015611b9b5780611b48611b38611b2f610b146112ed6001968a61121e565b60041c600f1690565b60f81b6001600160f81b03191690565b611b61611b57611aea8461171c565b915f1a918561121e565b53611b88600f611b77610b146112ed858a61121e565b1660f81b6001600160f81b03191690565b611b94611b578361171c565b5301611b0d565b509150565b50611bb6611aef611bb1845161171c565b6108df565b60015b8351811015611b9b5780611bdb611b38611b2f610b146112ed6001968a61121e565b611bef611b57611bea846108ee565b61171c565b53611c05600f611b77610b146112ed858a61121e565b611c1c611b57611c17611bea856108ee565b610890565b5301611bb9565b565b919091611c338251846108ba565b611c3d825161171c565b10611cdc575f5b8251811015611cd357611c60611c5a82866108ba565b60011690565b611cb557611c89611b2f610b146112ed611c83611c7d868a6108ba565b60011c90565b8661121e565b60ff611c9e610b24610b146112ed868961121e565b911603611cad57600101611c44565b505050505f90565b600f611ccd610b146112ed611c83611c7d868a6108ba565b16611c89565b50505050600190565b5050505f9056fea2646970667358221220551b080203e39849c48692aeaf0c14462bab43e541853bdf873a521ef4a4fef064736f6c634300081e0033","sourceMap":"92:4695:22:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;;;;;-1:-1:-1;;92:4695:22;;;;2363:15:20;-1:-1:-1;;;;;92:4695:22;2349:10:20;:29;2345:56;;2411:27;92:4695:22;;-1:-1:-1;;92:4695:22;;;;2345:56:20;2387:14;;;92:4695:22;2387:14:20;92:4695:22;;2387:14:20;92:4695:22;;;;;;;;;;-1:-1:-1;;92:4695:22;;;;1263:29:20;92:4695:22;;;-1:-1:-1;;;;;92:4695:22;;;;;;;;;;;;;;-1:-1:-1;;92:4695:22;;;;;;;;;;;;;;;;;;;;;;;;;2799:17;92:4695;;2780:17;;;;:::i;:::-;2799;;:::i;:::-;2916:60;2958:17;;;;:::i;:::-;2916:60;;:::i;:::-;92:4695;3022:20;;;2990:103;2991:102;3022:20;;;;:::i;:::-;3044:18;;;;;;;;;:::i;:::-;3064:10;;;;;;;;;:::i;:::-;2991:102;;;;:::i;:::-;2990:103;;92:4695;2990:103;2986:157;;3300:99;3299:100;3267:17;3349:23;3229:56;3267:17;;;;:::i;:::-;3229:56;;:::i;:::-;3331:16;3374:10;3331:16;;;;3349:23;3331:16;;;;:::i;:::-;3349:23;;;;;;:::i;:::-;3374:10;;;;;:::i;3299:100::-;3295:159;;3525:56;3564:16;3524:57;3564:16;;;:::i;:::-;3525:56;;:::i;3524:57::-;3520:80;;3722:20;3682:96;3722:20;3681:97;3722:20;;:::i;:::-;3763:14;;3744:17;;3682:96;;:::i;3681:97::-;3677:158;;;;:::i;:::-;92:4695;3677:158;3801:23;;;-1:-1:-1;3801:23:22;92:4695;-1:-1:-1;3801:23:22;3520:80;3590:10;;;-1:-1:-1;3590:10:22;92:4695;-1:-1:-1;3590:10:22;3295:159;3422:21;;;-1:-1:-1;3422:21:22;92:4695;-1:-1:-1;3422:21:22;2986:157;3116:16;;;-1:-1:-1;3116:16:22;92:4695;-1:-1:-1;3116:16:22;92:4695;;;;;;-1:-1:-1;;92:4695:22;;;;;;;963:39:20;92:4695:22;;;;;;;;;-1:-1:-1;;92:4695:22;;;;;;1407:31:20;92:4695:22;;;;;;;;;;;;;;;;-1:-1:-1;;92:4695:22;;;;;;;;;;;;;;;;;;;-1:-1:-1;;92:4695:22;;;;;5261:6:20;92:4695:22;;;;5260:7:20;5256:31;;5315:15;-1:-1:-1;;;;;92:4695:22;5301:10:20;:29;5297:56;;4396:389:22;;:::i;:::-;4523:30;;:::i;:::-;4494:59;92:4695;;5686:14:20;92:4695:22;;5686:14:20;92:4695:22;5695:5:20;92:4695:22;;5695:5:20;92:4695:22;;5636:138:20;4494:59:22;4600:23;;4596:57;;92:4695;5301:10:20;;;;;4682:46:22;;;;:::i;:::-;;4742:8;4738:40;;92:4695;4738:40;4759:19;;;92:4695;4759:19;92:4695;;4759:19;4596:57;4632:21;;;92:4695;4632:21;92:4695;;4632:21;5256:31:20;5276:11;;;92:4695:22;5276:11:20;92:4695:22;;5276:11:20;92:4695:22;;;;;;-1:-1:-1;;92:4695:22;;;;;;;1085:3:20;92:4695:22;;;;;;;;;-1:-1:-1;;92:4695:22;;;;;;;;;;;;;;;;-1:-1:-1;;92:4695:22;;;;;;3850:21:20;;;:60;;;;92:4695:22;3846:204:20;;;92:4695:22;4200:6:20;92:4695:22;;;;;;4199:7:20;4195:31;;92:4695:22;;4236:55:20;;4305:11;;:::i;:::-;4301:47;;92:4695:22;;;;2438:9;4362:37:20;4358:68;;2472:9:22;2438;2472;:::i;4358:68:20:-;4408:18;;;92:4695:22;4408:18:20;92:4695:22;;4408:18:20;4301:47;4325:23;;;92:4695:22;4325:23:20;92:4695:22;;4325:23:20;4236:55;4268:23;;;92:4695:22;4268:23:20;92:4695:22;;4268:23:20;3846:204;3949:10;92:4695:22;;;;;;;;;;;;;3973:33:20;92:4695:22;;;;;;;;;3973:33:20;92:4695:22;3973:33:20;;:::i;:::-;3846:204;;92:4695:22;;:::i;3850:60:20:-;3875:15;;;:35;3850:60;;;92:4695:22;;;;;;-1:-1:-1;;92:4695:22;;;;;1336:25:20;92:4695:22;;;;;;;;;;;;;-1:-1:-1;;92:4695:22;;;;2113:15:20;-1:-1:-1;;;;;92:4695:22;2099:10:20;:29;2095:56;;2161:26;92:4695:22;;-1:-1:-1;;92:4695:22;2183:4:20;92:4695:22;;;;;;;;;;-1:-1:-1;;92:4695:22;;;;;;873:42:20;-1:-1:-1;;;;;92:4695:22;;;;;;;;;;;;-1:-1:-1;;92:4695:22;;;;;727:35:20;92:4695:22;;;;;;;;;;-1:-1:-1;;92:4695:22;;;;;;;;1748:15;-1:-1:-1;;;;;92:4695:22;1734:10;:29;1730:56;;1800:6;92:4695;;;;;1796:34;;1844:25;;1840:56;;1910:26;;1906:58;;1991:44;;;;:::i;:::-;1978:9;:57;1974:90;;2127:43;92:4695;2180:44;92:4695;-1:-1:-1;92:4695:22;2127:43;92:4695;;2127:43;2180:44;92:4695;;2180:44;2234:13;92:4695;;;1800:6;92:4695;;;1800:6;92:4695;;1974:90;2044:20;;;-1:-1:-1;2044:20:22;92:4695;-1:-1:-1;2044:20:22;1906:58;1945:19;;;-1:-1:-1;1945:19:22;92:4695;-1:-1:-1;1945:19:22;1840:56;1878:18;;;-1:-1:-1;1878:18:22;92:4695;-1:-1:-1;1878:18:22;1796:34;1815:15;;;-1:-1:-1;1815:15:22;92:4695;-1:-1:-1;1815:15:22;92:4695;;;;;;-1:-1:-1;;92:4695:22;;;;;;;:::i;:::-;;;;;;;;;;;;;;;-1:-1:-1;;92:4695:22;;;;;768:35:20;92:4695:22;;;;;;;;;;;;;-1:-1:-1;;92:4695:22;;;;;;1444:18:20;92:4695:22;;;;;;;;;;;;;;;;;;-1:-1:-1;;92:4695:22;;;;;1367:34:20;92:4695:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;-1:-1:-1;;92:4695:22;;;;;;;;;;;;;;:::o;:::-;;:::i;:::-;;;;;;;;-1:-1:-1;;92:4695:22;;;;:::o;:::-;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;-1:-1:-1;92:4695:22;;;;:::o;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;9151:2:25;92:4695:22;;;;;;;:::o;:::-;1984:1:23;92:4695:22;;;1984:1:23;92:4695:22;;;:::o;:::-;;;;;;;;;;:::o;2519:133:20:-;2584:17;92:4695:22;2584:21:20;;;:61;;;;2577:68;2519:133;:::o;2584:61::-;2609:15;;;:36;;2519:133;:::o;92:4695:22:-;-1:-1:-1;;92:4695:22;;;;;;;;:::o;:::-;-1:-1:-1;;92:4695:22;;;;;;;;:::o;:::-;;;;;;;;;;:::o;:::-;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;:::o;2729:743:20:-;;2842:7;92:4695:22;2843:6:20;92:4695:22;;;;;;;;2842:7:20;2838:31;;2897:14;92:4695:22;-1:-1:-1;;;;;92:4695:22;2883:10:20;:28;;;:44;;;2729:743;2879:77;;2990:12;2970:32;;2966:66;;1085:3;3046:32;2990:12;;3046:32;:::i;:::-;:53;3042:85;;3164:28;;3206:29;;3202:64;;92:4695:22;;;;;:::i;:::-;;;;;;3280:22:20;:41;3276:75;;3365:49;;;:::i;:::-;:70;3361:104;;2729:743::o;3361:104::-;3444:21;;;3233:1;3444:21;;3233:1;3444:21;3276:75;3330:21;;;3233:1;3330:21;;3233:1;3330:21;3202:64;3244:22;;;3233:1;3244:22;;3233:1;3244:22;3042:85;3108:19;;;;;;;;2966:66;3011:21;;;;;;;;2879:77;2936:20;;;;;;;;2883:44;2916:11;2915:12;2916:11;;:::i;2915:12::-;2883:44;;92:4695:22;;;;;;;;;;;;;;;;;;:::o;:::-;;:::i;:::-;;;;;;;;;:::o;:::-;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;:::o;4155:926:19:-;;4275:1;-1:-1:-1;;;;;;;;;4323:19:19;;4155:926;;4323:19;:::i;:::-;;-1:-1:-1;;;;;;92:4695:22;;;4323:19:19;92:4695:22;4323:26:19;4319:55;;-1:-1:-1;;;;;;;;;4388:19:19;;;;;:::i;:::-;92:4695:22;4388:27:19;92:4695:22;;4452:19:19;4431:49;4441:39;4446:33;:26;4452:19;;4431:49;4452:19;;;;:::i;:::-;92:4695:22;;;;4446:26:19;:33;:::i;:::-;4441:39;:::i;:::-;92:4695:22;;;;4431:49:19;;;:::i;:::-;4384:149;;4275:1;4631:5;4635:1;4631:5;;;;-1:-1:-1;;;;92:4695:22;-1:-1:-1;;;;;;92:4695:22;4821:19:19;;;;92:4695:22;;4821:19:19;;:::i;:::-;92:4695:22;4821:27:19;4817:60;;4887:11;;;:::i;:::-;4943:98;;4155:926;:::o;4817:60::-;4857:20;;;4275:1;4857:20;4635:1;4275;4857:20;4616:13;4662:28;;92:4695:22;4662:28:19;;;;:::i;:::-;92:4695:22;;4616:13:19;;4384:149;4511:11;4521:1;4384:149;;;4319:55;4358:16;;;4275:1;4358:16;;4275:1;4358:16;720:484:23;92:4695:22;;720:484:23;;;;1148:49;720:484;;92:4695:22;;;:::i;:::-;;;;;:::i;:::-;1148:49:23;;:::i;:::-;720:484;:::o;3219:769:19:-;;3335:33;;;;:::i;:::-;3539:13;3551:1;3554:5;3558:1;3554:5;;;;-1:-1:-1;;;;92:4695:22;-1:-1:-1;;;;;;92:4695:22;3740:19:19;;92:4695:22;;3740:19:19;;:::i;:::-;;92:4695:22;3740:27:19;3736:60;;92:4695:22;;;;;;;3858:94:19;92:4695:22;3858:94:19;;;3219:769::o;3539:13::-;3585:28;;92:4695:22;3585:28:19;;;;:::i;:::-;92:4695:22;;3539:13:19;;6516:993:25;6630:1;6690:21;;;;:52;;;6516:993;6686:123;;6516:993;6883:4;92:4695:22;6855:25:25;6861:18;;;;;;:::i;6855:25::-;92:4695:22;6855:32:25;6851:57;;7235:18;;6928;;;6951:4;92:4695:22;6922:25:25;6928:18;;;;7442:4;6928:18;7229:25;6928:18;;:::i;6922:25::-;92:4695:22;6922:33:25;6951:4;;6992:18;6971:48;6981:38;6986:32;:25;6992:18;;6971:48;6992:18;;;;:::i;6971:48::-;6918:154;7235:18;:::i;7229:25::-;92:4695:22;7428:18:25;7424:56;;7442:4;6516:993;:::o;7424:56::-;7455:25;;;6630:1;7455:25;;6630:1;7455:25;6918:154;7050:11;;;:::i;6851:57::-;6896:12;;;6630:1;6896:12;;6630:1;6896:12;6686:123;4521:1:19;;-1:-1:-1;6686:123:25;;6690:52;6721:13;6738:4;92:4695:22;6715:20:25;6721:13;;;;;:::i;6715:20::-;92:4695:22;6715:27:25;6690:52;;7611:2113;;;7892:1;;92:4695:22;7962:16:25;;;;:42;;7611:2113;7958:485;;7611:2113;8508:4;92:4695:22;8485:20:25;8491:13;;;;;;:::i;8485:20::-;92:4695:22;8485:27:25;8481:52;;8559:13;8577:4;92:4695:22;8553:20:25;8559:13;;8543:78;8559:13;;;;:::i;8553:20::-;92:4695:22;8553:28:25;:68;;92:4695:22;8584:33:25;8589:27;:20;8595:13;;;;;;:::i;8584:33::-;92:4695:22;8543:78:25;;:::i;:::-;8667:13;92:4695:22;8662:149:25;8682:11;;;;;;8895:13;;8913:4;92:4695:22;8889:20:25;8895:13;;;;;;:::i;8889:20::-;92:4695:22;8889:28:25;8885:57;;-1:-1:-1;;;;;92:4695:22;8972:95:25;;;92:4695:22;8972:95:25;;;;9080:23;9076:55;;9141:12;;;:::i;:::-;9213:13;9207:20;9213:13;;;;;;:::i;9207:20::-;9237:13;92:4695:22;;;;;9264:13:25;9273:4;9264:13;;9260:374;9273:4;;;9293:14;;;;;9260:374;9647:23;9643:52;;92:4695:22;7611:2113:25;:::o;9643:52::-;9679:16;;;92:4695:22;9679:16:25;;92:4695:22;9679:16:25;9260:374;9328:14;;;;;9273:4;9328:14;9324:310;9273:4;;;9358:9;;;;;92:4695:22;9260:374:25;;9324:310;9412:13;9398:27;9412:13;;;;;:::i;9398:27::-;9444:13;92:4695:22;9439:185:25;9459:7;;;;;;9324:310;;;;;9260:374;;9444:13;9496:10;;;;;;92:4695:22;9496:10:25;92:4695:22;;;;9496:10:25;9495:43;9510:28;9516:21;;9522:14;:10;;;;:::i;:::-;:14;:::i;:::-;9516:21;;;:::i;9495:43::-;;92:4695:22;;9444:13:25;;;;;;9076:55;9112:19;;;92:4695:22;9112:19:25;;92:4695:22;9112:19:25;8885:57;8926:16;;;92:4695:22;8926:16:25;;92:4695:22;8926:16:25;8667:13;8719:22;;;92:4695:22;8719:22:25;;;;:::i;:::-;92:4695:22;;8667:13:25;;;8553:68;92:4695:22;8620:1:25;8553:68;;7958:485;8041:8;;;8035:15;8041:8;;;;;:::i;8035:15::-;8073:1;;8064:10;92:4695:22;;8092:14:25;;;8073:1;;8126:11;8136:1;8088:345;7958:485;;8088:345;8238:4;8228:14;8238:4;;8272:1;8224:209;7958:485;;8224:209;8399:19;;;92:4695:22;8399:19:25;;92:4695:22;8399:19:25;7962:42;7988:8;8000:4;92:4695:22;7982:15:25;7988:8;;;;;:::i;7982:15::-;92:4695:22;7982:22:25;7962:42;;3867:264:22;5078:10:20;92:4695:22;-1:-1:-1;92:4695:22;;;;;;;;5113:20:20;92:4695:22;;;;;;;;-1:-1:-1;92:4695:22;;;;3969:14;92:4695;-1:-1:-1;;;;;92:4695:22;;;;3969:14;92:4695;;5078:10:20;92:4695:22;;4826:21:20;92:4695:22;;;4857:14:20;92:4695:22;;4857:14:20;92:4695:22;;5113:20:20;92:4695:22;;;;;;;;;;4042:32;;;;:::i;:::-;;4088:8;4084:40;;3867:264::o;3533:184:20:-;3585:11;;:::i;:::-;3581:36;;-1:-1:-1;;;;;92:4695:22;;3628:27:20;92:4695:22;;3628:27:20;92:4695:22;3653:1:20;3665:14;92:4695:22;3653:1:20;3689:21;92:4695:22;3533:184:20:o;3581:36::-;3605:12;;;;;;;;5438:139;5527:20;92:4695:22;5550:20:20;92:4695:22;;;;;;;;5438:139:20;:::o;4479:187::-;4558:10;-1:-1:-1;;;;;92:4695:22;;4541:27:20;92:4695:22;;;4541:27:20;92:4695:22;4616:9:20;4598:15;92:4695:22;4598:15:20;;92:4695:22;;;4578:47:20;92:4695:22;4635:24:20;92:4695:22;4479:187:20:o;2036:1012:19:-;2151:33;;;;:::i;:::-;2386:13;92:4695:22;2401:5:19;2405:1;2401:5;;;;2616:19;2610:26;2616:19;;;;;;:::i;2610:26::-;2646:19;92:4695:22;;;;;2679:13:19;2688:4;2679:13;;2675:338;2688:4;;;2708:20;;;;;2036:1012;:::o;2675:338::-;2759:27;2773:13;;;;;;;;:::i;2759:27::-;2805:13;92:4695:22;2800:203:19;2820:7;;;;;;2675:338;;;;;2036:1012;:::o;2805:13::-;2863:16;;;;;;92:4695:22;2863:16:19;92:4695:22;;;;2863:16:19;2862:55;2883:34;2889:27;;2901:14;:10;;;;:::i;2862:55::-;;92:4695:22;;2805:13:19;;;;;;2386;2432:28;;92:4695:22;2432:28:19;;;;:::i;:::-;92:4695:22;;2386:13:19;;541:1316:24;;;642:21;;;;638:56;;720:19;726:12;;;;;;:::i;720:19::-;92:4695:22;;;;763:4:24;754:13;;763:4;;;817:10;;;;;;;:::i;750:1101::-;848:13;;;857:4;848:13;;857:4;;;912:10;;:28;:10;;926:13;912:10;:28;:10;;:::i;:::-;926:13;;:::i;844:1007::-;961:13;;;970:4;961:13;;970:4;;;1039:13;;1017:35;1039:13;;;;;:::i;1017:35::-;1066:18;92:4695:22;1103:13:24;92:4695:22;1098:194:24;1118:15;;;;;;1312:10;;;:33;:10;;;:24;:10;;:::i;1103:13::-;1164:11;;;;1199:1;1164:11;92:4695:22;;;;1164:11:24;1163:43;1179:27;1185:20;;1190:14;:10;;;;:::i;:14::-;1185:20;;;:::i;1163:43::-;;92:4695:22;;1103:13:24;;;;957:894;1366:13;;;1375:4;-1:-1:-1;1375:4:24;;;1428:10;:28;:10;;1442:13;1428:10;:28;:10;;:::i;:::-;1442:13;;:::i;1362:489::-;1534:13;;;1512:35;1534:13;;:::i;1512:35::-;1561:18;92:4695:22;1598:13:24;92:4695:22;1593:194:24;1613:15;;;;;;1807:10;;;:33;:10;;;:24;:10;;:::i;1598:13::-;1659:11;;;;1694:1;1659:11;92:4695:22;;;;1659:11:24;1658:43;1674:27;1680:20;;1685:14;:10;;;;:::i;1658:43::-;;92:4695:22;;1598:13:24;;;;638:56;672:22;;;92:4695:22;672:22:24;;92:4695:22;672:22:24;92:4695:22;;;;;;;;;:::o;:::-;;;;;;;;;;;;;:::o;1567:2467:23:-;;;;;;;-1:-1:-1;;;;;;;;;1809:13:23;;1567:2467;;1809:13;:::i;:::-;92:4695:22;1809:20:23;1805:50;;-1:-1:-1;;;;;;;;;1870:13:23;;;;;:::i;:::-;92:4695:22;1870:21:23;92:4695:22;;1984:15:23;1907:49;1929:27;:20;1935:13;;;;;:::i;1907:49::-;1984:15;:::i;:::-;1866:190;;;;2102:33;92:4695:22;2184:31:23;;;;;;4015:12;;;;;;;92:4695:22;1567:2467:23;:::o;2177:1828::-;2368:25;2321:33;92:4695:22;;;;;;:::i;:::-;2321:33:23;:::i;:::-;2368:25;;;:::i;:::-;92:4695:22;;;;;;2465:15:23;:30;2461:81;;-1:-1:-1;;;2641:15:23;:7;;;;:::i;:::-;92:4695:22;-1:-1:-1;;;;;;92:4695:22;;;2641:7:23;-1:-1:-1;;;;;;92:4695:22;;;2641:15:23;;92:4695:22;;2676:14:23;;;2689:1;-1:-1:-1;;;2712:15:23;:7;;;;:::i;:15::-;;;2708:97;;2637:1358;2839:32;;;;:::i;:::-;2903:2;2894:11;;2903:2;;3044:58;;;;:::i;:::-;3129:8;;;3125:26;;3177:21;;3173:38;;3280:21;2890:1040;;2177:1828;;;;;;3173:38;3200:11;;;;;;;2689:1;3200:11;:::o;3125:26::-;3139:12;;;;;;;92:4695:22;3139:12:23;:::o;2890:1040::-;3330:10;;-1:-1:-1;3339:1:23;3330:10;3339:1;;-1:-1:-1;3339:1:23;;3490:67;;;;;;:::i;:::-;3584:8;;;3580:75;;3680:21;;3676:87;;3831:21;3326:604;2890:1040;;3326:604;3899:12;;;;;;;;92:4695:22;3899:12:23;:::o;2708:97::-;2771:7;2751:35;;2765:21;:14;2771:7;;;;:::i;2751:35::-;2708:97;;1866:190;2044:1;1866:190;;;;;1805:50;1838:17;;;92:4695:22;1838:17:23;;92:4695:22;1838:17:23;738:1134:19;854:1;-1:-1:-1;;;;;;;;;908:19:19;;;;;:::i;:::-;92:4695:22;908:26:19;904:55;;-1:-1:-1;;;;;;;;;973:19:19;;;;;:::i;:::-;92:4695:22;973:27:19;92:4695:22;;1037:19:19;1016:49;1026:39;1031:33;:26;1037:19;;1016:49;1037:19;;;;:::i;1016:49::-;969:149;;1221:5;1204:13;:22;:48;;;;969:149;1200:642;;969:149;1852:13;;;738:1134;:::o;1200:642::-;854:1;1380:5;1384:1;1380:5;;;;-1:-1:-1;;;;1602:26:19;:19;;;;;;:::i;:26::-;;1598:55;;-1:-1:-1;;;1671:27:19;:19;;;;;;:::i;:27::-;;92:4695:22;;1728:39:19;1733:33;:26;1739:19;;;1718:49;1739:19;1718:49;1739:19;;:::i;1718:49::-;1200:642;;;;1667:165;1806:11;;;;;:::i;:::-;1667:165;;1365:13;1415:28;;92:4695:22;1415:28:19;;;;:::i;:::-;92:4695:22;;1365:13:19;;1204:48;:13;1247:5;1204:13;1230:22;1204:48;;969:149;1096:11;4521:1;969:149;;;92:4695:22;;;;;;:::i;:::-;2457:1:24;92:4695:22;;;-1:-1:-1;;92:4695:22;;;;;;:::o;:::-;;;;;;:::i;:::-;;;;;;;;;;;:::i;:::-;;;;;;;;:::o;2143:1860:24:-;92:4695:22;;2257:21:24;;;2253:56;;2335:19;2341:12;;;;;:::i;2335:19::-;92:4695:22;;;;2378:4:24;2369:13;;2378:4;;;2447:12;;;;;:::i;:::-;92:4695:22;;;-1:-1:-1;;;;;;92:4695:22;;2473:26:24;;92:4695:22;2473:26:24;:::i;:::-;;2513:18;2457:1;2513:18;:::o;2365:1632::-;2552:13;;;;;2561:4;2552:13;;2561:4;;;2626:13;;2609:30;2626:13;;:::i;2609:30::-;2675:17;;;;:::i;:::-;2711:13;92:4695:22;2726:10:24;;;;;;2904;;;;;;:::i;2711:13::-;2774:10;2769:20;;2774:14;2783:1;2774:10;;;;:::i;:14::-;2769:20;;:::i;:::-;92:4695:22;2757:32:24;;;;;:::i;:::-;;92:4695:22;2711:13:24;;2548:1449;2945:4;-1:-1:-1;2945:4:24;;;3014:13;2992:35;3014:13;;:::i;2992:35::-;92:4695:22;3078:13:24;92:4695:22;3093:15:24;;;;;;3302:17;;;;:::i;:::-;3338:13;92:4695:22;3353:10:24;;;;;;3545:15;;;;;:24;:15;;:::i;3338:13::-;3401:10;3396:34;;3401:28;3174:1;3401:10;:24;:10;;;;:::i;3396:34::-;92:4695:22;3384:46:24;;;;;:::i;:::-;;92:4695:22;3338:13:24;;3078;3139:11;3174:1;;92:4695:22;;3138:43:24;3154:27;3160:20;;3165:14;:10;;;;:::i;:14::-;3160:20;;:::i;3138:43::-;;92:4695:22;;3078:13:24;;2932:1065;3676:27;;;;;;:::i;:::-;3739:22;;;;:::i;:::-;3780:13;92:4695:22;3795:15:24;;;;;;3958:28;;;;;:::o;3780:13::-;3848:10;3843:16;;3848:10;92:4695:22;3848:10:24;;;:::i;3843:16::-;92:4695:22;3831:28:24;;;;;:::i;:::-;;92:4695:22;3780:13:24;;4233:351:23;4392:1;;4233:351;4403:153;92:4695:22;;4410:20:23;;;;;4456:26;;;;:::i;:::-;92:4695:22;;;;;;;;4446:36:23;92:4695:22;;4403:153:23;;;4410:20;;;4233:351::o;92:4695:22:-;;;;;;;;;7928:1:23;92:4695:22;;;;;;;:::o;7310:1816:23:-;;;;;7616:26;;;;:::i;:::-;7673:9;;7740:26;7686:4;7667:16;7673:9;;;;:::i;7667:16::-;:23;7666:30;;7740:26;;:::i;:::-;7777:1343;;;;;;92:4695:22;7885:26:23;92:4695:22;;7885:26:23;;:::i;:::-;7915:14;92:4695:22;;7915:14:23;:::i;:::-;7885:44;7881:546;;7777:1343;8441:29;;;;;;;7680:1;8441:29;7680:1;8441:29;7680:1;8441:29;:::o;7881:546::-;7949:22;;7967:4;92:4695:22;;;7989:114:23;;7881:546;8121:292;;;;;7881:546;;;;8121:292;8187:38;8202:22;;;;:::i;:::-;8187:38;;:::i;:::-;92:4695:22;7686:4:23;92:4695:22;;;;8251:20:23;92:4695:22;7686:4:23;92:4695:22;;;;8275:16:23;8251:40;8247:148;;8121:292;;;;;;8247:148;8333:26;92:4695:22;;8333:26:23;;:::i;:::-;7967:4;;7680:1;;8319:53::o;7989:114::-;8048:36;;;;:::i;:::-;7989:114;;;;;7777:1343;8535:37;8536:36;;;;;;;;:::i;8535:37::-;8531:105;;8676:38;8691:22;;;;:::i;8676:38::-;8728:12;;92:4695:22;;7686:4:23;8758:20;;8754:294;7686:4;;;8798:80;7686:4;9076:26;8798:80;;;8754:294;;92:4695:22;9076:26:23;;:::i;:::-;9062:47;9070:4;9062:47;;;:::o;8754:294::-;8902:18;;;;7686:4;9076:26;92:4695:22;;8947:18:23;8898:150;8754:294;;8898:150;9004:29;;;;7680:1;9004:29;7680:1;9004:29;7680:1;9004:29;:::o;8531:105::-;8592:29;;;;;7680:1;8592:29;7680:1;8592:29;7680:1;8592:29;:::o;5044:1795::-;;;;;5315:14;92:4695:22;;5315:14:23;:::i;:::-;5302:27;;;5298:630;;5998:13;5994:18;;5988:25;5998:13;;;92:4695:22;;;;5998:13:23;5994:18;;:::i;5988:25::-;92:4695:22;;;6027:13:23;;92:4695:22;;;;6023:122:23;;6244:13;-1:-1:-1;6239:165:23;6259:10;92:4695:22;;;6259:10:23;;;;6441:28;;;;;:::i;:::-;92:4695:22;;;6483:20:23;;6479:96;;6812:13;;6630:2;6611:21;;6630:2;;;6648:73;;;;6607:181;6812:13;:::i;6607:181::-;6630:2;92:4695:22;6758:19:23;6607:181;6812:13;:::i;6479:96::-;6519:29;;;-1:-1:-1;6519:29:23;-1:-1:-1;6519:29:23;-1:-1:-1;6519:29:23;:::o;6244:13::-;6302:32;;92:4695:22;6286:48:23;6302:32;;92:4695:22;6302:32:23;;;:::i;6286:48::-;92:4695:22;;;;6244:13:23;;-1:-1:-1;6244:13:23;;6023:122;6130:4;6121:13;6023:122;;;5298:630;5401:32;;;;;;-1:-1:-1;5447:179:23;5467:6;5471:2;5467:6;;;;5667:27;;;;:::i;:::-;92:4695:22;;;;;;5712:20:23;92:4695:22;;;;;;5736:16:23;5712:40;5708:210;5736:16;;;92:4695:22;5772:36:23;;-1:-1:-1;5772:36:23;:::o;5708:210::-;-1:-1:-1;;;;;;;5874:29:23:o;5452:13::-;5509:31;5494:46;5509:31;;92:4695:22;5509:31:23;;;:::i;5494:46::-;92:4695:22;;5452:13:23;;;;4217:1141:24;;92:4695:22;;4321:21:24;;;4317:56;;4399:19;4405:12;;;;;:::i;4399:19::-;92:4695:22;;;;4442:4:24;4433:13;;4442:4;;;4462:8;;;;4469:1;4462:8;:::o;4429:923::-;4500:4;4491:13;;4500:4;;;4532:13;;;4527:19;4532:13;4520:26;4532:13;;:::i;4487:865::-;4576:4;4567:13;;4576:4;;;4618:13;;;4596:35;4618:13;;:::i;4596:35::-;4645:18;92:4695:22;4682:13:24;92:4695:22;4677:194:24;4697:15;;;;;;4891;;;;;:24;:15;;:::i;4682:13::-;4743:11;;;;4778:1;4743:11;92:4695:22;;;;4743:11:24;4742:43;4758:27;4764:20;;4769:14;:10;;;;:::i;:14::-;4764:20;;:::i;4742:43::-;;92:4695:22;;4682:13:24;;;;4563:789;4945:4;-1:-1:-1;4945:4:24;;;4977:13;;4972:19;4977:13;4965:26;4977:13;;:::i;4932:420::-;5044:13;;5022:35;5044:13;;:::i;5022:35::-;5071:18;92:4695:22;5108:13:24;92:4695:22;5103:194:24;5123:15;;;;;;5317;;;;;:24;:15;;:::i;5108:13::-;5169:11;;;;5204:1;5169:11;92:4695:22;;;;5169:11:24;5168:43;5184:27;5190:20;;5195:14;:10;;;;:::i;5168:43::-;;92:4695:22;;5108:13:24;;;;9295:1058:23;;92:4695:22;;9395:19:23;9391:39;;9459:17;9465:10;;;;:::i;9459:17::-;9512:4;9500:16;;9499:23;9512:4;;9596:33;9606:22;:18;92:4695:22;;9606:18:23;:::i;:::-;:22;:::i;:::-;9596:33;:::i;:::-;92:4695:22;;;-1:-1:-1;;;92:4695:22;9413:1:23;9643:36;;92:4695:22;9643:36:23;:::i;:::-;;9627:1;9698:13;92:4695:22;;9713:18:23;;;;;9785:10;9772:30;9779:22;:17;9785:10;;9627:1;9785:10;;;:::i;9779:17::-;92:4695:22;;;;;;9779:22:23;92:4695:22;;-1:-1:-1;;;;;;92:4695:22;;;9772:30:23;9752:50;9759:9;:5;;;:::i;:9::-;9752:50;9413:1;9752:50;;;;:::i;:::-;;9836:32;9674:4;9843:17;9849:10;;;;;:::i;9843:17::-;:24;92:4695:22;;-1:-1:-1;;;;;;92:4695:22;;;9836:32:23;9820:48;9827:5;;;:::i;9820:48::-;;92:4695:22;9698:13:23;;9713:18;-1:-1:-1;9713:18:23;-1:-1:-1;9295:1058:23:o;9562:761::-;92:4695:22;9993:33:23;10003:22;:18;92:4695:22;;10003:18:23;:::i;:::-;:22;:::i;9993:33::-;10057:1;10045:13;92:4695:22;;10060:18:23;;;;;10134:10;10121:30;10128:22;:17;10134:10;;10057:1;10134:10;;;:::i;10121:30::-;10099:52;10106:11;10107:5;;;:::i;:::-;10106:11;:::i;10099:52::-;;10195:32;10222:4;10202:17;10208:10;;;;;:::i;10195:32::-;10169:58;10176:15;:11;10177:5;;;:::i;10176:11::-;:15;:::i;10169:58::-;;92:4695:22;10045:13:23;;9391:39;9416:14::o;10590:651::-;;;;10709:23;92:4695:22;;10709:23:23;;:::i;:::-;10735:14;92:4695:22;;10735:14:23;:::i;:::-;-1:-1:-1;10705:58:23;;-1:-1:-1;10779:13:23;92:4695:22;;10794:18:23;;;;;10862:16;10863:10;;;;:::i;:::-;92:4695:22;;;;10862:16:23;10863:10;;10915:33;:28;10921:21;;10925:16;10926:10;;;;:::i;:::-;92:4695:22;;;;10925:16:23;10921:21;;:::i;10915:33::-;92:4695:22;11067:30:23;11080:17;11086:10;;;;;:::i;11067:30::-;92:4695:22;;11067:30:23;11063:81;;92:4695:22;;10779:13:23;;11063:81;11117:12;;;;-1:-1:-1;11117:12:23;:::o;10858:191::-;11030:4;10999:28;11005:21;;11009:16;11010:10;;;;:::i;10999:28::-;:35;10858:191;;10794:18;;;;;92:4695:22;10590:651:23;:::o;10705:58::-;10751:12;;;-1:-1:-1;10751:12:23;:::o","linkReferences":{},"immutableReferences":{"40183":[{"start":342,"length":32},{"start":1039,"length":32},{"start":1492,"length":32},{"start":1670,"length":32}],"40191":[{"start":775,"length":32},{"start":1574,"length":32}],"40193":[{"start":741,"length":32},{"start":909,"length":32}]}},"methodIdentifiers":{"MAX_BLOCK_LOOKBACK()":"3d2691bc","bond()":"64c9ec6f","bondAmount()":"80f323a7","bondedExecutor()":"1aa7c0ec","cancellationRequest()":"308657d7","collect((bytes,bytes,bytes,bytes,bytes,bytes),uint256)":"23a8b41a","currentPaymentAmount()":"8bd03d0a","currentRewardAmount()":"5a4fd645","executionDeadline()":"33ee5f35","expectedAmount()":"2feef2ec","expectedRecipient()":"8677ab23","fund(uint256,uint256)":"a65e2cfd","funded()":"f3a504f2","is_bonded()":"cb766a56","originalRewardAmount()":"d415b3f9","requestCancellation()":"81972d00","resume()":"046f7da2","totalBondsDeposited()":"fe03a460","withdraw()":"3ccfd60b"},"rawMetadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_expectedRecipient\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_expectedAmount\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_currentRewardAmount\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_currentPaymentAmount\",\"type\":\"uint256\"}],\"stateMutability\":\"payable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"AlreadyFunded\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"AmountMismatch\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"BlockHashUnavailable\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"BlockHeaderMismatch\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"BlockNumberMismatch\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"BondActive\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"CancellationRequested\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ETHTransferFailed\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ExecutorAlreadyBonded\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ExpectedRLPList\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"IncorrectETHAmount\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InsufficientBond\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidAddress\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidNativeTransfer\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidRLP\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidRLPEncoding\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidRLPList\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidReceiptProof\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidTxProof\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"NoWithdrawableFunds\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"NotFunded\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OnlyBondedExecutor\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OnlyDeployer\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"RLPOffsetOutOfBounds\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ReceiptStatusNotSuccess\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"RecipientMismatch\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"TargetBlockInFuture\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"TargetBlockTooOld\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"TxFailed\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"UnsupportedTxType\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ZeroPaymentAmount\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ZeroRewardAmount\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"MAX_BLOCK_LOOKBACK\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"bond\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"bondAmount\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"bondedExecutor\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"cancellationRequest\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes\",\"name\":\"blockHeader\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"transactionRlp\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"txProofNodes\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"receiptRlp\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"receiptProofNodes\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"path\",\"type\":\"bytes\"}],\"internalType\":\"struct EscrowNative.NativeTransferProof\",\"name\":\"proof\",\"type\":\"tuple\"},{\"internalType\":\"uint256\",\"name\":\"targetBlockNumber\",\"type\":\"uint256\"}],\"name\":\"collect\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"currentPaymentAmount\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"currentRewardAmount\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"executionDeadline\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"expectedAmount\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"expectedRecipient\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_currentRewardAmount\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_currentPaymentAmount\",\"type\":\"uint256\"}],\"name\":\"fund\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"funded\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"is_bonded\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"originalRewardAmount\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"requestCancellation\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"resume\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"totalBondsDeposited\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"withdraw\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"src/EscrowNative.sol\":\"EscrowNative\"},\"evmVersion\":\"prague\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[\":forge-std/=lib/forge-std/src/\"],\"viaIR\":true},\"sources\":{\"src/BlockHeaderParser.sol\":{\"keccak256\":\"0xf8a84bae1ea886c0519edb32e55f4c661d1e1cb036550967502148d033f08550\",\"license\":\"UNLICENSED\",\"urls\":[\"bzz-raw://766da07581e5dac7eda20d25debe9c381ed466204608502522b53266624bafa6\",\"dweb:/ipfs/QmPyjTUV3zL6h9oeQjbbbw3WiypQQYqdws6vTWSAXRUg7p\"]},\"src/EscrowBase.sol\":{\"keccak256\":\"0x53fd262562c9dbc7779339bafbeca6b86b690aec7ac864e30c57e0e42288a11d\",\"license\":\"UNLICENSED\",\"urls\":[\"bzz-raw://cb43380f5b0a131e1ac4405a43a67b9d2b07718eb05ba675fe46c106b8a12649\",\"dweb:/ipfs/QmNk5QkryXnDspEGc8mdyFYJSRXWRSP8V6yirLC98EKZYG\"]},\"src/EscrowNative.sol\":{\"keccak256\":\"0x97b788773c848491254bba688d24b146ca839c61c4fe411bd059d9722c6e8730\",\"license\":\"UNLICENSED\",\"urls\":[\"bzz-raw://ca169e73078a27043f1659a97210b1575edadcf74f3436c4acaafd08409f6623\",\"dweb:/ipfs/QmSAsWN2ioPa22Mv86LnAtN4rCECdUnrz5dPT6aLCZAhU3\"]},\"src/MPTVerifier.sol\":{\"keccak256\":\"0xf71ff6fc0fa054681fc67b7ca3c187141749b04895defd977d6989271b35ebeb\",\"license\":\"UNLICENSED\",\"urls\":[\"bzz-raw://6e2efbdee9d872e22febc5d29894e3759e72ed43850a512c9eed56a9f5e7ff3b\",\"dweb:/ipfs/QmShY9TstL2zXVSYH7ux8D6ByW22ptm7JfiEWy2qs7bHZU\"]},\"src/RLPParser.sol\":{\"keccak256\":\"0x403e6fd0cbf2e3599530d724d26e75b136bd7947e35e1cf5f79b30841b2c4c6c\",\"license\":\"UNLICENSED\",\"urls\":[\"bzz-raw://b24f44c75ae8db00297a940d0badb6b0fd9114b494b1a5c097a04f4bccde5e1d\",\"dweb:/ipfs/QmSoxh5vZu41RzAs8RTLXgQ5cD5pQBeQo68nYSFh4Dk5Xk\"]},\"src/ReceiptValidator.sol\":{\"keccak256\":\"0x625137f131a6524c06e6c7c6ddc4c3f10256ac8a306b53b2dfed4fe9a3ed9728\",\"license\":\"UNLICENSED\",\"urls\":[\"bzz-raw://611b99fa26ae364ea2e0aa721f62ca043ca6d5b0e2bc1c96278639792242f43f\",\"dweb:/ipfs/QmXFkR6amwaZF1QZqZjsneEXBz8C17QmCFyirmHo7eaUaH\"]}},\"version\":1}","metadata":{"compiler":{"version":"0.8.30+commit.73712a01"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"address","name":"_expectedRecipient","type":"address"},{"internalType":"uint256","name":"_expectedAmount","type":"uint256"},{"internalType":"uint256","name":"_currentRewardAmount","type":"uint256"},{"internalType":"uint256","name":"_currentPaymentAmount","type":"uint256"}],"stateMutability":"payable","type":"constructor"},{"inputs":[],"type":"error","name":"AlreadyFunded"},{"inputs":[],"type":"error","name":"AmountMismatch"},{"inputs":[],"type":"error","name":"BlockHashUnavailable"},{"inputs":[],"type":"error","name":"BlockHeaderMismatch"},{"inputs":[],"type":"error","name":"BlockNumberMismatch"},{"inputs":[],"type":"error","name":"BondActive"},{"inputs":[],"type":"error","name":"CancellationRequested"},{"inputs":[],"type":"error","name":"ETHTransferFailed"},{"inputs":[],"type":"error","name":"ExecutorAlreadyBonded"},{"inputs":[],"type":"error","name":"ExpectedRLPList"},{"inputs":[],"type":"error","name":"IncorrectETHAmount"},{"inputs":[],"type":"error","name":"InsufficientBond"},{"inputs":[],"type":"error","name":"InvalidAddress"},{"inputs":[],"type":"error","name":"InvalidNativeTransfer"},{"inputs":[],"type":"error","name":"InvalidRLP"},{"inputs":[],"type":"error","name":"InvalidRLPEncoding"},{"inputs":[],"type":"error","name":"InvalidRLPList"},{"inputs":[],"type":"error","name":"InvalidReceiptProof"},{"inputs":[],"type":"error","name":"InvalidTxProof"},{"inputs":[],"type":"error","name":"NoWithdrawableFunds"},{"inputs":[],"type":"error","name":"NotFunded"},{"inputs":[],"type":"error","name":"OnlyBondedExecutor"},{"inputs":[],"type":"error","name":"OnlyDeployer"},{"inputs":[],"type":"error","name":"RLPOffsetOutOfBounds"},{"inputs":[],"type":"error","name":"ReceiptStatusNotSuccess"},{"inputs":[],"type":"error","name":"RecipientMismatch"},{"inputs":[],"type":"error","name":"TargetBlockInFuture"},{"inputs":[],"type":"error","name":"TargetBlockTooOld"},{"inputs":[],"type":"error","name":"TxFailed"},{"inputs":[],"type":"error","name":"UnsupportedTxType"},{"inputs":[],"type":"error","name":"ZeroPaymentAmount"},{"inputs":[],"type":"error","name":"ZeroRewardAmount"},{"inputs":[],"stateMutability":"view","type":"function","name":"MAX_BLOCK_LOOKBACK","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[],"stateMutability":"payable","type":"function","name":"bond"},{"inputs":[],"stateMutability":"view","type":"function","name":"bondAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"bondedExecutor","outputs":[{"internalType":"address","name":"","type":"address"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"cancellationRequest","outputs":[{"internalType":"bool","name":"","type":"bool"}]},{"inputs":[{"internalType":"struct EscrowNative.NativeTransferProof","name":"proof","type":"tuple","components":[{"internalType":"bytes","name":"blockHeader","type":"bytes"},{"internalType":"bytes","name":"transactionRlp","type":"bytes"},{"internalType":"bytes","name":"txProofNodes","type":"bytes"},{"internalType":"bytes","name":"receiptRlp","type":"bytes"},{"internalType":"bytes","name":"receiptProofNodes","type":"bytes"},{"internalType":"bytes","name":"path","type":"bytes"}]},{"internalType":"uint256","name":"targetBlockNumber","type":"uint256"}],"stateMutability":"nonpayable","type":"function","name":"collect"},{"inputs":[],"stateMutability":"view","type":"function","name":"currentPaymentAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"currentRewardAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"executionDeadline","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"expectedAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"expectedRecipient","outputs":[{"internalType":"address","name":"","type":"address"}]},{"inputs":[{"internalType":"uint256","name":"_currentRewardAmount","type":"uint256"},{"internalType":"uint256","name":"_currentPaymentAmount","type":"uint256"}],"stateMutability":"payable","type":"function","name":"fund"},{"inputs":[],"stateMutability":"view","type":"function","name":"funded","outputs":[{"internalType":"bool","name":"","type":"bool"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"is_bonded","outputs":[{"internalType":"bool","name":"","type":"bool"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"originalRewardAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[],"stateMutability":"nonpayable","type":"function","name":"requestCancellation"},{"inputs":[],"stateMutability":"nonpayable","type":"function","name":"resume"},{"inputs":[],"stateMutability":"view","type":"function","name":"totalBondsDeposited","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[],"stateMutability":"nonpayable","type":"function","name":"withdraw"}],"devdoc":{"kind":"dev","methods":{},"version":1},"userdoc":{"kind":"user","methods":{},"version":1}},"settings":{"remappings":["forge-std/=lib/forge-std/src/"],"optimizer":{"enabled":true,"runs":200},"metadata":{"bytecodeHash":"ipfs"},"compilationTarget":{"src/EscrowNative.sol":"EscrowNative"},"evmVersion":"prague","libraries":{},"viaIR":true},"sources":{"src/BlockHeaderParser.sol":{"keccak256":"0xf8a84bae1ea886c0519edb32e55f4c661d1e1cb036550967502148d033f08550","urls":["bzz-raw://766da07581e5dac7eda20d25debe9c381ed466204608502522b53266624bafa6","dweb:/ipfs/QmPyjTUV3zL6h9oeQjbbbw3WiypQQYqdws6vTWSAXRUg7p"],"license":"UNLICENSED"},"src/EscrowBase.sol":{"keccak256":"0x53fd262562c9dbc7779339bafbeca6b86b690aec7ac864e30c57e0e42288a11d","urls":["bzz-raw://cb43380f5b0a131e1ac4405a43a67b9d2b07718eb05ba675fe46c106b8a12649","dweb:/ipfs/QmNk5QkryXnDspEGc8mdyFYJSRXWRSP8V6yirLC98EKZYG"],"license":"UNLICENSED"},"src/EscrowNative.sol":{"keccak256":"0x97b788773c848491254bba688d24b146ca839c61c4fe411bd059d9722c6e8730","urls":["bzz-raw://ca169e73078a27043f1659a97210b1575edadcf74f3436c4acaafd08409f6623","dweb:/ipfs/QmSAsWN2ioPa22Mv86LnAtN4rCECdUnrz5dPT6aLCZAhU3"],"license":"UNLICENSED"},"src/MPTVerifier.sol":{"keccak256":"0xf71ff6fc0fa054681fc67b7ca3c187141749b04895defd977d6989271b35ebeb","urls":["bzz-raw://6e2efbdee9d872e22febc5d29894e3759e72ed43850a512c9eed56a9f5e7ff3b","dweb:/ipfs/QmShY9TstL2zXVSYH7ux8D6ByW22ptm7JfiEWy2qs7bHZU"],"license":"UNLICENSED"},"src/RLPParser.sol":{"keccak256":"0x403e6fd0cbf2e3599530d724d26e75b136bd7947e35e1cf5f79b30841b2c4c6c","urls":["bzz-raw://b24f44c75ae8db00297a940d0badb6b0fd9114b494b1a5c097a04f4bccde5e1d","dweb:/ipfs/QmSoxh5vZu41RzAs8RTLXgQ5cD5pQBeQo68nYSFh4Dk5Xk"],"license":"UNLICENSED"},"src/ReceiptValidator.sol":{"keccak256":"0x625137f131a6524c06e6c7c6ddc4c3f10256ac8a306b53b2dfed4fe9a3ed9728","urls":["bzz-raw://611b99fa26ae364ea2e0aa721f62ca043ca6d5b0e2bc1c96278639792242f43f","dweb:/ipfs/QmXFkR6amwaZF1QZqZjsneEXBz8C17QmCFyirmHo7eaUaH"],"license":"UNLICENSED"}},"version":1},"id":22} \ No newline at end of file diff --git a/src/BlockHeaderParser.sol b/src/BlockHeaderParser.sol index d39ec42..d4f74e4 100644 --- a/src/BlockHeaderParser.sol +++ b/src/BlockHeaderParser.sol @@ -17,8 +17,6 @@ library BlockHeaderParser { error InvalidRLPList(); error InvalidRLPEncoding(); - error RLPOffsetOutOfBounds(); - error ExpectedStringItem(); /** * @dev Get offset to inner header (skips Tempo wrapper if present) @@ -75,15 +73,18 @@ library BlockHeaderParser { } } - // Extract block number - (bytes memory numBytes,) = parseItemFromCalldata(blockHeader, offset); - - // Decode big-endian number - uint256 blockNumber = 0; - for (uint256 i = 0; i < numBytes.length;) { - blockNumber = (blockNumber << 8) | uint8(numBytes[i]); - unchecked { - ++i; + // Extract block number directly from calldata + uint8 prefix = uint8(blockHeader[offset]); + uint256 blockNumber; + if (prefix < 0x80) { + blockNumber = prefix; + } else { + uint256 len = prefix - 0x80; + for (uint256 i = 0; i < len;) { + blockNumber = (blockNumber << 8) | uint8(blockHeader[offset + 1 + i]); + unchecked { + ++i; + } } } @@ -119,97 +120,6 @@ library BlockHeaderParser { return receiptsRoot; } - /** - * @dev Parse RLP item from calldata (helper function) - * @param data Calldata containing RLP item - * @param offset Current offset in the data - * @return result Parsed item content - * @return length Total length consumed - */ - function parseItemFromCalldata(bytes calldata data, uint256 offset) - private - pure - returns (bytes memory result, uint256 length) - { - if (offset >= data.length) revert RLPOffsetOutOfBounds(); - - uint8 prefix = uint8(data[offset]); - - if (prefix < 0x80) { - // Single byte - result = new bytes(1); - result[0] = bytes1(prefix); - return (result, 1); - } else if (prefix < 0xb8) { - // Short string - uint256 itemLength = prefix - 0x80; - result = new bytes(itemLength); - for (uint256 i = 0; i < itemLength;) { - result[i] = data[offset + 1 + i]; - unchecked { - ++i; - } - } - return (result, 1 + itemLength); - } else if (prefix < 0xc0) { - // Long string - uint256 lengthBytes = prefix - 0xb7; - uint256 itemLength = 0; - for (uint256 i = 0; i < lengthBytes;) { - itemLength = (itemLength << 8) | uint8(data[offset + 1 + i]); - unchecked { - ++i; - } - } - result = new bytes(itemLength); - for (uint256 i = 0; i < itemLength;) { - result[i] = data[offset + 1 + lengthBytes + i]; - unchecked { - ++i; - } - } - return (result, 1 + lengthBytes + itemLength); - } else { - revert ExpectedStringItem(); - } - } - - /** - * @dev Extract state root from block header - * @param blockHeader RLP-encoded block header - * @return State root hash - */ - function extractStateRoot(bytes calldata blockHeader) internal pure returns (bytes32) { - uint256 offset = 0; - - // Skip RLP list prefix - if (blockHeader[offset] < 0xc0) revert InvalidRLPList(); - if (blockHeader[offset] >= 0xf8) { - offset += 1 + (uint8(blockHeader[offset]) - 0xf7); - } else { - offset += 1; - } - - // Skip first 3 fields to get to stateRoot (index 3) - for (uint256 i = 0; i < 3;) { - offset = blockHeader.skipItem(offset); - unchecked { - ++i; - } - } - - // Extract stateRoot (32 bytes) - if (blockHeader[offset] != 0xa0) revert InvalidRLPEncoding(); - offset += 1; - - bytes32 stateRoot; - assembly { - stateRoot := calldataload(add(blockHeader.offset, offset)) - } - - return stateRoot; - } - /** * @dev Extract transactions root from block header * @param blockHeader RLP-encoded block header diff --git a/src/ReceiptValidator.sol b/src/ReceiptValidator.sol index fc85275..63f580d 100644 --- a/src/ReceiptValidator.sol +++ b/src/ReceiptValidator.sol @@ -18,7 +18,6 @@ library ReceiptValidator { error WrongEventSignature(); error ToAddressMismatch(); error AmountMismatch(); - error ExpectedStringData(); error ReceiptStatusNotSuccess(); error UnsupportedTxType(); error RecipientMismatch(); @@ -111,52 +110,18 @@ library ReceiptValidator { } // Parse emitter address (should be the token contract) - (bytes memory addrBytes, uint256 addrLen) = parseAddressFromRLP(receiptRlp, offset); - if (addrBytes.length != 20) revert InvalidAddress(); - - // Extract emitter address + if (uint8(receiptRlp[offset]) != 0x94) revert InvalidAddress(); address emitter; assembly { - emitter := mload(add(addrBytes, 20)) + emitter := shr(96, calldataload(add(receiptRlp.offset, add(offset, 1)))) } if (emitter != tokenContract) revert WrongTokenContract(); - offset += addrLen; + offset += 21; // Parse and validate topics return validateTransferTopics(receiptRlp, offset, toAddress, expectedAmount); } - /** - * @dev Parse address from RLP data - * @param data RLP encoded data - * @param offset Current offset - * @return result Parsed address bytes - * @return length Length consumed - */ - function parseAddressFromRLP(bytes calldata data, uint256 offset) - private - pure - returns (bytes memory result, uint256 length) - { - if (offset >= data.length) revert InvalidRLP(); - - uint8 prefix = uint8(data[offset]); - - if (prefix == 0x94) { - // Address is 20 bytes with prefix 0x94 - result = new bytes(20); - for (uint256 i = 0; i < 20;) { - result[i] = data[offset + 1 + i]; - unchecked { - ++i; - } - } - return (result, 21); - } else { - revert InvalidAddress(); - } - } - /** * @dev Validate event topics for Transfer event * @param receiptRlp The receipt data @@ -195,15 +160,23 @@ library ReceiptValidator { // Parse and validate data payload (amount) offset = receiptRlp.skipItem(topicsOffset); // Skip entire topics array - (bytes memory dataBytes,) = parseDataFromRLP(receiptRlp, offset); - - // Convert data bytes to uint256 (amount) - if (dataBytes.length > 32) revert InvalidRLP(); - uint256 logAmount = 0; - for (uint256 i = 0; i < dataBytes.length;) { - logAmount = (logAmount << 8) | uint8(dataBytes[i]); - unchecked { - ++i; + uint256 logAmount; + { + uint8 dataPrefix = uint8(receiptRlp[offset]); + if (dataPrefix < 0x80) { + logAmount = dataPrefix; + } else if (dataPrefix == 0x80) { + logAmount = 0; + } else if (dataPrefix <= 0xa0) { + uint256 len = dataPrefix - 0x80; + for (uint256 i = 0; i < len;) { + logAmount = (logAmount << 8) | uint8(receiptRlp[offset + 1 + i]); + unchecked { + ++i; + } + } + } else { + revert InvalidRLP(); } } if (logAmount != expectedAmount) revert AmountMismatch(); @@ -211,61 +184,6 @@ library ReceiptValidator { return true; } - /** - * @dev Parse data field from RLP - * @param data RLP encoded data - * @param offset Current offset - * @return result Parsed data bytes - * @return length Length consumed - */ - function parseDataFromRLP(bytes calldata data, uint256 offset) - private - pure - returns (bytes memory result, uint256 length) - { - if (offset >= data.length) revert InvalidRLP(); - - uint8 prefix = uint8(data[offset]); - - if (prefix < 0x80) { - // Single byte - result = new bytes(1); - result[0] = bytes1(prefix); - return (result, 1); - } else if (prefix < 0xb8) { - // Short string - uint256 dataLength = prefix - 0x80; - result = new bytes(dataLength); - for (uint256 i = 0; i < dataLength;) { - result[i] = data[offset + 1 + i]; - unchecked { - ++i; - } - } - return (result, 1 + dataLength); - } else if (prefix < 0xc0) { - // Long string - uint256 lengthBytes = prefix - 0xb7; - uint256 dataLength = 0; - for (uint256 i = 0; i < lengthBytes;) { - dataLength = (dataLength << 8) | uint8(data[offset + 1 + i]); - unchecked { - ++i; - } - } - result = new bytes(dataLength); - for (uint256 i = 0; i < dataLength;) { - result[i] = data[offset + 1 + lengthBytes + i]; - unchecked { - ++i; - } - } - return (result, 1 + lengthBytes + dataLength); - } else { - revert ExpectedStringData(); - } - } - /** * @dev Validate receipt status == 1 (successful execution) * Receipt structure: [status, cumulativeGasUsed, logsBloom, logs]