Contract Overview
Balance:
0 ETH
ETH Value:
$0.00
My Name Tag:
Not Available
[ Download CSV Export ]
Latest 25 internal transaction
[ Download CSV Export ]
Contract Name:
SugarSwapRouter
Compiler Version
v0.6.12+commit.27d51765
Contract Source Code (Solidity)
/** *Submitted for verification at Arbiscan on 2023-01-04 */ // SPDX-License-Identifier: GPL-3.0 pragma solidity >=0.5.0; interface ISugarSwapBEP20 { 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); } pragma solidity >=0.5.0; interface IWETH { function deposit() external payable; function transfer(address to, uint value) external returns (bool); function withdraw(uint) external; } pragma solidity >=0.5.0; interface ISugarSwapFactory { event PairCreated(address indexed token0, address indexed token1, address pair, uint); function feeTo() external view returns (address); function feeToSetter() external view returns (address); function getPair(address tokenA, address tokenB) external view returns (address pair); function allPairs(uint) external view returns (address pair); function allPairsLength() external view returns (uint); function createPair(address tokenA, address tokenB) external returns (address pair); function setFeeTo(address) external; function setFeeToSetter(address) external; } pragma solidity >=0.6.2; interface ISugarSwapRouter { function factory() external pure returns (address); function WETH() external pure returns (address); function addLiquidity( address tokenA, address tokenB, uint amountADesired, uint amountBDesired, uint amountAMin, uint amountBMin, address to, uint deadline ) external returns (uint amountA, uint amountB, uint liquidity); function addLiquidityETH( address token, uint amountTokenDesired, uint amountTokenMin, uint amountETHMin, address to, uint deadline ) external payable returns (uint amountToken, uint amountETH, uint liquidity); function removeLiquidity( address tokenA, address tokenB, uint liquidity, uint amountAMin, uint amountBMin, address to, uint deadline ) external returns (uint amountA, uint amountB); function removeLiquidityETH( address token, uint liquidity, uint amountTokenMin, uint amountETHMin, address to, uint deadline ) external returns (uint amountToken, uint amountETH); function removeLiquidityWithPermit( address tokenA, address tokenB, uint liquidity, uint amountAMin, uint amountBMin, address to, uint deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external returns (uint amountA, uint amountB); function removeLiquidityETHWithPermit( address token, uint liquidity, uint amountTokenMin, uint amountETHMin, address to, uint deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external returns (uint amountToken, uint amountETH); function swapExactTokensForTokens( uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline ) external returns (uint[] memory amounts); function swapTokensForExactTokens( uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline ) external returns (uint[] memory amounts); function swapExactETHForTokens(uint amountOutMin, address[] calldata path, address to, uint deadline) external payable returns (uint[] memory amounts); function swapTokensForExactETH(uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline) external returns (uint[] memory amounts); function swapExactTokensForETH(uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline) external returns (uint[] memory amounts); function swapETHForExactTokens(uint amountOut, address[] calldata path, address to, uint deadline) external payable returns (uint[] memory amounts); function quote(uint amountA, uint reserveA, uint reserveB) external pure returns (uint amountB); function getAmountOut(uint amountIn, uint reserveIn, uint reserveOut) external pure returns (uint amountOut); function getAmountIn(uint amountOut, uint reserveIn, uint reserveOut) external pure returns (uint amountIn); function getAmountsOut(uint amountIn, address[] calldata path) external view returns (uint[] memory amounts); function getAmountsIn(uint amountOut, address[] calldata path) external view returns (uint[] memory amounts); function removeLiquidityETHSupportingFeeOnTransferTokens( address token, uint liquidity, uint amountTokenMin, uint amountETHMin, address to, uint deadline ) external returns (uint amountETH); function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens( address token, uint liquidity, uint amountTokenMin, uint amountETHMin, address to, uint deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external returns (uint amountETH); function swapExactTokensForTokensSupportingFeeOnTransferTokens( uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline ) external; function swapExactETHForTokensSupportingFeeOnTransferTokens( uint amountOutMin, address[] calldata path, address to, uint deadline ) external payable; function swapExactTokensForETHSupportingFeeOnTransferTokens( uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline ) external; } pragma solidity >=0.5.0; interface ISugarSwapPair { event Approval(address indexed owner, address indexed spender, uint value); event Transfer(address indexed from, address indexed to, uint value); function name() external pure returns (string memory); function symbol() external pure returns (string memory); function decimals() external pure returns (uint8); function totalSupply() external view returns (uint); function balanceOf(address owner) external view returns (uint); function allowance(address owner, address spender) external view returns (uint); function approve(address spender, uint value) external returns (bool); function transfer(address to, uint value) external returns (bool); function transferFrom(address from, address to, uint value) external returns (bool); function DOMAIN_SEPARATOR() external view returns (bytes32); function PERMIT_TYPEHASH() external pure returns (bytes32); function nonces(address owner) external view returns (uint); function permit(address owner, address spender, uint value, uint deadline, uint8 v, bytes32 r, bytes32 s) external; event Mint(address indexed sender, uint amount0, uint amount1); event Burn(address indexed sender, uint amount0, uint amount1, address indexed to); event Swap( address indexed sender, uint amount0In, uint amount1In, uint amount0Out, uint amount1Out, address indexed to ); event Sync(uint112 reserve0, uint112 reserve1); function MINIMUM_LIQUIDITY() external pure returns (uint); function factory() external view returns (address); function token0() external view returns (address); function token1() external view returns (address); function getReserves() external view returns (uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast); function price0CumulativeLast() external view returns (uint); function price1CumulativeLast() external view returns (uint); function kLast() external view returns (uint); function mint(address to) external returns (uint liquidity); function burn(address to) external returns (uint amount0, uint amount1); function swap(uint amount0Out, uint amount1Out, address to, bytes calldata data) external; function skim(address to) external; function sync() external; function initialize(address, address) external; } pragma solidity >=0.6.0; // helper methods for interacting with ERC20 tokens and sending ETH that do not consistently return true/false library TransferHelper { function safeApprove(address token, address to, 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::safeApprove::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::safeTransfer::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::safeTransferFrom::TRANSFER_FROM_FAILED'); } function safeTransferETH(address to, uint value) internal { (bool success,) = to.call{value:value}(new bytes(0)); require(success, 'TransferHelper::safeTransferETH::BNB_TRANSFER_FAILED'); } } pragma solidity =0.6.12; // a library for performing overflow-safe math, courtesy of DappHub (https://github.com/dapphub/ds-math) library SugarSwapSafeMath { function add(uint x, uint y) internal pure returns (uint z) { require((z = x + y) >= x, 'SugarSwapSafeMath::add::ds-math-add-overflow'); } function sub(uint x, uint y) internal pure returns (uint z) { require((z = x - y) <= x, 'SugarSwapSafeMath::sub::ds-math-sub-underflow'); } function mul(uint x, uint y) internal pure returns (uint z) { require(y == 0 || (z = x * y) / y == x, 'SugarSwapSafeMath::mul::ds-math-mul-overflow'); } } pragma solidity >=0.5.0; library SugarSwapLibrary { using SugarSwapSafeMath 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, "SugarSwapLibrary::sortTokens::IDENTICAL_ADDRESSES"); (token0, token1) = tokenA < tokenB ? (tokenA, tokenB) : (tokenB, tokenA); require(token0 != address(0), "SugarSwapLibrary::sortTokens::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)), hex"1c12c6027929a7a45a05eac77636e98ac3916558c848f89175d3f798d12cb8a8" // 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, ) = ISugarSwapPair(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, "SugarSwapLibrary::quote::INSUFFICIENT_AMOUNT"); require(reserveA > 0 && reserveB > 0, "SugarSwapLibrary::quote::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, "SugarSwapLibrary::getAmountOut::INSUFFICIENT_INPUT_AMOUNT"); require(reserveIn > 0 && reserveOut > 0, "SugarSwapLibrary::getAmountOut::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, "SugarSwapLibrary::getAmountIn::INSUFFICIENT_OUTPUT_AMOUNT"); require(reserveIn > 0 && reserveOut > 0, "SugarSwapLibrary::getAmountIn::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, "SugarSwapLibrary::getAmountsOut::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, "SugarSwapLibrary::getAmountsIn::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); } } } pragma solidity =0.6.12; contract SugarSwapRouter is ISugarSwapRouter { using SugarSwapSafeMath for uint256; address public immutable override factory; address public immutable override WETH; modifier ensure(uint256 deadline) { require(deadline >= block.timestamp, "SugarSwapRouter::ensure::EXPIRED"); _; } constructor(address _factory, address _WETH) public { 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 (ISugarSwapFactory(factory).getPair(tokenA, tokenB) == address(0)) { ISugarSwapFactory(factory).createPair(tokenA, tokenB); } (uint256 reserveA, uint256 reserveB) = SugarSwapLibrary.getReserves(factory, tokenA, tokenB); if (reserveA == 0 && reserveB == 0) { (amountA, amountB) = (amountADesired, amountBDesired); } else { uint256 amountBOptimal = SugarSwapLibrary.quote(amountADesired, reserveA, reserveB); if (amountBOptimal <= amountBDesired) { require(amountBOptimal >= amountBMin, "SugarSwapRouter::_addLiquidity::INSUFFICIENT_B_AMOUNT"); (amountA, amountB) = (amountADesired, amountBOptimal); } else { uint256 amountAOptimal = SugarSwapLibrary.quote(amountBDesired, reserveB, reserveA); assert(amountAOptimal <= amountADesired); require(amountAOptimal >= amountAMin, "SugarSwapRouter::_addLiquidity::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 = SugarSwapLibrary.pairFor(factory, tokenA, tokenB); TransferHelper.safeTransferFrom(tokenA, msg.sender, pair, amountA); TransferHelper.safeTransferFrom(tokenB, msg.sender, pair, amountB); liquidity = ISugarSwapPair(pair).mint(to); } function addLiquidityETH( address token, uint256 amountTokenDesired, uint256 amountTokenMin, uint256 amountETHMin, address to, uint256 deadline ) external payable virtual override ensure(deadline) returns ( uint256 amountToken, uint256 amountETH, uint256 liquidity ) { (amountToken, amountETH) = _addLiquidity(token, WETH, amountTokenDesired, msg.value, amountTokenMin, amountETHMin); address pair = SugarSwapLibrary.pairFor(factory, token, WETH); TransferHelper.safeTransferFrom(token, msg.sender, pair, amountToken); IWETH(WETH).deposit{ value: amountETH }(); assert(IWETH(WETH).transfer(pair, amountETH)); liquidity = ISugarSwapPair(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 = SugarSwapLibrary.pairFor(factory, tokenA, tokenB); ISugarSwapPair(pair).transferFrom(msg.sender, pair, liquidity); // send liquidity to pair (uint256 amount0, uint256 amount1) = ISugarSwapPair(pair).burn(to); (address token0, ) = SugarSwapLibrary.sortTokens(tokenA, tokenB); (amountA, amountB) = tokenA == token0 ? (amount0, amount1) : (amount1, amount0); require(amountA >= amountAMin, "SugarSwapRouter::removeLiquidity::INSUFFICIENT_A_AMOUNT"); require(amountB >= amountBMin, "SugarSwapRouter::removeLiquidity::INSUFFICIENT_B_AMOUNT"); } function removeLiquidityETH( address token, uint256 liquidity, uint256 amountTokenMin, uint256 amountETHMin, address to, uint256 deadline ) public virtual override ensure(deadline) returns (uint256 amountToken, uint256 amountETH) { (amountToken, amountETH) = removeLiquidity( token, WETH, liquidity, amountTokenMin, amountETHMin, address(this), deadline ); TransferHelper.safeTransfer(token, to, amountToken); IWETH(WETH).withdraw(amountETH); TransferHelper.safeTransferETH(to, amountETH); } function removeLiquidityWithPermit( address tokenA, address tokenB, uint256 liquidity, uint256 amountAMin, uint256 amountBMin, address to, uint256 deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external virtual override returns (uint256 amountA, uint256 amountB) { address pair = SugarSwapLibrary.pairFor(factory, tokenA, tokenB); uint256 value = approveMax ? uint256(-1) : liquidity; ISugarSwapPair(pair).permit(msg.sender, address(this), value, deadline, v, r, s); (amountA, amountB) = removeLiquidity(tokenA, tokenB, liquidity, amountAMin, amountBMin, to, deadline); } function removeLiquidityETHWithPermit( address token, uint256 liquidity, uint256 amountTokenMin, uint256 amountETHMin, address to, uint256 deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external virtual override returns (uint256 amountToken, uint256 amountETH) { address pair = SugarSwapLibrary.pairFor(factory, token, WETH); uint256 value = approveMax ? uint256(-1) : liquidity; ISugarSwapPair(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, ISugarSwapBEP20(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 = SugarSwapLibrary.pairFor(factory, token, WETH); uint256 value = approveMax ? uint256(-1) : liquidity; ISugarSwapPair(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, ) = SugarSwapLibrary.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 ? SugarSwapLibrary.pairFor(factory, output, path[i + 2]) : _to; ISugarSwapPair(SugarSwapLibrary.pairFor(factory, input, output)).swap(amount0Out, amount1Out, to, new bytes(0)); } } function swapExactTokensForTokens( uint256 amountIn, uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external virtual override ensure(deadline) returns (uint256[] memory amounts) { amounts = SugarSwapLibrary.getAmountsOut(factory, amountIn, path); require( amounts[amounts.length - 1] >= amountOutMin, "SugarSwapRouter::swapExactTokensForTokens::INSUFFICIENT_OUTPUT_AMOUNT" ); TransferHelper.safeTransferFrom( path[0], msg.sender, SugarSwapLibrary.pairFor(factory, path[0], path[1]), amounts[0] ); _swap(amounts, path, to); } function swapTokensForExactTokens( uint256 amountOut, uint256 amountInMax, address[] calldata path, address to, uint256 deadline ) external virtual override ensure(deadline) returns (uint256[] memory amounts) { amounts = SugarSwapLibrary.getAmountsIn(factory, amountOut, path); require(amounts[0] <= amountInMax, "SugarSwapRouter::swapTokensForExactTokens::EXCESSIVE_INPUT_AMOUNT"); TransferHelper.safeTransferFrom( path[0], msg.sender, SugarSwapLibrary.pairFor(factory, path[0], path[1]), amounts[0] ); _swap(amounts, path, to); } function swapExactETHForTokens( uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external payable virtual override ensure(deadline) returns (uint256[] memory amounts) { require(path[0] == WETH, "SugarSwapRouter::swapExactETHForTokens::INVALID_PATH"); amounts = SugarSwapLibrary.getAmountsOut(factory, msg.value, path); require( amounts[amounts.length - 1] >= amountOutMin, "SugarSwapRouter::swapExactETHForTokens::INSUFFICIENT_OUTPUT_AMOUNT" ); IWETH(WETH).deposit{ value: amounts[0] }(); assert(IWETH(WETH).transfer(SugarSwapLibrary.pairFor(factory, path[0], path[1]), amounts[0])); _swap(amounts, path, to); } function swapTokensForExactETH( uint256 amountOut, uint256 amountInMax, address[] calldata path, address to, uint256 deadline ) external virtual override ensure(deadline) returns (uint256[] memory amounts) { require(path[path.length - 1] == WETH, "SugarSwapRouter::swapTokensForExactETH::INVALID_PATH"); amounts = SugarSwapLibrary.getAmountsIn(factory, amountOut, path); require(amounts[0] <= amountInMax, "SugarSwapRouter::swapTokensForExactETH::EXCESSIVE_INPUT_AMOUNT"); TransferHelper.safeTransferFrom( path[0], msg.sender, SugarSwapLibrary.pairFor(factory, path[0], path[1]), amounts[0] ); _swap(amounts, path, address(this)); IWETH(WETH).withdraw(amounts[amounts.length - 1]); TransferHelper.safeTransferETH(to, amounts[amounts.length - 1]); } function swapExactTokensForETH( uint256 amountIn, uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external virtual override ensure(deadline) returns (uint256[] memory amounts) { require(path[path.length - 1] == WETH, "SugarSwapRouter::swapExactTokensForETH::INVALID_PATH"); amounts = SugarSwapLibrary.getAmountsOut(factory, amountIn, path); require( amounts[amounts.length - 1] >= amountOutMin, "SugarSwapRouter:swapExactTokensForETH::INSUFFICIENT_OUTPUT_AMOUNT" ); TransferHelper.safeTransferFrom( path[0], msg.sender, SugarSwapLibrary.pairFor(factory, path[0], path[1]), amounts[0] ); _swap(amounts, path, address(this)); IWETH(WETH).withdraw(amounts[amounts.length - 1]); TransferHelper.safeTransferETH(to, amounts[amounts.length - 1]); } function swapETHForExactTokens( uint256 amountOut, address[] calldata path, address to, uint256 deadline ) external payable virtual override ensure(deadline) returns (uint256[] memory amounts) { require(path[0] == WETH, "SugarSwapRouter::swapETHForExactTokens::INVALID_PATH"); amounts = SugarSwapLibrary.getAmountsIn(factory, amountOut, path); require(amounts[0] <= msg.value, "SugarSwapRouter::swapETHForExactTokens::EXCESSIVE_INPUT_AMOUNT"); IWETH(WETH).deposit{ value: amounts[0] }(); assert(IWETH(WETH).transfer(SugarSwapLibrary.pairFor(factory, path[0], path[1]), 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) internal virtual { for (uint256 i; i < path.length - 1; i++) { (address input, address output) = (path[i], path[i + 1]); (address token0, ) = SugarSwapLibrary.sortTokens(input, output); ISugarSwapPair pair = ISugarSwapPair(SugarSwapLibrary.pairFor(factory, input, output)); uint256 amountInput; uint256 amountOutput; { // scope to avoid stack too deep errors (uint256 reserve0, uint256 reserve1, ) = pair.getReserves(); (uint256 reserveInput, uint256 reserveOutput) = input == token0 ? (reserve0, reserve1) : (reserve1, reserve0); amountInput = ISugarSwapBEP20(input).balanceOf(address(pair)).sub(reserveInput); amountOutput = SugarSwapLibrary.getAmountOut(amountInput, reserveInput, reserveOutput); } (uint256 amount0Out, uint256 amount1Out) = input == token0 ? (uint256(0), amountOutput) : (amountOutput, uint256(0)); address to = i < path.length - 2 ? SugarSwapLibrary.pairFor(factory, output, path[i + 2]) : _to; pair.swap(amount0Out, amount1Out, to, new bytes(0)); } } function swapExactTokensForTokensSupportingFeeOnTransferTokens( uint256 amountIn, uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external virtual override ensure(deadline) { TransferHelper.safeTransferFrom(path[0], msg.sender, SugarSwapLibrary.pairFor(factory, path[0], path[1]), amountIn); uint256 balanceBefore = ISugarSwapBEP20(path[path.length - 1]).balanceOf(to); _swapSupportingFeeOnTransferTokens(path, to); require( ISugarSwapBEP20(path[path.length - 1]).balanceOf(to).sub(balanceBefore) >= amountOutMin, "SugarSwapRouter::swapExactTokensForTokensSupportingFeeOnTransferTokens::INSUFFICIENT_OUTPUT_AMOUNT" ); } function swapExactETHForTokensSupportingFeeOnTransferTokens( uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external payable virtual override ensure(deadline) { require(path[0] == WETH, "SugarSwapRouter::swapExactETHForTokensSupportingFeeOnTransferTokens::INVALID_PATH"); uint256 amountIn = msg.value; IWETH(WETH).deposit{ value: amountIn }(); assert(IWETH(WETH).transfer(SugarSwapLibrary.pairFor(factory, path[0], path[1]), amountIn)); uint256 balanceBefore = ISugarSwapBEP20(path[path.length - 1]).balanceOf(to); _swapSupportingFeeOnTransferTokens(path, to); require( ISugarSwapBEP20(path[path.length - 1]).balanceOf(to).sub(balanceBefore) >= amountOutMin, "SugarSwapRouter::swapExactETHForTokensSupportingFeeOnTransferTokens::INSUFFICIENT_OUTPUT_AMOUNT" ); } function swapExactTokensForETHSupportingFeeOnTransferTokens( uint256 amountIn, uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external virtual override ensure(deadline) { require( path[path.length - 1] == WETH, "SugarSwapRouter::swapExactTokensForETHSupportingFeeOnTransferTokens::INVALID_PATH" ); TransferHelper.safeTransferFrom(path[0], msg.sender, SugarSwapLibrary.pairFor(factory, path[0], path[1]), amountIn); _swapSupportingFeeOnTransferTokens(path, address(this)); uint256 amountOut = ISugarSwapBEP20(WETH).balanceOf(address(this)); require( amountOut >= amountOutMin, "SugarSwapRouter::swapExactTokensForETHSupportingFeeOnTransferTokens::INSUFFICIENT_OUTPUT_AMOUNT" ); IWETH(WETH).withdraw(amountOut); TransferHelper.safeTransferETH(to, amountOut); } // **** LIBRARY FUNCTIONS **** function quote( uint256 amountA, uint256 reserveA, uint256 reserveB ) external pure virtual override returns (uint256 amountB) { return SugarSwapLibrary.quote(amountA, reserveA, reserveB); } function getAmountOut( uint256 amountIn, uint256 reserveIn, uint256 reserveOut ) external pure virtual override returns (uint256 amountOut) { return SugarSwapLibrary.getAmountOut(amountIn, reserveIn, reserveOut); } function getAmountIn( uint256 amountOut, uint256 reserveIn, uint256 reserveOut ) external pure virtual override returns (uint256 amountIn) { return SugarSwapLibrary.getAmountIn(amountOut, reserveIn, reserveOut); } function getAmountsOut(uint256 amountIn, address[] memory path) external view virtual override returns (uint256[] memory amounts) { return SugarSwapLibrary.getAmountsOut(factory, amountIn, path); } function getAmountsIn(uint256 amountOut, address[] memory path) external view virtual override returns (uint256[] memory amounts) { return SugarSwapLibrary.getAmountsIn(factory, amountOut, path); } }
[{"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"}],"name":"swapETHForExactTokens","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactETHForTokens","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactETHForTokensSupportingFeeOnTransferTokens","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactTokensForETH","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"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"}],"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"}],"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"}],"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"}],"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"}],"name":"swapTokensForExactTokens","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
60c060405234801561001057600080fd5b5060405162004cb538038062004cb58339818101604052604081101561003557600080fd5b5080516020909101516001600160601b0319606092831b8116608052911b1660a05260805160601c60a05160601c614b30620001856000398061015f5280610ce45280610d1f5280610e16528061103052806113ba528061151c52806118cb52806119a25280611a7c5280611b4a5280611c8c5280611d145280611f505280611fcb528061207f528061214b52806121dc5280612250528061277052806129da5280612a305280612a645280612ad85280612c665280612da55280612e2d525080610ea05280610f7752806110f6528061112f528061126a528061144452806114fa528061166a5280611bd95280611d465280611ea0528061228252806124fd52806126f5528061271e528061274e52806128bb5280612a0e5280612cf55280612e5f52806136b952806136fc52806139c05280613b365280613f035280613fbc528061406f5250614b306000f3fe60806040526004361061014f5760003560e01c80638803dbee116100b6578063c45a01551161006f578063c45a015514610a10578063d06ca61f14610a25578063ded9382a14610ada578063e8e3370014610b4d578063f305d71914610bcd578063fb3bdb4114610c1357610188565b80638803dbee146107df578063ad5c464814610875578063ad615dec146108a6578063af2979eb146108dc578063b6f9de951461092f578063baa2abde146109b357610188565b80634a25d94a116101085780634a25d94a146104f05780635b0d5984146105865780635c11d795146105f9578063791ac9471461068f5780637ff36ab51461072557806385f8c259146107a957610188565b806302751cec1461018d578063054d50d4146101f957806318cbafe5146102415780631f00ca74146103275780632195995c146103dc57806338ed17391461045a57610188565b3661018857336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461018657fe5b005b600080fd5b34801561019957600080fd5b506101e0600480360360c08110156101b057600080fd5b506001600160a01b0381358116916020810135916040820135916060810135916080820135169060a00135610c97565b6040805192835260208301919091528051918290030190f35b34801561020557600080fd5b5061022f6004803603606081101561021c57600080fd5b5080359060208101359060400135610db1565b60408051918252519081900360200190f35b34801561024d57600080fd5b506102d7600480360360a081101561026457600080fd5b813591602081013591810190606081016040820135600160201b81111561028a57600080fd5b82018360208201111561029c57600080fd5b803590602001918460208302840111600160201b831117156102bd57600080fd5b91935091506001600160a01b038135169060200135610dc6565b60408051602080825283518183015283519192839290830191858101910280838360005b838110156103135781810151838201526020016102fb565b505050509050019250505060405180910390f35b34801561033357600080fd5b506102d76004803603604081101561034a57600080fd5b81359190810190604081016020820135600160201b81111561036b57600080fd5b82018360208201111561037d57600080fd5b803590602001918460208302840111600160201b8311171561039e57600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295506110ef945050505050565b3480156103e857600080fd5b506101e0600480360361016081101561040057600080fd5b506001600160a01b038135811691602081013582169160408201359160608101359160808201359160a08101359091169060c08101359060e081013515159060ff6101008201351690610120810135906101400135611125565b34801561046657600080fd5b506102d7600480360360a081101561047d57600080fd5b813591602081013591810190606081016040820135600160201b8111156104a357600080fd5b8201836020820111156104b557600080fd5b803590602001918460208302840111600160201b831117156104d657600080fd5b91935091506001600160a01b03813516906020013561121f565b3480156104fc57600080fd5b506102d7600480360360a081101561051357600080fd5b813591602081013591810190606081016040820135600160201b81111561053957600080fd5b82018360208201111561054b57600080fd5b803590602001918460208302840111600160201b8311171561056c57600080fd5b91935091506001600160a01b03813516906020013561136a565b34801561059257600080fd5b5061022f60048036036101408110156105aa57600080fd5b506001600160a01b0381358116916020810135916040820135916060810135916080820135169060a08101359060c081013515159060ff60e082013516906101008101359061012001356114f2565b34801561060557600080fd5b50610186600480360360a081101561061c57600080fd5b813591602081013591810190606081016040820135600160201b81111561064257600080fd5b82018360208201111561065457600080fd5b803590602001918460208302840111600160201b8311171561067557600080fd5b91935091506001600160a01b038135169060200135611600565b34801561069b57600080fd5b50610186600480360360a08110156106b257600080fd5b813591602081013591810190606081016040820135600160201b8111156106d857600080fd5b8201836020820111156106ea57600080fd5b803590602001918460208302840111600160201b8311171561070b57600080fd5b91935091506001600160a01b03813516906020013561187d565b6102d76004803603608081101561073b57600080fd5b81359190810190604081016020820135600160201b81111561075c57600080fd5b82018360208201111561076e57600080fd5b803590602001918460208302840111600160201b8311171561078f57600080fd5b91935091506001600160a01b038135169060200135611b02565b3480156107b557600080fd5b5061022f600480360360608110156107cc57600080fd5b5080359060208101359060400135611e48565b3480156107eb57600080fd5b506102d7600480360360a081101561080257600080fd5b813591602081013591810190606081016040820135600160201b81111561082857600080fd5b82018360208201111561083a57600080fd5b803590602001918460208302840111600160201b8311171561085b57600080fd5b91935091506001600160a01b038135169060200135611e55565b34801561088157600080fd5b5061088a611f4e565b604080516001600160a01b039092168252519081900360200190f35b3480156108b257600080fd5b5061022f600480360360608110156108c957600080fd5b5080359060208101359060400135611f72565b3480156108e857600080fd5b5061022f600480360360c08110156108ff57600080fd5b506001600160a01b0381358116916020810135916040820135916060810135916080820135169060a00135611f7f565b6101866004803603608081101561094557600080fd5b81359190810190604081016020820135600160201b81111561096657600080fd5b82018360208201111561097857600080fd5b803590602001918460208302840111600160201b8311171561099957600080fd5b91935091506001600160a01b038135169060200135612105565b3480156109bf57600080fd5b506101e0600480360360e08110156109d657600080fd5b506001600160a01b038135811691602081013582169160408201359160608101359160808201359160a08101359091169060c001356124af565b348015610a1c57600080fd5b5061088a6126f3565b348015610a3157600080fd5b506102d760048036036040811015610a4857600080fd5b81359190810190604081016020820135600160201b811115610a6957600080fd5b820183602082011115610a7b57600080fd5b803590602001918460208302840111600160201b83111715610a9c57600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550612717945050505050565b348015610ae657600080fd5b506101e06004803603610140811015610afe57600080fd5b506001600160a01b0381358116916020810135916040820135916060810135916080820135169060a08101359060c081013515159060ff60e08201351690610100810135906101200135612744565b348015610b5957600080fd5b50610baf6004803603610100811015610b7157600080fd5b506001600160a01b038135811691602081013582169160408201359160608101359160808201359160a08101359160c0820135169060e00135612858565b60408051938452602084019290925282820152519081900360600190f35b610baf600480360360c0811015610be357600080fd5b506001600160a01b0381358116916020810135916040820135916060810135916080820135169060a0013561298b565b6102d760048036036080811015610c2957600080fd5b81359190810190604081016020820135600160201b811115610c4a57600080fd5b820183602082011115610c5c57600080fd5b803590602001918460208302840111600160201b83111715610c7d57600080fd5b91935091506001600160a01b038135169060200135612c1e565b6000808242811015610cde576040805162461bcd60e51b815260206004820181905260248201526000805160206144c6833981519152604482015290519081900360640190fd5b610d0d897f00000000000000000000000000000000000000000000000000000000000000008a8a8a308a6124af565b9093509150610d1d898685612f93565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632e1a7d4d836040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b158015610d8357600080fd5b505af1158015610d97573d6000803e3d6000fd5b50505050610da585836130e7565b50965096945050505050565b6000610dbe8484846131df565b949350505050565b60608142811015610e0c576040805162461bcd60e51b815260206004820181905260248201526000805160206144c6833981519152604482015290519081900360640190fd5b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001686866000198101818110610e4657fe5b905060200201356001600160a01b03166001600160a01b031614610e9b5760405162461bcd60e51b81526004018080602001828103825260348152602001806143116034913960400191505060405180910390fd5b610ef97f0000000000000000000000000000000000000000000000000000000000000000898888808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152506132b792505050565b91508682600184510381518110610f0c57fe5b60200260200101511015610f515760405162461bcd60e51b81526004018080602001828103825260418152602001806144856041913960600191505060405180910390fd5b610fef86866000818110610f6157fe5b905060200201356001600160a01b031633610fd57f00000000000000000000000000000000000000000000000000000000000000008a8a6000818110610fa357fe5b905060200201356001600160a01b03168b8b6001818110610fc057fe5b905060200201356001600160a01b03166133ed565b85600081518110610fe257fe5b60200260200101516134ad565b61102e8287878080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525030925061360a915050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632e1a7d4d8360018551038151811061106d57fe5b60200260200101516040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b1580156110ab57600080fd5b505af11580156110bf573d6000803e3d6000fd5b505050506110e484836001855103815181106110d757fe5b60200260200101516130e7565b509695505050505050565b606061111c7f00000000000000000000000000000000000000000000000000000000000000008484613847565b90505b92915050565b60008060006111557f00000000000000000000000000000000000000000000000000000000000000008f8f6133ed565b9050600087611164578c611168565b6000195b6040805163d505accf60e01b815233600482015230602482015260448101839052606481018c905260ff8a16608482015260a4810189905260c4810188905290519192506001600160a01b0384169163d505accf9160e48082019260009290919082900301818387803b1580156111de57600080fd5b505af11580156111f2573d6000803e3d6000fd5b505050506112058f8f8f8f8f8f8f6124af565b809450819550505050509b509b9950505050505050505050565b60608142811015611265576040805162461bcd60e51b815260206004820181905260248201526000805160206144c6833981519152604482015290519081900360640190fd5b6112c37f0000000000000000000000000000000000000000000000000000000000000000898888808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152506132b792505050565b915086826001845103815181106112d657fe5b6020026020010151101561131b5760405162461bcd60e51b81526004018080602001828103825260458152602001806148936045913960600191505060405180910390fd5b61132b86866000818110610f6157fe5b6110e48287878080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525089925061360a915050565b606081428110156113b0576040805162461bcd60e51b815260206004820181905260248201526000805160206144c6833981519152604482015290519081900360640190fd5b6001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016868660001981018181106113ea57fe5b905060200201356001600160a01b03166001600160a01b03161461143f5760405162461bcd60e51b815260040180806020018281038252603481526020018061496c6034913960400191505060405180910390fd5b61149d7f00000000000000000000000000000000000000000000000000000000000000008988888080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061384792505050565b915086826000815181106114ad57fe5b60200260200101511115610f515760405162461bcd60e51b815260040180806020018281038252603e81526020018061478b603e913960400191505060405180910390fd5b6000806115407f00000000000000000000000000000000000000000000000000000000000000008d7f00000000000000000000000000000000000000000000000000000000000000006133ed565b905060008661154f578b611553565b6000195b6040805163d505accf60e01b815233600482015230602482015260448101839052606481018b905260ff8916608482015260a4810188905260c4810187905290519192506001600160a01b0384169163d505accf9160e48082019260009290919082900301818387803b1580156115c957600080fd5b505af11580156115dd573d6000803e3d6000fd5b505050506115ef8d8d8d8d8d8d611f7f565b9d9c50505050505050505050505050565b8042811015611644576040805162461bcd60e51b815260206004820181905260248201526000805160206144c6833981519152604482015290519081900360640190fd5b6116b98585600081811061165457fe5b905060200201356001600160a01b0316336116b37f00000000000000000000000000000000000000000000000000000000000000008989600081811061169657fe5b905060200201356001600160a01b03168a8a6001818110610fc057fe5b8a6134ad565b6000858560001981018181106116cb57fe5b905060200201356001600160a01b03166001600160a01b03166370a08231856040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561172757600080fd5b505afa15801561173b573d6000803e3d6000fd5b505050506040513d602081101561175157600080fd5b50516040805160208881028281018201909352888252929350611793929091899189918291850190849080828437600092019190915250889250613969915050565b8661183682888860001981018181106117a857fe5b905060200201356001600160a01b03166001600160a01b03166370a08231886040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561180457600080fd5b505afa158015611818573d6000803e3d6000fd5b505050506040513d602081101561182e57600080fd5b505190613c6b565b10156118735760405162461bcd60e51b8152600401808060200182810382526062815260200180614a386062913960800191505060405180910390fd5b5050505050505050565b80428110156118c1576040805162461bcd60e51b815260206004820181905260248201526000805160206144c6833981519152604482015290519081900360640190fd5b6001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016858560001981018181106118fb57fe5b905060200201356001600160a01b03166001600160a01b0316146119505760405162461bcd60e51b81526004018080602001828103825260518152602001806145376051913960600191505060405180910390fd5b6119608585600081811061165457fe5b61199e858580806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250309250613969915050565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015611a0d57600080fd5b505afa158015611a21573d6000803e3d6000fd5b505050506040513d6020811015611a3757600080fd5b5051905086811015611a7a5760405162461bcd60e51b815260040180806020018281038252605f8152602001806146cc605f913960600191505060405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632e1a7d4d826040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b158015611ae057600080fd5b505af1158015611af4573d6000803e3d6000fd5b5050505061187384826130e7565b60608142811015611b48576040805162461bcd60e51b815260206004820181905260248201526000805160206144c6833981519152604482015290519081900360640190fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031686866000818110611b7f57fe5b905060200201356001600160a01b03166001600160a01b031614611bd45760405162461bcd60e51b815260040180806020018281038252603481526020018061472b6034913960400191505060405180910390fd5b611c327f0000000000000000000000000000000000000000000000000000000000000000348888808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152506132b792505050565b91508682600184510381518110611c4557fe5b60200260200101511015611c8a5760405162461bcd60e51b81526004018080602001828103825260428152602001806145b46042913960600191505060405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db083600081518110611cc657fe5b60200260200101516040518263ffffffff1660e01b81526004016000604051808303818588803b158015611cf957600080fd5b505af1158015611d0d573d6000803e3d6000fd5b50505050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a9059cbb611d727f00000000000000000000000000000000000000000000000000000000000000008989600081811061169657fe5b84600081518110611d7f57fe5b60200260200101516040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050602060405180830381600087803b158015611dcd57600080fd5b505af1158015611de1573d6000803e3d6000fd5b505050506040513d6020811015611df757600080fd5b5051611dff57fe5b611e3e8287878080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525089925061360a915050565b5095945050505050565b6000610dbe848484613cad565b60608142811015611e9b576040805162461bcd60e51b815260206004820181905260248201526000805160206144c6833981519152604482015290519081900360640190fd5b611ef97f00000000000000000000000000000000000000000000000000000000000000008988888080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061384792505050565b91508682600081518110611f0957fe5b6020026020010151111561131b5760405162461bcd60e51b815260040180806020018281038252604181526020018061468b6041913960600191505060405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000081565b6000610dbe848484613d85565b60008142811015611fc5576040805162461bcd60e51b815260206004820181905260248201526000805160206144c6833981519152604482015290519081900360640190fd5b611ff4887f000000000000000000000000000000000000000000000000000000000000000089898930896124af565b90508092505061207d88858a6001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561204c57600080fd5b505afa158015612060573d6000803e3d6000fd5b505050506040513d602081101561207657600080fd5b5051612f93565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632e1a7d4d836040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b1580156120e357600080fd5b505af11580156120f7573d6000803e3d6000fd5b505050506110e484836130e7565b8042811015612149576040805162461bcd60e51b815260206004820181905260248201526000805160206144c6833981519152604482015290519081900360640190fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168585600081811061218057fe5b905060200201356001600160a01b03166001600160a01b0316146121d55760405162461bcd60e51b81526004018080602001828103825260518152602001806144e66051913960600191505060405180910390fd5b60003490507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db0826040518263ffffffff1660e01b81526004016000604051808303818588803b15801561223557600080fd5b505af1158015612249573d6000803e3d6000fd5b50505050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a9059cbb6122ae7f00000000000000000000000000000000000000000000000000000000000000008989600081811061169657fe5b836040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050602060405180830381600087803b1580156122f557600080fd5b505af1158015612309573d6000803e3d6000fd5b505050506040513d602081101561231f57600080fd5b505161232757fe5b60008686600019810181811061233957fe5b905060200201356001600160a01b03166001600160a01b03166370a08231866040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561239557600080fd5b505afa1580156123a9573d6000803e3d6000fd5b505050506040513d60208110156123bf57600080fd5b505160408051602089810282810182019093528982529293506124019290918a918a918291850190849080828437600092019190915250899250613969915050565b87612472828989600019810181811061241657fe5b905060200201356001600160a01b03166001600160a01b03166370a08231896040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561180457600080fd5b10156118735760405162461bcd60e51b815260040180806020018281038252605f81526020018061437e605f913960600191505060405180910390fd5b60008082428110156124f6576040805162461bcd60e51b815260206004820181905260248201526000805160206144c6833981519152604482015290519081900360640190fd5b60006125237f00000000000000000000000000000000000000000000000000000000000000008c8c6133ed565b604080516323b872dd60e01b81523360048201526001600160a01b03831660248201819052604482018d9052915192935090916323b872dd916064808201926020929091908290030181600087803b15801561257e57600080fd5b505af1158015612592573d6000803e3d6000fd5b505050506040513d60208110156125a857600080fd5b50506040805163226bf2d160e21b81526001600160a01b03888116600483015282516000938493928616926389afcb44926024808301939282900301818787803b1580156125f557600080fd5b505af1158015612609573d6000803e3d6000fd5b505050506040513d604081101561261f57600080fd5b508051602090910151909250905060006126398e8e613e2b565b509050806001600160a01b03168e6001600160a01b03161461265c57818361265f565b82825b90975095508a8710156126a35760405162461bcd60e51b81526004018080602001828103825260378152602001806149a06037913960400191505060405180910390fd5b898610156126e25760405162461bcd60e51b815260040180806020018281038252603781526020018061462a6037913960400191505060405180910390fd5b505050505097509795505050505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b606061111c7f000000000000000000000000000000000000000000000000000000000000000084846132b7565b60008060006127947f00000000000000000000000000000000000000000000000000000000000000008e7f00000000000000000000000000000000000000000000000000000000000000006133ed565b90506000876127a3578c6127a7565b6000195b6040805163d505accf60e01b815233600482015230602482015260448101839052606481018c905260ff8a16608482015260a4810189905260c4810188905290519192506001600160a01b0384169163d505accf9160e48082019260009290919082900301818387803b15801561281d57600080fd5b505af1158015612831573d6000803e3d6000fd5b505050506128438e8e8e8e8e8e610c97565b909f909e509c50505050505050505050505050565b600080600083428110156128a1576040805162461bcd60e51b815260206004820181905260248201526000805160206144c6833981519152604482015290519081900360640190fd5b6128af8c8c8c8c8c8c613ef3565b909450925060006128e17f00000000000000000000000000000000000000000000000000000000000000008e8e6133ed565b90506128ef8d3383886134ad565b6128fb8c3383876134ad565b806001600160a01b0316636a627842886040518263ffffffff1660e01b815260040180826001600160a01b03168152602001915050602060405180830381600087803b15801561294a57600080fd5b505af115801561295e573d6000803e3d6000fd5b505050506040513d602081101561297457600080fd5b5051949d939c50939a509198505050505050505050565b600080600083428110156129d4576040805162461bcd60e51b815260206004820181905260248201526000805160206144c6833981519152604482015290519081900360640190fd5b612a028a7f00000000000000000000000000000000000000000000000000000000000000008b348c8c613ef3565b90945092506000612a547f00000000000000000000000000000000000000000000000000000000000000008c7f00000000000000000000000000000000000000000000000000000000000000006133ed565b9050612a628b3383886134ad565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db0856040518263ffffffff1660e01b81526004016000604051808303818588803b158015612abd57600080fd5b505af1158015612ad1573d6000803e3d6000fd5b50505050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a9059cbb82866040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050602060405180830381600087803b158015612b4d57600080fd5b505af1158015612b61573d6000803e3d6000fd5b505050506040513d6020811015612b7757600080fd5b5051612b7f57fe5b806001600160a01b0316636a627842886040518263ffffffff1660e01b815260040180826001600160a01b03168152602001915050602060405180830381600087803b158015612bce57600080fd5b505af1158015612be2573d6000803e3d6000fd5b505050506040513d6020811015612bf857600080fd5b5051925034841015612c1057612c10338534036130e7565b505096509650969350505050565b60608142811015612c64576040805162461bcd60e51b815260206004820181905260248201526000805160206144c6833981519152604482015290519081900360640190fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031686866000818110612c9b57fe5b905060200201356001600160a01b03166001600160a01b031614612cf05760405162461bcd60e51b81526004018080602001828103825260348152602001806145f66034913960400191505060405180910390fd5b612d4e7f00000000000000000000000000000000000000000000000000000000000000008888888080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061384792505050565b91503482600081518110612d5e57fe5b60200260200101511115612da35760405162461bcd60e51b815260040180806020018281038252603e8152602001806143dd603e913960400191505060405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db083600081518110612ddf57fe5b60200260200101516040518263ffffffff1660e01b81526004016000604051808303818588803b158015612e1257600080fd5b505af1158015612e26573d6000803e3d6000fd5b50505050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a9059cbb612e8b7f00000000000000000000000000000000000000000000000000000000000000008989600081811061169657fe5b84600081518110612e9857fe5b60200260200101516040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050602060405180830381600087803b158015612ee657600080fd5b505af1158015612efa573d6000803e3d6000fd5b505050506040513d6020811015612f1057600080fd5b5051612f1857fe5b612f578287878080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525089925061360a915050565b81600081518110612f6457fe5b6020026020010151341115611e3e57611e3e3383600081518110612f8457fe5b602002602001015134036130e7565b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180516001600160e01b031663a9059cbb60e01b178152925182516000946060949389169392918291908083835b602083106130105780518252601f199092019160209182019101612ff1565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114613072576040519150601f19603f3d011682016040523d82523d6000602084013e613077565b606091505b50915091508180156130a55750805115806130a557508080602001905160208110156130a257600080fd5b50515b6130e05760405162461bcd60e51b815260040180806020018281038252602d8152602001806148d8602d913960400191505060405180910390fd5b5050505050565b604080516000808252602082019092526001600160a01b0384169083906040518082805190602001908083835b602083106131335780518252601f199092019160209182019101613114565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114613195576040519150601f19603f3d011682016040523d82523d6000602084013e61319a565b606091505b50509050806131da5760405162461bcd60e51b8152600401808060200182810382526034815260200180614a9a6034913960400191505060405180910390fd5b505050565b600080841161321f5760405162461bcd60e51b81526004018080602001828103825260398152602001806143456039913960400191505060405180910390fd5b60008311801561322f5750600082115b61326a5760405162461bcd60e51b81526004018080602001828103825260368152602001806149366036913960400191505060405180910390fd5b6000613278856126f7614184565b905060006132868285614184565b905060006132a08361329a88612710614184565b906141da565b90508082816132ab57fe5b04979650505050505050565b60606002825110156132fa5760405162461bcd60e51b815260040180806020018281038252602d8152602001806142e4602d913960400191505060405180910390fd5b815167ffffffffffffffff8111801561331257600080fd5b5060405190808252806020026020018201604052801561333c578160200160208202803683370190505b509050828160008151811061334d57fe5b60200260200101818152505060005b60018351038110156133e55760008061339f8786858151811061337b57fe5b602002602001015187866001018151811061339257fe5b602002602001015161421c565b915091506133c18484815181106133b257fe5b602002602001015183836131df565b8484600101815181106133d057fe5b6020908102919091010152505060010161335c565b509392505050565b60008060006133fc8585613e2b565b604080516bffffffffffffffffffffffff19606094851b811660208084019190915293851b81166034830152825160288184030181526048830184528051908501206001600160f81b031960688401529a90941b9093166069840152607d8301989098527f1c12c6027929a7a45a05eac77636e98ac3916558c848f89175d3f798d12cb8a8609d808401919091528851808403909101815260bd909201909752805196019590952095945050505050565b604080516001600160a01b0385811660248301528481166044830152606480830185905283518084039091018152608490920183526020820180516001600160e01b03166323b872dd60e01b17815292518251600094606094938a169392918291908083835b602083106135325780518252601f199092019160209182019101613513565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114613594576040519150601f19603f3d011682016040523d82523d6000602084013e613599565b606091505b50915091508180156135c75750805115806135c757508080602001905160208110156135c457600080fd5b50515b6136025760405162461bcd60e51b81526004018080602001828103825260368152602001806148246036913960400191505060405180910390fd5b505050505050565b60005b60018351038110156138415760008084838151811061362857fe5b602002602001015185846001018151811061363f57fe5b60200260200101519150915060006136578383613e2b565b509050600087856001018151811061366b57fe5b60200260200101519050600080836001600160a01b0316866001600160a01b0316146136995782600061369d565b6000835b91509150600060028a510388106136b457886136f5565b6136f57f0000000000000000000000000000000000000000000000000000000000000000878c8b600201815181106136e857fe5b60200260200101516133ed565b90506137227f000000000000000000000000000000000000000000000000000000000000000088886133ed565b6001600160a01b031663022c0d9f84848460006040519080825280601f01601f19166020018201604052801561375f576020820181803683370190505b506040518563ffffffff1660e01b815260040180858152602001848152602001836001600160a01b0316815260200180602001828103825283818151815260200191508051906020019080838360005b838110156137c75781810151838201526020016137af565b50505050905090810190601f1680156137f45780820380516001836020036101000a031916815260200191505b5095505050505050600060405180830381600087803b15801561381657600080fd5b505af115801561382a573d6000803e3d6000fd5b50506001909901985061360d975050505050505050565b50505050565b606060028251101561388a5760405162461bcd60e51b815260040180806020018281038252602c8152602001806149d7602c913960400191505060405180910390fd5b815167ffffffffffffffff811180156138a257600080fd5b506040519080825280602002602001820160405280156138cc578160200160208202803683370190505b50905082816001835103815181106138e057fe5b60209081029190910101528151600019015b80156133e5576000806139228786600186038151811061390e57fe5b602002602001015187868151811061339257fe5b9150915061394484848151811061393557fe5b60200260200101518383613cad565b84600185038151811061395357fe5b60209081029190910101525050600019016138f2565b60005b60018351038110156131da5760008084838151811061398757fe5b602002602001015185846001018151811061399e57fe5b60200260200101519150915060006139b68383613e2b565b50905060006139e67f000000000000000000000000000000000000000000000000000000000000000085856133ed565b9050600080600080846001600160a01b0316630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b158015613a2757600080fd5b505afa158015613a3b573d6000803e3d6000fd5b505050506040513d6060811015613a5157600080fd5b5080516020909101516001600160701b0391821693501690506000806001600160a01b038a811690891614613a87578284613a8a565b83835b91509150613adf828b6001600160a01b03166370a082318a6040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561180457600080fd5b9550613aec8683836131df565b945050505050600080856001600160a01b0316886001600160a01b031614613b1657826000613b1a565b6000835b91509150600060028c51038a10613b31578a613b65565b613b657f0000000000000000000000000000000000000000000000000000000000000000898e8d600201815181106136e857fe5b604080516000808252602082019283905263022c0d9f60e01b835260248201878152604483018790526001600160a01b038086166064850152608060848501908152845160a48601819052969750908c169563022c0d9f958a958a958a9591949193919260c486019290918190849084905b83811015613bef578181015183820152602001613bd7565b50505050905090810190601f168015613c1c5780820380516001836020036101000a031916815260200191505b5095505050505050600060405180830381600087803b158015613c3e57600080fd5b505af1158015613c52573d6000803e3d6000fd5b50506001909b019a5061396c9950505050505050505050565b8082038281111561111f5760405162461bcd60e51b815260040180806020018281038252602d815260200180614ace602d913960400191505060405180910390fd5b6000808411613ced5760405162461bcd60e51b815260040180806020018281038252603981526020018061485a6039913960400191505060405180910390fd5b600083118015613cfd5750600082115b613d385760405162461bcd60e51b81526004018080602001828103825260358152602001806144506035913960400191505060405180910390fd5b6000613d50612710613d4a8688614184565b90614184565b90506000613d646126f7613d4a8689613c6b565b9050613d7b6001828481613d7457fe5b04906141da565b9695505050505050565b6000808411613dc55760405162461bcd60e51b815260040180806020018281038252602c815260200180614588602c913960400191505060405180910390fd5b600083118015613dd55750600082115b613e105760405162461bcd60e51b815260040180806020018281038252602f8152602001806147c9602f913960400191505060405180910390fd5b82613e1b8584614184565b81613e2257fe5b04949350505050565b600080826001600160a01b0316846001600160a01b03161415613e7f5760405162461bcd60e51b81526004018080602001828103825260318152602001806149056031913960400191505060405180910390fd5b826001600160a01b0316846001600160a01b031610613e9f578284613ea2565b83835b90925090506001600160a01b038216613eec5760405162461bcd60e51b815260040180806020018281038252602a815260200180614661602a913960400191505060405180910390fd5b9250929050565b60008060006001600160a01b03167f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663e6a439058a8a6040518363ffffffff1660e01b815260040180836001600160a01b03168152602001826001600160a01b031681526020019250505060206040518083038186803b158015613f7f57600080fd5b505afa158015613f93573d6000803e3d6000fd5b505050506040513d6020811015613fa957600080fd5b50516001600160a01b03161415614067577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663c9c6539689896040518363ffffffff1660e01b815260040180836001600160a01b03168152602001826001600160a01b0316815260200192505050602060405180830381600087803b15801561403a57600080fd5b505af115801561404e573d6000803e3d6000fd5b505050506040513d602081101561406457600080fd5b50505b6000806140957f00000000000000000000000000000000000000000000000000000000000000008b8b61421c565b915091508160001480156140a7575080155b156140b757879350869250614177565b60006140c4898484613d85565b9050878111614117578581101561410c5760405162461bcd60e51b8152600401808060200182810382526035815260200180614a036035913960400191505060405180910390fd5b889450925082614175565b6000614124898486613d85565b90508981111561413057fe5b8781101561416f5760405162461bcd60e51b815260040180806020018281038252603581526020018061441b6035913960400191505060405180910390fd5b94508793505b505b5050965096945050505050565b600081158061419f5750508082028282828161419c57fe5b04145b61111f5760405162461bcd60e51b815260040180806020018281038252602c81526020018061475f602c913960400191505060405180910390fd5b8082018281101561111f5760405162461bcd60e51b815260040180806020018281038252602c8152602001806147f8602c913960400191505060405180910390fd5b600080600061422b8585613e2b565b50905060008061423c8888886133ed565b6001600160a01b0316630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b15801561427457600080fd5b505afa158015614288573d6000803e3d6000fd5b505050506040513d606081101561429e57600080fd5b5080516020909101516001600160701b0391821693501690506001600160a01b03878116908416146142d15780826142d4565b81815b9099909850965050505050505056fe5375676172537761704c6962726172793a3a676574416d6f756e74734f75743a3a494e56414c49445f50415448537567617253776170526f757465723a3a737761704578616374546f6b656e73466f724554483a3a494e56414c49445f504154485375676172537761704c6962726172793a3a676574416d6f756e744f75743a3a494e53554646494349454e545f494e5055545f414d4f554e54537567617253776170526f757465723a3a737761704578616374455448466f72546f6b656e73537570706f7274696e674665654f6e5472616e73666572546f6b656e733a3a494e53554646494349454e545f4f55545055545f414d4f554e54537567617253776170526f757465723a3a73776170455448466f724578616374546f6b656e733a3a4558434553534956455f494e5055545f414d4f554e54537567617253776170526f757465723a3a5f6164644c69717569646974793a3a494e53554646494349454e545f415f414d4f554e545375676172537761704c6962726172793a3a676574416d6f756e74496e3a3a494e53554646494349454e545f4c4951554944495459537567617253776170526f757465723a737761704578616374546f6b656e73466f724554483a3a494e53554646494349454e545f4f55545055545f414d4f554e54537567617253776170526f757465723a3a656e737572653a3a45585049524544537567617253776170526f757465723a3a737761704578616374455448466f72546f6b656e73537570706f7274696e674665654f6e5472616e73666572546f6b656e733a3a494e56414c49445f50415448537567617253776170526f757465723a3a737761704578616374546f6b656e73466f72455448537570706f7274696e674665654f6e5472616e73666572546f6b656e733a3a494e56414c49445f504154485375676172537761704c6962726172793a3a71756f74653a3a494e53554646494349454e545f414d4f554e54537567617253776170526f757465723a3a737761704578616374455448466f72546f6b656e733a3a494e53554646494349454e545f4f55545055545f414d4f554e54537567617253776170526f757465723a3a73776170455448466f724578616374546f6b656e733a3a494e56414c49445f50415448537567617253776170526f757465723a3a72656d6f76654c69717569646974793a3a494e53554646494349454e545f425f414d4f554e545375676172537761704c6962726172793a3a736f7274546f6b656e733a3a5a45524f5f41444452455353537567617253776170526f757465723a3a73776170546f6b656e73466f724578616374546f6b656e733a3a4558434553534956455f494e5055545f414d4f554e54537567617253776170526f757465723a3a737761704578616374546f6b656e73466f72455448537570706f7274696e674665654f6e5472616e73666572546f6b656e733a3a494e53554646494349454e545f4f55545055545f414d4f554e54537567617253776170526f757465723a3a737761704578616374455448466f72546f6b656e733a3a494e56414c49445f50415448537567617253776170536166654d6174683a3a6d756c3a3a64732d6d6174682d6d756c2d6f766572666c6f77537567617253776170526f757465723a3a73776170546f6b656e73466f7245786163744554483a3a4558434553534956455f494e5055545f414d4f554e545375676172537761704c6962726172793a3a71756f74653a3a494e53554646494349454e545f4c4951554944495459537567617253776170536166654d6174683a3a6164643a3a64732d6d6174682d6164642d6f766572666c6f775472616e7366657248656c7065723a3a736166655472616e7366657246726f6d3a3a5452414e534645525f46524f4d5f4641494c45445375676172537761704c6962726172793a3a676574416d6f756e74496e3a3a494e53554646494349454e545f4f55545055545f414d4f554e54537567617253776170526f757465723a3a737761704578616374546f6b656e73466f72546f6b656e733a3a494e53554646494349454e545f4f55545055545f414d4f554e545472616e7366657248656c7065723a3a736166655472616e736665723a3a5452414e534645525f4641494c45445375676172537761704c6962726172793a3a736f7274546f6b656e733a3a4944454e544943414c5f4144445245535345535375676172537761704c6962726172793a3a676574416d6f756e744f75743a3a494e53554646494349454e545f4c4951554944495459537567617253776170526f757465723a3a73776170546f6b656e73466f7245786163744554483a3a494e56414c49445f50415448537567617253776170526f757465723a3a72656d6f76654c69717569646974793a3a494e53554646494349454e545f415f414d4f554e545375676172537761704c6962726172793a3a676574416d6f756e7473496e3a3a494e56414c49445f50415448537567617253776170526f757465723a3a5f6164644c69717569646974793a3a494e53554646494349454e545f425f414d4f554e54537567617253776170526f757465723a3a737761704578616374546f6b656e73466f72546f6b656e73537570706f7274696e674665654f6e5472616e73666572546f6b656e733a3a494e53554646494349454e545f4f55545055545f414d4f554e545472616e7366657248656c7065723a3a736166655472616e736665724554483a3a424e425f5452414e534645525f4641494c4544537567617253776170536166654d6174683a3a7375623a3a64732d6d6174682d7375622d756e646572666c6f77a26469706673582212205b3acaaca553f989097bc46638762fe6d0c8abdf10bf3021c1cc09de5e5a480364736f6c634300060c00330000000000000000000000001486397b3c0e6feb8c483fad2f03e8c404caede700000000000000000000000082af49447d8a07e3bd95bd0d56f35241523fbab1
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000001486397b3c0e6feb8c483fad2f03e8c404caede700000000000000000000000082af49447d8a07e3bd95bd0d56f35241523fbab1
-----Decoded View---------------
Arg [0] : _factory (address): 0x1486397b3c0e6feb8c483fad2f03e8c404caede7
Arg [1] : _WETH (address): 0x82af49447d8a07e3bd95bd0d56f35241523fbab1
-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 0000000000000000000000001486397b3c0e6feb8c483fad2f03e8c404caede7
Arg [1] : 00000000000000000000000082af49447d8a07e3bd95bd0d56f35241523fbab1
Deployed ByteCode Sourcemap
15450:18243:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15915:10;-1:-1:-1;;;;;15929:4:0;15915:18;;15908:26;;;;15450:18243;;;;;19933:601;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;19933:601:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;32727:240;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;32727:240:0;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;26929:889;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;26929:889:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;26929:889:0;;;;;;;;;;;;-1:-1:-1;26929:889:0;-1:-1:-1;;;;;;26929:889:0;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33457:233;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;33457:233:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;33457:233:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;33457:233:0;;-1:-1:-1;33457:233:0;;-1:-1:-1;;;;;33457:233:0:i;20540:664::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;20540:664:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;24070:658::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;24070:658:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;24070:658:0;;;;;;;;;;;;-1:-1:-1;24070:658:0;-1:-1:-1;;;;;;24070:658:0;;;;;;;;:::i;26076:847::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;26076:847:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;26076:847:0;;;;;;;;;;;;-1:-1:-1;26076:847:0;-1:-1:-1;;;;;;26076:847:0;;;;;;;;:::i;22529:731::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;22529:731:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;29969:719::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;29969:719:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;29969:719:0;;;;;;;;;;;;-1:-1:-1;29969:719:0;-1:-1:-1;;;;;;29969:719:0;;;;;;;;:::i;31572:893::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;31572:893:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;31572:893:0;;;;;;;;;;;;-1:-1:-1;31572:893:0;-1:-1:-1;;;;;;31572:893:0;;;;;;;;:::i;25355:715::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;25355:715:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;25355:715:0;;;;;;;;;;;;-1:-1:-1;25355:715:0;-1:-1:-1;;;;;;25355:715:0;;;;;;;;:::i;32973:239::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;32973:239:0;;;;;;;;;;;;:::i;24734:615::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;24734:615:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;24734:615:0;;;;;;;;;;;;-1:-1:-1;24734:615:0;-1:-1:-1;;;;;;24734:615:0;;;;;;;;:::i;15588:38::-;;;;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;15588:38:0;;;;;;;;;;;;;;32505:216;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;32505:216:0;;;;;;;;;;;;:::i;21945:578::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;21945:578:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;30694:872::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;30694:872:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;30694:872:0;;;;;;;;;;;;-1:-1:-1;30694:872:0;-1:-1:-1;;;;;;30694:872:0;;;;;;;;:::i;19063:864::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;19063:864:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;15542:41::-;;;;;;;;;;;;;:::i;33218:233::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;33218:233:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;33218:233:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;33218:233:0;;-1:-1:-1;33218:233:0;;-1:-1:-1;;;;;33218:233:0:i;21210:660::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;21210:660:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;17347:762::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;17347:762:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;18115:909;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;18115:909:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;27824:799::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;27824:799:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;27824:799:0;;;;;;;;;;;;-1:-1:-1;27824:799:0;-1:-1:-1;;;;;;27824:799:0;;;;;;;;:::i;19933:601::-;20156:19;20177:17;20137:8;15694:15;15682:8;:27;;15674:72;;;;;-1:-1:-1;;;15674:72:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;15674:72:0;;;;;;;;;;;;;;;20230:150:::1;20254:5;20268:4;20281:9;20299:14;20322:12;20351:4;20365:8;20230:15;:150::i;:::-;20203:177:::0;;-1:-1:-1;20203:177:0;-1:-1:-1;20387:51:0::1;20415:5:::0;20422:2;20203:177;20387:27:::1;:51::i;:::-;20451:4;-1:-1:-1::0;;;;;20445:20:0::1;;20466:9;20445:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;20483:45;20514:2;20518:9;20483:30;:45::i;:::-;19933:601:::0;;;;;;;;;;:::o;32727:240::-;32866:17;32899:62;32929:8;32939:9;32950:10;32899:29;:62::i;:::-;32892:69;32727:240;-1:-1:-1;;;;32727:240:0:o;26929:889::-;27137:24;27118:8;15694:15;15682:8;:27;;15674:72;;;;;-1:-1:-1;;;15674:72:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;15674:72:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;27203:4:0::1;27178:29;:4:::0;;-1:-1:-1;;27183:15:0;;27178:21;;::::1;;;;;;;;;;;-1:-1:-1::0;;;;;27178:21:0::1;-1:-1:-1::0;;;;;27178:29:0::1;;27170:94;;;;-1:-1:-1::0;;;27170:94:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27281:55;27312:7;27321:8;27331:4;;27281:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;27281:30:0::1;::::0;-1:-1:-1;;;27281:55:0:i:1;:::-;27271:65;;27390:12;27359:7;27384:1;27367:7;:14;:18;27359:27;;;;;;;;;;;;;;:43;;27343:142;;;;-1:-1:-1::0;;;27343:142:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27492:152;27532:4;;27537:1;27532:7;;;;;;;;;;;;;-1:-1:-1::0;;;;;27532:7:0::1;27548:10;27567:51;27592:7;27601:4;;27606:1;27601:7;;;;;;;;;;;;;-1:-1:-1::0;;;;;27601:7:0::1;27610:4;;27615:1;27610:7;;;;;;;;;;;;;-1:-1:-1::0;;;;;27610:7:0::1;27567:24;:51::i;:::-;27627:7;27635:1;27627:10;;;;;;;;;;;;;;27492:31;:152::i;:::-;27651:35;27657:7;27666:4;;27651:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;27680:4:0::1;::::0;-1:-1:-1;27651:5:0::1;::::0;-1:-1:-1;;27651:35:0:i:1;:::-;27699:4;-1:-1:-1::0;;;;;27693:20:0::1;;27714:7;27739:1;27722:7;:14;:18;27714:27;;;;;;;;;;;;;;27693:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;27749:63;27780:2;27784:7;27809:1;27792:7;:14;:18;27784:27;;;;;;;;;;;;;;27749:30;:63::i;:::-;26929:889:::0;;;;;;;;;:::o;33457:233::-;33586:24;33629:55;33659:7;33668:9;33679:4;33629:29;:55::i;:::-;33622:62;;33457:233;;;;;:::o;20540:664::-;20839:15;20856;20880:12;20895:49;20920:7;20929:6;20937;20895:24;:49::i;:::-;20880:64;;20951:13;20967:10;:36;;20994:9;20967:36;;;-1:-1:-1;;20967:36:0;21010:80;;;-1:-1:-1;;;21010:80:0;;21038:10;21010:80;;;;21058:4;21010:80;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20951:52;;-1:-1:-1;;;;;;21010:27:0;;;;;:80;;;;;-1:-1:-1;;21010:80:0;;;;;;;;-1:-1:-1;21010:27:0;:80;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21118;21134:6;21142;21150:9;21161:10;21173;21185:2;21189:8;21118:15;:80::i;:::-;21097:101;;;;;;;;20540:664;;;;;;;;;;;;;;;;:::o;24070:658::-;24281:24;24262:8;15694:15;15682:8;:27;;15674:72;;;;;-1:-1:-1;;;15674:72:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;15674:72:0;;;;;;;;;;;;;;;24324:55:::1;24355:7;24364:8;24374:4;;24324:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;24324:30:0::1;::::0;-1:-1:-1;;;24324:55:0:i:1;:::-;24314:65;;24433:12;24402:7;24427:1;24410:7;:14;:18;24402:27;;;;;;;;;;;;;;:43;;24386:146;;;;-1:-1:-1::0;;;24386:146:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24539:152;24579:4;;24584:1;24579:7;;;;;;24539:152;24698:24;24704:7;24713:4;;24698:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;24719:2:0;;-1:-1:-1;24698:5:0::1;::::0;-1:-1:-1;;24698:24:0:i:1;26076:847::-:0;26284:24;26265:8;15694:15;15682:8;:27;;15674:72;;;;;-1:-1:-1;;;15674:72:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;15674:72:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;26350:4:0::1;26325:29;:4:::0;;-1:-1:-1;;26330:15:0;;26325:21;;::::1;;;;;;;;;;;-1:-1:-1::0;;;;;26325:21:0::1;-1:-1:-1::0;;;;;26325:29:0::1;;26317:94;;;;-1:-1:-1::0;;;26317:94:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26428:55;26458:7;26467:9;26478:4;;26428:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;26428:29:0::1;::::0;-1:-1:-1;;;26428:55:0:i:1;:::-;26418:65;;26512:11;26498:7;26506:1;26498:10;;;;;;;;;;;;;;:25;;26490:100;;;;-1:-1:-1::0;;;26490:100:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22529:731:::0;22844:17;22870:12;22885:46;22910:7;22919:5;22926:4;22885:24;:46::i;:::-;22870:61;;22938:13;22954:10;:36;;22981:9;22954:36;;;-1:-1:-1;;22954:36:0;22997:80;;;-1:-1:-1;;;22997:80:0;;23025:10;22997:80;;;;23045:4;22997:80;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22938:52;;-1:-1:-1;;;;;;22997:27:0;;;;;:80;;;;;-1:-1:-1;;22997:80:0;;;;;;;;-1:-1:-1;22997:27:0;:80;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23096:158;23152:5;23166:9;23184:14;23207:12;23228:2;23239:8;23096:47;:158::i;:::-;23084:170;22529:731;-1:-1:-1;;;;;;;;;;;;;22529:731:0:o;29969:719::-;30190:8;15694:15;15682:8;:27;;15674:72;;;;;-1:-1:-1;;;15674:72:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;15674:72:0;;;;;;;;;;;;;;;30207:115:::1;30239:4;;30244:1;30239:7;;;;;;;;;;;;;-1:-1:-1::0;;;;;30239:7:0::1;30248:10;30260:51;30285:7;30294:4;;30299:1;30294:7;;;;;;;;;;;;;-1:-1:-1::0;;;;;30294:7:0::1;30303:4;;30308:1;30303:7;;;;;;30260:51;30313:8;30207:31;:115::i;:::-;30329:21;30369:4:::0;;-1:-1:-1;;30374:15:0;;30369:21;;::::1;;;;;;;;;;;-1:-1:-1::0;;;;;30369:21:0::1;-1:-1:-1::0;;;;;30353:48:0::1;;30402:2;30353:52;;;;;;;;;;;;;-1:-1:-1::0;;;;;30353:52:0::1;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;30353:52:0;30412:44:::1;::::0;;30353:52:::1;30412:44:::0;;::::1;::::0;;;;;;;;;;;30353:52;;-1:-1:-1;30412:44:0::1;::::0;;;30447:4;;;;;;30412:44;::::1;::::0;30447:4;;30412:44;30447:4;30412:44;::::1;;::::0;::::1;::::0;;;;-1:-1:-1;30453:2:0;;-1:-1:-1;30412:34:0::1;::::0;-1:-1:-1;;30412:44:0:i:1;:::-;30554:12:::0;30479:71:::1;30536:13:::0;30495:4;;-1:-1:-1;;30500:15:0;;30495:21;;::::1;;;;;;;;;;;-1:-1:-1::0;;;;;30495:21:0::1;-1:-1:-1::0;;;;;30479:48:0::1;;30528:2;30479:52;;;;;;;;;;;;;-1:-1:-1::0;;;;;30479:52:0::1;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;30479:52:0;;:56:::1;:71::i;:::-;:87;;30463:219;;;;-1:-1:-1::0;;;30463:219:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15753:1;29969:719:::0;;;;;;;:::o;31572:893::-;31790:8;15694:15;15682:8;:27;;15674:72;;;;;-1:-1:-1;;;15674:72:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;15674:72:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;31848:4:0::1;31823:29;:4:::0;;-1:-1:-1;;31828:15:0;;31823:21;;::::1;;;;;;;;;;;-1:-1:-1::0;;;;;31823:21:0::1;-1:-1:-1::0;;;;;31823:29:0::1;;31807:144;;;;-1:-1:-1::0;;;31807:144:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31958:115;31990:4;;31995:1;31990:7;;;;;;31958:115;32080:55;32115:4;;32080:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;32129:4:0::1;::::0;-1:-1:-1;32080:34:0::1;::::0;-1:-1:-1;;32080:55:0:i:1;:::-;32142:17;32178:4;-1:-1:-1::0;;;;;32162:31:0::1;;32202:4;32162:46;;;;;;;;;;;;;-1:-1:-1::0;;;;;32162:46:0::1;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;32162:46:0;;-1:-1:-1;32231:25:0;;::::1;;32215:154;;;;-1:-1:-1::0;;;32215:154:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32382:4;-1:-1:-1::0;;;;;32376:20:0::1;;32397:9;32376:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;32414:45;32445:2;32449:9;32414:30;:45::i;25355:715::-:0;25548:24;25529:8;15694:15;15682:8;:27;;15674:72;;;;;-1:-1:-1;;;15674:72:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;15674:72:0;;;;;;;;;;;;;;;25600:4:::1;-1:-1:-1::0;;;;;25589:15:0::1;:4;;25594:1;25589:7;;;;;;;;;;;;;-1:-1:-1::0;;;;;25589:7:0::1;-1:-1:-1::0;;;;;25589:15:0::1;;25581:80;;;;-1:-1:-1::0;;;25581:80:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25678:56;25709:7;25718:9;25729:4;;25678:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;25678:30:0::1;::::0;-1:-1:-1;;;25678:56:0:i:1;:::-;25668:66;;25788:12;25757:7;25782:1;25765:7;:14;:18;25757:27;;;;;;;;;;;;;;:43;;25741:143;;;;-1:-1:-1::0;;;25741:143:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25897:4;-1:-1:-1::0;;;;;25891:19:0::1;;25919:7;25927:1;25919:10;;;;;;;;;;;;;;25891:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;25953:4;-1:-1:-1::0;;;;;25947:20:0::1;;25968:51;25993:7;26002:4;;26007:1;26002:7;;;;;;25968:51;26021:7;26029:1;26021:10;;;;;;;;;;;;;;25947:85;;;;;;;;;;;;;-1:-1:-1::0;;;;;25947:85:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;25947:85:0;25940:93:::1;;;;26040:24;26046:7;26055:4;;26040:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;26061:2:0;;-1:-1:-1;26040:5:0::1;::::0;-1:-1:-1;;26040:24:0:i:1;:::-;25355:715:::0;;;;;;;;:::o;32973:239::-;33112:16;33144:62;33173:9;33184;33195:10;33144:28;:62::i;24734:615::-;24945:24;24926:8;15694:15;15682:8;:27;;15674:72;;;;;-1:-1:-1;;;15674:72:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;15674:72:0;;;;;;;;;;;;;;;24988:55:::1;25018:7;25027:9;25038:4;;24988:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;24988:29:0::1;::::0;-1:-1:-1;;;24988:55:0:i:1;:::-;24978:65;;25072:11;25058:7;25066:1;25058:10;;;;;;;;;;;;;;:25;;25050:103;;;;-1:-1:-1::0;;;25050:103:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15588:38:::0;;;:::o;32505:216::-;32633:15;32664:51;32687:7;32696:8;32706;32664:22;:51::i;21945:578::-;22197:17;22178:8;15694:15;15682:8;:27;;15674:72;;;;;-1:-1:-1;;;15674:72:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;15674:72:0;;;;;;;;;;;;;;;22239:94:::1;22255:5;22262:4;22268:9;22279:14;22295:12;22317:4;22324:8;22239:15;:94::i;:::-;22223:110;;;;;;22340:87;22368:5;22375:2;22395:5;-1:-1:-1::0;;;;;22379:32:0::1;;22420:4;22379:47;;;;;;;;;;;;;-1:-1:-1::0;;;;;22379:47:0::1;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;22379:47:0;22340:27:::1;:87::i;:::-;22440:4;-1:-1:-1::0;;;;;22434:20:0::1;;22455:9;22434:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;22472:45;22503:2;22507:9;22472:30;:45::i;30694:872::-:0;30897:8;15694:15;15682:8;:27;;15674:72;;;;;-1:-1:-1;;;15674:72:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;15674:72:0;;;;;;;;;;;;;;;30933:4:::1;-1:-1:-1::0;;;;;30922:15:0::1;:4;;30927:1;30922:7;;;;;;;;;;;;;-1:-1:-1::0;;;;;30922:7:0::1;-1:-1:-1::0;;;;;30922:15:0::1;;30914:109;;;;-1:-1:-1::0;;;30914:109:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31030:16;31049:9;31030:28;;31071:4;-1:-1:-1::0;;;;;31065:19:0::1;;31093:8;31065:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;31125:4;-1:-1:-1::0;;;;;31119:20:0::1;;31140:51;31165:7;31174:4;;31179:1;31174:7;;;;;;31140:51;31193:8;31119:83;;;;;;;;;;;;;-1:-1:-1::0;;;;;31119:83:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;31119:83:0;31112:91:::1;;;;31210:21;31250:4:::0;;-1:-1:-1;;31255:15:0;;31250:21;;::::1;;;;;;;;;;;-1:-1:-1::0;;;;;31250:21:0::1;-1:-1:-1::0;;;;;31234:48:0::1;;31283:2;31234:52;;;;;;;;;;;;;-1:-1:-1::0;;;;;31234:52:0::1;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;31234:52:0;31293:44:::1;::::0;;31234:52:::1;31293:44:::0;;::::1;::::0;;;;;;;;;;;31234:52;;-1:-1:-1;31293:44:0::1;::::0;;;31328:4;;;;;;31293:44;::::1;::::0;31328:4;;31293:44;31328:4;31293:44;::::1;;::::0;::::1;::::0;;;;-1:-1:-1;31334:2:0;;-1:-1:-1;31293:34:0::1;::::0;-1:-1:-1;;31293:44:0:i:1;:::-;31435:12:::0;31360:71:::1;31417:13:::0;31376:4;;-1:-1:-1;;31381:15:0;;31376:21;;::::1;;;;;;;;;;;-1:-1:-1::0;;;;;31376:21:0::1;-1:-1:-1::0;;;;;31360:48:0::1;;31409:2;31360:52;;;;;;;;;;;;;-1:-1:-1::0;;;;;31360:52:0::1;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;:71;:87;;31344:216;;;;-1:-1:-1::0;;;31344:216:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19063:864:::0;19299:15;19316;19280:8;15694:15;15682:8;:27;;15674:72;;;;;-1:-1:-1;;;15674:72:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;15674:72:0;;;;;;;;;;;;;;;19340:12:::1;19355:49;19380:7;19389:6;19397;19355:24;:49::i;:::-;19411:62;::::0;;-1:-1:-1;;;19411:62:0;;19445:10:::1;19411:62;::::0;::::1;::::0;-1:-1:-1;;;;;19411:33:0;::::1;:62:::0;;;;;;;;;;;;;;19340:64;;-1:-1:-1;19411:33:0;;::::1;::::0;:62;;;;;::::1;::::0;;;;;;;;;-1:-1:-1;19411:33:0;:62;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;;19543:29:0::1;::::0;;-1:-1:-1;;;19543:29:0;;-1:-1:-1;;;;;19543:29:0;;::::1;;::::0;::::1;::::0;;;19507:15:::1;::::0;;;19543:25;;::::1;::::0;::::1;::::0;:29;;;;;;;;;;;19507:15;19543:25;:29;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;19543:29:0;;::::1;::::0;;::::1;::::0;;;-1:-1:-1;19543:29:0;-1:-1:-1;19580:14:0::1;19600:43;19628:6:::0;19636;19600:27:::1;:43::i;:::-;19579:64;;;19681:6;-1:-1:-1::0;;;;;19671:16:0::1;:6;-1:-1:-1::0;;;;;19671:16:0::1;;:58;;19712:7;19721;19671:58;;;19691:7;19700;19671:58;19650:79:::0;;-1:-1:-1;19650:79:0;-1:-1:-1;19744:21:0;;::::1;;19736:89;;;;-1:-1:-1::0;;;19736:89:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19851:10;19840:7;:21;;19832:89;;;;-1:-1:-1::0;;;19832:89:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15753:1;;;;19063:864:::0;;;;;;;;;;;:::o;15542:41::-;;;:::o;33218:233::-;33347:24;33390:55;33421:7;33430:8;33440:4;33390:30;:55::i;21210:660::-;21496:19;21517:17;21543:12;21558:46;21583:7;21592:5;21599:4;21558:24;:46::i;:::-;21543:61;;21611:13;21627:10;:36;;21654:9;21627:36;;;-1:-1:-1;;21627:36:0;21670:80;;;-1:-1:-1;;;21670:80:0;;21698:10;21670:80;;;;21718:4;21670:80;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21611:52;;-1:-1:-1;;;;;;21670:27:0;;;;;:80;;;;;-1:-1:-1;;21670:80:0;;;;;;;;-1:-1:-1;21670:27:0;:80;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21784;21803:5;21810:9;21821:14;21837:12;21851:2;21855:8;21784:18;:80::i;:::-;21757:107;;;;-1:-1:-1;21210:660:0;-1:-1:-1;;;;;;;;;;;;;21210:660:0:o;17347:762::-;17649:15;17673;17697:17;17617:8;15694:15;15682:8;:27;;15674:72;;;;;-1:-1:-1;;;15674:72:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;15674:72:0;;;;;;;;;;;;;;;17753:85:::1;17767:6;17775;17783:14;17799;17815:10;17827;17753:13;:85::i;:::-;17732:106:::0;;-1:-1:-1;17732:106:0;-1:-1:-1;17845:12:0::1;17860:49;17885:7;17894:6:::0;17902;17860:24:::1;:49::i;:::-;17845:64;;17916:66;17948:6;17956:10;17968:4;17974:7;17916:31;:66::i;:::-;17989;18021:6;18029:10;18041:4;18047:7;17989:31;:66::i;:::-;18089:4;-1:-1:-1::0;;;;;18074:25:0::1;;18100:2;18074:29;;;;;;;;;;;;;-1:-1:-1::0;;;;;18074:29:0::1;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;18074:29:0;17347:762;;;;-1:-1:-1;18074:29:0;;-1:-1:-1;17347:762:0;;-1:-1:-1;;;;;;;;;17347:762:0:o;18115:909::-;18392:19;18420:17;18446;18360:8;15694:15;15682:8;:27;;15674:72;;;;;-1:-1:-1;;;15674:72:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;15674:72:0;;;;;;;;;;;;;;;18508:87:::1;18522:5;18529:4;18535:18;18555:9;18566:14;18582:12;18508:13;:87::i;:::-;18481:114:::0;;-1:-1:-1;18481:114:0;-1:-1:-1;18602:12:0::1;18617:46;18642:7;18651:5:::0;18658:4:::1;18617:24;:46::i;:::-;18602:61;;18670:69;18702:5;18709:10;18721:4;18727:11;18670:31;:69::i;:::-;18752:4;-1:-1:-1::0;;;;;18746:19:0::1;;18774:9;18746:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;18807:4;-1:-1:-1::0;;;;;18801:20:0::1;;18822:4;18828:9;18801:37;;;;;;;;;;;;;-1:-1:-1::0;;;;;18801:37:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;18801:37:0;18794:45:::1;;;;18873:4;-1:-1:-1::0;;;;;18858:25:0::1;;18884:2;18858:29;;;;;;;;;;;;;-1:-1:-1::0;;;;;18858:29:0::1;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;18858:29:0;;-1:-1:-1;18930:9:0::1;:21:::0;-1:-1:-1;18926:92:0::1;;;18953:65;18984:10;19008:9;18996;:21;18953:30;:65::i;:::-;15753:1;18115:909:::0;;;;;;;;;;;:::o;27824:799::-;28014:24;27995:8;15694:15;15682:8;:27;;15674:72;;;;;-1:-1:-1;;;15674:72:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;15674:72:0;;;;;;;;;;;;;;;28066:4:::1;-1:-1:-1::0;;;;;28055:15:0::1;:4;;28060:1;28055:7;;;;;;;;;;;;;-1:-1:-1::0;;;;;28055:7:0::1;-1:-1:-1::0;;;;;28055:15:0::1;;28047:80;;;;-1:-1:-1::0;;;28047:80:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28144:55;28174:7;28183:9;28194:4;;28144:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;28144:29:0::1;::::0;-1:-1:-1;;;28144:55:0:i:1;:::-;28134:65;;28228:9;28214:7;28222:1;28214:10;;;;;;;;;;;;;;:23;;28206:98;;;;-1:-1:-1::0;;;28206:98:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28317:4;-1:-1:-1::0;;;;;28311:19:0::1;;28339:7;28347:1;28339:10;;;;;;;;;;;;;;28311:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;28373:4;-1:-1:-1::0;;;;;28367:20:0::1;;28388:51;28413:7;28422:4;;28427:1;28422:7;;;;;;28388:51;28441:7;28449:1;28441:10;;;;;;;;;;;;;;28367:85;;;;;;;;;;;;;-1:-1:-1::0;;;;;28367:85:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;28367:85:0;28360:93:::1;;;;28460:24;28466:7;28475:4;;28460:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;28481:2:0;;-1:-1:-1;28460:5:0::1;::::0;-1:-1:-1;;28460:24:0:i:1;:::-;28539:7;28547:1;28539:10;;;;;;;;;;;;;;28527:9;:22;28523:94;;;28551:66;28582:10;28606:7;28614:1;28606:10;;;;;;;;;;;;;;28594:9;:22;28551:30;:66::i;9140:361::-:0;9327:45;;;-1:-1:-1;;;;;9327:45:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;9327:45:0;-1:-1:-1;;;9327:45:0;;;9316:57;;;;9281:12;;9295:17;;9316:10;;;;9327:45;9316:57;;;9327:45;9316:57;;9327:45;9316:57;;;;;;;;;;-1:-1:-1;;9316:57:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9280:93;;;;9388:7;:57;;;;-1:-1:-1;9400:11:0;;:16;;:44;;;9431:4;9420:24;;;;;;;;;;;;;;;-1:-1:-1;9420:24:0;9400:44;9380:115;;;;-1:-1:-1;;;9380:115:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9140:361;;;;;:::o;9919:202::-;10023:12;;;9985;10023;;;;;;;;;-1:-1:-1;;;;;10002:7:0;;;10016:5;;10002:34;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;10002:34:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9984:52;;;10051:7;10043:72;;;;-1:-1:-1;;;10043:72:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9919:202;;;:::o;12985:562::-;13107:17;13152:1;13141:8;:12;13133:82;;;;-1:-1:-1;;;13133:82:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13242:1;13230:9;:13;:31;;;;;13260:1;13247:10;:14;13230:31;13222:98;;;;-1:-1:-1;;;13222:98:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13327:23;13353:18;:8;13366:4;13353:12;:18::i;:::-;13327:44;-1:-1:-1;13378:17:0;13398:31;13327:44;13418:10;13398:19;:31::i;:::-;13378:51;-1:-1:-1;13436:19:0;13458:41;13483:15;13458:20;:9;13472:5;13458:13;:20::i;:::-;:24;;:41::i;:::-;13436:63;;13530:11;13518:9;:23;;;;;;;12985:562;-1:-1:-1;;;;;;;12985:562:0:o;14258:530::-;14382:24;14438:1;14423:4;:11;:16;;14415:74;;;;-1:-1:-1;;;14415:74:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14520:4;:11;14506:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;14506:26:0;;14496:36;;14552:8;14539:7;14547:1;14539:10;;;;;;;;;;;;;:21;;;;;14572:9;14567:216;14601:1;14587:4;:11;:15;14583:1;:19;14567:216;;;14619:17;14638:18;14660:42;14672:7;14681:4;14686:1;14681:7;;;;;;;;;;;;;;14690:4;14695:1;14699;14695:5;14690:11;;;;;;;;;;;;;;14660;:42::i;:::-;14618:84;;;;14728:47;14741:7;14749:1;14741:10;;;;;;;;;;;;;;14753:9;14764:10;14728:12;:47::i;:::-;14711:7;14719:1;14723;14719:5;14711:14;;;;;;;;;;;;;;;;;:64;-1:-1:-1;;14604:3:0;;14567:216;;;;14258:530;;;;;:::o;11413:527::-;11522:12;11544:14;11560;11578:26;11589:6;11597;11578:10;:26::i;:::-;11759:32;;;-1:-1:-1;;11759:32:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11749:43;;;;;;-1:-1:-1;;;;;;11674:233:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11652:266;;;;;;;;;11413:527;-1:-1:-1;;;;;11413:527:0:o;9507:406::-;9724:51;;;-1:-1:-1;;;;;9724:51:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;9724:51:0;-1:-1:-1;;;9724:51:0;;;9713:63;;;;9678:12;;9692:17;;9713:10;;;;9724:51;9713:63;;;9724:51;9713:63;;9724:51;9713:63;;;;;;;;;;-1:-1:-1;;9713:63:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9677:99;;;;9791:7;:57;;;;-1:-1:-1;9803:11:0;;:16;;:44;;;9834:4;9823:24;;;;;;;;;;;;;;;-1:-1:-1;9823:24:0;9803:44;9783:124;;;;-1:-1:-1;;;9783:124:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9507:406;;;;;;:::o;23365:699::-;23491:9;23486:573;23520:1;23506:4;:11;:15;23502:1;:19;23486:573;;;23538:13;23553:14;23572:4;23577:1;23572:7;;;;;;;;;;;;;;23581:4;23586:1;23590;23586:5;23581:11;;;;;;;;;;;;;;23537:56;;;;23603:14;23623:42;23651:5;23658:6;23623:27;:42::i;:::-;23602:63;;;23674:17;23694:7;23702:1;23706;23702:5;23694:14;;;;;;;;;;;;;;23674:34;;23718:18;23738;23769:6;-1:-1:-1;;;;;23760:15:0;:5;-1:-1:-1;;;;;23760:15:0;;:67;;23805:9;23824:1;23760:67;;;23787:1;23791:9;23760:67;23717:110;;;;23836:10;23867:1;23853:4;:11;:15;23849:1;:19;:82;;23928:3;23849:82;;;23871:54;23896:7;23905:6;23913:4;23918:1;23922;23918:5;23913:11;;;;;;;;;;;;;;23871:24;:54::i;:::-;23836:95;;23955:48;23980:7;23989:5;23996:6;23955:24;:48::i;:::-;-1:-1:-1;;;;;23940:69:0;;24010:10;24022;24034:2;24048:1;24038:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;24038:12:0;;23940:111;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;23940:111:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;23523:3:0;;;;;-1:-1:-1;23486:573:0;;-1:-1:-1;;;;;;;;23486:573:0;;;23365:699;;;:::o;14865:550::-;14989:24;15045:1;15030:4;:11;:16;;15022:73;;;;-1:-1:-1;;;15022:73:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15126:4;:11;15112:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;15112:26:0;;15102:36;;15175:9;15145:7;15170:1;15153:7;:14;:18;15145:27;;;;;;;;;;;;;;;;;:39;15208:11;;-1:-1:-1;;15208:15:0;15191:219;15225:5;;15191:219;;15247:17;15266:18;15288:42;15300:7;15309:4;15318:1;15314;:5;15309:11;;;;;;;;;;;;;;15322:4;15327:1;15322:7;;;;;;;15288:42;15246:84;;;;15356:46;15368:7;15376:1;15368:10;;;;;;;;;;;;;;15380:9;15391:10;15356:11;:46::i;:::-;15339:7;15351:1;15347;:5;15339:14;;;;;;;;;;;;;;;;;:63;-1:-1:-1;;;;15232:3:0;15191:219;;28764:1199;28873:9;28868:1090;28902:1;28888:4;:11;:15;28884:1;:19;28868:1090;;;28920:13;28935:14;28954:4;28959:1;28954:7;;;;;;;;;;;;;;28963:4;28968:1;28972;28968:5;28963:11;;;;;;;;;;;;;;28919:56;;;;28985:14;29005:42;29033:5;29040:6;29005:27;:42::i;:::-;28984:63;;;29056:19;29093:48;29118:7;29127:5;29134:6;29093:24;:48::i;:::-;29056:86;;29151:19;29179:20;29269:16;29287;29309:4;-1:-1:-1;;;;;29309:16:0;;:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;29309:18:0;;;;;;;-1:-1:-1;;;;;29268:59:0;;;;-1:-1:-1;29268:59:0;;-1:-1:-1;29339:20:0;;-1:-1:-1;;;;;29386:15:0;;;;;;;:61;;29428:8;29438;29386:61;;;29405:8;29415;29386:61;29338:109;;;;29472:65;29524:12;29488:5;-1:-1:-1;;;;;29472:32:0;;29513:4;29472:47;;;;;;;;;;;;;-1:-1:-1;;;;;29472:47:0;;;;;;;;;;;;;;;;;;;;;;;;;;:65;29458:79;;29563:71;29593:11;29606:12;29620:13;29563:29;:71::i;:::-;29548:86;;28868:1090;;;;29653:18;29673;29704:6;-1:-1:-1;;;;;29695:15:0;:5;-1:-1:-1;;;;;29695:15:0;;:91;;29761:12;29783:1;29695:91;;;29731:1;29735:12;29695:91;29652:134;;;;29795:10;29826:1;29812:4;:11;:15;29808:1;:19;:82;;29887:3;29808:82;;;29830:54;29855:7;29864:6;29872:4;29877:1;29881;29877:5;29872:11;;;;;;;29830:54;29937:12;;;29947:1;29937:12;;;;;;;;;;-1:-1:-1;;;29899:51:0;;;;;;;;;;;;;;-1:-1:-1;;;;;29899:51:0;;;;;;;;;;;;;;;;;;;;;;29795:95;;-1:-1:-1;29899:9:0;;;;;;29909:10;;29921;;29795:95;;29937:12;;29899:51;;;;;;;;29937:12;;29899:51;;;;29937:12;;29899:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;28905:3:0;;;;;-1:-1:-1;28868:1090:0;;-1:-1:-1;;;;;;;;;;28868:1090:0;10447:147;10527:5;;;10522:16;;;;10514:74;;;;-1:-1:-1;;;10514:74:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13664:516;13786:16;13831:1;13819:9;:13;13811:83;;;;-1:-1:-1;;;13811:83:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13921:1;13909:9;:13;:31;;;;;13939:1;13926:10;:14;13909:31;13901:97;;;;-1:-1:-1;;;13901:97:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14005:17;14025:35;14054:5;14025:24;:9;14039;14025:13;:24::i;:::-;:28;;:35::i;:::-;14005:55;-1:-1:-1;14067:19:0;14089:35;14119:4;14089:25;:10;14104:9;14089:14;:25::i;:35::-;14067:57;;14142:32;14172:1;14155:11;14143:9;:23;;;;;;;14142:29;:32::i;:::-;14131:43;13664:516;-1:-1:-1;;;;;;13664:516:0:o;12514:353::-;12625:15;12667:1;12657:7;:11;12649:68;;;;-1:-1:-1;;;12649:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12743:1;12732:8;:12;:28;;;;;12759:1;12748:8;:12;12732:28;12724:88;;;;-1:-1:-1;;;12724:88:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12853:8;12829:21;:7;12841:8;12829:11;:21::i;:::-;:32;;;;;;;12514:353;-1:-1:-1;;;;12514:353:0:o;10966:359::-;11041:14;11057;11098:6;-1:-1:-1;;;;;11088:16:0;:6;-1:-1:-1;;;;;11088:16:0;;;11080:78;;;;-1:-1:-1;;;11080:78:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11193:6;-1:-1:-1;;;;;11184:15:0;:6;-1:-1:-1;;;;;11184:15:0;;:53;;11222:6;11230;11184:53;;;11203:6;11211;11184:53;11165:72;;-1:-1:-1;11165:72:0;-1:-1:-1;;;;;;11252:20:0;;11244:75;;;;-1:-1:-1;;;11244:75:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10966:359;;;;;:::o;16031:1310::-;16235:15;16252;16390:1;-1:-1:-1;;;;;16328:64:0;16346:7;-1:-1:-1;;;;;16328:34:0;;16363:6;16371;16328:50;;;;;;;;;;;;;-1:-1:-1;;;;;16328:50:0;;;;;;-1:-1:-1;;;;;16328:50:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;16328:50:0;-1:-1:-1;;;;;16328:64:0;;16324:140;;;16421:7;-1:-1:-1;;;;;16403:37:0;;16441:6;16449;16403:53;;;;;;;;;;;;;-1:-1:-1;;;;;16403:53:0;;;;;;-1:-1:-1;;;;;16403:53:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;16324:140:0;16471:16;16489;16509:53;16538:7;16547:6;16555;16509:28;:53::i;:::-;16470:92;;;;16573:8;16585:1;16573:13;:30;;;;-1:-1:-1;16590:13:0;;16573:30;16569:767;;;16636:14;;-1:-1:-1;16652:14:0;;-1:-1:-1;16569:767:0;;;16690:22;16715:58;16738:14;16754:8;16764;16715:22;:58::i;:::-;16690:83;;16804:14;16786;:32;16782:547;;16857:10;16839:14;:28;;16831:94;;;;-1:-1:-1;;;16831:94:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16958:14;;-1:-1:-1;16974:14:0;-1:-1:-1;16974:14:0;16782:547;;;17016:22;17041:58;17064:14;17080:8;17090;17041:22;:58::i;:::-;17016:83;;17135:14;17117;:32;;17110:40;;;;17187:10;17169:14;:28;;17161:94;;;;-1:-1:-1;;;17161:94:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17288:14;-1:-1:-1;17304:14:0;;-1:-1:-1;16782:547:0;16569:767;;16031:1310;;;;;;;;;;;:::o;10600:160::-;10652:6;10675;;;:30;;-1:-1:-1;;10690:5:0;;;10704:1;10699;10690:5;10699:1;10685:15;;;;;:20;10675:30;10667:87;;;;-1:-1:-1;;;10667:87:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10295:146;10375:5;;;10370:16;;;;10362:73;;;;-1:-1:-1;;;10362:73:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11994:411;12107:16;12125;12151:14;12171:26;12182:6;12190;12171:10;:26::i;:::-;12150:47;;;12205:16;12223;12260:32;12268:7;12277:6;12285;12260:7;:32::i;:::-;-1:-1:-1;;;;;12245:60:0;;:62;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;12245:62:0;;;;;;;-1:-1:-1;;;;;12204:103:0;;;;-1:-1:-1;12204:103:0;;-1:-1:-1;;;;;;12337:16:0;;;;;;;:62;;12380:8;12390;12337:62;;;12357:8;12367;12337:62;12314:85;;;;-1:-1:-1;11994:411:0;-1:-1:-1;;;;;;;11994:411:0:o
Metadata Hash
5b3acaaca553f989097bc46638762fe6d0c8abdf10bf3021c1cc09de5e5a4803
Age | Block | Fee Address | BC Fee Address | Voting Power | Jailed | Incoming |
---|
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.