Contract 0x354bc1cfe9959b96bed409859a726263c6c56c81 1

Contract Overview

Balance:
0 BNB
Txn Hash Method
Block
From
To
Value [Txn Fee]
0x8d6333f9b5d6ee611ccbb00e297d2ca7f8c1e771026d8e51323edf7d54ab03baAdd Liquidity125820902021-09-22 8:09:141 day 23 hrs ago0x6af7dfbb4b9c6adac1c9491f052aeeb39425901c IN  0x354bc1cfe9959b96bed409859a726263c6c56c810 BNB0.00159332
0x13c3c321ebee188883be3e8de18d60261c255bddca70e442bc38aab1af3ac4e1Add Liquidity125819632021-09-22 8:02:531 day 23 hrs ago0x6af7dfbb4b9c6adac1c9491f052aeeb39425901c IN  0x354bc1cfe9959b96bed409859a726263c6c56c810 BNB0.00157288
0x2339e6b6fff8879c7e06220daf10dcfb91ffb969dc9a201d8b9f84e395dbd1fbAdd Liquidity125816542021-09-22 7:47:261 day 23 hrs ago0xca6a2d72869f69b0086105b2e8242463d4fe70af IN  0x354bc1cfe9959b96bed409859a726263c6c56c810 BNB0.00225817
0x22883a716647be0a315eceb655ccaed558a265970675148801c3f50058ad1946Swap Exact ETH F...122116882021-09-09 8:47:1914 days 22 hrs ago0x08e3befef131a1c1526bc8f81ab209099a9c0b4a IN  0x354bc1cfe9959b96bed409859a726263c6c56c811 BNB0.00109805
0x5bd9755e1ebd73b4d1b779a5070e5ae759139a5a1a7ffc9ffe3e2fc06b85d779Add Liquidity121265682021-09-06 9:42:4517 days 21 hrs ago0xa3c6b74cf1317199378e77e11b5be7ff86055150 IN  0x354bc1cfe9959b96bed409859a726263c6c56c810 BNB0.02901774
0x41f54e76261db209bed325c944070ab4389319a392cd9dd6530a576046eb4494Add Liquidity121243812021-09-06 7:52:5317 days 23 hrs ago0xca6a2d72869f69b0086105b2e8242463d4fe70af IN  0x354bc1cfe9959b96bed409859a726263c6c56c810 BNB0.02901544
0x299b9ddb14820273967334ced960c14b2267b357a0dcb8c221a07e37a3e14bf4Add Liquidity ET...119281122021-08-30 10:49:3624 days 20 hrs ago0xd574575f7d1cfa0762024acbf69a7862a8947cfa IN  0x354bc1cfe9959b96bed409859a726263c6c56c810.1 BNB0.02900239
0xd2c3d08f74c2daff5088e098b5f341b3967a776924247e9c0f9c458a836596f1Add Liquidity ET...119279802021-08-30 10:43:0024 days 20 hrs ago0xd574575f7d1cfa0762024acbf69a7862a8947cfa IN  0x354bc1cfe9959b96bed409859a726263c6c56c811 BNB0.02900611
0xca706ce1ed0b56118765669d01f8deda59155b9acf266e3e476126dad0a0d296Add Liquidity117084662021-08-22 19:16:2332 days 12 hrs ago0x08e3befef131a1c1526bc8f81ab209099a9c0b4a IN  0x354bc1cfe9959b96bed409859a726263c6c56c810 BNB0.00151211
0x3648d61a7e6bda3b3a03acde596ffd8565df59ad4a4d13774f7604e8978aa404Add Liquidity116105692021-08-19 8:38:4235 days 22 hrs ago0x08e3befef131a1c1526bc8f81ab209099a9c0b4a IN  0x354bc1cfe9959b96bed409859a726263c6c56c810 BNB0.00233314
0xac3143e6a692ca310d7484f94c4785c5502f5ef0b20307163791db7b7a96fc2eSwap Exact Token...116102802021-08-19 8:23:3335 days 23 hrs ago0x08e3befef131a1c1526bc8f81ab209099a9c0b4a IN  0x354bc1cfe9959b96bed409859a726263c6c56c810 BNB0.00187342
0xa5d307c3afc9cb4a00f43fd668417109b07c99343a2c06d51dadcbe09427bdd3Swap Exact Token...116101122021-08-19 8:14:4735 days 23 hrs ago0x08e3befef131a1c1526bc8f81ab209099a9c0b4a IN  0x354bc1cfe9959b96bed409859a726263c6c56c810 BNB0.00125638
0x379a4107c55a5f804f4c12990dd40bb086fce25bd6adc17daf0705458c31f48bAdd Liquidity115275652021-08-16 10:32:5938 days 20 hrs ago0xbba33901db9ce3b18578799bde301ef02cf5d263 IN  0x354bc1cfe9959b96bed409859a726263c6c56c810 BNB0.00194914
0xc1fb25868a5e8e7f31691d104428e69e0b49372d24ff766feceea150e163f87fSwap Exact Token...115274272021-08-16 10:26:0538 days 21 hrs ago0xbba33901db9ce3b18578799bde301ef02cf5d263 IN  0x354bc1cfe9959b96bed409859a726263c6c56c810 BNB0.00234115
0xb7aeab02fd7ee6b71e133f28dffbdd1b74dcf31b61883e1f943937fdabd04bf5Swap Exact Token...115274172021-08-16 10:25:3538 days 21 hrs ago0xbba33901db9ce3b18578799bde301ef02cf5d263 IN  0x354bc1cfe9959b96bed409859a726263c6c56c810 BNB0.00125874
0x62c48fb5bf5038797ae395b30f59331c7e8c517ffb21e3e79e021a32609d3a29Add Liquidity114453152021-08-13 13:51:1041 days 17 hrs ago0xee500c146927e0fccb1be04064288653b7b9ba06 IN  0x354bc1cfe9959b96bed409859a726263c6c56c810 BNB0.00164624
0x494856b6b3f4d940b80e9b3d82ed7e150ce8d9a2277a30d4c8d5f1361d33749eSwap Exact Token...114452712021-08-13 13:48:5841 days 17 hrs ago0xee500c146927e0fccb1be04064288653b7b9ba06 IN  0x354bc1cfe9959b96bed409859a726263c6c56c810 BNB0.00155775
0x7c3890c60ca169a2b47bece97a83cf57c74d33ee3c17fb6b4a80b2c114d3b80bSwap Exact Token...114385092021-08-13 8:10:5241 days 23 hrs ago0xee500c146927e0fccb1be04064288653b7b9ba06 IN  0x354bc1cfe9959b96bed409859a726263c6c56c810 BNB0.00023646
0xa916b65807891c5a4ffc045c20f21efdcd83cd55f2710447c32b50de4eea4160Swap Exact Token...114385092021-08-13 8:10:5241 days 23 hrs ago0xee500c146927e0fccb1be04064288653b7b9ba06 IN  0x354bc1cfe9959b96bed409859a726263c6c56c810 BNB0.00024026
0xab071ad1f7d1e1d2c255de531a059ada0bf48cec21d6a68c1e00fe5d933c07c2Swap Exact Token...114385092021-08-13 8:10:5241 days 23 hrs ago0xee500c146927e0fccb1be04064288653b7b9ba06 IN  0x354bc1cfe9959b96bed409859a726263c6c56c810 BNB0.00024394
0xb0956f5b07bbccc7a0d3900698da17cabdd11e08a14a0c1d00e926a9f7c4296aSwap Exact Token...114385092021-08-13 8:10:5241 days 23 hrs ago0xee500c146927e0fccb1be04064288653b7b9ba06 IN  0x354bc1cfe9959b96bed409859a726263c6c56c810 BNB0.00023646
0xecca08421fc626a4410cd48c48c866913d12d2ab7f601171908b10282af2cc62Add Liquidity111609742021-08-03 15:47:1751 days 15 hrs ago0xaa50da3bd10d140536dd96136a4781274c09561b IN  0x354bc1cfe9959b96bed409859a726263c6c56c810 BNB0.00156901
0xa4743459f57ae6e8f2d459f3c6aac4944b2af8675bc35376333ac4da2c041d8cAdd Liquidity111609542021-08-03 15:46:1751 days 15 hrs ago0xaa50da3bd10d140536dd96136a4781274c09561b IN  0x354bc1cfe9959b96bed409859a726263c6c56c810 BNB0.00171465
0xca3c56b7c180cc26e57dfaed2ad1f69330b2a0c2418b60cee2b0f2cfdc5e5326Swap Exact ETH F...109813722021-07-28 9:42:5557 days 21 hrs ago0x08e3befef131a1c1526bc8f81ab209099a9c0b4a IN  0x354bc1cfe9959b96bed409859a726263c6c56c810.00001 BNB0.0021655
0x3002311c0f220748086e67d8814b096a908bc9ae505b654f90ab318d4fdf0605Add Liquidity109807802021-07-28 9:13:1657 days 22 hrs ago0xca6a2d72869f69b0086105b2e8242463d4fe70af IN  0x354bc1cfe9959b96bed409859a726263c6c56c810 BNB0.00174067
[ Download CSV Export 
Latest 25 internal transaction
Parent Txn Hash Block From To Value
0x8d6333f9b5d6ee611ccbb00e297d2ca7f8c1e771026d8e51323edf7d54ab03ba125820902021-09-22 8:09:141 day 23 hrs ago 0x354bc1cfe9959b96bed409859a726263c6c56c81 0x91c10f1d88fc166dd1c062a09591c710cdc5cefc0 BNB
0x8d6333f9b5d6ee611ccbb00e297d2ca7f8c1e771026d8e51323edf7d54ab03ba125820902021-09-22 8:09:141 day 23 hrs ago 0x354bc1cfe9959b96bed409859a726263c6c56c81 0x1138ebb3101f557b28326a28b6f192c7fecc95f70 BNB
0x8d6333f9b5d6ee611ccbb00e297d2ca7f8c1e771026d8e51323edf7d54ab03ba125820902021-09-22 8:09:141 day 23 hrs ago 0x354bc1cfe9959b96bed409859a726263c6c56c81 0x618549d304828c77dcb590d02e3641b03e6f41760 BNB
0x8d6333f9b5d6ee611ccbb00e297d2ca7f8c1e771026d8e51323edf7d54ab03ba125820902021-09-22 8:09:141 day 23 hrs ago 0x354bc1cfe9959b96bed409859a726263c6c56c81 0x91c10f1d88fc166dd1c062a09591c710cdc5cefc0 BNB
0x8d6333f9b5d6ee611ccbb00e297d2ca7f8c1e771026d8e51323edf7d54ab03ba125820902021-09-22 8:09:141 day 23 hrs ago 0x354bc1cfe9959b96bed409859a726263c6c56c81 0x5b7592997ef6dc590cb104147e28b174923f72de0 BNB
0x13c3c321ebee188883be3e8de18d60261c255bddca70e442bc38aab1af3ac4e1125819632021-09-22 8:02:531 day 23 hrs ago 0x354bc1cfe9959b96bed409859a726263c6c56c81 0x10eeefd2447cc1eb15320e047ff3139c0a95f3d30 BNB
0x13c3c321ebee188883be3e8de18d60261c255bddca70e442bc38aab1af3ac4e1125819632021-09-22 8:02:531 day 23 hrs ago 0x354bc1cfe9959b96bed409859a726263c6c56c81 0x4a291477c8901672bca0e4d2bf391587276a4a370 BNB
0x13c3c321ebee188883be3e8de18d60261c255bddca70e442bc38aab1af3ac4e1125819632021-09-22 8:02:531 day 23 hrs ago 0x354bc1cfe9959b96bed409859a726263c6c56c81 0x618549d304828c77dcb590d02e3641b03e6f41760 BNB
0x13c3c321ebee188883be3e8de18d60261c255bddca70e442bc38aab1af3ac4e1125819632021-09-22 8:02:531 day 23 hrs ago 0x354bc1cfe9959b96bed409859a726263c6c56c81 0x10eeefd2447cc1eb15320e047ff3139c0a95f3d30 BNB
0x13c3c321ebee188883be3e8de18d60261c255bddca70e442bc38aab1af3ac4e1125819632021-09-22 8:02:531 day 23 hrs ago 0x354bc1cfe9959b96bed409859a726263c6c56c81 0x5b7592997ef6dc590cb104147e28b174923f72de0 BNB
0x2339e6b6fff8879c7e06220daf10dcfb91ffb969dc9a201d8b9f84e395dbd1fb125816542021-09-22 7:47:261 day 23 hrs ago 0x354bc1cfe9959b96bed409859a726263c6c56c81 0x91c10f1d88fc166dd1c062a09591c710cdc5cefc0 BNB
0x2339e6b6fff8879c7e06220daf10dcfb91ffb969dc9a201d8b9f84e395dbd1fb125816542021-09-22 7:47:261 day 23 hrs ago 0x354bc1cfe9959b96bed409859a726263c6c56c81 0x1138ebb3101f557b28326a28b6f192c7fecc95f70 BNB
0x2339e6b6fff8879c7e06220daf10dcfb91ffb969dc9a201d8b9f84e395dbd1fb125816542021-09-22 7:47:261 day 23 hrs ago 0x354bc1cfe9959b96bed409859a726263c6c56c81 0x618549d304828c77dcb590d02e3641b03e6f41760 BNB
0x2339e6b6fff8879c7e06220daf10dcfb91ffb969dc9a201d8b9f84e395dbd1fb125816542021-09-22 7:47:261 day 23 hrs ago 0x354bc1cfe9959b96bed409859a726263c6c56c81 0x91c10f1d88fc166dd1c062a09591c710cdc5cefc0 BNB
0x2339e6b6fff8879c7e06220daf10dcfb91ffb969dc9a201d8b9f84e395dbd1fb125816542021-09-22 7:47:261 day 23 hrs ago 0x354bc1cfe9959b96bed409859a726263c6c56c81 0x5b7592997ef6dc590cb104147e28b174923f72de0 BNB
0x22883a716647be0a315eceb655ccaed558a265970675148801c3f50058ad1946122116882021-09-09 8:47:1914 days 22 hrs ago 0x354bc1cfe9959b96bed409859a726263c6c56c81 0x66280f48668433c9600c426901cee01762eae4070 BNB
0x22883a716647be0a315eceb655ccaed558a265970675148801c3f50058ad1946122116882021-09-09 8:47:1914 days 22 hrs ago 0x354bc1cfe9959b96bed409859a726263c6c56c81 0xab70ec86a21c2bc15a93492e59fa7d646e581ef70 BNB
0x22883a716647be0a315eceb655ccaed558a265970675148801c3f50058ad1946122116882021-09-09 8:47:1914 days 22 hrs ago 0x354bc1cfe9959b96bed409859a726263c6c56c81 0xab70ec86a21c2bc15a93492e59fa7d646e581ef71 BNB
0x22883a716647be0a315eceb655ccaed558a265970675148801c3f50058ad1946122116882021-09-09 8:47:1914 days 22 hrs ago 0x354bc1cfe9959b96bed409859a726263c6c56c81 0x66280f48668433c9600c426901cee01762eae4070 BNB
0x5bd9755e1ebd73b4d1b779a5070e5ae759139a5a1a7ffc9ffe3e2fc06b85d779121265682021-09-06 9:42:4517 days 21 hrs ago 0x354bc1cfe9959b96bed409859a726263c6c56c81 0x04c41915cf17a8cfc3a923b29fbb740c2806fd8e0 BNB
0x5bd9755e1ebd73b4d1b779a5070e5ae759139a5a1a7ffc9ffe3e2fc06b85d779121265682021-09-06 9:42:4517 days 21 hrs ago 0x354bc1cfe9959b96bed409859a726263c6c56c81 0xe694f6c1ebd66b9a7defa601926c5485cbcfef120 BNB
0x5bd9755e1ebd73b4d1b779a5070e5ae759139a5a1a7ffc9ffe3e2fc06b85d779121265682021-09-06 9:42:4517 days 21 hrs ago 0x354bc1cfe9959b96bed409859a726263c6c56c81 0x618549d304828c77dcb590d02e3641b03e6f41760 BNB
0x5bd9755e1ebd73b4d1b779a5070e5ae759139a5a1a7ffc9ffe3e2fc06b85d779121265682021-09-06 9:42:4517 days 21 hrs ago 0x354bc1cfe9959b96bed409859a726263c6c56c81 0x04c41915cf17a8cfc3a923b29fbb740c2806fd8e0 BNB
0x5bd9755e1ebd73b4d1b779a5070e5ae759139a5a1a7ffc9ffe3e2fc06b85d779121265682021-09-06 9:42:4517 days 21 hrs ago 0x354bc1cfe9959b96bed409859a726263c6c56c81 0x5b7592997ef6dc590cb104147e28b174923f72de0 BNB
0x5bd9755e1ebd73b4d1b779a5070e5ae759139a5a1a7ffc9ffe3e2fc06b85d779121265682021-09-06 9:42:4517 days 21 hrs ago 0x354bc1cfe9959b96bed409859a726263c6c56c81 0x5b7592997ef6dc590cb104147e28b174923f72de0 BNB
[ Download CSV Export 
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
GravisRouter

Compiler Version
v0.6.6+commit.6c089d02

Optimization Enabled:
Yes with 999999 runs

Other Settings:
istanbul EvmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at BscScan.com on 2021-05-04
*/

// File: contracts/interfaces/IGravisFactory.sol

pragma solidity >=0.5.0;

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

    function feeTo() external view returns (address);
    function feeToSetter() external view returns (address);

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

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

    function setFeeTo(address) external;
    function setFeeToSetter(address) external;
}

// File: @uniswap/lib/contracts/libraries/TransferHelper.sol

pragma solidity >=0.6.0;

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

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

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

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

// File: contracts/interfaces/IGravisRouter01.sol

pragma solidity =0.6.6;

interface IGravisRouter01 {
    function factory() external pure returns (address);
    function WETH() external pure returns (address);

    function addLiquidity(
        address tokenA,
        address tokenB,
        uint amountADesired,
        uint amountBDesired,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline
    ) external returns (uint amountA, uint amountB, uint liquidity);
    function addLiquidityETH(
        address token,
        uint amountTokenDesired,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external payable returns (uint amountToken, uint amountETH, uint liquidity);
    function removeLiquidity(
        address tokenA,
        address tokenB,
        uint liquidity,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline
    ) external returns (uint amountA, uint amountB);
    function removeLiquidityETH(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external returns (uint amountToken, uint amountETH);
    function removeLiquidityWithPermit(
        address tokenA,
        address tokenB,
        uint liquidity,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external returns (uint amountA, uint amountB);
    function removeLiquidityETHWithPermit(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external returns (uint amountToken, uint amountETH);
    function swapExactTokensForTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external returns (uint[] memory amounts);
    function swapTokensForExactTokens(
        uint amountOut,
        uint amountInMax,
        address[] calldata path,
        address to,
        uint deadline
    ) external returns (uint[] memory amounts);
    function swapExactETHForTokens(uint amountOutMin, address[] calldata path, address to, uint deadline)
        external
        payable
        returns (uint[] memory amounts);
    function swapTokensForExactETH(uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline)
        external
        returns (uint[] memory amounts);
    function swapExactTokensForETH(uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline)
        external
        returns (uint[] memory amounts);
    function swapETHForExactTokens(uint amountOut, address[] calldata path, address to, uint deadline)
        external
        payable
        returns (uint[] memory amounts);

    function quote(uint amountA, uint reserveA, uint reserveB) external pure returns (uint amountB);
    function getAmountOut(uint amountIn, uint reserveIn, uint reserveOut) external pure returns (uint amountOut);
    function getAmountIn(uint amountOut, uint reserveIn, uint reserveOut) external pure returns (uint amountIn);
    function getAmountsOut(uint amountIn, address[] calldata path) external view returns (uint[] memory amounts);
    function getAmountsIn(uint amountOut, address[] calldata path) external view returns (uint[] memory amounts);
}

// File: contracts/interfaces/IGravisRouter02.sol

pragma solidity =0.6.6;


interface IGravisRouter02 is IGravisRouter01 {
    function removeLiquidityETHSupportingFeeOnTransferTokens(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external returns (uint amountETH);
    function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external returns (uint amountETH);

    function swapExactTokensForTokensSupportingFeeOnTransferTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external;
    function swapExactETHForTokensSupportingFeeOnTransferTokens(
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external payable;
    function swapExactTokensForETHSupportingFeeOnTransferTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external;
}

// File: contracts/interfaces/IGravisPair.sol

pragma solidity >=0.5.0;

interface IGravisPair {
    event Approval(address indexed owner, address indexed spender, uint value);
    event Transfer(address indexed from, address indexed to, uint value);

    function name() external pure returns (string memory);
    function symbol() external pure returns (string memory);
    function decimals() external pure returns (uint8);
    function totalSupply() external view returns (uint);
    function balanceOf(address owner) external view returns (uint);
    function allowance(address owner, address spender) external view returns (uint);

    function approve(address spender, uint value) external returns (bool);
    function transfer(address to, uint value) external returns (bool);
    function transferFrom(address from, address to, uint value) external returns (bool);

    function DOMAIN_SEPARATOR() external view returns (bytes32);
    function PERMIT_TYPEHASH() external pure returns (bytes32);
    function nonces(address owner) external view returns (uint);

    function permit(address owner, address spender, uint value, uint deadline, uint8 v, bytes32 r, bytes32 s) external;

    event Mint(address indexed sender, uint amount0, uint amount1);
    event Burn(address indexed sender, uint amount0, uint amount1, address indexed to);
    event Swap(
        address indexed sender,
        uint amount0In,
        uint amount1In,
        uint amount0Out,
        uint amount1Out,
        address indexed to
    );
    event Sync(uint112 reserve0, uint112 reserve1);

    function MINIMUM_LIQUIDITY() external pure returns (uint);
    function factory() external view returns (address);
    function token0() external view returns (address);
    function token1() external view returns (address);
    function getReserves() external view returns (uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast);
    function price0CumulativeLast() external view returns (uint);
    function price1CumulativeLast() external view returns (uint);
    function kLast() external view returns (uint);

    function mint(address to) external returns (uint liquidity);
    function burn(address to) external returns (uint amount0, uint amount1);
    function swap(uint amount0Out, uint amount1Out, address to, bytes calldata data) external;
    function skim(address to) external;
    function sync() external;

    function initialize(address, address) external;
}

// File: contracts/libraries/SafeMath.sol

pragma solidity =0.6.6;

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

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

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

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

// File: contracts/libraries/GravisLibrary.sol

pragma solidity >=0.5.0;



library GravisLibrary {
    using SafeMath for uint;

    // returns sorted token addresses, used to handle return values from pairs sorted in this order
    function sortTokens(address tokenA, address tokenB) internal pure returns (address token0, address token1) {
        require(tokenA != tokenB, 'GravisLibrary: IDENTICAL_ADDRESSES');
        (token0, token1) = tokenA < tokenB ? (tokenA, tokenB) : (tokenB, tokenA);
        require(token0 != address(0), 'GravisLibrary: ZERO_ADDRESS');
    }

    // calculates the CREATE2 address for a pair without making any external calls
    function pairFor(address factory, address tokenA, address tokenB) internal pure returns (address pair) {
        (address token0, address token1) = sortTokens(tokenA, tokenB);
        pair = address(uint(keccak256(abi.encodePacked(
                hex'ff',
                factory,
                keccak256(abi.encodePacked(token0, token1)),
                hex'ab974afc2f3181c75852feb42f2d73635ceccfa465d3cc3dd694960004e65fb3' // init code hash
            ))));
    }

    // fetches and sorts the reserves for a pair
    function getReserves(address factory, address tokenA, address tokenB) internal view returns (uint reserveA, uint reserveB) {
        (address token0,) = sortTokens(tokenA, tokenB);
        pairFor(factory, tokenA, tokenB);
        (uint reserve0, uint reserve1,) = IGravisPair(pairFor(factory, tokenA, tokenB)).getReserves();
        (reserveA, reserveB) = tokenA == token0 ? (reserve0, reserve1) : (reserve1, reserve0);
    }

    // given some amount of an asset and pair reserves, returns an equivalent amount of the other asset
    function quote(uint amountA, uint reserveA, uint reserveB) internal pure returns (uint amountB) {
        require(amountA > 0, 'GravisLibrary: INSUFFICIENT_AMOUNT');
        require(reserveA > 0 && reserveB > 0, 'GravisLibrary: INSUFFICIENT_LIQUIDITY');
        amountB = amountA.mul(reserveB) / reserveA;
    }

    // given an input amount of an asset and pair reserves, returns the maximum output amount of the other asset
    function getAmountOut(uint amountIn, uint reserveIn, uint reserveOut) internal pure returns (uint amountOut) {
        require(amountIn > 0, 'GravisLibrary: INSUFFICIENT_INPUT_AMOUNT');
        require(reserveIn > 0 && reserveOut > 0, 'GravisLibrary: INSUFFICIENT_LIQUIDITY');
        uint amountInWithFee = amountIn.mul(9_975);
        uint numerator = amountInWithFee.mul(reserveOut);
        uint denominator = reserveIn.mul(10_000).add(amountInWithFee);
        amountOut = numerator / denominator;
    }

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

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

    // performs chained getAmountIn calculations on any number of pairs
    function getAmountsIn(address factory, uint amountOut, address[] memory path) internal view returns (uint[] memory amounts) {
        require(path.length >= 2, 'GravisLibrary: INVALID_PATH');
        amounts = new uint[](path.length);
        amounts[amounts.length - 1] = amountOut;
        for (uint i = path.length - 1; i > 0; i--) {
            (uint reserveIn, uint reserveOut) = getReserves(factory, path[i - 1], path[i]);
            amounts[i - 1] = getAmountIn(amounts[i], reserveIn, reserveOut);
        }
    }
}

// File: contracts/interfaces/IERC20.sol

pragma solidity >=0.5.0;

interface IERC20 {
    event Approval(address indexed owner, address indexed spender, uint value);
    event Transfer(address indexed from, address indexed to, uint value);

    function name() external view returns (string memory);
    function symbol() external view returns (string memory);
    function decimals() external view returns (uint8);
    function totalSupply() external view returns (uint);
    function balanceOf(address owner) external view returns (uint);
    function allowance(address owner, address spender) external view returns (uint);

    function approve(address spender, uint value) external returns (bool);
    function transfer(address to, uint value) external returns (bool);
    function transferFrom(address from, address to, uint value) external returns (bool);
}

// File: contracts/interfaces/IWETH.sol

pragma solidity >=0.5.0;

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

// File: contracts/GravisRouter.sol

pragma solidity =0.6.6;









contract GravisRouter is IGravisRouter02 {
    using SafeMath for uint;

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

    modifier ensure(uint deadline) {
        require(deadline >= block.timestamp, 'GravisRouter: EXPIRED');
        _;
    }

    constructor(address _factory, address _WETH) public {
        factory = _factory;
        WETH = _WETH;
    }

    receive() external payable {
        assert(msg.sender == WETH); // only accept ETH via fallback from the WETH contract
    }

    // **** ADD LIQUIDITY ****
    function _addLiquidity(
        address tokenA,
        address tokenB,
        uint amountADesired,
        uint amountBDesired,
        uint amountAMin,
        uint amountBMin
    ) internal virtual returns (uint amountA, uint amountB) {
        // create the pair if it doesn't exist yet
        if (IGravisFactory(factory).getPair(tokenA, tokenB) == address(0)) {
            IGravisFactory(factory).createPair(tokenA, tokenB);
        }
        (uint reserveA, uint reserveB) = GravisLibrary.getReserves(factory, tokenA, tokenB);
        if (reserveA == 0 && reserveB == 0) {
            (amountA, amountB) = (amountADesired, amountBDesired);
        } else {
            uint amountBOptimal = GravisLibrary.quote(amountADesired, reserveA, reserveB);
            if (amountBOptimal <= amountBDesired) {
                require(amountBOptimal >= amountBMin, 'GravisRouter: INSUFFICIENT_B_AMOUNT');
                (amountA, amountB) = (amountADesired, amountBOptimal);
            } else {
                uint amountAOptimal = GravisLibrary.quote(amountBDesired, reserveB, reserveA);
                assert(amountAOptimal <= amountADesired);
                require(amountAOptimal >= amountAMin, 'GravisRouter: INSUFFICIENT_A_AMOUNT');
                (amountA, amountB) = (amountAOptimal, amountBDesired);
            }
        }
    }
    function addLiquidity(
        address tokenA,
        address tokenB,
        uint amountADesired,
        uint amountBDesired,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline
    ) external virtual override ensure(deadline) returns (uint amountA, uint amountB, uint liquidity) {
        (amountA, amountB) = _addLiquidity(tokenA, tokenB, amountADesired, amountBDesired, amountAMin, amountBMin);
        address pair = GravisLibrary.pairFor(factory, tokenA, tokenB);
        TransferHelper.safeTransferFrom(tokenA, msg.sender, pair, amountA);
        TransferHelper.safeTransferFrom(tokenB, msg.sender, pair, amountB);
        liquidity = IGravisPair(pair).mint(to);
    }
    function addLiquidityETH(
        address token,
        uint amountTokenDesired,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external virtual override payable ensure(deadline) returns (uint amountToken, uint amountETH, uint liquidity) {
        (amountToken, amountETH) = _addLiquidity(
            token,
            WETH,
            amountTokenDesired,
            msg.value,
            amountTokenMin,
            amountETHMin
        );
        address pair = GravisLibrary.pairFor(factory, token, WETH);
        TransferHelper.safeTransferFrom(token, msg.sender, pair, amountToken);
        IWETH(WETH).deposit{value: amountETH}();
        assert(IWETH(WETH).transfer(pair, amountETH));
        liquidity = IGravisPair(pair).mint(to);
        // refund dust eth, if any
        if (msg.value > amountETH) TransferHelper.safeTransferETH(msg.sender, msg.value - amountETH);
    }

    // **** REMOVE LIQUIDITY ****
    function removeLiquidity(
        address tokenA,
        address tokenB,
        uint liquidity,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline
    ) public virtual override ensure(deadline) returns (uint amountA, uint amountB) {
        address pair = GravisLibrary.pairFor(factory, tokenA, tokenB);
        IGravisPair(pair).transferFrom(msg.sender, pair, liquidity); // send liquidity to pair
        (uint amount0, uint amount1) = IGravisPair(pair).burn(to);
        (address token0,) = GravisLibrary.sortTokens(tokenA, tokenB);
        (amountA, amountB) = tokenA == token0 ? (amount0, amount1) : (amount1, amount0);
        require(amountA >= amountAMin, 'GravisRouter: INSUFFICIENT_A_AMOUNT');
        require(amountB >= amountBMin, 'GravisRouter: INSUFFICIENT_B_AMOUNT');
    }
    function removeLiquidityETH(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) public virtual override ensure(deadline) returns (uint amountToken, uint amountETH) {
        (amountToken, amountETH) = removeLiquidity(
            token,
            WETH,
            liquidity,
            amountTokenMin,
            amountETHMin,
            address(this),
            deadline
        );
        TransferHelper.safeTransfer(token, to, amountToken);
        IWETH(WETH).withdraw(amountETH);
        TransferHelper.safeTransferETH(to, amountETH);
    }
    function removeLiquidityWithPermit(
        address tokenA,
        address tokenB,
        uint liquidity,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external virtual override returns (uint amountA, uint amountB) {
        address pair = GravisLibrary.pairFor(factory, tokenA, tokenB);
        uint value = approveMax ? uint(-1) : liquidity;
        IGravisPair(pair).permit(msg.sender, address(this), value, deadline, v, r, s);
        (amountA, amountB) = removeLiquidity(tokenA, tokenB, liquidity, amountAMin, amountBMin, to, deadline);
    }
    function removeLiquidityETHWithPermit(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external virtual override returns (uint amountToken, uint amountETH) {
        address pair = GravisLibrary.pairFor(factory, token, WETH);
        uint value = approveMax ? uint(-1) : liquidity;
        IGravisPair(pair).permit(msg.sender, address(this), value, deadline, v, r, s);
        (amountToken, amountETH) = removeLiquidityETH(token, liquidity, amountTokenMin, amountETHMin, to, deadline);
    }

    // **** REMOVE LIQUIDITY (supporting fee-on-transfer tokens) ****
    function removeLiquidityETHSupportingFeeOnTransferTokens(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) public virtual override ensure(deadline) returns (uint amountETH) {
        (, amountETH) = removeLiquidity(
            token,
            WETH,
            liquidity,
            amountTokenMin,
            amountETHMin,
            address(this),
            deadline
        );
        TransferHelper.safeTransfer(token, to, IERC20(token).balanceOf(address(this)));
        IWETH(WETH).withdraw(amountETH);
        TransferHelper.safeTransferETH(to, amountETH);
    }
    function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external virtual override returns (uint amountETH) {
        address pair = GravisLibrary.pairFor(factory, token, WETH);
        uint value = approveMax ? uint(-1) : liquidity;
        IGravisPair(pair).permit(msg.sender, address(this), value, deadline, v, r, s);
        amountETH = removeLiquidityETHSupportingFeeOnTransferTokens(
            token, liquidity, amountTokenMin, amountETHMin, to, deadline
        );
    }

    // **** SWAP ****
    // requires the initial amount to have already been sent to the first pair
    function _swap(uint[] memory amounts, address[] memory path, address _to) internal virtual {
        for (uint i; i < path.length - 1; i++) {
            (address input, address output) = (path[i], path[i + 1]);
            (address token0,) = GravisLibrary.sortTokens(input, output);
            uint amountOut = amounts[i + 1];
            (uint amount0Out, uint amount1Out) = input == token0 ? (uint(0), amountOut) : (amountOut, uint(0));
            address to = i < path.length - 2 ? GravisLibrary.pairFor(factory, output, path[i + 2]) : _to;
            IGravisPair(GravisLibrary.pairFor(factory, input, output)).swap(
                amount0Out, amount1Out, to, new bytes(0)
            );
        }
    }
    function swapExactTokensForTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external virtual override ensure(deadline) returns (uint[] memory amounts) {
        amounts = GravisLibrary.getAmountsOut(factory, amountIn, path);
        require(amounts[amounts.length - 1] >= amountOutMin, 'GravisRouter: INSUFFICIENT_OUTPUT_AMOUNT');
        TransferHelper.safeTransferFrom(
            path[0], msg.sender, GravisLibrary.pairFor(factory, path[0], path[1]), amounts[0]
        );
        _swap(amounts, path, to);
    }
    function swapTokensForExactTokens(
        uint amountOut,
        uint amountInMax,
        address[] calldata path,
        address to,
        uint deadline
    ) external virtual override ensure(deadline) returns (uint[] memory amounts) {
        amounts = GravisLibrary.getAmountsIn(factory, amountOut, path);
        require(amounts[0] <= amountInMax, 'GravisRouter: EXCESSIVE_INPUT_AMOUNT');
        TransferHelper.safeTransferFrom(
            path[0], msg.sender, GravisLibrary.pairFor(factory, path[0], path[1]), amounts[0]
        );
        _swap(amounts, path, to);
    }
    function swapExactETHForTokens(uint amountOutMin, address[] calldata path, address to, uint deadline)
        external
        virtual
        override
        payable
        ensure(deadline)
        returns (uint[] memory amounts)
    {
        require(path[0] == WETH, 'GravisRouter: INVALID_PATH');
        amounts = GravisLibrary.getAmountsOut(factory, msg.value, path);
        require(amounts[amounts.length - 1] >= amountOutMin, 'GravisRouter: INSUFFICIENT_OUTPUT_AMOUNT');
        IWETH(WETH).deposit{value: amounts[0]}();
        assert(IWETH(WETH).transfer(GravisLibrary.pairFor(factory, path[0], path[1]), amounts[0]));
        _swap(amounts, path, to);
    }
    function swapTokensForExactETH(uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline)
        external
        virtual
        override
        ensure(deadline)
        returns (uint[] memory amounts)
    {
        require(path[path.length - 1] == WETH, 'GravisRouter: INVALID_PATH');
        amounts = GravisLibrary.getAmountsIn(factory, amountOut, path);
        require(amounts[0] <= amountInMax, 'GravisRouter: EXCESSIVE_INPUT_AMOUNT');
        TransferHelper.safeTransferFrom(
            path[0], msg.sender, GravisLibrary.pairFor(factory, path[0], path[1]), amounts[0]
        );
        _swap(amounts, path, address(this));
        IWETH(WETH).withdraw(amounts[amounts.length - 1]);
        TransferHelper.safeTransferETH(to, amounts[amounts.length - 1]);
    }
    function swapExactTokensForETH(uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline)
        external
        virtual
        override
        ensure(deadline)
        returns (uint[] memory amounts)
    {
        require(path[path.length - 1] == WETH, 'GravisRouter: INVALID_PATH');
        amounts = GravisLibrary.getAmountsOut(factory, amountIn, path);
        require(amounts[amounts.length - 1] >= amountOutMin, 'GravisRouter: INSUFFICIENT_OUTPUT_AMOUNT');
        TransferHelper.safeTransferFrom(
            path[0], msg.sender, GravisLibrary.pairFor(factory, path[0], path[1]), amounts[0]
        );
        _swap(amounts, path, address(this));
        IWETH(WETH).withdraw(amounts[amounts.length - 1]);
        TransferHelper.safeTransferETH(to, amounts[amounts.length - 1]);
    }
    function swapETHForExactTokens(uint amountOut, address[] calldata path, address to, uint deadline)
        external
        virtual
        override
        payable
        ensure(deadline)
        returns (uint[] memory amounts)
    {
        require(path[0] == WETH, 'GravisRouter: INVALID_PATH');
        amounts = GravisLibrary.getAmountsIn(factory, amountOut, path);
        require(amounts[0] <= msg.value, 'GravisRouter: EXCESSIVE_INPUT_AMOUNT');
        IWETH(WETH).deposit{value: amounts[0]}();
        assert(IWETH(WETH).transfer(GravisLibrary.pairFor(factory, path[0], path[1]), amounts[0]));
        _swap(amounts, path, to);
        // refund dust eth, if any
        if (msg.value > amounts[0]) TransferHelper.safeTransferETH(msg.sender, msg.value - amounts[0]);
    }

    // **** SWAP (supporting fee-on-transfer tokens) ****
    // requires the initial amount to have already been sent to the first pair
    function _swapSupportingFeeOnTransferTokens(address[] memory path, address _to) internal virtual {
        for (uint i; i < path.length - 1; i++) {
            (address input, address output) = (path[i], path[i + 1]);
            (address token0,) = GravisLibrary.sortTokens(input, output);
            IGravisPair pair = IGravisPair(GravisLibrary.pairFor(factory, input, output));
            uint amountInput;
            uint amountOutput;
            { // scope to avoid stack too deep errors
            (uint reserve0, uint reserve1,) = pair.getReserves();
            (uint reserveInput, uint reserveOutput) = input == token0 ? (reserve0, reserve1) : (reserve1, reserve0);
            amountInput = IERC20(input).balanceOf(address(pair)).sub(reserveInput);
            amountOutput = GravisLibrary.getAmountOut(amountInput, reserveInput, reserveOutput);
            }
            (uint amount0Out, uint amount1Out) = input == token0 ? (uint(0), amountOutput) : (amountOutput, uint(0));
            address to = i < path.length - 2 ? GravisLibrary.pairFor(factory, output, path[i + 2]) : _to;
            pair.swap(amount0Out, amount1Out, to, new bytes(0));
        }
    }
    function swapExactTokensForTokensSupportingFeeOnTransferTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external virtual override ensure(deadline) {
        TransferHelper.safeTransferFrom(
            path[0], msg.sender, GravisLibrary.pairFor(factory, path[0], path[1]), amountIn
        );
        uint balanceBefore = IERC20(path[path.length - 1]).balanceOf(to);
        _swapSupportingFeeOnTransferTokens(path, to);
        require(
            IERC20(path[path.length - 1]).balanceOf(to).sub(balanceBefore) >= amountOutMin,
            'GravisRouter: INSUFFICIENT_OUTPUT_AMOUNT'
        );
    }
    function swapExactETHForTokensSupportingFeeOnTransferTokens(
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    )
        external
        virtual
        override
        payable
        ensure(deadline)
    {
        require(path[0] == WETH, 'GravisRouter: INVALID_PATH');
        uint amountIn = msg.value;
        IWETH(WETH).deposit{value: amountIn}();
        assert(IWETH(WETH).transfer(GravisLibrary.pairFor(factory, path[0], path[1]), amountIn));
        uint balanceBefore = IERC20(path[path.length - 1]).balanceOf(to);
        _swapSupportingFeeOnTransferTokens(path, to);
        require(
            IERC20(path[path.length - 1]).balanceOf(to).sub(balanceBefore) >= amountOutMin,
            'GravisRouter: INSUFFICIENT_OUTPUT_AMOUNT'
        );
    }
    function swapExactTokensForETHSupportingFeeOnTransferTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    )
        external
        virtual
        override
        ensure(deadline)
    {
        require(path[path.length - 1] == WETH, 'GravisRouter: INVALID_PATH');
        TransferHelper.safeTransferFrom(
            path[0], msg.sender, GravisLibrary.pairFor(factory, path[0], path[1]), amountIn
        );
        _swapSupportingFeeOnTransferTokens(path, address(this));
        uint amountOut = IERC20(WETH).balanceOf(address(this));
        require(amountOut >= amountOutMin, 'GravisRouter: INSUFFICIENT_OUTPUT_AMOUNT');
        IWETH(WETH).withdraw(amountOut);
        TransferHelper.safeTransferETH(to, amountOut);
    }

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

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

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

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

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

Contract ABI

[{"inputs":[{"internalType":"address","name":"_factory","type":"address"},{"internalType":"address","name":"_WETH","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"WETH","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"},{"internalType":"uint256","name":"amountADesired","type":"uint256"},{"internalType":"uint256","name":"amountBDesired","type":"uint256"},{"internalType":"uint256","name":"amountAMin","type":"uint256"},{"internalType":"uint256","name":"amountBMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"addLiquidity","outputs":[{"internalType":"uint256","name":"amountA","type":"uint256"},{"internalType":"uint256","name":"amountB","type":"uint256"},{"internalType":"uint256","name":"liquidity","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amountTokenDesired","type":"uint256"},{"internalType":"uint256","name":"amountTokenMin","type":"uint256"},{"internalType":"uint256","name":"amountETHMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"addLiquidityETH","outputs":[{"internalType":"uint256","name":"amountToken","type":"uint256"},{"internalType":"uint256","name":"amountETH","type":"uint256"},{"internalType":"uint256","name":"liquidity","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"factory","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"uint256","name":"reserveIn","type":"uint256"},{"internalType":"uint256","name":"reserveOut","type":"uint256"}],"name":"getAmountIn","outputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"reserveIn","type":"uint256"},{"internalType":"uint256","name":"reserveOut","type":"uint256"}],"name":"getAmountOut","outputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"}],"name":"getAmountsIn","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"}],"name":"getAmountsOut","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountA","type":"uint256"},{"internalType":"uint256","name":"reserveA","type":"uint256"},{"internalType":"uint256","name":"reserveB","type":"uint256"}],"name":"quote","outputs":[{"internalType":"uint256","name":"amountB","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"amountAMin","type":"uint256"},{"internalType":"uint256","name":"amountBMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"removeLiquidity","outputs":[{"internalType":"uint256","name":"amountA","type":"uint256"},{"internalType":"uint256","name":"amountB","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"amountTokenMin","type":"uint256"},{"internalType":"uint256","name":"amountETHMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"removeLiquidityETH","outputs":[{"internalType":"uint256","name":"amountToken","type":"uint256"},{"internalType":"uint256","name":"amountETH","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"amountTokenMin","type":"uint256"},{"internalType":"uint256","name":"amountETHMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"removeLiquidityETHSupportingFeeOnTransferTokens","outputs":[{"internalType":"uint256","name":"amountETH","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"amountTokenMin","type":"uint256"},{"internalType":"uint256","name":"amountETHMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"bool","name":"approveMax","type":"bool"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"removeLiquidityETHWithPermit","outputs":[{"internalType":"uint256","name":"amountToken","type":"uint256"},{"internalType":"uint256","name":"amountETH","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"amountTokenMin","type":"uint256"},{"internalType":"uint256","name":"amountETHMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"bool","name":"approveMax","type":"bool"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"removeLiquidityETHWithPermitSupportingFeeOnTransferTokens","outputs":[{"internalType":"uint256","name":"amountETH","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"amountAMin","type":"uint256"},{"internalType":"uint256","name":"amountBMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"bool","name":"approveMax","type":"bool"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"removeLiquidityWithPermit","outputs":[{"internalType":"uint256","name":"amountA","type":"uint256"},{"internalType":"uint256","name":"amountB","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapETHForExactTokens","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactETHForTokens","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactETHForTokensSupportingFeeOnTransferTokens","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactTokensForETH","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactTokensForETHSupportingFeeOnTransferTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactTokensForTokens","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactTokensForTokensSupportingFeeOnTransferTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"uint256","name":"amountInMax","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapTokensForExactETH","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"uint256","name":"amountInMax","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapTokensForExactTokens","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

60c06040523480156200001157600080fd5b506040516200572f3803806200572f833981810160405260408110156200003757600080fd5b5080516020909101516001600160601b0319606092831b8116608052911b1660a05260805160601c60a05160601c6155a862000187600039806101ac5280610e5d5280610e985280610fd5528061129852806116f252806118d65280611e1e5280611fa252806120725280612179528061232c52806123c15280612673528061271a52806127ef52806128f452806129dc5280612a5d52806130ec5280613422528061347852806134ac528061352d528061374752806138f7528061398c5250806110c752806111c5528061136b52806113a4528061154f52806117e452806118b45280611aa1528061225f528061240052806125a95280612a9c5280612ddf5280613071528061309a52806130ca52806132a75280613456528061382d52806139cb528061444a528061448d52806147ed52806149ce5280614f49528061502a52806150aa52506155a86000f3fe60806040526004361061018f5760003560e01c80638803dbee116100d6578063c45a01551161007f578063e8e3370011610059578063e8e3370014610c71578063f305d71914610cfe578063fb3bdb4114610d51576101d5565b8063c45a015514610b25578063d06ca61f14610b3a578063ded9382a14610bf1576101d5565b8063af2979eb116100b0578063af2979eb146109c8578063b6f9de9514610a28578063baa2abde14610abb576101d5565b80638803dbee146108af578063ad5c464814610954578063ad615dec14610992576101d5565b80634a25d94a11610138578063791ac94711610112578063791ac947146107415780637ff36ab5146107e657806385f8c25914610879576101d5565b80634a25d94a146105775780635b0d59841461061c5780635c11d7951461069c576101d5565b80631f00ca74116101695780631f00ca74146103905780632195995c1461044757806338ed1739146104d2576101d5565b806302751cec146101da578063054d50d41461025357806318cbafe51461029b576101d5565b366101d5573373ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016146101d357fe5b005b600080fd5b3480156101e657600080fd5b5061023a600480360360c08110156101fd57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81358116916020810135916040820135916060810135916080820135169060a00135610de4565b6040805192835260208301919091528051918290030190f35b34801561025f57600080fd5b506102896004803603606081101561027657600080fd5b5080359060208101359060400135610f37565b60408051918252519081900360200190f35b3480156102a757600080fd5b50610340600480360360a08110156102be57600080fd5b8135916020810135918101906060810160408201356401000000008111156102e557600080fd5b8201836020820111156102f757600080fd5b8035906020019184602083028401116401000000008311171561031957600080fd5b919350915073ffffffffffffffffffffffffffffffffffffffff8135169060200135610f4c565b60408051602080825283518183015283519192839290830191858101910280838360005b8381101561037c578181015183820152602001610364565b505050509050019250505060405180910390f35b34801561039c57600080fd5b50610340600480360360408110156103b357600080fd5b813591908101906040810160208201356401000000008111156103d557600080fd5b8201836020820111156103e757600080fd5b8035906020019184602083028401116401000000008311171561040957600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550611364945050505050565b34801561045357600080fd5b5061023a600480360361016081101561046b57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135811691602081013582169160408201359160608101359160808201359160a08101359091169060c08101359060e081013515159060ff610100820135169061012081013590610140013561139a565b3480156104de57600080fd5b50610340600480360360a08110156104f557600080fd5b81359160208101359181019060608101604082013564010000000081111561051c57600080fd5b82018360208201111561052e57600080fd5b8035906020019184602083028401116401000000008311171561055057600080fd5b919350915073ffffffffffffffffffffffffffffffffffffffff81351690602001356114d8565b34801561058357600080fd5b50610340600480360360a081101561059a57600080fd5b8135916020810135918101906060810160408201356401000000008111156105c157600080fd5b8201836020820111156105d357600080fd5b803590602001918460208302840111640100000000831117156105f557600080fd5b919350915073ffffffffffffffffffffffffffffffffffffffff8135169060200135611669565b34801561062857600080fd5b50610289600480360361014081101561064057600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81358116916020810135916040820135916060810135916080820135169060a08101359060c081013515159060ff60e082013516906101008101359061012001356118ac565b3480156106a857600080fd5b506101d3600480360360a08110156106bf57600080fd5b8135916020810135918101906060810160408201356401000000008111156106e657600080fd5b8201836020820111156106f857600080fd5b8035906020019184602083028401116401000000008311171561071a57600080fd5b919350915073ffffffffffffffffffffffffffffffffffffffff81351690602001356119fe565b34801561074d57600080fd5b506101d3600480360360a081101561076457600080fd5b81359160208101359181019060608101604082013564010000000081111561078b57600080fd5b82018360208201111561079d57600080fd5b803590602001918460208302840111640100000000831117156107bf57600080fd5b919350915073ffffffffffffffffffffffffffffffffffffffff8135169060200135611d97565b610340600480360360808110156107fc57600080fd5b8135919081019060408101602082013564010000000081111561081e57600080fd5b82018360208201111561083057600080fd5b8035906020019184602083028401116401000000008311171561085257600080fd5b919350915073ffffffffffffffffffffffffffffffffffffffff8135169060200135612105565b34801561088557600080fd5b506102896004803603606081101561089c57600080fd5b5080359060208101359060400135612525565b3480156108bb57600080fd5b50610340600480360360a08110156108d257600080fd5b8135916020810135918101906060810160408201356401000000008111156108f957600080fd5b82018360208201111561090b57600080fd5b8035906020019184602083028401116401000000008311171561092d57600080fd5b919350915073ffffffffffffffffffffffffffffffffffffffff8135169060200135612532565b34801561096057600080fd5b50610969612671565b6040805173ffffffffffffffffffffffffffffffffffffffff9092168252519081900360200190f35b34801561099e57600080fd5b50610289600480360360608110156109b557600080fd5b5080359060208101359060400135612695565b3480156109d457600080fd5b50610289600480360360c08110156109eb57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81358116916020810135916040820135916060810135916080820135169060a001356126a2565b6101d360048036036080811015610a3e57600080fd5b81359190810190604081016020820135640100000000811115610a6057600080fd5b820183602082011115610a7257600080fd5b80359060200191846020830284011164010000000083111715610a9457600080fd5b919350915073ffffffffffffffffffffffffffffffffffffffff8135169060200135612882565b348015610ac757600080fd5b5061023a600480360360e0811015610ade57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135811691602081013582169160408201359160608101359160808201359160a08101359091169060c00135612d65565b348015610b3157600080fd5b5061096961306f565b348015610b4657600080fd5b5061034060048036036040811015610b5d57600080fd5b81359190810190604081016020820135640100000000811115610b7f57600080fd5b820183602082011115610b9157600080fd5b80359060200191846020830284011164010000000083111715610bb357600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550613093945050505050565b348015610bfd57600080fd5b5061023a6004803603610140811015610c1557600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81358116916020810135916040820135916060810135916080820135169060a08101359060c081013515159060ff60e082013516906101008101359061012001356130c0565b348015610c7d57600080fd5b50610ce06004803603610100811015610c9557600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135811691602081013582169160408201359160608101359160808201359160a08101359160c0820135169060e00135613218565b60408051938452602084019290925282820152519081900360600190f35b610ce0600480360360c0811015610d1457600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81358116916020810135916040820135916060810135916080820135169060a001356133a7565b61034060048036036080811015610d6757600080fd5b81359190810190604081016020820135640100000000811115610d8957600080fd5b820183602082011115610d9b57600080fd5b80359060200191846020830284011164010000000083111715610dbd57600080fd5b919350915073ffffffffffffffffffffffffffffffffffffffff81351690602001356136d3565b6000808242811015610e5757604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f477261766973526f757465723a20455850495245440000000000000000000000604482015290519081900360640190fd5b610e86897f00000000000000000000000000000000000000000000000000000000000000008a8a8a308a612d65565b9093509150610e96898685613b22565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16632e1a7d4d836040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b158015610f0957600080fd5b505af1158015610f1d573d6000803e3d6000fd5b50505050610f2b8583613cff565b50965096945050505050565b6000610f44848484613e3c565b949350505050565b60608142811015610fbe57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f477261766973526f757465723a20455850495245440000000000000000000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001686867fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff810181811061102357fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146110c257604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f477261766973526f757465723a20494e56414c49445f50415448000000000000604482015290519081900360640190fd5b6111207f000000000000000000000000000000000000000000000000000000000000000089888880806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250613f6092505050565b9150868260018451038151811061113357fe5b60200260200101511015611192576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260288152602001806154096028913960400191505060405180910390fd5b611257868660008181106111a257fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff163361123d7f00000000000000000000000000000000000000000000000000000000000000008a8a60008181106111f157fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff168b8b600181811061121b57fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff166140c6565b8560008151811061124a57fe5b60200260200101516141b1565b61129682878780806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250309250614381915050565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16632e1a7d4d836001855103815181106112e257fe5b60200260200101516040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b15801561132057600080fd5b505af1158015611334573d6000803e3d6000fd5b50505050611359848360018551038151811061134c57fe5b6020026020010151613cff565b509695505050505050565b60606113917f00000000000000000000000000000000000000000000000000000000000000008484614608565b90505b92915050565b60008060006113ca7f00000000000000000000000000000000000000000000000000000000000000008f8f6140c6565b90506000876113d9578c6113fb565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff5b604080517fd505accf00000000000000000000000000000000000000000000000000000000815233600482015230602482015260448101839052606481018c905260ff8a16608482015260a4810189905260c48101889052905191925073ffffffffffffffffffffffffffffffffffffffff84169163d505accf9160e48082019260009290919082900301818387803b15801561149757600080fd5b505af11580156114ab573d6000803e3d6000fd5b505050506114be8f8f8f8f8f8f8f612d65565b809450819550505050509b509b9950505050505050505050565b6060814281101561154a57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f477261766973526f757465723a20455850495245440000000000000000000000604482015290519081900360640190fd5b6115a87f000000000000000000000000000000000000000000000000000000000000000089888880806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250613f6092505050565b915086826001845103815181106115bb57fe5b6020026020010151101561161a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260288152602001806154096028913960400191505060405180910390fd5b61162a868660008181106111a257fe5b61135982878780806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250899250614381915050565b606081428110156116db57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f477261766973526f757465723a20455850495245440000000000000000000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001686867fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff810181811061174057fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146117df57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f477261766973526f757465723a20494e56414c49445f50415448000000000000604482015290519081900360640190fd5b61183d7f00000000000000000000000000000000000000000000000000000000000000008988888080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061460892505050565b9150868260008151811061184d57fe5b60200260200101511115611192576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602481526020018061547c6024913960400191505060405180910390fd5b6000806118fa7f00000000000000000000000000000000000000000000000000000000000000008d7f00000000000000000000000000000000000000000000000000000000000000006140c6565b9050600086611909578b61192b565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff5b604080517fd505accf00000000000000000000000000000000000000000000000000000000815233600482015230602482015260448101839052606481018b905260ff8916608482015260a4810188905260c48101879052905191925073ffffffffffffffffffffffffffffffffffffffff84169163d505accf9160e48082019260009290919082900301818387803b1580156119c757600080fd5b505af11580156119db573d6000803e3d6000fd5b505050506119ed8d8d8d8d8d8d6126a2565b9d9c50505050505050505050505050565b8042811015611a6e57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f477261766973526f757465723a20455850495245440000000000000000000000604482015290519081900360640190fd5b611afd85856000818110611a7e57fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1633611af77f000000000000000000000000000000000000000000000000000000000000000089896000818110611acd57fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff168a8a600181811061121b57fe5b8a6141b1565b600085857fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8101818110611b2d57fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231856040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015611bc657600080fd5b505afa158015611bda573d6000803e3d6000fd5b505050506040513d6020811015611bf057600080fd5b50516040805160208881028281018201909352888252929350611c32929091899189918291850190849080828437600092019190915250889250614796915050565b86611d368288887fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8101818110611c6557fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231886040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015611cfe57600080fd5b505afa158015611d12573d6000803e3d6000fd5b505050506040513d6020811015611d2857600080fd5b50519063ffffffff614b2916565b1015611d8d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260288152602001806154096028913960400191505060405180910390fd5b5050505050505050565b8042811015611e0757604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f477261766973526f757465723a20455850495245440000000000000000000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001685857fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8101818110611e6c57fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611f0b57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f477261766973526f757465723a20494e56414c49445f50415448000000000000604482015290519081900360640190fd5b611f1b85856000818110611a7e57fe5b611f59858580806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250309250614796915050565b604080517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152905160009173ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016916370a0823191602480820192602092909190829003018186803b158015611fe957600080fd5b505afa158015611ffd573d6000803e3d6000fd5b505050506040513d602081101561201357600080fd5b5051905086811015612070576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260288152602001806154096028913960400191505060405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16632e1a7d4d826040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b1580156120e357600080fd5b505af11580156120f7573d6000803e3d6000fd5b50505050611d8d8482613cff565b6060814281101561217757604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f477261766973526f757465723a20455850495245440000000000000000000000604482015290519081900360640190fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16868660008181106121bb57fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461225a57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f477261766973526f757465723a20494e56414c49445f50415448000000000000604482015290519081900360640190fd5b6122b87f000000000000000000000000000000000000000000000000000000000000000034888880806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250613f6092505050565b915086826001845103815181106122cb57fe5b6020026020010151101561232a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260288152602001806154096028913960400191505060405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663d0e30db08360008151811061237357fe5b60200260200101516040518263ffffffff1660e01b81526004016000604051808303818588803b1580156123a657600080fd5b505af11580156123ba573d6000803e3d6000fd5b50505050507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb61242c7f000000000000000000000000000000000000000000000000000000000000000089896000818110611acd57fe5b8460008151811061243957fe5b60200260200101516040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b1580156124aa57600080fd5b505af11580156124be573d6000803e3d6000fd5b505050506040513d60208110156124d457600080fd5b50516124dc57fe5b61251b82878780806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250899250614381915050565b5095945050505050565b6000610f44848484614b9b565b606081428110156125a457604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f477261766973526f757465723a20455850495245440000000000000000000000604482015290519081900360640190fd5b6126027f00000000000000000000000000000000000000000000000000000000000000008988888080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061460892505050565b9150868260008151811061261257fe5b6020026020010151111561161a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602481526020018061547c6024913960400191505060405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000081565b6000610f44848484614cbf565b6000814281101561271457604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f477261766973526f757465723a20455850495245440000000000000000000000604482015290519081900360640190fd5b612743887f00000000000000000000000000000000000000000000000000000000000000008989893089612d65565b604080517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015290519194506127ed92508a91879173ffffffffffffffffffffffffffffffffffffffff8416916370a0823191602480820192602092909190829003018186803b1580156127bc57600080fd5b505afa1580156127d0573d6000803e3d6000fd5b505050506040513d60208110156127e657600080fd5b5051613b22565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16632e1a7d4d836040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b15801561286057600080fd5b505af1158015612874573d6000803e3d6000fd5b505050506113598483613cff565b80428110156128f257604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f477261766973526f757465723a20455850495245440000000000000000000000604482015290519081900360640190fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168585600081811061293657fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146129d557604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f477261766973526f757465723a20494e56414c49445f50415448000000000000604482015290519081900360640190fd5b60003490507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663d0e30db0826040518263ffffffff1660e01b81526004016000604051808303818588803b158015612a4257600080fd5b505af1158015612a56573d6000803e3d6000fd5b50505050507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb612ac87f000000000000000000000000000000000000000000000000000000000000000089896000818110611acd57fe5b836040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b158015612b3257600080fd5b505af1158015612b46573d6000803e3d6000fd5b505050506040513d6020811015612b5c57600080fd5b5051612b6457fe5b600086867fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8101818110612b9457fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231866040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015612c2d57600080fd5b505afa158015612c41573d6000803e3d6000fd5b505050506040513d6020811015612c5757600080fd5b50516040805160208981028281018201909352898252929350612c999290918a918a918291850190849080828437600092019190915250899250614796915050565b87611d368289897fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8101818110612ccc57fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231896040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015611cfe57600080fd5b6000808242811015612dd857604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f477261766973526f757465723a20455850495245440000000000000000000000604482015290519081900360640190fd5b6000612e057f00000000000000000000000000000000000000000000000000000000000000008c8c6140c6565b604080517f23b872dd00000000000000000000000000000000000000000000000000000000815233600482015273ffffffffffffffffffffffffffffffffffffffff831660248201819052604482018d9052915192935090916323b872dd916064808201926020929091908290030181600087803b158015612e8657600080fd5b505af1158015612e9a573d6000803e3d6000fd5b505050506040513d6020811015612eb057600080fd5b5050604080517f89afcb4400000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff888116600483015282516000938493928616926389afcb44926024808301939282900301818787803b158015612f2357600080fd5b505af1158015612f37573d6000803e3d6000fd5b505050506040513d6040811015612f4d57600080fd5b50805160209091015190925090506000612f678e8e614d9f565b5090508073ffffffffffffffffffffffffffffffffffffffff168e73ffffffffffffffffffffffffffffffffffffffff1614612fa4578183612fa7565b82825b90975095508a871015613005576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260238152602001806154a06023913960400191505060405180910390fd5b8986101561305e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260238152602001806154316023913960400191505060405180910390fd5b505050505097509795505050505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b60606113917f00000000000000000000000000000000000000000000000000000000000000008484613f60565b60008060006131107f00000000000000000000000000000000000000000000000000000000000000008e7f00000000000000000000000000000000000000000000000000000000000000006140c6565b905060008761311f578c613141565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff5b604080517fd505accf00000000000000000000000000000000000000000000000000000000815233600482015230602482015260448101839052606481018c905260ff8a16608482015260a4810189905260c48101889052905191925073ffffffffffffffffffffffffffffffffffffffff84169163d505accf9160e48082019260009290919082900301818387803b1580156131dd57600080fd5b505af11580156131f1573d6000803e3d6000fd5b505050506132038e8e8e8e8e8e610de4565b909f909e509c50505050505050505050505050565b6000806000834281101561328d57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f477261766973526f757465723a20455850495245440000000000000000000000604482015290519081900360640190fd5b61329b8c8c8c8c8c8c614ef2565b909450925060006132cd7f00000000000000000000000000000000000000000000000000000000000000008e8e6140c6565b90506132db8d3383886141b1565b6132e78c3383876141b1565b8073ffffffffffffffffffffffffffffffffffffffff16636a627842886040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001915050602060405180830381600087803b15801561336657600080fd5b505af115801561337a573d6000803e3d6000fd5b505050506040513d602081101561339057600080fd5b5051949d939c50939a509198505050505050505050565b6000806000834281101561341c57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f477261766973526f757465723a20455850495245440000000000000000000000604482015290519081900360640190fd5b61344a8a7f00000000000000000000000000000000000000000000000000000000000000008b348c8c614ef2565b9094509250600061349c7f00000000000000000000000000000000000000000000000000000000000000008c7f00000000000000000000000000000000000000000000000000000000000000006140c6565b90506134aa8b3383886141b1565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663d0e30db0856040518263ffffffff1660e01b81526004016000604051808303818588803b15801561351257600080fd5b505af1158015613526573d6000803e3d6000fd5b50505050507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb82866040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b1580156135d257600080fd5b505af11580156135e6573d6000803e3d6000fd5b505050506040513d60208110156135fc57600080fd5b505161360457fe5b8073ffffffffffffffffffffffffffffffffffffffff16636a627842886040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001915050602060405180830381600087803b15801561368357600080fd5b505af1158015613697573d6000803e3d6000fd5b505050506040513d60208110156136ad57600080fd5b50519250348410156136c5576136c533853403613cff565b505096509650969350505050565b6060814281101561374557604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f477261766973526f757465723a20455850495245440000000000000000000000604482015290519081900360640190fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168686600081811061378957fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461382857604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f477261766973526f757465723a20494e56414c49445f50415448000000000000604482015290519081900360640190fd5b6138867f00000000000000000000000000000000000000000000000000000000000000008888888080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061460892505050565b9150348260008151811061389657fe5b602002602001015111156138f5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602481526020018061547c6024913960400191505060405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663d0e30db08360008151811061393e57fe5b60200260200101516040518263ffffffff1660e01b81526004016000604051808303818588803b15801561397157600080fd5b505af1158015613985573d6000803e3d6000fd5b50505050507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb6139f77f000000000000000000000000000000000000000000000000000000000000000089896000818110611acd57fe5b84600081518110613a0457fe5b60200260200101516040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b158015613a7557600080fd5b505af1158015613a89573d6000803e3d6000fd5b505050506040513d6020811015613a9f57600080fd5b5051613aa757fe5b613ae682878780806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250899250614381915050565b81600081518110613af357fe5b602002602001015134111561251b5761251b3383600081518110613b1357fe5b60200260200101513403613cff565b6040805173ffffffffffffffffffffffffffffffffffffffff8481166024830152604480830185905283518084039091018152606490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb00000000000000000000000000000000000000000000000000000000178152925182516000946060949389169392918291908083835b60208310613bf857805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101613bbb565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114613c5a576040519150601f19603f3d011682016040523d82523d6000602084013e613c5f565b606091505b5091509150818015613c8d575080511580613c8d5750808060200190516020811015613c8a57600080fd5b50515b613cf857604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5472616e7366657248656c7065723a205452414e534645525f4641494c454400604482015290519081900360640190fd5b5050505050565b6040805160008082526020820190925273ffffffffffffffffffffffffffffffffffffffff84169083906040518082805190602001908083835b60208310613d7657805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101613d39565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114613dd8576040519150601f19603f3d011682016040523d82523d6000602084013e613ddd565b606091505b5050905080613e37576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260238152602001806155076023913960400191505060405180910390fd5b505050565b6000808411613e96576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260288152602001806154546028913960400191505060405180910390fd5b600083118015613ea65750600082115b613efb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602581526020018061552a6025913960400191505060405180910390fd5b6000613f0f856126f763ffffffff6151f316565b90506000613f23828563ffffffff6151f316565b90506000613f4983613f3d8861271063ffffffff6151f316565b9063ffffffff61527916565b9050808281613f5457fe5b04979650505050505050565b6060600282511015613fd357604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f4772617669734c6962726172793a20494e56414c49445f504154480000000000604482015290519081900360640190fd5b815167ffffffffffffffff81118015613feb57600080fd5b50604051908082528060200260200182016040528015614015578160200160208202803683370190505b509050828160008151811061402657fe5b60200260200101818152505060005b60018351038110156140be576000806140788786858151811061405457fe5b602002602001015187866001018151811061406b57fe5b60200260200101516152eb565b9150915061409a84848151811061408b57fe5b60200260200101518383613e3c565b8484600101815181106140a957fe5b60209081029190910101525050600101614035565b509392505050565b60008060006140d58585614d9f565b604080517fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606094851b811660208084019190915293851b81166034830152825160288184030181526048830184528051908501207fff0000000000000000000000000000000000000000000000000000000000000060688401529a90941b9093166069840152607d8301989098527fab974afc2f3181c75852feb42f2d73635ceccfa465d3cc3dd694960004e65fb3609d808401919091528851808403909101815260bd909201909752805196019590952095945050505050565b6040805173ffffffffffffffffffffffffffffffffffffffff85811660248301528481166044830152606480830185905283518084039091018152608490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f23b872dd0000000000000000000000000000000000000000000000000000000017815292518251600094606094938a169392918291908083835b6020831061428f57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101614252565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d80600081146142f1576040519150601f19603f3d011682016040523d82523d6000602084013e6142f6565b606091505b5091509150818015614324575080511580614324575080806020019051602081101561432157600080fd5b50515b614379576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602481526020018061554f6024913960400191505060405180910390fd5b505050505050565b60005b60018351038110156146025760008084838151811061439f57fe5b60200260200101518584600101815181106143b657fe5b60200260200101519150915060006143ce8383614d9f565b50905060008785600101815181106143e257fe5b602002602001015190506000808373ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff161461442a5782600061442e565b6000835b91509150600060028a510388106144455788614486565b6144867f0000000000000000000000000000000000000000000000000000000000000000878c8b6002018151811061447957fe5b60200260200101516140c6565b90506144b37f000000000000000000000000000000000000000000000000000000000000000088886140c6565b73ffffffffffffffffffffffffffffffffffffffff1663022c0d9f84848460006040519080825280601f01601f1916602001820160405280156144fd576020820181803683370190505b506040518563ffffffff1660e01b8152600401808581526020018481526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200180602001828103825283818151815260200191508051906020019080838360005b83811015614588578181015183820152602001614570565b50505050905090810190601f1680156145b55780820380516001836020036101000a031916815260200191505b5095505050505050600060405180830381600087803b1580156145d757600080fd5b505af11580156145eb573d6000803e3d6000fd5b505060019099019850614384975050505050505050565b50505050565b606060028251101561467b57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f4772617669734c6962726172793a20494e56414c49445f504154480000000000604482015290519081900360640190fd5b815167ffffffffffffffff8111801561469357600080fd5b506040519080825280602002602001820160405280156146bd578160200160208202803683370190505b50905082816001835103815181106146d157fe5b602090810291909101015281517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff015b80156140be576000806147318786600186038151811061471d57fe5b602002602001015187868151811061406b57fe5b9150915061475384848151811061474457fe5b60200260200101518383614b9b565b84600185038151811061476257fe5b602090810291909101015250507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01614701565b60005b6001835103811015613e37576000808483815181106147b457fe5b60200260200101518584600101815181106147cb57fe5b60200260200101519150915060006147e38383614d9f565b50905060006148137f000000000000000000000000000000000000000000000000000000000000000085856140c6565b90506000806000808473ffffffffffffffffffffffffffffffffffffffff16630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b15801561486157600080fd5b505afa158015614875573d6000803e3d6000fd5b505050506040513d606081101561488b57600080fd5b5080516020909101516dffffffffffffffffffffffffffff918216935016905060008073ffffffffffffffffffffffffffffffffffffffff8a8116908916146148d55782846148d8565b83835b9150915061495d828b73ffffffffffffffffffffffffffffffffffffffff166370a082318a6040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015611cfe57600080fd5b955061496a868383613e3c565b9450505050506000808573ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff16146149ae578260006149b2565b6000835b91509150600060028c51038a106149c9578a6149fd565b6149fd7f0000000000000000000000000000000000000000000000000000000000000000898e8d6002018151811061447957fe5b60408051600080825260208201928390527f022c0d9f000000000000000000000000000000000000000000000000000000008352602482018781526044830187905273ffffffffffffffffffffffffffffffffffffffff8086166064850152608060848501908152845160a48601819052969750908c169563022c0d9f958a958a958a9591949193919260c486019290918190849084905b83811015614aad578181015183820152602001614a95565b50505050905090810190601f168015614ada5780820380516001836020036101000a031916815260200191505b5095505050505050600060405180830381600087803b158015614afc57600080fd5b505af1158015614b10573d6000803e3d6000fd5b50506001909b019a506147999950505050505050505050565b8082038281111561139457604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f64732d6d6174682d7375622d756e646572666c6f770000000000000000000000604482015290519081900360640190fd5b6000808411614bf5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260298152602001806153e06029913960400191505060405180910390fd5b600083118015614c055750600082115b614c5a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602581526020018061552a6025913960400191505060405180910390fd5b6000614c7e612710614c72868863ffffffff6151f316565b9063ffffffff6151f316565b90506000614c986126f7614c72868963ffffffff614b2916565b9050614cb56001828481614ca857fe5b049063ffffffff61527916565b9695505050505050565b6000808411614d19576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001806154e56022913960400191505060405180910390fd5b600083118015614d295750600082115b614d7e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602581526020018061552a6025913960400191505060405180910390fd5b82614d8f858463ffffffff6151f316565b81614d9657fe5b04949350505050565b6000808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415614e27576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001806154c36022913960400191505060405180910390fd5b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1610614e61578284614e64565b83835b909250905073ffffffffffffffffffffffffffffffffffffffff8216614eeb57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f4772617669734c6962726172793a205a45524f5f414444524553530000000000604482015290519081900360640190fd5b9250929050565b604080517fe6a4390500000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff888116600483015287811660248301529151600092839283927f00000000000000000000000000000000000000000000000000000000000000009092169163e6a4390591604480820192602092909190829003018186803b158015614f9257600080fd5b505afa158015614fa6573d6000803e3d6000fd5b505050506040513d6020811015614fbc57600080fd5b505173ffffffffffffffffffffffffffffffffffffffff1614156150a257604080517fc9c6539600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8a81166004830152898116602483015291517f00000000000000000000000000000000000000000000000000000000000000009092169163c9c65396916044808201926020929091908290030181600087803b15801561507557600080fd5b505af1158015615089573d6000803e3d6000fd5b505050506040513d602081101561509f57600080fd5b50505b6000806150d07f00000000000000000000000000000000000000000000000000000000000000008b8b6152eb565b915091508160001480156150e2575080155b156150f2578793508692506151e6565b60006150ff898484614cbf565b905087811161516c5785811015615161576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260238152602001806154316023913960400191505060405180910390fd5b8894509250826151e4565b6000615179898486614cbf565b90508981111561518557fe5b878110156151de576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260238152602001806154a06023913960400191505060405180910390fd5b94508793505b505b5050965096945050505050565b600081158061520e5750508082028282828161520b57fe5b04145b61139457604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f64732d6d6174682d6d756c2d6f766572666c6f77000000000000000000000000604482015290519081900360640190fd5b8082018281101561139457604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f64732d6d6174682d6164642d6f766572666c6f77000000000000000000000000604482015290519081900360640190fd5b60008060006152fa8585614d9f565b5090506153088686866140c6565b506000806153178888886140c6565b73ffffffffffffffffffffffffffffffffffffffff16630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b15801561535c57600080fd5b505afa158015615370573d6000803e3d6000fd5b505050506040513d606081101561538657600080fd5b5080516020909101516dffffffffffffffffffffffffffff918216935016905073ffffffffffffffffffffffffffffffffffffffff878116908416146153cd5780826153d0565b81815b9099909850965050505050505056fe4772617669734c6962726172793a20494e53554646494349454e545f4f55545055545f414d4f554e54477261766973526f757465723a20494e53554646494349454e545f4f55545055545f414d4f554e54477261766973526f757465723a20494e53554646494349454e545f425f414d4f554e544772617669734c6962726172793a20494e53554646494349454e545f494e5055545f414d4f554e54477261766973526f757465723a204558434553534956455f494e5055545f414d4f554e54477261766973526f757465723a20494e53554646494349454e545f415f414d4f554e544772617669734c6962726172793a204944454e544943414c5f4144445245535345534772617669734c6962726172793a20494e53554646494349454e545f414d4f554e545472616e7366657248656c7065723a204554485f5452414e534645525f4641494c45444772617669734c6962726172793a20494e53554646494349454e545f4c49515549444954595472616e7366657248656c7065723a205452414e534645525f46524f4d5f4641494c4544a264697066735822122073f109e2cd07ee3c6a3a015eb9f5a63d6fbc14a0e9016742e194dbf0a7d521a764736f6c634300060600330000000000000000000000005b7592997ef6dc590cb104147e28b174923f72de000000000000000000000000ab70ec86a21c2bc15a93492e59fa7d646e581ef7

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

0000000000000000000000005b7592997ef6dc590cb104147e28b174923f72de000000000000000000000000ab70ec86a21c2bc15a93492e59fa7d646e581ef7
-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 0000000000000000000000005b7592997ef6dc590cb104147e28b174923f72de
Arg [1] : 000000000000000000000000ab70ec86a21c2bc15a93492e59fa7d646e581ef7


Deployed ByteCode Sourcemap

16199:18334:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16670:10;:18;16684:4;16670:18;;16663:26;;;;16199:18334;;12:1:-1;9;2:12;20769:673:0;;5:9:-1;2:2;;;27:1;24;17:12;2:2;20769:673:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;-1:-1;20769:673:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;33489:259;;5:9:-1;2:2;;;27:1;24;17:12;2:2;33489:259:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;33489:259:0;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;27866:838;;5:9:-1;2:2;;;27:1;24;17:12;2:2;27866:838:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;27866:838:0;;;;;;;;;;;;;;;;;;27:11:-1;11:28;;8:2;;;52:1;49;42:12;8:2;27866:838:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;27866:838:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;39:11;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;27866:838:0;;-1:-1:-1;27866:838:0;-1:-1:-1;27866:838:0;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:100:-1;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;27866:838:0;;;;;;;;;;;;;;;;;34280:250;;5:9:-1;2:2;;;27:1;24;17:12;2:2;34280:250:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;34280:250:0;;;;;;;;;;;;;;27:11:-1;11:28;;8:2;;;52:1;49;42:12;8:2;34280:250:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;34280:250:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;39:11;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;34280:250:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;34280:250:0;;-1:-1:-1;34280:250:0;;-1:-1:-1;;;;;34280:250:0:i;21448:671::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;21448:671:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;-1:-1;21448:671:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;25125:619::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;25125:619:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;25125:619:0;;;;;;;;;;;;;;;;;;27:11:-1;11:28;;8:2;;;52:1;49;42:12;8:2;25125:619:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;25125:619:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;39:11;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;25125:619:0;;-1:-1:-1;25125:619:0;-1:-1:-1;25125:619:0;;;;;;;;;:::i;27044:816::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;27044:816:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;27044:816:0;;;;;;;;;;;;;;;;;;27:11:-1;11:28;;8:2;;;52:1;49;42:12;8:2;27044:816:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;27044:816:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;39:11;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;27044:816:0;;-1:-1:-1;27044:816:0;-1:-1:-1;27044:816:0;;;;;;;;;:::i;23573:712::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;23573:712:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;-1:-1;23573:712:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;30857:708::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;30857:708:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;30857:708:0;;;;;;;;;;;;;;;;;;27:11:-1;11:28;;8:2;;;52:1;49;42:12;8:2;30857:708:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;30857:708:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;39:11;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;30857:708:0;;-1:-1:-1;30857:708:0;-1:-1:-1;30857:708:0;;;;;;;;;:::i;32418:834::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;32418:834:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;32418:834:0;;;;;;;;;;;;;;;;;;27:11:-1;11:28;;8:2;;;52:1;49;42:12;8:2;32418:834:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;32418:834:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;39:11;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;32418:834:0;;-1:-1:-1;32418:834:0;-1:-1:-1;32418:834:0;;;;;;;;;:::i;26353:685::-;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;26353:685:0;;;;;;;;;;;;;;27:11:-1;11:28;;8:2;;;52:1;49;42:12;8:2;26353:685:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;26353:685:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;39:11;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;26353:685:0;;-1:-1:-1;26353:685:0;-1:-1:-1;26353:685:0;;;;;;;;;:::i;33756:258::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;33756:258:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;33756:258:0;;;;;;;;;;;;:::i;25750:597::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;25750:597:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;25750:597:0;;;;;;;;;;;;;;;;;;27:11:-1;11:28;;8:2;;;52:1;49;42:12;8:2;25750:597:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;25750:597:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;39:11;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;25750:597:0;;-1:-1:-1;25750:597:0;-1:-1:-1;25750:597:0;;;;;;;;;:::i;16327:38::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;16327:38:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;33296:185;;5:9:-1;2:2;;;27:1;24;17:12;2:2;33296:185:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;33296:185:0;;;;;;;;;;;;:::i;22867:700::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;22867:700:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;-1:-1;22867:700:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;31571:841::-;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;31571:841:0;;;;;;;;;;;;;;27:11:-1;11:28;;8:2;;;52:1;49;42:12;8:2;31571:841:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;31571:841:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;39:11;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;31571:841:0;;-1:-1:-1;31571:841:0;-1:-1:-1;31571:841:0;;;;;;;;;:::i;19916:847::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;19916:847:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;-1:-1;19916:847:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;16279:41::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;16279:41:0;;;:::i;34022:250::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;34022:250:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;34022:250:0;;;;;;;;;;;;;;27:11:-1;11:28;;8:2;;;52:1;49;42:12;8:2;34022:250:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;34022:250:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;39:11;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;34022:250:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;34022:250:0;;-1:-1:-1;34022:250:0;;-1:-1:-1;;;;;34022:250:0:i;22125:663::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;22125:663:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;-1:-1;22125:663:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;18167:732::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;18167:732:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;-1:-1;18167:732:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;18905:968;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;-1:-1;18905:968:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;28710:798::-;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;28710:798:0;;;;;;;;;;;;;;27:11:-1;11:28;;8:2;;;52:1;49;42:12;8:2;28710:798:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;28710:798:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;39:11;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;28710:798:0;;-1:-1:-1;28710:798:0;-1:-1:-1;28710:798:0;;;;;;;;;:::i;20769:673::-;21006:16;21024:14;20987:8;16436:15;16424:8;:27;;16416:61;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21078:196:::1;21108:5;21128:4;21147:9;21171:14;21200:12;21235:4;21255:8;21078:15;:196::i;:::-;21051:223:::0;;-1:-1:-1;21051:223:0;-1:-1:-1;21285:51:0::1;21313:5:::0;21320:2;21051:223;21285:27:::1;:51::i;:::-;21353:4;21347:20;;;21368:9;21347:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;21347:31:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;21347:31:0;;;;21389:45;21420:2;21424:9;21389:30;:45::i;:::-;20769:673:::0;;;;;;;;;;:::o;33489:259::-;33642:14;33681:59;33708:8;33718:9;33729:10;33681:26;:59::i;:::-;33674:66;33489:259;-1:-1:-1;;;;33489:259:0:o;27866:838::-;28080:21;28052:8;16436:15;16424:8;:27;;16416:61;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28127:29:::1;28152:4;28127:29;:4:::0;;28132:15;;;28127:21;;::::1;;;;;;;;;;;;;:29;;;28119:68;;;::::0;;::::1;::::0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;28208:52;28236:7;28245:8;28255:4;;28208:52;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;28208:27:0::1;::::0;-1:-1:-1;;;28208:52:0:i:1;:::-;28198:62;;28310:12;28279:7;28304:1;28287:7;:14;:18;28279:27;;;;;;;;;;;;;;:43;;28271:96;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28378:138;28424:4;;28429:1;28424:7;;;;;;;;;;;;;;;28433:10;28445:48;28467:7;28476:4;;28481:1;28476:7;;;;;;;;;;;;;;;28485:4;;28490:1;28485:7;;;;;;;;;;;;;;;28445:21;:48::i;:::-;28495:7;28503:1;28495:10;;;;;;;;;;;;;;28378:31;:138::i;:::-;28527:35;28533:7;28542:4;;28527:35;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;28556:4:0::1;::::0;-1:-1:-1;28527:5:0::1;::::0;-1:-1:-1;;28527:35:0:i:1;:::-;28579:4;28573:20;;;28594:7;28619:1;28602:7;:14;:18;28594:27;;;;;;;;;;;;;;28573:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;28573:49:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;28573:49:0;;;;28633:63;28664:2;28668:7;28693:1;28676:7;:14;:18;28668:27;;;;;;;;;;;;;;28633:30;:63::i;:::-;27866:838:::0;;;;;;;;;:::o;34280:250::-;34424:21;34470:52;34497:7;34506:9;34517:4;34470:26;:52::i;:::-;34463:59;;34280:250;;;;;:::o;21448:671::-;21754:12;21768;21793;21808:46;21830:7;21839:6;21847;21808:21;:46::i;:::-;21793:61;;21865:10;21878;:33;;21902:9;21878:33;;;21896:2;21878:33;21922:77;;;;;;21947:10;21922:77;;;;21967:4;21922:77;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21865:46;;-1:-1:-1;21922:24:0;;;;;;:77;;;;;-1:-1:-1;;21922:77:0;;;;;;;;-1:-1:-1;21922:24:0;:77;;;2:2:-1;;;;27:1;24;17:12;2:2;21922:77:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;21922:77:0;;;;22031:80;22047:6;22055;22063:9;22074:10;22086;22098:2;22102:8;22031:15;:80::i;:::-;22010:101;;;;;;;;21448:671;;;;;;;;;;;;;;;;:::o;25125:619::-;25349:21;25330:8;16436:15;16424:8;:27;;16416:61;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25393:52:::1;25421:7;25430:8;25440:4;;25393:52;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;25393:27:0::1;::::0;-1:-1:-1;;;25393:52:0:i:1;:::-;25383:62;;25495:12;25464:7;25489:1;25472:7;:14;:18;25464:27;;;;;;;;;;;;;;:43;;25456:96;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25563:138;25609:4;;25614:1;25609:7;;;;;;25563:138;25712:24;25718:7;25727:4;;25712:24;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;25733:2:0;;-1:-1:-1;25712:5:0::1;::::0;-1:-1:-1;;25712:24:0:i:1;27044:816::-:0;27258:21;27230:8;16436:15;16424:8;:27;;16416:61;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27305:29:::1;27330:4;27305:29;:4:::0;;27310:15;;;27305:21;;::::1;;;;;;;;;;;;;:29;;;27297:68;;;::::0;;::::1;::::0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;27386:52;27413:7;27422:9;27433:4;;27386:52;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;27386:26:0::1;::::0;-1:-1:-1;;;27386:52:0:i:1;:::-;27376:62;;27471:11;27457:7;27465:1;27457:10;;;;;;;;;;;;;;:25;;27449:74;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23573:712:::0;23891:14;23918:12;23933:43;23955:7;23964:5;23971:4;23933:21;:43::i;:::-;23918:58;;23987:10;24000;:33;;24024:9;24000:33;;;24018:2;24000:33;24044:77;;;;;;24069:10;24044:77;;;;24089:4;24044:77;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23987:46;;-1:-1:-1;24044:24:0;;;;;;:77;;;;;-1:-1:-1;;24044:77:0;;;;;;;;-1:-1:-1;24044:24:0;:77;;;2:2:-1;;;;27:1;24;17:12;2:2;24044:77:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;24044:77:0;;;;24144:133;24206:5;24213:9;24224:14;24240:12;24254:2;24258:8;24144:47;:133::i;:::-;24132:145;23573:712;-1:-1:-1;;;;;;;;;;;;;23573:712:0:o;30857:708::-;31091:8;16436:15;16424:8;:27;;16416:61;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31112:136:::1;31158:4;;31163:1;31158:7;;;;;;;;;;;;;;;31167:10;31179:48;31201:7;31210:4;;31215:1;31210:7;;;;;;;;;;;;;;;31219:4;;31224:1;31219:7;;;;;;31179:48;31229:8;31112:31;:136::i;:::-;31259:18;31287:4:::0;;31292:15;;;31287:21;;::::1;;;;;;;;;;;;;31280:39;;;31320:2;31280:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;31280:43:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;31280:43:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;31280:43:0;31334:44:::1;::::0;;31280:43:::1;31334:44:::0;;::::1;::::0;;;;;;;;;;;31280:43;;-1:-1:-1;31334:44:0::1;::::0;;;31369:4;;;;;;31334:44;::::1;::::0;31369:4;;31334:44;31369:4;31334:44;1:33:-1::1;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;31375:2:0;;-1:-1:-1;31334:34:0::1;::::0;-1:-1:-1;;31334:44:0:i:1;:::-;31477:12:::0;31411:62:::1;31459:13:::0;31418:4;;31423:15;;;31418:21;;::::1;;;;;;;;;;;;;31411:39;;;31451:2;31411:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;31411:43:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;31411:43:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;31411:43:0;;:62:::1;:47;:62;:::i;:::-;:78;;31389:168;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16488:1;30857:708:::0;;;;;;;:::o;32418:834::-;32685:8;16436:15;16424:8;:27;;16416:61;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32719:29:::1;32744:4;32719:29;:4:::0;;32724:15;;;32719:21;;::::1;;;;;;;;;;;;;:29;;;32711:68;;;::::0;;::::1;::::0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;32790:136;32836:4;;32841:1;32836:7;;;;;;32790:136;32937:55;32972:4;;32937:55;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;32986:4:0::1;::::0;-1:-1:-1;32937:34:0::1;::::0;-1:-1:-1;;32937:55:0:i:1;:::-;33020:37;::::0;;;;;33051:4:::1;33020:37;::::0;::::1;::::0;;;33003:14:::1;::::0;33020:22:::1;33027:4;33020:22;::::0;::::1;::::0;:37;;;;;::::1;::::0;;;;;;;;;:22;:37;::::1;;2:2:-1::0;::::1;;;27:1;24::::0;17:12:::1;2:2;33020:37:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;33020:37:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;33020:37:0;;-1:-1:-1;33076:25:0;;::::1;;33068:78;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33163:4;33157:20;;;33178:9;33157:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;33157:31:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;33157:31:0;;;;33199:45;33230:2;33234:9;33199:30;:45::i;26353:685::-:0;26569:21;26541:8;16436:15;16424:8;:27;;16416:61;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26627:4:::1;26616:15;;:4;;26621:1;26616:7;;;;;;;;;;;;;;;:15;;;26608:54;;;::::0;;::::1;::::0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;26683:53;26711:7;26720:9;26731:4;;26683:53;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;26683:27:0::1;::::0;-1:-1:-1;;;26683:53:0:i:1;:::-;26673:63;;26786:12;26755:7;26780:1;26763:7;:14;:18;26755:27;;;;;;;;;;;;;;:43;;26747:96;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26860:4;26854:19;;;26881:7;26889:1;26881:10;;;;;;;;;;;;;;26854:40;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;26854:40:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;26854:40:0;;;;;26918:4;26912:20;;;26933:48;26955:7;26964:4;;26969:1;26964:7;;;;;;26933:48;26983:7;26991:1;26983:10;;;;;;;;;;;;;;26912:82;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;26912:82:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;26912:82:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;26912:82:0;26905:90:::1;;;;27006:24;27012:7;27021:4;;27006:24;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;27027:2:0;;-1:-1:-1;27006:5:0::1;::::0;-1:-1:-1;;27006:24:0:i:1;:::-;26353:685:::0;;;;;;;;:::o;33756:258::-;33909:13;33947:59;33973:9;33984;33995:10;33947:25;:59::i;25750:597::-;25974:21;25955:8;16436:15;16424:8;:27;;16416:61;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26018:52:::1;26045:7;26054:9;26065:4;;26018:52;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;26018:26:0::1;::::0;-1:-1:-1;;;26018:52:0:i:1;:::-;26008:62;;26103:11;26089:7;26097:1;26089:10;;;;;;;;;;;;;;:25;;26081:74;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16327:38:::0;;;:::o;33296:185::-;33393:12;33425:48;33445:7;33454:8;33464;33425:19;:48::i;22867:700::-;23133:14;23114:8;16436:15;16424:8;:27;;16416:61;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23176:196:::1;23206:5;23226:4;23245:9;23269:14;23298:12;23333:4;23353:8;23176:15;:196::i;:::-;23422:38;::::0;;;;;23454:4:::1;23422:38;::::0;::::1;::::0;;;23160:212;;-1:-1:-1;23383:78:0::1;::::0;-1:-1:-1;23411:5:0;;23418:2;;23422:23:::1;::::0;::::1;::::0;::::1;::::0;:38;;;;;::::1;::::0;;;;;;;;;:23;:38;::::1;;2:2:-1::0;::::1;;;27:1;24::::0;17:12:::1;2:2;23422:38:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;23422:38:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;23422:38:0;23383:27:::1;:78::i;:::-;23478:4;23472:20;;;23493:9;23472:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;23472:31:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;23472:31:0;;;;23514:45;23545:2;23549:9;23514:30;:45::i;31571:841::-:0;31831:8;16436:15;16424:8;:27;;16416:61;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31876:4:::1;31865:15;;:4;;31870:1;31865:7;;;;;;;;;;;;;;;:15;;;31857:54;;;::::0;;::::1;::::0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;31922:13;31938:9;31922:25;;31964:4;31958:19;;;31985:8;31958:38;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;31958:38:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;31958:38:0;;;;;32020:4;32014:20;;;32035:48;32057:7;32066:4;;32071:1;32066:7;;;;;;32035:48;32085:8;32014:80;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;32014:80:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;32014:80:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;32014:80:0;32007:88:::1;;;;32106:18;32134:4:::0;;32139:15;;;32134:21;;::::1;;;;;;;;;;;;;32127:39;;;32167:2;32127:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;32127:43:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;32127:43:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;32127:43:0;32181:44:::1;::::0;;32127:43:::1;32181:44:::0;;::::1;::::0;;;;;;;;;;;32127:43;;-1:-1:-1;32181:44:0::1;::::0;;;32216:4;;;;;;32181:44;::::1;::::0;32216:4;;32181:44;32216:4;32181:44;1:33:-1::1;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;32222:2:0;;-1:-1:-1;32181:34:0::1;::::0;-1:-1:-1;;32181:44:0:i:1;:::-;32324:12:::0;32258:62:::1;32306:13:::0;32265:4;;32270:15;;;32265:21;;::::1;;;;;;;;;;;;;32258:39;;;32298:2;32258:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;19916:847:0::0;20170:12;20184;20151:8;16436:15;16424:8;:27;;16416:61;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20209:12:::1;20224:46;20246:7;20255:6;20263;20224:21;:46::i;:::-;20281:59;::::0;;;;;20312:10:::1;20281:59;::::0;::::1;::::0;:30:::1;::::0;::::1;:59:::0;;;;;;;;;;;;;;20209:61;;-1:-1:-1;20281:30:0;;::::1;::::0;:59;;;;;::::1;::::0;;;;;;;;;-1:-1:-1;20281:30:0;:59;::::1;;2:2:-1::0;::::1;;;27:1;24::::0;17:12:::1;2:2;20281:59:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;20281:59:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;;20408:26:0::1;::::0;;;;;:22:::1;:26:::0;;::::1;;::::0;::::1;::::0;;;20378:12:::1;::::0;;;20408:22;;::::1;::::0;::::1;::::0;:26;;;;;;;;;;;20378:12;20408:22;:26;::::1;;2:2:-1::0;::::1;;;27:1;24::::0;17:12:::1;2:2;20408:26:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;20408:26:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;20408:26:0;;::::1;::::0;;::::1;::::0;;;-1:-1:-1;20408:26:0;-1:-1:-1;20446:14:0::1;20465:40;20490:6:::0;20498;20465:24:::1;:40::i;:::-;20445:60;;;20547:6;20537:16;;:6;:16;;;:58;;20578:7;20587;20537:58;;;20557:7;20566;20537:58;20516:79:::0;;-1:-1:-1;20516:79:0;-1:-1:-1;20614:21:0;;::::1;;20606:69;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20705:10;20694:7;:21;;20686:69;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16488:1;;;;19916:847:::0;;;;;;;;;;;:::o;16279:41::-;;;:::o;34022:250::-;34166:21;34212:52;34240:7;34249:8;34259:4;34212:27;:52::i;22125:663::-;22414:16;22432:14;22459:12;22474:43;22496:7;22505:5;22512:4;22474:21;:43::i;:::-;22459:58;;22528:10;22541;:33;;22565:9;22541:33;;;22559:2;22541:33;22585:77;;;;;;22610:10;22585:77;;;;22630:4;22585:77;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22528:46;;-1:-1:-1;22585:24:0;;;;;;:77;;;;;-1:-1:-1;;22585:77:0;;;;;;;;-1:-1:-1;22585:24:0;:77;;;2:2:-1;;;;27:1;24;17:12;2:2;22585:77:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;22585:77:0;;;;22700:80;22719:5;22726:9;22737:14;22753:12;22767:2;22771:8;22700:18;:80::i;:::-;22673:107;;;;-1:-1:-1;22125:663:0;-1:-1:-1;;;;;;;;;;;;;22125:663:0:o;18167:732::-;18455:12;18469;18483:14;18436:8;16436:15;16424:8;:27;;16416:61;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18531:85:::1;18545:6;18553;18561:14;18577;18593:10;18605;18531:13;:85::i;:::-;18510:106:::0;;-1:-1:-1;18510:106:0;-1:-1:-1;18627:12:0::1;18642:46;18664:7;18673:6:::0;18681;18642:21:::1;:46::i;:::-;18627:61;;18699:66;18731:6;18739:10;18751:4;18757:7;18699:31;:66::i;:::-;18776;18808:6;18816:10;18828:4;18834:7;18776:31;:66::i;:::-;18877:4;18865:22;;;18888:2;18865:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;18865:26:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;18865:26:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;18865:26:0;18167:732;;;;-1:-1:-1;18865:26:0;;-1:-1:-1;18167:732:0;;-1:-1:-1;;;;;;;;;18167:732:0:o;18905:968::-;19158:16;19176:14;19192;19139:8;16436:15;16424:8;:27;;16416:61;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19246:176:::1;19274:5;19294:4;19313:18;19346:9;19370:14;19399:12;19246:13;:176::i;:::-;19219:203:::0;;-1:-1:-1;19219:203:0;-1:-1:-1;19433:12:0::1;19448:43;19470:7;19479:5:::0;19486:4:::1;19448:21;:43::i;:::-;19433:58;;19502:69;19534:5;19541:10;19553:4;19559:11;19502:31;:69::i;:::-;19588:4;19582:19;;;19609:9;19582:39;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;19582:39:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;19582:39:0;;;;;19645:4;19639:20;;;19660:4;19666:9;19639:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;19639:37:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;19639:37:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;19639:37:0;19632:45:::1;;;;19712:4;19700:22;;;19723:2;19700:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;19700:26:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;19700:26:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;19700:26:0;;-1:-1:-1;19777:9:0::1;:21:::0;-1:-1:-1;19773:92:0::1;;;19800:65;19831:10;19855:9;19843;:21;19800:30;:65::i;:::-;16488:1;18905:968:::0;;;;;;;;;;;:::o;28710:798::-;28923:21;28895:8;16436:15;16424:8;:27;;16416:61;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28981:4:::1;28970:15;;:4;;28975:1;28970:7;;;;;;;;;;;;;;;:15;;;28962:54;;;::::0;;::::1;::::0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;29037:52;29064:7;29073:9;29084:4;;29037:52;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;29037:26:0::1;::::0;-1:-1:-1;;;29037:52:0:i:1;:::-;29027:62;;29122:9;29108:7;29116:1;29108:10;;;;;;;;;;;;;;:23;;29100:72;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29189:4;29183:19;;;29210:7;29218:1;29210:10;;;;;;;;;;;;;;29183:40;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;29183:40:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;29183:40:0;;;;;29247:4;29241:20;;;29262:48;29284:7;29293:4;;29298:1;29293:7;;;;;;29262:48;29312:7;29320:1;29312:10;;;;;;;;;;;;;;29241:82;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;29241:82:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;29241:82:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;29241:82:0;29234:90:::1;;;;29335:24;29341:7;29350:4;;29335:24;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;29356:2:0;;-1:-1:-1;29335:5:0::1;::::0;-1:-1:-1;;29335:24:0:i:1;:::-;29422:7;29430:1;29422:10;;;;;;;;;;;;;;29410:9;:22;29406:94;;;29434:66;29465:10;29489:7;29497:1;29489:10;;;;;;;;;;;;;;29477:9;:22;29434:30;:66::i;1329:361::-:0;1524:45;;;1513:10;1524:45;;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;1524:45:0;;;;;;;25:18:-1;;61:17;;96:58;182:15;1524:45:0;179:29:-1;160:49;;1513:57:0;;;;1478:12;;1492:17;;1513:10;;;;1524:45;1513:57;;;25:18:-1;1513:57:0;;25:18:-1;36:153;66:2;61:3;58:11;36:153;;176:10;;164:23;;139:12;;;;;98:2;89:12;;;;114;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;1513:57:0;;;;;;;;;;;;;;;;;;;;;;;;12:1:-1;19;14:27;;;;67:4;61:11;56:16;;134:4;130:9;123:4;105:16;101:27;97:43;94:1;90:51;84:4;77:65;157:16;154:1;147:27;211:16;208:1;201:4;198:1;194:12;179:49;5:228;;14:27;32:4;27:9;;5:228;;1477:93:0;;;;1589:7;:57;;;;-1:-1:-1;1601:11:0;;:16;;:44;;;1632:4;1621:24;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;1621:24:0;1601:44;1581:101;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1329:361;;;;;:::o;2108:195::-;2216:12;;;2178;2216;;;;;;;;;2195:7;;;;2209:5;;2195:34;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:11;36:153;;176:10;;164:23;;139:12;;;;;98:2;89:12;;;;114;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;2195:34:0;;;;;;;;;;;;;;;;;;;;;;;;;12:1:-1;19;14:27;;;;67:4;61:11;56:16;;134:4;130:9;123:4;105:16;101:27;97:43;94:1;90:51;84:4;77:65;157:16;154:1;147:27;211:16;208:1;201:4;198:1;194:12;179:49;5:228;;14:27;32:4;27:9;;5:228;;2177:52:0;;;2248:7;2240:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2108:195;;;:::o;12670:515::-;12763:14;12809:1;12798:8;:12;12790:65;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12886:1;12874:9;:13;:31;;;;;12904:1;12891:10;:14;12874:31;12866:81;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12958:20;12981:19;:8;12994:5;12981:19;:12;:19;:::i;:::-;12958:42;-1:-1:-1;13011:14:0;13028:31;12958:42;13048:10;13028:31;:19;:31;:::i;:::-;13011:48;-1:-1:-1;13070:16:0;13089:42;13115:15;13089:21;:9;13103:6;13089:21;:13;:21;:::i;:::-;:25;:42;:25;:42;:::i;:::-;13070:61;;13166:11;13154:9;:23;;;;;;;12670:515;-1:-1:-1;;;;;;;12670:515:0:o;13858:508::-;13959:21;14016:1;14001:4;:11;:16;;13993:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14081:4;:11;14070:23;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;14070:23:0;;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;125:4;109:14;101:6;88:42;144:17;;-1:-1;14070:23:0;;14060:33;;14117:8;14104:7;14112:1;14104:10;;;;;;;;;;;;;:21;;;;;14141:6;14136:223;14167:1;14153:4;:11;:15;14149:1;:19;14136:223;;;14191:14;14207:15;14226:42;14238:7;14247:4;14252:1;14247:7;;;;;;;;;;;;;;14256:4;14261:1;14265;14261:5;14256:11;;;;;;;;;;;;;;14226;:42::i;:::-;14190:78;;;;14300:47;14313:7;14321:1;14313:10;;;;;;;;;;;;;;14325:9;14336:10;14300:12;:47::i;:::-;14283:7;14291:1;14295;14291:5;14283:14;;;;;;;;;;;;;;;;;:64;-1:-1:-1;;14170:3:0;;14136:223;;;;13858:508;;;;;:::o;11153:478::-;11242:12;11268:14;11284;11302:26;11313:6;11321;11302:10;:26::i;:::-;11466:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22::-1;26:21;;;22:32;6:49;;11466:32:0;;;;;11456:43;;;;;;11369:251;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;11369:251:0;;;;;;;11359:262;;;;;;;;;11153:478;-1:-1:-1;;;;;11153:478:0:o;1698:402::-;1923:51;;;1912:10;1923:51;;;;;;;;;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;1923:51:0;;;;;;;25:18:-1;;61:17;;96:58;182:15;1923:51:0;179:29:-1;160:49;;1912:63:0;;;;1877:12;;1891:17;;1912:10;;;;1923:51;1912:63;;;25:18:-1;1912:63:0;;25:18:-1;36:153;66:2;61:3;58:11;36:153;;176:10;;164:23;;139:12;;;;;98:2;89:12;;;;114;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;1912:63:0;;;;;;;;;;;;;;;;;;;;;;;;12:1:-1;19;14:27;;;;67:4;61:11;56:16;;134:4;130:9;123:4;105:16;101:27;97:43;94:1;90:51;84:4;77:65;157:16;154:1;147:27;211:16;208:1;201:4;198:1;194:12;179:49;5:228;;14:27;32:4;27:9;;5:228;;1876:99:0;;;;1994:7;:57;;;;-1:-1:-1;2006:11:0;;:16;;:44;;;2037:4;2026:24;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;2026:24:0;2006:44;1986:106;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1698:402;;;;;;:::o;24396:723::-;24503:6;24498:614;24529:1;24515:4;:11;:15;24511:1;:19;24498:614;;;24553:13;24568:14;24587:4;24592:1;24587:7;;;;;;;;;;;;;;24596:4;24601:1;24605;24601:5;24596:11;;;;;;;;;;;;;;24552:56;;;;24624:14;24643:39;24668:5;24675:6;24643:24;:39::i;:::-;24623:59;;;24697:14;24714:7;24722:1;24726;24722:5;24714:14;;;;;;;;;;;;;;24697:31;;24744:15;24761;24789:6;24780:15;;:5;:15;;;:61;;24822:9;24838:1;24780:61;;;24804:1;24808:9;24780:61;24743:98;;;;24856:10;24887:1;24873:4;:11;:15;24869:1;:19;:79;;24945:3;24869:79;;;24891:51;24913:7;24922:6;24930:4;24935:1;24939;24935:5;24930:11;;;;;;;;;;;;;;24891:21;:51::i;:::-;24856:92;;24975:45;24997:7;25006:5;25013:6;24975:21;:45::i;:::-;24963:63;;;25045:10;25057;25069:2;25083:1;25073:12;;;;;;;;;;;;;;;;;;;;;;;;;21:6:-1;;108:14;25073:12:0;87:42:-1;143:17;;-1:-1;25073:12:0;;24963:137;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;24963:137:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;24963:137:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;24532:3:0;;;;;-1:-1:-1;24498:614:0;;-1:-1:-1;;;;;;;;24498:614:0;;;24396:723;;;:::o;14447:529::-;14548:21;14605:1;14590:4;:11;:16;;14582:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14670:4;:11;14659:23;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;14659:23:0;;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;125:4;109:14;101:6;88:42;144:17;;-1:-1;14659:23:0;;14649:33;;14723:9;14693:7;14718:1;14701:7;:14;:18;14693:27;;;;;;;;;;;;;;;;;:39;14757:11;;:15;;14743:226;14774:5;;14743:226;;14802:14;14818:15;14837:42;14849:7;14858:4;14867:1;14863;:5;14858:11;;;;;;;;;;;;;;14871:4;14876:1;14871:7;;;;;;;14837:42;14801:78;;;;14911:46;14923:7;14931:1;14923:10;;;;;;;;;;;;;;14935:9;14946:10;14911:11;:46::i;:::-;14894:7;14906:1;14902;:5;14894:14;;;;;;;;;;;;;;;;;:63;-1:-1:-1;;14781:3:0;;14743:226;;29655:1196;29768:6;29763:1081;29794:1;29780:4;:11;:15;29776:1;:19;29763:1081;;;29818:13;29833:14;29852:4;29857:1;29852:7;;;;;;;;;;;;;;29861:4;29866:1;29870;29866:5;29861:11;;;;;;;;;;;;;;29817:56;;;;29889:14;29908:39;29933:5;29940:6;29908:24;:39::i;:::-;29888:59;;;29962:16;29993:45;30015:7;30024:5;30031:6;29993:21;:45::i;:::-;29962:77;;30054:16;30085:17;30173:13;30188;30206:4;:16;;;:18;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;30206:18:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;30206:18:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;30206:18:0;;;;;;;30172:52;;;;;-1:-1:-1;30172:52:0;;-1:-1:-1;30240:17:0;;30281:15;;;;;;;;:61;;30323:8;30333;30281:61;;;30300:8;30310;30281:61;30239:103;;;;30371:56;30414:12;30378:5;30371:23;;;30403:4;30371:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;30371:56:0;30357:70;;30457:68;30484:11;30497:12;30511:13;30457:26;:68::i;:::-;30442:83;;29763:1081;;;;30556:15;30573;30601:6;30592:15;;:5;:15;;;:67;;30637:12;30656:1;30592:67;;;30616:1;30620:12;30592:67;30555:104;;;;30674:10;30705:1;30691:4;:11;:15;30687:1;:19;:79;;30763:3;30687:79;;;30709:51;30731:7;30740:6;30748:4;30753:1;30757;30753:5;30748:11;;;;;;;30709:51;30819:12;;;30829:1;30819:12;;;;;;;;;;30781:51;;;;;;;;;;;;;;;:9;:51;;;;;;;;;;;;;;;;;;;;;;30674:92;;-1:-1:-1;30781:9:0;;;;;;30791:10;;30803;;30674:92;;30819:12;;30781:51;;;;;;;;30819:12;;30781:51;;;;30819:12;;8:100:-1;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;30781:51:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;30781:51:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;29797:3:0;;;;;-1:-1:-1;29763:1081:0;;-1:-1:-1;;;;;;;;;;29763:1081:0;10188:129;10272:5;;;10267:16;;;;10259:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13306:470;13399:13;13445:1;13433:9;:13;13425:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13523:1;13511:9;:13;:31;;;;;13541:1;13528:10;:14;13511:31;13503:81;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13595:14;13612:36;13641:6;13612:24;:9;13626;13612:24;:13;:24;:::i;:::-;:28;:36;:28;:36;:::i;:::-;13595:53;-1:-1:-1;13659:16:0;13678:36;13708:5;13678:25;:10;13693:9;13678:25;:14;:25;:::i;:36::-;13659:55;;13736:32;13766:1;13749:11;13737:9;:23;;;;;;;13736:32;:29;:32;:::i;:::-;13725:43;13306:470;-1:-1:-1;;;;;;13306:470:0:o;12233:315::-;12315:12;12358:1;12348:7;:11;12340:58;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12428:1;12417:8;:12;:28;;;;;12444:1;12433:8;:12;12417:28;12409:78;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12532:8;12508:21;:7;12520:8;12508:21;:11;:21;:::i;:::-;:32;;;;;;;12233:315;-1:-1:-1;;;;12233:315:0:o;10718:343::-;10793:14;10809;10854:6;10844:16;;:6;:16;;;;10836:63;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10938:6;10929:15;;:6;:15;;;:53;;10967:6;10975;10929:53;;;10948:6;10956;10929:53;10910:72;;-1:-1:-1;10910:72:0;-1:-1:-1;11001:20:0;;;10993:60;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10718:343;;;;;:::o;16792:1369::-;17105:47;;;;;;:61;:47;;;;;;;;;;;;;;;;17010:12;;;;;;17120:7;17105:31;;;;;;:47;;;;;;;;;;;;;;;:31;:47;;;2:2:-1;;;;27:1;24;17:12;2:2;17105:47:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;17105:47:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;17105:47:0;:61;;;17101:144;;;17183:50;;;;;;:34;:50;;;;;;;;;;;;;;;;17198:7;17183:34;;;;;;:50;;;;;;;;;;;;;;;-1:-1:-1;17183:34:0;:50;;;2:2:-1;;;;27:1;24;17:12;2:2;17183:50:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;17183:50:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;;17101:144:0;17256:13;17271;17288:50;17314:7;17323:6;17331;17288:25;:50::i;:::-;17255:83;;;;17353:8;17365:1;17353:13;:30;;;;-1:-1:-1;17370:13:0;;17353:30;17349:805;;;17422:14;;-1:-1:-1;17438:14:0;;-1:-1:-1;17349:805:0;;;17486:19;17508:55;17528:14;17544:8;17554;17508:19;:55::i;:::-;17486:77;;17600:14;17582;:32;17578:565;;17661:10;17643:14;:28;;17635:76;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17752:14;;-1:-1:-1;17768:14:0;-1:-1:-1;17768:14:0;17578:565;;;17824:19;17846:55;17866:14;17882:8;17892;17846:19;:55::i;:::-;17824:77;;17945:14;17927;:32;;17920:40;;;;18005:10;17987:14;:28;;17979:76;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18096:14;-1:-1:-1;18112:14:0;;-1:-1:-1;17578:565:0;17349:805;;16792:1369;;;;;;;;;;;:::o;10325:142::-;10377:6;10404;;;:30;;-1:-1:-1;;10419:5:0;;;10433:1;10428;10419:5;10428:1;10414:15;;;;;:20;10404:30;10396:63;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10052:128;10136:5;;;10131:16;;;;10123:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11689:431;11782:13;11797;11824:14;11843:26;11854:6;11862;11843:10;:26::i;:::-;11823:46;;;11880:32;11888:7;11897:6;11905;11880:7;:32::i;:::-;;11924:13;11939;11969:32;11977:7;11986:6;11994;11969:7;:32::i;:::-;11957:57;;;:59;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;11957:59:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;11957:59:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;11957:59:0;;;;;;;11923:93;;;;;-1:-1:-1;11923:93:0;;-1:-1:-1;12050:16:0;;;;;;;;:62;;12093:8;12103;12050:62;;;12070:8;12080;12050:62;12027:85;;;;-1:-1:-1;11689:431:0;-1:-1:-1;;;;;;;11689:431:0:o

Swarm Source

ipfs://73f109e2cd07ee3c6a3a015eb9f5a63d6fbc14a0e9016742e194dbf0a7d521a7
Block Transaction Gas Used Reward
Age Block Fee Address BC Fee Address Voting Power Jailed Incoming
Block Uncle Number Difficulty Gas Used Reward
Loading