Contract 0xe6fe3db4c5a2e4a9ab3301201b38724e578b35ca 1

DeFi  
Txn Hash Method
Block
From
To
Value [Txn Fee]
0x32153d67e15e57eb5f1a43b88581221ccb27dba0fce9af685e69c42e73bce76dSwap Tokens For ...41020442023-04-24 5:07:1835 days 6 hrs ago0xbe19479be9ec4f78d3da0e92ef640c8d6354f7b1 IN  Zenlink: Regular AMM Router0 MOVR0.002366026
0x4d97101bcf01557589a5c3e1845f698656b7f9b0a45636364adf66e8eaafcedeSwap Tokens For ...41020242023-04-24 5:03:0735 days 6 hrs ago0xbe19479be9ec4f78d3da0e92ef640c8d6354f7b1 IN  Zenlink: Regular AMM Router0 MOVR0.002665794
0xf89ed291bebbfe07f9e9bc8a3756538927723764b039354248462158188005c7Swap Tokens For ...41020132023-04-24 5:00:5535 days 6 hrs ago0xbe19479be9ec4f78d3da0e92ef640c8d6354f7b1 IN  Zenlink: Regular AMM Router0 MOVR0.002366026
0x21caa18f3485a202731e802e464ba43d967e492f8b9cd7be2e76112f3f85384fSwap Tokens For ...40116372023-04-11 6:39:4248 days 5 hrs ago0xbe19479be9ec4f78d3da0e92ef640c8d6354f7b1 IN  Zenlink: Regular AMM Router0 MOVR0.002665064407
0xb2d9dae55e88ce156d3630bed8480bc76f06aea7331dfb74eda84f15b38280a6Remove Liquidity39700852023-04-05 7:27:3154 days 4 hrs ago0x74f85fe5538dbfcf3b46399e121c3ba83f695f91 IN  Zenlink: Regular AMM Router0 MOVR0.000649389
0x001b993d75fcf3625b3158964b2726d7bea33e651d54f73ed6e5802cd73bf67dRemove Liquidity39700772023-04-05 7:25:5454 days 4 hrs ago0x74f85fe5538dbfcf3b46399e121c3ba83f695f91 IN  Zenlink: Regular AMM Router0 MOVR0.000649389
0x1cc96aa93531cdd0fafe7479e7c950561c03abe61f3b269b3ee8db768529d809Swap Tokens For ...38337972023-03-16 21:13:1873 days 14 hrs ago0xbe19479be9ec4f78d3da0e92ef640c8d6354f7b1 IN  Zenlink: Regular AMM Router0 MOVR0.000171296
0x9e09fa79cc92f4e40501216520f939e2351afd82f4bc884ff32416e0f3138a4dRemove Liquidity...38238892023-03-15 11:38:1275 days 13 mins ago0x94a2d53a3d99968e25b241ed1667d537670e6cb9 IN  Zenlink: Regular AMM Router0 MOVR0.000636435
0x4a6ee9d991c14143361251a13bdc8c6914b1f91846d1f5f5cd16b4e10d45ee30Remove Liquidity...38238752023-03-15 11:35:0675 days 16 mins ago0x94a2d53a3d99968e25b241ed1667d537670e6cb9 IN  Zenlink: Regular AMM Router0 MOVR0.000636435
0x3e5063bb062108eeadb173991a495309f706ab33b6237d17662e6e3159a643b7Swap Tokens For ...36319212023-02-15 23:34:18102 days 12 hrs ago0xbe19479be9ec4f78d3da0e92ef640c8d6354f7b1 IN  Zenlink: Regular AMM Router0 MOVR0.000171296
0x0453e323f772e9d666dc60902bf7900a78cefcc5c2e192c1c7a559a22f675291Swap Tokens For ...35598622023-02-05 18:33:12112 days 17 hrs ago0xbe19479be9ec4f78d3da0e92ef640c8d6354f7b1 IN  Zenlink: Regular AMM Router0 MOVR0.00235532
0xcbe573dde4e6884de2813488dba5d2439a274811ded3a7e4409fda178eb3ab8cSwap Exact Token...35598622023-02-05 18:33:12112 days 17 hrs ago0x2f71607a342bdd70bbce92474dbbade0cd0e4fd0 IN  Zenlink: Regular AMM Router0 MOVR0.007584673534
0x9d542c53bafa5ce575a9d25497d19e6d4c2649c4951a52ee8c8fc31dd7b7a447Swap Exact Token...35584292023-02-05 13:42:18112 days 22 hrs ago0xe1fa699860444be91d366c21de8fef56e3dec77a IN  Zenlink: Regular AMM Router0 MOVR0.002826054
0x92512d9e40c631539c5beef069bcf7a4f168e07a5de150298391b4d5b25af705Swap Exact Nativ...35582882023-02-05 13:13:18112 days 22 hrs ago0xe1fa699860444be91d366c21de8fef56e3dec77a IN  Zenlink: Regular AMM Router13.75 MOVR0.00691482
0xd2c4104b273c99935beb22fa94f335e380aaca3b1662c518c2c582aedf6f138bRemove Liquidity35503642023-02-04 10:16:36114 days 1 hr ago0x768f2a7ccdfde9ebdfd5cea8b635dd590cb3a3f1 IN  Zenlink: Regular AMM Router0 MOVR0.000538611
0x8d0729da133ca6bfea50e4093450cc2433c137686337b4ef75d229d7b7d9b337Swap Exact Token...35494392023-02-04 7:08:18114 days 4 hrs ago0xe1fa699860444be91d366c21de8fef56e3dec77a IN  Zenlink: Regular AMM Router0 MOVR0.00707124
0x556f6ce48b5628600dc8da095be6a2c976d5b0fb96efbebf77d84389c66aac93Swap Exact Token...35462592023-02-03 20:21:18114 days 15 hrs ago0xe1fa699860444be91d366c21de8fef56e3dec77a IN  Zenlink: Regular AMM Router0 MOVR0.008011806
0xe581b7ea32d6296a6bee3483a3b0422ed8954ddc585d4bde6c7981d045c9cce6Swap Exact Token...35462592023-02-03 20:21:18114 days 15 hrs ago0xe1fa699860444be91d366c21de8fef56e3dec77a IN  Zenlink: Regular AMM Router0 MOVR0.008011806
0x621722a3acb6e15740e706449f7114daee18869db0fab5785e89592e59330d51Swap Exact Token...35381762023-02-02 16:49:00115 days 19 hrs ago0xe1fa699860444be91d366c21de8fef56e3dec77a IN  Zenlink: Regular AMM Router0 MOVR0.008011806
0x3d36ed46dccc52a24983d736056cd301dc94e88cc7907589a58eab810b02cf2aSwap Exact Token...35381752023-02-02 16:48:42115 days 19 hrs ago0xe1fa699860444be91d366c21de8fef56e3dec77a IN  Zenlink: Regular AMM Router0 MOVR0.008011806
0xc51b4c763b3ff3ba18f0458ece8f1829ccbb489e24bee1de2183c58fedff48ebSwap Exact Token...35371092023-02-02 13:12:18115 days 22 hrs ago0xe1fa699860444be91d366c21de8fef56e3dec77a IN  Zenlink: Regular AMM Router0 MOVR0.00707124
0xbba37c182ef737d2a8ba4d386117ac851e7e77067f731b0478c45eff58b87406Swap Exact Token...35371022023-02-02 13:10:54115 days 22 hrs ago0xe1fa699860444be91d366c21de8fef56e3dec77a IN  Zenlink: Regular AMM Router0 MOVR0.00707124
0x9896fe3eaa3adf24a8f4b1af39cd9b8c135938f66b78791b43907b72b2a2644eSwap Exact Token...35363662023-02-02 10:40:06116 days 1 hr ago0xe1fa699860444be91d366c21de8fef56e3dec77a IN  Zenlink: Regular AMM Router0 MOVR0.00707124
0xd4ec3dd4cbca01f872a6fed5c466d5c4fc4502579a5b0e7af62141355eb743bdSwap Exact Token...35363612023-02-02 10:39:06116 days 1 hr ago0xe1fa699860444be91d366c21de8fef56e3dec77a IN  Zenlink: Regular AMM Router0 MOVR0.007072032
0x5c9e3cfe5e6f1aa7fd384a18a0aed79e415fcb594ed2109cb4a2db18c11983b1Swap Exact Token...35355302023-02-02 7:48:36116 days 4 hrs ago0xe1fa699860444be91d366c21de8fef56e3dec77a IN  Zenlink: Regular AMM Router0 MOVR0.00707124
[ Download CSV Export 

OVERVIEW

AMM Router contract of Zenlink.

Latest 25 internal transaction
Parent Txn Hash Block From To Value
0x65360612bc1e0c5d46ee839022739f4e75c2f5c90047d82e98ed2e5f26b0ec4c40628732023-04-18 14:27:1840 days 21 hrs ago Zenlink: Regular AMM Router Moonbeam Foundation: WMOVR Token3.333333333333333332 MOVR
0x65360612bc1e0c5d46ee839022739f4e75c2f5c90047d82e98ed2e5f26b0ec4c40628732023-04-18 14:27:1840 days 21 hrs ago 0x9db46d2391ef1843396624024d6a5fa73c5d1e02 Zenlink: Regular AMM Router3.333333333333333332 MOVR
0x6f70588887c99de54a0891d4c23b8df8ec8f2849d13d66aa5ee5a4d284f8e0ad40597572023-04-18 3:44:2441 days 8 hrs ago Zenlink: Regular AMM Router Moonbeam Foundation: WMOVR Token19.999999999999999992 MOVR
0x6f70588887c99de54a0891d4c23b8df8ec8f2849d13d66aa5ee5a4d284f8e0ad40597572023-04-18 3:44:2441 days 8 hrs ago 0x9db46d2391ef1843396624024d6a5fa73c5d1e02 Zenlink: Regular AMM Router19.999999999999999992 MOVR
0xd2986b799c47c5da8e31099532450be351843305991e17ae95deb74f5760f64c40597072023-04-18 3:33:3641 days 8 hrs ago Zenlink: Regular AMM Router Moonbeam Foundation: WMOVR Token14.999999999999999994 MOVR
0xd2986b799c47c5da8e31099532450be351843305991e17ae95deb74f5760f64c40597072023-04-18 3:33:3641 days 8 hrs ago 0x9db46d2391ef1843396624024d6a5fa73c5d1e02 Zenlink: Regular AMM Router14.999999999999999994 MOVR
0x472e5ffa2611d5a80ca299b7e830d383c26d694c7ce309c6d5c4e0179dbf8a5540596842023-04-18 3:28:4241 days 8 hrs ago Zenlink: Regular AMM Router Moonbeam Foundation: WMOVR Token1.666666666666666666 MOVR
0x472e5ffa2611d5a80ca299b7e830d383c26d694c7ce309c6d5c4e0179dbf8a5540596842023-04-18 3:28:4241 days 8 hrs ago 0x9db46d2391ef1843396624024d6a5fa73c5d1e02 Zenlink: Regular AMM Router1.666666666666666666 MOVR
0x4641c92a779d5e9b0e6ed65dbdbfdf84fbce6bd70accaa2a674bf582f3c27f2140596812023-04-18 3:28:0641 days 8 hrs ago Zenlink: Regular AMM Router 0x9db46d2391ef1843396624024d6a5fa73c5d1e0222.171770006714655706 MOVR
0x4641c92a779d5e9b0e6ed65dbdbfdf84fbce6bd70accaa2a674bf582f3c27f2140596812023-04-18 3:28:0641 days 8 hrs ago Moonbeam Foundation: WMOVR Token Zenlink: Regular AMM Router22.171770006714655706 MOVR
0x1888b1e1c191dfc76bc03e5a4626f6258c23ad19834e05fe83ef3b62de1f0be240116592023-04-11 6:44:0648 days 5 hrs ago Zenlink: Regular AMM Router Moonbeam Foundation: WMOVR Token14.999999999999999994 MOVR
0x1888b1e1c191dfc76bc03e5a4626f6258c23ad19834e05fe83ef3b62de1f0be240116592023-04-11 6:44:0648 days 5 hrs ago 0x9db46d2391ef1843396624024d6a5fa73c5d1e02 Zenlink: Regular AMM Router14.999999999999999994 MOVR
0x65df4f213c9bc16ef2a520ea8654ff02b52821a525186518a5d66099813ab50840116542023-04-11 6:43:0648 days 5 hrs ago Zenlink: Regular AMM Router Moonbeam Foundation: WMOVR Token8.33333333333333333 MOVR
0x65df4f213c9bc16ef2a520ea8654ff02b52821a525186518a5d66099813ab50840116542023-04-11 6:43:0648 days 5 hrs ago 0x9db46d2391ef1843396624024d6a5fa73c5d1e02 Zenlink: Regular AMM Router8.33333333333333333 MOVR
0x38be74eedf7a0118bfc37788e037f8cbf6a4fda82084dc7b489003557f01d0ab40116302023-04-11 6:38:1248 days 5 hrs ago Zenlink: Regular AMM Router Moonbeam Foundation: WMOVR Token4.999999999999999998 MOVR
0x38be74eedf7a0118bfc37788e037f8cbf6a4fda82084dc7b489003557f01d0ab40116302023-04-11 6:38:1248 days 5 hrs ago 0x9db46d2391ef1843396624024d6a5fa73c5d1e02 Zenlink: Regular AMM Router4.999999999999999998 MOVR
0xade6c7e3b04ca15575520502db69ecfae8a989fdce3b36de4857e4d1468fdaf740036502023-04-10 3:05:4249 days 8 hrs ago 0x9db46d2391ef1843396624024d6a5fa73c5d1e02 Zenlink: Regular AMM Router6.940725666593793117 MOVR
0x6237b8c86c07a4ea2640fd5d3ba289977124e5f60ede76060c11c0c99d9ab44140036422023-04-10 3:04:0049 days 8 hrs ago 0x9db46d2391ef1843396624024d6a5fa73c5d1e02 Zenlink: Regular AMM Router40.315898775833739288 MOVR
0xa517191f0a46f88447a039cfab119fed483cad7b1900ebae561dc3d21b2416bf39714582023-04-05 12:15:3053 days 23 hrs ago Zenlink: Regular AMM Router Moonbeam Foundation: WMOVR Token3.333333333333333332 MOVR
0xa517191f0a46f88447a039cfab119fed483cad7b1900ebae561dc3d21b2416bf39714582023-04-05 12:15:3053 days 23 hrs ago 0x9db46d2391ef1843396624024d6a5fa73c5d1e02 Zenlink: Regular AMM Router3.333333333333333332 MOVR
0x9e09fa79cc92f4e40501216520f939e2351afd82f4bc884ff32416e0f3138a4d38238892023-03-15 11:38:1275 days 13 mins ago Zenlink: Regular AMM Router0x94a2d53a3d99968e25b241ed1667d537670e6cb92.932775236147716168 MOVR
0x9e09fa79cc92f4e40501216520f939e2351afd82f4bc884ff32416e0f3138a4d38238892023-03-15 11:38:1275 days 13 mins ago Moonbeam Foundation: WMOVR Token Zenlink: Regular AMM Router2.932775236147716168 MOVR
0x4a6ee9d991c14143361251a13bdc8c6914b1f91846d1f5f5cd16b4e10d45ee3038238752023-03-15 11:35:0675 days 16 mins ago Zenlink: Regular AMM Router0x94a2d53a3d99968e25b241ed1667d537670e6cb93.781585394020414697 MOVR
0x4a6ee9d991c14143361251a13bdc8c6914b1f91846d1f5f5cd16b4e10d45ee3038238752023-03-15 11:35:0675 days 16 mins ago Moonbeam Foundation: WMOVR Token Zenlink: Regular AMM Router3.781585394020414697 MOVR
0x91a8615cf131d1a6f1b328fd63186a7327fbd54e0dd4b7bbc4db67465c5974c536994982023-02-25 14:08:2492 days 21 hrs ago Zenlink: Regular AMM Router0x5d5821ecf5a93cea357772aebd5af8f0aabdcae60.09941546336337683 MOVR
[ Download CSV Export 
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
Router

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at moonriver.moonscan.io on 2022-01-07
*/

// File: contracts/core/interfaces/IFactory.sol



pragma solidity >=0.8.0;

interface IFactory {
    event PairCreated(
        address indexed token0,
        address indexed token1,
        address pair,
        uint256
    );
    event PairCreateLocked(
        address indexed caller
    );
    event PairCreateUnlocked(
        address indexed caller
    );
    event BootstrapSetted(
        address indexed tokenA,
        address indexed tokenB,
        address indexed bootstrap
    );
    event FeetoUpdated(
        address indexed feeto
    );
    event FeeBasePointUpdated(
        uint8 basePoint
    );

    function feeto() external view returns (address);

    function feeBasePoint() external view returns (uint8);

    function lockForPairCreate() external view returns (bool);

    function getPair(address tokenA, address tokenB)
        external
        view
        returns (address pair);
    
    function getBootstrap(address tokenA, address tokenB)
        external
        view
        returns (address bootstrap);

    function allPairs(uint256) external view returns (address pair);

    function allPairsLength() external view returns (uint256);

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

// File: contracts/core/interfaces/IPair.sol



pragma solidity >=0.8.0;

interface IPair {
    event Mint(address indexed sender, uint256 amount0, uint256 amount1);
    event Burn(
        address indexed sender,
        uint256 amount0,
        uint256 amount1,
        address indexed to
    );
    event Swap(
        address indexed sender,
        uint256 amount0In,
        uint256 amount1In,
        uint256 amount0Out,
        uint256 amount1Out,
        address indexed to
    );

    function MINIMUM_LIQUIDITY() external pure returns (uint256);

    function factory() external view returns (address);

    function token0() external view returns (address);

    function token1() external view returns (address);

    function getReserves()
        external
        view
        returns (uint112 reserve0, uint112 reserve1);

    function mint(address to) external returns (uint256 liquidity);

    function burn(address to)
        external
        returns (uint256 amount0, uint256 amount1);

    function swap(
        uint256 amount0Out,
        uint256 amount1Out,
        address to
    ) external;

    function initialize(address, address) external;
}

// File: contracts/libraries/Math.sol



pragma solidity >=0.8.0;

// a library for performing various math operations

library Math {
    function min(uint256 x, uint256 y) internal pure returns (uint256 z) {
        z = x < y ? x : y;
    }

    // babylonian method (https://en.wikipedia.org/wiki/Methods_of_computing_square_roots#Babylonian_method)
    function sqrt(uint256 y) internal pure returns (uint256 z) {
        if (y > 3) {
            z = y;
            uint256 x = y / 2 + 1;
            while (x < z) {
                z = x;
                x = (y / x + x) / 2;
            }
        } else if (y != 0) {
            z = 1;
        }
    }

    function add(uint256 x, uint256 y) internal pure returns (uint256 z) {
        require((z = x + y) >= x, "ds-math-add-overflow");
    }

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

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

// File: contracts/libraries/Helper.sol



pragma solidity >=0.8.0;




library Helper {
    using Math for uint256;

    function sortTokens(address tokenA, address tokenB)
        internal
        pure
        returns (address token0, address token1)
    {
        require(tokenA != tokenB, "Helper: IDENTICAL_ADDRESSES");
        (token0, token1) = tokenA < tokenB
            ? (tokenA, tokenB)
            : (tokenB, tokenA);
        require(token0 != address(0), "Helper: ZERO_ADDRESS");
    }

    function pairFor(
        address factory,
        address tokenA,
        address tokenB
    ) internal view returns (address pair) {
        return IFactory(factory).getPair(tokenA, tokenB);
    }

    function quote(
        uint256 amountA,
        uint256 reserveA,
        uint256 reserveB
    ) internal pure returns (uint256 amountB) {
        require(amountA > 0, "INSUFFICIENT_AMOUNT");
        require(reserveA > 0 && reserveB > 0, "INSUFFICIENT_LIQUIDITY");
        amountB = amountA.mul(reserveB) / reserveA;
    }

    function getReserves(
        address factory,
        address tokenA,
        address tokenB
    ) internal view returns (uint256 reserveA, uint256 reserveB) {
        (address token0, ) = sortTokens(tokenA, tokenB);
        (uint256 reserve0, uint256 reserve1) = IPair(
            pairFor(factory, tokenA, tokenB)
        ).getReserves();
        (reserveA, reserveB) = tokenA == token0
            ? (reserve0, reserve1)
            : (reserve1, reserve0);
    }

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

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

    function safeTransferNativeCurrency(address to, uint256 value) internal {
        (bool success, ) = to.call{value: value}(new bytes(0));
        require(
            success,
            "TransferHelper::safeTransferNativeCurrency: NativeCurrency transfer failed"
        );
    }

    // given an input amount of an asset and pair reserves, returns the maximum output amount of the other asset
    function getAmountOut(
        uint256 amountIn,
        uint256 reserveIn,
        uint256 reserveOut
    ) internal pure returns (uint256 amountOut) {
        require(amountIn > 0, "Helper: INSUFFICIENT_INPUT_AMOUNT");
        require(
            reserveIn > 0 && reserveOut > 0,
            "Helper: INSUFFICIENT_LIQUIDITY"
        );
        uint256 amountInWithFee = amountIn.mul(997);
        uint256 numerator = amountInWithFee.mul(reserveOut);
        uint256 denominator = reserveIn.mul(1000).add(amountInWithFee);
        amountOut = numerator / denominator;
    }

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

    // performs chained getAmountOut calculations on any number of pairs
    function getAmountsOut(
        address factory,
        uint256 amountIn,
        address[] memory path
    ) internal view returns (uint256[] memory amounts) {
        require(path.length >= 2, "Helper: INVALID_PATH");
        amounts = new uint256[](path.length);
        amounts[0] = amountIn;
        for (uint256 i; i < path.length - 1; i++) {
            (uint256 reserveIn, uint256 reserveOut) = getReserves(
                factory,
                path[i],
                path[i + 1]
            );
            amounts[i + 1] = getAmountOut(amounts[i], reserveIn, reserveOut);
        }
    }

    function getAmountsIn(
        address factory,
        uint256 amountOut,
        address[] memory path
    ) internal view returns (uint256[] memory amounts) {
        require(path.length >= 2, "Helper: INVALID_PATH");
        amounts = new uint256[](path.length);
        amounts[amounts.length - 1] = amountOut;
        for (uint256 i = path.length - 1; i > 0; i--) {
            (uint256 reserveIn, uint256 reserveOut) = getReserves(
                factory,
                path[i - 1],
                path[i]
            );
            amounts[i - 1] = getAmountIn(amounts[i], reserveIn, reserveOut);
        }
    }
}

// File: contracts/periphery/interfaces/IWNativeCurrency.sol



pragma solidity >=0.8.0;

interface IWNativeCurrency {
    function deposit() external payable;

    function withdraw(uint256) external;
}

// File: contracts/periphery/interfaces/IRouter.sol



pragma solidity >=0.8.0;

interface IRouter {
    function factory() external view returns (address);

    function WNativeCurrency() external view returns (address);

    function addLiquidity(
        address tokenA,
        address tokenB,
        uint256 amountADesired,
        uint256 amountBDesired,
        uint256 amountAMin,
        uint256 amountBMin,
        address to,
        uint256 deadline
    )
        external
        returns (
            uint256 amountA,
            uint256 amountB,
            uint256 liquidity
        );

    function addLiquiditySingleToken(
        address[] calldata path,
        uint256 amountIn,
        uint256 amountSwapIn,
        uint256 amountSwapOutMin,
        uint256 amountInReserveMin,
        address to,
        uint256 deadline
    )
        external
        returns (
            uint256 liquidity
        );

    function addLiquidityNativeCurrency(
        address token,
        uint256 amountTokenDesired,
        uint256 amountTokenMin,
        uint256 amountNativeCurrencyMin,
        address to,
        uint256 deadline
    )
        external
        payable
        returns (
            uint256 amountToken,
            uint256 amountNativeCurrency,
            uint256 liquidity
        );

    function addLiquiditySingleNativeCurrency(
        address[] calldata path,
        uint256 amountSwapOut,
        uint256 nativeCurrencySwapInMax,
        uint256 nativeCurrencyReserveMin,
        address to,
        uint256 deadline
    )
        external
        payable
        returns (
            uint256 amountToken,
            uint256 amountNativeCurrency,
            uint256 liquidity
        );

    function removeLiquidity(
        address tokenA,
        address tokenB,
        uint256 liquidity,
        uint256 amountAMin,
        uint256 amountBMin,
        address to,
        uint256 deadline
    ) external returns (uint256 amountA, uint256 amountB);

    function removeLiquidityNativeCurrency(
        address token,
        uint256 liquidity,
        uint256 amountTokenMin,
        uint256 amountNativeCurrencyMin,
        address to,
        uint256 deadline
    ) external returns (uint256 amountToken, uint256 amountNativeCurrency);

    function swapExactTokensForTokens(
        uint256 amountIn,
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external returns (uint256[] memory amounts);

    function swapTokensForExactTokens(
        uint256 amountOut,
        uint256 amountInMax,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external returns (uint256[] memory amounts);

    function swapExactNativeCurrencyForTokens(
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external payable returns (uint256[] memory amounts);

    function swapTokensForExactNativeCurrency(
        uint256 amountOut,
        uint256 amountInMax,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external returns (uint256[] memory amounts);

    function swapExactTokensForNativeCurrency(
        uint256 amountIn,
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external returns (uint256[] memory amounts);

    function swapNativeCurrencyForExactTokens(
        uint256 amountOut,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external payable returns (uint256[] memory amounts);

    function getAmountOut(
        uint256 amountIn,
        uint256 reserveIn,
        uint256 reserveOut
    ) external pure returns (uint256 amountOut);

    function getAmountIn(
        uint256 amountOut,
        uint256 reserveIn,
        uint256 reserveOut
    ) external pure returns (uint256 amountIn);

    function getAmountsOut(uint256 amountIn, address[] calldata path)
        external
        view
        returns (uint256[] memory amounts);

    function getAmountsIn(uint256 amountOut, address[] calldata path)
        external
        view
        returns (uint256[] memory amounts);
}

// File: @openzeppelin/contracts/token/ERC20/IERC20.sol



pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns the amount of tokens owned by `account`.
     */
    function balanceOf(address account) external view returns (uint256);

    /**
     * @dev Moves `amount` tokens from the caller's account to `recipient`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address recipient, uint256 amount) external returns (bool);

    /**
     * @dev Returns the remaining number of tokens that `spender` will be
     * allowed to spend on behalf of `owner` through {transferFrom}. This is
     * zero by default.
     *
     * This value changes when {approve} or {transferFrom} are called.
     */
    function allowance(address owner, address spender) external view returns (uint256);

    /**
     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * IMPORTANT: Beware that changing an allowance with this method brings the risk
     * that someone may use both the old and the new allowance by unfortunate
     * transaction ordering. One possible solution to mitigate this race
     * condition is to first reduce the spender's allowance to 0 and set the
     * desired value afterwards:
     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
     *
     * Emits an {Approval} event.
     */
    function approve(address spender, uint256 amount) external returns (bool);

    /**
     * @dev Moves `amount` tokens from `sender` to `recipient` using the
     * allowance mechanism. `amount` is then deducted from the caller's
     * allowance.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address sender,
        address recipient,
        uint256 amount
    ) external returns (bool);

    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

    /**
     * @dev Emitted when the allowance of a `spender` for an `owner` is set by
     * a call to {approve}. `value` is the new allowance.
     */
    event Approval(address indexed owner, address indexed spender, uint256 value);
}

// File: contracts/periphery/Router.sol



pragma solidity >=0.8.0;






contract Router is IRouter {
    using Math for uint256;

    address public override factory;
    address public override WNativeCurrency;

    constructor(address _factory, address _WNativeCurrency) {
        factory = _factory;
        WNativeCurrency = _WNativeCurrency;
    }

    modifier ensure(uint256 deadline) {
        require(deadline >= block.timestamp, "Router: EXPIRED");
        _;
    }

    receive() external payable {
        require(msg.sender == WNativeCurrency); // only accept Native Currency via fallback from the WNativeCurrency contract
    }

    function addLiquidity(
        address token0,
        address token1,
        uint256 amount0Desired,
        uint256 amount1Desired,
        uint256 amount0Min,
        uint256 amount1Min,
        address to,
        uint256 deadline
    )
        public
        override
        ensure(deadline)
        returns (
            uint256 amount0,
            uint256 amount1,
            uint256 liquidity
        )
    {
        (amount0, amount1) = _addLiquidity(
            token0,
            token1,
            amount0Desired,
            amount1Desired,
            amount0Min,
            amount1Min
        );
        address pair = Helper.pairFor(factory, token0, token1);
        Helper.safeTransferFrom(token0, msg.sender, pair, amount0);
        Helper.safeTransferFrom(token1, msg.sender, pair, amount1);
        liquidity = IPair(pair).mint(to);
    }

    function addLiquiditySingleToken(
        address[] calldata path,
        uint256 amountIn,
        uint256 amountSwapOut,
        uint256 amountSwapInMax,
        uint256 amountInReserveMin,
        address to,
        uint256 deadline
    ) external override ensure(deadline) returns (uint256 liquidity) {
        address token0 = path[0];
        address token1 = path[path.length - 1];

        uint256[] memory amounts = swapTokensForExactTokens(
            amountSwapOut,
            amountSwapInMax,
            path,
            to,
            deadline
        );

        uint256 amountInReserve = amountIn - amounts[0];
        (, , liquidity) = addLiquidity(
            token1,
            token0,
            amounts[amounts.length - 1],
            amountInReserve,
            amounts[amounts.length - 1],
            amountInReserveMin,
            to,
            deadline
        );
    }

    function addLiquidityNativeCurrency(
        address token,
        uint256 amountTokenDesired,
        uint256 amountTokenMin,
        uint256 amountNativeCurrencyMin,
        address to,
        uint256 deadline
    )
        external
        payable
        override
        ensure(deadline)
        returns (
            uint256 amountToken,
            uint256 amountNativeCurrency,
            uint256 liquidity
        )
    {
        (amountToken, amountNativeCurrency) = _addLiquidity(
            token,
            WNativeCurrency,
            amountTokenDesired,
            msg.value,
            amountTokenMin,
            amountNativeCurrencyMin
        );
        address pair = Helper.pairFor(factory, token, WNativeCurrency);
        Helper.safeTransferFrom(token, msg.sender, pair, amountToken);
        IWNativeCurrency(WNativeCurrency).deposit{
            value: amountNativeCurrency
        }();
        require(IERC20(WNativeCurrency).transfer(pair, amountNativeCurrency));
        liquidity = IPair(pair).mint(to);
        if (msg.value > amountNativeCurrency)
            Helper.safeTransferNativeCurrency(
                msg.sender,
                msg.value - amountNativeCurrency
            ); // refund dust native currency, if any
    }

    function addLiquiditySingleNativeCurrency(
        address[] memory path,
        uint256 amountSwapOut,
        uint256 nativeCurrencySwapInMax,
        uint256 nativeCurrencyReserveMin,
        address to,
        uint256 deadline
    )
        external
        payable
        override
        ensure(deadline)
        returns (
            uint256 amountToken,
            uint256 amountNativeCurrency,
            uint256 liquidity
        )
    {
        // Swap
        require(path[0] == WNativeCurrency, "Router: INVALID_PATH");
        uint256[] memory amounts = Helper.getAmountsIn(
            factory,
            amountSwapOut,
            path
        );

        require(amounts[0] <= msg.value, "Router: EXCESSIVE_INPUT_AMOUNT");
        IWNativeCurrency(WNativeCurrency).deposit{value: amounts[0]}();

        require(
            IERC20(WNativeCurrency).transfer(
                Helper.pairFor(factory, path[0], path[1]),
                amounts[0]
            )
        );

        _swap(amounts, path, to);

        require(
            amounts[0] <= nativeCurrencySwapInMax,
            "not allow bigger than nativeCurrencySwapInMax"
        );

        // Addliquidity
        address token = path[path.length - 1];
        uint256 nativeCurrencyReserve = msg.value - amounts[0];
        (amountToken, amountNativeCurrency) = _addLiquidity(
            token,
            WNativeCurrency,
            amounts[amounts.length - 1],
            nativeCurrencyReserve,
            amounts[amounts.length - 1],
            nativeCurrencyReserveMin
        );

        address pair = Helper.pairFor(factory, token, WNativeCurrency);

        Helper.safeTransferFrom(token, msg.sender, pair, amountToken);

        IWNativeCurrency(WNativeCurrency).deposit{
            value: amountNativeCurrency
        }();

        require(IERC20(WNativeCurrency).transfer(pair, amountNativeCurrency));

        liquidity = IPair(pair).mint(to);

        if (msg.value > (amountNativeCurrency + amounts[0]))
            Helper.safeTransferNativeCurrency(
                msg.sender,
                msg.value - (amountNativeCurrency + amounts[0])
            ); // refund dust native currency, if any
    }

    function _addLiquidity(
        address token0,
        address token1,
        uint256 amount0Desired,
        uint256 amount1Desired,
        uint256 amount0Min,
        uint256 amount1Min
    ) private returns (uint256 amount0, uint256 amount1) {
        if (IFactory(factory).getPair(token0, token1) == address(0)) {
            IFactory(factory).createPair(token0, token1);
        }
        (uint256 reserve0, uint256 reserve1) = Helper.getReserves(
            factory,
            token0,
            token1
        );
        if (reserve0 == 0 && reserve1 == 0) {
            (amount0, amount1) = (amount0Desired, amount1Desired);
        } else {
            uint256 amount1Optimal = Helper.quote(
                amount0Desired,
                reserve0,
                reserve1
            );
            if (amount1Optimal <= amount1Desired) {
                require(
                    amount1Optimal >= amount1Min,
                    "Router: INSUFFICIENT_1_AMOUNT"
                );
                (amount0, amount1) = (amount0Desired, amount1Optimal);
            } else {
                uint256 amount0Optimal = Helper.quote(
                    amount1Desired,
                    reserve1,
                    reserve0
                );
                require(amount0Optimal <= amount0Desired);
                require(
                    amount0Optimal >= amount0Min,
                    "Router: INSUFFICIENT_0_AMOUNT"
                );
                (amount0, amount1) = (amount0Optimal, amount1Desired);
            }
        }
    }

    function removeLiquidity(
        address token0,
        address token1,
        uint256 liquidity,
        uint256 amount0Min,
        uint256 amount1Min,
        address to,
        uint256 deadline
    )
        public
        override
        ensure(deadline)
        returns (uint256 amount0, uint256 amount1)
    {
        address pair = Helper.pairFor(factory, token0, token1);
        IERC20(pair).transferFrom(msg.sender, pair, liquidity);
        (uint256 amountA, uint256 amountB) = IPair(pair).burn(to);
        (address tokenA, ) = Helper.sortTokens(token0, token1);
        (amount0, amount1) = tokenA == token0
            ? (amountA, amountB)
            : (amountB, amountA);
        require(amount0 >= amount0Min, "Router: INSUFFICIENT_0_AMOUNT");
        require(amount1 >= amount1Min, "Router: INSUFFICIENT_1_AMOUNT");
    }

    function removeLiquidityNativeCurrency(
        address token,
        uint256 liquidity,
        uint256 amountTokenMin,
        uint256 amountNativeCurrencyMin,
        address to,
        uint256 deadline
    )
        public
        override
        ensure(deadline)
        returns (uint256 amountToken, uint256 amountNativeCurrency)
    {
        (amountToken, amountNativeCurrency) = removeLiquidity(
            token,
            WNativeCurrency,
            liquidity,
            amountTokenMin,
            amountNativeCurrencyMin,
            address(this),
            deadline
        );
        Helper.safeTransfer(token, to, amountToken);
        IWNativeCurrency(WNativeCurrency).withdraw(amountNativeCurrency);
        Helper.safeTransferNativeCurrency(to, amountNativeCurrency);
    }

    function _swap(
        uint256[] memory amounts,
        address[] memory path,
        address _to
    ) private {
        for (uint256 i; i < path.length - 1; i++) {
            (address input, address output) = (path[i], path[i + 1]);
            (address token0, ) = Helper.sortTokens(input, output);
            uint256 amountOut = amounts[i + 1];
            (uint256 amount0Out, uint256 amount1Out) = input == token0
                ? (uint256(0), amountOut)
                : (amountOut, uint256(0));
            address to = i < path.length - 2
                ? Helper.pairFor(factory, output, path[i + 2])
                : _to;
            IPair(Helper.pairFor(factory, input, output)).swap(
                amount0Out,
                amount1Out,
                to
            );
        }
    }

    function swapExactTokensForTokens(
        uint256 amountIn,
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) public override ensure(deadline) returns (uint256[] memory amounts) {
        amounts = Helper.getAmountsOut(factory, amountIn, path);
        require(
            amounts[amounts.length - 1] >= amountOutMin,
            "Router: INSUFFICIENT_OUTPUT_AMOUNT"
        );
        Helper.safeTransferFrom(
            path[0],
            msg.sender,
            Helper.pairFor(factory, path[0], path[1]),
            amounts[0]
        );
        _swap(amounts, path, to);
    }

    function swapTokensForExactTokens(
        uint256 amountOut,
        uint256 amountInMax,
        address[] calldata path,
        address to,
        uint256 deadline
    ) public override ensure(deadline) returns (uint256[] memory amounts) {
        amounts = Helper.getAmountsIn(factory, amountOut, path);
        require(amounts[0] <= amountInMax, "Router: EXCESSIVE_INPUT_AMOUNT");
        Helper.safeTransferFrom(
            path[0],
            msg.sender,
            Helper.pairFor(factory, path[0], path[1]),
            amounts[0]
        );
        _swap(amounts, path, to);
    }

    function swapExactNativeCurrencyForTokens(
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    )
        external
        payable
        override
        ensure(deadline)
        returns (uint256[] memory amounts)
    {
        require(path[0] == WNativeCurrency, "Router: INVALID_PATH");
        amounts = Helper.getAmountsOut(factory, msg.value, path);
        require(
            amounts[amounts.length - 1] >= amountOutMin,
            "Router: INSUFFICIENT_OUTPUT_AMOUNT"
        );
        IWNativeCurrency(WNativeCurrency).deposit{value: amounts[0]}();
        require(
            IERC20(WNativeCurrency).transfer(
                Helper.pairFor(factory, path[0], path[1]),
                amounts[0]
            )
        );
        _swap(amounts, path, to);
    }

    function swapTokensForExactNativeCurrency(
        uint256 amountOut,
        uint256 amountInMax,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external override ensure(deadline) returns (uint256[] memory amounts) {
        require(
            path[path.length - 1] == WNativeCurrency,
            "Router: INVALID_PATH"
        );
        amounts = Helper.getAmountsIn(factory, amountOut, path);
        require(amounts[0] <= amountInMax, "Router: EXCESSIVE_INPUT_AMOUNT");
        Helper.safeTransferFrom(
            path[0],
            msg.sender,
            Helper.pairFor(factory, path[0], path[1]),
            amounts[0]
        );
        _swap(amounts, path, address(this));
        IWNativeCurrency(WNativeCurrency).withdraw(amounts[amounts.length - 1]);
        Helper.safeTransferNativeCurrency(to, amounts[amounts.length - 1]);
    }

    function swapExactTokensForNativeCurrency(
        uint256 amountIn,
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external override ensure(deadline) returns (uint256[] memory amounts) {
        require(
            path[path.length - 1] == WNativeCurrency,
            "Router: INVALID_PATH"
        );
        amounts = Helper.getAmountsOut(factory, amountIn, path);
        require(
            amounts[amounts.length - 1] >= amountOutMin,
            "Router: INSUFFICIENT_OUTPUT_AMOUNT"
        );
        Helper.safeTransferFrom(
            path[0],
            msg.sender,
            Helper.pairFor(factory, path[0], path[1]),
            amounts[0]
        );
        _swap(amounts, path, address(this));
        IWNativeCurrency(WNativeCurrency).withdraw(amounts[amounts.length - 1]);
        Helper.safeTransferNativeCurrency(to, amounts[amounts.length - 1]);
    }

    function swapNativeCurrencyForExactTokens(
        uint256 amountOut,
        address[] calldata path,
        address to,
        uint256 deadline
    )
        external
        payable
        override
        ensure(deadline)
        returns (uint256[] memory amounts)
    {
        require(path[0] == WNativeCurrency, "Router: INVALID_PATH");
        amounts = Helper.getAmountsIn(factory, amountOut, path);
        require(amounts[0] <= msg.value, "Router: EXCESSIVE_INPUT_AMOUNT");
        IWNativeCurrency(WNativeCurrency).deposit{value: amounts[0]}();
        require(
            IERC20(WNativeCurrency).transfer(
                Helper.pairFor(factory, path[0], path[1]),
                amounts[0]
            )
        );
        _swap(amounts, path, to);
        if (msg.value > amounts[0])
            Helper.safeTransferNativeCurrency(
                msg.sender,
                msg.value - amounts[0]
            ); // refund dust eth, if any
    }

    function getAmountOut(
        uint256 amountIn,
        uint256 reserveIn,
        uint256 reserveOut
    ) public pure override returns (uint256 amountOut) {
        return Helper.getAmountOut(amountIn, reserveIn, reserveOut);
    }

    function getAmountIn(
        uint256 amountOut,
        uint256 reserveIn,
        uint256 reserveOut
    ) public pure override returns (uint256 amountIn) {
        return Helper.getAmountOut(amountOut, reserveIn, reserveOut);
    }

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

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

Contract ABI

[{"inputs":[{"internalType":"address","name":"_factory","type":"address"},{"internalType":"address","name":"_WNativeCurrency","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"WNativeCurrency","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"token0","type":"address"},{"internalType":"address","name":"token1","type":"address"},{"internalType":"uint256","name":"amount0Desired","type":"uint256"},{"internalType":"uint256","name":"amount1Desired","type":"uint256"},{"internalType":"uint256","name":"amount0Min","type":"uint256"},{"internalType":"uint256","name":"amount1Min","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"addLiquidity","outputs":[{"internalType":"uint256","name":"amount0","type":"uint256"},{"internalType":"uint256","name":"amount1","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":"amountNativeCurrencyMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"addLiquidityNativeCurrency","outputs":[{"internalType":"uint256","name":"amountToken","type":"uint256"},{"internalType":"uint256","name":"amountNativeCurrency","type":"uint256"},{"internalType":"uint256","name":"liquidity","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"uint256","name":"amountSwapOut","type":"uint256"},{"internalType":"uint256","name":"nativeCurrencySwapInMax","type":"uint256"},{"internalType":"uint256","name":"nativeCurrencyReserveMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"addLiquiditySingleNativeCurrency","outputs":[{"internalType":"uint256","name":"amountToken","type":"uint256"},{"internalType":"uint256","name":"amountNativeCurrency","type":"uint256"},{"internalType":"uint256","name":"liquidity","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountSwapOut","type":"uint256"},{"internalType":"uint256","name":"amountSwapInMax","type":"uint256"},{"internalType":"uint256","name":"amountInReserveMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"addLiquiditySingleToken","outputs":[{"internalType":"uint256","name":"liquidity","type":"uint256"}],"stateMutability":"nonpayable","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":"address","name":"token0","type":"address"},{"internalType":"address","name":"token1","type":"address"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"amount0Min","type":"uint256"},{"internalType":"uint256","name":"amount1Min","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"removeLiquidity","outputs":[{"internalType":"uint256","name":"amount0","type":"uint256"},{"internalType":"uint256","name":"amount1","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":"amountNativeCurrencyMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"removeLiquidityNativeCurrency","outputs":[{"internalType":"uint256","name":"amountToken","type":"uint256"},{"internalType":"uint256","name":"amountNativeCurrency","type":"uint256"}],"stateMutability":"nonpayable","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":"swapExactNativeCurrencyForTokens","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactTokensForNativeCurrency","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":"swapExactTokensForTokens","outputs":[{"internalType":"uint256[]","name":"amounts","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":"swapNativeCurrencyForExactTokens","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"uint256","name":"amountInMax","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapTokensForExactNativeCurrency","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"}]

60806040523480156200001157600080fd5b506040516200353138038062003531833981016040819052620000349162000083565b600080546001600160a01b039384166001600160a01b03199182161790915560018054929093169116179055620000bb565b80516001600160a01b03811681146200007e57600080fd5b919050565b600080604083850312156200009757600080fd5b620000a28362000066565b9150620000b26020840162000066565b90509250929050565b61346680620000cb6000396000f3fe60806040526004361061010d5760003560e01c80639be7614d11610095578063cd1bd0d911610064578063cd1bd0d9146102f1578063d06ca61f14610304578063dcff1b9414610324578063e8e3370014610344578063f85b7c8b1461036457600080fd5b80639be7614d1461027e578063b1ea829214610291578063baa2abde146102b1578063c45a0155146102d157600080fd5b8063419591ed116100dc578063419591ed146101e5578063686589671461021d57806385f8c259146101305780638803dbee1461024b578063937ca0da1461026b57600080fd5b8063054d50d4146101305780631f00ca741461016357806338ed173914610190578063403bf1f2146101b057600080fd5b3661012b576001546001600160a01b0316331461012957600080fd5b005b600080fd5b34801561013c57600080fd5b5061015061014b3660046131b9565b610384565b6040519081526020015b60405180910390f35b34801561016f57600080fd5b5061018361017e3660046130db565b610399565b60405161015a9190613220565b34801561019c57600080fd5b506101836101ab366004613146565b6103bc565b3480156101bc57600080fd5b506101d06101cb366004612ebf565b610576565b6040805192835260208301919091520161015a565b3480156101f157600080fd5b50600154610205906001600160a01b031681565b6040516001600160a01b03909116815260200161015a565b61023061022b366004612fa4565b61063a565b6040805193845260208401929092529082015260600161015a565b34801561025757600080fd5b50610183610266366004613146565b610c05565b610230610279366004612ebf565b610cae565b61018361028c366004613074565b610ebd565b34801561029d57600080fd5b506101506102ac366004612f1d565b6111c8565b3480156102bd57600080fd5b506101d06102cc366004612dd1565b6112fe565b3480156102dd57600080fd5b50600054610205906001600160a01b031681565b6101836102ff366004613074565b61152f565b34801561031057600080fd5b5061018361031f3660046130db565b6117c8565b34801561033057600080fd5b5061018361033f366004613146565b6117e2565b34801561035057600080fd5b5061023061035f366004612e43565b611a0d565b34801561037057600080fd5b5061018361037f366004613146565b611b07565b6000610391848484611c16565b949350505050565b6000546060906103b3906001600160a01b03168484611d1a565b90505b92915050565b606081428110156103e85760405162461bcd60e51b81526004016103df906132c9565b60405180910390fd5b6000546040805160208089028281018201909352888252610432936001600160a01b0316928c92918b918b91829190850190849080828437600092019190915250611ea792505050565b9150868260018451610444919061338d565b81518110610454576104546133ec565b6020026020010151101561047a5760405162461bcd60e51b81526004016103df906132f2565b61052c86866000818110610490576104906133ec565b90506020020160208101906104a59190612d90565b60008054339161050c916001600160a01b0316908b908b90816104ca576104ca6133ec565b90506020020160208101906104df9190612d90565b8b8b60018181106104f2576104f26133ec565b90506020020160208101906105079190612d90565b612014565b8560008151811061051f5761051f6133ec565b6020026020010151612099565b61056b828787808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152508992506121d7915050565b509695505050505050565b600080824281101561059a5760405162461bcd60e51b81526004016103df906132c9565b6001546105b6908a906001600160a01b03168a8a8a308a6112fe565b90935091506105c6898685612387565b600154604051632e1a7d4d60e01b8152600481018490526001600160a01b0390911690632e1a7d4d90602401600060405180830381600087803b15801561060c57600080fd5b505af1158015610620573d6000803e3d6000fd5b5050505061062e85836124b8565b50965096945050505050565b600080600083428110156106605760405162461bcd60e51b81526004016103df906132c9565b6001548a516001600160a01b03909116908b90600090610682576106826133ec565b60200260200101516001600160a01b0316146106b05760405162461bcd60e51b81526004016103df90613264565b600080546106c8906001600160a01b03168b8d611d1a565b905034816000815181106106de576106de6133ec565b602002602001015111156107045760405162461bcd60e51b81526004016103df90613292565b60015481516001600160a01b039091169063d0e30db090839060009061072c5761072c6133ec565b60200260200101516040518263ffffffff1660e01b81526004016000604051808303818588803b15801561075f57600080fd5b505af1158015610773573d6000803e3d6000fd5b5050505050600160009054906101000a90046001600160a01b03166001600160a01b031663a9059cbb6107ee60008054906101000a90046001600160a01b03168e6000815181106107c6576107c66133ec565b60200260200101518f6001815181106107e1576107e16133ec565b6020026020010151612014565b83600081518110610801576108016133ec565b60200260200101516040518363ffffffff1660e01b815260040161083a9291906001600160a01b03929092168252602082015260400190565b602060405180830381600087803b15801561085457600080fd5b505af1158015610868573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061088c9190613006565b61089557600080fd5b6108a0818c896121d7565b88816000815181106108b4576108b46133ec565b602002602001015111156109205760405162461bcd60e51b815260206004820152602d60248201527f6e6f7420616c6c6f7720626967676572207468616e206e61746976654375727260448201526c0cadcc6f2a6eec2e092dc9ac2f609b1b60648201526084016103df565b60008b60018d51610931919061338d565b81518110610941576109416133ec565b60200260200101519050600082600081518110610960576109606133ec565b602002602001015134610973919061338d565b90506109e482600160009054906101000a90046001600160a01b0316856001875161099e919061338d565b815181106109ae576109ae6133ec565b60200260200101518487600189516109c6919061338d565b815181106109d6576109d66133ec565b60200260200101518f6125b3565b60008054600154939a5091985091610a0a916001600160a01b0390811691869116612014565b9050610a188333838b612099565b600160009054906101000a90046001600160a01b03166001600160a01b031663d0e30db0886040518263ffffffff1660e01b81526004016000604051808303818588803b158015610a6857600080fd5b505af1158015610a7c573d6000803e3d6000fd5b505060015460405163a9059cbb60e01b81526001600160a01b038681166004830152602482018d9052909116935063a9059cbb92506044019050602060405180830381600087803b158015610ad057600080fd5b505af1158015610ae4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b089190613006565b610b1157600080fd5b6040516335313c2160e11b81526001600160a01b038b81166004830152821690636a62784290602401602060405180830381600087803b158015610b5457600080fd5b505af1158015610b68573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b8c919061305b565b955083600081518110610ba157610ba16133ec565b602002602001015187610bb49190613334565b341115610bf457610bf43385600081518110610bd257610bd26133ec565b602002602001015189610be59190613334565b610bef903461338d565b6124b8565b505050505096509650969350505050565b60608142811015610c285760405162461bcd60e51b81526004016103df906132c9565b6000546040805160208089028281018201909352888252610c72936001600160a01b0316928c92918b918b91829190850190849080828437600092019190915250611d1a92505050565b91508682600081518110610c8857610c886133ec565b6020026020010151111561047a5760405162461bcd60e51b81526004016103df90613292565b60008060008342811015610cd45760405162461bcd60e51b81526004016103df906132c9565b600154610cef908b906001600160a01b03168b348c8c6125b3565b6000805460015493975091955091610d15916001600160a01b03908116918e9116612014565b9050610d238b338388612099565b600160009054906101000a90046001600160a01b03166001600160a01b031663d0e30db0856040518263ffffffff1660e01b81526004016000604051808303818588803b158015610d7357600080fd5b505af1158015610d87573d6000803e3d6000fd5b505060015460405163a9059cbb60e01b81526001600160a01b038681166004830152602482018a9052909116935063a9059cbb92506044019050602060405180830381600087803b158015610ddb57600080fd5b505af1158015610def573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e139190613006565b610e1c57600080fd5b6040516335313c2160e11b81526001600160a01b038881166004830152821690636a62784290602401602060405180830381600087803b158015610e5f57600080fd5b505af1158015610e73573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e97919061305b565b925083341115610eaf57610eaf33610bef863461338d565b505096509650969350505050565b60608142811015610ee05760405162461bcd60e51b81526004016103df906132c9565b6001546001600160a01b03168686600081610efd57610efd6133ec565b9050602002016020810190610f129190612d90565b6001600160a01b031614610f385760405162461bcd60e51b81526004016103df90613264565b6000546040805160208089028281018201909352888252610f82936001600160a01b0316928b92918b918b91829190850190849080828437600092019190915250611d1a92505050565b91503482600081518110610f9857610f986133ec565b60200260200101511115610fbe5760405162461bcd60e51b81526004016103df90613292565b60015482516001600160a01b039091169063d0e30db0908490600090610fe657610fe66133ec565b60200260200101516040518263ffffffff1660e01b81526004016000604051808303818588803b15801561101957600080fd5b505af115801561102d573d6000803e3d6000fd5b5050600154600080546001600160a01b03928316955063a9059cbb945061108c9350909116908a908a9081611064576110646133ec565b90506020020160208101906110799190612d90565b8a8a60018181106104f2576104f26133ec565b8460008151811061109f5761109f6133ec565b60200260200101516040518363ffffffff1660e01b81526004016110d89291906001600160a01b03929092168252602082015260400190565b602060405180830381600087803b1580156110f257600080fd5b505af1158015611106573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061112a9190613006565b61113357600080fd5b611172828787808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152508992506121d7915050565b81600081518110611185576111856133ec565b60200260200101513411156111be576111be33836000815181106111ab576111ab6133ec565b602002602001015134610bef919061338d565b5095945050505050565b600081428110156111eb5760405162461bcd60e51b81526004016103df906132c9565b60008a8a6000818110611200576112006133ec565b90506020020160208101906112159190612d90565b905060008b8b61122660018261338d565b818110611235576112356133ec565b905060200201602081019061124a9190612d90565b9050600061125c8a8a8f8f8b8b610c05565b9050600081600081518110611273576112736133ec565b60200260200101518c611286919061338d565b90506112e48385846001865161129c919061338d565b815181106112ac576112ac6133ec565b60200260200101518486600188516112c4919061338d565b815181106112d4576112d46133ec565b60200260200101518e8e8e611a0d565b909150905080965050505050505098975050505050505050565b60008082428110156113225760405162461bcd60e51b81526004016103df906132c9565b6000805461133a906001600160a01b03168c8c612014565b6040516323b872dd60e01b81523360048201526001600160a01b03821660248201819052604482018c90529192506323b872dd90606401602060405180830381600087803b15801561138b57600080fd5b505af115801561139f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113c39190613006565b5060405163226bf2d160e21b81526001600160a01b03878116600483015260009182918416906389afcb44906024016040805180830381600087803b15801561140b57600080fd5b505af115801561141f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114439190613122565b9150915060006114538e8e612802565b5090508d6001600160a01b0316816001600160a01b031614611476578183611479565b82825b90975095508a8710156114ce5760405162461bcd60e51b815260206004820152601d60248201527f526f757465723a20494e53554646494349454e545f305f414d4f554e5400000060448201526064016103df565b8986101561151e5760405162461bcd60e51b815260206004820152601d60248201527f526f757465723a20494e53554646494349454e545f315f414d4f554e5400000060448201526064016103df565b505050505097509795505050505050565b606081428110156115525760405162461bcd60e51b81526004016103df906132c9565b6001546001600160a01b0316868660008161156f5761156f6133ec565b90506020020160208101906115849190612d90565b6001600160a01b0316146115aa5760405162461bcd60e51b81526004016103df90613264565b60005460408051602080890282810182019093528882526115f4936001600160a01b0316923492918b918b91829190850190849080828437600092019190915250611ea792505050565b9150868260018451611606919061338d565b81518110611616576116166133ec565b6020026020010151101561163c5760405162461bcd60e51b81526004016103df906132f2565b60015482516001600160a01b039091169063d0e30db0908490600090611664576116646133ec565b60200260200101516040518263ffffffff1660e01b81526004016000604051808303818588803b15801561169757600080fd5b505af11580156116ab573d6000803e3d6000fd5b5050600154600080546001600160a01b03928316955063a9059cbb94506116e29350909116908a908a9081611064576110646133ec565b846000815181106116f5576116f56133ec565b60200260200101516040518363ffffffff1660e01b815260040161172e9291906001600160a01b03929092168252602082015260400190565b602060405180830381600087803b15801561174857600080fd5b505af115801561175c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117809190613006565b61178957600080fd5b6111be828787808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152508992506121d7915050565b6000546060906103b3906001600160a01b03168484611ea7565b606081428110156118055760405162461bcd60e51b81526004016103df906132c9565b600180546001600160a01b03169087908790611821908261338d565b818110611830576118306133ec565b90506020020160208101906118459190612d90565b6001600160a01b03161461186b5760405162461bcd60e51b81526004016103df90613264565b60005460408051602080890282810182019093528882526118b5936001600160a01b0316928c92918b918b91829190850190849080828437600092019190915250611ea792505050565b91508682600184516118c7919061338d565b815181106118d7576118d76133ec565b602002602001015110156118fd5760405162461bcd60e51b81526004016103df906132f2565b61191386866000818110610490576104906133ec565b611952828787808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152503092506121d7915050565b6001805483516001600160a01b0390911691632e1a7d4d9185916119759161338d565b81518110611985576119856133ec565b60200260200101516040518263ffffffff1660e01b81526004016119ab91815260200190565b600060405180830381600087803b1580156119c557600080fd5b505af11580156119d9573d6000803e3d6000fd5b5050505061056b8483600185516119f0919061338d565b81518110611a0057611a006133ec565b60200260200101516124b8565b60008060008342811015611a335760405162461bcd60e51b81526004016103df906132c9565b611a418c8c8c8c8c8c6125b3565b6000805492965090945090611a60906001600160a01b03168e8e612014565b9050611a6e8d338388612099565b611a7a8c338387612099565b6040516335313c2160e11b81526001600160a01b038881166004830152821690636a62784290602401602060405180830381600087803b158015611abd57600080fd5b505af1158015611ad1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611af5919061305b565b92505050985098509895505050505050565b60608142811015611b2a5760405162461bcd60e51b81526004016103df906132c9565b600180546001600160a01b03169087908790611b46908261338d565b818110611b5557611b556133ec565b9050602002016020810190611b6a9190612d90565b6001600160a01b031614611b905760405162461bcd60e51b81526004016103df90613264565b6000546040805160208089028281018201909352888252611bda936001600160a01b0316928c92918b918b91829190850190849080828437600092019190915250611d1a92505050565b91508682600081518110611bf057611bf06133ec565b602002602001015111156118fd5760405162461bcd60e51b81526004016103df90613292565b6000808411611c715760405162461bcd60e51b815260206004820152602160248201527f48656c7065723a20494e53554646494349454e545f494e5055545f414d4f554e6044820152601560fa1b60648201526084016103df565b600083118015611c815750600082115b611ccd5760405162461bcd60e51b815260206004820152601e60248201527f48656c7065723a20494e53554646494349454e545f4c4951554944495459000060448201526064016103df565b6000611cdb856103e56128e3565b90506000611ce982856128e3565b90506000611d0383611cfd886103e86128e3565b9061294a565b9050611d0f818361334c565b979650505050505050565b6060600282511015611d655760405162461bcd60e51b8152602060048201526014602482015273090cad8e0cae47440929cac82989288bea082a8960631b60448201526064016103df565b815167ffffffffffffffff811115611d7f57611d7f613402565b604051908082528060200260200182016040528015611da8578160200160208202803683370190505b509050828160018351611dbb919061338d565b81518110611dcb57611dcb6133ec565b602002602001018181525050600060018351611de7919061338d565b90505b8015611e9f57600080611e3a8786611e0360018761338d565b81518110611e1357611e136133ec565b6020026020010151878681518110611e2d57611e2d6133ec565b602002602001015161299f565b91509150611e62848481518110611e5357611e536133ec565b60200260200101518383612a76565b84611e6e60018661338d565b81518110611e7e57611e7e6133ec565b60200260200101818152505050508080611e97906133a4565b915050611dea565b509392505050565b6060600282511015611ef25760405162461bcd60e51b8152602060048201526014602482015273090cad8e0cae47440929cac82989288bea082a8960631b60448201526064016103df565b815167ffffffffffffffff811115611f0c57611f0c613402565b604051908082528060200260200182016040528015611f35578160200160208202803683370190505b5090508281600081518110611f4c57611f4c6133ec565b60200260200101818152505060005b60018351611f69919061338d565b811015611e9f57600080611faf87868581518110611f8957611f896133ec565b602002602001015187866001611f9f9190613334565b81518110611e2d57611e2d6133ec565b91509150611fd7848481518110611fc857611fc86133ec565b60200260200101518383611c16565b84611fe3856001613334565b81518110611ff357611ff36133ec565b6020026020010181815250505050808061200c906133bb565b915050611f5b565b60405163e6a4390560e01b81526001600160a01b03838116600483015282811660248301526000919085169063e6a439059060440160206040518083038186803b15801561206157600080fd5b505afa158015612075573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103919190612db4565b604080516001600160a01b0385811660248301528481166044830152606480830185905283518084039091018152608490920183526020820180516001600160e01b03166323b872dd60e01b17905291516000928392908816916120fd91906131e5565b6000604051808303816000865af19150503d806000811461213a576040519150601f19603f3d011682016040523d82523d6000602084013e61213f565b606091505b50915091508180156121695750805115806121695750808060200190518101906121699190613006565b6121cf5760405162461bcd60e51b815260206004820152603160248201527f5472616e7366657248656c7065723a3a7472616e7366657246726f6d3a207472604482015270185b9cd9995c919c9bdb4819985a5b1959607a1b60648201526084016103df565b505050505050565b60005b600183516121e8919061338d565b81101561238157600080848381518110612204576122046133ec565b60200260200101518584600161221a9190613334565b8151811061222a5761222a6133ec565b60200260200101519150915060006122428383612802565b509050600087612253866001613334565b81518110612263576122636133ec565b60200260200101519050600080836001600160a01b0316866001600160a01b03161461229157826000612295565b6000835b91509150600060028a516122a9919061338d565b88106122b557886122e2565b6000546122e2906001600160a01b0316878c6122d28c6002613334565b815181106107e1576107e16133ec565b6000549091506122fc906001600160a01b03168888612014565b6040516336cd320560e11b815260048101859052602481018490526001600160a01b0383811660448301529190911690636d9a640a90606401600060405180830381600087803b15801561234f57600080fd5b505af1158015612363573d6000803e3d6000fd5b50505050505050505050508080612379906133bb565b9150506121da565b50505050565b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180516001600160e01b031663a9059cbb60e01b17905291516000928392908716916123e391906131e5565b6000604051808303816000865af19150503d8060008114612420576040519150601f19603f3d011682016040523d82523d6000602084013e612425565b606091505b509150915081801561244f57508051158061244f57508080602001905181019061244f9190613006565b6124b15760405162461bcd60e51b815260206004820152602d60248201527f5472616e7366657248656c7065723a3a736166655472616e736665723a20747260448201526c185b9cd9995c8819985a5b1959609a1b60648201526084016103df565b5050505050565b604080516000808252602082019092526001600160a01b0384169083906040516124e291906131e5565b60006040518083038185875af1925050503d806000811461251f576040519150601f19603f3d011682016040523d82523d6000602084013e612524565b606091505b50509050806125ae5760405162461bcd60e51b815260206004820152604a60248201527f5472616e7366657248656c7065723a3a736166655472616e736665724e61746960448201527f766543757272656e63793a204e617469766543757272656e6379207472616e7360648201526919995c8819985a5b195960b21b608482015260a4016103df565b505050565b6000805460405163e6a4390560e01b81526001600160a01b03898116600483015288811660248301528392839291169063e6a439059060440160206040518083038186803b15801561260457600080fd5b505afa158015612618573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061263c9190612db4565b6001600160a01b031614156126d4576000546040516364e329cb60e11b81526001600160a01b038a8116600483015289811660248301529091169063c9c6539690604401602060405180830381600087803b15801561269a57600080fd5b505af11580156126ae573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126d29190612db4565b505b6000805481906126ee906001600160a01b03168b8b61299f565b91509150816000148015612700575080155b15612710578793508692506127f5565b600061271d898484612b75565b905087811161278157858110156127765760405162461bcd60e51b815260206004820152601d60248201527f526f757465723a20494e53554646494349454e545f315f414d4f554e5400000060448201526064016103df565b8894509250826127f3565b600061278e898486612b75565b90508981111561279d57600080fd5b878110156127ed5760405162461bcd60e51b815260206004820152601d60248201527f526f757465723a20494e53554646494349454e545f305f414d4f554e5400000060448201526064016103df565b94508793505b505b5050965096945050505050565b600080826001600160a01b0316846001600160a01b031614156128675760405162461bcd60e51b815260206004820152601b60248201527f48656c7065723a204944454e544943414c5f414444524553534553000000000060448201526064016103df565b826001600160a01b0316846001600160a01b03161061288757828461288a565b83835b90925090506001600160a01b0382166128dc5760405162461bcd60e51b815260206004820152601460248201527348656c7065723a205a45524f5f4144445245535360601b60448201526064016103df565b9250929050565b6000811580612907575082826128f9818361336e565b9250612905908361334c565b145b6103b65760405162461bcd60e51b815260206004820152601460248201527364732d6d6174682d6d756c2d6f766572666c6f7760601b60448201526064016103df565b6000826129578382613334565b91508110156103b65760405162461bcd60e51b815260206004820152601460248201527364732d6d6174682d6164642d6f766572666c6f7760601b60448201526064016103df565b60008060006129ae8585612802565b5090506000806129bf888888612014565b6001600160a01b0316630902f1ac6040518163ffffffff1660e01b8152600401604080518083038186803b1580156129f657600080fd5b505afa158015612a0a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a2e9190613028565b6001600160701b031691506001600160701b03169150826001600160a01b0316876001600160a01b031614612a64578082612a67565b81815b90999098509650505050505050565b6000808411612ad25760405162461bcd60e51b815260206004820152602260248201527f48656c7065723a20494e53554646494349454e545f4f55545055545f414d4f55604482015261139560f21b60648201526084016103df565b600083118015612ae25750600082115b612b2e5760405162461bcd60e51b815260206004820152601e60248201527f48656c7065723a20494e53554646494349454e545f4c4951554944495459000060448201526064016103df565b6000612b466103e8612b4086886128e3565b906128e3565b90506000612b5a6103e5612b408689612c26565b9050612b6b6001611cfd838561334c565b9695505050505050565b6000808411612bbc5760405162461bcd60e51b8152602060048201526013602482015272125394d551919250d251539517d05353d55395606a1b60448201526064016103df565b600083118015612bcc5750600082115b612c115760405162461bcd60e51b8152602060048201526016602482015275494e53554646494349454e545f4c495155494449545960501b60448201526064016103df565b82612c1c85846128e3565b610391919061334c565b600082612c33838261338d565b91508111156103b65760405162461bcd60e51b815260206004820152601560248201527464732d6d6174682d7375622d756e646572666c6f7760581b60448201526064016103df565b8035612c8781613418565b919050565b60008083601f840112612c9e57600080fd5b50813567ffffffffffffffff811115612cb657600080fd5b6020830191508360208260051b85010111156128dc57600080fd5b600082601f830112612ce257600080fd5b8135602067ffffffffffffffff80831115612cff57612cff613402565b8260051b604051601f19603f83011681018181108482111715612d2457612d24613402565b60405284815283810192508684018288018501891015612d4357600080fd5b600092505b85831015612d6d57612d5981612c7c565b845292840192600192909201918401612d48565b50979650505050505050565b80516001600160701b0381168114612c8757600080fd5b600060208284031215612da257600080fd5b8135612dad81613418565b9392505050565b600060208284031215612dc657600080fd5b8151612dad81613418565b600080600080600080600060e0888a031215612dec57600080fd5b8735612df781613418565b96506020880135612e0781613418565b955060408801359450606088013593506080880135925060a0880135612e2c81613418565b8092505060c0880135905092959891949750929550565b600080600080600080600080610100898b031215612e6057600080fd5b8835612e6b81613418565b97506020890135612e7b81613418565b965060408901359550606089013594506080890135935060a0890135925060c0890135612ea781613418565b8092505060e089013590509295985092959890939650565b60008060008060008060c08789031215612ed857600080fd5b8635612ee381613418565b95506020870135945060408701359350606087013592506080870135612f0881613418565b8092505060a087013590509295509295509295565b60008060008060008060008060e0898b031215612f3957600080fd5b883567ffffffffffffffff811115612f5057600080fd5b612f5c8b828c01612c8c565b9099509750506020890135955060408901359450606089013593506080890135925060a0890135612f8c81613418565b8092505060c089013590509295985092959890939650565b60008060008060008060c08789031215612fbd57600080fd5b863567ffffffffffffffff811115612fd457600080fd5b612fe089828a01612cd1565b9650506020870135945060408701359350606087013592506080870135612f0881613418565b60006020828403121561301857600080fd5b81518015158114612dad57600080fd5b6000806040838503121561303b57600080fd5b61304483612d79565b915061305260208401612d79565b90509250929050565b60006020828403121561306d57600080fd5b5051919050565b60008060008060006080868803121561308c57600080fd5b85359450602086013567ffffffffffffffff8111156130aa57600080fd5b6130b688828901612c8c565b90955093505060408601356130ca81613418565b949793965091946060013592915050565b600080604083850312156130ee57600080fd5b82359150602083013567ffffffffffffffff81111561310c57600080fd5b61311885828601612cd1565b9150509250929050565b6000806040838503121561313557600080fd5b505080516020909101519092909150565b60008060008060008060a0878903121561315f57600080fd5b8635955060208701359450604087013567ffffffffffffffff81111561318457600080fd5b61319089828a01612c8c565b90955093505060608701356131a481613418565b80925050608087013590509295509295509295565b6000806000606084860312156131ce57600080fd5b505081359360208301359350604090920135919050565b6000825160005b8181101561320657602081860181015185830152016131ec565b81811115613215576000828501525b509190910192915050565b6020808252825182820181905260009190848201906040850190845b818110156132585783518352928401929184019160010161323c565b50909695505050505050565b6020808252601490820152730a4deeae8cae47440929cac82989288bea082a8960631b604082015260600190565b6020808252601e908201527f526f757465723a204558434553534956455f494e5055545f414d4f554e540000604082015260600190565b6020808252600f908201526e149bdd5d195c8e8811561412549151608a1b604082015260600190565b60208082526022908201527f526f757465723a20494e53554646494349454e545f4f55545055545f414d4f55604082015261139560f21b606082015260800190565b60008219821115613347576133476133d6565b500190565b60008261336957634e487b7160e01b600052601260045260246000fd5b500490565b6000816000190483118215151615613388576133886133d6565b500290565b60008282101561339f5761339f6133d6565b500390565b6000816133b3576133b36133d6565b506000190190565b60006000198214156133cf576133cf6133d6565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b038116811461342d57600080fd5b5056fea26469706673582212208d0347b698ede02582681341f3d0731e07e8b75877604cdd90701fe46fb5519f64736f6c63430008070033000000000000000000000000f36ae63d89983e3aea8aaad1086c3280eb01438d00000000000000000000000098878b06940ae243284ca214f92bb71a2b032b8a

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

000000000000000000000000f36ae63d89983e3aea8aaad1086c3280eb01438d00000000000000000000000098878b06940ae243284ca214f92bb71a2b032b8a

-----Decoded View---------------
Arg [0] : _factory (address): 0xf36ae63d89983e3aea8aaad1086c3280eb01438d
Arg [1] : _WNativeCurrency (address): 0x98878b06940ae243284ca214f92bb71a2b032b8a

-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 000000000000000000000000f36ae63d89983e3aea8aaad1086c3280eb01438d
Arg [1] : 00000000000000000000000098878b06940ae243284ca214f92bb71a2b032b8a


Deployed ByteCode Sourcemap

16839:16263:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17324:15;;-1:-1:-1;;;;;17324:15:0;17310:10;:29;17302:38;;;;;;16839:16263;;;;;32131:240;;;;;;;;;;-1:-1:-1;32131:240:0;;;;;:::i;:::-;;:::i;:::-;;;19704:25:1;;;19692:2;19677:18;32131:240:0;;;;;;;;32867:232;;;;;;;;;;-1:-1:-1;32867:232:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;27069:669::-;;;;;;;;;;-1:-1:-1;27069:669:0;;;;;:::i;:::-;;:::i;25393:829::-;;;;;;;;;;-1:-1:-1;25393:829:0;;;;;:::i;:::-;;:::i;:::-;;;;19914:25:1;;;19970:2;19955:18;;19948:34;;;;19887:18;25393:829:0;19740:248:1;16942:39:0;;;;;;;;;;-1:-1:-1;16942:39:0;;;;-1:-1:-1;;;;;16942:39:0;;;;;;-1:-1:-1;;;;;10044:32:1;;;10026:51;;10014:2;9999:18;16942:39:0;9880:203:1;20603:2284:0;;;;;;:::i;:::-;;:::i;:::-;;;;20545:25:1;;;20601:2;20586:18;;20579:34;;;;20629:18;;;20622:34;20533:2;20518:18;20603:2284:0;20343:319:1;27746:610:0;;;;;;;;;;-1:-1:-1;27746:610:0;;;;;:::i;:::-;;:::i;19287:1308::-;;;;;;:::i;:::-;;:::i;31130:993::-;;;;;;:::i;:::-;;:::i;18339:940::-;;;;;;;;;;-1:-1:-1;18339:940:0;;;;;:::i;:::-;;:::i;24517:868::-;;;;;;;;;;-1:-1:-1;24517:868:0;;;;;:::i;:::-;;:::i;16904:31::-;;;;;;;;;;-1:-1:-1;16904:31:0;;;;-1:-1:-1;;;;;16904:31:0;;;28364:861;;;;;;:::i;:::-;;:::i;32627:232::-;;;;;;;;;;-1:-1:-1;32627:232:0;;;;;:::i;:::-;;:::i;30152:970::-;;;;;;;;;;-1:-1:-1;30152:970:0;;;;;:::i;:::-;;:::i;17434:897::-;;;;;;;;;;-1:-1:-1;17434:897:0;;;;;:::i;:::-;;:::i;29233:911::-;;;;;;;;;;-1:-1:-1;29233:911:0;;;;;:::i;:::-;;:::i;32131:240::-;32274:17;32311:52;32331:8;32341:9;32352:10;32311:19;:52::i;:::-;32304:59;32131:240;-1:-1:-1;;;;32131:240:0:o;32867:232::-;33066:7;;32997:24;;33046:45;;-1:-1:-1;;;;;33066:7:0;33075:9;33086:4;33046:19;:45::i;:::-;33039:52;;32867:232;;;;;:::o;27069:669::-;27292:24;27273:8;17201:15;17189:8;:27;;17181:55;;;;-1:-1:-1;;;17181:55:0;;;;;;;:::i;:::-;;;;;;;;;27360:7:::1;::::0;27339:45:::1;::::0;;::::1;::::0;;::::1;::::0;;;;;;;;;;;::::1;::::0;-1:-1:-1;;;;;27360:7:0::1;::::0;27369:8;;27339:45;27379:4;;;;;;27339:45;;::::1;::::0;27379:4;;27339:45;27379:4;27339:45;::::1;;::::0;::::1;::::0;;;;-1:-1:-1;27339:20:0::1;::::0;-1:-1:-1;;;27339:45:0:i:1;:::-;27329:55;;27448:12;27417:7;27442:1;27425:7;:14;:18;;;;:::i;:::-;27417:27;;;;;;;;:::i;:::-;;;;;;;:43;;27395:127;;;;-1:-1:-1::0;;;27395:127:0::1;;;;;;;:::i;:::-;27533:162;27571:4;;27576:1;27571:7;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;27633;::::0;;27593:10:::1;::::0;27618:41:::1;::::0;-1:-1:-1;;;;;27633:7:0::1;::::0;27642:4;;;;:7;::::1;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;27651:4;;27656:1;27651:7;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;27618:14;:41::i;:::-;27674:7;27682:1;27674:10;;;;;;;;:::i;:::-;;;;;;;27533:23;:162::i;:::-;27706:24;27712:7;27721:4;;27706:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;27727:2:0;;-1:-1:-1;27706:5:0::1;::::0;-1:-1:-1;;27706:24:0:i:1;:::-;27069:669:::0;;;;;;;;;:::o;25393:829::-;25692:19;25713:28;25664:8;17201:15;17189:8;:27;;17181:55;;;;-1:-1:-1;;;17181:55:0;;;;;;;:::i;:::-;25847:15:::1;::::0;25797:218:::1;::::0;25827:5;;-1:-1:-1;;;;;25847:15:0::1;25877:9:::0;25901:14;25930:23;25976:4:::1;25996:8:::0;25797:15:::1;:218::i;:::-;25759:256:::0;;-1:-1:-1;25759:256:0;-1:-1:-1;26026:43:0::1;26046:5:::0;26053:2;25759:256;26026:19:::1;:43::i;:::-;26097:15;::::0;26080:64:::1;::::0;-1:-1:-1;;;26080:64:0;;::::1;::::0;::::1;19704:25:1::0;;;-1:-1:-1;;;;;26097:15:0;;::::1;::::0;26080:42:::1;::::0;19677:18:1;;26080:64:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;26155:59;26189:2;26193:20;26155:33;:59::i;:::-;25393:829:::0;;;;;;;;;;:::o;20603:2284::-;20960:19;20994:28;21037:17;20918:8;17201:15;17189:8;:27;;17181:55;;;;-1:-1:-1;;;17181:55:0;;;;;;;:::i;:::-;21118:15:::1;::::0;21107:7;;-1:-1:-1;;;;;21118:15:0;;::::1;::::0;21107:4;;21118:15:::1;::::0;21107:7:::1;;;;:::i;:::-;;;;;;;-1:-1:-1::0;;;;;21107:26:0::1;;21099:59;;;;-1:-1:-1::0;;;21099:59:0::1;;;;;;;:::i;:::-;21169:24;21230:7:::0;;21196:99:::1;::::0;-1:-1:-1;;;;;21230:7:0::1;21252:13:::0;21280:4;21196:19:::1;:99::i;:::-;21169:126;;21330:9;21316:7;21324:1;21316:10;;;;;;;;:::i;:::-;;;;;;;:23;;21308:66;;;;-1:-1:-1::0;;;21308:66:0::1;;;;;;;:::i;:::-;21402:15;::::0;21434:10;;-1:-1:-1;;;;;21402:15:0;;::::1;::::0;21385:41:::1;::::0;21434:7;;21402:15:::1;::::0;21434:10:::1;;;;:::i;:::-;;;;;;;21385:62;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;21489:15;;;;;;;;;-1:-1:-1::0;;;;;21489:15:0::1;-1:-1:-1::0;;;;;21482:32:0::1;;21533:41;21548:7;::::0;::::1;;;;;;-1:-1:-1::0;;;;;21548:7:0::1;21557:4;21562:1;21557:7;;;;;;;;:::i;:::-;;;;;;;21566:4;21571:1;21566:7;;;;;;;;:::i;:::-;;;;;;;21533:14;:41::i;:::-;21593:7;21601:1;21593:10;;;;;;;;:::i;:::-;;;;;;;21482:136;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;10969:32:1;;;;10951:51;;11033:2;11018:18;;11011:34;10939:2;10924:18;;10777:274;21482:136:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;21460:169;;;::::0;::::1;;21642:24;21648:7;21657:4;21663:2;21642:5;:24::i;:::-;21715:23;21701:7;21709:1;21701:10;;;;;;;;:::i;:::-;;;;;;;:37;;21679:132;;;::::0;-1:-1:-1;;;21679:132:0;;16362:2:1;21679:132:0::1;::::0;::::1;16344:21:1::0;16401:2;16381:18;;;16374:30;16440:34;16420:18;;;16413:62;-1:-1:-1;;;16491:18:1;;;16484:43;16544:19;;21679:132:0::1;16160:409:1::0;21679:132:0::1;21849:13;21865:4;21884:1;21870:4;:11;:15;;;;:::i;:::-;21865:21;;;;;;;;:::i;:::-;;;;;;;21849:37;;21897:29;21941:7;21949:1;21941:10;;;;;;;;:::i;:::-;;;;;;;21929:9;:22;;;;:::i;:::-;21897:54;;22000:233;22028:5;22048:15;;;;;;;;;-1:-1:-1::0;;;;;22048:15:0::1;22078:7;22103:1;22086:7;:14;:18;;;;:::i;:::-;22078:27;;;;;;;;:::i;:::-;;;;;;;22120:21;22156:7;22181:1;22164:7;:14;:18;;;;:::i;:::-;22156:27;;;;;;;;:::i;:::-;;;;;;;22198:24;22000:13;:233::i;:::-;22246:12;22276:7:::0;;;22292:15;21962:271;;-1:-1:-1;21962:271:0;;-1:-1:-1;22246:12:0;22261:47:::1;::::0;-1:-1:-1;;;;;22276:7:0;;::::1;::::0;22285:5;;22292:15:::1;22261:14;:47::i;:::-;22246:62;;22321:61;22345:5;22352:10;22364:4;22370:11;22321:23;:61::i;:::-;22412:15;;;;;;;;;-1:-1:-1::0;;;;;22412:15:0::1;-1:-1:-1::0;;;;;22395:41:0::1;;22458:20;22395:96;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;22519:15:0::1;::::0;22512:60:::1;::::0;-1:-1:-1;;;22512:60:0;;-1:-1:-1;;;;;10969:32:1;;;22512:60:0::1;::::0;::::1;10951:51:1::0;11018:18;;;11011:34;;;22519:15:0;;::::1;::::0;-1:-1:-1;22512:32:0::1;::::0;-1:-1:-1;10924:18:1;;;-1:-1:-1;22512:60:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;22504:69;;;::::0;::::1;;22598:20;::::0;-1:-1:-1;;;22598:20:0;;-1:-1:-1;;;;;10044:32:1;;;22598:20:0::1;::::0;::::1;10026:51:1::0;22598:16:0;::::1;::::0;::::1;::::0;9999:18:1;;22598:20:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;22586:32;;22671:7;22679:1;22671:10;;;;;;;;:::i;:::-;;;;;;;22648:20;:33;;;;:::i;:::-;22635:9;:47;22631:209;;;22697:143;22749:10;22814:7;22822:1;22814:10;;;;;;;;:::i;:::-;;;;;;;22791:20;:33;;;;:::i;:::-;22778:47;::::0;:9:::1;:47;:::i;:::-;22697:33;:143::i;:::-;21071:1816;;;;20603:2284:::0;;;;;;;;;;;:::o;27746:610::-;27969:24;27950:8;17201:15;17189:8;:27;;17181:55;;;;-1:-1:-1;;;17181:55:0;;;;;;;:::i;:::-;28036:7:::1;::::0;28016:45:::1;::::0;;::::1;::::0;;::::1;::::0;;;;;;;;;;;::::1;::::0;-1:-1:-1;;;;;28036:7:0::1;::::0;28045:9;;28016:45;28056:4;;;;;;28016:45;;::::1;::::0;28056:4;;28016:45;28056:4;28016:45;::::1;;::::0;::::1;::::0;;;;-1:-1:-1;28016:19:0::1;::::0;-1:-1:-1;;;28016:45:0:i:1;:::-;28006:55;;28094:11;28080:7;28088:1;28080:10;;;;;;;;:::i;:::-;;;;;;;:25;;28072:68;;;;-1:-1:-1::0;;;28072:68:0::1;;;;;;;:::i;19287:1308::-:0;19625:19;19659:28;19702:17;19583:8;17201:15;17189:8;:27;;17181:55;;;;-1:-1:-1;;;17181:55:0;;;;;;;:::i;:::-;19833:15:::1;::::0;19785:198:::1;::::0;19813:5;;-1:-1:-1;;;;;19833:15:0::1;19863:18:::0;19896:9:::1;19920:14:::0;19949:23;19785:13:::1;:198::i;:::-;19994:12;20024:7:::0;;;20040:15;19747:236;;-1:-1:-1;19747:236:0;;-1:-1:-1;19994:12:0;20009:47:::1;::::0;-1:-1:-1;;;;;20024:7:0;;::::1;::::0;20033:5;;20040:15:::1;20009:14;:47::i;:::-;19994:62;;20067:61;20091:5;20098:10;20110:4;20116:11;20067:23;:61::i;:::-;20156:15;;;;;;;;;-1:-1:-1::0;;;;;20156:15:0::1;-1:-1:-1::0;;;;;20139:41:0::1;;20202:20;20139:96;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;20261:15:0::1;::::0;20254:60:::1;::::0;-1:-1:-1;;;20254:60:0;;-1:-1:-1;;;;;10969:32:1;;;20254:60:0::1;::::0;::::1;10951:51:1::0;11018:18;;;11011:34;;;20261:15:0;;::::1;::::0;-1:-1:-1;20254:32:0::1;::::0;-1:-1:-1;10924:18:1;;;-1:-1:-1;20254:60:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;20246:69;;;::::0;::::1;;20338:20;::::0;-1:-1:-1;;;20338:20:0;;-1:-1:-1;;;;;10044:32:1;;;20338:20:0::1;::::0;::::1;10026:51:1::0;20338:16:0;::::1;::::0;::::1;::::0;9999:18:1;;20338:20:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;20326:32;;20385:20;20373:9;:32;20369:179;;;20420:128;20472:10;20501:32;20513:20:::0;20501:9:::1;:32;:::i;20420:128::-;19736:859;19287:1308:::0;;;;;;;;;;;:::o;31130:993::-;31386:24;31358:8;17201:15;17189:8;:27;;17181:55;;;;-1:-1:-1;;;17181:55:0;;;;;;;:::i;:::-;31447:15:::1;::::0;-1:-1:-1;;;;;31447:15:0::1;31436:4:::0;;31447:15:::1;31436:7:::0;::::1;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;31436:26:0::1;;31428:59;;;;-1:-1:-1::0;;;31428:59:0::1;;;;;;;:::i;:::-;31528:7;::::0;31508:45:::1;::::0;;::::1;::::0;;::::1;::::0;;;;;;;;;;;::::1;::::0;-1:-1:-1;;;;;31528:7:0::1;::::0;31537:9;;31508:45;31548:4;;;;;;31508:45;;::::1;::::0;31548:4;;31508:45;31548:4;31508:45;::::1;;::::0;::::1;::::0;;;;-1:-1:-1;31508:19:0::1;::::0;-1:-1:-1;;;31508:45:0:i:1;:::-;31498:55;;31586:9;31572:7;31580:1;31572:10;;;;;;;;:::i;:::-;;;;;;;:23;;31564:66;;;;-1:-1:-1::0;;;31564:66:0::1;;;;;;;:::i;:::-;31658:15;::::0;31690:10;;-1:-1:-1;;;;;31658:15:0;;::::1;::::0;31641:41:::1;::::0;31690:7;;31658:15:::1;::::0;31690:10:::1;;;;:::i;:::-;;;;;;;31641:62;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;31743:15:0::1;::::0;::::1;31802:7:::0;;-1:-1:-1;;;;;31743:15:0;;::::1;::::0;-1:-1:-1;31736:32:0::1;::::0;-1:-1:-1;31787:41:0::1;::::0;-1:-1:-1;31802:7:0;;::::1;::::0;31811:4;;;;:7;::::1;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;31820:4;;31825:1;31820:7;;;;;;;:::i;31787:41::-;31847:7;31855:1;31847:10;;;;;;;;:::i;:::-;;;;;;;31736:136;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;10969:32:1;;;;10951:51;;11033:2;11018:18;;11011:34;10939:2;10924:18;;10777:274;31736:136:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;31714:169;;;::::0;::::1;;31894:24;31900:7;31909:4;;31894:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;31915:2:0;;-1:-1:-1;31894:5:0::1;::::0;-1:-1:-1;;31894:24:0:i:1;:::-;31945:7;31953:1;31945:10;;;;;;;;:::i;:::-;;;;;;;31933:9;:22;31929:159;;;31970:118;32022:10;32063:7;32071:1;32063:10;;;;;;;;:::i;:::-;;;;;;;32051:9;:22;;;;:::i;31970:118::-;31130:993:::0;;;;;;;;:::o;18339:940::-;18635:17;18616:8;17201:15;17189:8;:27;;17181:55;;;;-1:-1:-1;;;17181:55:0;;;;;;;:::i;:::-;18665:14:::1;18682:4;;18687:1;18682:7;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;18665:24:::0;-1:-1:-1;18700:14:0::1;18717:4:::0;;18722:15:::1;18736:1;18717:4:::0;18722:15:::1;:::i;:::-;18717:21;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;18700:38;;18751:24;18778:152;18817:13;18845:15;18875:4;;18894:2;18911:8;18778:24;:152::i;:::-;18751:179;;18943:23;18980:7;18988:1;18980:10;;;;;;;;:::i;:::-;;;;;;;18969:8;:21;;;;:::i;:::-;18943:47;;19019:252;19046:6;19067;19088:7;19113:1;19096:7;:14;:18;;;;:::i;:::-;19088:27;;;;;;;;:::i;:::-;;;;;;;19130:15;19160:7;19185:1;19168:7;:14;:18;;;;:::i;:::-;19160:27;;;;;;;;:::i;:::-;;;;;;;19202:18;19235:2;19252:8;19019:12;:252::i;:::-;19001:270;;;;;;;;;18654:625;;;;18339:940:::0;;;;;;;;;;;:::o;24517:868::-;24811:15;24828;24783:8;17201:15;17189:8;:27;;17181:55;;;;-1:-1:-1;;;17181:55:0;;;;;;;:::i;:::-;24861:12:::1;24891:7:::0;;24876:39:::1;::::0;-1:-1:-1;;;;;24891:7:0::1;24900:6:::0;24908;24876:14:::1;:39::i;:::-;24926:54;::::0;-1:-1:-1;;;24926:54:0;;24952:10:::1;24926:54;::::0;::::1;10637:34:1::0;-1:-1:-1;;;;;24926:25:0;::::1;10687:18:1::0;;;10680:43;;;10739:18;;;10732:34;;;24861:54:0;;-1:-1:-1;24926:25:0::1;::::0;10572:18:1;;24926:54:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;25028:20:0::1;::::0;-1:-1:-1;;;25028:20:0;;-1:-1:-1;;;;;10044:32:1;;;25028:20:0::1;::::0;::::1;10026:51:1::0;24992:15:0::1;::::0;;;25028:16;::::1;::::0;::::1;::::0;9999:18:1;;25028:20:0::1;::::0;::::1;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;24991:57;;;;25060:14;25080:33;25098:6;25106;25080:17;:33::i;:::-;25059:54;;;25155:6;-1:-1:-1::0;;;;;25145:16:0::1;:6;-1:-1:-1::0;;;;;25145:16:0::1;;:84;;25212:7;25221;25145:84;;;25178:7;25187;25145:84;25124:105:::0;;-1:-1:-1;25124:105:0;-1:-1:-1;25248:21:0;;::::1;;25240:63;;;::::0;-1:-1:-1;;;25240:63:0;;16776:2:1;25240:63:0::1;::::0;::::1;16758:21:1::0;16815:2;16795:18;;;16788:30;16854:31;16834:18;;;16827:59;16903:18;;25240:63:0::1;16574:353:1::0;25240:63:0::1;25333:10;25322:7;:21;;25314:63;;;::::0;-1:-1:-1;;;25314:63:0;;14069:2:1;25314:63:0::1;::::0;::::1;14051:21:1::0;14108:2;14088:18;;;14081:30;14147:31;14127:18;;;14120:59;14196:18;;25314:63:0::1;13867:353:1::0;25314:63:0::1;24850:535;;;;24517:868:::0;;;;;;;;;;;:::o;28364:861::-;28623:24;28595:8;17201:15;17189:8;:27;;17181:55;;;;-1:-1:-1;;;17181:55:0;;;;;;;:::i;:::-;28684:15:::1;::::0;-1:-1:-1;;;;;28684:15:0::1;28673:4:::0;;28684:15:::1;28673:7:::0;::::1;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;28673:26:0::1;;28665:59;;;;-1:-1:-1::0;;;28665:59:0::1;;;;;;;:::i;:::-;28766:7;::::0;28745:46:::1;::::0;;::::1;::::0;;::::1;::::0;;;;;;;;;;;::::1;::::0;-1:-1:-1;;;;;28766:7:0::1;::::0;28775:9:::1;::::0;28745:46;28786:4;;;;;;28745:46;;::::1;::::0;28786:4;;28745:46;28786:4;28745:46;::::1;;::::0;::::1;::::0;;;;-1:-1:-1;28745:20:0::1;::::0;-1:-1:-1;;;28745:46:0:i:1;:::-;28735:56;;28855:12;28824:7;28849:1;28832:7;:14;:18;;;;:::i;:::-;28824:27;;;;;;;;:::i;:::-;;;;;;;:43;;28802:127;;;;-1:-1:-1::0;;;28802:127:0::1;;;;;;;:::i;:::-;28957:15;::::0;28989:10;;-1:-1:-1;;;;;28957:15:0;;::::1;::::0;28940:41:::1;::::0;28989:7;;28957:15:::1;::::0;28989:10:::1;;;;:::i;:::-;;;;;;;28940:62;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;29042:15:0::1;::::0;::::1;29101:7:::0;;-1:-1:-1;;;;;29042:15:0;;::::1;::::0;-1:-1:-1;29035:32:0::1;::::0;-1:-1:-1;29086:41:0::1;::::0;-1:-1:-1;29101:7:0;;::::1;::::0;29110:4;;;;:7;::::1;;;;:::i;29086:41::-;29146:7;29154:1;29146:10;;;;;;;;:::i;:::-;;;;;;;29035:136;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;10969:32:1;;;;10951:51;;11033:2;11018:18;;11011:34;10939:2;10924:18;;10777:274;29035:136:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;29013:169;;;::::0;::::1;;29193:24;29199:7;29208:4;;29193:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;29214:2:0;;-1:-1:-1;29193:5:0::1;::::0;-1:-1:-1;;29193:24:0:i:1;32627:232::-:0;32827:7;;32757:24;;32806:45;;-1:-1:-1;;;;;32827:7:0;32836:8;32846:4;32806:20;:45::i;30152:970::-;30385:24;30366:8;17201:15;17189:8;:27;;17181:55;;;;-1:-1:-1;;;17181:55:0;;;;;;;:::i;:::-;30469:15:::1;::::0;;-1:-1:-1;;;;;30469:15:0::1;::::0;30444:4;;;;30449:15:::1;::::0;30444:4;30449:15:::1;:::i;:::-;30444:21;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;30444:40:0::1;;30422:110;;;;-1:-1:-1::0;;;30422:110:0::1;;;;;;;:::i;:::-;30574:7;::::0;30553:45:::1;::::0;;::::1;::::0;;::::1;::::0;;;;;;;;;;;::::1;::::0;-1:-1:-1;;;;;30574:7:0::1;::::0;30583:8;;30553:45;30593:4;;;;;;30553:45;;::::1;::::0;30593:4;;30553:45;30593:4;30553:45;::::1;;::::0;::::1;::::0;;;;-1:-1:-1;30553:20:0::1;::::0;-1:-1:-1;;;30553:45:0:i:1;:::-;30543:55;;30662:12;30631:7;30656:1;30639:7;:14;:18;;;;:::i;:::-;30631:27;;;;;;;;:::i;:::-;;;;;;;:43;;30609:127;;;;-1:-1:-1::0;;;30609:127:0::1;;;;;;;:::i;:::-;30747:162;30785:4;;30790:1;30785:7;;;;;;;:::i;30747:162::-;30920:35;30926:7;30935:4;;30920:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;30949:4:0::1;::::0;-1:-1:-1;30920:5:0::1;::::0;-1:-1:-1;;30920:35:0:i:1;:::-;30983:15;::::0;;31017:14;;-1:-1:-1;;;;;30983:15:0;;::::1;::::0;30966:42:::1;::::0;31009:7;;31017:18:::1;::::0;::::1;:::i;:::-;31009:27;;;;;;;;:::i;:::-;;;;;;;30966:71;;;;;;;;;;;;;19704:25:1::0;;19692:2;19677:18;;19558:177;30966:71:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;31048:66;31082:2;31086:7;31111:1;31094:7;:14;:18;;;;:::i;:::-;31086:27;;;;;;;;:::i;:::-;;;;;;;31048:33;:66::i;17434:897::-:0;17777:15;17807;17837:17;17735:8;17201:15;17189:8;:27;;17181:55;;;;-1:-1:-1;;;17181:55:0;;;;;;;:::i;:::-;17903:174:::1;17931:6;17952;17973:14;18002;18031:10;18056;17903:13;:174::i;:::-;18088:12;18118:7:::0;;17882:195;;-1:-1:-1;17882:195:0;;-1:-1:-1;18088:12:0;18103:39:::1;::::0;-1:-1:-1;;;;;18118:7:0::1;18127:6:::0;18135;18103:14:::1;:39::i;:::-;18088:54;;18153:58;18177:6;18185:10;18197:4;18203:7;18153:23;:58::i;:::-;18222;18246:6;18254:10;18266:4;18272:7;18222:23;:58::i;:::-;18303:20;::::0;-1:-1:-1;;;18303:20:0;;-1:-1:-1;;;;;10044:32:1;;;18303:20:0::1;::::0;::::1;10026:51:1::0;18303:16:0;::::1;::::0;::::1;::::0;9999:18:1;;18303:20:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;18291:32;;17871:460;17434:897:::0;;;;;;;;;;;;;:::o;29233:911::-;29466:24;29447:8;17201:15;17189:8;:27;;17181:55;;;;-1:-1:-1;;;17181:55:0;;;;;;;:::i;:::-;29550:15:::1;::::0;;-1:-1:-1;;;;;29550:15:0::1;::::0;29525:4;;;;29530:15:::1;::::0;29525:4;29530:15:::1;:::i;:::-;29525:21;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;29525:40:0::1;;29503:110;;;;-1:-1:-1::0;;;29503:110:0::1;;;;;;;:::i;:::-;29654:7;::::0;29634:45:::1;::::0;;::::1;::::0;;::::1;::::0;;;;;;;;;;;::::1;::::0;-1:-1:-1;;;;;29654:7:0::1;::::0;29663:9;;29634:45;29674:4;;;;;;29634:45;;::::1;::::0;29674:4;;29634:45;29674:4;29634:45;::::1;;::::0;::::1;::::0;;;;-1:-1:-1;29634:19:0::1;::::0;-1:-1:-1;;;29634:45:0:i:1;:::-;29624:55;;29712:11;29698:7;29706:1;29698:10;;;;;;;;:::i;:::-;;;;;;;:25;;29690:68;;;;-1:-1:-1::0;;;29690:68:0::1;;;;;;;:::i;6694:589::-:0;6830:17;6879:1;6868:8;:12;6860:58;;;;-1:-1:-1;;;6860:58:0;;19358:2:1;6860:58:0;;;19340:21:1;19397:2;19377:18;;;19370:30;19436:34;19416:18;;;19409:62;-1:-1:-1;;;19487:18:1;;;19480:31;19528:19;;6860:58:0;19156:397:1;6860:58:0;6963:1;6951:9;:13;:31;;;;;6981:1;6968:10;:14;6951:31;6929:111;;;;-1:-1:-1;;;6929:111:0;;17951:2:1;6929:111:0;;;17933:21:1;17990:2;17970:18;;;17963:30;18029:32;18009:18;;;18002:60;18079:18;;6929:111:0;17749:354:1;6929:111:0;7051:23;7077:17;:8;7090:3;7077:12;:17::i;:::-;7051:43;-1:-1:-1;7105:17:0;7125:31;7051:43;7145:10;7125:19;:31::i;:::-;7105:51;-1:-1:-1;7167:19:0;7189:40;7213:15;7189:19;:9;7203:4;7189:13;:19::i;:::-;:23;;:40::i;:::-;7167:62;-1:-1:-1;7252:23:0;7167:62;7252:9;:23;:::i;:::-;7240:35;6694:589;-1:-1:-1;;;;;;;6694:589:0:o;8654:640::-;8792:24;8852:1;8837:4;:11;:16;;8829:49;;;;-1:-1:-1;;;8829:49:0;;18310:2:1;8829:49:0;;;18292:21:1;18349:2;18329:18;;;18322:30;-1:-1:-1;;;18368:18:1;;;18361:50;18428:18;;8829:49:0;18108:344:1;8829:49:0;8913:4;:11;8899:26;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;8899:26:0;;8889:36;;8966:9;8936:7;8961:1;8944:7;:14;:18;;;;:::i;:::-;8936:27;;;;;;;;:::i;:::-;;;;;;:39;;;;;8991:9;9017:1;9003:4;:11;:15;;;;:::i;:::-;8991:27;;8986:301;9020:5;;8986:301;;9048:17;;9089:108;9119:7;9145:4;9150:5;9154:1;9150;:5;:::i;:::-;9145:11;;;;;;;;:::i;:::-;;;;;;;9175:4;9180:1;9175:7;;;;;;;;:::i;:::-;;;;;;;9089:11;:108::i;:::-;9047:150;;;;9229:46;9241:7;9249:1;9241:10;;;;;;;;:::i;:::-;;;;;;;9253:9;9264:10;9229:11;:46::i;:::-;9212:7;9220:5;9224:1;9220;:5;:::i;:::-;9212:14;;;;;;;;:::i;:::-;;;;;;:63;;;;;9032:255;;9027:3;;;;;:::i;:::-;;;;8986:301;;;;8654:640;;;;;:::o;8027:619::-;8165:24;8225:1;8210:4;:11;:16;;8202:49;;;;-1:-1:-1;;;8202:49:0;;18310:2:1;8202:49:0;;;18292:21:1;18349:2;18329:18;;;18322:30;-1:-1:-1;;;18368:18:1;;;18361:50;18428:18;;8202:49:0;18108:344:1;8202:49:0;8286:4;:11;8272:26;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;8272:26:0;;8262:36;;8322:8;8309:7;8317:1;8309:10;;;;;;;;:::i;:::-;;;;;;:21;;;;;8346:9;8341:298;8375:1;8361:4;:11;:15;;;;:::i;:::-;8357:1;:19;8341:298;;;8399:17;8418:18;8440:108;8470:7;8496:4;8501:1;8496:7;;;;;;;;:::i;:::-;;;;;;;8522:4;8527:1;8531;8527:5;;;;:::i;:::-;8522:11;;;;;;;;:::i;8440:108::-;8398:150;;;;8580:47;8593:7;8601:1;8593:10;;;;;;;;:::i;:::-;;;;;;;8605:9;8616:10;8580:12;:47::i;:::-;8563:7;8571:5;:1;8575;8571:5;:::i;:::-;8563:14;;;;;;;;:::i;:::-;;;;;;:64;;;;;8383:256;;8378:3;;;;;:::i;:::-;;;;8341:298;;4237:204;4392:41;;-1:-1:-1;;;4392:41:0;;-1:-1:-1;;;;;10318:15:1;;;4392:41:0;;;10300:34:1;10370:15;;;10350:18;;;10343:43;4360:12:0;;4392:25;;;;;;10235:18:1;;4392:41:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;5274:522::-;5559:51;;;-1:-1:-1;;;;;10655:15:1;;;5559:51:0;;;10637:34:1;10707:15;;;10687:18;;;10680:43;10739:18;;;;10732:34;;;5559:51:0;;;;;;;;;;10572:18:1;;;;5559:51:0;;;;;;;-1:-1:-1;;;;;5559:51:0;-1:-1:-1;;;5559:51:0;;;5534:87;;-1:-1:-1;;;;5534:10:0;;;;:87;;5559:51;5534:87;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5498:123;;;;5654:7;:57;;;;-1:-1:-1;5666:11:0;;:16;;:44;;;5697:4;5686:24;;;;;;;;;;;;:::i;:::-;5632:156;;;;-1:-1:-1;;;5632:156:0;;13651:2:1;5632:156:0;;;13633:21:1;13690:2;13670:18;;;13663:30;13729:34;13709:18;;;13702:62;-1:-1:-1;;;13780:18:1;;;13773:47;13837:19;;5632:156:0;13449:413:1;5632:156:0;5408:388;;5274:522;;;;:::o;26230:831::-;26365:9;26360:694;26394:1;26380:4;:11;:15;;;;:::i;:::-;26376:1;:19;26360:694;;;26418:13;26433:14;26452:4;26457:1;26452:7;;;;;;;;:::i;:::-;;;;;;;26461:4;26466:1;26470;26466:5;;;;:::i;:::-;26461:11;;;;;;;;:::i;:::-;;;;;;;26417:56;;;;26489:14;26509:32;26527:5;26534:6;26509:17;:32::i;:::-;-1:-1:-1;26488:53:0;-1:-1:-1;26556:17:0;26576:7;26584:5;:1;26588;26584:5;:::i;:::-;26576:14;;;;;;;;:::i;:::-;;;;;;;26556:34;;26606:18;26626;26657:6;-1:-1:-1;;;;;26648:15:0;:5;-1:-1:-1;;;;;26648:15:0;;:101;;26727:9;26746:1;26648:101;;;26692:1;26696:9;26648:101;26605:144;;;;26764:10;26795:1;26781:4;:11;:15;;;;:::i;:::-;26777:1;:19;:106;;26880:3;26777:106;;;26831:7;;26816:44;;-1:-1:-1;;;;;26831:7:0;26840:6;26848:4;26853:5;:1;26857;26853:5;:::i;:::-;26848:11;;;;;;;;:::i;26816:44::-;26919:7;;26764:119;;-1:-1:-1;26904:38:0;;-1:-1:-1;;;;;26919:7:0;26928:5;26935:6;26904:14;:38::i;:::-;26898:144;;-1:-1:-1;;;26898:144:0;;;;;20195:25:1;;;20236:18;;;20229:34;;;-1:-1:-1;;;;;20299:32:1;;;20279:18;;;20272:60;26898:50:0;;;;;;;20168:18:1;;26898:144:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26402:652;;;;;;;26397:3;;;;;:::i;:::-;;;;26360:694;;;;26230:831;;;:::o;5804:473::-;6050:45;;;-1:-1:-1;;;;;10969:32:1;;;6050:45:0;;;10951:51:1;11018:18;;;;11011:34;;;6050:45:0;;;;;;;;;;10924:18:1;;;;6050:45:0;;;;;;;-1:-1:-1;;;;;6050:45:0;-1:-1:-1;;;6050:45:0;;;6025:81;;-1:-1:-1;;;;6025:10:0;;;;:81;;6050:45;6025:81;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5989:117;;;;6139:7;:57;;;;-1:-1:-1;6151:11:0;;:16;;:44;;;6182:4;6171:24;;;;;;;;;;;;:::i;:::-;6117:152;;;;-1:-1:-1;;;6117:152:0;;17537:2:1;6117:152:0;;;17519:21:1;17576:2;17556:18;;;17549:30;17615:34;17595:18;;;17588:62;-1:-1:-1;;;17666:18:1;;;17659:43;17719:19;;6117:152:0;17335:409:1;6117:152:0;5911:366;;5804:473;;;:::o;6285:287::-;6409:12;;;6369;6409;;;;;;;;;-1:-1:-1;;;;;6387:7:0;;;6402:5;;6387:35;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6368:54;;;6455:7;6433:131;;;;-1:-1:-1;;;6433:131:0;;14427:2:1;6433:131:0;;;14409:21:1;14466:2;14446:18;;;14439:30;14505:34;14485:18;;;14478:62;14576:34;14556:18;;;14549:62;-1:-1:-1;;;14627:19:1;;;14620:41;14678:19;;6433:131:0;14225:478:1;6433:131:0;6357:215;6285:287;;:::o;22895:1614::-;23116:15;23174:7;;23165:41;;-1:-1:-1;;;23165:41:0;;-1:-1:-1;;;;;10318:15:1;;;23165:41:0;;;10300:34:1;10370:15;;;10350:18;;;10343:43;23116:15:0;;;;23174:7;;;23165:25;;10235:18:1;;23165:41:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;23165:55:0;;23161:132;;;23246:7;;23237:44;;-1:-1:-1;;;23237:44:0;;-1:-1:-1;;;;;10318:15:1;;;23237:44:0;;;10300:34:1;10370:15;;;10350:18;;;10343:43;23246:7:0;;;;23237:28;;10235:18:1;;23237:44:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;23161:132;23304:16;23375:7;;23304:16;;23342:93;;-1:-1:-1;;;;;23375:7:0;23397:6;23418;23342:18;:93::i;:::-;23303:132;;;;23450:8;23462:1;23450:13;:30;;;;-1:-1:-1;23467:13:0;;23450:30;23446:1056;;;23519:14;;-1:-1:-1;23535:14:0;;-1:-1:-1;23446:1056:0;;;23583:22;23608:114;23639:14;23672:8;23699;23608:12;:114::i;:::-;23583:139;;23759:14;23741;:32;23737:754;;23842:10;23824:14;:28;;23794:131;;;;-1:-1:-1;;;23794:131:0;;14069:2:1;23794:131:0;;;14051:21:1;14108:2;14088:18;;;14081:30;14147:31;14127:18;;;14120:59;14196:18;;23794:131:0;13867:353:1;23794:131:0;23966:14;;-1:-1:-1;23982:14:0;-1:-1:-1;23982:14:0;23737:754;;;24038:22;24063:130;24098:14;24135:8;24166;24063:12;:130::i;:::-;24038:155;;24238:14;24220;:32;;24212:41;;;;;;24320:10;24302:14;:28;;24272:131;;;;-1:-1:-1;;;24272:131:0;;16776:2:1;24272:131:0;;;16758:21:1;16815:2;16795:18;;;16788:30;16854:31;16834:18;;;16827:59;16903:18;;24272:131:0;16574:353:1;24272:131:0;24444:14;-1:-1:-1;24460:14:0;;-1:-1:-1;23737:754:0;23568:934;23446:1056;23150:1359;;22895:1614;;;;;;;;;:::o;3842:387::-;3944:14;3960;4010:6;-1:-1:-1;;;;;4000:16:0;:6;-1:-1:-1;;;;;4000:16:0;;;3992:56;;;;-1:-1:-1;;;3992:56:0;;16006:2:1;3992:56:0;;;15988:21:1;16045:2;16025:18;;;16018:30;16084:29;16064:18;;;16057:57;16131:18;;3992:56:0;15804:351:1;3992:56:0;4087:6;-1:-1:-1;;;;;4078:15:0;:6;-1:-1:-1;;;;;4078:15:0;;:79;;4142:6;4150;4078:79;;;4110:6;4118;4078:79;4059:98;;-1:-1:-1;4059:98:0;-1:-1:-1;;;;;;4176:20:0;;4168:53;;;;-1:-1:-1;;;4168:53:0;;14910:2:1;4168:53:0;;;14892:21:1;14949:2;14929:18;;;14922:30;-1:-1:-1;;;14968:18:1;;;14961:50;15028:18;;4168:53:0;14708:344:1;4168:53:0;3842:387;;;;;:::o;3550:151::-;3608:9;3638:6;;;:30;;-1:-1:-1;3667:1:0;3662;3653:5;3662:1;3667;3653:5;:::i;:::-;3649:9;-1:-1:-1;3648:15:0;;3649:9;3648:15;:::i;:::-;:20;3638:30;3630:63;;;;-1:-1:-1;;;3630:63:0;;12594:2:1;3630:63:0;;;12576:21:1;12633:2;12613:18;;;12606:30;-1:-1:-1;;;12652:18:1;;;12645:50;12712:18;;3630:63:0;12392:344:1;3259:137:0;3317:9;3362:1;3352:5;3356:1;3362;3352:5;:::i;:::-;3348:9;;;3347:16;;3339:49;;;;-1:-1:-1;;;3339:49:0;;13302:2:1;3339:49:0;;;13284:21:1;13341:2;13321:18;;;13314:30;-1:-1:-1;;;13360:18:1;;;13353:50;13420:18;;3339:49:0;13100:344:1;4788:478:0;4915:16;4933;4963:14;4983:26;4994:6;5002;4983:10;:26::i;:::-;4962:47;;;5021:16;5039;5079:32;5087:7;5096:6;5104;5079:7;:32::i;:::-;-1:-1:-1;;;;;5059:75:0;;:77;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;5020:116:0;;;-1:-1:-1;;;;;5020:116:0;;;5180:6;-1:-1:-1;;;;;5170:16:0;:6;-1:-1:-1;;;;;5170:16:0;;:88;;5239:8;5249;5170:88;;;5203:8;5213;5170:88;5147:111;;;;-1:-1:-1;4788:478:0;-1:-1:-1;;;;;;;4788:478:0:o;7404:541::-;7540:16;7589:1;7577:9;:13;7569:60;;;;-1:-1:-1;;;7569:60:0;;15603:2:1;7569:60:0;;;15585:21:1;15642:2;15622:18;;;15615:30;15681:34;15661:18;;;15654:62;-1:-1:-1;;;15732:18:1;;;15725:32;15774:19;;7569:60:0;15401:398:1;7569:60:0;7674:1;7662:9;:13;:31;;;;;7692:1;7679:10;:14;7662:31;7640:111;;;;-1:-1:-1;;;7640:111:0;;17951:2:1;7640:111:0;;;17933:21:1;17990:2;17970:18;;;17963:30;18029:32;18009:18;;;18002:60;18079:18;;7640:111:0;17749:354:1;7640:111:0;7762:17;7782:34;7811:4;7782:24;:9;7796;7782:13;:24::i;:::-;:28;;:34::i;:::-;7762:54;-1:-1:-1;7827:19:0;7849:34;7879:3;7849:25;:10;7864:9;7849:14;:25::i;:34::-;7827:56;-1:-1:-1;7905:32:0;7935:1;7906:23;7827:56;7906:9;:23;:::i;7905:32::-;7894:43;7404:541;-1:-1:-1;;;;;;7404:541:0:o;4449:331::-;4574:15;4620:1;4610:7;:11;4602:43;;;;-1:-1:-1;;;4602:43:0;;18659:2:1;4602:43:0;;;18641:21:1;18698:2;18678:18;;;18671:30;-1:-1:-1;;;18717:18:1;;;18710:49;18776:18;;4602:43:0;18457:343:1;4602:43:0;4675:1;4664:8;:12;:28;;;;;4691:1;4680:8;:12;4664:28;4656:63;;;;-1:-1:-1;;;4656:63:0;;19007:2:1;4656:63:0;;;18989:21:1;19046:2;19026:18;;;19019:30;-1:-1:-1;;;19065:18:1;;;19058:52;19127:18;;4656:63:0;18805:346:1;4656:63:0;4764:8;4740:21;:7;4752:8;4740:11;:21::i;:::-;:32;;;;:::i;3404:138::-;3462:9;3507:1;3497:5;3501:1;3507;3497:5;:::i;:::-;3493:9;;;3492:16;;3484:50;;;;-1:-1:-1;;;3484:50:0;;11895:2:1;3484:50:0;;;11877:21:1;11934:2;11914:18;;;11907:30;-1:-1:-1;;;11953:18:1;;;11946:51;12014:18;;3484:50:0;11693:345:1;14:134;82:20;;111:31;82:20;111:31;:::i;:::-;14:134;;;:::o;153:367::-;216:8;226:6;280:3;273:4;265:6;261:17;257:27;247:55;;298:1;295;288:12;247:55;-1:-1:-1;321:20:1;;364:18;353:30;;350:50;;;396:1;393;386:12;350:50;433:4;425:6;421:17;409:29;;493:3;486:4;476:6;473:1;469:14;461:6;457:27;453:38;450:47;447:67;;;510:1;507;500:12;525:919;579:5;632:3;625:4;617:6;613:17;609:27;599:55;;650:1;647;640:12;599:55;686:6;673:20;712:4;735:18;772:2;768;765:10;762:36;;;778:18;;:::i;:::-;824:2;821:1;817:10;856:2;850:9;919:2;915:7;910:2;906;902:11;898:25;890:6;886:38;974:6;962:10;959:22;954:2;942:10;939:18;936:46;933:72;;;985:18;;:::i;:::-;1021:2;1014:22;1071:18;;;1105:15;;;;-1:-1:-1;1140:15:1;;;1174;;;1170:24;;1167:33;-1:-1:-1;1164:53:1;;;1213:1;1210;1203:12;1164:53;1235:1;1226:10;;1245:169;1259:2;1256:1;1253:9;1245:169;;;1316:23;1335:3;1316:23;:::i;:::-;1304:36;;1360:12;;;;1277:1;1270:9;;;;;1392:12;;1245:169;;;-1:-1:-1;1432:6:1;525:919;-1:-1:-1;;;;;;;525:919:1:o;1449:188::-;1528:13;;-1:-1:-1;;;;;1570:42:1;;1560:53;;1550:81;;1627:1;1624;1617:12;1642:247;1701:6;1754:2;1742:9;1733:7;1729:23;1725:32;1722:52;;;1770:1;1767;1760:12;1722:52;1809:9;1796:23;1828:31;1853:5;1828:31;:::i;:::-;1878:5;1642:247;-1:-1:-1;;;1642:247:1:o;1894:251::-;1964:6;2017:2;2005:9;1996:7;1992:23;1988:32;1985:52;;;2033:1;2030;2023:12;1985:52;2065:9;2059:16;2084:31;2109:5;2084:31;:::i;2150:805::-;2263:6;2271;2279;2287;2295;2303;2311;2364:3;2352:9;2343:7;2339:23;2335:33;2332:53;;;2381:1;2378;2371:12;2332:53;2420:9;2407:23;2439:31;2464:5;2439:31;:::i;:::-;2489:5;-1:-1:-1;2546:2:1;2531:18;;2518:32;2559:33;2518:32;2559:33;:::i;:::-;2611:7;-1:-1:-1;2665:2:1;2650:18;;2637:32;;-1:-1:-1;2716:2:1;2701:18;;2688:32;;-1:-1:-1;2767:3:1;2752:19;;2739:33;;-1:-1:-1;2824:3:1;2809:19;;2796:33;2838;2796;2838;:::i;:::-;2890:7;2880:17;;;2944:3;2933:9;2929:19;2916:33;2906:43;;2150:805;;;;;;;;;;:::o;2960:874::-;3082:6;3090;3098;3106;3114;3122;3130;3138;3191:3;3179:9;3170:7;3166:23;3162:33;3159:53;;;3208:1;3205;3198:12;3159:53;3247:9;3234:23;3266:31;3291:5;3266:31;:::i;:::-;3316:5;-1:-1:-1;3373:2:1;3358:18;;3345:32;3386:33;3345:32;3386:33;:::i;:::-;3438:7;-1:-1:-1;3492:2:1;3477:18;;3464:32;;-1:-1:-1;3543:2:1;3528:18;;3515:32;;-1:-1:-1;3594:3:1;3579:19;;3566:33;;-1:-1:-1;3646:3:1;3631:19;;3618:33;;-1:-1:-1;3703:3:1;3688:19;;3675:33;3717;3675;3717;:::i;:::-;3769:7;3759:17;;;3823:3;3812:9;3808:19;3795:33;3785:43;;2960:874;;;;;;;;;;;:::o;3839:663::-;3943:6;3951;3959;3967;3975;3983;4036:3;4024:9;4015:7;4011:23;4007:33;4004:53;;;4053:1;4050;4043:12;4004:53;4092:9;4079:23;4111:31;4136:5;4111:31;:::i;:::-;4161:5;-1:-1:-1;4213:2:1;4198:18;;4185:32;;-1:-1:-1;4264:2:1;4249:18;;4236:32;;-1:-1:-1;4315:2:1;4300:18;;4287:32;;-1:-1:-1;4371:3:1;4356:19;;4343:33;4385;4343;4385;:::i;:::-;4437:7;4427:17;;;4491:3;4480:9;4476:19;4463:33;4453:43;;3839:663;;;;;;;;:::o;4507:916::-;4647:6;4655;4663;4671;4679;4687;4695;4703;4756:3;4744:9;4735:7;4731:23;4727:33;4724:53;;;4773:1;4770;4763:12;4724:53;4813:9;4800:23;4846:18;4838:6;4835:30;4832:50;;;4878:1;4875;4868:12;4832:50;4917:70;4979:7;4970:6;4959:9;4955:22;4917:70;:::i;:::-;5006:8;;-1:-1:-1;4891:96:1;-1:-1:-1;;5088:2:1;5073:18;;5060:32;;-1:-1:-1;5139:2:1;5124:18;;5111:32;;-1:-1:-1;5190:2:1;5175:18;;5162:32;;-1:-1:-1;5241:3:1;5226:19;;5213:33;;-1:-1:-1;5296:3:1;5281:19;;5268:33;5310:31;5268:33;5310:31;:::i;:::-;5360:5;5350:15;;;5412:3;5401:9;5397:19;5384:33;5374:43;;4507:916;;;;;;;;;;;:::o;5428:758::-;5557:6;5565;5573;5581;5589;5597;5650:3;5638:9;5629:7;5625:23;5621:33;5618:53;;;5667:1;5664;5657:12;5618:53;5707:9;5694:23;5740:18;5732:6;5729:30;5726:50;;;5772:1;5769;5762:12;5726:50;5795:61;5848:7;5839:6;5828:9;5824:22;5795:61;:::i;:::-;5785:71;;;5903:2;5892:9;5888:18;5875:32;5865:42;;5954:2;5943:9;5939:18;5926:32;5916:42;;6005:2;5994:9;5990:18;5977:32;5967:42;;6059:3;6048:9;6044:19;6031:33;6073:31;6098:5;6073:31;:::i;6191:277::-;6258:6;6311:2;6299:9;6290:7;6286:23;6282:32;6279:52;;;6327:1;6324;6317:12;6279:52;6359:9;6353:16;6412:5;6405:13;6398:21;6391:5;6388:32;6378:60;;6434:1;6431;6424:12;6473:293;6552:6;6560;6613:2;6601:9;6592:7;6588:23;6584:32;6581:52;;;6629:1;6626;6619:12;6581:52;6652:40;6682:9;6652:40;:::i;:::-;6642:50;;6711:49;6756:2;6745:9;6741:18;6711:49;:::i;:::-;6701:59;;6473:293;;;;;:::o;6771:184::-;6841:6;6894:2;6882:9;6873:7;6869:23;6865:32;6862:52;;;6910:1;6907;6900:12;6862:52;-1:-1:-1;6933:16:1;;6771:184;-1:-1:-1;6771:184:1:o;6960:709::-;7073:6;7081;7089;7097;7105;7158:3;7146:9;7137:7;7133:23;7129:33;7126:53;;;7175:1;7172;7165:12;7126:53;7211:9;7198:23;7188:33;;7272:2;7261:9;7257:18;7244:32;7299:18;7291:6;7288:30;7285:50;;;7331:1;7328;7321:12;7285:50;7370:70;7432:7;7423:6;7412:9;7408:22;7370:70;:::i;:::-;7459:8;;-1:-1:-1;7344:96:1;-1:-1:-1;;7544:2:1;7529:18;;7516:32;7557:31;7516:32;7557:31;:::i;:::-;6960:709;;;;-1:-1:-1;6960:709:1;;7659:2;7644:18;7631:32;;6960:709;-1:-1:-1;;6960:709:1:o;7674:416::-;7767:6;7775;7828:2;7816:9;7807:7;7803:23;7799:32;7796:52;;;7844:1;7841;7834:12;7796:52;7880:9;7867:23;7857:33;;7941:2;7930:9;7926:18;7913:32;7968:18;7960:6;7957:30;7954:50;;;8000:1;7997;7990:12;7954:50;8023:61;8076:7;8067:6;8056:9;8052:22;8023:61;:::i;:::-;8013:71;;;7674:416;;;;;:::o;8095:245::-;8174:6;8182;8235:2;8223:9;8214:7;8210:23;8206:32;8203:52;;;8251:1;8248;8241:12;8203:52;-1:-1:-1;;8274:16:1;;8330:2;8315:18;;;8309:25;8274:16;;8309:25;;-1:-1:-1;8095:245:1:o;8345:778::-;8467:6;8475;8483;8491;8499;8507;8560:3;8548:9;8539:7;8535:23;8531:33;8528:53;;;8577:1;8574;8567:12;8528:53;8613:9;8600:23;8590:33;;8670:2;8659:9;8655:18;8642:32;8632:42;;8725:2;8714:9;8710:18;8697:32;8752:18;8744:6;8741:30;8738:50;;;8784:1;8781;8774:12;8738:50;8823:70;8885:7;8876:6;8865:9;8861:22;8823:70;:::i;:::-;8912:8;;-1:-1:-1;8797:96:1;-1:-1:-1;;8997:2:1;8982:18;;8969:32;9010:31;8969:32;9010:31;:::i;:::-;9060:5;9050:15;;;9112:3;9101:9;9097:19;9084:33;9074:43;;8345:778;;;;;;;;:::o;9128:316::-;9205:6;9213;9221;9274:2;9262:9;9253:7;9249:23;9245:32;9242:52;;;9290:1;9287;9280:12;9242:52;-1:-1:-1;;9313:23:1;;;9383:2;9368:18;;9355:32;;-1:-1:-1;9434:2:1;9419:18;;;9406:32;;9128:316;-1:-1:-1;9128:316:1:o;9449:426::-;9578:3;9616:6;9610:13;9641:1;9651:129;9665:6;9662:1;9659:13;9651:129;;;9763:4;9747:14;;;9743:25;;9737:32;9724:11;;;9717:53;9680:12;9651:129;;;9798:6;9795:1;9792:13;9789:48;;;9833:1;9824:6;9819:3;9815:16;9808:27;9789:48;-1:-1:-1;9853:16:1;;;;;9449:426;-1:-1:-1;;9449:426:1:o;11056:632::-;11227:2;11279:21;;;11349:13;;11252:18;;;11371:22;;;11198:4;;11227:2;11450:15;;;;11424:2;11409:18;;;11198:4;11493:169;11507:6;11504:1;11501:13;11493:169;;;11568:13;;11556:26;;11637:15;;;;11602:12;;;;11529:1;11522:9;11493:169;;;-1:-1:-1;11679:3:1;;11056:632;-1:-1:-1;;;;;;11056:632:1:o;12043:344::-;12245:2;12227:21;;;12284:2;12264:18;;;12257:30;-1:-1:-1;;;12318:2:1;12303:18;;12296:50;12378:2;12363:18;;12043:344::o;12741:354::-;12943:2;12925:21;;;12982:2;12962:18;;;12955:30;13021:32;13016:2;13001:18;;12994:60;13086:2;13071:18;;12741:354::o;15057:339::-;15259:2;15241:21;;;15298:2;15278:18;;;15271:30;-1:-1:-1;;;15332:2:1;15317:18;;15310:45;15387:2;15372:18;;15057:339::o;16932:398::-;17134:2;17116:21;;;17173:2;17153:18;;;17146:30;17212:34;17207:2;17192:18;;17185:62;-1:-1:-1;;;17278:2:1;17263:18;;17256:32;17320:3;17305:19;;16932:398::o;20667:128::-;20707:3;20738:1;20734:6;20731:1;20728:13;20725:39;;;20744:18;;:::i;:::-;-1:-1:-1;20780:9:1;;20667:128::o;20800:217::-;20840:1;20866;20856:132;;20910:10;20905:3;20901:20;20898:1;20891:31;20945:4;20942:1;20935:15;20973:4;20970:1;20963:15;20856:132;-1:-1:-1;21002:9:1;;20800:217::o;21022:168::-;21062:7;21128:1;21124;21120:6;21116:14;21113:1;21110:21;21105:1;21098:9;21091:17;21087:45;21084:71;;;21135:18;;:::i;:::-;-1:-1:-1;21175:9:1;;21022:168::o;21195:125::-;21235:4;21263:1;21260;21257:8;21254:34;;;21268:18;;:::i;:::-;-1:-1:-1;21305:9:1;;21195:125::o;21325:136::-;21364:3;21392:5;21382:39;;21401:18;;:::i;:::-;-1:-1:-1;;;21437:18:1;;21325:136::o;21466:135::-;21505:3;-1:-1:-1;;21526:17:1;;21523:43;;;21546:18;;:::i;:::-;-1:-1:-1;21593:1:1;21582:13;;21466:135::o;21606:127::-;21667:10;21662:3;21658:20;21655:1;21648:31;21698:4;21695:1;21688:15;21722:4;21719:1;21712:15;21738:127;21799:10;21794:3;21790:20;21787:1;21780:31;21830:4;21827:1;21820:15;21854:4;21851:1;21844:15;21870:127;21931:10;21926:3;21922:20;21919:1;21912:31;21962:4;21959:1;21952:15;21986:4;21983:1;21976:15;22002:131;-1:-1:-1;;;;;22077:31:1;;22067:42;;22057:70;;22123:1;22120;22113:12;22057:70;22002:131;:::o

Swarm Source

ipfs://8d0347b698ede02582681341f3d0731e07e8b75877604cdd90701fe46fb5519f
Block Transaction Gas Used Reward
Age Block Fee Address BC Fee Address Voting Power Jailed Incoming
Block Uncle Number Difficulty Gas Used Reward
Loading
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.