Contract 0x1b02da8cb0d097eb8d57a175b88c7d8b47997506 13

Txn Hash Method
Block
From
To
Value [Txn Fee]
0x3bf8eda3bcc05b6682848900d8ff22b87641ae6ea2ed4c869258864d0644b881Swap Exact Token...126228782021-09-23 18:10:1535 mins ago0x0a97356968b07f64733548dd959fea26e6e26b8c IN  0x1b02da8cb0d097eb8d57a175b88c7d8b479975060 BNB0.001637244
0x7895c1096ec57c256fdad9d2581465d4194ae582246141cb36d577b28425bc36Swap Exact ETH F...126155552021-09-23 12:02:416 hrs 43 mins ago0x00fb564ff8455ae5e98020f18b15536fa91c680b IN  0x1b02da8cb0d097eb8d57a175b88c7d8b479975060.1 BNB0.0011017
0xf20240914a79e09b1f69dfc6d336ddeea73bae75a52f375982ca88edd664bc3fSwap Exact Token...126138162021-09-23 10:35:448 hrs 10 mins ago0x3eece27f12f28c3aaf6691b616837ea0c62112fc IN  0x1b02da8cb0d097eb8d57a175b88c7d8b479975060 BNB0.00113488
0xde1767d8ba940c361a6e6161124ad0f084392af1106b51715c8a3e20669d2599Swap Exact Token...126133462021-09-23 10:12:148 hrs 33 mins ago0x3eece27f12f28c3aaf6691b616837ea0c62112fc IN  0x1b02da8cb0d097eb8d57a175b88c7d8b479975060 BNB0.00029309
0x36eb19f843104838142ff26e84d07a124d4190d8c3653186066cfdb9eb98c6b1Swap Exact Token...126133432021-09-23 10:12:058 hrs 34 mins ago0x3eece27f12f28c3aaf6691b616837ea0c62112fc IN  0x1b02da8cb0d097eb8d57a175b88c7d8b479975060 BNB0.00113488
0xbf4b6a73bf366668edb68d69bbf6119ae66f02a920c766d90caa1c3850fa6d71Swap Exact Token...126125532021-09-23 9:32:359 hrs 13 mins ago0x3eece27f12f28c3aaf6691b616837ea0c62112fc IN  0x1b02da8cb0d097eb8d57a175b88c7d8b479975060 BNB0.00113488
0x34a5510171c09aa6368f4832b29f60097f9c9570443af5fe4cafa6c0dafef551Swap Exact Token...126098622021-09-23 7:18:0211 hrs 28 mins ago0x3eece27f12f28c3aaf6691b616837ea0c62112fc IN  0x1b02da8cb0d097eb8d57a175b88c7d8b479975060 BNB0.00113488
0xae5eeec5cabe997e57e1660e2746109fa9952cdd06d81afb691d8434e6a9a8bcSwap Exact Token...126098512021-09-23 7:17:2911 hrs 28 mins ago0x3eece27f12f28c3aaf6691b616837ea0c62112fc IN  0x1b02da8cb0d097eb8d57a175b88c7d8b479975060 BNB0.00113418
0xfc8bd5050c60a8a7edab9d6c1ed67c07ea074a17b3d6dd91a5b64530653603b7Swap Exact Token...126079342021-09-23 5:41:3813 hrs 4 mins ago0x3eece27f12f28c3aaf6691b616837ea0c62112fc IN  0x1b02da8cb0d097eb8d57a175b88c7d8b479975060 BNB0.00113488
0x9196e57d25cae38f3894ca949d5b853042509c8994d9b416335149c677af72f5Swap Exact Token...126079082021-09-23 5:40:2013 hrs 5 mins ago0x3eece27f12f28c3aaf6691b616837ea0c62112fc IN  0x1b02da8cb0d097eb8d57a175b88c7d8b479975060 BNB0.00113476
0x29df7b58d8b0c5c1809eadd885c9eba82227e8240c2ef674acd7ee4844517815Swap Exact Token...126041122021-09-23 2:30:3216 hrs 15 mins ago0x3eece27f12f28c3aaf6691b616837ea0c62112fc IN  0x1b02da8cb0d097eb8d57a175b88c7d8b479975060 BNB0.00113406
0x9a115838271e58e21e3994bba09e23ef889d0a8897fc43c84e71bfec22287dafSwap Exact Token...126041052021-09-23 2:30:1116 hrs 15 mins ago0x3eece27f12f28c3aaf6691b616837ea0c62112fc IN  0x1b02da8cb0d097eb8d57a175b88c7d8b479975060 BNB0.001135
0x25a0f78f09b0f5358616503ad697d4781441bab4fedb689c55170ee6b138305aSwap Exact ETH F...125947542021-09-22 18:42:361 day 3 mins ago0x444dcc1c9e4e123d3c55906a1b9cd6cfdb12a6aa IN  0x1b02da8cb0d097eb8d57a175b88c7d8b479975060.003 BNB0.00114735
0x770b181ade93ff91b7f957aa0d283f34b0e4f678e9e396d7c09fae1b200e5f15Swap Exact Token...125847722021-09-22 10:23:201 day 8 hrs ago0xf3985a8ff1cb10cafeec67b8ba9bc63ec096aea4 IN  0x1b02da8cb0d097eb8d57a175b88c7d8b479975060 BNB0.00058858
0x6ddf93bdde61b8b74dc05cd783848668016229d25594f97ba9aa92f5b8b3f4a9Swap Exact Token...125847512021-09-22 10:22:171 day 8 hrs ago0x3eece27f12f28c3aaf6691b616837ea0c62112fc IN  0x1b02da8cb0d097eb8d57a175b88c7d8b479975060 BNB0.0011343
0x99b0bbdfdfc66c19f1ca1c105955f28e9c3beacc7921bc3ba7760121242aa63aSwap Exact Token...125847222021-09-22 10:20:501 day 8 hrs ago0x3eece27f12f28c3aaf6691b616837ea0c62112fc IN  0x1b02da8cb0d097eb8d57a175b88c7d8b479975060 BNB0.0011343
0x51ad8772ecd87495603cc71d7c2dcddfe3820b4094a8e126c5f12679167395eaSwap Exact Token...125845202021-09-22 10:10:441 day 8 hrs ago0x3eece27f12f28c3aaf6691b616837ea0c62112fc IN  0x1b02da8cb0d097eb8d57a175b88c7d8b479975060 BNB0.0011343
0x681db16bdae2000e77a6a7c8e35f913091ecc0814cceaf564de0b75aad4f3d46Swap Exact Token...125839272021-09-22 9:41:051 day 9 hrs ago0x3eece27f12f28c3aaf6691b616837ea0c62112fc IN  0x1b02da8cb0d097eb8d57a175b88c7d8b479975060 BNB0.0011343
0x3d466ba8fa3e7983a7c0e31297037bed2e81910eeb128d763141ce979c8f60faSwap Exact Token...125839272021-09-22 9:41:051 day 9 hrs ago0x3eece27f12f28c3aaf6691b616837ea0c62112fc IN  0x1b02da8cb0d097eb8d57a175b88c7d8b479975060 BNB0.0011343
0x555f91a8101d9320ef8f8f0b02e1857d35d9672b66b4a970833061cee8fa11e8Swap Exact Token...125821562021-09-22 8:12:321 day 10 hrs ago0x3eece27f12f28c3aaf6691b616837ea0c62112fc IN  0x1b02da8cb0d097eb8d57a175b88c7d8b479975060 BNB0.00113452
0x19b3c10ee6b6a461eff3485e398cde5fe3cf5fb4352a184e1a1b6ff012447195Swap Exact Token...124117152021-09-16 8:40:097 days 10 hrs ago0x3eece27f12f28c3aaf6691b616837ea0c62112fc IN  0x1b02da8cb0d097eb8d57a175b88c7d8b479975060 BNB0.00113488
0xfcc3aff88e57e90afe6d7fed85a0715f0c1381adfb2a647c10b3767582f84550Swap Exact Token...124098822021-09-16 7:08:307 days 11 hrs ago0x3eece27f12f28c3aaf6691b616837ea0c62112fc IN  0x1b02da8cb0d097eb8d57a175b88c7d8b479975060 BNB0.00113488
0x5002e23dd56a31110ff935f6a34a5ffb62a0354df7c37247af1020177759fa13Swap Exact Token...124050142021-09-16 3:05:067 days 15 hrs ago0x3eece27f12f28c3aaf6691b616837ea0c62112fc IN  0x1b02da8cb0d097eb8d57a175b88c7d8b479975060 BNB0.0011343
0xfd6b285e37cfec016f97473c2cf2a14a2597502b928df1c855195388409bf575Swap Exact Token...124049602021-09-16 3:02:247 days 15 hrs ago0x3eece27f12f28c3aaf6691b616837ea0c62112fc IN  0x1b02da8cb0d097eb8d57a175b88c7d8b479975060 BNB0.00113488
0x20cd10271f74cdaeb42011fbc2fd8ed5f408ee692839cfac2c5733e5f16a4d3cSwap Exact Token...124042802021-09-16 2:28:247 days 16 hrs ago0x3eece27f12f28c3aaf6691b616837ea0c62112fc IN  0x1b02da8cb0d097eb8d57a175b88c7d8b479975060 BNB0.00113488
[ Download CSV Export 
Latest 25 internal transaction
Parent Txn Hash Block From To Value
0x7895c1096ec57c256fdad9d2581465d4194ae582246141cb36d577b28425bc36126155552021-09-23 12:02:416 hrs 43 mins ago 0x1b02da8cb0d097eb8d57a175b88c7d8b47997506 0xe7b93229b8b83cd61a45632594db364b16a7ddc50 BNB
0x7895c1096ec57c256fdad9d2581465d4194ae582246141cb36d577b28425bc36126155552021-09-23 12:02:416 hrs 43 mins ago 0x1b02da8cb0d097eb8d57a175b88c7d8b47997506 0xae13d989dac2f0debff460ac112a837c89baa7cd0 BNB
0x7895c1096ec57c256fdad9d2581465d4194ae582246141cb36d577b28425bc36126155552021-09-23 12:02:416 hrs 43 mins ago 0x1b02da8cb0d097eb8d57a175b88c7d8b47997506 0xae13d989dac2f0debff460ac112a837c89baa7cd0.1 BNB
0x7895c1096ec57c256fdad9d2581465d4194ae582246141cb36d577b28425bc36126155552021-09-23 12:02:416 hrs 43 mins ago 0x1b02da8cb0d097eb8d57a175b88c7d8b47997506 0xe7b93229b8b83cd61a45632594db364b16a7ddc50 BNB
0xdf7b3e21dc61c6033271a880e45467a0bedf3974f7af5bf5589645696b8ebb3c126151832021-09-23 11:44:057 hrs 2 mins ago 0x1b02da8cb0d097eb8d57a175b88c7d8b47997506 0x0c1261a31406b433f33f33b999eef829563758330 BNB
0xdf7b3e21dc61c6033271a880e45467a0bedf3974f7af5bf5589645696b8ebb3c126151832021-09-23 11:44:057 hrs 2 mins ago 0x1b02da8cb0d097eb8d57a175b88c7d8b47997506 0xb1c2ab08a51e28581cfbc6718875dbeb9124fea10 BNB
0xdf7b3e21dc61c6033271a880e45467a0bedf3974f7af5bf5589645696b8ebb3c126151832021-09-23 11:44:057 hrs 2 mins ago 0x1b02da8cb0d097eb8d57a175b88c7d8b47997506 0x0c1261a31406b433f33f33b999eef829563758330 BNB
0xdf7b3e21dc61c6033271a880e45467a0bedf3974f7af5bf5589645696b8ebb3c126151832021-09-23 11:44:057 hrs 2 mins ago 0xbf999f4a926a1d0e42eca994931e336d715f93ad 0x1b02da8cb0d097eb8d57a175b88c7d8b479975060 BNB
0xdf7b3e21dc61c6033271a880e45467a0bedf3974f7af5bf5589645696b8ebb3c126151832021-09-23 11:44:057 hrs 2 mins ago 0x1b02da8cb0d097eb8d57a175b88c7d8b47997506 0x0c1261a31406b433f33f33b999eef829563758330 BNB
0xdf7b3e21dc61c6033271a880e45467a0bedf3974f7af5bf5589645696b8ebb3c126151832021-09-23 11:44:057 hrs 2 mins ago 0xbf999f4a926a1d0e42eca994931e336d715f93ad 0x1b02da8cb0d097eb8d57a175b88c7d8b479975060 BNB
0x8607f34ce0ae3cc9599b5290654e8f46d4fc5f66a274881d852f3861069d9c27126146772021-09-23 11:18:477 hrs 27 mins ago 0x1b02da8cb0d097eb8d57a175b88c7d8b47997506 0x0c1261a31406b433f33f33b999eef829563758330 BNB
0x8607f34ce0ae3cc9599b5290654e8f46d4fc5f66a274881d852f3861069d9c27126146772021-09-23 11:18:477 hrs 27 mins ago 0x1b02da8cb0d097eb8d57a175b88c7d8b47997506 0x325eea1439b99ed9687706ab894486e305fde35c0 BNB
0x8607f34ce0ae3cc9599b5290654e8f46d4fc5f66a274881d852f3861069d9c27126146772021-09-23 11:18:477 hrs 27 mins ago 0x1b02da8cb0d097eb8d57a175b88c7d8b47997506 0xb1c2ab08a51e28581cfbc6718875dbeb9124fea10 BNB
0x8607f34ce0ae3cc9599b5290654e8f46d4fc5f66a274881d852f3861069d9c27126146772021-09-23 11:18:477 hrs 27 mins ago 0x1b02da8cb0d097eb8d57a175b88c7d8b47997506 0x0c1261a31406b433f33f33b999eef829563758330 BNB
0x8607f34ce0ae3cc9599b5290654e8f46d4fc5f66a274881d852f3861069d9c27126146772021-09-23 11:18:477 hrs 27 mins ago 0x1b02da8cb0d097eb8d57a175b88c7d8b47997506 0xc35dadb65012ec5796536bd9864ed8773abc74c40 BNB
0x8607f34ce0ae3cc9599b5290654e8f46d4fc5f66a274881d852f3861069d9c27126146772021-09-23 11:18:477 hrs 27 mins ago 0xbc622abc4d34b115bd20cd3d759405827a08fec9 0x1b02da8cb0d097eb8d57a175b88c7d8b479975060 BNB
0xf98ea9414967fcc6efc0e41852acf986d0df750efd268abbbad935414566f814126145822021-09-23 11:14:027 hrs 32 mins ago 0x1b02da8cb0d097eb8d57a175b88c7d8b47997506 0x0c1261a31406b433f33f33b999eef829563758330 BNB
0xf98ea9414967fcc6efc0e41852acf986d0df750efd268abbbad935414566f814126145822021-09-23 11:14:027 hrs 32 mins ago 0x1b02da8cb0d097eb8d57a175b88c7d8b47997506 0xb1c2ab08a51e28581cfbc6718875dbeb9124fea10 BNB
0xf98ea9414967fcc6efc0e41852acf986d0df750efd268abbbad935414566f814126145822021-09-23 11:14:027 hrs 32 mins ago 0x1b02da8cb0d097eb8d57a175b88c7d8b47997506 0x0c1261a31406b433f33f33b999eef829563758330 BNB
0xf98ea9414967fcc6efc0e41852acf986d0df750efd268abbbad935414566f814126145822021-09-23 11:14:027 hrs 32 mins ago 0x0406c5be9c17b2d38c1c4fb63bcb3eb3cc2c0fa5 0x1b02da8cb0d097eb8d57a175b88c7d8b479975060 BNB
0xf98ea9414967fcc6efc0e41852acf986d0df750efd268abbbad935414566f814126145822021-09-23 11:14:027 hrs 32 mins ago 0x1b02da8cb0d097eb8d57a175b88c7d8b47997506 0x0c1261a31406b433f33f33b999eef829563758330 BNB
0xf98ea9414967fcc6efc0e41852acf986d0df750efd268abbbad935414566f814126145822021-09-23 11:14:027 hrs 32 mins ago 0x0406c5be9c17b2d38c1c4fb63bcb3eb3cc2c0fa5 0x1b02da8cb0d097eb8d57a175b88c7d8b479975060 BNB
0xf6fe7efd5d070296c718741aad73cf9257ebbfd62281f1d83c4eea59347a8562126145362021-09-23 11:11:447 hrs 34 mins ago 0x1b02da8cb0d097eb8d57a175b88c7d8b47997506 0x0c1261a31406b433f33f33b999eef829563758330 BNB
0xf6fe7efd5d070296c718741aad73cf9257ebbfd62281f1d83c4eea59347a8562126145362021-09-23 11:11:447 hrs 34 mins ago 0x1b02da8cb0d097eb8d57a175b88c7d8b47997506 0x325eea1439b99ed9687706ab894486e305fde35c0 BNB
0xf6fe7efd5d070296c718741aad73cf9257ebbfd62281f1d83c4eea59347a8562126145362021-09-23 11:11:447 hrs 34 mins ago 0x1b02da8cb0d097eb8d57a175b88c7d8b47997506 0xb1c2ab08a51e28581cfbc6718875dbeb9124fea10 BNB
[ 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, MIT license

Contract Source Code (Solidity)

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

/**
 *Submitted for verification at BscScan.com on 2021-02-26
*/

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

60c060405234801561001057600080fd5b50604051620046e7380380620046e78339818101604052604081101561003557600080fd5b5080516020909101516001600160601b0319606092831b8116608052911b1660a05260805160601c60a05160601c614562620001856000398061015f5280610ce45280610d1f5280610e16528061103452806113be528061152452806118d352806119ae5280611a885280611b565280611c9c5280611d245280611f605280611fdb528061208f528061215b52806121f05280612264528061274752806129b15280612a075280612a3b5280612aaf5280612c3d5280612d805280612e08525080610ea45280610f7b52806110fa5280611133528061126e528061144c528061150252806116725280611be95280611d565280611eb0528061229652806124d452806126cc52806126f55280612725528061289252806129e55280612cd05280612e3a52806136c0528061370352806139dd5280613b535280613f445280613ffd52806140b052506145626000f3fe60806040526004361061014f5760003560e01c80638803dbee116100b6578063c45a01551161006f578063c45a015514610a10578063d06ca61f14610a25578063ded9382a14610ada578063e8e3370014610b4d578063f305d71914610bcd578063fb3bdb4114610c1357610188565b80638803dbee146107df578063ad5c464814610875578063ad615dec146108a6578063af2979eb146108dc578063b6f9de951461092f578063baa2abde146109b357610188565b80634a25d94a116101085780634a25d94a146104f05780635b0d5984146105865780635c11d795146105f9578063791ac9471461068f5780637ff36ab51461072557806385f8c259146107a957610188565b806302751cec1461018d578063054d50d4146101f957806318cbafe5146102415780631f00ca74146103275780632195995c146103dc57806338ed17391461045a57610188565b3661018857336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461018657fe5b005b600080fd5b34801561019957600080fd5b506101e0600480360360c08110156101b057600080fd5b506001600160a01b0381358116916020810135916040820135916060810135916080820135169060a00135610c97565b6040805192835260208301919091528051918290030190f35b34801561020557600080fd5b5061022f6004803603606081101561021c57600080fd5b5080359060208101359060400135610db1565b60408051918252519081900360200190f35b34801561024d57600080fd5b506102d7600480360360a081101561026457600080fd5b813591602081013591810190606081016040820135600160201b81111561028a57600080fd5b82018360208201111561029c57600080fd5b803590602001918460208302840111600160201b831117156102bd57600080fd5b91935091506001600160a01b038135169060200135610dc6565b60408051602080825283518183015283519192839290830191858101910280838360005b838110156103135781810151838201526020016102fb565b505050509050019250505060405180910390f35b34801561033357600080fd5b506102d76004803603604081101561034a57600080fd5b81359190810190604081016020820135600160201b81111561036b57600080fd5b82018360208201111561037d57600080fd5b803590602001918460208302840111600160201b8311171561039e57600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295506110f3945050505050565b3480156103e857600080fd5b506101e0600480360361016081101561040057600080fd5b506001600160a01b038135811691602081013582169160408201359160608101359160808201359160a08101359091169060c08101359060e081013515159060ff6101008201351690610120810135906101400135611129565b34801561046657600080fd5b506102d7600480360360a081101561047d57600080fd5b813591602081013591810190606081016040820135600160201b8111156104a357600080fd5b8201836020820111156104b557600080fd5b803590602001918460208302840111600160201b831117156104d657600080fd5b91935091506001600160a01b038135169060200135611223565b3480156104fc57600080fd5b506102d7600480360360a081101561051357600080fd5b813591602081013591810190606081016040820135600160201b81111561053957600080fd5b82018360208201111561054b57600080fd5b803590602001918460208302840111600160201b8311171561056c57600080fd5b91935091506001600160a01b03813516906020013561136e565b34801561059257600080fd5b5061022f60048036036101408110156105aa57600080fd5b506001600160a01b0381358116916020810135916040820135916060810135916080820135169060a08101359060c081013515159060ff60e082013516906101008101359061012001356114fa565b34801561060557600080fd5b50610186600480360360a081101561061c57600080fd5b813591602081013591810190606081016040820135600160201b81111561064257600080fd5b82018360208201111561065457600080fd5b803590602001918460208302840111600160201b8311171561067557600080fd5b91935091506001600160a01b038135169060200135611608565b34801561069b57600080fd5b50610186600480360360a08110156106b257600080fd5b813591602081013591810190606081016040820135600160201b8111156106d857600080fd5b8201836020820111156106ea57600080fd5b803590602001918460208302840111600160201b8311171561070b57600080fd5b91935091506001600160a01b038135169060200135611885565b6102d76004803603608081101561073b57600080fd5b81359190810190604081016020820135600160201b81111561075c57600080fd5b82018360208201111561076e57600080fd5b803590602001918460208302840111600160201b8311171561078f57600080fd5b91935091506001600160a01b038135169060200135611b0e565b3480156107b557600080fd5b5061022f600480360360608110156107cc57600080fd5b5080359060208101359060400135611e58565b3480156107eb57600080fd5b506102d7600480360360a081101561080257600080fd5b813591602081013591810190606081016040820135600160201b81111561082857600080fd5b82018360208201111561083a57600080fd5b803590602001918460208302840111600160201b8311171561085b57600080fd5b91935091506001600160a01b038135169060200135611e65565b34801561088157600080fd5b5061088a611f5e565b604080516001600160a01b039092168252519081900360200190f35b3480156108b257600080fd5b5061022f600480360360608110156108c957600080fd5b5080359060208101359060400135611f82565b3480156108e857600080fd5b5061022f600480360360c08110156108ff57600080fd5b506001600160a01b0381358116916020810135916040820135916060810135916080820135169060a00135611f8f565b6101866004803603608081101561094557600080fd5b81359190810190604081016020820135600160201b81111561096657600080fd5b82018360208201111561097857600080fd5b803590602001918460208302840111600160201b8311171561099957600080fd5b91935091506001600160a01b038135169060200135612115565b3480156109bf57600080fd5b506101e0600480360360e08110156109d657600080fd5b506001600160a01b038135811691602081013582169160408201359160608101359160808201359160a08101359091169060c00135612486565b348015610a1c57600080fd5b5061088a6126ca565b348015610a3157600080fd5b506102d760048036036040811015610a4857600080fd5b81359190810190604081016020820135600160201b811115610a6957600080fd5b820183602082011115610a7b57600080fd5b803590602001918460208302840111600160201b83111715610a9c57600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295506126ee945050505050565b348015610ae657600080fd5b506101e06004803603610140811015610afe57600080fd5b506001600160a01b0381358116916020810135916040820135916060810135916080820135169060a08101359060c081013515159060ff60e0820135169061010081013590610120013561271b565b348015610b5957600080fd5b50610baf6004803603610100811015610b7157600080fd5b506001600160a01b038135811691602081013582169160408201359160608101359160808201359160a08101359160c0820135169060e0013561282f565b60408051938452602084019290925282820152519081900360600190f35b610baf600480360360c0811015610be357600080fd5b506001600160a01b0381358116916020810135916040820135916060810135916080820135169060a00135612962565b6102d760048036036080811015610c2957600080fd5b81359190810190604081016020820135600160201b811115610c4a57600080fd5b820183602082011115610c5c57600080fd5b803590602001918460208302840111600160201b83111715610c7d57600080fd5b91935091506001600160a01b038135169060200135612bf5565b6000808242811015610cde576040805162461bcd60e51b8152602060048201526018602482015260008051602061450d833981519152604482015290519081900360640190fd5b610d0d897f00000000000000000000000000000000000000000000000000000000000000008a8a8a308a612486565b9093509150610d1d898685612f6e565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632e1a7d4d836040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b158015610d8357600080fd5b505af1158015610d97573d6000803e3d6000fd5b50505050610da585836130d8565b50965096945050505050565b6000610dbe8484846131d0565b949350505050565b60608142811015610e0c576040805162461bcd60e51b8152602060048201526018602482015260008051602061450d833981519152604482015290519081900360640190fd5b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001686866000198101818110610e4657fe5b905060200201356001600160a01b03166001600160a01b031614610e9f576040805162461bcd60e51b815260206004820152601d602482015260008051602061442a833981519152604482015290519081900360640190fd5b610efd7f0000000000000000000000000000000000000000000000000000000000000000898888808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152506132a892505050565b91508682600184510381518110610f1057fe5b60200260200101511015610f555760405162461bcd60e51b815260040180806020018281038252602b815260200180614493602b913960400191505060405180910390fd5b610ff386866000818110610f6557fe5b905060200201356001600160a01b031633610fd97f00000000000000000000000000000000000000000000000000000000000000008a8a6000818110610fa757fe5b905060200201356001600160a01b03168b8b6001818110610fc457fe5b905060200201356001600160a01b03166133f4565b85600081518110610fe657fe5b60200260200101516134b4565b61103282878780806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250309250613611915050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632e1a7d4d8360018551038151811061107157fe5b60200260200101516040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b1580156110af57600080fd5b505af11580156110c3573d6000803e3d6000fd5b505050506110e884836001855103815181106110db57fe5b60200260200101516130d8565b509695505050505050565b60606111207f0000000000000000000000000000000000000000000000000000000000000000848461384e565b90505b92915050565b60008060006111597f00000000000000000000000000000000000000000000000000000000000000008f8f6133f4565b9050600087611168578c61116c565b6000195b6040805163d505accf60e01b815233600482015230602482015260448101839052606481018c905260ff8a16608482015260a4810189905260c4810188905290519192506001600160a01b0384169163d505accf9160e48082019260009290919082900301818387803b1580156111e257600080fd5b505af11580156111f6573d6000803e3d6000fd5b505050506112098f8f8f8f8f8f8f612486565b809450819550505050509b509b9950505050505050505050565b60608142811015611269576040805162461bcd60e51b8152602060048201526018602482015260008051602061450d833981519152604482015290519081900360640190fd5b6112c77f0000000000000000000000000000000000000000000000000000000000000000898888808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152506132a892505050565b915086826001845103815181106112da57fe5b6020026020010151101561131f5760405162461bcd60e51b815260040180806020018281038252602b815260200180614493602b913960400191505060405180910390fd5b61132f86866000818110610f6557fe5b6110e882878780806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250899250613611915050565b606081428110156113b4576040805162461bcd60e51b8152602060048201526018602482015260008051602061450d833981519152604482015290519081900360640190fd5b6001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016868660001981018181106113ee57fe5b905060200201356001600160a01b03166001600160a01b031614611447576040805162461bcd60e51b815260206004820152601d602482015260008051602061442a833981519152604482015290519081900360640190fd5b6114a57f00000000000000000000000000000000000000000000000000000000000000008988888080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061384e92505050565b915086826000815181106114b557fe5b60200260200101511115610f555760405162461bcd60e51b81526004018080602001828103825260278152602001806144036027913960400191505060405180910390fd5b6000806115487f00000000000000000000000000000000000000000000000000000000000000008d7f00000000000000000000000000000000000000000000000000000000000000006133f4565b9050600086611557578b61155b565b6000195b6040805163d505accf60e01b815233600482015230602482015260448101839052606481018b905260ff8916608482015260a4810188905260c4810187905290519192506001600160a01b0384169163d505accf9160e48082019260009290919082900301818387803b1580156115d157600080fd5b505af11580156115e5573d6000803e3d6000fd5b505050506115f78d8d8d8d8d8d611f8f565b9d9c50505050505050505050505050565b804281101561164c576040805162461bcd60e51b8152602060048201526018602482015260008051602061450d833981519152604482015290519081900360640190fd5b6116c18585600081811061165c57fe5b905060200201356001600160a01b0316336116bb7f00000000000000000000000000000000000000000000000000000000000000008989600081811061169e57fe5b905060200201356001600160a01b03168a8a6001818110610fc457fe5b8a6134b4565b6000858560001981018181106116d357fe5b905060200201356001600160a01b03166001600160a01b03166370a08231856040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561172f57600080fd5b505afa158015611743573d6000803e3d6000fd5b505050506040513d602081101561175957600080fd5b5051604080516020888102828101820190935288825292935061179b929091899189918291850190849080828437600092019190915250889250613986915050565b8661183e82888860001981018181106117b057fe5b905060200201356001600160a01b03166001600160a01b03166370a08231886040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561180c57600080fd5b505afa158015611820573d6000803e3d6000fd5b505050506040513d602081101561183657600080fd5b505190613c88565b101561187b5760405162461bcd60e51b815260040180806020018281038252602b815260200180614493602b913960400191505060405180910390fd5b5050505050505050565b80428110156118c9576040805162461bcd60e51b8152602060048201526018602482015260008051602061450d833981519152604482015290519081900360640190fd5b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000168585600019810181811061190357fe5b905060200201356001600160a01b03166001600160a01b03161461195c576040805162461bcd60e51b815260206004820152601d602482015260008051602061442a833981519152604482015290519081900360640190fd5b61196c8585600081811061165c57fe5b6119aa858580806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250309250613986915050565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015611a1957600080fd5b505afa158015611a2d573d6000803e3d6000fd5b505050506040513d6020811015611a4357600080fd5b5051905086811015611a865760405162461bcd60e51b815260040180806020018281038252602b815260200180614493602b913960400191505060405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632e1a7d4d826040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b158015611aec57600080fd5b505af1158015611b00573d6000803e3d6000fd5b5050505061187b84826130d8565b60608142811015611b54576040805162461bcd60e51b8152602060048201526018602482015260008051602061450d833981519152604482015290519081900360640190fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031686866000818110611b8b57fe5b905060200201356001600160a01b03166001600160a01b031614611be4576040805162461bcd60e51b815260206004820152601d602482015260008051602061442a833981519152604482015290519081900360640190fd5b611c427f0000000000000000000000000000000000000000000000000000000000000000348888808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152506132a892505050565b91508682600184510381518110611c5557fe5b60200260200101511015611c9a5760405162461bcd60e51b815260040180806020018281038252602b815260200180614493602b913960400191505060405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db083600081518110611cd657fe5b60200260200101516040518263ffffffff1660e01b81526004016000604051808303818588803b158015611d0957600080fd5b505af1158015611d1d573d6000803e3d6000fd5b50505050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a9059cbb611d827f00000000000000000000000000000000000000000000000000000000000000008989600081811061169e57fe5b84600081518110611d8f57fe5b60200260200101516040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050602060405180830381600087803b158015611ddd57600080fd5b505af1158015611df1573d6000803e3d6000fd5b505050506040513d6020811015611e0757600080fd5b5051611e0f57fe5b611e4e82878780806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250899250613611915050565b5095945050505050565b6000610dbe848484613cd8565b60608142811015611eab576040805162461bcd60e51b8152602060048201526018602482015260008051602061450d833981519152604482015290519081900360640190fd5b611f097f00000000000000000000000000000000000000000000000000000000000000008988888080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061384e92505050565b91508682600081518110611f1957fe5b6020026020010151111561131f5760405162461bcd60e51b81526004018080602001828103825260278152602001806144036027913960400191505060405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000081565b6000610dbe848484613db0565b60008142811015611fd5576040805162461bcd60e51b8152602060048201526018602482015260008051602061450d833981519152604482015290519081900360640190fd5b612004887f00000000000000000000000000000000000000000000000000000000000000008989893089612486565b90508092505061208d88858a6001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561205c57600080fd5b505afa158015612070573d6000803e3d6000fd5b505050506040513d602081101561208657600080fd5b5051612f6e565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632e1a7d4d836040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b1580156120f357600080fd5b505af1158015612107573d6000803e3d6000fd5b505050506110e884836130d8565b8042811015612159576040805162461bcd60e51b8152602060048201526018602482015260008051602061450d833981519152604482015290519081900360640190fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168585600081811061219057fe5b905060200201356001600160a01b03166001600160a01b0316146121e9576040805162461bcd60e51b815260206004820152601d602482015260008051602061442a833981519152604482015290519081900360640190fd5b60003490507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db0826040518263ffffffff1660e01b81526004016000604051808303818588803b15801561224957600080fd5b505af115801561225d573d6000803e3d6000fd5b50505050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a9059cbb6122c27f00000000000000000000000000000000000000000000000000000000000000008989600081811061169e57fe5b836040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050602060405180830381600087803b15801561230957600080fd5b505af115801561231d573d6000803e3d6000fd5b505050506040513d602081101561233357600080fd5b505161233b57fe5b60008686600019810181811061234d57fe5b905060200201356001600160a01b03166001600160a01b03166370a08231866040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b1580156123a957600080fd5b505afa1580156123bd573d6000803e3d6000fd5b505050506040513d60208110156123d357600080fd5b505160408051602089810282810182019093528982529293506124159290918a918a918291850190849080828437600092019190915250899250613986915050565b8761183e828989600019810181811061242a57fe5b905060200201356001600160a01b03166001600160a01b03166370a08231896040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561180c57600080fd5b60008082428110156124cd576040805162461bcd60e51b8152602060048201526018602482015260008051602061450d833981519152604482015290519081900360640190fd5b60006124fa7f00000000000000000000000000000000000000000000000000000000000000008c8c6133f4565b604080516323b872dd60e01b81523360048201526001600160a01b03831660248201819052604482018d9052915192935090916323b872dd916064808201926020929091908290030181600087803b15801561255557600080fd5b505af1158015612569573d6000803e3d6000fd5b505050506040513d602081101561257f57600080fd5b50506040805163226bf2d160e21b81526001600160a01b03888116600483015282516000938493928616926389afcb44926024808301939282900301818787803b1580156125cc57600080fd5b505af11580156125e0573d6000803e3d6000fd5b505050506040513d60408110156125f657600080fd5b508051602090910151909250905060006126108e8e613e56565b509050806001600160a01b03168e6001600160a01b031614612633578183612636565b82825b90975095508a87101561267a5760405162461bcd60e51b815260040180806020018281038252602681526020018061444a6026913960400191505060405180910390fd5b898610156126b95760405162461bcd60e51b81526004018080602001828103825260268152602001806143906026913960400191505060405180910390fd5b505050505097509795505050505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b60606111207f000000000000000000000000000000000000000000000000000000000000000084846132a8565b600080600061276b7f00000000000000000000000000000000000000000000000000000000000000008e7f00000000000000000000000000000000000000000000000000000000000000006133f4565b905060008761277a578c61277e565b6000195b6040805163d505accf60e01b815233600482015230602482015260448101839052606481018c905260ff8a16608482015260a4810189905260c4810188905290519192506001600160a01b0384169163d505accf9160e48082019260009290919082900301818387803b1580156127f457600080fd5b505af1158015612808573d6000803e3d6000fd5b5050505061281a8e8e8e8e8e8e610c97565b909f909e509c50505050505050505050505050565b60008060008342811015612878576040805162461bcd60e51b8152602060048201526018602482015260008051602061450d833981519152604482015290519081900360640190fd5b6128868c8c8c8c8c8c613f34565b909450925060006128b87f00000000000000000000000000000000000000000000000000000000000000008e8e6133f4565b90506128c68d3383886134b4565b6128d28c3383876134b4565b806001600160a01b0316636a627842886040518263ffffffff1660e01b815260040180826001600160a01b03168152602001915050602060405180830381600087803b15801561292157600080fd5b505af1158015612935573d6000803e3d6000fd5b505050506040513d602081101561294b57600080fd5b5051949d939c50939a509198505050505050505050565b600080600083428110156129ab576040805162461bcd60e51b8152602060048201526018602482015260008051602061450d833981519152604482015290519081900360640190fd5b6129d98a7f00000000000000000000000000000000000000000000000000000000000000008b348c8c613f34565b90945092506000612a2b7f00000000000000000000000000000000000000000000000000000000000000008c7f00000000000000000000000000000000000000000000000000000000000000006133f4565b9050612a398b3383886134b4565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db0856040518263ffffffff1660e01b81526004016000604051808303818588803b158015612a9457600080fd5b505af1158015612aa8573d6000803e3d6000fd5b50505050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a9059cbb82866040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050602060405180830381600087803b158015612b2457600080fd5b505af1158015612b38573d6000803e3d6000fd5b505050506040513d6020811015612b4e57600080fd5b5051612b5657fe5b806001600160a01b0316636a627842886040518263ffffffff1660e01b815260040180826001600160a01b03168152602001915050602060405180830381600087803b158015612ba557600080fd5b505af1158015612bb9573d6000803e3d6000fd5b505050506040513d6020811015612bcf57600080fd5b5051925034841015612be757612be7338534036130d8565b505096509650969350505050565b60608142811015612c3b576040805162461bcd60e51b8152602060048201526018602482015260008051602061450d833981519152604482015290519081900360640190fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031686866000818110612c7257fe5b905060200201356001600160a01b03166001600160a01b031614612ccb576040805162461bcd60e51b815260206004820152601d602482015260008051602061442a833981519152604482015290519081900360640190fd5b612d297f00000000000000000000000000000000000000000000000000000000000000008888888080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061384e92505050565b91503482600081518110612d3957fe5b60200260200101511115612d7e5760405162461bcd60e51b81526004018080602001828103825260278152602001806144036027913960400191505060405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db083600081518110612dba57fe5b60200260200101516040518263ffffffff1660e01b81526004016000604051808303818588803b158015612ded57600080fd5b505af1158015612e01573d6000803e3d6000fd5b50505050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a9059cbb612e667f00000000000000000000000000000000000000000000000000000000000000008989600081811061169e57fe5b84600081518110612e7357fe5b60200260200101516040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050602060405180830381600087803b158015612ec157600080fd5b505af1158015612ed5573d6000803e3d6000fd5b505050506040513d6020811015612eeb57600080fd5b5051612ef357fe5b612f3282878780806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250899250613611915050565b81600081518110612f3f57fe5b6020026020010151341115611e4e57611e4e3383600081518110612f5f57fe5b602002602001015134036130d8565b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180516001600160e01b031663a9059cbb60e01b178152925182516000946060949389169392918291908083835b60208310612feb5780518252601f199092019160209182019101612fcc565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d806000811461304d576040519150601f19603f3d011682016040523d82523d6000602084013e613052565b606091505b5091509150818015613080575080511580613080575080806020019051602081101561307d57600080fd5b50515b6130d1576040805162461bcd60e51b815260206004820152601f60248201527f5472616e7366657248656c7065723a205452414e534645525f4641494c454400604482015290519081900360640190fd5b5050505050565b604080516000808252602082019092526001600160a01b0384169083906040518082805190602001908083835b602083106131245780518252601f199092019160209182019101613105565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114613186576040519150601f19603f3d011682016040523d82523d6000602084013e61318b565b606091505b50509050806131cb5760405162461bcd60e51b81526004018080602001828103825260238152602001806144706023913960400191505060405180910390fd5b505050565b60008084116132105760405162461bcd60e51b815260040180806020018281038252602b8152602001806144e2602b913960400191505060405180910390fd5b6000831180156132205750600082115b61325b5760405162461bcd60e51b81526004018080602001828103825260288152602001806143b66028913960400191505060405180910390fd5b6000613269856103e56141c5565b9050600061327782856141c5565b905060006132918361328b886103e86141c5565b90614228565b905080828161329c57fe5b04979650505050505050565b6060600282511015613301576040805162461bcd60e51b815260206004820152601e60248201527f556e697377617056324c6962726172793a20494e56414c49445f504154480000604482015290519081900360640190fd5b815167ffffffffffffffff8111801561331957600080fd5b50604051908082528060200260200182016040528015613343578160200160208202803683370190505b509050828160008151811061335457fe5b60200260200101818152505060005b60018351038110156133ec576000806133a68786858151811061338257fe5b602002602001015187866001018151811061339957fe5b6020026020010151614277565b915091506133c88484815181106133b957fe5b602002602001015183836131d0565b8484600101815181106133d757fe5b60209081029190910101525050600101613363565b509392505050565b60008060006134038585613e56565b604080516bffffffffffffffffffffffff19606094851b811660208084019190915293851b81166034830152825160288184030181526048830184528051908501206001600160f81b031960688401529a90941b9093166069840152607d8301989098527fe18a34eb0e04b04f7a0ac29a6e80748dca96319b42c54d679cb821dca90c6303609d808401919091528851808403909101815260bd909201909752805196019590952095945050505050565b604080516001600160a01b0385811660248301528481166044830152606480830185905283518084039091018152608490920183526020820180516001600160e01b03166323b872dd60e01b17815292518251600094606094938a169392918291908083835b602083106135395780518252601f19909201916020918201910161351a565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d806000811461359b576040519150601f19603f3d011682016040523d82523d6000602084013e6135a0565b606091505b50915091508180156135ce5750805115806135ce57508080602001905160208110156135cb57600080fd5b50515b6136095760405162461bcd60e51b81526004018080602001828103825260248152602001806144be6024913960400191505060405180910390fd5b505050505050565b60005b60018351038110156138485760008084838151811061362f57fe5b602002602001015185846001018151811061364657fe5b602002602001015191509150600061365e8383613e56565b509050600087856001018151811061367257fe5b60200260200101519050600080836001600160a01b0316866001600160a01b0316146136a0578260006136a4565b6000835b91509150600060028a510388106136bb57886136fc565b6136fc7f0000000000000000000000000000000000000000000000000000000000000000878c8b600201815181106136ef57fe5b60200260200101516133f4565b90506137297f000000000000000000000000000000000000000000000000000000000000000088886133f4565b6001600160a01b031663022c0d9f84848460006040519080825280601f01601f191660200182016040528015613766576020820181803683370190505b506040518563ffffffff1660e01b815260040180858152602001848152602001836001600160a01b0316815260200180602001828103825283818151815260200191508051906020019080838360005b838110156137ce5781810151838201526020016137b6565b50505050905090810190601f1680156137fb5780820380516001836020036101000a031916815260200191505b5095505050505050600060405180830381600087803b15801561381d57600080fd5b505af1158015613831573d6000803e3d6000fd5b505060019099019850613614975050505050505050565b50505050565b60606002825110156138a7576040805162461bcd60e51b815260206004820152601e60248201527f556e697377617056324c6962726172793a20494e56414c49445f504154480000604482015290519081900360640190fd5b815167ffffffffffffffff811180156138bf57600080fd5b506040519080825280602002602001820160405280156138e9578160200160208202803683370190505b50905082816001835103815181106138fd57fe5b60209081029190910101528151600019015b80156133ec5760008061393f8786600186038151811061392b57fe5b602002602001015187868151811061339957fe5b9150915061396184848151811061395257fe5b60200260200101518383613cd8565b84600185038151811061397057fe5b602090810291909101015250506000190161390f565b60005b60018351038110156131cb576000808483815181106139a457fe5b60200260200101518584600101815181106139bb57fe5b60200260200101519150915060006139d38383613e56565b5090506000613a037f000000000000000000000000000000000000000000000000000000000000000085856133f4565b9050600080600080846001600160a01b0316630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b158015613a4457600080fd5b505afa158015613a58573d6000803e3d6000fd5b505050506040513d6060811015613a6e57600080fd5b5080516020909101516001600160701b0391821693501690506000806001600160a01b038a811690891614613aa4578284613aa7565b83835b91509150613afc828b6001600160a01b03166370a082318a6040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561180c57600080fd5b9550613b098683836131d0565b945050505050600080856001600160a01b0316886001600160a01b031614613b3357826000613b37565b6000835b91509150600060028c51038a10613b4e578a613b82565b613b827f0000000000000000000000000000000000000000000000000000000000000000898e8d600201815181106136ef57fe5b604080516000808252602082019283905263022c0d9f60e01b835260248201878152604483018790526001600160a01b038086166064850152608060848501908152845160a48601819052969750908c169563022c0d9f958a958a958a9591949193919260c486019290918190849084905b83811015613c0c578181015183820152602001613bf4565b50505050905090810190601f168015613c395780820380516001836020036101000a031916815260200191505b5095505050505050600060405180830381600087803b158015613c5b57600080fd5b505af1158015613c6f573d6000803e3d6000fd5b50506001909b019a506139899950505050505050505050565b80820382811115611123576040805162461bcd60e51b815260206004820152601560248201527464732d6d6174682d7375622d756e646572666c6f7760581b604482015290519081900360640190fd5b6000808411613d185760405162461bcd60e51b815260040180806020018281038252602c81526020018061433f602c913960400191505060405180910390fd5b600083118015613d285750600082115b613d635760405162461bcd60e51b81526004018080602001828103825260288152602001806143b66028913960400191505060405180910390fd5b6000613d7b6103e8613d7586886141c5565b906141c5565b90506000613d8f6103e5613d758689613c88565b9050613da66001828481613d9f57fe5b0490614228565b9695505050505050565b6000808411613df05760405162461bcd60e51b81526004018080602001828103825260258152602001806143de6025913960400191505060405180910390fd5b600083118015613e005750600082115b613e3b5760405162461bcd60e51b81526004018080602001828103825260288152602001806143b66028913960400191505060405180910390fd5b82613e4685846141c5565b81613e4d57fe5b04949350505050565b600080826001600160a01b0316846001600160a01b03161415613eaa5760405162461bcd60e51b815260040180806020018281038252602581526020018061436b6025913960400191505060405180910390fd5b826001600160a01b0316846001600160a01b031610613eca578284613ecd565b83835b90925090506001600160a01b038216613f2d576040805162461bcd60e51b815260206004820152601e60248201527f556e697377617056324c6962726172793a205a45524f5f414444524553530000604482015290519081900360640190fd5b9250929050565b60008060006001600160a01b03167f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663e6a439058a8a6040518363ffffffff1660e01b815260040180836001600160a01b03168152602001826001600160a01b031681526020019250505060206040518083038186803b158015613fc057600080fd5b505afa158015613fd4573d6000803e3d6000fd5b505050506040513d6020811015613fea57600080fd5b50516001600160a01b031614156140a8577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663c9c6539689896040518363ffffffff1660e01b815260040180836001600160a01b03168152602001826001600160a01b0316815260200192505050602060405180830381600087803b15801561407b57600080fd5b505af115801561408f573d6000803e3d6000fd5b505050506040513d60208110156140a557600080fd5b50505b6000806140d67f00000000000000000000000000000000000000000000000000000000000000008b8b614277565b915091508160001480156140e8575080155b156140f8578793508692506141b8565b6000614105898484613db0565b9050878111614158578581101561414d5760405162461bcd60e51b81526004018080602001828103825260268152602001806143906026913960400191505060405180910390fd5b8894509250826141b6565b6000614165898486613db0565b90508981111561417157fe5b878110156141b05760405162461bcd60e51b815260040180806020018281038252602681526020018061444a6026913960400191505060405180910390fd5b94508793505b505b5050965096945050505050565b60008115806141e0575050808202828282816141dd57fe5b04145b611123576040805162461bcd60e51b815260206004820152601460248201527364732d6d6174682d6d756c2d6f766572666c6f7760601b604482015290519081900360640190fd5b80820182811015611123576040805162461bcd60e51b815260206004820152601460248201527364732d6d6174682d6164642d6f766572666c6f7760601b604482015290519081900360640190fd5b60008060006142868585613e56565b5090506000806142978888886133f4565b6001600160a01b0316630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b1580156142cf57600080fd5b505afa1580156142e3573d6000803e3d6000fd5b505050506040513d60608110156142f957600080fd5b5080516020909101516001600160701b0391821693501690506001600160a01b038781169084161461432c57808261432f565b81815b9099909850965050505050505056fe556e697377617056324c6962726172793a20494e53554646494349454e545f4f55545055545f414d4f554e54556e697377617056324c6962726172793a204944454e544943414c5f414444524553534553556e69737761705632526f757465723a20494e53554646494349454e545f425f414d4f554e54556e697377617056324c6962726172793a20494e53554646494349454e545f4c4951554944495459556e697377617056324c6962726172793a20494e53554646494349454e545f414d4f554e54556e69737761705632526f757465723a204558434553534956455f494e5055545f414d4f554e54556e69737761705632526f757465723a20494e56414c49445f50415448000000556e69737761705632526f757465723a20494e53554646494349454e545f415f414d4f554e545472616e7366657248656c7065723a204554485f5452414e534645525f4641494c4544556e69737761705632526f757465723a20494e53554646494349454e545f4f55545055545f414d4f554e545472616e7366657248656c7065723a205452414e534645525f46524f4d5f4641494c4544556e697377617056324c6962726172793a20494e53554646494349454e545f494e5055545f414d4f554e54556e69737761705632526f757465723a20455850495245440000000000000000a26469706673582212201046181566cf8a35bd60f7e94b82dcde5a31b9e46aa697f15b739ad658b7871164736f6c634300060c0033000000000000000000000000c35dadb65012ec5796536bd9864ed8773abc74c4000000000000000000000000ae13d989dac2f0debff460ac112a837c89baa7cd

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

000000000000000000000000c35dadb65012ec5796536bd9864ed8773abc74c4000000000000000000000000ae13d989dac2f0debff460ac112a837c89baa7cd
-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 000000000000000000000000c35dadb65012ec5796536bd9864ed8773abc74c4
Arg [1] : 000000000000000000000000ae13d989dac2f0debff460ac112a837c89baa7cd


Deployed ByteCode Sourcemap

16550:18605:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17039:10;-1:-1:-1;;;;;17053:4:0;17039:18;;17032:26;;;;16550:18605;;;;;21189:673;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;21189:673:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;34099:262;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;34099:262:0;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;28365:850;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;28365:850:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;28365:850:0;;;;;;;;;;;;-1:-1:-1;28365:850:0;-1:-1:-1;;;;;;28365:850:0;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34899:253;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;34899:253:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;34899:253:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;34899:253:0;;-1:-1:-1;34899:253:0;;-1:-1:-1;;;;;34899:253:0:i;21868:677::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;21868:677:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;25582:628::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;25582:628:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;25582:628:0;;;;;;;;;;;;-1:-1:-1;25582:628:0;-1:-1:-1;;;;;;25582:628:0;;;;;;;;:::i;27531:828::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;27531:828:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;27531:828:0;;;;;;;;;;;;-1:-1:-1;27531:828:0;-1:-1:-1;;;;;;27531:828:0;;;;;;;;:::i;24012:718::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;24012:718:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;31405:728::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;31405:728:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;31405:728:0;;;;;;;;;;;;-1:-1:-1;31405:728:0;-1:-1:-1;;;;;;31405:728:0;;;;;;;;:::i;33009:850::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;33009:850:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;33009:850:0;;;;;;;;;;;;-1:-1:-1;33009:850:0;-1:-1:-1;;;;;;33009:850:0;;;;;;;;:::i;26828:697::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;26828:697:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;26828:697:0;;;;;;;;;;;;-1:-1:-1;26828:697:0;-1:-1:-1;;;;;;26828:697:0;;;;;;;;:::i;34369:261::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;34369:261:0;;;;;;;;;;;;:::i;26216:606::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;26216:606:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;26216:606:0;;;;;;;;;;;;-1:-1:-1;26216:606:0;-1:-1:-1;;;;;;26216:606:0;;;;;;;;:::i;16693:38::-;;;;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;16693:38:0;;;;;;;;;;;;;;33903:188;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;33903:188:0;;;;;;;;;;;;:::i;23299:707::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;23299:707:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;32139:864::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;32139:864:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;32139:864:0;;;;;;;;;;;;-1:-1:-1;32139:864:0;-1:-1:-1;;;;;;32139:864:0;;;;;;;;:::i;20318:865::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;20318:865:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;16645:41::-;;;;;;;;;;;;;:::i;34638:253::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;34638:253:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;34638:253:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;34638:253:0;;-1:-1:-1;34638:253:0;;-1:-1:-1;;;;;34638:253:0:i;22551:669::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;22551:669:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;18557:738::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;18557:738:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;19301:974;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;19301:974:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;29221:810::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;29221:810:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;29221:810:0;;;;;;;;;;;;-1:-1:-1;29221:810:0;-1:-1:-1;;;;;;29221:810:0;;;;;;;;:::i;21189:673::-;21426:16;21444:14;21407:8;16802:15;16790:8;:27;;16782:64;;;;;-1:-1:-1;;;16782:64:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;16782:64:0;;;;;;;;;;;;;;;21498:196:::1;21528:5;21548:4;21567:9;21591:14;21620:12;21655:4;21675:8;21498:15;:196::i;:::-;21471:223:::0;;-1:-1:-1;21471:223:0;-1:-1:-1;21705:51:0::1;21733:5:::0;21740:2;21471:223;21705:27:::1;:51::i;:::-;21773:4;-1:-1:-1::0;;;;;21767:20:0::1;;21788:9;21767:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;21809:45;21840:2;21844:9;21809:30;:45::i;:::-;21189:673:::0;;;;;;;;;;:::o;34099:262::-;34252:14;34291:62;34321:8;34331:9;34342:10;34291:29;:62::i;:::-;34284:69;34099:262;-1:-1:-1;;;;34099:262:0:o;28365:850::-;28579:21;28551:8;16802:15;16790:8;:27;;16782:64;;;;;-1:-1:-1;;;16782:64:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;16782:64:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;28651:4:0::1;28626:29;:4:::0;;-1:-1:-1;;28631:15:0;;28626:21;;::::1;;;;;;;;;;;-1:-1:-1::0;;;;;28626:21:0::1;-1:-1:-1::0;;;;;28626:29:0::1;;28618:71;;;::::0;;-1:-1:-1;;;28618:71:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;;;;;;;;;28618:71:0;;;;;;;;;;;;;::::1;;28710:55;28741:7;28750:8;28760:4;;28710:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;28710:30:0::1;::::0;-1:-1:-1;;;28710:55:0:i:1;:::-;28700:65;;28815:12;28784:7;28809:1;28792:7;:14;:18;28784:27;;;;;;;;;;;;;;:43;;28776:99;;;;-1:-1:-1::0;;;28776:99:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28886:141;28932:4;;28937:1;28932:7;;;;;;;;;;;;;-1:-1:-1::0;;;;;28932:7:0::1;28941:10;28953:51;28978:7;28987:4;;28992:1;28987:7;;;;;;;;;;;;;-1:-1:-1::0;;;;;28987:7:0::1;28996:4;;29001:1;28996:7;;;;;;;;;;;;;-1:-1:-1::0;;;;;28996:7:0::1;28953:24;:51::i;:::-;29006:7;29014:1;29006:10;;;;;;;;;;;;;;28886:31;:141::i;:::-;29038:35;29044:7;29053:4;;29038:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;29067:4:0::1;::::0;-1:-1:-1;29038:5:0::1;::::0;-1:-1:-1;;29038:35:0:i:1;:::-;29090:4;-1:-1:-1::0;;;;;29084:20:0::1;;29105:7;29130:1;29113:7;:14;:18;29105:27;;;;;;;;;;;;;;29084:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;29144:63;29175:2;29179:7;29204:1;29187:7;:14;:18;29179:27;;;;;;;;;;;;;;29144:30;:63::i;:::-;28365:850:::0;;;;;;;;;:::o;34899:253::-;35043:21;35089:55;35119:7;35128:9;35139:4;35089:29;:55::i;:::-;35082:62;;34899:253;;;;;:::o;21868:677::-;22174:12;22188;22213;22228:49;22253:7;22262:6;22270;22228:24;:49::i;:::-;22213:64;;22288:10;22301;:33;;22325:9;22301:33;;;-1:-1:-1;;22301:33:0;22345:80;;;-1:-1:-1;;;22345:80:0;;22373:10;22345:80;;;;22393:4;22345:80;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22288:46;;-1:-1:-1;;;;;;22345:27:0;;;;;:80;;;;;-1:-1:-1;;22345:80:0;;;;;;;;-1:-1:-1;22345:27:0;:80;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22457;22473:6;22481;22489:9;22500:10;22512;22524:2;22528:8;22457:15;:80::i;:::-;22436:101;;;;;;;;21868:677;;;;;;;;;;;;;;;;:::o;25582:628::-;25806:21;25787:8;16802:15;16790:8;:27;;16782:64;;;;;-1:-1:-1;;;16782:64:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;16782:64:0;;;;;;;;;;;;;;;25850:55:::1;25881:7;25890:8;25900:4;;25850:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;25850:30:0::1;::::0;-1:-1:-1;;;25850:55:0:i:1;:::-;25840:65;;25955:12;25924:7;25949:1;25932:7;:14;:18;25924:27;;;;;;;;;;;;;;:43;;25916:99;;;;-1:-1:-1::0;;;25916:99:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26026:141;26072:4;;26077:1;26072:7;;;;;;26026:141;26178:24;26184:7;26193:4;;26178:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;26199:2:0;;-1:-1:-1;26178:5:0::1;::::0;-1:-1:-1;;26178:24:0:i:1;27531:828::-:0;27745:21;27717:8;16802:15;16790:8;:27;;16782:64;;;;;-1:-1:-1;;;16782:64:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;16782:64:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;27817:4:0::1;27792:29;:4:::0;;-1:-1:-1;;27797:15:0;;27792:21;;::::1;;;;;;;;;;;-1:-1:-1::0;;;;;27792:21:0::1;-1:-1:-1::0;;;;;27792:29:0::1;;27784:71;;;::::0;;-1:-1:-1;;;27784:71:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;;;;;;;;;27784:71:0;;;;;;;;;;;;;::::1;;27876:55;27906:7;27915:9;27926:4;;27876:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;27876:29:0::1;::::0;-1:-1:-1;;;27876:55:0:i:1;:::-;27866:65;;27964:11;27950:7;27958:1;27950:10;;;;;;;;;;;;;;:25;;27942:77;;;;-1:-1:-1::0;;;27942:77:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24012:718:::0;24330:14;24357:12;24372:46;24397:7;24406:5;24413:4;24372:24;:46::i;:::-;24357:61;;24429:10;24442;:33;;24466:9;24442:33;;;-1:-1:-1;;24442:33:0;24486:80;;;-1:-1:-1;;;24486:80:0;;24514:10;24486:80;;;;24534:4;24486:80;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24429:46;;-1:-1:-1;;;;;;24486:27:0;;;;;:80;;;;;-1:-1:-1;;24486:80:0;;;;;;;;-1:-1:-1;24486:27:0;:80;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24589:133;24651:5;24658:9;24669:14;24685:12;24699:2;24703:8;24589:47;:133::i;:::-;24577:145;24012:718;-1:-1:-1;;;;;;;;;;;;;24012:718:0:o;31405:728::-;31639:8;16802:15;16790:8;:27;;16782:64;;;;;-1:-1:-1;;;16782:64:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;16782:64:0;;;;;;;;;;;;;;;31660:139:::1;31706:4;;31711:1;31706:7;;;;;;;;;;;;;-1:-1:-1::0;;;;;31706:7:0::1;31715:10;31727:51;31752:7;31761:4;;31766:1;31761:7;;;;;;;;;;;;;-1:-1:-1::0;;;;;31761:7:0::1;31770:4;;31775:1;31770:7;;;;;;31727:51;31780:8;31660:31;:139::i;:::-;31810:18;31845:4:::0;;-1:-1:-1;;31850:15:0;;31845:21;;::::1;;;;;;;;;;;-1:-1:-1::0;;;;;31845:21:0::1;-1:-1:-1::0;;;;;31831:46:0::1;;31878:2;31831:50;;;;;;;;;;;;;-1:-1:-1::0;;;;;31831:50:0::1;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;31831:50:0;31892:44:::1;::::0;;31831:50:::1;31892:44:::0;;::::1;::::0;;;;;;;;;;;31831:50;;-1:-1:-1;31892:44:0::1;::::0;;;31927:4;;;;;;31892:44;::::1;::::0;31927:4;;31892:44;31927:4;31892:44;::::1;;::::0;::::1;::::0;;;;-1:-1:-1;31933:2:0;;-1:-1:-1;31892:34:0::1;::::0;-1:-1:-1;;31892:44:0:i:1;:::-;32042:12:::0;31969:69:::1;32024:13:::0;31983:4;;-1:-1:-1;;31988:15:0;;31983:21;;::::1;;;;;;;;;;;-1:-1:-1::0;;;;;31983:21:0::1;-1:-1:-1::0;;;;;31969:46:0::1;;32016:2;31969:50;;;;;;;;;;;;;-1:-1:-1::0;;;;;31969:50:0::1;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;31969:50:0;;:54:::1;:69::i;:::-;:85;;31947:178;;;;-1:-1:-1::0;;;31947:178:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16857:1;31405:728:::0;;;;;;;:::o;33009:850::-;33276:8;16802:15;16790:8;:27;;16782:64;;;;;-1:-1:-1;;;16782:64:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;16782:64:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;33335:4:0::1;33310:29;:4:::0;;-1:-1:-1;;33315:15:0;;33310:21;;::::1;;;;;;;;;;;-1:-1:-1::0;;;;;33310:21:0::1;-1:-1:-1::0;;;;;33310:29:0::1;;33302:71;;;::::0;;-1:-1:-1;;;33302:71:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;;;;;;;;;33302:71:0;;;;;;;;;;;;;::::1;;33384:139;33430:4;;33435:1;33430:7;;;;;;33384:139;33534:55;33569:4;;33534:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;33583:4:0::1;::::0;-1:-1:-1;33534:34:0::1;::::0;-1:-1:-1;;33534:55:0:i:1;:::-;33600:14;33631:4;-1:-1:-1::0;;;;;33617:29:0::1;;33655:4;33617:44;;;;;;;;;;;;;-1:-1:-1::0;;;;;33617:44:0::1;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;33617:44:0;;-1:-1:-1;33680:25:0;;::::1;;33672:81;;;;-1:-1:-1::0;;;33672:81:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33770:4;-1:-1:-1::0;;;;;33764:20:0::1;;33785:9;33764:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;33806:45;33837:2;33841:9;33806:30;:45::i;26828:697::-:0;27044:21;27016:8;16802:15;16790:8;:27;;16782:64;;;;;-1:-1:-1;;;16782:64:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;16782:64:0;;;;;;;;;;;;;;;27102:4:::1;-1:-1:-1::0;;;;;27091:15:0::1;:4;;27096:1;27091:7;;;;;;;;;;;;;-1:-1:-1::0;;;;;27091:7:0::1;-1:-1:-1::0;;;;;27091:15:0::1;;27083:57;;;::::0;;-1:-1:-1;;;27083:57:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;;;;;;;;;27083:57:0;;;;;;;;;;;;;::::1;;27161:56;27192:7;27201:9;27212:4;;27161:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;27161:30:0::1;::::0;-1:-1:-1;;;27161:56:0:i:1;:::-;27151:66;;27267:12;27236:7;27261:1;27244:7;:14;:18;27236:27;;;;;;;;;;;;;;:43;;27228:99;;;;-1:-1:-1::0;;;27228:99:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27344:4;-1:-1:-1::0;;;;;27338:19:0::1;;27365:7;27373:1;27365:10;;;;;;;;;;;;;;27338:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;27402:4;-1:-1:-1::0;;;;;27396:20:0::1;;27417:51;27442:7;27451:4;;27456:1;27451:7;;;;;;27417:51;27470:7;27478:1;27470:10;;;;;;;;;;;;;;27396:85;;;;;;;;;;;;;-1:-1:-1::0;;;;;27396:85:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;27396:85:0;27389:93:::1;;;;27493:24;27499:7;27508:4;;27493:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;27514:2:0;;-1:-1:-1;27493:5:0::1;::::0;-1:-1:-1;;27493:24:0:i:1;:::-;26828:697:::0;;;;;;;;:::o;34369:261::-;34522:13;34560:62;34589:9;34600;34611:10;34560:28;:62::i;26216:606::-;26440:21;26421:8;16802:15;16790:8;:27;;16782:64;;;;;-1:-1:-1;;;16782:64:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;16782:64:0;;;;;;;;;;;;;;;26484:55:::1;26514:7;26523:9;26534:4;;26484:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;26484:29:0::1;::::0;-1:-1:-1;;;26484:55:0:i:1;:::-;26474:65;;26572:11;26558:7;26566:1;26558:10;;;;;;;;;;;;;;:25;;26550:77;;;;-1:-1:-1::0;;;26550:77:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16693:38:::0;;;:::o;33903:188::-;34000:12;34032:51;34055:7;34064:8;34074;34032:22;:51::i;23299:707::-;23565:14;23546:8;16802:15;16790:8;:27;;16782:64;;;;;-1:-1:-1;;;16782:64:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;16782:64:0;;;;;;;;;;;;;;;23608:196:::1;23638:5;23658:4;23677:9;23701:14;23730:12;23765:4;23785:8;23608:15;:196::i;:::-;23592:212;;;;;;23815:85;23843:5;23850:2;23868:5;-1:-1:-1::0;;;;;23854:30:0::1;;23893:4;23854:45;;;;;;;;;;;;;-1:-1:-1::0;;;;;23854:45:0::1;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;23854:45:0;23815:27:::1;:85::i;:::-;23917:4;-1:-1:-1::0;;;;;23911:20:0::1;;23932:9;23911:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;23953:45;23984:2;23988:9;23953:30;:45::i;32139:864::-:0;32399:8;16802:15;16790:8;:27;;16782:64;;;;;-1:-1:-1;;;16782:64:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;16782:64:0;;;;;;;;;;;;;;;32444:4:::1;-1:-1:-1::0;;;;;32433:15:0::1;:4;;32438:1;32433:7;;;;;;;;;;;;;-1:-1:-1::0;;;;;32433:7:0::1;-1:-1:-1::0;;;;;32433:15:0::1;;32425:57;;;::::0;;-1:-1:-1;;;32425:57:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;;;;;;;;;32425:57:0;;;;;;;;;;;;;::::1;;32493:13;32509:9;32493:25;;32535:4;-1:-1:-1::0;;;;;32529:19:0::1;;32556:8;32529:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;32591:4;-1:-1:-1::0;;;;;32585:20:0::1;;32606:51;32631:7;32640:4;;32645:1;32640:7;;;;;;32606:51;32659:8;32585:83;;;;;;;;;;;;;-1:-1:-1::0;;;;;32585:83:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;32585:83:0;32578:91:::1;;;;32680:18;32715:4:::0;;-1:-1:-1;;32720:15:0;;32715:21;;::::1;;;;;;;;;;;-1:-1:-1::0;;;;;32715:21:0::1;-1:-1:-1::0;;;;;32701:46:0::1;;32748:2;32701:50;;;;;;;;;;;;;-1:-1:-1::0;;;;;32701:50:0::1;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;32701:50:0;32762:44:::1;::::0;;32701:50:::1;32762:44:::0;;::::1;::::0;;;;;;;;;;;32701:50;;-1:-1:-1;32762:44:0::1;::::0;;;32797:4;;;;;;32762:44;::::1;::::0;32797:4;;32762:44;32797:4;32762:44;::::1;;::::0;::::1;::::0;;;;-1:-1:-1;32803:2:0;;-1:-1:-1;32762:34:0::1;::::0;-1:-1:-1;;32762:44:0:i:1;:::-;32912:12:::0;32839:69:::1;32894:13:::0;32853:4;;-1:-1:-1;;32858:15:0;;32853:21;;::::1;;;;;;;;;;;-1:-1:-1::0;;;;;32853:21:0::1;-1:-1:-1::0;;;;;32839:46:0::1;;32886:2;32839:50;;;;;;;;;;;;;-1:-1:-1::0;;;;;32839:50:0::1;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;20318:865:::0;20572:12;20586;20553:8;16802:15;16790:8;:27;;16782:64;;;;;-1:-1:-1;;;16782:64:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;16782:64:0;;;;;;;;;;;;;;;20611:12:::1;20626:49;20651:7;20660:6;20668;20626:24;:49::i;:::-;20686:62;::::0;;-1:-1:-1;;;20686:62:0;;20720:10:::1;20686:62;::::0;::::1;::::0;-1:-1:-1;;;;;20686:33:0;::::1;:62:::0;;;;;;;;;;;;;;20611:64;;-1:-1:-1;20686:33:0;;::::1;::::0;:62;;;;;::::1;::::0;;;;;;;;;-1:-1:-1;20686:33:0;:62;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;;20816:29:0::1;::::0;;-1:-1:-1;;;20816:29:0;;-1:-1:-1;;;;;20816:29:0;;::::1;;::::0;::::1;::::0;;;20786:12:::1;::::0;;;20816:25;;::::1;::::0;::::1;::::0;:29;;;;;;;;;;;20786:12;20816:25;:29;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;20816:29:0;;::::1;::::0;;::::1;::::0;;;-1:-1:-1;20816:29:0;-1:-1:-1;20857:14:0::1;20876:43;20904:6:::0;20912;20876:27:::1;:43::i;:::-;20856:63;;;20961:6;-1:-1:-1::0;;;;;20951:16:0::1;:6;-1:-1:-1::0;;;;;20951:16:0::1;;:58;;20992:7;21001;20951:58;;;20971:7;20980;20951:58;20930:79:::0;;-1:-1:-1;20930:79:0;-1:-1:-1;21028:21:0;;::::1;;21020:72;;;;-1:-1:-1::0;;;21020:72:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21122:10;21111:7;:21;;21103:72;;;;-1:-1:-1::0;;;21103:72:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16857:1;;;;20318:865:::0;;;;;;;;;;;:::o;16645:41::-;;;:::o;34638:253::-;34782:21;34828:55;34859:7;34868:8;34878:4;34828:30;:55::i;22551:669::-;22840:16;22858:14;22885:12;22900:46;22925:7;22934:5;22941:4;22900:24;:46::i;:::-;22885:61;;22957:10;22970;:33;;22994:9;22970:33;;;-1:-1:-1;;22970:33:0;23014:80;;;-1:-1:-1;;;23014:80:0;;23042:10;23014:80;;;;23062:4;23014:80;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22957:46;;-1:-1:-1;;;;;;23014:27:0;;;;;:80;;;;;-1:-1:-1;;23014:80:0;;;;;;;;-1:-1:-1;23014:27:0;:80;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23132;23151:5;23158:9;23169:14;23185:12;23199:2;23203:8;23132:18;:80::i;:::-;23105:107;;;;-1:-1:-1;22551:669:0;-1:-1:-1;;;;;;;;;;;;;22551:669:0:o;18557:738::-;18845:12;18859;18873:14;18826:8;16802:15;16790:8;:27;;16782:64;;;;;-1:-1:-1;;;16782:64:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;16782:64:0;;;;;;;;;;;;;;;18921:85:::1;18935:6;18943;18951:14;18967;18983:10;18995;18921:13;:85::i;:::-;18900:106:::0;;-1:-1:-1;18900:106:0;-1:-1:-1;19017:12:0::1;19032:49;19057:7;19066:6:::0;19074;19032:24:::1;:49::i;:::-;19017:64;;19092:66;19124:6;19132:10;19144:4;19150:7;19092:31;:66::i;:::-;19169;19201:6;19209:10;19221:4;19227:7;19169:31;:66::i;:::-;19273:4;-1:-1:-1::0;;;;;19258:25:0::1;;19284:2;19258:29;;;;;;;;;;;;;-1:-1:-1::0;;;;;19258:29:0::1;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;19258:29:0;18557:738;;;;-1:-1:-1;19258:29:0;;-1:-1:-1;18557:738:0;;-1:-1:-1;;;;;;;;;18557:738:0:o;19301:974::-;19554:16;19572:14;19588;19535:8;16802:15;16790:8;:27;;16782:64;;;;;-1:-1:-1;;;16782:64:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;16782:64:0;;;;;;;;;;;;;;;19642:176:::1;19670:5;19690:4;19709:18;19742:9;19766:14;19795:12;19642:13;:176::i;:::-;19615:203:::0;;-1:-1:-1;19615:203:0;-1:-1:-1;19829:12:0::1;19844:46;19869:7;19878:5:::0;19885:4:::1;19844:24;:46::i;:::-;19829:61;;19901:69;19933:5;19940:10;19952:4;19958:11;19901:31;:69::i;:::-;19987:4;-1:-1:-1::0;;;;;19981:19:0::1;;20008:9;19981:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;20044:4;-1:-1:-1::0;;;;;20038:20:0::1;;20059:4;20065:9;20038:37;;;;;;;;;;;;;-1:-1:-1::0;;;;;20038:37:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;20038:37:0;20031:45:::1;;;;20114:4;-1:-1:-1::0;;;;;20099:25:0::1;;20125:2;20099:29;;;;;;;;;;;;;-1:-1:-1::0;;;;;20099:29:0::1;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;20099:29:0;;-1:-1:-1;20179:9:0::1;:21:::0;-1:-1:-1;20175:92:0::1;;;20202:65;20233:10;20257:9;20245;:21;20202:30;:65::i;:::-;16857:1;19301:974:::0;;;;;;;;;;;:::o;29221:810::-;29434:21;29406:8;16802:15;16790:8;:27;;16782:64;;;;;-1:-1:-1;;;16782:64:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;16782:64:0;;;;;;;;;;;;;;;29492:4:::1;-1:-1:-1::0;;;;;29481:15:0::1;:4;;29486:1;29481:7;;;;;;;;;;;;;-1:-1:-1::0;;;;;29481:7:0::1;-1:-1:-1::0;;;;;29481:15:0::1;;29473:57;;;::::0;;-1:-1:-1;;;29473:57:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;;;;;;;;;29473:57:0;;;;;;;;;;;;;::::1;;29551:55;29581:7;29590:9;29601:4;;29551:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;29551:29:0::1;::::0;-1:-1:-1;;;29551:55:0:i:1;:::-;29541:65;;29639:9;29625:7;29633:1;29625:10;;;;;;;;;;;;;;:23;;29617:75;;;;-1:-1:-1::0;;;29617:75:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29709:4;-1:-1:-1::0;;;;;29703:19:0::1;;29730:7;29738:1;29730:10;;;;;;;;;;;;;;29703:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;29767:4;-1:-1:-1::0;;;;;29761:20:0::1;;29782:51;29807:7;29816:4;;29821:1;29816:7;;;;;;29782:51;29835:7;29843:1;29835:10;;;;;;;;;;;;;;29761:85;;;;;;;;;;;;;-1:-1:-1::0;;;;;29761:85:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;29761:85:0;29754:93:::1;;;;29858:24;29864:7;29873:4;;29858:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;29879:2:0;;-1:-1:-1;29858:5:0::1;::::0;-1:-1:-1;;29858:24:0:i:1;:::-;29945:7;29953:1;29945:10;;;;;;;;;;;;;;29933:9;:22;29929:94;;;29957:66;29988:10;30012:7;30020:1;30012:10;;;;;;;;;;;;;;30000:9;:22;29957:30;:66::i;8413:361::-:0;8608:45;;;-1:-1:-1;;;;;8608:45:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;8608:45:0;-1:-1:-1;;;8608:45:0;;;8597:57;;;;8562:12;;8576:17;;8597:10;;;;8608:45;8597:57;;;8608:45;8597:57;;8608:45;8597:57;;;;;;;;;;-1:-1:-1;;8597:57:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8561:93;;;;8673:7;:57;;;;-1:-1:-1;8685:11:0;;:16;;:44;;;8716:4;8705:24;;;;;;;;;;;;;;;-1:-1:-1;8705:24:0;8685:44;8665:101;;;;;-1:-1:-1;;;8665:101:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;8413:361;;;;;:::o;9192:195::-;9300:12;;;9262;9300;;;;;;;;;-1:-1:-1;;;;;9279:7:0;;;9293:5;;9279:34;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;9279:34:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9261:52;;;9332:7;9324:55;;;;-1:-1:-1;;;9324:55:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9192:195;;;:::o;5445:517::-;5538:14;5584:1;5573:8;:12;5565:68;;;;-1:-1:-1;;;5565:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5664:1;5652:9;:13;:31;;;;;5682:1;5669:10;:14;5652:31;5644:84;;;;-1:-1:-1;;;5644:84:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5739:20;5762:17;:8;5775:3;5762:12;:17::i;:::-;5739:40;-1:-1:-1;5790:14:0;5807:31;5739:40;5827:10;5807:19;:31::i;:::-;5790:48;-1:-1:-1;5849:16:0;5868:40;5892:15;5868:19;:9;5882:4;5868:13;:19::i;:::-;:23;;:40::i;:::-;5849:59;;5943:11;5931:9;:23;;;;;;;5445:517;-1:-1:-1;;;;;;;5445:517:0:o;6637:511::-;6738:21;6795:1;6780:4;:11;:16;;6772:59;;;;;-1:-1:-1;;;6772:59:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;6863:4;:11;6852:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;6852:23:0;;6842:33;;6899:8;6886:7;6894:1;6886:10;;;;;;;;;;;;;:21;;;;;6923:6;6918:223;6949:1;6935:4;:11;:15;6931:1;:19;6918:223;;;6973:14;6989:15;7008:42;7020:7;7029:4;7034:1;7029:7;;;;;;;;;;;;;;7038:4;7043:1;7047;7043:5;7038:11;;;;;;;;;;;;;;7008;:42::i;:::-;6972:78;;;;7082:47;7095:7;7103:1;7095:10;;;;;;;;;;;;;;7107:9;7118:10;7082:12;:47::i;:::-;7065:7;7073:1;7077;7073:5;7065:14;;;;;;;;;;;;;;;;;:64;-1:-1:-1;;6952:3:0;;6918:223;;;;6637:511;;;;;:::o;3962:478::-;4051:12;4077:14;4093;4111:26;4122:6;4130;4111:10;:26::i;:::-;4275:32;;;-1:-1:-1;;4275:32:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4265:43;;;;;;-1:-1:-1;;;;;;4178:251:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4168:262;;;;;;;;;3962:478;-1:-1:-1;;;;;3962:478:0:o;8782:402::-;9007:51;;;-1:-1:-1;;;;;9007:51:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;9007:51:0;-1:-1:-1;;;9007:51:0;;;8996:63;;;;8961:12;;8975:17;;8996:10;;;;9007:51;8996:63;;;9007:51;8996:63;;9007:51;8996:63;;;;;;;;;;-1:-1:-1;;8996:63:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8960:99;;;;9078:7;:57;;;;-1:-1:-1;9090:11:0;;:16;;:44;;;9121:4;9110:24;;;;;;;;;;;;;;;-1:-1:-1;9110:24:0;9090:44;9070:106;;;;-1:-1:-1;;;9070:106:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8782:402;;;;;;:::o;24841:735::-;24948:6;24943:626;24974:1;24960:4;:11;:15;24956:1;:19;24943:626;;;24998:13;25013:14;25032:4;25037:1;25032:7;;;;;;;;;;;;;;25041:4;25046:1;25050;25046:5;25041:11;;;;;;;;;;;;;;24997:56;;;;25069:14;25088:42;25116:5;25123:6;25088:27;:42::i;:::-;25068:62;;;25145:14;25162:7;25170:1;25174;25170:5;25162:14;;;;;;;;;;;;;;25145:31;;25192:15;25209;25237:6;-1:-1:-1;;;;;25228:15:0;:5;-1:-1:-1;;;;;25228:15:0;;:61;;25270:9;25286:1;25228:61;;;25252:1;25256:9;25228:61;25191:98;;;;25304:10;25335:1;25321:4;:11;:15;25317:1;:19;:82;;25396:3;25317:82;;;25339:54;25364:7;25373:6;25381:4;25386:1;25390;25386:5;25381:11;;;;;;;;;;;;;;25339:24;:54::i;:::-;25304:95;;25429:48;25454:7;25463:5;25470:6;25429:24;:48::i;:::-;-1:-1:-1;;;;;25414:69:0;;25502:10;25514;25526:2;25540:1;25530:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;25530:12:0;;25414:143;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;25414:143:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;24977:3:0;;;;;-1:-1:-1;24943:626:0;;-1:-1:-1;;;;;;;;24943:626:0;;;24841:735;;;:::o;7229:532::-;7330:21;7387:1;7372:4;:11;:16;;7364:59;;;;;-1:-1:-1;;;7364:59:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;7455:4;:11;7444:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;7444:23:0;;7434:33;;7508:9;7478:7;7503:1;7486:7;:14;:18;7478:27;;;;;;;;;;;;;;;;;:39;7542:11;;-1:-1:-1;;7542:15:0;7528:226;7559:5;;7528:226;;7587:14;7603:15;7622:42;7634:7;7643:4;7652:1;7648;:5;7643:11;;;;;;;;;;;;;;7656:4;7661:1;7656:7;;;;;;;7622:42;7586:78;;;;7696:46;7708:7;7716:1;7708:10;;;;;;;;;;;;;;7720:9;7731:10;7696:11;:46::i;:::-;7679:7;7691:1;7687;:5;7679:14;;;;;;;;;;;;;;;;;:63;-1:-1:-1;;;;7566:3:0;7528:226;;30178:1221;30291:6;30286:1106;30317:1;30303:4;:11;:15;30299:1;:19;30286:1106;;;30341:13;30356:14;30375:4;30380:1;30375:7;;;;;;;;;;;;;;30384:4;30389:1;30393;30389:5;30384:11;;;;;;;;;;;;;;30340:56;;;;30412:14;30431:42;30459:5;30466:6;30431:27;:42::i;:::-;30411:62;;;30488:19;30525:48;30550:7;30559:5;30566:6;30525:24;:48::i;:::-;30488:86;;30589:16;30620:17;30708:13;30723;30741:4;-1:-1:-1;;;;;30741:16:0;;:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;30741:18:0;;;;;;;-1:-1:-1;;;;;30707:52:0;;;;-1:-1:-1;30707:52:0;;-1:-1:-1;30775:17:0;;-1:-1:-1;;;;;30816:15:0;;;;;;;:61;;30858:8;30868;30816:61;;;30835:8;30845;30816:61;30774:103;;;;30906:63;30956:12;30920:5;-1:-1:-1;;;;;30906:30:0;;30945:4;30906:45;;;;;;;;;;;;;-1:-1:-1;;;;;30906:45:0;;;;;;;;;;;;;;;;;;;;;;;;;;:63;30892:77;;30999:71;31029:11;31042:12;31056:13;30999:29;:71::i;:::-;30984:86;;30286:1106;;;;31101:15;31118;31146:6;-1:-1:-1;;;;;31137:15:0;:5;-1:-1:-1;;;;;31137:15:0;;:67;;31182:12;31201:1;31137:67;;;31161:1;31165:12;31137:67;31100:104;;;;31219:10;31250:1;31236:4;:11;:15;31232:1;:19;:82;;31311:3;31232:82;;;31254:54;31279:7;31288:6;31296:4;31301:1;31305;31301:5;31296:11;;;;;;;31254:54;31367:12;;;31377:1;31367:12;;;;;;;;;;-1:-1:-1;;;31329:51:0;;;;;;;;;;;;;;-1:-1:-1;;;;;31329:51:0;;;;;;;;;;;;;;;;;;;;;;31219:95;;-1:-1:-1;31329:9:0;;;;;;31339:10;;31351;;31219:95;;31367:12;;31329:51;;;;;;;;31367:12;;31329:51;;;;31367:12;;31329:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;30320:3:0;;;;;-1:-1:-1;30286:1106:0;;-1:-1:-1;;;;;;;;;;30286:1106:0;2968:129;3052:5;;;3047:16;;;;3039:50;;;;;-1:-1:-1;;;3039:50:0;;;;;;;;;;;;-1:-1:-1;;;3039:50:0;;;;;;;;;;;;;;6083:472;6176:13;6222:1;6210:9;:13;6202:70;;;;-1:-1:-1;;;6202:70:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6303:1;6291:9;:13;:31;;;;;6321:1;6308:10;:14;6291:31;6283:84;;;;-1:-1:-1;;;6283:84:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6378:14;6395:34;6424:4;6395:24;:9;6409;6395:13;:24::i;:::-;:28;;:34::i;:::-;6378:51;-1:-1:-1;6440:16:0;6459:34;6489:3;6459:25;:10;6474:9;6459:14;:25::i;:34::-;6440:53;;6515:32;6545:1;6528:11;6516:9;:23;;;;;;;6515:29;:32::i;:::-;6504:43;6083:472;-1:-1:-1;;;;;;6083:472:0:o;5002:321::-;5084:12;5127:1;5117:7;:11;5109:61;;;;-1:-1:-1;;;5109:61:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5200:1;5189:8;:12;:28;;;;;5216:1;5205:8;:12;5189:28;5181:81;;;;-1:-1:-1;;;5181:81:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5307:8;5283:21;:7;5295:8;5283:11;:21::i;:::-;:32;;;;;;;5002:321;-1:-1:-1;;;;5002:321:0:o;3521:349::-;3596:14;3612;3657:6;-1:-1:-1;;;;;3647:16:0;:6;-1:-1:-1;;;;;3647:16:0;;;3639:66;;;;-1:-1:-1;;;3639:66:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3744:6;-1:-1:-1;;;;;3735:15:0;:6;-1:-1:-1;;;;;3735:15:0;;:53;;3773:6;3781;3735:53;;;3754:6;3762;3735:53;3716:72;;-1:-1:-1;3716:72:0;-1:-1:-1;;;;;;3807:20:0;;3799:63;;;;;-1:-1:-1;;;3799:63:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;3521:349;;;;;:::o;17161:1390::-;17379:12;17393;17536:1;-1:-1:-1;;;;;17474:64:0;17492:7;-1:-1:-1;;;;;17474:34:0;;17509:6;17517;17474:50;;;;;;;;;;;;;-1:-1:-1;;;;;17474:50:0;;;;;;-1:-1:-1;;;;;17474:50:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;17474:50:0;-1:-1:-1;;;;;17474:64:0;;17470:150;;;17573:7;-1:-1:-1;;;;;17555:37:0;;17593:6;17601;17555:53;;;;;;;;;;;;;-1:-1:-1;;;;;17555:53:0;;;;;;-1:-1:-1;;;;;17555:53:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;17470:150:0;17631:13;17646;17663:53;17692:7;17701:6;17709;17663:28;:53::i;:::-;17630:86;;;;17731:8;17743:1;17731:13;:30;;;;-1:-1:-1;17748:13:0;;17731:30;17727:817;;;17800:14;;-1:-1:-1;17816:14:0;;-1:-1:-1;17727:817:0;;;17864:19;17886:58;17909:14;17925:8;17935;17886:22;:58::i;:::-;17864:80;;17981:14;17963;:32;17959:574;;18042:10;18024:14;:28;;18016:79;;;;-1:-1:-1;;;18016:79:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18136:14;;-1:-1:-1;18152:14:0;-1:-1:-1;18152:14:0;17959:574;;;18208:19;18230:58;18253:14;18269:8;18279;18230:22;:58::i;:::-;18208:80;;18332:14;18314;:32;;18307:40;;;;18392:10;18374:14;:28;;18366:79;;;;-1:-1:-1;;;18366:79:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18486:14;-1:-1:-1;18502:14:0;;-1:-1:-1;17959:574:0;17727:817;;17161:1390;;;;;;;;;;;:::o;3105:142::-;3157:6;3184;;;:30;;-1:-1:-1;;3199:5:0;;;3213:1;3208;3199:5;3208:1;3194:15;;;;;:20;3184:30;3176:63;;;;;-1:-1:-1;;;3176:63:0;;;;;;;;;;;;-1:-1:-1;;;3176:63:0;;;;;;;;;;;;;;2832:128;2916:5;;;2911:16;;;;2903:49;;;;;-1:-1:-1;;;2903:49:0;;;;;;;;;;;;-1:-1:-1;;;2903:49:0;;;;;;;;;;;;;;4498:391;4591:13;4606;4633:14;4652:26;4663:6;4671;4652:10;:26::i;:::-;4632:46;;;4690:13;4705;4738:32;4746:7;4755:6;4763;4738:7;:32::i;:::-;-1:-1:-1;;;;;4723:60:0;;:62;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;4723:62:0;;;;;;;-1:-1:-1;;;;;4689:96:0;;;;-1:-1:-1;4689:96:0;;-1:-1:-1;;;;;;4819:16:0;;;;;;;:62;;4862:8;4872;4819:62;;;4839:8;4849;4819:62;4796:85;;;;-1:-1:-1;4498:391:0;-1:-1:-1;;;;;;;4498: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