More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 365,239 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Multihop Batch S... | 22042979 | 10 days ago | IN | 0.00016281 ETH | 0.00006796 | ||||
Multihop Batch S... | 21751770 | 50 days ago | IN | 0.2 ETH | 0.01996574 | ||||
Multihop Batch S... | 20251111 | 260 days ago | IN | 0 ETH | 0.00005347 | ||||
Multihop Batch S... | 20149745 | 274 days ago | IN | 0.02 ETH | 0.00144891 | ||||
Multihop Batch S... | 18350479 | 526 days ago | IN | 0 ETH | 0.01272877 | ||||
Multihop Batch S... | 16899523 | 730 days ago | IN | 0.035 ETH | 0.0326395 | ||||
Multihop Batch S... | 16899523 | 730 days ago | IN | 0.035 ETH | 0.03214497 | ||||
Multihop Batch S... | 16899523 | 730 days ago | IN | 0.035 ETH | 0.03214497 | ||||
Multihop Batch S... | 16899523 | 730 days ago | IN | 0.037 ETH | 0.02991954 | ||||
Multihop Batch S... | 16899523 | 730 days ago | IN | 0.038 ETH | 0.02719563 | ||||
Multihop Batch S... | 16899523 | 730 days ago | IN | 0.038 ETH | 0.02719563 | ||||
Multihop Batch S... | 16899523 | 730 days ago | IN | 0.035 ETH | 0.02825048 | ||||
Multihop Batch S... | 16899523 | 730 days ago | IN | 0.04 ETH | 0.02818729 | ||||
Multihop Batch S... | 15965906 | 861 days ago | IN | 0.03 ETH | 0.04195598 | ||||
Multihop Batch S... | 15938011 | 865 days ago | IN | 15.27909854 ETH | 0.01620306 | ||||
Multihop Batch S... | 15937913 | 865 days ago | IN | 0 ETH | 0.01531186 | ||||
Multihop Batch S... | 15937624 | 865 days ago | IN | 13.57895208 ETH | 0.011024 | ||||
Multihop Batch S... | 15937513 | 865 days ago | IN | 16.98987868 ETH | 0.01520098 | ||||
Multihop Batch S... | 15937469 | 865 days ago | IN | 25.26617526 ETH | 0.01515943 | ||||
Multihop Batch S... | 15937404 | 865 days ago | IN | 0 ETH | 0.01828864 | ||||
Multihop Batch S... | 15937392 | 865 days ago | IN | 17.04885597 ETH | 0.01571835 | ||||
Multihop Batch S... | 15937386 | 865 days ago | IN | 17.04346709 ETH | 0.01528716 | ||||
Multihop Batch S... | 15937335 | 865 days ago | IN | 13.68907324 ETH | 0.01506235 | ||||
Multihop Batch S... | 15937210 | 865 days ago | IN | 16.1274612 ETH | 0.00493751 | ||||
Multihop Batch S... | 15937151 | 865 days ago | IN | 21.39268952 ETH | 0.0165157 |
Latest 25 internal transactions (View All)
Advanced mode:
Parent Transaction Hash | Method | Block |
From
|
To
|
|||
---|---|---|---|---|---|---|---|
Transfer | 22042979 | 10 days ago | 0.00016133 ETH | ||||
Transfer | 22042979 | 10 days ago | 0.00016133 ETH | ||||
Deposit | 22042979 | 10 days ago | 0.00016281 ETH | ||||
Deposit | 21751770 | 50 days ago | 0.2 ETH | ||||
Deposit | 20149745 | 274 days ago | 0.02 ETH | ||||
Transfer | 17824481 | 600 days ago | 0.05875725 ETH | ||||
Transfer | 17824481 | 600 days ago | 0.05875725 ETH | ||||
Transfer | 17801920 | 603 days ago | 0.0707045 ETH | ||||
Transfer | 17801920 | 603 days ago | 0.0707045 ETH | ||||
Transfer | 17662655 | 623 days ago | 0.05291963 ETH | ||||
Transfer | 17662655 | 623 days ago | 0.05291963 ETH | ||||
Deposit | 17331322 | 669 days ago | 0.1 ETH | ||||
Multihop Batch S... | 17331322 | 669 days ago | 0.1 ETH | ||||
Deposit | 16899523 | 730 days ago | 0.035 ETH | ||||
Deposit | 16899523 | 730 days ago | 0.035 ETH | ||||
Deposit | 16899523 | 730 days ago | 0.035 ETH | ||||
Deposit | 16899523 | 730 days ago | 0.037 ETH | ||||
Deposit | 16899523 | 730 days ago | 0.038 ETH | ||||
Deposit | 16899523 | 730 days ago | 0.038 ETH | ||||
Deposit | 16899523 | 730 days ago | 0.035 ETH | ||||
Deposit | 16899523 | 730 days ago | 0.04 ETH | ||||
Deposit | 15965906 | 861 days ago | 0.03 ETH | ||||
Transfer | 15938011 | 865 days ago | 0.01068788 ETH | ||||
Transfer | 15938011 | 865 days ago | 0.01068788 ETH | ||||
Deposit | 15938011 | 865 days ago | 15.27909854 ETH |
Loading...
Loading
Contract Name:
ExchangeProxy
Compiler Version
v0.5.12+commit.7709ece9
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2020-08-25 */ // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with this program. If not, see <http://www.gnu.org/licenses/>. pragma solidity 0.5.12; pragma experimental ABIEncoderV2; pragma solidity ^0.5.0; /** * @dev Wrappers over Solidity's arithmetic operations with added overflow * checks. * * Arithmetic operations in Solidity wrap on overflow. This can easily result * in bugs, because programmers usually assume that an overflow raises an * error, which is the standard behavior in high level programming languages. * `SafeMath` restores this intuition by reverting the transaction when an * operation overflows. * * Using this library instead of the unchecked operations eliminates an entire * class of bugs, so it's recommended to use it always. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c = a + b; require(c >= a, "SafeMath: addition overflow"); return c; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { return sub(a, b, "SafeMath: subtraction overflow"); } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * - Subtraction cannot overflow. * * _Available since v2.4.0._ */ function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b <= a, errorMessage); uint256 c = a - b; return c; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) { return 0; } uint256 c = a * b; require(c / a == b, "SafeMath: multiplication overflow"); return c; } /** * @dev Returns the integer division of two unsigned integers. Reverts on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { return div(a, b, "SafeMath: division by zero"); } /** * @dev Returns the integer division of two unsigned integers. Reverts with custom message on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * - The divisor cannot be zero. * * _Available since v2.4.0._ */ function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { // Solidity only automatically asserts when dividing by 0 require(b > 0, errorMessage); uint256 c = a / b; // assert(a == b * c + a % b); // There is no case in which this doesn't hold return c; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { return mod(a, b, "SafeMath: modulo by zero"); } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts with custom message when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * - The divisor cannot be zero. * * _Available since v2.4.0._ */ function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b != 0, errorMessage); return a % b; } } /* * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with GSN meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ contract Context { // Empty internal constructor, to prevent people from mistakenly deploying // an instance of this contract, which should be used via inheritance. constructor () internal { } // solhint-disable-previous-line no-empty-blocks function _msgSender() internal view returns (address payable) { return msg.sender; } function _msgData() internal view returns (bytes memory) { this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 return msg.data; } } /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor () internal { address msgSender = _msgSender(); _owner = msgSender; emit OwnershipTransferred(address(0), msgSender); } /** * @dev Returns the address of the current owner. */ function owner() public view returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(isOwner(), "Ownable: caller is not the owner"); _; } /** * @dev Returns true if the caller is the current owner. */ function isOwner() public view returns (bool) { return _msgSender() == _owner; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public onlyOwner { emit OwnershipTransferred(_owner, address(0)); _owner = address(0); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public onlyOwner { _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). */ function _transferOwnership(address newOwner) internal { require(newOwner != address(0), "Ownable: new owner is the zero address"); emit OwnershipTransferred(_owner, newOwner); _owner = newOwner; } } interface PoolInterface { function swapExactAmountIn(address, uint, address, uint, uint) external returns (uint, uint); function swapExactAmountOut(address, uint, address, uint, uint) external returns (uint, uint); function calcInGivenOut(uint, uint, uint, uint, uint, uint) external pure returns (uint); function calcOutGivenIn(uint, uint, uint, uint, uint, uint) external pure returns (uint); function getDenormalizedWeight(address) external view returns (uint); function getBalance(address) external view returns (uint); function getSwapFee() external view returns (uint); } interface TokenInterface { function balanceOf(address) external view returns (uint); function allowance(address, address) external view returns (uint); function approve(address, uint) external returns (bool); function transfer(address, uint) external returns (bool); function transferFrom(address, address, uint) external returns (bool); function deposit() external payable; function withdraw(uint) external; } interface RegistryInterface { function getBestPoolsWithLimit(address, address, uint) external view returns (address[] memory); } contract ExchangeProxy is Ownable { using SafeMath for uint256; struct Pool { address pool; uint tokenBalanceIn; uint tokenWeightIn; uint tokenBalanceOut; uint tokenWeightOut; uint swapFee; uint effectiveLiquidity; } struct Swap { address pool; address tokenIn; address tokenOut; uint swapAmount; // tokenInAmount / tokenOutAmount uint limitReturnAmount; // minAmountOut / maxAmountIn uint maxPrice; } TokenInterface weth; RegistryInterface registry; address private constant ETH_ADDRESS = address(0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE); uint private constant BONE = 10**18; constructor(address _weth) public { weth = TokenInterface(_weth); } function setRegistry(address _registry) external onlyOwner { registry = RegistryInterface(_registry); } function batchSwapExactIn( Swap[] memory swaps, TokenInterface tokenIn, TokenInterface tokenOut, uint totalAmountIn, uint minTotalAmountOut ) public payable returns (uint totalAmountOut) { transferFromAll(tokenIn, totalAmountIn); for (uint i = 0; i < swaps.length; i++) { Swap memory swap = swaps[i]; TokenInterface SwapTokenIn = TokenInterface(swap.tokenIn); PoolInterface pool = PoolInterface(swap.pool); if (SwapTokenIn.allowance(address(this), swap.pool) > 0) { SwapTokenIn.approve(swap.pool, 0); } SwapTokenIn.approve(swap.pool, swap.swapAmount); (uint tokenAmountOut,) = pool.swapExactAmountIn( swap.tokenIn, swap.swapAmount, swap.tokenOut, swap.limitReturnAmount, swap.maxPrice ); totalAmountOut = tokenAmountOut.add(totalAmountOut); } require(totalAmountOut >= minTotalAmountOut, "ERR_LIMIT_OUT"); transferAll(tokenOut, totalAmountOut); transferAll(tokenIn, getBalance(tokenIn)); } function batchSwapExactOut( Swap[] memory swaps, TokenInterface tokenIn, TokenInterface tokenOut, uint maxTotalAmountIn ) public payable returns (uint totalAmountIn) { transferFromAll(tokenIn, maxTotalAmountIn); for (uint i = 0; i < swaps.length; i++) { Swap memory swap = swaps[i]; TokenInterface SwapTokenIn = TokenInterface(swap.tokenIn); PoolInterface pool = PoolInterface(swap.pool); if (SwapTokenIn.allowance(address(this), swap.pool) > 0) { SwapTokenIn.approve(swap.pool, 0); } SwapTokenIn.approve(swap.pool, swap.limitReturnAmount); (uint tokenAmountIn,) = pool.swapExactAmountOut( swap.tokenIn, swap.limitReturnAmount, swap.tokenOut, swap.swapAmount, swap.maxPrice ); totalAmountIn = tokenAmountIn.add(totalAmountIn); } require(totalAmountIn <= maxTotalAmountIn, "ERR_LIMIT_IN"); transferAll(tokenOut, getBalance(tokenOut)); transferAll(tokenIn, getBalance(tokenIn)); } function multihopBatchSwapExactIn( Swap[][] memory swapSequences, TokenInterface tokenIn, TokenInterface tokenOut, uint totalAmountIn, uint minTotalAmountOut ) public payable returns (uint totalAmountOut) { transferFromAll(tokenIn, totalAmountIn); for (uint i = 0; i < swapSequences.length; i++) { uint tokenAmountOut; for (uint k = 0; k < swapSequences[i].length; k++) { Swap memory swap = swapSequences[i][k]; TokenInterface SwapTokenIn = TokenInterface(swap.tokenIn); if (k == 1) { // Makes sure that on the second swap the output of the first was used // so there is not intermediate token leftover swap.swapAmount = tokenAmountOut; } PoolInterface pool = PoolInterface(swap.pool); if (SwapTokenIn.allowance(address(this), swap.pool) > 0) { SwapTokenIn.approve(swap.pool, 0); } SwapTokenIn.approve(swap.pool, swap.swapAmount); (tokenAmountOut,) = pool.swapExactAmountIn( swap.tokenIn, swap.swapAmount, swap.tokenOut, swap.limitReturnAmount, swap.maxPrice ); } // This takes the amountOut of the last swap totalAmountOut = tokenAmountOut.add(totalAmountOut); } require(totalAmountOut >= minTotalAmountOut, "ERR_LIMIT_OUT"); transferAll(tokenOut, totalAmountOut); transferAll(tokenIn, getBalance(tokenIn)); } function multihopBatchSwapExactOut( Swap[][] memory swapSequences, TokenInterface tokenIn, TokenInterface tokenOut, uint maxTotalAmountIn ) public payable returns (uint totalAmountIn) { transferFromAll(tokenIn, maxTotalAmountIn); for (uint i = 0; i < swapSequences.length; i++) { uint tokenAmountInFirstSwap; // Specific code for a simple swap and a multihop (2 swaps in sequence) if (swapSequences[i].length == 1) { Swap memory swap = swapSequences[i][0]; TokenInterface SwapTokenIn = TokenInterface(swap.tokenIn); PoolInterface pool = PoolInterface(swap.pool); if (SwapTokenIn.allowance(address(this), swap.pool) > 0) { SwapTokenIn.approve(swap.pool, 0); } SwapTokenIn.approve(swap.pool, swap.limitReturnAmount); (tokenAmountInFirstSwap,) = pool.swapExactAmountOut( swap.tokenIn, swap.limitReturnAmount, swap.tokenOut, swap.swapAmount, swap.maxPrice ); } else { // Consider we are swapping A -> B and B -> C. The goal is to buy a given amount // of token C. But first we need to buy B with A so we can then buy C with B // To get the exact amount of C we then first need to calculate how much B we'll need: uint intermediateTokenAmount; // This would be token B as described above Swap memory secondSwap = swapSequences[i][1]; PoolInterface poolSecondSwap = PoolInterface(secondSwap.pool); intermediateTokenAmount = poolSecondSwap.calcInGivenOut( poolSecondSwap.getBalance(secondSwap.tokenIn), poolSecondSwap.getDenormalizedWeight(secondSwap.tokenIn), poolSecondSwap.getBalance(secondSwap.tokenOut), poolSecondSwap.getDenormalizedWeight(secondSwap.tokenOut), secondSwap.swapAmount, poolSecondSwap.getSwapFee() ); //// Buy intermediateTokenAmount of token B with A in the first pool Swap memory firstSwap = swapSequences[i][0]; TokenInterface FirstSwapTokenIn = TokenInterface(firstSwap.tokenIn); PoolInterface poolFirstSwap = PoolInterface(firstSwap.pool); if (FirstSwapTokenIn.allowance(address(this), firstSwap.pool) < uint(-1)) { FirstSwapTokenIn.approve(firstSwap.pool, uint(-1)); } (tokenAmountInFirstSwap,) = poolFirstSwap.swapExactAmountOut( firstSwap.tokenIn, firstSwap.limitReturnAmount, firstSwap.tokenOut, intermediateTokenAmount, // This is the amount of token B we need firstSwap.maxPrice ); //// Buy the final amount of token C desired TokenInterface SecondSwapTokenIn = TokenInterface(secondSwap.tokenIn); if (SecondSwapTokenIn.allowance(address(this), secondSwap.pool) < uint(-1)) { SecondSwapTokenIn.approve(secondSwap.pool, uint(-1)); } poolSecondSwap.swapExactAmountOut( secondSwap.tokenIn, secondSwap.limitReturnAmount, secondSwap.tokenOut, secondSwap.swapAmount, secondSwap.maxPrice ); } totalAmountIn = tokenAmountInFirstSwap.add(totalAmountIn); } require(totalAmountIn <= maxTotalAmountIn, "ERR_LIMIT_IN"); transferAll(tokenOut, getBalance(tokenOut)); transferAll(tokenIn, getBalance(tokenIn)); } function smartSwapExactIn( TokenInterface tokenIn, TokenInterface tokenOut, uint totalAmountIn, uint minTotalAmountOut, uint nPools ) public payable returns (uint totalAmountOut) { Swap[] memory swaps; if (isETH(tokenIn)) { (swaps,) = viewSplitExactIn(address(weth), address(tokenOut), totalAmountIn, nPools); } else if (isETH(tokenOut)){ (swaps,) = viewSplitExactIn(address(tokenIn), address(weth), totalAmountIn, nPools); } else { (swaps,) = viewSplitExactIn(address(tokenIn), address(tokenOut), totalAmountIn, nPools); } totalAmountOut = batchSwapExactIn(swaps, tokenIn, tokenOut, totalAmountIn, minTotalAmountOut); } function smartSwapExactOut( TokenInterface tokenIn, TokenInterface tokenOut, uint totalAmountOut, uint maxTotalAmountIn, uint nPools ) public payable returns (uint totalAmountIn) { Swap[] memory swaps; if (isETH(tokenIn)) { (swaps,) = viewSplitExactOut(address(weth), address(tokenOut), totalAmountOut, nPools); } else if (isETH(tokenOut)){ (swaps,) = viewSplitExactOut(address(tokenIn), address(weth), totalAmountOut, nPools); } else { (swaps,) = viewSplitExactOut(address(tokenIn), address(tokenOut), totalAmountOut, nPools); } totalAmountIn = batchSwapExactOut(swaps, tokenIn, tokenOut, maxTotalAmountIn); } function viewSplitExactIn( address tokenIn, address tokenOut, uint swapAmount, uint nPools ) public view returns (Swap[] memory swaps, uint totalOutput) { address[] memory poolAddresses = registry.getBestPoolsWithLimit(tokenIn, tokenOut, nPools); Pool[] memory pools = new Pool[](poolAddresses.length); uint sumEffectiveLiquidity; for (uint i = 0; i < poolAddresses.length; i++) { pools[i] = getPoolData(tokenIn, tokenOut, poolAddresses[i]); sumEffectiveLiquidity = sumEffectiveLiquidity.add(pools[i].effectiveLiquidity); } uint[] memory bestInputAmounts = new uint[](pools.length); uint totalInputAmount; for (uint i = 0; i < pools.length; i++) { bestInputAmounts[i] = swapAmount.mul(pools[i].effectiveLiquidity).div(sumEffectiveLiquidity); totalInputAmount = totalInputAmount.add(bestInputAmounts[i]); } if (totalInputAmount < swapAmount) { bestInputAmounts[0] = bestInputAmounts[0].add(swapAmount.sub(totalInputAmount)); } else { bestInputAmounts[0] = bestInputAmounts[0].sub(totalInputAmount.sub(swapAmount)); } swaps = new Swap[](pools.length); for (uint i = 0; i < pools.length; i++) { swaps[i] = Swap({ pool: pools[i].pool, tokenIn: tokenIn, tokenOut: tokenOut, swapAmount: bestInputAmounts[i], limitReturnAmount: 0, maxPrice: uint(-1) }); } totalOutput = calcTotalOutExactIn(bestInputAmounts, pools); return (swaps, totalOutput); } function viewSplitExactOut( address tokenIn, address tokenOut, uint swapAmount, uint nPools ) public view returns (Swap[] memory swaps, uint totalOutput) { address[] memory poolAddresses = registry.getBestPoolsWithLimit(tokenIn, tokenOut, nPools); Pool[] memory pools = new Pool[](poolAddresses.length); uint sumEffectiveLiquidity; for (uint i = 0; i < poolAddresses.length; i++) { pools[i] = getPoolData(tokenIn, tokenOut, poolAddresses[i]); sumEffectiveLiquidity = sumEffectiveLiquidity.add(pools[i].effectiveLiquidity); } uint[] memory bestInputAmounts = new uint[](pools.length); uint totalInputAmount; for (uint i = 0; i < pools.length; i++) { bestInputAmounts[i] = swapAmount.mul(pools[i].effectiveLiquidity).div(sumEffectiveLiquidity); totalInputAmount = totalInputAmount.add(bestInputAmounts[i]); } if (totalInputAmount < swapAmount) { bestInputAmounts[0] = bestInputAmounts[0].add(swapAmount.sub(totalInputAmount)); } else { bestInputAmounts[0] = bestInputAmounts[0].sub(totalInputAmount.sub(swapAmount)); } swaps = new Swap[](pools.length); for (uint i = 0; i < pools.length; i++) { swaps[i] = Swap({ pool: pools[i].pool, tokenIn: tokenIn, tokenOut: tokenOut, swapAmount: bestInputAmounts[i], limitReturnAmount: uint(-1), maxPrice: uint(-1) }); } totalOutput = calcTotalOutExactOut(bestInputAmounts, pools); return (swaps, totalOutput); } function getPoolData( address tokenIn, address tokenOut, address poolAddress ) internal view returns (Pool memory) { PoolInterface pool = PoolInterface(poolAddress); uint tokenBalanceIn = pool.getBalance(tokenIn); uint tokenBalanceOut = pool.getBalance(tokenOut); uint tokenWeightIn = pool.getDenormalizedWeight(tokenIn); uint tokenWeightOut = pool.getDenormalizedWeight(tokenOut); uint swapFee = pool.getSwapFee(); uint effectiveLiquidity = calcEffectiveLiquidity( tokenWeightIn, tokenBalanceOut, tokenWeightOut ); Pool memory returnPool = Pool({ pool: poolAddress, tokenBalanceIn: tokenBalanceIn, tokenWeightIn: tokenWeightIn, tokenBalanceOut: tokenBalanceOut, tokenWeightOut: tokenWeightOut, swapFee: swapFee, effectiveLiquidity: effectiveLiquidity }); return returnPool; } function calcEffectiveLiquidity( uint tokenWeightIn, uint tokenBalanceOut, uint tokenWeightOut ) internal pure returns (uint effectiveLiquidity) { // Bo * wi/(wi+wo) effectiveLiquidity = tokenWeightIn.mul(BONE).div( tokenWeightOut.add(tokenWeightIn) ).mul(tokenBalanceOut).div(BONE); return effectiveLiquidity; } function calcTotalOutExactIn( uint[] memory bestInputAmounts, Pool[] memory bestPools ) internal pure returns (uint totalOutput) { totalOutput = 0; for (uint i = 0; i < bestInputAmounts.length; i++) { uint output = PoolInterface(bestPools[i].pool).calcOutGivenIn( bestPools[i].tokenBalanceIn, bestPools[i].tokenWeightIn, bestPools[i].tokenBalanceOut, bestPools[i].tokenWeightOut, bestInputAmounts[i], bestPools[i].swapFee ); totalOutput = totalOutput.add(output); } return totalOutput; } function calcTotalOutExactOut( uint[] memory bestInputAmounts, Pool[] memory bestPools ) internal pure returns (uint totalOutput) { totalOutput = 0; for (uint i = 0; i < bestInputAmounts.length; i++) { uint output = PoolInterface(bestPools[i].pool).calcInGivenOut( bestPools[i].tokenBalanceIn, bestPools[i].tokenWeightIn, bestPools[i].tokenBalanceOut, bestPools[i].tokenWeightOut, bestInputAmounts[i], bestPools[i].swapFee ); totalOutput = totalOutput.add(output); } return totalOutput; } function transferFromAll(TokenInterface token, uint amount) internal returns(bool) { if (isETH(token)) { weth.deposit.value(msg.value)(); } else { require(token.transferFrom(msg.sender, address(this), amount), "ERR_TRANSFER_FAILED"); } } function getBalance(TokenInterface token) internal view returns (uint) { if (isETH(token)) { return weth.balanceOf(address(this)); } else { return token.balanceOf(address(this)); } } function transferAll(TokenInterface token, uint amount) internal returns(bool) { if (amount == 0) { return true; } if (isETH(token)) { weth.withdraw(amount); (bool xfer,) = msg.sender.call.value(amount)(""); require(xfer, "ERR_ETH_FAILED"); } else { require(token.transfer(msg.sender, amount), "ERR_TRANSFER_FAILED"); } } function isETH(TokenInterface token) internal pure returns(bool) { return (address(token) == ETH_ADDRESS); } function() external payable {} }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"address","name":"_weth","type":"address"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"payable":true,"stateMutability":"payable","type":"fallback"},{"constant":false,"inputs":[{"components":[{"internalType":"address","name":"pool","type":"address"},{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"address","name":"tokenOut","type":"address"},{"internalType":"uint256","name":"swapAmount","type":"uint256"},{"internalType":"uint256","name":"limitReturnAmount","type":"uint256"},{"internalType":"uint256","name":"maxPrice","type":"uint256"}],"internalType":"struct ExchangeProxy.Swap[]","name":"swaps","type":"tuple[]"},{"internalType":"contract TokenInterface","name":"tokenIn","type":"address"},{"internalType":"contract TokenInterface","name":"tokenOut","type":"address"},{"internalType":"uint256","name":"totalAmountIn","type":"uint256"},{"internalType":"uint256","name":"minTotalAmountOut","type":"uint256"}],"name":"batchSwapExactIn","outputs":[{"internalType":"uint256","name":"totalAmountOut","type":"uint256"}],"payable":true,"stateMutability":"payable","type":"function"},{"constant":false,"inputs":[{"components":[{"internalType":"address","name":"pool","type":"address"},{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"address","name":"tokenOut","type":"address"},{"internalType":"uint256","name":"swapAmount","type":"uint256"},{"internalType":"uint256","name":"limitReturnAmount","type":"uint256"},{"internalType":"uint256","name":"maxPrice","type":"uint256"}],"internalType":"struct ExchangeProxy.Swap[]","name":"swaps","type":"tuple[]"},{"internalType":"contract TokenInterface","name":"tokenIn","type":"address"},{"internalType":"contract TokenInterface","name":"tokenOut","type":"address"},{"internalType":"uint256","name":"maxTotalAmountIn","type":"uint256"}],"name":"batchSwapExactOut","outputs":[{"internalType":"uint256","name":"totalAmountIn","type":"uint256"}],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[],"name":"isOwner","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"components":[{"internalType":"address","name":"pool","type":"address"},{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"address","name":"tokenOut","type":"address"},{"internalType":"uint256","name":"swapAmount","type":"uint256"},{"internalType":"uint256","name":"limitReturnAmount","type":"uint256"},{"internalType":"uint256","name":"maxPrice","type":"uint256"}],"internalType":"struct ExchangeProxy.Swap[][]","name":"swapSequences","type":"tuple[][]"},{"internalType":"contract TokenInterface","name":"tokenIn","type":"address"},{"internalType":"contract TokenInterface","name":"tokenOut","type":"address"},{"internalType":"uint256","name":"totalAmountIn","type":"uint256"},{"internalType":"uint256","name":"minTotalAmountOut","type":"uint256"}],"name":"multihopBatchSwapExactIn","outputs":[{"internalType":"uint256","name":"totalAmountOut","type":"uint256"}],"payable":true,"stateMutability":"payable","type":"function"},{"constant":false,"inputs":[{"components":[{"internalType":"address","name":"pool","type":"address"},{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"address","name":"tokenOut","type":"address"},{"internalType":"uint256","name":"swapAmount","type":"uint256"},{"internalType":"uint256","name":"limitReturnAmount","type":"uint256"},{"internalType":"uint256","name":"maxPrice","type":"uint256"}],"internalType":"struct ExchangeProxy.Swap[][]","name":"swapSequences","type":"tuple[][]"},{"internalType":"contract TokenInterface","name":"tokenIn","type":"address"},{"internalType":"contract TokenInterface","name":"tokenOut","type":"address"},{"internalType":"uint256","name":"maxTotalAmountIn","type":"uint256"}],"name":"multihopBatchSwapExactOut","outputs":[{"internalType":"uint256","name":"totalAmountIn","type":"uint256"}],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"renounceOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_registry","type":"address"}],"name":"setRegistry","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"contract TokenInterface","name":"tokenIn","type":"address"},{"internalType":"contract TokenInterface","name":"tokenOut","type":"address"},{"internalType":"uint256","name":"totalAmountIn","type":"uint256"},{"internalType":"uint256","name":"minTotalAmountOut","type":"uint256"},{"internalType":"uint256","name":"nPools","type":"uint256"}],"name":"smartSwapExactIn","outputs":[{"internalType":"uint256","name":"totalAmountOut","type":"uint256"}],"payable":true,"stateMutability":"payable","type":"function"},{"constant":false,"inputs":[{"internalType":"contract TokenInterface","name":"tokenIn","type":"address"},{"internalType":"contract TokenInterface","name":"tokenOut","type":"address"},{"internalType":"uint256","name":"totalAmountOut","type":"uint256"},{"internalType":"uint256","name":"maxTotalAmountIn","type":"uint256"},{"internalType":"uint256","name":"nPools","type":"uint256"}],"name":"smartSwapExactOut","outputs":[{"internalType":"uint256","name":"totalAmountIn","type":"uint256"}],"payable":true,"stateMutability":"payable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"address","name":"tokenOut","type":"address"},{"internalType":"uint256","name":"swapAmount","type":"uint256"},{"internalType":"uint256","name":"nPools","type":"uint256"}],"name":"viewSplitExactIn","outputs":[{"components":[{"internalType":"address","name":"pool","type":"address"},{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"address","name":"tokenOut","type":"address"},{"internalType":"uint256","name":"swapAmount","type":"uint256"},{"internalType":"uint256","name":"limitReturnAmount","type":"uint256"},{"internalType":"uint256","name":"maxPrice","type":"uint256"}],"internalType":"struct ExchangeProxy.Swap[]","name":"swaps","type":"tuple[]"},{"internalType":"uint256","name":"totalOutput","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"address","name":"tokenOut","type":"address"},{"internalType":"uint256","name":"swapAmount","type":"uint256"},{"internalType":"uint256","name":"nPools","type":"uint256"}],"name":"viewSplitExactOut","outputs":[{"components":[{"internalType":"address","name":"pool","type":"address"},{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"address","name":"tokenOut","type":"address"},{"internalType":"uint256","name":"swapAmount","type":"uint256"},{"internalType":"uint256","name":"limitReturnAmount","type":"uint256"},{"internalType":"uint256","name":"maxPrice","type":"uint256"}],"internalType":"struct ExchangeProxy.Swap[]","name":"swaps","type":"tuple[]"},{"internalType":"uint256","name":"totalOutput","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"}]
Contract Creation Code
60806040523480156200001157600080fd5b506040516200358a3803806200358a8339810160408190526200003491620000d0565b6000620000496001600160e01b03620000b916565b600080546001600160a01b0319166001600160a01b0383169081178255604051929350917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a350600180546001600160a01b0319166001600160a01b039290921691909117905562000125565b3390565b8051620000ca816200010b565b92915050565b600060208284031215620000e357600080fd5b6000620000f18484620000bd565b949350505050565b60006001600160a01b038216620000ca565b6200011681620000f9565b81146200012257600080fd5b50565b61345580620001356000396000f3fe6080604052600436106100c25760003560e01c80638743ad581161007f578063a91ee0dc11610059578063a91ee0dc146101cd578063b40f39ee146101ed578063e2b3974614610200578063f2fde38b14610213576100c2565b80638743ad58146101765780638da5cb5b146101895780638f32d59b146101ab576100c2565b806321b0eb85146100c45780632db58134146100ed578063368bb1fc146101005780634b0f93fb1461012e578063715018a61461014e57806386b2ecc414610163575b005b6100d76100d2366004612d41565b610233565b6040516100e491906132b5565b60405180910390f35b6100d76100fb366004612caf565b6102b4565b34801561010c57600080fd5b5061012061011b366004612b32565b61059a565b6040516100e49291906131f6565b34801561013a57600080fd5b50610120610149366004612b32565b610947565b34801561015a57600080fd5b506100c2610c37565b6100d7610171366004612bc8565b610ca5565b6100d7610184366004612ce8565b611632565b34801561019557600080fd5b5061019e611908565b6040516100e491906130ec565b3480156101b757600080fd5b506101c0611917565b6040516100e49190613216565b3480156101d957600080fd5b506100c26101e8366004612b14565b61193b565b6100d76101fb366004612d41565b611981565b6100d761020e366004612c23565b6119f6565b34801561021f57600080fd5b506100c261022e366004612b14565b611cd2565b6000606061024087611d02565b156102655760015461025d906001600160a01b0316878786610947565b50905061029c565b61026e86611d02565b1561028c5760015461025d9088906001600160a01b03168786610947565b61029887878786610947565b5090505b6102a98188888888611632565b979650505050505050565b60006102c08483611d28565b5060005b8551811015610547576102d56127e4565b8682815181106102e157fe5b602090810291909101810151908101518151604051636eb1769f60e11b815292935090916000906001600160a01b0384169063dd62ed3e906103299030908690600401613108565b60206040518083038186803b15801561034157600080fd5b505afa158015610355573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506103799190810190612d87565b111561040357825160405163095ea7b360e01b81526001600160a01b0384169163095ea7b3916103af9190600090600401613181565b602060405180830381600087803b1580156103c957600080fd5b505af11580156103dd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506104019190810190612d23565b505b8251608084015160405163095ea7b360e01b81526001600160a01b0385169263095ea7b3926104349260040161319c565b602060405180830381600087803b15801561044e57600080fd5b505af1158015610462573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506104869190810190612d23565b5060208301516080840151604080860151606087015160a08801519251631f17a7a960e21b81526000956001600160a01b03881695637c5e9ea4956104d195929491936004016131aa565b6040805180830381600087803b1580156104ea57600080fd5b505af11580156104fe573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506105229190810190612da5565b509050610535818763ffffffff611e4a16565b955050600190930192506102c4915050565b50818111156105715760405162461bcd60e51b815260040161056890613265565b60405180910390fd5b6105838361057e85611e76565b611f39565b506105918461057e86611e76565b50949350505050565b60025460405163bfdbfc4360e01b815260609160009183916001600160a01b03169063bfdbfc43906105d4908a908a908990600401613166565b60006040518083038186803b1580156105ec57600080fd5b505afa158015610600573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526106289190810190612b93565b90506060815160405190808252806020026020018201604052801561066757816020015b610654612835565b81526020019060019003908161064c5790505b5090506000805b83518110156106e0576106958a8a86848151811061068857fe5b6020026020010151612068565b8382815181106106a157fe5b60200260200101819052506106d68382815181106106bb57fe5b602002602001015160c0015183611e4a90919063ffffffff16565b915060010161066e565b506060825160405190808252806020026020018201604052801561070e578160200160208202803883390190505b5090506000805b84518110156107a0576107588461074c87848151811061073157fe5b602002602001015160c001518d61234890919063ffffffff16565b9063ffffffff61238216565b83828151811061076457fe5b60200260200101818152505061079683828151811061077f57fe5b602002602001015183611e4a90919063ffffffff16565b9150600101610715565b50888110156107fd576107df6107bc8a8363ffffffff6123c416565b836000815181106107c957fe5b6020026020010151611e4a90919063ffffffff16565b826000815181106107ec57fe5b60200260200101818152505061084d565b610833610810828b63ffffffff6123c416565b8360008151811061081d57fe5b60200260200101516123c490919063ffffffff16565b8260008151811061084057fe5b6020026020010181815250505b835160405190808252806020026020018201604052801561088857816020015b6108756127e4565b81526020019060019003908161086d5790505b50965060005b845181101561092c576040518060c001604052808683815181106108ae57fe5b6020026020010151600001516001600160a01b031681526020018d6001600160a01b031681526020018c6001600160a01b031681526020018483815181106108f257fe5b60200260200101518152602001600019815260200160001981525088828151811061091957fe5b602090810291909101015260010161088e565b506109378285612406565b9550505050505094509492505050565b60025460405163bfdbfc4360e01b815260609160009183916001600160a01b03169063bfdbfc4390610981908a908a908990600401613166565b60006040518083038186803b15801561099957600080fd5b505afa1580156109ad573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526109d59190810190612b93565b905060608151604051908082528060200260200182016040528015610a1457816020015b610a01612835565b8152602001906001900390816109f95790505b5090506000805b8351811015610a6557610a358a8a86848151811061068857fe5b838281518110610a4157fe5b6020026020010181905250610a5b8382815181106106bb57fe5b9150600101610a1b565b5060608251604051908082528060200260200182016040528015610a93578160200160208202803883390190505b5090506000805b8451811015610ae757610ab68461074c87848151811061073157fe5b838281518110610ac257fe5b602002602001018181525050610add83828151811061077f57fe5b9150600101610a9a565b5088811015610b2157610b036107bc8a8363ffffffff6123c416565b82600081518110610b1057fe5b602002602001018181525050610b4e565b610b34610810828b63ffffffff6123c416565b82600081518110610b4157fe5b6020026020010181815250505b8351604051908082528060200260200182016040528015610b8957816020015b610b766127e4565b815260200190600190039081610b6e5790505b50965060005b8451811015610c2c576040518060c00160405280868381518110610baf57fe5b6020026020010151600001516001600160a01b031681526020018d6001600160a01b031681526020018c6001600160a01b03168152602001848381518110610bf357fe5b6020026020010151815260200160008152602001600019815250888281518110610c1957fe5b6020908102919091010152600101610b8f565b50610937828561255c565b610c3f611917565b610c5b5760405162461bcd60e51b815260040161056890613285565b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b6000610cb18483611d28565b5060005b8551811015610547576000868281518110610ccc57fe5b60200260200101515160011415610f5057610ce56127e4565b878381518110610cf157fe5b6020026020010151600081518110610d0557fe5b602090810291909101810151908101518151604051636eb1769f60e11b815292935090916000906001600160a01b0384169063dd62ed3e90610d4d9030908690600401613108565b60206040518083038186803b158015610d6557600080fd5b505afa158015610d79573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610d9d9190810190612d87565b1115610e2757825160405163095ea7b360e01b81526001600160a01b0384169163095ea7b391610dd39190600090600401613181565b602060405180830381600087803b158015610ded57600080fd5b505af1158015610e01573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610e259190810190612d23565b505b8251608084015160405163095ea7b360e01b81526001600160a01b0385169263095ea7b392610e589260040161319c565b602060405180830381600087803b158015610e7257600080fd5b505af1158015610e86573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610eaa9190810190612d23565b50806001600160a01b0316637c5e9ea484602001518560800151866040015187606001518860a001516040518663ffffffff1660e01b8152600401610ef39594939291906131aa565b6040805180830381600087803b158015610f0c57600080fd5b505af1158015610f20573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610f449190810190612da5565b50935061161792505050565b6000610f5a6127e4565b888481518110610f6657fe5b6020026020010151600181518110610f7a57fe5b60209081029190910181015180519181015160405163f8b2cb4f60e01b81529193506001600160a01b0383169163f8d6aed491839163f8b2cb4f91610fc1916004016130ec565b60206040518083038186803b158015610fd957600080fd5b505afa158015610fed573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506110119190810190612d87565b6020850151604051634a46c67360e11b81526001600160a01b0386169163948d8ce69161104191906004016130ec565b60206040518083038186803b15801561105957600080fd5b505afa15801561106d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506110919190810190612d87565b604080870151905163f8b2cb4f60e01b81526001600160a01b0387169163f8b2cb4f916110c191906004016130ec565b60206040518083038186803b1580156110d957600080fd5b505afa1580156110ed573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506111119190810190612d87565b6040808801519051634a46c67360e11b81526001600160a01b0388169163948d8ce69161114191906004016130ec565b60206040518083038186803b15801561115957600080fd5b505afa15801561116d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506111919190810190612d87565b8760600151876001600160a01b031663d4cadf686040518163ffffffff1660e01b815260040160206040518083038186803b1580156111cf57600080fd5b505afa1580156111e3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506112079190810190612d87565b6040518763ffffffff1660e01b8152600401611228969594939291906132c3565b60206040518083038186803b15801561124057600080fd5b505afa158015611254573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506112789190810190612d87565b92506112826127e4565b8a868151811061128e57fe5b60200260200101516000815181106112a257fe5b602090810291909101810151908101518151604051636eb1769f60e11b81529293509091600019906001600160a01b0384169063dd62ed3e906112eb9030908690600401613108565b60206040518083038186803b15801561130357600080fd5b505afa158015611317573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061133b9190810190612d87565b10156113c657825160405163095ea7b360e01b81526001600160a01b0384169163095ea7b39161137291906000199060040161319c565b602060405180830381600087803b15801561138c57600080fd5b505af11580156113a0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506113c49190810190612d23565b505b806001600160a01b0316637c5e9ea48460200151856080015186604001518a8860a001516040518663ffffffff1660e01b815260040161140a9594939291906131aa565b6040805180830381600087803b15801561142357600080fd5b505af1158015611437573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061145b9190810190612da5565b5060208601518651604051636eb1769f60e11b81529299509091600019916001600160a01b0384169163dd62ed3e9161149991309190600401613108565b60206040518083038186803b1580156114b157600080fd5b505afa1580156114c5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506114e99190810190612d87565b101561157457855160405163095ea7b360e01b81526001600160a01b0383169163095ea7b39161152091906000199060040161319c565b602060405180830381600087803b15801561153a57600080fd5b505af115801561154e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506115729190810190612d23565b505b846001600160a01b0316637c5e9ea48760200151886080015189604001518a606001518b60a001516040518663ffffffff1660e01b81526004016115bc9594939291906131aa565b6040805180830381600087803b1580156115d557600080fd5b505af11580156115e9573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061160d9190810190612da5565b5050505050505050505b611627818463ffffffff611e4a16565b925050600101610cb5565b600061163e8584611d28565b5060005b86518110156118c5576116536127e4565b87828151811061165f57fe5b602090810291909101810151908101518151604051636eb1769f60e11b815292935090916000906001600160a01b0384169063dd62ed3e906116a79030908690600401613108565b60206040518083038186803b1580156116bf57600080fd5b505afa1580156116d3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506116f79190810190612d87565b111561178157825160405163095ea7b360e01b81526001600160a01b0384169163095ea7b39161172d9190600090600401613181565b602060405180830381600087803b15801561174757600080fd5b505af115801561175b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061177f9190810190612d23565b505b8251606084015160405163095ea7b360e01b81526001600160a01b0385169263095ea7b3926117b29260040161319c565b602060405180830381600087803b1580156117cc57600080fd5b505af11580156117e0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506118049190810190612d23565b5060208301516060840151604080860151608087015160a08801519251638201aa3f60e01b81526000956001600160a01b03881695638201aa3f9561184f95929491936004016131aa565b6040805180830381600087803b15801561186857600080fd5b505af115801561187c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506118a09190810190612da5565b5090506118b3818763ffffffff611e4a16565b95505060019093019250611642915050565b50818110156118e65760405162461bcd60e51b815260040161056890613255565b6118f08482611f39565b506118fe8561057e87611e76565b5095945050505050565b6000546001600160a01b031690565b600080546001600160a01b031661192c6126ab565b6001600160a01b031614905090565b611943611917565b61195f5760405162461bcd60e51b815260040161056890613285565b600280546001600160a01b0319166001600160a01b0392909216919091179055565b6000606061198e87611d02565b156119b3576001546119ab906001600160a01b031687878661059a565b5090506119ea565b6119bc86611d02565b156119da576001546119ab9088906001600160a01b0316878661059a565b6119e68787878661059a565b5090505b6102a9818888876102b4565b6000611a028584611d28565b5060005b86518110156118c5576000805b888381518110611a1f57fe5b602002602001015151811015611cb657611a376127e4565b898481518110611a4357fe5b60200260200101518281518110611a5657fe5b602002602001015190506000816020015190508260011415611a7a57606082018490525b8151604051636eb1769f60e11b81526000906001600160a01b0384169063dd62ed3e90611aad9030908690600401613108565b60206040518083038186803b158015611ac557600080fd5b505afa158015611ad9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250611afd9190810190612d87565b1115611b8757825160405163095ea7b360e01b81526001600160a01b0384169163095ea7b391611b339190600090600401613181565b602060405180830381600087803b158015611b4d57600080fd5b505af1158015611b61573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250611b859190810190612d23565b505b8251606084015160405163095ea7b360e01b81526001600160a01b0385169263095ea7b392611bb89260040161319c565b602060405180830381600087803b158015611bd257600080fd5b505af1158015611be6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250611c0a9190810190612d23565b50806001600160a01b0316638201aa3f84602001518560600151866040015187608001518860a001516040518663ffffffff1660e01b8152600401611c539594939291906131aa565b6040805180830381600087803b158015611c6c57600080fd5b505af1158015611c80573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250611ca49190810190612da5565b5094505060019092019150611a139050565b50611cc7818463ffffffff611e4a16565b925050600101611a06565b611cda611917565b611cf65760405162461bcd60e51b815260040161056890613285565b611cff816126af565b50565b6001600160a01b03811673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee145b919050565b6000611d3383611d02565b15611da657600160009054906101000a90046001600160a01b03166001600160a01b031663d0e30db0346040518263ffffffff1660e01b81526004016000604051808303818588803b158015611d8857600080fd5b505af1158015611d9c573d6000803e3d6000fd5b5050505050611e44565b6040516323b872dd60e01b81526001600160a01b038416906323b872dd90611dd690339030908790600401613123565b602060405180830381600087803b158015611df057600080fd5b505af1158015611e04573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250611e289190810190612d23565b611e445760405162461bcd60e51b8152600401610568906132a5565b92915050565b600082820183811015611e6f5760405162461bcd60e51b815260040161056890613245565b9392505050565b6000611e8182611d02565b15611f0d576001546040516370a0823160e01b81526001600160a01b03909116906370a0823190611eb69030906004016130fa565b60206040518083038186803b158015611ece57600080fd5b505afa158015611ee2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250611f069190810190612d87565b9050611d23565b6040516370a0823160e01b81526001600160a01b038316906370a0823190611eb69030906004016130fa565b600081611f4857506001611e44565b611f5183611d02565b1561203a57600154604051632e1a7d4d60e01b81526001600160a01b0390911690632e1a7d4d90611f869085906004016132b5565b600060405180830381600087803b158015611fa057600080fd5b505af1158015611fb4573d6000803e3d6000fd5b505050506000336001600160a01b031683604051611fd1906130e1565b60006040518083038185875af1925050503d806000811461200e576040519150601f19603f3d011682016040523d82523d6000602084013e612013565b606091505b50509050806120345760405162461bcd60e51b815260040161056890613295565b50611e44565b60405163a9059cbb60e01b81526001600160a01b0384169063a9059cbb90611dd6903390869060040161314b565b612070612835565b60405163f8b2cb4f60e01b815282906000906001600160a01b0383169063f8b2cb4f906120a19089906004016130ec565b60206040518083038186803b1580156120b957600080fd5b505afa1580156120cd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506120f19190810190612d87565b90506000826001600160a01b031663f8b2cb4f876040518263ffffffff1660e01b815260040161212191906130ec565b60206040518083038186803b15801561213957600080fd5b505afa15801561214d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506121719190810190612d87565b90506000836001600160a01b031663948d8ce6896040518263ffffffff1660e01b81526004016121a191906130ec565b60206040518083038186803b1580156121b957600080fd5b505afa1580156121cd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506121f19190810190612d87565b90506000846001600160a01b031663948d8ce6896040518263ffffffff1660e01b815260040161222191906130ec565b60206040518083038186803b15801561223957600080fd5b505afa15801561224d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506122719190810190612d87565b90506000856001600160a01b031663d4cadf686040518163ffffffff1660e01b815260040160206040518083038186803b1580156122ae57600080fd5b505afa1580156122c2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506122e69190810190612d87565b905060006122f5848685612730565b90506122ff612835565b506040805160e0810182526001600160a01b038b16815260208101979097528601939093526060850193909352608084015260a083019190915260c08201529150509392505050565b60008261235757506000611e44565b8282028284828161236457fe5b0414611e6f5760405162461bcd60e51b815260040161056890613275565b6000611e6f83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250612781565b6000611e6f83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f7700008152506127b8565b6000805b835181101561255557600083828151811061242157fe5b6020026020010151600001516001600160a01b031663f8d6aed485848151811061244757fe5b60200260200101516020015186858151811061245f57fe5b60200260200101516040015187868151811061247757fe5b60200260200101516060015188878151811061248f57fe5b6020026020010151608001518a88815181106124a757fe5b60200260200101518a89815181106124bb57fe5b602002602001015160a001516040518763ffffffff1660e01b81526004016124e8969594939291906132c3565b60206040518083038186803b15801561250057600080fd5b505afa158015612514573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506125389190810190612d87565b905061254a838263ffffffff611e4a16565b92505060010161240a565b5092915050565b6000805b835181101561255557600083828151811061257757fe5b6020026020010151600001516001600160a01b031663ba9530a685848151811061259d57fe5b6020026020010151602001518685815181106125b557fe5b6020026020010151604001518786815181106125cd57fe5b6020026020010151606001518887815181106125e557fe5b6020026020010151608001518a88815181106125fd57fe5b60200260200101518a898151811061261157fe5b602002602001015160a001516040518763ffffffff1660e01b815260040161263e969594939291906132c3565b60206040518083038186803b15801561265657600080fd5b505afa15801561266a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061268e9190810190612d87565b90506126a0838263ffffffff611e4a16565b925050600101612560565b3390565b6001600160a01b0381166126d55760405162461bcd60e51b815260040161056890613235565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b6000612779670de0b6b3a764000061074c8561276d612755878a63ffffffff611e4a16565b61074c8a670de0b6b3a764000063ffffffff61234816565b9063ffffffff61234816565b949350505050565b600081836127a25760405162461bcd60e51b81526004016105689190613224565b5060008385816127ae57fe5b0495945050505050565b600081848411156127dc5760405162461bcd60e51b81526004016105689190613224565b505050900390565b6040518060c0016040528060006001600160a01b0316815260200160006001600160a01b0316815260200160006001600160a01b031681526020016000815260200160008152602001600081525090565b6040518060e0016040528060006001600160a01b031681526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b8035611e44816133e3565b8051611e44816133e3565b600082601f8301126128a257600080fd5b81516128b56128b082613339565b613312565b915081818352602084019350602081019050838560208402820111156128da57600080fd5b60005b8381101561290657816128f08882612886565b84525060209283019291909101906001016128dd565b5050505092915050565b600082601f83011261292157600080fd5b813561292f6128b082613339565b81815260209384019390925082018360005b838110156129065781358601612957888261296d565b8452506020928301929190910190600101612941565b600082601f83011261297e57600080fd5b813561298c6128b082613339565b915081818352602084019350602081019050838560c08402820111156129b157600080fd5b60005b8381101561290657816129c78882612a67565b84525060209092019160c091909101906001016129b4565b600082601f8301126129f057600080fd5b81356129fe6128b082613339565b915081818352602084019350602081019050838560c0840282011115612a2357600080fd5b60005b838110156129065781612a398882612a67565b84525060209092019160c09190910190600101612a26565b8051611e44816133f7565b8035611e4481613400565b600060c08284031215612a7957600080fd5b612a8360c0613312565b90506000612a91848461287b565b8252506020612aa28484830161287b565b6020830152506040612ab68482850161287b565b6040830152506060612aca84828501612afe565b6060830152506080612ade84828501612afe565b60808301525060a0612af284828501612afe565b60a08301525092915050565b8035611e4481613409565b8051611e4481613409565b600060208284031215612b2657600080fd5b6000612779848461287b565b60008060008060808587031215612b4857600080fd5b6000612b54878761287b565b9450506020612b658782880161287b565b9350506040612b7687828801612afe565b9250506060612b8787828801612afe565b91505092959194509250565b600060208284031215612ba557600080fd5b815167ffffffffffffffff811115612bbc57600080fd5b61277984828501612891565b60008060008060808587031215612bde57600080fd5b843567ffffffffffffffff811115612bf557600080fd5b612c0187828801612910565b9450506020612c1287828801612a5c565b9350506040612b7687828801612a5c565b600080600080600060a08688031215612c3b57600080fd5b853567ffffffffffffffff811115612c5257600080fd5b612c5e88828901612910565b9550506020612c6f88828901612a5c565b9450506040612c8088828901612a5c565b9350506060612c9188828901612afe565b9250506080612ca288828901612afe565b9150509295509295909350565b60008060008060808587031215612cc557600080fd5b843567ffffffffffffffff811115612cdc57600080fd5b612c01878288016129df565b600080600080600060a08688031215612d0057600080fd5b853567ffffffffffffffff811115612d1757600080fd5b612c5e888289016129df565b600060208284031215612d3557600080fd5b60006127798484612a51565b600080600080600060a08688031215612d5957600080fd5b6000612d658888612a5c565b9550506020612d7688828901612a5c565b9450506040612c8088828901612afe565b600060208284031215612d9957600080fd5b60006127798484612b09565b60008060408385031215612db857600080fd5b6000612dc48585612b09565b9250506020612dd585828601612b09565b9150509250929050565b6000612deb8383613062565b505060c00190565b612dfc81613397565b82525050565b612dfc8161336d565b6000612e1682613360565b612e208185613364565b9350612e2b8361335a565b8060005b83811015612e59578151612e438882612ddf565b9750612e4e8361335a565b925050600101612e2f565b509495945050505050565b612dfc81613378565b612dfc816133a2565b6000612e8182613360565b612e8b8185613364565b9350612e9b8185602086016133ad565b612ea4816133d9565b9093019392505050565b6000612ebb602683613364565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206181526564647265737360d01b602082015260400192915050565b6000612f03601b83613364565b7f536166654d6174683a206164646974696f6e206f766572666c6f770000000000815260200192915050565b6000612f3c600d83613364565b6c11549497d31253525517d3d555609a1b815260200192915050565b6000612f65600c83613364565b6b22a9292fa624a6a4aa2fa4a760a11b815260200192915050565b6000612f8d602183613364565b7f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f8152607760f81b602082015260400192915050565b6000612fd0602083613364565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572815260200192915050565b6000613009600e83613364565b6d11549497d1551217d1905253115160921b815260200192915050565b6000611e44600083611d23565b6000613040601383613364565b7211549497d514905394d1915497d19052531151606a1b815260200192915050565b805160c08301906130738482612e02565b5060208201516130866020850182612e02565b5060408201516130996040850182612e02565b5060608201516130ac60608501826130d8565b5060808201516130bf60808501826130d8565b5060a08201516130d260a08501826130d8565b50505050565b612dfc81613394565b6000611e4482613026565b60208101611e448284612e02565b60208101611e448284612df3565b604081016131168285612df3565b611e6f6020830184612e02565b606081016131318286612df3565b61313e6020830185612df3565b61277960408301846130d8565b604081016131598285612df3565b611e6f60208301846130d8565b606081016131748286612e02565b61313e6020830185612e02565b6040810161318f8285612e02565b611e6f6020830184612e6d565b604081016131598285612e02565b60a081016131b88288612e02565b6131c560208301876130d8565b6131d26040830186612e02565b6131df60608301856130d8565b6131ec60808301846130d8565b9695505050505050565b604080825281016132078185612e0b565b9050611e6f60208301846130d8565b60208101611e448284612e64565b60208082528101611e6f8184612e76565b60208082528101611e4481612eae565b60208082528101611e4481612ef6565b60208082528101611e4481612f2f565b60208082528101611e4481612f58565b60208082528101611e4481612f80565b60208082528101611e4481612fc3565b60208082528101611e4481612ffc565b60208082528101611e4481613033565b60208101611e4482846130d8565b60c081016132d182896130d8565b6132de60208301886130d8565b6132eb60408301876130d8565b6132f860608301866130d8565b61330560808301856130d8565b6102a960a08301846130d8565b60405181810167ffffffffffffffff8111828210171561333157600080fd5b604052919050565b600067ffffffffffffffff82111561335057600080fd5b5060209081020190565b60200190565b5190565b90815260200190565b6000611e4482613388565b151590565b6000611e448261336d565b6001600160a01b031690565b90565b6000611e448261337d565b6000611e4482613394565b60005b838110156133c85781810151838201526020016133b0565b838111156130d25750506000910152565b601f01601f191690565b6133ec8161336d565b8114611cff57600080fd5b6133ec81613378565b6133ec8161337d565b6133ec8161339456fea365627a7a723158206a7e6caac398936eb953c1ac962efbe4262c77bbec294e69ca633488f2701cb36c6578706572696d656e74616cf564736f6c634300050c0040000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2
Deployed Bytecode
0x6080604052600436106100c25760003560e01c80638743ad581161007f578063a91ee0dc11610059578063a91ee0dc146101cd578063b40f39ee146101ed578063e2b3974614610200578063f2fde38b14610213576100c2565b80638743ad58146101765780638da5cb5b146101895780638f32d59b146101ab576100c2565b806321b0eb85146100c45780632db58134146100ed578063368bb1fc146101005780634b0f93fb1461012e578063715018a61461014e57806386b2ecc414610163575b005b6100d76100d2366004612d41565b610233565b6040516100e491906132b5565b60405180910390f35b6100d76100fb366004612caf565b6102b4565b34801561010c57600080fd5b5061012061011b366004612b32565b61059a565b6040516100e49291906131f6565b34801561013a57600080fd5b50610120610149366004612b32565b610947565b34801561015a57600080fd5b506100c2610c37565b6100d7610171366004612bc8565b610ca5565b6100d7610184366004612ce8565b611632565b34801561019557600080fd5b5061019e611908565b6040516100e491906130ec565b3480156101b757600080fd5b506101c0611917565b6040516100e49190613216565b3480156101d957600080fd5b506100c26101e8366004612b14565b61193b565b6100d76101fb366004612d41565b611981565b6100d761020e366004612c23565b6119f6565b34801561021f57600080fd5b506100c261022e366004612b14565b611cd2565b6000606061024087611d02565b156102655760015461025d906001600160a01b0316878786610947565b50905061029c565b61026e86611d02565b1561028c5760015461025d9088906001600160a01b03168786610947565b61029887878786610947565b5090505b6102a98188888888611632565b979650505050505050565b60006102c08483611d28565b5060005b8551811015610547576102d56127e4565b8682815181106102e157fe5b602090810291909101810151908101518151604051636eb1769f60e11b815292935090916000906001600160a01b0384169063dd62ed3e906103299030908690600401613108565b60206040518083038186803b15801561034157600080fd5b505afa158015610355573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506103799190810190612d87565b111561040357825160405163095ea7b360e01b81526001600160a01b0384169163095ea7b3916103af9190600090600401613181565b602060405180830381600087803b1580156103c957600080fd5b505af11580156103dd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506104019190810190612d23565b505b8251608084015160405163095ea7b360e01b81526001600160a01b0385169263095ea7b3926104349260040161319c565b602060405180830381600087803b15801561044e57600080fd5b505af1158015610462573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506104869190810190612d23565b5060208301516080840151604080860151606087015160a08801519251631f17a7a960e21b81526000956001600160a01b03881695637c5e9ea4956104d195929491936004016131aa565b6040805180830381600087803b1580156104ea57600080fd5b505af11580156104fe573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506105229190810190612da5565b509050610535818763ffffffff611e4a16565b955050600190930192506102c4915050565b50818111156105715760405162461bcd60e51b815260040161056890613265565b60405180910390fd5b6105838361057e85611e76565b611f39565b506105918461057e86611e76565b50949350505050565b60025460405163bfdbfc4360e01b815260609160009183916001600160a01b03169063bfdbfc43906105d4908a908a908990600401613166565b60006040518083038186803b1580156105ec57600080fd5b505afa158015610600573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526106289190810190612b93565b90506060815160405190808252806020026020018201604052801561066757816020015b610654612835565b81526020019060019003908161064c5790505b5090506000805b83518110156106e0576106958a8a86848151811061068857fe5b6020026020010151612068565b8382815181106106a157fe5b60200260200101819052506106d68382815181106106bb57fe5b602002602001015160c0015183611e4a90919063ffffffff16565b915060010161066e565b506060825160405190808252806020026020018201604052801561070e578160200160208202803883390190505b5090506000805b84518110156107a0576107588461074c87848151811061073157fe5b602002602001015160c001518d61234890919063ffffffff16565b9063ffffffff61238216565b83828151811061076457fe5b60200260200101818152505061079683828151811061077f57fe5b602002602001015183611e4a90919063ffffffff16565b9150600101610715565b50888110156107fd576107df6107bc8a8363ffffffff6123c416565b836000815181106107c957fe5b6020026020010151611e4a90919063ffffffff16565b826000815181106107ec57fe5b60200260200101818152505061084d565b610833610810828b63ffffffff6123c416565b8360008151811061081d57fe5b60200260200101516123c490919063ffffffff16565b8260008151811061084057fe5b6020026020010181815250505b835160405190808252806020026020018201604052801561088857816020015b6108756127e4565b81526020019060019003908161086d5790505b50965060005b845181101561092c576040518060c001604052808683815181106108ae57fe5b6020026020010151600001516001600160a01b031681526020018d6001600160a01b031681526020018c6001600160a01b031681526020018483815181106108f257fe5b60200260200101518152602001600019815260200160001981525088828151811061091957fe5b602090810291909101015260010161088e565b506109378285612406565b9550505050505094509492505050565b60025460405163bfdbfc4360e01b815260609160009183916001600160a01b03169063bfdbfc4390610981908a908a908990600401613166565b60006040518083038186803b15801561099957600080fd5b505afa1580156109ad573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526109d59190810190612b93565b905060608151604051908082528060200260200182016040528015610a1457816020015b610a01612835565b8152602001906001900390816109f95790505b5090506000805b8351811015610a6557610a358a8a86848151811061068857fe5b838281518110610a4157fe5b6020026020010181905250610a5b8382815181106106bb57fe5b9150600101610a1b565b5060608251604051908082528060200260200182016040528015610a93578160200160208202803883390190505b5090506000805b8451811015610ae757610ab68461074c87848151811061073157fe5b838281518110610ac257fe5b602002602001018181525050610add83828151811061077f57fe5b9150600101610a9a565b5088811015610b2157610b036107bc8a8363ffffffff6123c416565b82600081518110610b1057fe5b602002602001018181525050610b4e565b610b34610810828b63ffffffff6123c416565b82600081518110610b4157fe5b6020026020010181815250505b8351604051908082528060200260200182016040528015610b8957816020015b610b766127e4565b815260200190600190039081610b6e5790505b50965060005b8451811015610c2c576040518060c00160405280868381518110610baf57fe5b6020026020010151600001516001600160a01b031681526020018d6001600160a01b031681526020018c6001600160a01b03168152602001848381518110610bf357fe5b6020026020010151815260200160008152602001600019815250888281518110610c1957fe5b6020908102919091010152600101610b8f565b50610937828561255c565b610c3f611917565b610c5b5760405162461bcd60e51b815260040161056890613285565b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b6000610cb18483611d28565b5060005b8551811015610547576000868281518110610ccc57fe5b60200260200101515160011415610f5057610ce56127e4565b878381518110610cf157fe5b6020026020010151600081518110610d0557fe5b602090810291909101810151908101518151604051636eb1769f60e11b815292935090916000906001600160a01b0384169063dd62ed3e90610d4d9030908690600401613108565b60206040518083038186803b158015610d6557600080fd5b505afa158015610d79573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610d9d9190810190612d87565b1115610e2757825160405163095ea7b360e01b81526001600160a01b0384169163095ea7b391610dd39190600090600401613181565b602060405180830381600087803b158015610ded57600080fd5b505af1158015610e01573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610e259190810190612d23565b505b8251608084015160405163095ea7b360e01b81526001600160a01b0385169263095ea7b392610e589260040161319c565b602060405180830381600087803b158015610e7257600080fd5b505af1158015610e86573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610eaa9190810190612d23565b50806001600160a01b0316637c5e9ea484602001518560800151866040015187606001518860a001516040518663ffffffff1660e01b8152600401610ef39594939291906131aa565b6040805180830381600087803b158015610f0c57600080fd5b505af1158015610f20573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610f449190810190612da5565b50935061161792505050565b6000610f5a6127e4565b888481518110610f6657fe5b6020026020010151600181518110610f7a57fe5b60209081029190910181015180519181015160405163f8b2cb4f60e01b81529193506001600160a01b0383169163f8d6aed491839163f8b2cb4f91610fc1916004016130ec565b60206040518083038186803b158015610fd957600080fd5b505afa158015610fed573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506110119190810190612d87565b6020850151604051634a46c67360e11b81526001600160a01b0386169163948d8ce69161104191906004016130ec565b60206040518083038186803b15801561105957600080fd5b505afa15801561106d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506110919190810190612d87565b604080870151905163f8b2cb4f60e01b81526001600160a01b0387169163f8b2cb4f916110c191906004016130ec565b60206040518083038186803b1580156110d957600080fd5b505afa1580156110ed573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506111119190810190612d87565b6040808801519051634a46c67360e11b81526001600160a01b0388169163948d8ce69161114191906004016130ec565b60206040518083038186803b15801561115957600080fd5b505afa15801561116d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506111919190810190612d87565b8760600151876001600160a01b031663d4cadf686040518163ffffffff1660e01b815260040160206040518083038186803b1580156111cf57600080fd5b505afa1580156111e3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506112079190810190612d87565b6040518763ffffffff1660e01b8152600401611228969594939291906132c3565b60206040518083038186803b15801561124057600080fd5b505afa158015611254573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506112789190810190612d87565b92506112826127e4565b8a868151811061128e57fe5b60200260200101516000815181106112a257fe5b602090810291909101810151908101518151604051636eb1769f60e11b81529293509091600019906001600160a01b0384169063dd62ed3e906112eb9030908690600401613108565b60206040518083038186803b15801561130357600080fd5b505afa158015611317573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061133b9190810190612d87565b10156113c657825160405163095ea7b360e01b81526001600160a01b0384169163095ea7b39161137291906000199060040161319c565b602060405180830381600087803b15801561138c57600080fd5b505af11580156113a0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506113c49190810190612d23565b505b806001600160a01b0316637c5e9ea48460200151856080015186604001518a8860a001516040518663ffffffff1660e01b815260040161140a9594939291906131aa565b6040805180830381600087803b15801561142357600080fd5b505af1158015611437573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061145b9190810190612da5565b5060208601518651604051636eb1769f60e11b81529299509091600019916001600160a01b0384169163dd62ed3e9161149991309190600401613108565b60206040518083038186803b1580156114b157600080fd5b505afa1580156114c5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506114e99190810190612d87565b101561157457855160405163095ea7b360e01b81526001600160a01b0383169163095ea7b39161152091906000199060040161319c565b602060405180830381600087803b15801561153a57600080fd5b505af115801561154e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506115729190810190612d23565b505b846001600160a01b0316637c5e9ea48760200151886080015189604001518a606001518b60a001516040518663ffffffff1660e01b81526004016115bc9594939291906131aa565b6040805180830381600087803b1580156115d557600080fd5b505af11580156115e9573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061160d9190810190612da5565b5050505050505050505b611627818463ffffffff611e4a16565b925050600101610cb5565b600061163e8584611d28565b5060005b86518110156118c5576116536127e4565b87828151811061165f57fe5b602090810291909101810151908101518151604051636eb1769f60e11b815292935090916000906001600160a01b0384169063dd62ed3e906116a79030908690600401613108565b60206040518083038186803b1580156116bf57600080fd5b505afa1580156116d3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506116f79190810190612d87565b111561178157825160405163095ea7b360e01b81526001600160a01b0384169163095ea7b39161172d9190600090600401613181565b602060405180830381600087803b15801561174757600080fd5b505af115801561175b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061177f9190810190612d23565b505b8251606084015160405163095ea7b360e01b81526001600160a01b0385169263095ea7b3926117b29260040161319c565b602060405180830381600087803b1580156117cc57600080fd5b505af11580156117e0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506118049190810190612d23565b5060208301516060840151604080860151608087015160a08801519251638201aa3f60e01b81526000956001600160a01b03881695638201aa3f9561184f95929491936004016131aa565b6040805180830381600087803b15801561186857600080fd5b505af115801561187c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506118a09190810190612da5565b5090506118b3818763ffffffff611e4a16565b95505060019093019250611642915050565b50818110156118e65760405162461bcd60e51b815260040161056890613255565b6118f08482611f39565b506118fe8561057e87611e76565b5095945050505050565b6000546001600160a01b031690565b600080546001600160a01b031661192c6126ab565b6001600160a01b031614905090565b611943611917565b61195f5760405162461bcd60e51b815260040161056890613285565b600280546001600160a01b0319166001600160a01b0392909216919091179055565b6000606061198e87611d02565b156119b3576001546119ab906001600160a01b031687878661059a565b5090506119ea565b6119bc86611d02565b156119da576001546119ab9088906001600160a01b0316878661059a565b6119e68787878661059a565b5090505b6102a9818888876102b4565b6000611a028584611d28565b5060005b86518110156118c5576000805b888381518110611a1f57fe5b602002602001015151811015611cb657611a376127e4565b898481518110611a4357fe5b60200260200101518281518110611a5657fe5b602002602001015190506000816020015190508260011415611a7a57606082018490525b8151604051636eb1769f60e11b81526000906001600160a01b0384169063dd62ed3e90611aad9030908690600401613108565b60206040518083038186803b158015611ac557600080fd5b505afa158015611ad9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250611afd9190810190612d87565b1115611b8757825160405163095ea7b360e01b81526001600160a01b0384169163095ea7b391611b339190600090600401613181565b602060405180830381600087803b158015611b4d57600080fd5b505af1158015611b61573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250611b859190810190612d23565b505b8251606084015160405163095ea7b360e01b81526001600160a01b0385169263095ea7b392611bb89260040161319c565b602060405180830381600087803b158015611bd257600080fd5b505af1158015611be6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250611c0a9190810190612d23565b50806001600160a01b0316638201aa3f84602001518560600151866040015187608001518860a001516040518663ffffffff1660e01b8152600401611c539594939291906131aa565b6040805180830381600087803b158015611c6c57600080fd5b505af1158015611c80573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250611ca49190810190612da5565b5094505060019092019150611a139050565b50611cc7818463ffffffff611e4a16565b925050600101611a06565b611cda611917565b611cf65760405162461bcd60e51b815260040161056890613285565b611cff816126af565b50565b6001600160a01b03811673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee145b919050565b6000611d3383611d02565b15611da657600160009054906101000a90046001600160a01b03166001600160a01b031663d0e30db0346040518263ffffffff1660e01b81526004016000604051808303818588803b158015611d8857600080fd5b505af1158015611d9c573d6000803e3d6000fd5b5050505050611e44565b6040516323b872dd60e01b81526001600160a01b038416906323b872dd90611dd690339030908790600401613123565b602060405180830381600087803b158015611df057600080fd5b505af1158015611e04573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250611e289190810190612d23565b611e445760405162461bcd60e51b8152600401610568906132a5565b92915050565b600082820183811015611e6f5760405162461bcd60e51b815260040161056890613245565b9392505050565b6000611e8182611d02565b15611f0d576001546040516370a0823160e01b81526001600160a01b03909116906370a0823190611eb69030906004016130fa565b60206040518083038186803b158015611ece57600080fd5b505afa158015611ee2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250611f069190810190612d87565b9050611d23565b6040516370a0823160e01b81526001600160a01b038316906370a0823190611eb69030906004016130fa565b600081611f4857506001611e44565b611f5183611d02565b1561203a57600154604051632e1a7d4d60e01b81526001600160a01b0390911690632e1a7d4d90611f869085906004016132b5565b600060405180830381600087803b158015611fa057600080fd5b505af1158015611fb4573d6000803e3d6000fd5b505050506000336001600160a01b031683604051611fd1906130e1565b60006040518083038185875af1925050503d806000811461200e576040519150601f19603f3d011682016040523d82523d6000602084013e612013565b606091505b50509050806120345760405162461bcd60e51b815260040161056890613295565b50611e44565b60405163a9059cbb60e01b81526001600160a01b0384169063a9059cbb90611dd6903390869060040161314b565b612070612835565b60405163f8b2cb4f60e01b815282906000906001600160a01b0383169063f8b2cb4f906120a19089906004016130ec565b60206040518083038186803b1580156120b957600080fd5b505afa1580156120cd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506120f19190810190612d87565b90506000826001600160a01b031663f8b2cb4f876040518263ffffffff1660e01b815260040161212191906130ec565b60206040518083038186803b15801561213957600080fd5b505afa15801561214d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506121719190810190612d87565b90506000836001600160a01b031663948d8ce6896040518263ffffffff1660e01b81526004016121a191906130ec565b60206040518083038186803b1580156121b957600080fd5b505afa1580156121cd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506121f19190810190612d87565b90506000846001600160a01b031663948d8ce6896040518263ffffffff1660e01b815260040161222191906130ec565b60206040518083038186803b15801561223957600080fd5b505afa15801561224d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506122719190810190612d87565b90506000856001600160a01b031663d4cadf686040518163ffffffff1660e01b815260040160206040518083038186803b1580156122ae57600080fd5b505afa1580156122c2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506122e69190810190612d87565b905060006122f5848685612730565b90506122ff612835565b506040805160e0810182526001600160a01b038b16815260208101979097528601939093526060850193909352608084015260a083019190915260c08201529150509392505050565b60008261235757506000611e44565b8282028284828161236457fe5b0414611e6f5760405162461bcd60e51b815260040161056890613275565b6000611e6f83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250612781565b6000611e6f83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f7700008152506127b8565b6000805b835181101561255557600083828151811061242157fe5b6020026020010151600001516001600160a01b031663f8d6aed485848151811061244757fe5b60200260200101516020015186858151811061245f57fe5b60200260200101516040015187868151811061247757fe5b60200260200101516060015188878151811061248f57fe5b6020026020010151608001518a88815181106124a757fe5b60200260200101518a89815181106124bb57fe5b602002602001015160a001516040518763ffffffff1660e01b81526004016124e8969594939291906132c3565b60206040518083038186803b15801561250057600080fd5b505afa158015612514573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506125389190810190612d87565b905061254a838263ffffffff611e4a16565b92505060010161240a565b5092915050565b6000805b835181101561255557600083828151811061257757fe5b6020026020010151600001516001600160a01b031663ba9530a685848151811061259d57fe5b6020026020010151602001518685815181106125b557fe5b6020026020010151604001518786815181106125cd57fe5b6020026020010151606001518887815181106125e557fe5b6020026020010151608001518a88815181106125fd57fe5b60200260200101518a898151811061261157fe5b602002602001015160a001516040518763ffffffff1660e01b815260040161263e969594939291906132c3565b60206040518083038186803b15801561265657600080fd5b505afa15801561266a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061268e9190810190612d87565b90506126a0838263ffffffff611e4a16565b925050600101612560565b3390565b6001600160a01b0381166126d55760405162461bcd60e51b815260040161056890613235565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b6000612779670de0b6b3a764000061074c8561276d612755878a63ffffffff611e4a16565b61074c8a670de0b6b3a764000063ffffffff61234816565b9063ffffffff61234816565b949350505050565b600081836127a25760405162461bcd60e51b81526004016105689190613224565b5060008385816127ae57fe5b0495945050505050565b600081848411156127dc5760405162461bcd60e51b81526004016105689190613224565b505050900390565b6040518060c0016040528060006001600160a01b0316815260200160006001600160a01b0316815260200160006001600160a01b031681526020016000815260200160008152602001600081525090565b6040518060e0016040528060006001600160a01b031681526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b8035611e44816133e3565b8051611e44816133e3565b600082601f8301126128a257600080fd5b81516128b56128b082613339565b613312565b915081818352602084019350602081019050838560208402820111156128da57600080fd5b60005b8381101561290657816128f08882612886565b84525060209283019291909101906001016128dd565b5050505092915050565b600082601f83011261292157600080fd5b813561292f6128b082613339565b81815260209384019390925082018360005b838110156129065781358601612957888261296d565b8452506020928301929190910190600101612941565b600082601f83011261297e57600080fd5b813561298c6128b082613339565b915081818352602084019350602081019050838560c08402820111156129b157600080fd5b60005b8381101561290657816129c78882612a67565b84525060209092019160c091909101906001016129b4565b600082601f8301126129f057600080fd5b81356129fe6128b082613339565b915081818352602084019350602081019050838560c0840282011115612a2357600080fd5b60005b838110156129065781612a398882612a67565b84525060209092019160c09190910190600101612a26565b8051611e44816133f7565b8035611e4481613400565b600060c08284031215612a7957600080fd5b612a8360c0613312565b90506000612a91848461287b565b8252506020612aa28484830161287b565b6020830152506040612ab68482850161287b565b6040830152506060612aca84828501612afe565b6060830152506080612ade84828501612afe565b60808301525060a0612af284828501612afe565b60a08301525092915050565b8035611e4481613409565b8051611e4481613409565b600060208284031215612b2657600080fd5b6000612779848461287b565b60008060008060808587031215612b4857600080fd5b6000612b54878761287b565b9450506020612b658782880161287b565b9350506040612b7687828801612afe565b9250506060612b8787828801612afe565b91505092959194509250565b600060208284031215612ba557600080fd5b815167ffffffffffffffff811115612bbc57600080fd5b61277984828501612891565b60008060008060808587031215612bde57600080fd5b843567ffffffffffffffff811115612bf557600080fd5b612c0187828801612910565b9450506020612c1287828801612a5c565b9350506040612b7687828801612a5c565b600080600080600060a08688031215612c3b57600080fd5b853567ffffffffffffffff811115612c5257600080fd5b612c5e88828901612910565b9550506020612c6f88828901612a5c565b9450506040612c8088828901612a5c565b9350506060612c9188828901612afe565b9250506080612ca288828901612afe565b9150509295509295909350565b60008060008060808587031215612cc557600080fd5b843567ffffffffffffffff811115612cdc57600080fd5b612c01878288016129df565b600080600080600060a08688031215612d0057600080fd5b853567ffffffffffffffff811115612d1757600080fd5b612c5e888289016129df565b600060208284031215612d3557600080fd5b60006127798484612a51565b600080600080600060a08688031215612d5957600080fd5b6000612d658888612a5c565b9550506020612d7688828901612a5c565b9450506040612c8088828901612afe565b600060208284031215612d9957600080fd5b60006127798484612b09565b60008060408385031215612db857600080fd5b6000612dc48585612b09565b9250506020612dd585828601612b09565b9150509250929050565b6000612deb8383613062565b505060c00190565b612dfc81613397565b82525050565b612dfc8161336d565b6000612e1682613360565b612e208185613364565b9350612e2b8361335a565b8060005b83811015612e59578151612e438882612ddf565b9750612e4e8361335a565b925050600101612e2f565b509495945050505050565b612dfc81613378565b612dfc816133a2565b6000612e8182613360565b612e8b8185613364565b9350612e9b8185602086016133ad565b612ea4816133d9565b9093019392505050565b6000612ebb602683613364565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206181526564647265737360d01b602082015260400192915050565b6000612f03601b83613364565b7f536166654d6174683a206164646974696f6e206f766572666c6f770000000000815260200192915050565b6000612f3c600d83613364565b6c11549497d31253525517d3d555609a1b815260200192915050565b6000612f65600c83613364565b6b22a9292fa624a6a4aa2fa4a760a11b815260200192915050565b6000612f8d602183613364565b7f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f8152607760f81b602082015260400192915050565b6000612fd0602083613364565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572815260200192915050565b6000613009600e83613364565b6d11549497d1551217d1905253115160921b815260200192915050565b6000611e44600083611d23565b6000613040601383613364565b7211549497d514905394d1915497d19052531151606a1b815260200192915050565b805160c08301906130738482612e02565b5060208201516130866020850182612e02565b5060408201516130996040850182612e02565b5060608201516130ac60608501826130d8565b5060808201516130bf60808501826130d8565b5060a08201516130d260a08501826130d8565b50505050565b612dfc81613394565b6000611e4482613026565b60208101611e448284612e02565b60208101611e448284612df3565b604081016131168285612df3565b611e6f6020830184612e02565b606081016131318286612df3565b61313e6020830185612df3565b61277960408301846130d8565b604081016131598285612df3565b611e6f60208301846130d8565b606081016131748286612e02565b61313e6020830185612e02565b6040810161318f8285612e02565b611e6f6020830184612e6d565b604081016131598285612e02565b60a081016131b88288612e02565b6131c560208301876130d8565b6131d26040830186612e02565b6131df60608301856130d8565b6131ec60808301846130d8565b9695505050505050565b604080825281016132078185612e0b565b9050611e6f60208301846130d8565b60208101611e448284612e64565b60208082528101611e6f8184612e76565b60208082528101611e4481612eae565b60208082528101611e4481612ef6565b60208082528101611e4481612f2f565b60208082528101611e4481612f58565b60208082528101611e4481612f80565b60208082528101611e4481612fc3565b60208082528101611e4481612ffc565b60208082528101611e4481613033565b60208101611e4482846130d8565b60c081016132d182896130d8565b6132de60208301886130d8565b6132eb60408301876130d8565b6132f860608301866130d8565b61330560808301856130d8565b6102a960a08301846130d8565b60405181810167ffffffffffffffff8111828210171561333157600080fd5b604052919050565b600067ffffffffffffffff82111561335057600080fd5b5060209081020190565b60200190565b5190565b90815260200190565b6000611e4482613388565b151590565b6000611e448261336d565b6001600160a01b031690565b90565b6000611e448261337d565b6000611e4482613394565b60005b838110156133c85781810151838201526020016133b0565b838111156130d25750506000910152565b601f01601f191690565b6133ec8161336d565b8114611cff57600080fd5b6133ec81613378565b6133ec8161337d565b6133ec8161339456fea365627a7a723158206a7e6caac398936eb953c1ac962efbe4262c77bbec294e69ca633488f2701cb36c6578706572696d656e74616cf564736f6c634300050c0040
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2
-----Decoded View---------------
Arg [0] : _weth (address): 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2
-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2
Deployed Bytecode Sourcemap
10924:20061:0:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21202:787;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;13324:1374;;;;;;;;;:::i;24627:1855::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;24627:1855:0;;;;;;;;:::i;:::-;;;;;;;;;22782:1837;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;22782:1837:0;;;;;;;;:::i;8973:140::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;8973:140:0;;;:::i;16636:4558::-;;;;;;;;;:::i;11922:1394::-;;;;;;;;;:::i;8162:79::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;8162:79:0;;;:::i;:::-;;;;;;;;8528:94;;8:9:-1;5:2;;;30:1;27;20:12;5:2;8528:94:0;;;:::i;:::-;;;;;;;;11797:117;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;11797:117:0;;;;;;;;:::i;21997:777::-;;;;;;;;;:::i;14706:1922::-;;;;;;;;;:::i;9268:109::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;9268:109:0;;;;;;;;:::i;21202:787::-;21428:19;21465;21499:14;21505:7;21499:5;:14::i;:::-;21495:381;;;21564:4;;21539:73;;-1:-1:-1;;;;;21564:4:0;21579:8;21590:13;21605:6;21539:16;:73::i;:::-;-1:-1:-1;21528:84:0;-1:-1:-1;21495:381:0;;;21634:15;21640:8;21634:5;:15::i;:::-;21630:246;;;21717:4;;21674:72;;21699:7;;-1:-1:-1;;;;;21717:4:0;21724:13;21739:6;21674:16;:72::i;21630:246::-;21788:76;21813:7;21831:8;21842:13;21857:6;21788:16;:76::i;:::-;-1:-1:-1;21777:87:0;-1:-1:-1;21630:246:0;21905:76;21922:5;21929:7;21938:8;21948:13;21963:17;21905:16;:76::i;:::-;21888:93;21202:787;-1:-1:-1;;;;;;;21202:787:0:o;13324:1374::-;13529:18;13565:42;13581:7;13590:16;13565:15;:42::i;:::-;-1:-1:-1;13625:6:0;13620:892;13641:5;:12;13637:1;:16;13620:892;;;13675:16;;:::i;:::-;13694:5;13700:1;13694:8;;;;;;;;;;;;;;;;;;;13761:12;;;;13824:9;;13855:47;;-1:-1:-1;;;13855:47:0;;13694:8;;-1:-1:-1;13761:12:0;;13717:26;;-1:-1:-1;;;;;13855:21:0;;;;;:47;;13885:4;;13824:9;;13855:47;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;13855:47:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;13855:47:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;13855:47:0;;;;;;;;;:51;13851:125;;;13947:9;;13927:33;;-1:-1:-1;;;13927:33:0;;-1:-1:-1;;;;;13927:19:0;;;;;:33;;13947:9;;;13927:33;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;13927:33:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;13927:33:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;13927:33:0;;;;;;;;;;13851:125;14010:9;;14021:22;;;;13990:54;;-1:-1:-1;;;13990:54:0;;-1:-1:-1;;;;;13990:19:0;;;;;:54;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;13990:54:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;13990:54:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;13990:54:0;;;;;;;;;-1:-1:-1;14151:12:0;;;;14206:22;;;;14271:13;;;;;14327:15;;;;14385:13;;;;14085:352;;-1:-1:-1;;;14085:352:0;;14062:18;;-1:-1:-1;;;;;14085:23:0;;;;;:352;;14151:12;;14206:22;;14085:352;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;14085:352:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;14085:352:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;14085:352:0;;;;;;;;;-1:-1:-1;14061:376:0;-1:-1:-1;14468:32:0;14061:376;14486:13;14468:32;:17;:32;:::i;:::-;14452:48;-1:-1:-1;;13655:3:0;;;;;-1:-1:-1;13620:892:0;;-1:-1:-1;;13620:892:0;;;14547:16;14530:13;:33;;14522:58;;;;-1:-1:-1;;;14522:58:0;;;;;;;;;;;;;;;;;14593:43;14605:8;14615:20;14626:8;14615:10;:20::i;:::-;14593:11;:43::i;:::-;;14647:41;14659:7;14668:19;14679:7;14668:10;:19::i;14647:41::-;;13324:1374;;;;;;:::o;24627:1855::-;24889:8;;:57;;-1:-1:-1;;;24889:57:0;;24801:19;;24822:16;;24801:19;;-1:-1:-1;;;;;24889:8:0;;:30;;:57;;24920:7;;24929:8;;24939:6;;24889:57;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;24889:57:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;24889:57:0;;;;;;39:16:-1;36:1;17:17;2:54;101:4;24889:57:0;80:15:-1;;;-1:-1;;76:31;65:43;;120:4;113:20;24889:57:0;;;;;;;;;24856:90;;24959:19;24992:13;:20;24981:32;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;-1:-1:-1;24959:54:0;-1:-1:-1;25024:26:0;;25061:227;25082:13;:20;25078:1;:24;25061:227;;;25135:48;25147:7;25156:8;25166:13;25180:1;25166:16;;;;;;;;;;;;;;25135:11;:48::i;:::-;25124:5;25130:1;25124:8;;;;;;;;;;;;;:59;;;;25222:54;25248:5;25254:1;25248:8;;;;;;;;;;;;;;:27;;;25222:21;:25;;:54;;;;:::i;:::-;25198:78;-1:-1:-1;25104:3:0;;25061:227;;;;25300:30;25344:5;:12;25333:24;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;136:17;;-1:-1;25333:24:0;-1:-1:-1;25300:57:0;-1:-1:-1;25368:21:0;;25400:234;25421:5;:12;25417:1;:16;25400:234;;;25477:70;25525:21;25477:43;25492:5;25498:1;25492:8;;;;;;;;;;;;;;:27;;;25477:10;:14;;:43;;;;:::i;:::-;:47;:70;:47;:70;:::i;:::-;25455:16;25472:1;25455:19;;;;;;;;;;;;;:92;;;;;25581:41;25602:16;25619:1;25602:19;;;;;;;;;;;;;;25581:16;:20;;:41;;;;:::i;:::-;25562:60;-1:-1:-1;25435:3:0;;25400:234;;;;25678:10;25659:16;:29;25655:253;;;25727:57;25751:32;:10;25766:16;25751:32;:14;:32;:::i;:::-;25727:16;25744:1;25727:19;;;;;;;;;;;;;;:23;;:57;;;;:::i;:::-;25705:16;25722:1;25705:19;;;;;;;;;;;;;:79;;;;;25655:253;;;25839:57;25863:32;:16;25884:10;25863:32;:20;:32;:::i;:::-;25839:16;25856:1;25839:19;;;;;;;;;;;;;;:23;;:57;;;;:::i;:::-;25817:16;25834:1;25817:19;;;;;;;;;;;;;:79;;;;;25655:253;25939:5;:12;25928:24;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;-1:-1:-1;25920:32:0;-1:-1:-1;25970:6:0;25965:398;25986:5;:12;25982:1;:16;25965:398;;;26031:320;;;;;;;;26069:5;26075:1;26069:8;;;;;;;;;;;;;;:13;;;-1:-1:-1;;;;;26031:320:0;;;;;26118:7;-1:-1:-1;;;;;26031:320:0;;;;;26162:8;-1:-1:-1;;;;;26031:320:0;;;;;26209:16;26226:1;26209:19;;;;;;;;;;;;;;26031:320;;;;-1:-1:-1;;26031:320:0;;;;-1:-1:-1;;26031:320:0;;;26020:5;26026:1;26020:8;;;;;;;;;;;;;;;;;:331;26000:3;;25965:398;;;;26389:45;26410:16;26428:5;26389:20;:45::i;:::-;26375:59;-1:-1:-1;;;;;;24627:1855:0;;;;;;;:::o;22782:1837::-;23043:8;;:57;;-1:-1:-1;;;23043:57:0;;22955:19;;22976:16;;22955:19;;-1:-1:-1;;;;;23043:8:0;;:30;;:57;;23074:7;;23083:8;;23093:6;;23043:57;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;23043:57:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;23043:57:0;;;;;;39:16:-1;36:1;17:17;2:54;101:4;23043:57:0;80:15:-1;;;-1:-1;;76:31;65:43;;120:4;113:20;23043:57:0;;;;;;;;;23010:90;;23113:19;23146:13;:20;23135:32;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;-1:-1:-1;23113:54:0;-1:-1:-1;23178:26:0;;23215:227;23236:13;:20;23232:1;:24;23215:227;;;23289:48;23301:7;23310:8;23320:13;23334:1;23320:16;;;;;;;23289:48;23278:5;23284:1;23278:8;;;;;;;;;;;;;:59;;;;23376:54;23402:5;23408:1;23402:8;;;;;;;23376:54;23352:78;-1:-1:-1;23258:3:0;;23215:227;;;;23454:30;23498:5;:12;23487:24;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;136:17;;-1:-1;23487:24:0;-1:-1:-1;23454:57:0;-1:-1:-1;23522:21:0;;23554:234;23575:5;:12;23571:1;:16;23554:234;;;23631:70;23679:21;23631:43;23646:5;23652:1;23646:8;;;;;;;23631:70;23609:16;23626:1;23609:19;;;;;;;;;;;;;:92;;;;;23735:41;23756:16;23773:1;23756:19;;;;;;;23735:41;23716:60;-1:-1:-1;23589:3:0;;23554:234;;;;23823:10;23804:16;:29;23800:253;;;23872:57;23896:32;:10;23911:16;23896:32;:14;:32;:::i;23872:57::-;23850:16;23867:1;23850:19;;;;;;;;;;;;;:79;;;;;23800:253;;;23984:57;24008:32;:16;24029:10;24008:32;:20;:32;:::i;23984:57::-;23962:16;23979:1;23962:19;;;;;;;;;;;;;:79;;;;;23800:253;24084:5;:12;24073:24;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;-1:-1:-1;24065:32:0;-1:-1:-1;24115:6:0;24110:391;24131:5;:12;24127:1;:16;24110:391;;;24176:313;;;;;;;;24214:5;24220:1;24214:8;;;;;;;;;;;;;;:13;;;-1:-1:-1;;;;;24176:313:0;;;;;24263:7;-1:-1:-1;;;;;24176:313:0;;;;;24307:8;-1:-1:-1;;;;;24176:313:0;;;;;24354:16;24371:1;24354:19;;;;;;;;;;;;;;24176:313;;;;24419:1;24176:313;;;;-1:-1:-1;;24176:313:0;;;24165:5;24171:1;24165:8;;;;;;;;;;;;;;;;;:324;24145:3;;24110:391;;;;24527:44;24547:16;24565:5;24527:19;:44::i;8973:140::-;8374:9;:7;:9::i;:::-;8366:54;;;;-1:-1:-1;;;8366:54:0;;;;;;;;;9072:1;9056:6;;9035:40;;-1:-1:-1;;;;;9056:6:0;;;;9035:40;;9072:1;;9035:40;9103:1;9086:19;;-1:-1:-1;;;;;;9086:19:0;;;8973:140::o;16636:4558::-;16859:18;16897:42;16913:7;16922:16;16897:15;:42::i;:::-;-1:-1:-1;16957:6:0;16952:4054;16973:13;:20;16969:1;:24;16952:4054;;;17015:27;17146:13;17160:1;17146:16;;;;;;;;;;;;;;:23;17173:1;17146:28;17142:3781;;;17195:16;;:::i;:::-;17214:13;17228:1;17214:16;;;;;;;;;;;;;;17231:1;17214:19;;;;;;;;;;;;;;;;;;;17296:12;;;;17365:9;;17398:47;;-1:-1:-1;;;17398:47:0;;17214:19;;-1:-1:-1;17296:12:0;;17252:26;;-1:-1:-1;;;;;17398:21:0;;;;;:47;;17428:4;;17365:9;;17398:47;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;17398:47:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;17398:47:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;17398:47:0;;;;;;;;;:51;17394:133;;;17494:9;;17474:33;;-1:-1:-1;;;17474:33:0;;-1:-1:-1;;;;;17474:19:0;;;;;:33;;17494:9;;;17474:33;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;17474:33:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;17474:33:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;17474:33:0;;;;;;;;;;17394:133;17565:9;;17576:22;;;;17545:54;;-1:-1:-1;;;17545:54:0;;-1:-1:-1;;;;;17545:19:0;;;;;:54;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;17545:54:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;17545:54:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;17545:54:0;;;;;;;;;;17648:4;-1:-1:-1;;;;;17648:23:0;;17714:4;:12;;;17769:4;:22;;;17834:4;:13;;;17890:4;:15;;;17948:4;:13;;;17648:352;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;17648:352:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;17648:352:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;17648:352:0;;;;;;;;;-1:-1:-1;17620:380:0;-1:-1:-1;17142:3781:0;;-1:-1:-1;;;17142:3781:0;;18337:28;18428:22;;:::i;:::-;18453:13;18467:1;18453:16;;;;;;;;;;;;;;18470:1;18453:19;;;;;;;;;;;;;;;;;;;18536:15;;18695:18;;;;18669:45;;-1:-1:-1;;;18669:45:0;;18453:19;;-1:-1:-1;;;;;;18597:29:0;;;;;;;18669:25;;:45;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;18669:45:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;18669:45:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;18669:45:0;;;;;;;;;18794:18;;;;18757:56;;-1:-1:-1;;;18757:56:0;;-1:-1:-1;;;;;18757:36:0;;;;;:56;;18794:18;18757:56;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;18757:56:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;18757:56:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;18757:56:0;;;;;;;;;18882:19;;;;;18856:46;;-1:-1:-1;;;18856:46:0;;-1:-1:-1;;;;;18856:25:0;;;;;:46;;18882:19;18856:46;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;18856:46:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;18856:46:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;18856:46:0;;;;;;;;;18982:19;;;;;18945:57;;-1:-1:-1;;;18945:57:0;;-1:-1:-1;;;;;18945:36:0;;;;;:57;;18982:19;18945:57;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;18945:57:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;18945:57:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;18945:57:0;;;;;;;;;19045:10;:21;;;19109:14;-1:-1:-1;;;;;19109:25:0;;:27;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;19109:27:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;19109:27:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;19109:27:0;;;;;;;;;18597:578;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;18597:578:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;18597:578:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;18597:578:0;;;;;;;;;18571:604;;19282:21;;:::i;:::-;19306:13;19320:1;19306:16;;;;;;;;;;;;;;19323:1;19306:19;;;;;;;;;;;;;;;;;;;19393:17;;;;19474:14;;19512:57;;-1:-1:-1;;;19512:57:0;;19306:19;;-1:-1:-1;19393:17:0;;-1:-1:-1;;19577:2:0;-1:-1:-1;;;;;19512:26:0;;;;;:57;;19547:4;;19474:14;;19512:57;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;19512:57:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;19512:57:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;19512:57:0;;;;;;;;;:68;19508:167;;;19630:14;;19605:50;;-1:-1:-1;;;19605:50:0;;-1:-1:-1;;;;;19605:24:0;;;;;:50;;19630:14;-1:-1:-1;;19651:2:0;19605:50;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;19605:50:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;19605:50:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;19605:50:0;;;;;;;;;;19508:167;19723:13;-1:-1:-1;;;;;19723:32:0;;19798:9;:17;;;19858:9;:27;;;19928:9;:18;;;19989:23;20096:9;:18;;;19723:430;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;19723:430:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;19723:430:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;19723:430:0;;;;;;;;;-1:-1:-1;20286:18:0;;;;20371:15;;20328:59;;-1:-1:-1;;;20328:59:0;;19695:458;;-1:-1:-1;20286:18:0;;-1:-1:-1;;20395:2:0;-1:-1:-1;;;;;20328:27:0;;;;;:59;;20364:4;;20371:15;20328:59;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;20328:59:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;20328:59:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;20328:59:0;;;;;;;;;:70;20324:171;;;20449:15;;20423:52;;-1:-1:-1;;;20423:52:0;;-1:-1:-1;;;;;20423:25:0;;;;;:52;;20449:15;-1:-1:-1;;20471:2:0;20423:52;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;20423:52:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;20423:52:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;20423:52:0;;;;;;;;;;20324:171;20515:14;-1:-1:-1;;;;;20515:33:0;;20591:10;:18;;;20652:10;:28;;;20723:10;:19;;;20785:10;:21;;;20849:10;:19;;;20515:392;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;20515:392:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;20515:392:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;20515:392:0;;;;;;;;;;;17142:3781;;;;;;;;20953:41;:22;20980:13;20953:41;:26;:41;:::i;:::-;20937:57;-1:-1:-1;;16995:3:0;;16952:4054;;11922:1394;12156:19;12193:39;12209:7;12218:13;12193:15;:39::i;:::-;-1:-1:-1;12250:6:0;12245:888;12266:5;:12;12262:1;:16;12245:888;;;12300:16;;:::i;:::-;12319:5;12325:1;12319:8;;;;;;;;;;;;;;;;;;;12386:12;;;;12449:9;;12480:47;;-1:-1:-1;;;12480:47:0;;12319:8;;-1:-1:-1;12386:12:0;;12342:26;;-1:-1:-1;;;;;12480:21:0;;;;;:47;;12510:4;;12449:9;;12480:47;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;12480:47:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;12480:47:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;12480:47:0;;;;;;;;;:51;12476:125;;;12572:9;;12552:33;;-1:-1:-1;;;12552:33:0;;-1:-1:-1;;;;;12552:19:0;;;;;:33;;12572:9;;;12552:33;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;12552:33:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;12552:33:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;12552:33:0;;;;;;;;;;12476:125;12635:9;;12646:15;;;;12615:47;;-1:-1:-1;;;12615:47:0;;-1:-1:-1;;;;;12615:19:0;;;;;:47;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;12615:47:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;12615:47:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;12615:47:0;;;;;;;;;-1:-1:-1;12769:12:0;;;;12824:15;;;;12882:13;;;;;12938:22;;;;13003:13;;;;12704:351;;-1:-1:-1;;;12704:351:0;;12680:19;;-1:-1:-1;;;;;12704:22:0;;;;;:351;;12769:12;;12824:15;;12704:351;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;12704:351:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;12704:351:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;12704:351:0;;;;;;;;;-1:-1:-1;12679:376:0;-1:-1:-1;13087:34:0;12679:376;13106:14;13087:34;:18;:34;:::i;:::-;13070:51;-1:-1:-1;;12280:3:0;;;;;-1:-1:-1;12245:888:0;;-1:-1:-1;;12245:888:0;;;13171:17;13153:14;:35;;13145:61;;;;-1:-1:-1;;;13145:61:0;;;;;;;;;13219:37;13231:8;13241:14;13219:11;:37::i;:::-;;13267:41;13279:7;13288:19;13299:7;13288:10;:19::i;13267:41::-;;11922:1394;;;;;;;:::o;8162:79::-;8200:7;8227:6;-1:-1:-1;;;;;8227:6:0;8162:79;:::o;8528:94::-;8568:4;8608:6;;-1:-1:-1;;;;;8608:6:0;8592:12;:10;:12::i;:::-;-1:-1:-1;;;;;8592:22:0;;8585:29;;8528:94;:::o;11797:117::-;8374:9;:7;:9::i;:::-;8366:54;;;;-1:-1:-1;;;8366:54:0;;;;;;;;;11867:8;:39;;-1:-1:-1;;;;;;11867:39:0;-1:-1:-1;;;;;11867:39:0;;;;;;;;;;11797:117::o;21997:777::-;22224:18;22260:19;22294:14;22300:7;22294:5;:14::i;:::-;22290:387;;;22360:4;;22334:75;;-1:-1:-1;;;;;22360:4:0;22375:8;22386:14;22402:6;22334:17;:75::i;:::-;-1:-1:-1;22323:86:0;-1:-1:-1;22290:387:0;;;22431:15;22437:8;22431:5;:15::i;:::-;22427:250;;;22515:4;;22471:74;;22497:7;;-1:-1:-1;;;;;22515:4:0;22522:14;22538:6;22471:17;:74::i;22427:250::-;22587:78;22613:7;22631:8;22642:14;22658:6;22587:17;:78::i;:::-;-1:-1:-1;22576:89:0;-1:-1:-1;22427:250:0;22705:61;22723:5;22730:7;22739:8;22749:16;22705:17;:61::i;14706:1922::-;14958:19;14997:39;15013:7;15022:13;14997:15;:39::i;:::-;-1:-1:-1;15054:6:0;15049:1394;15070:13;:20;15066:1;:24;15049:1394;;;15112:19;;15146:1162;15167:13;15181:1;15167:16;;;;;;;;;;;;;;:23;15163:1;:27;15146:1162;;;15216:16;;:::i;:::-;15235:13;15249:1;15235:16;;;;;;;;;;;;;;15252:1;15235:19;;;;;;;;;;;;;;15216:38;;15273:26;15317:4;:12;;;15273:57;;15353:1;15358;15353:6;15349:247;;;15544:15;;;:32;;;15349:247;15651:9;;15684:47;;-1:-1:-1;;;15684:47:0;;15616:18;;-1:-1:-1;;;;;15684:21:0;;;;;:47;;15714:4;;15651:9;;15684:47;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;15684:47:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;15684:47:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;15684:47:0;;;;;;;;;:51;15680:133;;;15780:9;;15760:33;;-1:-1:-1;;;15760:33:0;;-1:-1:-1;;;;;15760:19:0;;;;;:33;;15780:9;;;15760:33;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;15760:33:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;15760:33:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;15760:33:0;;;;;;;;;;15680:133;15851:9;;15862:15;;;;15831:47;;-1:-1:-1;;;15831:47:0;;-1:-1:-1;;;;;15831:19:0;;;;;:47;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;15831:47:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;15831:47:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;15831:47:0;;;;;;;;;;15917:4;-1:-1:-1;;;;;15917:22:0;;15986:4;:12;;;16045:4;:15;;;16107:4;:13;;;16167:4;:22;;;16236:4;:13;;;15917:375;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;15917:375:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;15917:375:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;15917:375:0;;;;;;;;;-1:-1:-1;15897:395:0;-1:-1:-1;;15192:3:0;;;;;-1:-1:-1;15146:1162:0;;-1:-1:-1;15146:1162:0;;-1:-1:-1;16397:34:0;:14;16416;16397:34;:18;:34;:::i;:::-;16380:51;-1:-1:-1;;15092:3:0;;15049:1394;;9268:109;8374:9;:7;:9::i;:::-;8366:54;;;;-1:-1:-1;;;8366:54:0;;;;;;;;;9341:28;9360:8;9341:18;:28::i;:::-;9268:109;:::o;30822:122::-;-1:-1:-1;;;;;30906:29:0;;11614:42;30906:29;30822:122;;;;:::o;29825:295::-;29902:4;29923:12;29929:5;29923;:12::i;:::-;29919:194;;;29952:4;;;;;;;;;-1:-1:-1;;;;;29952:4:0;-1:-1:-1;;;;;29952:12:0;;29971:9;29952:31;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;29952:31:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;29952:31:0;;;;;29919:194;;;30024:53;;-1:-1:-1;;;30024:53:0;;-1:-1:-1;;;;;30024:18:0;;;;;:53;;30043:10;;30063:4;;30070:6;;30024:53;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;30024:53:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;30024:53:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;30024:53:0;;;;;;;;;30016:85;;;;-1:-1:-1;;;30016:85:0;;;;;;;;;29825:295;;;;:::o;1577:181::-;1635:7;1667:5;;;1691:6;;;;1683:46;;;;-1:-1:-1;;;1683:46:0;;;;;;;;;1749:1;1577:181;-1:-1:-1;;;1577:181:0:o;30128:240::-;30193:4;30214:12;30220:5;30214;:12::i;:::-;30210:151;;;30250:4;;:29;;-1:-1:-1;;;30250:29:0;;-1:-1:-1;;;;;30250:4:0;;;;:14;;:29;;30273:4;;30250:29;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;30250:29:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;30250:29:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;30250:29:0;;;;;;;;;30243:36;;;;30210:151;30319:30;;-1:-1:-1;;;30319:30:0;;-1:-1:-1;;;;;30319:15:0;;;;;:30;;30343:4;;30319:30;;;;30376:438;30449:4;30470:11;30466:55;;-1:-1:-1;30505:4:0;30498:11;;30466:55;30537:12;30543:5;30537;:12::i;:::-;30533:274;;;30566:4;;:21;;-1:-1:-1;;;30566:21:0;;-1:-1:-1;;;;;30566:4:0;;;;:13;;:21;;30580:6;;30566:21;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;30566:21:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;30566:21:0;;;;30603:9;30617:10;-1:-1:-1;;;;;30617:15:0;30639:6;30617:33;;;;;;;;;;;;;;;;;;;;;;;14:1:-1;21;16:31;;;;75:4;69:11;64:16;;144:4;140:9;133:4;115:16;111:27;107:43;104:1;100:51;94:4;87:65;169:16;166:1;159:27;225:16;222:1;215:4;212:1;208:12;193:49;7:242;;16:31;36:4;31:9;;7:242;;30602:48:0;;;30673:4;30665:31;;;;-1:-1:-1;;;30665:31:0;;;;;;;;;30533:274;;;;30737:34;;-1:-1:-1;;;30737:34:0;;-1:-1:-1;;;;;30737:14:0;;;;;:34;;30752:10;;30764:6;;30737:34;;;;26490:1197;26642:11;;:::i;:::-;26751:24;;-1:-1:-1;;;26751:24:0;;26706:11;;26671:18;;-1:-1:-1;;;;;26751:15:0;;;;;:24;;26767:7;;26751:24;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;26751:24:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;26751:24:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;26751:24:0;;;;;;;;;26729:46;;26786:20;26809:4;-1:-1:-1;;;;;26809:15:0;;26825:8;26809:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;26809:25:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;26809:25:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;26809:25:0;;;;;;;;;26786:48;;26845:18;26866:4;-1:-1:-1;;;;;26866:26:0;;26893:7;26866:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;26866:35:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;26866:35:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;26866:35:0;;;;;;;;;26845:56;;26912:19;26934:4;-1:-1:-1;;;;;26934:26:0;;26961:8;26934:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;26934:36:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;26934:36:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;26934:36:0;;;;;;;;;26912:58;;26981:12;26996:4;-1:-1:-1;;;;;26996:15:0;;:17;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;26996:17:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;26996:17:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;26996:17:0;;;;;;;;;26981:32;;27026:23;27052:248;27121:13;27181:15;27243:14;27052:22;:248::i;:::-;27026:274;;27311:22;;:::i;:::-;-1:-1:-1;27336:313:0;;;;;;;;-1:-1:-1;;;;;27336:313:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;26490:1197:0;;;;;:::o;2949:471::-;3007:7;3252:6;3248:47;;-1:-1:-1;3282:1:0;3275:8;;3248:47;3319:5;;;3323:1;3319;:5;:1;3343:5;;;;;:10;3335:56;;;;-1:-1:-1;;;3335:56:0;;;;;;;;3888:132;3946:7;3973:39;3977:1;3980;3973:39;;;;;;;;;;;;;;;;;:3;:39::i;2033:136::-;2091:7;2118:43;2122:1;2125;2118:43;;;;;;;;;;;;;;;;;:3;:43::i;28987:830::-;29140:16;;29200:581;29221:16;:23;29217:1;:27;29200:581;;;29266:11;29294:9;29304:1;29294:12;;;;;;;;;;;;;;:17;;;-1:-1:-1;;;;;29280:47:0;;29362:9;29372:1;29362:12;;;;;;;;;;;;;;:27;;;29424:9;29434:1;29424:12;;;;;;;;;;;;;;:26;;;29485:9;29495:1;29485:12;;;;;;;;;;;;;;:28;;;29548:9;29558:1;29548:12;;;;;;;;;;;;;;:27;;;29610:16;29627:1;29610:19;;;;;;;;;;;;;;29664:9;29674:1;29664:12;;;;;;;;;;;;;;:20;;;29280:435;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;29280:435:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;29280:435:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;29280:435:0;;;;;;;;;29266:449;-1:-1:-1;29746:23:0;:11;29266:449;29746:23;:15;:23;:::i;:::-;29732:37;-1:-1:-1;;29246:3:0;;29200:581;;;-1:-1:-1;28987:830:0;;;;:::o;28150:829::-;28302:16;;28362:581;28383:16;:23;28379:1;:27;28362:581;;;28428:11;28456:9;28466:1;28456:12;;;;;;;;;;;;;;:17;;;-1:-1:-1;;;;;28442:47:0;;28524:9;28534:1;28524:12;;;;;;;;;;;;;;:27;;;28586:9;28596:1;28586:12;;;;;;;;;;;;;;:26;;;28647:9;28657:1;28647:12;;;;;;;;;;;;;;:28;;;28710:9;28720:1;28710:12;;;;;;;;;;;;;;:27;;;28772:16;28789:1;28772:19;;;;;;;;;;;;;;28826:9;28836:1;28826:12;;;;;;;;;;;;;;:20;;;28442:435;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;28442:435:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;28442:435:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;28442:435:0;;;;;;;;;28428:449;-1:-1:-1;28908:23:0;:11;28428:449;28908:23;:15;:23;:::i;:::-;28894:37;-1:-1:-1;;28408:3:0;;28362:581;;6953:98;7033:10;6953:98;:::o;9483:229::-;-1:-1:-1;;;;;9557:22:0;;9549:73;;;;-1:-1:-1;;;9549:73:0;;;;;;;;;9659:6;;;9638:38;;-1:-1:-1;;;;;9638:38:0;;;;9659:6;;;9638:38;;;9687:6;:17;;-1:-1:-1;;;;;;9687:17:0;-1:-1:-1;;;;;9687:17:0;;;;;;;;;;9483:229::o;27695:447::-;27865:23;27971:125;11693:6;27971:115;28070:15;27971:94;28017:33;:14;28036:13;28017:33;:18;:33;:::i;:::-;27971:23;:13;11693:6;27971:23;:17;:23;:::i;:94::-;:98;:115;:98;:115;:::i;:125::-;27936:160;27695:447;-1:-1:-1;;;;27695:447:0:o;4550:345::-;4636:7;4738:12;4731:5;4723:28;;;;-1:-1:-1;;;4723:28:0;;;;;;;;;;;4762:9;4778:1;4774;:5;;;;;;;4550:345;-1:-1:-1;;;;;4550:345:0:o;2506:192::-;2592:7;2628:12;2620:6;;;;2612:29;;;;-1:-1:-1;;;2612:29:0;;;;;;;;;;-1:-1:-1;;;2664:5:0;;;2506:192::o;10924:20061::-;;;;;;;;;;-1:-1:-1;;;;;10924:20061:0;;;;;;-1:-1:-1;;;;;10924:20061:0;;;;;;-1:-1:-1;;;;;10924:20061:0;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;-1:-1:-1;;;;;10924:20061:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;5:130:-1:-;72:20;;97:33;72:20;97:33;;142:134;220:13;;238:33;220:13;238:33;;301:722;;429:3;422:4;414:6;410:17;406:27;396:2;;447:1;444;437:12;396:2;477:6;471:13;499:80;514:64;571:6;514:64;;;499:80;;;490:89;;596:5;621:6;614:5;607:21;651:4;643:6;639:17;629:27;;673:4;668:3;664:14;657:21;;726:6;773:3;765:4;757:6;753:17;748:3;744:27;741:36;738:2;;;790:1;787;780:12;738:2;815:1;800:217;825:6;822:1;819:13;800:217;;;883:3;905:48;949:3;937:10;905:48;;;893:61;;-1:-1;977:4;968:14;;;;996;;;;;847:1;840:9;800:217;;;804:14;389:634;;;;;;;;1069:792;;1224:3;1217:4;1209:6;1205:17;1201:27;1191:2;;1242:1;1239;1232:12;1191:2;1279:6;1266:20;1301:118;1316:102;1411:6;1316:102;;1301:118;1447:21;;;1491:4;1479:17;;;;1292:127;;-1:-1;1504:14;;1479:17;1599:1;1584:271;1609:6;1606:1;1603:13;1584:271;;;1692:3;1679:17;1671:6;1667:30;1716:75;1787:3;1775:10;1716:75;;;1704:88;;-1:-1;1815:4;1806:14;;;;1834;;;;;1631:1;1624:9;1584:271;;1905:750;;2035:3;2028:4;2020:6;2016:17;2012:27;2002:2;;2053:1;2050;2043:12;2002:2;2090:6;2077:20;2112:93;2127:77;2197:6;2127:77;;2112:93;2103:102;;2222:5;2247:6;2240:5;2233:21;2277:4;2269:6;2265:17;2255:27;;2299:4;2294:3;2290:14;2283:21;;2352:6;2399:3;2391:4;2383:6;2379:17;2374:3;2370:27;2367:36;2364:2;;;2416:1;2413;2406:12;2364:2;2441:1;2426:223;2451:6;2448:1;2445:13;2426:223;;;2509:3;2531:54;2581:3;2569:10;2531:54;;;2519:67;;-1:-1;2609:4;2600:14;;;;2637:4;2628:14;;;;;2473:1;2466:9;2426:223;;2699:758;;2833:3;2826:4;2818:6;2814:17;2810:27;2800:2;;2851:1;2848;2841:12;2800:2;2888:6;2875:20;2910:97;2925:81;2999:6;2925:81;;2910:97;2901:106;;3024:5;3049:6;3042:5;3035:21;3079:4;3071:6;3067:17;3057:27;;3101:4;3096:3;3092:14;3085:21;;3154:6;3201:3;3193:4;3185:6;3181:17;3176:3;3172:27;3169:36;3166:2;;;3218:1;3215;3208:12;3166:2;3243:1;3228:223;3253:6;3250:1;3247:13;3228:223;;;3311:3;3333:54;3383:3;3371:10;3333:54;;;3321:67;;-1:-1;3411:4;3402:14;;;;3439:4;3430:14;;;;;3275:1;3268:9;3228:223;;3465:128;3540:13;;3558:30;3540:13;3558:30;;3600:174;3689:20;;3714:55;3689:20;3714:55;;3813:1066;;3919:4;3907:9;3902:3;3898:19;3894:30;3891:2;;;3937:1;3934;3927:12;3891:2;3955:20;3970:4;3955:20;;;3946:29;-1:-1;4025:1;4056:49;4101:3;4081:9;4056:49;;;4032:74;;-1:-1;4170:2;4203:49;4248:3;4224:22;;;4203:49;;;4196:4;4189:5;4185:16;4178:75;4127:137;4318:2;4351:49;4396:3;4387:6;4376:9;4372:22;4351:49;;;4344:4;4337:5;4333:16;4326:75;4274:138;4468:2;4501:49;4546:3;4537:6;4526:9;4522:22;4501:49;;;4494:4;4487:5;4483:16;4476:75;4422:140;4625:3;4659:49;4704:3;4695:6;4684:9;4680:22;4659:49;;;4652:4;4645:5;4641:16;4634:75;4572:148;4774:3;4808:49;4853:3;4844:6;4833:9;4829:22;4808:49;;;4801:4;4794:5;4790:16;4783:75;4730:139;3885:994;;;;;4886:130;4953:20;;4978:33;4953:20;4978:33;;5023:134;5101:13;;5119:33;5101:13;5119:33;;5164:241;;5268:2;5256:9;5247:7;5243:23;5239:32;5236:2;;;5284:1;5281;5274:12;5236:2;5319:1;5336:53;5381:7;5361:9;5336:53;;5412:617;;;;;5567:3;5555:9;5546:7;5542:23;5538:33;5535:2;;;5584:1;5581;5574:12;5535:2;5619:1;5636:53;5681:7;5661:9;5636:53;;;5626:63;;5598:97;5726:2;5744:53;5789:7;5780:6;5769:9;5765:22;5744:53;;;5734:63;;5705:98;5834:2;5852:53;5897:7;5888:6;5877:9;5873:22;5852:53;;;5842:63;;5813:98;5942:2;5960:53;6005:7;5996:6;5985:9;5981:22;5960:53;;;5950:63;;5921:98;5529:500;;;;;;;;6036:392;;6176:2;6164:9;6155:7;6151:23;6147:32;6144:2;;;6192:1;6189;6182:12;6144:2;6227:24;;6271:18;6260:30;;6257:2;;;6303:1;6300;6293:12;6257:2;6323:89;6404:7;6395:6;6384:9;6380:22;6323:89;;6435:917;;;;;6697:3;6685:9;6676:7;6672:23;6668:33;6665:2;;;6714:1;6711;6704:12;6665:2;6749:31;;6800:18;6789:30;;6786:2;;;6832:1;6829;6822:12;6786:2;6852:116;6960:7;6951:6;6940:9;6936:22;6852:116;;;6842:126;;6728:246;7005:2;7023:75;7090:7;7081:6;7070:9;7066:22;7023:75;;;7013:85;;6984:120;7135:2;7153:75;7220:7;7211:6;7200:9;7196:22;7153:75;;7359:1043;;;;;;7638:3;7626:9;7617:7;7613:23;7609:33;7606:2;;;7655:1;7652;7645:12;7606:2;7690:31;;7741:18;7730:30;;7727:2;;;7773:1;7770;7763:12;7727:2;7793:116;7901:7;7892:6;7881:9;7877:22;7793:116;;;7783:126;;7669:246;7946:2;7964:75;8031:7;8022:6;8011:9;8007:22;7964:75;;;7954:85;;7925:120;8076:2;8094:75;8161:7;8152:6;8141:9;8137:22;8094:75;;;8084:85;;8055:120;8206:2;8224:53;8269:7;8260:6;8249:9;8245:22;8224:53;;;8214:63;;8185:98;8314:3;8333:53;8378:7;8369:6;8358:9;8354:22;8333:53;;;8323:63;;8293:99;7600:802;;;;;;;;;8409:875;;;;;8650:3;8638:9;8629:7;8625:23;8621:33;8618:2;;;8667:1;8664;8657:12;8618:2;8702:31;;8753:18;8742:30;;8739:2;;;8785:1;8782;8775:12;8739:2;8805:95;8892:7;8883:6;8872:9;8868:22;8805:95;;9291:1001;;;;;;9549:3;9537:9;9528:7;9524:23;9520:33;9517:2;;;9566:1;9563;9556:12;9517:2;9601:31;;9652:18;9641:30;;9638:2;;;9684:1;9681;9674:12;9638:2;9704:95;9791:7;9782:6;9771:9;9767:22;9704:95;;10299:257;;10411:2;10399:9;10390:7;10386:23;10382:32;10379:2;;;10427:1;10424;10417:12;10379:2;10462:1;10479:61;10532:7;10512:9;10479:61;;10563:831;;;;;;10779:3;10767:9;10758:7;10754:23;10750:33;10747:2;;;10796:1;10793;10786:12;10747:2;10831:1;10848:75;10915:7;10895:9;10848:75;;;10838:85;;10810:119;10960:2;10978:75;11045:7;11036:6;11025:9;11021:22;10978:75;;;10968:85;;10939:120;11090:2;11108:53;11153:7;11144:6;11133:9;11129:22;11108:53;;11401:263;;11516:2;11504:9;11495:7;11491:23;11487:32;11484:2;;;11532:1;11529;11522:12;11484:2;11567:1;11584:64;11640:7;11620:9;11584:64;;11671:399;;;11803:2;11791:9;11782:7;11778:23;11774:32;11771:2;;;11819:1;11816;11809:12;11771:2;11854:1;11871:64;11927:7;11907:9;11871:64;;;11861:74;;11833:108;11972:2;11990:64;12046:7;12037:6;12026:9;12022:22;11990:64;;;11980:74;;11951:109;11765:305;;;;;;12078:245;;12199:84;12279:3;12271:6;12199:84;;;-1:-1;;12312:4;12303:14;;12192:131;12331:142;12422:45;12461:5;12422:45;;;12417:3;12410:58;12404:69;;;12480:103;12553:24;12571:5;12553:24;;12777:826;;12956:71;13021:5;12956:71;;;13040:103;13136:6;13131:3;13040:103;;;13033:110;;13164:73;13231:5;13164:73;;;13257:7;13285:1;13270:311;13295:6;13292:1;13289:13;13270:311;;;13362:6;13356:13;13383:97;13476:3;13461:13;13383:97;;;13376:104;;13497:77;13567:6;13497:77;;;13487:87;-1:-1;;13317:1;13310:9;13270:311;;;-1:-1;13594:3;;12935:668;-1:-1;;;;;12935:668;13611:104;13688:21;13703:5;13688:21;;13722:142;13813:45;13852:5;13813:45;;13871:347;;13983:39;14016:5;13983:39;;;14034:71;14098:6;14093:3;14034:71;;;14027:78;;14110:52;14155:6;14150:3;14143:4;14136:5;14132:16;14110:52;;;14183:29;14205:6;14183:29;;;14174:39;;;;13963:255;-1:-1;;;13963:255;14226:465;;14386:67;14450:2;14445:3;14386:67;;;14486:66;14466:87;;-1:-1;;;14582:2;14573:12;;14566:88;14682:2;14673:12;;14372:319;-1:-1;;14372:319;14700:364;;14860:67;14924:2;14919:3;14860:67;;;14960:66;14940:87;;15055:2;15046:12;;14846:218;-1:-1;;14846:218;15073:364;;15233:67;15297:2;15292:3;15233:67;;;-1:-1;;;15313:87;;15428:2;15419:12;;15219:218;-1:-1;;15219:218;15446:364;;15606:67;15670:2;15665:3;15606:67;;;-1:-1;;;15686:87;;15801:2;15792:12;;15592:218;-1:-1;;15592:218;15819:465;;15979:67;16043:2;16038:3;15979:67;;;16079:66;16059:87;;-1:-1;;;16175:2;16166:12;;16159:88;16275:2;16266:12;;15965:319;-1:-1;;15965:319;16293:364;;16453:67;16517:2;16512:3;16453:67;;;16553:66;16533:87;;16648:2;16639:12;;16439:218;-1:-1;;16439:218;16666:364;;16826:67;16890:2;16885:3;16826:67;;;-1:-1;;;16906:87;;17021:2;17012:12;;16812:218;-1:-1;;16812:218;17039:296;;17216:83;17297:1;17292:3;17216:83;;17344:364;;17504:67;17568:2;17563:3;17504:67;;;-1:-1;;;17584:87;;17699:2;17690:12;;17490:218;-1:-1;;17490:218;17777:1098;17964:22;;17898:4;17889:14;;;17992:62;17893:3;17964:22;17992:62;;;17918:142;18136:4;18129:5;18125:16;18119:23;18148:63;18205:4;18200:3;18196:14;18182:12;18148:63;;;18070:147;18294:4;18287:5;18283:16;18277:23;18306:63;18363:4;18358:3;18354:14;18340:12;18306:63;;;18227:148;18454:4;18447:5;18443:16;18437:23;18466:63;18523:4;18518:3;18514:14;18500:12;18466:63;;;18385:150;18621:4;18614:5;18610:16;18604:23;18633:63;18690:4;18685:3;18681:14;18667:12;18633:63;;;18545:157;18779:4;18772:5;18768:16;18762:23;18791:63;18848:4;18843:3;18839:14;18825:12;18791:63;;;18712:148;17871:1004;;;;18882:103;18955:24;18973:5;18955:24;;19112:370;;19310:147;19453:3;19310:147;;19489:213;19607:2;19592:18;;19621:71;19596:9;19665:6;19621:71;;19709:229;19835:2;19820:18;;19849:79;19824:9;19901:6;19849:79;;19945:340;20099:2;20084:18;;20113:79;20088:9;20165:6;20113:79;;;20203:72;20271:2;20260:9;20256:18;20247:6;20203:72;;20292:467;20482:2;20467:18;;20496:79;20471:9;20548:6;20496:79;;;20586:80;20662:2;20651:9;20647:18;20638:6;20586:80;;;20677:72;20745:2;20734:9;20730:18;20721:6;20677:72;;20766:340;20920:2;20905:18;;20934:79;20909:9;20986:6;20934:79;;;21024:72;21092:2;21081:9;21077:18;21068:6;21024:72;;21113:435;21287:2;21272:18;;21301:71;21276:9;21345:6;21301:71;;;21383:72;21451:2;21440:9;21436:18;21427:6;21383:72;;21555:340;21709:2;21694:18;;21723:71;21698:9;21767:6;21723:71;;;21805:80;21881:2;21870:9;21866:18;21857:6;21805:80;;21902:324;22048:2;22033:18;;22062:71;22037:9;22106:6;22062:71;;22233:659;22463:3;22448:19;;22478:71;22452:9;22522:6;22478:71;;;22560:72;22628:2;22617:9;22613:18;22604:6;22560:72;;;22643;22711:2;22700:9;22696:18;22687:6;22643:72;;;22726;22794:2;22783:9;22779:18;22770:6;22726:72;;;22809:73;22877:3;22866:9;22862:19;22853:6;22809:73;;;22434:458;;;;;;;;;22899:540;23129:2;23143:47;;;23114:18;;23204:142;23114:18;23332:6;23204:142;;;23196:150;;23357:72;23425:2;23414:9;23410:18;23401:6;23357:72;;23446:201;23558:2;23543:18;;23572:65;23547:9;23610:6;23572:65;;23654:301;23792:2;23806:47;;;23777:18;;23867:78;23777:18;23931:6;23867:78;;23962:407;24153:2;24167:47;;;24138:18;;24228:131;24138:18;24228:131;;24376:407;24567:2;24581:47;;;24552:18;;24642:131;24552:18;24642:131;;24790:407;24981:2;24995:47;;;24966:18;;25056:131;24966:18;25056:131;;25204:407;25395:2;25409:47;;;25380:18;;25470:131;25380:18;25470:131;;25618:407;25809:2;25823:47;;;25794:18;;25884:131;25794:18;25884:131;;26032:407;26223:2;26237:47;;;26208:18;;26298:131;26208:18;26298:131;;26446:407;26637:2;26651:47;;;26622:18;;26712:131;26622:18;26712:131;;26860:407;27051:2;27065:47;;;27036:18;;27126:131;27036:18;27126:131;;27274:213;27392:2;27377:18;;27406:71;27381:9;27450:6;27406:71;;27494:771;27752:3;27737:19;;27767:71;27741:9;27811:6;27767:71;;;27849:72;27917:2;27906:9;27902:18;27893:6;27849:72;;;27932;28000:2;27989:9;27985:18;27976:6;27932:72;;;28015;28083:2;28072:9;28068:18;28059:6;28015:72;;;28098:73;28166:3;28155:9;28151:19;28142:6;28098:73;;;28182;28250:3;28239:9;28235:19;28226:6;28182:73;;28272:256;28334:2;28328:9;28360:17;;;28435:18;28420:34;;28456:22;;;28417:62;28414:2;;;28492:1;28489;28482:12;28414:2;28508;28501:22;28312:216;;-1:-1;28312:216;28535:304;;28694:18;28686:6;28683:30;28680:2;;;28726:1;28723;28716:12;28680:2;-1:-1;28761:4;28749:17;;;28814:15;;28617:222;29847:168;29988:4;29979:14;;29936:79;30022:154;30142:12;;30113:63;30445:195;30580:19;;;30629:4;30620:14;;30573:67;30973:91;;31035:24;31053:5;31035:24;;31071:85;31137:13;31130:21;;31113:43;31163:113;;31247:24;31265:5;31247:24;;31283:121;-1:-1;;;;;31345:54;;31328:76;31411:72;31473:5;31456:27;31490:129;;31577:37;31608:5;31577:37;;31626:116;;31713:24;31731:5;31713:24;;31993:268;32058:1;32065:101;32079:6;32076:1;32073:13;32065:101;;;32146:11;;;32140:18;32127:11;;;32120:39;32101:2;32094:10;32065:101;;;32181:6;32178:1;32175:13;32172:2;;;-1:-1;;32246:1;32228:16;;32221:27;32042:219;32269:97;32357:2;32337:14;-1:-1;;32333:28;;32317:49;32374:117;32443:24;32461:5;32443:24;;;32436:5;32433:35;32423:2;;32482:1;32479;32472:12;32498:111;32564:21;32579:5;32564:21;;32616:161;32707:46;32747:5;32707:46;;32784:117;32853:24;32871:5;32853:24;
Swarm Source
bzzr://6a7e6caac398936eb953c1ac962efbe4262c77bbec294e69ca633488f2701cb3
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 35 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|---|---|---|---|---|
ETH | 87.37% | $2,097.17 | 15.8547 | $33,250.1 | |
ETH | 0.66% | $0.999994 | 251.9622 | $251.96 | |
BSC | 11.56% | $629.24 | 6.9936 | $4,400.62 | |
BSC | 0.39% | $2,096.03 | 0.0703 | $147.45 | |
BSC | <0.01% | $3.52 | 1 | $3.52 | |
POL | <0.01% | $0.219939 | 2.0662 | $0.454443 | |
GNO | <0.01% | $1 | 0.3919 | $0.391961 | |
FTM | <0.01% | $0.6092 | 0.5 | $0.3046 | |
ARB | <0.01% | $2,097.02 | 0.00001476 | $0.030948 |
Loading...
Loading
Loading...
Loading
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.