Contract 0x7a3909c7996efe42d425cd932fc44e3840fcab71 1

DeFi  

Contract Overview

Zenlink: Router
Balance:
0 GLMR

GLMR Value:
$0.00

Token:
Txn Hash Method
Block
From
To
Value [Txn Fee]
0x82210ea914ddce548871d8a99677cf5ab02c57a4028b296a6214bf410618e691Swap Exact Token...26747982023-01-07 1:09:4819 days 21 hrs ago0xeae788491e8f72942b7d92c00218ed5f3ea6666a IN  Zenlink: Router0 GLMR0.0023227
0x71e9271659d5284ded9dcf0fc0119bb7e989e9d0dd0b3d5625df3b5fe84183b8Swap Exact Token...26747972023-01-07 1:09:3619 days 21 hrs ago0x45fe6fac6dc9584ce47988ff65c3b0cbd665a50d IN  Zenlink: Router0 GLMR0.0023227
0xb14eacde063bfa9f8356863a118012f6d24447aabb0b13307e0f6fc788fa953dSwap Exact Token...26740042023-01-06 22:29:1820 days 29 mins ago0xeae788491e8f72942b7d92c00218ed5f3ea6666a IN  Zenlink: Router0 GLMR0.0023227
0x36624a050ebaae0f7634414bf8777fef0f75a6fdafcf45f47e55cdb5f3355298Swap Exact Token...25788562022-12-24 11:54:4233 days 11 hrs ago0x45fe6fac6dc9584ce47988ff65c3b0cbd665a50d IN  Zenlink: Router0 GLMR0.0023239
0xdbee7c81517bd5a39b0f8eaed5a4c58adc515723bddef8f84799ccc3470abe9fSwap Exact Token...25785842022-12-24 10:59:2433 days 11 hrs ago0x45fe6fac6dc9584ce47988ff65c3b0cbd665a50d IN  Zenlink: Router0 GLMR0.0023227
0x58f2625dafd82461754d295313c4e32e95a2ae51847b772b0dc26e44d3b45306Swap Exact Token...25785812022-12-24 10:58:4833 days 12 hrs ago0x45fe6fac6dc9584ce47988ff65c3b0cbd665a50d IN  Zenlink: Router0 GLMR0.0023227
0x2fc90936a0808a47f5dce27406ec745ac781bdca1b24108a35433cc1e43bc3ddSwap Exact Token...25785692022-12-24 10:56:1233 days 12 hrs ago0x45fe6fac6dc9584ce47988ff65c3b0cbd665a50d IN  Zenlink: Router0 GLMR0.0023227
0x0e1950b3d8dae576b20a73a6c605c957be7c6b8de331cb3ce00f52e10e7285f7Swap Exact Token...25781072022-12-24 9:22:4833 days 13 hrs ago0x45fe6fac6dc9584ce47988ff65c3b0cbd665a50d IN  Zenlink: Router0 GLMR0.0023251
0xe6862e3b2858241a1224244be6ff75f28d0da9d6c2d996ad7825ed121ec638a5Swap Exact Token...25780812022-12-24 9:17:3033 days 13 hrs ago0x45fe6fac6dc9584ce47988ff65c3b0cbd665a50d IN  Zenlink: Router0 GLMR0.0023251
0x49a5cfa82ed4824e06a00bd648e376c544bd8faf162d0fbec51e596134b8bd0dSwap Exact Token...25780262022-12-24 9:06:3033 days 13 hrs ago0x45fe6fac6dc9584ce47988ff65c3b0cbd665a50d IN  Zenlink: Router0 GLMR0.0023227
0x15e23b705b6bd329c3a6985705c0e6b0b54181f8303a7d17f7fe66739d3bf477Swap Exact Token...25772962022-12-24 6:36:4833 days 16 hrs ago0x45fe6fac6dc9584ce47988ff65c3b0cbd665a50d IN  Zenlink: Router0 GLMR0.0023227
0xf11affc36be87232436ba7ce5617a8c9cd30741f33f4a9a2716d99bdbea334b8Swap Exact Token...25771812022-12-24 6:13:3033 days 16 hrs ago0x45fe6fac6dc9584ce47988ff65c3b0cbd665a50d IN  Zenlink: Router0 GLMR0.0023227
0x8188c339df5d7149110cd8f847a8ea710578531c6958eca629281fbe85e7ece1Swap Exact Token...25771762022-12-24 6:12:2433 days 16 hrs ago0x45fe6fac6dc9584ce47988ff65c3b0cbd665a50d IN  Zenlink: Router0 GLMR0.0023227
0xe3f200ee9752bdc20f111b5b3cda776651832fe90ed476d12268b361be5afcc9Swap Exact Token...25771742022-12-24 6:12:0033 days 16 hrs ago0x45fe6fac6dc9584ce47988ff65c3b0cbd665a50d IN  Zenlink: Router0 GLMR0.0023227
0x60201b86969a65d767b70a180ba97048f8e0fcc5d398ca6e12ee463c69a73370Swap Exact Token...25771712022-12-24 6:11:2433 days 16 hrs ago0x45fe6fac6dc9584ce47988ff65c3b0cbd665a50d IN  Zenlink: Router0 GLMR0.0023227
0x270838e9c2ceb9c72bde350ad8c02b1c2a816277ae9be8211f90538aacc926beSwap Exact Token...25736032022-12-23 18:10:1834 days 4 hrs ago0x45fe6fac6dc9584ce47988ff65c3b0cbd665a50d IN  Zenlink: Router0 GLMR0.0023239
0x543ba9160279ed956c19f5cdbb6c0f9a6c5da17bd27bc7728838494a54936156Swap Exact Token...25736032022-12-23 18:10:1834 days 4 hrs ago0xeae788491e8f72942b7d92c00218ed5f3ea6666a IN  Zenlink: Router0 GLMR0.0023239
0x9faf9a4eb803c664216c45431b2f74973e43fa82f84e612f077d71c0f8d9cc5cSwap Exact Token...25736032022-12-23 18:10:1834 days 4 hrs ago0x95a488ac736617976ed67472ce9ed5e2b43dea34 IN  Zenlink: Router0 GLMR0.0023251
0xfacc7cf79b23dd5c2b9896acdbc4df27f5320680c1fb351e9da25610eaacd2eeSwap Exact Token...25727622022-12-23 15:16:2434 days 7 hrs ago0x45fe6fac6dc9584ce47988ff65c3b0cbd665a50d IN  Zenlink: Router0 GLMR0.0023227
0x6f32353215376a58e54d20ca14c66c46fd24de36f459e7c26c3d63bd12f0925dSwap Exact Token...25727622022-12-23 15:16:2434 days 7 hrs ago0x95a488ac736617976ed67472ce9ed5e2b43dea34 IN  Zenlink: Router0 GLMR0.0023227
0xc29814b41e040d04d94a8481964a042dd26b940e72dfeed59646d9a885feea3aSwap Exact Token...25727622022-12-23 15:16:2434 days 7 hrs ago0xeae788491e8f72942b7d92c00218ed5f3ea6666a IN  Zenlink: Router0 GLMR0.0023227
0xda377ec83f0b78e3fc7a1bbff96039659001d47cb66b9c03756e7059d9614f3bSwap Exact ETH F...25717002022-12-23 11:40:2434 days 11 hrs ago0xeae788491e8f72942b7d92c00218ed5f3ea6666a IN  Zenlink: Router100 GLMR0.0023036
0x46783ec2696c90c4f4c285b75766ee796d5fd0b7989774bc944be8d90c610b49Swap Exact Token...25616492022-12-22 1:33:3335 days 21 hrs ago0x95a488ac736617976ed67472ce9ed5e2b43dea34 IN  Zenlink: Router0 GLMR0.0023227
0xf1593e287d549154867712b53bca5afc01106f09cc2530a873d435781bebfcf0Swap Exact Token...25616452022-12-22 1:32:4235 days 21 hrs ago0x95a488ac736617976ed67472ce9ed5e2b43dea34 IN  Zenlink: Router0 GLMR0.0023227
0xf2ff332e6edf4b514c1196535b9882a9f32f5e485934dc104cfda04da8dc4a0bSwap Exact Token...25311812022-12-17 18:45:3640 days 4 hrs ago0xeae788491e8f72942b7d92c00218ed5f3ea6666a IN  Zenlink: Router0 GLMR0.0023227
[ Download CSV Export 
Latest 25 internal transaction
Parent Txn Hash Block From To Value
0x2c67fd9541a0e3601288b77150181a06d6c119456e6545a4b67bcab5fa7e508b26912362023-01-09 8:33:1817 days 14 hrs ago Zenlink: Router0x24d4b5d7b3bb94b23ca94c660fe146a07c53f5b50.641617891320892387 GLMR
0x2c67fd9541a0e3601288b77150181a06d6c119456e6545a4b67bcab5fa7e508b26912362023-01-09 8:33:1817 days 14 hrs ago Moonbeam: WGLMR Token Zenlink: Router0.641617891320892387 GLMR
0xf047082e6fc6a72e136641722ddb8c8f6697a88f19b89ea0a17be81581ef2dbd25953542022-12-26 19:47:4231 days 3 hrs ago Zenlink: Router Moonbeam: WGLMR Token3 GLMR
0xf047082e6fc6a72e136641722ddb8c8f6697a88f19b89ea0a17be81581ef2dbd25953542022-12-26 19:47:4231 days 3 hrs ago 0x82ec32af69f0d9a259a58103eb02c5a9a3ff5776 Zenlink: Router3 GLMR
0x223d8107b6c519e1fc951a6aa868ed2bf07b5157a46ca4df0d585be43466cc5624962452022-12-12 19:37:2445 days 3 hrs ago Zenlink: Router0xb3405453cb4ca6b74b6704d15942fb0560ec94241.065415306031538552 GLMR
0x223d8107b6c519e1fc951a6aa868ed2bf07b5157a46ca4df0d585be43466cc5624962452022-12-12 19:37:2445 days 3 hrs ago Moonbeam: WGLMR Token Zenlink: Router1.065415306031538552 GLMR
0x5f0d3ad2e914edccc12206ab53773d0800ea633e18ba0026e4e8708b7ffed2ff22168872022-11-03 8:01:3084 days 14 hrs ago Zenlink: Router0x543533e83a78950042bd59ff7822f39f440e9e6b1.567582734592611833 GLMR
0x5f0d3ad2e914edccc12206ab53773d0800ea633e18ba0026e4e8708b7ffed2ff22168872022-11-03 8:01:3084 days 14 hrs ago Moonbeam: WGLMR Token Zenlink: Router1.567582734592611833 GLMR
0x91df074b47ca8da758344ffed4ef188d16196d66473535e23cba23a074ac440c22168822022-11-03 8:00:3084 days 14 hrs ago Zenlink: Router0x543533e83a78950042bd59ff7822f39f440e9e6b16.139329518560900467 GLMR
0x91df074b47ca8da758344ffed4ef188d16196d66473535e23cba23a074ac440c22168822022-11-03 8:00:3084 days 14 hrs ago Moonbeam: WGLMR Token Zenlink: Router16.139329518560900467 GLMR
0xfa23e14e8ad00b244a3d644486ee735c502f85ed7193ed9089cc41cc52da689719800192022-09-30 19:13:24118 days 3 hrs ago Zenlink: Router0xe73b6f11b3afdbf5d1a1c91ceb8af9e544ca114b14.336890666785039732 GLMR
0xfa23e14e8ad00b244a3d644486ee735c502f85ed7193ed9089cc41cc52da689719800192022-09-30 19:13:24118 days 3 hrs ago Moonbeam: WGLMR Token Zenlink: Router14.336890666785039732 GLMR
0x7c386e31771f5b9e2d5762dcfc065057a888fae3ad570756287b71598655e5ef17738112022-09-01 5:05:48147 days 17 hrs ago Zenlink: Router0xe3dff97e14f3a55228ed2f614114bf6b27a7677b3.720644933623444225 GLMR
0x7c386e31771f5b9e2d5762dcfc065057a888fae3ad570756287b71598655e5ef17738112022-09-01 5:05:48147 days 17 hrs ago Moonbeam: WGLMR Token Zenlink: Router3.720644933623444225 GLMR
0x1cc0e1a5f34895bd6a67215ace8cb585c44a88bca23a175f9bee351bc54827d517533052022-08-29 6:28:48150 days 16 hrs ago Zenlink: Router Moonbeam: WGLMR Token0.000089653285373506 GLMR
0xb7372b8c671c55ade324af1757466e9d7b31d696f6c1c2ad39fb3d51c054c8f117520432022-08-29 2:09:06150 days 20 hrs ago Zenlink: Router0x4756c4d5aaefcb4f52f54d20f6b17376c9efe62f0.099910346714626494 GLMR
0xb7372b8c671c55ade324af1757466e9d7b31d696f6c1c2ad39fb3d51c054c8f117520432022-08-29 2:09:06150 days 20 hrs ago Zenlink: Router Moonbeam: WGLMR Token0.000089653285373506 GLMR
0x9ba9d49d27b3cbaebb5a36938d64fd315ff68a5b8e04ce36c4098df90336a6f117228632022-08-24 21:37:18155 days 1 hr ago Zenlink: Router Moonbeam: WGLMR Token234 GLMR
0x80486d20ecd3ca286af430db738fef61e55a43be6aebc3448d2b336bbdbf6a2c17228572022-08-24 21:36:06155 days 1 hr ago Zenlink: Router Moonbeam: WGLMR Token240 GLMR
0xd5c796ceb3ae35feec33f7339387e396d3c623d47fda4d96698f6324659c601717228572022-08-24 21:36:06155 days 1 hr ago Zenlink: Router Moonbeam: WGLMR Token120 GLMR
0x667fffecf38eb2cfa4aad17d77ece12fe45305bff355efd6b57d92bcdfb3556d17228562022-08-24 21:35:54155 days 1 hr ago Zenlink: Router Moonbeam: WGLMR Token117 GLMR
0xc343052a6063dddb1a1805e95fb9836fc5db7215ec503b983f8831f41fda3a8a17166652022-08-24 0:25:18155 days 22 hrs ago Zenlink: Router0xe1fa699860444be91d366c21de8fef56e3dec77a130.642335377462389711 GLMR
0xc343052a6063dddb1a1805e95fb9836fc5db7215ec503b983f8831f41fda3a8a17166652022-08-24 0:25:18155 days 22 hrs ago Moonbeam: WGLMR Token Zenlink: Router130.642335377462389711 GLMR
0x3dce461f9e3e231e400b6491c73c893c788ccf107b808d2688f0792be1127f4b17166632022-08-24 0:24:48155 days 22 hrs ago Zenlink: Router0xe1fa699860444be91d366c21de8fef56e3dec77a130.90692433616006858 GLMR
0x3dce461f9e3e231e400b6491c73c893c788ccf107b808d2688f0792be1127f4b17166632022-08-24 0:24:48155 days 22 hrs ago Moonbeam: WGLMR Token Zenlink: Router130.90692433616006858 GLMR
[ 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 moonbeam.moonscan.io on 2022-02-04
*/

// 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
    );

    event Sync(uint112 reserve0, uint112 reserve1);

    function MINIMUM_LIQUIDITY() external pure returns (uint256);

    function factory() external view returns (address);

    function token0() external view returns (address);

    function token1() external view returns (address);

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

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

60806040523480156200001157600080fd5b506040516200353138038062003531833981016040819052620000349162000083565b600080546001600160a01b039384166001600160a01b03199182161790915560018054929093169116179055620000bb565b80516001600160a01b03811681146200007e57600080fd5b919050565b600080604083850312156200009757600080fd5b620000a28362000066565b9150620000b26020840162000066565b90509250929050565b61346680620000cb6000396000f3fe60806040526004361061010d5760003560e01c80639be7614d11610095578063cd1bd0d911610064578063cd1bd0d9146102f1578063d06ca61f14610304578063dcff1b9414610324578063e8e3370014610344578063f85b7c8b1461036457600080fd5b80639be7614d1461027e578063b1ea829214610291578063baa2abde146102b1578063c45a0155146102d157600080fd5b8063419591ed116100dc578063419591ed146101e5578063686589671461021d57806385f8c259146101305780638803dbee1461024b578063937ca0da1461026b57600080fd5b8063054d50d4146101305780631f00ca741461016357806338ed173914610190578063403bf1f2146101b057600080fd5b3661012b576001546001600160a01b0316331461012957600080fd5b005b600080fd5b34801561013c57600080fd5b5061015061014b3660046131b9565b610384565b6040519081526020015b60405180910390f35b34801561016f57600080fd5b5061018361017e3660046130db565b610399565b60405161015a9190613220565b34801561019c57600080fd5b506101836101ab366004613146565b6103bc565b3480156101bc57600080fd5b506101d06101cb366004612ebf565b610576565b6040805192835260208301919091520161015a565b3480156101f157600080fd5b50600154610205906001600160a01b031681565b6040516001600160a01b03909116815260200161015a565b61023061022b366004612fa4565b61063a565b6040805193845260208401929092529082015260600161015a565b34801561025757600080fd5b50610183610266366004613146565b610c05565b610230610279366004612ebf565b610cae565b61018361028c366004613074565b610ebd565b34801561029d57600080fd5b506101506102ac366004612f1d565b6111c8565b3480156102bd57600080fd5b506101d06102cc366004612dd1565b6112fe565b3480156102dd57600080fd5b50600054610205906001600160a01b031681565b6101836102ff366004613074565b61152f565b34801561031057600080fd5b5061018361031f3660046130db565b6117c8565b34801561033057600080fd5b5061018361033f366004613146565b6117e2565b34801561035057600080fd5b5061023061035f366004612e43565b611a0d565b34801561037057600080fd5b5061018361037f366004613146565b611b07565b6000610391848484611c16565b949350505050565b6000546060906103b3906001600160a01b03168484611d1a565b90505b92915050565b606081428110156103e85760405162461bcd60e51b81526004016103df906132c9565b60405180910390fd5b6000546040805160208089028281018201909352888252610432936001600160a01b0316928c92918b918b91829190850190849080828437600092019190915250611ea792505050565b9150868260018451610444919061338d565b81518110610454576104546133ec565b6020026020010151101561047a5760405162461bcd60e51b81526004016103df906132f2565b61052c86866000818110610490576104906133ec565b90506020020160208101906104a59190612d90565b60008054339161050c916001600160a01b0316908b908b90816104ca576104ca6133ec565b90506020020160208101906104df9190612d90565b8b8b60018181106104f2576104f26133ec565b90506020020160208101906105079190612d90565b612014565b8560008151811061051f5761051f6133ec565b6020026020010151612099565b61056b828787808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152508992506121d7915050565b509695505050505050565b600080824281101561059a5760405162461bcd60e51b81526004016103df906132c9565b6001546105b6908a906001600160a01b03168a8a8a308a6112fe565b90935091506105c6898685612387565b600154604051632e1a7d4d60e01b8152600481018490526001600160a01b0390911690632e1a7d4d90602401600060405180830381600087803b15801561060c57600080fd5b505af1158015610620573d6000803e3d6000fd5b5050505061062e85836124b8565b50965096945050505050565b600080600083428110156106605760405162461bcd60e51b81526004016103df906132c9565b6001548a516001600160a01b03909116908b90600090610682576106826133ec565b60200260200101516001600160a01b0316146106b05760405162461bcd60e51b81526004016103df90613264565b600080546106c8906001600160a01b03168b8d611d1a565b905034816000815181106106de576106de6133ec565b602002602001015111156107045760405162461bcd60e51b81526004016103df90613292565b60015481516001600160a01b039091169063d0e30db090839060009061072c5761072c6133ec565b60200260200101516040518263ffffffff1660e01b81526004016000604051808303818588803b15801561075f57600080fd5b505af1158015610773573d6000803e3d6000fd5b5050505050600160009054906101000a90046001600160a01b03166001600160a01b031663a9059cbb6107ee60008054906101000a90046001600160a01b03168e6000815181106107c6576107c66133ec565b60200260200101518f6001815181106107e1576107e16133ec565b6020026020010151612014565b83600081518110610801576108016133ec565b60200260200101516040518363ffffffff1660e01b815260040161083a9291906001600160a01b03929092168252602082015260400190565b602060405180830381600087803b15801561085457600080fd5b505af1158015610868573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061088c9190613006565b61089557600080fd5b6108a0818c896121d7565b88816000815181106108b4576108b46133ec565b602002602001015111156109205760405162461bcd60e51b815260206004820152602d60248201527f6e6f7420616c6c6f7720626967676572207468616e206e61746976654375727260448201526c0cadcc6f2a6eec2e092dc9ac2f609b1b60648201526084016103df565b60008b60018d51610931919061338d565b81518110610941576109416133ec565b60200260200101519050600082600081518110610960576109606133ec565b602002602001015134610973919061338d565b90506109e482600160009054906101000a90046001600160a01b0316856001875161099e919061338d565b815181106109ae576109ae6133ec565b60200260200101518487600189516109c6919061338d565b815181106109d6576109d66133ec565b60200260200101518f6125b3565b60008054600154939a5091985091610a0a916001600160a01b0390811691869116612014565b9050610a188333838b612099565b600160009054906101000a90046001600160a01b03166001600160a01b031663d0e30db0886040518263ffffffff1660e01b81526004016000604051808303818588803b158015610a6857600080fd5b505af1158015610a7c573d6000803e3d6000fd5b505060015460405163a9059cbb60e01b81526001600160a01b038681166004830152602482018d9052909116935063a9059cbb92506044019050602060405180830381600087803b158015610ad057600080fd5b505af1158015610ae4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b089190613006565b610b1157600080fd5b6040516335313c2160e11b81526001600160a01b038b81166004830152821690636a62784290602401602060405180830381600087803b158015610b5457600080fd5b505af1158015610b68573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b8c919061305b565b955083600081518110610ba157610ba16133ec565b602002602001015187610bb49190613334565b341115610bf457610bf43385600081518110610bd257610bd26133ec565b602002602001015189610be59190613334565b610bef903461338d565b6124b8565b505050505096509650969350505050565b60608142811015610c285760405162461bcd60e51b81526004016103df906132c9565b6000546040805160208089028281018201909352888252610c72936001600160a01b0316928c92918b918b91829190850190849080828437600092019190915250611d1a92505050565b91508682600081518110610c8857610c886133ec565b6020026020010151111561047a5760405162461bcd60e51b81526004016103df90613292565b60008060008342811015610cd45760405162461bcd60e51b81526004016103df906132c9565b600154610cef908b906001600160a01b03168b348c8c6125b3565b6000805460015493975091955091610d15916001600160a01b03908116918e9116612014565b9050610d238b338388612099565b600160009054906101000a90046001600160a01b03166001600160a01b031663d0e30db0856040518263ffffffff1660e01b81526004016000604051808303818588803b158015610d7357600080fd5b505af1158015610d87573d6000803e3d6000fd5b505060015460405163a9059cbb60e01b81526001600160a01b038681166004830152602482018a9052909116935063a9059cbb92506044019050602060405180830381600087803b158015610ddb57600080fd5b505af1158015610def573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e139190613006565b610e1c57600080fd5b6040516335313c2160e11b81526001600160a01b038881166004830152821690636a62784290602401602060405180830381600087803b158015610e5f57600080fd5b505af1158015610e73573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e97919061305b565b925083341115610eaf57610eaf33610bef863461338d565b505096509650969350505050565b60608142811015610ee05760405162461bcd60e51b81526004016103df906132c9565b6001546001600160a01b03168686600081610efd57610efd6133ec565b9050602002016020810190610f129190612d90565b6001600160a01b031614610f385760405162461bcd60e51b81526004016103df90613264565b6000546040805160208089028281018201909352888252610f82936001600160a01b0316928b92918b918b91829190850190849080828437600092019190915250611d1a92505050565b91503482600081518110610f9857610f986133ec565b60200260200101511115610fbe5760405162461bcd60e51b81526004016103df90613292565b60015482516001600160a01b039091169063d0e30db0908490600090610fe657610fe66133ec565b60200260200101516040518263ffffffff1660e01b81526004016000604051808303818588803b15801561101957600080fd5b505af115801561102d573d6000803e3d6000fd5b5050600154600080546001600160a01b03928316955063a9059cbb945061108c9350909116908a908a9081611064576110646133ec565b90506020020160208101906110799190612d90565b8a8a60018181106104f2576104f26133ec565b8460008151811061109f5761109f6133ec565b60200260200101516040518363ffffffff1660e01b81526004016110d89291906001600160a01b03929092168252602082015260400190565b602060405180830381600087803b1580156110f257600080fd5b505af1158015611106573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061112a9190613006565b61113357600080fd5b611172828787808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152508992506121d7915050565b81600081518110611185576111856133ec565b60200260200101513411156111be576111be33836000815181106111ab576111ab6133ec565b602002602001015134610bef919061338d565b5095945050505050565b600081428110156111eb5760405162461bcd60e51b81526004016103df906132c9565b60008a8a6000818110611200576112006133ec565b90506020020160208101906112159190612d90565b905060008b8b61122660018261338d565b818110611235576112356133ec565b905060200201602081019061124a9190612d90565b9050600061125c8a8a8f8f8b8b610c05565b9050600081600081518110611273576112736133ec565b60200260200101518c611286919061338d565b90506112e48385846001865161129c919061338d565b815181106112ac576112ac6133ec565b60200260200101518486600188516112c4919061338d565b815181106112d4576112d46133ec565b60200260200101518e8e8e611a0d565b909150905080965050505050505098975050505050505050565b60008082428110156113225760405162461bcd60e51b81526004016103df906132c9565b6000805461133a906001600160a01b03168c8c612014565b6040516323b872dd60e01b81523360048201526001600160a01b03821660248201819052604482018c90529192506323b872dd90606401602060405180830381600087803b15801561138b57600080fd5b505af115801561139f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113c39190613006565b5060405163226bf2d160e21b81526001600160a01b03878116600483015260009182918416906389afcb44906024016040805180830381600087803b15801561140b57600080fd5b505af115801561141f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114439190613122565b9150915060006114538e8e612802565b5090508d6001600160a01b0316816001600160a01b031614611476578183611479565b82825b90975095508a8710156114ce5760405162461bcd60e51b815260206004820152601d60248201527f526f757465723a20494e53554646494349454e545f305f414d4f554e5400000060448201526064016103df565b8986101561151e5760405162461bcd60e51b815260206004820152601d60248201527f526f757465723a20494e53554646494349454e545f315f414d4f554e5400000060448201526064016103df565b505050505097509795505050505050565b606081428110156115525760405162461bcd60e51b81526004016103df906132c9565b6001546001600160a01b0316868660008161156f5761156f6133ec565b90506020020160208101906115849190612d90565b6001600160a01b0316146115aa5760405162461bcd60e51b81526004016103df90613264565b60005460408051602080890282810182019093528882526115f4936001600160a01b0316923492918b918b91829190850190849080828437600092019190915250611ea792505050565b9150868260018451611606919061338d565b81518110611616576116166133ec565b6020026020010151101561163c5760405162461bcd60e51b81526004016103df906132f2565b60015482516001600160a01b039091169063d0e30db0908490600090611664576116646133ec565b60200260200101516040518263ffffffff1660e01b81526004016000604051808303818588803b15801561169757600080fd5b505af11580156116ab573d6000803e3d6000fd5b5050600154600080546001600160a01b03928316955063a9059cbb94506116e29350909116908a908a9081611064576110646133ec565b846000815181106116f5576116f56133ec565b60200260200101516040518363ffffffff1660e01b815260040161172e9291906001600160a01b03929092168252602082015260400190565b602060405180830381600087803b15801561174857600080fd5b505af115801561175c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117809190613006565b61178957600080fd5b6111be828787808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152508992506121d7915050565b6000546060906103b3906001600160a01b03168484611ea7565b606081428110156118055760405162461bcd60e51b81526004016103df906132c9565b600180546001600160a01b03169087908790611821908261338d565b818110611830576118306133ec565b90506020020160208101906118459190612d90565b6001600160a01b03161461186b5760405162461bcd60e51b81526004016103df90613264565b60005460408051602080890282810182019093528882526118b5936001600160a01b0316928c92918b918b91829190850190849080828437600092019190915250611ea792505050565b91508682600184516118c7919061338d565b815181106118d7576118d76133ec565b602002602001015110156118fd5760405162461bcd60e51b81526004016103df906132f2565b61191386866000818110610490576104906133ec565b611952828787808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152503092506121d7915050565b6001805483516001600160a01b0390911691632e1a7d4d9185916119759161338d565b81518110611985576119856133ec565b60200260200101516040518263ffffffff1660e01b81526004016119ab91815260200190565b600060405180830381600087803b1580156119c557600080fd5b505af11580156119d9573d6000803e3d6000fd5b5050505061056b8483600185516119f0919061338d565b81518110611a0057611a006133ec565b60200260200101516124b8565b60008060008342811015611a335760405162461bcd60e51b81526004016103df906132c9565b611a418c8c8c8c8c8c6125b3565b6000805492965090945090611a60906001600160a01b03168e8e612014565b9050611a6e8d338388612099565b611a7a8c338387612099565b6040516335313c2160e11b81526001600160a01b038881166004830152821690636a62784290602401602060405180830381600087803b158015611abd57600080fd5b505af1158015611ad1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611af5919061305b565b92505050985098509895505050505050565b60608142811015611b2a5760405162461bcd60e51b81526004016103df906132c9565b600180546001600160a01b03169087908790611b46908261338d565b818110611b5557611b556133ec565b9050602002016020810190611b6a9190612d90565b6001600160a01b031614611b905760405162461bcd60e51b81526004016103df90613264565b6000546040805160208089028281018201909352888252611bda936001600160a01b0316928c92918b918b91829190850190849080828437600092019190915250611d1a92505050565b91508682600081518110611bf057611bf06133ec565b602002602001015111156118fd5760405162461bcd60e51b81526004016103df90613292565b6000808411611c715760405162461bcd60e51b815260206004820152602160248201527f48656c7065723a20494e53554646494349454e545f494e5055545f414d4f554e6044820152601560fa1b60648201526084016103df565b600083118015611c815750600082115b611ccd5760405162461bcd60e51b815260206004820152601e60248201527f48656c7065723a20494e53554646494349454e545f4c4951554944495459000060448201526064016103df565b6000611cdb856103e56128e3565b90506000611ce982856128e3565b90506000611d0383611cfd886103e86128e3565b9061294a565b9050611d0f818361334c565b979650505050505050565b6060600282511015611d655760405162461bcd60e51b8152602060048201526014602482015273090cad8e0cae47440929cac82989288bea082a8960631b60448201526064016103df565b815167ffffffffffffffff811115611d7f57611d7f613402565b604051908082528060200260200182016040528015611da8578160200160208202803683370190505b509050828160018351611dbb919061338d565b81518110611dcb57611dcb6133ec565b602002602001018181525050600060018351611de7919061338d565b90505b8015611e9f57600080611e3a8786611e0360018761338d565b81518110611e1357611e136133ec565b6020026020010151878681518110611e2d57611e2d6133ec565b602002602001015161299f565b91509150611e62848481518110611e5357611e536133ec565b60200260200101518383612a76565b84611e6e60018661338d565b81518110611e7e57611e7e6133ec565b60200260200101818152505050508080611e97906133a4565b915050611dea565b509392505050565b6060600282511015611ef25760405162461bcd60e51b8152602060048201526014602482015273090cad8e0cae47440929cac82989288bea082a8960631b60448201526064016103df565b815167ffffffffffffffff811115611f0c57611f0c613402565b604051908082528060200260200182016040528015611f35578160200160208202803683370190505b5090508281600081518110611f4c57611f4c6133ec565b60200260200101818152505060005b60018351611f69919061338d565b811015611e9f57600080611faf87868581518110611f8957611f896133ec565b602002602001015187866001611f9f9190613334565b81518110611e2d57611e2d6133ec565b91509150611fd7848481518110611fc857611fc86133ec565b60200260200101518383611c16565b84611fe3856001613334565b81518110611ff357611ff36133ec565b6020026020010181815250505050808061200c906133bb565b915050611f5b565b60405163e6a4390560e01b81526001600160a01b03838116600483015282811660248301526000919085169063e6a439059060440160206040518083038186803b15801561206157600080fd5b505afa158015612075573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103919190612db4565b604080516001600160a01b0385811660248301528481166044830152606480830185905283518084039091018152608490920183526020820180516001600160e01b03166323b872dd60e01b17905291516000928392908816916120fd91906131e5565b6000604051808303816000865af19150503d806000811461213a576040519150601f19603f3d011682016040523d82523d6000602084013e61213f565b606091505b50915091508180156121695750805115806121695750808060200190518101906121699190613006565b6121cf5760405162461bcd60e51b815260206004820152603160248201527f5472616e7366657248656c7065723a3a7472616e7366657246726f6d3a207472604482015270185b9cd9995c919c9bdb4819985a5b1959607a1b60648201526084016103df565b505050505050565b60005b600183516121e8919061338d565b81101561238157600080848381518110612204576122046133ec565b60200260200101518584600161221a9190613334565b8151811061222a5761222a6133ec565b60200260200101519150915060006122428383612802565b509050600087612253866001613334565b81518110612263576122636133ec565b60200260200101519050600080836001600160a01b0316866001600160a01b03161461229157826000612295565b6000835b91509150600060028a516122a9919061338d565b88106122b557886122e2565b6000546122e2906001600160a01b0316878c6122d28c6002613334565b815181106107e1576107e16133ec565b6000549091506122fc906001600160a01b03168888612014565b6040516336cd320560e11b815260048101859052602481018490526001600160a01b0383811660448301529190911690636d9a640a90606401600060405180830381600087803b15801561234f57600080fd5b505af1158015612363573d6000803e3d6000fd5b50505050505050505050508080612379906133bb565b9150506121da565b50505050565b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180516001600160e01b031663a9059cbb60e01b17905291516000928392908716916123e391906131e5565b6000604051808303816000865af19150503d8060008114612420576040519150601f19603f3d011682016040523d82523d6000602084013e612425565b606091505b509150915081801561244f57508051158061244f57508080602001905181019061244f9190613006565b6124b15760405162461bcd60e51b815260206004820152602d60248201527f5472616e7366657248656c7065723a3a736166655472616e736665723a20747260448201526c185b9cd9995c8819985a5b1959609a1b60648201526084016103df565b5050505050565b604080516000808252602082019092526001600160a01b0384169083906040516124e291906131e5565b60006040518083038185875af1925050503d806000811461251f576040519150601f19603f3d011682016040523d82523d6000602084013e612524565b606091505b50509050806125ae5760405162461bcd60e51b815260206004820152604a60248201527f5472616e7366657248656c7065723a3a736166655472616e736665724e61746960448201527f766543757272656e63793a204e617469766543757272656e6379207472616e7360648201526919995c8819985a5b195960b21b608482015260a4016103df565b505050565b6000805460405163e6a4390560e01b81526001600160a01b03898116600483015288811660248301528392839291169063e6a439059060440160206040518083038186803b15801561260457600080fd5b505afa158015612618573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061263c9190612db4565b6001600160a01b031614156126d4576000546040516364e329cb60e11b81526001600160a01b038a8116600483015289811660248301529091169063c9c6539690604401602060405180830381600087803b15801561269a57600080fd5b505af11580156126ae573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126d29190612db4565b505b6000805481906126ee906001600160a01b03168b8b61299f565b91509150816000148015612700575080155b15612710578793508692506127f5565b600061271d898484612b75565b905087811161278157858110156127765760405162461bcd60e51b815260206004820152601d60248201527f526f757465723a20494e53554646494349454e545f315f414d4f554e5400000060448201526064016103df565b8894509250826127f3565b600061278e898486612b75565b90508981111561279d57600080fd5b878110156127ed5760405162461bcd60e51b815260206004820152601d60248201527f526f757465723a20494e53554646494349454e545f305f414d4f554e5400000060448201526064016103df565b94508793505b505b5050965096945050505050565b600080826001600160a01b0316846001600160a01b031614156128675760405162461bcd60e51b815260206004820152601b60248201527f48656c7065723a204944454e544943414c5f414444524553534553000000000060448201526064016103df565b826001600160a01b0316846001600160a01b03161061288757828461288a565b83835b90925090506001600160a01b0382166128dc5760405162461bcd60e51b815260206004820152601460248201527348656c7065723a205a45524f5f4144445245535360601b60448201526064016103df565b9250929050565b6000811580612907575082826128f9818361336e565b9250612905908361334c565b145b6103b65760405162461bcd60e51b815260206004820152601460248201527364732d6d6174682d6d756c2d6f766572666c6f7760601b60448201526064016103df565b6000826129578382613334565b91508110156103b65760405162461bcd60e51b815260206004820152601460248201527364732d6d6174682d6164642d6f766572666c6f7760601b60448201526064016103df565b60008060006129ae8585612802565b5090506000806129bf888888612014565b6001600160a01b0316630902f1ac6040518163ffffffff1660e01b8152600401604080518083038186803b1580156129f657600080fd5b505afa158015612a0a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a2e9190613028565b6001600160701b031691506001600160701b03169150826001600160a01b0316876001600160a01b031614612a64578082612a67565b81815b90999098509650505050505050565b6000808411612ad25760405162461bcd60e51b815260206004820152602260248201527f48656c7065723a20494e53554646494349454e545f4f55545055545f414d4f55604482015261139560f21b60648201526084016103df565b600083118015612ae25750600082115b612b2e5760405162461bcd60e51b815260206004820152601e60248201527f48656c7065723a20494e53554646494349454e545f4c4951554944495459000060448201526064016103df565b6000612b466103e8612b4086886128e3565b906128e3565b90506000612b5a6103e5612b408689612c26565b9050612b6b6001611cfd838561334c565b9695505050505050565b6000808411612bbc5760405162461bcd60e51b8152602060048201526013602482015272125394d551919250d251539517d05353d55395606a1b60448201526064016103df565b600083118015612bcc5750600082115b612c115760405162461bcd60e51b8152602060048201526016602482015275494e53554646494349454e545f4c495155494449545960501b60448201526064016103df565b82612c1c85846128e3565b610391919061334c565b600082612c33838261338d565b91508111156103b65760405162461bcd60e51b815260206004820152601560248201527464732d6d6174682d7375622d756e646572666c6f7760581b60448201526064016103df565b8035612c8781613418565b919050565b60008083601f840112612c9e57600080fd5b50813567ffffffffffffffff811115612cb657600080fd5b6020830191508360208260051b85010111156128dc57600080fd5b600082601f830112612ce257600080fd5b8135602067ffffffffffffffff80831115612cff57612cff613402565b8260051b604051601f19603f83011681018181108482111715612d2457612d24613402565b60405284815283810192508684018288018501891015612d4357600080fd5b600092505b85831015612d6d57612d5981612c7c565b845292840192600192909201918401612d48565b50979650505050505050565b80516001600160701b0381168114612c8757600080fd5b600060208284031215612da257600080fd5b8135612dad81613418565b9392505050565b600060208284031215612dc657600080fd5b8151612dad81613418565b600080600080600080600060e0888a031215612dec57600080fd5b8735612df781613418565b96506020880135612e0781613418565b955060408801359450606088013593506080880135925060a0880135612e2c81613418565b8092505060c0880135905092959891949750929550565b600080600080600080600080610100898b031215612e6057600080fd5b8835612e6b81613418565b97506020890135612e7b81613418565b965060408901359550606089013594506080890135935060a0890135925060c0890135612ea781613418565b8092505060e089013590509295985092959890939650565b60008060008060008060c08789031215612ed857600080fd5b8635612ee381613418565b95506020870135945060408701359350606087013592506080870135612f0881613418565b8092505060a087013590509295509295509295565b60008060008060008060008060e0898b031215612f3957600080fd5b883567ffffffffffffffff811115612f5057600080fd5b612f5c8b828c01612c8c565b9099509750506020890135955060408901359450606089013593506080890135925060a0890135612f8c81613418565b8092505060c089013590509295985092959890939650565b60008060008060008060c08789031215612fbd57600080fd5b863567ffffffffffffffff811115612fd457600080fd5b612fe089828a01612cd1565b9650506020870135945060408701359350606087013592506080870135612f0881613418565b60006020828403121561301857600080fd5b81518015158114612dad57600080fd5b6000806040838503121561303b57600080fd5b61304483612d79565b915061305260208401612d79565b90509250929050565b60006020828403121561306d57600080fd5b5051919050565b60008060008060006080868803121561308c57600080fd5b85359450602086013567ffffffffffffffff8111156130aa57600080fd5b6130b688828901612c8c565b90955093505060408601356130ca81613418565b949793965091946060013592915050565b600080604083850312156130ee57600080fd5b82359150602083013567ffffffffffffffff81111561310c57600080fd5b61311885828601612cd1565b9150509250929050565b6000806040838503121561313557600080fd5b505080516020909101519092909150565b60008060008060008060a0878903121561315f57600080fd5b8635955060208701359450604087013567ffffffffffffffff81111561318457600080fd5b61319089828a01612c8c565b90955093505060608701356131a481613418565b80925050608087013590509295509295509295565b6000806000606084860312156131ce57600080fd5b505081359360208301359350604090920135919050565b6000825160005b8181101561320657602081860181015185830152016131ec565b81811115613215576000828501525b509190910192915050565b6020808252825182820181905260009190848201906040850190845b818110156132585783518352928401929184019160010161323c565b50909695505050505050565b6020808252601490820152730a4deeae8cae47440929cac82989288bea082a8960631b604082015260600190565b6020808252601e908201527f526f757465723a204558434553534956455f494e5055545f414d4f554e540000604082015260600190565b6020808252600f908201526e149bdd5d195c8e8811561412549151608a1b604082015260600190565b60208082526022908201527f526f757465723a20494e53554646494349454e545f4f55545055545f414d4f55604082015261139560f21b606082015260800190565b60008219821115613347576133476133d6565b500190565b60008261336957634e487b7160e01b600052601260045260246000fd5b500490565b6000816000190483118215151615613388576133886133d6565b500290565b60008282101561339f5761339f6133d6565b500390565b6000816133b3576133b36133d6565b506000190190565b60006000198214156133cf576133cf6133d6565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b038116811461342d57600080fd5b5056fea26469706673582212209e009d451135d8f7785354bbd0067448d7f55ac869805336dbb4ecd29444fdc464736f6c63430008070033000000000000000000000000f49255205dfd7933c4d0f25a57d40b1511f92fef000000000000000000000000acc15dc74880c9944775448304b263d191c6077f

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

000000000000000000000000f49255205dfd7933c4d0f25a57d40b1511f92fef000000000000000000000000acc15dc74880c9944775448304b263d191c6077f

-----Decoded View---------------
Arg [0] : _factory (address): 0xf49255205dfd7933c4d0f25a57d40b1511f92fef
Arg [1] : _WNativeCurrency (address): 0xacc15dc74880c9944775448304b263d191c6077f

-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 000000000000000000000000f49255205dfd7933c4d0f25a57d40b1511f92fef
Arg [1] : 000000000000000000000000acc15dc74880c9944775448304b263d191c6077f


Deployed ByteCode Sourcemap

16894:16263:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17379:15;;-1:-1:-1;;;;;17379:15:0;17365:10;:29;17357:38;;;;;;16894:16263;;;;;32186:240;;;;;;;;;;-1:-1:-1;32186:240:0;;;;;:::i;:::-;;:::i;:::-;;;19704:25:1;;;19692:2;19677:18;32186:240:0;;;;;;;;32922:232;;;;;;;;;;-1:-1:-1;32922:232:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;27124:669::-;;;;;;;;;;-1:-1:-1;27124:669:0;;;;;:::i;:::-;;:::i;25448:829::-;;;;;;;;;;-1:-1:-1;25448:829:0;;;;;:::i;:::-;;:::i;:::-;;;;19914:25:1;;;19970:2;19955:18;;19948:34;;;;19887:18;25448:829:0;19740:248:1;16997:39:0;;;;;;;;;;-1:-1:-1;16997:39:0;;;;-1:-1:-1;;;;;16997:39:0;;;;;;-1:-1:-1;;;;;10044:32:1;;;10026:51;;10014:2;9999:18;16997:39:0;9880:203:1;20658:2284:0;;;;;;:::i;:::-;;:::i;:::-;;;;20545:25:1;;;20601:2;20586:18;;20579:34;;;;20629:18;;;20622:34;20533:2;20518:18;20658:2284:0;20343:319:1;27801:610:0;;;;;;;;;;-1:-1:-1;27801:610:0;;;;;:::i;:::-;;:::i;19342:1308::-;;;;;;:::i;:::-;;:::i;31185:993::-;;;;;;:::i;:::-;;:::i;18394:940::-;;;;;;;;;;-1:-1:-1;18394:940:0;;;;;:::i;:::-;;:::i;24572:868::-;;;;;;;;;;-1:-1:-1;24572:868:0;;;;;:::i;:::-;;:::i;16959:31::-;;;;;;;;;;-1:-1:-1;16959:31:0;;;;-1:-1:-1;;;;;16959:31:0;;;28419:861;;;;;;:::i;:::-;;:::i;32682:232::-;;;;;;;;;;-1:-1:-1;32682:232:0;;;;;:::i;:::-;;:::i;30207:970::-;;;;;;;;;;-1:-1:-1;30207:970:0;;;;;:::i;:::-;;:::i;17489:897::-;;;;;;;;;;-1:-1:-1;17489:897:0;;;;;:::i;:::-;;:::i;29288:911::-;;;;;;;;;;-1:-1:-1;29288:911:0;;;;;:::i;:::-;;:::i;32186:240::-;32329:17;32366:52;32386:8;32396:9;32407:10;32366:19;:52::i;:::-;32359:59;32186:240;-1:-1:-1;;;;32186:240:0:o;32922:232::-;33121:7;;33052:24;;33101:45;;-1:-1:-1;;;;;33121:7:0;33130:9;33141:4;33101:19;:45::i;:::-;33094:52;;32922:232;;;;;:::o;27124:669::-;27347:24;27328:8;17256:15;17244:8;:27;;17236:55;;;;-1:-1:-1;;;17236:55:0;;;;;;;:::i;:::-;;;;;;;;;27415:7:::1;::::0;27394:45:::1;::::0;;::::1;::::0;;::::1;::::0;;;;;;;;;;;::::1;::::0;-1:-1:-1;;;;;27415:7:0::1;::::0;27424:8;;27394:45;27434:4;;;;;;27394:45;;::::1;::::0;27434:4;;27394:45;27434:4;27394:45;::::1;;::::0;::::1;::::0;;;;-1:-1:-1;27394:20:0::1;::::0;-1:-1:-1;;;27394:45:0:i:1;:::-;27384:55;;27503:12;27472:7;27497:1;27480:7;:14;:18;;;;:::i;:::-;27472:27;;;;;;;;:::i;:::-;;;;;;;:43;;27450:127;;;;-1:-1:-1::0;;;27450:127:0::1;;;;;;;:::i;:::-;27588:162;27626:4;;27631:1;27626:7;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;27688;::::0;;27648:10:::1;::::0;27673:41:::1;::::0;-1:-1:-1;;;;;27688:7:0::1;::::0;27697:4;;;;:7;::::1;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;27706:4;;27711:1;27706:7;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;27673:14;:41::i;:::-;27729:7;27737:1;27729:10;;;;;;;;:::i;:::-;;;;;;;27588:23;:162::i;:::-;27761:24;27767:7;27776:4;;27761:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;27782:2:0;;-1:-1:-1;27761:5:0::1;::::0;-1:-1:-1;;27761:24:0:i:1;:::-;27124:669:::0;;;;;;;;;:::o;25448:829::-;25747:19;25768:28;25719:8;17256:15;17244:8;:27;;17236:55;;;;-1:-1:-1;;;17236:55:0;;;;;;;:::i;:::-;25902:15:::1;::::0;25852:218:::1;::::0;25882:5;;-1:-1:-1;;;;;25902:15:0::1;25932:9:::0;25956:14;25985:23;26031:4:::1;26051:8:::0;25852:15:::1;:218::i;:::-;25814:256:::0;;-1:-1:-1;25814:256:0;-1:-1:-1;26081:43:0::1;26101:5:::0;26108:2;25814:256;26081:19:::1;:43::i;:::-;26152:15;::::0;26135:64:::1;::::0;-1:-1:-1;;;26135:64:0;;::::1;::::0;::::1;19704:25:1::0;;;-1:-1:-1;;;;;26152:15:0;;::::1;::::0;26135:42:::1;::::0;19677:18:1;;26135:64:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;26210:59;26244:2;26248:20;26210:33;:59::i;:::-;25448:829:::0;;;;;;;;;;:::o;20658:2284::-;21015:19;21049:28;21092:17;20973:8;17256:15;17244:8;:27;;17236:55;;;;-1:-1:-1;;;17236:55:0;;;;;;;:::i;:::-;21173:15:::1;::::0;21162:7;;-1:-1:-1;;;;;21173:15:0;;::::1;::::0;21162:4;;21173:15:::1;::::0;21162:7:::1;;;;:::i;:::-;;;;;;;-1:-1:-1::0;;;;;21162:26:0::1;;21154:59;;;;-1:-1:-1::0;;;21154:59:0::1;;;;;;;:::i;:::-;21224:24;21285:7:::0;;21251:99:::1;::::0;-1:-1:-1;;;;;21285:7:0::1;21307:13:::0;21335:4;21251:19:::1;:99::i;:::-;21224:126;;21385:9;21371:7;21379:1;21371:10;;;;;;;;:::i;:::-;;;;;;;:23;;21363:66;;;;-1:-1:-1::0;;;21363:66:0::1;;;;;;;:::i;:::-;21457:15;::::0;21489:10;;-1:-1:-1;;;;;21457:15:0;;::::1;::::0;21440:41:::1;::::0;21489:7;;21457:15:::1;::::0;21489:10:::1;;;;:::i;:::-;;;;;;;21440:62;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;21544:15;;;;;;;;;-1:-1:-1::0;;;;;21544:15:0::1;-1:-1:-1::0;;;;;21537:32:0::1;;21588:41;21603:7;::::0;::::1;;;;;;-1:-1:-1::0;;;;;21603:7:0::1;21612:4;21617:1;21612:7;;;;;;;;:::i;:::-;;;;;;;21621:4;21626:1;21621:7;;;;;;;;:::i;:::-;;;;;;;21588:14;:41::i;:::-;21648:7;21656:1;21648:10;;;;;;;;:::i;:::-;;;;;;;21537:136;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;10969:32:1;;;;10951:51;;11033:2;11018:18;;11011:34;10939:2;10924:18;;10777:274;21537:136:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;21515:169;;;::::0;::::1;;21697:24;21703:7;21712:4;21718:2;21697:5;:24::i;:::-;21770:23;21756:7;21764:1;21756:10;;;;;;;;:::i;:::-;;;;;;;:37;;21734:132;;;::::0;-1:-1:-1;;;21734:132:0;;16362:2:1;21734: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;;21734:132:0::1;16160:409:1::0;21734:132:0::1;21904:13;21920:4;21939:1;21925:4;:11;:15;;;;:::i;:::-;21920:21;;;;;;;;:::i;:::-;;;;;;;21904:37;;21952:29;21996:7;22004:1;21996:10;;;;;;;;:::i;:::-;;;;;;;21984:9;:22;;;;:::i;:::-;21952:54;;22055:233;22083:5;22103:15;;;;;;;;;-1:-1:-1::0;;;;;22103:15:0::1;22133:7;22158:1;22141:7;:14;:18;;;;:::i;:::-;22133:27;;;;;;;;:::i;:::-;;;;;;;22175:21;22211:7;22236:1;22219:7;:14;:18;;;;:::i;:::-;22211:27;;;;;;;;:::i;:::-;;;;;;;22253:24;22055:13;:233::i;:::-;22301:12;22331:7:::0;;;22347:15;22017:271;;-1:-1:-1;22017:271:0;;-1:-1:-1;22301:12:0;22316:47:::1;::::0;-1:-1:-1;;;;;22331:7:0;;::::1;::::0;22340:5;;22347:15:::1;22316:14;:47::i;:::-;22301:62;;22376:61;22400:5;22407:10;22419:4;22425:11;22376:23;:61::i;:::-;22467:15;;;;;;;;;-1:-1:-1::0;;;;;22467:15:0::1;-1:-1:-1::0;;;;;22450:41:0::1;;22513:20;22450:96;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;22574:15:0::1;::::0;22567:60:::1;::::0;-1:-1:-1;;;22567:60:0;;-1:-1:-1;;;;;10969:32:1;;;22567:60:0::1;::::0;::::1;10951:51:1::0;11018:18;;;11011:34;;;22574:15:0;;::::1;::::0;-1:-1:-1;22567:32:0::1;::::0;-1:-1:-1;10924:18:1;;;-1:-1:-1;22567:60:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;22559:69;;;::::0;::::1;;22653:20;::::0;-1:-1:-1;;;22653:20:0;;-1:-1:-1;;;;;10044:32:1;;;22653:20:0::1;::::0;::::1;10026:51:1::0;22653:16:0;::::1;::::0;::::1;::::0;9999:18:1;;22653:20:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;22641:32;;22726:7;22734:1;22726:10;;;;;;;;:::i;:::-;;;;;;;22703:20;:33;;;;:::i;:::-;22690:9;:47;22686:209;;;22752:143;22804:10;22869:7;22877:1;22869:10;;;;;;;;:::i;:::-;;;;;;;22846:20;:33;;;;:::i;:::-;22833:47;::::0;:9:::1;:47;:::i;:::-;22752:33;:143::i;:::-;21126:1816;;;;20658:2284:::0;;;;;;;;;;;:::o;27801:610::-;28024:24;28005:8;17256:15;17244:8;:27;;17236:55;;;;-1:-1:-1;;;17236:55:0;;;;;;;:::i;:::-;28091:7:::1;::::0;28071:45:::1;::::0;;::::1;::::0;;::::1;::::0;;;;;;;;;;;::::1;::::0;-1:-1:-1;;;;;28091:7:0::1;::::0;28100:9;;28071:45;28111:4;;;;;;28071:45;;::::1;::::0;28111:4;;28071:45;28111:4;28071:45;::::1;;::::0;::::1;::::0;;;;-1:-1:-1;28071:19:0::1;::::0;-1:-1:-1;;;28071:45:0:i:1;:::-;28061:55;;28149:11;28135:7;28143:1;28135:10;;;;;;;;:::i;:::-;;;;;;;:25;;28127:68;;;;-1:-1:-1::0;;;28127:68:0::1;;;;;;;:::i;19342:1308::-:0;19680:19;19714:28;19757:17;19638:8;17256:15;17244:8;:27;;17236:55;;;;-1:-1:-1;;;17236:55:0;;;;;;;:::i;:::-;19888:15:::1;::::0;19840:198:::1;::::0;19868:5;;-1:-1:-1;;;;;19888:15:0::1;19918:18:::0;19951:9:::1;19975:14:::0;20004:23;19840:13:::1;:198::i;:::-;20049:12;20079:7:::0;;;20095:15;19802:236;;-1:-1:-1;19802:236:0;;-1:-1:-1;20049:12:0;20064:47:::1;::::0;-1:-1:-1;;;;;20079:7:0;;::::1;::::0;20088:5;;20095:15:::1;20064:14;:47::i;:::-;20049:62;;20122:61;20146:5;20153:10;20165:4;20171:11;20122:23;:61::i;:::-;20211:15;;;;;;;;;-1:-1:-1::0;;;;;20211:15:0::1;-1:-1:-1::0;;;;;20194:41:0::1;;20257:20;20194:96;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;20316:15:0::1;::::0;20309:60:::1;::::0;-1:-1:-1;;;20309:60:0;;-1:-1:-1;;;;;10969:32:1;;;20309:60:0::1;::::0;::::1;10951:51:1::0;11018:18;;;11011:34;;;20316:15:0;;::::1;::::0;-1:-1:-1;20309:32:0::1;::::0;-1:-1:-1;10924:18:1;;;-1:-1:-1;20309:60:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;20301:69;;;::::0;::::1;;20393:20;::::0;-1:-1:-1;;;20393:20:0;;-1:-1:-1;;;;;10044:32:1;;;20393:20:0::1;::::0;::::1;10026:51:1::0;20393:16:0;::::1;::::0;::::1;::::0;9999:18:1;;20393:20:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;20381:32;;20440:20;20428:9;:32;20424:179;;;20475:128;20527:10;20556:32;20568:20:::0;20556:9:::1;:32;:::i;20475:128::-;19791:859;19342:1308:::0;;;;;;;;;;;:::o;31185:993::-;31441:24;31413:8;17256:15;17244:8;:27;;17236:55;;;;-1:-1:-1;;;17236:55:0;;;;;;;:::i;:::-;31502:15:::1;::::0;-1:-1:-1;;;;;31502:15:0::1;31491:4:::0;;31502:15:::1;31491:7:::0;::::1;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;31491:26:0::1;;31483:59;;;;-1:-1:-1::0;;;31483:59:0::1;;;;;;;:::i;:::-;31583:7;::::0;31563:45:::1;::::0;;::::1;::::0;;::::1;::::0;;;;;;;;;;;::::1;::::0;-1:-1:-1;;;;;31583:7:0::1;::::0;31592:9;;31563:45;31603:4;;;;;;31563:45;;::::1;::::0;31603:4;;31563:45;31603:4;31563:45;::::1;;::::0;::::1;::::0;;;;-1:-1:-1;31563:19:0::1;::::0;-1:-1:-1;;;31563:45:0:i:1;:::-;31553:55;;31641:9;31627:7;31635:1;31627:10;;;;;;;;:::i;:::-;;;;;;;:23;;31619:66;;;;-1:-1:-1::0;;;31619:66:0::1;;;;;;;:::i;:::-;31713:15;::::0;31745:10;;-1:-1:-1;;;;;31713:15:0;;::::1;::::0;31696:41:::1;::::0;31745:7;;31713:15:::1;::::0;31745:10:::1;;;;:::i;:::-;;;;;;;31696:62;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;31798:15:0::1;::::0;::::1;31857:7:::0;;-1:-1:-1;;;;;31798:15:0;;::::1;::::0;-1:-1:-1;31791:32:0::1;::::0;-1:-1:-1;31842:41:0::1;::::0;-1:-1:-1;31857:7:0;;::::1;::::0;31866:4;;;;:7;::::1;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;31875:4;;31880:1;31875:7;;;;;;;:::i;31842:41::-;31902:7;31910:1;31902:10;;;;;;;;:::i;:::-;;;;;;;31791:136;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;10969:32:1;;;;10951:51;;11033:2;11018:18;;11011:34;10939:2;10924:18;;10777:274;31791:136:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;31769:169;;;::::0;::::1;;31949:24;31955:7;31964:4;;31949:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;31970:2:0;;-1:-1:-1;31949:5:0::1;::::0;-1:-1:-1;;31949:24:0:i:1;:::-;32000:7;32008:1;32000:10;;;;;;;;:::i;:::-;;;;;;;31988:9;:22;31984:159;;;32025:118;32077:10;32118:7;32126:1;32118:10;;;;;;;;:::i;:::-;;;;;;;32106:9;:22;;;;:::i;32025:118::-;31185:993:::0;;;;;;;;:::o;18394:940::-;18690:17;18671:8;17256:15;17244:8;:27;;17236:55;;;;-1:-1:-1;;;17236:55:0;;;;;;;:::i;:::-;18720:14:::1;18737:4;;18742:1;18737:7;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;18720:24:::0;-1:-1:-1;18755:14:0::1;18772:4:::0;;18777:15:::1;18791:1;18772:4:::0;18777:15:::1;:::i;:::-;18772:21;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;18755:38;;18806:24;18833:152;18872:13;18900:15;18930:4;;18949:2;18966:8;18833:24;:152::i;:::-;18806:179;;18998:23;19035:7;19043:1;19035:10;;;;;;;;:::i;:::-;;;;;;;19024:8;:21;;;;:::i;:::-;18998:47;;19074:252;19101:6;19122;19143:7;19168:1;19151:7;:14;:18;;;;:::i;:::-;19143:27;;;;;;;;:::i;:::-;;;;;;;19185:15;19215:7;19240:1;19223:7;:14;:18;;;;:::i;:::-;19215:27;;;;;;;;:::i;:::-;;;;;;;19257:18;19290:2;19307:8;19074:12;:252::i;:::-;19056:270;;;;;;;;;18709:625;;;;18394:940:::0;;;;;;;;;;;:::o;24572:868::-;24866:15;24883;24838:8;17256:15;17244:8;:27;;17236:55;;;;-1:-1:-1;;;17236:55:0;;;;;;;:::i;:::-;24916:12:::1;24946:7:::0;;24931:39:::1;::::0;-1:-1:-1;;;;;24946:7:0::1;24955:6:::0;24963;24931:14:::1;:39::i;:::-;24981:54;::::0;-1:-1:-1;;;24981:54:0;;25007:10:::1;24981:54;::::0;::::1;10637:34:1::0;-1:-1:-1;;;;;24981:25:0;::::1;10687:18:1::0;;;10680:43;;;10739:18;;;10732:34;;;24916:54:0;;-1:-1:-1;24981:25:0::1;::::0;10572:18:1;;24981:54:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;25083:20:0::1;::::0;-1:-1:-1;;;25083:20:0;;-1:-1:-1;;;;;10044:32:1;;;25083:20:0::1;::::0;::::1;10026:51:1::0;25047:15:0::1;::::0;;;25083:16;::::1;::::0;::::1;::::0;9999:18:1;;25083:20:0::1;::::0;::::1;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;25046:57;;;;25115:14;25135:33;25153:6;25161;25135:17;:33::i;:::-;25114:54;;;25210:6;-1:-1:-1::0;;;;;25200:16:0::1;:6;-1:-1:-1::0;;;;;25200:16:0::1;;:84;;25267:7;25276;25200:84;;;25233:7;25242;25200:84;25179:105:::0;;-1:-1:-1;25179:105:0;-1:-1:-1;25303:21:0;;::::1;;25295:63;;;::::0;-1:-1:-1;;;25295:63:0;;16776:2:1;25295:63:0::1;::::0;::::1;16758:21:1::0;16815:2;16795:18;;;16788:30;16854:31;16834:18;;;16827:59;16903:18;;25295:63:0::1;16574:353:1::0;25295:63:0::1;25388:10;25377:7;:21;;25369:63;;;::::0;-1:-1:-1;;;25369:63:0;;14069:2:1;25369:63:0::1;::::0;::::1;14051:21:1::0;14108:2;14088:18;;;14081:30;14147:31;14127:18;;;14120:59;14196:18;;25369:63:0::1;13867:353:1::0;25369:63:0::1;24905:535;;;;24572:868:::0;;;;;;;;;;;:::o;28419:861::-;28678:24;28650:8;17256:15;17244:8;:27;;17236:55;;;;-1:-1:-1;;;17236:55:0;;;;;;;:::i;:::-;28739:15:::1;::::0;-1:-1:-1;;;;;28739:15:0::1;28728:4:::0;;28739:15:::1;28728:7:::0;::::1;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;28728:26:0::1;;28720:59;;;;-1:-1:-1::0;;;28720:59:0::1;;;;;;;:::i;:::-;28821:7;::::0;28800:46:::1;::::0;;::::1;::::0;;::::1;::::0;;;;;;;;;;;::::1;::::0;-1:-1:-1;;;;;28821:7:0::1;::::0;28830:9:::1;::::0;28800:46;28841:4;;;;;;28800:46;;::::1;::::0;28841:4;;28800:46;28841:4;28800:46;::::1;;::::0;::::1;::::0;;;;-1:-1:-1;28800:20:0::1;::::0;-1:-1:-1;;;28800:46:0:i:1;:::-;28790:56;;28910:12;28879:7;28904:1;28887:7;:14;:18;;;;:::i;:::-;28879:27;;;;;;;;:::i;:::-;;;;;;;:43;;28857:127;;;;-1:-1:-1::0;;;28857:127:0::1;;;;;;;:::i;:::-;29012:15;::::0;29044:10;;-1:-1:-1;;;;;29012:15:0;;::::1;::::0;28995:41:::1;::::0;29044:7;;29012:15:::1;::::0;29044:10:::1;;;;:::i;:::-;;;;;;;28995:62;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;29097:15:0::1;::::0;::::1;29156:7:::0;;-1:-1:-1;;;;;29097:15:0;;::::1;::::0;-1:-1:-1;29090:32:0::1;::::0;-1:-1:-1;29141:41:0::1;::::0;-1:-1:-1;29156:7:0;;::::1;::::0;29165:4;;;;:7;::::1;;;;:::i;29141:41::-;29201:7;29209:1;29201:10;;;;;;;;:::i;:::-;;;;;;;29090:136;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;10969:32:1;;;;10951:51;;11033:2;11018:18;;11011:34;10939:2;10924:18;;10777:274;29090:136:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;29068:169;;;::::0;::::1;;29248:24;29254:7;29263:4;;29248:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;29269:2:0;;-1:-1:-1;29248:5:0::1;::::0;-1:-1:-1;;29248:24:0:i:1;32682:232::-:0;32882:7;;32812:24;;32861:45;;-1:-1:-1;;;;;32882:7:0;32891:8;32901:4;32861:20;:45::i;30207:970::-;30440:24;30421:8;17256:15;17244:8;:27;;17236:55;;;;-1:-1:-1;;;17236:55:0;;;;;;;:::i;:::-;30524:15:::1;::::0;;-1:-1:-1;;;;;30524:15:0::1;::::0;30499:4;;;;30504:15:::1;::::0;30499:4;30504:15:::1;:::i;:::-;30499:21;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;30499:40:0::1;;30477:110;;;;-1:-1:-1::0;;;30477:110:0::1;;;;;;;:::i;:::-;30629:7;::::0;30608:45:::1;::::0;;::::1;::::0;;::::1;::::0;;;;;;;;;;;::::1;::::0;-1:-1:-1;;;;;30629:7:0::1;::::0;30638:8;;30608:45;30648:4;;;;;;30608:45;;::::1;::::0;30648:4;;30608:45;30648:4;30608:45;::::1;;::::0;::::1;::::0;;;;-1:-1:-1;30608:20:0::1;::::0;-1:-1:-1;;;30608:45:0:i:1;:::-;30598:55;;30717:12;30686:7;30711:1;30694:7;:14;:18;;;;:::i;:::-;30686:27;;;;;;;;:::i;:::-;;;;;;;:43;;30664:127;;;;-1:-1:-1::0;;;30664:127:0::1;;;;;;;:::i;:::-;30802:162;30840:4;;30845:1;30840:7;;;;;;;:::i;30802:162::-;30975:35;30981:7;30990:4;;30975:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;31004:4:0::1;::::0;-1:-1:-1;30975:5:0::1;::::0;-1:-1:-1;;30975:35:0:i:1;:::-;31038:15;::::0;;31072:14;;-1:-1:-1;;;;;31038:15:0;;::::1;::::0;31021:42:::1;::::0;31064:7;;31072:18:::1;::::0;::::1;:::i;:::-;31064:27;;;;;;;;:::i;:::-;;;;;;;31021:71;;;;;;;;;;;;;19704:25:1::0;;19692:2;19677:18;;19558:177;31021:71:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;31103:66;31137:2;31141:7;31166:1;31149:7;:14;:18;;;;:::i;:::-;31141:27;;;;;;;;:::i;:::-;;;;;;;31103:33;:66::i;17489:897::-:0;17832:15;17862;17892:17;17790:8;17256:15;17244:8;:27;;17236:55;;;;-1:-1:-1;;;17236:55:0;;;;;;;:::i;:::-;17958:174:::1;17986:6;18007;18028:14;18057;18086:10;18111;17958:13;:174::i;:::-;18143:12;18173:7:::0;;17937:195;;-1:-1:-1;17937:195:0;;-1:-1:-1;18143:12:0;18158:39:::1;::::0;-1:-1:-1;;;;;18173:7:0::1;18182:6:::0;18190;18158:14:::1;:39::i;:::-;18143:54;;18208:58;18232:6;18240:10;18252:4;18258:7;18208:23;:58::i;:::-;18277;18301:6;18309:10;18321:4;18327:7;18277:23;:58::i;:::-;18358:20;::::0;-1:-1:-1;;;18358:20:0;;-1:-1:-1;;;;;10044:32:1;;;18358:20:0::1;::::0;::::1;10026:51:1::0;18358:16:0;::::1;::::0;::::1;::::0;9999:18:1;;18358:20:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;18346:32;;17926:460;17489:897:::0;;;;;;;;;;;;;:::o;29288:911::-;29521:24;29502:8;17256:15;17244:8;:27;;17236:55;;;;-1:-1:-1;;;17236:55:0;;;;;;;:::i;:::-;29605:15:::1;::::0;;-1:-1:-1;;;;;29605:15:0::1;::::0;29580:4;;;;29585:15:::1;::::0;29580:4;29585:15:::1;:::i;:::-;29580:21;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;29580:40:0::1;;29558:110;;;;-1:-1:-1::0;;;29558:110:0::1;;;;;;;:::i;:::-;29709:7;::::0;29689:45:::1;::::0;;::::1;::::0;;::::1;::::0;;;;;;;;;;;::::1;::::0;-1:-1:-1;;;;;29709:7:0::1;::::0;29718:9;;29689:45;29729:4;;;;;;29689:45;;::::1;::::0;29729:4;;29689:45;29729:4;29689:45;::::1;;::::0;::::1;::::0;;;;-1:-1:-1;29689:19:0::1;::::0;-1:-1:-1;;;29689:45:0:i:1;:::-;29679:55;;29767:11;29753:7;29761:1;29753:10;;;;;;;;:::i;:::-;;;;;;;:25;;29745:68;;;;-1:-1:-1::0;;;29745:68:0::1;;;;;;;:::i;6749:589::-:0;6885:17;6934:1;6923:8;:12;6915:58;;;;-1:-1:-1;;;6915:58:0;;19358:2:1;6915: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;;6915:58:0;19156:397:1;6915:58:0;7018:1;7006:9;:13;:31;;;;;7036:1;7023:10;:14;7006:31;6984:111;;;;-1:-1:-1;;;6984:111:0;;17951:2:1;6984:111:0;;;17933:21:1;17990:2;17970:18;;;17963:30;18029:32;18009:18;;;18002:60;18079:18;;6984:111:0;17749:354:1;6984:111:0;7106:23;7132:17;:8;7145:3;7132:12;:17::i;:::-;7106:43;-1:-1:-1;7160:17:0;7180:31;7106:43;7200:10;7180:19;:31::i;:::-;7160:51;-1:-1:-1;7222:19:0;7244:40;7268:15;7244:19;:9;7258:4;7244:13;:19::i;:::-;:23;;:40::i;:::-;7222:62;-1:-1:-1;7307:23:0;7222:62;7307:9;:23;:::i;:::-;7295:35;6749:589;-1:-1:-1;;;;;;;6749:589:0:o;8709:640::-;8847:24;8907:1;8892:4;:11;:16;;8884:49;;;;-1:-1:-1;;;8884:49:0;;18310:2:1;8884:49:0;;;18292:21:1;18349:2;18329:18;;;18322:30;-1:-1:-1;;;18368:18:1;;;18361:50;18428:18;;8884:49:0;18108:344:1;8884:49:0;8968:4;:11;8954:26;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;8954:26:0;;8944:36;;9021:9;8991:7;9016:1;8999:7;:14;:18;;;;:::i;:::-;8991:27;;;;;;;;:::i;:::-;;;;;;:39;;;;;9046:9;9072:1;9058:4;:11;:15;;;;:::i;:::-;9046:27;;9041:301;9075:5;;9041:301;;9103:17;;9144:108;9174:7;9200:4;9205:5;9209:1;9205;:5;:::i;:::-;9200:11;;;;;;;;:::i;:::-;;;;;;;9230:4;9235:1;9230:7;;;;;;;;:::i;:::-;;;;;;;9144:11;:108::i;:::-;9102:150;;;;9284:46;9296:7;9304:1;9296:10;;;;;;;;:::i;:::-;;;;;;;9308:9;9319:10;9284:11;:46::i;:::-;9267:7;9275:5;9279:1;9275;:5;:::i;:::-;9267:14;;;;;;;;:::i;:::-;;;;;;:63;;;;;9087:255;;9082:3;;;;;:::i;:::-;;;;9041:301;;;;8709:640;;;;;:::o;8082:619::-;8220:24;8280:1;8265:4;:11;:16;;8257:49;;;;-1:-1:-1;;;8257:49:0;;18310:2:1;8257:49:0;;;18292:21:1;18349:2;18329:18;;;18322:30;-1:-1:-1;;;18368:18:1;;;18361:50;18428:18;;8257:49:0;18108:344:1;8257:49:0;8341:4;:11;8327:26;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;8327:26:0;;8317:36;;8377:8;8364:7;8372:1;8364:10;;;;;;;;:::i;:::-;;;;;;:21;;;;;8401:9;8396:298;8430:1;8416:4;:11;:15;;;;:::i;:::-;8412:1;:19;8396:298;;;8454:17;8473:18;8495:108;8525:7;8551:4;8556:1;8551:7;;;;;;;;:::i;:::-;;;;;;;8577:4;8582:1;8586;8582:5;;;;:::i;:::-;8577:11;;;;;;;;:::i;8495:108::-;8453:150;;;;8635:47;8648:7;8656:1;8648:10;;;;;;;;:::i;:::-;;;;;;;8660:9;8671:10;8635:12;:47::i;:::-;8618:7;8626:5;:1;8630;8626:5;:::i;:::-;8618:14;;;;;;;;:::i;:::-;;;;;;:64;;;;;8438:256;;8433:3;;;;;:::i;:::-;;;;8396:298;;4292:204;4447:41;;-1:-1:-1;;;4447:41:0;;-1:-1:-1;;;;;10318:15:1;;;4447:41:0;;;10300:34:1;10370:15;;;10350:18;;;10343:43;4415:12:0;;4447:25;;;;;;10235:18:1;;4447:41:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;5329:522::-;5614:51;;;-1:-1:-1;;;;;10655:15:1;;;5614:51:0;;;10637:34:1;10707:15;;;10687:18;;;10680:43;10739:18;;;;10732:34;;;5614:51:0;;;;;;;;;;10572:18:1;;;;5614:51:0;;;;;;;-1:-1:-1;;;;;5614:51:0;-1:-1:-1;;;5614:51:0;;;5589:87;;-1:-1:-1;;;;5589:10:0;;;;:87;;5614:51;5589:87;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5553:123;;;;5709:7;:57;;;;-1:-1:-1;5721:11:0;;:16;;:44;;;5752:4;5741:24;;;;;;;;;;;;:::i;:::-;5687:156;;;;-1:-1:-1;;;5687:156:0;;13651:2:1;5687: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;;5687:156:0;13449:413:1;5687:156:0;5463:388;;5329:522;;;;:::o;26285:831::-;26420:9;26415:694;26449:1;26435:4;:11;:15;;;;:::i;:::-;26431:1;:19;26415:694;;;26473:13;26488:14;26507:4;26512:1;26507:7;;;;;;;;:::i;:::-;;;;;;;26516:4;26521:1;26525;26521:5;;;;:::i;:::-;26516:11;;;;;;;;:::i;:::-;;;;;;;26472:56;;;;26544:14;26564:32;26582:5;26589:6;26564:17;:32::i;:::-;-1:-1:-1;26543:53:0;-1:-1:-1;26611:17:0;26631:7;26639:5;:1;26643;26639:5;:::i;:::-;26631:14;;;;;;;;:::i;:::-;;;;;;;26611:34;;26661:18;26681;26712:6;-1:-1:-1;;;;;26703:15:0;:5;-1:-1:-1;;;;;26703:15:0;;:101;;26782:9;26801:1;26703:101;;;26747:1;26751:9;26703:101;26660:144;;;;26819:10;26850:1;26836:4;:11;:15;;;;:::i;:::-;26832:1;:19;:106;;26935:3;26832:106;;;26886:7;;26871:44;;-1:-1:-1;;;;;26886:7:0;26895:6;26903:4;26908:5;:1;26912;26908:5;:::i;:::-;26903:11;;;;;;;;:::i;26871:44::-;26974:7;;26819:119;;-1:-1:-1;26959:38:0;;-1:-1:-1;;;;;26974:7:0;26983:5;26990:6;26959:14;:38::i;:::-;26953:144;;-1:-1:-1;;;26953:144:0;;;;;20195:25:1;;;20236:18;;;20229:34;;;-1:-1:-1;;;;;20299:32:1;;;20279:18;;;20272:60;26953:50:0;;;;;;;20168:18:1;;26953:144:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26457:652;;;;;;;26452:3;;;;;:::i;:::-;;;;26415:694;;;;26285:831;;;:::o;5859:473::-;6105:45;;;-1:-1:-1;;;;;10969:32:1;;;6105:45:0;;;10951:51:1;11018:18;;;;11011:34;;;6105:45:0;;;;;;;;;;10924:18:1;;;;6105:45:0;;;;;;;-1:-1:-1;;;;;6105:45:0;-1:-1:-1;;;6105:45:0;;;6080:81;;-1:-1:-1;;;;6080:10:0;;;;:81;;6105:45;6080:81;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6044:117;;;;6194:7;:57;;;;-1:-1:-1;6206:11:0;;:16;;:44;;;6237:4;6226:24;;;;;;;;;;;;:::i;:::-;6172:152;;;;-1:-1:-1;;;6172:152:0;;17537:2:1;6172: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;;6172:152:0;17335:409:1;6172:152:0;5966:366;;5859:473;;;:::o;6340:287::-;6464:12;;;6424;6464;;;;;;;;;-1:-1:-1;;;;;6442:7:0;;;6457:5;;6442:35;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6423:54;;;6510:7;6488:131;;;;-1:-1:-1;;;6488:131:0;;14427:2:1;6488: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;;6488:131:0;14225:478:1;6488:131:0;6412:215;6340:287;;:::o;22950:1614::-;23171:15;23229:7;;23220:41;;-1:-1:-1;;;23220:41:0;;-1:-1:-1;;;;;10318:15:1;;;23220:41:0;;;10300:34:1;10370:15;;;10350:18;;;10343:43;23171:15:0;;;;23229:7;;;23220:25;;10235:18:1;;23220:41:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;23220:55:0;;23216:132;;;23301:7;;23292:44;;-1:-1:-1;;;23292:44:0;;-1:-1:-1;;;;;10318:15:1;;;23292:44:0;;;10300:34:1;10370:15;;;10350:18;;;10343:43;23301:7:0;;;;23292:28;;10235:18:1;;23292:44:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;23216:132;23359:16;23430:7;;23359:16;;23397:93;;-1:-1:-1;;;;;23430:7:0;23452:6;23473;23397:18;:93::i;:::-;23358:132;;;;23505:8;23517:1;23505:13;:30;;;;-1:-1:-1;23522:13:0;;23505:30;23501:1056;;;23574:14;;-1:-1:-1;23590:14:0;;-1:-1:-1;23501:1056:0;;;23638:22;23663:114;23694:14;23727:8;23754;23663:12;:114::i;:::-;23638:139;;23814:14;23796;:32;23792:754;;23897:10;23879:14;:28;;23849:131;;;;-1:-1:-1;;;23849:131:0;;14069:2:1;23849:131:0;;;14051:21:1;14108:2;14088:18;;;14081:30;14147:31;14127:18;;;14120:59;14196:18;;23849:131:0;13867:353:1;23849:131:0;24021:14;;-1:-1:-1;24037:14:0;-1:-1:-1;24037:14:0;23792:754;;;24093:22;24118:130;24153:14;24190:8;24221;24118:12;:130::i;:::-;24093:155;;24293:14;24275;:32;;24267:41;;;;;;24375:10;24357:14;:28;;24327:131;;;;-1:-1:-1;;;24327:131:0;;16776:2:1;24327:131:0;;;16758:21:1;16815:2;16795:18;;;16788:30;16854:31;16834:18;;;16827:59;16903:18;;24327:131:0;16574:353:1;24327:131:0;24499:14;-1:-1:-1;24515:14:0;;-1:-1:-1;23792:754:0;23623:934;23501:1056;23205:1359;;22950:1614;;;;;;;;;:::o;3897:387::-;3999:14;4015;4065:6;-1:-1:-1;;;;;4055:16:0;:6;-1:-1:-1;;;;;4055:16:0;;;4047:56;;;;-1:-1:-1;;;4047:56:0;;16006:2:1;4047:56:0;;;15988:21:1;16045:2;16025:18;;;16018:30;16084:29;16064:18;;;16057:57;16131:18;;4047:56:0;15804:351:1;4047:56:0;4142:6;-1:-1:-1;;;;;4133:15:0;:6;-1:-1:-1;;;;;4133:15:0;;:79;;4197:6;4205;4133:79;;;4165:6;4173;4133:79;4114:98;;-1:-1:-1;4114:98:0;-1:-1:-1;;;;;;4231:20:0;;4223:53;;;;-1:-1:-1;;;4223:53:0;;14910:2:1;4223:53:0;;;14892:21:1;14949:2;14929:18;;;14922:30;-1:-1:-1;;;14968:18:1;;;14961:50;15028:18;;4223:53:0;14708:344:1;4223:53:0;3897:387;;;;;:::o;3605:151::-;3663:9;3693:6;;;:30;;-1:-1:-1;3722:1:0;3717;3708:5;3717:1;3722;3708:5;:::i;:::-;3704:9;-1:-1:-1;3703:15:0;;3704:9;3703:15;:::i;:::-;:20;3693:30;3685:63;;;;-1:-1:-1;;;3685:63:0;;12594:2:1;3685:63:0;;;12576:21:1;12633:2;12613:18;;;12606:30;-1:-1:-1;;;12652:18:1;;;12645:50;12712:18;;3685:63:0;12392:344:1;3314:137:0;3372:9;3417:1;3407:5;3411:1;3417;3407:5;:::i;:::-;3403:9;;;3402:16;;3394:49;;;;-1:-1:-1;;;3394:49:0;;13302:2:1;3394:49:0;;;13284:21:1;13341:2;13321:18;;;13314:30;-1:-1:-1;;;13360:18:1;;;13353:50;13420:18;;3394:49:0;13100:344:1;4843:478:0;4970:16;4988;5018:14;5038:26;5049:6;5057;5038:10;:26::i;:::-;5017:47;;;5076:16;5094;5134:32;5142:7;5151:6;5159;5134:7;:32::i;:::-;-1:-1:-1;;;;;5114:75:0;;:77;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;5075:116:0;;;-1:-1:-1;;;;;5075:116:0;;;5235:6;-1:-1:-1;;;;;5225:16:0;:6;-1:-1:-1;;;;;5225:16:0;;:88;;5294:8;5304;5225:88;;;5258:8;5268;5225:88;5202:111;;;;-1:-1:-1;4843:478:0;-1:-1:-1;;;;;;;4843:478:0:o;7459:541::-;7595:16;7644:1;7632:9;:13;7624:60;;;;-1:-1:-1;;;7624:60:0;;15603:2:1;7624: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;;7624:60:0;15401:398:1;7624:60:0;7729:1;7717:9;:13;:31;;;;;7747:1;7734:10;:14;7717:31;7695:111;;;;-1:-1:-1;;;7695:111:0;;17951:2:1;7695:111:0;;;17933:21:1;17990:2;17970:18;;;17963:30;18029:32;18009:18;;;18002:60;18079:18;;7695:111:0;17749:354:1;7695:111:0;7817:17;7837:34;7866:4;7837:24;:9;7851;7837:13;:24::i;:::-;:28;;:34::i;:::-;7817:54;-1:-1:-1;7882:19:0;7904:34;7934:3;7904:25;:10;7919:9;7904:14;:25::i;:34::-;7882:56;-1:-1:-1;7960:32:0;7990:1;7961:23;7882:56;7961:9;:23;:::i;7960:32::-;7949:43;7459:541;-1:-1:-1;;;;;;7459:541:0:o;4504:331::-;4629:15;4675:1;4665:7;:11;4657:43;;;;-1:-1:-1;;;4657:43:0;;18659:2:1;4657:43:0;;;18641:21:1;18698:2;18678:18;;;18671:30;-1:-1:-1;;;18717:18:1;;;18710:49;18776:18;;4657:43:0;18457:343:1;4657:43:0;4730:1;4719:8;:12;:28;;;;;4746:1;4735:8;:12;4719:28;4711:63;;;;-1:-1:-1;;;4711:63:0;;19007:2:1;4711:63:0;;;18989:21:1;19046:2;19026:18;;;19019:30;-1:-1:-1;;;19065:18:1;;;19058:52;19127:18;;4711:63:0;18805:346:1;4711:63:0;4819:8;4795:21;:7;4807:8;4795:11;:21::i;:::-;:32;;;;:::i;3459:138::-;3517:9;3562:1;3552:5;3556:1;3562;3552:5;:::i;:::-;3548:9;;;3547:16;;3539:50;;;;-1:-1:-1;;;3539:50:0;;11895:2:1;3539:50:0;;;11877:21:1;11934:2;11914:18;;;11907:30;-1:-1:-1;;;11953:18:1;;;11946:51;12014:18;;3539: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://9e009d451135d8f7785354bbd0067448d7f55ac869805336dbb4ecd29444fdc4
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.