Overview
APE Balance
0 APE
APE Value
$0.00More Info
Private Name Tags
ContractCreator
Loading...
Loading
Contract Source Code Verified (Exact Match)
Contract Name:
ApeswapRouter
Compiler Version
v0.8.24+commit.e11b9ed9
Contract Source Code (Solidity)
/** *Submitted for verification at apescan.io on 2024-10-30 */ // File: contracts/interfaces/IApeswapFactory.sol pragma solidity ^0.8.19; interface IApeswapFactory { event PairCreated( address indexed token0, address indexed token1, address pair, uint256 ); function feeTo() external view returns (address); function feeToSetter() external view returns (address); function getPair(address tokenA, address tokenB) external view returns (address pair); function allPairs(uint256) external view returns (address pair); function allPairsLength() external view returns (uint256); function createPair(address tokenA, address tokenB) external returns (address pair); function setFeeTo(address) external; function setFeeToSetter(address) external; } // File: contracts/libraries/TransferHelper.sol pragma solidity >=0.6.0; // helper methods for interacting with ERC20 tokens and sending ETH that do not consistently return true/false library TransferHelper { function safeApprove( address token, address to, uint256 value ) internal { // bytes4(keccak256(bytes('approve(address,uint256)'))); (bool success, bytes memory data) = token.call(abi.encodeWithSelector(0x095ea7b3, to, value)); require( success && (data.length == 0 || abi.decode(data, (bool))), 'TransferHelper::safeApprove: approve failed' ); } function safeTransfer( address token, address to, uint256 value ) internal { // bytes4(keccak256(bytes('transfer(address,uint256)'))); (bool success, bytes memory data) = token.call(abi.encodeWithSelector(0xa9059cbb, to, value)); require( success && (data.length == 0 || abi.decode(data, (bool))), 'TransferHelper::safeTransfer: transfer failed' ); } function safeTransferFrom( address token, address from, address to, uint256 value ) internal { // bytes4(keccak256(bytes('transferFrom(address,address,uint256)'))); (bool success, bytes memory data) = token.call(abi.encodeWithSelector(0x23b872dd, from, to, value)); require( success && (data.length == 0 || abi.decode(data, (bool))), 'TransferHelper::transferFrom: transferFrom failed' ); } function safeTransferETH(address to, uint256 value) internal { (bool success, ) = to.call{value: value}(new bytes(0)); require(success, 'TransferHelper::safeTransferETH: ETH transfer failed'); } } // File: contracts/interfaces/IApeswapRouter.sol pragma solidity ^0.8.19; interface IApeswapRouter { function factory() external view returns (address); function WETH() external view returns (address); function addLiquidity( address tokenA, address tokenB, uint256 amountADesired, uint256 amountBDesired, uint256 amountAMin, uint256 amountBMin, address to, uint256 deadline ) external returns ( uint256 amountA, uint256 amountB, uint256 liquidity ); function addLiquidityETH( address token, uint256 amountTokenDesired, uint256 amountTokenMin, uint256 amountETHMin, address to, uint256 deadline ) external payable returns ( uint256 amountToken, uint256 amountETH, uint256 liquidity ); function removeLiquidity( address tokenA, address tokenB, uint256 liquidity, uint256 amountAMin, uint256 amountBMin, address to, uint256 deadline ) external returns (uint256 amountA, uint256 amountB); function removeLiquidityETH( address token, uint256 liquidity, uint256 amountTokenMin, uint256 amountETHMin, address to, uint256 deadline ) external returns (uint256 amountToken, uint256 amountETH); function removeLiquidityWithPermit( address tokenA, address tokenB, uint256 liquidity, uint256 amountAMin, uint256 amountBMin, address to, uint256 deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external returns (uint256 amountA, uint256 amountB); function removeLiquidityETHWithPermit( address token, uint256 liquidity, uint256 amountTokenMin, uint256 amountETHMin, address to, uint256 deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external returns (uint256 amountToken, uint256 amountETH); function removeLiquidityETHSupportingFeeOnTransferTokens( address token, uint256 liquidity, uint256 amountTokenMin, uint256 amountETHMin, address to, uint256 deadline ) external returns (uint256 amountETH); function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens( address token, uint256 liquidity, uint256 amountTokenMin, uint256 amountETHMin, address to, uint256 deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external returns (uint256 amountETH); function swapExactTokensForTokens( uint256 amountIn, uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external payable returns (uint256[] memory amounts); function swapTokensForExactTokens( uint256 amountOut, uint256 amountInMax, address[] calldata path, address to, uint256 deadline ) external payable returns (uint256[] memory amounts); function swapExactETHForTokens( uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external payable returns (uint256[] memory amounts); function swapTokensForExactETH( uint256 amountOut, uint256 amountInMax, address[] calldata path, address to, uint256 deadline ) external payable returns (uint256[] memory amounts); function swapExactTokensForETH( uint256 amountIn, uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external payable returns (uint256[] memory amounts); function swapETHForExactTokens( uint256 amountOut, address[] calldata path, address to, uint256 deadline ) external payable returns (uint256[] memory amounts); function swapExactTokensForTokensSupportingFeeOnTransferTokens( uint256 amountIn, uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external payable ; function swapExactETHForTokensSupportingFeeOnTransferTokens( uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external payable; function swapExactTokensForETHSupportingFeeOnTransferTokens( uint256 amountIn, uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external payable ; function quote( uint256 amountA, uint256 reserveA, uint256 reserveB ) external pure returns (uint256 amountB); function getAmountOut( uint256 amountIn, uint256 reserveIn, uint256 reserveOut ) external pure returns (uint256 amountOut); function getAmountIn( uint256 amountOut, uint256 reserveIn, uint256 reserveOut ) external pure returns (uint256 amountIn); function getAmountsOut(uint256 amountIn, address[] calldata path) external view returns (uint256[] memory amounts); function getAmountsIn(uint256 amountOut, address[] calldata path) external view returns (uint256[] memory amounts); } // File: contracts/interfaces/IApeswapPair.sol pragma solidity ^0.8.19; interface IApeswapPair { event Approval( address indexed owner, address indexed spender, uint256 value ); event Transfer(address indexed from, address indexed to, uint256 value); function name() external pure returns (string memory); function symbol() external pure returns (string memory); function decimals() external pure returns (uint8); function totalSupply() external view returns (uint256); function balanceOf(address owner) external view returns (uint256); function allowance(address owner, address spender) external view returns (uint256); function approve(address spender, uint256 value) external returns (bool); function transfer(address to, uint256 value) external returns (bool); function transferFrom( address from, address to, uint256 value ) external returns (bool); function DOMAIN_SEPARATOR() external view returns (bytes32); function PERMIT_TYPEHASH() external pure returns (bytes32); function nonces(address owner) external view returns (uint256); function permit( address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) external; event Mint(address indexed sender, uint256 amount0, uint256 amount1); event Burn( address indexed sender, uint256 amount0, uint256 amount1, address indexed to ); event Swap( address indexed sender, uint256 amount0In, uint256 amount1In, uint256 amount0Out, uint256 amount1Out, address indexed to ); event Sync(uint112 reserve0, uint112 reserve1); function MINIMUM_LIQUIDITY() external pure returns (uint256); function factory() external view returns (address); function token0() external view returns (address); function token1() external view returns (address); function getReserves() external view returns ( uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast ); function price0CumulativeLast() external view returns (uint256); function price1CumulativeLast() external view returns (uint256); function kLast() external view returns (uint256); function mint(address to) external returns (uint256 liquidity); function burn(address to) external returns (uint256 amount0, uint256 amount1); function swap( uint256 amount0Out, uint256 amount1Out, address to, bytes calldata data ) external; function skim(address to) external; function sync() external; function initialize(address, address) external; } // File: contracts/libraries/SafeMath.sol pragma solidity ^0.8.19; // a library for performing overflow-safe math, courtesy of DappHub (https://github.com/dapphub/ds-math) library SafeMath { function add(uint256 x, uint256 y) internal pure returns (uint256 z) { require((z = x + y) >= x, "ds-math-add-overflow"); } function sub(uint256 x, uint256 y) internal pure returns (uint256 z) { require((z = x - y) <= x, "ds-math-sub-underflow"); } function mul(uint256 x, uint256 y) internal pure returns (uint256 z) { require(y == 0 || (z = x * y) / y == x, "ds-math-mul-overflow"); } } // File: contracts/libraries/ApeswapLibrary.sol pragma solidity ^0.8.19; library ApeswapLibrary { using SafeMath for uint256; // returns sorted token addresses, used to handle return values from pairs sorted in this order function sortTokens(address tokenA, address tokenB) internal pure returns (address token0, address token1) { require(tokenA != tokenB, "ApeswapLibrary: IDENTICAL_ADDRESSES"); (token0, token1) = tokenA < tokenB ? (tokenA, tokenB) : (tokenB, tokenA); require(token0 != address(0), "ApeswapLibrary: ZERO_ADDRESS"); } // calculates the CREATE2 address for a pair without making any external calls function pairFor( address factory, address tokenA, address tokenB ) internal pure returns (address pair) { (address token0, address token1) = sortTokens(tokenA, tokenB); pair = address( uint160( uint256( keccak256( abi.encodePacked( hex"ff", factory, keccak256(abi.encodePacked(token0, token1)), hex"0b28dad2cc786741db4a85dbfc89accb5a945eef968d3efeffef340654708cc3" // init code hash ) ) ) ) ); } // fetches and sorts the reserves for a pair function getReserves( address factory, address tokenA, address tokenB ) internal view returns (uint256 reserveA, uint256 reserveB) { (address token0, ) = sortTokens(tokenA, tokenB); (uint256 reserve0, uint256 reserve1, ) = IApeswapPair( pairFor(factory, tokenA, tokenB) ).getReserves(); (reserveA, reserveB) = tokenA == token0 ? (reserve0, reserve1) : (reserve1, reserve0); } // given some amount of an asset and pair reserves, returns an equivalent amount of the other asset function quote( uint256 amountA, uint256 reserveA, uint256 reserveB ) internal pure returns (uint256 amountB) { require(amountA > 0, "ApeswapLibrary: INSUFFICIENT_AMOUNT"); require( reserveA > 0 && reserveB > 0, "ApeswapLibrary: INSUFFICIENT_LIQUIDITY" ); amountB = amountA.mul(reserveB) / reserveA; } // given an input amount of an asset and pair reserves, returns the maximum output amount of the other asset function getAmountOut( uint256 amountIn, uint256 reserveIn, uint256 reserveOut ) internal pure returns (uint256 amountOut) { require(amountIn > 0, "ApeswapLibrary: INSUFFICIENT_INPUT_AMOUNT"); require( reserveIn > 0 && reserveOut > 0, "ApeswapLibrary: INSUFFICIENT_LIQUIDITY" ); uint256 amountInWithFee = amountIn.mul(997); uint256 numerator = amountInWithFee.mul(reserveOut); uint256 denominator = reserveIn.mul(1000).add(amountInWithFee); amountOut = numerator / denominator; } // given an output amount of an asset and pair reserves, returns a required input amount of the other asset function getAmountIn( uint256 amountOut, uint256 reserveIn, uint256 reserveOut ) internal pure returns (uint256 amountIn) { require(amountOut > 0, "ApeswapLibrary: INSUFFICIENT_OUTPUT_AMOUNT"); require( reserveIn > 0 && reserveOut > 0, "ApeswapLibrary: INSUFFICIENT_LIQUIDITY" ); uint256 numerator = reserveIn.mul(amountOut).mul(1000); uint256 denominator = reserveOut.sub(amountOut).mul(997); amountIn = (numerator / denominator).add(1); } // performs chained getAmountOut calculations on any number of pairs function getAmountsOut( address factory, uint256 amountIn, address[] memory path ) internal view returns (uint256[] memory amounts) { require(path.length >= 2, "ApeswapLibrary: INVALID_PATH"); amounts = new uint256[](path.length); amounts[0] = amountIn; for (uint256 i; i < path.length - 1; i++) { (uint256 reserveIn, uint256 reserveOut) = getReserves( factory, path[i], path[i + 1] ); amounts[i + 1] = getAmountOut(amounts[i], reserveIn, reserveOut); } } // performs chained getAmountIn calculations on any number of pairs function getAmountsIn( address factory, uint256 amountOut, address[] memory path ) internal view returns (uint256[] memory amounts) { require(path.length >= 2, "ApeswapLibrary: INVALID_PATH"); amounts = new uint256[](path.length); amounts[amounts.length - 1] = amountOut; for (uint256 i = path.length - 1; i > 0; i--) { (uint256 reserveIn, uint256 reserveOut) = getReserves( factory, path[i - 1], path[i] ); amounts[i - 1] = getAmountIn(amounts[i], reserveIn, reserveOut); } } } // File: contracts/interfaces/IERC20.sol pragma solidity ^0.8.19; interface IERC20 { event Approval( address indexed owner, address indexed spender, uint256 value ); event Transfer(address indexed from, address indexed to, uint256 value); function name() external view returns (string memory); function symbol() external view returns (string memory); function decimals() external view returns (uint8); function totalSupply() external view returns (uint256); function balanceOf(address owner) external view returns (uint256); function allowance(address owner, address spender) external view returns (uint256); function approve(address spender, uint256 value) external returns (bool); function transfer(address to, uint256 value) external returns (bool); function transferFrom( address from, address to, uint256 value ) external returns (bool); } // File: contracts/interfaces/IWETH.sol pragma solidity ^0.8.19; interface IWETH { function deposit() external payable; function transfer(address to, uint value) external returns (bool); function withdraw(uint) external; } // File: @openzeppelin/contracts/utils/Context.sol // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @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 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. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // File: @openzeppelin/contracts/access/Ownable.sol // OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol) pragma solidity ^0.8.0; /** * @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. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * 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. */ abstract 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() { _transferOwnership(_msgSender()); } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { _checkOwner(); _; } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if the sender is not the owner. */ function _checkOwner() internal view virtual { require(owner() == _msgSender(), "Ownable: caller is not the 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 virtual onlyOwner { _transferOwnership(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 virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // File: contracts/ApeswapRouter.sol pragma solidity ^0.8.19; contract ApeswapRouter is IApeswapRouter, Ownable { using SafeMath for uint256; address payable public feeWallet; address public immutable override factory; address public immutable override WETH; uint256 public fee; modifier ensure(uint256 deadline) { require(deadline >= block.timestamp, "Apeswap: EXPIRED"); _; } constructor(address _factory, address _WETH) { factory = _factory; WETH = _WETH; fee = 1 ether; feeWallet = payable(0x01E1F08D341b9b9DD106aE7099B754efaF398268); transferOwnership(0x01E1F08D341b9b9DD106aE7099B754efaF398268); } receive() external payable { assert(msg.sender == WETH); // only accept ETH via fallback from the WETH contract } // **** ADD LIQUIDITY **** function _addLiquidity( address tokenA, address tokenB, uint256 amountADesired, uint256 amountBDesired, uint256 amountAMin, uint256 amountBMin ) internal virtual returns (uint256 amountA, uint256 amountB) { // create the pair if it doesn't exist yet if (IApeswapFactory(factory).getPair(tokenA, tokenB) == address(0)) { IApeswapFactory(factory).createPair(tokenA, tokenB); } (uint256 reserveA, uint256 reserveB) = ApeswapLibrary.getReserves( factory, tokenA, tokenB ); if (reserveA == 0 && reserveB == 0) { (amountA, amountB) = (amountADesired, amountBDesired); } else { uint256 amountBOptimal = ApeswapLibrary.quote( amountADesired, reserveA, reserveB ); if (amountBOptimal <= amountBDesired) { require( amountBOptimal >= amountBMin, "Apeswap: INSUFFICIENT_B_AMOUNT" ); (amountA, amountB) = (amountADesired, amountBOptimal); } else { uint256 amountAOptimal = ApeswapLibrary.quote( amountBDesired, reserveB, reserveA ); assert(amountAOptimal <= amountADesired); require( amountAOptimal >= amountAMin, "Apeswap: INSUFFICIENT_A_AMOUNT" ); (amountA, amountB) = (amountAOptimal, amountBDesired); } } } function addLiquidity( address tokenA, address tokenB, uint256 amountADesired, uint256 amountBDesired, uint256 amountAMin, uint256 amountBMin, address to, uint256 deadline ) external virtual override ensure(deadline) returns ( uint256 amountA, uint256 amountB, uint256 liquidity ) { (amountA, amountB) = _addLiquidity( tokenA, tokenB, amountADesired, amountBDesired, amountAMin, amountBMin ); address pair = ApeswapLibrary.pairFor(factory, tokenA, tokenB); TransferHelper.safeTransferFrom(tokenA, msg.sender, pair, amountA); TransferHelper.safeTransferFrom(tokenB, msg.sender, pair, amountB); liquidity = IApeswapPair(pair).mint(to); } function addLiquidityETH( address token, uint256 amountTokenDesired, uint256 amountTokenMin, uint256 amountETHMin, address to, uint256 deadline ) external payable virtual override ensure(deadline) returns ( uint256 amountToken, uint256 amountETH, uint256 liquidity ) { (amountToken, amountETH) = _addLiquidity( token, WETH, amountTokenDesired, msg.value, amountTokenMin, amountETHMin ); address pair = ApeswapLibrary.pairFor(factory, token, WETH); TransferHelper.safeTransferFrom(token, msg.sender, pair, amountToken); IWETH(WETH).deposit{value: amountETH}(); assert(IWETH(WETH).transfer(pair, amountETH)); liquidity = IApeswapPair(pair).mint(to); // refund dust eth, if any if (msg.value > amountETH) TransferHelper.safeTransferETH(msg.sender, msg.value - amountETH); } // **** REMOVE LIQUIDITY **** function removeLiquidity( address tokenA, address tokenB, uint256 liquidity, uint256 amountAMin, uint256 amountBMin, address to, uint256 deadline ) public virtual override ensure(deadline) returns (uint256 amountA, uint256 amountB) { address pair = ApeswapLibrary.pairFor(factory, tokenA, tokenB); IApeswapPair(pair).transferFrom(msg.sender, pair, liquidity); // send liquidity to pair (uint256 amount0, uint256 amount1) = IApeswapPair(pair).burn(to); (address token0, ) = ApeswapLibrary.sortTokens(tokenA, tokenB); (amountA, amountB) = tokenA == token0 ? (amount0, amount1) : (amount1, amount0); require(amountA >= amountAMin, "Apeswap: INSUFFICIENT_A_AMOUNT"); require(amountB >= amountBMin, "Apeswap: INSUFFICIENT_B_AMOUNT"); } function removeLiquidityETH( address token, uint256 liquidity, uint256 amountTokenMin, uint256 amountETHMin, address to, uint256 deadline ) public virtual override ensure(deadline) returns (uint256 amountToken, uint256 amountETH) { (amountToken, amountETH) = removeLiquidity( token, WETH, liquidity, amountTokenMin, amountETHMin, address(this), deadline ); TransferHelper.safeTransfer(token, to, amountToken); IWETH(WETH).withdraw(amountETH); TransferHelper.safeTransferETH(to, amountETH); } function removeLiquidityWithPermit( address tokenA, address tokenB, uint256 liquidity, uint256 amountAMin, uint256 amountBMin, address to, uint256 deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external virtual override returns (uint256 amountA, uint256 amountB) { address pair = ApeswapLibrary.pairFor(factory, tokenA, tokenB); uint256 value = approveMax ? type(uint256).max : liquidity; IApeswapPair(pair).permit( msg.sender, address(this), value, deadline, v, r, s ); (amountA, amountB) = removeLiquidity( tokenA, tokenB, liquidity, amountAMin, amountBMin, to, deadline ); } function removeLiquidityETHWithPermit( address token, uint256 liquidity, uint256 amountTokenMin, uint256 amountETHMin, address to, uint256 deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external virtual override returns (uint256 amountToken, uint256 amountETH) { address pair = ApeswapLibrary.pairFor(factory, token, WETH); uint256 value = approveMax ? type(uint256).max : liquidity; IApeswapPair(pair).permit( msg.sender, address(this), value, deadline, v, r, s ); (amountToken, amountETH) = removeLiquidityETH( token, liquidity, amountTokenMin, amountETHMin, to, deadline ); } // **** REMOVE LIQUIDITY (supporting fee-on-transfer tokens) **** function removeLiquidityETHSupportingFeeOnTransferTokens( address token, uint256 liquidity, uint256 amountTokenMin, uint256 amountETHMin, address to, uint256 deadline ) public virtual override ensure(deadline) returns (uint256 amountETH) { (, amountETH) = removeLiquidity( token, WETH, liquidity, amountTokenMin, amountETHMin, address(this), deadline ); TransferHelper.safeTransfer( token, to, IERC20(token).balanceOf(address(this)) ); IWETH(WETH).withdraw(amountETH); TransferHelper.safeTransferETH(to, amountETH); } function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens( address token, uint256 liquidity, uint256 amountTokenMin, uint256 amountETHMin, address to, uint256 deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external virtual override returns (uint256 amountETH) { address pair = ApeswapLibrary.pairFor(factory, token, WETH); uint256 value = approveMax ? type(uint256).max : liquidity; IApeswapPair(pair).permit( msg.sender, address(this), value, deadline, v, r, s ); amountETH = removeLiquidityETHSupportingFeeOnTransferTokens( token, liquidity, amountTokenMin, amountETHMin, to, deadline ); } // **** SWAP **** // requires the initial amount to have already been sent to the first pair function _swap( uint256[] memory amounts, address[] memory path, address _to ) internal virtual { for (uint256 i; i < path.length - 1; i++) { (address input, address output) = (path[i], path[i + 1]); (address token0, ) = ApeswapLibrary.sortTokens(input, output); uint256 amountOut = amounts[i + 1]; (uint256 amount0Out, uint256 amount1Out) = input == token0 ? (uint256(0), amountOut) : (amountOut, uint256(0)); address to = i < path.length - 2 ? ApeswapLibrary.pairFor(factory, output, path[i + 2]) : _to; IApeswapPair(ApeswapLibrary.pairFor(factory, input, output)).swap( amount0Out, amount1Out, to, new bytes(0) ); } } function swapExactTokensForTokens( uint256 amountIn, uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external payable virtual override ensure(deadline) returns (uint256[] memory amounts) { amounts = ApeswapLibrary.getAmountsOut(factory, amountIn, path); require( amounts[amounts.length - 1] >= amountOutMin, "Apeswap: INSUFFICIENT_OUTPUT_AMOUNT" ); require(msg.value >= fee, "Apeswap:- Please send the exact fee amount"); payable(feeWallet).transfer(fee); TransferHelper.safeTransferFrom( path[0], msg.sender, ApeswapLibrary.pairFor(factory, path[0], path[1]), amounts[0] ); _swap(amounts, path, to); } function swapTokensForExactTokens( uint256 amountOut, uint256 amountInMax, address[] calldata path, address to, uint256 deadline ) external payable virtual override ensure(deadline) returns (uint256[] memory amounts) { amounts = ApeswapLibrary.getAmountsIn(factory, amountOut, path); require(amounts[0] <= amountInMax, "Apeswap: EXCESSIVE_INPUT_AMOUNT"); require(msg.value >= fee, "Apeswap:- Please send the exact fee amount"); payable(feeWallet).transfer(fee); TransferHelper.safeTransferFrom( path[0], msg.sender, ApeswapLibrary.pairFor(factory, path[0], path[1]), amounts[0] ); _swap(amounts, path, to); } function swapExactETHForTokens( uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external payable virtual override ensure(deadline) returns (uint256[] memory amounts) { require(path[0] == WETH, "Apeswap: INVALID_PATH"); require( msg.value >= fee, "Apeswap: INSUFFICIENT_FEE - Please send the exact fee amount" ); payable(feeWallet).transfer(fee); uint256 amountForSwap = msg.value - fee; require(amountForSwap > 0, "Apeswap: INSUFFICIENT_SWAP_AMOUNT"); amounts = ApeswapLibrary.getAmountsOut(factory, amountForSwap, path); require( amounts[amounts.length - 1] >= amountOutMin, "Apeswap: INSUFFICIENT_OUTPUT_AMOUNT" ); IWETH(WETH).deposit{value: amountForSwap}(); assert( IWETH(WETH).transfer( ApeswapLibrary.pairFor(factory, path[0], path[1]), amountForSwap ) ); _swap(amounts, path, to); } function swapTokensForExactETH( uint256 amountOut, uint256 amountInMax, address[] calldata path, address to, uint256 deadline ) external payable virtual override ensure(deadline) returns (uint256[] memory amounts) { require(path[path.length - 1] == WETH, "Apeswap: INVALID_PATH"); require(msg.value >= fee, "Apeswap:- Please send the exact fee amount"); payable(feeWallet).transfer(fee); amounts = ApeswapLibrary.getAmountsIn(factory, amountOut, path); require(amounts[0] <= amountInMax, "Apeswap: EXCESSIVE_INPUT_AMOUNT"); TransferHelper.safeTransferFrom( path[0], msg.sender, ApeswapLibrary.pairFor(factory, path[0], path[1]), amounts[0] ); _swap(amounts, path, address(this)); IWETH(WETH).withdraw(amounts[amounts.length - 1]); TransferHelper.safeTransferETH(to, amounts[amounts.length - 1]); } function swapExactTokensForETH( uint256 amountIn, uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external payable virtual override ensure(deadline) returns (uint256[] memory amounts) { require(path[path.length - 1] == WETH, "Apeswap: INVALID_PATH"); amounts = ApeswapLibrary.getAmountsOut(factory, amountIn, path); require( amounts[amounts.length - 1] >= amountOutMin, "Apeswap: INSUFFICIENT_OUTPUT_AMOUNT" ); require(msg.value >= fee, "Apeswap:- Please send the exact fee amount"); payable(feeWallet).transfer(fee); TransferHelper.safeTransferFrom( path[0], msg.sender, ApeswapLibrary.pairFor(factory, path[0], path[1]), amounts[0] ); _swap(amounts, path, address(this)); IWETH(WETH).withdraw(amounts[amounts.length - 1]); TransferHelper.safeTransferETH(to, amounts[amounts.length - 1]); } function swapETHForExactTokens( uint256 amountOut, address[] calldata path, address to, uint256 deadline ) external payable virtual override ensure(deadline) returns (uint256[] memory amounts) { require(path[0] == WETH, "Apeswap: INVALID_PATH"); require(msg.value >= fee, "Apeswap: Insufficient ETH for fee"); payable(feeWallet).transfer(fee); uint256 swapAmount = msg.value - fee; amounts = ApeswapLibrary.getAmountsIn(factory, amountOut, path); require(amounts[0] <= swapAmount, "Apeswap: EXCESSIVE_INPUT_AMOUNT"); IWETH(WETH).deposit{value: amounts[0]}(); assert( IWETH(WETH).transfer( ApeswapLibrary.pairFor(factory, path[0], path[1]), amounts[0] ) ); // Execute the token swap _swap(amounts, path, to); if (swapAmount > amounts[0]) { TransferHelper.safeTransferETH(msg.sender, swapAmount - amounts[0]); } } // **** SWAP (supporting fee-on-transfer tokens) **** // requires the initial amount to have already been sent to the first pair function _swapSupportingFeeOnTransferTokens( address[] memory path, address _to ) internal virtual { for (uint256 i; i < path.length - 1; i++) { (address input, address output) = (path[i], path[i + 1]); (address token0, ) = ApeswapLibrary.sortTokens(input, output); IApeswapPair pair = IApeswapPair( ApeswapLibrary.pairFor(factory, input, output) ); uint256 amountInput; uint256 amountOutput; { // scope to avoid stack too deep errors (uint256 reserve0, uint256 reserve1, ) = pair.getReserves(); (uint256 reserveInput, uint256 reserveOutput) = input == token0 ? (reserve0, reserve1) : (reserve1, reserve0); amountInput = IERC20(input).balanceOf(address(pair)).sub( reserveInput ); amountOutput = ApeswapLibrary.getAmountOut( amountInput, reserveInput, reserveOutput ); } (uint256 amount0Out, uint256 amount1Out) = input == token0 ? (uint256(0), amountOutput) : (amountOutput, uint256(0)); address to = i < path.length - 2 ? ApeswapLibrary.pairFor(factory, output, path[i + 2]) : _to; pair.swap(amount0Out, amount1Out, to, new bytes(0)); } } function swapExactTokensForTokensSupportingFeeOnTransferTokens( uint256 amountIn, uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external payable virtual override ensure(deadline) { require(msg.value >= fee, "Apeswap:- Please send the exact fee amount"); payable(feeWallet).transfer(fee); TransferHelper.safeTransferFrom( path[0], msg.sender, ApeswapLibrary.pairFor(factory, path[0], path[1]), amountIn ); uint256 balanceBefore = IERC20(path[path.length - 1]).balanceOf(to); _swapSupportingFeeOnTransferTokens(path, to); require( IERC20(path[path.length - 1]).balanceOf(to).sub(balanceBefore) >= amountOutMin, "Apeswap: INSUFFICIENT_OUTPUT_AMOUNT" ); } function swapExactETHForTokensSupportingFeeOnTransferTokens( uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external payable virtual override ensure(deadline) { require(path[0] == WETH, "Apeswap: INVALID_PATH"); require(msg.value >= fee, "Apeswap:- Please send the exact fee amount"); payable(feeWallet).transfer(fee); uint256 amountIn = msg.value - fee; IWETH(WETH).deposit{value: amountIn}(); assert( IWETH(WETH).transfer( ApeswapLibrary.pairFor(factory, path[0], path[1]), amountIn ) ); uint256 balanceBefore = IERC20(path[path.length - 1]).balanceOf(to); _swapSupportingFeeOnTransferTokens(path, to); require( IERC20(path[path.length - 1]).balanceOf(to).sub(balanceBefore) >= amountOutMin, "Apeswap: INSUFFICIENT_OUTPUT_AMOUNT" ); } function swapExactTokensForETHSupportingFeeOnTransferTokens( uint256 amountIn, uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external payable virtual override ensure(deadline) { require(path[path.length - 1] == WETH, "Apeswap: INVALID_PATH"); require(msg.value >= fee, "Apeswap:- Please send the exact fee amount"); payable(feeWallet).transfer(fee); TransferHelper.safeTransferFrom( path[0], msg.sender, ApeswapLibrary.pairFor(factory, path[0], path[1]), amountIn ); _swapSupportingFeeOnTransferTokens(path, address(this)); uint256 amountOut = IERC20(WETH).balanceOf(address(this)); require( amountOut >= amountOutMin, "Apeswap: INSUFFICIENT_OUTPUT_AMOUNT" ); IWETH(WETH).withdraw(amountOut); TransferHelper.safeTransferETH(to, amountOut); } // **** LIBRARY FUNCTIONS **** function quote( uint256 amountA, uint256 reserveA, uint256 reserveB ) public pure virtual override returns (uint256 amountB) { return ApeswapLibrary.quote(amountA, reserveA, reserveB); } function getAmountOut( uint256 amountIn, uint256 reserveIn, uint256 reserveOut ) public pure virtual override returns (uint256 amountOut) { return ApeswapLibrary.getAmountOut(amountIn, reserveIn, reserveOut); } function getAmountIn( uint256 amountOut, uint256 reserveIn, uint256 reserveOut ) public pure virtual override returns (uint256 amountIn) { return ApeswapLibrary.getAmountIn(amountOut, reserveIn, reserveOut); } function getAmountsOut(uint256 amountIn, address[] memory path) public view virtual override returns (uint256[] memory amounts) { return ApeswapLibrary.getAmountsOut(factory, amountIn, path); } function getAmountsIn(uint256 amountOut, address[] memory path) public view virtual override returns (uint256[] memory amounts) { return ApeswapLibrary.getAmountsIn(factory, amountOut, path); } function setFee(uint256 newFee) external onlyOwner { fee = newFee; } function withdrawFee(uint256 amount) external onlyOwner { uint256 balance = address(this).balance; require(amount > 0, "Amount must be greater than 0"); require(amount <= balance, "Insufficient contract balance"); (bool success, ) = owner().call{value: amount}(""); require(success, "Withdrawal failed"); } function setFeeWallet(address payable _feeWallet) external onlyOwner { feeWallet = _feeWallet; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"_factory","type":"address"},{"internalType":"address","name":"_WETH","type":"address"}],"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"},{"inputs":[],"name":"WETH","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"},{"internalType":"uint256","name":"amountADesired","type":"uint256"},{"internalType":"uint256","name":"amountBDesired","type":"uint256"},{"internalType":"uint256","name":"amountAMin","type":"uint256"},{"internalType":"uint256","name":"amountBMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"addLiquidity","outputs":[{"internalType":"uint256","name":"amountA","type":"uint256"},{"internalType":"uint256","name":"amountB","type":"uint256"},{"internalType":"uint256","name":"liquidity","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amountTokenDesired","type":"uint256"},{"internalType":"uint256","name":"amountTokenMin","type":"uint256"},{"internalType":"uint256","name":"amountETHMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"addLiquidityETH","outputs":[{"internalType":"uint256","name":"amountToken","type":"uint256"},{"internalType":"uint256","name":"amountETH","type":"uint256"},{"internalType":"uint256","name":"liquidity","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"factory","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"fee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"feeWallet","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"uint256","name":"reserveIn","type":"uint256"},{"internalType":"uint256","name":"reserveOut","type":"uint256"}],"name":"getAmountIn","outputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"reserveIn","type":"uint256"},{"internalType":"uint256","name":"reserveOut","type":"uint256"}],"name":"getAmountOut","outputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"}],"name":"getAmountsIn","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"}],"name":"getAmountsOut","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountA","type":"uint256"},{"internalType":"uint256","name":"reserveA","type":"uint256"},{"internalType":"uint256","name":"reserveB","type":"uint256"}],"name":"quote","outputs":[{"internalType":"uint256","name":"amountB","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"amountAMin","type":"uint256"},{"internalType":"uint256","name":"amountBMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"removeLiquidity","outputs":[{"internalType":"uint256","name":"amountA","type":"uint256"},{"internalType":"uint256","name":"amountB","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"amountTokenMin","type":"uint256"},{"internalType":"uint256","name":"amountETHMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"removeLiquidityETH","outputs":[{"internalType":"uint256","name":"amountToken","type":"uint256"},{"internalType":"uint256","name":"amountETH","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"amountTokenMin","type":"uint256"},{"internalType":"uint256","name":"amountETHMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"removeLiquidityETHSupportingFeeOnTransferTokens","outputs":[{"internalType":"uint256","name":"amountETH","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"amountTokenMin","type":"uint256"},{"internalType":"uint256","name":"amountETHMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"bool","name":"approveMax","type":"bool"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"removeLiquidityETHWithPermit","outputs":[{"internalType":"uint256","name":"amountToken","type":"uint256"},{"internalType":"uint256","name":"amountETH","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"amountTokenMin","type":"uint256"},{"internalType":"uint256","name":"amountETHMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"bool","name":"approveMax","type":"bool"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"removeLiquidityETHWithPermitSupportingFeeOnTransferTokens","outputs":[{"internalType":"uint256","name":"amountETH","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"amountAMin","type":"uint256"},{"internalType":"uint256","name":"amountBMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"bool","name":"approveMax","type":"bool"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"removeLiquidityWithPermit","outputs":[{"internalType":"uint256","name":"amountA","type":"uint256"},{"internalType":"uint256","name":"amountB","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newFee","type":"uint256"}],"name":"setFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"_feeWallet","type":"address"}],"name":"setFeeWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapETHForExactTokens","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactETHForTokens","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactETHForTokensSupportingFeeOnTransferTokens","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactTokensForETH","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactTokensForETHSupportingFeeOnTransferTokens","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactTokensForTokens","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactTokensForTokensSupportingFeeOnTransferTokens","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"uint256","name":"amountInMax","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapTokensForExactETH","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"uint256","name":"amountInMax","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapTokensForExactTokens","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdrawFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
60c060405234801562000010575f80fd5b5060405162004b4f38038062004b4f8339810160408190526200003391620001e4565b6200003e3362000099565b6001600160a01b03808316608052811660a052670de0b6b3a7640000600255600180546001600160a01b0319167301e1f08d341b9b9dd106ae7099b754efaf3982689081179091556200009190620000e8565b50506200021a565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b620000f26200016b565b6001600160a01b0381166200015d5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084015b60405180910390fd5b620001688162000099565b50565b5f546001600160a01b03163314620001c65760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640162000154565b565b80516001600160a01b0381168114620001df575f80fd5b919050565b5f8060408385031215620001f6575f80fd5b6200020183620001c8565b91506200021160208401620001c8565b90509250929050565b60805160a0516147a7620003a85f395f81816101ee015281816104280152818161062f0152818161067e01528181610734015281816109ae01528181610d3201528181610edb01528181611298015281816113d40152818161147d0152818161150b01528181611743015281816117b3015281816119fe01528181611ab401528181611b4001528181611c2401528181611c9401528181612266015281816124c1015281816125160152818161254a015281816125db0152818161270e015281816128c4015261294d01525f81816104ea015281816107b0015281816108dc01528181610a8f01528181610ac601528181610bb601528181610e0a01528181610eb901528181611044015281816116a1015281816117e50152818161190d01528181611cc601528181611edb015281816122160152818161224401528181612363015281816124f40152818161282f0152818161297f0152818161320e0152818161325e015281816135160152818161367501528181613aaf01528181613b4f0152613bc201526147a75ff3fe6080604052600436106101de575f3560e01c806390d49b9d116100fd578063d06ca61f11610092578063f25f4b5611610062578063f25f4b5614610599578063f2fde38b146105b8578063f305d719146105d7578063fb3bdb41146105ea575f80fd5b8063d06ca61f1461050c578063ddca3f431461052b578063ded9382a14610540578063e8e337001461055f575f80fd5b8063b6f9de95116100cd578063b6f9de9514610488578063baa2abde1461049b578063be357616146104ba578063c45a0155146104d9575f80fd5b806390d49b9d146103f8578063ad5c464814610417578063ad615dec1461044a578063af2979eb14610469575f80fd5b80635c11d795116101735780637ff36ab5116101435780637ff36ab51461038357806385f8c259146103965780638803dbee146103b55780638da5cb5b146103c8575f80fd5b80635c11d7951461032a57806369fe0e2d1461033d578063715018a61461035c578063791ac94714610370575f80fd5b80632195995c116101ae5780632195995c146102c657806338ed1739146102e55780634a25d94a146102f85780635b0d59841461030b575f80fd5b806302751cec14610221578063054d50d41461025a57806318cbafe5146102875780631f00ca74146102a7575f80fd5b3661021d57336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461021b5761021b613e7b565b005b5f80fd5b34801561022c575f80fd5b5061024061023b366004613eb3565b6105fd565b604080519283526020830191909152015b60405180910390f35b348015610265575f80fd5b50610279610274366004613f0d565b6106f3565b604051908152602001610251565b61029a610295366004613f77565b610707565b6040516102519190613fe5565b3480156102b2575f80fd5b5061029a6102c136600461403c565b610a88565b3480156102d1575f80fd5b506102406102e0366004614125565b610abe565b61029a6102f3366004613f77565b610b8e565b61029a610306366004613f77565b610d05565b348015610316575f80fd5b506102796103253660046141c8565b610eb2565b61021b610338366004613f77565b610f97565b348015610348575f80fd5b5061021b610357366004614258565b61124d565b348015610367575f80fd5b5061021b61125a565b61021b61037e366004613f77565b61126d565b61029a61039136600461426f565b6114e6565b3480156103a1575f80fd5b506102796103b0366004613f0d565b6118d9565b61029a6103c3366004613f77565b6118e5565b3480156103d3575f80fd5b505f546001600160a01b03165b6040516001600160a01b039091168152602001610251565b348015610403575f80fd5b5061021b6104123660046142d1565b6119a0565b348015610422575f80fd5b506103e07f000000000000000000000000000000000000000000000000000000000000000081565b348015610455575f80fd5b50610279610464366004613f0d565b6119ca565b348015610474575f80fd5b50610279610483366004613eb3565b6119d6565b61021b61049636600461426f565b611b1d565b3480156104a6575f80fd5b506102406104b53660046142f3565b611eb2565b3480156104c5575f80fd5b5061021b6104d4366004614258565b6120d0565b3480156104e4575f80fd5b506103e07f000000000000000000000000000000000000000000000000000000000000000081565b348015610517575f80fd5b5061029a61052636600461403c565b61220f565b348015610536575f80fd5b5061027960025481565b34801561054b575f80fd5b5061024061055a3660046141c8565b61223c565b34801561056a575f80fd5b5061057e610579366004614360565b612326565b60408051938452602084019290925290820152606001610251565b3480156105a4575f80fd5b506001546103e0906001600160a01b031681565b3480156105c3575f80fd5b5061021b6105d23660046142d1565b61241e565b61057e6105e5366004613eb3565b612497565b61029a6105f836600461426f565b6126e9565b5f8082428110156106295760405162461bcd60e51b8152600401610620906143d7565b60405180910390fd5b610658897f00000000000000000000000000000000000000000000000000000000000000008a8a8a308a611eb2565b9093509150610668898685612acf565b604051632e1a7d4d60e01b8152600481018390527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690632e1a7d4d906024015f604051808303815f87803b1580156106c7575f80fd5b505af11580156106d9573d5f803e3d5ffd5b505050506106e78583612bfb565b50965096945050505050565b5f6106ff848484612cd1565b949350505050565b6060814281101561072a5760405162461bcd60e51b8152600401610620906143d7565b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000168686610761600182614415565b81811061077057610770614428565b905060200201602081019061078591906142d1565b6001600160a01b0316146107ab5760405162461bcd60e51b81526004016106209061443c565b6108087f0000000000000000000000000000000000000000000000000000000000000000898888808060200260200160405190810160405280939291908181526020018383602002808284375f92019190915250612da792505050565b915086826001845161081a9190614415565b8151811061082a5761082a614428565b602002602001015110156108505760405162461bcd60e51b81526004016106209061446b565b6002543410156108725760405162461bcd60e51b8152600401610620906144ae565b6001546002546040516001600160a01b039092169181156108fc0291905f818181858888f193505050501580156108ab573d5f803e3d5ffd5b5061096e86865f8181106108c1576108c1614428565b90506020020160208101906108d691906142d1565b3361094f7f00000000000000000000000000000000000000000000000000000000000000008a8a5f81811061090d5761090d614428565b905060200201602081019061092291906142d1565b8b8b600181811061093557610935614428565b905060200201602081019061094a91906142d1565b612f23565b855f8151811061096157610961614428565b6020026020010151612ffa565b6109ac828787808060200260200160405190810160405280939291908181526020018383602002808284375f92019190915250309250613133915050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632e1a7d4d83600185516109ea9190614415565b815181106109fa576109fa614428565b60200260200101516040518263ffffffff1660e01b8152600401610a2091815260200190565b5f604051808303815f87803b158015610a37575f80fd5b505af1158015610a49573d5f803e3d5ffd5b50505050610a7d848360018551610a609190614415565b81518110610a7057610a70614428565b6020026020010151612bfb565b509695505050505050565b6060610ab57f00000000000000000000000000000000000000000000000000000000000000008484613326565b90505b92915050565b5f805f610aec7f00000000000000000000000000000000000000000000000000000000000000008f8f612f23565b90505f87610afa578c610afd565b5f195b60405163d505accf60e01b81529091506001600160a01b0383169063d505accf90610b38903390309086908f908e908e908e906004016144f8565b5f604051808303815f87803b158015610b4f575f80fd5b505af1158015610b61573d5f803e3d5ffd5b50505050610b748f8f8f8f8f8f8f611eb2565b809450819550505050509b509b9950505050505050505050565b60608142811015610bb15760405162461bcd60e51b8152600401610620906143d7565b610c0e7f0000000000000000000000000000000000000000000000000000000000000000898888808060200260200160405190810160405280939291908181526020018383602002808284375f92019190915250612da792505050565b9150868260018451610c209190614415565b81518110610c3057610c30614428565b60200260200101511015610c565760405162461bcd60e51b81526004016106209061446b565b600254341015610c785760405162461bcd60e51b8152600401610620906144ae565b6001546002546040516001600160a01b039092169181156108fc0291905f818181858888f19350505050158015610cb1573d5f803e3d5ffd5b50610cc786865f8181106108c1576108c1614428565b610a7d828787808060200260200160405190810160405280939291908181526020018383602002808284375f92019190915250899250613133915050565b60608142811015610d285760405162461bcd60e51b8152600401610620906143d7565b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000168686610d5f600182614415565b818110610d6e57610d6e614428565b9050602002016020810190610d8391906142d1565b6001600160a01b031614610da95760405162461bcd60e51b81526004016106209061443c565b600254341015610dcb5760405162461bcd60e51b8152600401610620906144ae565b6001546002546040516001600160a01b039092169181156108fc0291905f818181858888f19350505050158015610e04573d5f803e3d5ffd5b50610e627f0000000000000000000000000000000000000000000000000000000000000000898888808060200260200160405190810160405280939291908181526020018383602002808284375f9201919091525061332692505050565b915086825f81518110610e7757610e77614428565b60200260200101511115610e9d5760405162461bcd60e51b815260040161062090614539565b61096e86865f8181106108c1576108c1614428565b5f80610eff7f00000000000000000000000000000000000000000000000000000000000000008d7f0000000000000000000000000000000000000000000000000000000000000000612f23565b90505f86610f0d578b610f10565b5f195b60405163d505accf60e01b81529091506001600160a01b0383169063d505accf90610f4b903390309086908e908d908d908d906004016144f8565b5f604051808303815f87803b158015610f62575f80fd5b505af1158015610f74573d5f803e3d5ffd5b50505050610f868d8d8d8d8d8d6119d6565b9d9c50505050505050505050505050565b8042811015610fb85760405162461bcd60e51b8152600401610620906143d7565b600254341015610fda5760405162461bcd60e51b8152600401610620906144ae565b6001546002546040516001600160a01b039092169181156108fc0291905f818181858888f19350505050158015611013573d5f803e3d5ffd5b506110a385855f81811061102957611029614428565b905060200201602081019061103e91906142d1565b3361109d7f000000000000000000000000000000000000000000000000000000000000000089895f81811061107557611075614428565b905060200201602081019061108a91906142d1565b8a8a600181811061093557610935614428565b8a612ffa565b5f85856110b1600182614415565b8181106110c0576110c0614428565b90506020020160208101906110d591906142d1565b6040516370a0823160e01b81526001600160a01b03868116600483015291909116906370a0823190602401602060405180830381865afa15801561111b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061113f9190614570565b905061117e8686808060200260200160405190810160405280939291908181526020018383602002808284375f920191909152508892506134a5915050565b86611225828888611190600182614415565b81811061119f5761119f614428565b90506020020160208101906111b491906142d1565b6040516370a0823160e01b81526001600160a01b03898116600483015291909116906370a08231906024015b602060405180830381865afa1580156111fb573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061121f9190614570565b90613724565b10156112435760405162461bcd60e51b81526004016106209061446b565b5050505050505050565b611255613779565b600255565b611262613779565b61126b5f6137d2565b565b804281101561128e5760405162461bcd60e51b8152600401610620906143d7565b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001685856112c5600182614415565b8181106112d4576112d4614428565b90506020020160208101906112e991906142d1565b6001600160a01b03161461130f5760405162461bcd60e51b81526004016106209061443c565b6002543410156113315760405162461bcd60e51b8152600401610620906144ae565b6001546002546040516001600160a01b039092169181156108fc0291905f818181858888f1935050505015801561136a573d5f803e3d5ffd5b5061138085855f81811061102957611029614428565b6113bd8585808060200260200160405190810160405280939291908181526020018383602002808284375f920191909152503092506134a5915050565b6040516370a0823160e01b81523060048201525f907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906370a0823190602401602060405180830381865afa158015611421573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906114459190614570565b9050868110156114675760405162461bcd60e51b81526004016106209061446b565b604051632e1a7d4d60e01b8152600481018290527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690632e1a7d4d906024015f604051808303815f87803b1580156114c6575f80fd5b505af11580156114d8573d5f803e3d5ffd5b505050506112438482612bfb565b606081428110156115095760405162461bcd60e51b8152600401610620906143d7565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031686865f81811061154557611545614428565b905060200201602081019061155a91906142d1565b6001600160a01b0316146115805760405162461bcd60e51b81526004016106209061443c565b6002543410156115f85760405162461bcd60e51b815260206004820152603c60248201527f417065737761703a20494e53554646494349454e545f464545202d20506c656160448201527f73652073656e64207468652065786163742066656520616d6f756e74000000006064820152608401610620565b6001546002546040516001600160a01b039092169181156108fc0291905f818181858888f19350505050158015611631573d5f803e3d5ffd5b505f600254346116419190614415565b90505f811161169c5760405162461bcd60e51b815260206004820152602160248201527f417065737761703a20494e53554646494349454e545f535741505f414d4f554e6044820152601560fa1b6064820152608401610620565b6116f97f0000000000000000000000000000000000000000000000000000000000000000828989808060200260200160405190810160405280939291908181526020018383602002808284375f92019190915250612da792505050565b925087836001855161170b9190614415565b8151811061171b5761171b614428565b602002602001015110156117415760405162461bcd60e51b81526004016106209061446b565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db0826040518263ffffffff1660e01b81526004015f604051808303818588803b15801561179a575f80fd5b505af11580156117ac573d5f803e3d5ffd5b50505050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a9059cbb6118167f00000000000000000000000000000000000000000000000000000000000000008a8a5f81811061090d5761090d614428565b6040516001600160e01b031960e084901b1681526001600160a01b039091166004820152602481018490526044016020604051808303815f875af1158015611860573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906118849190614587565b61189057611890613e7b565b6118ce838888808060200260200160405190810160405280939291908181526020018383602002808284375f920191909152508a9250613133915050565b505095945050505050565b5f6106ff848484613821565b606081428110156119085760405162461bcd60e51b8152600401610620906143d7565b6119657f0000000000000000000000000000000000000000000000000000000000000000898888808060200260200160405190810160405280939291908181526020018383602002808284375f9201919091525061332692505050565b915086825f8151811061197a5761197a614428565b60200260200101511115610c565760405162461bcd60e51b815260040161062090614539565b6119a8613779565b600180546001600160a01b0319166001600160a01b0392909216919091179055565b5f6106ff8484846138f3565b5f81428110156119f85760405162461bcd60e51b8152600401610620906143d7565b611a27887f00000000000000000000000000000000000000000000000000000000000000008989893089611eb2565b6040516370a0823160e01b8152306004820152909350611a9e9150899086906001600160a01b038316906370a0823190602401602060405180830381865afa158015611a75573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611a999190614570565b612acf565b604051632e1a7d4d60e01b8152600481018390527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690632e1a7d4d906024015f604051808303815f87803b158015611afd575f80fd5b505af1158015611b0f573d5f803e3d5ffd5b50505050610a7d8483612bfb565b8042811015611b3e5760405162461bcd60e51b8152600401610620906143d7565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031685855f818110611b7a57611b7a614428565b9050602002016020810190611b8f91906142d1565b6001600160a01b031614611bb55760405162461bcd60e51b81526004016106209061443c565b600254341015611bd75760405162461bcd60e51b8152600401610620906144ae565b6001546002546040516001600160a01b039092169181156108fc0291905f818181858888f19350505050158015611c10573d5f803e3d5ffd5b505f60025434611c209190614415565b90507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db0826040518263ffffffff1660e01b81526004015f604051808303818588803b158015611c7b575f80fd5b505af1158015611c8d573d5f803e3d5ffd5b50505050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a9059cbb611cf77f000000000000000000000000000000000000000000000000000000000000000089895f81811061107557611075614428565b6040516001600160e01b031960e084901b1681526001600160a01b039091166004820152602481018490526044016020604051808303815f875af1158015611d41573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611d659190614587565b611d7157611d71613e7b565b5f8686611d7f600182614415565b818110611d8e57611d8e614428565b9050602002016020810190611da391906142d1565b6040516370a0823160e01b81526001600160a01b03878116600483015291909116906370a0823190602401602060405180830381865afa158015611de9573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611e0d9190614570565b9050611e4c8787808060200260200160405190810160405280939291908181526020018383602002808284375f920191909152508992506134a5915050565b87611225828989611e5e600182614415565b818110611e6d57611e6d614428565b9050602002016020810190611e8291906142d1565b6040516370a0823160e01b81526001600160a01b038a8116600483015291909116906370a08231906024016111e0565b5f808242811015611ed55760405162461bcd60e51b8152600401610620906143d7565b5f611f017f00000000000000000000000000000000000000000000000000000000000000008c8c612f23565b6040516323b872dd60e01b81523360048201526001600160a01b03821660248201819052604482018c90529192506323b872dd906064016020604051808303815f875af1158015611f54573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611f789190614587565b5060405163226bf2d160e21b81526001600160a01b0387811660048301525f9182918416906389afcb449060240160408051808303815f875af1158015611fc1573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611fe591906145a2565b915091505f611ff48e8e61398e565b509050806001600160a01b03168e6001600160a01b03161461201757818361201a565b82825b90975095508a87101561206f5760405162461bcd60e51b815260206004820152601e60248201527f417065737761703a20494e53554646494349454e545f415f414d4f554e5400006044820152606401610620565b898610156120bf5760405162461bcd60e51b815260206004820152601e60248201527f417065737761703a20494e53554646494349454e545f425f414d4f554e5400006044820152606401610620565b505050505097509795505050505050565b6120d8613779565b47816121265760405162461bcd60e51b815260206004820152601d60248201527f416d6f756e74206d7573742062652067726561746572207468616e20300000006044820152606401610620565b808211156121765760405162461bcd60e51b815260206004820152601d60248201527f496e73756666696369656e7420636f6e74726163742062616c616e63650000006044820152606401610620565b5f80546040516001600160a01b039091169084908381818185875af1925050503d805f81146121c0576040519150601f19603f3d011682016040523d82523d5f602084013e6121c5565b606091505b505090508061220a5760405162461bcd60e51b815260206004820152601160248201527015da5d1a191c985dd85b0819985a5b1959607a1b6044820152606401610620565b505050565b6060610ab57f00000000000000000000000000000000000000000000000000000000000000008484612da7565b5f805f61228a7f00000000000000000000000000000000000000000000000000000000000000008e7f0000000000000000000000000000000000000000000000000000000000000000612f23565b90505f87612298578c61229b565b5f195b60405163d505accf60e01b81529091506001600160a01b0383169063d505accf906122d6903390309086908f908e908e908e906004016144f8565b5f604051808303815f87803b1580156122ed575f80fd5b505af11580156122ff573d5f803e3d5ffd5b505050506123118e8e8e8e8e8e6105fd565b909f909e509c50505050505050505050505050565b5f805f834281101561234a5760405162461bcd60e51b8152600401610620906143d7565b6123588c8c8c8c8c8c613a82565b90945092505f6123897f00000000000000000000000000000000000000000000000000000000000000008e8e612f23565b90506123978d338388612ffa565b6123a38c338387612ffa565b6040516335313c2160e11b81526001600160a01b038881166004830152821690636a627842906024016020604051808303815f875af11580156123e8573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061240c9190614570565b92505050985098509895505050505050565b612426613779565b6001600160a01b03811661248b5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610620565b612494816137d2565b50565b5f805f83428110156124bb5760405162461bcd60e51b8152600401610620906143d7565b6124e98a7f00000000000000000000000000000000000000000000000000000000000000008b348c8c613a82565b90945092505f61253a7f00000000000000000000000000000000000000000000000000000000000000008c7f0000000000000000000000000000000000000000000000000000000000000000612f23565b90506125488b338388612ffa565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db0856040518263ffffffff1660e01b81526004015f604051808303818588803b1580156125a1575f80fd5b505af11580156125b3573d5f803e3d5ffd5b505060405163a9059cbb60e01b81526001600160a01b038581166004830152602482018990527f000000000000000000000000000000000000000000000000000000000000000016935063a9059cbb925060440190506020604051808303815f875af1158015612625573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906126499190614587565b61265557612655613e7b565b6040516335313c2160e11b81526001600160a01b038881166004830152821690636a627842906024016020604051808303815f875af115801561269a573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906126be9190614570565b9250833411156126db576126db336126d68634614415565b612bfb565b505096509650969350505050565b6060814281101561270c5760405162461bcd60e51b8152600401610620906143d7565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031686865f81811061274857612748614428565b905060200201602081019061275d91906142d1565b6001600160a01b0316146127835760405162461bcd60e51b81526004016106209061443c565b6002543410156127df5760405162461bcd60e51b815260206004820152602160248201527f417065737761703a20496e73756666696369656e742045544820666f722066656044820152606560f81b6064820152608401610620565b6001546002546040516001600160a01b039092169181156108fc0291905f818181858888f19350505050158015612818573d5f803e3d5ffd5b505f600254346128289190614415565b90506128877f0000000000000000000000000000000000000000000000000000000000000000898989808060200260200160405190810160405280939291908181526020018383602002808284375f9201919091525061332692505050565b925080835f8151811061289c5761289c614428565b602002602001015111156128c25760405162461bcd60e51b815260040161062090614539565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db0845f8151811061290357612903614428565b60200260200101516040518263ffffffff1660e01b81526004015f604051808303818588803b158015612934575f80fd5b505af1158015612946573d5f803e3d5ffd5b50505050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a9059cbb6129b07f00000000000000000000000000000000000000000000000000000000000000008a8a5f81811061090d5761090d614428565b855f815181106129c2576129c2614428565b60200260200101516040518363ffffffff1660e01b81526004016129fb9291906001600160a01b03929092168252602082015260400190565b6020604051808303815f875af1158015612a17573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612a3b9190614587565b612a4757612a47613e7b565b612a85838888808060200260200160405190810160405280939291908181526020018383602002808284375f920191909152508a9250613133915050565b825f81518110612a9757612a97614428565b60200260200101518111156118ce576118ce33845f81518110612abc57612abc614428565b6020026020010151836126d69190614415565b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180516001600160e01b031663a9059cbb60e01b17905291515f92839290871691612b2a91906145e6565b5f604051808303815f865af19150503d805f8114612b63576040519150601f19603f3d011682016040523d82523d5f602084013e612b68565b606091505b5091509150818015612b92575080511580612b92575080806020019051810190612b929190614587565b612bf45760405162461bcd60e51b815260206004820152602d60248201527f5472616e7366657248656c7065723a3a736166655472616e736665723a20747260448201526c185b9cd9995c8819985a5b1959609a1b6064820152608401610620565b5050505050565b604080515f808252602082019092526001600160a01b038416908390604051612c2491906145e6565b5f6040518083038185875af1925050503d805f8114612c5e576040519150601f19603f3d011682016040523d82523d5f602084013e612c63565b606091505b505090508061220a5760405162461bcd60e51b815260206004820152603460248201527f5472616e7366657248656c7065723a3a736166655472616e736665724554483a60448201527308115512081d1c985b9cd9995c8819985a5b195960621b6064820152608401610620565b5f808411612d335760405162461bcd60e51b815260206004820152602960248201527f417065737761704c6962726172793a20494e53554646494349454e545f494e50604482015268155517d05353d5539560ba1b6064820152608401610620565b5f83118015612d4157505f82115b612d5d5760405162461bcd60e51b815260040161062090614601565b5f612d6a856103e5613cfc565b90505f612d778285613cfc565b90505f612d9083612d8a886103e8613cfc565b90613d62565b9050612d9c8183614647565b979650505050505050565b6060600282511015612dfb5760405162461bcd60e51b815260206004820152601c60248201527f417065737761704c6962726172793a20494e56414c49445f50415448000000006044820152606401610620565b815167ffffffffffffffff811115612e1557612e15614028565b604051908082528060200260200182016040528015612e3e578160200160208202803683370190505b50905082815f81518110612e5457612e54614428565b6020026020010181815250505f5b60018351612e709190614415565b811015612f1b575f80612ec287868581518110612e8f57612e8f614428565b602002602001015187866001612ea59190614666565b81518110612eb557612eb5614428565b6020026020010151613db6565b91509150612eea848481518110612edb57612edb614428565b60200260200101518383612cd1565b84612ef6856001614666565b81518110612f0657612f06614428565b60209081029190910101525050600101612e62565b509392505050565b5f805f612f30858561398e565b6040516bffffffffffffffffffffffff19606084811b8216602084015283901b1660348201529193509150869060480160405160208183030381529060405280519060200120604051602001612fd89291906001600160f81b0319815260609290921b6bffffffffffffffffffffffff1916600183015260158201527f0b28dad2cc786741db4a85dbfc89accb5a945eef968d3efeffef340654708cc3603582015260550190565b60408051601f1981840301815291905280516020909101209695505050505050565b604080516001600160a01b0385811660248301528481166044830152606480830185905283518084039091018152608490920183526020820180516001600160e01b03166323b872dd60e01b17905291515f9283929088169161305d91906145e6565b5f604051808303815f865af19150503d805f8114613096576040519150601f19603f3d011682016040523d82523d5f602084013e61309b565b606091505b50915091508180156130c55750805115806130c55750808060200190518101906130c59190614587565b61312b5760405162461bcd60e51b815260206004820152603160248201527f5472616e7366657248656c7065723a3a7472616e7366657246726f6d3a207472604482015270185b9cd9995c919c9bdb4819985a5b1959607a1b6064820152608401610620565b505050505050565b5f5b600183516131439190614415565b811015613320575f8084838151811061315e5761315e614428565b6020026020010151858460016131749190614666565b8151811061318457613184614428565b6020026020010151915091505f61319b838361398e565b5090505f876131ab866001614666565b815181106131bb576131bb614428565b602002602001015190505f80836001600160a01b0316866001600160a01b0316146131e757825f6131ea565b5f835b915091505f60028a516131fd9190614415565b88106132095788613257565b6132577f0000000000000000000000000000000000000000000000000000000000000000878c61323a8c6002614666565b8151811061324a5761324a614428565b6020026020010151612f23565b90506132847f00000000000000000000000000000000000000000000000000000000000000008888612f23565b6001600160a01b031663022c0d9f8484845f6040519080825280601f01601f1916602001820160405280156132c0576020820181803683370190505b506040518563ffffffff1660e01b81526004016132e09493929190614679565b5f604051808303815f87803b1580156132f7575f80fd5b505af1158015613309573d5f803e3d5ffd5b505060019099019850613135975050505050505050565b50505050565b606060028251101561337a5760405162461bcd60e51b815260206004820152601c60248201527f417065737761704c6962726172793a20494e56414c49445f50415448000000006044820152606401610620565b815167ffffffffffffffff81111561339457613394614028565b6040519080825280602002602001820160405280156133bd578160200160208202803683370190505b5090508281600183516133d09190614415565b815181106133e0576133e0614428565b6020026020010181815250505f600183516133fb9190614415565b90505b8015612f1b575f806134408786613416600187614415565b8151811061342657613426614428565b6020026020010151878681518110612eb557612eb5614428565b9150915061346884848151811061345957613459614428565b60200260200101518383613821565b84613474600186614415565b8151811061348457613484614428565b6020026020010181815250505050808061349d906146c8565b9150506133fe565b5f5b600183516134b59190614415565b81101561220a575f808483815181106134d0576134d0614428565b6020026020010151858460016134e69190614666565b815181106134f6576134f6614428565b6020026020010151915091505f61350d838361398e565b5090505f61353c7f00000000000000000000000000000000000000000000000000000000000000008585612f23565b90505f805f80846001600160a01b0316630902f1ac6040518163ffffffff1660e01b8152600401606060405180830381865afa15801561357e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906135a291906146f3565b506001600160701b031691506001600160701b031691505f80876001600160a01b03168a6001600160a01b0316146135db5782846135de565b83835b6040516370a0823160e01b81526001600160a01b038a81166004830152929450909250613619918491908d16906370a08231906024016111e0565b9550613626868383612cd1565b9450505050505f80856001600160a01b0316886001600160a01b03161461364e57825f613651565b5f835b915091505f60028c516136649190614415565b8a10613670578a6136a1565b6136a17f0000000000000000000000000000000000000000000000000000000000000000898e61323a8e6002614666565b604080515f8152602081019182905263022c0d9f60e01b9091529091506001600160a01b0387169063022c0d9f906136e29086908690869060248101614679565b5f604051808303815f87803b1580156136f9575f80fd5b505af115801561370b573d5f803e3d5ffd5b50506001909b019a506134a79950505050505050505050565b5f826137308382614415565b9150811115610ab85760405162461bcd60e51b815260206004820152601560248201527464732d6d6174682d7375622d756e646572666c6f7760581b6044820152606401610620565b5f546001600160a01b0316331461126b5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610620565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b5f8084116138845760405162461bcd60e51b815260206004820152602a60248201527f417065737761704c6962726172793a20494e53554646494349454e545f4f555460448201526914155517d05353d5539560b21b6064820152608401610620565b5f8311801561389257505f82115b6138ae5760405162461bcd60e51b815260040161062090614601565b5f6138c56103e86138bf8688613cfc565b90613cfc565b90505f6138d86103e56138bf8689613724565b90506138e96001612d8a8385614647565b9695505050505050565b5f80841161394f5760405162461bcd60e51b815260206004820152602360248201527f417065737761704c6962726172793a20494e53554646494349454e545f414d4f60448201526215539560ea1b6064820152608401610620565b5f8311801561395d57505f82115b6139795760405162461bcd60e51b815260040161062090614601565b826139848584613cfc565b6106ff9190614647565b5f80826001600160a01b0316846001600160a01b0316036139fd5760405162461bcd60e51b815260206004820152602360248201527f417065737761704c6962726172793a204944454e544943414c5f41444452455360448201526253455360e81b6064820152608401610620565b826001600160a01b0316846001600160a01b031610613a1d578284613a20565b83835b90925090506001600160a01b038216613a7b5760405162461bcd60e51b815260206004820152601c60248201527f417065737761704c6962726172793a205a45524f5f41444452455353000000006044820152606401610620565b9250929050565b60405163e6a4390560e01b81526001600160a01b03878116600483015286811660248301525f91829182917f00000000000000000000000000000000000000000000000000000000000000009091169063e6a4390590604401602060405180830381865afa158015613af6573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613b1a919061473f565b6001600160a01b031603613bbb576040516364e329cb60e11b81526001600160a01b03898116600483015288811660248301527f0000000000000000000000000000000000000000000000000000000000000000169063c9c65396906044016020604051808303815f875af1158015613b95573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613bb9919061473f565b505b5f80613be87f00000000000000000000000000000000000000000000000000000000000000008b8b613db6565b91509150815f148015613bf9575080155b15613c0957879350869250613cef565b5f613c158984846138f3565b9050878111613c795785811015613c6e5760405162461bcd60e51b815260206004820152601e60248201527f417065737761703a20494e53554646494349454e545f425f414d4f554e5400006044820152606401610620565b889450925082613ced565b5f613c858984866138f3565b905089811115613c9757613c97613e7b565b87811015613ce75760405162461bcd60e51b815260206004820152601e60248201527f417065737761703a20494e53554646494349454e545f415f414d4f554e5400006044820152606401610620565b94508793505b505b5050965096945050505050565b5f811580613d1f57508282613d11818361475a565b9250613d1d9083614647565b145b610ab85760405162461bcd60e51b815260206004820152601460248201527364732d6d6174682d6d756c2d6f766572666c6f7760601b6044820152606401610620565b5f82613d6e8382614666565b9150811015610ab85760405162461bcd60e51b815260206004820152601460248201527364732d6d6174682d6164642d6f766572666c6f7760601b6044820152606401610620565b5f805f613dc3858561398e565b5090505f80613dd3888888612f23565b6001600160a01b0316630902f1ac6040518163ffffffff1660e01b8152600401606060405180830381865afa158015613e0e573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613e3291906146f3565b506001600160701b031691506001600160701b03169150826001600160a01b0316876001600160a01b031614613e69578082613e6c565b81815b90999098509650505050505050565b634e487b7160e01b5f52600160045260245ffd5b6001600160a01b0381168114612494575f80fd5b8035613eae81613e8f565b919050565b5f805f805f8060c08789031215613ec8575f80fd5b8635613ed381613e8f565b95506020870135945060408701359350606087013592506080870135613ef881613e8f565b8092505060a087013590509295509295509295565b5f805f60608486031215613f1f575f80fd5b505081359360208301359350604090920135919050565b5f8083601f840112613f46575f80fd5b50813567ffffffffffffffff811115613f5d575f80fd5b6020830191508360208260051b8501011115613a7b575f80fd5b5f805f805f8060a08789031215613f8c575f80fd5b8635955060208701359450604087013567ffffffffffffffff811115613fb0575f80fd5b613fbc89828a01613f36565b9095509350506060870135613fd081613e8f565b80925050608087013590509295509295509295565b602080825282518282018190525f9190848201906040850190845b8181101561401c57835183529284019291840191600101614000565b50909695505050505050565b634e487b7160e01b5f52604160045260245ffd5b5f806040838503121561404d575f80fd5b8235915060208084013567ffffffffffffffff8082111561406c575f80fd5b818601915086601f83011261407f575f80fd5b81358181111561409157614091614028565b8060051b604051601f19603f830116810181811085821117156140b6576140b6614028565b6040529182528482019250838101850191898311156140d3575f80fd5b938501935b828510156140f8576140e985613ea3565b845293850193928501926140d8565b8096505050505050509250929050565b8015158114612494575f80fd5b803560ff81168114613eae575f80fd5b5f805f805f805f805f805f6101608c8e031215614140575f80fd5b8b3561414b81613e8f565b9a5060208c013561415b81613e8f565b995060408c0135985060608c0135975060808c0135965060a08c013561418081613e8f565b955060c08c0135945060e08c013561419781614108565b93506141a66101008d01614115565b92506101208c013591506101408c013590509295989b509295989b9093969950565b5f805f805f805f805f806101408b8d0312156141e2575f80fd5b8a356141ed81613e8f565b995060208b0135985060408b0135975060608b0135965060808b013561421281613e8f565b955060a08b0135945060c08b013561422981614108565b935061423760e08c01614115565b92506101008b013591506101208b013590509295989b9194979a5092959850565b5f60208284031215614268575f80fd5b5035919050565b5f805f805f60808688031215614283575f80fd5b85359450602086013567ffffffffffffffff8111156142a0575f80fd5b6142ac88828901613f36565b90955093505060408601356142c081613e8f565b949793965091946060013592915050565b5f602082840312156142e1575f80fd5b81356142ec81613e8f565b9392505050565b5f805f805f805f60e0888a031215614309575f80fd5b873561431481613e8f565b9650602088013561432481613e8f565b955060408801359450606088013593506080880135925060a088013561434981613e8f565b8092505060c0880135905092959891949750929550565b5f805f805f805f80610100898b031215614378575f80fd5b883561438381613e8f565b9750602089013561439381613e8f565b965060408901359550606089013594506080890135935060a0890135925060c08901356143bf81613e8f565b8092505060e089013590509295985092959890939650565b60208082526010908201526f105c195cddd85c0e881156141254915160821b604082015260600190565b634e487b7160e01b5f52601160045260245ffd5b81810381811115610ab857610ab8614401565b634e487b7160e01b5f52603260045260245ffd5b602080825260159082015274082e0cae6eec2e07440929cac82989288bea082a89605b1b604082015260600190565b60208082526023908201527f417065737761703a20494e53554646494349454e545f4f55545055545f414d4f60408201526215539560ea1b606082015260800190565b6020808252602a908201527f417065737761703a2d20506c656173652073656e64207468652065786163742060408201526919995948185b5bdd5b9d60b21b606082015260800190565b6001600160a01b0397881681529590961660208601526040850193909352606084019190915260ff16608083015260a082015260c081019190915260e00190565b6020808252601f908201527f417065737761703a204558434553534956455f494e5055545f414d4f554e5400604082015260600190565b5f60208284031215614580575f80fd5b5051919050565b5f60208284031215614597575f80fd5b81516142ec81614108565b5f80604083850312156145b3575f80fd5b505080516020909101519092909150565b5f5b838110156145de5781810151838201526020016145c6565b50505f910152565b5f82516145f78184602087016145c4565b9190910192915050565b60208082526026908201527f417065737761704c6962726172793a20494e53554646494349454e545f4c495160408201526555494449545960d01b606082015260800190565b5f8261466157634e487b7160e01b5f52601260045260245ffd5b500490565b80820180821115610ab857610ab8614401565b84815283602082015260018060a01b0383166040820152608060608201525f82518060808401526146b18160a08501602087016145c4565b601f01601f19169190910160a00195945050505050565b5f816146d6576146d6614401565b505f190190565b80516001600160701b0381168114613eae575f80fd5b5f805f60608486031215614705575f80fd5b61470e846146dd565b925061471c602085016146dd565b9150604084015163ffffffff81168114614734575f80fd5b809150509250925092565b5f6020828403121561474f575f80fd5b81516142ec81613e8f565b8082028115828204841417610ab857610ab861440156fea264697066735822122007f0622469e85c245370692c3c86b936d59ce823243ab5e1e528360ab0a5b54464736f6c634300081800330000000000000000000000002cce9d4cc6612d1775bb6ff2a9f989c788b895f6000000000000000000000000cd10c6b0c5c8d589826b60ead88e51df0771f739
Deployed Bytecode
0x6080604052600436106101de575f3560e01c806390d49b9d116100fd578063d06ca61f11610092578063f25f4b5611610062578063f25f4b5614610599578063f2fde38b146105b8578063f305d719146105d7578063fb3bdb41146105ea575f80fd5b8063d06ca61f1461050c578063ddca3f431461052b578063ded9382a14610540578063e8e337001461055f575f80fd5b8063b6f9de95116100cd578063b6f9de9514610488578063baa2abde1461049b578063be357616146104ba578063c45a0155146104d9575f80fd5b806390d49b9d146103f8578063ad5c464814610417578063ad615dec1461044a578063af2979eb14610469575f80fd5b80635c11d795116101735780637ff36ab5116101435780637ff36ab51461038357806385f8c259146103965780638803dbee146103b55780638da5cb5b146103c8575f80fd5b80635c11d7951461032a57806369fe0e2d1461033d578063715018a61461035c578063791ac94714610370575f80fd5b80632195995c116101ae5780632195995c146102c657806338ed1739146102e55780634a25d94a146102f85780635b0d59841461030b575f80fd5b806302751cec14610221578063054d50d41461025a57806318cbafe5146102875780631f00ca74146102a7575f80fd5b3661021d57336001600160a01b037f000000000000000000000000cd10c6b0c5c8d589826b60ead88e51df0771f739161461021b5761021b613e7b565b005b5f80fd5b34801561022c575f80fd5b5061024061023b366004613eb3565b6105fd565b604080519283526020830191909152015b60405180910390f35b348015610265575f80fd5b50610279610274366004613f0d565b6106f3565b604051908152602001610251565b61029a610295366004613f77565b610707565b6040516102519190613fe5565b3480156102b2575f80fd5b5061029a6102c136600461403c565b610a88565b3480156102d1575f80fd5b506102406102e0366004614125565b610abe565b61029a6102f3366004613f77565b610b8e565b61029a610306366004613f77565b610d05565b348015610316575f80fd5b506102796103253660046141c8565b610eb2565b61021b610338366004613f77565b610f97565b348015610348575f80fd5b5061021b610357366004614258565b61124d565b348015610367575f80fd5b5061021b61125a565b61021b61037e366004613f77565b61126d565b61029a61039136600461426f565b6114e6565b3480156103a1575f80fd5b506102796103b0366004613f0d565b6118d9565b61029a6103c3366004613f77565b6118e5565b3480156103d3575f80fd5b505f546001600160a01b03165b6040516001600160a01b039091168152602001610251565b348015610403575f80fd5b5061021b6104123660046142d1565b6119a0565b348015610422575f80fd5b506103e07f000000000000000000000000cd10c6b0c5c8d589826b60ead88e51df0771f73981565b348015610455575f80fd5b50610279610464366004613f0d565b6119ca565b348015610474575f80fd5b50610279610483366004613eb3565b6119d6565b61021b61049636600461426f565b611b1d565b3480156104a6575f80fd5b506102406104b53660046142f3565b611eb2565b3480156104c5575f80fd5b5061021b6104d4366004614258565b6120d0565b3480156104e4575f80fd5b506103e07f0000000000000000000000002cce9d4cc6612d1775bb6ff2a9f989c788b895f681565b348015610517575f80fd5b5061029a61052636600461403c565b61220f565b348015610536575f80fd5b5061027960025481565b34801561054b575f80fd5b5061024061055a3660046141c8565b61223c565b34801561056a575f80fd5b5061057e610579366004614360565b612326565b60408051938452602084019290925290820152606001610251565b3480156105a4575f80fd5b506001546103e0906001600160a01b031681565b3480156105c3575f80fd5b5061021b6105d23660046142d1565b61241e565b61057e6105e5366004613eb3565b612497565b61029a6105f836600461426f565b6126e9565b5f8082428110156106295760405162461bcd60e51b8152600401610620906143d7565b60405180910390fd5b610658897f000000000000000000000000cd10c6b0c5c8d589826b60ead88e51df0771f7398a8a8a308a611eb2565b9093509150610668898685612acf565b604051632e1a7d4d60e01b8152600481018390527f000000000000000000000000cd10c6b0c5c8d589826b60ead88e51df0771f7396001600160a01b031690632e1a7d4d906024015f604051808303815f87803b1580156106c7575f80fd5b505af11580156106d9573d5f803e3d5ffd5b505050506106e78583612bfb565b50965096945050505050565b5f6106ff848484612cd1565b949350505050565b6060814281101561072a5760405162461bcd60e51b8152600401610620906143d7565b6001600160a01b037f000000000000000000000000cd10c6b0c5c8d589826b60ead88e51df0771f739168686610761600182614415565b81811061077057610770614428565b905060200201602081019061078591906142d1565b6001600160a01b0316146107ab5760405162461bcd60e51b81526004016106209061443c565b6108087f0000000000000000000000002cce9d4cc6612d1775bb6ff2a9f989c788b895f6898888808060200260200160405190810160405280939291908181526020018383602002808284375f92019190915250612da792505050565b915086826001845161081a9190614415565b8151811061082a5761082a614428565b602002602001015110156108505760405162461bcd60e51b81526004016106209061446b565b6002543410156108725760405162461bcd60e51b8152600401610620906144ae565b6001546002546040516001600160a01b039092169181156108fc0291905f818181858888f193505050501580156108ab573d5f803e3d5ffd5b5061096e86865f8181106108c1576108c1614428565b90506020020160208101906108d691906142d1565b3361094f7f0000000000000000000000002cce9d4cc6612d1775bb6ff2a9f989c788b895f68a8a5f81811061090d5761090d614428565b905060200201602081019061092291906142d1565b8b8b600181811061093557610935614428565b905060200201602081019061094a91906142d1565b612f23565b855f8151811061096157610961614428565b6020026020010151612ffa565b6109ac828787808060200260200160405190810160405280939291908181526020018383602002808284375f92019190915250309250613133915050565b7f000000000000000000000000cd10c6b0c5c8d589826b60ead88e51df0771f7396001600160a01b0316632e1a7d4d83600185516109ea9190614415565b815181106109fa576109fa614428565b60200260200101516040518263ffffffff1660e01b8152600401610a2091815260200190565b5f604051808303815f87803b158015610a37575f80fd5b505af1158015610a49573d5f803e3d5ffd5b50505050610a7d848360018551610a609190614415565b81518110610a7057610a70614428565b6020026020010151612bfb565b509695505050505050565b6060610ab57f0000000000000000000000002cce9d4cc6612d1775bb6ff2a9f989c788b895f68484613326565b90505b92915050565b5f805f610aec7f0000000000000000000000002cce9d4cc6612d1775bb6ff2a9f989c788b895f68f8f612f23565b90505f87610afa578c610afd565b5f195b60405163d505accf60e01b81529091506001600160a01b0383169063d505accf90610b38903390309086908f908e908e908e906004016144f8565b5f604051808303815f87803b158015610b4f575f80fd5b505af1158015610b61573d5f803e3d5ffd5b50505050610b748f8f8f8f8f8f8f611eb2565b809450819550505050509b509b9950505050505050505050565b60608142811015610bb15760405162461bcd60e51b8152600401610620906143d7565b610c0e7f0000000000000000000000002cce9d4cc6612d1775bb6ff2a9f989c788b895f6898888808060200260200160405190810160405280939291908181526020018383602002808284375f92019190915250612da792505050565b9150868260018451610c209190614415565b81518110610c3057610c30614428565b60200260200101511015610c565760405162461bcd60e51b81526004016106209061446b565b600254341015610c785760405162461bcd60e51b8152600401610620906144ae565b6001546002546040516001600160a01b039092169181156108fc0291905f818181858888f19350505050158015610cb1573d5f803e3d5ffd5b50610cc786865f8181106108c1576108c1614428565b610a7d828787808060200260200160405190810160405280939291908181526020018383602002808284375f92019190915250899250613133915050565b60608142811015610d285760405162461bcd60e51b8152600401610620906143d7565b6001600160a01b037f000000000000000000000000cd10c6b0c5c8d589826b60ead88e51df0771f739168686610d5f600182614415565b818110610d6e57610d6e614428565b9050602002016020810190610d8391906142d1565b6001600160a01b031614610da95760405162461bcd60e51b81526004016106209061443c565b600254341015610dcb5760405162461bcd60e51b8152600401610620906144ae565b6001546002546040516001600160a01b039092169181156108fc0291905f818181858888f19350505050158015610e04573d5f803e3d5ffd5b50610e627f0000000000000000000000002cce9d4cc6612d1775bb6ff2a9f989c788b895f6898888808060200260200160405190810160405280939291908181526020018383602002808284375f9201919091525061332692505050565b915086825f81518110610e7757610e77614428565b60200260200101511115610e9d5760405162461bcd60e51b815260040161062090614539565b61096e86865f8181106108c1576108c1614428565b5f80610eff7f0000000000000000000000002cce9d4cc6612d1775bb6ff2a9f989c788b895f68d7f000000000000000000000000cd10c6b0c5c8d589826b60ead88e51df0771f739612f23565b90505f86610f0d578b610f10565b5f195b60405163d505accf60e01b81529091506001600160a01b0383169063d505accf90610f4b903390309086908e908d908d908d906004016144f8565b5f604051808303815f87803b158015610f62575f80fd5b505af1158015610f74573d5f803e3d5ffd5b50505050610f868d8d8d8d8d8d6119d6565b9d9c50505050505050505050505050565b8042811015610fb85760405162461bcd60e51b8152600401610620906143d7565b600254341015610fda5760405162461bcd60e51b8152600401610620906144ae565b6001546002546040516001600160a01b039092169181156108fc0291905f818181858888f19350505050158015611013573d5f803e3d5ffd5b506110a385855f81811061102957611029614428565b905060200201602081019061103e91906142d1565b3361109d7f0000000000000000000000002cce9d4cc6612d1775bb6ff2a9f989c788b895f689895f81811061107557611075614428565b905060200201602081019061108a91906142d1565b8a8a600181811061093557610935614428565b8a612ffa565b5f85856110b1600182614415565b8181106110c0576110c0614428565b90506020020160208101906110d591906142d1565b6040516370a0823160e01b81526001600160a01b03868116600483015291909116906370a0823190602401602060405180830381865afa15801561111b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061113f9190614570565b905061117e8686808060200260200160405190810160405280939291908181526020018383602002808284375f920191909152508892506134a5915050565b86611225828888611190600182614415565b81811061119f5761119f614428565b90506020020160208101906111b491906142d1565b6040516370a0823160e01b81526001600160a01b03898116600483015291909116906370a08231906024015b602060405180830381865afa1580156111fb573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061121f9190614570565b90613724565b10156112435760405162461bcd60e51b81526004016106209061446b565b5050505050505050565b611255613779565b600255565b611262613779565b61126b5f6137d2565b565b804281101561128e5760405162461bcd60e51b8152600401610620906143d7565b6001600160a01b037f000000000000000000000000cd10c6b0c5c8d589826b60ead88e51df0771f7391685856112c5600182614415565b8181106112d4576112d4614428565b90506020020160208101906112e991906142d1565b6001600160a01b03161461130f5760405162461bcd60e51b81526004016106209061443c565b6002543410156113315760405162461bcd60e51b8152600401610620906144ae565b6001546002546040516001600160a01b039092169181156108fc0291905f818181858888f1935050505015801561136a573d5f803e3d5ffd5b5061138085855f81811061102957611029614428565b6113bd8585808060200260200160405190810160405280939291908181526020018383602002808284375f920191909152503092506134a5915050565b6040516370a0823160e01b81523060048201525f907f000000000000000000000000cd10c6b0c5c8d589826b60ead88e51df0771f7396001600160a01b0316906370a0823190602401602060405180830381865afa158015611421573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906114459190614570565b9050868110156114675760405162461bcd60e51b81526004016106209061446b565b604051632e1a7d4d60e01b8152600481018290527f000000000000000000000000cd10c6b0c5c8d589826b60ead88e51df0771f7396001600160a01b031690632e1a7d4d906024015f604051808303815f87803b1580156114c6575f80fd5b505af11580156114d8573d5f803e3d5ffd5b505050506112438482612bfb565b606081428110156115095760405162461bcd60e51b8152600401610620906143d7565b7f000000000000000000000000cd10c6b0c5c8d589826b60ead88e51df0771f7396001600160a01b031686865f81811061154557611545614428565b905060200201602081019061155a91906142d1565b6001600160a01b0316146115805760405162461bcd60e51b81526004016106209061443c565b6002543410156115f85760405162461bcd60e51b815260206004820152603c60248201527f417065737761703a20494e53554646494349454e545f464545202d20506c656160448201527f73652073656e64207468652065786163742066656520616d6f756e74000000006064820152608401610620565b6001546002546040516001600160a01b039092169181156108fc0291905f818181858888f19350505050158015611631573d5f803e3d5ffd5b505f600254346116419190614415565b90505f811161169c5760405162461bcd60e51b815260206004820152602160248201527f417065737761703a20494e53554646494349454e545f535741505f414d4f554e6044820152601560fa1b6064820152608401610620565b6116f97f0000000000000000000000002cce9d4cc6612d1775bb6ff2a9f989c788b895f6828989808060200260200160405190810160405280939291908181526020018383602002808284375f92019190915250612da792505050565b925087836001855161170b9190614415565b8151811061171b5761171b614428565b602002602001015110156117415760405162461bcd60e51b81526004016106209061446b565b7f000000000000000000000000cd10c6b0c5c8d589826b60ead88e51df0771f7396001600160a01b031663d0e30db0826040518263ffffffff1660e01b81526004015f604051808303818588803b15801561179a575f80fd5b505af11580156117ac573d5f803e3d5ffd5b50505050507f000000000000000000000000cd10c6b0c5c8d589826b60ead88e51df0771f7396001600160a01b031663a9059cbb6118167f0000000000000000000000002cce9d4cc6612d1775bb6ff2a9f989c788b895f68a8a5f81811061090d5761090d614428565b6040516001600160e01b031960e084901b1681526001600160a01b039091166004820152602481018490526044016020604051808303815f875af1158015611860573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906118849190614587565b61189057611890613e7b565b6118ce838888808060200260200160405190810160405280939291908181526020018383602002808284375f920191909152508a9250613133915050565b505095945050505050565b5f6106ff848484613821565b606081428110156119085760405162461bcd60e51b8152600401610620906143d7565b6119657f0000000000000000000000002cce9d4cc6612d1775bb6ff2a9f989c788b895f6898888808060200260200160405190810160405280939291908181526020018383602002808284375f9201919091525061332692505050565b915086825f8151811061197a5761197a614428565b60200260200101511115610c565760405162461bcd60e51b815260040161062090614539565b6119a8613779565b600180546001600160a01b0319166001600160a01b0392909216919091179055565b5f6106ff8484846138f3565b5f81428110156119f85760405162461bcd60e51b8152600401610620906143d7565b611a27887f000000000000000000000000cd10c6b0c5c8d589826b60ead88e51df0771f7398989893089611eb2565b6040516370a0823160e01b8152306004820152909350611a9e9150899086906001600160a01b038316906370a0823190602401602060405180830381865afa158015611a75573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611a999190614570565b612acf565b604051632e1a7d4d60e01b8152600481018390527f000000000000000000000000cd10c6b0c5c8d589826b60ead88e51df0771f7396001600160a01b031690632e1a7d4d906024015f604051808303815f87803b158015611afd575f80fd5b505af1158015611b0f573d5f803e3d5ffd5b50505050610a7d8483612bfb565b8042811015611b3e5760405162461bcd60e51b8152600401610620906143d7565b7f000000000000000000000000cd10c6b0c5c8d589826b60ead88e51df0771f7396001600160a01b031685855f818110611b7a57611b7a614428565b9050602002016020810190611b8f91906142d1565b6001600160a01b031614611bb55760405162461bcd60e51b81526004016106209061443c565b600254341015611bd75760405162461bcd60e51b8152600401610620906144ae565b6001546002546040516001600160a01b039092169181156108fc0291905f818181858888f19350505050158015611c10573d5f803e3d5ffd5b505f60025434611c209190614415565b90507f000000000000000000000000cd10c6b0c5c8d589826b60ead88e51df0771f7396001600160a01b031663d0e30db0826040518263ffffffff1660e01b81526004015f604051808303818588803b158015611c7b575f80fd5b505af1158015611c8d573d5f803e3d5ffd5b50505050507f000000000000000000000000cd10c6b0c5c8d589826b60ead88e51df0771f7396001600160a01b031663a9059cbb611cf77f0000000000000000000000002cce9d4cc6612d1775bb6ff2a9f989c788b895f689895f81811061107557611075614428565b6040516001600160e01b031960e084901b1681526001600160a01b039091166004820152602481018490526044016020604051808303815f875af1158015611d41573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611d659190614587565b611d7157611d71613e7b565b5f8686611d7f600182614415565b818110611d8e57611d8e614428565b9050602002016020810190611da391906142d1565b6040516370a0823160e01b81526001600160a01b03878116600483015291909116906370a0823190602401602060405180830381865afa158015611de9573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611e0d9190614570565b9050611e4c8787808060200260200160405190810160405280939291908181526020018383602002808284375f920191909152508992506134a5915050565b87611225828989611e5e600182614415565b818110611e6d57611e6d614428565b9050602002016020810190611e8291906142d1565b6040516370a0823160e01b81526001600160a01b038a8116600483015291909116906370a08231906024016111e0565b5f808242811015611ed55760405162461bcd60e51b8152600401610620906143d7565b5f611f017f0000000000000000000000002cce9d4cc6612d1775bb6ff2a9f989c788b895f68c8c612f23565b6040516323b872dd60e01b81523360048201526001600160a01b03821660248201819052604482018c90529192506323b872dd906064016020604051808303815f875af1158015611f54573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611f789190614587565b5060405163226bf2d160e21b81526001600160a01b0387811660048301525f9182918416906389afcb449060240160408051808303815f875af1158015611fc1573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611fe591906145a2565b915091505f611ff48e8e61398e565b509050806001600160a01b03168e6001600160a01b03161461201757818361201a565b82825b90975095508a87101561206f5760405162461bcd60e51b815260206004820152601e60248201527f417065737761703a20494e53554646494349454e545f415f414d4f554e5400006044820152606401610620565b898610156120bf5760405162461bcd60e51b815260206004820152601e60248201527f417065737761703a20494e53554646494349454e545f425f414d4f554e5400006044820152606401610620565b505050505097509795505050505050565b6120d8613779565b47816121265760405162461bcd60e51b815260206004820152601d60248201527f416d6f756e74206d7573742062652067726561746572207468616e20300000006044820152606401610620565b808211156121765760405162461bcd60e51b815260206004820152601d60248201527f496e73756666696369656e7420636f6e74726163742062616c616e63650000006044820152606401610620565b5f80546040516001600160a01b039091169084908381818185875af1925050503d805f81146121c0576040519150601f19603f3d011682016040523d82523d5f602084013e6121c5565b606091505b505090508061220a5760405162461bcd60e51b815260206004820152601160248201527015da5d1a191c985dd85b0819985a5b1959607a1b6044820152606401610620565b505050565b6060610ab57f0000000000000000000000002cce9d4cc6612d1775bb6ff2a9f989c788b895f68484612da7565b5f805f61228a7f0000000000000000000000002cce9d4cc6612d1775bb6ff2a9f989c788b895f68e7f000000000000000000000000cd10c6b0c5c8d589826b60ead88e51df0771f739612f23565b90505f87612298578c61229b565b5f195b60405163d505accf60e01b81529091506001600160a01b0383169063d505accf906122d6903390309086908f908e908e908e906004016144f8565b5f604051808303815f87803b1580156122ed575f80fd5b505af11580156122ff573d5f803e3d5ffd5b505050506123118e8e8e8e8e8e6105fd565b909f909e509c50505050505050505050505050565b5f805f834281101561234a5760405162461bcd60e51b8152600401610620906143d7565b6123588c8c8c8c8c8c613a82565b90945092505f6123897f0000000000000000000000002cce9d4cc6612d1775bb6ff2a9f989c788b895f68e8e612f23565b90506123978d338388612ffa565b6123a38c338387612ffa565b6040516335313c2160e11b81526001600160a01b038881166004830152821690636a627842906024016020604051808303815f875af11580156123e8573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061240c9190614570565b92505050985098509895505050505050565b612426613779565b6001600160a01b03811661248b5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610620565b612494816137d2565b50565b5f805f83428110156124bb5760405162461bcd60e51b8152600401610620906143d7565b6124e98a7f000000000000000000000000cd10c6b0c5c8d589826b60ead88e51df0771f7398b348c8c613a82565b90945092505f61253a7f0000000000000000000000002cce9d4cc6612d1775bb6ff2a9f989c788b895f68c7f000000000000000000000000cd10c6b0c5c8d589826b60ead88e51df0771f739612f23565b90506125488b338388612ffa565b7f000000000000000000000000cd10c6b0c5c8d589826b60ead88e51df0771f7396001600160a01b031663d0e30db0856040518263ffffffff1660e01b81526004015f604051808303818588803b1580156125a1575f80fd5b505af11580156125b3573d5f803e3d5ffd5b505060405163a9059cbb60e01b81526001600160a01b038581166004830152602482018990527f000000000000000000000000cd10c6b0c5c8d589826b60ead88e51df0771f73916935063a9059cbb925060440190506020604051808303815f875af1158015612625573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906126499190614587565b61265557612655613e7b565b6040516335313c2160e11b81526001600160a01b038881166004830152821690636a627842906024016020604051808303815f875af115801561269a573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906126be9190614570565b9250833411156126db576126db336126d68634614415565b612bfb565b505096509650969350505050565b6060814281101561270c5760405162461bcd60e51b8152600401610620906143d7565b7f000000000000000000000000cd10c6b0c5c8d589826b60ead88e51df0771f7396001600160a01b031686865f81811061274857612748614428565b905060200201602081019061275d91906142d1565b6001600160a01b0316146127835760405162461bcd60e51b81526004016106209061443c565b6002543410156127df5760405162461bcd60e51b815260206004820152602160248201527f417065737761703a20496e73756666696369656e742045544820666f722066656044820152606560f81b6064820152608401610620565b6001546002546040516001600160a01b039092169181156108fc0291905f818181858888f19350505050158015612818573d5f803e3d5ffd5b505f600254346128289190614415565b90506128877f0000000000000000000000002cce9d4cc6612d1775bb6ff2a9f989c788b895f6898989808060200260200160405190810160405280939291908181526020018383602002808284375f9201919091525061332692505050565b925080835f8151811061289c5761289c614428565b602002602001015111156128c25760405162461bcd60e51b815260040161062090614539565b7f000000000000000000000000cd10c6b0c5c8d589826b60ead88e51df0771f7396001600160a01b031663d0e30db0845f8151811061290357612903614428565b60200260200101516040518263ffffffff1660e01b81526004015f604051808303818588803b158015612934575f80fd5b505af1158015612946573d5f803e3d5ffd5b50505050507f000000000000000000000000cd10c6b0c5c8d589826b60ead88e51df0771f7396001600160a01b031663a9059cbb6129b07f0000000000000000000000002cce9d4cc6612d1775bb6ff2a9f989c788b895f68a8a5f81811061090d5761090d614428565b855f815181106129c2576129c2614428565b60200260200101516040518363ffffffff1660e01b81526004016129fb9291906001600160a01b03929092168252602082015260400190565b6020604051808303815f875af1158015612a17573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612a3b9190614587565b612a4757612a47613e7b565b612a85838888808060200260200160405190810160405280939291908181526020018383602002808284375f920191909152508a9250613133915050565b825f81518110612a9757612a97614428565b60200260200101518111156118ce576118ce33845f81518110612abc57612abc614428565b6020026020010151836126d69190614415565b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180516001600160e01b031663a9059cbb60e01b17905291515f92839290871691612b2a91906145e6565b5f604051808303815f865af19150503d805f8114612b63576040519150601f19603f3d011682016040523d82523d5f602084013e612b68565b606091505b5091509150818015612b92575080511580612b92575080806020019051810190612b929190614587565b612bf45760405162461bcd60e51b815260206004820152602d60248201527f5472616e7366657248656c7065723a3a736166655472616e736665723a20747260448201526c185b9cd9995c8819985a5b1959609a1b6064820152608401610620565b5050505050565b604080515f808252602082019092526001600160a01b038416908390604051612c2491906145e6565b5f6040518083038185875af1925050503d805f8114612c5e576040519150601f19603f3d011682016040523d82523d5f602084013e612c63565b606091505b505090508061220a5760405162461bcd60e51b815260206004820152603460248201527f5472616e7366657248656c7065723a3a736166655472616e736665724554483a60448201527308115512081d1c985b9cd9995c8819985a5b195960621b6064820152608401610620565b5f808411612d335760405162461bcd60e51b815260206004820152602960248201527f417065737761704c6962726172793a20494e53554646494349454e545f494e50604482015268155517d05353d5539560ba1b6064820152608401610620565b5f83118015612d4157505f82115b612d5d5760405162461bcd60e51b815260040161062090614601565b5f612d6a856103e5613cfc565b90505f612d778285613cfc565b90505f612d9083612d8a886103e8613cfc565b90613d62565b9050612d9c8183614647565b979650505050505050565b6060600282511015612dfb5760405162461bcd60e51b815260206004820152601c60248201527f417065737761704c6962726172793a20494e56414c49445f50415448000000006044820152606401610620565b815167ffffffffffffffff811115612e1557612e15614028565b604051908082528060200260200182016040528015612e3e578160200160208202803683370190505b50905082815f81518110612e5457612e54614428565b6020026020010181815250505f5b60018351612e709190614415565b811015612f1b575f80612ec287868581518110612e8f57612e8f614428565b602002602001015187866001612ea59190614666565b81518110612eb557612eb5614428565b6020026020010151613db6565b91509150612eea848481518110612edb57612edb614428565b60200260200101518383612cd1565b84612ef6856001614666565b81518110612f0657612f06614428565b60209081029190910101525050600101612e62565b509392505050565b5f805f612f30858561398e565b6040516bffffffffffffffffffffffff19606084811b8216602084015283901b1660348201529193509150869060480160405160208183030381529060405280519060200120604051602001612fd89291906001600160f81b0319815260609290921b6bffffffffffffffffffffffff1916600183015260158201527f0b28dad2cc786741db4a85dbfc89accb5a945eef968d3efeffef340654708cc3603582015260550190565b60408051601f1981840301815291905280516020909101209695505050505050565b604080516001600160a01b0385811660248301528481166044830152606480830185905283518084039091018152608490920183526020820180516001600160e01b03166323b872dd60e01b17905291515f9283929088169161305d91906145e6565b5f604051808303815f865af19150503d805f8114613096576040519150601f19603f3d011682016040523d82523d5f602084013e61309b565b606091505b50915091508180156130c55750805115806130c55750808060200190518101906130c59190614587565b61312b5760405162461bcd60e51b815260206004820152603160248201527f5472616e7366657248656c7065723a3a7472616e7366657246726f6d3a207472604482015270185b9cd9995c919c9bdb4819985a5b1959607a1b6064820152608401610620565b505050505050565b5f5b600183516131439190614415565b811015613320575f8084838151811061315e5761315e614428565b6020026020010151858460016131749190614666565b8151811061318457613184614428565b6020026020010151915091505f61319b838361398e565b5090505f876131ab866001614666565b815181106131bb576131bb614428565b602002602001015190505f80836001600160a01b0316866001600160a01b0316146131e757825f6131ea565b5f835b915091505f60028a516131fd9190614415565b88106132095788613257565b6132577f0000000000000000000000002cce9d4cc6612d1775bb6ff2a9f989c788b895f6878c61323a8c6002614666565b8151811061324a5761324a614428565b6020026020010151612f23565b90506132847f0000000000000000000000002cce9d4cc6612d1775bb6ff2a9f989c788b895f68888612f23565b6001600160a01b031663022c0d9f8484845f6040519080825280601f01601f1916602001820160405280156132c0576020820181803683370190505b506040518563ffffffff1660e01b81526004016132e09493929190614679565b5f604051808303815f87803b1580156132f7575f80fd5b505af1158015613309573d5f803e3d5ffd5b505060019099019850613135975050505050505050565b50505050565b606060028251101561337a5760405162461bcd60e51b815260206004820152601c60248201527f417065737761704c6962726172793a20494e56414c49445f50415448000000006044820152606401610620565b815167ffffffffffffffff81111561339457613394614028565b6040519080825280602002602001820160405280156133bd578160200160208202803683370190505b5090508281600183516133d09190614415565b815181106133e0576133e0614428565b6020026020010181815250505f600183516133fb9190614415565b90505b8015612f1b575f806134408786613416600187614415565b8151811061342657613426614428565b6020026020010151878681518110612eb557612eb5614428565b9150915061346884848151811061345957613459614428565b60200260200101518383613821565b84613474600186614415565b8151811061348457613484614428565b6020026020010181815250505050808061349d906146c8565b9150506133fe565b5f5b600183516134b59190614415565b81101561220a575f808483815181106134d0576134d0614428565b6020026020010151858460016134e69190614666565b815181106134f6576134f6614428565b6020026020010151915091505f61350d838361398e565b5090505f61353c7f0000000000000000000000002cce9d4cc6612d1775bb6ff2a9f989c788b895f68585612f23565b90505f805f80846001600160a01b0316630902f1ac6040518163ffffffff1660e01b8152600401606060405180830381865afa15801561357e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906135a291906146f3565b506001600160701b031691506001600160701b031691505f80876001600160a01b03168a6001600160a01b0316146135db5782846135de565b83835b6040516370a0823160e01b81526001600160a01b038a81166004830152929450909250613619918491908d16906370a08231906024016111e0565b9550613626868383612cd1565b9450505050505f80856001600160a01b0316886001600160a01b03161461364e57825f613651565b5f835b915091505f60028c516136649190614415565b8a10613670578a6136a1565b6136a17f0000000000000000000000002cce9d4cc6612d1775bb6ff2a9f989c788b895f6898e61323a8e6002614666565b604080515f8152602081019182905263022c0d9f60e01b9091529091506001600160a01b0387169063022c0d9f906136e29086908690869060248101614679565b5f604051808303815f87803b1580156136f9575f80fd5b505af115801561370b573d5f803e3d5ffd5b50506001909b019a506134a79950505050505050505050565b5f826137308382614415565b9150811115610ab85760405162461bcd60e51b815260206004820152601560248201527464732d6d6174682d7375622d756e646572666c6f7760581b6044820152606401610620565b5f546001600160a01b0316331461126b5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610620565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b5f8084116138845760405162461bcd60e51b815260206004820152602a60248201527f417065737761704c6962726172793a20494e53554646494349454e545f4f555460448201526914155517d05353d5539560b21b6064820152608401610620565b5f8311801561389257505f82115b6138ae5760405162461bcd60e51b815260040161062090614601565b5f6138c56103e86138bf8688613cfc565b90613cfc565b90505f6138d86103e56138bf8689613724565b90506138e96001612d8a8385614647565b9695505050505050565b5f80841161394f5760405162461bcd60e51b815260206004820152602360248201527f417065737761704c6962726172793a20494e53554646494349454e545f414d4f60448201526215539560ea1b6064820152608401610620565b5f8311801561395d57505f82115b6139795760405162461bcd60e51b815260040161062090614601565b826139848584613cfc565b6106ff9190614647565b5f80826001600160a01b0316846001600160a01b0316036139fd5760405162461bcd60e51b815260206004820152602360248201527f417065737761704c6962726172793a204944454e544943414c5f41444452455360448201526253455360e81b6064820152608401610620565b826001600160a01b0316846001600160a01b031610613a1d578284613a20565b83835b90925090506001600160a01b038216613a7b5760405162461bcd60e51b815260206004820152601c60248201527f417065737761704c6962726172793a205a45524f5f41444452455353000000006044820152606401610620565b9250929050565b60405163e6a4390560e01b81526001600160a01b03878116600483015286811660248301525f91829182917f0000000000000000000000002cce9d4cc6612d1775bb6ff2a9f989c788b895f69091169063e6a4390590604401602060405180830381865afa158015613af6573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613b1a919061473f565b6001600160a01b031603613bbb576040516364e329cb60e11b81526001600160a01b03898116600483015288811660248301527f0000000000000000000000002cce9d4cc6612d1775bb6ff2a9f989c788b895f6169063c9c65396906044016020604051808303815f875af1158015613b95573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613bb9919061473f565b505b5f80613be87f0000000000000000000000002cce9d4cc6612d1775bb6ff2a9f989c788b895f68b8b613db6565b91509150815f148015613bf9575080155b15613c0957879350869250613cef565b5f613c158984846138f3565b9050878111613c795785811015613c6e5760405162461bcd60e51b815260206004820152601e60248201527f417065737761703a20494e53554646494349454e545f425f414d4f554e5400006044820152606401610620565b889450925082613ced565b5f613c858984866138f3565b905089811115613c9757613c97613e7b565b87811015613ce75760405162461bcd60e51b815260206004820152601e60248201527f417065737761703a20494e53554646494349454e545f415f414d4f554e5400006044820152606401610620565b94508793505b505b5050965096945050505050565b5f811580613d1f57508282613d11818361475a565b9250613d1d9083614647565b145b610ab85760405162461bcd60e51b815260206004820152601460248201527364732d6d6174682d6d756c2d6f766572666c6f7760601b6044820152606401610620565b5f82613d6e8382614666565b9150811015610ab85760405162461bcd60e51b815260206004820152601460248201527364732d6d6174682d6164642d6f766572666c6f7760601b6044820152606401610620565b5f805f613dc3858561398e565b5090505f80613dd3888888612f23565b6001600160a01b0316630902f1ac6040518163ffffffff1660e01b8152600401606060405180830381865afa158015613e0e573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613e3291906146f3565b506001600160701b031691506001600160701b03169150826001600160a01b0316876001600160a01b031614613e69578082613e6c565b81815b90999098509650505050505050565b634e487b7160e01b5f52600160045260245ffd5b6001600160a01b0381168114612494575f80fd5b8035613eae81613e8f565b919050565b5f805f805f8060c08789031215613ec8575f80fd5b8635613ed381613e8f565b95506020870135945060408701359350606087013592506080870135613ef881613e8f565b8092505060a087013590509295509295509295565b5f805f60608486031215613f1f575f80fd5b505081359360208301359350604090920135919050565b5f8083601f840112613f46575f80fd5b50813567ffffffffffffffff811115613f5d575f80fd5b6020830191508360208260051b8501011115613a7b575f80fd5b5f805f805f8060a08789031215613f8c575f80fd5b8635955060208701359450604087013567ffffffffffffffff811115613fb0575f80fd5b613fbc89828a01613f36565b9095509350506060870135613fd081613e8f565b80925050608087013590509295509295509295565b602080825282518282018190525f9190848201906040850190845b8181101561401c57835183529284019291840191600101614000565b50909695505050505050565b634e487b7160e01b5f52604160045260245ffd5b5f806040838503121561404d575f80fd5b8235915060208084013567ffffffffffffffff8082111561406c575f80fd5b818601915086601f83011261407f575f80fd5b81358181111561409157614091614028565b8060051b604051601f19603f830116810181811085821117156140b6576140b6614028565b6040529182528482019250838101850191898311156140d3575f80fd5b938501935b828510156140f8576140e985613ea3565b845293850193928501926140d8565b8096505050505050509250929050565b8015158114612494575f80fd5b803560ff81168114613eae575f80fd5b5f805f805f805f805f805f6101608c8e031215614140575f80fd5b8b3561414b81613e8f565b9a5060208c013561415b81613e8f565b995060408c0135985060608c0135975060808c0135965060a08c013561418081613e8f565b955060c08c0135945060e08c013561419781614108565b93506141a66101008d01614115565b92506101208c013591506101408c013590509295989b509295989b9093969950565b5f805f805f805f805f806101408b8d0312156141e2575f80fd5b8a356141ed81613e8f565b995060208b0135985060408b0135975060608b0135965060808b013561421281613e8f565b955060a08b0135945060c08b013561422981614108565b935061423760e08c01614115565b92506101008b013591506101208b013590509295989b9194979a5092959850565b5f60208284031215614268575f80fd5b5035919050565b5f805f805f60808688031215614283575f80fd5b85359450602086013567ffffffffffffffff8111156142a0575f80fd5b6142ac88828901613f36565b90955093505060408601356142c081613e8f565b949793965091946060013592915050565b5f602082840312156142e1575f80fd5b81356142ec81613e8f565b9392505050565b5f805f805f805f60e0888a031215614309575f80fd5b873561431481613e8f565b9650602088013561432481613e8f565b955060408801359450606088013593506080880135925060a088013561434981613e8f565b8092505060c0880135905092959891949750929550565b5f805f805f805f80610100898b031215614378575f80fd5b883561438381613e8f565b9750602089013561439381613e8f565b965060408901359550606089013594506080890135935060a0890135925060c08901356143bf81613e8f565b8092505060e089013590509295985092959890939650565b60208082526010908201526f105c195cddd85c0e881156141254915160821b604082015260600190565b634e487b7160e01b5f52601160045260245ffd5b81810381811115610ab857610ab8614401565b634e487b7160e01b5f52603260045260245ffd5b602080825260159082015274082e0cae6eec2e07440929cac82989288bea082a89605b1b604082015260600190565b60208082526023908201527f417065737761703a20494e53554646494349454e545f4f55545055545f414d4f60408201526215539560ea1b606082015260800190565b6020808252602a908201527f417065737761703a2d20506c656173652073656e64207468652065786163742060408201526919995948185b5bdd5b9d60b21b606082015260800190565b6001600160a01b0397881681529590961660208601526040850193909352606084019190915260ff16608083015260a082015260c081019190915260e00190565b6020808252601f908201527f417065737761703a204558434553534956455f494e5055545f414d4f554e5400604082015260600190565b5f60208284031215614580575f80fd5b5051919050565b5f60208284031215614597575f80fd5b81516142ec81614108565b5f80604083850312156145b3575f80fd5b505080516020909101519092909150565b5f5b838110156145de5781810151838201526020016145c6565b50505f910152565b5f82516145f78184602087016145c4565b9190910192915050565b60208082526026908201527f417065737761704c6962726172793a20494e53554646494349454e545f4c495160408201526555494449545960d01b606082015260800190565b5f8261466157634e487b7160e01b5f52601260045260245ffd5b500490565b80820180821115610ab857610ab8614401565b84815283602082015260018060a01b0383166040820152608060608201525f82518060808401526146b18160a08501602087016145c4565b601f01601f19169190910160a00195945050505050565b5f816146d6576146d6614401565b505f190190565b80516001600160701b0381168114613eae575f80fd5b5f805f60608486031215614705575f80fd5b61470e846146dd565b925061471c602085016146dd565b9150604084015163ffffffff81168114614734575f80fd5b809150509250925092565b5f6020828403121561474f575f80fd5b81516142ec81613e8f565b8082028115828204841417610ab857610ab861440156fea264697066735822122007f0622469e85c245370692c3c86b936d59ce823243ab5e1e528360ab0a5b54464736f6c63430008180033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000002cce9d4cc6612d1775bb6ff2a9f989c788b895f6000000000000000000000000cd10c6b0c5c8d589826b60ead88e51df0771f739
-----Decoded View---------------
Arg [0] : _factory (address): 0x2cCE9d4cC6612D1775bB6Ff2a9f989c788b895f6
Arg [1] : _WETH (address): 0xCd10c6B0c5C8D589826b60EaD88E51dF0771F739
-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 0000000000000000000000002cce9d4cc6612d1775bb6ff2a9f989c788b895f6
Arg [1] : 000000000000000000000000cd10c6b0c5c8d589826b60ead88e51df0771f739
Deployed Bytecode Sourcemap
22430:23852:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23142:10;-1:-1:-1;;;;;23156:4:0;23142:18;;23135:26;;;;:::i;:::-;22430:23852;;;;;28047:741;;;;;;;;;;-1:-1:-1;28047:741:0;;;;;:::i;:::-;;:::i;:::-;;;;1263:25:1;;;1319:2;1304:18;;1297:34;;;;1236:18;28047:741:0;;;;;;;;44658:256;;;;;;;;;;-1:-1:-1;44658:256:0;;;;;:::i;:::-;;:::i;:::-;;;1809:25:1;;;1797:2;1782:18;44658:256:0;1663:177:1;37483:1112:0;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;45450:257::-;;;;;;;;;;-1:-1:-1;45450:257:0;;;;;:::i;:::-;;:::i;28796:934::-;;;;;;;;;;-1:-1:-1;28796:934:0;;;;;:::i;:::-;;:::i;33500:898::-;;;;;;:::i;:::-;;:::i;36422:1053::-;;;;;;:::i;:::-;;:::i;31544:935::-;;;;;;;;;;-1:-1:-1;31544:935:0;;;;;:::i;:::-;;:::i;41431:905::-;;;;;;:::i;:::-;;:::i;45715:82::-;;;;;;;;;;-1:-1:-1;45715:82:0;;;;;:::i;:::-;;:::i;21527:103::-;;;;;;;;;;;;;:::i;43369:1005::-;;;;;;:::i;:::-;;:::i;35251:1163::-;;;;;;:::i;:::-;;:::i;44922:255::-;;;;;;;;;;-1:-1:-1;44922:255:0;;;;;:::i;:::-;;:::i;34406:837::-;;;;;;:::i;:::-;;:::i;20879:87::-;;;;;;;;;;-1:-1:-1;20925:7:0;20952:6;-1:-1:-1;;;;;20952:6:0;20879:87;;;-1:-1:-1;;;;;8480:32:1;;;8462:51;;8450:2;8435:18;20879:87:0;8316:203:1;46169:110:0;;;;;;;;;;-1:-1:-1;46169:110:0;;;;;:::i;:::-;;:::i;22611:38::-;;;;;;;;;;;;;;;44418:232;;;;;;;;;;-1:-1:-1;44418:232:0;;;;;:::i;:::-;;:::i;30771:765::-;;;;;;;;;;-1:-1:-1;30771:765:0;;;;;:::i;:::-;;:::i;42344:1017::-;;;;;;:::i;:::-;;:::i;27097:942::-;;;;;;;;;;-1:-1:-1;27097:942:0;;;;;:::i;:::-;;:::i;45805:356::-;;;;;;;;;;-1:-1:-1;45805:356:0;;;;;:::i;:::-;;:::i;22563:41::-;;;;;;;;;;;;;;;45185:257;;;;;;;;;;-1:-1:-1;45185:257:0;;;;;:::i;:::-;;:::i;22658:18::-;;;;;;;;;;;;;;;;29738:954;;;;;;;;;;-1:-1:-1;29738:954:0;;;;;:::i;:::-;;:::i;24986:947::-;;;;;;;;;;-1:-1:-1;24986:947:0;;;;;:::i;:::-;;:::i;:::-;;;;10675:25:1;;;10731:2;10716:18;;10709:34;;;;10759:18;;;10752:34;10663:2;10648:18;24986:947:0;10473:319:1;22522:32:0;;;;;;;;;;-1:-1:-1;22522:32:0;;;;-1:-1:-1;;;;;22522:32:0;;;21785:201;;;;;;;;;;-1:-1:-1;21785:201:0;;;;;:::i;:::-;;:::i;25941:1113::-;;;;;;:::i;:::-;;:::i;38603:1114::-;;;;;;:::i;:::-;;:::i;28047:741::-;28341:19;28362:17;28313:8;22750:15;22738:8;:27;;22730:56;;;;-1:-1:-1;;;22730:56:0;;;;;;;:::i;:::-;;;;;;;;;28424:196:::1;28454:5;28474:4;28493:9;28517:14;28546:12;28581:4;28601:8;28424:15;:196::i;:::-;28397:223:::0;;-1:-1:-1;28397:223:0;-1:-1:-1;28631:51:0::1;28659:5:::0;28666:2;28397:223;28631:27:::1;:51::i;:::-;28693:31;::::0;-1:-1:-1;;;28693:31:0;;::::1;::::0;::::1;1809:25:1::0;;;28699:4:0::1;-1:-1:-1::0;;;;;28693:20:0::1;::::0;::::1;::::0;1782:18:1;;28693:31:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;28735:45;28766:2;28770:9;28735:30;:45::i;:::-;28047:741:::0;;;;;;;;;;:::o;44658:256::-;44809:17;44846:60;44874:8;44884:9;44895:10;44846:27;:60::i;:::-;44839:67;44658:256;-1:-1:-1;;;;44658:256:0:o;37483:1112::-;37775:24;37747:8;22750:15;22738:8;:27;;22730:56;;;;-1:-1:-1;;;22730:56:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;37850:4:0::1;37825:29;:4:::0;;37830:15:::1;37844:1;37825:4:::0;37830:15:::1;:::i;:::-;37825:21;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;37825:29:0::1;;37817:63;;;;-1:-1:-1::0;;;37817:63:0::1;;;;;;;:::i;:::-;37901:53;37930:7;37939:8;37949:4;;37901:53;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;37901:28:0::1;::::0;-1:-1:-1;;;37901:53:0:i:1;:::-;37891:63;;38018:12;37987:7;38012:1;37995:7;:14;:18;;;;:::i;:::-;37987:27;;;;;;;;:::i;:::-;;;;;;;:43;;37965:128;;;;-1:-1:-1::0;;;37965:128:0::1;;;;;;;:::i;:::-;38125:3;;38112:9;:16;;38104:71;;;;-1:-1:-1::0;;;38104:71:0::1;;;;;;;:::i;:::-;38194:9;::::0;38214:3:::1;::::0;38186:32:::1;::::0;-1:-1:-1;;;;;38194:9:0;;::::1;::::0;38186:32;::::1;;;::::0;38214:3;38194:9:::1;38186:32:::0;38194:9;38186:32;38214:3;38194:9;38186:32;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;38229:178;38275:4;;38280:1;38275:7;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;38297:10;38322:49;38345:7;38354:4;;38359:1;38354:7;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;38363:4;;38368:1;38363:7;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;38322:22;:49::i;:::-;38386:7;38394:1;38386:10;;;;;;;;:::i;:::-;;;;;;;38229:31;:178::i;:::-;38418:35;38424:7;38433:4;;38418:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;38447:4:0::1;::::0;-1:-1:-1;38418:5:0::1;::::0;-1:-1:-1;;38418:35:0:i:1;:::-;38470:4;-1:-1:-1::0;;;;;38464:20:0::1;;38485:7;38510:1;38493:7;:14;:18;;;;:::i;:::-;38485:27;;;;;;;;:::i;:::-;;;;;;;38464:49;;;;;;;;;;;;;1809:25:1::0;;1797:2;1782:18;;1663:177;38464:49:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;38524:63;38555:2;38559:7;38584:1;38567:7;:14;:18;;;;:::i;:::-;38559:27;;;;;;;;:::i;:::-;;;;;;;38524:30;:63::i;:::-;37483:1112:::0;;;;;;;;;:::o;45450:257::-;45597:24;45646:53;45674:7;45683:9;45694:4;45646:27;:53::i;:::-;45639:60;;45450:257;;;;;:::o;28796:934::-;29141:15;29158;29186:12;29201:47;29224:7;29233:6;29241;29201:22;:47::i;:::-;29186:62;;29259:13;29275:10;:42;;29308:9;29275:42;;;-1:-1:-1;;29275:42:0;29328:180;;-1:-1:-1;;;29328:180:0;;29259:58;;-1:-1:-1;;;;;;29328:25:0;;;;;:180;;29368:10;;29401:4;;29259:58;;29441:8;;29464:1;;29480;;29496;;29328:180;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29540:182;29570:6;29591;29612:9;29636:10;29661;29686:2;29703:8;29540:15;:182::i;:::-;29519:203;;;;;;;;29175:555;;28796:934;;;;;;;;;;;;;;:::o;33500:898::-;33795:24;33767:8;22750:15;22738:8;:27;;22730:56;;;;-1:-1:-1;;;22730:56:0;;;;;;;:::i;:::-;33847:53:::1;33876:7;33885:8;33895:4;;33847:53;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;33847:28:0::1;::::0;-1:-1:-1;;;33847:53:0:i:1;:::-;33837:63;;33964:12;33933:7;33958:1;33941:7;:14;:18;;;;:::i;:::-;33933:27;;;;;;;;:::i;:::-;;;;;;;:43;;33911:128;;;;-1:-1:-1::0;;;33911:128:0::1;;;;;;;:::i;:::-;34071:3;;34058:9;:16;;34050:71;;;;-1:-1:-1::0;;;34050:71:0::1;;;;;;;:::i;:::-;34140:9;::::0;34160:3:::1;::::0;34132:32:::1;::::0;-1:-1:-1;;;;;34140:9:0;;::::1;::::0;34132:32;::::1;;;::::0;34160:3;34140:9:::1;34132:32:::0;34140:9;34132:32;34160:3;34140:9;34132:32;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;34177:178;34223:4;;34228:1;34223:7;;;;;;;:::i;34177:178::-;34366:24;34372:7;34381:4;;34366:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;34387:2:0;;-1:-1:-1;34366:5:0::1;::::0;-1:-1:-1;;34366:24:0:i:1;36422:1053::-:0;36714:24;36686:8;22750:15;22738:8;:27;;22730:56;;;;-1:-1:-1;;;22730:56:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;36789:4:0::1;36764:29;:4:::0;;36769:15:::1;36783:1;36764:4:::0;36769:15:::1;:::i;:::-;36764:21;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;36764:29:0::1;;36756:63;;;;-1:-1:-1::0;;;36756:63:0::1;;;;;;;:::i;:::-;36851:3;;36838:9;:16;;36830:71;;;;-1:-1:-1::0;;;36830:71:0::1;;;;;;;:::i;:::-;36920:9;::::0;36940:3:::1;::::0;36912:32:::1;::::0;-1:-1:-1;;;;;36920:9:0;;::::1;::::0;36912:32;::::1;;;::::0;36940:3;36920:9:::1;36912:32:::0;36920:9;36912:32;36940:3;36920:9;36912:32;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;36965:53;36993:7;37002:9;37013:4;;36965:53;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;36965:27:0::1;::::0;-1:-1:-1;;;36965:53:0:i:1;:::-;36955:63;;37051:11;37037:7;37045:1;37037:10;;;;;;;;:::i;:::-;;;;;;;:25;;37029:69;;;;-1:-1:-1::0;;;37029:69:0::1;;;;;;;:::i;:::-;37109:178;37155:4;;37160:1;37155:7;;;;;;;:::i;31544:935::-:0;31901:17;31931:12;31946:44;31969:7;31978:5;31985:4;31946:22;:44::i;:::-;31931:59;;32001:13;32017:10;:42;;32050:9;32017:42;;;-1:-1:-1;;32017:42:0;32070:180;;-1:-1:-1;;;32070:180:0;;32001:58;;-1:-1:-1;;;;;;32070:25:0;;;;;:180;;32110:10;;32143:4;;32001:58;;32183:8;;32206:1;;32222;;32238;;32070:180;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32273:198;32335:5;32355:9;32379:14;32408:12;32435:2;32452:8;32273:47;:198::i;:::-;32261:210;31544:935;-1:-1:-1;;;;;;;;;;;;;31544:935:0:o;41431:905::-;41682:8;22750:15;22738:8;:27;;22730:56;;;;-1:-1:-1;;;22730:56:0;;;;;;;:::i;:::-;41724:3:::1;;41711:9;:16;;41703:71;;;;-1:-1:-1::0;;;41703:71:0::1;;;;;;;:::i;:::-;41793:9;::::0;41813:3:::1;::::0;41785:32:::1;::::0;-1:-1:-1;;;;;41793:9:0;;::::1;::::0;41785:32;::::1;;;::::0;41813:3;41793:9:::1;41785:32:::0;41793:9;41785:32;41813:3;41793:9;41785:32;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;41828:176;41874:4;;41879:1;41874:7;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;41896:10;41921:49;41944:7;41953:4;;41958:1;41953:7;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;41962:4;;41967:1;41962:7;;;;;;;:::i;41921:49::-;41985:8;41828:31;:176::i;:::-;42015:21;42046:4:::0;;42051:15:::1;42065:1;42046:4:::0;42051:15:::1;:::i;:::-;42046:21;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;42039:43;::::0;-1:-1:-1;;;42039:43:0;;-1:-1:-1;;;;;8480:32:1;;;42039:43:0::1;::::0;::::1;8462:51:1::0;42039:39:0;;;::::1;::::0;::::1;::::0;8435:18:1;;42039:43:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;42015:67;;42093:44;42128:4;;42093:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;42134:2:0;;-1:-1:-1;42093:34:0::1;::::0;-1:-1:-1;;42093:44:0:i:1;:::-;42253:12:::0;42170:62:::1;42218:13:::0;42177:4;;42182:15:::1;42196:1;42177:4:::0;42182:15:::1;:::i;:::-;42177:21;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;42170:43;::::0;-1:-1:-1;;;42170:43:0;;-1:-1:-1;;;;;8480:32:1;;;42170:43:0::1;::::0;::::1;8462:51:1::0;42170:39:0;;;::::1;::::0;::::1;::::0;8435:18:1;;42170:43:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:47:::0;::::1;:62::i;:::-;:95;;42148:180;;;;-1:-1:-1::0;;;42148:180:0::1;;;;;;;:::i;:::-;41692:644;41431:905:::0;;;;;;;:::o;45715:82::-;20765:13;:11;:13::i;:::-;45777:3:::1;:12:::0;45715:82::o;21527:103::-;20765:13;:11;:13::i;:::-;21592:30:::1;21619:1;21592:18;:30::i;:::-;21527:103::o:0;43369:1005::-;43617:8;22750:15;22738:8;:27;;22730:56;;;;-1:-1:-1;;;22730:56:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;43671:4:0::1;43646:29;:4:::0;;43651:15:::1;43665:1;43646:4:::0;43651:15:::1;:::i;:::-;43646:21;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;43646:29:0::1;;43638:63;;;;-1:-1:-1::0;;;43638:63:0::1;;;;;;;:::i;:::-;43733:3;;43720:9;:16;;43712:71;;;;-1:-1:-1::0;;;43712:71:0::1;;;;;;;:::i;:::-;43802:9;::::0;43822:3:::1;::::0;43794:32:::1;::::0;-1:-1:-1;;;;;43802:9:0;;::::1;::::0;43794:32;::::1;;;::::0;43822:3;43802:9:::1;43794:32:::0;43802:9;43794:32;43822:3;43802:9;43794:32;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;43837:176;43883:4;;43888:1;43883:7;;;;;;;:::i;43837:176::-;44024:55;44059:4;;44024:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;44073:4:0::1;::::0;-1:-1:-1;44024:34:0::1;::::0;-1:-1:-1;;44024:55:0:i:1;:::-;44110:37;::::0;-1:-1:-1;;;44110:37:0;;44141:4:::1;44110:37;::::0;::::1;8462:51:1::0;44090:17:0::1;::::0;44117:4:::1;-1:-1:-1::0;;;;;44110:22:0::1;::::0;::::1;::::0;8435:18:1;;44110:37:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;44090:57;;44193:12;44180:9;:25;;44158:110;;;;-1:-1:-1::0;;;44158:110:0::1;;;;;;;:::i;:::-;44279:31;::::0;-1:-1:-1;;;44279:31:0;;::::1;::::0;::::1;1809:25:1::0;;;44285:4:0::1;-1:-1:-1::0;;;;;44279:20:0::1;::::0;::::1;::::0;1782:18:1;;44279:31:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;44321:45;44352:2;44356:9;44321:30;:45::i;35251:1163::-:0;35516:24;35488:8;22750:15;22738:8;:27;;22730:56;;;;-1:-1:-1;;;22730:56:0;;;;;;;:::i;:::-;35577:4:::1;-1:-1:-1::0;;;;;35566:15:0::1;:4;;35571:1;35566:7;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;35566:15:0::1;;35558:49;;;;-1:-1:-1::0;;;35558:49:0::1;;;;;;;:::i;:::-;35653:3;;35640:9;:16;;35618:126;;;::::0;-1:-1:-1;;;35618:126:0;;14606:2:1;35618:126:0::1;::::0;::::1;14588:21:1::0;14645:2;14625:18;;;14618:30;14684:34;14664:18;;;14657:62;14755:30;14735:18;;;14728:58;14803:19;;35618:126:0::1;14404:424:1::0;35618:126:0::1;35765:9;::::0;35785:3:::1;::::0;35757:32:::1;::::0;-1:-1:-1;;;;;35765:9:0;;::::1;::::0;35757:32;::::1;;;::::0;35785:3;35765:9:::1;35757:32:::0;35765:9;35757:32;35785:3;35765:9;35757:32;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;35802:21;35838:3;;35826:9;:15;;;;:::i;:::-;35802:39;;35878:1;35862:13;:17;35854:63;;;::::0;-1:-1:-1;;;35854:63:0;;15035:2:1;35854:63:0::1;::::0;::::1;15017:21:1::0;15074:2;15054:18;;;15047:30;15113:34;15093:18;;;15086:62;-1:-1:-1;;;15164:18:1;;;15157:31;15205:19;;35854:63:0::1;14833:397:1::0;35854:63:0::1;35938:58;35967:7;35976:13;35991:4;;35938:58;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;35938:28:0::1;::::0;-1:-1:-1;;;35938:58:0:i:1;:::-;35928:68;;36060:12;36029:7;36054:1;36037:7;:14;:18;;;;:::i;:::-;36029:27;;;;;;;;:::i;:::-;;;;;;;:43;;36007:128;;;;-1:-1:-1::0;;;36007:128:0::1;;;;;;;:::i;:::-;36154:4;-1:-1:-1::0;;;;;36148:19:0::1;;36175:13;36148:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;36229:4;-1:-1:-1::0;;;;;36223:20:0::1;;36262:49;36285:7;36294:4;;36299:1;36294:7;;;;;;;:::i;36262:49::-;36223:135;::::0;-1:-1:-1;;;;;;36223:135:0::1;::::0;;;;;;-1:-1:-1;;;;;15427:32:1;;;36223:135:0::1;::::0;::::1;15409:51:1::0;15476:18;;;15469:34;;;15382:18;;36223:135:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;36202:167;;;;:::i;:::-;36382:24;36388:7;36397:4;;36382:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;36403:2:0;;-1:-1:-1;36382:5:0::1;::::0;-1:-1:-1;;36382:24:0:i:1;:::-;35547:867;35251:1163:::0;;;;;;;;:::o;44922:255::-;45073:16;45109:60;45136:9;45147;45158:10;45109:26;:60::i;34406:837::-;34701:24;34673:8;22750:15;22738:8;:27;;22730:56;;;;-1:-1:-1;;;22730:56:0;;;;;;;:::i;:::-;34753:53:::1;34781:7;34790:9;34801:4;;34753:53;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;34753:27:0::1;::::0;-1:-1:-1;;;34753:53:0:i:1;:::-;34743:63;;34839:11;34825:7;34833:1;34825:10;;;;;;;;:::i;:::-;;;;;;;:25;;34817:69;;;;-1:-1:-1::0;;;34817:69:0::1;;;;;;;:::i;46169:110::-:0;20765:13;:11;:13::i;:::-;46249:9:::1;:22:::0;;-1:-1:-1;;;;;;46249:22:0::1;-1:-1:-1::0;;;;;46249:22:0;;;::::1;::::0;;;::::1;::::0;;46169:110::o;44418:232::-;44558:15;44593:49;44614:7;44623:8;44633;44593:20;:49::i;30771:765::-;31049:17;31030:8;22750:15;22738:8;:27;;22730:56;;;;-1:-1:-1;;;22730:56:0;;;;;;;:::i;:::-;31095:196:::1;31125:5;31145:4;31164:9;31188:14;31217:12;31252:4;31272:8;31095:15;:196::i;:::-;31381:38;::::0;-1:-1:-1;;;31381:38:0;;31413:4:::1;31381:38;::::0;::::1;8462:51:1::0;31079:212:0;;-1:-1:-1;31302:128:0::1;::::0;-1:-1:-1;31344:5:0;;31364:2;;-1:-1:-1;;;;;31381:23:0;::::1;::::0;::::1;::::0;8435:18:1;;31381:38:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;31302:27;:128::i;:::-;31441:31;::::0;-1:-1:-1;;;31441:31:0;;::::1;::::0;::::1;1809:25:1::0;;;31447:4:0::1;-1:-1:-1::0;;;;;31441:20:0::1;::::0;::::1;::::0;1782:18:1;;31441:31:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;31483:45;31514:2;31518:9;31483:30;:45::i;42344:1017::-:0;42565:8;22750:15;22738:8;:27;;22730:56;;;;-1:-1:-1;;;22730:56:0;;;;;;;:::i;:::-;42605:4:::1;-1:-1:-1::0;;;;;42594:15:0::1;:4;;42599:1;42594:7;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;42594:15:0::1;;42586:49;;;;-1:-1:-1::0;;;42586:49:0::1;;;;;;;:::i;:::-;42667:3;;42654:9;:16;;42646:71;;;;-1:-1:-1::0;;;42646:71:0::1;;;;;;;:::i;:::-;42736:9;::::0;42756:3:::1;::::0;42728:32:::1;::::0;-1:-1:-1;;;;;42736:9:0;;::::1;::::0;42728:32;::::1;;;::::0;42756:3;42736:9:::1;42728:32:::0;42736:9;42728:32;42756:3;42736:9;42728:32;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;42773:16;42804:3;;42792:9;:15;;;;:::i;:::-;42773:34;;42824:4;-1:-1:-1::0;;;;;42818:19:0::1;;42845:8;42818:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;42894:4;-1:-1:-1::0;;;;;42888:20:0::1;;42927:49;42950:7;42959:4;;42964:1;42959:7;;;;;;;:::i;42927:49::-;42888:130;::::0;-1:-1:-1;;;;;;42888:130:0::1;::::0;;;;;;-1:-1:-1;;;;;15427:32:1;;;42888:130:0::1;::::0;::::1;15409:51:1::0;15476:18;;;15469:34;;;15382:18;;42888:130:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;42867:162;;;;:::i;:::-;43040:21;43071:4:::0;;43076:15:::1;43090:1;43071:4:::0;43076:15:::1;:::i;:::-;43071:21;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;43064:43;::::0;-1:-1:-1;;;43064:43:0;;-1:-1:-1;;;;;8480:32:1;;;43064:43:0::1;::::0;::::1;8462:51:1::0;43064:39:0;;;::::1;::::0;::::1;::::0;8435:18:1;;43064:43:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;43040:67;;43118:44;43153:4;;43118:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;43159:2:0;;-1:-1:-1;43118:34:0::1;::::0;-1:-1:-1;;43118:44:0:i:1;:::-;43278:12:::0;43195:62:::1;43243:13:::0;43202:4;;43207:15:::1;43221:1;43202:4:::0;43207:15:::1;:::i;:::-;43202:21;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;43195:43;::::0;-1:-1:-1;;;43195:43:0;;-1:-1:-1;;;;;8480:32:1;;;43195:43:0::1;::::0;::::1;8462:51:1::0;43195:39:0;;;::::1;::::0;::::1;::::0;8435:18:1;;43195:43:0::1;8316:203:1::0;27097:942:0;27408:15;27425;27380:8;22750:15;22738:8;:27;;22730:56;;;;-1:-1:-1;;;22730:56:0;;;;;;;:::i;:::-;27458:12:::1;27473:47;27496:7;27505:6;27513;27473:22;:47::i;:::-;27531:60;::::0;-1:-1:-1;;;27531:60:0;;27563:10:::1;27531:60;::::0;::::1;16004:34:1::0;-1:-1:-1;;;;;27531:31:0;::::1;16054:18:1::0;;;16047:43;;;16106:18;;;16099:34;;;27458:62:0;;-1:-1:-1;27531:31:0::1;::::0;15939:18:1;;27531:60:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;27665:27:0::1;::::0;-1:-1:-1;;;27665:27:0;;-1:-1:-1;;;;;8480:32:1;;;27665:27:0::1;::::0;::::1;8462:51:1::0;27629:15:0::1;::::0;;;27665:23;::::1;::::0;::::1;::::0;8435:18:1;;27665:27:0::1;::::0;::::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;27628:64;;;;27704:14;27724:41;27750:6;27758;27724:25;:41::i;:::-;27703:62;;;27807:6;-1:-1:-1::0;;;;;27797:16:0::1;:6;-1:-1:-1::0;;;;;27797:16:0::1;;:84;;27864:7;27873;27797:84;;;27830:7;27839;27797:84;27776:105:::0;;-1:-1:-1;27776:105:0;-1:-1:-1;27900:21:0;;::::1;;27892:64;;;::::0;-1:-1:-1;;;27892:64:0;;16596:2:1;27892:64:0::1;::::0;::::1;16578:21:1::0;16635:2;16615:18;;;16608:30;16674:32;16654:18;;;16647:60;16724:18;;27892:64:0::1;16394:354:1::0;27892:64:0::1;27986:10;27975:7;:21;;27967:64;;;::::0;-1:-1:-1;;;27967:64:0;;16955:2:1;27967:64:0::1;::::0;::::1;16937:21:1::0;16994:2;16974:18;;;16967:30;17033:32;17013:18;;;17006:60;17083:18;;27967:64:0::1;16753:354:1::0;27967:64:0::1;27447:592;;;;27097:942:::0;;;;;;;;;;;:::o;45805:356::-;20765:13;:11;:13::i;:::-;45890:21:::1;45930:10:::0;45922:52:::1;;;::::0;-1:-1:-1;;;45922:52:0;;17314:2:1;45922:52:0::1;::::0;::::1;17296:21:1::0;17353:2;17333:18;;;17326:30;17392:31;17372:18;;;17365:59;17441:18;;45922:52:0::1;17112:353:1::0;45922:52:0::1;46003:7;45993:6;:17;;45985:59;;;::::0;-1:-1:-1;;;45985:59:0;;17672:2:1;45985:59:0::1;::::0;::::1;17654:21:1::0;17711:2;17691:18;;;17684:30;17750:31;17730:18;;;17723:59;17799:18;;45985:59:0::1;17470:353:1::0;45985:59:0::1;46056:12;20952:6:::0;;46074:31:::1;::::0;-1:-1:-1;;;;;20952:6:0;;;;46094;;46056:12;46074:31;46056:12;46074:31;46094:6;20952;46074:31:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46055:50;;;46124:7;46116:37;;;::::0;-1:-1:-1;;;46116:37:0;;18240:2:1;46116:37:0::1;::::0;::::1;18222:21:1::0;18279:2;18259:18;;;18252:30;-1:-1:-1;;;18298:18:1;;;18291:47;18355:18;;46116:37:0::1;18038:341:1::0;46116:37:0::1;45861:300;;45805:356:::0;:::o;45185:257::-;45332:24;45381:53;45410:7;45419:8;45429:4;45381:28;:53::i;29738:954::-;30102:19;30123:17;30158:12;30173:44;30196:7;30205:5;30212:4;30173:22;:44::i;:::-;30158:59;;30228:13;30244:10;:42;;30277:9;30244:42;;;-1:-1:-1;;30244:42:0;30297:180;;-1:-1:-1;;;30297:180:0;;30228:58;;-1:-1:-1;;;;;;30297:25:0;;;;;:180;;30337:10;;30370:4;;30228:58;;30410:8;;30433:1;;30449;;30465;;30297:180;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30515:169;30548:5;30568:9;30592:14;30621:12;30648:2;30665:8;30515:18;:169::i;:::-;30488:196;;;;-1:-1:-1;29738:954:0;-1:-1:-1;;;;;;;;;;;;;29738:954:0:o;24986:947::-;25348:15;25378;25408:17;25306:8;22750:15;22738:8;:27;;22730:56;;;;-1:-1:-1;;;22730:56:0;;;;;;;:::i;:::-;25474:174:::1;25502:6;25523;25544:14;25573;25602:10;25627;25474:13;:174::i;:::-;25453:195:::0;;-1:-1:-1;25453:195:0;-1:-1:-1;25659:12:0::1;25674:47;25697:7;25706:6:::0;25714;25674:22:::1;:47::i;:::-;25659:62;;25732:66;25764:6;25772:10;25784:4;25790:7;25732:31;:66::i;:::-;25809;25841:6;25849:10;25861:4;25867:7;25809:31;:66::i;:::-;25898:27;::::0;-1:-1:-1;;;25898:27:0;;-1:-1:-1;;;;;8480:32:1;;;25898:27:0::1;::::0;::::1;8462:51:1::0;25898:23:0;::::1;::::0;::::1;::::0;8435:18:1;;25898:27:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;25886:39;;25442:491;24986:947:::0;;;;;;;;;;;;;:::o;21785:201::-;20765:13;:11;:13::i;:::-;-1:-1:-1;;;;;21874:22:0;::::1;21866:73;;;::::0;-1:-1:-1;;;21866:73:0;;18586:2:1;21866:73:0::1;::::0;::::1;18568:21:1::0;18625:2;18605:18;;;18598:30;18664:34;18644:18;;;18637:62;-1:-1:-1;;;18715:18:1;;;18708:36;18761:19;;21866:73:0::1;18384:402:1::0;21866:73:0::1;21950:28;21969:8;21950:18;:28::i;:::-;21785:201:::0;:::o;25941:1113::-;26274:19;26308:17;26340;26232:8;22750:15;22738:8;:27;;22730:56;;;;-1:-1:-1;;;22730:56:0;;;;;;;:::i;:::-;26412:176:::1;26440:5;26460:4;26479:18;26512:9;26536:14;26565:12;26412:13;:176::i;:::-;26385:203:::0;;-1:-1:-1;26385:203:0;-1:-1:-1;26599:12:0::1;26614:44;26637:7;26646:5:::0;26653:4:::1;26614:22;:44::i;:::-;26599:59;;26669:69;26701:5;26708:10;26720:4;26726:11;26669:31;:69::i;:::-;26755:4;-1:-1:-1::0;;;;;26749:19:0::1;;26776:9;26749:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;26806:37:0::1;::::0;-1:-1:-1;;;26806:37:0;;-1:-1:-1;;;;;15427:32:1;;;26806:37:0::1;::::0;::::1;15409:51:1::0;15476:18;;;15469:34;;;26812:4:0::1;26806:20;::::0;-1:-1:-1;26806:20:0::1;::::0;-1:-1:-1;15382:18:1;;;-1:-1:-1;26806:37:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;26799:45;;;;:::i;:::-;26867:27;::::0;-1:-1:-1;;;26867:27:0;;-1:-1:-1;;;;;8480:32:1;;;26867:27:0::1;::::0;::::1;8462:51:1::0;26867:23:0;::::1;::::0;::::1;::::0;8435:18:1;;26867:27:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;26855:39;;26957:9;26945;:21;26941:105;;;26981:65;27012:10;27024:21;27036:9:::0;27024::::1;:21;:::i;:::-;26981:30;:65::i;:::-;26374:680;25941:1113:::0;;;;;;;;;;;:::o;38603:1114::-;38865:24;38837:8;22750:15;22738:8;:27;;22730:56;;;;-1:-1:-1;;;22730:56:0;;;;;;;:::i;:::-;38926:4:::1;-1:-1:-1::0;;;;;38915:15:0::1;:4;;38920:1;38915:7;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;38915:15:0::1;;38907:49;;;;-1:-1:-1::0;;;38907:49:0::1;;;;;;;:::i;:::-;38990:3;;38977:9;:16;;38969:62;;;::::0;-1:-1:-1;;;38969:62:0;;18993:2:1;38969:62:0::1;::::0;::::1;18975:21:1::0;19032:2;19012:18;;;19005:30;19071:34;19051:18;;;19044:62;-1:-1:-1;;;19122:18:1;;;19115:31;19163:19;;38969:62:0::1;18791:397:1::0;38969:62:0::1;39052:9;::::0;39072:3:::1;::::0;39044:32:::1;::::0;-1:-1:-1;;;;;39052:9:0;;::::1;::::0;39044:32;::::1;;;::::0;39072:3;39052:9:::1;39044:32:::0;39052:9;39044:32;39072:3;39052:9;39044:32;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;39087:18;39120:3;;39108:9;:15;;;;:::i;:::-;39087:36;;39144:53;39172:7;39181:9;39192:4;;39144:53;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;39144:27:0::1;::::0;-1:-1:-1;;;39144:53:0:i:1;:::-;39134:63;;39230:10;39216:7;39224:1;39216:10;;;;;;;;:::i;:::-;;;;;;;:24;;39208:68;;;;-1:-1:-1::0;;;39208:68:0::1;;;;;;;:::i;:::-;39293:4;-1:-1:-1::0;;;;;39287:19:0::1;;39314:7;39322:1;39314:10;;;;;;;;:::i;:::-;;;;;;;39287:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;39365:4;-1:-1:-1::0;;;;;39359:20:0::1;;39398:49;39421:7;39430:4;;39435:1;39430:7;;;;;;;:::i;39398:49::-;39466:7;39474:1;39466:10;;;;;;;;:::i;:::-;;;;;;;39359:132;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;15427:32:1;;;;15409:51;;15491:2;15476:18;;15469:34;15397:2;15382:18;;15235:274;39359:132:0::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;39338:164;;;;:::i;:::-;39550:24;39556:7;39565:4;;39550:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;39571:2:0;;-1:-1:-1;39550:5:0::1;::::0;-1:-1:-1;;39550:24:0:i:1;:::-;39604:7;39612:1;39604:10;;;;;;;;:::i;:::-;;;;;;;39591;:23;39587:123;;;39631:67;39662:10;39687:7;39695:1;39687:10;;;;;;;;:::i;:::-;;;;;;;39674;:23;;;;:::i;1516:449::-:0;1748:45;;;-1:-1:-1;;;;;15427:32:1;;;1748:45:0;;;15409:51:1;15476:18;;;;15469:34;;;1748:45:0;;;;;;;;;;15382:18:1;;;;1748:45:0;;;;;;;-1:-1:-1;;;;;1748:45:0;-1:-1:-1;;;1748:45:0;;;1737:57;;-1:-1:-1;;;;1737:10:0;;;;:57;;1748:45;1737:57;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1701:93;;;;1827:7;:57;;;;-1:-1:-1;1839:11:0;;:16;;:44;;;1870:4;1859:24;;;;;;;;;;;;:::i;:::-;1805:152;;;;-1:-1:-1;;;1805:152:0;;19942:2:1;1805:152:0;;;19924:21:1;19981:2;19961:18;;;19954:30;20020:34;20000:18;;;19993:62;-1:-1:-1;;;20071:18:1;;;20064:43;20124:19;;1805:152:0;19740:409:1;1805:152:0;1623:342;;1516:449;;;:::o;2479:217::-;2592:12;;;2552;2592;;;;;;;;;-1:-1:-1;;;;;2570:7:0;;;2585:5;;2570:35;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2551:54;;;2624:7;2616:72;;;;-1:-1:-1;;;2616:72:0;;20356:2:1;2616:72:0;;;20338:21:1;20395:2;20375:18;;;20368:30;20434:34;20414:18;;;20407:62;-1:-1:-1;;;20485:18:1;;;20478:50;20545:19;;2616:72:0;20154:416:1;14752:605:0;14888:17;14937:1;14926:8;:12;14918:66;;;;-1:-1:-1;;;14918:66:0;;20777:2:1;14918:66:0;;;20759:21:1;20816:2;20796:18;;;20789:30;20855:34;20835:18;;;20828:62;-1:-1:-1;;;20906:18:1;;;20899:39;20955:19;;14918:66:0;20575:405:1;14918:66:0;15029:1;15017:9;:13;:31;;;;;15047:1;15034:10;:14;15017:31;14995:119;;;;-1:-1:-1;;;14995:119:0;;;;;;;:::i;:::-;15125:23;15151:17;:8;15164:3;15151:12;:17::i;:::-;15125:43;-1:-1:-1;15179:17:0;15199:31;15125:43;15219:10;15199:19;:31::i;:::-;15179:51;-1:-1:-1;15241:19:0;15263:40;15287:15;15263:19;:9;15277:4;15263:13;:19::i;:::-;:23;;:40::i;:::-;15241:62;-1:-1:-1;15326:23:0;15241:62;15326:9;:23;:::i;:::-;15314:35;14752:605;-1:-1:-1;;;;;;;14752:605:0:o;16117:627::-;16255:24;16315:1;16300:4;:11;:16;;16292:57;;;;-1:-1:-1;;;16292:57:0;;21816:2:1;16292:57:0;;;21798:21:1;21855:2;21835:18;;;21828:30;21894;21874:18;;;21867:58;21942:18;;16292:57:0;21614:352:1;16292:57:0;16384:4;:11;16370:26;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;16370:26:0;;16360:36;;16420:8;16407:7;16415:1;16407:10;;;;;;;;:::i;:::-;;;;;;:21;;;;;16444:9;16439:298;16473:1;16459:4;:11;:15;;;;:::i;:::-;16455:1;:19;16439:298;;;16497:17;16516:18;16538:108;16568:7;16594:4;16599:1;16594:7;;;;;;;;:::i;:::-;;;;;;;16620:4;16625:1;16629;16625:5;;;;:::i;:::-;16620:11;;;;;;;;:::i;:::-;;;;;;;16538;:108::i;:::-;16496:150;;;;16678:47;16691:7;16699:1;16691:10;;;;;;;;:::i;:::-;;;;;;;16703:9;16714:10;16678:12;:47::i;:::-;16661:7;16669:5;:1;16673;16669:5;:::i;:::-;16661:14;;;;;;;;:::i;:::-;;;;;;;;;;:64;-1:-1:-1;;16476:3:0;;16439:298;;;;16117:627;;;;;:::o;12844:728::-;12967:12;12993:14;13009;13027:26;13038:6;13046;13027:10;:26::i;:::-;13318:32;;-1:-1:-1;;22328:2:1;22324:15;;;22320:24;;13318:32:0;;;22308:37:1;22379:15;;;22375:24;22361:12;;;22354:46;12992:61:0;;-1:-1:-1;12992:61:0;-1:-1:-1;13270:7:0;;22416:12:1;;13318:32:0;;;;;;;;;;;;13308:43;;;;;;13185:311;;;;;;;;-1:-1:-1;;;;;;22798:26:1;;22861:2;22857:15;;;;-1:-1:-1;;22853:53:1;22849:1;22840:11;;22833:74;22932:2;22923:12;;22916:28;22974:66;22969:2;22960:12;;22953:88;23066:2;23057:12;;22439:636;13185:311:0;;;;-1:-1:-1;;13185:311:0;;;;;;;;;13149:370;;13185:311;13149:370;;;;;12844:728;-1:-1:-1;;;;;;12844:728:0:o;1973:498::-;2244:51;;;-1:-1:-1;;;;;16022:15:1;;;2244:51:0;;;16004:34:1;16074:15;;;16054:18;;;16047:43;16106:18;;;;16099:34;;;2244:51:0;;;;;;;;;;15939:18:1;;;;2244:51:0;;;;;;;-1:-1:-1;;;;;2244:51:0;-1:-1:-1;;;2244:51:0;;;2233:63;;-1:-1:-1;;;;2233:10:0;;;;:63;;2244:51;2233:63;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2197:99;;;;2329:7;:57;;;;-1:-1:-1;2341:11:0;;:16;;:44;;;2372:4;2361:24;;;;;;;;;;;;:::i;:::-;2307:156;;;;-1:-1:-1;;;2307:156:0;;23282:2:1;2307:156:0;;;23264:21:1;23321:2;23301:18;;;23294:30;23360:34;23340:18;;;23333:62;-1:-1:-1;;;23411:18:1;;;23404:47;23468:19;;2307:156:0;23080:413:1;2307:156:0;2107:364;;1973:498;;;;:::o;32590:902::-;32734:9;32729:756;32763:1;32749:4;:11;:15;;;;:::i;:::-;32745:1;:19;32729:756;;;32787:13;32802:14;32821:4;32826:1;32821:7;;;;;;;;:::i;:::-;;;;;;;32830:4;32835:1;32839;32835:5;;;;:::i;:::-;32830:11;;;;;;;;:::i;:::-;;;;;;;32786:56;;;;32858:14;32878:40;32904:5;32911:6;32878:25;:40::i;:::-;-1:-1:-1;32857:61:0;-1:-1:-1;32933:17:0;32953:7;32961:5;:1;32965;32961:5;:::i;:::-;32953:14;;;;;;;;:::i;:::-;;;;;;;32933:34;;32983:18;33003;33034:6;-1:-1:-1;;;;;33025:15:0;:5;-1:-1:-1;;;;;33025:15:0;;:101;;33104:9;33123:1;33025:101;;;33069:1;33073:9;33025:101;32982:144;;;;33141:10;33172:1;33158:4;:11;:15;;;;:::i;:::-;33154:1;:19;:114;;33265:3;33154:114;;;33193:52;33216:7;33225:6;33233:4;33238:5;:1;33242;33238:5;:::i;:::-;33233:11;;;;;;;;:::i;:::-;;;;;;;33193:22;:52::i;:::-;33141:127;;33296:46;33319:7;33328:5;33335:6;33296:22;:46::i;:::-;-1:-1:-1;;;;;33283:65:0;;33367:10;33396;33425:2;33456:1;33446:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;33446:12:0;;33283:190;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;32766:3:0;;;;;-1:-1:-1;32729:756:0;;-1:-1:-1;;;;;;;;32729:756:0;;;32590:902;;;:::o;16825:648::-;16963:24;17023:1;17008:4;:11;:16;;17000:57;;;;-1:-1:-1;;;17000:57:0;;21816:2:1;17000:57:0;;;21798:21:1;21855:2;21835:18;;;21828:30;21894;21874:18;;;21867:58;21942:18;;17000:57:0;21614:352:1;17000:57:0;17092:4;:11;17078:26;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;17078:26:0;;17068:36;;17145:9;17115:7;17140:1;17123:7;:14;:18;;;;:::i;:::-;17115:27;;;;;;;;:::i;:::-;;;;;;:39;;;;;17170:9;17196:1;17182:4;:11;:15;;;;:::i;:::-;17170:27;;17165:301;17199:5;;17165:301;;17227:17;;17268:108;17298:7;17324:4;17329:5;17333:1;17329;:5;:::i;:::-;17324:11;;;;;;;;:::i;:::-;;;;;;;17354:4;17359:1;17354:7;;;;;;;;:::i;17268:108::-;17226:150;;;;17408:46;17420:7;17428:1;17420:10;;;;;;;;:::i;:::-;;;;;;;17432:9;17443:10;17408:11;:46::i;:::-;17391:7;17399:5;17403:1;17399;:5;:::i;:::-;17391:14;;;;;;;;:::i;:::-;;;;;;:63;;;;;17211:255;;17206:3;;;;;:::i;:::-;;;;17165:301;;39864:1559;40002:9;39997:1419;40031:1;40017:4;:11;:15;;;;:::i;:::-;40013:1;:19;39997:1419;;;40055:13;40070:14;40089:4;40094:1;40089:7;;;;;;;;:::i;:::-;;;;;;;40098:4;40103:1;40107;40103:5;;;;:::i;:::-;40098:11;;;;;;;;:::i;:::-;;;;;;;40054:56;;;;40126:14;40146:40;40172:5;40179:6;40146:25;:40::i;:::-;40125:61;;;40201:17;40252:46;40275:7;40284:5;40291:6;40252:22;:46::i;:::-;40201:112;;40328:19;40362:20;40474:16;40492;40514:4;-1:-1:-1;;;;;40514:16:0;;:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;40473:59;-1:-1:-1;;;;;40473:59:0;;;-1:-1:-1;;;;;40473:59:0;;;40552:20;40574:21;40608:6;-1:-1:-1;;;;;40599:15:0;:5;-1:-1:-1;;;;;40599:15:0;;:103;;40683:8;40693;40599:103;;;40639:8;40649;40599:103;40735:38;;-1:-1:-1;;;40735:38:0;;-1:-1:-1;;;;;8480:32:1;;;40735:38:0;;;8462:51:1;40551:151:0;;-1:-1:-1;40551:151:0;;-1:-1:-1;40735:96:0;;40551:151;;40735:23;;;;;;8435:18:1;;40735:38:0;8316:203:1;40735:96:0;40721:110;;40865:151;40915:11;40949:12;40984:13;40865:27;:151::i;:::-;40850:166;;40397:635;;;;41047:18;41067;41098:6;-1:-1:-1;;;;;41089:15:0;:5;-1:-1:-1;;;;;41089:15:0;;:107;;41171:12;41193:1;41089:107;;;41133:1;41137:12;41089:107;41046:150;;;;41211:10;41242:1;41228:4;:11;:15;;;;:::i;:::-;41224:1;:19;:114;;41335:3;41224:114;;;41263:52;41286:7;41295:6;41303:4;41308:5;:1;41312;41308:5;:::i;41263:52::-;41391:12;;;41401:1;41391:12;;;;;;;;;-1:-1:-1;;;41353:51:0;;;41211:127;;-1:-1:-1;;;;;;41353:9:0;;;;;:51;;41363:10;;41375;;41211:127;;41353:51;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;40034:3:0;;;;;-1:-1:-1;39997:1419:0;;-1:-1:-1;;;;;;;;;;39997:1419:0;11794:138;11852:9;11897:1;11887:5;11891:1;11897;11887:5;:::i;:::-;11883:9;;;11882:16;;11874:50;;;;-1:-1:-1;;;11874:50:0;;25131:2:1;11874:50:0;;;25113:21:1;25170:2;25150:18;;;25143:30;-1:-1:-1;;;25189:18:1;;;25182:51;25250:18;;11874:50:0;24929:345:1;21044:132:0;20925:7;20952:6;-1:-1:-1;;;;;20952:6:0;19510:10;21108:23;21100:68;;;;-1:-1:-1;;;21100:68:0;;25481:2:1;21100:68:0;;;25463:21:1;;;25500:18;;;25493:30;25559:34;25539:18;;;25532:62;25611:18;;21100:68:0;25279:356:1;22146:191:0;22220:16;22239:6;;-1:-1:-1;;;;;22256:17:0;;;-1:-1:-1;;;;;;22256:17:0;;;;;;22289:40;;22239:6;;;;;;;22289:40;;22220:16;22289:40;22209:128;22146:191;:::o;15478:557::-;15614:16;15663:1;15651:9;:13;15643:68;;;;-1:-1:-1;;;15643:68:0;;25842:2:1;15643:68:0;;;25824:21:1;25881:2;25861:18;;;25854:30;25920:34;25900:18;;;25893:62;-1:-1:-1;;;25971:18:1;;;25964:40;26021:19;;15643:68:0;25640:406:1;15643:68:0;15756:1;15744:9;:13;:31;;;;;15774:1;15761:10;:14;15744:31;15722:119;;;;-1:-1:-1;;;15722:119:0;;;;;;;:::i;:::-;15852:17;15872:34;15901:4;15872:24;:9;15886;15872:13;:24::i;:::-;:28;;:34::i;:::-;15852:54;-1:-1:-1;15917:19:0;15939:34;15969:3;15939:25;:10;15954:9;15939:14;:25::i;:34::-;15917:56;-1:-1:-1;15995:32:0;16025:1;15996:23;15917:56;15996:9;:23;:::i;15995:32::-;15984:43;15478:557;-1:-1:-1;;;;;;15478:557:0:o;14230:400::-;14355:15;14401:1;14391:7;:11;14383:59;;;;-1:-1:-1;;;14383:59:0;;26253:2:1;14383:59:0;;;26235:21:1;26292:2;26272:18;;;26265:30;26331:34;26311:18;;;26304:62;-1:-1:-1;;;26382:18:1;;;26375:33;26425:19;;14383:59:0;26051:399:1;14383:59:0;14486:1;14475:8;:12;:28;;;;;14502:1;14491:8;:12;14475:28;14453:116;;;;-1:-1:-1;;;14453:116:0;;;;;;;:::i;:::-;14614:8;14590:21;:7;14602:8;14590:11;:21::i;:::-;:32;;;;:::i;12349:403::-;12451:14;12467;12517:6;-1:-1:-1;;;;;12507:16:0;:6;-1:-1:-1;;;;;12507:16:0;;12499:64;;;;-1:-1:-1;;;12499:64:0;;26657:2:1;12499:64:0;;;26639:21:1;26696:2;26676:18;;;26669:30;26735:34;26715:18;;;26708:62;-1:-1:-1;;;26786:18:1;;;26779:33;26829:19;;12499:64:0;26455:399:1;12499:64:0;12602:6;-1:-1:-1;;;;;12593:15:0;:6;-1:-1:-1;;;;;12593:15:0;;:79;;12657:6;12665;12593:79;;;12625:6;12633;12593:79;12574:98;;-1:-1:-1;12574:98:0;-1:-1:-1;;;;;;12691:20:0;;12683:61;;;;-1:-1:-1;;;12683:61:0;;27061:2:1;12683:61:0;;;27043:21:1;27100:2;27080:18;;;27073:30;27139;27119:18;;;27112:58;27187:18;;12683:61:0;26859:352:1;12683:61:0;12349:403;;;;;:::o;23264:1714::-;23595:48;;-1:-1:-1;;;23595:48:0;;-1:-1:-1;;;;;27446:15:1;;;23595:48:0;;;27428:34:1;27498:15;;;27478:18;;;27471:43;-1:-1:-1;;;;;;23611:7:0;23595:32;;;;;;27363:18:1;;23595:48:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;23595:62:0;;23591:146;;23674:51;;-1:-1:-1;;;23674:51:0;;-1:-1:-1;;;;;27446:15:1;;;23674:51:0;;;27428:34:1;27498:15;;;27478:18;;;27471:43;23690:7:0;23674:35;;;;27363:18:1;;23674:51:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;23591:146;23748:16;23766;23786:101;23827:7;23849:6;23870;23786:26;:101::i;:::-;23747:140;;;;23902:8;23914:1;23902:13;:30;;;;-1:-1:-1;23919:13:0;;23902:30;23898:1073;;;23971:14;;-1:-1:-1;23987:14:0;;-1:-1:-1;23898:1073:0;;;24035:22;24060:122;24099:14;24132:8;24159;24060:20;:122::i;:::-;24035:147;;24219:14;24201;:32;24197:763;;24302:10;24284:14;:28;;24254:132;;;;-1:-1:-1;;;24254:132:0;;16955:2:1;24254:132:0;;;16937:21:1;16994:2;16974:18;;;16967:30;17033:32;17013:18;;;17006:60;17083:18;;24254:132:0;16753:354:1;24254:132:0;24427:14;;-1:-1:-1;24443:14:0;-1:-1:-1;24443:14:0;24197:763;;;24499:22;24524:138;24567:14;24604:8;24635;24524:20;:138::i;:::-;24499:163;;24706:14;24688;:32;;24681:40;;;;:::i;:::-;24788:10;24770:14;:28;;24740:132;;;;-1:-1:-1;;;24740:132:0;;16596:2:1;24740:132:0;;;16578:21:1;16635:2;16615:18;;;16608:30;16674:32;16654:18;;;16647:60;16724:18;;24740:132:0;16394:354:1;24740:132:0;24913:14;-1:-1:-1;24929:14:0;;-1:-1:-1;24197:763:0;24020:951;23898:1073;23528:1450;;23264:1714;;;;;;;;;:::o;11940:151::-;11998:9;12028:6;;;:30;;-1:-1:-1;12057:1:0;12052;12043:5;12052:1;12057;12043:5;:::i;:::-;12039:9;-1:-1:-1;12038:15:0;;12039:9;12038:15;:::i;:::-;:20;12028:30;12020:63;;;;-1:-1:-1;;;12020:63:0;;28156:2:1;12020:63:0;;;28138:21:1;28195:2;28175:18;;;28168:30;-1:-1:-1;;;28214:18:1;;;28207:50;28274:18;;12020:63:0;27954:344:1;11649:137:0;11707:9;11752:1;11742:5;11746:1;11752;11742:5;:::i;:::-;11738:9;;;11737:16;;11729:49;;;;-1:-1:-1;;;11729:49:0;;28505:2:1;11729:49:0;;;28487:21:1;28544:2;28524:18;;;28517:30;-1:-1:-1;;;28563:18:1;;;28556:50;28623:18;;11729:49:0;28303:344:1;13630:487:0;13757:16;13775;13805:14;13825:26;13836:6;13844;13825:10;:26::i;:::-;13804:47;;;13863:16;13881;13930:32;13938:7;13947:6;13955;13930:7;:32::i;:::-;-1:-1:-1;;;;;13903:82:0;;:84;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;13862:125;-1:-1:-1;;;;;13862:125:0;;;-1:-1:-1;;;;;13862:125:0;;;14031:6;-1:-1:-1;;;;;14021:16:0;:6;-1:-1:-1;;;;;14021:16:0;;:88;;14090:8;14100;14021:88;;;14054:8;14064;14021:88;13998:111;;;;-1:-1:-1;13630:487:0;-1:-1:-1;;;;;;;13630:487:0:o;14:127:1:-;75:10;70:3;66:20;63:1;56:31;106:4;103:1;96:15;130:4;127:1;120:15;146:131;-1:-1:-1;;;;;221:31:1;;211:42;;201:70;;267:1;264;257:12;282:134;350:20;;379:31;350:20;379:31;:::i;:::-;282:134;;;:::o;421:663::-;525:6;533;541;549;557;565;618:3;606:9;597:7;593:23;589:33;586:53;;;635:1;632;625:12;586:53;674:9;661:23;693:31;718:5;693:31;:::i;:::-;743:5;-1:-1:-1;795:2:1;780:18;;767:32;;-1:-1:-1;846:2:1;831:18;;818:32;;-1:-1:-1;897:2:1;882:18;;869:32;;-1:-1:-1;953:3:1;938:19;;925:33;967;925;967;:::i;:::-;1019:7;1009:17;;;1073:3;1062:9;1058:19;1045:33;1035:43;;421:663;;;;;;;;:::o;1342:316::-;1419:6;1427;1435;1488:2;1476:9;1467:7;1463:23;1459:32;1456:52;;;1504:1;1501;1494:12;1456:52;-1:-1:-1;;1527:23:1;;;1597:2;1582:18;;1569:32;;-1:-1:-1;1648:2:1;1633:18;;;1620:32;;1342:316;-1:-1:-1;1342:316:1:o;1845:367::-;1908:8;1918:6;1972:3;1965:4;1957:6;1953:17;1949:27;1939:55;;1990:1;1987;1980:12;1939:55;-1:-1:-1;2013:20:1;;2056:18;2045:30;;2042:50;;;2088:1;2085;2078:12;2042:50;2125:4;2117:6;2113:17;2101:29;;2185:3;2178:4;2168:6;2165:1;2161:14;2153:6;2149:27;2145:38;2142:47;2139:67;;;2202:1;2199;2192:12;2217:778;2339:6;2347;2355;2363;2371;2379;2432:3;2420:9;2411:7;2407:23;2403:33;2400:53;;;2449:1;2446;2439:12;2400:53;2485:9;2472:23;2462:33;;2542:2;2531:9;2527:18;2514:32;2504:42;;2597:2;2586:9;2582:18;2569:32;2624:18;2616:6;2613:30;2610:50;;;2656:1;2653;2646:12;2610:50;2695:70;2757:7;2748:6;2737:9;2733:22;2695:70;:::i;:::-;2784:8;;-1:-1:-1;2669:96:1;-1:-1:-1;;2869:2:1;2854:18;;2841:32;2882:31;2841:32;2882:31;:::i;:::-;2932:5;2922:15;;;2984:3;2973:9;2969:19;2956:33;2946:43;;2217:778;;;;;;;;:::o;3000:632::-;3171:2;3223:21;;;3293:13;;3196:18;;;3315:22;;;3142:4;;3171:2;3394:15;;;;3368:2;3353:18;;;3142:4;3437:169;3451:6;3448:1;3445:13;3437:169;;;3512:13;;3500:26;;3581:15;;;;3546:12;;;;3473:1;3466:9;3437:169;;;-1:-1:-1;3623:3:1;;3000:632;-1:-1:-1;;;;;;3000:632:1:o;3637:127::-;3698:10;3693:3;3689:20;3686:1;3679:31;3729:4;3726:1;3719:15;3753:4;3750:1;3743:15;3769:1189;3862:6;3870;3923:2;3911:9;3902:7;3898:23;3894:32;3891:52;;;3939:1;3936;3929:12;3891:52;3975:9;3962:23;3952:33;;4004:2;4057;4046:9;4042:18;4029:32;4080:18;4121:2;4113:6;4110:14;4107:34;;;4137:1;4134;4127:12;4107:34;4175:6;4164:9;4160:22;4150:32;;4220:7;4213:4;4209:2;4205:13;4201:27;4191:55;;4242:1;4239;4232:12;4191:55;4278:2;4265:16;4300:2;4296;4293:10;4290:36;;;4306:18;;:::i;:::-;4352:2;4349:1;4345:10;4384:2;4378:9;4447:2;4443:7;4438:2;4434;4430:11;4426:25;4418:6;4414:38;4502:6;4490:10;4487:22;4482:2;4470:10;4467:18;4464:46;4461:72;;;4513:18;;:::i;:::-;4549:2;4542:22;4599:18;;;4633:15;;;;-1:-1:-1;4675:11:1;;;4671:20;;;4703:19;;;4700:39;;;4735:1;4732;4725:12;4700:39;4759:11;;;;4779:148;4795:6;4790:3;4787:15;4779:148;;;4861:23;4880:3;4861:23;:::i;:::-;4849:36;;4812:12;;;;4905;;;;4779:148;;;4946:6;4936:16;;;;;;;;3769:1189;;;;;:::o;4963:118::-;5049:5;5042:13;5035:21;5028:5;5025:32;5015:60;;5071:1;5068;5061:12;5086:156;5152:20;;5212:4;5201:16;;5191:27;;5181:55;;5232:1;5229;5222:12;5247:1152;5391:6;5399;5407;5415;5423;5431;5439;5447;5455;5463;5471:7;5525:3;5513:9;5504:7;5500:23;5496:33;5493:53;;;5542:1;5539;5532:12;5493:53;5581:9;5568:23;5600:31;5625:5;5600:31;:::i;:::-;5650:5;-1:-1:-1;5707:2:1;5692:18;;5679:32;5720:33;5679:32;5720:33;:::i;:::-;5772:7;-1:-1:-1;5826:2:1;5811:18;;5798:32;;-1:-1:-1;5877:2:1;5862:18;;5849:32;;-1:-1:-1;5928:3:1;5913:19;;5900:33;;-1:-1:-1;5985:3:1;5970:19;;5957:33;5999;5957;5999;:::i;:::-;6051:7;-1:-1:-1;6105:3:1;6090:19;;6077:33;;-1:-1:-1;6162:3:1;6147:19;;6134:33;6176:30;6134:33;6176:30;:::i;:::-;6225:7;-1:-1:-1;6251:37:1;6283:3;6268:19;;6251:37;:::i;:::-;6241:47;;6335:3;6324:9;6320:19;6307:33;6297:43;;6388:3;6377:9;6373:19;6360:33;6349:44;;5247:1152;;;;;;;;;;;;;;:::o;6404:1008::-;6539:6;6547;6555;6563;6571;6579;6587;6595;6603;6611;6664:3;6652:9;6643:7;6639:23;6635:33;6632:53;;;6681:1;6678;6671:12;6632:53;6720:9;6707:23;6739:31;6764:5;6739:31;:::i;:::-;6789:5;-1:-1:-1;6841:2:1;6826:18;;6813:32;;-1:-1:-1;6892:2:1;6877:18;;6864:32;;-1:-1:-1;6943:2:1;6928:18;;6915:32;;-1:-1:-1;6999:3:1;6984:19;;6971:33;7013;6971;7013;:::i;:::-;7065:7;-1:-1:-1;7119:3:1;7104:19;;7091:33;;-1:-1:-1;7176:3:1;7161:19;;7148:33;7190:30;7148:33;7190:30;:::i;:::-;7239:7;-1:-1:-1;7265:37:1;7297:3;7282:19;;7265:37;:::i;:::-;7255:47;;7349:3;7338:9;7334:19;7321:33;7311:43;;7401:3;7390:9;7386:19;7373:33;7363:43;;6404:1008;;;;;;;;;;;;;:::o;7417:180::-;7476:6;7529:2;7517:9;7508:7;7504:23;7500:32;7497:52;;;7545:1;7542;7535:12;7497:52;-1:-1:-1;7568:23:1;;7417:180;-1:-1:-1;7417:180:1:o;7602:709::-;7715:6;7723;7731;7739;7747;7800:3;7788:9;7779:7;7775:23;7771:33;7768:53;;;7817:1;7814;7807:12;7768:53;7853:9;7840:23;7830:33;;7914:2;7903:9;7899:18;7886:32;7941:18;7933:6;7930:30;7927:50;;;7973:1;7970;7963:12;7927:50;8012:70;8074:7;8065:6;8054:9;8050:22;8012:70;:::i;:::-;8101:8;;-1:-1:-1;7986:96:1;-1:-1:-1;;8186:2:1;8171:18;;8158:32;8199:31;8158:32;8199:31;:::i;:::-;7602:709;;;;-1:-1:-1;7602:709:1;;8301:2;8286:18;8273:32;;7602:709;-1:-1:-1;;7602:709:1:o;8524:255::-;8591:6;8644:2;8632:9;8623:7;8619:23;8615:32;8612:52;;;8660:1;8657;8650:12;8612:52;8699:9;8686:23;8718:31;8743:5;8718:31;:::i;:::-;8768:5;8524:255;-1:-1:-1;;;8524:255:1:o;8784:805::-;8897:6;8905;8913;8921;8929;8937;8945;8998:3;8986:9;8977:7;8973:23;8969:33;8966:53;;;9015:1;9012;9005:12;8966:53;9054:9;9041:23;9073:31;9098:5;9073:31;:::i;:::-;9123:5;-1:-1:-1;9180:2:1;9165:18;;9152:32;9193:33;9152:32;9193:33;:::i;:::-;9245:7;-1:-1:-1;9299:2:1;9284:18;;9271:32;;-1:-1:-1;9350:2:1;9335:18;;9322:32;;-1:-1:-1;9401:3:1;9386:19;;9373:33;;-1:-1:-1;9458:3:1;9443:19;;9430:33;9472;9430;9472;:::i;:::-;9524:7;9514:17;;;9578:3;9567:9;9563:19;9550:33;9540:43;;8784:805;;;;;;;;;;:::o;9594:874::-;9716:6;9724;9732;9740;9748;9756;9764;9772;9825:3;9813:9;9804:7;9800:23;9796:33;9793:53;;;9842:1;9839;9832:12;9793:53;9881:9;9868:23;9900:31;9925:5;9900:31;:::i;:::-;9950:5;-1:-1:-1;10007:2:1;9992:18;;9979:32;10020:33;9979:32;10020:33;:::i;:::-;10072:7;-1:-1:-1;10126:2:1;10111:18;;10098:32;;-1:-1:-1;10177:2:1;10162:18;;10149:32;;-1:-1:-1;10228:3:1;10213:19;;10200:33;;-1:-1:-1;10280:3:1;10265:19;;10252:33;;-1:-1:-1;10337:3:1;10322:19;;10309:33;10351;10309;10351;:::i;:::-;10403:7;10393:17;;;10457:3;10446:9;10442:19;10429:33;10419:43;;9594:874;;;;;;;;;;;:::o;11273:340::-;11475:2;11457:21;;;11514:2;11494:18;;;11487:30;-1:-1:-1;;;11548:2:1;11533:18;;11526:46;11604:2;11589:18;;11273:340::o;11618:127::-;11679:10;11674:3;11670:20;11667:1;11660:31;11710:4;11707:1;11700:15;11734:4;11731:1;11724:15;11750:128;11817:9;;;11838:11;;;11835:37;;;11852:18;;:::i;11883:127::-;11944:10;11939:3;11935:20;11932:1;11925:31;11975:4;11972:1;11965:15;11999:4;11996:1;11989:15;12015:345;12217:2;12199:21;;;12256:2;12236:18;;;12229:30;-1:-1:-1;;;12290:2:1;12275:18;;12268:51;12351:2;12336:18;;12015:345::o;12365:399::-;12567:2;12549:21;;;12606:2;12586:18;;;12579:30;12645:34;12640:2;12625:18;;12618:62;-1:-1:-1;;;12711:2:1;12696:18;;12689:33;12754:3;12739:19;;12365:399::o;12769:406::-;12971:2;12953:21;;;13010:2;12990:18;;;12983:30;13049:34;13044:2;13029:18;;13022:62;-1:-1:-1;;;13115:2:1;13100:18;;13093:40;13165:3;13150:19;;12769:406::o;13180:670::-;-1:-1:-1;;;;;13547:15:1;;;13529:34;;13599:15;;;;13594:2;13579:18;;13572:43;13646:2;13631:18;;13624:34;;;;13689:2;13674:18;;13667:34;;;;13750:4;13738:17;13732:3;13717:19;;13710:46;13509:3;13772:19;;13765:35;13831:3;13816:19;;13809:35;;;;13478:3;13463:19;;13180:670::o;13855:355::-;14057:2;14039:21;;;14096:2;14076:18;;;14069:30;14135:33;14130:2;14115:18;;14108:61;14201:2;14186:18;;13855:355::o;14215:184::-;14285:6;14338:2;14326:9;14317:7;14313:23;14309:32;14306:52;;;14354:1;14351;14344:12;14306:52;-1:-1:-1;14377:16:1;;14215:184;-1:-1:-1;14215:184:1:o;15514:245::-;15581:6;15634:2;15622:9;15613:7;15609:23;15605:32;15602:52;;;15650:1;15647;15640:12;15602:52;15682:9;15676:16;15701:28;15723:5;15701:28;:::i;16144:245::-;16223:6;16231;16284:2;16272:9;16263:7;16259:23;16255:32;16252:52;;;16300:1;16297;16290:12;16252:52;-1:-1:-1;;16323:16:1;;16379:2;16364:18;;;16358:25;16323:16;;16358:25;;-1:-1:-1;16144:245:1:o;19193:250::-;19278:1;19288:113;19302:6;19299:1;19296:13;19288:113;;;19378:11;;;19372:18;19359:11;;;19352:39;19324:2;19317:10;19288:113;;;-1:-1:-1;;19435:1:1;19417:16;;19410:27;19193:250::o;19448:287::-;19577:3;19615:6;19609:13;19631:66;19690:6;19685:3;19678:4;19670:6;19666:17;19631:66;:::i;:::-;19713:16;;;;;19448:287;-1:-1:-1;;19448:287:1:o;20985:402::-;21187:2;21169:21;;;21226:2;21206:18;;;21199:30;21265:34;21260:2;21245:18;;21238:62;-1:-1:-1;;;21331:2:1;21316:18;;21309:36;21377:3;21362:19;;20985:402::o;21392:217::-;21432:1;21458;21448:132;;21502:10;21497:3;21493:20;21490:1;21483:31;21537:4;21534:1;21527:15;21565:4;21562:1;21555:15;21448:132;-1:-1:-1;21594:9:1;;21392:217::o;21971:125::-;22036:9;;;22057:10;;;22054:36;;;22070:18;;:::i;23498:637::-;23729:6;23718:9;23711:25;23772:6;23767:2;23756:9;23752:18;23745:34;23844:1;23840;23835:3;23831:11;23827:19;23819:6;23815:32;23810:2;23799:9;23795:18;23788:60;23884:3;23879:2;23868:9;23864:18;23857:31;23692:4;23917:6;23911:13;23961:6;23955:3;23944:9;23940:19;23933:35;23977:80;24050:6;24044:3;24033:9;24029:19;24024:2;24016:6;24012:15;23977:80;:::i;:::-;24118:2;24097:15;-1:-1:-1;;24093:29:1;24078:45;;;;24125:3;24074:55;;23498:637;-1:-1:-1;;;;;23498:637:1:o;24140:136::-;24179:3;24207:5;24197:39;;24216:18;;:::i;:::-;-1:-1:-1;;;24252:18:1;;24140:136::o;24281:188::-;24360:13;;-1:-1:-1;;;;;24402:42:1;;24392:53;;24382:81;;24459:1;24456;24449:12;24474:450;24561:6;24569;24577;24630:2;24618:9;24609:7;24605:23;24601:32;24598:52;;;24646:1;24643;24636:12;24598:52;24669:40;24699:9;24669:40;:::i;:::-;24659:50;;24728:49;24773:2;24762:9;24758:18;24728:49;:::i;:::-;24718:59;;24820:2;24809:9;24805:18;24799:25;24864:10;24857:5;24853:22;24846:5;24843:33;24833:61;;24890:1;24887;24880:12;24833:61;24913:5;24903:15;;;24474:450;;;;;:::o;27525:251::-;27595:6;27648:2;27636:9;27627:7;27623:23;27619:32;27616:52;;;27664:1;27661;27654:12;27616:52;27696:9;27690:16;27715:31;27740:5;27715:31;:::i;27781:168::-;27854:9;;;27885;;27902:15;;;27896:22;;27882:37;27872:71;;27923:18;;:::i
Swarm Source
ipfs://07f0622469e85c245370692c3c86b936d59ce823243ab5e1e528360ab0a5b544
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
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.