UNPKG

ulysses-sdk

Version:

An sdk for interacting with the Ulysses contracts

802 lines (800 loc) 1.02 MB
import JSBI from 'jsbi'; import { SupportedChainId, checkValidAddress, ZERO_ADDRESS, ZERO, toHex, Ulysses, CurrencyAmount, NativeToken } from 'maia-core-sdk'; import { Interface, defaultAbiCoder } from '@ethersproject/abi'; import { pack, keccak256 } from '@ethersproject/solidity'; import { LibZip } from 'solady'; import invariant from 'tiny-invariant'; import { getCreate2Address } from '@ethersproject/address'; var _EVM_CHAIN_ID_TO_ROOT, _DEFAULT_GAS_PARAMS; var ROOT_CHAIN_IDS = [SupportedChainId.ARBITRUM_ONE, SupportedChainId.SEPOLIA]; var EVM_CHAIN_ID_TO_ROOT_CHAIN_ID = (_EVM_CHAIN_ID_TO_ROOT = {}, _EVM_CHAIN_ID_TO_ROOT[SupportedChainId.MAINNET] = SupportedChainId.ARBITRUM_ONE, _EVM_CHAIN_ID_TO_ROOT[SupportedChainId.ARBITRUM_ONE] = SupportedChainId.ARBITRUM_ONE, _EVM_CHAIN_ID_TO_ROOT[SupportedChainId.OPTIMISM] = SupportedChainId.ARBITRUM_ONE, _EVM_CHAIN_ID_TO_ROOT[SupportedChainId.POLYGON] = SupportedChainId.ARBITRUM_ONE, _EVM_CHAIN_ID_TO_ROOT[SupportedChainId.BSC] = SupportedChainId.ARBITRUM_ONE, _EVM_CHAIN_ID_TO_ROOT[SupportedChainId.AVAX] = SupportedChainId.ARBITRUM_ONE, _EVM_CHAIN_ID_TO_ROOT[SupportedChainId.METIS] = SupportedChainId.ARBITRUM_ONE, _EVM_CHAIN_ID_TO_ROOT[SupportedChainId.BASE] = SupportedChainId.ARBITRUM_ONE, _EVM_CHAIN_ID_TO_ROOT[SupportedChainId.SONIC] = SupportedChainId.ARBITRUM_ONE, _EVM_CHAIN_ID_TO_ROOT[SupportedChainId.BERA] = SupportedChainId.ARBITRUM_ONE, _EVM_CHAIN_ID_TO_ROOT[SupportedChainId.FRAXTAL] = SupportedChainId.ARBITRUM_ONE, _EVM_CHAIN_ID_TO_ROOT[SupportedChainId.SWELL] = SupportedChainId.ARBITRUM_ONE, _EVM_CHAIN_ID_TO_ROOT[SupportedChainId.SEPOLIA] = SupportedChainId.SEPOLIA, _EVM_CHAIN_ID_TO_ROOT[SupportedChainId.ARBITRUM_SEPOLIA] = SupportedChainId.SEPOLIA, _EVM_CHAIN_ID_TO_ROOT[SupportedChainId.OPTIMISM_SEPOLIA] = SupportedChainId.SEPOLIA, _EVM_CHAIN_ID_TO_ROOT[SupportedChainId.BASE_SEPOLIA] = SupportedChainId.SEPOLIA, _EVM_CHAIN_ID_TO_ROOT[SupportedChainId.POLYGON_AMOY] = SupportedChainId.SEPOLIA, _EVM_CHAIN_ID_TO_ROOT); /** * Holds the action ids for the branch router. * @param NO_ASSET_DEPOSIT - The action doesn't require any asset to be deposited. * @param SINGLE_ASSET_DEPOSIT - The action requires a single asset to be deposited. * @param MULTIPLE_ASSET_DEPOSIT - The action requires multiple assets to be deposited. */ var BRANCH_BRIDGE_AGENT_ACTION_ID = { NO_ASSET_DEPOSIT: 1, SINGLE_ASSET_DEPOSIT: 2, MULTIPLE_ASSET_DEPOSIT: 3, RETRIEVE_SETTLEMENT: 4, FALLBACK: 5 }; /** * Holds the base gas for the branch bridge agent actions. * @param NO_ASSET_DEPOSIT * @param SINGLE_ASSET_DEPOSIT * @param MULTIPLE_ASSET_DEPOSIT */ var BRANCH_BRIDGE_AGENT_ACTION_BASE_GAS = { NO_ASSET_DEPOSIT: 100000, SINGLE_ASSET_DEPOSIT: 150000, MULTIPLE_ASSET_DEPOSIT: 200000, SINGLE_ASSET_DEPOSIT_WITH_FALLBACK: 290000, MULTIPLE_ASSET_DEPOSIT_WITH_FALLBACK: 340000, RETRIEVE_SETTLEMENT: 100000, FALLBACK: 140000 }; /** * Holds the action ids for the Core Branch Router. * @param RECEIVE_ADD_GLOBAL_TOKEN * @param RECEIVE_ADD_BRIDGE_AGENT * @param TOGGLE_BRANCH_BRIDGE_AGENT_FATORY * @param TOGGLE_STRATEGY_TOKEN * @param UPDATE_STRATEGY_TOKEN * @param TOGGLE_PORT_STRATEGY * @param UPDATE_PORT_STRATEGY * @param SET_CORE_BRANCH_ROUTER * @param SWEEP */ var CORE_BRANCH_ROUTER_FUNC_ID = { RECEIVE_ADD_GLOBAL_TOKEN: 1, RECEIVE_ADD_BRIDGE_AGENT: 2, TOGGLE_BRANCH_BRIDGE_AGENT_FATORY: 3, TOGGLE_STRATEGY_TOKEN: 4, UPDATE_STRATEGY_TOKEN: 5, TOGGLE_PORT_STRATEGY: 6, UPDATE_PORT_STRATEGY: 7, SET_CORE_BRANCH_ROUTER: 8, SWEEP: 9 }; /** * Holds the action ids for the Core Root Router. */ var CORE_ROOT_ROUTER_FUNC_ID = { ADD_GLOBAL_TOKEN: 1, ADD_LOCAL_TOKEN: 2, SET_LOCAL_TOKEN: 3, SYNC_BRANCH_BRIDGE_AGENT: 4 }; /** * Holds the action ids for the Root Bridge Agent. * @param NO_ASSET_DEPOSIT * @param SINGLE_ASSET_DEPOSIT * @param MULTIPLE_ASSET_DEPOSIT * @param SIGNED_NO_ASSET_DEPOSIT * @param SIGNED_SINGLE_ASSET_DEPOSIT * @param SIGNED_MULTIPLE_ASSET_DEPOSIT * @param RETRY_SETTLEMENT * @param RETRIEVE_DEPOSIT * @param FALLBACK */ var ROOT_BRIDGE_AGENT_ACTION_ID = { NO_ASSET_DEPOSIT: 1, SINGLE_ASSET_DEPOSIT: 2, MULTIPLE_ASSET_DEPOSIT: 3, SIGNED_NO_ASSET_DEPOSIT: 4, SIGNED_SINGLE_ASSET_DEPOSIT: 5, SIGNED_MULTIPLE_ASSET_DEPOSIT: 6, RETRY_SETTLEMENT: 7, RETRIEVE_DEPOSIT: 8, FALLBACK: 9 }; /** * Holds the base gas for the Root Bridge Agent actions. * @param NO_ASSET_DEPOSIT * @param SINGLE_ASSET_DEPOSIT * @param MULTIPLE_ASSET_DEPOSIT * @param SIGNED_NO_ASSET_DEPOSIT * @param SIGNED_SINGLE_ASSET_DEPOSIT * @param SIGNED_MULTIPLE_ASSET_DEPOSIT * @param RETRY_SETTLEMENT * @param RETRIEVE_DEPOSIT * @param FALLBACK */ var ROOT_BRIDGE_AGENT_ACTION_BASE_GAS = { NO_ASSET_DEPOSIT: 100000, SINGLE_ASSET_DEPOSIT: 150000, MULTIPLE_ASSET_DEPOSIT: 200000, SIGNED_NO_ASSET_DEPOSIT: 100000, SIGNED_SINGLE_ASSET_DEPOSIT: 150000, SIGNED_MULTIPLE_ASSET_DEPOSIT: 200000, SIGNED_SINGLE_ASSET_DEPOSIT_WITH_FALLBACK: 290000, SIGNED_MULTIPLE_ASSET_DEPOSIT_WITH_FALLBACK: 340000, RETRY_SETTLEMENT: 100000, RETRIEVE_DEPOSIT: 100000, FALLBACK: 140000 }; /** * Holds the functions ids to be passed on the multicall calldata first byte. * ``` * 0x01 | multicallNoOutput * 0x02 | multicallSingleOutput * 0x03 | multicallMultipleOutput * 0x04 | multicallSignedNoOutput * 0x05 | multicallSignedSingleOutput * 0x06 | multicallSignedMultipleOutput * ``` * @param NO_OUTPUT - The multicall doesn't return any output. * @param SINGLE_OUTPUT - The multicall returns a single output. * @param MULTIPLE_OUTPUT - The multicall returns multiple outputs. * @param SIGNED_NO_OUTPUT - The multicall doesn't return any output and is using the virtual account. * @param SIGNED_SINGLE_OUTPUT - The multicall returns a single output and is using the virtual account. * @param SIGNED_MULTIPLE_OUTPUT - The multicall returns multiple outputs and is using the virtual account. */ var MULTICALL_FUNCID = { NO_OUTPUT: '0x01', SINGLE_OUTPUT: '0x02', MULTIPLE_OUTPUT: '0x03', SIGNED_NO_OUTPUT: '0x04', SIGNED_SINGLE_OUTPUT: '0x05', SIGNED_MULTIPLE_OUTPUT: '0x06' }; /** * Holds the default Supported Chain Id to gas params used in gas estimation. */ var DEFAULT_GAS_PARAMS = (_DEFAULT_GAS_PARAMS = {}, _DEFAULT_GAS_PARAMS[SupportedChainId.MAINNET] = { gasLimit: /*#__PURE__*/JSBI.BigInt(600000).toString(), remoteBranchExecutionGas: /*#__PURE__*/JSBI.BigInt(1e16).toString() }, _DEFAULT_GAS_PARAMS[SupportedChainId.ARBITRUM_ONE] = { gasLimit: /*#__PURE__*/JSBI.BigInt(2000000).toString(), remoteBranchExecutionGas: /*#__PURE__*/JSBI.BigInt(1e16).toString() }, _DEFAULT_GAS_PARAMS[SupportedChainId.OPTIMISM] = { gasLimit: /*#__PURE__*/JSBI.BigInt(600000).toString(), remoteBranchExecutionGas: /*#__PURE__*/JSBI.BigInt(1e16).toString() }, _DEFAULT_GAS_PARAMS[SupportedChainId.BASE] = { gasLimit: /*#__PURE__*/JSBI.BigInt(600000).toString(), remoteBranchExecutionGas: /*#__PURE__*/JSBI.BigInt(1e16).toString() }, _DEFAULT_GAS_PARAMS[SupportedChainId.POLYGON] = { gasLimit: /*#__PURE__*/JSBI.BigInt(600000).toString(), remoteBranchExecutionGas: /*#__PURE__*/JSBI.BigInt(1e17).toString() }, _DEFAULT_GAS_PARAMS[SupportedChainId.BSC] = { gasLimit: /*#__PURE__*/JSBI.BigInt(600000).toString(), remoteBranchExecutionGas: /*#__PURE__*/JSBI.BigInt(1e16).toString() }, _DEFAULT_GAS_PARAMS[SupportedChainId.AVAX] = { gasLimit: /*#__PURE__*/JSBI.BigInt(600000).toString(), remoteBranchExecutionGas: /*#__PURE__*/JSBI.BigInt(1e17).toString() }, _DEFAULT_GAS_PARAMS[SupportedChainId.METIS] = { gasLimit: /*#__PURE__*/JSBI.BigInt(600000).toString(), remoteBranchExecutionGas: /*#__PURE__*/JSBI.BigInt(1e16).toString() }, _DEFAULT_GAS_PARAMS[SupportedChainId.SONIC] = { gasLimit: /*#__PURE__*/JSBI.BigInt(600000).toString(), remoteBranchExecutionGas: /*#__PURE__*/JSBI.BigInt(1e17).toString() }, _DEFAULT_GAS_PARAMS[SupportedChainId.BERA] = { gasLimit: /*#__PURE__*/JSBI.BigInt(600000).toString(), remoteBranchExecutionGas: /*#__PURE__*/JSBI.BigInt(1e17).toString() }, _DEFAULT_GAS_PARAMS[SupportedChainId.FRAXTAL] = { gasLimit: /*#__PURE__*/JSBI.BigInt(600000).toString(), remoteBranchExecutionGas: /*#__PURE__*/JSBI.BigInt(1e16).toString() }, _DEFAULT_GAS_PARAMS[SupportedChainId.SWELL] = { gasLimit: /*#__PURE__*/JSBI.BigInt(600000).toString(), remoteBranchExecutionGas: /*#__PURE__*/JSBI.BigInt(1e16).toString() }, _DEFAULT_GAS_PARAMS[SupportedChainId.SEPOLIA] = { gasLimit: /*#__PURE__*/JSBI.BigInt(2000000).toString(), remoteBranchExecutionGas: /*#__PURE__*/JSBI.BigInt(1e17).toString() }, _DEFAULT_GAS_PARAMS[SupportedChainId.ARBITRUM_SEPOLIA] = { gasLimit: /*#__PURE__*/JSBI.BigInt(600000).toString(), remoteBranchExecutionGas: /*#__PURE__*/JSBI.BigInt(1e17).toString() }, _DEFAULT_GAS_PARAMS[SupportedChainId.OPTIMISM_SEPOLIA] = { gasLimit: /*#__PURE__*/JSBI.BigInt(600000).toString(), remoteBranchExecutionGas: /*#__PURE__*/JSBI.BigInt(1e17).toString() }, _DEFAULT_GAS_PARAMS[SupportedChainId.BASE_SEPOLIA] = { gasLimit: /*#__PURE__*/JSBI.BigInt(600000).toString(), remoteBranchExecutionGas: /*#__PURE__*/JSBI.BigInt(1e17).toString() }, _DEFAULT_GAS_PARAMS[SupportedChainId.POLYGON_AMOY] = { gasLimit: /*#__PURE__*/JSBI.BigInt(600000).toString(), remoteBranchExecutionGas: /*#__PURE__*/JSBI.BigInt(1e17).toString() }, _DEFAULT_GAS_PARAMS); var abi = [ { type: "constructor", inputs: [ ], stateMutability: "nonpayable" }, { type: "function", name: "bridgeAgentExecutorAddress", inputs: [ ], outputs: [ { name: "", type: "address", internalType: "address" } ], stateMutability: "view" }, { type: "function", name: "callOut", inputs: [ { name: "_params", type: "bytes", internalType: "bytes" }, { name: "_gParams", type: "tuple", internalType: "struct GasParams", components: [ { name: "gasLimit", type: "uint256", internalType: "uint256" }, { name: "remoteBranchExecutionGas", type: "uint256", internalType: "uint256" } ] } ], outputs: [ ], stateMutability: "payable" }, { type: "function", name: "callOutAndBridge", inputs: [ { name: "_params", type: "bytes", internalType: "bytes" }, { name: "_dParams", type: "tuple", internalType: "struct DepositInput", components: [ { name: "hToken", type: "address", internalType: "address" }, { name: "token", type: "address", internalType: "address" }, { name: "amount", type: "uint256", internalType: "uint256" }, { name: "deposit", type: "uint256", internalType: "uint256" } ] }, { name: "_gParams", type: "tuple", internalType: "struct GasParams", components: [ { name: "gasLimit", type: "uint256", internalType: "uint256" }, { name: "remoteBranchExecutionGas", type: "uint256", internalType: "uint256" } ] } ], outputs: [ ], stateMutability: "payable" }, { type: "function", name: "callOutAndBridgeMultiple", inputs: [ { name: "_params", type: "bytes", internalType: "bytes" }, { name: "_dParams", type: "tuple", internalType: "struct DepositMultipleInput", components: [ { name: "hTokens", type: "address[]", internalType: "address[]" }, { name: "tokens", type: "address[]", internalType: "address[]" }, { name: "amounts", type: "uint256[]", internalType: "uint256[]" }, { name: "deposits", type: "uint256[]", internalType: "uint256[]" } ] }, { name: "_gParams", type: "tuple", internalType: "struct GasParams", components: [ { name: "gasLimit", type: "uint256", internalType: "uint256" }, { name: "remoteBranchExecutionGas", type: "uint256", internalType: "uint256" } ] } ], outputs: [ ], stateMutability: "payable" }, { type: "function", name: "cancelOwnershipHandover", inputs: [ ], outputs: [ ], stateMutability: "payable" }, { type: "function", name: "completeOwnershipHandover", inputs: [ { name: "pendingOwner", type: "address", internalType: "address" } ], outputs: [ ], stateMutability: "payable" }, { type: "function", name: "executeNoSettlement", inputs: [ { name: "", type: "bytes", internalType: "bytes" } ], outputs: [ ], stateMutability: "payable" }, { type: "function", name: "executeSettlement", inputs: [ { name: "", type: "bytes", internalType: "bytes" }, { name: "", type: "tuple", internalType: "struct SettlementParams", components: [ { name: "settlementNonce", type: "uint32", internalType: "uint32" }, { name: "recipient", type: "address", internalType: "address" }, { name: "hToken", type: "address", internalType: "address" }, { name: "token", type: "address", internalType: "address" }, { name: "amount", type: "uint256", internalType: "uint256" }, { name: "deposit", type: "uint256", internalType: "uint256" } ] } ], outputs: [ ], stateMutability: "payable" }, { type: "function", name: "executeSettlementMultiple", inputs: [ { name: "", type: "bytes", internalType: "bytes" }, { name: "", type: "tuple", internalType: "struct SettlementMultipleParams", components: [ { name: "numberOfAssets", type: "uint8", internalType: "uint8" }, { name: "recipient", type: "address", internalType: "address" }, { name: "settlementNonce", type: "uint32", internalType: "uint32" }, { name: "hTokens", type: "address[]", internalType: "address[]" }, { name: "tokens", type: "address[]", internalType: "address[]" }, { name: "amounts", type: "uint256[]", internalType: "uint256[]" }, { name: "deposits", type: "uint256[]", internalType: "uint256[]" } ] } ], outputs: [ ], stateMutability: "payable" }, { type: "function", name: "getDepositEntry", inputs: [ { name: "_depositNonce", type: "uint32", internalType: "uint32" } ], outputs: [ { name: "", type: "tuple", internalType: "struct Deposit", components: [ { name: "status", type: "uint8", internalType: "uint8" }, { name: "isSigned", type: "uint88", internalType: "uint88" }, { name: "owner", type: "address", internalType: "address" }, { name: "hTokens", type: "address[]", internalType: "address[]" }, { name: "tokens", type: "address[]", internalType: "address[]" }, { name: "amounts", type: "uint256[]", internalType: "uint256[]" }, { name: "deposits", type: "uint256[]", internalType: "uint256[]" } ] } ], stateMutability: "view" }, { type: "function", name: "initialize", inputs: [ { name: "_localBridgeAgentAddress", type: "address", internalType: "address" } ], outputs: [ ], stateMutability: "nonpayable" }, { type: "function", name: "localBridgeAgentAddress", inputs: [ ], outputs: [ { name: "", type: "address", internalType: "address" } ], stateMutability: "view" }, { type: "function", name: "localPortAddress", inputs: [ ], outputs: [ { name: "", type: "address", internalType: "address" } ], stateMutability: "view" }, { type: "function", name: "owner", inputs: [ ], outputs: [ { name: "result", type: "address", internalType: "address" } ], stateMutability: "view" }, { type: "function", name: "ownershipHandoverExpiresAt", inputs: [ { name: "pendingOwner", type: "address", internalType: "address" } ], outputs: [ { name: "result", type: "uint256", internalType: "uint256" } ], stateMutability: "view" }, { type: "function", name: "renounceOwnership", inputs: [ ], outputs: [ ], stateMutability: "payable" }, { type: "function", name: "requestOwnershipHandover", inputs: [ ], outputs: [ ], stateMutability: "payable" }, { type: "function", name: "retryDeposit", inputs: [ { name: "_depositNonce", type: "uint32", internalType: "uint32" }, { name: "_params", type: "bytes", internalType: "bytes" }, { name: "_gParams", type: "tuple", internalType: "struct GasParams", components: [ { name: "gasLimit", type: "uint256", internalType: "uint256" }, { name: "remoteBranchExecutionGas", type: "uint256", internalType: "uint256" } ] } ], outputs: [ ], stateMutability: "payable" }, { type: "function", name: "transferOwnership", inputs: [ { name: "newOwner", type: "address", internalType: "address" } ], outputs: [ ], stateMutability: "payable" }, { type: "event", name: "OwnershipHandoverCanceled", inputs: [ { name: "pendingOwner", type: "address", indexed: true, internalType: "address" } ], anonymous: false }, { type: "event", name: "OwnershipHandoverRequested", inputs: [ { name: "pendingOwner", type: "address", indexed: true, internalType: "address" } ], anonymous: false }, { type: "event", name: "OwnershipTransferred", inputs: [ { name: "oldOwner", type: "address", indexed: true, internalType: "address" }, { name: "newOwner", type: "address", indexed: true, internalType: "address" } ], anonymous: false }, { type: "error", name: "AlreadyInitialized", inputs: [ ] }, { type: "error", name: "NewOwnerIsZeroAddress", inputs: [ ] }, { type: "error", name: "NoHandoverRequest", inputs: [ ] }, { type: "error", name: "Unauthorized", inputs: [ ] }, { type: "error", name: "UnrecognizedBridgeAgentExecutor", inputs: [ ] }, { type: "error", name: "UnrecognizedFunctionId", inputs: [ ] } ]; var bytecode = { object: "0x6080604052600160005534801561001557600080fd5b5061001f33610024565b610060565b6001600160a01b0316638b78c6d8198190558060007f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08180a350565b6118a18061006f6000396000f3fe6080604052600436106101145760003560e01c806383dd527d116100a0578063f04e283e11610064578063f04e283e14610270578063f2fde38b14610283578063f4f79eb514610296578063fa536bec146102a9578063fee81cf4146102b757600080fd5b806383dd527d146101d757806384cb82b6146102045780638da5cb5b14610217578063c4d66de814610230578063cd9f60311461025057600080fd5b806351e372b0116100e757806351e372b01461015c578063546af9311461016a57806354d1f13d146101a75780635abfaf6c146101af578063715018a6146101cf57600080fd5b806315859950146101195780631e2bcb1a1461012e578063256929621461014157806346fcff1814610149575b600080fd5b61012c610127366004610bee565b6102f8565b005b61012c61013c366004610c54565b6103ce565b61012c610530565b61012c610157366004610cc3565b61057f565b61012c610157366004610ed9565b34801561017657600080fd5b5060035461018a906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b61012c610598565b3480156101bb57600080fd5b5060015461018a906001600160a01b031681565b61012c6105d4565b3480156101e357600080fd5b506101f76101f2366004611010565b6105e8565b60405161019e91906110a6565b61012c610212366004611166565b610698565b34801561022357600080fd5b50638b78c6d8195461018a565b34801561023c57600080fd5b5061012c61024b3660046111c0565b61070a565b34801561025c57600080fd5b5060025461018a906001600160a01b031681565b61012c61027e3660046111c0565b610898565b61012c6102913660046111c0565b6108d8565b61012c6102a43660046111dd565b6108ff565b61012c610157366004611231565b3480156102c357600080fd5b506102ea6102d23660046111c0565b63389a75e1600c908152600091909152602090205490565b60405190815260200161019e565b6000546001146103235760405162461bcd60e51b815260040161031a906112f2565b60405180910390fd5b600260005561035761033860208401846111c0565b61034860408501602086016111c0565b8460400135856060013561099a565b60025460405163a507c54360e01b81526001600160a01b039091169063a507c543903490610391903390899089908990899060040161133f565b6000604051808303818588803b1580156103aa57600080fd5b505af11580156103be573d6000803e3d6000fd5b5050600160005550505050505050565b6000546001146103f05760405162461bcd60e51b815260040161031a906112f2565b60026000556104f661040283806113c4565b808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152506104419250505060208501856113c4565b808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152506104809250505060408601866113c4565b808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152506104bf9250505060608701876113c4565b808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152506109fe92505050565b600254604051630dbf61bb60e31b81526001600160a01b0390911690636dfb0dd890349061039190339089908990899089906004016114c5565b60006202a3006001600160401b03164201905063389a75e1600c5233600052806020600c2055337fdbf36a107da19e49527a7176a1babf963b4b0ff8cde35ee35d6cd8f1f9ac7e1d600080a250565b6040516348d3a3f760e01b815260040160405180910390fd5b63389a75e1600c523360005260006020600c2055337ffa7b8eab7da67f412cc9575ed43464468f9bfbae89d1675917346ca6d8fe3c92600080a2565b6105dc610a89565b6105e66000610aa4565b565b6040805160e0810182526000808252602082018190528183015260608082018190526080820181905260a0820181905260c082015260025491516383dd527d60e01b815263ffffffff8416600482015290916001600160a01b0316906383dd527d90602401600060405180830381865afa15801561066a573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526106929190810190611686565b92915050565b600254604051635515a13360e01b81526001600160a01b0390911690635515a1339034906106d29033908990899089908990600401611791565b6000604051808303818588803b1580156106eb57600080fd5b505af11580156106ff573d6000803e3d6000fd5b505050505050505050565b610712610a89565b6001600160a01b0381166107685760405162461bcd60e51b815260206004820181905260248201527f427269646765204167656e7420616464726573732063616e6e6f742062652030604482015260640161031a565b6107706105d4565b600280546001600160a01b0319166001600160a01b038316908117909155604080516316afebdb60e21b81529051635abfaf6c916004808201926020929091908290030181865afa1580156107c9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107ed91906117da565b600160006101000a8154816001600160a01b0302191690836001600160a01b03160217905550806001600160a01b031663546af9316040518163ffffffff1660e01b8152600401602060405180830381865afa158015610851573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061087591906117da565b600380546001600160a01b0319166001600160a01b039290921691909117905550565b6108a0610a89565b63389a75e1600c52806000526020600c2080544211156108c857636f5e88186000526004601cfd5b600090556108d581610aa4565b50565b6108e0610a89565b8060601b6108f657637448fbae6000526004601cfd5b6108d581610aa4565b6000546001146109215760405162461bcd60e51b815260040161031a906112f2565b600260008190555460405163114357cb60e01b81526001600160a01b039091169063114357cb90349061095e9033908890889088906004016117f7565b6000604051808303818588803b15801561097757600080fd5b505af115801561098b573d6000803e3d6000fd5b50506001600055505050505050565b60006109a68284611834565b11156109c3576109c36001600160a01b0385163330848603610ae2565b80156109f8576109de6001600160a01b038416333084610ae2565b6001546109f8906001600160a01b03858116911683610b36565b50505050565b60005b8451811015610a8257610a7a858281518110610a1f57610a1f611855565b6020026020010151858381518110610a3957610a39611855565b6020026020010151858481518110610a5357610a53611855565b6020026020010151858581518110610a6d57610a6d611855565b602002602001015161099a565b600101610a01565b5050505050565b638b78c6d8195433146105e6576382b429006000526004601cfd5b638b78c6d81980546001600160a01b039092169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a355565b60405181606052826040528360601b602c526323b872dd60601b600c52602060006064601c6000895af13d156001600051141716610b2857637939f4246000526004601cfd5b600060605260405250505050565b816014528060345263095ea7b360601b60005260206000604460106000875af13d156001600051141716610b7257633e3f8f736000526004601cfd5b6000603452505050565b60008083601f840112610b8e57600080fd5b5081356001600160401b03811115610ba557600080fd5b602083019150836020828501011115610bbd57600080fd5b9250929050565b600060808284031215610bd657600080fd5b50919050565b600060408284031215610bd657600080fd5b60008060008060e08587031215610c0457600080fd5b84356001600160401b03811115610c1a57600080fd5b610c2687828801610b7c565b9095509350610c3a90508660208701610bc4565b9150610c498660a08701610bdc565b905092959194509250565b60008060008060808587031215610c6a57600080fd5b84356001600160401b0380821115610c8157600080fd5b610c8d88838901610b7c565b90965094506020870135915080821115610ca657600080fd5b50610cb387828801610bc4565b925050610c498660408701610bdc565b60008060208385031215610cd657600080fd5b82356001600160401b03811115610cec57600080fd5b610cf885828601610b7c565b90969095509350505050565b634e487b7160e01b600052604160045260246000fd5b60405160e081016001600160401b0381118282101715610d3c57610d3c610d04565b60405290565b60405160c081016001600160401b0381118282101715610d3c57610d3c610d04565b604051601f8201601f191681016001600160401b0381118282101715610d8c57610d8c610d04565b604052919050565b60ff811681146108d557600080fd5b8035610dae81610d94565b919050565b6001600160a01b03811681146108d557600080fd5b8035610dae81610db3565b803563ffffffff81168114610dae57600080fd5b60006001600160401b03821115610e0057610e00610d04565b5060051b60200190565b600082601f830112610e1b57600080fd5b81356020610e30610e2b83610de7565b610d64565b82815260059290921b84018101918181019086841115610e4f57600080fd5b8286015b84811015610e73578035610e6681610db3565b8352918301918301610e53565b509695505050505050565b600082601f830112610e8f57600080fd5b81356020610e9f610e2b83610de7565b82815260059290921b84018101918181019086841115610ebe57600080fd5b8286015b84811015610e735780358352918301918301610ec2565b600080600060408486031215610eee57600080fd5b83356001600160401b0380821115610f0557600080fd5b610f1187838801610b7c565b90955093506020860135915080821115610f2a57600080fd5b9085019060e08288031215610f3e57600080fd5b610f46610d1a565b610f4f83610da3565b8152610f5d60208401610dc8565b6020820152610f6e60408401610dd3565b6040820152606083013582811115610f8557600080fd5b610f9189828601610e0a565b606083015250608083013582811115610fa957600080fd5b610fb589828601610e0a565b60808301525060a083013582811115610fcd57600080fd5b610fd989828601610e7e565b60a08301525060c083013582811115610ff157600080fd5b610ffd89828601610e7e565b60c0830152508093505050509250925092565b60006020828403121561102257600080fd5b61102b82610dd3565b9392505050565b600081518084526020808501945080840160005b8381101561106b5781516001600160a01b031687529582019590820190600101611046565b509495945050505050565b600081518084526020808501945080840160005b8381101561106b5781518752958201959082019060010161108a565b6020815260ff8251166020820152600060208301516110d460408401826affffffffffffffffffffff169052565b5060408301516001600160a01b038116606084015250606083015160e06080840152611104610100840182611032565b90506080840151601f19808584030160a08601526111228383611032565b925060a08601519150808584030160c086015261113f8383611076565b925060c08601519150808584030160e08601525061115d8282611076565b95945050505050565b6000806000806080858703121561117c57600080fd5b61118585610dd3565b935060208501356001600160401b038111156111a057600080fd5b6111ac87828801610b7c565b9094509250610c4990508660408701610bdc565b6000602082840312156111d257600080fd5b813561102b81610db3565b6000806000606084860312156111f257600080fd5b83356001600160401b0381111561120857600080fd5b61121486828701610b7c565b909450925061122890508560208601610bdc565b90509250925092565b600080600083850360e081121561124757600080fd5b84356001600160401b0381111561125d57600080fd5b61126987828801610b7c565b90955093505060c0601f198201121561128157600080fd5b5061128a610d42565b61129660208601610dd3565b815260408501356112a681610db3565b602082015260608501356112b981610db3565b604082015260808501356112cc81610db3565b8060608301525060a0850135608082015260c085013560a0820152809150509250925092565b6020808252600a90820152695245454e5452414e435960b01b604082015260600190565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b6001600160a01b03868116825261010060208301819052600091611366848301888a611316565b92508535915061137582610db3565b908116604084015260208501359061138c82610db3565b166060838101919091526040850135608084015284013560a0830152823560c0830152602083013560e08301525b9695505050505050565b6000808335601e198436030181126113db57600080fd5b8301803591506001600160401b038211156113f557600080fd5b6020019150600581901b3603821315610bbd57600080fd5b6000808335601e1984360301811261142457600080fd5b83016020810192503590506001600160401b0381111561144357600080fd5b8060051b3603821315610bbd57600080fd5b8183526000602080850194508260005b8581101561106b57813561147881610db3565b6001600160a01b031687529582019590820190600101611465565b81835260006001600160fb1b038311156114ac57600080fd5b8260051b80836020870137939093016020019392505050565b6001600160a01b038616815260a0602082018190526000906114ea9083018688611316565b82810360408401526114fc858661140d565b6080835261150e608084018284611455565b91505061151e602087018761140d565b8383036020850152611531838284611455565b92505050611542604087018761140d565b8383036040850152611555838284611493565b92505050611566606087018761140d565b8383036060850152611579838284611493565b873560608801526020880135608088015294506113ba9350505050565b8051610dae81610d94565b80516affffffffffffffffffffff81168114610dae57600080fd5b8051610dae81610db3565b600082601f8301126115d857600080fd5b815160206115e8610e2b83610de7565b82815260059290921b8401810191818101908684111561160757600080fd5b8286015b84811015610e7357805161161e81610db3565b835291830191830161160b565b600082601f83011261163c57600080fd5b8151602061164c610e2b83610de7565b82815260059290921b8401810191818101908684111561166b57600080fd5b8286015b84811015610e73578051835291830191830161166f565b60006020828403121561169857600080fd5b81516001600160401b03808211156116af57600080fd5b9083019060e082860312156116c357600080fd5b6116cb610d1a565b6116d483611596565b81526116e2602084016115a1565b60208201526116f3604084016115bc565b604082015260608301518281111561170a57600080fd5b611716878286016115c7565b60608301525060808301518281111561172e57600080fd5b61173a878286016115c7565b60808301525060a08301518281111561175257600080fd5b61175e8782860161162b565b60a08301525060c08301518281111561177657600080fd5b6117828782860161162b565b60c08301525095945050505050565b6001600160a01b038616815263ffffffff8516602082015260a0604082018190526000906117c29083018587611316565b833560608401526020840135608084015290506113ba565b6000602082840312156117ec57600080fd5b815161102b81610db3565b6001600160a01b038516815260806020820181905260009061181c9083018587611316565b8335604084015260208401356060840152905061115d565b8181038181111561069257634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603260045260246000fdfea2646970667358221220793f9104d14cdc05836f5888789d38adefd3fa873022af933e724fea979e888964736f6c63430008130033", sourceMap: "676:7112:82:-:0;;;454:1:77;429:26;;1461:59:82;;;;;;;;;-1:-1:-1;1485:28:82;1502:10;1485:16;:28::i;:::-;676:7112;;4883:1190:30;-1:-1:-1;;;;;5793:26:30;-1:-1:-1;;5876:29:30;;;5793:26;6031:1;5991:38;6031:1;;5980:63;4883:1190;:::o;676:7112:82:-;;;;;;;", linkReferences: { } }; var deployedBytecode = { object: "0x6080604052600436106101145760003560e01c806383dd527d116100a0578063f04e283e11610064578063f04e283e14610270578063f2fde38b14610283578063f4f79eb514610296578063fa536bec146102a9578063fee81cf4146102b757600080fd5b806383dd527d146101d757806384cb82b6146102045780638da5cb5b14610217578063c4d66de814610230578063cd9f60311461025057600080fd5b806351e372b0116100e757806351e372b01461015c578063546af9311461016a57806354d1f13d146101a75780635abfaf6c146101af578063715018a6146101cf57600080fd5b806315859950146101195780631e2bcb1a1461012e578063256929621461014157806346fcff1814610149575b600080fd5b61012c610127366004610bee565b6102f8565b005b61012c61013c366004610c54565b6103ce565b61012c610530565b61012c610157366004610cc3565b61057f565b61012c610157366004610ed9565b34801561017657600080fd5b5060035461018a906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b61012c610598565b3480156101bb57600080fd5b5060015461018a906001600160a01b031681565b61012c6105d4565b3480156101e357600080fd5b506101f76101f2366004611010565b6105e8565b60405161019e91906110a6565b61012c610212366004611166565b610698565b34801561022357600080fd5b50638b78c6d8195461018a565b34801561023c57600080fd5b5061012c61024b3660046111c0565b61070a565b34801561025c57600080fd5b5060025461018a906001600160a01b031681565b61012c61027e3660046111c0565b610898565b61012c6102913660046111c0565b6108d8565b61012c6102a43660046111dd565b6108ff565b61012c610157366004611231565b3480156102c357600080fd5b506102ea6102d23660046111c0565b63389a75e1600c908152600091909152602090205490565b60405190815260200161019e565b6000546001146103235760405162461bcd60e51b815260040161031a906112f2565b60405180910390fd5b600260005561035761033860208401846111c0565b61034860408501602086016111c0565b8460400135856060013561099a565b60025460405163a507c54360e01b81526001600160a01b039091169063a507c543903490610391903390899089908990899060040161133f565b6000604051808303818588803b1580156103aa57600080fd5b505af11580156103be573d6000803e3d6000fd5b5050600160005550505050505050565b6000546001146103f05760405162461bcd60e51b815260040161031a906112f2565b60026000556104f661040283806113c4565b808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152506104419250505060208501856113c4565b808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152506104809250505060408601866113c4565b808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152506104bf9250505060608701876113c4565b808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152506109fe92505050565b600254604051630dbf61bb60e31b81526001600160a01b0390911690636dfb0dd890349061039190339089908990899089906004016114c5565b60006202a3006001600160401b03164201905063389a75e1600c5233600052806020600c2055337fdbf36a107da19e49527a7176a1babf963b4b0ff8cde35ee35d6cd8f1f9ac7e1d600080a250565b6040516348d3a3f760e01b815260040160405180910390fd5b63389a75e1600c523360005260006020600c2055337ffa7b8eab7da67f412cc9575ed43464468f9bfbae89d1675917346ca6d8fe3c92600080a2565b6105dc610a89565b6105e66000610aa4565b565b6040805160e0810182526000808252602082018190528183015260608082018190526080820181905260a0820181905260c082015260025491516383dd527d60e01b815263ffffffff8416600482015290916001600160a01b0316906383dd527d90602401600060405180830381865afa15801561066a573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526106929190810190611686565b92915050565b600254604051635515a13360e01b81526001600160a01b0390911690635515a1339034906106d29033908990899089908990600401611791565b6000604051808303818588803b1580156106eb57600080fd5b505af11580156106ff573d6000803e3d6000fd5b505050505050505050565b610712610a89565b6001600160a01b0381166107685760405162461bcd60e51b815260206004820181905260248201527f427269646765204167656e7420616464726573732063616e6e6f742062652030604482015260640161031a565b6107706105d4565b600280546001600160a01b0319166001600160a01b038316908117909155604080516316afebdb60e21b81529051635abfaf6c916004808201926020929091908290030181865afa1580156107c9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107ed91906117da565b600160006101000a8154816001600160a01b0302191690836001600160a01b03160217905550806001600160a01b031663546af9316040518163ffffffff1660e01b8152600401602060405180830381865afa158015610851573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061087591906117da565b600380546001600160a01b0319166001600160a01b039290921691909117905550565b6108a0610a89565b63389a75e1600c52806000526020600c2080544211156108c857636f5e88186000526004601cfd5b600090556108d581610aa4565b50565b6108e0610a89565b8060601b6108f657637448fbae6000526004601cfd5b6108d581610aa4565b6000546001146109215760405162461bcd60e51b815260040161031a906112f2565b600260008190555460405163114357cb60e01b81526001600160a01b039091169063114357cb90349061095e9033908890889088906004016117f7565b6000604051808303818588803b15801561097757600080fd5b505af115801561098b573d6000803e3d6000fd5b50506001600055505050505050565b60006109a68284611834565b11156109c3576109c36001600160a01b0385163330848603610ae2565b80156109f8576109de6001600160a01b038416333084610ae2565b6001546109f8906001600160a01b03858116911683610b36565b50505050565b60005b8451811015610a8257610a7a858281518110610a1f57610a1f611855565b6020026020010151858381518110610a3957610a39611855565b6020026020010151858481518110610a5357610a53611855565b6020026020010151858581518110610a6d57610a6d611855565b602002602001015161099a565b600101610a01565b5050505050565b638b78c6d8195433146105e6576382b429006000526004601cfd5b638b78c6d81980546001600160a01b039092169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a355565b60405181606052826040528360601b602c526323b872dd60601b600c52602060006064601c6000895af13d156001600051141716610b2857637939f4246000526004601cfd5b600060605260405250505050565b816014528060345263095ea7b360601b60005260206000604460106000875af13d156001600051141716610b7257633e3f8f736000526004601cfd5b6000603452505050565b60008083601f840112610b8e57600080fd5b5081356001600160401b03811115610ba557600080fd5b602083019150836020828501011115610bbd57600080fd5b9250929050565b600060808284031215610bd657600080fd5b50919050565b600060408284031215610bd657600080fd5b60008060008060e08587031215610c0457600080fd5b84356001600160401b03811115610c1a57600080fd5b610c2687828801610b7c565b9095509350610c3a90508660208701610bc4565b9150610c498660a08701610bdc565b905092959194509250565b60008060008060808587031215610c6a57600080fd5b84356001600160401b0380821115610c8157600080fd5b610c8d88838901610b7c565b90965094506020870135915080821115610ca657600080fd5b50610cb387828801610bc4565b925050610c498660408701610bdc565b60008060208385031215610cd657600080fd5b82356001600160401b03811115610cec57600080fd5b610cf885828601610b7c565b90969095509350505050565b634e487b7160e01b600052604160045260246000fd5b60405160e081016001600160401b0381118282101715610d3c57610d3c610d04565b60405290565b60405160c081016001600160401b0381118282101715610d3c57610d3c610d04565b604051601f8201601f191681016001600160401b0381118282101715610d8c57610d8c610d04565b604052919050565b60ff811681146108d557600080fd5b8035610dae81610d94565b919050565b6001600160a01b03811681146108d557600080fd5b8035610dae81610db3565b803563ffffffff81168114610dae57600080fd5b60006001600160401b03821115610e0057610e00610d04565b5060051b60200190565b600082601f830112610e1b57600080fd5b81356020610e30610e2b83610de7565b610d64565b82815260059290921b84018101918181019086841115610e4f57600080fd5b8286015b84811015610e73578035610e6681610db3565b8352918301918301610e53565b509695505050505050565b600082601f830112610e8f57600080fd5b81356020610e9f610e2b83610de7565b82815260059290921b84018101918181019086841115610ebe57600080fd5b8286015b84811015610e735780358352918301918301610ec2565b600080600060408486031215610eee57600080fd5b83356001600160401b0380821115610f0557600080fd5b610f1187838801610b7c565b90955093506020860135915080821115610f2a57600080fd5b9085019060e08288031215610f3e57600080fd5b610f46610d1a565b610f4f83610da3565b8152610f5d60208401610dc8565b6020820152610f6e60408401610dd3565b6040820152606083013582811115610f8557600080fd5b610f9189828601610e0a565b606083015250608083013582811115610fa957600080fd5b610fb589828601610e0a565b60808301525060a083013582811115610fcd57600080fd5b610fd989828601610e7e565b60a08301525060c083013582811115610ff157600080fd5b610ffd89828601610e7e565b60c0830152508093505050509250925092565b60006020828403121561102257600080fd5b61102b82610dd3565b9392505050565b600081518084526020808501945080840160005b8381101561106b5781516001600160a01b031687529582019590820190600101611046565b509495945050505050565b600081518084526020808501945080840160005b8381101561106b5781518752958201959082019060010161108a565b6020815260ff8251166020820152600060208301516110d460408401826affffffffffffffffffffff169052565b5060408301516001600160a01b038116606084015250606083015160e06080840152611104610100840182611032565b90506080840151601f19808584030160a08601526111228383611032565b925060a08601519150808584030160c086015261113f8383611076565b925060c08601519150808584030160e08601525061115d8282611076565b95945050505050565b6000806000806080858703121561117c57600080fd5b61118585610dd3565b935060208501356001600160401b038111156111a057600080fd5b6111ac87828801610b7c565b9094509250610c4990508660408701610bdc565b6000602082840312156111d257600080fd5b813561102b81610db3565b6000806000606084860312156111f257600080fd5b83356001600160401b0381111561120857600080fd5b61121486828701610b7c565b909450925061122890508560208601610bdc565b90509250925092565b600080600083850360e081121561124757600080fd5b84356001600160401b0381111561125d57600080fd5b61126987828801610b7c565b90955093505060c0601f198201121561128157600080fd5b5061128a610d42565b61129660208601610dd3565b815260408501356112a681610db3565b602082015260608501356112b981610db3565b604082015260808501356112cc81610db3565b8060608301525060a0850135608082015260c085013560a0820152809150509250925092565b6020808252600a90820152695245454e5452414e435960b01b604082015260600190565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b6001600160a01b03868116825261010060208301819052600091611366848301888a611316565b92508535915061137582610db3565b908116604084015260208501359061138c82610db3565b166060838101919091526040850135608084015284013560a0830152823560c0830152602083013560e08301525b9695505050505050565b6000808335601e198436030181126113db57600080fd5b8301803591506001600160401b038211156113f557600080fd5b6020019150600581901b3603821315610bbd57600080fd5b6000808335601e1984360301811261142457600080fd5b83016020810192503590506001600160401b0381111561144357600080fd5b8060051b3603821315610bbd57600080fd5b8183526000602080850194508260005b8581101561106b57813561147881610db3565b6001600160a01b031687529582019590820190600101611465565b81835260006001600160fb1b038311156114ac57600080fd5b8260051b80836020870137939093016020019392505050565b6001600160a01b038616815260a0602082018190526000906114ea9083018688611316565b82810360408401526114fc858661140d565b6080835261150e608084018284611455565b91505061151e602087018761140d565b8383036020850152611531838284611455565b92505050611542604087018761140d565b8383036040850152611555838284611493565b92505050611566606087018761140d565b8383036060850152611579838284611493565b873560608801526020880135608088015294506113ba9350505050565b8051610dae81610d94565b80516affffffffffffffffffffff81168114610dae57600080fd5b8051610dae81610db3565b600082601f8301126115d857600080fd5b815160206115e8610e2b83610de7565b82815260059290921b8401810191818101908684111561160757600080fd5b8286015b84811015610e7357805161161e81610db3565b835291830191830161160b565b600082601f83011261163c57600080fd5b8151602061164c610e2b83610de7565b82815260059290921b8401810191818101908684111561166b57600080fd5b8286015b84811015610e73578051835291830191830161166f565b60006020828403121561169857600080fd5b81516001600160401b03808211156116af57600080fd5b9083019060e082860312156116c357600080fd5b6116cb610d1a565b6116d483611596565b81526116e2602084016115a1565b60208201526116f3604084016115bc565b604082015260608301518281111561170a57600080fd5b611716878286016115c7565b60608301525060808301518281111561172e57600080fd5b61173a878286016115c7565b60808301525060a08301518281111561175257600080fd5b61175e8782860161162b565b60a08301525060c08301518281111561177657600080fd5b6117828782860161162b565b60c08301525095945050505050565b6001600160a01b038616815263ffffffff8516602082015260a0604082018190526000906117c29083018587611316565b833560608401526020840135608084015290506113ba565b6000602082840312156117ec57600080fd5b815161102b81610db3565b6001600160a01b038516815260806020820181905260009061181c9083018587611316565b8335604084015260208401356060840152905061115d565b8181038181111561069257634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603260045260246000fdfea2646970667358221220793f9104d14cdc05836f5888789d38adefd3fa873022af933e724fea979e888964736f6c63430008130033", sourceMap: "676:7112:82:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3228:534;;;;;;:::i;:::-;;:::i;:::-;;3802:565;;;;;;:::i;:::-;;:::i;9021:617:30:-;;;:::i;4991:127:82:-;;;;;;:::i;:::-;;:::i;5348:202::-;;;;;;:::i;1171:50::-;;;;;;;;;;-1:-1:-1;1171:50:82;;;;-1:-1:-1;;;;;1171:50:82;;;;;;-1:-1:-1;;;;;7784:32:178;;;7766:51;;7754:2;7739:18;1171:50:82;;;;;;;;9720:456:30;;;:::i;1011:31:82:-;;;;;;;;;;-1:-1:-1;1011:31:82;;;;-1:-1:-1;;;;;1011:31:82;;;8762:100:30;;;:::i;2545:187:82:-;;;;;;;;;;-1:-1:-1;2545:187:82;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;4407:345::-;;;;;;:::i;:::-;;:::i;11408:182:30:-;;;;;;;;;;-1:-1:-1;;;11556:18:30;11408:182;;1860:461:82;;;;;;;;;;-1:-1:-1;1860:461:82;;;;;:::i;:::-;;:::i;1083:47::-;;;;;;;;;;-1:-1:-1;1083:47:82;;;;-1:-1:-1;;;;;1083:47:82;;;10363:708:30;;;;;;:::i;:::-;;:::i;8348:349::-;;;;;;:::i;:::-;;:::i;2959:229:82:-;;;;;;:::i;:::-;;:::i;5158:150::-;;;;;;:::i;11693:435:30:-;;;;;;;;;;-1:-1:-1;11693:435:30;;;;;:::i;:::-;11963:19;11957:4;11950:33;;;11812:14;11996:26;;;;12106:4;12090:21;;12084:28;;11693:435;;;;13101:25:178;;;13089:2;13074:18;11693:435:30;12955:177:178;3228:534:82;512:6:77;;522:1;512:11;504:34;;;;-1:-1:-1;;;504:34:77;;;;;;;:::i;:::-;;;;;;;;;558:1;549:6;:10;3468:92:82::1;3493:15;;::::0;::::1;:8:::0;:15:::1;:::i;:::-;3510:14;::::0;;;::::1;::::0;::::1;;:::i;:::-;3526:8;:15;;;3543:8;:16;;;3468:24;:92::i;:::-;3624:23;::::0;3611:144:::1;::::0;-1:-1:-1;;;3611:144:82;;-1:-1:-1;;;;;3624:23:82;;::::1;::::0;3611:54:::1;::::0;3673:9:::1;::::0;3611:144:::1;::::0;3705:10:::1;::::0;3718:7;;;;3727:8;;3737;;3611:144:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;591:1:77;582:6;:10;-1:-1:-1;;;;;;;3228:534:82:o;3802:565::-;512:6:77;;522:1;512:11;504:34;;;;-1:-1:-1;;;504:34:77;;;;;;;:::i;:::-;558:1;549:6;:10;4052:105:82::1;4086:16;:8:::0;;:16:::1;:::i;:::-;4052:105;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;4104:15:82::1;::::0;-1:-1:-1;;;4104:15:82::1;::::0;::::1;::::0;::::1;:::i;:::-;4052:105;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;4121:16:82::1;::::0;-1:-1:-1;;;4121:16:82::1;::::0;::::1;::::0;::::1;:::i;:::-;4052:105;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;4139:17:82::1;::::0;-1:-1:-1;;;4139:17:82::1;::::0;::::1;::::0;::::1;:::i;:::-;4052:105;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;4052:33:82::1;::::0;-1:-1:-1;;;4052:105:82:i:1;:::-;4221:23;::::0;4208:152:::1;::::0;-1:-1:-1;;;4208:152:82;;-1:-1:-1;;;;;4221:23:82;;::::1;::::0;4208:62:::1;::::0;4278:9:::1;::::0;4208:152:::1;::::0;4310:10:::1;::::0;4323:7;;;;4332:8;;4342;;4208:152:::1;;;:::i;9021:617:30:-:0;9114:15;7972:9;-1:-1:-1;;;;;9132:46:30;:15;:46;9114:64;;9346:19;9340:4;9333:33;9396:8;9390:4;9383:22;9452:7;9445:4;9439;9429:21;9422:38;9599:8;9552:45;9549:1;9546;9541:67;9248:374;9021:617::o;4991:127:82:-;5087:24;;-1:-1:-1;;;5087:24:82;;;;;;;;;;;9720:456:30;9922:19;9916:4;9909:33;9968:8;9962:4;9955:22;10020:1;10013:4;10007;9997:21;9990:32;10151:8;10105:44;10102:1;10099;10094:66;9720:456::o;8762:100::-;12517:13;:11;:13::i;:::-;8834:21:::1;8852:1;8834:9;:21::i;:::-;8762:100::o:0;2545:187:82:-;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2670:23:82;;2657:68;;-1:-1:-1;;;2657:68:82;;19373:10:178;19361:23;;2657:68:82;;;19343:42:178;-1:-1:-1;;;;;;;2670:23:82;;2657:53;;19316:18:178;;2657:68:82;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;2657:68:82;;;;;;;;;;;;:::i;:::-;2650:75;2545:187;-1:-1:-1;;2545:187:82:o;4407:345::-;4622:23;;4609:136;;-1:-1:-1;;;4609:136:82;;-1:-1:-1;;;;;4622:23:82;;;;4609:50;;4667:9;;4609:136;;4691:10;;4703:13;;4718:7;;;;4727:8;;4609:136;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4407:345;;;;:::o;1860:461::-;12517:13:30;:11;:13::i;:::-;-1:-1:-1;;;;;1957:38:82;::::1;1949:83;;;::::0;-1:-1:-1;;;1949:83:82;;23488:2:178;1949:83:82::1;::::0;::::1;23470:21:178::0;;;23507:18;;;23500:30;23566:34;23546:18;;;23539:62;23618:18;;1949:83:82::1;23286:356:178::0;1949:83:82::1;2042:19;:17;:19::i;:::-;2072:23;:50:::0;;-1:-1:-1;;;;;;2072:50:82::1;-1:-1:-1::0;;;;;2072:50:82;::::1;::::0;;::::1;::::0;;;2151:57:::1;::::0;;-1:-1:-1;;;2151:57:82;;;;:55:::1;::::0;:57:::1;::::0;;::::1;::::0;::::1;::::0;;;;;;;;;2072:50;2151:57:::1;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;2132:16;;:76;;;;;-1:-1:-1::0;;;;;2132:76:82::1;;;;;-1:-1:-1::0;;;;;2132:76:82::1;;;;;;2260:24;-1:-1:-1::0;;;;;2247:65:82::1;;:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;2218:26;:96:::0;;-1:-1:-1;;;;;;2218:96:82::1;-1:-1:-1::0;;;;;2218:96:82;;;::::1;::::0;;;::::1;::::0;;-1:-1:-1;1860:461:82:o;10363:708:30:-;12517:13;:11;:13::i;:::-;10597:19:::1;10591:4;10584:33;10643:12;10637:4;10630:26;10705:4;10699;10689:21;10811:12;10805:19;10792:11;10789:36;10786:157;;;10857:10;10851:4;10844:24;10924:4;10918;10911:18;10786:157;11020:1;10999:23:::0;;11041::::1;11051:12:::0;11041:9:::1;:23::i;:::-;10363:708:::0;:::o;8348:349::-;12517:13;:11;:13::i;:::-;8520:8:::1;8516:2;8512:17;8502:150;;8562:10;8556:4;8549:24;8633:4;8627;8620:18;8502:150;8671:19;8681:8;8671:9;:19::i;2959:229:82:-:0;512:6:77;;522:1;512:11;504:34;;;;-1:-1:-1;;;504:34:77;;;;;;;:::i;:::-;558:1;549:6;:10;;;3091:23:82;3078:103:::1;::::0;-1:-1:-1;;;3078:103:82;;-1:-1:-1;;;;;3091:23:82;;::::1;::::0;30