Overview
xDAI Balance
xDAI Value
$0.00More Info
Private Name Tags
ContractCreator
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Loading...
Loading
Contract Name:
KingSwapRouter
Compiler Version
v0.7.6+commit.7338295f
Optimization Enabled:
Yes with 200 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity)
/** *Submitted for verification at gnosisscan.io on 2022-08-04 */ // SPDX-License-Identifier: GPL-3.0 pragma solidity >=0.6.0 <0.8.0; // File: packages/kingswapUni-v2-periphery/contracts/interfaces/IKingSwapFactory.sol interface IKingSwapFactory { event PairCreated(address indexed token0, address indexed token1, address pair, uint); function feeTo() external view returns (address); function feeToSetter() external view returns (address); function migrator() external view returns (address); function getPair(address tokenA, address tokenB) external view returns (address pair); function allPairs(uint) external view returns (address pair); function allPairsLength() external view returns (uint); function createPair(address tokenA, address tokenB) external returns (address pair); function setFeeTo(address) external; function setFeeToSetter(address) external; function setMigrator(address) external; } // File: packages/kingswapUni-v2-periphery/contracts/libraries/TransferHelper.sol // 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, uint 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: APPROVE_FAILED'); } function safeTransfer(address token, address to, uint 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: TRANSFER_FAILED'); } function safeTransferFrom(address token, address from, address to, uint 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: TRANSFER_FROM_FAILED'); } function safeTransferETH(address to, uint value) internal { (bool success,) = to.call{value:value}(new bytes(0)); require(success, 'TransferHelper: ETH_TRANSFER_FAILED'); } } // File: packages/kingswapUni-v2-periphery/contracts/interfaces/IKingSwapRouter.sol interface IKingSwapRouter { 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 swapExactTokensForTokens( uint256 amountIn, uint256 amountOutMin, address[] calldata path, address to, uint256 deadline, bool ifmint ) external returns (uint256[] memory amounts); function swapTokensForExactTokens( uint256 amountOut, uint256 amountInMax, address[] calldata path, address to, uint256 deadline, bool ifmint ) external returns (uint256[] memory amounts); function swapExactETHForTokens( uint256 amountOutMin, address[] calldata path, address to, uint256 deadline, bool ifmint ) external payable returns (uint256[] memory amounts); function swapTokensForExactETH( uint256 amountOut, uint256 amountInMax, address[] calldata path, address to, uint256 deadline, bool ifmint ) external returns (uint256[] memory amounts); function swapExactTokensForETH( uint256 amountIn, uint256 amountOutMin, address[] calldata path, address to, uint256 deadline, bool ifmint ) external returns (uint256[] memory amounts); function swapETHForExactTokens( uint256 amountOut, address[] calldata path, address to, uint256 deadline, bool ifmint ) external payable returns (uint256[] memory amounts); function quote( uint256 amountA, uint256 reserveA, uint256 reserveB ) external pure returns (uint256 amountB); function getAmountOut( uint256 amountIn, uint256 reserveIn, uint256 reserveOut ) external pure returns (uint256 amountOut); function getAmountIn( uint256 amountOut, uint256 reserveIn, uint256 reserveOut ) external pure returns (uint256 amountIn); function getAmountsOut(uint256 amountIn, address[] calldata path) external view returns (uint256[] memory amounts); function getAmountsIn(uint256 amountOut, address[] calldata path) external view returns (uint256[] memory amounts); function removeLiquidityETHSupportingFeeOnTransferTokens( address token, uint256 liquidity, uint256 amountTokenMin, uint256 amountETHMin, address to, uint256 deadline ) external returns (uint256 amountETH); function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens( address token, uint256 liquidity, uint256 amountTokenMin, uint256 amountETHMin, address to, uint256 deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external returns (uint256 amountETH); function swapExactTokensForTokensSupportingFeeOnTransferTokens( uint256 amountIn, uint256 amountOutMin, address[] calldata path, address to, uint256 deadline, bool ifmint ) external; function swapExactETHForTokensSupportingFeeOnTransferTokens( uint256 amountOutMin, address[] calldata path, address to, uint256 deadline, bool ifmint ) external payable; function swapExactTokensForETHSupportingFeeOnTransferTokens( uint256 amountIn, uint256 amountOutMin, address[] calldata path, address to, uint256 deadline, bool ifmint ) external; } // File: packages/kingswapUni-v2-periphery/contracts/interfaces/IKingSwapPair.sol interface IKingSwapPair { event Approval(address indexed owner, address indexed spender, uint value); event Transfer(address indexed from, address indexed to, uint value); function name() external pure returns (string memory); function symbol() external pure returns (string memory); function decimals() external pure returns (uint8); function totalSupply() external view returns (uint); function balanceOf(address owner) external view returns (uint); function allowance(address owner, address spender) external view returns (uint); function approve(address spender, uint value) external returns (bool); function transfer(address to, uint value) external returns (bool); function transferFrom(address from, address to, uint value) external returns (bool); function DOMAIN_SEPARATOR() external view returns (bytes32); function PERMIT_TYPEHASH() external pure returns (bytes32); function nonces(address owner) external view returns (uint); function permit(address owner, address spender, uint value, uint deadline, uint8 v, bytes32 r, bytes32 s) external; event Mint(address indexed sender, uint amount0, uint amount1); event Burn(address indexed sender, uint amount0, uint amount1, address indexed to); event Swap( address indexed sender, uint amount0In, uint amount1In, uint amount0Out, uint amount1Out, address indexed to ); event Sync(uint112 reserve0, uint112 reserve1); function MINIMUM_LIQUIDITY() external pure returns (uint); function factory() external view returns (address); function token0() external view returns (address); function token1() external view returns (address); function stoken() external view returns (address); function getReserves() external view returns (uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast); function price0CumulativeLast() external view returns (uint); function price1CumulativeLast() external view returns (uint); function kLast() external view returns (uint); function mint(address to) external returns (uint liquidity); function burn(address to) external returns (uint amount0, uint amount1); function swap(uint amount0Out, uint amount1Out, address to, bytes calldata data) external; function skim(address to) external; function sync() external; function initialize(address, address) external; function dealSlippageWithIn(address[] calldata path, uint amountIn, address to, bool ifmint) external returns (uint amountOut); function dealSlippageWithOut(address[] calldata path, uint amountOut, address to, bool ifmint) external returns (uint extra); function getAmountOutMarket(address token, uint amountIn) external view returns (uint _out, uint t0Price); function getAmountInMarket(address token, uint amountOut) external view returns (uint _in, uint t0Price); function getAmountOutFinal(address token, uint256 amountIn) external view returns (uint256 amountOut, uint256 stokenAmount); function getAmountInFinal(address token, uint256 amountOut) external view returns (uint256 amountIn, uint256 stokenAmount); function getTokenMarketPrice(address token) external view returns (uint price); } // File: packages/kingswapUni-v2-periphery/contracts/libraries/SafeMath.sol // a library for performing overflow-safe math, courtesy of DappHub (https://github.com/dapphub/ds-math) library SafeMath { function add(uint x, uint y) internal pure returns (uint z) { require((z = x + y) >= x, 'ds-math-add-overflow'); } function sub(uint x, uint y) internal pure returns (uint z) { require((z = x - y) <= x, 'ds-math-sub-underflow'); } function mul(uint x, uint y) internal pure returns (uint z) { require(y == 0 || (z = x * y) / y == x, 'ds-math-mul-overflow'); } } // File: packages/kingswapUni-v2-periphery/contracts/libraries/KingSwapLibrary.sol library KingSwapLibrary { 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, 'KingSwapLibrary: IDENTICAL_ADDRESSES'); (token0, token1) = tokenA < tokenB ? (tokenA, tokenB) : (tokenB, tokenA); require(token0 != address(0), 'KingSwapLibrary: 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( uint256( keccak256( abi.encodePacked( hex'ff', factory, keccak256(abi.encodePacked(token0, token1)), // JS: web3.utils.sha3('0x' + KingSwapPair.bytecode.replace('0x','')) hex'486345174f0c880a75d64ac5bb327f91ab509c8f197c4f570b73c1b89f15f85b' // 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, ) = IKingSwapPair(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, 'KingSwapLibrary: INSUFFICIENT_AMOUNT'); require(reserveA > 0 && reserveB > 0, 'KingSwapLibrary: 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, 'KingSwapLibrary: INSUFFICIENT_INPUT_AMOUNT'); require(reserveIn > 0 && reserveOut > 0, 'KingSwapLibrary: INSUFFICIENT_LIQUIDITY'); uint256 amountInWithFee = amountIn.mul(9975); uint256 numerator = amountInWithFee.mul(reserveOut); uint256 denominator = reserveIn.mul(10000).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, 'KingSwapLibrary: INSUFFICIENT_OUTPUT_AMOUNT'); require(reserveIn > 0 && reserveOut > 0, 'KingSwapLibrary: INSUFFICIENT_LIQUIDITY'); uint256 numerator = reserveIn.mul(amountOut).mul(10000); uint256 denominator = reserveOut.sub(amountOut).mul(9975); 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, 'KingSwapLibrary: 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, 'KingSwapLibrary: 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: packages/kingswapUni-v2-periphery/contracts/interfaces/IERC20.sol interface IERC20 { event Approval(address indexed owner, address indexed spender, uint value); event Transfer(address indexed from, address indexed to, uint 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 (uint); function balanceOf(address owner) external view returns (uint); function allowance(address owner, address spender) external view returns (uint); function approve(address spender, uint value) external returns (bool); function transfer(address to, uint value) external returns (bool); function transferFrom(address from, address to, uint value) external returns (bool); function mint(address to, uint value) external returns (bool); function burn(address from, uint value) external returns (bool); } // File: packages/kingswapUni-v2-periphery/contracts/interfaces/IWETH.sol interface IWETH { function deposit() external payable; function transfer(address to, uint value) external returns (bool); function withdraw(uint) external; } // File: packages/kingswapUni-v2-periphery/contracts/KingSwapRouter.sol contract KingSwapRouter is IKingSwapRouter { using SafeMath for uint256; address public immutable override factory; address public immutable override WETH; modifier ensure(uint256 deadline) { require(deadline >= block.timestamp, "KingSwapRouter: EXPIRED"); _; } constructor(address _factory, address _WETH) { factory = _factory; WETH = _WETH; } 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 (IKingSwapFactory(factory).getPair(tokenA, tokenB) == address(0)) { IKingSwapFactory(factory).createPair(tokenA, tokenB); } (uint256 reserveA, uint256 reserveB) = KingSwapLibrary.getReserves(factory, tokenA, tokenB); if (reserveA == 0 && reserveB == 0) { (amountA, amountB) = (amountADesired, amountBDesired); } else { uint256 amountBOptimal = KingSwapLibrary.quote(amountADesired, reserveA, reserveB); if (amountBOptimal <= amountBDesired) { require(amountBOptimal >= amountBMin, "KingSwapRouter: INSUFFICIENT_B_AMOUNT"); (amountA, amountB) = (amountADesired, amountBOptimal); } else { uint256 amountAOptimal = KingSwapLibrary.quote(amountBDesired, reserveB, reserveA); assert(amountAOptimal <= amountADesired); require(amountAOptimal >= amountAMin, "KingSwapRouter: 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 = KingSwapLibrary.pairFor(factory, tokenA, tokenB); TransferHelper.safeTransferFrom(tokenA, msg.sender, pair, amountA); TransferHelper.safeTransferFrom(tokenB, msg.sender, pair, amountB); liquidity = IKingSwapPair(pair).mint(to); } function addLiquidityETH( address token, uint256 amountTokenDesired, uint256 amountTokenMin, uint256 amountETHMin, address to, uint256 deadline ) external virtual override payable ensure(deadline) returns ( uint256 amountToken, uint256 amountETH, uint256 liquidity ) { (amountToken, amountETH) = _addLiquidity( token, WETH, amountTokenDesired, msg.value, amountTokenMin, amountETHMin ); address pair = KingSwapLibrary.pairFor(factory, token, WETH); TransferHelper.safeTransferFrom(token, msg.sender, pair, amountToken); IWETH(WETH).deposit{value: amountETH}(); assert(IWETH(WETH).transfer(pair, amountETH)); liquidity = IKingSwapPair(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 = KingSwapLibrary.pairFor(factory, tokenA, tokenB); IKingSwapPair(pair).transferFrom(msg.sender, pair, liquidity); // send liquidity to pair (address token0, ) = KingSwapLibrary.sortTokens(tokenA, tokenB); if (tokenA == token0) { (amountA, amountB) = IKingSwapPair(pair).burn(to); } else { (amountB, amountA) = IKingSwapPair(pair).burn(to); } require(amountA >= amountAMin, "KingSwappRouter: INSUFFICIENT_A_AMOUNT"); require(amountB >= amountBMin, "KingSwapRouter: 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 ) { IKingSwapPair(KingSwapLibrary.pairFor(factory, tokenA, tokenB)).permit( msg.sender, address(this), approveMax ? uint256(-1) : liquidity, 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 = KingSwapLibrary.pairFor(factory, token, WETH); uint256 value = approveMax ? uint256(-1) : liquidity; IKingSwapPair(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 = KingSwapLibrary.pairFor(factory, token, WETH); uint256 value = approveMax ? uint256(-1) : liquidity; IKingSwapPair(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, ) = KingSwapLibrary.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 ? KingSwapLibrary.pairFor(factory, output, path[i + 2]) : _to; IKingSwapPair(KingSwapLibrary.pairFor(factory, input, output)).swap( amount0Out, amount1Out, to, new bytes(0) ); } } function swapExactTokensForTokens( uint256 amountIn, uint256 amountOutMin, address[] calldata path, address to, uint256 deadline, bool ifmint ) external virtual override ensure(deadline) returns (uint256[] memory amounts) { amounts = KingSwapLibrary.getAmountsOut(factory, amountIn, path); address pair = KingSwapLibrary.pairFor(factory, path[0], path[1]); TransferHelper.safeTransferFrom(path[0], msg.sender, pair, amounts[0]); if (path.length == 2) { amounts[1] = IKingSwapPair(pair).dealSlippageWithIn(path, amounts[0], to, ifmint); } require(amounts[amounts.length - 1] >= amountOutMin, "KingSwapRouter: INSUFFICIENT_OUTPUT_AMOUNT"); _swap(amounts, path, to); } function swapTokensForExactTokens( uint256 amountOut, uint256 amountInMax, address[] calldata path, address to, uint256 deadline, bool ifmint ) external virtual override ensure(deadline) returns (uint256[] memory amounts) { amounts = KingSwapLibrary.getAmountsIn(factory, amountOut, path); address pair = KingSwapLibrary.pairFor(factory, path[0], path[1]); if (path.length == 2) { uint256 extra = IKingSwapPair(pair).dealSlippageWithOut(path, amountOut, to, ifmint); amounts[0] = amounts[0].add(extra); } require(amounts[0] <= amountInMax, "KingSwapRouter: EXCESSIVE_INPUT_AMOUNT"); TransferHelper.safeTransferFrom(path[0], msg.sender, pair, amounts[0]); _swap(amounts, path, to); } function swapExactETHForTokens( uint256 amountOutMin, address[] calldata path, address to, uint256 deadline, bool ifmint ) external virtual override payable ensure(deadline) returns (uint256[] memory amounts) { require(path[0] == WETH, "KingSwapRouter: INVALID_PATH"); amounts = KingSwapLibrary.getAmountsOut(factory, msg.value, path); address pair = KingSwapLibrary.pairFor(factory, path[0], path[1]); IWETH(WETH).deposit{value: amounts[0]}(); assert(IWETH(WETH).transfer(pair, amounts[0])); if (path.length == 2) { amounts[1] = IKingSwapPair(pair).dealSlippageWithIn(path, amounts[0], to, ifmint); } require(amounts[amounts.length - 1] >= amountOutMin, "KingSwapRouter: INSUFFICIENT_OUTPUT_AMOUNT"); _swap(amounts, path, to); } function swapTokensForExactETH( uint256 amountOut, uint256 amountInMax, address[] calldata path, address to, uint256 deadline, bool ifmint ) external virtual override ensure(deadline) returns (uint256[] memory amounts) { require(path[path.length - 1] == WETH, "KingSwapRouter: INVALID_PATH"); amounts = KingSwapLibrary.getAmountsIn(factory, amountOut, path); address pair = KingSwapLibrary.pairFor(factory, path[0], path[1]); if (path.length == 2) { uint256 extra = IKingSwapPair(pair).dealSlippageWithOut(path, amountOut, to, ifmint); amounts[0] = amounts[0].add(extra); } require(amounts[0] <= amountInMax, "KingSwapRouter: EXCESSIVE_INPUT_AMOUNT"); TransferHelper.safeTransferFrom(path[0], msg.sender, pair, 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, bool ifmint ) external virtual override ensure(deadline) returns (uint256[] memory amounts) { require(path[path.length - 1] == WETH, "KingSwapRouter: INVALID_PATH"); amounts = KingSwapLibrary.getAmountsOut(factory, amountIn, path); address pair = KingSwapLibrary.pairFor(factory, path[0], path[1]); TransferHelper.safeTransferFrom(path[0], msg.sender, pair, amounts[0]); if (path.length == 2) { amounts[1] = IKingSwapPair(pair).dealSlippageWithIn(path, amounts[0], to, ifmint); } require(amounts[amounts.length - 1] >= amountOutMin, "KingSwapRouter: INSUFFICIENT_OUTPUT_AMOUNT"); _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, bool ifmint ) external virtual override payable ensure(deadline) returns (uint256[] memory amounts) { require(path[0] == WETH, "KingSwapRouter: INVALID_PATH"); amounts = KingSwapLibrary.getAmountsIn(factory, amountOut, path); address pair = KingSwapLibrary.pairFor(factory, path[0], path[1]); if (path.length == 2) { uint256 extra = IKingSwapPair(pair).dealSlippageWithOut(path, amountOut, to, ifmint); amounts[0] = amounts[0].add(extra); } IWETH(WETH).deposit{value: amounts[0]}(); assert(IWETH(WETH).transfer(pair, amounts[0])); _swap(amounts, path, to); // refund dust eth, if any if (msg.value > amounts[0]) TransferHelper.safeTransferETH(msg.sender, msg.value - 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, bool ifmint ) internal virtual { for (uint256 i; i < path.length - 1; i++) { (address token0, ) = KingSwapLibrary.sortTokens(path[i], path[i + 1]); IKingSwapPair pair = IKingSwapPair(KingSwapLibrary.pairFor(factory, path[i], path[i + 1])); uint256 amountOutput; { // scope to avoid stack too deep errors (uint256 reserve0, uint256 reserve1, ) = pair.getReserves(); (uint256 reserveInput, uint256 reserveOutput) = path[i] == token0 ? (reserve0, reserve1) : (reserve1, reserve0); uint256 amountInput = IERC20(path[i]).balanceOf(address(pair)).sub(reserveInput); if (path.length == 2) { amountOutput = pair.dealSlippageWithIn(path, amountInput, _to, ifmint); } else { amountOutput = KingSwapLibrary.getAmountOut(amountInput, reserveInput, reserveOutput); } } (uint256 amount0Out, uint256 amount1Out) = path[i] == token0 ? (uint256(0), amountOutput) : (amountOutput, uint256(0)); address to = i < path.length - 2 ? KingSwapLibrary.pairFor(factory, path[i + 1], 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, bool ifmint ) external virtual override ensure(deadline) { TransferHelper.safeTransferFrom( path[0], msg.sender, KingSwapLibrary.pairFor(factory, path[0], path[1]), amountIn ); uint256 balanceBefore = IERC20(path[path.length - 1]).balanceOf(to); _swapSupportingFeeOnTransferTokens(path, to, ifmint); require( IERC20(path[path.length - 1]).balanceOf(to).sub(balanceBefore) >= amountOutMin, "KingSwapRouter: INSUFFICIENT_OUTPUT_AMOUNT" ); } function swapExactETHForTokensSupportingFeeOnTransferTokens( uint256 amountOutMin, address[] calldata path, address to, uint256 deadline, bool ifmint ) external virtual override payable ensure(deadline) { require(path[0] == WETH, "KingSwapRouter: INVALID_PATH"); uint256 amountIn = msg.value; IWETH(WETH).deposit{value: amountIn}(); assert(IWETH(WETH).transfer(KingSwapLibrary.pairFor(factory, path[0], path[1]), amountIn)); uint256 balanceBefore = IERC20(path[path.length - 1]).balanceOf(to); _swapSupportingFeeOnTransferTokens(path, to, ifmint); require( IERC20(path[path.length - 1]).balanceOf(to).sub(balanceBefore) >= amountOutMin, "KingSwapRouter: INSUFFICIENT_OUTPUT_AMOUNT" ); } function swapExactTokensForETHSupportingFeeOnTransferTokens( uint256 amountIn, uint256 amountOutMin, address[] calldata path, address to, uint256 deadline, bool ifmint ) external virtual override ensure(deadline) { require(path[path.length - 1] == WETH, "KingSwapRouter: INVALID_PATH"); TransferHelper.safeTransferFrom( path[0], msg.sender, KingSwapLibrary.pairFor(factory, path[0], path[1]), amountIn ); _swapSupportingFeeOnTransferTokens(path, address(this), ifmint); uint256 amountOut = IERC20(WETH).balanceOf(address(this)); require(amountOut >= amountOutMin, "KingSwapRouter: INSUFFICIENT_OUTPUT_AMOUNT"); IWETH(WETH).withdraw(amountOut); TransferHelper.safeTransferETH(to, amountOut); } // **** LIBRARY FUNCTIONS **** function quote( uint256 amountA, uint256 reserveA, uint256 reserveB ) public virtual override pure returns (uint256 amountB) { return KingSwapLibrary.quote(amountA, reserveA, reserveB); } function getAmountOut( uint256 amountIn, uint256 reserveIn, uint256 reserveOut ) public virtual override pure returns (uint256 amountOut) { return KingSwapLibrary.getAmountOut(amountIn, reserveIn, reserveOut); } function getAmountIn( uint256 amountOut, uint256 reserveIn, uint256 reserveOut ) public virtual override pure returns (uint256 amountIn) { return KingSwapLibrary.getAmountIn(amountOut, reserveIn, reserveOut); } function getAmountsOut(uint256 amountIn, address[] memory path) public virtual override view returns (uint256[] memory amounts) { return KingSwapLibrary.getAmountsOut(factory, amountIn, path); } function getAmountsIn(uint256 amountOut, address[] memory path) public virtual override view returns (uint256[] memory amounts) { return KingSwapLibrary.getAmountsIn(factory, amountOut, path); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"address","name":"_factory","type":"address"},{"internalType":"address","name":"_WETH","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"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":[{"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":[{"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":[{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"bool","name":"ifmint","type":"bool"}],"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"},{"internalType":"bool","name":"ifmint","type":"bool"}],"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"},{"internalType":"bool","name":"ifmint","type":"bool"}],"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"},{"internalType":"bool","name":"ifmint","type":"bool"}],"name":"swapExactTokensForETH","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"nonpayable","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"},{"internalType":"bool","name":"ifmint","type":"bool"}],"name":"swapExactTokensForETHSupportingFeeOnTransferTokens","outputs":[],"stateMutability":"nonpayable","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"},{"internalType":"bool","name":"ifmint","type":"bool"}],"name":"swapExactTokensForTokens","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"nonpayable","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"},{"internalType":"bool","name":"ifmint","type":"bool"}],"name":"swapExactTokensForTokensSupportingFeeOnTransferTokens","outputs":[],"stateMutability":"nonpayable","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"},{"internalType":"bool","name":"ifmint","type":"bool"}],"name":"swapTokensForExactETH","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"nonpayable","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"},{"internalType":"bool","name":"ifmint","type":"bool"}],"name":"swapTokensForExactTokens","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
60c060405234801561001057600080fd5b5060405162004fbb38038062004fbb8339818101604052604081101561003557600080fd5b5080516020909101516001600160601b0319606092831b8116608052911b1660a05260805160601c60a05160601c614e27620001946000398061015f5280610d2c5280610d67528061121c528061147452806114fc5280611668528061179a528061187752806119515280611cea5280611fac52806120a6528061213b52806121af52806123d552806124505280612504528061289252806129b75280612a3f5280612d095280612e415280613244528061329a52806132ce5280613342525080610e7852806110aa52806110e152806112af528061131152806116465280611a225280611a845280611d785280611dda52806121e152806125e3528061292552806129875280612c8e5280612cb75280612ce75280612ecf5280612f315280613125528061327852806134d352806135355280613c695280613f34528061431d5280614353528061483b52806148f452806149a75250614e276000f3fe60806040526004361061014f5760003560e01c8063ad5c4648116100b6578063d06ca61f1161006f578063d06ca61f146109b5578063ded9382a14610a6a578063e7bb988d14610add578063e8e3370014610b7b578063f305d71914610bfb578063fa775c0f14610c4157610188565b8063ad5c4648146107fd578063ad615dec1461082e578063af2979eb14610864578063baa2abde146108b7578063c27e85ca14610914578063c45a0155146109a057610188565b80635b0d5984116101085780635b0d5984146104ee57806361be71b2146105615780636e03efb5146105ff57806385f8c2591461069d5780639be677c1146106d3578063a2e250b31461077157610188565b806302751cec1461018d578063054d50d4146101f9578063099963f4146102415780631f00ca74146102df5780632195995c146103e45780632533ef941461046257610188565b3661018857336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461018657fe5b005b600080fd5b34801561019957600080fd5b506101e0600480360360c08110156101b057600080fd5b506001600160a01b0381358116916020810135916040820135916060810135916080820135169060a00135610cdf565b6040805192835260208301919091528051918290030190f35b34801561020557600080fd5b5061022f6004803603606081101561021c57600080fd5b5080359060208101359060400135610df9565b60408051918252519081900360200190f35b34801561024d57600080fd5b50610186600480360360c081101561026457600080fd5b813591602081013591810190606081016040820135600160201b81111561028a57600080fd5b82018360208201111561029c57600080fd5b803590602001918460208302840111600160201b831117156102bd57600080fd5b91935091506001600160a01b0381351690602081013590604001351515610e0e565b3480156102eb57600080fd5b506103946004803603604081101561030257600080fd5b81359190810190604081016020820135600160201b81111561032357600080fd5b82018360208201111561033557600080fd5b803590602001918460208302840111600160201b8311171561035657600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295506110a3945050505050565b60408051602080825283518183015283519192839290830191858101910280838360005b838110156103d05781810151838201526020016103b8565b505050509050019250505060405180910390f35b3480156103f057600080fd5b506101e0600480360361016081101561040857600080fd5b506001600160a01b038135811691602081013582169160408201359160608101359160808201359160a08101359091169060c08101359060e081013515159060ff61010082013516906101208101359061014001356110d9565b610394600480360360a081101561047857600080fd5b81359190810190604081016020820135600160201b81111561049957600080fd5b8201836020820111156104ab57600080fd5b803590602001918460208302840111600160201b831117156104cc57600080fd5b91935091506001600160a01b03813516906020810135906040013515156111d4565b3480156104fa57600080fd5b5061022f600480360361014081101561051257600080fd5b506001600160a01b0381358116916020810135916040820135916060810135916080820135169060a08101359060c081013515159060ff60e0820135169061010081013590610120013561163e565b34801561056d57600080fd5b50610186600480360360c081101561058457600080fd5b813591602081013591810190606081016040820135600160201b8111156105aa57600080fd5b8201836020820111156105bc57600080fd5b803590602001918460208302840111600160201b831117156105dd57600080fd5b91935091506001600160a01b038135169060208101359060400135151561174c565b34801561060b57600080fd5b50610394600480360360c081101561062257600080fd5b813591602081013591810190606081016040820135600160201b81111561064857600080fd5b82018360208201111561065a57600080fd5b803590602001918460208302840111600160201b8311171561067b57600080fd5b91935091506001600160a01b03813516906020810135906040013515156119d7565b3480156106a957600080fd5b5061022f600480360360608110156106c057600080fd5b5080359060208101359060400135611c8d565b3480156106df57600080fd5b50610394600480360360c08110156106f657600080fd5b813591602081013591810190606081016040820135600160201b81111561071c57600080fd5b82018360208201111561072e57600080fd5b803590602001918460208302840111600160201b8311171561074f57600080fd5b91935091506001600160a01b0381351690602081013590604001351515611c9a565b610186600480360360a081101561078757600080fd5b81359190810190604081016020820135600160201b8111156107a857600080fd5b8201836020820111156107ba57600080fd5b803590602001918460208302840111600160201b831117156107db57600080fd5b91935091506001600160a01b0381351690602081013590604001351515612060565b34801561080957600080fd5b506108126123d3565b604080516001600160a01b039092168252519081900360200190f35b34801561083a57600080fd5b5061022f6004803603606081101561085157600080fd5b50803590602081013590604001356123f7565b34801561087057600080fd5b5061022f600480360360c081101561088757600080fd5b506001600160a01b0381358116916020810135916040820135916060810135916080820135169060a00135612404565b3480156108c357600080fd5b506101e0600480360360e08110156108da57600080fd5b506001600160a01b038135811691602081013582169160408201359160608101359160808201359160a08101359091169060c00135612595565b610394600480360360a081101561092a57600080fd5b81359190810190604081016020820135600160201b81111561094b57600080fd5b82018360208201111561095d57600080fd5b803590602001918460208302840111600160201b8311171561097e57600080fd5b91935091506001600160a01b038135169060208101359060400135151561284a565b3480156109ac57600080fd5b50610812612c8c565b3480156109c157600080fd5b50610394600480360360408110156109d857600080fd5b81359190810190604081016020820135600160201b8111156109f957600080fd5b820183602082011115610a0b57600080fd5b803590602001918460208302840111600160201b83111715610a2c57600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550612cb0945050505050565b348015610a7657600080fd5b506101e06004803603610140811015610a8e57600080fd5b506001600160a01b0381358116916020810135916040820135916060810135916080820135169060a08101359060c081013515159060ff60e08201351690610100810135906101200135612cdd565b348015610ae957600080fd5b50610394600480360360c0811015610b0057600080fd5b813591602081013591810190606081016040820135600160201b811115610b2657600080fd5b820183602082011115610b3857600080fd5b803590602001918460208302840111600160201b83111715610b5957600080fd5b91935091506001600160a01b0381351690602081013590604001351515612df1565b348015610b8757600080fd5b50610bdd6004803603610100811015610b9f57600080fd5b506001600160a01b038135811691602081013582169160408201359160608101359160808201359160a08101359160c0820135169060e001356130c2565b60408051938452602084019290925282820152519081900360600190f35b610bdd600480360360c0811015610c1157600080fd5b506001600160a01b0381358116916020810135916040820135916060810135916080820135169060a001356131f5565b348015610c4d57600080fd5b50610394600480360360c0811015610c6457600080fd5b813591602081013591810190606081016040820135600160201b811115610c8a57600080fd5b820183602082011115610c9c57600080fd5b803590602001918460208302840111600160201b83111715610cbd57600080fd5b91935091506001600160a01b0381351690602081013590604001351515613488565b6000808242811015610d26576040805162461bcd60e51b81526020600482015260176024820152600080516020614d6a833981519152604482015290519081900360640190fd5b610d55897f00000000000000000000000000000000000000000000000000000000000000008a8a8a308a612595565b9093509150610d658986856136c6565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632e1a7d4d836040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b158015610dcb57600080fd5b505af1158015610ddf573d6000803e3d6000fd5b50505050610ded858361382f565b50965096945050505050565b6000610e06848484613927565b949350505050565b8142811015610e52576040805162461bcd60e51b81526020600482015260176024820152600080516020614d6a833981519152604482015290519081900360640190fd5b610edc86866000818110610e6257fe5b905060200201356001600160a01b031633610ed67f00000000000000000000000000000000000000000000000000000000000000008a8a6000818110610ea457fe5b905060200201356001600160a01b03168b8b6001818110610ec157fe5b905060200201356001600160a01b03166139ff565b8b613abf565b600086866000198101818110610eee57fe5b905060200201356001600160a01b03166001600160a01b03166370a08231866040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015610f4a57600080fd5b505afa158015610f5e573d6000803e3d6000fd5b505050506040513d6020811015610f7457600080fd5b50516040805160208981028281018201909352898252929350610fb89290918a918a918291850190849080828437600092019190915250899250879150613c1b9050565b8761105b8289896000198101818110610fcd57fe5b905060200201356001600160a01b03166001600160a01b03166370a08231896040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561102957600080fd5b505afa15801561103d573d6000803e3d6000fd5b505050506040513d602081101561105357600080fd5b505190614082565b10156110985760405162461bcd60e51b815260040180806020018281038252602a815260200180614c11602a913960400191505060405180910390fd5b505050505050505050565b60606110d07f000000000000000000000000000000000000000000000000000000000000000084846140d2565b90505b92915050565b6000806111077f00000000000000000000000000000000000000000000000000000000000000008e8e6139ff565b6001600160a01b031663d505accf333089611122578e611126565b6000195b604080516001600160e01b031960e087901b1681526001600160a01b0394851660048201529290931660248301526044820152606481018b905260ff8916608482015260a4810188905260c48101879052905160e480830192600092919082900301818387803b15801561119957600080fd5b505af11580156111ad573d6000803e3d6000fd5b505050506111c08d8d8d8d8d8d8d612595565b909e909d509b505050505050505050505050565b6060824281101561121a576040805162461bcd60e51b81526020600482015260176024820152600080516020614d6a833981519152604482015290519081900360640190fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168787600081811061125157fe5b905060200201356001600160a01b03166001600160a01b0316146112aa576040805162461bcd60e51b815260206004820152601c6024820152600080516020614d8a833981519152604482015290519081900360640190fd5b6113087f0000000000000000000000000000000000000000000000000000000000000000898989808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152506140d292505050565b9150600061135a7f00000000000000000000000000000000000000000000000000000000000000008989600081811061133d57fe5b905060200201356001600160a01b03168a8a6001818110610ec157fe5b90506002871415611472576000816001600160a01b0316632fb62a478a8a8d8b8a6040518663ffffffff1660e01b81526004018080602001858152602001846001600160a01b0316815260200183151581526020018281038252878782818152602001925060200280828437600081840152601f19601f8201169050808301925050509650505050505050602060405180830381600087803b1580156113ff57600080fd5b505af1158015611413573d6000803e3d6000fd5b505050506040513d602081101561142957600080fd5b50518451909150611457908290869060009061144157fe5b602002602001015161421f90919063ffffffff16565b8460008151811061146457fe5b602002602001018181525050505b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db0846000815181106114ae57fe5b60200260200101516040518263ffffffff1660e01b81526004016000604051808303818588803b1580156114e157600080fd5b505af11580156114f5573d6000803e3d6000fd5b50505050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a9059cbb828560008151811061153757fe5b60200260200101516040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050602060405180830381600087803b15801561158557600080fd5b505af1158015611599573d6000803e3d6000fd5b505050506040513d60208110156115af57600080fd5b50516115b757fe5b6115f6838989808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152508b925061426e915050565b8260008151811061160357fe5b602002602001015134111561163257611632338460008151811061162357fe5b6020026020010151340361382f565b50509695505050505050565b60008061168c7f00000000000000000000000000000000000000000000000000000000000000008d7f00000000000000000000000000000000000000000000000000000000000000006139ff565b905060008661169b578b61169f565b6000195b6040805163d505accf60e01b815233600482015230602482015260448101839052606481018b905260ff8916608482015260a4810188905260c4810187905290519192506001600160a01b0384169163d505accf9160e48082019260009290919082900301818387803b15801561171557600080fd5b505af1158015611729573d6000803e3d6000fd5b5050505061173b8d8d8d8d8d8d612404565b9d9c50505050505050505050505050565b8142811015611790576040805162461bcd60e51b81526020600482015260176024820152600080516020614d6a833981519152604482015290519081900360640190fd5b6001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016868660001981018181106117ca57fe5b905060200201356001600160a01b03166001600160a01b031614611823576040805162461bcd60e51b815260206004820152601c6024820152600080516020614d8a833981519152604482015290519081900360640190fd5b61183386866000818110610e6257fe5b611873868680806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250309250869150613c1b9050565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b1580156118e257600080fd5b505afa1580156118f6573d6000803e3d6000fd5b505050506040513d602081101561190c57600080fd5b505190508781101561194f5760405162461bcd60e51b815260040180806020018281038252602a815260200180614c11602a913960400191505060405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632e1a7d4d826040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b1580156119b557600080fd5b505af11580156119c9573d6000803e3d6000fd5b50505050611098858261382f565b60608242811015611a1d576040805162461bcd60e51b81526020600482015260176024820152600080516020614d6a833981519152604482015290519081900360640190fd5b611a7b7f00000000000000000000000000000000000000000000000000000000000000008a8989808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152506140d292505050565b91506000611ab07f00000000000000000000000000000000000000000000000000000000000000008989600081811061133d57fe5b90506002871415611bb2576000816001600160a01b0316632fb62a478a8a8e8b8a6040518663ffffffff1660e01b81526004018080602001858152602001846001600160a01b0316815260200183151581526020018281038252878782818152602001925060200280828437600081840152601f19601f8201169050808301925050509650505050505050602060405180830381600087803b158015611b5557600080fd5b505af1158015611b69573d6000803e3d6000fd5b505050506040513d6020811015611b7f57600080fd5b50518451909150611b97908290869060009061144157fe5b84600081518110611ba457fe5b602002602001018181525050505b8883600081518110611bc057fe5b60200260200101511115611c055760405162461bcd60e51b8152600401808060200182810382526026815260200180614cd26026913960400191505060405180910390fd5b611c4188886000818110611c1557fe5b905060200201356001600160a01b0316338386600081518110611c3457fe5b6020026020010151613abf565b611c80838989808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152508b925061426e915050565b5050979650505050505050565b6000610e06848484614498565b60608242811015611ce0576040805162461bcd60e51b81526020600482015260176024820152600080516020614d6a833981519152604482015290519081900360640190fd5b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001687876000198101818110611d1a57fe5b905060200201356001600160a01b03166001600160a01b031614611d73576040805162461bcd60e51b815260206004820152601c6024820152600080516020614d8a833981519152604482015290519081900360640190fd5b611dd17f00000000000000000000000000000000000000000000000000000000000000008a89898080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061457092505050565b91506000611e067f00000000000000000000000000000000000000000000000000000000000000008989600081811061133d57fe5b9050611e1888886000818110611c1557fe5b6002871415611f1557806001600160a01b031663d4b32b50898986600081518110611e3f57fe5b60200260200101518a896040518663ffffffff1660e01b81526004018080602001858152602001846001600160a01b0316815260200183151581526020018281038252878782818152602001925060200280828437600081840152601f19601f8201169050808301925050509650505050505050602060405180830381600087803b158015611ecd57600080fd5b505af1158015611ee1573d6000803e3d6000fd5b505050506040513d6020811015611ef757600080fd5b5051835184906001908110611f0857fe5b6020026020010181815250505b8883600185510381518110611f2657fe5b60200260200101511015611f6b5760405162461bcd60e51b815260040180806020018281038252602a815260200180614c11602a913960400191505060405180910390fd5b611faa8389898080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525030925061426e915050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632e1a7d4d84600186510381518110611fe957fe5b60200260200101516040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b15801561202757600080fd5b505af115801561203b573d6000803e3d6000fd5b50505050611c80868460018651038151811061205357fe5b602002602001015161382f565b81428110156120a4576040805162461bcd60e51b81526020600482015260176024820152600080516020614d6a833981519152604482015290519081900360640190fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316868660008181106120db57fe5b905060200201356001600160a01b03166001600160a01b031614612134576040805162461bcd60e51b815260206004820152601c6024820152600080516020614d8a833981519152604482015290519081900360640190fd5b60003490507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db0826040518263ffffffff1660e01b81526004016000604051808303818588803b15801561219457600080fd5b505af11580156121a8573d6000803e3d6000fd5b50505050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a9059cbb61220d7f00000000000000000000000000000000000000000000000000000000000000008a8a6000818110610ea457fe5b836040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050602060405180830381600087803b15801561225457600080fd5b505af1158015612268573d6000803e3d6000fd5b505050506040513d602081101561227e57600080fd5b505161228657fe5b60008787600019810181811061229857fe5b905060200201356001600160a01b03166001600160a01b03166370a08231876040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b1580156122f457600080fd5b505afa158015612308573d6000803e3d6000fd5b505050506040513d602081101561231e57600080fd5b50516040805160208a810282810182019093528a82529293506123629290918b918b9182918501908490808284376000920191909152508a9250889150613c1b9050565b8861105b828a8a600019810181811061237757fe5b905060200201356001600160a01b03166001600160a01b03166370a082318a6040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561102957600080fd5b7f000000000000000000000000000000000000000000000000000000000000000081565b6000610e068484846146a7565b6000814281101561244a576040805162461bcd60e51b81526020600482015260176024820152600080516020614d6a833981519152604482015290519081900360640190fd5b612479887f00000000000000000000000000000000000000000000000000000000000000008989893089612595565b90508092505061250288858a6001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b1580156124d157600080fd5b505afa1580156124e5573d6000803e3d6000fd5b505050506040513d60208110156124fb57600080fd5b50516136c6565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632e1a7d4d836040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b15801561256857600080fd5b505af115801561257c573d6000803e3d6000fd5b5050505061258a848361382f565b509695505050505050565b60008082428110156125dc576040805162461bcd60e51b81526020600482015260176024820152600080516020614d6a833981519152604482015290519081900360640190fd5b60006126097f00000000000000000000000000000000000000000000000000000000000000008c8c6139ff565b604080516323b872dd60e01b81523360048201526001600160a01b03831660248201819052604482018d9052915192935090916323b872dd916064808201926020929091908290030181600087803b15801561266457600080fd5b505af1158015612678573d6000803e3d6000fd5b505050506040513d602081101561268e57600080fd5b506000905061269d8c8c61474d565b509050806001600160a01b03168c6001600160a01b0316141561273e576040805163226bf2d160e21b81526001600160a01b0389811660048301528251908516926389afcb4492602480820193918290030181600087803b15801561270157600080fd5b505af1158015612715573d6000803e3d6000fd5b505050506040513d604081101561272b57600080fd5b50805160209091015190955093506127bd565b6040805163226bf2d160e21b81526001600160a01b0389811660048301528251908516926389afcb4492602480820193918290030181600087803b15801561278557600080fd5b505af1158015612799573d6000803e3d6000fd5b505050506040513d60408110156127af57600080fd5b508051602090910151955093505b888510156127fc5760405162461bcd60e51b8152600401808060200182810382526026815260200180614c3b6026913960400191505060405180910390fd5b8784101561283b5760405162461bcd60e51b8152600401808060200182810382526025815260200180614c886025913960400191505060405180910390fd5b50505097509795505050505050565b60608242811015612890576040805162461bcd60e51b81526020600482015260176024820152600080516020614d6a833981519152604482015290519081900360640190fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316878760008181106128c757fe5b905060200201356001600160a01b03166001600160a01b031614612920576040805162461bcd60e51b815260206004820152601c6024820152600080516020614d8a833981519152604482015290519081900360640190fd5b61297e7f00000000000000000000000000000000000000000000000000000000000000003489898080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061457092505050565b915060006129b37f00000000000000000000000000000000000000000000000000000000000000008989600081811061133d57fe5b90507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db0846000815181106129f157fe5b60200260200101516040518263ffffffff1660e01b81526004016000604051808303818588803b158015612a2457600080fd5b505af1158015612a38573d6000803e3d6000fd5b50505050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a9059cbb8285600081518110612a7a57fe5b60200260200101516040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050602060405180830381600087803b158015612ac857600080fd5b505af1158015612adc573d6000803e3d6000fd5b505050506040513d6020811015612af257600080fd5b5051612afa57fe5b6002871415612bf757806001600160a01b031663d4b32b50898986600081518110612b2157fe5b60200260200101518a896040518663ffffffff1660e01b81526004018080602001858152602001846001600160a01b0316815260200183151581526020018281038252878782818152602001925060200280828437600081840152601f19601f8201169050808301925050509650505050505050602060405180830381600087803b158015612baf57600080fd5b505af1158015612bc3573d6000803e3d6000fd5b505050506040513d6020811015612bd957600080fd5b5051835184906001908110612bea57fe5b6020026020010181815250505b8883600185510381518110612c0857fe5b60200260200101511015612c4d5760405162461bcd60e51b815260040180806020018281038252602a815260200180614c11602a913960400191505060405180910390fd5b611632838989808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152508b925061426e915050565b7f000000000000000000000000000000000000000000000000000000000000000081565b60606110d07f00000000000000000000000000000000000000000000000000000000000000008484614570565b6000806000612d2d7f00000000000000000000000000000000000000000000000000000000000000008e7f00000000000000000000000000000000000000000000000000000000000000006139ff565b9050600087612d3c578c612d40565b6000195b6040805163d505accf60e01b815233600482015230602482015260448101839052606481018c905260ff8a16608482015260a4810189905260c4810188905290519192506001600160a01b0384169163d505accf9160e48082019260009290919082900301818387803b158015612db657600080fd5b505af1158015612dca573d6000803e3d6000fd5b50505050612ddc8e8e8e8e8e8e610cdf565b909f909e509c50505050505050505050505050565b60608242811015612e37576040805162461bcd60e51b81526020600482015260176024820152600080516020614d6a833981519152604482015290519081900360640190fd5b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001687876000198101818110612e7157fe5b905060200201356001600160a01b03166001600160a01b031614612eca576040805162461bcd60e51b815260206004820152601c6024820152600080516020614d8a833981519152604482015290519081900360640190fd5b612f287f00000000000000000000000000000000000000000000000000000000000000008a8989808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152506140d292505050565b91506000612f5d7f00000000000000000000000000000000000000000000000000000000000000008989600081811061133d57fe5b9050600287141561305f576000816001600160a01b0316632fb62a478a8a8e8b8a6040518663ffffffff1660e01b81526004018080602001858152602001846001600160a01b0316815260200183151581526020018281038252878782818152602001925060200280828437600081840152601f19601f8201169050808301925050509650505050505050602060405180830381600087803b15801561300257600080fd5b505af1158015613016573d6000803e3d6000fd5b505050506040513d602081101561302c57600080fd5b50518451909150613044908290869060009061144157fe5b8460008151811061305157fe5b602002602001018181525050505b888360008151811061306d57fe5b602002602001015111156130b25760405162461bcd60e51b8152600401808060200182810382526026815260200180614cd26026913960400191505060405180910390fd5b611f6b88886000818110611c1557fe5b6000806000834281101561310b576040805162461bcd60e51b81526020600482015260176024820152600080516020614d6a833981519152604482015290519081900360640190fd5b6131198c8c8c8c8c8c61482b565b9094509250600061314b7f00000000000000000000000000000000000000000000000000000000000000008e8e6139ff565b90506131598d338388613abf565b6131658c338387613abf565b806001600160a01b0316636a627842886040518263ffffffff1660e01b815260040180826001600160a01b03168152602001915050602060405180830381600087803b1580156131b457600080fd5b505af11580156131c8573d6000803e3d6000fd5b505050506040513d60208110156131de57600080fd5b5051949d939c50939a509198505050505050505050565b6000806000834281101561323e576040805162461bcd60e51b81526020600482015260176024820152600080516020614d6a833981519152604482015290519081900360640190fd5b61326c8a7f00000000000000000000000000000000000000000000000000000000000000008b348c8c61482b565b909450925060006132be7f00000000000000000000000000000000000000000000000000000000000000008c7f00000000000000000000000000000000000000000000000000000000000000006139ff565b90506132cc8b338388613abf565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db0856040518263ffffffff1660e01b81526004016000604051808303818588803b15801561332757600080fd5b505af115801561333b573d6000803e3d6000fd5b50505050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a9059cbb82866040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050602060405180830381600087803b1580156133b757600080fd5b505af11580156133cb573d6000803e3d6000fd5b505050506040513d60208110156133e157600080fd5b50516133e957fe5b806001600160a01b0316636a627842886040518263ffffffff1660e01b815260040180826001600160a01b03168152602001915050602060405180830381600087803b15801561343857600080fd5b505af115801561344c573d6000803e3d6000fd5b505050506040513d602081101561346257600080fd5b505192503484101561347a5761347a3385340361382f565b505096509650969350505050565b606082428110156134ce576040805162461bcd60e51b81526020600482015260176024820152600080516020614d6a833981519152604482015290519081900360640190fd5b61352c7f00000000000000000000000000000000000000000000000000000000000000008a89898080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061457092505050565b915060006135617f00000000000000000000000000000000000000000000000000000000000000008989600081811061133d57fe5b905061357388886000818110611c1557fe5b600287141561367057806001600160a01b031663d4b32b5089898660008151811061359a57fe5b60200260200101518a896040518663ffffffff1660e01b81526004018080602001858152602001846001600160a01b0316815260200183151581526020018281038252878782818152602001925060200280828437600081840152601f19601f8201169050808301925050509650505050505050602060405180830381600087803b15801561362857600080fd5b505af115801561363c573d6000803e3d6000fd5b505050506040513d602081101561365257600080fd5b505183518490600190811061366357fe5b6020026020010181815250505b888360018551038151811061368157fe5b60200260200101511015611c415760405162461bcd60e51b815260040180806020018281038252602a815260200180614c11602a913960400191505060405180910390fd5b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180516001600160e01b031663a9059cbb60e01b1781529251825160009485949389169392918291908083835b602083106137425780518252601f199092019160209182019101613723565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d80600081146137a4576040519150601f19603f3d011682016040523d82523d6000602084013e6137a9565b606091505b50915091508180156137d75750805115806137d757508080602001905160208110156137d457600080fd5b50515b613828576040805162461bcd60e51b815260206004820152601f60248201527f5472616e7366657248656c7065723a205452414e534645525f4641494c454400604482015290519081900360640190fd5b5050505050565b604080516000808252602082019092526001600160a01b0384169083906040518082805190602001908083835b6020831061387b5780518252601f19909201916020918201910161385c565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d80600081146138dd576040519150601f19603f3d011682016040523d82523d6000602084013e6138e2565b606091505b50509050806139225760405162461bcd60e51b8152600401808060200182810382526023815260200180614d1c6023913960400191505060405180910390fd5b505050565b60008084116139675760405162461bcd60e51b815260040180806020018281038252602a815260200180614be7602a913960400191505060405180910390fd5b6000831180156139775750600082115b6139b25760405162461bcd60e51b8152600401808060200182810382526027815260200180614c616027913960400191505060405180910390fd5b60006139c0856126f7614abc565b905060006139ce8285614abc565b905060006139e8836139e288612710614abc565b9061421f565b90508082816139f357fe5b04979650505050505050565b6000806000613a0e858561474d565b604080516bffffffffffffffffffffffff19606094851b811660208084019190915293851b81166034830152825160288184030181526048830184528051908501206001600160f81b031960688401529a90941b9093166069840152607d8301989098527f486345174f0c880a75d64ac5bb327f91ab509c8f197c4f570b73c1b89f15f85b609d808401919091528851808403909101815260bd909201909752805196019590952095945050505050565b604080516001600160a01b0385811660248301528481166044830152606480830185905283518084039091018152608490920183526020820180516001600160e01b03166323b872dd60e01b178152925182516000948594938a169392918291908083835b60208310613b435780518252601f199092019160209182019101613b24565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114613ba5576040519150601f19603f3d011682016040523d82523d6000602084013e613baa565b606091505b5091509150818015613bd8575080511580613bd85750808060200190516020811015613bd557600080fd5b50515b613c135760405162461bcd60e51b8152600401808060200182810382526024815260200180614daa6024913960400191505060405180910390fd5b505050505050565b60005b600184510381101561407c576000613c5f858381518110613c3b57fe5b6020026020010151868460010181518110613c5257fe5b602002602001015161474d565b5090506000613cb87f0000000000000000000000000000000000000000000000000000000000000000878581518110613c9457fe5b6020026020010151888660010181518110613cab57fe5b60200260200101516139ff565b90506000806000836001600160a01b0316630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b158015613cf857600080fd5b505afa158015613d0c573d6000803e3d6000fd5b505050506040513d6060811015613d2257600080fd5b5080516020909101518a516001600160701b0392831694509116915060009081906001600160a01b038816908c908a908110613d5a57fe5b60200260200101516001600160a01b031614613d77578284613d7a565b83835b915091506000613de4838d8b81518110613d9057fe5b60200260200101516001600160a01b03166370a082318a6040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561102957600080fd5b90508b5160021415613eca57866001600160a01b031663d4b32b508d838e8e6040518563ffffffff1660e01b81526004018080602001858152602001846001600160a01b031681526020018315158152602001828103825286818151815260200191508051906020019060200280838360005b83811015613e6f578181015183820152602001613e57565b5050505090500195505050505050602060405180830381600087803b158015613e9757600080fd5b505af1158015613eab573d6000803e3d6000fd5b505050506040513d6020811015613ec157600080fd5b50519550613ed8565b613ed5818484613927565b95505b5050505050600080846001600160a01b0316898781518110613ef657fe5b60200260200101516001600160a01b031614613f1457826000613f18565b6000835b91509150600060028a51038710613f2f5788613f79565b613f797f00000000000000000000000000000000000000000000000000000000000000008b8960010181518110613f6257fe5b60200260200101518c8a60020181518110613cab57fe5b604080516000808252602082019283905263022c0d9f60e01b835260248201878152604483018790526001600160a01b038086166064850152608060848501908152845160a48601819052969750908b169563022c0d9f958a958a958a9591949193919260c486019290918190849084905b83811015614003578181015183820152602001613feb565b50505050905090810190601f1680156140305780820380516001836020036101000a031916815260200191505b5095505050505050600060405180830381600087803b15801561405257600080fd5b505af1158015614066573d6000803e3d6000fd5b505060019098019750613c1e9650505050505050565b50505050565b808203828111156110d3576040805162461bcd60e51b815260206004820152601560248201527464732d6d6174682d7375622d756e646572666c6f7760581b604482015290519081900360640190fd5b606060028251101561412b576040805162461bcd60e51b815260206004820152601d60248201527f4b696e67537761704c6962726172793a20494e56414c49445f50415448000000604482015290519081900360640190fd5b815167ffffffffffffffff8111801561414357600080fd5b5060405190808252806020026020018201604052801561416d578160200160208202803683370190505b509050828160018351038151811061418157fe5b60209081029190910101528151600019015b8015614217576000806141d0878660018603815181106141af57fe5b60200260200101518786815181106141c357fe5b6020026020010151614b1f565b915091506141f28484815181106141e357fe5b60200260200101518383614498565b84600185038151811061420157fe5b6020908102919091010152505060001901614193565b509392505050565b808201828110156110d3576040805162461bcd60e51b815260206004820152601460248201527364732d6d6174682d6164642d6f766572666c6f7760601b604482015290519081900360640190fd5b60005b600183510381101561407c5760008084838151811061428c57fe5b60200260200101518584600101815181106142a357fe5b60200260200101519150915060006142bb838361474d565b50905060008785600101815181106142cf57fe5b60200260200101519050600080836001600160a01b0316866001600160a01b0316146142fd57826000614301565b6000835b91509150600060028a51038810614318578861434c565b61434c7f0000000000000000000000000000000000000000000000000000000000000000878c8b60020181518110613cab57fe5b90506143797f000000000000000000000000000000000000000000000000000000000000000088886139ff565b6001600160a01b031663022c0d9f84848460006040519080825280601f01601f1916602001820160405280156143b6576020820181803683370190505b506040518563ffffffff1660e01b815260040180858152602001848152602001836001600160a01b0316815260200180602001828103825283818151815260200191508051906020019080838360005b8381101561441e578181015183820152602001614406565b50505050905090810190601f16801561444b5780820380516001836020036101000a031916815260200191505b5095505050505050600060405180830381600087803b15801561446d57600080fd5b505af1158015614481573d6000803e3d6000fd5b505060019099019850614271975050505050505050565b60008084116144d85760405162461bcd60e51b815260040180806020018281038252602b815260200180614d3f602b913960400191505060405180910390fd5b6000831180156144e85750600082115b6145235760405162461bcd60e51b8152600401808060200182810382526027815260200180614c616027913960400191505060405180910390fd5b600061453b6127106145358688614abc565b90614abc565b9050600061454f6126f76145358689614082565b9050614566600182848161455f57fe5b049061421f565b9695505050505050565b60606002825110156145c9576040805162461bcd60e51b815260206004820152601d60248201527f4b696e67537761704c6962726172793a20494e56414c49445f50415448000000604482015290519081900360640190fd5b815167ffffffffffffffff811180156145e157600080fd5b5060405190808252806020026020018201604052801561460b578160200160208202803683370190505b509050828160008151811061461c57fe5b60200260200101818152505060005b6001835103811015614217576000806146618786858151811061464a57fe5b60200260200101518786600101815181106141c357fe5b9150915061468384848151811061467457fe5b60200260200101518383613927565b84846001018151811061469257fe5b6020908102919091010152505060010161462b565b60008084116146e75760405162461bcd60e51b8152600401808060200182810382526024815260200180614cf86024913960400191505060405180910390fd5b6000831180156146f75750600082115b6147325760405162461bcd60e51b8152600401808060200182810382526027815260200180614c616027913960400191505060405180910390fd5b8261473d8584614abc565b8161474457fe5b04949350505050565b600080826001600160a01b0316846001600160a01b031614156147a15760405162461bcd60e51b8152600401808060200182810382526024815260200180614dce6024913960400191505060405180910390fd5b826001600160a01b0316846001600160a01b0316106147c15782846147c4565b83835b90925090506001600160a01b038216614824576040805162461bcd60e51b815260206004820152601d60248201527f4b696e67537761704c6962726172793a205a45524f5f41444452455353000000604482015290519081900360640190fd5b9250929050565b60008060006001600160a01b03167f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663e6a439058a8a6040518363ffffffff1660e01b815260040180836001600160a01b03168152602001826001600160a01b031681526020019250505060206040518083038186803b1580156148b757600080fd5b505afa1580156148cb573d6000803e3d6000fd5b505050506040513d60208110156148e157600080fd5b50516001600160a01b0316141561499f577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663c9c6539689896040518363ffffffff1660e01b815260040180836001600160a01b03168152602001826001600160a01b0316815260200192505050602060405180830381600087803b15801561497257600080fd5b505af1158015614986573d6000803e3d6000fd5b505050506040513d602081101561499c57600080fd5b50505b6000806149cd7f00000000000000000000000000000000000000000000000000000000000000008b8b614b1f565b915091508160001480156149df575080155b156149ef57879350869250614aaf565b60006149fc8984846146a7565b9050878111614a4f5785811015614a445760405162461bcd60e51b8152600401808060200182810382526025815260200180614c886025913960400191505060405180910390fd5b889450925082614aad565b6000614a5c8984866146a7565b905089811115614a6857fe5b87811015614aa75760405162461bcd60e51b8152600401808060200182810382526025815260200180614cad6025913960400191505060405180910390fd5b94508793505b505b5050965096945050505050565b6000811580614ad757505080820282828281614ad457fe5b04145b6110d3576040805162461bcd60e51b815260206004820152601460248201527364732d6d6174682d6d756c2d6f766572666c6f7760601b604482015290519081900360640190fd5b6000806000614b2e858561474d565b509050600080614b3f8888886139ff565b6001600160a01b0316630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b158015614b7757600080fd5b505afa158015614b8b573d6000803e3d6000fd5b505050506040513d6060811015614ba157600080fd5b5080516020909101516001600160701b0391821693501690506001600160a01b0387811690841614614bd4578082614bd7565b81815b9099909850965050505050505056fe4b696e67537761704c6962726172793a20494e53554646494349454e545f494e5055545f414d4f554e544b696e6753776170526f757465723a20494e53554646494349454e545f4f55545055545f414d4f554e544b696e675377617070526f757465723a20494e53554646494349454e545f415f414d4f554e544b696e67537761704c6962726172793a20494e53554646494349454e545f4c49515549444954594b696e6753776170526f757465723a20494e53554646494349454e545f425f414d4f554e544b696e6753776170526f757465723a20494e53554646494349454e545f415f414d4f554e544b696e6753776170526f757465723a204558434553534956455f494e5055545f414d4f554e544b696e67537761704c6962726172793a20494e53554646494349454e545f414d4f554e545472616e7366657248656c7065723a204554485f5452414e534645525f4641494c45444b696e67537761704c6962726172793a20494e53554646494349454e545f4f55545055545f414d4f554e544b696e6753776170526f757465723a20455850495245440000000000000000004b696e6753776170526f757465723a20494e56414c49445f50415448000000005472616e7366657248656c7065723a205452414e534645525f46524f4d5f4641494c45444b696e67537761704c6962726172793a204944454e544943414c5f414444524553534553a26469706673582212203f070c25914294c9e7264e31f39433e8f9853717ffdab8350ce1b3ebb37d9ed564736f6c63430007060033000000000000000000000000977cfffece847529190e6771dfeacdd7b5659f9b0000000000000000000000006a023ccd1ff6f2045c3309768ead9e68f978f6e1
Deployed Bytecode
0x60806040526004361061014f5760003560e01c8063ad5c4648116100b6578063d06ca61f1161006f578063d06ca61f146109b5578063ded9382a14610a6a578063e7bb988d14610add578063e8e3370014610b7b578063f305d71914610bfb578063fa775c0f14610c4157610188565b8063ad5c4648146107fd578063ad615dec1461082e578063af2979eb14610864578063baa2abde146108b7578063c27e85ca14610914578063c45a0155146109a057610188565b80635b0d5984116101085780635b0d5984146104ee57806361be71b2146105615780636e03efb5146105ff57806385f8c2591461069d5780639be677c1146106d3578063a2e250b31461077157610188565b806302751cec1461018d578063054d50d4146101f9578063099963f4146102415780631f00ca74146102df5780632195995c146103e45780632533ef941461046257610188565b3661018857336001600160a01b037f0000000000000000000000006a023ccd1ff6f2045c3309768ead9e68f978f6e1161461018657fe5b005b600080fd5b34801561019957600080fd5b506101e0600480360360c08110156101b057600080fd5b506001600160a01b0381358116916020810135916040820135916060810135916080820135169060a00135610cdf565b6040805192835260208301919091528051918290030190f35b34801561020557600080fd5b5061022f6004803603606081101561021c57600080fd5b5080359060208101359060400135610df9565b60408051918252519081900360200190f35b34801561024d57600080fd5b50610186600480360360c081101561026457600080fd5b813591602081013591810190606081016040820135600160201b81111561028a57600080fd5b82018360208201111561029c57600080fd5b803590602001918460208302840111600160201b831117156102bd57600080fd5b91935091506001600160a01b0381351690602081013590604001351515610e0e565b3480156102eb57600080fd5b506103946004803603604081101561030257600080fd5b81359190810190604081016020820135600160201b81111561032357600080fd5b82018360208201111561033557600080fd5b803590602001918460208302840111600160201b8311171561035657600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295506110a3945050505050565b60408051602080825283518183015283519192839290830191858101910280838360005b838110156103d05781810151838201526020016103b8565b505050509050019250505060405180910390f35b3480156103f057600080fd5b506101e0600480360361016081101561040857600080fd5b506001600160a01b038135811691602081013582169160408201359160608101359160808201359160a08101359091169060c08101359060e081013515159060ff61010082013516906101208101359061014001356110d9565b610394600480360360a081101561047857600080fd5b81359190810190604081016020820135600160201b81111561049957600080fd5b8201836020820111156104ab57600080fd5b803590602001918460208302840111600160201b831117156104cc57600080fd5b91935091506001600160a01b03813516906020810135906040013515156111d4565b3480156104fa57600080fd5b5061022f600480360361014081101561051257600080fd5b506001600160a01b0381358116916020810135916040820135916060810135916080820135169060a08101359060c081013515159060ff60e0820135169061010081013590610120013561163e565b34801561056d57600080fd5b50610186600480360360c081101561058457600080fd5b813591602081013591810190606081016040820135600160201b8111156105aa57600080fd5b8201836020820111156105bc57600080fd5b803590602001918460208302840111600160201b831117156105dd57600080fd5b91935091506001600160a01b038135169060208101359060400135151561174c565b34801561060b57600080fd5b50610394600480360360c081101561062257600080fd5b813591602081013591810190606081016040820135600160201b81111561064857600080fd5b82018360208201111561065a57600080fd5b803590602001918460208302840111600160201b8311171561067b57600080fd5b91935091506001600160a01b03813516906020810135906040013515156119d7565b3480156106a957600080fd5b5061022f600480360360608110156106c057600080fd5b5080359060208101359060400135611c8d565b3480156106df57600080fd5b50610394600480360360c08110156106f657600080fd5b813591602081013591810190606081016040820135600160201b81111561071c57600080fd5b82018360208201111561072e57600080fd5b803590602001918460208302840111600160201b8311171561074f57600080fd5b91935091506001600160a01b0381351690602081013590604001351515611c9a565b610186600480360360a081101561078757600080fd5b81359190810190604081016020820135600160201b8111156107a857600080fd5b8201836020820111156107ba57600080fd5b803590602001918460208302840111600160201b831117156107db57600080fd5b91935091506001600160a01b0381351690602081013590604001351515612060565b34801561080957600080fd5b506108126123d3565b604080516001600160a01b039092168252519081900360200190f35b34801561083a57600080fd5b5061022f6004803603606081101561085157600080fd5b50803590602081013590604001356123f7565b34801561087057600080fd5b5061022f600480360360c081101561088757600080fd5b506001600160a01b0381358116916020810135916040820135916060810135916080820135169060a00135612404565b3480156108c357600080fd5b506101e0600480360360e08110156108da57600080fd5b506001600160a01b038135811691602081013582169160408201359160608101359160808201359160a08101359091169060c00135612595565b610394600480360360a081101561092a57600080fd5b81359190810190604081016020820135600160201b81111561094b57600080fd5b82018360208201111561095d57600080fd5b803590602001918460208302840111600160201b8311171561097e57600080fd5b91935091506001600160a01b038135169060208101359060400135151561284a565b3480156109ac57600080fd5b50610812612c8c565b3480156109c157600080fd5b50610394600480360360408110156109d857600080fd5b81359190810190604081016020820135600160201b8111156109f957600080fd5b820183602082011115610a0b57600080fd5b803590602001918460208302840111600160201b83111715610a2c57600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550612cb0945050505050565b348015610a7657600080fd5b506101e06004803603610140811015610a8e57600080fd5b506001600160a01b0381358116916020810135916040820135916060810135916080820135169060a08101359060c081013515159060ff60e08201351690610100810135906101200135612cdd565b348015610ae957600080fd5b50610394600480360360c0811015610b0057600080fd5b813591602081013591810190606081016040820135600160201b811115610b2657600080fd5b820183602082011115610b3857600080fd5b803590602001918460208302840111600160201b83111715610b5957600080fd5b91935091506001600160a01b0381351690602081013590604001351515612df1565b348015610b8757600080fd5b50610bdd6004803603610100811015610b9f57600080fd5b506001600160a01b038135811691602081013582169160408201359160608101359160808201359160a08101359160c0820135169060e001356130c2565b60408051938452602084019290925282820152519081900360600190f35b610bdd600480360360c0811015610c1157600080fd5b506001600160a01b0381358116916020810135916040820135916060810135916080820135169060a001356131f5565b348015610c4d57600080fd5b50610394600480360360c0811015610c6457600080fd5b813591602081013591810190606081016040820135600160201b811115610c8a57600080fd5b820183602082011115610c9c57600080fd5b803590602001918460208302840111600160201b83111715610cbd57600080fd5b91935091506001600160a01b0381351690602081013590604001351515613488565b6000808242811015610d26576040805162461bcd60e51b81526020600482015260176024820152600080516020614d6a833981519152604482015290519081900360640190fd5b610d55897f0000000000000000000000006a023ccd1ff6f2045c3309768ead9e68f978f6e18a8a8a308a612595565b9093509150610d658986856136c6565b7f0000000000000000000000006a023ccd1ff6f2045c3309768ead9e68f978f6e16001600160a01b0316632e1a7d4d836040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b158015610dcb57600080fd5b505af1158015610ddf573d6000803e3d6000fd5b50505050610ded858361382f565b50965096945050505050565b6000610e06848484613927565b949350505050565b8142811015610e52576040805162461bcd60e51b81526020600482015260176024820152600080516020614d6a833981519152604482015290519081900360640190fd5b610edc86866000818110610e6257fe5b905060200201356001600160a01b031633610ed67f000000000000000000000000977cfffece847529190e6771dfeacdd7b5659f9b8a8a6000818110610ea457fe5b905060200201356001600160a01b03168b8b6001818110610ec157fe5b905060200201356001600160a01b03166139ff565b8b613abf565b600086866000198101818110610eee57fe5b905060200201356001600160a01b03166001600160a01b03166370a08231866040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015610f4a57600080fd5b505afa158015610f5e573d6000803e3d6000fd5b505050506040513d6020811015610f7457600080fd5b50516040805160208981028281018201909352898252929350610fb89290918a918a918291850190849080828437600092019190915250899250879150613c1b9050565b8761105b8289896000198101818110610fcd57fe5b905060200201356001600160a01b03166001600160a01b03166370a08231896040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561102957600080fd5b505afa15801561103d573d6000803e3d6000fd5b505050506040513d602081101561105357600080fd5b505190614082565b10156110985760405162461bcd60e51b815260040180806020018281038252602a815260200180614c11602a913960400191505060405180910390fd5b505050505050505050565b60606110d07f000000000000000000000000977cfffece847529190e6771dfeacdd7b5659f9b84846140d2565b90505b92915050565b6000806111077f000000000000000000000000977cfffece847529190e6771dfeacdd7b5659f9b8e8e6139ff565b6001600160a01b031663d505accf333089611122578e611126565b6000195b604080516001600160e01b031960e087901b1681526001600160a01b0394851660048201529290931660248301526044820152606481018b905260ff8916608482015260a4810188905260c48101879052905160e480830192600092919082900301818387803b15801561119957600080fd5b505af11580156111ad573d6000803e3d6000fd5b505050506111c08d8d8d8d8d8d8d612595565b909e909d509b505050505050505050505050565b6060824281101561121a576040805162461bcd60e51b81526020600482015260176024820152600080516020614d6a833981519152604482015290519081900360640190fd5b7f0000000000000000000000006a023ccd1ff6f2045c3309768ead9e68f978f6e16001600160a01b03168787600081811061125157fe5b905060200201356001600160a01b03166001600160a01b0316146112aa576040805162461bcd60e51b815260206004820152601c6024820152600080516020614d8a833981519152604482015290519081900360640190fd5b6113087f000000000000000000000000977cfffece847529190e6771dfeacdd7b5659f9b898989808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152506140d292505050565b9150600061135a7f000000000000000000000000977cfffece847529190e6771dfeacdd7b5659f9b8989600081811061133d57fe5b905060200201356001600160a01b03168a8a6001818110610ec157fe5b90506002871415611472576000816001600160a01b0316632fb62a478a8a8d8b8a6040518663ffffffff1660e01b81526004018080602001858152602001846001600160a01b0316815260200183151581526020018281038252878782818152602001925060200280828437600081840152601f19601f8201169050808301925050509650505050505050602060405180830381600087803b1580156113ff57600080fd5b505af1158015611413573d6000803e3d6000fd5b505050506040513d602081101561142957600080fd5b50518451909150611457908290869060009061144157fe5b602002602001015161421f90919063ffffffff16565b8460008151811061146457fe5b602002602001018181525050505b7f0000000000000000000000006a023ccd1ff6f2045c3309768ead9e68f978f6e16001600160a01b031663d0e30db0846000815181106114ae57fe5b60200260200101516040518263ffffffff1660e01b81526004016000604051808303818588803b1580156114e157600080fd5b505af11580156114f5573d6000803e3d6000fd5b50505050507f0000000000000000000000006a023ccd1ff6f2045c3309768ead9e68f978f6e16001600160a01b031663a9059cbb828560008151811061153757fe5b60200260200101516040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050602060405180830381600087803b15801561158557600080fd5b505af1158015611599573d6000803e3d6000fd5b505050506040513d60208110156115af57600080fd5b50516115b757fe5b6115f6838989808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152508b925061426e915050565b8260008151811061160357fe5b602002602001015134111561163257611632338460008151811061162357fe5b6020026020010151340361382f565b50509695505050505050565b60008061168c7f000000000000000000000000977cfffece847529190e6771dfeacdd7b5659f9b8d7f0000000000000000000000006a023ccd1ff6f2045c3309768ead9e68f978f6e16139ff565b905060008661169b578b61169f565b6000195b6040805163d505accf60e01b815233600482015230602482015260448101839052606481018b905260ff8916608482015260a4810188905260c4810187905290519192506001600160a01b0384169163d505accf9160e48082019260009290919082900301818387803b15801561171557600080fd5b505af1158015611729573d6000803e3d6000fd5b5050505061173b8d8d8d8d8d8d612404565b9d9c50505050505050505050505050565b8142811015611790576040805162461bcd60e51b81526020600482015260176024820152600080516020614d6a833981519152604482015290519081900360640190fd5b6001600160a01b037f0000000000000000000000006a023ccd1ff6f2045c3309768ead9e68f978f6e116868660001981018181106117ca57fe5b905060200201356001600160a01b03166001600160a01b031614611823576040805162461bcd60e51b815260206004820152601c6024820152600080516020614d8a833981519152604482015290519081900360640190fd5b61183386866000818110610e6257fe5b611873868680806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250309250869150613c1b9050565b60007f0000000000000000000000006a023ccd1ff6f2045c3309768ead9e68f978f6e16001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b1580156118e257600080fd5b505afa1580156118f6573d6000803e3d6000fd5b505050506040513d602081101561190c57600080fd5b505190508781101561194f5760405162461bcd60e51b815260040180806020018281038252602a815260200180614c11602a913960400191505060405180910390fd5b7f0000000000000000000000006a023ccd1ff6f2045c3309768ead9e68f978f6e16001600160a01b0316632e1a7d4d826040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b1580156119b557600080fd5b505af11580156119c9573d6000803e3d6000fd5b50505050611098858261382f565b60608242811015611a1d576040805162461bcd60e51b81526020600482015260176024820152600080516020614d6a833981519152604482015290519081900360640190fd5b611a7b7f000000000000000000000000977cfffece847529190e6771dfeacdd7b5659f9b8a8989808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152506140d292505050565b91506000611ab07f000000000000000000000000977cfffece847529190e6771dfeacdd7b5659f9b8989600081811061133d57fe5b90506002871415611bb2576000816001600160a01b0316632fb62a478a8a8e8b8a6040518663ffffffff1660e01b81526004018080602001858152602001846001600160a01b0316815260200183151581526020018281038252878782818152602001925060200280828437600081840152601f19601f8201169050808301925050509650505050505050602060405180830381600087803b158015611b5557600080fd5b505af1158015611b69573d6000803e3d6000fd5b505050506040513d6020811015611b7f57600080fd5b50518451909150611b97908290869060009061144157fe5b84600081518110611ba457fe5b602002602001018181525050505b8883600081518110611bc057fe5b60200260200101511115611c055760405162461bcd60e51b8152600401808060200182810382526026815260200180614cd26026913960400191505060405180910390fd5b611c4188886000818110611c1557fe5b905060200201356001600160a01b0316338386600081518110611c3457fe5b6020026020010151613abf565b611c80838989808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152508b925061426e915050565b5050979650505050505050565b6000610e06848484614498565b60608242811015611ce0576040805162461bcd60e51b81526020600482015260176024820152600080516020614d6a833981519152604482015290519081900360640190fd5b6001600160a01b037f0000000000000000000000006a023ccd1ff6f2045c3309768ead9e68f978f6e11687876000198101818110611d1a57fe5b905060200201356001600160a01b03166001600160a01b031614611d73576040805162461bcd60e51b815260206004820152601c6024820152600080516020614d8a833981519152604482015290519081900360640190fd5b611dd17f000000000000000000000000977cfffece847529190e6771dfeacdd7b5659f9b8a89898080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061457092505050565b91506000611e067f000000000000000000000000977cfffece847529190e6771dfeacdd7b5659f9b8989600081811061133d57fe5b9050611e1888886000818110611c1557fe5b6002871415611f1557806001600160a01b031663d4b32b50898986600081518110611e3f57fe5b60200260200101518a896040518663ffffffff1660e01b81526004018080602001858152602001846001600160a01b0316815260200183151581526020018281038252878782818152602001925060200280828437600081840152601f19601f8201169050808301925050509650505050505050602060405180830381600087803b158015611ecd57600080fd5b505af1158015611ee1573d6000803e3d6000fd5b505050506040513d6020811015611ef757600080fd5b5051835184906001908110611f0857fe5b6020026020010181815250505b8883600185510381518110611f2657fe5b60200260200101511015611f6b5760405162461bcd60e51b815260040180806020018281038252602a815260200180614c11602a913960400191505060405180910390fd5b611faa8389898080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525030925061426e915050565b7f0000000000000000000000006a023ccd1ff6f2045c3309768ead9e68f978f6e16001600160a01b0316632e1a7d4d84600186510381518110611fe957fe5b60200260200101516040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b15801561202757600080fd5b505af115801561203b573d6000803e3d6000fd5b50505050611c80868460018651038151811061205357fe5b602002602001015161382f565b81428110156120a4576040805162461bcd60e51b81526020600482015260176024820152600080516020614d6a833981519152604482015290519081900360640190fd5b7f0000000000000000000000006a023ccd1ff6f2045c3309768ead9e68f978f6e16001600160a01b0316868660008181106120db57fe5b905060200201356001600160a01b03166001600160a01b031614612134576040805162461bcd60e51b815260206004820152601c6024820152600080516020614d8a833981519152604482015290519081900360640190fd5b60003490507f0000000000000000000000006a023ccd1ff6f2045c3309768ead9e68f978f6e16001600160a01b031663d0e30db0826040518263ffffffff1660e01b81526004016000604051808303818588803b15801561219457600080fd5b505af11580156121a8573d6000803e3d6000fd5b50505050507f0000000000000000000000006a023ccd1ff6f2045c3309768ead9e68f978f6e16001600160a01b031663a9059cbb61220d7f000000000000000000000000977cfffece847529190e6771dfeacdd7b5659f9b8a8a6000818110610ea457fe5b836040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050602060405180830381600087803b15801561225457600080fd5b505af1158015612268573d6000803e3d6000fd5b505050506040513d602081101561227e57600080fd5b505161228657fe5b60008787600019810181811061229857fe5b905060200201356001600160a01b03166001600160a01b03166370a08231876040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b1580156122f457600080fd5b505afa158015612308573d6000803e3d6000fd5b505050506040513d602081101561231e57600080fd5b50516040805160208a810282810182019093528a82529293506123629290918b918b9182918501908490808284376000920191909152508a9250889150613c1b9050565b8861105b828a8a600019810181811061237757fe5b905060200201356001600160a01b03166001600160a01b03166370a082318a6040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561102957600080fd5b7f0000000000000000000000006a023ccd1ff6f2045c3309768ead9e68f978f6e181565b6000610e068484846146a7565b6000814281101561244a576040805162461bcd60e51b81526020600482015260176024820152600080516020614d6a833981519152604482015290519081900360640190fd5b612479887f0000000000000000000000006a023ccd1ff6f2045c3309768ead9e68f978f6e18989893089612595565b90508092505061250288858a6001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b1580156124d157600080fd5b505afa1580156124e5573d6000803e3d6000fd5b505050506040513d60208110156124fb57600080fd5b50516136c6565b7f0000000000000000000000006a023ccd1ff6f2045c3309768ead9e68f978f6e16001600160a01b0316632e1a7d4d836040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b15801561256857600080fd5b505af115801561257c573d6000803e3d6000fd5b5050505061258a848361382f565b509695505050505050565b60008082428110156125dc576040805162461bcd60e51b81526020600482015260176024820152600080516020614d6a833981519152604482015290519081900360640190fd5b60006126097f000000000000000000000000977cfffece847529190e6771dfeacdd7b5659f9b8c8c6139ff565b604080516323b872dd60e01b81523360048201526001600160a01b03831660248201819052604482018d9052915192935090916323b872dd916064808201926020929091908290030181600087803b15801561266457600080fd5b505af1158015612678573d6000803e3d6000fd5b505050506040513d602081101561268e57600080fd5b506000905061269d8c8c61474d565b509050806001600160a01b03168c6001600160a01b0316141561273e576040805163226bf2d160e21b81526001600160a01b0389811660048301528251908516926389afcb4492602480820193918290030181600087803b15801561270157600080fd5b505af1158015612715573d6000803e3d6000fd5b505050506040513d604081101561272b57600080fd5b50805160209091015190955093506127bd565b6040805163226bf2d160e21b81526001600160a01b0389811660048301528251908516926389afcb4492602480820193918290030181600087803b15801561278557600080fd5b505af1158015612799573d6000803e3d6000fd5b505050506040513d60408110156127af57600080fd5b508051602090910151955093505b888510156127fc5760405162461bcd60e51b8152600401808060200182810382526026815260200180614c3b6026913960400191505060405180910390fd5b8784101561283b5760405162461bcd60e51b8152600401808060200182810382526025815260200180614c886025913960400191505060405180910390fd5b50505097509795505050505050565b60608242811015612890576040805162461bcd60e51b81526020600482015260176024820152600080516020614d6a833981519152604482015290519081900360640190fd5b7f0000000000000000000000006a023ccd1ff6f2045c3309768ead9e68f978f6e16001600160a01b0316878760008181106128c757fe5b905060200201356001600160a01b03166001600160a01b031614612920576040805162461bcd60e51b815260206004820152601c6024820152600080516020614d8a833981519152604482015290519081900360640190fd5b61297e7f000000000000000000000000977cfffece847529190e6771dfeacdd7b5659f9b3489898080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061457092505050565b915060006129b37f000000000000000000000000977cfffece847529190e6771dfeacdd7b5659f9b8989600081811061133d57fe5b90507f0000000000000000000000006a023ccd1ff6f2045c3309768ead9e68f978f6e16001600160a01b031663d0e30db0846000815181106129f157fe5b60200260200101516040518263ffffffff1660e01b81526004016000604051808303818588803b158015612a2457600080fd5b505af1158015612a38573d6000803e3d6000fd5b50505050507f0000000000000000000000006a023ccd1ff6f2045c3309768ead9e68f978f6e16001600160a01b031663a9059cbb8285600081518110612a7a57fe5b60200260200101516040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050602060405180830381600087803b158015612ac857600080fd5b505af1158015612adc573d6000803e3d6000fd5b505050506040513d6020811015612af257600080fd5b5051612afa57fe5b6002871415612bf757806001600160a01b031663d4b32b50898986600081518110612b2157fe5b60200260200101518a896040518663ffffffff1660e01b81526004018080602001858152602001846001600160a01b0316815260200183151581526020018281038252878782818152602001925060200280828437600081840152601f19601f8201169050808301925050509650505050505050602060405180830381600087803b158015612baf57600080fd5b505af1158015612bc3573d6000803e3d6000fd5b505050506040513d6020811015612bd957600080fd5b5051835184906001908110612bea57fe5b6020026020010181815250505b8883600185510381518110612c0857fe5b60200260200101511015612c4d5760405162461bcd60e51b815260040180806020018281038252602a815260200180614c11602a913960400191505060405180910390fd5b611632838989808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152508b925061426e915050565b7f000000000000000000000000977cfffece847529190e6771dfeacdd7b5659f9b81565b60606110d07f000000000000000000000000977cfffece847529190e6771dfeacdd7b5659f9b8484614570565b6000806000612d2d7f000000000000000000000000977cfffece847529190e6771dfeacdd7b5659f9b8e7f0000000000000000000000006a023ccd1ff6f2045c3309768ead9e68f978f6e16139ff565b9050600087612d3c578c612d40565b6000195b6040805163d505accf60e01b815233600482015230602482015260448101839052606481018c905260ff8a16608482015260a4810189905260c4810188905290519192506001600160a01b0384169163d505accf9160e48082019260009290919082900301818387803b158015612db657600080fd5b505af1158015612dca573d6000803e3d6000fd5b50505050612ddc8e8e8e8e8e8e610cdf565b909f909e509c50505050505050505050505050565b60608242811015612e37576040805162461bcd60e51b81526020600482015260176024820152600080516020614d6a833981519152604482015290519081900360640190fd5b6001600160a01b037f0000000000000000000000006a023ccd1ff6f2045c3309768ead9e68f978f6e11687876000198101818110612e7157fe5b905060200201356001600160a01b03166001600160a01b031614612eca576040805162461bcd60e51b815260206004820152601c6024820152600080516020614d8a833981519152604482015290519081900360640190fd5b612f287f000000000000000000000000977cfffece847529190e6771dfeacdd7b5659f9b8a8989808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152506140d292505050565b91506000612f5d7f000000000000000000000000977cfffece847529190e6771dfeacdd7b5659f9b8989600081811061133d57fe5b9050600287141561305f576000816001600160a01b0316632fb62a478a8a8e8b8a6040518663ffffffff1660e01b81526004018080602001858152602001846001600160a01b0316815260200183151581526020018281038252878782818152602001925060200280828437600081840152601f19601f8201169050808301925050509650505050505050602060405180830381600087803b15801561300257600080fd5b505af1158015613016573d6000803e3d6000fd5b505050506040513d602081101561302c57600080fd5b50518451909150613044908290869060009061144157fe5b8460008151811061305157fe5b602002602001018181525050505b888360008151811061306d57fe5b602002602001015111156130b25760405162461bcd60e51b8152600401808060200182810382526026815260200180614cd26026913960400191505060405180910390fd5b611f6b88886000818110611c1557fe5b6000806000834281101561310b576040805162461bcd60e51b81526020600482015260176024820152600080516020614d6a833981519152604482015290519081900360640190fd5b6131198c8c8c8c8c8c61482b565b9094509250600061314b7f000000000000000000000000977cfffece847529190e6771dfeacdd7b5659f9b8e8e6139ff565b90506131598d338388613abf565b6131658c338387613abf565b806001600160a01b0316636a627842886040518263ffffffff1660e01b815260040180826001600160a01b03168152602001915050602060405180830381600087803b1580156131b457600080fd5b505af11580156131c8573d6000803e3d6000fd5b505050506040513d60208110156131de57600080fd5b5051949d939c50939a509198505050505050505050565b6000806000834281101561323e576040805162461bcd60e51b81526020600482015260176024820152600080516020614d6a833981519152604482015290519081900360640190fd5b61326c8a7f0000000000000000000000006a023ccd1ff6f2045c3309768ead9e68f978f6e18b348c8c61482b565b909450925060006132be7f000000000000000000000000977cfffece847529190e6771dfeacdd7b5659f9b8c7f0000000000000000000000006a023ccd1ff6f2045c3309768ead9e68f978f6e16139ff565b90506132cc8b338388613abf565b7f0000000000000000000000006a023ccd1ff6f2045c3309768ead9e68f978f6e16001600160a01b031663d0e30db0856040518263ffffffff1660e01b81526004016000604051808303818588803b15801561332757600080fd5b505af115801561333b573d6000803e3d6000fd5b50505050507f0000000000000000000000006a023ccd1ff6f2045c3309768ead9e68f978f6e16001600160a01b031663a9059cbb82866040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050602060405180830381600087803b1580156133b757600080fd5b505af11580156133cb573d6000803e3d6000fd5b505050506040513d60208110156133e157600080fd5b50516133e957fe5b806001600160a01b0316636a627842886040518263ffffffff1660e01b815260040180826001600160a01b03168152602001915050602060405180830381600087803b15801561343857600080fd5b505af115801561344c573d6000803e3d6000fd5b505050506040513d602081101561346257600080fd5b505192503484101561347a5761347a3385340361382f565b505096509650969350505050565b606082428110156134ce576040805162461bcd60e51b81526020600482015260176024820152600080516020614d6a833981519152604482015290519081900360640190fd5b61352c7f000000000000000000000000977cfffece847529190e6771dfeacdd7b5659f9b8a89898080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061457092505050565b915060006135617f000000000000000000000000977cfffece847529190e6771dfeacdd7b5659f9b8989600081811061133d57fe5b905061357388886000818110611c1557fe5b600287141561367057806001600160a01b031663d4b32b5089898660008151811061359a57fe5b60200260200101518a896040518663ffffffff1660e01b81526004018080602001858152602001846001600160a01b0316815260200183151581526020018281038252878782818152602001925060200280828437600081840152601f19601f8201169050808301925050509650505050505050602060405180830381600087803b15801561362857600080fd5b505af115801561363c573d6000803e3d6000fd5b505050506040513d602081101561365257600080fd5b505183518490600190811061366357fe5b6020026020010181815250505b888360018551038151811061368157fe5b60200260200101511015611c415760405162461bcd60e51b815260040180806020018281038252602a815260200180614c11602a913960400191505060405180910390fd5b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180516001600160e01b031663a9059cbb60e01b1781529251825160009485949389169392918291908083835b602083106137425780518252601f199092019160209182019101613723565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d80600081146137a4576040519150601f19603f3d011682016040523d82523d6000602084013e6137a9565b606091505b50915091508180156137d75750805115806137d757508080602001905160208110156137d457600080fd5b50515b613828576040805162461bcd60e51b815260206004820152601f60248201527f5472616e7366657248656c7065723a205452414e534645525f4641494c454400604482015290519081900360640190fd5b5050505050565b604080516000808252602082019092526001600160a01b0384169083906040518082805190602001908083835b6020831061387b5780518252601f19909201916020918201910161385c565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d80600081146138dd576040519150601f19603f3d011682016040523d82523d6000602084013e6138e2565b606091505b50509050806139225760405162461bcd60e51b8152600401808060200182810382526023815260200180614d1c6023913960400191505060405180910390fd5b505050565b60008084116139675760405162461bcd60e51b815260040180806020018281038252602a815260200180614be7602a913960400191505060405180910390fd5b6000831180156139775750600082115b6139b25760405162461bcd60e51b8152600401808060200182810382526027815260200180614c616027913960400191505060405180910390fd5b60006139c0856126f7614abc565b905060006139ce8285614abc565b905060006139e8836139e288612710614abc565b9061421f565b90508082816139f357fe5b04979650505050505050565b6000806000613a0e858561474d565b604080516bffffffffffffffffffffffff19606094851b811660208084019190915293851b81166034830152825160288184030181526048830184528051908501206001600160f81b031960688401529a90941b9093166069840152607d8301989098527f486345174f0c880a75d64ac5bb327f91ab509c8f197c4f570b73c1b89f15f85b609d808401919091528851808403909101815260bd909201909752805196019590952095945050505050565b604080516001600160a01b0385811660248301528481166044830152606480830185905283518084039091018152608490920183526020820180516001600160e01b03166323b872dd60e01b178152925182516000948594938a169392918291908083835b60208310613b435780518252601f199092019160209182019101613b24565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114613ba5576040519150601f19603f3d011682016040523d82523d6000602084013e613baa565b606091505b5091509150818015613bd8575080511580613bd85750808060200190516020811015613bd557600080fd5b50515b613c135760405162461bcd60e51b8152600401808060200182810382526024815260200180614daa6024913960400191505060405180910390fd5b505050505050565b60005b600184510381101561407c576000613c5f858381518110613c3b57fe5b6020026020010151868460010181518110613c5257fe5b602002602001015161474d565b5090506000613cb87f000000000000000000000000977cfffece847529190e6771dfeacdd7b5659f9b878581518110613c9457fe5b6020026020010151888660010181518110613cab57fe5b60200260200101516139ff565b90506000806000836001600160a01b0316630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b158015613cf857600080fd5b505afa158015613d0c573d6000803e3d6000fd5b505050506040513d6060811015613d2257600080fd5b5080516020909101518a516001600160701b0392831694509116915060009081906001600160a01b038816908c908a908110613d5a57fe5b60200260200101516001600160a01b031614613d77578284613d7a565b83835b915091506000613de4838d8b81518110613d9057fe5b60200260200101516001600160a01b03166370a082318a6040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561102957600080fd5b90508b5160021415613eca57866001600160a01b031663d4b32b508d838e8e6040518563ffffffff1660e01b81526004018080602001858152602001846001600160a01b031681526020018315158152602001828103825286818151815260200191508051906020019060200280838360005b83811015613e6f578181015183820152602001613e57565b5050505090500195505050505050602060405180830381600087803b158015613e9757600080fd5b505af1158015613eab573d6000803e3d6000fd5b505050506040513d6020811015613ec157600080fd5b50519550613ed8565b613ed5818484613927565b95505b5050505050600080846001600160a01b0316898781518110613ef657fe5b60200260200101516001600160a01b031614613f1457826000613f18565b6000835b91509150600060028a51038710613f2f5788613f79565b613f797f000000000000000000000000977cfffece847529190e6771dfeacdd7b5659f9b8b8960010181518110613f6257fe5b60200260200101518c8a60020181518110613cab57fe5b604080516000808252602082019283905263022c0d9f60e01b835260248201878152604483018790526001600160a01b038086166064850152608060848501908152845160a48601819052969750908b169563022c0d9f958a958a958a9591949193919260c486019290918190849084905b83811015614003578181015183820152602001613feb565b50505050905090810190601f1680156140305780820380516001836020036101000a031916815260200191505b5095505050505050600060405180830381600087803b15801561405257600080fd5b505af1158015614066573d6000803e3d6000fd5b505060019098019750613c1e9650505050505050565b50505050565b808203828111156110d3576040805162461bcd60e51b815260206004820152601560248201527464732d6d6174682d7375622d756e646572666c6f7760581b604482015290519081900360640190fd5b606060028251101561412b576040805162461bcd60e51b815260206004820152601d60248201527f4b696e67537761704c6962726172793a20494e56414c49445f50415448000000604482015290519081900360640190fd5b815167ffffffffffffffff8111801561414357600080fd5b5060405190808252806020026020018201604052801561416d578160200160208202803683370190505b509050828160018351038151811061418157fe5b60209081029190910101528151600019015b8015614217576000806141d0878660018603815181106141af57fe5b60200260200101518786815181106141c357fe5b6020026020010151614b1f565b915091506141f28484815181106141e357fe5b60200260200101518383614498565b84600185038151811061420157fe5b6020908102919091010152505060001901614193565b509392505050565b808201828110156110d3576040805162461bcd60e51b815260206004820152601460248201527364732d6d6174682d6164642d6f766572666c6f7760601b604482015290519081900360640190fd5b60005b600183510381101561407c5760008084838151811061428c57fe5b60200260200101518584600101815181106142a357fe5b60200260200101519150915060006142bb838361474d565b50905060008785600101815181106142cf57fe5b60200260200101519050600080836001600160a01b0316866001600160a01b0316146142fd57826000614301565b6000835b91509150600060028a51038810614318578861434c565b61434c7f000000000000000000000000977cfffece847529190e6771dfeacdd7b5659f9b878c8b60020181518110613cab57fe5b90506143797f000000000000000000000000977cfffece847529190e6771dfeacdd7b5659f9b88886139ff565b6001600160a01b031663022c0d9f84848460006040519080825280601f01601f1916602001820160405280156143b6576020820181803683370190505b506040518563ffffffff1660e01b815260040180858152602001848152602001836001600160a01b0316815260200180602001828103825283818151815260200191508051906020019080838360005b8381101561441e578181015183820152602001614406565b50505050905090810190601f16801561444b5780820380516001836020036101000a031916815260200191505b5095505050505050600060405180830381600087803b15801561446d57600080fd5b505af1158015614481573d6000803e3d6000fd5b505060019099019850614271975050505050505050565b60008084116144d85760405162461bcd60e51b815260040180806020018281038252602b815260200180614d3f602b913960400191505060405180910390fd5b6000831180156144e85750600082115b6145235760405162461bcd60e51b8152600401808060200182810382526027815260200180614c616027913960400191505060405180910390fd5b600061453b6127106145358688614abc565b90614abc565b9050600061454f6126f76145358689614082565b9050614566600182848161455f57fe5b049061421f565b9695505050505050565b60606002825110156145c9576040805162461bcd60e51b815260206004820152601d60248201527f4b696e67537761704c6962726172793a20494e56414c49445f50415448000000604482015290519081900360640190fd5b815167ffffffffffffffff811180156145e157600080fd5b5060405190808252806020026020018201604052801561460b578160200160208202803683370190505b509050828160008151811061461c57fe5b60200260200101818152505060005b6001835103811015614217576000806146618786858151811061464a57fe5b60200260200101518786600101815181106141c357fe5b9150915061468384848151811061467457fe5b60200260200101518383613927565b84846001018151811061469257fe5b6020908102919091010152505060010161462b565b60008084116146e75760405162461bcd60e51b8152600401808060200182810382526024815260200180614cf86024913960400191505060405180910390fd5b6000831180156146f75750600082115b6147325760405162461bcd60e51b8152600401808060200182810382526027815260200180614c616027913960400191505060405180910390fd5b8261473d8584614abc565b8161474457fe5b04949350505050565b600080826001600160a01b0316846001600160a01b031614156147a15760405162461bcd60e51b8152600401808060200182810382526024815260200180614dce6024913960400191505060405180910390fd5b826001600160a01b0316846001600160a01b0316106147c15782846147c4565b83835b90925090506001600160a01b038216614824576040805162461bcd60e51b815260206004820152601d60248201527f4b696e67537761704c6962726172793a205a45524f5f41444452455353000000604482015290519081900360640190fd5b9250929050565b60008060006001600160a01b03167f000000000000000000000000977cfffece847529190e6771dfeacdd7b5659f9b6001600160a01b031663e6a439058a8a6040518363ffffffff1660e01b815260040180836001600160a01b03168152602001826001600160a01b031681526020019250505060206040518083038186803b1580156148b757600080fd5b505afa1580156148cb573d6000803e3d6000fd5b505050506040513d60208110156148e157600080fd5b50516001600160a01b0316141561499f577f000000000000000000000000977cfffece847529190e6771dfeacdd7b5659f9b6001600160a01b031663c9c6539689896040518363ffffffff1660e01b815260040180836001600160a01b03168152602001826001600160a01b0316815260200192505050602060405180830381600087803b15801561497257600080fd5b505af1158015614986573d6000803e3d6000fd5b505050506040513d602081101561499c57600080fd5b50505b6000806149cd7f000000000000000000000000977cfffece847529190e6771dfeacdd7b5659f9b8b8b614b1f565b915091508160001480156149df575080155b156149ef57879350869250614aaf565b60006149fc8984846146a7565b9050878111614a4f5785811015614a445760405162461bcd60e51b8152600401808060200182810382526025815260200180614c886025913960400191505060405180910390fd5b889450925082614aad565b6000614a5c8984866146a7565b905089811115614a6857fe5b87811015614aa75760405162461bcd60e51b8152600401808060200182810382526025815260200180614cad6025913960400191505060405180910390fd5b94508793505b505b5050965096945050505050565b6000811580614ad757505080820282828281614ad457fe5b04145b6110d3576040805162461bcd60e51b815260206004820152601460248201527364732d6d6174682d6d756c2d6f766572666c6f7760601b604482015290519081900360640190fd5b6000806000614b2e858561474d565b509050600080614b3f8888886139ff565b6001600160a01b0316630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b158015614b7757600080fd5b505afa158015614b8b573d6000803e3d6000fd5b505050506040513d6060811015614ba157600080fd5b5080516020909101516001600160701b0391821693501690506001600160a01b0387811690841614614bd4578082614bd7565b81815b9099909850965050505050505056fe4b696e67537761704c6962726172793a20494e53554646494349454e545f494e5055545f414d4f554e544b696e6753776170526f757465723a20494e53554646494349454e545f4f55545055545f414d4f554e544b696e675377617070526f757465723a20494e53554646494349454e545f415f414d4f554e544b696e67537761704c6962726172793a20494e53554646494349454e545f4c49515549444954594b696e6753776170526f757465723a20494e53554646494349454e545f425f414d4f554e544b696e6753776170526f757465723a20494e53554646494349454e545f415f414d4f554e544b696e6753776170526f757465723a204558434553534956455f494e5055545f414d4f554e544b696e67537761704c6962726172793a20494e53554646494349454e545f414d4f554e545472616e7366657248656c7065723a204554485f5452414e534645525f4641494c45444b696e67537761704c6962726172793a20494e53554646494349454e545f4f55545055545f414d4f554e544b696e6753776170526f757465723a20455850495245440000000000000000004b696e6753776170526f757465723a20494e56414c49445f50415448000000005472616e7366657248656c7065723a205452414e534645525f46524f4d5f4641494c45444b696e67537761704c6962726172793a204944454e544943414c5f414444524553534553a26469706673582212203f070c25914294c9e7264e31f39433e8f9853717ffdab8350ce1b3ebb37d9ed564736f6c63430007060033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000977cfffece847529190e6771dfeacdd7b5659f9b0000000000000000000000006a023ccd1ff6f2045c3309768ead9e68f978f6e1
-----Decoded View---------------
Arg [0] : _factory (address): 0x977cFffecE847529190e6771DfEacDd7B5659f9B
Arg [1] : _WETH (address): 0x6A023CCd1ff6F2045C3309768eAd9E68F978f6e1
-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 000000000000000000000000977cfffece847529190e6771dfeacdd7b5659f9b
Arg [1] : 0000000000000000000000006a023ccd1ff6f2045c3309768ead9e68f978f6e1
Loading...
Loading
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 34 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.