Contract 0x3D42A6B7cD504cA2283Bc8F37fea859a11Ca89fb

 
Txn Hash Method
Block
From
To
Value [Txn Fee]
0x0ff4b708fc2391409ff3e769b970a77dc25beb6bbcbecbb9187f7ed6cd137464Add Liquidity ET...515702262022-11-28 22:16:394 days 14 hrs ago0x2693b57ee51f4e2a26dfb339a911fa8731061f49 IN  0x3d42a6b7cd504ca2283bc8f37fea859a11ca89fb1 FTM0.23309170023
0x3bfed148500afed300e267672622c759b2c1dc2fda532a708622eb5da8e71f38Add Liquidity ET...515700912022-11-28 22:12:134 days 14 hrs ago0x2693b57ee51f4e2a26dfb339a911fa8731061f49 IN  0x3d42a6b7cd504ca2283bc8f37fea859a11ca89fb1 FTM0.23330687284
0x2e34153bc27cd6cfb23803ed005c0141026d7cdd364fa9163582e95b56e174f0Add Liquidity ET...515700232022-11-28 22:09:494 days 14 hrs ago0x2693b57ee51f4e2a26dfb339a911fa8731061f49 IN  0x3d42a6b7cd504ca2283bc8f37fea859a11ca89fb1 FTM0.009635966765
0x2767d93165a9b2fc04439981e9432b4ceb8c7c5afcaadcf2dff7ef12f12a316cAdd Liquidity ET...514686882022-11-26 13:13:356 days 23 hrs ago0x2693b57ee51f4e2a26dfb339a911fa8731061f49 IN  0x3d42a6b7cd504ca2283bc8f37fea859a11ca89fb36.50306735619225 FTM0.010223898613
0x2db9ed5e4dd23e9279037437ec30c311d36eb71b8c03d6a83c90d875e3e2d899Add Liquidity ET...514686522022-11-26 13:12:146 days 23 hrs ago0x2693b57ee51f4e2a26dfb339a911fa8731061f49 IN  0x3d42a6b7cd504ca2283bc8f37fea859a11ca89fb0.19 FTM0.348693518578
0x7f94c506000e4b939bb02f20f379df97186466a81c1423366d67bde259bff81dAdd Liquidity ET...514343722022-11-25 16:05:227 days 20 hrs ago0xdea8af74d4fc9f9f767ffc2454c360cd2c92690c IN  0x3d42a6b7cd504ca2283bc8f37fea859a11ca89fb0.000544950218797 FTM0.016863314587
0xf739da6deaed7a56cb9da863ade524a94c93f4de86ce1efc3ec32d4cbaa89dc8Add Liquidity ET...513974642022-11-24 17:26:418 days 19 hrs ago0xdea8af74d4fc9f9f767ffc2454c360cd2c92690c IN  0x3d42a6b7cd504ca2283bc8f37fea859a11ca89fb0.0001 FTM2.084170823734
0x1b4b9c7945f2cf840c9d33c09eb1b879955863faba2a5312bbf581020ee2d8450x60c06040513950932022-11-24 15:34:228 days 21 hrs ago0x9e7a882ff45c4a5ecc9badbfbc775c3e68c62f32 IN  Create: SicleRouter020 FTM0.379460457183
[ Download CSV Export 
Latest 9 internal transactions
Parent Txn Hash Block From To Value
0x0ff4b708fc2391409ff3e769b970a77dc25beb6bbcbecbb9187f7ed6cd137464515702262022-11-28 22:16:394 days 14 hrs ago 0x3d42a6b7cd504ca2283bc8f37fea859a11ca89fb Fantom Finance: Wrapped Fantom Token1 FTM
0x3bfed148500afed300e267672622c759b2c1dc2fda532a708622eb5da8e71f38515700912022-11-28 22:12:134 days 14 hrs ago 0x3d42a6b7cd504ca2283bc8f37fea859a11ca89fb Fantom Finance: Wrapped Fantom Token1 FTM
0x2e34153bc27cd6cfb23803ed005c0141026d7cdd364fa9163582e95b56e174f0515700232022-11-28 22:09:494 days 14 hrs ago 0x3d42a6b7cd504ca2283bc8f37fea859a11ca89fb0x2693b57ee51f4e2a26dfb339a911fa8731061f491 wei
0x2e34153bc27cd6cfb23803ed005c0141026d7cdd364fa9163582e95b56e174f0515700232022-11-28 22:09:494 days 14 hrs ago 0x3d42a6b7cd504ca2283bc8f37fea859a11ca89fb Fantom Finance: Wrapped Fantom Token0.999999999999999999 FTM
0x2767d93165a9b2fc04439981e9432b4ceb8c7c5afcaadcf2dff7ef12f12a316c514686882022-11-26 13:13:356 days 23 hrs ago 0x3d42a6b7cd504ca2283bc8f37fea859a11ca89fb Fantom Finance: Wrapped Fantom Token36.503067356192250189 FTM
0x2db9ed5e4dd23e9279037437ec30c311d36eb71b8c03d6a83c90d875e3e2d899514686522022-11-26 13:12:146 days 23 hrs ago 0x3d42a6b7cd504ca2283bc8f37fea859a11ca89fb Fantom Finance: Wrapped Fantom Token0.19 FTM
0x7f94c506000e4b939bb02f20f379df97186466a81c1423366d67bde259bff81d514343722022-11-25 16:05:227 days 20 hrs ago 0x3d42a6b7cd504ca2283bc8f37fea859a11ca89fb Fantom Finance: Wrapped Fantom Token0.000544950218797512 FTM
0xf739da6deaed7a56cb9da863ade524a94c93f4de86ce1efc3ec32d4cbaa89dc8513974642022-11-24 17:26:418 days 19 hrs ago 0x3d42a6b7cd504ca2283bc8f37fea859a11ca89fb Fantom Finance: Wrapped Fantom Token0.0001 FTM
0x1b4b9c7945f2cf840c9d33c09eb1b879955863faba2a5312bbf581020ee2d845513950932022-11-24 15:34:228 days 21 hrs ago 0x9e7a882ff45c4a5ecc9badbfbc775c3e68c62f32  Contract Creation0 FTM
[ Download CSV Export 
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
SicleRouter02

Compiler Version
v0.6.12+commit.27d51765

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at FtmScan.com on 2022-11-24
*/

// Sources flattened with hardhat v2.12.2 https://hardhat.org

// File contracts/sicle/libraries/SafeMath.sol

// SPDX-License-Identifier: GPL-3.0

pragma solidity =0.6.12;

// a library for performing overflow-safe math, courtesy of DappHub (https://github.com/dapphub/ds-math)

library SafeMathSicle {
    function add(uint x, uint y) internal pure returns (uint z) {
        require((z = x + y) >= x, 'ds-math-add-overflow');
    }

    function sub(uint x, uint y) internal pure returns (uint z) {
        require((z = x - y) <= x, 'ds-math-sub-underflow');
    }

    function mul(uint x, uint y) internal pure returns (uint z) {
        require(y == 0 || (z = x * y) / y == x, 'ds-math-mul-overflow');
    }
}


// File contracts/sicle/libraries/TransferHelper.sol

//pragma solidity >=0.6.0;

// helper methods for interacting with ERC20 tokens and sending ETH that do not consistently return true/false
library TransferHelper {
    function safeApprove(address token, address to, uint value) internal {
        // bytes4(keccak256(bytes('approve(address,uint256)')));
        (bool success, bytes memory data) = token.call(abi.encodeWithSelector(0x095ea7b3, to, value));
        require(success && (data.length == 0 || abi.decode(data, (bool))), 'TransferHelper: APPROVE_FAILED');
    }

    function safeTransfer(address token, address to, uint value) internal {
        // bytes4(keccak256(bytes('transfer(address,uint256)')));
        (bool success, bytes memory data) = token.call(abi.encodeWithSelector(0xa9059cbb, to, value));
        require(success && (data.length == 0 || abi.decode(data, (bool))), 'TransferHelper: TRANSFER_FAILED');
    }

    function safeTransferFrom(address token, address from, address to, uint value) internal {
        // bytes4(keccak256(bytes('transferFrom(address,address,uint256)')));
        (bool success, bytes memory data) = token.call(abi.encodeWithSelector(0x23b872dd, from, to, value));
        require(success && (data.length == 0 || abi.decode(data, (bool))), 'TransferHelper: TRANSFER_FROM_FAILED');
    }

    function safeTransferETH(address to, uint value) internal {
        (bool success,) = to.call{value:value}(new bytes(0));
        require(success, 'TransferHelper: ETH_TRANSFER_FAILED');
    }
}


// File contracts/sicle/interfaces/ISiclePair.sol

//pragma solidity >=0.5.0;

interface ISiclePair {
    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;
}


// File contracts/sicle/libraries/SicleLibrary.sol

//pragma solidity >=0.5.0;
library SicleLibrary {
    using SafeMathSicle for uint;

    // 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, 'SicleLibrary: IDENTICAL_ADDRESSES');
        (token0, token1) = tokenA < tokenB ? (tokenA, tokenB) : (tokenB, tokenA);
        require(token0 != address(0), 'SicleLibrary: 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(uint(keccak256(abi.encodePacked(
                hex'ff',
                factory,
                keccak256(abi.encodePacked(token0, token1)),
                hex'3ee592b88a211a0903742ea9c61347cc9de422f143faf804401ff5d091f797cb' // init code hash
            ))));
    }

    // fetches and sorts the reserves for a pair
    function getReserves(address factory, address tokenA, address tokenB) internal view returns (uint reserveA, uint reserveB) {
        (address token0,) = sortTokens(tokenA, tokenB);
        (uint reserve0, uint reserve1,) = ISiclePair(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(uint amountA, uint reserveA, uint reserveB) internal pure returns (uint amountB) {
        require(amountA > 0, 'SicleLibrary: INSUFFICIENT_AMOUNT');
        require(reserveA > 0 && reserveB > 0, 'SicleLibrary: 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(uint amountIn, uint reserveIn, uint reserveOut) internal pure returns (uint amountOut) {
        require(amountIn > 0, 'SicleLibrary: INSUFFICIENT_INPUT_AMOUNT');
        require(reserveIn > 0 && reserveOut > 0, 'SicleLibrary: INSUFFICIENT_LIQUIDITY');
        uint amountInWithFee = amountIn.mul(997);
        uint numerator = amountInWithFee.mul(reserveOut);
        uint denominator = reserveIn.mul(1000).add(amountInWithFee);
        amountOut = numerator / denominator;
    }

    // given an output amount of an asset and pair reserves, returns a required input amount of the other asset
    function getAmountIn(uint amountOut, uint reserveIn, uint reserveOut) internal pure returns (uint amountIn) {
        require(amountOut > 0, 'SicleLibrary: INSUFFICIENT_OUTPUT_AMOUNT');
        require(reserveIn > 0 && reserveOut > 0, 'SicleLibrary: INSUFFICIENT_LIQUIDITY');
        uint numerator = reserveIn.mul(amountOut).mul(1000);
        uint denominator = reserveOut.sub(amountOut).mul(997);
        amountIn = (numerator / denominator).add(1);
    }

    // performs chained getAmountOut calculations on any number of pairs
    function getAmountsOut(address factory, uint amountIn, address[] memory path) internal view returns (uint[] memory amounts) {
        require(path.length >= 2, 'SicleLibrary: INVALID_PATH');
        amounts = new uint[](path.length);
        amounts[0] = amountIn;
        for (uint i; i < path.length - 1; i++) {
            (uint reserveIn, uint 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, uint amountOut, address[] memory path) internal view returns (uint[] memory amounts) {
        require(path.length >= 2, 'SicleLibrary: INVALID_PATH');
        amounts = new uint[](path.length);
        amounts[amounts.length - 1] = amountOut;
        for (uint i = path.length - 1; i > 0; i--) {
            (uint reserveIn, uint reserveOut) = getReserves(factory, path[i - 1], path[i]);
            amounts[i - 1] = getAmountIn(amounts[i], reserveIn, reserveOut);
        }
    }
}


// File contracts/sicle/interfaces/ISicleRouter01.sol

//pragma solidity >=0.6.2;

//IUniswapV2Router01
interface ISicleRouter01 {
    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);
}


// File contracts/sicle/interfaces/ISicleRouter02.sol

//pragma solidity >=0.6.2;
//IUniswapV2Router02
interface ISicleRouter02 is ISicleRouter01 {
    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;
}


// File contracts/sicle/interfaces/ISicleFactory.sol

//pragma solidity >=0.5.0;

interface ISicleFactory {
    event PairCreated(address indexed token0, address indexed token1, address pair, uint);

    function feeTo() external view returns (address);
    //function feeToStake() external view returns (address);
    function feeToSetter() external view returns (address);
    function migrator() external view returns (address);

    function getPair(address tokenA, address tokenB) external view returns (address pair);
    function allPairs(uint) external view returns (address pair);
    function allPairsLength() external view returns (uint);

    function createPair(address tokenA, address tokenB) external returns (address pair);

    function setFeeTo(address) external;
    //function setFeeToStake(address) external;
    function setFeeToSetter(address) external;
    function setMigrator(address) external;
}


// File contracts/sicle/interfaces/IERC20.sol

//pragma solidity >=0.5.0;

interface IERC20Sicle {
    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);
}


// File contracts/sicle/interfaces/IWETH.sol

//pragma solidity >=0.5.0;

interface IWETH {
    function deposit() external payable;
    function transfer(address to, uint value) external returns (bool);
    function withdraw(uint) external;
}


// File contracts/sicle/SicleRouter02.sol

//pragma solidity =0.6.12;
//UniswapV2Router02
contract SicleRouter02 is ISicleRouter02 {
    using SafeMathSicle for uint;

    address public immutable override factory;
    address public immutable override WETH;

    modifier ensure(uint deadline) {
        require(deadline >= block.timestamp, 'SicleRouter: 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,
        uint amountADesired,
        uint amountBDesired,
        uint amountAMin,
        uint amountBMin
    ) internal virtual returns (uint amountA, uint amountB) {
        // create the pair if it doesn't exist yet
        if (ISicleFactory(factory).getPair(tokenA, tokenB) == address(0)) {
            ISicleFactory(factory).createPair(tokenA, tokenB);
        }
        (uint reserveA, uint reserveB) = SicleLibrary.getReserves(factory, tokenA, tokenB);
        if (reserveA == 0 && reserveB == 0) {
            (amountA, amountB) = (amountADesired, amountBDesired);
        } else {
            uint amountBOptimal = SicleLibrary.quote(amountADesired, reserveA, reserveB);
            if (amountBOptimal <= amountBDesired) {
                require(amountBOptimal >= amountBMin, 'SicleRouter: INSUFFICIENT_B_AMOUNT');
                (amountA, amountB) = (amountADesired, amountBOptimal);
            } else {
                uint amountAOptimal = SicleLibrary.quote(amountBDesired, reserveB, reserveA);
                assert(amountAOptimal <= amountADesired);
                require(amountAOptimal >= amountAMin, 'SicleRouter: INSUFFICIENT_A_AMOUNT');
                (amountA, amountB) = (amountAOptimal, amountBDesired);
            }
        }
    }
    function addLiquidity(
        address tokenA,
        address tokenB,
        uint amountADesired,
        uint amountBDesired,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline
    ) external virtual override ensure(deadline) returns (uint amountA, uint amountB, uint liquidity) {
        (amountA, amountB) = _addLiquidity(tokenA, tokenB, amountADesired, amountBDesired, amountAMin, amountBMin);
        address pair = SicleLibrary.pairFor(factory, tokenA, tokenB);
        TransferHelper.safeTransferFrom(tokenA, msg.sender, pair, amountA);
        TransferHelper.safeTransferFrom(tokenB, msg.sender, pair, amountB);
        liquidity = ISiclePair(pair).mint(to);
    }
    function addLiquidityETH(
        address token,
        uint amountTokenDesired,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external virtual override payable ensure(deadline) returns (uint amountToken, uint amountETH, uint liquidity) {
        (amountToken, amountETH) = _addLiquidity(
            token,
            WETH,
            amountTokenDesired,
            msg.value,
            amountTokenMin,
            amountETHMin
        );
        address pair = SicleLibrary.pairFor(factory, token, WETH);
        TransferHelper.safeTransferFrom(token, msg.sender, pair, amountToken);
        IWETH(WETH).deposit{value: amountETH}();
        assert(IWETH(WETH).transfer(pair, amountETH));
        liquidity = ISiclePair(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,
        uint liquidity,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline
    ) public virtual override ensure(deadline) returns (uint amountA, uint amountB) {
        address pair = SicleLibrary.pairFor(factory, tokenA, tokenB);
        ISiclePair(pair).transferFrom(msg.sender, pair, liquidity); // send liquidity to pair
        (uint amount0, uint amount1) = ISiclePair(pair).burn(to);
        (address token0,) = SicleLibrary.sortTokens(tokenA, tokenB);
        (amountA, amountB) = tokenA == token0 ? (amount0, amount1) : (amount1, amount0);
        require(amountA >= amountAMin, 'SicleRouter: INSUFFICIENT_A_AMOUNT');
        require(amountB >= amountBMin, 'SicleRouter: INSUFFICIENT_B_AMOUNT');
    }
    function removeLiquidityETH(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) public virtual override ensure(deadline) returns (uint amountToken, uint 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,
        uint liquidity,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external virtual override returns (uint amountA, uint amountB) {
        address pair = SicleLibrary.pairFor(factory, tokenA, tokenB);
        uint value = approveMax ? uint(-1) : liquidity;
        ISiclePair(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,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external virtual override returns (uint amountToken, uint amountETH) {
        address pair = SicleLibrary.pairFor(factory, token, WETH);
        uint value = approveMax ? uint(-1) : liquidity;
        ISiclePair(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,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) public virtual override ensure(deadline) returns (uint amountETH) {
        (, amountETH) = removeLiquidity(
            token,
            WETH,
            liquidity,
            amountTokenMin,
            amountETHMin,
            address(this),
            deadline
        );
        TransferHelper.safeTransfer(token, to, IERC20Sicle(token).balanceOf(address(this)));
        IWETH(WETH).withdraw(amountETH);
        TransferHelper.safeTransferETH(to, amountETH);
    }
    function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external virtual override returns (uint amountETH) {
        address pair = SicleLibrary.pairFor(factory, token, WETH);
        uint value = approveMax ? uint(-1) : liquidity;
        ISiclePair(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(uint[] memory amounts, address[] memory path, address _to) internal virtual {
        for (uint i; i < path.length - 1; i++) {
            (address input, address output) = (path[i], path[i + 1]);
            (address token0,) = SicleLibrary.sortTokens(input, output);
            uint amountOut = amounts[i + 1];
            (uint amount0Out, uint amount1Out) = input == token0 ? (uint(0), amountOut) : (amountOut, uint(0));
            address to = i < path.length - 2 ? SicleLibrary.pairFor(factory, output, path[i + 2]) : _to;
            ISiclePair(SicleLibrary.pairFor(factory, input, output)).swap(
                amount0Out, amount1Out, to, new bytes(0)
            );
        }
    }
    function swapExactTokensForTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external virtual override ensure(deadline) returns (uint[] memory amounts) {
        amounts = SicleLibrary.getAmountsOut(factory, amountIn, path);
        require(amounts[amounts.length - 1] >= amountOutMin, 'SicleRouter: INSUFFICIENT_OUTPUT_AMOUNT');
        TransferHelper.safeTransferFrom(
            path[0], msg.sender, SicleLibrary.pairFor(factory, path[0], path[1]), amounts[0]
        );
        _swap(amounts, path, to);
    }
    function swapTokensForExactTokens(
        uint amountOut,
        uint amountInMax,
        address[] calldata path,
        address to,
        uint deadline
    ) external virtual override ensure(deadline) returns (uint[] memory amounts) {
        amounts = SicleLibrary.getAmountsIn(factory, amountOut, path);
        require(amounts[0] <= amountInMax, 'SicleRouter: EXCESSIVE_INPUT_AMOUNT');
        TransferHelper.safeTransferFrom(
            path[0], msg.sender, SicleLibrary.pairFor(factory, path[0], path[1]), amounts[0]
        );
        _swap(amounts, path, to);
    }
    function swapExactETHForTokens(uint amountOutMin, address[] calldata path, address to, uint deadline)
        external
        virtual
        override
        payable
        ensure(deadline)
        returns (uint[] memory amounts)
    {
        require(path[0] == WETH, 'SicleRouter: INVALID_PATH');
        amounts = SicleLibrary.getAmountsOut(factory, msg.value, path);
        require(amounts[amounts.length - 1] >= amountOutMin, 'SicleRouter: INSUFFICIENT_OUTPUT_AMOUNT');
        IWETH(WETH).deposit{value: amounts[0]}();
        assert(IWETH(WETH).transfer(SicleLibrary.pairFor(factory, path[0], path[1]), amounts[0]));
        _swap(amounts, path, to);
    }
    function swapTokensForExactETH(uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline)
        external
        virtual
        override
        ensure(deadline)
        returns (uint[] memory amounts)
    {
        require(path[path.length - 1] == WETH, 'SicleRouter: INVALID_PATH');
        amounts = SicleLibrary.getAmountsIn(factory, amountOut, path);
        require(amounts[0] <= amountInMax, 'SicleRouter: EXCESSIVE_INPUT_AMOUNT');
        TransferHelper.safeTransferFrom(
            path[0], msg.sender, SicleLibrary.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(uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline)
        external
        virtual
        override
        ensure(deadline)
        returns (uint[] memory amounts)
    {
        require(path[path.length - 1] == WETH, 'SicleRouter: INVALID_PATH');
        amounts = SicleLibrary.getAmountsOut(factory, amountIn, path);
        require(amounts[amounts.length - 1] >= amountOutMin, 'SicleRouter: INSUFFICIENT_OUTPUT_AMOUNT');
        TransferHelper.safeTransferFrom(
            path[0], msg.sender, SicleLibrary.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(uint amountOut, address[] calldata path, address to, uint deadline)
        external
        virtual
        override
        payable
        ensure(deadline)
        returns (uint[] memory amounts)
    {
        require(path[0] == WETH, 'SicleRouter: INVALID_PATH');
        amounts = SicleLibrary.getAmountsIn(factory, amountOut, path);
        require(amounts[0] <= msg.value, 'SicleRouter: EXCESSIVE_INPUT_AMOUNT');
        IWETH(WETH).deposit{value: amounts[0]}();
        assert(IWETH(WETH).transfer(SicleLibrary.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 (uint i; i < path.length - 1; i++) {
            (address input, address output) = (path[i], path[i + 1]);
            (address token0,) = SicleLibrary.sortTokens(input, output);
            ISiclePair pair = ISiclePair(SicleLibrary.pairFor(factory, input, output));
            uint amountInput;
            uint amountOutput;
            { // scope to avoid stack too deep errors
            (uint reserve0, uint reserve1,) = pair.getReserves();
            (uint reserveInput, uint reserveOutput) = input == token0 ? (reserve0, reserve1) : (reserve1, reserve0);
            amountInput = IERC20Sicle(input).balanceOf(address(pair)).sub(reserveInput);
            amountOutput = SicleLibrary.getAmountOut(amountInput, reserveInput, reserveOutput);
            }
            (uint amount0Out, uint amount1Out) = input == token0 ? (uint(0), amountOutput) : (amountOutput, uint(0));
            address to = i < path.length - 2 ? SicleLibrary.pairFor(factory, output, path[i + 2]) : _to;
            pair.swap(amount0Out, amount1Out, to, new bytes(0));
        }
    }
    function swapExactTokensForTokensSupportingFeeOnTransferTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external virtual override ensure(deadline) {
        TransferHelper.safeTransferFrom(
            path[0], msg.sender, SicleLibrary.pairFor(factory, path[0], path[1]), amountIn
        );
        uint balanceBefore = IERC20Sicle(path[path.length - 1]).balanceOf(to);
        _swapSupportingFeeOnTransferTokens(path, to);
        require(
            IERC20Sicle(path[path.length - 1]).balanceOf(to).sub(balanceBefore) >= amountOutMin,
            'SicleRouter: INSUFFICIENT_OUTPUT_AMOUNT'
        );
    }
    function swapExactETHForTokensSupportingFeeOnTransferTokens(
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    )
        external
        virtual
        override
        payable
        ensure(deadline)
    {
        require(path[0] == WETH, 'SicleRouter: INVALID_PATH');
        uint amountIn = msg.value;
        IWETH(WETH).deposit{value: amountIn}();
        assert(IWETH(WETH).transfer(SicleLibrary.pairFor(factory, path[0], path[1]), amountIn));
        uint balanceBefore = IERC20Sicle(path[path.length - 1]).balanceOf(to);
        _swapSupportingFeeOnTransferTokens(path, to);
        require(
            IERC20Sicle(path[path.length - 1]).balanceOf(to).sub(balanceBefore) >= amountOutMin,
            'SicleRouter: INSUFFICIENT_OUTPUT_AMOUNT'
        );
    }
    function swapExactTokensForETHSupportingFeeOnTransferTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    )
        external
        virtual
        override
        ensure(deadline)
    {
        require(path[path.length - 1] == WETH, 'SicleRouter: INVALID_PATH');
        TransferHelper.safeTransferFrom(
            path[0], msg.sender, SicleLibrary.pairFor(factory, path[0], path[1]), amountIn
        );
        _swapSupportingFeeOnTransferTokens(path, address(this));
        uint amountOut = IERC20Sicle(WETH).balanceOf(address(this));
        require(amountOut >= amountOutMin, 'SicleRouter: INSUFFICIENT_OUTPUT_AMOUNT');
        IWETH(WETH).withdraw(amountOut);
        TransferHelper.safeTransferETH(to, amountOut);
    }

    // **** LIBRARY FUNCTIONS ****
    function quote(uint amountA, uint reserveA, uint reserveB) public pure virtual override returns (uint amountB) {
        return SicleLibrary.quote(amountA, reserveA, reserveB);
    }

    function getAmountOut(uint amountIn, uint reserveIn, uint reserveOut)
        public
        pure
        virtual
        override
        returns (uint amountOut)
    {
        return SicleLibrary.getAmountOut(amountIn, reserveIn, reserveOut);
    }

    function getAmountIn(uint amountOut, uint reserveIn, uint reserveOut)
        public
        pure
        virtual
        override
        returns (uint amountIn)
    {
        return SicleLibrary.getAmountIn(amountOut, reserveIn, reserveOut);
    }

    function getAmountsOut(uint amountIn, address[] memory path)
        public
        view
        virtual
        override
        returns (uint[] memory amounts)
    {
        return SicleLibrary.getAmountsOut(factory, amountIn, path);
    }

    function getAmountsIn(uint amountOut, address[] memory path)
        public
        view
        virtual
        override
        returns (uint[] memory amounts)
    {
        return SicleLibrary.getAmountsIn(factory, amountOut, path);
    }
}

Contract Security Audit

Contract ABI

[{"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"}]

60c060405234801561001057600080fd5b50604051620046c3380380620046c38339818101604052604081101561003557600080fd5b5080516020909101516001600160601b0319606092831b8116608052911b1660a05260805160601c60a05160601c61453e620001856000398061015f5280610ce45280610d1f5280610e16528061103452806113be528061152452806118d352806119ae5280611a885280611b565280611c9c5280611d245280611f605280611fdb528061208f528061215b52806121f05280612264528061274752806129b15280612a075280612a3b5280612aaf5280612c3d5280612d805280612e08525080610ea45280610f7b52806110fa5280611133528061126e528061144c528061150252806116725280611be95280611d565280611eb0528061229652806124d452806126cc52806126f55280612725528061289252806129e55280612cd05280612e3a52806136c0528061370352806139dd5280613b535280613f445280613ffd52806140b0525061453e6000f3fe60806040526004361061014f5760003560e01c80638803dbee116100b6578063c45a01551161006f578063c45a015514610a10578063d06ca61f14610a25578063ded9382a14610ada578063e8e3370014610b4d578063f305d71914610bcd578063fb3bdb4114610c1357610188565b80638803dbee146107df578063ad5c464814610875578063ad615dec146108a6578063af2979eb146108dc578063b6f9de951461092f578063baa2abde146109b357610188565b80634a25d94a116101085780634a25d94a146104f05780635b0d5984146105865780635c11d795146105f9578063791ac9471461068f5780637ff36ab51461072557806385f8c259146107a957610188565b806302751cec1461018d578063054d50d4146101f957806318cbafe5146102415780631f00ca74146103275780632195995c146103dc57806338ed17391461045a57610188565b3661018857336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461018657fe5b005b600080fd5b34801561019957600080fd5b506101e0600480360360c08110156101b057600080fd5b506001600160a01b0381358116916020810135916040820135916060810135916080820135169060a00135610c97565b6040805192835260208301919091528051918290030190f35b34801561020557600080fd5b5061022f6004803603606081101561021c57600080fd5b5080359060208101359060400135610db1565b60408051918252519081900360200190f35b34801561024d57600080fd5b506102d7600480360360a081101561026457600080fd5b813591602081013591810190606081016040820135600160201b81111561028a57600080fd5b82018360208201111561029c57600080fd5b803590602001918460208302840111600160201b831117156102bd57600080fd5b91935091506001600160a01b038135169060200135610dc6565b60408051602080825283518183015283519192839290830191858101910280838360005b838110156103135781810151838201526020016102fb565b505050509050019250505060405180910390f35b34801561033357600080fd5b506102d76004803603604081101561034a57600080fd5b81359190810190604081016020820135600160201b81111561036b57600080fd5b82018360208201111561037d57600080fd5b803590602001918460208302840111600160201b8311171561039e57600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295506110f3945050505050565b3480156103e857600080fd5b506101e0600480360361016081101561040057600080fd5b506001600160a01b038135811691602081013582169160408201359160608101359160808201359160a08101359091169060c08101359060e081013515159060ff6101008201351690610120810135906101400135611129565b34801561046657600080fd5b506102d7600480360360a081101561047d57600080fd5b813591602081013591810190606081016040820135600160201b8111156104a357600080fd5b8201836020820111156104b557600080fd5b803590602001918460208302840111600160201b831117156104d657600080fd5b91935091506001600160a01b038135169060200135611223565b3480156104fc57600080fd5b506102d7600480360360a081101561051357600080fd5b813591602081013591810190606081016040820135600160201b81111561053957600080fd5b82018360208201111561054b57600080fd5b803590602001918460208302840111600160201b8311171561056c57600080fd5b91935091506001600160a01b03813516906020013561136e565b34801561059257600080fd5b5061022f60048036036101408110156105aa57600080fd5b506001600160a01b0381358116916020810135916040820135916060810135916080820135169060a08101359060c081013515159060ff60e082013516906101008101359061012001356114fa565b34801561060557600080fd5b50610186600480360360a081101561061c57600080fd5b813591602081013591810190606081016040820135600160201b81111561064257600080fd5b82018360208201111561065457600080fd5b803590602001918460208302840111600160201b8311171561067557600080fd5b91935091506001600160a01b038135169060200135611608565b34801561069b57600080fd5b50610186600480360360a08110156106b257600080fd5b813591602081013591810190606081016040820135600160201b8111156106d857600080fd5b8201836020820111156106ea57600080fd5b803590602001918460208302840111600160201b8311171561070b57600080fd5b91935091506001600160a01b038135169060200135611885565b6102d76004803603608081101561073b57600080fd5b81359190810190604081016020820135600160201b81111561075c57600080fd5b82018360208201111561076e57600080fd5b803590602001918460208302840111600160201b8311171561078f57600080fd5b91935091506001600160a01b038135169060200135611b0e565b3480156107b557600080fd5b5061022f600480360360608110156107cc57600080fd5b5080359060208101359060400135611e58565b3480156107eb57600080fd5b506102d7600480360360a081101561080257600080fd5b813591602081013591810190606081016040820135600160201b81111561082857600080fd5b82018360208201111561083a57600080fd5b803590602001918460208302840111600160201b8311171561085b57600080fd5b91935091506001600160a01b038135169060200135611e65565b34801561088157600080fd5b5061088a611f5e565b604080516001600160a01b039092168252519081900360200190f35b3480156108b257600080fd5b5061022f600480360360608110156108c957600080fd5b5080359060208101359060400135611f82565b3480156108e857600080fd5b5061022f600480360360c08110156108ff57600080fd5b506001600160a01b0381358116916020810135916040820135916060810135916080820135169060a00135611f8f565b6101866004803603608081101561094557600080fd5b81359190810190604081016020820135600160201b81111561096657600080fd5b82018360208201111561097857600080fd5b803590602001918460208302840111600160201b8311171561099957600080fd5b91935091506001600160a01b038135169060200135612115565b3480156109bf57600080fd5b506101e0600480360360e08110156109d657600080fd5b506001600160a01b038135811691602081013582169160408201359160608101359160808201359160a08101359091169060c00135612486565b348015610a1c57600080fd5b5061088a6126ca565b348015610a3157600080fd5b506102d760048036036040811015610a4857600080fd5b81359190810190604081016020820135600160201b811115610a6957600080fd5b820183602082011115610a7b57600080fd5b803590602001918460208302840111600160201b83111715610a9c57600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295506126ee945050505050565b348015610ae657600080fd5b506101e06004803603610140811015610afe57600080fd5b506001600160a01b0381358116916020810135916040820135916060810135916080820135169060a08101359060c081013515159060ff60e0820135169061010081013590610120013561271b565b348015610b5957600080fd5b50610baf6004803603610100811015610b7157600080fd5b506001600160a01b038135811691602081013582169160408201359160608101359160808201359160a08101359160c0820135169060e0013561282f565b60408051938452602084019290925282820152519081900360600190f35b610baf600480360360c0811015610be357600080fd5b506001600160a01b0381358116916020810135916040820135916060810135916080820135169060a00135612962565b6102d760048036036080811015610c2957600080fd5b81359190810190604081016020820135600160201b811115610c4a57600080fd5b820183602082011115610c5c57600080fd5b803590602001918460208302840111600160201b83111715610c7d57600080fd5b91935091506001600160a01b038135169060200135612bf5565b6000808242811015610cde576040805162461bcd60e51b8152602060048201526014602482015260008051602061433f833981519152604482015290519081900360640190fd5b610d0d897f00000000000000000000000000000000000000000000000000000000000000008a8a8a308a612486565b9093509150610d1d898685612f6e565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632e1a7d4d836040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b158015610d8357600080fd5b505af1158015610d97573d6000803e3d6000fd5b50505050610da585836130d8565b50965096945050505050565b6000610dbe8484846131d0565b949350505050565b60608142811015610e0c576040805162461bcd60e51b8152602060048201526014602482015260008051602061433f833981519152604482015290519081900360640190fd5b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001686866000198101818110610e4657fe5b905060200201356001600160a01b03166001600160a01b031614610e9f576040805162461bcd60e51b81526020600482015260196024820152600080516020614459833981519152604482015290519081900360640190fd5b610efd7f0000000000000000000000000000000000000000000000000000000000000000898888808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152506132a892505050565b91508682600184510381518110610f1057fe5b60200260200101511015610f555760405162461bcd60e51b81526004018080602001828103825260278152602001806144796027913960400191505060405180910390fd5b610ff386866000818110610f6557fe5b905060200201356001600160a01b031633610fd97f00000000000000000000000000000000000000000000000000000000000000008a8a6000818110610fa757fe5b905060200201356001600160a01b03168b8b6001818110610fc457fe5b905060200201356001600160a01b03166133f4565b85600081518110610fe657fe5b60200260200101516134b4565b61103282878780806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250309250613611915050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632e1a7d4d8360018551038151811061107157fe5b60200260200101516040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b1580156110af57600080fd5b505af11580156110c3573d6000803e3d6000fd5b505050506110e884836001855103815181106110db57fe5b60200260200101516130d8565b509695505050505050565b60606111207f0000000000000000000000000000000000000000000000000000000000000000848461384e565b90505b92915050565b60008060006111597f00000000000000000000000000000000000000000000000000000000000000008f8f6133f4565b9050600087611168578c61116c565b6000195b6040805163d505accf60e01b815233600482015230602482015260448101839052606481018c905260ff8a16608482015260a4810189905260c4810188905290519192506001600160a01b0384169163d505accf9160e48082019260009290919082900301818387803b1580156111e257600080fd5b505af11580156111f6573d6000803e3d6000fd5b505050506112098f8f8f8f8f8f8f612486565b809450819550505050509b509b9950505050505050505050565b60608142811015611269576040805162461bcd60e51b8152602060048201526014602482015260008051602061433f833981519152604482015290519081900360640190fd5b6112c77f0000000000000000000000000000000000000000000000000000000000000000898888808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152506132a892505050565b915086826001845103815181106112da57fe5b6020026020010151101561131f5760405162461bcd60e51b81526004018080602001828103825260278152602001806144796027913960400191505060405180910390fd5b61132f86866000818110610f6557fe5b6110e882878780806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250899250613611915050565b606081428110156113b4576040805162461bcd60e51b8152602060048201526014602482015260008051602061433f833981519152604482015290519081900360640190fd5b6001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016868660001981018181106113ee57fe5b905060200201356001600160a01b03166001600160a01b031614611447576040805162461bcd60e51b81526020600482015260196024820152600080516020614459833981519152604482015290519081900360640190fd5b6114a57f00000000000000000000000000000000000000000000000000000000000000008988888080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061384e92505050565b915086826000815181106114b557fe5b60200260200101511115610f555760405162461bcd60e51b81526004018080602001828103825260238152602001806144366023913960400191505060405180910390fd5b6000806115487f00000000000000000000000000000000000000000000000000000000000000008d7f00000000000000000000000000000000000000000000000000000000000000006133f4565b9050600086611557578b61155b565b6000195b6040805163d505accf60e01b815233600482015230602482015260448101839052606481018b905260ff8916608482015260a4810188905260c4810187905290519192506001600160a01b0384169163d505accf9160e48082019260009290919082900301818387803b1580156115d157600080fd5b505af11580156115e5573d6000803e3d6000fd5b505050506115f78d8d8d8d8d8d611f8f565b9d9c50505050505050505050505050565b804281101561164c576040805162461bcd60e51b8152602060048201526014602482015260008051602061433f833981519152604482015290519081900360640190fd5b6116c18585600081811061165c57fe5b905060200201356001600160a01b0316336116bb7f00000000000000000000000000000000000000000000000000000000000000008989600081811061169e57fe5b905060200201356001600160a01b03168a8a6001818110610fc457fe5b8a6134b4565b6000858560001981018181106116d357fe5b905060200201356001600160a01b03166001600160a01b03166370a08231856040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561172f57600080fd5b505afa158015611743573d6000803e3d6000fd5b505050506040513d602081101561175957600080fd5b5051604080516020888102828101820190935288825292935061179b929091899189918291850190849080828437600092019190915250889250613986915050565b8661183e82888860001981018181106117b057fe5b905060200201356001600160a01b03166001600160a01b03166370a08231886040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561180c57600080fd5b505afa158015611820573d6000803e3d6000fd5b505050506040513d602081101561183657600080fd5b505190613c88565b101561187b5760405162461bcd60e51b81526004018080602001828103825260278152602001806144796027913960400191505060405180910390fd5b5050505050505050565b80428110156118c9576040805162461bcd60e51b8152602060048201526014602482015260008051602061433f833981519152604482015290519081900360640190fd5b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000168585600019810181811061190357fe5b905060200201356001600160a01b03166001600160a01b03161461195c576040805162461bcd60e51b81526020600482015260196024820152600080516020614459833981519152604482015290519081900360640190fd5b61196c8585600081811061165c57fe5b6119aa858580806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250309250613986915050565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015611a1957600080fd5b505afa158015611a2d573d6000803e3d6000fd5b505050506040513d6020811015611a4357600080fd5b5051905086811015611a865760405162461bcd60e51b81526004018080602001828103825260278152602001806144796027913960400191505060405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632e1a7d4d826040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b158015611aec57600080fd5b505af1158015611b00573d6000803e3d6000fd5b5050505061187b84826130d8565b60608142811015611b54576040805162461bcd60e51b8152602060048201526014602482015260008051602061433f833981519152604482015290519081900360640190fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031686866000818110611b8b57fe5b905060200201356001600160a01b03166001600160a01b031614611be4576040805162461bcd60e51b81526020600482015260196024820152600080516020614459833981519152604482015290519081900360640190fd5b611c427f0000000000000000000000000000000000000000000000000000000000000000348888808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152506132a892505050565b91508682600184510381518110611c5557fe5b60200260200101511015611c9a5760405162461bcd60e51b81526004018080602001828103825260278152602001806144796027913960400191505060405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db083600081518110611cd657fe5b60200260200101516040518263ffffffff1660e01b81526004016000604051808303818588803b158015611d0957600080fd5b505af1158015611d1d573d6000803e3d6000fd5b50505050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a9059cbb611d827f00000000000000000000000000000000000000000000000000000000000000008989600081811061169e57fe5b84600081518110611d8f57fe5b60200260200101516040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050602060405180830381600087803b158015611ddd57600080fd5b505af1158015611df1573d6000803e3d6000fd5b505050506040513d6020811015611e0757600080fd5b5051611e0f57fe5b611e4e82878780806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250899250613611915050565b5095945050505050565b6000610dbe848484613cd8565b60608142811015611eab576040805162461bcd60e51b8152602060048201526014602482015260008051602061433f833981519152604482015290519081900360640190fd5b611f097f00000000000000000000000000000000000000000000000000000000000000008988888080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061384e92505050565b91508682600081518110611f1957fe5b6020026020010151111561131f5760405162461bcd60e51b81526004018080602001828103825260238152602001806144366023913960400191505060405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000081565b6000610dbe848484613db0565b60008142811015611fd5576040805162461bcd60e51b8152602060048201526014602482015260008051602061433f833981519152604482015290519081900360640190fd5b612004887f00000000000000000000000000000000000000000000000000000000000000008989893089612486565b90508092505061208d88858a6001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561205c57600080fd5b505afa158015612070573d6000803e3d6000fd5b505050506040513d602081101561208657600080fd5b5051612f6e565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632e1a7d4d836040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b1580156120f357600080fd5b505af1158015612107573d6000803e3d6000fd5b505050506110e884836130d8565b8042811015612159576040805162461bcd60e51b8152602060048201526014602482015260008051602061433f833981519152604482015290519081900360640190fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168585600081811061219057fe5b905060200201356001600160a01b03166001600160a01b0316146121e9576040805162461bcd60e51b81526020600482015260196024820152600080516020614459833981519152604482015290519081900360640190fd5b60003490507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db0826040518263ffffffff1660e01b81526004016000604051808303818588803b15801561224957600080fd5b505af115801561225d573d6000803e3d6000fd5b50505050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a9059cbb6122c27f00000000000000000000000000000000000000000000000000000000000000008989600081811061169e57fe5b836040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050602060405180830381600087803b15801561230957600080fd5b505af115801561231d573d6000803e3d6000fd5b505050506040513d602081101561233357600080fd5b505161233b57fe5b60008686600019810181811061234d57fe5b905060200201356001600160a01b03166001600160a01b03166370a08231866040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b1580156123a957600080fd5b505afa1580156123bd573d6000803e3d6000fd5b505050506040513d60208110156123d357600080fd5b505160408051602089810282810182019093528982529293506124159290918a918a918291850190849080828437600092019190915250899250613986915050565b8761183e828989600019810181811061242a57fe5b905060200201356001600160a01b03166001600160a01b03166370a08231896040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561180c57600080fd5b60008082428110156124cd576040805162461bcd60e51b8152602060048201526014602482015260008051602061433f833981519152604482015290519081900360640190fd5b60006124fa7f00000000000000000000000000000000000000000000000000000000000000008c8c6133f4565b604080516323b872dd60e01b81523360048201526001600160a01b03831660248201819052604482018d9052915192935090916323b872dd916064808201926020929091908290030181600087803b15801561255557600080fd5b505af1158015612569573d6000803e3d6000fd5b505050506040513d602081101561257f57600080fd5b50506040805163226bf2d160e21b81526001600160a01b03888116600483015282516000938493928616926389afcb44926024808301939282900301818787803b1580156125cc57600080fd5b505af11580156125e0573d6000803e3d6000fd5b505050506040513d60408110156125f657600080fd5b508051602090910151909250905060006126108e8e613e56565b509050806001600160a01b03168e6001600160a01b031614612633578183612636565b82825b90975095508a87101561267a5760405162461bcd60e51b81526004018080602001828103825260228152602001806143cf6022913960400191505060405180910390fd5b898610156126b95760405162461bcd60e51b81526004018080602001828103825260228152602001806144a06022913960400191505060405180910390fd5b505050505097509795505050505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b60606111207f000000000000000000000000000000000000000000000000000000000000000084846132a8565b600080600061276b7f00000000000000000000000000000000000000000000000000000000000000008e7f00000000000000000000000000000000000000000000000000000000000000006133f4565b905060008761277a578c61277e565b6000195b6040805163d505accf60e01b815233600482015230602482015260448101839052606481018c905260ff8a16608482015260a4810189905260c4810188905290519192506001600160a01b0384169163d505accf9160e48082019260009290919082900301818387803b1580156127f457600080fd5b505af1158015612808573d6000803e3d6000fd5b5050505061281a8e8e8e8e8e8e610c97565b909f909e509c50505050505050505050505050565b60008060008342811015612878576040805162461bcd60e51b8152602060048201526014602482015260008051602061433f833981519152604482015290519081900360640190fd5b6128868c8c8c8c8c8c613f34565b909450925060006128b87f00000000000000000000000000000000000000000000000000000000000000008e8e6133f4565b90506128c68d3383886134b4565b6128d28c3383876134b4565b806001600160a01b0316636a627842886040518263ffffffff1660e01b815260040180826001600160a01b03168152602001915050602060405180830381600087803b15801561292157600080fd5b505af1158015612935573d6000803e3d6000fd5b505050506040513d602081101561294b57600080fd5b5051949d939c50939a509198505050505050505050565b600080600083428110156129ab576040805162461bcd60e51b8152602060048201526014602482015260008051602061433f833981519152604482015290519081900360640190fd5b6129d98a7f00000000000000000000000000000000000000000000000000000000000000008b348c8c613f34565b90945092506000612a2b7f00000000000000000000000000000000000000000000000000000000000000008c7f00000000000000000000000000000000000000000000000000000000000000006133f4565b9050612a398b3383886134b4565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db0856040518263ffffffff1660e01b81526004016000604051808303818588803b158015612a9457600080fd5b505af1158015612aa8573d6000803e3d6000fd5b50505050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a9059cbb82866040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050602060405180830381600087803b158015612b2457600080fd5b505af1158015612b38573d6000803e3d6000fd5b505050506040513d6020811015612b4e57600080fd5b5051612b5657fe5b806001600160a01b0316636a627842886040518263ffffffff1660e01b815260040180826001600160a01b03168152602001915050602060405180830381600087803b158015612ba557600080fd5b505af1158015612bb9573d6000803e3d6000fd5b505050506040513d6020811015612bcf57600080fd5b5051925034841015612be757612be7338534036130d8565b505096509650969350505050565b60608142811015612c3b576040805162461bcd60e51b8152602060048201526014602482015260008051602061433f833981519152604482015290519081900360640190fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031686866000818110612c7257fe5b905060200201356001600160a01b03166001600160a01b031614612ccb576040805162461bcd60e51b81526020600482015260196024820152600080516020614459833981519152604482015290519081900360640190fd5b612d297f00000000000000000000000000000000000000000000000000000000000000008888888080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061384e92505050565b91503482600081518110612d3957fe5b60200260200101511115612d7e5760405162461bcd60e51b81526004018080602001828103825260238152602001806144366023913960400191505060405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db083600081518110612dba57fe5b60200260200101516040518263ffffffff1660e01b81526004016000604051808303818588803b158015612ded57600080fd5b505af1158015612e01573d6000803e3d6000fd5b50505050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a9059cbb612e667f00000000000000000000000000000000000000000000000000000000000000008989600081811061169e57fe5b84600081518110612e7357fe5b60200260200101516040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050602060405180830381600087803b158015612ec157600080fd5b505af1158015612ed5573d6000803e3d6000fd5b505050506040513d6020811015612eeb57600080fd5b5051612ef357fe5b612f3282878780806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250899250613611915050565b81600081518110612f3f57fe5b6020026020010151341115611e4e57611e4e3383600081518110612f5f57fe5b602002602001015134036130d8565b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180516001600160e01b031663a9059cbb60e01b178152925182516000946060949389169392918291908083835b60208310612feb5780518252601f199092019160209182019101612fcc565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d806000811461304d576040519150601f19603f3d011682016040523d82523d6000602084013e613052565b606091505b5091509150818015613080575080511580613080575080806020019051602081101561307d57600080fd5b50515b6130d1576040805162461bcd60e51b815260206004820152601f60248201527f5472616e7366657248656c7065723a205452414e534645525f4641494c454400604482015290519081900360640190fd5b5050505050565b604080516000808252602082019092526001600160a01b0384169083906040518082805190602001908083835b602083106131245780518252601f199092019160209182019101613105565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114613186576040519150601f19603f3d011682016040523d82523d6000602084013e61318b565b606091505b50509050806131cb5760405162461bcd60e51b81526004018080602001828103825260238152602001806144c26023913960400191505060405180910390fd5b505050565b60008084116132105760405162461bcd60e51b81526004018080602001828103825260278152602001806143806027913960400191505060405180910390fd5b6000831180156132205750600082115b61325b5760405162461bcd60e51b81526004018080602001828103825260248152602001806143f16024913960400191505060405180910390fd5b6000613269856103e56141c5565b9050600061327782856141c5565b905060006132918361328b886103e86141c5565b90614228565b905080828161329c57fe5b04979650505050505050565b6060600282511015613301576040805162461bcd60e51b815260206004820152601a60248201527f5369636c654c6962726172793a20494e56414c49445f50415448000000000000604482015290519081900360640190fd5b815167ffffffffffffffff8111801561331957600080fd5b50604051908082528060200260200182016040528015613343578160200160208202803683370190505b509050828160008151811061335457fe5b60200260200101818152505060005b60018351038110156133ec576000806133a68786858151811061338257fe5b602002602001015187866001018151811061339957fe5b6020026020010151614277565b915091506133c88484815181106133b957fe5b602002602001015183836131d0565b8484600101815181106133d757fe5b60209081029190910101525050600101613363565b509392505050565b60008060006134038585613e56565b604080516bffffffffffffffffffffffff19606094851b811660208084019190915293851b81166034830152825160288184030181526048830184528051908501206001600160f81b031960688401529a90941b9093166069840152607d8301989098527f3ee592b88a211a0903742ea9c61347cc9de422f143faf804401ff5d091f797cb609d808401919091528851808403909101815260bd909201909752805196019590952095945050505050565b604080516001600160a01b0385811660248301528481166044830152606480830185905283518084039091018152608490920183526020820180516001600160e01b03166323b872dd60e01b17815292518251600094606094938a169392918291908083835b602083106135395780518252601f19909201916020918201910161351a565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d806000811461359b576040519150601f19603f3d011682016040523d82523d6000602084013e6135a0565b606091505b50915091508180156135ce5750805115806135ce57508080602001905160208110156135cb57600080fd5b50515b6136095760405162461bcd60e51b81526004018080602001828103825260248152602001806144e56024913960400191505060405180910390fd5b505050505050565b60005b60018351038110156138485760008084838151811061362f57fe5b602002602001015185846001018151811061364657fe5b602002602001015191509150600061365e8383613e56565b509050600087856001018151811061367257fe5b60200260200101519050600080836001600160a01b0316866001600160a01b0316146136a0578260006136a4565b6000835b91509150600060028a510388106136bb57886136fc565b6136fc7f0000000000000000000000000000000000000000000000000000000000000000878c8b600201815181106136ef57fe5b60200260200101516133f4565b90506137297f000000000000000000000000000000000000000000000000000000000000000088886133f4565b6001600160a01b031663022c0d9f84848460006040519080825280601f01601f191660200182016040528015613766576020820181803683370190505b506040518563ffffffff1660e01b815260040180858152602001848152602001836001600160a01b0316815260200180602001828103825283818151815260200191508051906020019080838360005b838110156137ce5781810151838201526020016137b6565b50505050905090810190601f1680156137fb5780820380516001836020036101000a031916815260200191505b5095505050505050600060405180830381600087803b15801561381d57600080fd5b505af1158015613831573d6000803e3d6000fd5b505060019099019850613614975050505050505050565b50505050565b60606002825110156138a7576040805162461bcd60e51b815260206004820152601a60248201527f5369636c654c6962726172793a20494e56414c49445f50415448000000000000604482015290519081900360640190fd5b815167ffffffffffffffff811180156138bf57600080fd5b506040519080825280602002602001820160405280156138e9578160200160208202803683370190505b50905082816001835103815181106138fd57fe5b60209081029190910101528151600019015b80156133ec5760008061393f8786600186038151811061392b57fe5b602002602001015187868151811061339957fe5b9150915061396184848151811061395257fe5b60200260200101518383613cd8565b84600185038151811061397057fe5b602090810291909101015250506000190161390f565b60005b60018351038110156131cb576000808483815181106139a457fe5b60200260200101518584600101815181106139bb57fe5b60200260200101519150915060006139d38383613e56565b5090506000613a037f000000000000000000000000000000000000000000000000000000000000000085856133f4565b9050600080600080846001600160a01b0316630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b158015613a4457600080fd5b505afa158015613a58573d6000803e3d6000fd5b505050506040513d6060811015613a6e57600080fd5b5080516020909101516001600160701b0391821693501690506000806001600160a01b038a811690891614613aa4578284613aa7565b83835b91509150613afc828b6001600160a01b03166370a082318a6040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561180c57600080fd5b9550613b098683836131d0565b945050505050600080856001600160a01b0316886001600160a01b031614613b3357826000613b37565b6000835b91509150600060028c51038a10613b4e578a613b82565b613b827f0000000000000000000000000000000000000000000000000000000000000000898e8d600201815181106136ef57fe5b604080516000808252602082019283905263022c0d9f60e01b835260248201878152604483018790526001600160a01b038086166064850152608060848501908152845160a48601819052969750908c169563022c0d9f958a958a958a9591949193919260c486019290918190849084905b83811015613c0c578181015183820152602001613bf4565b50505050905090810190601f168015613c395780820380516001836020036101000a031916815260200191505b5095505050505050600060405180830381600087803b158015613c5b57600080fd5b505af1158015613c6f573d6000803e3d6000fd5b50506001909b019a506139899950505050505050505050565b80820382811115611123576040805162461bcd60e51b815260206004820152601560248201527464732d6d6174682d7375622d756e646572666c6f7760581b604482015290519081900360640190fd5b6000808411613d185760405162461bcd60e51b81526004018080602001828103825260288152602001806143a76028913960400191505060405180910390fd5b600083118015613d285750600082115b613d635760405162461bcd60e51b81526004018080602001828103825260248152602001806143f16024913960400191505060405180910390fd5b6000613d7b6103e8613d7586886141c5565b906141c5565b90506000613d8f6103e5613d758689613c88565b9050613da66001828481613d9f57fe5b0490614228565b9695505050505050565b6000808411613df05760405162461bcd60e51b81526004018080602001828103825260218152602001806144156021913960400191505060405180910390fd5b600083118015613e005750600082115b613e3b5760405162461bcd60e51b81526004018080602001828103825260248152602001806143f16024913960400191505060405180910390fd5b82613e4685846141c5565b81613e4d57fe5b04949350505050565b600080826001600160a01b0316846001600160a01b03161415613eaa5760405162461bcd60e51b815260040180806020018281038252602181526020018061435f6021913960400191505060405180910390fd5b826001600160a01b0316846001600160a01b031610613eca578284613ecd565b83835b90925090506001600160a01b038216613f2d576040805162461bcd60e51b815260206004820152601a60248201527f5369636c654c6962726172793a205a45524f5f41444452455353000000000000604482015290519081900360640190fd5b9250929050565b60008060006001600160a01b03167f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663e6a439058a8a6040518363ffffffff1660e01b815260040180836001600160a01b03168152602001826001600160a01b031681526020019250505060206040518083038186803b158015613fc057600080fd5b505afa158015613fd4573d6000803e3d6000fd5b505050506040513d6020811015613fea57600080fd5b50516001600160a01b031614156140a8577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663c9c6539689896040518363ffffffff1660e01b815260040180836001600160a01b03168152602001826001600160a01b0316815260200192505050602060405180830381600087803b15801561407b57600080fd5b505af115801561408f573d6000803e3d6000fd5b505050506040513d60208110156140a557600080fd5b50505b6000806140d67f00000000000000000000000000000000000000000000000000000000000000008b8b614277565b915091508160001480156140e8575080155b156140f8578793508692506141b8565b6000614105898484613db0565b9050878111614158578581101561414d5760405162461bcd60e51b81526004018080602001828103825260228152602001806144a06022913960400191505060405180910390fd5b8894509250826141b6565b6000614165898486613db0565b90508981111561417157fe5b878110156141b05760405162461bcd60e51b81526004018080602001828103825260228152602001806143cf6022913960400191505060405180910390fd5b94508793505b505b5050965096945050505050565b60008115806141e0575050808202828282816141dd57fe5b04145b611123576040805162461bcd60e51b815260206004820152601460248201527364732d6d6174682d6d756c2d6f766572666c6f7760601b604482015290519081900360640190fd5b80820182811015611123576040805162461bcd60e51b815260206004820152601460248201527364732d6d6174682d6164642d6f766572666c6f7760601b604482015290519081900360640190fd5b60008060006142868585613e56565b5090506000806142978888886133f4565b6001600160a01b0316630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b1580156142cf57600080fd5b505afa1580156142e3573d6000803e3d6000fd5b505050506040513d60608110156142f957600080fd5b5080516020909101516001600160701b0391821693501690506001600160a01b038781169084161461432c57808261432f565b81815b9099909850965050505050505056fe5369636c65526f757465723a20455850495245440000000000000000000000005369636c654c6962726172793a204944454e544943414c5f4144445245535345535369636c654c6962726172793a20494e53554646494349454e545f494e5055545f414d4f554e545369636c654c6962726172793a20494e53554646494349454e545f4f55545055545f414d4f554e545369636c65526f757465723a20494e53554646494349454e545f415f414d4f554e545369636c654c6962726172793a20494e53554646494349454e545f4c49515549444954595369636c654c6962726172793a20494e53554646494349454e545f414d4f554e545369636c65526f757465723a204558434553534956455f494e5055545f414d4f554e545369636c65526f757465723a20494e56414c49445f50415448000000000000005369636c65526f757465723a20494e53554646494349454e545f4f55545055545f414d4f554e545369636c65526f757465723a20494e53554646494349454e545f425f414d4f554e545472616e7366657248656c7065723a204554485f5452414e534645525f4641494c45445472616e7366657248656c7065723a205452414e534645525f46524f4d5f4641494c4544a2646970667358221220ab0f7300b6eeb0e16143c8648d82624d9041160e28ed2410f70eb9a1d601352164736f6c634300060c0033000000000000000000000000cbd879daa863f3d9f6520ca8d00343b901ee725c00000000000000000000000021be370d5312f44cb42ce377bc9b8a0cef1a4c83

Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)

000000000000000000000000cbd879daa863f3d9f6520ca8d00343b901ee725c00000000000000000000000021be370d5312f44cb42ce377bc9b8a0cef1a4c83

-----Decoded View---------------
Arg [0] : _factory (address): 0xcbd879daa863f3d9f6520ca8d00343b901ee725c
Arg [1] : _WETH (address): 0x21be370d5312f44cb42ce377bc9b8a0cef1a4c83

-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 000000000000000000000000cbd879daa863f3d9f6520ca8d00343b901ee725c
Arg [1] : 00000000000000000000000021be370d5312f44cb42ce377bc9b8a0cef1a4c83


Deployed ByteCode Sourcemap

16574:18305:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17049:10;-1:-1:-1;;;;;17063:4:0;17049:18;;17042:26;;;;16574:18305;;;;;21131:673;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;21131:673:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;33839:258;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;33839:258:0;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;28209:834;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;28209:834:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;28209:834:0;;;;;;;;;;;;-1:-1:-1;28209:834:0;-1:-1:-1;;;;;;28209:834:0;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34627:249;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;34627:249:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;34627:249:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;34627:249:0;;-1:-1:-1;34627:249:0;;-1:-1:-1;;;;;34627:249:0:i;21810:669::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;21810:669:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;25482:616::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;25482:616:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;25482:616:0;;;;;;;;;;;;-1:-1:-1;25482:616:0;-1:-1:-1;;;;;;25482:616:0;;;;;;;;:::i;27391:812::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;27391:812:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;27391:812:0;;;;;;;;;;;;-1:-1:-1;27391:812:0;-1:-1:-1;;;;;;27391:812:0;;;;;;;;:::i;23936:710::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;23936:710:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;31191:716::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;31191:716:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;31191:716:0;;;;;;;;;;;;-1:-1:-1;31191:716:0;-1:-1:-1;;;;;;31191:716:0;;;;;;;;:::i;32767:836::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;32767:836:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;32767:836:0;;;;;;;;;;;;-1:-1:-1;32767:836:0;-1:-1:-1;;;;;;32767:836:0;;;;;;;;:::i;26704:681::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;26704:681:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;26704:681:0;;;;;;;;;;;;-1:-1:-1;26704:681:0;-1:-1:-1;;;;;;26704:681:0;;;;;;;;:::i;34105:257::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;34105:257:0;;;;;;;;;;;;:::i;26104:594::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;26104:594:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;26104:594:0;;;;;;;;;;;;-1:-1:-1;26104:594:0;-1:-1:-1;;;;;;26104:594:0;;;;;;;;:::i;16707:38::-;;;;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;16707:38:0;;;;;;;;;;;;;;33647:184;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;33647:184:0;;;;;;;;;;;;:::i;23225:705::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;23225:705:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;31913:848::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;31913:848:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;31913:848:0;;;;;;;;;;;;-1:-1:-1;31913:848:0;-1:-1:-1;;;;;;31913:848:0;;;;;;;;:::i;20284:841::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;20284:841:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;16659:41::-;;;;;;;;;;;;;:::i;34370:249::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;34370:249:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;34370:249:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;34370:249:0;;-1:-1:-1;34370:249:0;;-1:-1:-1;;;;;34370:249:0:i;22485:661::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;22485:661:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;18539:730::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;18539:730:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;19275:966;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;19275:966:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;29049:794::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;29049:794:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;29049:794:0;;;;;;;;;;;;-1:-1:-1;29049:794:0;-1:-1:-1;;;;;;29049:794:0;;;;;;;;:::i;21131:673::-;21368:16;21386:14;21349:8;16816:15;16804:8;:27;;16796:60;;;;;-1:-1:-1;;;16796:60:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;16796:60:0;;;;;;;;;;;;;;;21440:196:::1;21470:5;21490:4;21509:9;21533:14;21562:12;21597:4;21617:8;21440:15;:196::i;:::-;21413:223:::0;;-1:-1:-1;21413:223:0;-1:-1:-1;21647:51:0::1;21675:5:::0;21682:2;21413:223;21647:27:::1;:51::i;:::-;21715:4;-1:-1:-1::0;;;;;21709:20:0::1;;21730:9;21709:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;21751:45;21782:2;21786:9;21751:30;:45::i;:::-;21131:673:::0;;;;;;;;;;:::o;33839:258::-;33992:14;34031:58;34057:8;34067:9;34078:10;34031:25;:58::i;:::-;34024:65;33839:258;-1:-1:-1;;;;33839:258:0:o;28209:834::-;28423:21;28395:8;16816:15;16804:8;:27;;16796:60;;;;;-1:-1:-1;;;16796:60:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;16796:60:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;28495:4:0::1;28470:29;:4:::0;;-1:-1:-1;;28475:15:0;;28470:21;;::::1;;;;;;;;;;;-1:-1:-1::0;;;;;28470:21:0::1;-1:-1:-1::0;;;;;28470:29:0::1;;28462:67;;;::::0;;-1:-1:-1;;;28462:67:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;;;;;;;;;28462:67:0;;;;;;;;;;;;;::::1;;28550:51;28577:7;28586:8;28596:4;;28550:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;28550:26:0::1;::::0;-1:-1:-1;;;28550:51:0:i:1;:::-;28540:61;;28651:12;28620:7;28645:1;28628:7;:14;:18;28620:27;;;;;;;;;;;;;;:43;;28612:95;;;;-1:-1:-1::0;;;28612:95:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28718:137;28764:4;;28769:1;28764:7;;;;;;;;;;;;;-1:-1:-1::0;;;;;28764:7:0::1;28773:10;28785:47;28806:7;28815:4;;28820:1;28815:7;;;;;;;;;;;;;-1:-1:-1::0;;;;;28815:7:0::1;28824:4;;28829:1;28824:7;;;;;;;;;;;;;-1:-1:-1::0;;;;;28824:7:0::1;28785:20;:47::i;:::-;28834:7;28842:1;28834:10;;;;;;;;;;;;;;28718:31;:137::i;:::-;28866:35;28872:7;28881:4;;28866:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;28895:4:0::1;::::0;-1:-1:-1;28866:5:0::1;::::0;-1:-1:-1;;28866:35:0:i:1;:::-;28918:4;-1:-1:-1::0;;;;;28912:20:0::1;;28933:7;28958:1;28941:7;:14;:18;28933:27;;;;;;;;;;;;;;28912:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;28972:63;29003:2;29007:7;29032:1;29015:7;:14;:18;29007:27;;;;;;;;;;;;;;28972:30;:63::i;:::-;28209:834:::0;;;;;;;;;:::o;34627:249::-;34771:21;34817:51;34843:7;34852:9;34863:4;34817:25;:51::i;:::-;34810:58;;34627:249;;;;;:::o;21810:669::-;22116:12;22130;22155;22170:45;22191:7;22200:6;22208;22170:20;:45::i;:::-;22155:60;;22226:10;22239;:33;;22263:9;22239:33;;;-1:-1:-1;;22239:33:0;22283:76;;;-1:-1:-1;;;22283:76:0;;22307:10;22283:76;;;;22327:4;22283:76;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22226:46;;-1:-1:-1;;;;;;22283:23:0;;;;;:76;;;;;-1:-1:-1;;22283:76:0;;;;;;;;-1:-1:-1;22283:23:0;:76;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22391:80;22407:6;22415;22423:9;22434:10;22446;22458:2;22462:8;22391:15;:80::i;:::-;22370:101;;;;;;;;21810:669;;;;;;;;;;;;;;;;:::o;25482:616::-;25706:21;25687:8;16816:15;16804:8;:27;;16796:60;;;;;-1:-1:-1;;;16796:60:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;16796:60:0;;;;;;;;;;;;;;;25750:51:::1;25777:7;25786:8;25796:4;;25750:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;25750:26:0::1;::::0;-1:-1:-1;;;25750:51:0:i:1;:::-;25740:61;;25851:12;25820:7;25845:1;25828:7;:14;:18;25820:27;;;;;;;;;;;;;;:43;;25812:95;;;;-1:-1:-1::0;;;25812:95:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25918:137;25964:4;;25969:1;25964:7;;;;;;25918:137;26066:24;26072:7;26081:4;;26066:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;26087:2:0;;-1:-1:-1;26066:5:0::1;::::0;-1:-1:-1;;26066:24:0:i:1;27391:812::-:0;27605:21;27577:8;16816:15;16804:8;:27;;16796:60;;;;;-1:-1:-1;;;16796:60:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;16796:60:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;27677:4:0::1;27652:29;:4:::0;;-1:-1:-1;;27657:15:0;;27652:21;;::::1;;;;;;;;;;;-1:-1:-1::0;;;;;27652:21:0::1;-1:-1:-1::0;;;;;27652:29:0::1;;27644:67;;;::::0;;-1:-1:-1;;;27644:67:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;;;;;;;;;27644:67:0;;;;;;;;;;;;;::::1;;27732:51;27758:7;27767:9;27778:4;;27732:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;27732:25:0::1;::::0;-1:-1:-1;;;27732:51:0:i:1;:::-;27722:61;;27816:11;27802:7;27810:1;27802:10;;;;;;;;;;;;;;:25;;27794:73;;;;-1:-1:-1::0;;;27794:73:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23936:710:::0;24254:14;24281:12;24296:42;24317:7;24326:5;24333:4;24296:20;:42::i;:::-;24281:57;;24349:10;24362;:33;;24386:9;24362:33;;;-1:-1:-1;;24362:33:0;24406:76;;;-1:-1:-1;;;24406:76:0;;24430:10;24406:76;;;;24450:4;24406:76;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24349:46;;-1:-1:-1;;;;;;24406:23:0;;;;;:76;;;;;-1:-1:-1;;24406:76:0;;;;;;;;-1:-1:-1;24406:23:0;:76;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24505:133;24567:5;24574:9;24585:14;24601:12;24615:2;24619:8;24505:47;:133::i;:::-;24493:145;23936:710;-1:-1:-1;;;;;;;;;;;;;23936:710:0:o;31191:716::-;31425:8;16816:15;16804:8;:27;;16796:60;;;;;-1:-1:-1;;;16796:60:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;16796:60:0;;;;;;;;;;;;;;;31446:135:::1;31492:4;;31497:1;31492:7;;;;;;;;;;;;;-1:-1:-1::0;;;;;31492:7:0::1;31501:10;31513:47;31534:7;31543:4;;31548:1;31543:7;;;;;;;;;;;;;-1:-1:-1::0;;;;;31543:7:0::1;31552:4;;31557:1;31552:7;;;;;;31513:47;31562:8;31446:31;:135::i;:::-;31592:18;31625:4:::0;;-1:-1:-1;;31630:15:0;;31625:21;;::::1;;;;;;;;;;;-1:-1:-1::0;;;;;31625:21:0::1;-1:-1:-1::0;;;;;31613:44:0::1;;31658:2;31613:48;;;;;;;;;;;;;-1:-1:-1::0;;;;;31613:48:0::1;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;31613:48:0;31672:44:::1;::::0;;31613:48:::1;31672:44:::0;;::::1;::::0;;;;;;;;;;;31613:48;;-1:-1:-1;31672:44:0::1;::::0;;;31707:4;;;;;;31672:44;::::1;::::0;31707:4;;31672:44;31707:4;31672:44;::::1;;::::0;::::1;::::0;;;;-1:-1:-1;31713:2:0;;-1:-1:-1;31672:34:0::1;::::0;-1:-1:-1;;31672:44:0:i:1;:::-;31820:12:::0;31749:67:::1;31802:13:::0;31761:4;;-1:-1:-1;;31766:15:0;;31761:21;;::::1;;;;;;;;;;;-1:-1:-1::0;;;;;31761:21:0::1;-1:-1:-1::0;;;;;31749:44:0::1;;31794:2;31749:48;;;;;;;;;;;;;-1:-1:-1::0;;;;;31749:48:0::1;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;31749:48:0;;:52:::1;:67::i;:::-;:83;;31727:172;;;;-1:-1:-1::0;;;31727:172:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16867:1;31191:716:::0;;;;;;;:::o;32767:836::-;33034:8;16816:15;16804:8;:27;;16796:60;;;;;-1:-1:-1;;;16796:60:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;16796:60:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;33093:4:0::1;33068:29;:4:::0;;-1:-1:-1;;33073:15:0;;33068:21;;::::1;;;;;;;;;;;-1:-1:-1::0;;;;;33068:21:0::1;-1:-1:-1::0;;;;;33068:29:0::1;;33060:67;;;::::0;;-1:-1:-1;;;33060:67:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;;;;;;;;;33060:67:0;;;;;;;;;;;;;::::1;;33138:135;33184:4;;33189:1;33184:7;;;;;;33138:135;33284:55;33319:4;;33284:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;33333:4:0::1;::::0;-1:-1:-1;33284:34:0::1;::::0;-1:-1:-1;;33284:55:0:i:1;:::-;33350:14;33379:4;-1:-1:-1::0;;;;;33367:27:0::1;;33403:4;33367:42;;;;;;;;;;;;;-1:-1:-1::0;;;;;33367:42:0::1;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;33367:42:0;;-1:-1:-1;33428:25:0;;::::1;;33420:77;;;;-1:-1:-1::0;;;33420:77:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33514:4;-1:-1:-1::0;;;;;33508:20:0::1;;33529:9;33508:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;33550:45;33581:2;33585:9;33550:30;:45::i;26704:681::-:0;26920:21;26892:8;16816:15;16804:8;:27;;16796:60;;;;;-1:-1:-1;;;16796:60:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;16796:60:0;;;;;;;;;;;;;;;26978:4:::1;-1:-1:-1::0;;;;;26967:15:0::1;:4;;26972:1;26967:7;;;;;;;;;;;;;-1:-1:-1::0;;;;;26967:7:0::1;-1:-1:-1::0;;;;;26967:15:0::1;;26959:53;;;::::0;;-1:-1:-1;;;26959:53:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;;;;;;;;;26959:53:0;;;;;;;;;;;;;::::1;;27033:52;27060:7;27069:9;27080:4;;27033:52;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;27033:26:0::1;::::0;-1:-1:-1;;;27033:52:0:i:1;:::-;27023:62;;27135:12;27104:7;27129:1;27112:7;:14;:18;27104:27;;;;;;;;;;;;;;:43;;27096:95;;;;-1:-1:-1::0;;;27096:95:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27208:4;-1:-1:-1::0;;;;;27202:19:0::1;;27229:7;27237:1;27229:10;;;;;;;;;;;;;;27202:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;27266:4;-1:-1:-1::0;;;;;27260:20:0::1;;27281:47;27302:7;27311:4;;27316:1;27311:7;;;;;;27281:47;27330:7;27338:1;27330:10;;;;;;;;;;;;;;27260:81;;;;;;;;;;;;;-1:-1:-1::0;;;;;27260:81:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;27260:81:0;27253:89:::1;;;;27353:24;27359:7;27368:4;;27353:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;27374:2:0;;-1:-1:-1;27353:5:0::1;::::0;-1:-1:-1;;27353:24:0:i:1;:::-;26704:681:::0;;;;;;;;:::o;34105:257::-;34258:13;34296:58;34321:9;34332;34343:10;34296:24;:58::i;26104:594::-;26328:21;26309:8;16816:15;16804:8;:27;;16796:60;;;;;-1:-1:-1;;;16796:60:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;16796:60:0;;;;;;;;;;;;;;;26372:51:::1;26398:7;26407:9;26418:4;;26372:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;26372:25:0::1;::::0;-1:-1:-1;;;26372:51:0:i:1;:::-;26362:61;;26456:11;26442:7;26450:1;26442:10;;;;;;;;;;;;;;:25;;26434:73;;;;-1:-1:-1::0;;;26434:73:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16707:38:::0;;;:::o;33647:184::-;33744:12;33776:47;33795:7;33804:8;33814;33776:18;:47::i;23225:705::-;23491:14;23472:8;16816:15;16804:8;:27;;16796:60;;;;;-1:-1:-1;;;16796:60:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;16796:60:0;;;;;;;;;;;;;;;23534:196:::1;23564:5;23584:4;23603:9;23627:14;23656:12;23691:4;23711:8;23534:15;:196::i;:::-;23518:212;;;;;;23741:83;23769:5;23776:2;23792:5;-1:-1:-1::0;;;;;23780:28:0::1;;23817:4;23780:43;;;;;;;;;;;;;-1:-1:-1::0;;;;;23780:43:0::1;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;23780:43:0;23741:27:::1;:83::i;:::-;23841:4;-1:-1:-1::0;;;;;23835:20:0::1;;23856:9;23835:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;23877:45;23908:2;23912:9;23877:30;:45::i;31913:848::-:0;32173:8;16816:15;16804:8;:27;;16796:60;;;;;-1:-1:-1;;;16796:60:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;16796:60:0;;;;;;;;;;;;;;;32218:4:::1;-1:-1:-1::0;;;;;32207:15:0::1;:4;;32212:1;32207:7;;;;;;;;;;;;;-1:-1:-1::0;;;;;32207:7:0::1;-1:-1:-1::0;;;;;32207:15:0::1;;32199:53;;;::::0;;-1:-1:-1;;;32199:53:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;;;;;;;;;32199:53:0;;;;;;;;;;;;;::::1;;32263:13;32279:9;32263:25;;32305:4;-1:-1:-1::0;;;;;32299:19:0::1;;32326:8;32299:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;32361:4;-1:-1:-1::0;;;;;32355:20:0::1;;32376:47;32397:7;32406:4;;32411:1;32406:7;;;;;;32376:47;32425:8;32355:79;;;;;;;;;;;;;-1:-1:-1::0;;;;;32355:79:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;32355:79:0;32348:87:::1;;;;32446:18;32479:4:::0;;-1:-1:-1;;32484:15:0;;32479:21;;::::1;;;;;;;;;;;-1:-1:-1::0;;;;;32479:21:0::1;-1:-1:-1::0;;;;;32467:44:0::1;;32512:2;32467:48;;;;;;;;;;;;;-1:-1:-1::0;;;;;32467:48:0::1;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;32467:48:0;32526:44:::1;::::0;;32467:48:::1;32526:44:::0;;::::1;::::0;;;;;;;;;;;32467:48;;-1:-1:-1;32526:44:0::1;::::0;;;32561:4;;;;;;32526:44;::::1;::::0;32561:4;;32526:44;32561:4;32526:44;::::1;;::::0;::::1;::::0;;;;-1:-1:-1;32567:2:0;;-1:-1:-1;32526:34:0::1;::::0;-1:-1:-1;;32526:44:0:i:1;:::-;32674:12:::0;32603:67:::1;32656:13:::0;32615:4;;-1:-1:-1;;32620:15:0;;32615:21;;::::1;;;;;;;;;;;-1:-1:-1::0;;;;;32615:21:0::1;-1:-1:-1::0;;;;;32603:44:0::1;;32648:2;32603:48;;;;;;;;;;;;;-1:-1:-1::0;;;;;32603:48:0::1;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;20284:841:::0;20538:12;20552;20519:8;16816:15;16804:8;:27;;16796:60;;;;;-1:-1:-1;;;16796:60:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;16796:60:0;;;;;;;;;;;;;;;20577:12:::1;20592:45;20613:7;20622:6;20630;20592:20;:45::i;:::-;20648:58;::::0;;-1:-1:-1;;;20648:58:0;;20678:10:::1;20648:58;::::0;::::1;::::0;-1:-1:-1;;;;;20648:29:0;::::1;:58:::0;;;;;;;;;;;;;;20577:60;;-1:-1:-1;20648:29:0;;::::1;::::0;:58;;;;;::::1;::::0;;;;;;;;;-1:-1:-1;20648:29:0;:58;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;;20774:25:0::1;::::0;;-1:-1:-1;;;20774:25:0;;-1:-1:-1;;;;;20774:25:0;;::::1;;::::0;::::1;::::0;;;20744:12:::1;::::0;;;20774:21;;::::1;::::0;::::1;::::0;:25;;;;;;;;;;;20744:12;20774:21;:25;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;20774:25:0;;::::1;::::0;;::::1;::::0;;;-1:-1:-1;20774:25:0;-1:-1:-1;20811:14:0::1;20830:39;20854:6:::0;20862;20830:23:::1;:39::i;:::-;20810:59;;;20911:6;-1:-1:-1::0;;;;;20901:16:0::1;:6;-1:-1:-1::0;;;;;20901:16:0::1;;:58;;20942:7;20951;20901:58;;;20921:7;20930;20901:58;20880:79:::0;;-1:-1:-1;20880:79:0;-1:-1:-1;20978:21:0;;::::1;;20970:68;;;;-1:-1:-1::0;;;20970:68:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21068:10;21057:7;:21;;21049:68;;;;-1:-1:-1::0;;;21049:68:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16867:1;;;;20284:841:::0;;;;;;;;;;;:::o;16659:41::-;;;:::o;34370:249::-;34514:21;34560:51;34587:7;34596:8;34606:4;34560:26;:51::i;22485:661::-;22774:16;22792:14;22819:12;22834:42;22855:7;22864:5;22871:4;22834:20;:42::i;:::-;22819:57;;22887:10;22900;:33;;22924:9;22900:33;;;-1:-1:-1;;22900:33:0;22944:76;;;-1:-1:-1;;;22944:76:0;;22968:10;22944:76;;;;22988:4;22944:76;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22887:46;;-1:-1:-1;;;;;;22944:23:0;;;;;:76;;;;;-1:-1:-1;;22944:76:0;;;;;;;;-1:-1:-1;22944:23:0;:76;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23058:80;23077:5;23084:9;23095:14;23111:12;23125:2;23129:8;23058:18;:80::i;:::-;23031:107;;;;-1:-1:-1;22485:661:0;-1:-1:-1;;;;;;;;;;;;;22485:661:0:o;18539:730::-;18827:12;18841;18855:14;18808:8;16816:15;16804:8;:27;;16796:60;;;;;-1:-1:-1;;;16796:60:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;16796:60:0;;;;;;;;;;;;;;;18903:85:::1;18917:6;18925;18933:14;18949;18965:10;18977;18903:13;:85::i;:::-;18882:106:::0;;-1:-1:-1;18882:106:0;-1:-1:-1;18999:12:0::1;19014:45;19035:7;19044:6:::0;19052;19014:20:::1;:45::i;:::-;18999:60;;19070:66;19102:6;19110:10;19122:4;19128:7;19070:31;:66::i;:::-;19147;19179:6;19187:10;19199:4;19205:7;19147:31;:66::i;:::-;19247:4;-1:-1:-1::0;;;;;19236:21:0::1;;19258:2;19236:25;;;;;;;;;;;;;-1:-1:-1::0;;;;;19236:25:0::1;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;19236:25:0;18539:730;;;;-1:-1:-1;19236:25:0;;-1:-1:-1;18539:730:0;;-1:-1:-1;;;;;;;;;18539:730:0:o;19275:966::-;19528:16;19546:14;19562;19509:8;16816:15;16804:8;:27;;16796:60;;;;;-1:-1:-1;;;16796:60:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;16796:60:0;;;;;;;;;;;;;;;19616:176:::1;19644:5;19664:4;19683:18;19716:9;19740:14;19769:12;19616:13;:176::i;:::-;19589:203:::0;;-1:-1:-1;19589:203:0;-1:-1:-1;19803:12:0::1;19818:42;19839:7;19848:5:::0;19855:4:::1;19818:20;:42::i;:::-;19803:57;;19871:69;19903:5;19910:10;19922:4;19928:11;19871:31;:69::i;:::-;19957:4;-1:-1:-1::0;;;;;19951:19:0::1;;19978:9;19951:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;20014:4;-1:-1:-1::0;;;;;20008:20:0::1;;20029:4;20035:9;20008:37;;;;;;;;;;;;;-1:-1:-1::0;;;;;20008:37:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;20008:37:0;20001:45:::1;;;;20080:4;-1:-1:-1::0;;;;;20069:21:0::1;;20091:2;20069:25;;;;;;;;;;;;;-1:-1:-1::0;;;;;20069:25:0::1;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;20069:25:0;;-1:-1:-1;20145:9:0::1;:21:::0;-1:-1:-1;20141:92:0::1;;;20168:65;20199:10;20223:9;20211;:21;20168:30;:65::i;:::-;16867:1;19275:966:::0;;;;;;;;;;;:::o;29049:794::-;29262:21;29234:8;16816:15;16804:8;:27;;16796:60;;;;;-1:-1:-1;;;16796:60:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;16796:60:0;;;;;;;;;;;;;;;29320:4:::1;-1:-1:-1::0;;;;;29309:15:0::1;:4;;29314:1;29309:7;;;;;;;;;;;;;-1:-1:-1::0;;;;;29309:7:0::1;-1:-1:-1::0;;;;;29309:15:0::1;;29301:53;;;::::0;;-1:-1:-1;;;29301:53:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;;;;;;;;;29301:53:0;;;;;;;;;;;;;::::1;;29375:51;29401:7;29410:9;29421:4;;29375:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;29375:25:0::1;::::0;-1:-1:-1;;;29375:51:0:i:1;:::-;29365:61;;29459:9;29445:7;29453:1;29445:10;;;;;;;;;;;;;;:23;;29437:71;;;;-1:-1:-1::0;;;29437:71:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29525:4;-1:-1:-1::0;;;;;29519:19:0::1;;29546:7;29554:1;29546:10;;;;;;;;;;;;;;29519:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;29583:4;-1:-1:-1::0;;;;;29577:20:0::1;;29598:47;29619:7;29628:4;;29633:1;29628:7;;;;;;29598:47;29647:7;29655:1;29647:10;;;;;;;;;;;;;;29577:81;;;;;;;;;;;;;-1:-1:-1::0;;;;;29577:81:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;29577:81:0;29570:89:::1;;;;29670:24;29676:7;29685:4;;29670:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;29691:2:0;;-1:-1:-1;29670:5:0::1;::::0;-1:-1:-1;;29670:24:0:i:1;:::-;29757:7;29765:1;29757:10;;;;;;;;;;;;;;29745:9;:22;29741:94;;;29769:66;29800:10;29824:7;29832:1;29824:10;;;;;;;;;;;;;;29812:9;:22;29769:30;:66::i;1337:361::-:0;1532:45;;;-1:-1:-1;;;;;1532:45:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;1532:45:0;-1:-1:-1;;;1532:45:0;;;1521:57;;;;1486:12;;1500:17;;1521:10;;;;1532:45;1521:57;;;1532:45;1521:57;;1532:45;1521:57;;;;;;;;;;-1:-1:-1;;1521:57:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1485:93;;;;1597:7;:57;;;;-1:-1:-1;1609:11:0;;:16;;:44;;;1640:4;1629:24;;;;;;;;;;;;;;;-1:-1:-1;1629:24:0;1609:44;1589:101;;;;;-1:-1:-1;;;1589:101:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;1337:361;;;;;:::o;2116:195::-;2224:12;;;2186;2224;;;;;;;;;-1:-1:-1;;;;;2203:7:0;;;2217:5;;2203:34;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;2203:34:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2185:52;;;2256:7;2248:55;;;;-1:-1:-1;;;2248:55:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2116:195;;;:::o;7003:509::-;7096:14;7142:1;7131:8;:12;7123:64;;;;-1:-1:-1;;;7123:64:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7218:1;7206:9;:13;:31;;;;;7236:1;7223:10;:14;7206:31;7198:80;;;;-1:-1:-1;;;7198:80:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7289:20;7312:17;:8;7325:3;7312:12;:17::i;:::-;7289:40;-1:-1:-1;7340:14:0;7357:31;7289:40;7377:10;7357:19;:31::i;:::-;7340:48;-1:-1:-1;7399:16:0;7418:40;7442:15;7418:19;:9;7432:4;7418:13;:19::i;:::-;:23;;:40::i;:::-;7399:59;;7493:11;7481:9;:23;;;;;;;7003:509;-1:-1:-1;;;;;;;7003:509:0:o;8179:507::-;8280:21;8337:1;8322:4;:11;:16;;8314:55;;;;;-1:-1:-1;;;8314:55:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;8401:4;:11;8390:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;8390:23:0;;8380:33;;8437:8;8424:7;8432:1;8424:10;;;;;;;;;;;;;:21;;;;;8461:6;8456:223;8487:1;8473:4;:11;:15;8469:1;:19;8456:223;;;8511:14;8527:15;8546:42;8558:7;8567:4;8572:1;8567:7;;;;;;;;;;;;;;8576:4;8581:1;8585;8581:5;8576:11;;;;;;;;;;;;;;8546;:42::i;:::-;8510:78;;;;8620:47;8633:7;8641:1;8633:10;;;;;;;;;;;;;;8645:9;8656:10;8620:12;:47::i;:::-;8603:7;8611:1;8615;8611:5;8603:14;;;;;;;;;;;;;;;;;:64;-1:-1:-1;;8490:3:0;;8456:223;;;;8179:507;;;;;:::o;5532:478::-;5621:12;5647:14;5663;5681:26;5692:6;5700;5681:10;:26::i;:::-;5845:32;;;-1:-1:-1;;5845:32:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5835:43;;;;;;-1:-1:-1;;;;;;5748:251:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5738:262;;;;;;;;;5532:478;-1:-1:-1;;;;;5532:478:0:o;1706:402::-;1931:51;;;-1:-1:-1;;;;;1931:51:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;1931:51:0;-1:-1:-1;;;1931:51:0;;;1920:63;;;;1885:12;;1899:17;;1920:10;;;;1931:51;1920:63;;;1931:51;1920:63;;1931:51;1920:63;;;;;;;;;;-1:-1:-1;;1920:63:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1884:99;;;;2002:7;:57;;;;-1:-1:-1;2014:11:0;;:16;;:44;;;2045:4;2034:24;;;;;;;;;;;;;;;-1:-1:-1;2034:24:0;2014:44;1994:106;;;;-1:-1:-1;;;1994:106:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1706:402;;;;;;:::o;24757:719::-;24864:6;24859:610;24890:1;24876:4;:11;:15;24872:1;:19;24859:610;;;24914:13;24929:14;24948:4;24953:1;24948:7;;;;;;;;;;;;;;24957:4;24962:1;24966;24962:5;24957:11;;;;;;;;;;;;;;24913:56;;;;24985:14;25004:38;25028:5;25035:6;25004:23;:38::i;:::-;24984:58;;;25057:14;25074:7;25082:1;25086;25082:5;25074:14;;;;;;;;;;;;;;25057:31;;25104:15;25121;25149:6;-1:-1:-1;;;;;25140:15:0;:5;-1:-1:-1;;;;;25140:15:0;;:61;;25182:9;25198:1;25140:61;;;25164:1;25168:9;25140:61;25103:98;;;;25216:10;25247:1;25233:4;:11;:15;25229:1;:19;:78;;25304:3;25229:78;;;25251:50;25272:7;25281:6;25289:4;25294:1;25298;25294:5;25289:11;;;;;;;;;;;;;;25251:20;:50::i;:::-;25216:91;;25333:44;25354:7;25363:5;25370:6;25333:20;:44::i;:::-;-1:-1:-1;;;;;25322:61:0;;25402:10;25414;25426:2;25440:1;25430:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;25430:12:0;;25322:135;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;25322:135:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;24893:3:0;;;;;-1:-1:-1;24859:610:0;;-1:-1:-1;;;;;;;;24859:610:0;;;24757:719;;;:::o;8767:528::-;8868:21;8925:1;8910:4;:11;:16;;8902:55;;;;;-1:-1:-1;;;8902:55:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;8989:4;:11;8978:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;8978:23:0;;8968:33;;9042:9;9012:7;9037:1;9020:7;:14;:18;9012:27;;;;;;;;;;;;;;;;;:39;9076:11;;-1:-1:-1;;9076:15:0;9062:226;9093:5;;9062:226;;9121:14;9137:15;9156:42;9168:7;9177:4;9186:1;9182;:5;9177:11;;;;;;;;;;;;;;9190:4;9195:1;9190:7;;;;;;;9156:42;9120:78;;;;9230:46;9242:7;9250:1;9242:10;;;;;;;;;;;;;;9254:9;9265:10;9230:11;:46::i;:::-;9213:7;9225:1;9221;:5;9213:14;;;;;;;;;;;;;;;;;:63;-1:-1:-1;;;;9100:3:0;9062:226;;29990:1195;30103:6;30098:1080;30129:1;30115:4;:11;:15;30111:1;:19;30098:1080;;;30153:13;30168:14;30187:4;30192:1;30187:7;;;;;;;;;;;;;;30196:4;30201:1;30205;30201:5;30196:11;;;;;;;;;;;;;;30152:56;;;;30224:14;30243:38;30267:5;30274:6;30243:23;:38::i;:::-;30223:58;;;30296:15;30325:44;30346:7;30355:5;30362:6;30325:20;:44::i;:::-;30296:74;;30385:16;30416:17;30504:13;30519;30537:4;-1:-1:-1;;;;;30537:16:0;;:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;30537:18:0;;;;;;;-1:-1:-1;;;;;30503:52:0;;;;-1:-1:-1;30503:52:0;;-1:-1:-1;30571:17:0;;-1:-1:-1;;;;;30612:15:0;;;;;;;:61;;30654:8;30664;30612:61;;;30631:8;30641;30612:61;30570:103;;;;30702:61;30750:12;30714:5;-1:-1:-1;;;;;30702:28:0;;30739:4;30702:43;;;;;;;;;;;;;-1:-1:-1;;;;;30702:43:0;;;;;;;;;;;;;;;;;;;;;;;;;;:61;30688:75;;30793:67;30819:11;30832:12;30846:13;30793:25;:67::i;:::-;30778:82;;30098:1080;;;;30891:15;30908;30936:6;-1:-1:-1;;;;;30927:15:0;:5;-1:-1:-1;;;;;30927:15:0;;:67;;30972:12;30991:1;30927:67;;;30951:1;30955:12;30927:67;30890:104;;;;31009:10;31040:1;31026:4;:11;:15;31022:1;:19;:78;;31097:3;31022:78;;;31044:50;31065:7;31074:6;31082:4;31087:1;31091;31087:5;31082:11;;;;;;;31044:50;31153:12;;;31163:1;31153:12;;;;;;;;;;-1:-1:-1;;;31115:51:0;;;;;;;;;;;;;;-1:-1:-1;;;;;31115:51:0;;;;;;;;;;;;;;;;;;;;;;31009:91;;-1:-1:-1;31115:9:0;;;;;;31125:10;;31137;;31009:91;;31153:12;;31115:51;;;;;;;;31153:12;;31115:51;;;;31153:12;;31115:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;30132:3:0;;;;;-1:-1:-1;30098:1080:0;;-1:-1:-1;;;;;;;;;;30098:1080:0;455:129;539:5;;;534:16;;;;526:50;;;;;-1:-1:-1;;;526:50:0;;;;;;;;;;;;-1:-1:-1;;;526:50:0;;;;;;;;;;;;;;7633:464;7726:13;7772:1;7760:9;:13;7752:66;;;;-1:-1:-1;;;7752:66:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7849:1;7837:9;:13;:31;;;;;7867:1;7854:10;:14;7837:31;7829:80;;;;-1:-1:-1;;;7829:80:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7920:14;7937:34;7966:4;7937:24;:9;7951;7937:13;:24::i;:::-;:28;;:34::i;:::-;7920:51;-1:-1:-1;7982:16:0;8001:34;8031:3;8001:25;:10;8016:9;8001:14;:25::i;:34::-;7982:53;;8057:32;8087:1;8070:11;8058:9;:23;;;;;;;8057:29;:32::i;:::-;8046:43;7633:464;-1:-1:-1;;;;;;7633:464:0:o;6568:313::-;6650:12;6693:1;6683:7;:11;6675:57;;;;-1:-1:-1;;;6675:57:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6762:1;6751:8;:12;:28;;;;;6778:1;6767:8;:12;6751:28;6743:77;;;;-1:-1:-1;;;6743:77:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6865:8;6841:21;:7;6853:8;6841:11;:21::i;:::-;:32;;;;;;;6568:313;-1:-1:-1;;;;6568:313:0:o;5099:341::-;5174:14;5190;5235:6;-1:-1:-1;;;;;5225:16:0;:6;-1:-1:-1;;;;;5225:16:0;;;5217:62;;;;-1:-1:-1;;;5217:62:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5318:6;-1:-1:-1;;;;;5309:15:0;:6;-1:-1:-1;;;;;5309:15:0;;:53;;5347:6;5355;5309:53;;;5328:6;5336;5309:53;5290:72;;-1:-1:-1;5290:72:0;-1:-1:-1;;;;;;5381:20:0;;5373:59;;;;;-1:-1:-1;;;5373:59:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;5099:341;;;;;:::o;17171:1362::-;17389:12;17403;17542:1;-1:-1:-1;;;;;17484:60:0;17498:7;-1:-1:-1;;;;;17484:30:0;;17515:6;17523;17484:46;;;;;;;;;;;;;-1:-1:-1;;;;;17484:46:0;;;;;;-1:-1:-1;;;;;17484:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;17484:46:0;-1:-1:-1;;;;;17484:60:0;;17480:142;;;17575:7;-1:-1:-1;;;;;17561:33:0;;17595:6;17603;17561:49;;;;;;;;;;;;;-1:-1:-1;;;;;17561:49:0;;;;;;-1:-1:-1;;;;;17561:49:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;17480:142:0;17633:13;17648;17665:49;17690:7;17699:6;17707;17665:24;:49::i;:::-;17632:82;;;;17729:8;17741:1;17729:13;:30;;;;-1:-1:-1;17746:13:0;;17729:30;17725:801;;;17798:14;;-1:-1:-1;17814:14:0;;-1:-1:-1;17725:801:0;;;17862:19;17884:54;17903:14;17919:8;17929;17884:18;:54::i;:::-;17862:76;;17975:14;17957;:32;17953:562;;18036:10;18018:14;:28;;18010:75;;;;-1:-1:-1;;;18010:75:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18126:14;;-1:-1:-1;18142:14:0;-1:-1:-1;18142:14:0;17953:562;;;18198:19;18220:54;18239:14;18255:8;18265;18220:18;:54::i;:::-;18198:76;;18318:14;18300;:32;;18293:40;;;;18378:10;18360:14;:28;;18352:75;;;;-1:-1:-1;;;18352:75:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18468:14;-1:-1:-1;18484:14:0;;-1:-1:-1;17953:562:0;17725:801;;17171:1362;;;;;;;;;;;:::o;592:142::-;644:6;671;;;:30;;-1:-1:-1;;686:5:0;;;700:1;695;686:5;695:1;681:15;;;;;:20;671:30;663:63;;;;;-1:-1:-1;;;663:63:0;;;;;;;;;;;;-1:-1:-1;;;663:63:0;;;;;;;;;;;;;;319:128;403:5;;;398:16;;;;390:49;;;;;-1:-1:-1;;;390:49:0;;;;;;;;;;;;-1:-1:-1;;;390:49:0;;;;;;;;;;;;;;6068:387;6161:13;6176;6203:14;6222:26;6233:6;6241;6222:10;:26::i;:::-;6202:46;;;6260:13;6275;6304:32;6312:7;6321:6;6329;6304:7;:32::i;:::-;-1:-1:-1;;;;;6293:56:0;;:58;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;6293:58:0;;;;;;;-1:-1:-1;;;;;6259:92:0;;;;-1:-1:-1;6259:92:0;;-1:-1:-1;;;;;;6385:16:0;;;;;;;:62;;6428:8;6438;6385:62;;;6405:8;6415;6385:62;6362:85;;;;-1:-1:-1;6068:387:0;-1:-1:-1;;;;;;;6068:387:0:o

Swarm Source

ipfs://ab0f7300b6eeb0e16143c8648d82624d9041160e28ed2410f70eb9a1d6013521
Block Transaction Gas Used Reward
Age Block Fee Address BC Fee Address Voting Power Jailed Incoming
Validator ID :
0 FTM

Amount Staked
0

Amount Delegated
0

Staking Total
0

Staking Start Epoch
0

Staking Start Time
0

Proof of Importance
0

Origination Score
0

Validation Score
0

Active
0

Online
0

Downtime
0 s
Address Amount claimed Rewards Created On Epoch Created On
Block Uncle Number Difficulty Gas Used Reward
Loading
Loading
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.