Spend less on fees, more on crypto. Buy crypto easily with MoonPay Balance. 20M+ users trust MoonPay worldwide.
Ready to onboard to Ethereum? With MetaMask Portfolio, you're in control.
Don’t invest unless you’re prepared to lose all the money you invest.
Ready to simplify your web3 experience? Try the all-in-one web3 app trusted by millions worldwide.
Available on 9 networks: Ethereum mainnet, Linea, Polygon, Optimism, BNB Chain, zkSync Era, Base, Avalanche.
Everyday giveaways up to 100 ETH, Lucky Spins. Deposit BONUS 300% and Cashbacks!
5000+ Slots & Live Casino Games, 50+cryptos. Register with Etherscan and get 760% deposit bonus. Win Big$, withdraw it fast.
Slots, Roulette, Poker & more - Proud sponsors of UFC, Everton & StakeF1 team!
5000+ Slots & Live Casino Games, 50+cryptos. Register with Etherscan and get 760% deposit bonus. Win Big$, withdraw it fast.
Anonymous play on awesome games - sign up now for 25 free jackpot spins - worth $100s!
100s of games, generous bonuses, 20+ years of trusted gaming. Join CryptoWins & start winning today!
Overview
ETH Balance
Eth Value
$2,093,011.44 (@ $3,302.52/ETH)Token Holdings
Could not find any matches!
- ERC-20 Tokens (9)1 HAWHardwaretor (HAW)1.7 TokenERC-20 TOKEN*[Suspicious]1.4 TokenERC-20 TOKEN*[Spam]1.4 TokenERC-20 TOKEN*[Spam]1.4 TokenERC-20 TOKEN*[Spam]3,999.99 TokenERC-20 TOKEN*[Spam]98,127 TokenERC-20 TOKEN*[Spam]1,049 TokenERC-20 TOKEN*[Spam]3,999.99 TokenERC-20 TOKEN*[Spam]NFT Tokens (9)claim rewards on pool-eth.netpool-eth.netERC-1155
More Info
Private Name Tags
ContractCreator
- Transactions
- Internal Transactions
- Token Transfers (ERC-20)
- NFT Transfers
- Contract
- Events
- Analytics
- Multichain Portfolio
- Cards New
Advanced Filter- Filter by Tx Type:
- Tx
- Internal Tx
- ERC-20
- NFTs
Latest 25 from a total of 13,361 transactions
Transaction Hash MethodBlockFromToClaim Tokens 21463214 2024-12-23 5:51:11 33 mins ago 1734933071 IN 0 ETH$0.00 0.00100573 4.53798645 Claim Eth 21463027 2024-12-23 5:13:23 1 hr ago 1734930803 IN 0 ETH$0.00 0.00036849 4.96698644 Claim Eth 21462970 2024-12-23 5:01:59 1 hr ago 1734930119 IN 0 ETH$0.00 0.00042231 5.69236168 Claim Eth 21462726 2024-12-23 4:12:59 2 hrs ago 1734927179 IN 0 ETH$0.00 0.00050263 5.4686238 Claim Eth 21462718 2024-12-23 4:11:23 2 hrs ago 1734927083 IN 0 ETH$0.00 0.00054459 5.9265675 Claim Eth 21462612 2024-12-23 3:50:11 2 hrs ago 1734925811 IN 0 ETH$0.00 0.00056181 5.15706685 Claim Eth 21462596 2024-12-23 3:46:59 2 hrs ago 1734925619 IN 0 ETH$0.00 0.00053952 5.86820281 Claim Tokens 21462443 2024-12-23 3:15:47 3 hrs ago 1734923747 IN 0 ETH$0.00 0.00202177 9.12231931 Claim Tokens 21462427 2024-12-23 3:12:35 3 hrs ago 1734923555 IN 0 ETH$0.00 0.00057307 7.69851848 Claim Tokens 21462427 2024-12-23 3:12:35 3 hrs ago 1734923555 IN 0 ETH$0.00 0.00057307 7.69851848 Claim Tokens 21462426 2024-12-23 3:12:23 3 hrs ago 1734923543 IN 0 ETH$0.00 0.00056073 7.5326582 Claim Tokens 21462422 2024-12-23 3:11:35 3 hrs ago 1734923495 IN 0 ETH$0.00 0.00045567 6.1214282 Claim Tokens 21462417 2024-12-23 3:10:35 3 hrs ago 1734923435 IN 0 ETH$0.00 0.00044976 6.04196844 Claim Eth 21462411 2024-12-23 3:09:23 3 hrs ago 1734923363 IN 0 ETH$0.00 0.00044733 6.03272225 Claim Tokens 21462408 2024-12-23 3:08:47 3 hrs ago 1734923327 IN 0 ETH$0.00 0.00052723 7.08266194 Claim Eth 21462404 2024-12-23 3:07:59 3 hrs ago 1734923279 IN 0 ETH$0.00 0.0004412 5.95104115 Claim Tokens 21462403 2024-12-23 3:07:35 3 hrs ago 1734923255 IN 0 ETH$0.00 0.00044506 5.97974511 Claim Tokens 21462278 2024-12-23 2:42:35 3 hrs ago 1734921755 IN 0 ETH$0.00 0.00037734 5.06878024 Claim Tokens 21462275 2024-12-23 2:41:59 3 hrs ago 1734921719 IN 0 ETH$0.00 0.0003906 5.24700095 Claim Eth 21462259 2024-12-23 2:38:35 3 hrs ago 1734921515 IN 0 ETH$0.00 0.0005039 5.4836024 Claim Eth 21462236 2024-12-23 2:33:59 3 hrs ago 1734921239 IN 0 ETH$0.00 0.00055426 6.02975915 Claim Eth 21462227 2024-12-23 2:32:11 3 hrs ago 1734921131 IN 0 ETH$0.00 0.00049242 5.35627344 New Root 21462206 2024-12-23 2:27:59 3 hrs ago 1734920879 IN 40.05 ETH$132,265.91 0.00029873 5.41404692 Claim Tokens 21462126 2024-12-23 2:11:59 4 hrs ago 1734919919 IN 0 ETH$0.00 0.00064237 6.42375082 Claim Eth 21462087 2024-12-23 2:04:11 4 hrs ago 1734919451 IN 0 ETH$0.00 0.00047323 4.34044249 Latest 25 internal transactions (View All)
Advanced mode:Parent Transaction Hash Block FromTo21463214 2024-12-23 5:51:11 33 mins ago 1734933071 0.00731688 ETH$24.16 21462726 2024-12-23 4:12:59 2 hrs ago 1734927179 0.07994345 ETH$264.01 21462718 2024-12-23 4:11:23 2 hrs ago 1734927083 0.12087423 ETH$399.19 21462612 2024-12-23 3:50:11 2 hrs ago 1734925811 0.03367584 ETH$111.22 21462596 2024-12-23 3:46:59 2 hrs ago 1734925619 0.0060644 ETH$20.03 21462443 2024-12-23 3:15:47 3 hrs ago 1734923747 0.01076635 ETH$35.56 21462259 2024-12-23 2:38:35 3 hrs ago 1734921515 0.0214068 ETH$70.70 21462236 2024-12-23 2:33:59 3 hrs ago 1734921239 0.05306127 ETH$175.24 21462227 2024-12-23 2:32:11 3 hrs ago 1734921131 0.10476687 ETH$345.99 21462087 2024-12-23 2:04:11 4 hrs ago 1734919451 0.03660907 ETH$120.90 21461822 2024-12-23 1:10:47 5 hrs ago 1734916247 0.00035339 ETH$1.17 21461718 2024-12-23 0:49:59 5 hrs ago 1734914999 0.00207196 ETH$6.84 21461514 2024-12-23 0:08:35 6 hrs ago 1734912515 0.01786641 ETH$59.00 21461399 2024-12-22 23:45:23 6 hrs ago 1734911123 0.07743931 ETH$255.74 21461379 2024-12-22 23:41:11 6 hrs ago 1734910871 0.07399999 ETH$244.39 21461070 2024-12-22 22:39:11 7 hrs ago 1734907151 0.00050877 ETH$1.68 21461065 2024-12-22 22:38:11 7 hrs ago 1734907091 0.00101754 ETH$3.36 21461015 2024-12-22 22:27:59 7 hrs ago 1734906479 0.04782952 ETH$157.96 21460879 2024-12-22 22:00:23 8 hrs ago 1734904823 0.0009767 ETH$3.23 21460710 2024-12-22 21:26:11 8 hrs ago 1734902771 0.00134194 ETH$4.43 21460265 2024-12-22 19:56:47 10 hrs ago 1734897407 0.00711032 ETH$23.48 21459968 2024-12-22 18:56:47 11 hrs ago 1734893807 0.00680028 ETH$22.46 21459680 2024-12-22 17:58:59 12 hrs ago 1734890339 0.00694395 ETH$22.93 21459531 2024-12-22 17:28:59 12 hrs ago 1734888539 0.083 ETH$274.11 21459485 2024-12-22 17:19:47 13 hrs ago 1734887987 0.00657575 ETH$21.72 Loading...LoadingContract Name:OxODashboardClaim
Compiler Versionv0.8.9+commit.e5eed63a
Contract Source Code (Solidity)
- interface IUniswapV2Factory
- - function feeTo()
- - function feeToSetter()
- - function getPair(address tokenA, addr ...
- - function allPairs(uint)
- - function allPairsLength()
- - function createPair(address tokenA, a ...
- - function setFeeTo(address)
- - function setFeeToSetter(address)
- interface IUniswapV2Pair
- - function name()
- - function symbol()
- - function decimals()
- - function totalSupply()
- - function balanceOf(address owner)
- - function allowance(address owner, add ...
- - function approve(address spender, uin ...
- - function transfer(address to, uint va ...
- - function transferFrom(address from, a ...
- - function DOMAIN_SEPARATOR()
- - function PERMIT_TYPEHASH()
- - function nonces(address owner)
- - function permit(address owner, addres ...
- - function MINIMUM_LIQUIDITY()
- - function factory()
- - function token0()
- - function token1()
- - function getReserves()
- - function price0CumulativeLast()
- - function price1CumulativeLast()
- - function kLast()
- - function mint(address to)
- - function burn(address to)
- - function swap(uint amount0Out, uint a ...
- - function skim(address to)
- - function sync()
- - function initialize(address, address)
- interface IUniswapV2Router01
- - function factory()
- - function WETH()
- - function addLiquidity(
- - function addLiquidityETH(
- - function removeLiquidity(
- - function removeLiquidityETH(
- - function removeLiquidityWithPermit(
- - function removeLiquidityETHWithPermit ...
- - function swapExactTokensForTokens(
- - function swapTokensForExactTokens(
- - function swapExactETHForTokens(
- - function swapTokensForExactETH(
- - function swapExactTokensForETH(
- - function swapETHForExactTokens(
- - function quote(
- - function getAmountOut(
- - function getAmountIn(
- - function getAmountsOut(uint256 amount ...
- - function getAmountsIn(uint256 amountO ...
- interface IUniswapV2Router02 is IUnis ...
- - function removeLiquidityETHSupporting ...
- - function removeLiquidityETHWithPermit ...
- - function swapExactTokensForTokensSupp ...
- - function swapExactETHForTokensSupport ...
- - function swapExactTokensForETHSupport ...
- library MerkleProof
- - function verify(
- - function verifyCalldata(
- - function processProof(bytes32[] memor ...
- - function processProofCalldata(bytes32 ...
- - function multiProofVerify(
- - function multiProofVerifyCalldata(
- - function processMultiProof(
- - function processMultiProofCalldata(
- - function _hashPair(bytes32 a, bytes32 ...
- - function _efficientHash(bytes32 a, by ...
- interface IERC20
- - function transfer(address recipient, ...
- - function balanceOf(address account)
- - function totalSupply()
- - function decimals()
- - function symbol()
- contract OxODashboardClaim *
- - function processClaim(
- - function claimTokens(
- - function claimEth(
- - function swapEthForTokens(uint256 eth ...
- - function getAmountOut(uint256 ethIn)
- - function toggleClaiming()
- - function transferOwnership(address _n ...
- - function newRoot(bytes32 root)
- - function withdrawETH(uint256 _amount, ...
- - function withdrawToken(uint256 _amoun ...
- - function calculateAdjustedTokenSupply ...
- - function calculateTokenPriceInWETH()
- - function calculateRewardPerTokenInWET ...
- - function calculateRewardsInWETH(uint2 ...
- - function calculateHolderRewardsInWETH ...
- - function calculateRAndN()
- - function calculateAPYAndAPR()
- - function calculateCustomVolume(
- - function updateRewardReplenishFrequen ...
- - function updateTotalRounds(uint256 _t ...
- - function updateTotalEthForRewards(uin ...
- - function updateToken(address _token)
- - function updateRouter(address _router ...
- - function addIneligibleHolder(address ...
- - function removeIneligibleHolder(addre ...
- - function isIneligibleHolder(address u ...
- - function setAmountClaimed(address _ad ...
- - function setAmountClaimedBatch(addres ...
/** *Submitted for verification at Etherscan.io on 2023-08-06 */ /** (((((((( .(((("/((( (((((, .((((/ /((((((( *(((((((( ,/((((((((( .(((("//(((/* (((((((, (((((((/ ./((((((((( /((((((((((* (((((( ((((** ((((((. *(((((( .((((( /(((( (((/(( (((((* .##### ,##(( ,(/((( ./"/"/ (((((( (((((/ *#####(( .((((/ .////( (((((( (((((* ,((####( .((((( ./((/( (((((( (((((* ,((((###/ ./(((( .((((/ (((((( (((/(* "//(((((/(#(/ .(###( .((((/ *((((( (((((/ *####...*"/### .(#### ./(((( (((((/ ###((/ (####. (###( ,((#(( (((#( "/((######( ((#######/*, (((##( . . *#(((( .,(((((((#( ,((##((((((* (######( (#######( (#(#(* .((((( ((((((## *(#((##((* 0x0 Dashboard contract allows you to claim ETH and compound it back to 0x0 tokens at your discretion, with any amount in ETH. It utilizes Merkle Proofs, and your ETH amount remains fixed to your address until you claim it. You can track your claimed and unclaimed rewards, as well as the total distributed rewards. Additionally, you can monitor the volume of ETH added to the contract. The contract also provides calculations for APY, APR, and your rewards. */ // SPDX-License-Identifier: MIT pragma solidity >=0.8.0; interface IUniswapV2Factory { event PairCreated(address indexed token0, address indexed token1, address pair, uint); function feeTo() external view returns (address); function feeToSetter() external view returns (address); function getPair(address tokenA, address tokenB) external view returns (address pair); function allPairs(uint) external view returns (address pair); function allPairsLength() external view returns (uint); function createPair(address tokenA, address tokenB) external returns (address pair); function setFeeTo(address) external; function setFeeToSetter(address) external; } interface IUniswapV2Pair { event Approval(address indexed owner, address indexed spender, uint value); event Transfer(address indexed from, address indexed to, uint value); function name() external pure returns (string memory); function symbol() external pure returns (string memory); function decimals() external pure returns (uint8); function totalSupply() external view returns (uint); function balanceOf(address owner) external view returns (uint); function allowance(address owner, address spender) external view returns (uint); function approve(address spender, uint value) external returns (bool); function transfer(address to, uint value) external returns (bool); function transferFrom(address from, address to, uint value) external returns (bool); function DOMAIN_SEPARATOR() external view returns (bytes32); function PERMIT_TYPEHASH() external pure returns (bytes32); function nonces(address owner) external view returns (uint); function permit(address owner, address spender, uint value, uint deadline, uint8 v, bytes32 r, bytes32 s) external; event Mint(address indexed sender, uint amount0, uint amount1); event Burn(address indexed sender, uint amount0, uint amount1, address indexed to); event Swap( address indexed sender, uint amount0In, uint amount1In, uint amount0Out, uint amount1Out, address indexed to ); event Sync(uint112 reserve0, uint112 reserve1); function MINIMUM_LIQUIDITY() external pure returns (uint); function factory() external view returns (address); function token0() external view returns (address); function token1() external view returns (address); function getReserves() external view returns (uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast); function price0CumulativeLast() external view returns (uint); function price1CumulativeLast() external view returns (uint); function kLast() external view returns (uint); function mint(address to) external returns (uint liquidity); function burn(address to) external returns (uint amount0, uint amount1); function swap(uint amount0Out, uint amount1Out, address to, bytes calldata data) external; function skim(address to) external; function sync() external; function initialize(address, address) external; } interface IUniswapV2Router01 { function factory() external pure returns (address); function WETH() external pure returns (address); function addLiquidity( address tokenA, address tokenB, uint256 amountADesired, uint256 amountBDesired, uint256 amountAMin, uint256 amountBMin, address to, uint256 deadline ) external returns ( uint256 amountA, uint256 amountB, uint256 liquidity ); function addLiquidityETH( address token, uint256 amountTokenDesired, uint256 amountTokenMin, uint256 amountETHMin, address to, uint256 deadline ) external payable returns ( uint256 amountToken, uint256 amountETH, uint256 liquidity ); function removeLiquidity( address tokenA, address tokenB, uint256 liquidity, uint256 amountAMin, uint256 amountBMin, address to, uint256 deadline ) external returns (uint256 amountA, uint256 amountB); function removeLiquidityETH( address token, uint256 liquidity, uint256 amountTokenMin, uint256 amountETHMin, address to, uint256 deadline ) external returns (uint256 amountToken, uint256 amountETH); function removeLiquidityWithPermit( address tokenA, address tokenB, uint256 liquidity, uint256 amountAMin, uint256 amountBMin, address to, uint256 deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external returns (uint256 amountA, uint256 amountB); function removeLiquidityETHWithPermit( address token, uint256 liquidity, uint256 amountTokenMin, uint256 amountETHMin, address to, uint256 deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external returns (uint256 amountToken, uint256 amountETH); function swapExactTokensForTokens( uint256 amountIn, uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external returns (uint256[] memory amounts); function swapTokensForExactTokens( uint256 amountOut, uint256 amountInMax, address[] calldata path, address to, uint256 deadline ) external returns (uint256[] memory amounts); function swapExactETHForTokens( uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external payable returns (uint256[] memory amounts); function swapTokensForExactETH( uint256 amountOut, uint256 amountInMax, address[] calldata path, address to, uint256 deadline ) external returns (uint256[] memory amounts); function swapExactTokensForETH( uint256 amountIn, uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external returns (uint256[] memory amounts); function swapETHForExactTokens( uint256 amountOut, address[] calldata path, address to, uint256 deadline ) external payable returns (uint256[] memory amounts); function quote( uint256 amountA, uint256 reserveA, uint256 reserveB ) external pure returns (uint256 amountB); function getAmountOut( uint256 amountIn, uint256 reserveIn, uint256 reserveOut ) external pure returns (uint256 amountOut); function getAmountIn( uint256 amountOut, uint256 reserveIn, uint256 reserveOut ) external pure returns (uint256 amountIn); function getAmountsOut(uint256 amountIn, address[] calldata path) external view returns (uint256[] memory amounts); function getAmountsIn(uint256 amountOut, address[] calldata path) external view returns (uint256[] memory amounts); } interface IUniswapV2Router02 is IUniswapV2Router01 { function removeLiquidityETHSupportingFeeOnTransferTokens( address token, uint256 liquidity, uint256 amountTokenMin, uint256 amountETHMin, address to, uint256 deadline ) external returns (uint256 amountETH); function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens( address token, uint256 liquidity, uint256 amountTokenMin, uint256 amountETHMin, address to, uint256 deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external returns (uint256 amountETH); function swapExactTokensForTokensSupportingFeeOnTransferTokens( uint256 amountIn, uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external; function swapExactETHForTokensSupportingFeeOnTransferTokens( uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external payable; function swapExactTokensForETHSupportingFeeOnTransferTokens( uint256 amountIn, uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external; } library MerkleProof { /** *@dev The multiproof provided is not valid. */ error MerkleProofInvalidMultiproof(); /** * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree * defined by `root`. For this, a `proof` must be provided, containing * sibling hashes on the branch from the leaf to the root of the tree. Each * pair of leaves and each pair of pre-images are assumed to be sorted. */ function verify( bytes32[] memory proof, bytes32 root, bytes32 leaf ) internal pure returns (bool) { return processProof(proof, leaf) == root; } /** * @dev Calldata version of {verify} * * _Available since v4.7._ */ function verifyCalldata( bytes32[] calldata proof, bytes32 root, bytes32 leaf ) internal pure returns (bool) { return processProofCalldata(proof, leaf) == root; } /** * @dev Returns the rebuilt hash obtained by traversing a Merkle tree up * from `leaf` using `proof`. A `proof` is valid if and only if the rebuilt * hash matches the root of the tree. When processing the proof, the pairs * of leafs & pre-images are assumed to be sorted. * * _Available since v4.4._ */ function processProof(bytes32[] memory proof, bytes32 leaf) internal pure returns (bytes32) { bytes32 computedHash = leaf; for (uint256 i = 0; i < proof.length; i++) { computedHash = _hashPair(computedHash, proof[i]); } return computedHash; } /** * @dev Calldata version of {processProof} * * _Available since v4.7._ */ function processProofCalldata(bytes32[] calldata proof, bytes32 leaf) internal pure returns (bytes32) { bytes32 computedHash = leaf; for (uint256 i = 0; i < proof.length; i++) { computedHash = _hashPair(computedHash, proof[i]); } return computedHash; } /** * @dev Returns true if the `leaves` can be simultaneously proven to be a part of a merkle tree defined by * `root`, according to `proof` and `proofFlags` as described in {processMultiProof}. * * CAUTION: Not all merkle trees admit multiproofs. See {processMultiProof} for details. * * _Available since v4.7._ */ function multiProofVerify( bytes32[] memory proof, bool[] memory proofFlags, bytes32 root, bytes32[] memory leaves ) internal pure returns (bool) { return processMultiProof(proof, proofFlags, leaves) == root; } /** * @dev Calldata version of {multiProofVerify} * * CAUTION: Not all merkle trees admit multiproofs. See {processMultiProof} for details. * * _Available since v4.7._ */ function multiProofVerifyCalldata( bytes32[] calldata proof, bool[] calldata proofFlags, bytes32 root, bytes32[] memory leaves ) internal pure returns (bool) { return processMultiProofCalldata(proof, proofFlags, leaves) == root; } /** * @dev Returns the root of a tree reconstructed from `leaves` and sibling nodes in `proof`. The reconstruction * proceeds by incrementally reconstructing all inner nodes by combining a leaf/inner node with either another * leaf/inner node or a proof sibling node, depending on whether each `proofFlags` item is true or false * respectively. * * CAUTION: Not all merkle trees admit multiproofs. To use multiproofs, it is sufficient to ensure that: 1) the tree * is complete (but not necessarily perfect), 2) the leaves to be proven are in the opposite order they are in the * tree (i.e., as seen from right to left starting at the deepest layer and continuing at the next layer). * * _Available since v4.7._ */ function processMultiProof( bytes32[] memory proof, bool[] memory proofFlags, bytes32[] memory leaves ) internal pure returns (bytes32 merkleRoot) { // This function rebuilds the root hash by traversing the tree up from the leaves. The root is rebuilt by // consuming and producing values on a queue. The queue starts with the `leaves` array, then goes onto the // `hashes` array. At the end of the process, the last hash in the `hashes` array should contain the root of // the merkle tree. uint256 leavesLen = leaves.length; uint256 proofLen = proof.length; uint256 totalHashes = proofFlags.length; // Check proof validity. if (leavesLen + proofLen - 1 != totalHashes) { revert MerkleProofInvalidMultiproof(); } // The xxxPos values are "pointers" to the next value to consume in each array. All accesses are done using // `xxx[xxxPos++]`, which return the current value and increment the pointer, thus mimicking a queue's "pop". bytes32[] memory hashes = new bytes32[](totalHashes); uint256 leafPos = 0; uint256 hashPos = 0; uint256 proofPos = 0; // At each step, we compute the next hash using two values: // - a value from the "main queue". If not all leaves have been consumed, we get the next leaf, otherwise we // get the next hash. // - depending on the flag, either another value from the "main queue" (merging branches) or an element from the // `proof` array. for (uint256 i = 0; i < totalHashes; i++) { bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++]; bytes32 b = proofFlags[i] ? (leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++]) : proof[proofPos++]; hashes[i] = _hashPair(a, b); } if (totalHashes > 0) { if (proofPos != proofLen) { revert MerkleProofInvalidMultiproof(); } unchecked { return hashes[totalHashes - 1]; } } else if (leavesLen > 0) { return leaves[0]; } else { return proof[0]; } } /** * @dev Calldata version of {processMultiProof}. * * CAUTION: Not all merkle trees admit multiproofs. See {processMultiProof} for details. * * _Available since v4.7._ */ function processMultiProofCalldata( bytes32[] calldata proof, bool[] calldata proofFlags, bytes32[] memory leaves ) internal pure returns (bytes32 merkleRoot) { // This function rebuilds the root hash by traversing the tree up from the leaves. The root is rebuilt by // consuming and producing values on a queue. The queue starts with the `leaves` array, then goes onto the // `hashes` array. At the end of the process, the last hash in the `hashes` array should contain the root of // the merkle tree. uint256 leavesLen = leaves.length; uint256 proofLen = proof.length; uint256 totalHashes = proofFlags.length; // Check proof validity. if (leavesLen + proofLen - 1 != totalHashes) { revert MerkleProofInvalidMultiproof(); } // The xxxPos values are "pointers" to the next value to consume in each array. All accesses are done using // `xxx[xxxPos++]`, which return the current value and increment the pointer, thus mimicking a queue's "pop". bytes32[] memory hashes = new bytes32[](totalHashes); uint256 leafPos = 0; uint256 hashPos = 0; uint256 proofPos = 0; // At each step, we compute the next hash using two values: // - a value from the "main queue". If not all leaves have been consumed, we get the next leaf, otherwise we // get the next hash. // - depending on the flag, either another value from the "main queue" (merging branches) or an element from the // `proof` array. for (uint256 i = 0; i < totalHashes; i++) { bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++]; bytes32 b = proofFlags[i] ? (leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++]) : proof[proofPos++]; hashes[i] = _hashPair(a, b); } if (totalHashes > 0) { if (proofPos != proofLen) { revert MerkleProofInvalidMultiproof(); } unchecked { return hashes[totalHashes - 1]; } } else if (leavesLen > 0) { return leaves[0]; } else { return proof[0]; } } function _hashPair(bytes32 a, bytes32 b) private pure returns (bytes32) { return a < b ? _efficientHash(a, b) : _efficientHash(b, a); } function _efficientHash(bytes32 a, bytes32 b) private pure returns (bytes32 value) { /// @solidity memory-safe-assembly assembly { mstore(0x00, a) mstore(0x20, b) value := keccak256(0x00, 0x40) } } } interface IERC20 { function transfer(address recipient, uint256 amount) external returns (bool); function balanceOf(address account) external view returns (uint256); function totalSupply() external view returns (uint256); function decimals() external view returns (uint256); function symbol() external view returns (uint256); } contract OxODashboardClaim { IUniswapV2Router02 public router; address public token; address public owner; bool public claimingEnabled; bytes32 public merkleRoot; mapping(address => uint256) public amountClaimed; uint256 public totalEthForRewards; uint256 public lastEthForRewards; uint256 public totalClaimedEth; uint256 public totalRounds; uint256 public lastRewardTime; uint256 year = 365; uint256 public rewardReplenishFrequency = 7; uint256 constant PRECISION = 10**18; // Ineligible holders address[] private ineligibleHolders; error ExceedsClaim(); error NotInMerkle(); error ClaimingDisabled(); constructor() { router = IUniswapV2Router02(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D); token = 0x5a3e6A77ba2f983eC0d371ea3B475F8Bc0811AD5; owner = msg.sender; addIneligibleHolder(0x000000000000000000000000000000000000dEaD); addIneligibleHolder(0x9Ec9367b8c4Dd45ec8E7b800b1F719251053AD60); addIneligibleHolder(0x5a3e6A77ba2f983eC0d371ea3B475F8Bc0811AD5); addIneligibleHolder(0x0E7619cCcfa3E181898E3b885A2527968953cf4B); addIneligibleHolder(0x120051a72966950B8ce12eB5496B5D1eEEC1541B); addIneligibleHolder(0x5bdf85216ec1e38D6458C870992A69e38e03F7Ef); } event Claim( address indexed to, uint256 amount, uint256 amountClaimed ); modifier onlyOwner() { require(owner == msg.sender, "Ownable: caller is not the owner"); _; } function processClaim( address to, uint256 amount, bytes32[] calldata proof, uint256 claimAmount ) internal { // Throw if address tries to claim too many tokens if (amountClaimed[to] + claimAmount > amount) revert ExceedsClaim(); if(!claimingEnabled) revert ClaimingDisabled(); // Verify merkle proof, or revert if not in tree bytes32 leaf = keccak256(abi.encodePacked(to, amount)); bool isValidLeaf = MerkleProof.verify(proof, merkleRoot, leaf); if (!isValidLeaf) revert NotInMerkle(); // Track ETH claimed amountClaimed[to] += claimAmount; totalClaimedEth += claimAmount; } function claimTokens( uint256 amount, bytes32[] calldata proof, uint256 claimAmount, uint256 minAmount ) external { address to = msg.sender; // Check if the claimer is not an ineligible holder require(!isIneligibleHolder(to), "Claimer is ineligible."); processClaim(to, amount, proof, claimAmount); swapEthForTokens(claimAmount, to, minAmount); // Emit claim event emit Claim(to, amount, claimAmount); } function claimEth( uint256 amount, bytes32[] calldata proof, uint256 claimAmount ) external returns (bool success) { address to = msg.sender; // Check if the claimer is not an ineligible holder require(!isIneligibleHolder(to), "Claimer is ineligible."); processClaim(to, amount, proof, claimAmount); // Send ETH to address (success, ) = to.call{value: claimAmount}(""); // Emit claim event emit Claim(to, amount, claimAmount); } function swapEthForTokens(uint256 ethAmount, address to, uint256 minAmount) internal { address[] memory path = new address[](2); path[0] = router.WETH(); path[1] = token; // make the swap router.swapExactETHForTokensSupportingFeeOnTransferTokens{ value: ethAmount }( minAmount, path, to, block.timestamp ); } function getAmountOut(uint256 ethIn) external view returns(uint256){ (uint256 reserveA, uint256 reserveB,) = IUniswapV2Pair(IUniswapV2Factory(router.factory()).getPair(token, router.WETH())).getReserves(); return router.getAmountOut(ethIn, reserveB, reserveA); } function toggleClaiming() external onlyOwner { claimingEnabled = !claimingEnabled; } function transferOwnership(address _newOwner) external onlyOwner { owner = _newOwner; } function newRoot(bytes32 root) public payable onlyOwner { require(msg.value > 0, "Must send some ETH with the newRoot function."); totalEthForRewards += msg.value; lastEthForRewards = msg.value; rewardReplenishFrequency = (block.timestamp - lastRewardTime) / (60 * 60 * 24); // Check if rewardReplenishFrequency is 0, set it to 1 if (rewardReplenishFrequency == 0) { rewardReplenishFrequency = 1; } merkleRoot = root; lastRewardTime = block.timestamp; totalRounds++; // Increment the totalRounds counter } function withdrawETH(uint256 _amount, address payable _to) external onlyOwner { require(_to != address(0), "Zero address is invalid."); require(_amount > 0, "Amount must be greater than zero."); require(address(this).balance >= _amount, "Not enough ETH!"); // totalEthForRewards -= _amount; (bool success, ) = _to.call{value: _amount}(""); require(success, "Transfer failed!"); } function withdrawToken(uint256 _amount, address _to, address _token) external onlyOwner { require(_to != address(0), "Zero address is invalid."); require(_amount > 0, "Amount must be greater than zero."); require(_amount <= IERC20(_token).balanceOf(address(this)), "Not enough tokens!"); bool success = IERC20(_token).transfer(msg.sender, _amount); require(success, "Transfer failed!"); } // Calculate the adjusted token supply without decimals function calculateAdjustedTokenSupply() public view returns (uint256 adjustedSupplyWithNoDecimals) { adjustedSupplyWithNoDecimals = IERC20(token).totalSupply(); // Subtract the token balance of each ineligible holder from the total supply for (uint256 i = 0; i < ineligibleHolders.length; i++) { uint256 removeFromSupply = IERC20(token).balanceOf(ineligibleHolders[i]); adjustedSupplyWithNoDecimals -= removeFromSupply; } // Adjust for decimals adjustedSupplyWithNoDecimals = adjustedSupplyWithNoDecimals / (10**IERC20(token).decimals()); return adjustedSupplyWithNoDecimals; } // Calculate the price of 1 token in terms of WETH (output in Wei) function calculateTokenPriceInWETH() public view returns (uint256 tokenPriceInWei) { address[] memory path = new address[](2); path[0] = token; path[1] = router.WETH(); // Get the amounts out for 1 unit of the token in terms of WETH uint256[] memory amountsOut = router.getAmountsOut(1e9, path); // Ensure that the token is the output token in the path require(amountsOut.length > 0 && amountsOut[amountsOut.length - 1] > 0, "Invalid output token"); tokenPriceInWei = amountsOut[amountsOut.length - 1]; return (tokenPriceInWei); } // Calculate the reward of 1 token (without decimals) in terms of WETH (output in Wei) function calculateRewardPerTokenInWETH() public view returns (uint256 rewardPerTokenInWei) { uint256 adjustedSupply = calculateAdjustedTokenSupply(); // Get reward of 1 token rewardPerTokenInWei = totalEthForRewards / totalRounds / adjustedSupply; return (rewardPerTokenInWei); } // Calculate the rewards in terms of WETH // How much ETH will I receive if I hold `tokenAmount` number of tokens? function calculateRewardsInWETH(uint256 tokenAmount) public view returns (uint256 rewardsInWei) { uint256 rewardPerTokenInWETH = calculateRewardPerTokenInWETH(); // Calculate the rewards in WETH (output in Wei) rewardsInWei = rewardPerTokenInWETH * tokenAmount; // tokenAmount with no decimals } // Calculate the holder rewards in terms of WETH function calculateHolderRewardsInWETH(address holderAddress) public view returns (uint256 holderRewardsInWei) { uint256 rewardPerTokenInWETH = calculateRewardPerTokenInWETH(); // Calculate holder rewards in WETH (output in Wei) holderRewardsInWei = rewardPerTokenInWETH * IERC20(token).balanceOf(holderAddress) / (10**IERC20(token).decimals()); // tokenAmount with no decimals } // Calculate APR and APY /* Formula: uint256 rewardPerTokenInWETH = calculateRewardPerTokenInWETH(); uint256 tokenPriceInWETH = calculateTokenPriceInWETH(); uint256 r = rewardPerTokenInWETH / tokenPriceInWETH; uint256 n = year / rewardReplenishFrequency; // Calculate APR APR = r * n; // Calculate APY APY = ((1 + (r / n))**n) - 1; */ function calculateRAndN() public view returns (uint256 r, uint256 n) { uint256 rewardPerTokenInWETH = calculateRewardPerTokenInWETH(); uint256 tokenPriceInWETH = calculateTokenPriceInWETH(); r = (rewardPerTokenInWETH * PRECISION) / tokenPriceInWETH; n = year / rewardReplenishFrequency; return (r, n); } function calculateAPYAndAPR() public view returns (uint256 APR, uint256 APY) { uint256 r; uint256 n; (r, n) = calculateRAndN(); // Calculate APR (precision in Wei, i.e., 18 decimals) APR = r * n; // Calculate APY iteratively (precision in Wei, i.e., 18 decimals) uint256 tempAPY = PRECISION; for (uint256 i = 0; i < n; i++) { tempAPY = (tempAPY * (r + PRECISION)) / PRECISION; } APY = tempAPY - PRECISION; } // Calculate custom volume // How much ETH will I receive if I hold `tokenAmount` number of tokens // if `ethReplenishedForRewardsInWei` amount of ETH is added // every `ethReplenishedFrequencyInDays` and what's the APY and APR? function calculateCustomVolume( uint256 tokenAmount, uint256 ethReplenishedForRewardsInWei, uint256 ethReplenishedFrequencyInDays ) public view returns ( uint256 yourEthRewardsInWei, uint256 r, uint256 n, uint256 APR, uint256 APY ) { uint256 adjustedSupply = calculateAdjustedTokenSupply(); uint256 tokenPriceInWETH = calculateTokenPriceInWETH(); uint256 rewardPerTokenInWETH = ethReplenishedForRewardsInWei / adjustedSupply; r = (rewardPerTokenInWETH * PRECISION) / tokenPriceInWETH; n = year / ethReplenishedFrequencyInDays; // Calculate the rewards in terms of WETH (output in Wei) yourEthRewardsInWei = rewardPerTokenInWETH * tokenAmount; // tokenAmount with no decimals // Calculate APR (precision in Wei, i.e., 18 decimals) APR = r * n; // Calculate APY iteratively (precision in Wei, i.e., 18 decimals) uint256 tempAPY = PRECISION; for (uint256 i = 0; i < n; i++) { tempAPY = (tempAPY * (r + PRECISION)) / PRECISION; } APY = tempAPY - PRECISION; } function updateRewardReplenishFrequency(uint256 _rewardReplenishFrequency) public onlyOwner { rewardReplenishFrequency = _rewardReplenishFrequency; } function updateTotalRounds(uint256 _totalRounds) public onlyOwner { totalRounds = _totalRounds; } function updateTotalEthForRewards(uint256 _totalEthForRewards) public onlyOwner { totalEthForRewards = _totalEthForRewards; } function updateToken(address _token) public onlyOwner { token = _token; } function updateRouter(address _router) public onlyOwner { router = IUniswapV2Router02(_router); } function addIneligibleHolder(address user) public onlyOwner { ineligibleHolders.push(user); } function removeIneligibleHolder(address user) public onlyOwner { uint256 len = ineligibleHolders.length; for(uint i; i < len; i++) { if(ineligibleHolders[i] == user) { ineligibleHolders[i] = ineligibleHolders[len - 1]; ineligibleHolders.pop(); break; } } } // Function to check if an address is an ineligible holder function isIneligibleHolder(address user) public view returns (bool) { for (uint256 i = 0; i < ineligibleHolders.length; i++) { if (ineligibleHolders[i] == user) { return true; } } return false; } // Function to allow setting the claimed amount for addresses function setAmountClaimed(address _address, uint256 _amount) public onlyOwner { require(!isIneligibleHolder(_address), "Address is ineligible"); amountClaimed[_address] = _amount; } function setAmountClaimedBatch(address[] calldata addresses, uint256[] calldata amounts) public onlyOwner { require(addresses.length == amounts.length, "Arrays must have the same length"); for (uint256 i = 0; i < addresses.length; i++) { address _address = addresses[i]; uint256 _amount = amounts[i]; require(!isIneligibleHolder(_address), "Address is ineligible"); amountClaimed[_address] = _amount; } } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ClaimingDisabled","type":"error"},{"inputs":[],"name":"ExceedsClaim","type":"error"},{"inputs":[],"name":"NotInMerkle","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amountClaimed","type":"uint256"}],"name":"Claim","type":"event"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"addIneligibleHolder","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"amountClaimed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"calculateAPYAndAPR","outputs":[{"internalType":"uint256","name":"APR","type":"uint256"},{"internalType":"uint256","name":"APY","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"calculateAdjustedTokenSupply","outputs":[{"internalType":"uint256","name":"adjustedSupplyWithNoDecimals","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenAmount","type":"uint256"},{"internalType":"uint256","name":"ethReplenishedForRewardsInWei","type":"uint256"},{"internalType":"uint256","name":"ethReplenishedFrequencyInDays","type":"uint256"}],"name":"calculateCustomVolume","outputs":[{"internalType":"uint256","name":"yourEthRewardsInWei","type":"uint256"},{"internalType":"uint256","name":"r","type":"uint256"},{"internalType":"uint256","name":"n","type":"uint256"},{"internalType":"uint256","name":"APR","type":"uint256"},{"internalType":"uint256","name":"APY","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"holderAddress","type":"address"}],"name":"calculateHolderRewardsInWETH","outputs":[{"internalType":"uint256","name":"holderRewardsInWei","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"calculateRAndN","outputs":[{"internalType":"uint256","name":"r","type":"uint256"},{"internalType":"uint256","name":"n","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"calculateRewardPerTokenInWETH","outputs":[{"internalType":"uint256","name":"rewardPerTokenInWei","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenAmount","type":"uint256"}],"name":"calculateRewardsInWETH","outputs":[{"internalType":"uint256","name":"rewardsInWei","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"calculateTokenPriceInWETH","outputs":[{"internalType":"uint256","name":"tokenPriceInWei","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"},{"internalType":"uint256","name":"claimAmount","type":"uint256"}],"name":"claimEth","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"},{"internalType":"uint256","name":"claimAmount","type":"uint256"},{"internalType":"uint256","name":"minAmount","type":"uint256"}],"name":"claimTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"claimingEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"ethIn","type":"uint256"}],"name":"getAmountOut","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"isIneligibleHolder","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastEthForRewards","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastRewardTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"merkleRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"root","type":"bytes32"}],"name":"newRoot","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"removeIneligibleHolder","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"rewardReplenishFrequency","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"router","outputs":[{"internalType":"contract IUniswapV2Router02","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"setAmountClaimed","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"addresses","type":"address[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"setAmountClaimedBatch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"toggleClaiming","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"token","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalClaimedEth","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalEthForRewards","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalRounds","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_rewardReplenishFrequency","type":"uint256"}],"name":"updateRewardReplenishFrequency","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_router","type":"address"}],"name":"updateRouter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"}],"name":"updateToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_totalEthForRewards","type":"uint256"}],"name":"updateTotalEthForRewards","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_totalRounds","type":"uint256"}],"name":"updateTotalRounds","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"address payable","name":"_to","type":"address"}],"name":"withdrawETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"address","name":"_token","type":"address"}],"name":"withdrawToken","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
608060405261016d600a556007600b553480156200001c57600080fd5b50737a250d5630b4cf539739df2c5dacb4c659f2488d6000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550735a3e6a77ba2f983ec0d371ea3b475f8bc0811ad5600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555033600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506200011a61dead620001d960201b60201c565b6200013f739ec9367b8c4dd45ec8e7b800b1f719251053ad60620001d960201b60201c565b62000164735a3e6a77ba2f983ec0d371ea3b475f8bc0811ad5620001d960201b60201c565b62000189730e7619cccfa3e181898e3b885a2527968953cf4b620001d960201b60201c565b620001ae73120051a72966950b8ce12eb5496b5d1eeec1541b620001d960201b60201c565b620001d3735bdf85216ec1e38d6458c870992a69e38e03f7ef620001d960201b60201c565b62000355565b3373ffffffffffffffffffffffffffffffffffffffff16600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146200026c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620002639062000333565b60405180910390fd5b600c819080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600082825260208201905092915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006200031b602083620002d2565b91506200032882620002e3565b602082019050919050565b600060208201905081810360008301526200034e816200030c565b9050919050565b61450e80620003656000396000f3fe6080604052600436106102255760003560e01c80638a56829911610123578063c864096a116100ab578063ddc2d56d1161006f578063ddc2d56d146107ea578063f2fde38b1461082b578063f887ea4014610854578063f8c794d21461087f578063fc0c546a146108a857610225565b8063c864096a146106f3578063c9466aee1461071c578063d134a3ec14610759578063d7e1ea1714610782578063dd6bff1a146107bf57610225565b8063b37b547c116100f2578063b37b547c1461060d578063b5d0097314610639578063ba0271be14610662578063c3f0a61a1461069f578063c851cc32146106ca57610225565b80638a5682991461054f5780638da5cb5b1461057a5780639231cf74146105a55780639ee47dbe146105d057610225565b806336118b52116101b1578063591141881161017557806359114188146104805780635c195217146104a95780637391a85f146104e65780637ad3def21461050f5780638010fc451461053857610225565b806336118b52146103aa57806344fb3ceb146103d35780634e237c0714610410578063537800cc1461043b57806353e8320f1461045757610225565b806324f73a15116101f857806324f73a15146102d4578063258898b3146102ff57806327fe69a9146103285780632cf1bfae146103545780632eb4a7ab1461037f57610225565b8063063cf93c1461022a5780630e141a9b14610255578063171d0183146102805780632452dede146102a9575b600080fd5b34801561023657600080fd5b5061023f6108d3565b60405161024c9190612f34565b60405180910390f35b34801561026157600080fd5b5061026a610901565b6040516102779190612f6a565b60405180910390f35b34801561028c57600080fd5b506102a760048036038101906102a29190612ff7565b610914565b005b3480156102b557600080fd5b506102be610b36565b6040516102cb9190612f34565b60405180910390f35b3480156102e057600080fd5b506102e9610b3c565b6040516102f69190612f34565b60405180910390f35b34801561030b57600080fd5b5061032660048036038101906103219190613050565b610dbc565b005b34801561033457600080fd5b5061033d6110a1565b60405161034b9291906130a3565b60405180910390f35b34801561036057600080fd5b506103696110f5565b6040516103769190612f34565b60405180910390f35b34801561038b57600080fd5b506103946110fb565b6040516103a191906130e5565b60405180910390f35b3480156103b657600080fd5b506103d160048036038101906103cc919061313e565b611101565b005b3480156103df57600080fd5b506103fa60048036038101906103f5919061317e565b611338565b6040516104079190612f34565b60405180910390f35b34801561041c57600080fd5b50610425611359565b6040516104329190612f34565b60405180910390f35b610455600480360381019061045091906131d7565b611664565b005b34801561046357600080fd5b5061047e60048036038101906104799190613204565b6117b6565b005b34801561048c57600080fd5b506104a760048036038101906104a29190612ff7565b6118d7565b005b3480156104b557600080fd5b506104d060048036038101906104cb919061317e565b6119cd565b6040516104dd9190612f34565b60405180910390f35b3480156104f257600080fd5b5061050d6004803603810190610508919061317e565b611d12565b005b34801561051b57600080fd5b5061053660048036038101906105319190612ff7565b611dac565b005b34801561054457600080fd5b5061054d611e80565b005b34801561055b57600080fd5b50610564611f3c565b6040516105719190612f34565b60405180910390f35b34801561058657600080fd5b5061058f611f42565b60405161059c9190613253565b60405180910390f35b3480156105b157600080fd5b506105ba611f68565b6040516105c79190612f34565b60405180910390f35b3480156105dc57600080fd5b506105f760048036038101906105f291906132d3565b611f6e565b6040516106049190612f6a565b60405180910390f35b34801561061957600080fd5b5061062261208f565b6040516106309291906130a3565b60405180910390f35b34801561064557600080fd5b50610660600480360381019061065b919061317e565b612128565b005b34801561066e57600080fd5b5061068960048036038101906106849190612ff7565b6121c2565b6040516106969190612f34565b60405180910390f35b3480156106ab57600080fd5b506106b4612343565b6040516106c19190612f34565b60405180910390f35b3480156106d657600080fd5b506106f160048036038101906106ec9190612ff7565b612349565b005b3480156106ff57600080fd5b5061071a60048036038101906107159190613347565b61241c565b005b34801561072857600080fd5b50610743600480360381019061073e9190612ff7565b6124da565b6040516107509190612f6a565b60405180910390f35b34801561076557600080fd5b50610780600480360381019061077b919061317e565b612589565b005b34801561078e57600080fd5b506107a960048036038101906107a49190612ff7565b612623565b6040516107b69190612f34565b60405180910390f35b3480156107cb57600080fd5b506107d461263b565b6040516107e19190612f34565b60405180910390f35b3480156107f657600080fd5b50610811600480360381019061080c91906133cf565b612641565b604051610822959493929190613422565b60405180910390f35b34801561083757600080fd5b50610852600480360381019061084d9190612ff7565b61273a565b005b34801561086057600080fd5b5061086961280e565b60405161087691906134d4565b60405180910390f35b34801561088b57600080fd5b506108a660048036038101906108a1919061359b565b612832565b005b3480156108b457600080fd5b506108bd612a0b565b6040516108ca9190613253565b60405180910390f35b6000806108de610b3c565b9050806008546005546108f1919061367a565b6108fb919061367a565b91505090565b600260149054906101000a900460ff1681565b3373ffffffffffffffffffffffffffffffffffffffff16600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146109a4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161099b90613708565b60405180910390fd5b6000600c80549050905060005b81811015610b31578273ffffffffffffffffffffffffffffffffffffffff16600c82815481106109e4576109e3613728565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415610b1e57600c600183610a3a9190613757565b81548110610a4b57610a4a613728565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600c8281548110610a8a57610a89613728565b5b9060005260206000200160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600c805480610ae457610ae361378b565b5b6001900381819060005260206000200160006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690559055610b31565b8080610b29906137ba565b9150506109b1565b505050565b60055481565b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b158015610ba657600080fd5b505afa158015610bba573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bde9190613818565b905060005b600c80549050811015610cff576000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231600c8481548110610c4457610c43613728565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518263ffffffff1660e01b8152600401610c8b9190613253565b60206040518083038186803b158015610ca357600080fd5b505afa158015610cb7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cdb9190613818565b90508083610ce99190613757565b9250508080610cf7906137ba565b915050610be3565b50600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b158015610d6857600080fd5b505afa158015610d7c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610da09190613818565b600a610dac9190613978565b81610db7919061367a565b905090565b3373ffffffffffffffffffffffffffffffffffffffff16600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610e4c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e4390613708565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610ebc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eb390613a0f565b60405180910390fd5b60008311610eff576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ef690613aa1565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401610f389190613253565b60206040518083038186803b158015610f5057600080fd5b505afa158015610f64573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f889190613818565b831115610fca576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fc190613b0d565b60405180910390fd5b60008173ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33866040518363ffffffff1660e01b8152600401611007929190613b2d565b602060405180830381600087803b15801561102157600080fd5b505af1158015611035573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110599190613b82565b90508061109b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161109290613bfb565b60405180910390fd5b50505050565b60008060006110ae6108d3565b905060006110ba611359565b905080670de0b6b3a7640000836110d19190613c1b565b6110db919061367a565b9350600b54600a546110ed919061367a565b925050509091565b60065481565b60035481565b3373ffffffffffffffffffffffffffffffffffffffff16600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611191576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161118890613708565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611201576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111f890613a0f565b60405180910390fd5b60008211611244576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161123b90613aa1565b60405180910390fd5b81471015611287576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161127e90613cc1565b60405180910390fd5b60008173ffffffffffffffffffffffffffffffffffffffff16836040516112ad90613d12565b60006040518083038185875af1925050503d80600081146112ea576040519150601f19603f3d011682016040523d82523d6000602084013e6112ef565b606091505b5050905080611333576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161132a90613bfb565b60405180910390fd5b505050565b6000806113436108d3565b905082816113519190613c1b565b915050919050565b600080600267ffffffffffffffff81111561137757611376613d27565b5b6040519080825280602002602001820160405280156113a55781602001602082028036833780820191505090505b509050600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16816000815181106113df576113de613728565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505060008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b15801561147f57600080fd5b505afa158015611493573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114b79190613d6b565b816001815181106114cb576114ca613728565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505060008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663d06ca61f633b9aca00846040518363ffffffff1660e01b8152600401611567929190613e91565b60006040518083038186803b15801561157f57600080fd5b505afa158015611593573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906115bc9190613fe1565b9050600081511180156115f65750600081600183516115db9190613757565b815181106115ec576115eb613728565b5b6020026020010151115b611635576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161162c90614076565b60405180910390fd5b80600182516116449190613757565b8151811061165557611654613728565b5b60200260200101519250505090565b3373ffffffffffffffffffffffffffffffffffffffff16600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146116f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116eb90613708565b60405180910390fd5b60003411611737576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161172e90614108565b60405180910390fd5b34600560008282546117499190614128565b925050819055503460068190555062015180600954426117699190613757565b611773919061367a565b600b819055506000600b54141561178d576001600b819055505b8060038190555042600981905550600860008154809291906117ae906137ba565b919050555050565b3373ffffffffffffffffffffffffffffffffffffffff16600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611846576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161183d90613708565b60405180910390fd5b61184f826124da565b1561188f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611886906141ca565b60405180910390fd5b80600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505050565b3373ffffffffffffffffffffffffffffffffffffffff16600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611967576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161195e90613708565b60405180910390fd5b600c819080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60008060008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c45a01556040518163ffffffff1660e01b815260040160206040518083038186803b158015611a3957600080fd5b505afa158015611a4d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a719190613d6b565b73ffffffffffffffffffffffffffffffffffffffff1663e6a43905600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b158015611b1557600080fd5b505afa158015611b29573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b4d9190613d6b565b6040518363ffffffff1660e01b8152600401611b6a9291906141ea565b60206040518083038186803b158015611b8257600080fd5b505afa158015611b96573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bba9190613d6b565b73ffffffffffffffffffffffffffffffffffffffff16630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b158015611bff57600080fd5b505afa158015611c13573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c379190614295565b506dffffffffffffffffffffffffffff1691506dffffffffffffffffffffffffffff16915060008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663054d50d48583856040518463ffffffff1660e01b8152600401611cb9939291906142e8565b60206040518083038186803b158015611cd157600080fd5b505afa158015611ce5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d099190613818565b92505050919050565b3373ffffffffffffffffffffffffffffffffffffffff16600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611da2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d9990613708565b60405180910390fd5b80600b8190555050565b3373ffffffffffffffffffffffffffffffffffffffff16600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611e3c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e3390613708565b60405180910390fd5b80600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b3373ffffffffffffffffffffffffffffffffffffffff16600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611f10576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f0790613708565b60405180910390fd5b600260149054906101000a900460ff1615600260146101000a81548160ff021916908315150217905550565b60085481565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60095481565b600080339050611f7d816124da565b15611fbd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fb49061436b565b60405180910390fd5b611fca8187878787612a31565b8073ffffffffffffffffffffffffffffffffffffffff1683604051611fee90613d12565b60006040518083038185875af1925050503d806000811461202b576040519150601f19603f3d011682016040523d82523d6000602084013e612030565b606091505b5050809250508073ffffffffffffffffffffffffffffffffffffffff167f34fcbac0073d7c3d388e51312faf357774904998eeb8fca628b9e6f65ee1cbf7878560405161207e9291906130a3565b60405180910390a250949350505050565b60008060008061209d6110a1565b809250819350505080826120b19190613c1b565b93506000670de0b6b3a7640000905060005b8281101561210a57670de0b6b3a764000080856120e09190614128565b836120eb9190613c1b565b6120f5919061367a565b91508080612102906137ba565b9150506120c3565b50670de0b6b3a76400008161211f9190613757565b93505050509091565b3373ffffffffffffffffffffffffffffffffffffffff16600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146121b8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121af90613708565b60405180910390fd5b8060088190555050565b6000806121cd6108d3565b9050600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b15801561223757600080fd5b505afa15801561224b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061226f9190613818565b600a61227b9190613978565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231856040518263ffffffff1660e01b81526004016122d69190613253565b60206040518083038186803b1580156122ee57600080fd5b505afa158015612302573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123269190613818565b826123319190613c1b565b61233b919061367a565b915050919050565b600b5481565b3373ffffffffffffffffffffffffffffffffffffffff16600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146123d9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123d090613708565b60405180910390fd5b806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600033905061242a816124da565b1561246a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124619061436b565b60405180910390fd5b6124778187878787612a31565b612482838284612c29565b8073ffffffffffffffffffffffffffffffffffffffff167f34fcbac0073d7c3d388e51312faf357774904998eeb8fca628b9e6f65ee1cbf787856040516124ca9291906130a3565b60405180910390a2505050505050565b600080600090505b600c8054905081101561257e578273ffffffffffffffffffffffffffffffffffffffff16600c828154811061251a57612519613728565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141561256b576001915050612584565b8080612576906137ba565b9150506124e2565b50600090505b919050565b3373ffffffffffffffffffffffffffffffffffffffff16600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612619576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161261090613708565b60405180910390fd5b8060058190555050565b60046020528060005260406000206000915090505481565b60075481565b600080600080600080612652610b3c565b9050600061265e611359565b90506000828a61266e919061367a565b905081670de0b6b3a7640000826126859190613c1b565b61268f919061367a565b965088600a5461269f919061367a565b95508a816126ad9190613c1b565b975085876126bb9190613c1b565b94506000670de0b6b3a7640000905060005b8781101561271457670de0b6b3a7640000808a6126ea9190614128565b836126f59190613c1b565b6126ff919061367a565b9150808061270c906137ba565b9150506126cd565b50670de0b6b3a7640000816127299190613757565b945050505050939792965093509350565b3373ffffffffffffffffffffffffffffffffffffffff16600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146127ca576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127c190613708565b60405180910390fd5b80600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b3373ffffffffffffffffffffffffffffffffffffffff16600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146128c2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128b990613708565b60405180910390fd5b81819050848490501461290a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612901906143d7565b60405180910390fd5b60005b84849050811015612a0457600085858381811061292d5761292c613728565b5b90506020020160208101906129429190612ff7565b9050600084848481811061295957612958613728565b5b90506020020135905061296b826124da565b156129ab576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129a2906141ca565b60405180910390fd5b80600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550505080806129fc906137ba565b91505061290d565b5050505050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b8381600460008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612a7d9190614128565b1115612ab5576040517fb7042d5c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600260149054906101000a900460ff16612afb576040517f3056283500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008585604051602001612b10929190614460565b6040516020818303038152906040528051906020012090506000612b78858580806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f8201169050808301925050505050505060035484612e6c565b905080612bb1576040517f8a585be200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b82600460008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612c009190614128565b925050819055508260076000828254612c199190614128565b9250508190555050505050505050565b6000600267ffffffffffffffff811115612c4657612c45613d27565b5b604051908082528060200260200182016040528015612c745781602001602082028036833780820191505090505b50905060008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b158015612cdd57600080fd5b505afa158015612cf1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d159190613d6b565b81600081518110612d2957612d28613728565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681600181518110612d9a57612d99613728565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505060008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663b6f9de9585848487426040518663ffffffff1660e01b8152600401612e34949392919061448c565b6000604051808303818588803b158015612e4d57600080fd5b505af1158015612e61573d6000803e3d6000fd5b505050505050505050565b600082612e798584612e83565b1490509392505050565b60008082905060005b8451811015612ece57612eb982868381518110612eac57612eab613728565b5b6020026020010151612ed9565b91508080612ec6906137ba565b915050612e8c565b508091505092915050565b6000818310612ef157612eec8284612f04565b612efc565b612efb8383612f04565b5b905092915050565b600082600052816020526040600020905092915050565b6000819050919050565b612f2e81612f1b565b82525050565b6000602082019050612f496000830184612f25565b92915050565b60008115159050919050565b612f6481612f4f565b82525050565b6000602082019050612f7f6000830184612f5b565b92915050565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612fc482612f99565b9050919050565b612fd481612fb9565b8114612fdf57600080fd5b50565b600081359050612ff181612fcb565b92915050565b60006020828403121561300d5761300c612f8f565b5b600061301b84828501612fe2565b91505092915050565b61302d81612f1b565b811461303857600080fd5b50565b60008135905061304a81613024565b92915050565b60008060006060848603121561306957613068612f8f565b5b60006130778682870161303b565b935050602061308886828701612fe2565b925050604061309986828701612fe2565b9150509250925092565b60006040820190506130b86000830185612f25565b6130c56020830184612f25565b9392505050565b6000819050919050565b6130df816130cc565b82525050565b60006020820190506130fa60008301846130d6565b92915050565b600061310b82612f99565b9050919050565b61311b81613100565b811461312657600080fd5b50565b60008135905061313881613112565b92915050565b6000806040838503121561315557613154612f8f565b5b60006131638582860161303b565b925050602061317485828601613129565b9150509250929050565b60006020828403121561319457613193612f8f565b5b60006131a28482850161303b565b91505092915050565b6131b4816130cc565b81146131bf57600080fd5b50565b6000813590506131d1816131ab565b92915050565b6000602082840312156131ed576131ec612f8f565b5b60006131fb848285016131c2565b91505092915050565b6000806040838503121561321b5761321a612f8f565b5b600061322985828601612fe2565b925050602061323a8582860161303b565b9150509250929050565b61324d81612fb9565b82525050565b60006020820190506132686000830184613244565b92915050565b600080fd5b600080fd5b600080fd5b60008083601f8401126132935761329261326e565b5b8235905067ffffffffffffffff8111156132b0576132af613273565b5b6020830191508360208202830111156132cc576132cb613278565b5b9250929050565b600080600080606085870312156132ed576132ec612f8f565b5b60006132fb8782880161303b565b945050602085013567ffffffffffffffff81111561331c5761331b612f94565b5b6133288782880161327d565b9350935050604061333b8782880161303b565b91505092959194509250565b60008060008060006080868803121561336357613362612f8f565b5b60006133718882890161303b565b955050602086013567ffffffffffffffff81111561339257613391612f94565b5b61339e8882890161327d565b945094505060406133b18882890161303b565b92505060606133c28882890161303b565b9150509295509295909350565b6000806000606084860312156133e8576133e7612f8f565b5b60006133f68682870161303b565b93505060206134078682870161303b565b92505060406134188682870161303b565b9150509250925092565b600060a0820190506134376000830188612f25565b6134446020830187612f25565b6134516040830186612f25565b61345e6060830185612f25565b61346b6080830184612f25565b9695505050505050565b6000819050919050565b600061349a61349561349084612f99565b613475565b612f99565b9050919050565b60006134ac8261347f565b9050919050565b60006134be826134a1565b9050919050565b6134ce816134b3565b82525050565b60006020820190506134e960008301846134c5565b92915050565b60008083601f8401126135055761350461326e565b5b8235905067ffffffffffffffff81111561352257613521613273565b5b60208301915083602082028301111561353e5761353d613278565b5b9250929050565b60008083601f84011261355b5761355a61326e565b5b8235905067ffffffffffffffff81111561357857613577613273565b5b60208301915083602082028301111561359457613593613278565b5b9250929050565b600080600080604085870312156135b5576135b4612f8f565b5b600085013567ffffffffffffffff8111156135d3576135d2612f94565b5b6135df878288016134ef565b9450945050602085013567ffffffffffffffff81111561360257613601612f94565b5b61360e87828801613545565b925092505092959194509250565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061368582612f1b565b915061369083612f1b565b9250826136a05761369f61361c565b5b828204905092915050565b600082825260208201905092915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006136f26020836136ab565b91506136fd826136bc565b602082019050919050565b60006020820190508181036000830152613721816136e5565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600061376282612f1b565b915061376d83612f1b565b9250828210156137805761377f61364b565b5b828203905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b60006137c582612f1b565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156137f8576137f761364b565b5b600182019050919050565b60008151905061381281613024565b92915050565b60006020828403121561382e5761382d612f8f565b5b600061383c84828501613803565b91505092915050565b60008160011c9050919050565b6000808291508390505b600185111561389c578086048111156138785761387761364b565b5b60018516156138875780820291505b808102905061389585613845565b945061385c565b94509492505050565b6000826138b55760019050613971565b816138c35760009050613971565b81600181146138d957600281146138e357613912565b6001915050613971565b60ff8411156138f5576138f461364b565b5b8360020a91508482111561390c5761390b61364b565b5b50613971565b5060208310610133831016604e8410600b84101617156139475782820a9050838111156139425761394161364b565b5b613971565b6139548484846001613852565b9250905081840481111561396b5761396a61364b565b5b81810290505b9392505050565b600061398382612f1b565b915061398e83612f1b565b92506139bb7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff84846138a5565b905092915050565b7f5a65726f206164647265737320697320696e76616c69642e0000000000000000600082015250565b60006139f96018836136ab565b9150613a04826139c3565b602082019050919050565b60006020820190508181036000830152613a28816139ec565b9050919050565b7f416d6f756e74206d7573742062652067726561746572207468616e207a65726f60008201527f2e00000000000000000000000000000000000000000000000000000000000000602082015250565b6000613a8b6021836136ab565b9150613a9682613a2f565b604082019050919050565b60006020820190508181036000830152613aba81613a7e565b9050919050565b7f4e6f7420656e6f75676820746f6b656e73210000000000000000000000000000600082015250565b6000613af76012836136ab565b9150613b0282613ac1565b602082019050919050565b60006020820190508181036000830152613b2681613aea565b9050919050565b6000604082019050613b426000830185613244565b613b4f6020830184612f25565b9392505050565b613b5f81612f4f565b8114613b6a57600080fd5b50565b600081519050613b7c81613b56565b92915050565b600060208284031215613b9857613b97612f8f565b5b6000613ba684828501613b6d565b91505092915050565b7f5472616e73666572206661696c65642100000000000000000000000000000000600082015250565b6000613be56010836136ab565b9150613bf082613baf565b602082019050919050565b60006020820190508181036000830152613c1481613bd8565b9050919050565b6000613c2682612f1b565b9150613c3183612f1b565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613c6a57613c6961364b565b5b828202905092915050565b7f4e6f7420656e6f75676820455448210000000000000000000000000000000000600082015250565b6000613cab600f836136ab565b9150613cb682613c75565b602082019050919050565b60006020820190508181036000830152613cda81613c9e565b9050919050565b600081905092915050565b50565b6000613cfc600083613ce1565b9150613d0782613cec565b600082019050919050565b6000613d1d82613cef565b9150819050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600081519050613d6581612fcb565b92915050565b600060208284031215613d8157613d80612f8f565b5b6000613d8f84828501613d56565b91505092915050565b6000819050919050565b6000613dbd613db8613db384613d98565b613475565b612f1b565b9050919050565b613dcd81613da2565b82525050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b613e0881612fb9565b82525050565b6000613e1a8383613dff565b60208301905092915050565b6000602082019050919050565b6000613e3e82613dd3565b613e488185613dde565b9350613e5383613def565b8060005b83811015613e84578151613e6b8882613e0e565b9750613e7683613e26565b925050600181019050613e57565b5085935050505092915050565b6000604082019050613ea66000830185613dc4565b8181036020830152613eb88184613e33565b90509392505050565b6000601f19601f8301169050919050565b613edb82613ec1565b810181811067ffffffffffffffff82111715613efa57613ef9613d27565b5b80604052505050565b6000613f0d612f85565b9050613f198282613ed2565b919050565b600067ffffffffffffffff821115613f3957613f38613d27565b5b602082029050602081019050919050565b6000613f5d613f5884613f1e565b613f03565b90508083825260208201905060208402830185811115613f8057613f7f613278565b5b835b81811015613fa95780613f958882613803565b845260208401935050602081019050613f82565b5050509392505050565b600082601f830112613fc857613fc761326e565b5b8151613fd8848260208601613f4a565b91505092915050565b600060208284031215613ff757613ff6612f8f565b5b600082015167ffffffffffffffff81111561401557614014612f94565b5b61402184828501613fb3565b91505092915050565b7f496e76616c6964206f757470757420746f6b656e000000000000000000000000600082015250565b60006140606014836136ab565b915061406b8261402a565b602082019050919050565b6000602082019050818103600083015261408f81614053565b9050919050565b7f4d7573742073656e6420736f6d6520455448207769746820746865206e65775260008201527f6f6f742066756e6374696f6e2e00000000000000000000000000000000000000602082015250565b60006140f2602d836136ab565b91506140fd82614096565b604082019050919050565b60006020820190508181036000830152614121816140e5565b9050919050565b600061413382612f1b565b915061413e83612f1b565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156141735761417261364b565b5b828201905092915050565b7f4164647265737320697320696e656c696769626c650000000000000000000000600082015250565b60006141b46015836136ab565b91506141bf8261417e565b602082019050919050565b600060208201905081810360008301526141e3816141a7565b9050919050565b60006040820190506141ff6000830185613244565b61420c6020830184613244565b9392505050565b60006dffffffffffffffffffffffffffff82169050919050565b61423681614213565b811461424157600080fd5b50565b6000815190506142538161422d565b92915050565b600063ffffffff82169050919050565b61427281614259565b811461427d57600080fd5b50565b60008151905061428f81614269565b92915050565b6000806000606084860312156142ae576142ad612f8f565b5b60006142bc86828701614244565b93505060206142cd86828701614244565b92505060406142de86828701614280565b9150509250925092565b60006060820190506142fd6000830186612f25565b61430a6020830185612f25565b6143176040830184612f25565b949350505050565b7f436c61696d657220697320696e656c696769626c652e00000000000000000000600082015250565b60006143556016836136ab565b91506143608261431f565b602082019050919050565b6000602082019050818103600083015261438481614348565b9050919050565b7f417272617973206d7573742068617665207468652073616d65206c656e677468600082015250565b60006143c16020836136ab565b91506143cc8261438b565b602082019050919050565b600060208201905081810360008301526143f0816143b4565b9050919050565b60008160601b9050919050565b600061440f826143f7565b9050919050565b600061442182614404565b9050919050565b61443961443482612fb9565b614416565b82525050565b6000819050919050565b61445a61445582612f1b565b61443f565b82525050565b600061446c8285614428565b60148201915061447c8284614449565b6020820191508190509392505050565b60006080820190506144a16000830187612f25565b81810360208301526144b38186613e33565b90506144c26040830185613244565b6144cf6060830184612f25565b9594505050505056fea26469706673582212207448c608feff648cec745cc43e83a314c13406fc0122ab63d414f3409e8ec56d64736f6c63430008090033Deployed Bytecode
0x6080604052600436106102255760003560e01c80638a56829911610123578063c864096a116100ab578063ddc2d56d1161006f578063ddc2d56d146107ea578063f2fde38b1461082b578063f887ea4014610854578063f8c794d21461087f578063fc0c546a146108a857610225565b8063c864096a146106f3578063c9466aee1461071c578063d134a3ec14610759578063d7e1ea1714610782578063dd6bff1a146107bf57610225565b8063b37b547c116100f2578063b37b547c1461060d578063b5d0097314610639578063ba0271be14610662578063c3f0a61a1461069f578063c851cc32146106ca57610225565b80638a5682991461054f5780638da5cb5b1461057a5780639231cf74146105a55780639ee47dbe146105d057610225565b806336118b52116101b1578063591141881161017557806359114188146104805780635c195217146104a95780637391a85f146104e65780637ad3def21461050f5780638010fc451461053857610225565b806336118b52146103aa57806344fb3ceb146103d35780634e237c0714610410578063537800cc1461043b57806353e8320f1461045757610225565b806324f73a15116101f857806324f73a15146102d4578063258898b3146102ff57806327fe69a9146103285780632cf1bfae146103545780632eb4a7ab1461037f57610225565b8063063cf93c1461022a5780630e141a9b14610255578063171d0183146102805780632452dede146102a9575b600080fd5b34801561023657600080fd5b5061023f6108d3565b60405161024c9190612f34565b60405180910390f35b34801561026157600080fd5b5061026a610901565b6040516102779190612f6a565b60405180910390f35b34801561028c57600080fd5b506102a760048036038101906102a29190612ff7565b610914565b005b3480156102b557600080fd5b506102be610b36565b6040516102cb9190612f34565b60405180910390f35b3480156102e057600080fd5b506102e9610b3c565b6040516102f69190612f34565b60405180910390f35b34801561030b57600080fd5b5061032660048036038101906103219190613050565b610dbc565b005b34801561033457600080fd5b5061033d6110a1565b60405161034b9291906130a3565b60405180910390f35b34801561036057600080fd5b506103696110f5565b6040516103769190612f34565b60405180910390f35b34801561038b57600080fd5b506103946110fb565b6040516103a191906130e5565b60405180910390f35b3480156103b657600080fd5b506103d160048036038101906103cc919061313e565b611101565b005b3480156103df57600080fd5b506103fa60048036038101906103f5919061317e565b611338565b6040516104079190612f34565b60405180910390f35b34801561041c57600080fd5b50610425611359565b6040516104329190612f34565b60405180910390f35b610455600480360381019061045091906131d7565b611664565b005b34801561046357600080fd5b5061047e60048036038101906104799190613204565b6117b6565b005b34801561048c57600080fd5b506104a760048036038101906104a29190612ff7565b6118d7565b005b3480156104b557600080fd5b506104d060048036038101906104cb919061317e565b6119cd565b6040516104dd9190612f34565b60405180910390f35b3480156104f257600080fd5b5061050d6004803603810190610508919061317e565b611d12565b005b34801561051b57600080fd5b5061053660048036038101906105319190612ff7565b611dac565b005b34801561054457600080fd5b5061054d611e80565b005b34801561055b57600080fd5b50610564611f3c565b6040516105719190612f34565b60405180910390f35b34801561058657600080fd5b5061058f611f42565b60405161059c9190613253565b60405180910390f35b3480156105b157600080fd5b506105ba611f68565b6040516105c79190612f34565b60405180910390f35b3480156105dc57600080fd5b506105f760048036038101906105f291906132d3565b611f6e565b6040516106049190612f6a565b60405180910390f35b34801561061957600080fd5b5061062261208f565b6040516106309291906130a3565b60405180910390f35b34801561064557600080fd5b50610660600480360381019061065b919061317e565b612128565b005b34801561066e57600080fd5b5061068960048036038101906106849190612ff7565b6121c2565b6040516106969190612f34565b60405180910390f35b3480156106ab57600080fd5b506106b4612343565b6040516106c19190612f34565b60405180910390f35b3480156106d657600080fd5b506106f160048036038101906106ec9190612ff7565b612349565b005b3480156106ff57600080fd5b5061071a60048036038101906107159190613347565b61241c565b005b34801561072857600080fd5b50610743600480360381019061073e9190612ff7565b6124da565b6040516107509190612f6a565b60405180910390f35b34801561076557600080fd5b50610780600480360381019061077b919061317e565b612589565b005b34801561078e57600080fd5b506107a960048036038101906107a49190612ff7565b612623565b6040516107b69190612f34565b60405180910390f35b3480156107cb57600080fd5b506107d461263b565b6040516107e19190612f34565b60405180910390f35b3480156107f657600080fd5b50610811600480360381019061080c91906133cf565b612641565b604051610822959493929190613422565b60405180910390f35b34801561083757600080fd5b50610852600480360381019061084d9190612ff7565b61273a565b005b34801561086057600080fd5b5061086961280e565b60405161087691906134d4565b60405180910390f35b34801561088b57600080fd5b506108a660048036038101906108a1919061359b565b612832565b005b3480156108b457600080fd5b506108bd612a0b565b6040516108ca9190613253565b60405180910390f35b6000806108de610b3c565b9050806008546005546108f1919061367a565b6108fb919061367a565b91505090565b600260149054906101000a900460ff1681565b3373ffffffffffffffffffffffffffffffffffffffff16600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146109a4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161099b90613708565b60405180910390fd5b6000600c80549050905060005b81811015610b31578273ffffffffffffffffffffffffffffffffffffffff16600c82815481106109e4576109e3613728565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415610b1e57600c600183610a3a9190613757565b81548110610a4b57610a4a613728565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600c8281548110610a8a57610a89613728565b5b9060005260206000200160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600c805480610ae457610ae361378b565b5b6001900381819060005260206000200160006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690559055610b31565b8080610b29906137ba565b9150506109b1565b505050565b60055481565b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b158015610ba657600080fd5b505afa158015610bba573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bde9190613818565b905060005b600c80549050811015610cff576000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231600c8481548110610c4457610c43613728565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518263ffffffff1660e01b8152600401610c8b9190613253565b60206040518083038186803b158015610ca357600080fd5b505afa158015610cb7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cdb9190613818565b90508083610ce99190613757565b9250508080610cf7906137ba565b915050610be3565b50600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b158015610d6857600080fd5b505afa158015610d7c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610da09190613818565b600a610dac9190613978565b81610db7919061367a565b905090565b3373ffffffffffffffffffffffffffffffffffffffff16600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610e4c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e4390613708565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610ebc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eb390613a0f565b60405180910390fd5b60008311610eff576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ef690613aa1565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401610f389190613253565b60206040518083038186803b158015610f5057600080fd5b505afa158015610f64573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f889190613818565b831115610fca576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fc190613b0d565b60405180910390fd5b60008173ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33866040518363ffffffff1660e01b8152600401611007929190613b2d565b602060405180830381600087803b15801561102157600080fd5b505af1158015611035573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110599190613b82565b90508061109b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161109290613bfb565b60405180910390fd5b50505050565b60008060006110ae6108d3565b905060006110ba611359565b905080670de0b6b3a7640000836110d19190613c1b565b6110db919061367a565b9350600b54600a546110ed919061367a565b925050509091565b60065481565b60035481565b3373ffffffffffffffffffffffffffffffffffffffff16600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611191576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161118890613708565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611201576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111f890613a0f565b60405180910390fd5b60008211611244576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161123b90613aa1565b60405180910390fd5b81471015611287576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161127e90613cc1565b60405180910390fd5b60008173ffffffffffffffffffffffffffffffffffffffff16836040516112ad90613d12565b60006040518083038185875af1925050503d80600081146112ea576040519150601f19603f3d011682016040523d82523d6000602084013e6112ef565b606091505b5050905080611333576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161132a90613bfb565b60405180910390fd5b505050565b6000806113436108d3565b905082816113519190613c1b565b915050919050565b600080600267ffffffffffffffff81111561137757611376613d27565b5b6040519080825280602002602001820160405280156113a55781602001602082028036833780820191505090505b509050600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16816000815181106113df576113de613728565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505060008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b15801561147f57600080fd5b505afa158015611493573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114b79190613d6b565b816001815181106114cb576114ca613728565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505060008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663d06ca61f633b9aca00846040518363ffffffff1660e01b8152600401611567929190613e91565b60006040518083038186803b15801561157f57600080fd5b505afa158015611593573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906115bc9190613fe1565b9050600081511180156115f65750600081600183516115db9190613757565b815181106115ec576115eb613728565b5b6020026020010151115b611635576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161162c90614076565b60405180910390fd5b80600182516116449190613757565b8151811061165557611654613728565b5b60200260200101519250505090565b3373ffffffffffffffffffffffffffffffffffffffff16600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146116f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116eb90613708565b60405180910390fd5b60003411611737576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161172e90614108565b60405180910390fd5b34600560008282546117499190614128565b925050819055503460068190555062015180600954426117699190613757565b611773919061367a565b600b819055506000600b54141561178d576001600b819055505b8060038190555042600981905550600860008154809291906117ae906137ba565b919050555050565b3373ffffffffffffffffffffffffffffffffffffffff16600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611846576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161183d90613708565b60405180910390fd5b61184f826124da565b1561188f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611886906141ca565b60405180910390fd5b80600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505050565b3373ffffffffffffffffffffffffffffffffffffffff16600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611967576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161195e90613708565b60405180910390fd5b600c819080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60008060008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c45a01556040518163ffffffff1660e01b815260040160206040518083038186803b158015611a3957600080fd5b505afa158015611a4d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a719190613d6b565b73ffffffffffffffffffffffffffffffffffffffff1663e6a43905600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b158015611b1557600080fd5b505afa158015611b29573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b4d9190613d6b565b6040518363ffffffff1660e01b8152600401611b6a9291906141ea565b60206040518083038186803b158015611b8257600080fd5b505afa158015611b96573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bba9190613d6b565b73ffffffffffffffffffffffffffffffffffffffff16630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b158015611bff57600080fd5b505afa158015611c13573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c379190614295565b506dffffffffffffffffffffffffffff1691506dffffffffffffffffffffffffffff16915060008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663054d50d48583856040518463ffffffff1660e01b8152600401611cb9939291906142e8565b60206040518083038186803b158015611cd157600080fd5b505afa158015611ce5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d099190613818565b92505050919050565b3373ffffffffffffffffffffffffffffffffffffffff16600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611da2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d9990613708565b60405180910390fd5b80600b8190555050565b3373ffffffffffffffffffffffffffffffffffffffff16600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611e3c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e3390613708565b60405180910390fd5b80600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b3373ffffffffffffffffffffffffffffffffffffffff16600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611f10576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f0790613708565b60405180910390fd5b600260149054906101000a900460ff1615600260146101000a81548160ff021916908315150217905550565b60085481565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60095481565b600080339050611f7d816124da565b15611fbd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fb49061436b565b60405180910390fd5b611fca8187878787612a31565b8073ffffffffffffffffffffffffffffffffffffffff1683604051611fee90613d12565b60006040518083038185875af1925050503d806000811461202b576040519150601f19603f3d011682016040523d82523d6000602084013e612030565b606091505b5050809250508073ffffffffffffffffffffffffffffffffffffffff167f34fcbac0073d7c3d388e51312faf357774904998eeb8fca628b9e6f65ee1cbf7878560405161207e9291906130a3565b60405180910390a250949350505050565b60008060008061209d6110a1565b809250819350505080826120b19190613c1b565b93506000670de0b6b3a7640000905060005b8281101561210a57670de0b6b3a764000080856120e09190614128565b836120eb9190613c1b565b6120f5919061367a565b91508080612102906137ba565b9150506120c3565b50670de0b6b3a76400008161211f9190613757565b93505050509091565b3373ffffffffffffffffffffffffffffffffffffffff16600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146121b8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121af90613708565b60405180910390fd5b8060088190555050565b6000806121cd6108d3565b9050600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b15801561223757600080fd5b505afa15801561224b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061226f9190613818565b600a61227b9190613978565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231856040518263ffffffff1660e01b81526004016122d69190613253565b60206040518083038186803b1580156122ee57600080fd5b505afa158015612302573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123269190613818565b826123319190613c1b565b61233b919061367a565b915050919050565b600b5481565b3373ffffffffffffffffffffffffffffffffffffffff16600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146123d9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123d090613708565b60405180910390fd5b806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600033905061242a816124da565b1561246a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124619061436b565b60405180910390fd5b6124778187878787612a31565b612482838284612c29565b8073ffffffffffffffffffffffffffffffffffffffff167f34fcbac0073d7c3d388e51312faf357774904998eeb8fca628b9e6f65ee1cbf787856040516124ca9291906130a3565b60405180910390a2505050505050565b600080600090505b600c8054905081101561257e578273ffffffffffffffffffffffffffffffffffffffff16600c828154811061251a57612519613728565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141561256b576001915050612584565b8080612576906137ba565b9150506124e2565b50600090505b919050565b3373ffffffffffffffffffffffffffffffffffffffff16600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612619576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161261090613708565b60405180910390fd5b8060058190555050565b60046020528060005260406000206000915090505481565b60075481565b600080600080600080612652610b3c565b9050600061265e611359565b90506000828a61266e919061367a565b905081670de0b6b3a7640000826126859190613c1b565b61268f919061367a565b965088600a5461269f919061367a565b95508a816126ad9190613c1b565b975085876126bb9190613c1b565b94506000670de0b6b3a7640000905060005b8781101561271457670de0b6b3a7640000808a6126ea9190614128565b836126f59190613c1b565b6126ff919061367a565b9150808061270c906137ba565b9150506126cd565b50670de0b6b3a7640000816127299190613757565b945050505050939792965093509350565b3373ffffffffffffffffffffffffffffffffffffffff16600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146127ca576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127c190613708565b60405180910390fd5b80600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b3373ffffffffffffffffffffffffffffffffffffffff16600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146128c2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128b990613708565b60405180910390fd5b81819050848490501461290a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612901906143d7565b60405180910390fd5b60005b84849050811015612a0457600085858381811061292d5761292c613728565b5b90506020020160208101906129429190612ff7565b9050600084848481811061295957612958613728565b5b90506020020135905061296b826124da565b156129ab576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129a2906141ca565b60405180910390fd5b80600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550505080806129fc906137ba565b91505061290d565b5050505050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b8381600460008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612a7d9190614128565b1115612ab5576040517fb7042d5c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600260149054906101000a900460ff16612afb576040517f3056283500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008585604051602001612b10929190614460565b6040516020818303038152906040528051906020012090506000612b78858580806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f8201169050808301925050505050505060035484612e6c565b905080612bb1576040517f8a585be200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b82600460008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612c009190614128565b925050819055508260076000828254612c199190614128565b9250508190555050505050505050565b6000600267ffffffffffffffff811115612c4657612c45613d27565b5b604051908082528060200260200182016040528015612c745781602001602082028036833780820191505090505b50905060008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b158015612cdd57600080fd5b505afa158015612cf1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d159190613d6b565b81600081518110612d2957612d28613728565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681600181518110612d9a57612d99613728565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505060008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663b6f9de9585848487426040518663ffffffff1660e01b8152600401612e34949392919061448c565b6000604051808303818588803b158015612e4d57600080fd5b505af1158015612e61573d6000803e3d6000fd5b505050505050505050565b600082612e798584612e83565b1490509392505050565b60008082905060005b8451811015612ece57612eb982868381518110612eac57612eab613728565b5b6020026020010151612ed9565b91508080612ec6906137ba565b915050612e8c565b508091505092915050565b6000818310612ef157612eec8284612f04565b612efc565b612efb8383612f04565b5b905092915050565b600082600052816020526040600020905092915050565b6000819050919050565b612f2e81612f1b565b82525050565b6000602082019050612f496000830184612f25565b92915050565b60008115159050919050565b612f6481612f4f565b82525050565b6000602082019050612f7f6000830184612f5b565b92915050565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612fc482612f99565b9050919050565b612fd481612fb9565b8114612fdf57600080fd5b50565b600081359050612ff181612fcb565b92915050565b60006020828403121561300d5761300c612f8f565b5b600061301b84828501612fe2565b91505092915050565b61302d81612f1b565b811461303857600080fd5b50565b60008135905061304a81613024565b92915050565b60008060006060848603121561306957613068612f8f565b5b60006130778682870161303b565b935050602061308886828701612fe2565b925050604061309986828701612fe2565b9150509250925092565b60006040820190506130b86000830185612f25565b6130c56020830184612f25565b9392505050565b6000819050919050565b6130df816130cc565b82525050565b60006020820190506130fa60008301846130d6565b92915050565b600061310b82612f99565b9050919050565b61311b81613100565b811461312657600080fd5b50565b60008135905061313881613112565b92915050565b6000806040838503121561315557613154612f8f565b5b60006131638582860161303b565b925050602061317485828601613129565b9150509250929050565b60006020828403121561319457613193612f8f565b5b60006131a28482850161303b565b91505092915050565b6131b4816130cc565b81146131bf57600080fd5b50565b6000813590506131d1816131ab565b92915050565b6000602082840312156131ed576131ec612f8f565b5b60006131fb848285016131c2565b91505092915050565b6000806040838503121561321b5761321a612f8f565b5b600061322985828601612fe2565b925050602061323a8582860161303b565b9150509250929050565b61324d81612fb9565b82525050565b60006020820190506132686000830184613244565b92915050565b600080fd5b600080fd5b600080fd5b60008083601f8401126132935761329261326e565b5b8235905067ffffffffffffffff8111156132b0576132af613273565b5b6020830191508360208202830111156132cc576132cb613278565b5b9250929050565b600080600080606085870312156132ed576132ec612f8f565b5b60006132fb8782880161303b565b945050602085013567ffffffffffffffff81111561331c5761331b612f94565b5b6133288782880161327d565b9350935050604061333b8782880161303b565b91505092959194509250565b60008060008060006080868803121561336357613362612f8f565b5b60006133718882890161303b565b955050602086013567ffffffffffffffff81111561339257613391612f94565b5b61339e8882890161327d565b945094505060406133b18882890161303b565b92505060606133c28882890161303b565b9150509295509295909350565b6000806000606084860312156133e8576133e7612f8f565b5b60006133f68682870161303b565b93505060206134078682870161303b565b92505060406134188682870161303b565b9150509250925092565b600060a0820190506134376000830188612f25565b6134446020830187612f25565b6134516040830186612f25565b61345e6060830185612f25565b61346b6080830184612f25565b9695505050505050565b6000819050919050565b600061349a61349561349084612f99565b613475565b612f99565b9050919050565b60006134ac8261347f565b9050919050565b60006134be826134a1565b9050919050565b6134ce816134b3565b82525050565b60006020820190506134e960008301846134c5565b92915050565b60008083601f8401126135055761350461326e565b5b8235905067ffffffffffffffff81111561352257613521613273565b5b60208301915083602082028301111561353e5761353d613278565b5b9250929050565b60008083601f84011261355b5761355a61326e565b5b8235905067ffffffffffffffff81111561357857613577613273565b5b60208301915083602082028301111561359457613593613278565b5b9250929050565b600080600080604085870312156135b5576135b4612f8f565b5b600085013567ffffffffffffffff8111156135d3576135d2612f94565b5b6135df878288016134ef565b9450945050602085013567ffffffffffffffff81111561360257613601612f94565b5b61360e87828801613545565b925092505092959194509250565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061368582612f1b565b915061369083612f1b565b9250826136a05761369f61361c565b5b828204905092915050565b600082825260208201905092915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006136f26020836136ab565b91506136fd826136bc565b602082019050919050565b60006020820190508181036000830152613721816136e5565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600061376282612f1b565b915061376d83612f1b565b9250828210156137805761377f61364b565b5b828203905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b60006137c582612f1b565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156137f8576137f761364b565b5b600182019050919050565b60008151905061381281613024565b92915050565b60006020828403121561382e5761382d612f8f565b5b600061383c84828501613803565b91505092915050565b60008160011c9050919050565b6000808291508390505b600185111561389c578086048111156138785761387761364b565b5b60018516156138875780820291505b808102905061389585613845565b945061385c565b94509492505050565b6000826138b55760019050613971565b816138c35760009050613971565b81600181146138d957600281146138e357613912565b6001915050613971565b60ff8411156138f5576138f461364b565b5b8360020a91508482111561390c5761390b61364b565b5b50613971565b5060208310610133831016604e8410600b84101617156139475782820a9050838111156139425761394161364b565b5b613971565b6139548484846001613852565b9250905081840481111561396b5761396a61364b565b5b81810290505b9392505050565b600061398382612f1b565b915061398e83612f1b565b92506139bb7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff84846138a5565b905092915050565b7f5a65726f206164647265737320697320696e76616c69642e0000000000000000600082015250565b60006139f96018836136ab565b9150613a04826139c3565b602082019050919050565b60006020820190508181036000830152613a28816139ec565b9050919050565b7f416d6f756e74206d7573742062652067726561746572207468616e207a65726f60008201527f2e00000000000000000000000000000000000000000000000000000000000000602082015250565b6000613a8b6021836136ab565b9150613a9682613a2f565b604082019050919050565b60006020820190508181036000830152613aba81613a7e565b9050919050565b7f4e6f7420656e6f75676820746f6b656e73210000000000000000000000000000600082015250565b6000613af76012836136ab565b9150613b0282613ac1565b602082019050919050565b60006020820190508181036000830152613b2681613aea565b9050919050565b6000604082019050613b426000830185613244565b613b4f6020830184612f25565b9392505050565b613b5f81612f4f565b8114613b6a57600080fd5b50565b600081519050613b7c81613b56565b92915050565b600060208284031215613b9857613b97612f8f565b5b6000613ba684828501613b6d565b91505092915050565b7f5472616e73666572206661696c65642100000000000000000000000000000000600082015250565b6000613be56010836136ab565b9150613bf082613baf565b602082019050919050565b60006020820190508181036000830152613c1481613bd8565b9050919050565b6000613c2682612f1b565b9150613c3183612f1b565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613c6a57613c6961364b565b5b828202905092915050565b7f4e6f7420656e6f75676820455448210000000000000000000000000000000000600082015250565b6000613cab600f836136ab565b9150613cb682613c75565b602082019050919050565b60006020820190508181036000830152613cda81613c9e565b9050919050565b600081905092915050565b50565b6000613cfc600083613ce1565b9150613d0782613cec565b600082019050919050565b6000613d1d82613cef565b9150819050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600081519050613d6581612fcb565b92915050565b600060208284031215613d8157613d80612f8f565b5b6000613d8f84828501613d56565b91505092915050565b6000819050919050565b6000613dbd613db8613db384613d98565b613475565b612f1b565b9050919050565b613dcd81613da2565b82525050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b613e0881612fb9565b82525050565b6000613e1a8383613dff565b60208301905092915050565b6000602082019050919050565b6000613e3e82613dd3565b613e488185613dde565b9350613e5383613def565b8060005b83811015613e84578151613e6b8882613e0e565b9750613e7683613e26565b925050600181019050613e57565b5085935050505092915050565b6000604082019050613ea66000830185613dc4565b8181036020830152613eb88184613e33565b90509392505050565b6000601f19601f8301169050919050565b613edb82613ec1565b810181811067ffffffffffffffff82111715613efa57613ef9613d27565b5b80604052505050565b6000613f0d612f85565b9050613f198282613ed2565b919050565b600067ffffffffffffffff821115613f3957613f38613d27565b5b602082029050602081019050919050565b6000613f5d613f5884613f1e565b613f03565b90508083825260208201905060208402830185811115613f8057613f7f613278565b5b835b81811015613fa95780613f958882613803565b845260208401935050602081019050613f82565b5050509392505050565b600082601f830112613fc857613fc761326e565b5b8151613fd8848260208601613f4a565b91505092915050565b600060208284031215613ff757613ff6612f8f565b5b600082015167ffffffffffffffff81111561401557614014612f94565b5b61402184828501613fb3565b91505092915050565b7f496e76616c6964206f757470757420746f6b656e000000000000000000000000600082015250565b60006140606014836136ab565b915061406b8261402a565b602082019050919050565b6000602082019050818103600083015261408f81614053565b9050919050565b7f4d7573742073656e6420736f6d6520455448207769746820746865206e65775260008201527f6f6f742066756e6374696f6e2e00000000000000000000000000000000000000602082015250565b60006140f2602d836136ab565b91506140fd82614096565b604082019050919050565b60006020820190508181036000830152614121816140e5565b9050919050565b600061413382612f1b565b915061413e83612f1b565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156141735761417261364b565b5b828201905092915050565b7f4164647265737320697320696e656c696769626c650000000000000000000000600082015250565b60006141b46015836136ab565b91506141bf8261417e565b602082019050919050565b600060208201905081810360008301526141e3816141a7565b9050919050565b60006040820190506141ff6000830185613244565b61420c6020830184613244565b9392505050565b60006dffffffffffffffffffffffffffff82169050919050565b61423681614213565b811461424157600080fd5b50565b6000815190506142538161422d565b92915050565b600063ffffffff82169050919050565b61427281614259565b811461427d57600080fd5b50565b60008151905061428f81614269565b92915050565b6000806000606084860312156142ae576142ad612f8f565b5b60006142bc86828701614244565b93505060206142cd86828701614244565b92505060406142de86828701614280565b9150509250925092565b60006060820190506142fd6000830186612f25565b61430a6020830185612f25565b6143176040830184612f25565b949350505050565b7f436c61696d657220697320696e656c696769626c652e00000000000000000000600082015250565b60006143556016836136ab565b91506143608261431f565b602082019050919050565b6000602082019050818103600083015261438481614348565b9050919050565b7f417272617973206d7573742068617665207468652073616d65206c656e677468600082015250565b60006143c16020836136ab565b91506143cc8261438b565b602082019050919050565b600060208201905081810360008301526143f0816143b4565b9050919050565b60008160601b9050919050565b600061440f826143f7565b9050919050565b600061442182614404565b9050919050565b61443961443482612fb9565b614416565b82525050565b6000819050919050565b61445a61445582612f1b565b61443f565b82525050565b600061446c8285614428565b60148201915061447c8284614449565b6020820191508190509392505050565b60006080820190506144a16000830187612f25565b81810360208301526144b38186613e33565b90506144c26040830185613244565b6144cf6060830184612f25565b9594505050505056fea26469706673582212207448c608feff648cec745cc43e83a314c13406fc0122ab63d414f3409e8ec56d64736f6c63430008090033
Deployed Bytecode Sourcemap
20516:13827:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28003:326;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20649:27;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32883:333;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;20776:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26524:677;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26015:440;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;29752:357;;;;;;;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;20816:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20685:25;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25557:450;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;28462:330;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27281:622;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24930:619;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;33634:204;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;32766:105;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;24420:287;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32112:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;32552:87;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;24715:98;;;;;;;;;;;;;:::i;:::-;;20892:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20620:20;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20925:29;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23412:547;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30117:519;;;;;;;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;32284:112;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;28854:412;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20988:43;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32647:111;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;22882:522;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;33288:271;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32404:140;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;20719:48;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20855:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30895:1209;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;:::i;:::-;;;;;;;;24821:101;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;20550:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33846:492;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;20591:20;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28003:326;28065:27;28107:22;28132:30;:28;:30::i;:::-;28107:55;;28266:14;28252:11;;28231:18;;:32;;;;:::i;:::-;:49;;;;:::i;:::-;28209:71;;28293:28;28003:326;:::o;20649:27::-;;;;;;;;;;;;;:::o;32883:333::-;22054:10;22045:19;;:5;;;;;;;;;;;:19;;;22037:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;32955:11:::1;32969:17;:24;;;;32955:38;;33006:6;33002:207;33018:3;33014:1;:7;33002:207;;;33066:4;33042:28;;:17;33060:1;33042:20;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;:28;;;33039:161;;;33108:17;33132:1;33126:3;:7;;;;:::i;:::-;33108:26;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;33085:17;33103:1;33085:20;;;;;;;;:::i;:::-;;;;;;;;;;:49;;;;;;;;;;;;;;;;;;33147:17;:23;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;33183:5;;33039:161;33023:3;;;;;:::i;:::-;;;;33002:207;;;;32946:270;32883:333:::0;:::o;20776:33::-;;;;:::o;26524:677::-;26585:36;26672:5;;;;;;;;;;;26665:25;;;:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;26634:58;;26797:9;26792:217;26816:17;:24;;;;26812:1;:28;26792:217;;;26862:24;26896:5;;;;;;;;;;;26889:23;;;26913:17;26931:1;26913:20;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;26889:45;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;26862:72;;26981:16;26949:48;;;;;:::i;:::-;;;26847:162;26842:3;;;;;:::i;:::-;;;;26792:217;;;;27127:5;;;;;;;;;;;27120:22;;;:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;27116:2;:28;;;;:::i;:::-;27084;:61;;;;:::i;:::-;27053:92;;26524:677;:::o;26015:440::-;22054:10;22045:19;;:5;;;;;;;;;;;:19;;;22037:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;26137:1:::1;26122:17;;:3;:17;;;;26114:54;;;;;;;;;;;;:::i;:::-;;;;;;;;;26197:1;26187:7;:11;26179:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;26273:6;26266:24;;;26299:4;26266:39;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;26255:7;:50;;26247:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;26341:12;26363:6;26356:23;;;26380:10;26392:7;26356:44;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;26341:59;;26419:7;26411:36;;;;;;;;;;;;:::i;:::-;;;;;;;;;26103:352;26015:440:::0;;;:::o;29752:357::-;29799:9;29810;29832:28;29863:31;:29;:31::i;:::-;29832:62;;29905:24;29932:27;:25;:27::i;:::-;29905:54;;30013:16;21069:6;29977:20;:32;;;;:::i;:::-;29976:53;;;;:::i;:::-;29972:57;;30051:24;;30044:4;;:31;;;;:::i;:::-;30040:35;;30088:13;;29752:357;;:::o;20816:32::-;;;;:::o;20685:25::-;;;;:::o;25557:450::-;22054:10;22045:19;;:5;;;;;;;;;;;:19;;;22037:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;25669:1:::1;25654:17;;:3;:17;;;;25646:54;;;;;;;;;;;;:::i;:::-;;;;;;;;;25729:1;25719:7;:11;25711:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;25812:7;25787:21;:32;;25779:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;25906:12;25924:3;:8;;25940:7;25924:28;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25905:47;;;25971:7;25963:36;;;;;;;;;;;;:::i;:::-;;;;;;;;;25635:372;25557:450:::0;;:::o;28462:330::-;28536:20;28569:28;28600:31;:29;:31::i;:::-;28569:62;;28741:11;28718:20;:34;;;;:::i;:::-;28703:49;;28558:234;28462:330;;;:::o;27281:622::-;27339:23;27375:21;27413:1;27399:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27375:40;;27436:5;;;;;;;;;;;27426:4;27431:1;27426:7;;;;;;;;:::i;:::-;;;;;;;:15;;;;;;;;;;;27462:6;;;;;;;;;;:11;;;:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;27452:4;27457:1;27452:7;;;;;;;;:::i;:::-;;;;;;;:23;;;;;;;;;;;27561:27;27591:6;;;;;;;;;;;:20;;;27612:3;27617:4;27591:31;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;27561:61;;27729:1;27709:10;:17;:21;:62;;;;;27770:1;27734:10;27765:1;27745:10;:17;:21;;;;:::i;:::-;27734:33;;;;;;;;:::i;:::-;;;;;;;;:37;27709:62;27701:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;27827:10;27858:1;27838:10;:17;:21;;;;:::i;:::-;27827:33;;;;;;;;:::i;:::-;;;;;;;;27809:51;;27871:24;;27281:622;:::o;24930:619::-;22054:10;22045:19;;:5;;;;;;;;;;;:19;;;22037:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;25017:1:::1;25005:9;:13;24997:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;25103:9;25081:18;;:31;;;;;;;:::i;:::-;;;;;;;;25143:9;25123:17;:29;;;;25228:12;25209:14;;25191:15;:32;;;;:::i;:::-;25190:51;;;;:::i;:::-;25163:24;:78;;;;25350:1;25322:24;;:29;25318:90;;;25395:1;25368:24;:28;;;;25318:90;25433:4;25420:10;:17;;;;25465:15;25448:14;:32;;;;25491:11;;:13;;;;;;;;;:::i;:::-;;;;;;24930:619:::0;:::o;33634:204::-;22054:10;22045:19;;:5;;;;;;;;;;;:19;;;22037:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;33732:28:::1;33751:8;33732:18;:28::i;:::-;33731:29;33723:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;33823:7;33797:13;:23;33811:8;33797:23;;;;;;;;;;;;;;;:33;;;;33634:204:::0;;:::o;32766:105::-;22054:10;22045:19;;:5;;;;;;;;;;;:19;;;22037:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;32835:17:::1;32858:4;32835:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32766:105:::0;:::o;24420:287::-;24479:7;24499:16;24517;24571:6;;;;;;;;;;;:14;;;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;24553:43;;;24597:5;;;;;;;;;;;24604:6;;;;;;;;;;:11;;;:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;24553:65;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;24538:93;;;:95;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;24498:135;;;;;;;;;24653:6;;;;;;;;;;:19;;;24673:5;24680:8;24690;24653:46;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;24646:53;;;;24420:287;;;:::o;32112:164::-;22054:10;22045:19;;:5;;;;;;;;;;;:19;;;22037:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;32243:25:::1;32215:24;:53;;;;32112:164:::0;:::o;32552:87::-;22054:10;22045:19;;:5;;;;;;;;;;;:19;;;22037:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;32625:6:::1;32617:5;;:14;;;;;;;;;;;;;;;;;;32552:87:::0;:::o;24715:98::-;22054:10;22045:19;;:5;;;;;;;;;;;:19;;;22037:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;24790:15:::1;;;;;;;;;;;24789:16;24771:15;;:34;;;;;;;;;;;;;;;;;;24715:98::o:0;20892:26::-;;;;:::o;20620:20::-;;;;;;;;;;;;;:::o;20925:29::-;;;;:::o;23412:547::-;23545:12;23572:10;23585;23572:23;;23678:22;23697:2;23678:18;:22::i;:::-;23677:23;23669:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;23740:44;23753:2;23757:6;23765:5;;23772:11;23740:12;:44::i;:::-;23843:2;:7;;23858:11;23843:31;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23829:45;;;;;23927:2;23921:30;;;23931:6;23939:11;23921:30;;;;;;;:::i;:::-;;;;;;;;23559:400;23412:547;;;;;;:::o;30117:519::-;30168:11;30181;30205:9;30225;30254:16;:14;:16::i;:::-;30245:25;;;;;;;;30357:1;30353;:5;;;;:::i;:::-;30347:11;;30447:15;21069:6;30447:27;;30490:9;30485:108;30509:1;30505;:5;30485:108;;;21069:6;;30554:1;:13;;;;:::i;:::-;30543:7;:25;;;;:::i;:::-;30542:39;;;;:::i;:::-;30532:49;;30512:3;;;;;:::i;:::-;;;;30485:108;;;;21069:6;30609:7;:19;;;;:::i;:::-;30603:25;;30194:442;;;30117:519;;:::o;32284:112::-;22054:10;22045:19;;:5;;;;;;;;;;;:19;;;22037:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;32376:12:::1;32361:11;:27;;;;32284:112:::0;:::o;28854:412::-;28936:26;28975:28;29006:31;:29;:31::i;:::-;28975:62;;29208:5;;;;;;;;;;;29201:22;;;:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;29197:2;:28;;;;:::i;:::-;29162:5;;;;;;;;;;;29155:23;;;29179:13;29155:38;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;29132:20;:61;;;;:::i;:::-;:94;;;;:::i;:::-;29111:115;;28964:302;28854:412;;;:::o;20988:43::-;;;;:::o;32647:111::-;22054:10;22045:19;;:5;;;;;;;;;;;:19;;;22037:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;32742:7:::1;32714:6;::::0;:36:::1;;;;;;;;;;;;;;;;;;32647:111:::0;:::o;22882:522::-;23050:10;23063;23050:23;;23156:22;23175:2;23156:18;:22::i;:::-;23155:23;23147:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;23218:44;23231:2;23235:6;23243:5;;23250:11;23218:12;:44::i;:::-;23275;23292:11;23305:2;23309:9;23275:16;:44::i;:::-;23372:2;23366:30;;;23376:6;23384:11;23366:30;;;;;;;:::i;:::-;;;;;;;;23037:367;22882:522;;;;;:::o;33288:271::-;33351:4;33373:9;33385:1;33373:13;;33368:161;33392:17;:24;;;;33388:1;:28;33368:161;;;33466:4;33442:28;;:17;33460:1;33442:20;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;:28;;;33438:80;;;33498:4;33491:11;;;;;33438:80;33418:3;;;;;:::i;:::-;;;;33368:161;;;;33546:5;33539:12;;33288:271;;;;:::o;32404:140::-;22054:10;22045:19;;:5;;;;;;;;;;;:19;;;22037:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;32517:19:::1;32495:18;:41;;;;32404:140:::0;:::o;20719:48::-;;;;;;;;;;;;;;;;;:::o;20855:30::-;;;;:::o;30895:1209::-;31096:27;31134:9;31154;31174:11;31197;31241:22;31266:30;:28;:30::i;:::-;31241:55;;31307:24;31334:27;:25;:27::i;:::-;31307:54;;31372:28;31435:14;31403:29;:46;;;;:::i;:::-;31372:77;;31503:16;21069:6;31467:20;:32;;;;:::i;:::-;31466:53;;;;:::i;:::-;31462:57;;31541:29;31534:4;;:36;;;;:::i;:::-;31530:40;;31695:11;31672:20;:34;;;;:::i;:::-;31650:56;;31825:1;31821;:5;;;;:::i;:::-;31815:11;;31915:15;21069:6;31915:27;;31958:9;31953:108;31977:1;31973;:5;31953:108;;;21069:6;;32022:1;:13;;;;:::i;:::-;32011:7;:25;;;;:::i;:::-;32010:39;;;;:::i;:::-;32000:49;;31980:3;;;;;:::i;:::-;;;;31953:108;;;;21069:6;32077:7;:19;;;;:::i;:::-;32071:25;;31220:884;;;;30895:1209;;;;;;;;;:::o;24821:101::-;22054:10;22045:19;;:5;;;;;;;;;;;:19;;;22037:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;24905:9:::1;24897:5;;:17;;;;;;;;;;;;;;;;;;24821:101:::0;:::o;20550:32::-;;;;;;;;;;;;:::o;33846:492::-;22054:10;22045:19;;:5;;;;;;;;;;;:19;;;22037:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;33991:7:::1;;:14;;33971:9;;:16;;:34;33963:79;;;;;;;;;;;;:::i;:::-;;;;;;;;;34060:9;34055:276;34079:9;;:16;;34075:1;:20;34055:276;;;34117:16;34136:9;;34146:1;34136:12;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;34117:31;;34163:15;34181:7;;34189:1;34181:10;;;;;;;:::i;:::-;;;;;;;;34163:28;;34217;34236:8;34217:18;:28::i;:::-;34216:29;34208:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;34312:7;34286:13;:23;34300:8;34286:23;;;;;;;;;;;;;;;:33;;;;34102:229;;34097:3;;;;;:::i;:::-;;;;34055:276;;;;33846:492:::0;;;;:::o;20591:20::-;;;;;;;;;;;;;:::o;22133:741::-;22391:6;22377:11;22357:13;:17;22371:2;22357:17;;;;;;;;;;;;;;;;:31;;;;:::i;:::-;:40;22353:80;;;22419:14;;;;;;;;;;;;;;22353:80;22448:15;;;;;;;;;;;22444:59;;22485:18;;;;;;;;;;;;;;22444:59;22574:12;22616:2;22620:6;22599:28;;;;;;;;;:::i;:::-;;;;;;;;;;;;;22589:39;;;;;;22574:54;;22639:16;22658:43;22677:5;;22658:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22684:10;;22696:4;22658:18;:43::i;:::-;22639:62;;22717:11;22712:38;;22737:13;;;;;;;;;;;;;;22712:38;22814:11;22793:13;:17;22807:2;22793:17;;;;;;;;;;;;;;;;:32;;;;;;;:::i;:::-;;;;;;;;22855:11;22836:15;;:30;;;;;;;:::i;:::-;;;;;;;;22282:592;;22133:741;;;;;:::o;23967:445::-;24065:21;24103:1;24089:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24065:40;;24126:6;;;;;;;;;;:11;;;:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;24116:4;24121:1;24116:7;;;;;;;;:::i;:::-;;;;;;;:23;;;;;;;;;;;24160:5;;;;;;;;;;;24150:4;24155:1;24150:7;;;;;;;;:::i;:::-;;;;;;;:15;;;;;;;;;;;24204:6;;;;;;;;;;:57;;;24283:9;24318;24342:4;24361:2;24378:15;24204:200;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24052:360;23967:445;;;:::o;11142:190::-;11267:4;11320;11291:25;11304:5;11311:4;11291:12;:25::i;:::-;:33;11284:40;;11142:190;;;;;:::o;12009:328::-;12119:7;12144:20;12167:4;12144:27;;12187:9;12182:118;12206:5;:12;12202:1;:16;12182:118;;;12255:33;12265:12;12279:5;12285:1;12279:8;;;;;;;;:::i;:::-;;;;;;;;12255:9;:33::i;:::-;12240:48;;12220:3;;;;;:::i;:::-;;;;12182:118;;;;12317:12;12310:19;;;12009:328;;;;:::o;19695:149::-;19758:7;19789:1;19785;:5;:51;;19816:20;19831:1;19834;19816:14;:20::i;:::-;19785:51;;;19793:20;19808:1;19811;19793:14;:20::i;:::-;19785:51;19778:58;;19695:149;;;;:::o;19852:300::-;19947:13;20059:1;20053:4;20046:15;20088:1;20082:4;20075:15;20129:4;20123;20113:21;20104:30;;19852:300;;;;:::o;7:77:1:-;44:7;73:5;62:16;;7:77;;;:::o;90:118::-;177:24;195:5;177:24;:::i;:::-;172:3;165:37;90:118;;:::o;214:222::-;307:4;345:2;334:9;330:18;322:26;;358:71;426:1;415:9;411:17;402:6;358:71;:::i;:::-;214:222;;;;:::o;442:90::-;476:7;519:5;512:13;505:21;494:32;;442:90;;;:::o;538:109::-;619:21;634:5;619:21;:::i;:::-;614:3;607:34;538:109;;:::o;653:210::-;740:4;778:2;767:9;763:18;755:26;;791:65;853:1;842:9;838:17;829:6;791:65;:::i;:::-;653:210;;;;:::o;869:75::-;902:6;935:2;929:9;919:19;;869:75;:::o;950:117::-;1059:1;1056;1049:12;1073:117;1182:1;1179;1172:12;1196:126;1233:7;1273:42;1266:5;1262:54;1251:65;;1196:126;;;:::o;1328:96::-;1365:7;1394:24;1412:5;1394:24;:::i;:::-;1383:35;;1328:96;;;:::o;1430:122::-;1503:24;1521:5;1503:24;:::i;:::-;1496:5;1493:35;1483:63;;1542:1;1539;1532:12;1483:63;1430:122;:::o;1558:139::-;1604:5;1642:6;1629:20;1620:29;;1658:33;1685:5;1658:33;:::i;:::-;1558:139;;;;:::o;1703:329::-;1762:6;1811:2;1799:9;1790:7;1786:23;1782:32;1779:119;;;1817:79;;:::i;:::-;1779:119;1937:1;1962:53;2007:7;1998:6;1987:9;1983:22;1962:53;:::i;:::-;1952:63;;1908:117;1703:329;;;;:::o;2038:122::-;2111:24;2129:5;2111:24;:::i;:::-;2104:5;2101:35;2091:63;;2150:1;2147;2140:12;2091:63;2038:122;:::o;2166:139::-;2212:5;2250:6;2237:20;2228:29;;2266:33;2293:5;2266:33;:::i;:::-;2166:139;;;;:::o;2311:619::-;2388:6;2396;2404;2453:2;2441:9;2432:7;2428:23;2424:32;2421:119;;;2459:79;;:::i;:::-;2421:119;2579:1;2604:53;2649:7;2640:6;2629:9;2625:22;2604:53;:::i;:::-;2594:63;;2550:117;2706:2;2732:53;2777:7;2768:6;2757:9;2753:22;2732:53;:::i;:::-;2722:63;;2677:118;2834:2;2860:53;2905:7;2896:6;2885:9;2881:22;2860:53;:::i;:::-;2850:63;;2805:118;2311:619;;;;;:::o;2936:332::-;3057:4;3095:2;3084:9;3080:18;3072:26;;3108:71;3176:1;3165:9;3161:17;3152:6;3108:71;:::i;:::-;3189:72;3257:2;3246:9;3242:18;3233:6;3189:72;:::i;:::-;2936:332;;;;;:::o;3274:77::-;3311:7;3340:5;3329:16;;3274:77;;;:::o;3357:118::-;3444:24;3462:5;3444:24;:::i;:::-;3439:3;3432:37;3357:118;;:::o;3481:222::-;3574:4;3612:2;3601:9;3597:18;3589:26;;3625:71;3693:1;3682:9;3678:17;3669:6;3625:71;:::i;:::-;3481:222;;;;:::o;3709:104::-;3754:7;3783:24;3801:5;3783:24;:::i;:::-;3772:35;;3709:104;;;:::o;3819:138::-;3900:32;3926:5;3900:32;:::i;:::-;3893:5;3890:43;3880:71;;3947:1;3944;3937:12;3880:71;3819:138;:::o;3963:155::-;4017:5;4055:6;4042:20;4033:29;;4071:41;4106:5;4071:41;:::i;:::-;3963:155;;;;:::o;4124:490::-;4200:6;4208;4257:2;4245:9;4236:7;4232:23;4228:32;4225:119;;;4263:79;;:::i;:::-;4225:119;4383:1;4408:53;4453:7;4444:6;4433:9;4429:22;4408:53;:::i;:::-;4398:63;;4354:117;4510:2;4536:61;4589:7;4580:6;4569:9;4565:22;4536:61;:::i;:::-;4526:71;;4481:126;4124:490;;;;;:::o;4620:329::-;4679:6;4728:2;4716:9;4707:7;4703:23;4699:32;4696:119;;;4734:79;;:::i;:::-;4696:119;4854:1;4879:53;4924:7;4915:6;4904:9;4900:22;4879:53;:::i;:::-;4869:63;;4825:117;4620:329;;;;:::o;4955:122::-;5028:24;5046:5;5028:24;:::i;:::-;5021:5;5018:35;5008:63;;5067:1;5064;5057:12;5008:63;4955:122;:::o;5083:139::-;5129:5;5167:6;5154:20;5145:29;;5183:33;5210:5;5183:33;:::i;:::-;5083:139;;;;:::o;5228:329::-;5287:6;5336:2;5324:9;5315:7;5311:23;5307:32;5304:119;;;5342:79;;:::i;:::-;5304:119;5462:1;5487:53;5532:7;5523:6;5512:9;5508:22;5487:53;:::i;:::-;5477:63;;5433:117;5228:329;;;;:::o;5563:474::-;5631:6;5639;5688:2;5676:9;5667:7;5663:23;5659:32;5656:119;;;5694:79;;:::i;:::-;5656:119;5814:1;5839:53;5884:7;5875:6;5864:9;5860:22;5839:53;:::i;:::-;5829:63;;5785:117;5941:2;5967:53;6012:7;6003:6;5992:9;5988:22;5967:53;:::i;:::-;5957:63;;5912:118;5563:474;;;;;:::o;6043:118::-;6130:24;6148:5;6130:24;:::i;:::-;6125:3;6118:37;6043:118;;:::o;6167:222::-;6260:4;6298:2;6287:9;6283:18;6275:26;;6311:71;6379:1;6368:9;6364:17;6355:6;6311:71;:::i;:::-;6167:222;;;;:::o;6395:117::-;6504:1;6501;6494:12;6518:117;6627:1;6624;6617:12;6641:117;6750:1;6747;6740:12;6781:568;6854:8;6864:6;6914:3;6907:4;6899:6;6895:17;6891:27;6881:122;;6922:79;;:::i;:::-;6881:122;7035:6;7022:20;7012:30;;7065:18;7057:6;7054:30;7051:117;;;7087:79;;:::i;:::-;7051:117;7201:4;7193:6;7189:17;7177:29;;7255:3;7247:4;7239:6;7235:17;7225:8;7221:32;7218:41;7215:128;;;7262:79;;:::i;:::-;7215:128;6781:568;;;;;:::o;7355:849::-;7459:6;7467;7475;7483;7532:2;7520:9;7511:7;7507:23;7503:32;7500:119;;;7538:79;;:::i;:::-;7500:119;7658:1;7683:53;7728:7;7719:6;7708:9;7704:22;7683:53;:::i;:::-;7673:63;;7629:117;7813:2;7802:9;7798:18;7785:32;7844:18;7836:6;7833:30;7830:117;;;7866:79;;:::i;:::-;7830:117;7979:80;8051:7;8042:6;8031:9;8027:22;7979:80;:::i;:::-;7961:98;;;;7756:313;8108:2;8134:53;8179:7;8170:6;8159:9;8155:22;8134:53;:::i;:::-;8124:63;;8079:118;7355:849;;;;;;;:::o;8210:995::-;8323:6;8331;8339;8347;8355;8404:3;8392:9;8383:7;8379:23;8375:33;8372:120;;;8411:79;;:::i;:::-;8372:120;8531:1;8556:53;8601:7;8592:6;8581:9;8577:22;8556:53;:::i;:::-;8546:63;;8502:117;8686:2;8675:9;8671:18;8658:32;8717:18;8709:6;8706:30;8703:117;;;8739:79;;:::i;:::-;8703:117;8852:80;8924:7;8915:6;8904:9;8900:22;8852:80;:::i;:::-;8834:98;;;;8629:313;8981:2;9007:53;9052:7;9043:6;9032:9;9028:22;9007:53;:::i;:::-;8997:63;;8952:118;9109:2;9135:53;9180:7;9171:6;9160:9;9156:22;9135:53;:::i;:::-;9125:63;;9080:118;8210:995;;;;;;;;:::o;9211:619::-;9288:6;9296;9304;9353:2;9341:9;9332:7;9328:23;9324:32;9321:119;;;9359:79;;:::i;:::-;9321:119;9479:1;9504:53;9549:7;9540:6;9529:9;9525:22;9504:53;:::i;:::-;9494:63;;9450:117;9606:2;9632:53;9677:7;9668:6;9657:9;9653:22;9632:53;:::i;:::-;9622:63;;9577:118;9734:2;9760:53;9805:7;9796:6;9785:9;9781:22;9760:53;:::i;:::-;9750:63;;9705:118;9211:619;;;;;:::o;9836:664::-;10041:4;10079:3;10068:9;10064:19;10056:27;;10093:71;10161:1;10150:9;10146:17;10137:6;10093:71;:::i;:::-;10174:72;10242:2;10231:9;10227:18;10218:6;10174:72;:::i;:::-;10256;10324:2;10313:9;10309:18;10300:6;10256:72;:::i;:::-;10338;10406:2;10395:9;10391:18;10382:6;10338:72;:::i;:::-;10420:73;10488:3;10477:9;10473:19;10464:6;10420:73;:::i;:::-;9836:664;;;;;;;;:::o;10506:60::-;10534:3;10555:5;10548:12;;10506:60;;;:::o;10572:142::-;10622:9;10655:53;10673:34;10682:24;10700:5;10682:24;:::i;:::-;10673:34;:::i;:::-;10655:53;:::i;:::-;10642:66;;10572:142;;;:::o;10720:126::-;10770:9;10803:37;10834:5;10803:37;:::i;:::-;10790:50;;10720:126;;;:::o;10852:152::-;10928:9;10961:37;10992:5;10961:37;:::i;:::-;10948:50;;10852:152;;;:::o;11010:183::-;11123:63;11180:5;11123:63;:::i;:::-;11118:3;11111:76;11010:183;;:::o;11199:274::-;11318:4;11356:2;11345:9;11341:18;11333:26;;11369:97;11463:1;11452:9;11448:17;11439:6;11369:97;:::i;:::-;11199:274;;;;:::o;11496:568::-;11569:8;11579:6;11629:3;11622:4;11614:6;11610:17;11606:27;11596:122;;11637:79;;:::i;:::-;11596:122;11750:6;11737:20;11727:30;;11780:18;11772:6;11769:30;11766:117;;;11802:79;;:::i;:::-;11766:117;11916:4;11908:6;11904:17;11892:29;;11970:3;11962:4;11954:6;11950:17;11940:8;11936:32;11933:41;11930:128;;;11977:79;;:::i;:::-;11930:128;11496:568;;;;;:::o;12087:::-;12160:8;12170:6;12220:3;12213:4;12205:6;12201:17;12197:27;12187:122;;12228:79;;:::i;:::-;12187:122;12341:6;12328:20;12318:30;;12371:18;12363:6;12360:30;12357:117;;;12393:79;;:::i;:::-;12357:117;12507:4;12499:6;12495:17;12483:29;;12561:3;12553:4;12545:6;12541:17;12531:8;12527:32;12524:41;12521:128;;;12568:79;;:::i;:::-;12521:128;12087:568;;;;;:::o;12661:934::-;12783:6;12791;12799;12807;12856:2;12844:9;12835:7;12831:23;12827:32;12824:119;;;12862:79;;:::i;:::-;12824:119;13010:1;12999:9;12995:17;12982:31;13040:18;13032:6;13029:30;13026:117;;;13062:79;;:::i;:::-;13026:117;13175:80;13247:7;13238:6;13227:9;13223:22;13175:80;:::i;:::-;13157:98;;;;12953:312;13332:2;13321:9;13317:18;13304:32;13363:18;13355:6;13352:30;13349:117;;;13385:79;;:::i;:::-;13349:117;13498:80;13570:7;13561:6;13550:9;13546:22;13498:80;:::i;:::-;13480:98;;;;13275:313;12661:934;;;;;;;:::o;13601:180::-;13649:77;13646:1;13639:88;13746:4;13743:1;13736:15;13770:4;13767:1;13760:15;13787:180;13835:77;13832:1;13825:88;13932:4;13929:1;13922:15;13956:4;13953:1;13946:15;13973:185;14013:1;14030:20;14048:1;14030:20;:::i;:::-;14025:25;;14064:20;14082:1;14064:20;:::i;:::-;14059:25;;14103:1;14093:35;;14108:18;;:::i;:::-;14093:35;14150:1;14147;14143:9;14138:14;;13973:185;;;;:::o;14164:169::-;14248:11;14282:6;14277:3;14270:19;14322:4;14317:3;14313:14;14298:29;;14164:169;;;;:::o;14339:182::-;14479:34;14475:1;14467:6;14463:14;14456:58;14339:182;:::o;14527:366::-;14669:3;14690:67;14754:2;14749:3;14690:67;:::i;:::-;14683:74;;14766:93;14855:3;14766:93;:::i;:::-;14884:2;14879:3;14875:12;14868:19;;14527:366;;;:::o;14899:419::-;15065:4;15103:2;15092:9;15088:18;15080:26;;15152:9;15146:4;15142:20;15138:1;15127:9;15123:17;15116:47;15180:131;15306:4;15180:131;:::i;:::-;15172:139;;14899:419;;;:::o;15324:180::-;15372:77;15369:1;15362:88;15469:4;15466:1;15459:15;15493:4;15490:1;15483:15;15510:191;15550:4;15570:20;15588:1;15570:20;:::i;:::-;15565:25;;15604:20;15622:1;15604:20;:::i;:::-;15599:25;;15643:1;15640;15637:8;15634:34;;;15648:18;;:::i;:::-;15634:34;15693:1;15690;15686:9;15678:17;;15510:191;;;;:::o;15707:180::-;15755:77;15752:1;15745:88;15852:4;15849:1;15842:15;15876:4;15873:1;15866:15;15893:233;15932:3;15955:24;15973:5;15955:24;:::i;:::-;15946:33;;16001:66;15994:5;15991:77;15988:103;;;16071:18;;:::i;:::-;15988:103;16118:1;16111:5;16107:13;16100:20;;15893:233;;;:::o;16132:143::-;16189:5;16220:6;16214:13;16205:22;;16236:33;16263:5;16236:33;:::i;:::-;16132:143;;;;:::o;16281:351::-;16351:6;16400:2;16388:9;16379:7;16375:23;16371:32;16368:119;;;16406:79;;:::i;:::-;16368:119;16526:1;16551:64;16607:7;16598:6;16587:9;16583:22;16551:64;:::i;:::-;16541:74;;16497:128;16281:351;;;;:::o;16638:102::-;16680:8;16727:5;16724:1;16720:13;16699:34;;16638:102;;;:::o;16746:848::-;16807:5;16814:4;16838:6;16829:15;;16862:5;16853:14;;16876:712;16897:1;16887:8;16884:15;16876:712;;;16992:4;16987:3;16983:14;16977:4;16974:24;16971:50;;;17001:18;;:::i;:::-;16971:50;17051:1;17041:8;17037:16;17034:451;;;17466:4;17459:5;17455:16;17446:25;;17034:451;17516:4;17510;17506:15;17498:23;;17546:32;17569:8;17546:32;:::i;:::-;17534:44;;16876:712;;;16746:848;;;;;;;:::o;17600:1073::-;17654:5;17845:8;17835:40;;17866:1;17857:10;;17868:5;;17835:40;17894:4;17884:36;;17911:1;17902:10;;17913:5;;17884:36;17980:4;18028:1;18023:27;;;;18064:1;18059:191;;;;17973:277;;18023:27;18041:1;18032:10;;18043:5;;;18059:191;18104:3;18094:8;18091:17;18088:43;;;18111:18;;:::i;:::-;18088:43;18160:8;18157:1;18153:16;18144:25;;18195:3;18188:5;18185:14;18182:40;;;18202:18;;:::i;:::-;18182:40;18235:5;;;17973:277;;18359:2;18349:8;18346:16;18340:3;18334:4;18331:13;18327:36;18309:2;18299:8;18296:16;18291:2;18285:4;18282:12;18278:35;18262:111;18259:246;;;18415:8;18409:4;18405:19;18396:28;;18450:3;18443:5;18440:14;18437:40;;;18457:18;;:::i;:::-;18437:40;18490:5;;18259:246;18530:42;18568:3;18558:8;18552:4;18549:1;18530:42;:::i;:::-;18515:57;;;;18604:4;18599:3;18595:14;18588:5;18585:25;18582:51;;;18613:18;;:::i;:::-;18582:51;18662:4;18655:5;18651:16;18642:25;;17600:1073;;;;;;:::o;18679:285::-;18739:5;18763:23;18781:4;18763:23;:::i;:::-;18755:31;;18807:27;18825:8;18807:27;:::i;:::-;18795:39;;18853:104;18890:66;18880:8;18874:4;18853:104;:::i;:::-;18844:113;;18679:285;;;;:::o;18970:174::-;19110:26;19106:1;19098:6;19094:14;19087:50;18970:174;:::o;19150:366::-;19292:3;19313:67;19377:2;19372:3;19313:67;:::i;:::-;19306:74;;19389:93;19478:3;19389:93;:::i;:::-;19507:2;19502:3;19498:12;19491:19;;19150:366;;;:::o;19522:419::-;19688:4;19726:2;19715:9;19711:18;19703:26;;19775:9;19769:4;19765:20;19761:1;19750:9;19746:17;19739:47;19803:131;19929:4;19803:131;:::i;:::-;19795:139;;19522:419;;;:::o;19947:220::-;20087:34;20083:1;20075:6;20071:14;20064:58;20156:3;20151:2;20143:6;20139:15;20132:28;19947:220;:::o;20173:366::-;20315:3;20336:67;20400:2;20395:3;20336:67;:::i;:::-;20329:74;;20412:93;20501:3;20412:93;:::i;:::-;20530:2;20525:3;20521:12;20514:19;;20173:366;;;:::o;20545:419::-;20711:4;20749:2;20738:9;20734:18;20726:26;;20798:9;20792:4;20788:20;20784:1;20773:9;20769:17;20762:47;20826:131;20952:4;20826:131;:::i;:::-;20818:139;;20545:419;;;:::o;20970:168::-;21110:20;21106:1;21098:6;21094:14;21087:44;20970:168;:::o;21144:366::-;21286:3;21307:67;21371:2;21366:3;21307:67;:::i;:::-;21300:74;;21383:93;21472:3;21383:93;:::i;:::-;21501:2;21496:3;21492:12;21485:19;;21144:366;;;:::o;21516:419::-;21682:4;21720:2;21709:9;21705:18;21697:26;;21769:9;21763:4;21759:20;21755:1;21744:9;21740:17;21733:47;21797:131;21923:4;21797:131;:::i;:::-;21789:139;;21516:419;;;:::o;21941:332::-;22062:4;22100:2;22089:9;22085:18;22077:26;;22113:71;22181:1;22170:9;22166:17;22157:6;22113:71;:::i;:::-;22194:72;22262:2;22251:9;22247:18;22238:6;22194:72;:::i;:::-;21941:332;;;;;:::o;22279:116::-;22349:21;22364:5;22349:21;:::i;:::-;22342:5;22339:32;22329:60;;22385:1;22382;22375:12;22329:60;22279:116;:::o;22401:137::-;22455:5;22486:6;22480:13;22471:22;;22502:30;22526:5;22502:30;:::i;:::-;22401:137;;;;:::o;22544:345::-;22611:6;22660:2;22648:9;22639:7;22635:23;22631:32;22628:119;;;22666:79;;:::i;:::-;22628:119;22786:1;22811:61;22864:7;22855:6;22844:9;22840:22;22811:61;:::i;:::-;22801:71;;22757:125;22544:345;;;;:::o;22895:166::-;23035:18;23031:1;23023:6;23019:14;23012:42;22895:166;:::o;23067:366::-;23209:3;23230:67;23294:2;23289:3;23230:67;:::i;:::-;23223:74;;23306:93;23395:3;23306:93;:::i;:::-;23424:2;23419:3;23415:12;23408:19;;23067:366;;;:::o;23439:419::-;23605:4;23643:2;23632:9;23628:18;23620:26;;23692:9;23686:4;23682:20;23678:1;23667:9;23663:17;23656:47;23720:131;23846:4;23720:131;:::i;:::-;23712:139;;23439:419;;;:::o;23864:348::-;23904:7;23927:20;23945:1;23927:20;:::i;:::-;23922:25;;23961:20;23979:1;23961:20;:::i;:::-;23956:25;;24149:1;24081:66;24077:74;24074:1;24071:81;24066:1;24059:9;24052:17;24048:105;24045:131;;;24156:18;;:::i;:::-;24045:131;24204:1;24201;24197:9;24186:20;;23864:348;;;;:::o;24218:165::-;24358:17;24354:1;24346:6;24342:14;24335:41;24218:165;:::o;24389:366::-;24531:3;24552:67;24616:2;24611:3;24552:67;:::i;:::-;24545:74;;24628:93;24717:3;24628:93;:::i;:::-;24746:2;24741:3;24737:12;24730:19;;24389:366;;;:::o;24761:419::-;24927:4;24965:2;24954:9;24950:18;24942:26;;25014:9;25008:4;25004:20;25000:1;24989:9;24985:17;24978:47;25042:131;25168:4;25042:131;:::i;:::-;25034:139;;24761:419;;;:::o;25186:147::-;25287:11;25324:3;25309:18;;25186:147;;;;:::o;25339:114::-;;:::o;25459:398::-;25618:3;25639:83;25720:1;25715:3;25639:83;:::i;:::-;25632:90;;25731:93;25820:3;25731:93;:::i;:::-;25849:1;25844:3;25840:11;25833:18;;25459:398;;;:::o;25863:379::-;26047:3;26069:147;26212:3;26069:147;:::i;:::-;26062:154;;26233:3;26226:10;;25863:379;;;:::o;26248:180::-;26296:77;26293:1;26286:88;26393:4;26390:1;26383:15;26417:4;26414:1;26407:15;26434:143;26491:5;26522:6;26516:13;26507:22;;26538:33;26565:5;26538:33;:::i;:::-;26434:143;;;;:::o;26583:351::-;26653:6;26702:2;26690:9;26681:7;26677:23;26673:32;26670:119;;;26708:79;;:::i;:::-;26670:119;26828:1;26853:64;26909:7;26900:6;26889:9;26885:22;26853:64;:::i;:::-;26843:74;;26799:128;26583:351;;;;:::o;26940:94::-;26994:7;27023:5;27012:16;;26940:94;;;:::o;27040:176::-;27107:9;27140:70;27158:51;27167:41;27202:5;27167:41;:::i;:::-;27158:51;:::i;:::-;27140:70;:::i;:::-;27127:83;;27040:176;;;:::o;27222:165::-;27326:54;27374:5;27326:54;:::i;:::-;27321:3;27314:67;27222:165;;:::o;27393:114::-;27460:6;27494:5;27488:12;27478:22;;27393:114;;;:::o;27513:184::-;27612:11;27646:6;27641:3;27634:19;27686:4;27681:3;27677:14;27662:29;;27513:184;;;;:::o;27703:132::-;27770:4;27793:3;27785:11;;27823:4;27818:3;27814:14;27806:22;;27703:132;;;:::o;27841:108::-;27918:24;27936:5;27918:24;:::i;:::-;27913:3;27906:37;27841:108;;:::o;27955:179::-;28024:10;28045:46;28087:3;28079:6;28045:46;:::i;:::-;28123:4;28118:3;28114:14;28100:28;;27955:179;;;;:::o;28140:113::-;28210:4;28242;28237:3;28233:14;28225:22;;28140:113;;;:::o;28289:732::-;28408:3;28437:54;28485:5;28437:54;:::i;:::-;28507:86;28586:6;28581:3;28507:86;:::i;:::-;28500:93;;28617:56;28667:5;28617:56;:::i;:::-;28696:7;28727:1;28712:284;28737:6;28734:1;28731:13;28712:284;;;28813:6;28807:13;28840:63;28899:3;28884:13;28840:63;:::i;:::-;28833:70;;28926:60;28979:6;28926:60;:::i;:::-;28916:70;;28772:224;28759:1;28756;28752:9;28747:14;;28712:284;;;28716:14;29012:3;29005:10;;28413:608;;;28289:732;;;;:::o;29027:517::-;29215:4;29253:2;29242:9;29238:18;29230:26;;29266:88;29351:1;29340:9;29336:17;29327:6;29266:88;:::i;:::-;29401:9;29395:4;29391:20;29386:2;29375:9;29371:18;29364:48;29429:108;29532:4;29523:6;29429:108;:::i;:::-;29421:116;;29027:517;;;;;:::o;29550:102::-;29591:6;29642:2;29638:7;29633:2;29626:5;29622:14;29618:28;29608:38;;29550:102;;;:::o;29658:281::-;29741:27;29763:4;29741:27;:::i;:::-;29733:6;29729:40;29871:6;29859:10;29856:22;29835:18;29823:10;29820:34;29817:62;29814:88;;;29882:18;;:::i;:::-;29814:88;29922:10;29918:2;29911:22;29701:238;29658:281;;:::o;29945:129::-;29979:6;30006:20;;:::i;:::-;29996:30;;30035:33;30063:4;30055:6;30035:33;:::i;:::-;29945:129;;;:::o;30080:311::-;30157:4;30247:18;30239:6;30236:30;30233:56;;;30269:18;;:::i;:::-;30233:56;30319:4;30311:6;30307:17;30299:25;;30379:4;30373;30369:15;30361:23;;30080:311;;;:::o;30414:732::-;30521:5;30546:81;30562:64;30619:6;30562:64;:::i;:::-;30546:81;:::i;:::-;30537:90;;30647:5;30676:6;30669:5;30662:21;30710:4;30703:5;30699:16;30692:23;;30763:4;30755:6;30751:17;30743:6;30739:30;30792:3;30784:6;30781:15;30778:122;;;30811:79;;:::i;:::-;30778:122;30926:6;30909:231;30943:6;30938:3;30935:15;30909:231;;;31018:3;31047:48;31091:3;31079:10;31047:48;:::i;:::-;31042:3;31035:61;31125:4;31120:3;31116:14;31109:21;;30985:155;30969:4;30964:3;30960:14;30953:21;;30909:231;;;30913:21;30527:619;;30414:732;;;;;:::o;31169:385::-;31251:5;31300:3;31293:4;31285:6;31281:17;31277:27;31267:122;;31308:79;;:::i;:::-;31267:122;31418:6;31412:13;31443:105;31544:3;31536:6;31529:4;31521:6;31517:17;31443:105;:::i;:::-;31434:114;;31257:297;31169:385;;;;:::o;31560:554::-;31655:6;31704:2;31692:9;31683:7;31679:23;31675:32;31672:119;;;31710:79;;:::i;:::-;31672:119;31851:1;31840:9;31836:17;31830:24;31881:18;31873:6;31870:30;31867:117;;;31903:79;;:::i;:::-;31867:117;32008:89;32089:7;32080:6;32069:9;32065:22;32008:89;:::i;:::-;31998:99;;31801:306;31560:554;;;;:::o;32120:170::-;32260:22;32256:1;32248:6;32244:14;32237:46;32120:170;:::o;32296:366::-;32438:3;32459:67;32523:2;32518:3;32459:67;:::i;:::-;32452:74;;32535:93;32624:3;32535:93;:::i;:::-;32653:2;32648:3;32644:12;32637:19;;32296:366;;;:::o;32668:419::-;32834:4;32872:2;32861:9;32857:18;32849:26;;32921:9;32915:4;32911:20;32907:1;32896:9;32892:17;32885:47;32949:131;33075:4;32949:131;:::i;:::-;32941:139;;32668:419;;;:::o;33093:232::-;33233:34;33229:1;33221:6;33217:14;33210:58;33302:15;33297:2;33289:6;33285:15;33278:40;33093:232;:::o;33331:366::-;33473:3;33494:67;33558:2;33553:3;33494:67;:::i;:::-;33487:74;;33570:93;33659:3;33570:93;:::i;:::-;33688:2;33683:3;33679:12;33672:19;;33331:366;;;:::o;33703:419::-;33869:4;33907:2;33896:9;33892:18;33884:26;;33956:9;33950:4;33946:20;33942:1;33931:9;33927:17;33920:47;33984:131;34110:4;33984:131;:::i;:::-;33976:139;;33703:419;;;:::o;34128:305::-;34168:3;34187:20;34205:1;34187:20;:::i;:::-;34182:25;;34221:20;34239:1;34221:20;:::i;:::-;34216:25;;34375:1;34307:66;34303:74;34300:1;34297:81;34294:107;;;34381:18;;:::i;:::-;34294:107;34425:1;34422;34418:9;34411:16;;34128:305;;;;:::o;34439:171::-;34579:23;34575:1;34567:6;34563:14;34556:47;34439:171;:::o;34616:366::-;34758:3;34779:67;34843:2;34838:3;34779:67;:::i;:::-;34772:74;;34855:93;34944:3;34855:93;:::i;:::-;34973:2;34968:3;34964:12;34957:19;;34616:366;;;:::o;34988:419::-;35154:4;35192:2;35181:9;35177:18;35169:26;;35241:9;35235:4;35231:20;35227:1;35216:9;35212:17;35205:47;35269:131;35395:4;35269:131;:::i;:::-;35261:139;;34988:419;;;:::o;35413:332::-;35534:4;35572:2;35561:9;35557:18;35549:26;;35585:71;35653:1;35642:9;35638:17;35629:6;35585:71;:::i;:::-;35666:72;35734:2;35723:9;35719:18;35710:6;35666:72;:::i;:::-;35413:332;;;;;:::o;35751:114::-;35788:7;35828:30;35821:5;35817:42;35806:53;;35751:114;;;:::o;35871:122::-;35944:24;35962:5;35944:24;:::i;:::-;35937:5;35934:35;35924:63;;35983:1;35980;35973:12;35924:63;35871:122;:::o;35999:143::-;36056:5;36087:6;36081:13;36072:22;;36103:33;36130:5;36103:33;:::i;:::-;35999:143;;;;:::o;36148:93::-;36184:7;36224:10;36217:5;36213:22;36202:33;;36148:93;;;:::o;36247:120::-;36319:23;36336:5;36319:23;:::i;:::-;36312:5;36309:34;36299:62;;36357:1;36354;36347:12;36299:62;36247:120;:::o;36373:141::-;36429:5;36460:6;36454:13;36445:22;;36476:32;36502:5;36476:32;:::i;:::-;36373:141;;;;:::o;36520:661::-;36607:6;36615;36623;36672:2;36660:9;36651:7;36647:23;36643:32;36640:119;;;36678:79;;:::i;:::-;36640:119;36798:1;36823:64;36879:7;36870:6;36859:9;36855:22;36823:64;:::i;:::-;36813:74;;36769:128;36936:2;36962:64;37018:7;37009:6;36998:9;36994:22;36962:64;:::i;:::-;36952:74;;36907:129;37075:2;37101:63;37156:7;37147:6;37136:9;37132:22;37101:63;:::i;:::-;37091:73;;37046:128;36520:661;;;;;:::o;37187:442::-;37336:4;37374:2;37363:9;37359:18;37351:26;;37387:71;37455:1;37444:9;37440:17;37431:6;37387:71;:::i;:::-;37468:72;37536:2;37525:9;37521:18;37512:6;37468:72;:::i;:::-;37550;37618:2;37607:9;37603:18;37594:6;37550:72;:::i;:::-;37187:442;;;;;;:::o;37635:172::-;37775:24;37771:1;37763:6;37759:14;37752:48;37635:172;:::o;37813:366::-;37955:3;37976:67;38040:2;38035:3;37976:67;:::i;:::-;37969:74;;38052:93;38141:3;38052:93;:::i;:::-;38170:2;38165:3;38161:12;38154:19;;37813:366;;;:::o;38185:419::-;38351:4;38389:2;38378:9;38374:18;38366:26;;38438:9;38432:4;38428:20;38424:1;38413:9;38409:17;38402:47;38466:131;38592:4;38466:131;:::i;:::-;38458:139;;38185:419;;;:::o;38610:182::-;38750:34;38746:1;38738:6;38734:14;38727:58;38610:182;:::o;38798:366::-;38940:3;38961:67;39025:2;39020:3;38961:67;:::i;:::-;38954:74;;39037:93;39126:3;39037:93;:::i;:::-;39155:2;39150:3;39146:12;39139:19;;38798:366;;;:::o;39170:419::-;39336:4;39374:2;39363:9;39359:18;39351:26;;39423:9;39417:4;39413:20;39409:1;39398:9;39394:17;39387:47;39451:131;39577:4;39451:131;:::i;:::-;39443:139;;39170:419;;;:::o;39595:94::-;39628:8;39676:5;39672:2;39668:14;39647:35;;39595:94;;;:::o;39695:::-;39734:7;39763:20;39777:5;39763:20;:::i;:::-;39752:31;;39695:94;;;:::o;39795:100::-;39834:7;39863:26;39883:5;39863:26;:::i;:::-;39852:37;;39795:100;;;:::o;39901:157::-;40006:45;40026:24;40044:5;40026:24;:::i;:::-;40006:45;:::i;:::-;40001:3;39994:58;39901:157;;:::o;40064:79::-;40103:7;40132:5;40121:16;;40064:79;;;:::o;40149:157::-;40254:45;40274:24;40292:5;40274:24;:::i;:::-;40254:45;:::i;:::-;40249:3;40242:58;40149:157;;:::o;40312:397::-;40452:3;40467:75;40538:3;40529:6;40467:75;:::i;:::-;40567:2;40562:3;40558:12;40551:19;;40580:75;40651:3;40642:6;40580:75;:::i;:::-;40680:2;40675:3;40671:12;40664:19;;40700:3;40693:10;;40312:397;;;;;:::o;40715:704::-;40942:4;40980:3;40969:9;40965:19;40957:27;;40994:71;41062:1;41051:9;41047:17;41038:6;40994:71;:::i;:::-;41112:9;41106:4;41102:20;41097:2;41086:9;41082:18;41075:48;41140:108;41243:4;41234:6;41140:108;:::i;:::-;41132:116;;41258:72;41326:2;41315:9;41311:18;41302:6;41258:72;:::i;:::-;41340;41408:2;41397:9;41393:18;41384:6;41340:72;:::i;:::-;40715:704;;;;;;;:::o
Swarm Source
ipfs://7448c608feff648cec745cc43e83a314c13406fc0122ab63d414f3409e8ec56d
Loading...LoadingLoading...Loading
Loading...Loading
Loading...LoadingLoading...LoadingLoading...LoadingLoading...LoadingLoading...LoadingLoading...LoadingMultichain Portfolio | 30 Chains
Chain Token Portfolio % Price Amount Value ETH Ether (ETH)100.00% $3,303.31 633.762 $2,093,514.87 Loading...Loading[ Download: CSV Export ][ Download: CSV Export ]A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.
Address QR Code
My Address - Private Name Tag or Note
My Name Tag:
Private Name Tags (up to 35 characters) can be used for easy identification of addressesPrivate Note:
A private note (up to 500 characters) can be attached to this address.
Please DO NOT store any passwords or private keys here.Compiler specific version warnings:
The compiled contract might be susceptible to VerbatimInvalidDeduplication (low-severity), FullInlinerNonExpressionSplitArgumentEvaluationOrder (low-severity), MissingSideEffectsOnSelectorAccess (low-severity), AbiReencodingHeadOverflowWithStaticArrayCleanup (medium-severity), DirtyBytesArrayToStorage (low-severity), DataLocationChangeInInternalOverride (very low-severity), NestedCalldataArrayAbiReencodingSizeValidation (very low-severity) Solidity Compiler Bugs.
Connect a Wallet
Connecting wallet for read function is optional, useful if you want to call certain functions or simply use your wallet's node.Connect a Wallet
Connecting wallet for read function is optional, useful if you want to call certain functions or simply use your wallet's node.Connect a Wallet
Connecting wallet for read function is optional, useful if you want to call certain functions or simply use your wallet's node.SignIn
Address Cards
To use this feature, please login to your Etherscan account and return to this page.Before You Copy
Transaction Private Note
This website uses cookies to improve your experience. By continuing to use this website, you agree to its Terms and Privacy Policy.