Contract 0x1b02da8cb0d097eb8d57a175b88c7d8b47997506 23

Txn Hash Method
Block
From
To
Value [Txn Fee]
0xd467a70090be476e03659267eca3597112bec720fb458bcbe939e76bb966c465Add Liquidity295087472022-12-05 21:58:4118 mins ago0x7ae632ce8af75b70dfbe2ca6310ba442ca743b4d IN  0x1b02da8cb0d097eb8d57a175b88c7d8b479975060 MATIC0.000140302064 3.234480585
0xcf1e9fc691dcae85c6f4ca10f9c90692908f6699d56fea7c964acde6eecc53c2Add Liquidity295086822022-12-05 21:53:1524 mins ago0x7ae632ce8af75b70dfbe2ca6310ba442ca743b4d IN  0x1b02da8cb0d097eb8d57a175b88c7d8b479975060 MATIC0.000835795994 35.17659909
0x551a44b258de70239411bfa26aba61bc41521591c3b1e549c353045837ae4af1Swap Tokens For ...295025842022-12-05 13:23:298 hrs 53 mins ago0xb77a1d265c7cb832dc056828848f07b3b89c8f59 IN  0x1b02da8cb0d097eb8d57a175b88c7d8b479975060 MATIC0.0002230799742.190000048
0x1f92bd7f981bfdc98643c2af57f92aacd89dd81667cc80c4317fcb8686d54d33Swap Exact ETH F...294877592022-12-04 16:44:131 day 5 hrs ago0xf66d14f9e1560d35dc6240f25823d41f86ac6c81 IN  0x1b02da8cb0d097eb8d57a175b88c7d8b479975060.002658229500425 MATIC0.000215162323 1.800024455
0x961cd2c2b42ef56e462dce9054553a7dce0841f69e8ba99441252c334c65ebf1Swap Exact Token...294806482022-12-04 6:49:471 day 15 hrs ago0xb77a1d265c7cb832dc056828848f07b3b89c8f59 IN  0x1b02da8cb0d097eb8d57a175b88c7d8b479975060 MATIC0.0002294820012.250000012
0xd5ad14f5f59f1fa8387491b6ae22233138d6de3bd9809418f59a0c8af496bdb9Swap Exact Token...294634832022-12-03 6:54:532 days 15 hrs ago0xb77a1d265c7cb832dc056828848f07b3b89c8f59 IN  0x1b02da8cb0d097eb8d57a175b88c7d8b479975060 MATIC0.0002294820012.250000012
0xa8345132bfc4fd8af9a21acc4365ffd21e20823b127d6d0c890c5404f50cbe8aSwap Exact Token...294619392022-12-03 4:45:492 days 17 hrs ago0xb77a1d265c7cb832dc056828848f07b3b89c8f59 IN  0x1b02da8cb0d097eb8d57a175b88c7d8b479975060 MATIC0.0002294820012.250000012
0xd737e4c616cba459cc18e0dc37dfc837eddaaa3d9d21d669e718b08901602ebaSwap Exact Token...294570022022-12-02 21:53:073 days 24 mins ago0xb77a1d265c7cb832dc056828848f07b3b89c8f59 IN  0x1b02da8cb0d097eb8d57a175b88c7d8b479975060 MATIC0.0002294820012.250000013
0xbf9c98ad6e3a3f8045b0e497d75158d9167923175c955446c12603e6067ad4a3Swap Exact Token...294569452022-12-02 21:48:213 days 28 mins ago0xb77a1d265c7cb832dc056828848f07b3b89c8f59 IN  0x1b02da8cb0d097eb8d57a175b88c7d8b479975060 MATIC0.0002294820012.250000012
0x9b885ffa28a1feb83527636e983c38b899a4432738d9d25d193052f84b27c92eSwap Exact Token...294552862022-12-02 19:29:403 days 2 hrs ago0xb77a1d265c7cb832dc056828848f07b3b89c8f59 IN  0x1b02da8cb0d097eb8d57a175b88c7d8b479975060 MATIC0.0002734943462.68152744
0x2f611d7edea1ba32991b69e3555621ed5e51750294549141594a6bf0c180395aSwap Exact Token...294552162022-12-02 19:23:493 days 2 hrs ago0xb77a1d265c7cb832dc056828848f07b3b89c8f59 IN  0x1b02da8cb0d097eb8d57a175b88c7d8b479975060 MATIC0.0002448572952.400750012
0x61d794bf93ecd24dbdf88f2458c93d8f739fc488594a11464f4c09f311a0a10bSwap Exact Token...294549552022-12-02 19:02:003 days 3 hrs ago0xb77a1d265c7cb832dc056828848f07b3b89c8f59 IN  0x1b02da8cb0d097eb8d57a175b88c7d8b479975060 MATIC0.0002294550012.250000012
0x96f538f36003ed64339adb3a1df5a48d98b23942ec80b2452550676dd39179abSwap Exact Token...294549342022-12-02 19:00:153 days 3 hrs ago0xb77a1d265c7cb832dc056828848f07b3b89c8f59 IN  0x1b02da8cb0d097eb8d57a175b88c7d8b479975060 MATIC0.0002294550012.250000012
0x9043cc7e5c2ce2171849737d08a18932f86068bf0dfd81ada4eaf4893ec51011Swap Exact Token...294548992022-12-02 18:57:193 days 3 hrs ago0xb77a1d265c7cb832dc056828848f07b3b89c8f59 IN  0x1b02da8cb0d097eb8d57a175b88c7d8b479975060 MATIC0.0002294550012.250000012
0xde4c8fda61941d775beb6f7085b3cd0f0a064974d1c88157ac70754582e7e6e8Swap Exact Token...294548652022-12-02 18:54:293 days 3 hrs ago0xb77a1d265c7cb832dc056828848f07b3b89c8f59 IN  0x1b02da8cb0d097eb8d57a175b88c7d8b479975060 MATIC0.0002365492512.587500013
0x176defedce3d57da28845b2a33925f78afb1c31fcfcefa1a8e36b1cfb84aef03Swap Exact Token...294548652022-12-02 18:54:293 days 3 hrs ago0xb77a1d265c7cb832dc056828848f07b3b89c8f59 IN  0x1b02da8cb0d097eb8d57a175b88c7d8b479975060 MATIC0.0002294550012.250000013
0xb881f33e72b845938b73ae1ab4181f14783b20d29a8a2bc6535e34f1d130f7ffSwap Exact Token...294547662022-12-02 18:46:123 days 3 hrs ago0xb77a1d265c7cb832dc056828848f07b3b89c8f59 IN  0x1b02da8cb0d097eb8d57a175b88c7d8b479975060 MATIC0.0002674035012.925000015
0x386a699bc42b109dddc3aff98a7b77642691653076b309fa4b8c10f524195fe9Swap Exact Token...294547662022-12-02 18:46:123 days 3 hrs ago0xb77a1d265c7cb832dc056828848f07b3b89c8f59 IN  0x1b02da8cb0d097eb8d57a175b88c7d8b479975060 MATIC0.0002294550012.250000012
0xe14b78b27a85c685847741425eed9e69480864ba4eca84d56eb829b882393a4dSwap Exact Token...294519292022-12-02 14:49:033 days 7 hrs ago0xb77a1d265c7cb832dc056828848f07b3b89c8f59 IN  0x1b02da8cb0d097eb8d57a175b88c7d8b479975060 MATIC0.0002294819982.249999989
0x19fde3b78b74bb51724bbbcb8cfbdcd2a5af6be8c5bef73d643b308806211ebeSwap Exact Token...294500472022-12-02 12:11:433 days 10 hrs ago0xb77a1d265c7cb832dc056828848f07b3b89c8f59 IN  0x1b02da8cb0d097eb8d57a175b88c7d8b479975060 MATIC0.0002294819982.249999986
0xaeb988591946f89ec312bfa3bc348a80c42e8181db6a8873876bf918c1ccbbdbSwap Exact Token...294493502022-12-02 11:13:283 days 11 hrs ago0x8a2638a5843b1830c9d319d242e08640951f6d2d IN  0x1b02da8cb0d097eb8d57a175b88c7d8b479975060 MATIC0.004568640001 30.00000001
0x4dc2a945585d3aa3d8a87ffaa0bf4ec39b286c85bd69809c64bfa3f23f1c66bfSwap Tokens For ...294432042022-12-02 2:39:423 days 19 hrs ago0xe2b081a5703e5afb7863ba0ee9d43e973963f8e8 IN  0x1b02da8cb0d097eb8d57a175b88c7d8b479975060 MATIC0.000298350001 1.500000008
0xcc2bfccc62c35354684f35cb0ddb2f2d6020193a91193473bab6ed6017ec4b51Swap Exact ETH F...294431772022-12-02 2:37:263 days 19 hrs ago0xe2b081a5703e5afb7863ba0ee9d43e973963f8e8 IN  0x1b02da8cb0d097eb8d57a175b88c7d8b479975060.02 MATIC0.000281236501 1.500000008
0x6133f39c04ff290a0bec8ba4c0f71920bbdfbcfa0bd320f8c8fb4e52671525e6Swap Exact ETH F...294429032022-12-02 2:14:323 days 20 hrs ago0x7f0086ab28df0dfd1f1772fd996be1440d6038a0 IN  0x1b02da8cb0d097eb8d57a175b88c7d8b479975060.02 MATIC0.000330093001 1.500000008
0xdb3aaf9198961185bd9de7f711b971cfff9bdd8fa937fde0874f88fb198f9cf5Add Liquidity ET...294428632022-12-02 2:11:113 days 20 hrs ago0x7f0086ab28df0dfd1f1772fd996be1440d6038a0 IN  0x1b02da8cb0d097eb8d57a175b88c7d8b479975061 MATIC0.003547688629 1.505910466
[ Download CSV Export 
Latest 25 internal transaction
Parent Txn Hash Block From To Value
0xe1f0557ded9b10b3674ca0bc258b3b58ff143de23fd313113871cd239b2c7bdc295027682022-12-05 13:38:528 hrs 38 mins ago 0x1b02da8cb0d097eb8d57a175b88c7d8b47997506 0xeed9cac93f9d3e1d9be05f589406fbeb8fd6e8ae0.00000000005019156 MATIC
0xe1f0557ded9b10b3674ca0bc258b3b58ff143de23fd313113871cd239b2c7bdc295027682022-12-05 13:38:528 hrs 38 mins ago 0x1b02da8cb0d097eb8d57a175b88c7d8b47997506 0x5b67676a984807a212b1c59ebfc9b3568a474f0a0.000000010038312028 MATIC
0xe1f0557ded9b10b3674ca0bc258b3b58ff143de23fd313113871cd239b2c7bdc295027682022-12-05 13:38:528 hrs 38 mins ago 0xeed9cac93f9d3e1d9be05f589406fbeb8fd6e8ae 0x1b02da8cb0d097eb8d57a175b88c7d8b479975060.000000010088503588 MATIC
0x8ffd281c3d6cbc2cdfcdccda2635fa16ba6fd2518d9341811573e12f8b1823e9295027652022-12-05 13:38:378 hrs 38 mins ago 0x1b02da8cb0d097eb8d57a175b88c7d8b47997506 0x5b67676a984807a212b1c59ebfc9b3568a474f0a0.00001 MATIC
0x8ffd281c3d6cbc2cdfcdccda2635fa16ba6fd2518d9341811573e12f8b1823e9295027652022-12-05 13:38:378 hrs 38 mins ago 0xeed9cac93f9d3e1d9be05f589406fbeb8fd6e8ae 0x1b02da8cb0d097eb8d57a175b88c7d8b479975060.00001 MATIC
0xc32310817063157691cfbdb1eb58602e7a9da3b4047690b38ffcb67010aea72a295023512022-12-05 13:04:019 hrs 13 mins ago 0x1b02da8cb0d097eb8d57a175b88c7d8b47997506 0x5b67676a984807a212b1c59ebfc9b3568a474f0a0.02 MATIC
0xc32310817063157691cfbdb1eb58602e7a9da3b4047690b38ffcb67010aea72a295023512022-12-05 13:04:019 hrs 13 mins ago 0xb5b4209ef143de7e183f32eb0f8429f3ccce0e92 0x1b02da8cb0d097eb8d57a175b88c7d8b479975060.02 MATIC
0x62e316425fad950ed15df409261affc15f9582ce721b3472f7d82b924ce7bbf1295020512022-12-05 12:38:569 hrs 38 mins ago 0x1b02da8cb0d097eb8d57a175b88c7d8b47997506 0x3a4668ba5807f8bb2609122b14d14f429cfdb4830.000000000050190557 MATIC
0x62e316425fad950ed15df409261affc15f9582ce721b3472f7d82b924ce7bbf1295020512022-12-05 12:38:569 hrs 38 mins ago 0x1b02da8cb0d097eb8d57a175b88c7d8b47997506 0x5b67676a984807a212b1c59ebfc9b3568a474f0a0.000000010038111445 MATIC
0x62e316425fad950ed15df409261affc15f9582ce721b3472f7d82b924ce7bbf1295020512022-12-05 12:38:569 hrs 38 mins ago 0x3a4668ba5807f8bb2609122b14d14f429cfdb483 0x1b02da8cb0d097eb8d57a175b88c7d8b479975060.000000010088302002 MATIC
0x9ec08c564b73b7dd07613376660b47b50697048150fce9feeacf6edca3945b61295020462022-12-05 12:38:319 hrs 38 mins ago 0x1b02da8cb0d097eb8d57a175b88c7d8b47997506 0x5b67676a984807a212b1c59ebfc9b3568a474f0a0.00001 MATIC
0x9ec08c564b73b7dd07613376660b47b50697048150fce9feeacf6edca3945b61295020462022-12-05 12:38:319 hrs 38 mins ago 0x3a4668ba5807f8bb2609122b14d14f429cfdb483 0x1b02da8cb0d097eb8d57a175b88c7d8b479975060.00001 MATIC
0xbc44eef8d5e99871d15a05a1e7d9b1620988c822f4ef285abf1b96ba27551fb2295019542022-12-05 12:30:509 hrs 46 mins ago 0x1b02da8cb0d097eb8d57a175b88c7d8b47997506 0xab7ae2bcd4cf5c037f992c95c646cd7bec96ffe20.000000000050189554 MATIC
0xbc44eef8d5e99871d15a05a1e7d9b1620988c822f4ef285abf1b96ba27551fb2295019542022-12-05 12:30:509 hrs 46 mins ago 0x1b02da8cb0d097eb8d57a175b88c7d8b47997506 0x5b67676a984807a212b1c59ebfc9b3568a474f0a0.000000010037910864 MATIC
0xbc44eef8d5e99871d15a05a1e7d9b1620988c822f4ef285abf1b96ba27551fb2295019542022-12-05 12:30:509 hrs 46 mins ago 0xab7ae2bcd4cf5c037f992c95c646cd7bec96ffe2 0x1b02da8cb0d097eb8d57a175b88c7d8b479975060.000000010088100418 MATIC
0x99b86245c8b3e32642844bac892c82be49abd65c5b4207cece4bdcc3a1a1d99d295019502022-12-05 12:30:299 hrs 46 mins ago 0x1b02da8cb0d097eb8d57a175b88c7d8b47997506 0x5b67676a984807a212b1c59ebfc9b3568a474f0a0.00001 MATIC
0x99b86245c8b3e32642844bac892c82be49abd65c5b4207cece4bdcc3a1a1d99d295019502022-12-05 12:30:299 hrs 46 mins ago 0xab7ae2bcd4cf5c037f992c95c646cd7bec96ffe2 0x1b02da8cb0d097eb8d57a175b88c7d8b479975060.00001 MATIC
0x439d914ddc0bd0b6a88d839ee8f117eac3a1e412806155e9d593ae6fe2a0c615295019022022-12-05 12:26:299 hrs 50 mins ago 0x1b02da8cb0d097eb8d57a175b88c7d8b47997506 0x50343e8de58d9ef04d211e164c88f6dbfb37695a0.000000000050188551 MATIC
0x439d914ddc0bd0b6a88d839ee8f117eac3a1e412806155e9d593ae6fe2a0c615295019022022-12-05 12:26:299 hrs 50 mins ago 0x1b02da8cb0d097eb8d57a175b88c7d8b47997506 0x5b67676a984807a212b1c59ebfc9b3568a474f0a0.000000010037710285 MATIC
0x439d914ddc0bd0b6a88d839ee8f117eac3a1e412806155e9d593ae6fe2a0c615295019022022-12-05 12:26:299 hrs 50 mins ago 0x50343e8de58d9ef04d211e164c88f6dbfb37695a 0x1b02da8cb0d097eb8d57a175b88c7d8b479975060.000000010087898836 MATIC
0xd8922ed5c4a3d9b00eda065fee11c6f14320294884a1dbbdc4d5a84881d7422f295018962022-12-05 12:25:599 hrs 51 mins ago 0x1b02da8cb0d097eb8d57a175b88c7d8b47997506 0x5b67676a984807a212b1c59ebfc9b3568a474f0a0.00001 MATIC
0xd8922ed5c4a3d9b00eda065fee11c6f14320294884a1dbbdc4d5a84881d7422f295018962022-12-05 12:25:599 hrs 51 mins ago 0x50343e8de58d9ef04d211e164c88f6dbfb37695a 0x1b02da8cb0d097eb8d57a175b88c7d8b479975060.00001 MATIC
0xb88562ccca4375ea593b56f6ee401dd9dc0dff0644954d4e2e57f72e935eba37295018582022-12-05 12:22:489 hrs 54 mins ago 0x1b02da8cb0d097eb8d57a175b88c7d8b479975060xcaf4118f4d597265a9b8c3c3c758fbc4521b50970.000000000050187548 MATIC
0xb88562ccca4375ea593b56f6ee401dd9dc0dff0644954d4e2e57f72e935eba37295018582022-12-05 12:22:489 hrs 54 mins ago 0x1b02da8cb0d097eb8d57a175b88c7d8b47997506 0x5b67676a984807a212b1c59ebfc9b3568a474f0a0.000000010037509708 MATIC
0xb88562ccca4375ea593b56f6ee401dd9dc0dff0644954d4e2e57f72e935eba37295018582022-12-05 12:22:489 hrs 54 mins ago 0xcaf4118f4d597265a9b8c3c3c758fbc4521b5097 0x1b02da8cb0d097eb8d57a175b88c7d8b479975060.000000010087697256 MATIC
[ Download CSV Export 
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
UniswapV2Router02

Compiler Version
v0.6.12+commit.27d51765

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, GNU GPLv3 license

Contract Source Code (Solidity)

/**
 *Submitted for verification at polygonscan.com on 2021-07-19
*/

/**
 *Submitted for verification at polygonscan.com on 2021-06-09
*/

// File: contracts/uniswapv2/interfaces/IUniswapV2Pair.sol

pragma solidity >=0.5.0;

interface IUniswapV2Pair {
    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/uniswapv2/libraries/SafeMath.sol

pragma solidity =0.6.12;

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

library SafeMathUniswap {
    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/uniswapv2/libraries/UniswapV2Library.sol

pragma solidity >=0.5.0;



library UniswapV2Library {
    using SafeMathUniswap 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, 'UniswapV2Library: IDENTICAL_ADDRESSES');
        (token0, token1) = tokenA < tokenB ? (tokenA, tokenB) : (tokenB, tokenA);
        require(token0 != address(0), 'UniswapV2Library: 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'e18a34eb0e04b04f7a0ac29a6e80748dca96319b42c54d679cb821dca90c6303' // init code hash
            ))));
    }

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

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

    // performs chained getAmountOut calculations on any number of pairs
    function getAmountsOut(address factory, uint amountIn, address[] memory path) internal view returns (uint[] memory amounts) {
        require(path.length >= 2, 'UniswapV2Library: 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, 'UniswapV2Library: 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/uniswapv2/libraries/TransferHelper.sol

// SPDX-License-Identifier: GPL-3.0-or-later

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/uniswapv2/interfaces/IUniswapV2Router01.sol

pragma solidity >=0.6.2;

interface IUniswapV2Router01 {
    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/uniswapv2/interfaces/IUniswapV2Router02.sol

pragma solidity >=0.6.2;


interface IUniswapV2Router02 is IUniswapV2Router01 {
    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/uniswapv2/interfaces/IUniswapV2Factory.sol

pragma solidity >=0.5.0;

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

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

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

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

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

// File: contracts/uniswapv2/interfaces/IERC20.sol

pragma solidity >=0.5.0;

interface IERC20Uniswap {
    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/uniswapv2/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/uniswapv2/UniswapV2Router02.sol

pragma solidity =0.6.12;








contract UniswapV2Router02 is IUniswapV2Router02 {
    using SafeMathUniswap for uint;

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

    modifier ensure(uint deadline) {
        require(deadline >= block.timestamp, 'UniswapV2Router: 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 (IUniswapV2Factory(factory).getPair(tokenA, tokenB) == address(0)) {
            IUniswapV2Factory(factory).createPair(tokenA, tokenB);
        }
        (uint reserveA, uint reserveB) = UniswapV2Library.getReserves(factory, tokenA, tokenB);
        if (reserveA == 0 && reserveB == 0) {
            (amountA, amountB) = (amountADesired, amountBDesired);
        } else {
            uint amountBOptimal = UniswapV2Library.quote(amountADesired, reserveA, reserveB);
            if (amountBOptimal <= amountBDesired) {
                require(amountBOptimal >= amountBMin, 'UniswapV2Router: INSUFFICIENT_B_AMOUNT');
                (amountA, amountB) = (amountADesired, amountBOptimal);
            } else {
                uint amountAOptimal = UniswapV2Library.quote(amountBDesired, reserveB, reserveA);
                assert(amountAOptimal <= amountADesired);
                require(amountAOptimal >= amountAMin, 'UniswapV2Router: 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 = UniswapV2Library.pairFor(factory, tokenA, tokenB);
        TransferHelper.safeTransferFrom(tokenA, msg.sender, pair, amountA);
        TransferHelper.safeTransferFrom(tokenB, msg.sender, pair, amountB);
        liquidity = IUniswapV2Pair(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 = UniswapV2Library.pairFor(factory, token, WETH);
        TransferHelper.safeTransferFrom(token, msg.sender, pair, amountToken);
        IWETH(WETH).deposit{value: amountETH}();
        assert(IWETH(WETH).transfer(pair, amountETH));
        liquidity = IUniswapV2Pair(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 = UniswapV2Library.pairFor(factory, tokenA, tokenB);
        IUniswapV2Pair(pair).transferFrom(msg.sender, pair, liquidity); // send liquidity to pair
        (uint amount0, uint amount1) = IUniswapV2Pair(pair).burn(to);
        (address token0,) = UniswapV2Library.sortTokens(tokenA, tokenB);
        (amountA, amountB) = tokenA == token0 ? (amount0, amount1) : (amount1, amount0);
        require(amountA >= amountAMin, 'UniswapV2Router: INSUFFICIENT_A_AMOUNT');
        require(amountB >= amountBMin, 'UniswapV2Router: 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 = UniswapV2Library.pairFor(factory, tokenA, tokenB);
        uint value = approveMax ? uint(-1) : liquidity;
        IUniswapV2Pair(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 = UniswapV2Library.pairFor(factory, token, WETH);
        uint value = approveMax ? uint(-1) : liquidity;
        IUniswapV2Pair(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, IERC20Uniswap(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 = UniswapV2Library.pairFor(factory, token, WETH);
        uint value = approveMax ? uint(-1) : liquidity;
        IUniswapV2Pair(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,) = UniswapV2Library.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 ? UniswapV2Library.pairFor(factory, output, path[i + 2]) : _to;
            IUniswapV2Pair(UniswapV2Library.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 = UniswapV2Library.getAmountsOut(factory, amountIn, path);
        require(amounts[amounts.length - 1] >= amountOutMin, 'UniswapV2Router: INSUFFICIENT_OUTPUT_AMOUNT');
        TransferHelper.safeTransferFrom(
            path[0], msg.sender, UniswapV2Library.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 = UniswapV2Library.getAmountsIn(factory, amountOut, path);
        require(amounts[0] <= amountInMax, 'UniswapV2Router: EXCESSIVE_INPUT_AMOUNT');
        TransferHelper.safeTransferFrom(
            path[0], msg.sender, UniswapV2Library.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, 'UniswapV2Router: INVALID_PATH');
        amounts = UniswapV2Library.getAmountsOut(factory, msg.value, path);
        require(amounts[amounts.length - 1] >= amountOutMin, 'UniswapV2Router: INSUFFICIENT_OUTPUT_AMOUNT');
        IWETH(WETH).deposit{value: amounts[0]}();
        assert(IWETH(WETH).transfer(UniswapV2Library.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, 'UniswapV2Router: INVALID_PATH');
        amounts = UniswapV2Library.getAmountsIn(factory, amountOut, path);
        require(amounts[0] <= amountInMax, 'UniswapV2Router: EXCESSIVE_INPUT_AMOUNT');
        TransferHelper.safeTransferFrom(
            path[0], msg.sender, UniswapV2Library.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, 'UniswapV2Router: INVALID_PATH');
        amounts = UniswapV2Library.getAmountsOut(factory, amountIn, path);
        require(amounts[amounts.length - 1] >= amountOutMin, 'UniswapV2Router: INSUFFICIENT_OUTPUT_AMOUNT');
        TransferHelper.safeTransferFrom(
            path[0], msg.sender, UniswapV2Library.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, 'UniswapV2Router: INVALID_PATH');
        amounts = UniswapV2Library.getAmountsIn(factory, amountOut, path);
        require(amounts[0] <= msg.value, 'UniswapV2Router: EXCESSIVE_INPUT_AMOUNT');
        IWETH(WETH).deposit{value: amounts[0]}();
        assert(IWETH(WETH).transfer(UniswapV2Library.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,) = UniswapV2Library.sortTokens(input, output);
            IUniswapV2Pair pair = IUniswapV2Pair(UniswapV2Library.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 = IERC20Uniswap(input).balanceOf(address(pair)).sub(reserveInput);
            amountOutput = UniswapV2Library.getAmountOut(amountInput, reserveInput, reserveOutput);
            }
            (uint amount0Out, uint amount1Out) = input == token0 ? (uint(0), amountOutput) : (amountOutput, uint(0));
            address to = i < path.length - 2 ? UniswapV2Library.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, UniswapV2Library.pairFor(factory, path[0], path[1]), amountIn
        );
        uint balanceBefore = IERC20Uniswap(path[path.length - 1]).balanceOf(to);
        _swapSupportingFeeOnTransferTokens(path, to);
        require(
            IERC20Uniswap(path[path.length - 1]).balanceOf(to).sub(balanceBefore) >= amountOutMin,
            'UniswapV2Router: INSUFFICIENT_OUTPUT_AMOUNT'
        );
    }
    function swapExactETHForTokensSupportingFeeOnTransferTokens(
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    )
        external
        virtual
        override
        payable
        ensure(deadline)
    {
        require(path[0] == WETH, 'UniswapV2Router: INVALID_PATH');
        uint amountIn = msg.value;
        IWETH(WETH).deposit{value: amountIn}();
        assert(IWETH(WETH).transfer(UniswapV2Library.pairFor(factory, path[0], path[1]), amountIn));
        uint balanceBefore = IERC20Uniswap(path[path.length - 1]).balanceOf(to);
        _swapSupportingFeeOnTransferTokens(path, to);
        require(
            IERC20Uniswap(path[path.length - 1]).balanceOf(to).sub(balanceBefore) >= amountOutMin,
            'UniswapV2Router: 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, 'UniswapV2Router: INVALID_PATH');
        TransferHelper.safeTransferFrom(
            path[0], msg.sender, UniswapV2Library.pairFor(factory, path[0], path[1]), amountIn
        );
        _swapSupportingFeeOnTransferTokens(path, address(this));
        uint amountOut = IERC20Uniswap(WETH).balanceOf(address(this));
        require(amountOut >= amountOutMin, 'UniswapV2Router: 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 UniswapV2Library.quote(amountA, reserveA, reserveB);
    }

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

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

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

    function getAmountsIn(uint amountOut, address[] memory path)
        public
        view
        virtual
        override
        returns (uint[] memory amounts)
    {
        return UniswapV2Library.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"}]

60c060405234801561001057600080fd5b50604051620046e7380380620046e78339818101604052604081101561003557600080fd5b5080516020909101516001600160601b0319606092831b8116608052911b1660a05260805160601c60a05160601c614562620001856000398061015f5280610ce45280610d1f5280610e16528061103452806113be528061152452806118d352806119ae5280611a885280611b565280611c9c5280611d245280611f605280611fdb528061208f528061215b52806121f05280612264528061274752806129b15280612a075280612a3b5280612aaf5280612c3d5280612d805280612e08525080610ea45280610f7b52806110fa5280611133528061126e528061144c528061150252806116725280611be95280611d565280611eb0528061229652806124d452806126cc52806126f55280612725528061289252806129e55280612cd05280612e3a52806136c0528061370352806139dd5280613b535280613f445280613ffd52806140b052506145626000f3fe60806040526004361061014f5760003560e01c80638803dbee116100b6578063c45a01551161006f578063c45a015514610a10578063d06ca61f14610a25578063ded9382a14610ada578063e8e3370014610b4d578063f305d71914610bcd578063fb3bdb4114610c1357610188565b80638803dbee146107df578063ad5c464814610875578063ad615dec146108a6578063af2979eb146108dc578063b6f9de951461092f578063baa2abde146109b357610188565b80634a25d94a116101085780634a25d94a146104f05780635b0d5984146105865780635c11d795146105f9578063791ac9471461068f5780637ff36ab51461072557806385f8c259146107a957610188565b806302751cec1461018d578063054d50d4146101f957806318cbafe5146102415780631f00ca74146103275780632195995c146103dc57806338ed17391461045a57610188565b3661018857336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461018657fe5b005b600080fd5b34801561019957600080fd5b506101e0600480360360c08110156101b057600080fd5b506001600160a01b0381358116916020810135916040820135916060810135916080820135169060a00135610c97565b6040805192835260208301919091528051918290030190f35b34801561020557600080fd5b5061022f6004803603606081101561021c57600080fd5b5080359060208101359060400135610db1565b60408051918252519081900360200190f35b34801561024d57600080fd5b506102d7600480360360a081101561026457600080fd5b813591602081013591810190606081016040820135600160201b81111561028a57600080fd5b82018360208201111561029c57600080fd5b803590602001918460208302840111600160201b831117156102bd57600080fd5b91935091506001600160a01b038135169060200135610dc6565b60408051602080825283518183015283519192839290830191858101910280838360005b838110156103135781810151838201526020016102fb565b505050509050019250505060405180910390f35b34801561033357600080fd5b506102d76004803603604081101561034a57600080fd5b81359190810190604081016020820135600160201b81111561036b57600080fd5b82018360208201111561037d57600080fd5b803590602001918460208302840111600160201b8311171561039e57600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295506110f3945050505050565b3480156103e857600080fd5b506101e0600480360361016081101561040057600080fd5b506001600160a01b038135811691602081013582169160408201359160608101359160808201359160a08101359091169060c08101359060e081013515159060ff6101008201351690610120810135906101400135611129565b34801561046657600080fd5b506102d7600480360360a081101561047d57600080fd5b813591602081013591810190606081016040820135600160201b8111156104a357600080fd5b8201836020820111156104b557600080fd5b803590602001918460208302840111600160201b831117156104d657600080fd5b91935091506001600160a01b038135169060200135611223565b3480156104fc57600080fd5b506102d7600480360360a081101561051357600080fd5b813591602081013591810190606081016040820135600160201b81111561053957600080fd5b82018360208201111561054b57600080fd5b803590602001918460208302840111600160201b8311171561056c57600080fd5b91935091506001600160a01b03813516906020013561136e565b34801561059257600080fd5b5061022f60048036036101408110156105aa57600080fd5b506001600160a01b0381358116916020810135916040820135916060810135916080820135169060a08101359060c081013515159060ff60e082013516906101008101359061012001356114fa565b34801561060557600080fd5b50610186600480360360a081101561061c57600080fd5b813591602081013591810190606081016040820135600160201b81111561064257600080fd5b82018360208201111561065457600080fd5b803590602001918460208302840111600160201b8311171561067557600080fd5b91935091506001600160a01b038135169060200135611608565b34801561069b57600080fd5b50610186600480360360a08110156106b257600080fd5b813591602081013591810190606081016040820135600160201b8111156106d857600080fd5b8201836020820111156106ea57600080fd5b803590602001918460208302840111600160201b8311171561070b57600080fd5b91935091506001600160a01b038135169060200135611885565b6102d76004803603608081101561073b57600080fd5b81359190810190604081016020820135600160201b81111561075c57600080fd5b82018360208201111561076e57600080fd5b803590602001918460208302840111600160201b8311171561078f57600080fd5b91935091506001600160a01b038135169060200135611b0e565b3480156107b557600080fd5b5061022f600480360360608110156107cc57600080fd5b5080359060208101359060400135611e58565b3480156107eb57600080fd5b506102d7600480360360a081101561080257600080fd5b813591602081013591810190606081016040820135600160201b81111561082857600080fd5b82018360208201111561083a57600080fd5b803590602001918460208302840111600160201b8311171561085b57600080fd5b91935091506001600160a01b038135169060200135611e65565b34801561088157600080fd5b5061088a611f5e565b604080516001600160a01b039092168252519081900360200190f35b3480156108b257600080fd5b5061022f600480360360608110156108c957600080fd5b5080359060208101359060400135611f82565b3480156108e857600080fd5b5061022f600480360360c08110156108ff57600080fd5b506001600160a01b0381358116916020810135916040820135916060810135916080820135169060a00135611f8f565b6101866004803603608081101561094557600080fd5b81359190810190604081016020820135600160201b81111561096657600080fd5b82018360208201111561097857600080fd5b803590602001918460208302840111600160201b8311171561099957600080fd5b91935091506001600160a01b038135169060200135612115565b3480156109bf57600080fd5b506101e0600480360360e08110156109d657600080fd5b506001600160a01b038135811691602081013582169160408201359160608101359160808201359160a08101359091169060c00135612486565b348015610a1c57600080fd5b5061088a6126ca565b348015610a3157600080fd5b506102d760048036036040811015610a4857600080fd5b81359190810190604081016020820135600160201b811115610a6957600080fd5b820183602082011115610a7b57600080fd5b803590602001918460208302840111600160201b83111715610a9c57600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295506126ee945050505050565b348015610ae657600080fd5b506101e06004803603610140811015610afe57600080fd5b506001600160a01b0381358116916020810135916040820135916060810135916080820135169060a08101359060c081013515159060ff60e0820135169061010081013590610120013561271b565b348015610b5957600080fd5b50610baf6004803603610100811015610b7157600080fd5b506001600160a01b038135811691602081013582169160408201359160608101359160808201359160a08101359160c0820135169060e0013561282f565b60408051938452602084019290925282820152519081900360600190f35b610baf600480360360c0811015610be357600080fd5b506001600160a01b0381358116916020810135916040820135916060810135916080820135169060a00135612962565b6102d760048036036080811015610c2957600080fd5b81359190810190604081016020820135600160201b811115610c4a57600080fd5b820183602082011115610c5c57600080fd5b803590602001918460208302840111600160201b83111715610c7d57600080fd5b91935091506001600160a01b038135169060200135612bf5565b6000808242811015610cde576040805162461bcd60e51b8152602060048201526018602482015260008051602061450d833981519152604482015290519081900360640190fd5b610d0d897f00000000000000000000000000000000000000000000000000000000000000008a8a8a308a612486565b9093509150610d1d898685612f6e565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632e1a7d4d836040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b158015610d8357600080fd5b505af1158015610d97573d6000803e3d6000fd5b50505050610da585836130d8565b50965096945050505050565b6000610dbe8484846131d0565b949350505050565b60608142811015610e0c576040805162461bcd60e51b8152602060048201526018602482015260008051602061450d833981519152604482015290519081900360640190fd5b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001686866000198101818110610e4657fe5b905060200201356001600160a01b03166001600160a01b031614610e9f576040805162461bcd60e51b815260206004820152601d602482015260008051602061442a833981519152604482015290519081900360640190fd5b610efd7f0000000000000000000000000000000000000000000000000000000000000000898888808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152506132a892505050565b91508682600184510381518110610f1057fe5b60200260200101511015610f555760405162461bcd60e51b815260040180806020018281038252602b815260200180614493602b913960400191505060405180910390fd5b610ff386866000818110610f6557fe5b905060200201356001600160a01b031633610fd97f00000000000000000000000000000000000000000000000000000000000000008a8a6000818110610fa757fe5b905060200201356001600160a01b03168b8b6001818110610fc457fe5b905060200201356001600160a01b03166133f4565b85600081518110610fe657fe5b60200260200101516134b4565b61103282878780806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250309250613611915050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632e1a7d4d8360018551038151811061107157fe5b60200260200101516040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b1580156110af57600080fd5b505af11580156110c3573d6000803e3d6000fd5b505050506110e884836001855103815181106110db57fe5b60200260200101516130d8565b509695505050505050565b60606111207f0000000000000000000000000000000000000000000000000000000000000000848461384e565b90505b92915050565b60008060006111597f00000000000000000000000000000000000000000000000000000000000000008f8f6133f4565b9050600087611168578c61116c565b6000195b6040805163d505accf60e01b815233600482015230602482015260448101839052606481018c905260ff8a16608482015260a4810189905260c4810188905290519192506001600160a01b0384169163d505accf9160e48082019260009290919082900301818387803b1580156111e257600080fd5b505af11580156111f6573d6000803e3d6000fd5b505050506112098f8f8f8f8f8f8f612486565b809450819550505050509b509b9950505050505050505050565b60608142811015611269576040805162461bcd60e51b8152602060048201526018602482015260008051602061450d833981519152604482015290519081900360640190fd5b6112c77f0000000000000000000000000000000000000000000000000000000000000000898888808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152506132a892505050565b915086826001845103815181106112da57fe5b6020026020010151101561131f5760405162461bcd60e51b815260040180806020018281038252602b815260200180614493602b913960400191505060405180910390fd5b61132f86866000818110610f6557fe5b6110e882878780806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250899250613611915050565b606081428110156113b4576040805162461bcd60e51b8152602060048201526018602482015260008051602061450d833981519152604482015290519081900360640190fd5b6001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016868660001981018181106113ee57fe5b905060200201356001600160a01b03166001600160a01b031614611447576040805162461bcd60e51b815260206004820152601d602482015260008051602061442a833981519152604482015290519081900360640190fd5b6114a57f00000000000000000000000000000000000000000000000000000000000000008988888080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061384e92505050565b915086826000815181106114b557fe5b60200260200101511115610f555760405162461bcd60e51b81526004018080602001828103825260278152602001806144036027913960400191505060405180910390fd5b6000806115487f00000000000000000000000000000000000000000000000000000000000000008d7f00000000000000000000000000000000000000000000000000000000000000006133f4565b9050600086611557578b61155b565b6000195b6040805163d505accf60e01b815233600482015230602482015260448101839052606481018b905260ff8916608482015260a4810188905260c4810187905290519192506001600160a01b0384169163d505accf9160e48082019260009290919082900301818387803b1580156115d157600080fd5b505af11580156115e5573d6000803e3d6000fd5b505050506115f78d8d8d8d8d8d611f8f565b9d9c50505050505050505050505050565b804281101561164c576040805162461bcd60e51b8152602060048201526018602482015260008051602061450d833981519152604482015290519081900360640190fd5b6116c18585600081811061165c57fe5b905060200201356001600160a01b0316336116bb7f00000000000000000000000000000000000000000000000000000000000000008989600081811061169e57fe5b905060200201356001600160a01b03168a8a6001818110610fc457fe5b8a6134b4565b6000858560001981018181106116d357fe5b905060200201356001600160a01b03166001600160a01b03166370a08231856040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561172f57600080fd5b505afa158015611743573d6000803e3d6000fd5b505050506040513d602081101561175957600080fd5b5051604080516020888102828101820190935288825292935061179b929091899189918291850190849080828437600092019190915250889250613986915050565b8661183e82888860001981018181106117b057fe5b905060200201356001600160a01b03166001600160a01b03166370a08231886040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561180c57600080fd5b505afa158015611820573d6000803e3d6000fd5b505050506040513d602081101561183657600080fd5b505190613c88565b101561187b5760405162461bcd60e51b815260040180806020018281038252602b815260200180614493602b913960400191505060405180910390fd5b5050505050505050565b80428110156118c9576040805162461bcd60e51b8152602060048201526018602482015260008051602061450d833981519152604482015290519081900360640190fd5b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000168585600019810181811061190357fe5b905060200201356001600160a01b03166001600160a01b03161461195c576040805162461bcd60e51b815260206004820152601d602482015260008051602061442a833981519152604482015290519081900360640190fd5b61196c8585600081811061165c57fe5b6119aa858580806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250309250613986915050565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015611a1957600080fd5b505afa158015611a2d573d6000803e3d6000fd5b505050506040513d6020811015611a4357600080fd5b5051905086811015611a865760405162461bcd60e51b815260040180806020018281038252602b815260200180614493602b913960400191505060405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632e1a7d4d826040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b158015611aec57600080fd5b505af1158015611b00573d6000803e3d6000fd5b5050505061187b84826130d8565b60608142811015611b54576040805162461bcd60e51b8152602060048201526018602482015260008051602061450d833981519152604482015290519081900360640190fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031686866000818110611b8b57fe5b905060200201356001600160a01b03166001600160a01b031614611be4576040805162461bcd60e51b815260206004820152601d602482015260008051602061442a833981519152604482015290519081900360640190fd5b611c427f0000000000000000000000000000000000000000000000000000000000000000348888808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152506132a892505050565b91508682600184510381518110611c5557fe5b60200260200101511015611c9a5760405162461bcd60e51b815260040180806020018281038252602b815260200180614493602b913960400191505060405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db083600081518110611cd657fe5b60200260200101516040518263ffffffff1660e01b81526004016000604051808303818588803b158015611d0957600080fd5b505af1158015611d1d573d6000803e3d6000fd5b50505050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a9059cbb611d827f00000000000000000000000000000000000000000000000000000000000000008989600081811061169e57fe5b84600081518110611d8f57fe5b60200260200101516040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050602060405180830381600087803b158015611ddd57600080fd5b505af1158015611df1573d6000803e3d6000fd5b505050506040513d6020811015611e0757600080fd5b5051611e0f57fe5b611e4e82878780806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250899250613611915050565b5095945050505050565b6000610dbe848484613cd8565b60608142811015611eab576040805162461bcd60e51b8152602060048201526018602482015260008051602061450d833981519152604482015290519081900360640190fd5b611f097f00000000000000000000000000000000000000000000000000000000000000008988888080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061384e92505050565b91508682600081518110611f1957fe5b6020026020010151111561131f5760405162461bcd60e51b81526004018080602001828103825260278152602001806144036027913960400191505060405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000081565b6000610dbe848484613db0565b60008142811015611fd5576040805162461bcd60e51b8152602060048201526018602482015260008051602061450d833981519152604482015290519081900360640190fd5b612004887f00000000000000000000000000000000000000000000000000000000000000008989893089612486565b90508092505061208d88858a6001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561205c57600080fd5b505afa158015612070573d6000803e3d6000fd5b505050506040513d602081101561208657600080fd5b5051612f6e565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632e1a7d4d836040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b1580156120f357600080fd5b505af1158015612107573d6000803e3d6000fd5b505050506110e884836130d8565b8042811015612159576040805162461bcd60e51b8152602060048201526018602482015260008051602061450d833981519152604482015290519081900360640190fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168585600081811061219057fe5b905060200201356001600160a01b03166001600160a01b0316146121e9576040805162461bcd60e51b815260206004820152601d602482015260008051602061442a833981519152604482015290519081900360640190fd5b60003490507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db0826040518263ffffffff1660e01b81526004016000604051808303818588803b15801561224957600080fd5b505af115801561225d573d6000803e3d6000fd5b50505050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a9059cbb6122c27f00000000000000000000000000000000000000000000000000000000000000008989600081811061169e57fe5b836040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050602060405180830381600087803b15801561230957600080fd5b505af115801561231d573d6000803e3d6000fd5b505050506040513d602081101561233357600080fd5b505161233b57fe5b60008686600019810181811061234d57fe5b905060200201356001600160a01b03166001600160a01b03166370a08231866040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b1580156123a957600080fd5b505afa1580156123bd573d6000803e3d6000fd5b505050506040513d60208110156123d357600080fd5b505160408051602089810282810182019093528982529293506124159290918a918a918291850190849080828437600092019190915250899250613986915050565b8761183e828989600019810181811061242a57fe5b905060200201356001600160a01b03166001600160a01b03166370a08231896040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561180c57600080fd5b60008082428110156124cd576040805162461bcd60e51b8152602060048201526018602482015260008051602061450d833981519152604482015290519081900360640190fd5b60006124fa7f00000000000000000000000000000000000000000000000000000000000000008c8c6133f4565b604080516323b872dd60e01b81523360048201526001600160a01b03831660248201819052604482018d9052915192935090916323b872dd916064808201926020929091908290030181600087803b15801561255557600080fd5b505af1158015612569573d6000803e3d6000fd5b505050506040513d602081101561257f57600080fd5b50506040805163226bf2d160e21b81526001600160a01b03888116600483015282516000938493928616926389afcb44926024808301939282900301818787803b1580156125cc57600080fd5b505af11580156125e0573d6000803e3d6000fd5b505050506040513d60408110156125f657600080fd5b508051602090910151909250905060006126108e8e613e56565b509050806001600160a01b03168e6001600160a01b031614612633578183612636565b82825b90975095508a87101561267a5760405162461bcd60e51b815260040180806020018281038252602681526020018061444a6026913960400191505060405180910390fd5b898610156126b95760405162461bcd60e51b81526004018080602001828103825260268152602001806143906026913960400191505060405180910390fd5b505050505097509795505050505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b60606111207f000000000000000000000000000000000000000000000000000000000000000084846132a8565b600080600061276b7f00000000000000000000000000000000000000000000000000000000000000008e7f00000000000000000000000000000000000000000000000000000000000000006133f4565b905060008761277a578c61277e565b6000195b6040805163d505accf60e01b815233600482015230602482015260448101839052606481018c905260ff8a16608482015260a4810189905260c4810188905290519192506001600160a01b0384169163d505accf9160e48082019260009290919082900301818387803b1580156127f457600080fd5b505af1158015612808573d6000803e3d6000fd5b5050505061281a8e8e8e8e8e8e610c97565b909f909e509c50505050505050505050505050565b60008060008342811015612878576040805162461bcd60e51b8152602060048201526018602482015260008051602061450d833981519152604482015290519081900360640190fd5b6128868c8c8c8c8c8c613f34565b909450925060006128b87f00000000000000000000000000000000000000000000000000000000000000008e8e6133f4565b90506128c68d3383886134b4565b6128d28c3383876134b4565b806001600160a01b0316636a627842886040518263ffffffff1660e01b815260040180826001600160a01b03168152602001915050602060405180830381600087803b15801561292157600080fd5b505af1158015612935573d6000803e3d6000fd5b505050506040513d602081101561294b57600080fd5b5051949d939c50939a509198505050505050505050565b600080600083428110156129ab576040805162461bcd60e51b8152602060048201526018602482015260008051602061450d833981519152604482015290519081900360640190fd5b6129d98a7f00000000000000000000000000000000000000000000000000000000000000008b348c8c613f34565b90945092506000612a2b7f00000000000000000000000000000000000000000000000000000000000000008c7f00000000000000000000000000000000000000000000000000000000000000006133f4565b9050612a398b3383886134b4565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db0856040518263ffffffff1660e01b81526004016000604051808303818588803b158015612a9457600080fd5b505af1158015612aa8573d6000803e3d6000fd5b50505050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a9059cbb82866040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050602060405180830381600087803b158015612b2457600080fd5b505af1158015612b38573d6000803e3d6000fd5b505050506040513d6020811015612b4e57600080fd5b5051612b5657fe5b806001600160a01b0316636a627842886040518263ffffffff1660e01b815260040180826001600160a01b03168152602001915050602060405180830381600087803b158015612ba557600080fd5b505af1158015612bb9573d6000803e3d6000fd5b505050506040513d6020811015612bcf57600080fd5b5051925034841015612be757612be7338534036130d8565b505096509650969350505050565b60608142811015612c3b576040805162461bcd60e51b8152602060048201526018602482015260008051602061450d833981519152604482015290519081900360640190fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031686866000818110612c7257fe5b905060200201356001600160a01b03166001600160a01b031614612ccb576040805162461bcd60e51b815260206004820152601d602482015260008051602061442a833981519152604482015290519081900360640190fd5b612d297f00000000000000000000000000000000000000000000000000000000000000008888888080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061384e92505050565b91503482600081518110612d3957fe5b60200260200101511115612d7e5760405162461bcd60e51b81526004018080602001828103825260278152602001806144036027913960400191505060405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db083600081518110612dba57fe5b60200260200101516040518263ffffffff1660e01b81526004016000604051808303818588803b158015612ded57600080fd5b505af1158015612e01573d6000803e3d6000fd5b50505050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a9059cbb612e667f00000000000000000000000000000000000000000000000000000000000000008989600081811061169e57fe5b84600081518110612e7357fe5b60200260200101516040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050602060405180830381600087803b158015612ec157600080fd5b505af1158015612ed5573d6000803e3d6000fd5b505050506040513d6020811015612eeb57600080fd5b5051612ef357fe5b612f3282878780806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250899250613611915050565b81600081518110612f3f57fe5b6020026020010151341115611e4e57611e4e3383600081518110612f5f57fe5b602002602001015134036130d8565b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180516001600160e01b031663a9059cbb60e01b178152925182516000946060949389169392918291908083835b60208310612feb5780518252601f199092019160209182019101612fcc565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d806000811461304d576040519150601f19603f3d011682016040523d82523d6000602084013e613052565b606091505b5091509150818015613080575080511580613080575080806020019051602081101561307d57600080fd5b50515b6130d1576040805162461bcd60e51b815260206004820152601f60248201527f5472616e7366657248656c7065723a205452414e534645525f4641494c454400604482015290519081900360640190fd5b5050505050565b604080516000808252602082019092526001600160a01b0384169083906040518082805190602001908083835b602083106131245780518252601f199092019160209182019101613105565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114613186576040519150601f19603f3d011682016040523d82523d6000602084013e61318b565b606091505b50509050806131cb5760405162461bcd60e51b81526004018080602001828103825260238152602001806144706023913960400191505060405180910390fd5b505050565b60008084116132105760405162461bcd60e51b815260040180806020018281038252602b8152602001806144e2602b913960400191505060405180910390fd5b6000831180156132205750600082115b61325b5760405162461bcd60e51b81526004018080602001828103825260288152602001806143b66028913960400191505060405180910390fd5b6000613269856103e56141c5565b9050600061327782856141c5565b905060006132918361328b886103e86141c5565b90614228565b905080828161329c57fe5b04979650505050505050565b6060600282511015613301576040805162461bcd60e51b815260206004820152601e60248201527f556e697377617056324c6962726172793a20494e56414c49445f504154480000604482015290519081900360640190fd5b815167ffffffffffffffff8111801561331957600080fd5b50604051908082528060200260200182016040528015613343578160200160208202803683370190505b509050828160008151811061335457fe5b60200260200101818152505060005b60018351038110156133ec576000806133a68786858151811061338257fe5b602002602001015187866001018151811061339957fe5b6020026020010151614277565b915091506133c88484815181106133b957fe5b602002602001015183836131d0565b8484600101815181106133d757fe5b60209081029190910101525050600101613363565b509392505050565b60008060006134038585613e56565b604080516bffffffffffffffffffffffff19606094851b811660208084019190915293851b81166034830152825160288184030181526048830184528051908501206001600160f81b031960688401529a90941b9093166069840152607d8301989098527fe18a34eb0e04b04f7a0ac29a6e80748dca96319b42c54d679cb821dca90c6303609d808401919091528851808403909101815260bd909201909752805196019590952095945050505050565b604080516001600160a01b0385811660248301528481166044830152606480830185905283518084039091018152608490920183526020820180516001600160e01b03166323b872dd60e01b17815292518251600094606094938a169392918291908083835b602083106135395780518252601f19909201916020918201910161351a565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d806000811461359b576040519150601f19603f3d011682016040523d82523d6000602084013e6135a0565b606091505b50915091508180156135ce5750805115806135ce57508080602001905160208110156135cb57600080fd5b50515b6136095760405162461bcd60e51b81526004018080602001828103825260248152602001806144be6024913960400191505060405180910390fd5b505050505050565b60005b60018351038110156138485760008084838151811061362f57fe5b602002602001015185846001018151811061364657fe5b602002602001015191509150600061365e8383613e56565b509050600087856001018151811061367257fe5b60200260200101519050600080836001600160a01b0316866001600160a01b0316146136a0578260006136a4565b6000835b91509150600060028a510388106136bb57886136fc565b6136fc7f0000000000000000000000000000000000000000000000000000000000000000878c8b600201815181106136ef57fe5b60200260200101516133f4565b90506137297f000000000000000000000000000000000000000000000000000000000000000088886133f4565b6001600160a01b031663022c0d9f84848460006040519080825280601f01601f191660200182016040528015613766576020820181803683370190505b506040518563ffffffff1660e01b815260040180858152602001848152602001836001600160a01b0316815260200180602001828103825283818151815260200191508051906020019080838360005b838110156137ce5781810151838201526020016137b6565b50505050905090810190601f1680156137fb5780820380516001836020036101000a031916815260200191505b5095505050505050600060405180830381600087803b15801561381d57600080fd5b505af1158015613831573d6000803e3d6000fd5b505060019099019850613614975050505050505050565b50505050565b60606002825110156138a7576040805162461bcd60e51b815260206004820152601e60248201527f556e697377617056324c6962726172793a20494e56414c49445f504154480000604482015290519081900360640190fd5b815167ffffffffffffffff811180156138bf57600080fd5b506040519080825280602002602001820160405280156138e9578160200160208202803683370190505b50905082816001835103815181106138fd57fe5b60209081029190910101528151600019015b80156133ec5760008061393f8786600186038151811061392b57fe5b602002602001015187868151811061339957fe5b9150915061396184848151811061395257fe5b60200260200101518383613cd8565b84600185038151811061397057fe5b602090810291909101015250506000190161390f565b60005b60018351038110156131cb576000808483815181106139a457fe5b60200260200101518584600101815181106139bb57fe5b60200260200101519150915060006139d38383613e56565b5090506000613a037f000000000000000000000000000000000000000000000000000000000000000085856133f4565b9050600080600080846001600160a01b0316630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b158015613a4457600080fd5b505afa158015613a58573d6000803e3d6000fd5b505050506040513d6060811015613a6e57600080fd5b5080516020909101516001600160701b0391821693501690506000806001600160a01b038a811690891614613aa4578284613aa7565b83835b91509150613afc828b6001600160a01b03166370a082318a6040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561180c57600080fd5b9550613b098683836131d0565b945050505050600080856001600160a01b0316886001600160a01b031614613b3357826000613b37565b6000835b91509150600060028c51038a10613b4e578a613b82565b613b827f0000000000000000000000000000000000000000000000000000000000000000898e8d600201815181106136ef57fe5b604080516000808252602082019283905263022c0d9f60e01b835260248201878152604483018790526001600160a01b038086166064850152608060848501908152845160a48601819052969750908c169563022c0d9f958a958a958a9591949193919260c486019290918190849084905b83811015613c0c578181015183820152602001613bf4565b50505050905090810190601f168015613c395780820380516001836020036101000a031916815260200191505b5095505050505050600060405180830381600087803b158015613c5b57600080fd5b505af1158015613c6f573d6000803e3d6000fd5b50506001909b019a506139899950505050505050505050565b80820382811115611123576040805162461bcd60e51b815260206004820152601560248201527464732d6d6174682d7375622d756e646572666c6f7760581b604482015290519081900360640190fd5b6000808411613d185760405162461bcd60e51b815260040180806020018281038252602c81526020018061433f602c913960400191505060405180910390fd5b600083118015613d285750600082115b613d635760405162461bcd60e51b81526004018080602001828103825260288152602001806143b66028913960400191505060405180910390fd5b6000613d7b6103e8613d7586886141c5565b906141c5565b90506000613d8f6103e5613d758689613c88565b9050613da66001828481613d9f57fe5b0490614228565b9695505050505050565b6000808411613df05760405162461bcd60e51b81526004018080602001828103825260258152602001806143de6025913960400191505060405180910390fd5b600083118015613e005750600082115b613e3b5760405162461bcd60e51b81526004018080602001828103825260288152602001806143b66028913960400191505060405180910390fd5b82613e4685846141c5565b81613e4d57fe5b04949350505050565b600080826001600160a01b0316846001600160a01b03161415613eaa5760405162461bcd60e51b815260040180806020018281038252602581526020018061436b6025913960400191505060405180910390fd5b826001600160a01b0316846001600160a01b031610613eca578284613ecd565b83835b90925090506001600160a01b038216613f2d576040805162461bcd60e51b815260206004820152601e60248201527f556e697377617056324c6962726172793a205a45524f5f414444524553530000604482015290519081900360640190fd5b9250929050565b60008060006001600160a01b03167f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663e6a439058a8a6040518363ffffffff1660e01b815260040180836001600160a01b03168152602001826001600160a01b031681526020019250505060206040518083038186803b158015613fc057600080fd5b505afa158015613fd4573d6000803e3d6000fd5b505050506040513d6020811015613fea57600080fd5b50516001600160a01b031614156140a8577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663c9c6539689896040518363ffffffff1660e01b815260040180836001600160a01b03168152602001826001600160a01b0316815260200192505050602060405180830381600087803b15801561407b57600080fd5b505af115801561408f573d6000803e3d6000fd5b505050506040513d60208110156140a557600080fd5b50505b6000806140d67f00000000000000000000000000000000000000000000000000000000000000008b8b614277565b915091508160001480156140e8575080155b156140f8578793508692506141b8565b6000614105898484613db0565b9050878111614158578581101561414d5760405162461bcd60e51b81526004018080602001828103825260268152602001806143906026913960400191505060405180910390fd5b8894509250826141b6565b6000614165898486613db0565b90508981111561417157fe5b878110156141b05760405162461bcd60e51b815260040180806020018281038252602681526020018061444a6026913960400191505060405180910390fd5b94508793505b505b5050965096945050505050565b60008115806141e0575050808202828282816141dd57fe5b04145b611123576040805162461bcd60e51b815260206004820152601460248201527364732d6d6174682d6d756c2d6f766572666c6f7760601b604482015290519081900360640190fd5b80820182811015611123576040805162461bcd60e51b815260206004820152601460248201527364732d6d6174682d6164642d6f766572666c6f7760601b604482015290519081900360640190fd5b60008060006142868585613e56565b5090506000806142978888886133f4565b6001600160a01b0316630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b1580156142cf57600080fd5b505afa1580156142e3573d6000803e3d6000fd5b505050506040513d60608110156142f957600080fd5b5080516020909101516001600160701b0391821693501690506001600160a01b038781169084161461432c57808261432f565b81815b9099909850965050505050505056fe556e697377617056324c6962726172793a20494e53554646494349454e545f4f55545055545f414d4f554e54556e697377617056324c6962726172793a204944454e544943414c5f414444524553534553556e69737761705632526f757465723a20494e53554646494349454e545f425f414d4f554e54556e697377617056324c6962726172793a20494e53554646494349454e545f4c4951554944495459556e697377617056324c6962726172793a20494e53554646494349454e545f414d4f554e54556e69737761705632526f757465723a204558434553534956455f494e5055545f414d4f554e54556e69737761705632526f757465723a20494e56414c49445f50415448000000556e69737761705632526f757465723a20494e53554646494349454e545f415f414d4f554e545472616e7366657248656c7065723a204554485f5452414e534645525f4641494c4544556e69737761705632526f757465723a20494e53554646494349454e545f4f55545055545f414d4f554e545472616e7366657248656c7065723a205452414e534645525f46524f4d5f4641494c4544556e697377617056324c6962726172793a20494e53554646494349454e545f494e5055545f414d4f554e54556e69737761705632526f757465723a20455850495245440000000000000000a26469706673582212201046181566cf8a35bd60f7e94b82dcde5a31b9e46aa697f15b739ad658b7871164736f6c634300060c0033000000000000000000000000c35dadb65012ec5796536bd9864ed8773abc74c40000000000000000000000005b67676a984807a212b1c59ebfc9b3568a474f0a

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

000000000000000000000000c35dadb65012ec5796536bd9864ed8773abc74c40000000000000000000000005b67676a984807a212b1c59ebfc9b3568a474f0a

-----Decoded View---------------
Arg [0] : _factory (address): 0xc35dadb65012ec5796536bd9864ed8773abc74c4
Arg [1] : _WETH (address): 0x5b67676a984807a212b1c59ebfc9b3568a474f0a

-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 000000000000000000000000c35dadb65012ec5796536bd9864ed8773abc74c4
Arg [1] : 0000000000000000000000005b67676a984807a212b1c59ebfc9b3568a474f0a


Deployed ByteCode Sourcemap

16554:18605:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17043:10;-1:-1:-1;;;;;17057:4:0;17043:18;;17036:26;;;;16554:18605;;;;;21193:673;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;21193:673:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;34103:262;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;34103:262:0;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;28369:850;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;28369:850:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;28369:850:0;;;;;;;;;;;;-1:-1:-1;28369:850:0;-1:-1:-1;;;;;;28369:850:0;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34903:253;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;34903:253:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;34903:253:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;34903:253:0;;-1:-1:-1;34903:253:0;;-1:-1:-1;;;;;34903:253:0:i;21872:677::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;21872:677:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;25586:628::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;25586:628:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;25586:628:0;;;;;;;;;;;;-1:-1:-1;25586:628:0;-1:-1:-1;;;;;;25586:628:0;;;;;;;;:::i;27535:828::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;27535:828:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;27535:828:0;;;;;;;;;;;;-1:-1:-1;27535:828:0;-1:-1:-1;;;;;;27535:828:0;;;;;;;;:::i;24016:718::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;24016:718:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;31409:728::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;31409:728:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;31409:728:0;;;;;;;;;;;;-1:-1:-1;31409:728:0;-1:-1:-1;;;;;;31409:728:0;;;;;;;;:::i;33013:850::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;33013:850:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;33013:850:0;;;;;;;;;;;;-1:-1:-1;33013:850:0;-1:-1:-1;;;;;;33013:850:0;;;;;;;;:::i;26832:697::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;26832:697:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;26832:697:0;;;;;;;;;;;;-1:-1:-1;26832:697:0;-1:-1:-1;;;;;;26832:697:0;;;;;;;;:::i;34373:261::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;34373:261:0;;;;;;;;;;;;:::i;26220:606::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;26220:606:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;26220:606:0;;;;;;;;;;;;-1:-1:-1;26220:606:0;-1:-1:-1;;;;;;26220:606:0;;;;;;;;:::i;16697:38::-;;;;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;16697:38:0;;;;;;;;;;;;;;33907:188;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;33907:188:0;;;;;;;;;;;;:::i;23303:707::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;23303:707:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;32143:864::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;32143:864:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;32143:864:0;;;;;;;;;;;;-1:-1:-1;32143:864:0;-1:-1:-1;;;;;;32143:864:0;;;;;;;;:::i;20322:865::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;20322:865:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;16649:41::-;;;;;;;;;;;;;:::i;34642:253::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;34642:253:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;34642:253:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;34642:253:0;;-1:-1:-1;34642:253:0;;-1:-1:-1;;;;;34642:253:0:i;22555:669::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;22555:669:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;18561:738::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;18561:738:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;19305:974;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;19305:974:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;29225:810::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;29225:810:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;29225:810:0;;;;;;;;;;;;-1:-1:-1;29225:810:0;-1:-1:-1;;;;;;29225:810:0;;;;;;;;:::i;21193:673::-;21430:16;21448:14;21411:8;16806:15;16794:8;:27;;16786:64;;;;;-1:-1:-1;;;16786:64:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;16786:64:0;;;;;;;;;;;;;;;21502:196:::1;21532:5;21552:4;21571:9;21595:14;21624:12;21659:4;21679:8;21502:15;:196::i;:::-;21475:223:::0;;-1:-1:-1;21475:223:0;-1:-1:-1;21709:51:0::1;21737:5:::0;21744:2;21475:223;21709:27:::1;:51::i;:::-;21777:4;-1:-1:-1::0;;;;;21771:20:0::1;;21792:9;21771:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;21813:45;21844:2;21848:9;21813:30;:45::i;:::-;21193:673:::0;;;;;;;;;;:::o;34103:262::-;34256:14;34295:62;34325:8;34335:9;34346:10;34295:29;:62::i;:::-;34288:69;34103:262;-1:-1:-1;;;;34103:262:0:o;28369:850::-;28583:21;28555:8;16806:15;16794:8;:27;;16786:64;;;;;-1:-1:-1;;;16786:64:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;16786:64:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;28655:4:0::1;28630:29;:4:::0;;-1:-1:-1;;28635:15:0;;28630:21;;::::1;;;;;;;;;;;-1:-1:-1::0;;;;;28630:21:0::1;-1:-1:-1::0;;;;;28630:29:0::1;;28622:71;;;::::0;;-1:-1:-1;;;28622:71:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;;;;;;;;;28622:71:0;;;;;;;;;;;;;::::1;;28714:55;28745:7;28754:8;28764:4;;28714:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;28714:30:0::1;::::0;-1:-1:-1;;;28714:55:0:i:1;:::-;28704:65;;28819:12;28788:7;28813:1;28796:7;:14;:18;28788:27;;;;;;;;;;;;;;:43;;28780:99;;;;-1:-1:-1::0;;;28780:99:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28890:141;28936:4;;28941:1;28936:7;;;;;;;;;;;;;-1:-1:-1::0;;;;;28936:7:0::1;28945:10;28957:51;28982:7;28991:4;;28996:1;28991:7;;;;;;;;;;;;;-1:-1:-1::0;;;;;28991:7:0::1;29000:4;;29005:1;29000:7;;;;;;;;;;;;;-1:-1:-1::0;;;;;29000:7:0::1;28957:24;:51::i;:::-;29010:7;29018:1;29010:10;;;;;;;;;;;;;;28890:31;:141::i;:::-;29042:35;29048:7;29057:4;;29042:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;29071:4:0::1;::::0;-1:-1:-1;29042:5:0::1;::::0;-1:-1:-1;;29042:35:0:i:1;:::-;29094:4;-1:-1:-1::0;;;;;29088:20:0::1;;29109:7;29134:1;29117:7;:14;:18;29109:27;;;;;;;;;;;;;;29088:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;29148:63;29179:2;29183:7;29208:1;29191:7;:14;:18;29183:27;;;;;;;;;;;;;;29148:30;:63::i;:::-;28369:850:::0;;;;;;;;;:::o;34903:253::-;35047:21;35093:55;35123:7;35132:9;35143:4;35093:29;:55::i;:::-;35086:62;;34903:253;;;;;:::o;21872:677::-;22178:12;22192;22217;22232:49;22257:7;22266:6;22274;22232:24;:49::i;:::-;22217:64;;22292:10;22305;:33;;22329:9;22305:33;;;-1:-1:-1;;22305:33:0;22349:80;;;-1:-1:-1;;;22349:80:0;;22377:10;22349:80;;;;22397:4;22349:80;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22292:46;;-1:-1:-1;;;;;;22349:27:0;;;;;:80;;;;;-1:-1:-1;;22349:80:0;;;;;;;;-1:-1:-1;22349:27:0;:80;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22461;22477:6;22485;22493:9;22504:10;22516;22528:2;22532:8;22461:15;:80::i;:::-;22440:101;;;;;;;;21872:677;;;;;;;;;;;;;;;;:::o;25586:628::-;25810:21;25791:8;16806:15;16794:8;:27;;16786:64;;;;;-1:-1:-1;;;16786:64:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;16786:64:0;;;;;;;;;;;;;;;25854:55:::1;25885:7;25894:8;25904:4;;25854:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;25854:30:0::1;::::0;-1:-1:-1;;;25854:55:0:i:1;:::-;25844:65;;25959:12;25928:7;25953:1;25936:7;:14;:18;25928:27;;;;;;;;;;;;;;:43;;25920:99;;;;-1:-1:-1::0;;;25920:99:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26030:141;26076:4;;26081:1;26076:7;;;;;;26030:141;26182:24;26188:7;26197:4;;26182:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;26203:2:0;;-1:-1:-1;26182:5:0::1;::::0;-1:-1:-1;;26182:24:0:i:1;27535:828::-:0;27749:21;27721:8;16806:15;16794:8;:27;;16786:64;;;;;-1:-1:-1;;;16786:64:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;16786:64:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;27821:4:0::1;27796:29;:4:::0;;-1:-1:-1;;27801:15:0;;27796:21;;::::1;;;;;;;;;;;-1:-1:-1::0;;;;;27796:21:0::1;-1:-1:-1::0;;;;;27796:29:0::1;;27788:71;;;::::0;;-1:-1:-1;;;27788:71:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;;;;;;;;;27788:71:0;;;;;;;;;;;;;::::1;;27880:55;27910:7;27919:9;27930:4;;27880:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;27880:29:0::1;::::0;-1:-1:-1;;;27880:55:0:i:1;:::-;27870:65;;27968:11;27954:7;27962:1;27954:10;;;;;;;;;;;;;;:25;;27946:77;;;;-1:-1:-1::0;;;27946:77:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24016:718:::0;24334:14;24361:12;24376:46;24401:7;24410:5;24417:4;24376:24;:46::i;:::-;24361:61;;24433:10;24446;:33;;24470:9;24446:33;;;-1:-1:-1;;24446:33:0;24490:80;;;-1:-1:-1;;;24490:80:0;;24518:10;24490:80;;;;24538:4;24490:80;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24433:46;;-1:-1:-1;;;;;;24490:27:0;;;;;:80;;;;;-1:-1:-1;;24490:80:0;;;;;;;;-1:-1:-1;24490:27:0;:80;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24593:133;24655:5;24662:9;24673:14;24689:12;24703:2;24707:8;24593:47;:133::i;:::-;24581:145;24016:718;-1:-1:-1;;;;;;;;;;;;;24016:718:0:o;31409:728::-;31643:8;16806:15;16794:8;:27;;16786:64;;;;;-1:-1:-1;;;16786:64:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;16786:64:0;;;;;;;;;;;;;;;31664:139:::1;31710:4;;31715:1;31710:7;;;;;;;;;;;;;-1:-1:-1::0;;;;;31710:7:0::1;31719:10;31731:51;31756:7;31765:4;;31770:1;31765:7;;;;;;;;;;;;;-1:-1:-1::0;;;;;31765:7:0::1;31774:4;;31779:1;31774:7;;;;;;31731:51;31784:8;31664:31;:139::i;:::-;31814:18;31849:4:::0;;-1:-1:-1;;31854:15:0;;31849:21;;::::1;;;;;;;;;;;-1:-1:-1::0;;;;;31849:21:0::1;-1:-1:-1::0;;;;;31835:46:0::1;;31882:2;31835:50;;;;;;;;;;;;;-1:-1:-1::0;;;;;31835:50:0::1;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;31835:50:0;31896:44:::1;::::0;;31835:50:::1;31896:44:::0;;::::1;::::0;;;;;;;;;;;31835:50;;-1:-1:-1;31896:44:0::1;::::0;;;31931:4;;;;;;31896:44;::::1;::::0;31931:4;;31896:44;31931:4;31896:44;::::1;;::::0;::::1;::::0;;;;-1:-1:-1;31937:2:0;;-1:-1:-1;31896:34:0::1;::::0;-1:-1:-1;;31896:44:0:i:1;:::-;32046:12:::0;31973:69:::1;32028:13:::0;31987:4;;-1:-1:-1;;31992:15:0;;31987:21;;::::1;;;;;;;;;;;-1:-1:-1::0;;;;;31987:21:0::1;-1:-1:-1::0;;;;;31973:46:0::1;;32020:2;31973:50;;;;;;;;;;;;;-1:-1:-1::0;;;;;31973:50:0::1;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;31973:50:0;;:54:::1;:69::i;:::-;:85;;31951:178;;;;-1:-1:-1::0;;;31951:178:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16861:1;31409:728:::0;;;;;;;:::o;33013:850::-;33280:8;16806:15;16794:8;:27;;16786:64;;;;;-1:-1:-1;;;16786:64:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;16786:64:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;33339:4:0::1;33314:29;:4:::0;;-1:-1:-1;;33319:15:0;;33314:21;;::::1;;;;;;;;;;;-1:-1:-1::0;;;;;33314:21:0::1;-1:-1:-1::0;;;;;33314:29:0::1;;33306:71;;;::::0;;-1:-1:-1;;;33306:71:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;;;;;;;;;33306:71:0;;;;;;;;;;;;;::::1;;33388:139;33434:4;;33439:1;33434:7;;;;;;33388:139;33538:55;33573:4;;33538:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;33587:4:0::1;::::0;-1:-1:-1;33538:34:0::1;::::0;-1:-1:-1;;33538:55:0:i:1;:::-;33604:14;33635:4;-1:-1:-1::0;;;;;33621:29:0::1;;33659:4;33621:44;;;;;;;;;;;;;-1:-1:-1::0;;;;;33621:44:0::1;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;33621:44:0;;-1:-1:-1;33684:25:0;;::::1;;33676:81;;;;-1:-1:-1::0;;;33676:81:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33774:4;-1:-1:-1::0;;;;;33768:20:0::1;;33789:9;33768:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;33810:45;33841:2;33845:9;33810:30;:45::i;26832:697::-:0;27048:21;27020:8;16806:15;16794:8;:27;;16786:64;;;;;-1:-1:-1;;;16786:64:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;16786:64:0;;;;;;;;;;;;;;;27106:4:::1;-1:-1:-1::0;;;;;27095:15:0::1;:4;;27100:1;27095:7;;;;;;;;;;;;;-1:-1:-1::0;;;;;27095:7:0::1;-1:-1:-1::0;;;;;27095:15:0::1;;27087:57;;;::::0;;-1:-1:-1;;;27087:57:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;;;;;;;;;27087:57:0;;;;;;;;;;;;;::::1;;27165:56;27196:7;27205:9;27216:4;;27165:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;27165:30:0::1;::::0;-1:-1:-1;;;27165:56:0:i:1;:::-;27155:66;;27271:12;27240:7;27265:1;27248:7;:14;:18;27240:27;;;;;;;;;;;;;;:43;;27232:99;;;;-1:-1:-1::0;;;27232:99:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27348:4;-1:-1:-1::0;;;;;27342:19:0::1;;27369:7;27377:1;27369:10;;;;;;;;;;;;;;27342:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;27406:4;-1:-1:-1::0;;;;;27400:20:0::1;;27421:51;27446:7;27455:4;;27460:1;27455:7;;;;;;27421:51;27474:7;27482:1;27474:10;;;;;;;;;;;;;;27400:85;;;;;;;;;;;;;-1:-1:-1::0;;;;;27400:85:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;27400:85:0;27393:93:::1;;;;27497:24;27503:7;27512:4;;27497:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;27518:2:0;;-1:-1:-1;27497:5:0::1;::::0;-1:-1:-1;;27497:24:0:i:1;:::-;26832:697:::0;;;;;;;;:::o;34373:261::-;34526:13;34564:62;34593:9;34604;34615:10;34564:28;:62::i;26220:606::-;26444:21;26425:8;16806:15;16794:8;:27;;16786:64;;;;;-1:-1:-1;;;16786:64:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;16786:64:0;;;;;;;;;;;;;;;26488:55:::1;26518:7;26527:9;26538:4;;26488:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;26488:29:0::1;::::0;-1:-1:-1;;;26488:55:0:i:1;:::-;26478:65;;26576:11;26562:7;26570:1;26562:10;;;;;;;;;;;;;;:25;;26554:77;;;;-1:-1:-1::0;;;26554:77:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16697:38:::0;;;:::o;33907:188::-;34004:12;34036:51;34059:7;34068:8;34078;34036:22;:51::i;23303:707::-;23569:14;23550:8;16806:15;16794:8;:27;;16786:64;;;;;-1:-1:-1;;;16786:64:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;16786:64:0;;;;;;;;;;;;;;;23612:196:::1;23642:5;23662:4;23681:9;23705:14;23734:12;23769:4;23789:8;23612:15;:196::i;:::-;23596:212;;;;;;23819:85;23847:5;23854:2;23872:5;-1:-1:-1::0;;;;;23858:30:0::1;;23897:4;23858:45;;;;;;;;;;;;;-1:-1:-1::0;;;;;23858:45:0::1;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;23858:45:0;23819:27:::1;:85::i;:::-;23921:4;-1:-1:-1::0;;;;;23915:20:0::1;;23936:9;23915:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;23957:45;23988:2;23992:9;23957:30;:45::i;32143:864::-:0;32403:8;16806:15;16794:8;:27;;16786:64;;;;;-1:-1:-1;;;16786:64:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;16786:64:0;;;;;;;;;;;;;;;32448:4:::1;-1:-1:-1::0;;;;;32437:15:0::1;:4;;32442:1;32437:7;;;;;;;;;;;;;-1:-1:-1::0;;;;;32437:7:0::1;-1:-1:-1::0;;;;;32437:15:0::1;;32429:57;;;::::0;;-1:-1:-1;;;32429:57:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;;;;;;;;;32429:57:0;;;;;;;;;;;;;::::1;;32497:13;32513:9;32497:25;;32539:4;-1:-1:-1::0;;;;;32533:19:0::1;;32560:8;32533:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;32595:4;-1:-1:-1::0;;;;;32589:20:0::1;;32610:51;32635:7;32644:4;;32649:1;32644:7;;;;;;32610:51;32663:8;32589:83;;;;;;;;;;;;;-1:-1:-1::0;;;;;32589:83:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;32589:83:0;32582:91:::1;;;;32684:18;32719:4:::0;;-1:-1:-1;;32724:15:0;;32719:21;;::::1;;;;;;;;;;;-1:-1:-1::0;;;;;32719:21:0::1;-1:-1:-1::0;;;;;32705:46:0::1;;32752:2;32705:50;;;;;;;;;;;;;-1:-1:-1::0;;;;;32705:50:0::1;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;32705:50:0;32766:44:::1;::::0;;32705:50:::1;32766:44:::0;;::::1;::::0;;;;;;;;;;;32705:50;;-1:-1:-1;32766:44:0::1;::::0;;;32801:4;;;;;;32766:44;::::1;::::0;32801:4;;32766:44;32801:4;32766:44;::::1;;::::0;::::1;::::0;;;;-1:-1:-1;32807:2:0;;-1:-1:-1;32766:34:0::1;::::0;-1:-1:-1;;32766:44:0:i:1;:::-;32916:12:::0;32843:69:::1;32898:13:::0;32857:4;;-1:-1:-1;;32862:15:0;;32857:21;;::::1;;;;;;;;;;;-1:-1:-1::0;;;;;32857:21:0::1;-1:-1:-1::0;;;;;32843:46:0::1;;32890:2;32843:50;;;;;;;;;;;;;-1:-1:-1::0;;;;;32843:50:0::1;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;20322:865:::0;20576:12;20590;20557:8;16806:15;16794:8;:27;;16786:64;;;;;-1:-1:-1;;;16786:64:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;16786:64:0;;;;;;;;;;;;;;;20615:12:::1;20630:49;20655:7;20664:6;20672;20630:24;:49::i;:::-;20690:62;::::0;;-1:-1:-1;;;20690:62:0;;20724:10:::1;20690:62;::::0;::::1;::::0;-1:-1:-1;;;;;20690:33:0;::::1;:62:::0;;;;;;;;;;;;;;20615:64;;-1:-1:-1;20690:33:0;;::::1;::::0;:62;;;;;::::1;::::0;;;;;;;;;-1:-1:-1;20690:33:0;:62;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;;20820:29:0::1;::::0;;-1:-1:-1;;;20820:29:0;;-1:-1:-1;;;;;20820:29:0;;::::1;;::::0;::::1;::::0;;;20790:12:::1;::::0;;;20820:25;;::::1;::::0;::::1;::::0;:29;;;;;;;;;;;20790:12;20820:25;:29;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;20820:29:0;;::::1;::::0;;::::1;::::0;;;-1:-1:-1;20820:29:0;-1:-1:-1;20861:14:0::1;20880:43;20908:6:::0;20916;20880:27:::1;:43::i;:::-;20860:63;;;20965:6;-1:-1:-1::0;;;;;20955:16:0::1;:6;-1:-1:-1::0;;;;;20955:16:0::1;;:58;;20996:7;21005;20955:58;;;20975:7;20984;20955:58;20934:79:::0;;-1:-1:-1;20934:79:0;-1:-1:-1;21032:21:0;;::::1;;21024:72;;;;-1:-1:-1::0;;;21024:72:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21126:10;21115:7;:21;;21107:72;;;;-1:-1:-1::0;;;21107:72:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16861:1;;;;20322:865:::0;;;;;;;;;;;:::o;16649:41::-;;;:::o;34642:253::-;34786:21;34832:55;34863:7;34872:8;34882:4;34832:30;:55::i;22555:669::-;22844:16;22862:14;22889:12;22904:46;22929:7;22938:5;22945:4;22904:24;:46::i;:::-;22889:61;;22961:10;22974;:33;;22998:9;22974:33;;;-1:-1:-1;;22974:33:0;23018:80;;;-1:-1:-1;;;23018:80:0;;23046:10;23018:80;;;;23066:4;23018:80;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22961:46;;-1:-1:-1;;;;;;23018:27:0;;;;;:80;;;;;-1:-1:-1;;23018:80:0;;;;;;;;-1:-1:-1;23018:27:0;:80;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23136;23155:5;23162:9;23173:14;23189:12;23203:2;23207:8;23136:18;:80::i;:::-;23109:107;;;;-1:-1:-1;22555:669:0;-1:-1:-1;;;;;;;;;;;;;22555:669:0:o;18561:738::-;18849:12;18863;18877:14;18830:8;16806:15;16794:8;:27;;16786:64;;;;;-1:-1:-1;;;16786:64:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;16786:64:0;;;;;;;;;;;;;;;18925:85:::1;18939:6;18947;18955:14;18971;18987:10;18999;18925:13;:85::i;:::-;18904:106:::0;;-1:-1:-1;18904:106:0;-1:-1:-1;19021:12:0::1;19036:49;19061:7;19070:6:::0;19078;19036:24:::1;:49::i;:::-;19021:64;;19096:66;19128:6;19136:10;19148:4;19154:7;19096:31;:66::i;:::-;19173;19205:6;19213:10;19225:4;19231:7;19173:31;:66::i;:::-;19277:4;-1:-1:-1::0;;;;;19262:25:0::1;;19288:2;19262:29;;;;;;;;;;;;;-1:-1:-1::0;;;;;19262:29:0::1;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;19262:29:0;18561:738;;;;-1:-1:-1;19262:29:0;;-1:-1:-1;18561:738:0;;-1:-1:-1;;;;;;;;;18561:738:0:o;19305:974::-;19558:16;19576:14;19592;19539:8;16806:15;16794:8;:27;;16786:64;;;;;-1:-1:-1;;;16786:64:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;16786:64:0;;;;;;;;;;;;;;;19646:176:::1;19674:5;19694:4;19713:18;19746:9;19770:14;19799:12;19646:13;:176::i;:::-;19619:203:::0;;-1:-1:-1;19619:203:0;-1:-1:-1;19833:12:0::1;19848:46;19873:7;19882:5:::0;19889:4:::1;19848:24;:46::i;:::-;19833:61;;19905:69;19937:5;19944:10;19956:4;19962:11;19905:31;:69::i;:::-;19991:4;-1:-1:-1::0;;;;;19985:19:0::1;;20012:9;19985:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;20048:4;-1:-1:-1::0;;;;;20042:20:0::1;;20063:4;20069:9;20042:37;;;;;;;;;;;;;-1:-1:-1::0;;;;;20042:37:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;20042:37:0;20035:45:::1;;;;20118:4;-1:-1:-1::0;;;;;20103:25:0::1;;20129:2;20103:29;;;;;;;;;;;;;-1:-1:-1::0;;;;;20103:29:0::1;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;20103:29:0;;-1:-1:-1;20183:9:0::1;:21:::0;-1:-1:-1;20179:92:0::1;;;20206:65;20237:10;20261:9;20249;:21;20206:30;:65::i;:::-;16861:1;19305:974:::0;;;;;;;;;;;:::o;29225:810::-;29438:21;29410:8;16806:15;16794:8;:27;;16786:64;;;;;-1:-1:-1;;;16786:64:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;16786:64:0;;;;;;;;;;;;;;;29496:4:::1;-1:-1:-1::0;;;;;29485:15:0::1;:4;;29490:1;29485:7;;;;;;;;;;;;;-1:-1:-1::0;;;;;29485:7:0::1;-1:-1:-1::0;;;;;29485:15:0::1;;29477:57;;;::::0;;-1:-1:-1;;;29477:57:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;;;;;;;;;29477:57:0;;;;;;;;;;;;;::::1;;29555:55;29585:7;29594:9;29605:4;;29555:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;29555:29:0::1;::::0;-1:-1:-1;;;29555:55:0:i:1;:::-;29545:65;;29643:9;29629:7;29637:1;29629:10;;;;;;;;;;;;;;:23;;29621:75;;;;-1:-1:-1::0;;;29621:75:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29713:4;-1:-1:-1::0;;;;;29707:19:0::1;;29734:7;29742:1;29734:10;;;;;;;;;;;;;;29707:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;29771:4;-1:-1:-1::0;;;;;29765:20:0::1;;29786:51;29811:7;29820:4;;29825:1;29820:7;;;;;;29786:51;29839:7;29847:1;29839:10;;;;;;;;;;;;;;29765:85;;;;;;;;;;;;;-1:-1:-1::0;;;;;29765:85:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;29765:85:0;29758:93:::1;;;;29862:24;29868:7;29877:4;;29862:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;29883:2:0;;-1:-1:-1;29862:5:0::1;::::0;-1:-1:-1;;29862:24:0:i:1;:::-;29949:7;29957:1;29949:10;;;;;;;;;;;;;;29937:9;:22;29933:94;;;29961:66;29992:10;30016:7;30024:1;30016:10;;;;;;;;;;;;;;30004:9;:22;29961:30;:66::i;8417:361::-:0;8612:45;;;-1:-1:-1;;;;;8612:45:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;8612:45:0;-1:-1:-1;;;8612:45:0;;;8601:57;;;;8566:12;;8580:17;;8601:10;;;;8612:45;8601:57;;;8612:45;8601:57;;8612:45;8601:57;;;;;;;;;;-1:-1:-1;;8601:57:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8565:93;;;;8677:7;:57;;;;-1:-1:-1;8689:11:0;;:16;;:44;;;8720:4;8709:24;;;;;;;;;;;;;;;-1:-1:-1;8709:24:0;8689:44;8669:101;;;;;-1:-1:-1;;;8669:101:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;8417:361;;;;;:::o;9196:195::-;9304:12;;;9266;9304;;;;;;;;;-1:-1:-1;;;;;9283:7:0;;;9297:5;;9283:34;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;9283:34:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9265:52;;;9336:7;9328:55;;;;-1:-1:-1;;;9328:55:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9196:195;;;:::o;5449:517::-;5542:14;5588:1;5577:8;:12;5569:68;;;;-1:-1:-1;;;5569:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5668:1;5656:9;:13;:31;;;;;5686:1;5673:10;:14;5656:31;5648:84;;;;-1:-1:-1;;;5648:84:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5743:20;5766:17;:8;5779:3;5766:12;:17::i;:::-;5743:40;-1:-1:-1;5794:14:0;5811:31;5743:40;5831:10;5811:19;:31::i;:::-;5794:48;-1:-1:-1;5853:16:0;5872:40;5896:15;5872:19;:9;5886:4;5872:13;:19::i;:::-;:23;;:40::i;:::-;5853:59;;5947:11;5935:9;:23;;;;;;;5449:517;-1:-1:-1;;;;;;;5449:517:0:o;6641:511::-;6742:21;6799:1;6784:4;:11;:16;;6776:59;;;;;-1:-1:-1;;;6776:59:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;6867:4;:11;6856:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;6856:23:0;;6846:33;;6903:8;6890:7;6898:1;6890:10;;;;;;;;;;;;;:21;;;;;6927:6;6922:223;6953:1;6939:4;:11;:15;6935:1;:19;6922:223;;;6977:14;6993:15;7012:42;7024:7;7033:4;7038:1;7033:7;;;;;;;;;;;;;;7042:4;7047:1;7051;7047:5;7042:11;;;;;;;;;;;;;;7012;:42::i;:::-;6976:78;;;;7086:47;7099:7;7107:1;7099:10;;;;;;;;;;;;;;7111:9;7122:10;7086:12;:47::i;:::-;7069:7;7077:1;7081;7077:5;7069:14;;;;;;;;;;;;;;;;;:64;-1:-1:-1;;6956:3:0;;6922:223;;;;6641:511;;;;;:::o;3966:478::-;4055:12;4081:14;4097;4115:26;4126:6;4134;4115:10;:26::i;:::-;4279:32;;;-1:-1:-1;;4279:32:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4269:43;;;;;;-1:-1:-1;;;;;;4182:251:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4172:262;;;;;;;;;3966:478;-1:-1:-1;;;;;3966:478:0:o;8786:402::-;9011:51;;;-1:-1:-1;;;;;9011:51:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;9011:51:0;-1:-1:-1;;;9011:51:0;;;9000:63;;;;8965:12;;8979:17;;9000:10;;;;9011:51;9000:63;;;9011:51;9000:63;;9011:51;9000:63;;;;;;;;;;-1:-1:-1;;9000:63:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8964:99;;;;9082:7;:57;;;;-1:-1:-1;9094:11:0;;:16;;:44;;;9125:4;9114:24;;;;;;;;;;;;;;;-1:-1:-1;9114:24:0;9094:44;9074:106;;;;-1:-1:-1;;;9074:106:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8786:402;;;;;;:::o;24845:735::-;24952:6;24947:626;24978:1;24964:4;:11;:15;24960:1;:19;24947:626;;;25002:13;25017:14;25036:4;25041:1;25036:7;;;;;;;;;;;;;;25045:4;25050:1;25054;25050:5;25045:11;;;;;;;;;;;;;;25001:56;;;;25073:14;25092:42;25120:5;25127:6;25092:27;:42::i;:::-;25072:62;;;25149:14;25166:7;25174:1;25178;25174:5;25166:14;;;;;;;;;;;;;;25149:31;;25196:15;25213;25241:6;-1:-1:-1;;;;;25232:15:0;:5;-1:-1:-1;;;;;25232:15:0;;:61;;25274:9;25290:1;25232:61;;;25256:1;25260:9;25232:61;25195:98;;;;25308:10;25339:1;25325:4;:11;:15;25321:1;:19;:82;;25400:3;25321:82;;;25343:54;25368:7;25377:6;25385:4;25390:1;25394;25390:5;25385:11;;;;;;;;;;;;;;25343:24;:54::i;:::-;25308:95;;25433:48;25458:7;25467:5;25474:6;25433:24;:48::i;:::-;-1:-1:-1;;;;;25418:69:0;;25506:10;25518;25530:2;25544:1;25534:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;25534:12:0;;25418:143;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;25418:143:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;24981:3:0;;;;;-1:-1:-1;24947:626:0;;-1:-1:-1;;;;;;;;24947:626:0;;;24845:735;;;:::o;7233:532::-;7334:21;7391:1;7376:4;:11;:16;;7368:59;;;;;-1:-1:-1;;;7368:59:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;7459:4;:11;7448:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;7448:23:0;;7438:33;;7512:9;7482:7;7507:1;7490:7;:14;:18;7482:27;;;;;;;;;;;;;;;;;:39;7546:11;;-1:-1:-1;;7546:15:0;7532:226;7563:5;;7532:226;;7591:14;7607:15;7626:42;7638:7;7647:4;7656:1;7652;:5;7647:11;;;;;;;;;;;;;;7660:4;7665:1;7660:7;;;;;;;7626:42;7590:78;;;;7700:46;7712:7;7720:1;7712:10;;;;;;;;;;;;;;7724:9;7735:10;7700:11;:46::i;:::-;7683:7;7695:1;7691;:5;7683:14;;;;;;;;;;;;;;;;;:63;-1:-1:-1;;;;7570:3:0;7532:226;;30182:1221;30295:6;30290:1106;30321:1;30307:4;:11;:15;30303:1;:19;30290:1106;;;30345:13;30360:14;30379:4;30384:1;30379:7;;;;;;;;;;;;;;30388:4;30393:1;30397;30393:5;30388:11;;;;;;;;;;;;;;30344:56;;;;30416:14;30435:42;30463:5;30470:6;30435:27;:42::i;:::-;30415:62;;;30492:19;30529:48;30554:7;30563:5;30570:6;30529:24;:48::i;:::-;30492:86;;30593:16;30624:17;30712:13;30727;30745:4;-1:-1:-1;;;;;30745:16:0;;:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;30745:18:0;;;;;;;-1:-1:-1;;;;;30711:52:0;;;;-1:-1:-1;30711:52:0;;-1:-1:-1;30779:17:0;;-1:-1:-1;;;;;30820:15:0;;;;;;;:61;;30862:8;30872;30820:61;;;30839:8;30849;30820:61;30778:103;;;;30910:63;30960:12;30924:5;-1:-1:-1;;;;;30910:30:0;;30949:4;30910:45;;;;;;;;;;;;;-1:-1:-1;;;;;30910:45:0;;;;;;;;;;;;;;;;;;;;;;;;;;:63;30896:77;;31003:71;31033:11;31046:12;31060:13;31003:29;:71::i;:::-;30988:86;;30290:1106;;;;31105:15;31122;31150:6;-1:-1:-1;;;;;31141:15:0;:5;-1:-1:-1;;;;;31141:15:0;;:67;;31186:12;31205:1;31141:67;;;31165:1;31169:12;31141:67;31104:104;;;;31223:10;31254:1;31240:4;:11;:15;31236:1;:19;:82;;31315:3;31236:82;;;31258:54;31283:7;31292:6;31300:4;31305:1;31309;31305:5;31300:11;;;;;;;31258:54;31371:12;;;31381:1;31371:12;;;;;;;;;;-1:-1:-1;;;31333:51:0;;;;;;;;;;;;;;-1:-1:-1;;;;;31333:51:0;;;;;;;;;;;;;;;;;;;;;;31223:95;;-1:-1:-1;31333:9:0;;;;;;31343:10;;31355;;31223:95;;31371:12;;31333:51;;;;;;;;31371:12;;31333:51;;;;31371:12;;31333:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;30324:3:0;;;;;-1:-1:-1;30290:1106:0;;-1:-1:-1;;;;;;;;;;30290:1106:0;2972:129;3056:5;;;3051:16;;;;3043:50;;;;;-1:-1:-1;;;3043:50:0;;;;;;;;;;;;-1:-1:-1;;;3043:50:0;;;;;;;;;;;;;;6087:472;6180:13;6226:1;6214:9;:13;6206:70;;;;-1:-1:-1;;;6206:70:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6307:1;6295:9;:13;:31;;;;;6325:1;6312:10;:14;6295:31;6287:84;;;;-1:-1:-1;;;6287:84:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6382:14;6399:34;6428:4;6399:24;:9;6413;6399:13;:24::i;:::-;:28;;:34::i;:::-;6382:51;-1:-1:-1;6444:16:0;6463:34;6493:3;6463:25;:10;6478:9;6463:14;:25::i;:34::-;6444:53;;6519:32;6549:1;6532:11;6520:9;:23;;;;;;;6519:29;:32::i;:::-;6508:43;6087:472;-1:-1:-1;;;;;;6087:472:0:o;5006:321::-;5088:12;5131:1;5121:7;:11;5113:61;;;;-1:-1:-1;;;5113:61:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5204:1;5193:8;:12;:28;;;;;5220:1;5209:8;:12;5193:28;5185:81;;;;-1:-1:-1;;;5185:81:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5311:8;5287:21;:7;5299:8;5287:11;:21::i;:::-;:32;;;;;;;5006:321;-1:-1:-1;;;;5006:321:0:o;3525:349::-;3600:14;3616;3661:6;-1:-1:-1;;;;;3651:16:0;:6;-1:-1:-1;;;;;3651:16:0;;;3643:66;;;;-1:-1:-1;;;3643:66:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3748:6;-1:-1:-1;;;;;3739:15:0;:6;-1:-1:-1;;;;;3739:15:0;;:53;;3777:6;3785;3739:53;;;3758:6;3766;3739:53;3720:72;;-1:-1:-1;3720:72:0;-1:-1:-1;;;;;;3811:20:0;;3803:63;;;;;-1:-1:-1;;;3803:63:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;3525:349;;;;;:::o;17165:1390::-;17383:12;17397;17540:1;-1:-1:-1;;;;;17478:64:0;17496:7;-1:-1:-1;;;;;17478:34:0;;17513:6;17521;17478:50;;;;;;;;;;;;;-1:-1:-1;;;;;17478:50:0;;;;;;-1:-1:-1;;;;;17478:50:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;17478:50:0;-1:-1:-1;;;;;17478:64:0;;17474:150;;;17577:7;-1:-1:-1;;;;;17559:37:0;;17597:6;17605;17559:53;;;;;;;;;;;;;-1:-1:-1;;;;;17559:53:0;;;;;;-1:-1:-1;;;;;17559:53:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;17474:150:0;17635:13;17650;17667:53;17696:7;17705:6;17713;17667:28;:53::i;:::-;17634:86;;;;17735:8;17747:1;17735:13;:30;;;;-1:-1:-1;17752:13:0;;17735:30;17731:817;;;17804:14;;-1:-1:-1;17820:14:0;;-1:-1:-1;17731:817:0;;;17868:19;17890:58;17913:14;17929:8;17939;17890:22;:58::i;:::-;17868:80;;17985:14;17967;:32;17963:574;;18046:10;18028:14;:28;;18020:79;;;;-1:-1:-1;;;18020:79:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18140:14;;-1:-1:-1;18156:14:0;-1:-1:-1;18156:14:0;17963:574;;;18212:19;18234:58;18257:14;18273:8;18283;18234:22;:58::i;:::-;18212:80;;18336:14;18318;:32;;18311:40;;;;18396:10;18378:14;:28;;18370:79;;;;-1:-1:-1;;;18370:79:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18490:14;-1:-1:-1;18506:14:0;;-1:-1:-1;17963:574:0;17731:817;;17165:1390;;;;;;;;;;;:::o;3109:142::-;3161:6;3188;;;:30;;-1:-1:-1;;3203:5:0;;;3217:1;3212;3203:5;3212:1;3198:15;;;;;:20;3188:30;3180:63;;;;;-1:-1:-1;;;3180:63:0;;;;;;;;;;;;-1:-1:-1;;;3180:63:0;;;;;;;;;;;;;;2836:128;2920:5;;;2915:16;;;;2907:49;;;;;-1:-1:-1;;;2907:49:0;;;;;;;;;;;;-1:-1:-1;;;2907:49:0;;;;;;;;;;;;;;4502:391;4595:13;4610;4637:14;4656:26;4667:6;4675;4656:10;:26::i;:::-;4636:46;;;4694:13;4709;4742:32;4750:7;4759:6;4767;4742:7;:32::i;:::-;-1:-1:-1;;;;;4727:60:0;;:62;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;4727:62:0;;;;;;;-1:-1:-1;;;;;4693:96:0;;;;-1:-1:-1;4693:96:0;;-1:-1:-1;;;;;;4823:16:0;;;;;;;:62;;4866:8;4876;4823:62;;;4843:8;4853;4823:62;4800:85;;;;-1:-1:-1;4502:391:0;-1:-1:-1;;;;;;;4502:391:0:o

Swarm Source

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