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]
0x5edda1671ee4846361a0da227f47bb12747a323ef1961ab80483b49f77ff914aSwap Exact Token...31795082023-03-20 12:21:422 days 10 hrs ago0x58ae990f35ff299dc2c81d050cf41256b5a551e8 IN  Zenlink: Router0 GLMR0.0023227
0xf87df4029870b9849ea9eec772c8b30832e84a2d0f1a214c42a1dc867bb1255cSwap Exact Token...31740852023-03-19 17:52:183 days 4 hrs ago0x45fe6fac6dc9584ce47988ff65c3b0cbd665a50d IN  Zenlink: Router0 GLMR0.0023239
0xf1a07e94e3cd200ed125037653908c22123dc864945c213553161a43afea27baSwap Exact Token...31740732023-03-19 17:49:363 days 4 hrs ago0x58ae990f35ff299dc2c81d050cf41256b5a551e8 IN  Zenlink: Router0 GLMR0.0023251
0x62925b2225bbfbf0bc80c54294fbd6e04bd24644567c64ba3856979e7ed674b3Swap Exact ETH F...31739552023-03-19 17:25:243 days 5 hrs ago0xeae788491e8f72942b7d92c00218ed5f3ea6666a IN  Zenlink: Router2.163746431019636 GLMR0.0023024
0xec964d4889ef858c2a8d25cb684c271cbfd9b65b7cb698dfb4c9227b402527e4Swap Exact Token...31739362023-03-19 17:21:183 days 5 hrs ago0x58ae990f35ff299dc2c81d050cf41256b5a551e8 IN  Zenlink: Router0 GLMR0.0023239
0x3c1305474d6d7bcd796513260f74a3caf617dcd5cdcb0ee95f280751f63a26d7Swap Exact Token...31733332023-03-19 15:14:423 days 7 hrs ago0x58ae990f35ff299dc2c81d050cf41256b5a551e8 IN  Zenlink: Router0 GLMR0.0023227
0x38efc27200144d03b68a1dc05a4fcff317a05349e32c8b21ca6cf32d5320c313Swap Exact ETH F...31622862023-03-18 1:18:364 days 21 hrs ago0x45fe6fac6dc9584ce47988ff65c3b0cbd665a50d IN  Zenlink: Router29.555625034942367 GLMR0.0023036
0x16ed6979593cc36d442fe2bc6e525ffb600ebc1910971179b80ffd46f28b55d0Swap Exact ETH F...31611892023-03-17 21:30:365 days 1 hr ago0xeae788491e8f72942b7d92c00218ed5f3ea6666a IN  Zenlink: Router2.163746431019636 GLMR0.0023024
0x94a047d28d894845b571263bc30ec4df9d136a7c43843e65848cc70e03d88c96Swap Exact Token...31611882023-03-17 21:30:245 days 1 hr ago0x58ae990f35ff299dc2c81d050cf41256b5a551e8 IN  Zenlink: Router0 GLMR0.0023227
0xa7a94ba3a3c5c1cb3329b39cef047ee818856b71e646e15b04ba70eb4dd87625Swap Exact Token...31597492023-03-17 16:33:365 days 6 hrs ago0x58ae990f35ff299dc2c81d050cf41256b5a551e8 IN  Zenlink: Router0 GLMR0.0023227
0x4df60a1310cac464465c6ab724cd77a4d7d0cc6fdfcc9c1dd44987fe4301786bSwap Exact Token...31597472023-03-17 16:33:125 days 6 hrs ago0x95a488ac736617976ed67472ce9ed5e2b43dea34 IN  Zenlink: Router0 GLMR0.0023227
0x88ad2d75e1f3d3116ae7248ebbfedcecca6f586535884f4b9f7bc9dee2f2973fSwap Exact Token...31597432023-03-17 16:32:245 days 6 hrs ago0x58ae990f35ff299dc2c81d050cf41256b5a551e8 IN  Zenlink: Router0 GLMR0.0023227
0xf38e85d07710671968ee2e7cfe3304504fbe3c720d368b652679811cc81ca577Swap Exact Token...31597432023-03-17 16:32:245 days 6 hrs ago0x95a488ac736617976ed67472ce9ed5e2b43dea34 IN  Zenlink: Router0 GLMR0.0023227
0xe2d05061ea6b9aa35c19f94af6810fd1215fbcf33ac8db5ae1d8f6b1828355edSwap Exact Token...31597382023-03-17 16:31:125 days 6 hrs ago0x58ae990f35ff299dc2c81d050cf41256b5a551e8 IN  Zenlink: Router0 GLMR0.0023227
0xec3368fcf320c036a065a06f8ecd41875e201667dbf33faf18a215c34c8cc0c7Swap Exact Token...31597382023-03-17 16:31:125 days 6 hrs ago0x95a488ac736617976ed67472ce9ed5e2b43dea34 IN  Zenlink: Router0 GLMR0.0023227
0x72f5bc487a712b79b274f0770d868aae23f076801de8c04b22ca463e1e7017acSwap Exact Token...31597302023-03-17 16:29:305 days 6 hrs ago0x58ae990f35ff299dc2c81d050cf41256b5a551e8 IN  Zenlink: Router0 GLMR0.0023227
0x272b8aff67d8268c8f8f7736f96d567cdd7ea5565991af048aa6558e15cc8c23Swap Exact Token...31597252023-03-17 16:28:185 days 6 hrs ago0x58ae990f35ff299dc2c81d050cf41256b5a551e8 IN  Zenlink: Router0 GLMR0.0023227
0x5e8296f07286d48ba9b633850824c591220bb01bde60c76e964a423a49a80e36Swap Exact Token...31276402023-03-13 0:57:259 days 21 hrs ago0x65bab4f268286b9005d6053a177948dddc29bad3 IN  Zenlink: Router0 GLMR0.053123106246
0x390bbb8fb89e760f498640e1bb2892ff9aa7b86755141d4e9ab4e7dc23174b14Swap Exact Token...31276372023-03-13 0:56:209 days 21 hrs ago0x65bab4f268286b9005d6053a177948dddc29bad3 IN  Zenlink: Router0 GLMR0.053123106246
0x8acbc3165ae156ee5c1cec31f210143efd4ab1dc133d7ae0b4349bdc6cbabff4Swap Exact Token...31275832023-03-13 0:41:269 days 21 hrs ago0x65bab4f268286b9005d6053a177948dddc29bad3 IN  Zenlink: Router0 GLMR0.011916023832
0x3705b490605fa005b18ff7c4eda5605bd990e990da1336019fef396371a3a096Swap Exact Token...31275802023-03-13 0:40:509 days 21 hrs ago0x65bab4f268286b9005d6053a177948dddc29bad3 IN  Zenlink: Router0 GLMR0.011916023832
0xe835126ee5d1f75dc81d9112f9087ccd1d6ddc54960f72c6ef51ddb1465436ecSwap Exact Token...31275722023-03-13 0:38:459 days 21 hrs ago0x65bab4f268286b9005d6053a177948dddc29bad3 IN  Zenlink: Router0 GLMR0.053123106246
0xec9f8c31009a2dee76777a70ca2a0d4192a36f1e254c8bc1b8c62f762b75acbbSwap Exact Token...31275682023-03-13 0:37:509 days 21 hrs ago0x65bab4f268286b9005d6053a177948dddc29bad3 IN  Zenlink: Router0 GLMR0.053123106246
0x23aeb0cbe76e5593ccfd2f0b096ee893e456a7da23d2eb3104188c23c75754b3Swap Exact Token...31275372023-03-13 0:30:219 days 22 hrs ago0x65bab4f268286b9005d6053a177948dddc29bad3 IN  Zenlink: Router0 GLMR0.053123106246
0xcf368585de25c79b7087cc96bbdb1e848b64e9ad90a9b915de2a70d4e2c54bb4Swap Exact Token...31275232023-03-13 0:26:439 days 22 hrs ago0x65bab4f268286b9005d6053a177948dddc29bad3 IN  Zenlink: Router0 GLMR0.011916023832
[ Download CSV Export 
Latest 25 internal transaction
Parent Txn Hash Block From To Value
0x2c67fd9541a0e3601288b77150181a06d6c119456e6545a4b67bcab5fa7e508b26912362023-01-09 8:33:1872 days 14 hrs ago Zenlink: Router0x24d4b5d7b3bb94b23ca94c660fe146a07c53f5b50.641617891320892387 GLMR
0x2c67fd9541a0e3601288b77150181a06d6c119456e6545a4b67bcab5fa7e508b26912362023-01-09 8:33:1872 days 14 hrs ago Moonbeam: WGLMR Token Zenlink: Router0.641617891320892387 GLMR
0xf047082e6fc6a72e136641722ddb8c8f6697a88f19b89ea0a17be81581ef2dbd25953542022-12-26 19:47:4286 days 2 hrs ago Zenlink: Router Moonbeam: WGLMR Token3 GLMR
0xf047082e6fc6a72e136641722ddb8c8f6697a88f19b89ea0a17be81581ef2dbd25953542022-12-26 19:47:4286 days 2 hrs ago 0x82ec32af69f0d9a259a58103eb02c5a9a3ff5776 Zenlink: Router3 GLMR
0x223d8107b6c519e1fc951a6aa868ed2bf07b5157a46ca4df0d585be43466cc5624962452022-12-12 19:37:24100 days 2 hrs ago Zenlink: Router0xb3405453cb4ca6b74b6704d15942fb0560ec94241.065415306031538552 GLMR
0x223d8107b6c519e1fc951a6aa868ed2bf07b5157a46ca4df0d585be43466cc5624962452022-12-12 19:37:24100 days 2 hrs ago Moonbeam: WGLMR Token Zenlink: Router1.065415306031538552 GLMR
0x5f0d3ad2e914edccc12206ab53773d0800ea633e18ba0026e4e8708b7ffed2ff22168872022-11-03 8:01:30139 days 14 hrs ago Zenlink: Router0x543533e83a78950042bd59ff7822f39f440e9e6b1.567582734592611833 GLMR
0x5f0d3ad2e914edccc12206ab53773d0800ea633e18ba0026e4e8708b7ffed2ff22168872022-11-03 8:01:30139 days 14 hrs ago Moonbeam: WGLMR Token Zenlink: Router1.567582734592611833 GLMR
0x91df074b47ca8da758344ffed4ef188d16196d66473535e23cba23a074ac440c22168822022-11-03 8:00:30139 days 14 hrs ago Zenlink: Router0x543533e83a78950042bd59ff7822f39f440e9e6b16.139329518560900467 GLMR
0x91df074b47ca8da758344ffed4ef188d16196d66473535e23cba23a074ac440c22168822022-11-03 8:00:30139 days 14 hrs ago Moonbeam: WGLMR Token Zenlink: Router16.139329518560900467 GLMR
0xfa23e14e8ad00b244a3d644486ee735c502f85ed7193ed9089cc41cc52da689719800192022-09-30 19:13:24173 days 3 hrs ago Zenlink: Router0xe73b6f11b3afdbf5d1a1c91ceb8af9e544ca114b14.336890666785039732 GLMR
0xfa23e14e8ad00b244a3d644486ee735c502f85ed7193ed9089cc41cc52da689719800192022-09-30 19:13:24173 days 3 hrs ago Moonbeam: WGLMR Token Zenlink: Router14.336890666785039732 GLMR
0x7c386e31771f5b9e2d5762dcfc065057a888fae3ad570756287b71598655e5ef17738112022-09-01 5:05:48202 days 17 hrs ago Zenlink: Router0xe3dff97e14f3a55228ed2f614114bf6b27a7677b3.720644933623444225 GLMR
0x7c386e31771f5b9e2d5762dcfc065057a888fae3ad570756287b71598655e5ef17738112022-09-01 5:05:48202 days 17 hrs ago Moonbeam: WGLMR Token Zenlink: Router3.720644933623444225 GLMR
0x1cc0e1a5f34895bd6a67215ace8cb585c44a88bca23a175f9bee351bc54827d517533052022-08-29 6:28:48205 days 16 hrs ago Zenlink: Router Moonbeam: WGLMR Token0.000089653285373506 GLMR
0xb7372b8c671c55ade324af1757466e9d7b31d696f6c1c2ad39fb3d51c054c8f117520432022-08-29 2:09:06205 days 20 hrs ago Zenlink: Router0x4756c4d5aaefcb4f52f54d20f6b17376c9efe62f0.099910346714626494 GLMR
0xb7372b8c671c55ade324af1757466e9d7b31d696f6c1c2ad39fb3d51c054c8f117520432022-08-29 2:09:06205 days 20 hrs ago Zenlink: Router Moonbeam: WGLMR Token0.000089653285373506 GLMR
0x9ba9d49d27b3cbaebb5a36938d64fd315ff68a5b8e04ce36c4098df90336a6f117228632022-08-24 21:37:18210 days 59 mins ago Zenlink: Router Moonbeam: WGLMR Token234 GLMR
0x80486d20ecd3ca286af430db738fef61e55a43be6aebc3448d2b336bbdbf6a2c17228572022-08-24 21:36:06210 days 1 hr ago Zenlink: Router Moonbeam: WGLMR Token240 GLMR
0xd5c796ceb3ae35feec33f7339387e396d3c623d47fda4d96698f6324659c601717228572022-08-24 21:36:06210 days 1 hr ago Zenlink: Router Moonbeam: WGLMR Token120 GLMR
0x667fffecf38eb2cfa4aad17d77ece12fe45305bff355efd6b57d92bcdfb3556d17228562022-08-24 21:35:54210 days 1 hr ago Zenlink: Router Moonbeam: WGLMR Token117 GLMR
0xc343052a6063dddb1a1805e95fb9836fc5db7215ec503b983f8831f41fda3a8a17166652022-08-24 0:25:18210 days 22 hrs ago Zenlink: Router0xe1fa699860444be91d366c21de8fef56e3dec77a130.642335377462389711 GLMR
0xc343052a6063dddb1a1805e95fb9836fc5db7215ec503b983f8831f41fda3a8a17166652022-08-24 0:25:18210 days 22 hrs ago Moonbeam: WGLMR Token Zenlink: Router130.642335377462389711 GLMR
0x3dce461f9e3e231e400b6491c73c893c788ccf107b808d2688f0792be1127f4b17166632022-08-24 0:24:48210 days 22 hrs ago Zenlink: Router0xe1fa699860444be91d366c21de8fef56e3dec77a130.90692433616006858 GLMR
0x3dce461f9e3e231e400b6491c73c893c788ccf107b808d2688f0792be1127f4b17166632022-08-24 0:24:48210 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.