Contract 0xe9ee87fb3c4b6e4bf6b40f5a0f9aed5658ba2e4a

Contract Overview

Balance:
0 BNB
Txn Hash Method
Block
From
To
Value [Txn Fee]
0x4fcb114745839e544f7a4006a0887a54dac1e1243bbd430fa7de150bbf1e631cSwap Exact ETH F...85759882021-05-05 12:41:50141 days 17 hrs ago0x5ea26ee74728f1d76fa00847fc54265a253a606b IN  0xe9ee87fb3c4b6e4bf6b40f5a0f9aed5658ba2e4a0.000001 BNB0.00236597
0x1eb7eb48d23bcd894e811f8ee53213f39c71105200ec3faf9b0a2a4f4b4fa1b6Remove Liquidity...85742712021-05-05 11:15:59141 days 19 hrs ago0x5ea26ee74728f1d76fa00847fc54265a253a606b IN  0xe9ee87fb3c4b6e4bf6b40f5a0f9aed5658ba2e4a0 BNB0.00189794
0xd002ec622e24da040062b6ff9e7f5e87b0ed3e075f52a4074c5891c34727cd63Swap Exact ETH F...85714322021-05-05 8:54:02141 days 21 hrs ago0x7256d01695a1d03e96fc75d32215b0519b08e0ba IN  0xe9ee87fb3c4b6e4bf6b40f5a0f9aed5658ba2e4a1 wei0.0012628
0x4a3644b53a6791822a83a59e3bf348d22e7db1293a41e820d407ad8cfb22c49dRemove Liquidity...85703522021-05-05 8:00:02141 days 22 hrs ago0xaa50da3bd10d140536dd96136a4781274c09561b IN  0xe9ee87fb3c4b6e4bf6b40f5a0f9aed5658ba2e4a0 BNB0.00237421
0x7de5b96517e0a61d37ae29384edf7c7a92c34ae734b40357540e211c7edd799bRemove Liquidity...85703352021-05-05 7:59:11141 days 22 hrs ago0xaa50da3bd10d140536dd96136a4781274c09561b IN  0xe9ee87fb3c4b6e4bf6b40f5a0f9aed5658ba2e4a0 BNB0.00265615
0x2654e29de032f01ec7a48172bf1005b74a947e1f760f63109f18b811126c27abRemove Liquidity...85703042021-05-05 7:57:38141 days 22 hrs ago0xaa50da3bd10d140536dd96136a4781274c09561b IN  0xe9ee87fb3c4b6e4bf6b40f5a0f9aed5658ba2e4a0 BNB0.00223103
0x04d70a372cd191c3b99c7eb6b98d5817beca03d8ea479059ed6d570a747b152cRemove Liquidity...85702892021-05-05 7:56:53141 days 22 hrs ago0xaa50da3bd10d140536dd96136a4781274c09561b IN  0xe9ee87fb3c4b6e4bf6b40f5a0f9aed5658ba2e4a0 BNB0.0025167
0xd3969af664d78d790993036eb398aabd23ef0a164e3cf40984bbd02db48be557Remove Liquidity...85702762021-05-05 7:56:14141 days 22 hrs ago0xaa50da3bd10d140536dd96136a4781274c09561b IN  0xe9ee87fb3c4b6e4bf6b40f5a0f9aed5658ba2e4a0 BNB0.00238947
0xbd3a1c33cc369d3f32d1a5dda5083c070ae1d1d6768391367f5a7dbe2156e673Remove Liquidity...85702612021-05-05 7:55:29141 days 22 hrs ago0xaa50da3bd10d140536dd96136a4781274c09561b IN  0xe9ee87fb3c4b6e4bf6b40f5a0f9aed5658ba2e4a0 BNB0.0026583
0x8f05e83cae1663bc57e1ebe75257117c22050545bbf705c12327613611a3ad25Remove Liquidity...85702512021-05-05 7:54:59141 days 22 hrs ago0xaa50da3bd10d140536dd96136a4781274c09561b IN  0xe9ee87fb3c4b6e4bf6b40f5a0f9aed5658ba2e4a0 BNB0.00237909
0x7ea9df93b23092d941fd7d3b637dc41e5c6a841088d78fc67b212f234f6bca52Remove Liquidity...85701572021-05-05 7:50:17141 days 22 hrs ago0xaa50da3bd10d140536dd96136a4781274c09561b IN  0xe9ee87fb3c4b6e4bf6b40f5a0f9aed5658ba2e4a0 BNB0.00236549
0x1b8d194069d38acf35c4db0e647e05f4acfca63da3334dcc854fe0bf8717030eRemove Liquidity...85701252021-05-05 7:48:41141 days 22 hrs ago0xaa50da3bd10d140536dd96136a4781274c09561b IN  0xe9ee87fb3c4b6e4bf6b40f5a0f9aed5658ba2e4a0 BNB0.00222485
0x31930a107b1fda1ae7b7082448fa80a998361effb2bf4d8de3eb1c973803c71eRemove Liquidity...85701102021-05-05 7:47:56141 days 22 hrs ago0xaa50da3bd10d140536dd96136a4781274c09561b IN  0xe9ee87fb3c4b6e4bf6b40f5a0f9aed5658ba2e4a0 BNB0.00265869
0x454ff2e9073a06615ad4e09897d16b038dd766488019fbba74ef4b9b55224b1dRemove Liquidity...85701022021-05-05 7:47:32141 days 22 hrs ago0xaa50da3bd10d140536dd96136a4781274c09561b IN  0xe9ee87fb3c4b6e4bf6b40f5a0f9aed5658ba2e4a0 BNB0.00200613
0x352f13dfe5a937ead7bfe96a7ce446ad4ec63e38098cf7fdbcd90fadfcd45fdbSwap Exact ETH F...85685752021-05-05 6:31:11142 days 6 mins ago0xca6a2d72869f69b0086105b2e8242463d4fe70af IN  0xe9ee87fb3c4b6e4bf6b40f5a0f9aed5658ba2e4a0.001 BNB0.00111254
0xf5e192deacb17fadced26d2d119abe97552e43aead5e564b7602317b13c48d89Add Liquidity ET...85528252021-05-04 17:23:41142 days 13 hrs ago0xd281cf7a8194c59790a17fa5247b7b46b95ce1b0 IN  0xe9ee87fb3c4b6e4bf6b40f5a0f9aed5658ba2e4a1 BNB0.0002319
0x71d70750c986e11896372820448d8147c1495fa7b12577515e381e1b819ecbb7Swap Exact ETH F...85515942021-05-04 16:22:08142 days 14 hrs ago0x5c9c39dfe868be7ee04edb425957be479c3dc356 IN  0xe9ee87fb3c4b6e4bf6b40f5a0f9aed5658ba2e4a0.035420364655383 BNB0.00174054
0x377dcac9952de663bbadf5a98f0eb48d8e01e8f38f0897a972f095681a3849abSwap Exact ETH F...85485402021-05-04 13:49:26142 days 16 hrs ago0x7256d01695a1d03e96fc75d32215b0519b08e0ba IN  0xe9ee87fb3c4b6e4bf6b40f5a0f9aed5658ba2e4a0.01 BNB0.00126346
0x3530e86d956b99a1e23c0246fa774370843aa0678f75da6ff38cdc1d5ec5af95Swap Exact ETH F...85485372021-05-04 13:49:17142 days 16 hrs ago0x7256d01695a1d03e96fc75d32215b0519b08e0ba IN  0xe9ee87fb3c4b6e4bf6b40f5a0f9aed5658ba2e4a0.01 BNB0.00189042
0x7bd9647e1e768b5329903a03bd1e610916a6c4f37b6a3bba8ff4a25b2c2537c5Swap Exact ETH F...85484272021-05-04 13:43:47142 days 16 hrs ago0x0bb2b5436daea4340754ec579f0c38d12e987ca0 IN  0xe9ee87fb3c4b6e4bf6b40f5a0f9aed5658ba2e4a0.1 BNB0.00251475
0x60f403fc0ca39dbce511f706738f05170fbbe80e202557f721a6515c8ebb7fecSwap Exact ETH F...85484222021-05-04 13:43:32142 days 16 hrs ago0x0bb2b5436daea4340754ec579f0c38d12e987ca0 IN  0xe9ee87fb3c4b6e4bf6b40f5a0f9aed5658ba2e4a0.1 BNB0.00189042
0x44b90b8adb3475c68fd51e2454cfd7871bfc237820ba29046202ae855e352e27Add Liquidity85483152021-05-04 13:38:11142 days 16 hrs ago0x5ea26ee74728f1d76fa00847fc54265a253a606b IN  0xe9ee87fb3c4b6e4bf6b40f5a0f9aed5658ba2e4a0 BNB0.00160973
0xa4c66d75353433bc97e2e295288fead0c7b96c75acd4fdd5db5f6a71f8e856d2Add Liquidity85479742021-05-04 13:21:08142 days 17 hrs ago0x5ea26ee74728f1d76fa00847fc54265a253a606b IN  0xe9ee87fb3c4b6e4bf6b40f5a0f9aed5658ba2e4a0 BNB0.00160866
0x98100c55cc805edb584acdc79ddd62d2a27edb2b8428294c4eb70cf37fc85768Add Liquidity85478002021-05-04 13:12:26142 days 17 hrs ago0x5ea26ee74728f1d76fa00847fc54265a253a606b IN  0xe9ee87fb3c4b6e4bf6b40f5a0f9aed5658ba2e4a0 BNB0.00160973
0x3146ff24869513e10b87eec239dcfc442932eff0ed5456a03fc4f13e981a54a9Add Liquidity85477252021-05-04 13:08:41142 days 17 hrs ago0x5ea26ee74728f1d76fa00847fc54265a253a606b IN  0xe9ee87fb3c4b6e4bf6b40f5a0f9aed5658ba2e4a0 BNB0.00175938
[ Download CSV Export 
Latest 25 internal transaction
Parent Txn Hash Block From To Value
0x4fcb114745839e544f7a4006a0887a54dac1e1243bbd430fa7de150bbf1e631c85759882021-05-05 12:41:50141 days 17 hrs ago 0xe9ee87fb3c4b6e4bf6b40f5a0f9aed5658ba2e4a 0x60fd8c5a0561a169f842ee06426d45526222cdd90 BNB
0x4fcb114745839e544f7a4006a0887a54dac1e1243bbd430fa7de150bbf1e631c85759882021-05-05 12:41:50141 days 17 hrs ago 0xe9ee87fb3c4b6e4bf6b40f5a0f9aed5658ba2e4a 0x86159fc047d7f3fb6eb42e08883a516a993f66b00 BNB
0x4fcb114745839e544f7a4006a0887a54dac1e1243bbd430fa7de150bbf1e631c85759882021-05-05 12:41:50141 days 17 hrs ago 0xe9ee87fb3c4b6e4bf6b40f5a0f9aed5658ba2e4a 0x5084730e3b2c403b8d6bc157abe2cdff151ccf420 BNB
0x4fcb114745839e544f7a4006a0887a54dac1e1243bbd430fa7de150bbf1e631c85759882021-05-05 12:41:50141 days 17 hrs ago 0xe9ee87fb3c4b6e4bf6b40f5a0f9aed5658ba2e4a 0xae13d989dac2f0debff460ac112a837c89baa7cd0 BNB
0x4fcb114745839e544f7a4006a0887a54dac1e1243bbd430fa7de150bbf1e631c85759882021-05-05 12:41:50141 days 17 hrs ago 0xe9ee87fb3c4b6e4bf6b40f5a0f9aed5658ba2e4a 0xae13d989dac2f0debff460ac112a837c89baa7cd0.000001 BNB
0x4fcb114745839e544f7a4006a0887a54dac1e1243bbd430fa7de150bbf1e631c85759882021-05-05 12:41:50141 days 17 hrs ago 0xe9ee87fb3c4b6e4bf6b40f5a0f9aed5658ba2e4a 0x60fd8c5a0561a169f842ee06426d45526222cdd90 BNB
0x4fcb114745839e544f7a4006a0887a54dac1e1243bbd430fa7de150bbf1e631c85759882021-05-05 12:41:50141 days 17 hrs ago 0xe9ee87fb3c4b6e4bf6b40f5a0f9aed5658ba2e4a 0x86159fc047d7f3fb6eb42e08883a516a993f66b00 BNB
0x4fcb114745839e544f7a4006a0887a54dac1e1243bbd430fa7de150bbf1e631c85759882021-05-05 12:41:50141 days 17 hrs ago 0xe9ee87fb3c4b6e4bf6b40f5a0f9aed5658ba2e4a 0x5084730e3b2c403b8d6bc157abe2cdff151ccf420 BNB
0x1eb7eb48d23bcd894e811f8ee53213f39c71105200ec3faf9b0a2a4f4b4fa1b685742712021-05-05 11:15:59141 days 19 hrs ago 0xe9ee87fb3c4b6e4bf6b40f5a0f9aed5658ba2e4a 0x60fd8c5a0561a169f842ee06426d45526222cdd90 BNB
0x1eb7eb48d23bcd894e811f8ee53213f39c71105200ec3faf9b0a2a4f4b4fa1b685742712021-05-05 11:15:59141 days 19 hrs ago 0xe9ee87fb3c4b6e4bf6b40f5a0f9aed5658ba2e4a 0x60fd8c5a0561a169f842ee06426d45526222cdd90 BNB
0x1eb7eb48d23bcd894e811f8ee53213f39c71105200ec3faf9b0a2a4f4b4fa1b685742712021-05-05 11:15:59141 days 19 hrs ago 0xe9ee87fb3c4b6e4bf6b40f5a0f9aed5658ba2e4a 0x60fd8c5a0561a169f842ee06426d45526222cdd90 BNB
0xd002ec622e24da040062b6ff9e7f5e87b0ed3e075f52a4074c5891c34727cd6385714322021-05-05 8:54:02141 days 21 hrs ago 0xe9ee87fb3c4b6e4bf6b40f5a0f9aed5658ba2e4a 0xeb1b27c96f672351b6924ca1cfd1b26965bf69730 BNB
0xd002ec622e24da040062b6ff9e7f5e87b0ed3e075f52a4074c5891c34727cd6385714322021-05-05 8:54:02141 days 21 hrs ago 0xe9ee87fb3c4b6e4bf6b40f5a0f9aed5658ba2e4a 0xae13d989dac2f0debff460ac112a837c89baa7cd0 BNB
0xd002ec622e24da040062b6ff9e7f5e87b0ed3e075f52a4074c5891c34727cd6385714322021-05-05 8:54:02141 days 21 hrs ago 0xe9ee87fb3c4b6e4bf6b40f5a0f9aed5658ba2e4a 0xae13d989dac2f0debff460ac112a837c89baa7cd1 wei
0xd002ec622e24da040062b6ff9e7f5e87b0ed3e075f52a4074c5891c34727cd6385714322021-05-05 8:54:02141 days 21 hrs ago 0xe9ee87fb3c4b6e4bf6b40f5a0f9aed5658ba2e4a 0xeb1b27c96f672351b6924ca1cfd1b26965bf69730 BNB
0x4a3644b53a6791822a83a59e3bf348d22e7db1293a41e820d407ad8cfb22c49d85703522021-05-05 8:00:02141 days 22 hrs ago 0xe9ee87fb3c4b6e4bf6b40f5a0f9aed5658ba2e4a 0x952b054914f5082f76810190f43f0001c822ee790 BNB
0x4a3644b53a6791822a83a59e3bf348d22e7db1293a41e820d407ad8cfb22c49d85703522021-05-05 8:00:02141 days 22 hrs ago 0xe9ee87fb3c4b6e4bf6b40f5a0f9aed5658ba2e4a 0x952b054914f5082f76810190f43f0001c822ee790 BNB
0x4a3644b53a6791822a83a59e3bf348d22e7db1293a41e820d407ad8cfb22c49d85703522021-05-05 8:00:02141 days 22 hrs ago 0xe9ee87fb3c4b6e4bf6b40f5a0f9aed5658ba2e4a 0x952b054914f5082f76810190f43f0001c822ee790 BNB
0x7de5b96517e0a61d37ae29384edf7c7a92c34ae734b40357540e211c7edd799b85703352021-05-05 7:59:11141 days 22 hrs ago 0xe9ee87fb3c4b6e4bf6b40f5a0f9aed5658ba2e4a0xaa50da3bd10d140536dd96136a4781274c09561b9.771469795197161143 BNB
0x7de5b96517e0a61d37ae29384edf7c7a92c34ae734b40357540e211c7edd799b85703352021-05-05 7:59:11141 days 22 hrs ago 0xae13d989dac2f0debff460ac112a837c89baa7cd 0xe9ee87fb3c4b6e4bf6b40f5a0f9aed5658ba2e4a9.771469795197161143 BNB
0x7de5b96517e0a61d37ae29384edf7c7a92c34ae734b40357540e211c7edd799b85703352021-05-05 7:59:11141 days 22 hrs ago 0xe9ee87fb3c4b6e4bf6b40f5a0f9aed5658ba2e4a 0xae13d989dac2f0debff460ac112a837c89baa7cd0 BNB
0x7de5b96517e0a61d37ae29384edf7c7a92c34ae734b40357540e211c7edd799b85703352021-05-05 7:59:11141 days 22 hrs ago 0xe9ee87fb3c4b6e4bf6b40f5a0f9aed5658ba2e4a 0x618549d304828c77dcb590d02e3641b03e6f41760 BNB
0x7de5b96517e0a61d37ae29384edf7c7a92c34ae734b40357540e211c7edd799b85703352021-05-05 7:59:11141 days 22 hrs ago 0xe9ee87fb3c4b6e4bf6b40f5a0f9aed5658ba2e4a 0x5084730e3b2c403b8d6bc157abe2cdff151ccf420 BNB
0x7de5b96517e0a61d37ae29384edf7c7a92c34ae734b40357540e211c7edd799b85703352021-05-05 7:59:11141 days 22 hrs ago 0xe9ee87fb3c4b6e4bf6b40f5a0f9aed5658ba2e4a 0x5084730e3b2c403b8d6bc157abe2cdff151ccf420 BNB
0x7de5b96517e0a61d37ae29384edf7c7a92c34ae734b40357540e211c7edd799b85703352021-05-05 7:59:11141 days 22 hrs ago 0xe9ee87fb3c4b6e4bf6b40f5a0f9aed5658ba2e4a 0x5084730e3b2c403b8d6bc157abe2cdff151ccf420 BNB
[ Download CSV Export 
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
GravisRouter

Compiler Version
v0.6.6+commit.6c089d02

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

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

pragma solidity =0.6.6;

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

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

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

// 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,
        uint256 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,
        uint256 value
    ) internal {
        // bytes4(keccak256(bytes('transfer(address,uint256)')));
        (bool success, bytes memory data) = token.call(abi.encodeWithSelector(0xa9059cbb, to, value));
        require(success && (data.length == 0 || abi.decode(data, (bool))), 'TransferHelper: TRANSFER_FAILED');
    }

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

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

library GravisLibrary {
    using SafeMath for uint256;

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

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

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

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

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

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

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

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

interface IERC20 {
    event Approval(address indexed owner, address indexed spender, uint256 value);
    event Transfer(address indexed from, address indexed to, uint256 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 (uint256);

    function balanceOf(address owner) external view returns (uint256);

    function allowance(address owner, address spender) external view returns (uint256);

    function approve(address spender, uint256 value) external returns (bool);

    function transfer(address to, uint256 value) external returns (bool);

    function transferFrom(
        address from,
        address to,
        uint256 value
    ) external returns (bool);
}

interface IWETH {
    function deposit() external payable;

    function transfer(address to, uint256 value) external returns (bool);

    function withdraw(uint256) external;
}

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

    function feeTo() external view returns (address);

    function feeToSetter() external view returns (address);

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

    function allPairs(uint256) external view returns (address pair);

    function allPairsLength() external view returns (uint256);

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

    function setFeeTo(address) external;

    function setFeeToSetter(address) external;
}

interface IGravisPair {
    event Approval(address indexed owner, address indexed spender, uint256 value);
    event Transfer(address indexed from, address indexed to, uint256 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 (uint256);

    function balanceOf(address owner) external view returns (uint256);

    function allowance(address owner, address spender) external view returns (uint256);

    function approve(address spender, uint256 value) external returns (bool);

    function transfer(address to, uint256 value) external returns (bool);

    function transferFrom(
        address from,
        address to,
        uint256 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 (uint256);

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

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

    function MINIMUM_LIQUIDITY() external pure returns (uint256);

    function factory() external view returns (address);

    function token0() external view returns (address);

    function token1() external view returns (address);

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

    function price0CumulativeLast() external view returns (uint256);

    function price1CumulativeLast() external view returns (uint256);

    function kLast() external view returns (uint256);

    function mint(address to) external returns (uint256 liquidity);

    function burn(address to) external returns (uint256 amount0, uint256 amount1);

    function swap(
        uint256 amount0Out,
        uint256 amount1Out,
        address to,
        bytes calldata data
    ) external;

    function skim(address to) external;

    function sync() external;

    function initialize(address, address) external;
}

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

    function WETH() external pure returns (address);

    function addLiquidity(
        address tokenA,
        address tokenB,
        uint256 amountADesired,
        uint256 amountBDesired,
        uint256 amountAMin,
        uint256 amountBMin,
        address to,
        uint256 deadline
    )
        external
        returns (
            uint256 amountA,
            uint256 amountB,
            uint256 liquidity
        );

    function addLiquidityETH(
        address token,
        uint256 amountTokenDesired,
        uint256 amountTokenMin,
        uint256 amountETHMin,
        address to,
        uint256 deadline
    )
        external
        payable
        returns (
            uint256 amountToken,
            uint256 amountETH,
            uint256 liquidity
        );

    function removeLiquidity(
        address tokenA,
        address tokenB,
        uint256 liquidity,
        uint256 amountAMin,
        uint256 amountBMin,
        address to,
        uint256 deadline
    ) external returns (uint256 amountA, uint256 amountB);

    function removeLiquidityETH(
        address token,
        uint256 liquidity,
        uint256 amountTokenMin,
        uint256 amountETHMin,
        address to,
        uint256 deadline
    ) external returns (uint256 amountToken, uint256 amountETH);

    function removeLiquidityWithPermit(
        address tokenA,
        address tokenB,
        uint256 liquidity,
        uint256 amountAMin,
        uint256 amountBMin,
        address to,
        uint256 deadline,
        bool approveMax,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external returns (uint256 amountA, uint256 amountB);

    function removeLiquidityETHWithPermit(
        address token,
        uint256 liquidity,
        uint256 amountTokenMin,
        uint256 amountETHMin,
        address to,
        uint256 deadline,
        bool approveMax,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external returns (uint256 amountToken, uint256 amountETH);

    function swapExactTokensForTokens(
        uint256 amountIn,
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external returns (uint256[] memory amounts);

    function swapTokensForExactTokens(
        uint256 amountOut,
        uint256 amountInMax,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external returns (uint256[] memory amounts);

    function swapExactETHForTokens(
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external payable returns (uint256[] memory amounts);

    function swapTokensForExactETH(
        uint256 amountOut,
        uint256 amountInMax,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external returns (uint256[] memory amounts);

    function swapExactTokensForETH(
        uint256 amountIn,
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external returns (uint256[] memory amounts);

    function swapETHForExactTokens(
        uint256 amountOut,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external payable returns (uint256[] memory amounts);

    function quote(
        uint256 amountA,
        uint256 reserveA,
        uint256 reserveB
    ) external pure returns (uint256 amountB);

    function getAmountOut(
        uint256 amountIn,
        uint256 reserveIn,
        uint256 reserveOut
    ) external pure returns (uint256 amountOut);

    function getAmountIn(
        uint256 amountOut,
        uint256 reserveIn,
        uint256 reserveOut
    ) external pure returns (uint256 amountIn);

    function getAmountsOut(uint256 amountIn, address[] calldata path) external view returns (uint256[] memory amounts);

    function getAmountsIn(uint256 amountOut, address[] calldata path) external view returns (uint256[] memory amounts);
}

interface IGravisRouter02 is IGravisRouter01 {
    function removeLiquidityETHSupportingFeeOnTransferTokens(
        address token,
        uint256 liquidity,
        uint256 amountTokenMin,
        uint256 amountETHMin,
        address to,
        uint256 deadline
    ) external returns (uint256 amountETH);

    function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens(
        address token,
        uint256 liquidity,
        uint256 amountTokenMin,
        uint256 amountETHMin,
        address to,
        uint256 deadline,
        bool approveMax,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external returns (uint256 amountETH);

    function swapExactTokensForTokensSupportingFeeOnTransferTokens(
        uint256 amountIn,
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external;

    function swapExactETHForTokensSupportingFeeOnTransferTokens(
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external payable;

    function swapExactTokensForETHSupportingFeeOnTransferTokens(
        uint256 amountIn,
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external;
}

contract GravisRouter is IGravisRouter02 {
    using SafeMath for uint256;

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

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

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

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

    // **** ADD LIQUIDITY ****
    function _addLiquidity(
        address tokenA,
        address tokenB,
        uint256 amountADesired,
        uint256 amountBDesired,
        uint256 amountAMin,
        uint256 amountBMin
    ) internal virtual returns (uint256 amountA, uint256 amountB) {
        // create the pair if it doesn't exist yet
        if (IGravisFactory(factory).getPair(tokenA, tokenB) == address(0)) {
            IGravisFactory(factory).createPair(tokenA, tokenB);
        }
        (uint256 reserveA, uint256 reserveB) = GravisLibrary.getReserves(factory, tokenA, tokenB);
        if (reserveA == 0 && reserveB == 0) {
            (amountA, amountB) = (amountADesired, amountBDesired);
        } else {
            uint256 amountBOptimal = GravisLibrary.quote(amountADesired, reserveA, reserveB);
            if (amountBOptimal <= amountBDesired) {
                require(amountBOptimal >= amountBMin, 'GravisRouter: INSUFFICIENT_B_AMOUNT');
                (amountA, amountB) = (amountADesired, amountBOptimal);
            } else {
                uint256 amountAOptimal = GravisLibrary.quote(amountBDesired, reserveB, reserveA);
                assert(amountAOptimal <= amountADesired);
                require(amountAOptimal >= amountAMin, 'GravisRouter: INSUFFICIENT_A_AMOUNT');
                (amountA, amountB) = (amountAOptimal, amountBDesired);
            }
        }
    }

    function addLiquidity(
        address tokenA,
        address tokenB,
        uint256 amountADesired,
        uint256 amountBDesired,
        uint256 amountAMin,
        uint256 amountBMin,
        address to,
        uint256 deadline
    )
        external
        virtual
        override
        ensure(deadline)
        returns (
            uint256 amountA,
            uint256 amountB,
            uint256 liquidity
        )
    {
        (amountA, amountB) = _addLiquidity(tokenA, tokenB, amountADesired, amountBDesired, amountAMin, amountBMin);
        address pair = GravisLibrary.pairFor(factory, tokenA, tokenB);
        TransferHelper.safeTransferFrom(tokenA, msg.sender, pair, amountA);
        TransferHelper.safeTransferFrom(tokenB, msg.sender, pair, amountB);
        liquidity = IGravisPair(pair).mint(to);
    }

    function addLiquidityETH(
        address token,
        uint256 amountTokenDesired,
        uint256 amountTokenMin,
        uint256 amountETHMin,
        address to,
        uint256 deadline
    )
        external
        payable
        virtual
        override
        ensure(deadline)
        returns (
            uint256 amountToken,
            uint256 amountETH,
            uint256 liquidity
        )
    {
        (amountToken, amountETH) = _addLiquidity(
            token,
            WETH,
            amountTokenDesired,
            msg.value,
            amountTokenMin,
            amountETHMin
        );
        address pair = GravisLibrary.pairFor(factory, token, WETH);
        TransferHelper.safeTransferFrom(token, msg.sender, pair, amountToken);
        IWETH(WETH).deposit{value: amountETH}();
        assert(IWETH(WETH).transfer(pair, amountETH));
        liquidity = IGravisPair(pair).mint(to);
        // refund dust eth, if any
        if (msg.value > amountETH) TransferHelper.safeTransferETH(msg.sender, msg.value - amountETH);
    }

    // **** REMOVE LIQUIDITY ****
    function removeLiquidity(
        address tokenA,
        address tokenB,
        uint256 liquidity,
        uint256 amountAMin,
        uint256 amountBMin,
        address to,
        uint256 deadline
    ) public virtual override ensure(deadline) returns (uint256 amountA, uint256 amountB) {
        address pair = GravisLibrary.pairFor(factory, tokenA, tokenB);
        IGravisPair(pair).transferFrom(msg.sender, pair, liquidity); // send liquidity to pair
        (uint256 amount0, uint256 amount1) = IGravisPair(pair).burn(to);
        (address token0, ) = GravisLibrary.sortTokens(tokenA, tokenB);
        (amountA, amountB) = tokenA == token0 ? (amount0, amount1) : (amount1, amount0);
        require(amountA >= amountAMin, 'GravisRouter: INSUFFICIENT_A_AMOUNT');
        require(amountB >= amountBMin, 'GravisRouter: INSUFFICIENT_B_AMOUNT');
    }

    function removeLiquidityETH(
        address token,
        uint256 liquidity,
        uint256 amountTokenMin,
        uint256 amountETHMin,
        address to,
        uint256 deadline
    ) public virtual override ensure(deadline) returns (uint256 amountToken, uint256 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,
        uint256 liquidity,
        uint256 amountAMin,
        uint256 amountBMin,
        address to,
        uint256 deadline,
        bool approveMax,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external virtual override returns (uint256 amountA, uint256 amountB) {
        address pair = GravisLibrary.pairFor(factory, tokenA, tokenB);
        uint256 value = approveMax ? uint256(-1) : liquidity;
        IGravisPair(pair).permit(msg.sender, address(this), value, deadline, v, r, s);
        (amountA, amountB) = removeLiquidity(tokenA, tokenB, liquidity, amountAMin, amountBMin, to, deadline);
    }

    function removeLiquidityETHWithPermit(
        address token,
        uint256 liquidity,
        uint256 amountTokenMin,
        uint256 amountETHMin,
        address to,
        uint256 deadline,
        bool approveMax,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external virtual override returns (uint256 amountToken, uint256 amountETH) {
        address pair = GravisLibrary.pairFor(factory, token, WETH);
        uint256 value = approveMax ? uint256(-1) : liquidity;
        IGravisPair(pair).permit(msg.sender, address(this), value, deadline, v, r, s);
        (amountToken, amountETH) = removeLiquidityETH(token, liquidity, amountTokenMin, amountETHMin, to, deadline);
    }

    // **** REMOVE LIQUIDITY (supporting fee-on-transfer tokens) ****
    function removeLiquidityETHSupportingFeeOnTransferTokens(
        address token,
        uint256 liquidity,
        uint256 amountTokenMin,
        uint256 amountETHMin,
        address to,
        uint256 deadline
    ) public virtual override ensure(deadline) returns (uint256 amountETH) {
        (, amountETH) = removeLiquidity(token, WETH, liquidity, amountTokenMin, amountETHMin, address(this), deadline);
        TransferHelper.safeTransfer(token, to, IERC20(token).balanceOf(address(this)));
        IWETH(WETH).withdraw(amountETH);
        TransferHelper.safeTransferETH(to, amountETH);
    }

    function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens(
        address token,
        uint256 liquidity,
        uint256 amountTokenMin,
        uint256 amountETHMin,
        address to,
        uint256 deadline,
        bool approveMax,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external virtual override returns (uint256 amountETH) {
        address pair = GravisLibrary.pairFor(factory, token, WETH);
        uint256 value = approveMax ? uint256(-1) : liquidity;
        IGravisPair(pair).permit(msg.sender, address(this), value, deadline, v, r, s);
        amountETH = removeLiquidityETHSupportingFeeOnTransferTokens(
            token,
            liquidity,
            amountTokenMin,
            amountETHMin,
            to,
            deadline
        );
    }

    // **** SWAP ****
    // requires the initial amount to have already been sent to the first pair
    function _swap(
        uint256[] memory amounts,
        address[] memory path,
        address _to
    ) internal virtual {
        for (uint256 i; i < path.length - 1; i++) {
            (address input, address output) = (path[i], path[i + 1]);
            (address token0, ) = GravisLibrary.sortTokens(input, output);
            uint256 amountOut = amounts[i + 1];
            (uint256 amount0Out, uint256 amount1Out) =
                input == token0 ? (uint256(0), amountOut) : (amountOut, uint256(0));
            address to = i < path.length - 2 ? GravisLibrary.pairFor(factory, output, path[i + 2]) : _to;
            IGravisPair(GravisLibrary.pairFor(factory, input, output)).swap(amount0Out, amount1Out, to, new bytes(0));
        }
    }

    function swapExactTokensForTokens(
        uint256 amountIn,
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external virtual override ensure(deadline) returns (uint256[] memory amounts) {
        amounts = GravisLibrary.getAmountsOut(factory, amountIn, path);
        require(amounts[amounts.length - 1] >= amountOutMin, 'GravisRouter: INSUFFICIENT_OUTPUT_AMOUNT');
        TransferHelper.safeTransferFrom(
            path[0],
            msg.sender,
            GravisLibrary.pairFor(factory, path[0], path[1]),
            amounts[0]
        );
        _swap(amounts, path, to);
    }

    function swapTokensForExactTokens(
        uint256 amountOut,
        uint256 amountInMax,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external virtual override ensure(deadline) returns (uint256[] memory amounts) {
        amounts = GravisLibrary.getAmountsIn(factory, amountOut, path);
        require(amounts[0] <= amountInMax, 'GravisRouter: EXCESSIVE_INPUT_AMOUNT');
        TransferHelper.safeTransferFrom(
            path[0],
            msg.sender,
            GravisLibrary.pairFor(factory, path[0], path[1]),
            amounts[0]
        );
        _swap(amounts, path, to);
    }

    function swapExactETHForTokens(
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external payable virtual override ensure(deadline) returns (uint256[] memory amounts) {
        require(path[0] == WETH, 'GravisRouter: INVALID_PATH');
        amounts = GravisLibrary.getAmountsOut(factory, msg.value, path);
        require(amounts[amounts.length - 1] >= amountOutMin, 'GravisRouter: INSUFFICIENT_OUTPUT_AMOUNT');
        IWETH(WETH).deposit{value: amounts[0]}();
        assert(IWETH(WETH).transfer(GravisLibrary.pairFor(factory, path[0], path[1]), amounts[0]));
        _swap(amounts, path, to);
    }

    function swapTokensForExactETH(
        uint256 amountOut,
        uint256 amountInMax,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external virtual override ensure(deadline) returns (uint256[] memory amounts) {
        require(path[path.length - 1] == WETH, 'GravisRouter: INVALID_PATH');
        amounts = GravisLibrary.getAmountsIn(factory, amountOut, path);
        require(amounts[0] <= amountInMax, 'GravisRouter: EXCESSIVE_INPUT_AMOUNT');
        TransferHelper.safeTransferFrom(
            path[0],
            msg.sender,
            GravisLibrary.pairFor(factory, path[0], path[1]),
            amounts[0]
        );
        _swap(amounts, path, address(this));
        IWETH(WETH).withdraw(amounts[amounts.length - 1]);
        TransferHelper.safeTransferETH(to, amounts[amounts.length - 1]);
    }

    function swapExactTokensForETH(
        uint256 amountIn,
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external virtual override ensure(deadline) returns (uint256[] memory amounts) {
        require(path[path.length - 1] == WETH, 'GravisRouter: INVALID_PATH');
        amounts = GravisLibrary.getAmountsOut(factory, amountIn, path);
        require(amounts[amounts.length - 1] >= amountOutMin, 'GravisRouter: INSUFFICIENT_OUTPUT_AMOUNT');
        TransferHelper.safeTransferFrom(
            path[0],
            msg.sender,
            GravisLibrary.pairFor(factory, path[0], path[1]),
            amounts[0]
        );
        _swap(amounts, path, address(this));
        IWETH(WETH).withdraw(amounts[amounts.length - 1]);
        TransferHelper.safeTransferETH(to, amounts[amounts.length - 1]);
    }

    function swapETHForExactTokens(
        uint256 amountOut,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external payable virtual override ensure(deadline) returns (uint256[] memory amounts) {
        require(path[0] == WETH, 'GravisRouter: INVALID_PATH');
        amounts = GravisLibrary.getAmountsIn(factory, amountOut, path);
        require(amounts[0] <= msg.value, 'GravisRouter: EXCESSIVE_INPUT_AMOUNT');
        IWETH(WETH).deposit{value: amounts[0]}();
        assert(IWETH(WETH).transfer(GravisLibrary.pairFor(factory, path[0], path[1]), amounts[0]));
        _swap(amounts, path, to);
        // refund dust eth, if any
        if (msg.value > amounts[0]) TransferHelper.safeTransferETH(msg.sender, msg.value - amounts[0]);
    }

    // **** SWAP (supporting fee-on-transfer tokens) ****
    // requires the initial amount to have already been sent to the first pair
    function _swapSupportingFeeOnTransferTokens(address[] memory path, address _to) internal virtual {
        for (uint256 i; i < path.length - 1; i++) {
            (address input, address output) = (path[i], path[i + 1]);
            (address token0, ) = GravisLibrary.sortTokens(input, output);
            IGravisPair pair = IGravisPair(GravisLibrary.pairFor(factory, input, output));
            uint256 amountInput;
            uint256 amountOutput;
            {
                // scope to avoid stack too deep errors
                (uint256 reserve0, uint256 reserve1, ) = pair.getReserves();
                (uint256 reserveInput, uint256 reserveOutput) =
                    input == token0 ? (reserve0, reserve1) : (reserve1, reserve0);
                amountInput = IERC20(input).balanceOf(address(pair)).sub(reserveInput);
                amountOutput = GravisLibrary.getAmountOut(amountInput, reserveInput, reserveOutput);
            }
            (uint256 amount0Out, uint256 amount1Out) =
                input == token0 ? (uint256(0), amountOutput) : (amountOutput, uint256(0));
            address to = i < path.length - 2 ? GravisLibrary.pairFor(factory, output, path[i + 2]) : _to;
            pair.swap(amount0Out, amount1Out, to, new bytes(0));
        }
    }

    function swapExactTokensForTokensSupportingFeeOnTransferTokens(
        uint256 amountIn,
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external virtual override ensure(deadline) {
        TransferHelper.safeTransferFrom(
            path[0],
            msg.sender,
            GravisLibrary.pairFor(factory, path[0], path[1]),
            amountIn
        );
        uint256 balanceBefore = IERC20(path[path.length - 1]).balanceOf(to);
        _swapSupportingFeeOnTransferTokens(path, to);
        require(
            IERC20(path[path.length - 1]).balanceOf(to).sub(balanceBefore) >= amountOutMin,
            'GravisRouter: INSUFFICIENT_OUTPUT_AMOUNT'
        );
    }

    function swapExactETHForTokensSupportingFeeOnTransferTokens(
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external payable virtual override ensure(deadline) {
        require(path[0] == WETH, 'GravisRouter: INVALID_PATH');
        uint256 amountIn = msg.value;
        IWETH(WETH).deposit{value: amountIn}();
        assert(IWETH(WETH).transfer(GravisLibrary.pairFor(factory, path[0], path[1]), amountIn));
        uint256 balanceBefore = IERC20(path[path.length - 1]).balanceOf(to);
        _swapSupportingFeeOnTransferTokens(path, to);
        require(
            IERC20(path[path.length - 1]).balanceOf(to).sub(balanceBefore) >= amountOutMin,
            'GravisRouter: INSUFFICIENT_OUTPUT_AMOUNT'
        );
    }

    function swapExactTokensForETHSupportingFeeOnTransferTokens(
        uint256 amountIn,
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external virtual override ensure(deadline) {
        require(path[path.length - 1] == WETH, 'GravisRouter: INVALID_PATH');
        TransferHelper.safeTransferFrom(
            path[0],
            msg.sender,
            GravisLibrary.pairFor(factory, path[0], path[1]),
            amountIn
        );
        _swapSupportingFeeOnTransferTokens(path, address(this));
        uint256 amountOut = IERC20(WETH).balanceOf(address(this));
        require(amountOut >= amountOutMin, 'GravisRouter: INSUFFICIENT_OUTPUT_AMOUNT');
        IWETH(WETH).withdraw(amountOut);
        TransferHelper.safeTransferETH(to, amountOut);
    }

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

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

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

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

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

Contract ABI

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

60c060405234801561001057600080fd5b5060405162004759380380620047598339818101604052604081101561003557600080fd5b5080516020909101516001600160601b0319606092831b8116608052911b1660a05260805160601c60a05160601c6145d4620001856000398061015f5280610ce45280610d1f5280610e16528061103452806113be528061152452806118eb52806119e55280611a9b5280611b695280611caf5280611d375280611f7c5280611ff752806120a652806121725280612207528061227b528061277952806129ec5280612a425280612a765280612aea5280612c8a5280612dcd5280612e55525080610ea45280610f7b52806110fa5280611133528061126e528061144c528061150252806116725280611bfc5280611d695280611ecc52806122ad528061250652806126fe5280612727528061275752806128c45280612a205280612d1d5280612e87528061372e52806137715280613a545280613bd3528061400352806140b1528061413152506145d46000f3fe60806040526004361061014f5760003560e01c80638803dbee116100b6578063c45a01551161006f578063c45a015514610a10578063d06ca61f14610a25578063ded9382a14610ada578063e8e3370014610b4d578063f305d71914610bcd578063fb3bdb4114610c1357610188565b80638803dbee146107df578063ad5c464814610875578063ad615dec146108a6578063af2979eb146108dc578063b6f9de951461092f578063baa2abde146109b357610188565b80634a25d94a116101085780634a25d94a146104f05780635b0d5984146105865780635c11d795146105f9578063791ac9471461068f5780637ff36ab51461072557806385f8c259146107a957610188565b806302751cec1461018d578063054d50d4146101f957806318cbafe5146102415780631f00ca74146103275780632195995c146103dc57806338ed17391461045a57610188565b3661018857336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461018657fe5b005b600080fd5b34801561019957600080fd5b506101e0600480360360c08110156101b057600080fd5b506001600160a01b0381358116916020810135916040820135916060810135916080820135169060a00135610c97565b6040805192835260208301919091528051918290030190f35b34801561020557600080fd5b5061022f6004803603606081101561021c57600080fd5b5080359060208101359060400135610db1565b60408051918252519081900360200190f35b34801561024d57600080fd5b506102d7600480360360a081101561026457600080fd5b813591602081013591810190606081016040820135600160201b81111561028a57600080fd5b82018360208201111561029c57600080fd5b803590602001918460208302840111600160201b831117156102bd57600080fd5b91935091506001600160a01b038135169060200135610dc6565b60408051602080825283518183015283519192839290830191858101910280838360005b838110156103135781810151838201526020016102fb565b505050509050019250505060405180910390f35b34801561033357600080fd5b506102d76004803603604081101561034a57600080fd5b81359190810190604081016020820135600160201b81111561036b57600080fd5b82018360208201111561037d57600080fd5b803590602001918460208302840111600160201b8311171561039e57600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295506110f3945050505050565b3480156103e857600080fd5b506101e0600480360361016081101561040057600080fd5b506001600160a01b038135811691602081013582169160408201359160608101359160808201359160a08101359091169060c08101359060e081013515159060ff6101008201351690610120810135906101400135611129565b34801561046657600080fd5b506102d7600480360360a081101561047d57600080fd5b813591602081013591810190606081016040820135600160201b8111156104a357600080fd5b8201836020820111156104b557600080fd5b803590602001918460208302840111600160201b831117156104d657600080fd5b91935091506001600160a01b038135169060200135611223565b3480156104fc57600080fd5b506102d7600480360360a081101561051357600080fd5b813591602081013591810190606081016040820135600160201b81111561053957600080fd5b82018360208201111561054b57600080fd5b803590602001918460208302840111600160201b8311171561056c57600080fd5b91935091506001600160a01b03813516906020013561136e565b34801561059257600080fd5b5061022f60048036036101408110156105aa57600080fd5b506001600160a01b0381358116916020810135916040820135916060810135916080820135169060a08101359060c081013515159060ff60e082013516906101008101359061012001356114fa565b34801561060557600080fd5b50610186600480360360a081101561061c57600080fd5b813591602081013591810190606081016040820135600160201b81111561064257600080fd5b82018360208201111561065457600080fd5b803590602001918460208302840111600160201b8311171561067557600080fd5b91935091506001600160a01b038135169060200135611608565b34801561069b57600080fd5b50610186600480360360a08110156106b257600080fd5b813591602081013591810190606081016040820135600160201b8111156106d857600080fd5b8201836020820111156106ea57600080fd5b803590602001918460208302840111600160201b8311171561070b57600080fd5b91935091506001600160a01b03813516906020013561189d565b6102d76004803603608081101561073b57600080fd5b81359190810190604081016020820135600160201b81111561075c57600080fd5b82018360208201111561076e57600080fd5b803590602001918460208302840111600160201b8311171561078f57600080fd5b91935091506001600160a01b038135169060200135611b21565b3480156107b557600080fd5b5061022f600480360360608110156107cc57600080fd5b5080359060208101359060400135611e74565b3480156107eb57600080fd5b506102d7600480360360a081101561080257600080fd5b813591602081013591810190606081016040820135600160201b81111561082857600080fd5b82018360208201111561083a57600080fd5b803590602001918460208302840111600160201b8311171561085b57600080fd5b91935091506001600160a01b038135169060200135611e81565b34801561088157600080fd5b5061088a611f7a565b604080516001600160a01b039092168252519081900360200190f35b3480156108b257600080fd5b5061022f600480360360608110156108c957600080fd5b5080359060208101359060400135611f9e565b3480156108e857600080fd5b5061022f600480360360c08110156108ff57600080fd5b506001600160a01b0381358116916020810135916040820135916060810135916080820135169060a00135611fab565b6101866004803603608081101561094557600080fd5b81359190810190604081016020820135600160201b81111561096657600080fd5b82018360208201111561097857600080fd5b803590602001918460208302840111600160201b8311171561099957600080fd5b91935091506001600160a01b03813516906020013561212c565b3480156109bf57600080fd5b506101e0600480360360e08110156109d657600080fd5b506001600160a01b038135811691602081013582169160408201359160608101359160808201359160a08101359091169060c001356124b8565b348015610a1c57600080fd5b5061088a6126fc565b348015610a3157600080fd5b506102d760048036036040811015610a4857600080fd5b81359190810190604081016020820135600160201b811115610a6957600080fd5b820183602082011115610a7b57600080fd5b803590602001918460208302840111600160201b83111715610a9c57600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550612720945050505050565b348015610ae657600080fd5b506101e06004803603610140811015610afe57600080fd5b506001600160a01b0381358116916020810135916040820135916060810135916080820135169060a08101359060c081013515159060ff60e0820135169061010081013590610120013561274d565b348015610b5957600080fd5b50610baf6004803603610100811015610b7157600080fd5b506001600160a01b038135811691602081013582169160408201359160608101359160808201359160a08101359160c0820135169060e00135612861565b60408051938452602084019290925282820152519081900360600190f35b610baf600480360360c0811015610be357600080fd5b506001600160a01b0381358116916020810135916040820135916060810135916080820135169060a0013561299d565b6102d760048036036080811015610c2957600080fd5b81359190810190604081016020820135600160201b811115610c4a57600080fd5b820183602082011115610c5c57600080fd5b803590602001918460208302840111600160201b83111715610c7d57600080fd5b91935091506001600160a01b038135169060200135612c42565b6000808242811015610cde576040805162461bcd60e51b81526020600482015260156024820152600080516020614513833981519152604482015290519081900360640190fd5b610d0d897f00000000000000000000000000000000000000000000000000000000000000008a8a8a308a6124b8565b9093509150610d1d898685612fc4565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632e1a7d4d836040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b158015610d8357600080fd5b505af1158015610d97573d6000803e3d6000fd5b50505050610da5858361312e565b50965096945050505050565b6000610dbe848484613226565b949350505050565b60608142811015610e0c576040805162461bcd60e51b81526020600482015260156024820152600080516020614513833981519152604482015290519081900360640190fd5b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001686866000198101818110610e4657fe5b905060200201356001600160a01b03166001600160a01b031614610e9f576040805162461bcd60e51b815260206004820152601a60248201526000805160206144d1833981519152604482015290519081900360640190fd5b610efd7f00000000000000000000000000000000000000000000000000000000000000008988888080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061331692505050565b91508682600184510381518110610f1057fe5b60200260200101511015610f555760405162461bcd60e51b81526004018080602001828103825260288152602001806143f56028913960400191505060405180910390fd5b610ff386866000818110610f6557fe5b905060200201356001600160a01b031633610fd97f00000000000000000000000000000000000000000000000000000000000000008a8a6000818110610fa757fe5b905060200201356001600160a01b03168b8b6001818110610fc457fe5b905060200201356001600160a01b0316613462565b85600081518110610fe657fe5b6020026020010151613522565b6110328287878080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525030925061367f915050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632e1a7d4d8360018551038151811061107157fe5b60200260200101516040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b1580156110af57600080fd5b505af11580156110c3573d6000803e3d6000fd5b505050506110e884836001855103815181106110db57fe5b602002602001015161312e565b509695505050505050565b60606111207f000000000000000000000000000000000000000000000000000000000000000084846138c5565b90505b92915050565b60008060006111597f00000000000000000000000000000000000000000000000000000000000000008f8f613462565b9050600087611168578c61116c565b6000195b6040805163d505accf60e01b815233600482015230602482015260448101839052606481018c905260ff8a16608482015260a4810189905260c4810188905290519192506001600160a01b0384169163d505accf9160e48082019260009290919082900301818387803b1580156111e257600080fd5b505af11580156111f6573d6000803e3d6000fd5b505050506112098f8f8f8f8f8f8f6124b8565b809450819550505050509b509b9950505050505050505050565b60608142811015611269576040805162461bcd60e51b81526020600482015260156024820152600080516020614513833981519152604482015290519081900360640190fd5b6112c77f00000000000000000000000000000000000000000000000000000000000000008988888080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061331692505050565b915086826001845103815181106112da57fe5b6020026020010151101561131f5760405162461bcd60e51b81526004018080602001828103825260288152602001806143f56028913960400191505060405180910390fd5b61132f86866000818110610f6557fe5b6110e88287878080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525089925061367f915050565b606081428110156113b4576040805162461bcd60e51b81526020600482015260156024820152600080516020614513833981519152604482015290519081900360640190fd5b6001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016868660001981018181106113ee57fe5b905060200201356001600160a01b03166001600160a01b031614611447576040805162461bcd60e51b815260206004820152601a60248201526000805160206144d1833981519152604482015290519081900360640190fd5b6114a57f0000000000000000000000000000000000000000000000000000000000000000898888808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152506138c592505050565b915086826000815181106114b557fe5b60200260200101511115610f555760405162461bcd60e51b81526004018080602001828103825260248152602001806144686024913960400191505060405180910390fd5b6000806115487f00000000000000000000000000000000000000000000000000000000000000008d7f0000000000000000000000000000000000000000000000000000000000000000613462565b9050600086611557578b61155b565b6000195b6040805163d505accf60e01b815233600482015230602482015260448101839052606481018b905260ff8916608482015260a4810188905260c4810187905290519192506001600160a01b0384169163d505accf9160e48082019260009290919082900301818387803b1580156115d157600080fd5b505af11580156115e5573d6000803e3d6000fd5b505050506115f78d8d8d8d8d8d611fab565b9d9c50505050505050505050505050565b804281101561164c576040805162461bcd60e51b81526020600482015260156024820152600080516020614513833981519152604482015290519081900360640190fd5b6116c18585600081811061165c57fe5b905060200201356001600160a01b0316336116bb7f00000000000000000000000000000000000000000000000000000000000000008989600081811061169e57fe5b905060200201356001600160a01b03168a8a6001818110610fc457fe5b8a613522565b6000858560001981018181106116d357fe5b905060200201356001600160a01b03166001600160a01b03166370a08231856040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b15801561173857600080fd5b505afa15801561174c573d6000803e3d6000fd5b505050506040513d602081101561176257600080fd5b505160408051602088810282810182019093528882529293506117a49290918991899182918501908490808284376000920191909152508892506139fd915050565b8661185682888860001981018181106117b957fe5b905060200201356001600160a01b03166001600160a01b03166370a08231886040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b15801561181e57600080fd5b505afa158015611832573d6000803e3d6000fd5b505050506040513d602081101561184857600080fd5b50519063ffffffff613d0816565b10156118935760405162461bcd60e51b81526004018080602001828103825260288152602001806143f56028913960400191505060405180910390fd5b5050505050505050565b80428110156118e1576040805162461bcd60e51b81526020600482015260156024820152600080516020614513833981519152604482015290519081900360640190fd5b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000168585600019810181811061191b57fe5b905060200201356001600160a01b03166001600160a01b031614611974576040805162461bcd60e51b815260206004820152601a60248201526000805160206144d1833981519152604482015290519081900360640190fd5b6119848585600081811061165c57fe5b6119c28585808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152503092506139fd915050565b604080516370a0823160e01b815230600482015290516000916001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016916370a0823191602480820192602092909190829003018186803b158015611a2c57600080fd5b505afa158015611a40573d6000803e3d6000fd5b505050506040513d6020811015611a5657600080fd5b5051905086811015611a995760405162461bcd60e51b81526004018080602001828103825260288152602001806143f56028913960400191505060405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632e1a7d4d826040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b158015611aff57600080fd5b505af1158015611b13573d6000803e3d6000fd5b50505050611893848261312e565b60608142811015611b67576040805162461bcd60e51b81526020600482015260156024820152600080516020614513833981519152604482015290519081900360640190fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031686866000818110611b9e57fe5b905060200201356001600160a01b03166001600160a01b031614611bf7576040805162461bcd60e51b815260206004820152601a60248201526000805160206144d1833981519152604482015290519081900360640190fd5b611c557f00000000000000000000000000000000000000000000000000000000000000003488888080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061331692505050565b91508682600184510381518110611c6857fe5b60200260200101511015611cad5760405162461bcd60e51b81526004018080602001828103825260288152602001806143f56028913960400191505060405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db083600081518110611ce957fe5b60200260200101516040518263ffffffff1660e01b81526004016000604051808303818588803b158015611d1c57600080fd5b505af1158015611d30573d6000803e3d6000fd5b50505050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a9059cbb611d957f00000000000000000000000000000000000000000000000000000000000000008989600081811061169e57fe5b84600081518110611da257fe5b60200260200101516040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050602060405180830381600087803b158015611df957600080fd5b505af1158015611e0d573d6000803e3d6000fd5b505050506040513d6020811015611e2357600080fd5b5051611e2b57fe5b611e6a8287878080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525089925061367f915050565b5095945050505050565b6000610dbe848484613d58565b60608142811015611ec7576040805162461bcd60e51b81526020600482015260156024820152600080516020614513833981519152604482015290519081900360640190fd5b611f257f0000000000000000000000000000000000000000000000000000000000000000898888808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152506138c592505050565b91508682600081518110611f3557fe5b6020026020010151111561131f5760405162461bcd60e51b81526004018080602001828103825260248152602001806144686024913960400191505060405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000081565b6000610dbe848484613e48565b60008142811015611ff1576040805162461bcd60e51b81526020600482015260156024820152600080516020614513833981519152604482015290519081900360640190fd5b612020887f000000000000000000000000000000000000000000000000000000000000000089898930896124b8565b604080516370a0823160e01b815230600482015290519194506120a492508a9187916001600160a01b038416916370a0823191602480820192602092909190829003018186803b15801561207357600080fd5b505afa158015612087573d6000803e3d6000fd5b505050506040513d602081101561209d57600080fd5b5051612fc4565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632e1a7d4d836040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b15801561210a57600080fd5b505af115801561211e573d6000803e3d6000fd5b505050506110e8848361312e565b8042811015612170576040805162461bcd60e51b81526020600482015260156024820152600080516020614513833981519152604482015290519081900360640190fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316858560008181106121a757fe5b905060200201356001600160a01b03166001600160a01b031614612200576040805162461bcd60e51b815260206004820152601a60248201526000805160206144d1833981519152604482015290519081900360640190fd5b60003490507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db0826040518263ffffffff1660e01b81526004016000604051808303818588803b15801561226057600080fd5b505af1158015612274573d6000803e3d6000fd5b50505050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a9059cbb6122d97f00000000000000000000000000000000000000000000000000000000000000008989600081811061169e57fe5b836040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050602060405180830381600087803b15801561232957600080fd5b505af115801561233d573d6000803e3d6000fd5b505050506040513d602081101561235357600080fd5b505161235b57fe5b60008686600019810181811061236d57fe5b905060200201356001600160a01b03166001600160a01b03166370a08231866040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b1580156123d257600080fd5b505afa1580156123e6573d6000803e3d6000fd5b505050506040513d60208110156123fc57600080fd5b5051604080516020898102828101820190935289825292935061243e9290918a918a9182918501908490808284376000920191909152508992506139fd915050565b87611856828989600019810181811061245357fe5b905060200201356001600160a01b03166001600160a01b03166370a08231896040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b15801561181e57600080fd5b60008082428110156124ff576040805162461bcd60e51b81526020600482015260156024820152600080516020614513833981519152604482015290519081900360640190fd5b600061252c7f00000000000000000000000000000000000000000000000000000000000000008c8c613462565b604080516323b872dd60e01b81523360048201526001600160a01b03831660248201819052604482018d9052915192935090916323b872dd916064808201926020929091908290030181600087803b15801561258757600080fd5b505af115801561259b573d6000803e3d6000fd5b505050506040513d60208110156125b157600080fd5b50506040805163226bf2d160e21b81526001600160a01b03888116600483015282516000938493928616926389afcb44926024808301939282900301818787803b1580156125fe57600080fd5b505af1158015612612573d6000803e3d6000fd5b505050506040513d604081101561262857600080fd5b508051602090910151909250905060006126428e8e613ef4565b509050806001600160a01b03168e6001600160a01b031614612665578183612668565b82825b90975095508a8710156126ac5760405162461bcd60e51b815260040180806020018281038252602381526020018061448c6023913960400191505060405180910390fd5b898610156126eb5760405162461bcd60e51b815260040180806020018281038252602381526020018061441d6023913960400191505060405180910390fd5b505050505097509795505050505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b60606111207f00000000000000000000000000000000000000000000000000000000000000008484613316565b600080600061279d7f00000000000000000000000000000000000000000000000000000000000000008e7f0000000000000000000000000000000000000000000000000000000000000000613462565b90506000876127ac578c6127b0565b6000195b6040805163d505accf60e01b815233600482015230602482015260448101839052606481018c905260ff8a16608482015260a4810189905260c4810188905290519192506001600160a01b0384169163d505accf9160e48082019260009290919082900301818387803b15801561282657600080fd5b505af115801561283a573d6000803e3d6000fd5b5050505061284c8e8e8e8e8e8e610c97565b909f909e509c50505050505050505050505050565b600080600083428110156128aa576040805162461bcd60e51b81526020600482015260156024820152600080516020614513833981519152604482015290519081900360640190fd5b6128b88c8c8c8c8c8c613fd2565b909450925060006128ea7f00000000000000000000000000000000000000000000000000000000000000008e8e613462565b90506128f88d338388613522565b6129048c338387613522565b806001600160a01b0316636a627842886040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b03168152602001915050602060405180830381600087803b15801561295c57600080fd5b505af1158015612970573d6000803e3d6000fd5b505050506040513d602081101561298657600080fd5b5051949d939c50939a509198505050505050505050565b600080600083428110156129e6576040805162461bcd60e51b81526020600482015260156024820152600080516020614513833981519152604482015290519081900360640190fd5b612a148a7f00000000000000000000000000000000000000000000000000000000000000008b348c8c613fd2565b90945092506000612a667f00000000000000000000000000000000000000000000000000000000000000008c7f0000000000000000000000000000000000000000000000000000000000000000613462565b9050612a748b338388613522565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db0856040518263ffffffff1660e01b81526004016000604051808303818588803b158015612acf57600080fd5b505af1158015612ae3573d6000803e3d6000fd5b50505050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a9059cbb82866040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050602060405180830381600087803b158015612b6857600080fd5b505af1158015612b7c573d6000803e3d6000fd5b505050506040513d6020811015612b9257600080fd5b5051612b9a57fe5b806001600160a01b0316636a627842886040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b03168152602001915050602060405180830381600087803b158015612bf257600080fd5b505af1158015612c06573d6000803e3d6000fd5b505050506040513d6020811015612c1c57600080fd5b5051925034841015612c3457612c343385340361312e565b505096509650969350505050565b60608142811015612c88576040805162461bcd60e51b81526020600482015260156024820152600080516020614513833981519152604482015290519081900360640190fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031686866000818110612cbf57fe5b905060200201356001600160a01b03166001600160a01b031614612d18576040805162461bcd60e51b815260206004820152601a60248201526000805160206144d1833981519152604482015290519081900360640190fd5b612d767f0000000000000000000000000000000000000000000000000000000000000000888888808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152506138c592505050565b91503482600081518110612d8657fe5b60200260200101511115612dcb5760405162461bcd60e51b81526004018080602001828103825260248152602001806144686024913960400191505060405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db083600081518110612e0757fe5b60200260200101516040518263ffffffff1660e01b81526004016000604051808303818588803b158015612e3a57600080fd5b505af1158015612e4e573d6000803e3d6000fd5b50505050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a9059cbb612eb37f00000000000000000000000000000000000000000000000000000000000000008989600081811061169e57fe5b84600081518110612ec057fe5b60200260200101516040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050602060405180830381600087803b158015612f1757600080fd5b505af1158015612f2b573d6000803e3d6000fd5b505050506040513d6020811015612f4157600080fd5b5051612f4957fe5b612f888287878080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525089925061367f915050565b81600081518110612f9557fe5b6020026020010151341115611e6a57611e6a3383600081518110612fb557fe5b6020026020010151340361312e565b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180516001600160e01b031663a9059cbb60e01b178152925182516000946060949389169392918291908083835b602083106130415780518252601f199092019160209182019101613022565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d80600081146130a3576040519150601f19603f3d011682016040523d82523d6000602084013e6130a8565b606091505b50915091508180156130d65750805115806130d657508080602001905160208110156130d357600080fd5b50515b613127576040805162461bcd60e51b815260206004820152601f60248201527f5472616e7366657248656c7065723a205452414e534645525f4641494c454400604482015290519081900360640190fd5b5050505050565b604080516000808252602082019092526001600160a01b0384169083906040518082805190602001908083835b6020831061317a5780518252601f19909201916020918201910161315b565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d80600081146131dc576040519150601f19603f3d011682016040523d82523d6000602084013e6131e1565b606091505b50509050806132215760405162461bcd60e51b81526004018080602001828103825260238152602001806145336023913960400191505060405180910390fd5b505050565b60008084116132665760405162461bcd60e51b81526004018080602001828103825260288152602001806144406028913960400191505060405180910390fd5b6000831180156132765750600082115b6132b15760405162461bcd60e51b81526004018080602001828103825260258152602001806145566025913960400191505060405180910390fd5b60006132c5856126f763ffffffff61424616565b905060006132d9828563ffffffff61424616565b905060006132ff836132f38861271063ffffffff61424616565b9063ffffffff6142a916565b905080828161330a57fe5b04979650505050505050565b606060028251101561336f576040805162461bcd60e51b815260206004820152601b60248201527f4772617669734c6962726172793a20494e56414c49445f504154480000000000604482015290519081900360640190fd5b815167ffffffffffffffff8111801561338757600080fd5b506040519080825280602002602001820160405280156133b1578160200160208202803683370190505b50905082816000815181106133c257fe5b60200260200101818152505060005b600183510381101561345a57600080613414878685815181106133f057fe5b602002602001015187866001018151811061340757fe5b60200260200101516142f8565b9150915061343684848151811061342757fe5b60200260200101518383613226565b84846001018151811061344557fe5b602090810291909101015250506001016133d1565b509392505050565b60008060006134718585613ef4565b604080516bffffffffffffffffffffffff19606094851b811660208084019190915293851b81166034830152825160288184030181526048830184528051908501206001600160f81b031960688401529a90941b9093166069840152607d8301989098527fbc47b9bc620fcfadd88470f1e2c0c835e45ed014e52f0c70ea3f72bc72762c55609d808401919091528851808403909101815260bd909201909752805196019590952095945050505050565b604080516001600160a01b0385811660248301528481166044830152606480830185905283518084039091018152608490920183526020820180516001600160e01b03166323b872dd60e01b17815292518251600094606094938a169392918291908083835b602083106135a75780518252601f199092019160209182019101613588565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114613609576040519150601f19603f3d011682016040523d82523d6000602084013e61360e565b606091505b509150915081801561363c57508051158061363c575080806020019051602081101561363957600080fd5b50515b6136775760405162461bcd60e51b815260040180806020018281038252602481526020018061457b6024913960400191505060405180910390fd5b505050505050565b60005b60018351038110156138bf5760008084838151811061369d57fe5b60200260200101518584600101815181106136b457fe5b60200260200101519150915060006136cc8383613ef4565b50905060008785600101815181106136e057fe5b60200260200101519050600080836001600160a01b0316866001600160a01b03161461370e57826000613712565b6000835b91509150600060028a51038810613729578861376a565b61376a7f0000000000000000000000000000000000000000000000000000000000000000878c8b6002018151811061375d57fe5b6020026020010151613462565b90506137977f00000000000000000000000000000000000000000000000000000000000000008888613462565b6001600160a01b031663022c0d9f84848460006040519080825280601f01601f1916602001820160405280156137d4576020820181803683370190505b506040518563ffffffff1660e01b815260040180858152602001848152602001836001600160a01b03166001600160a01b0316815260200180602001828103825283818151815260200191508051906020019080838360005b8381101561384557818101518382015260200161382d565b50505050905090810190601f1680156138725780820380516001836020036101000a031916815260200191505b5095505050505050600060405180830381600087803b15801561389457600080fd5b505af11580156138a8573d6000803e3d6000fd5b505060019099019850613682975050505050505050565b50505050565b606060028251101561391e576040805162461bcd60e51b815260206004820152601b60248201527f4772617669734c6962726172793a20494e56414c49445f504154480000000000604482015290519081900360640190fd5b815167ffffffffffffffff8111801561393657600080fd5b50604051908082528060200260200182016040528015613960578160200160208202803683370190505b509050828160018351038151811061397457fe5b60209081029190910101528151600019015b801561345a576000806139b6878660018603815181106139a257fe5b602002602001015187868151811061340757fe5b915091506139d88484815181106139c957fe5b60200260200101518383613d58565b8460018503815181106139e757fe5b6020908102919091010152505060001901613986565b60005b600183510381101561322157600080848381518110613a1b57fe5b6020026020010151858460010181518110613a3257fe5b6020026020010151915091506000613a4a8383613ef4565b5090506000613a7a7f00000000000000000000000000000000000000000000000000000000000000008585613462565b9050600080600080846001600160a01b0316630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b158015613abb57600080fd5b505afa158015613acf573d6000803e3d6000fd5b505050506040513d6060811015613ae557600080fd5b5080516020909101516001600160701b0391821693501690506000806001600160a01b038a811690891614613b1b578284613b1e565b83835b91509150613b7c828b6001600160a01b03166370a082318a6040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b15801561181e57600080fd5b9550613b89868383613226565b945050505050600080856001600160a01b0316886001600160a01b031614613bb357826000613bb7565b6000835b91509150600060028c51038a10613bce578a613c02565b613c027f0000000000000000000000000000000000000000000000000000000000000000898e8d6002018151811061375d57fe5b604080516000808252602082019283905263022c0d9f60e01b835260248201878152604483018790526001600160a01b038086166064850152608060848501908152845160a48601819052969750908c169563022c0d9f958a958a958a9591949193919260c486019290918190849084905b83811015613c8c578181015183820152602001613c74565b50505050905090810190601f168015613cb95780820380516001836020036101000a031916815260200191505b5095505050505050600060405180830381600087803b158015613cdb57600080fd5b505af1158015613cef573d6000803e3d6000fd5b50506001909b019a50613a009950505050505050505050565b80820382811115611123576040805162461bcd60e51b815260206004820152601560248201527464732d6d6174682d7375622d756e646572666c6f7760581b604482015290519081900360640190fd5b6000808411613d985760405162461bcd60e51b81526004018080602001828103825260298152602001806143cc6029913960400191505060405180910390fd5b600083118015613da85750600082115b613de35760405162461bcd60e51b81526004018080602001828103825260258152602001806145566025913960400191505060405180910390fd5b6000613e07612710613dfb868863ffffffff61424616565b9063ffffffff61424616565b90506000613e216126f7613dfb868963ffffffff613d0816565b9050613e3e6001828481613e3157fe5b049063ffffffff6142a916565b9695505050505050565b6000808411613e885760405162461bcd60e51b81526004018080602001828103825260228152602001806144f16022913960400191505060405180910390fd5b600083118015613e985750600082115b613ed35760405162461bcd60e51b81526004018080602001828103825260258152602001806145566025913960400191505060405180910390fd5b82613ee4858463ffffffff61424616565b81613eeb57fe5b04949350505050565b600080826001600160a01b0316846001600160a01b03161415613f485760405162461bcd60e51b81526004018080602001828103825260228152602001806144af6022913960400191505060405180910390fd5b826001600160a01b0316846001600160a01b031610613f68578284613f6b565b83835b90925090506001600160a01b038216613fcb576040805162461bcd60e51b815260206004820152601b60248201527f4772617669734c6962726172793a205a45524f5f414444524553530000000000604482015290519081900360640190fd5b9250929050565b6040805163e6a4390560e01b81526001600160a01b03888116600483015287811660248301529151600092839283927f00000000000000000000000000000000000000000000000000000000000000009092169163e6a4390591604480820192602092909190829003018186803b15801561404c57600080fd5b505afa158015614060573d6000803e3d6000fd5b505050506040513d602081101561407657600080fd5b50516001600160a01b0316141561412957604080516364e329cb60e11b81526001600160a01b038a81166004830152898116602483015291517f00000000000000000000000000000000000000000000000000000000000000009092169163c9c65396916044808201926020929091908290030181600087803b1580156140fc57600080fd5b505af1158015614110573d6000803e3d6000fd5b505050506040513d602081101561412657600080fd5b50505b6000806141577f00000000000000000000000000000000000000000000000000000000000000008b8b6142f8565b91509150816000148015614169575080155b1561417957879350869250614239565b6000614186898484613e48565b90508781116141d957858110156141ce5760405162461bcd60e51b815260040180806020018281038252602381526020018061441d6023913960400191505060405180910390fd5b889450925082614237565b60006141e6898486613e48565b9050898111156141f257fe5b878110156142315760405162461bcd60e51b815260040180806020018281038252602381526020018061448c6023913960400191505060405180910390fd5b94508793505b505b5050965096945050505050565b60008115806142615750508082028282828161425e57fe5b04145b611123576040805162461bcd60e51b815260206004820152601460248201527364732d6d6174682d6d756c2d6f766572666c6f7760601b604482015290519081900360640190fd5b80820182811015611123576040805162461bcd60e51b815260206004820152601460248201527364732d6d6174682d6164642d6f766572666c6f7760601b604482015290519081900360640190fd5b60008060006143078585613ef4565b509050614315868686613462565b50600080614324888888613462565b6001600160a01b0316630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b15801561435c57600080fd5b505afa158015614370573d6000803e3d6000fd5b505050506040513d606081101561438657600080fd5b5080516020909101516001600160701b0391821693501690506001600160a01b03878116908416146143b95780826143bc565b81815b9099909850965050505050505056fe4772617669734c6962726172793a20494e53554646494349454e545f4f55545055545f414d4f554e54477261766973526f757465723a20494e53554646494349454e545f4f55545055545f414d4f554e54477261766973526f757465723a20494e53554646494349454e545f425f414d4f554e544772617669734c6962726172793a20494e53554646494349454e545f494e5055545f414d4f554e54477261766973526f757465723a204558434553534956455f494e5055545f414d4f554e54477261766973526f757465723a20494e53554646494349454e545f415f414d4f554e544772617669734c6962726172793a204944454e544943414c5f414444524553534553477261766973526f757465723a20494e56414c49445f504154480000000000004772617669734c6962726172793a20494e53554646494349454e545f414d4f554e54477261766973526f757465723a204558504952454400000000000000000000005472616e7366657248656c7065723a204554485f5452414e534645525f4641494c45444772617669734c6962726172793a20494e53554646494349454e545f4c49515549444954595472616e7366657248656c7065723a205452414e534645525f46524f4d5f4641494c4544a26469706673582212201629d1b4526fbb981d89906223a1a6bdfea0eff99e6e3651feceed7fd0ba58f564736f6c6343000606003300000000000000000000000059dcb4eab08fa90ed0d7f596c68a54f0c8ca63f4000000000000000000000000ae13d989dac2f0debff460ac112a837c89baa7cd

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

00000000000000000000000059dcb4eab08fa90ed0d7f596c68a54f0c8ca63f4000000000000000000000000ae13d989dac2f0debff460ac112a837c89baa7cd
-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 00000000000000000000000059dcb4eab08fa90ed0d7f596c68a54f0c8ca63f4
Arg [1] : 000000000000000000000000ae13d989dac2f0debff460ac112a837c89baa7cd


Deployed ByteCode Sourcemap

17230:19239:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17707:10;-1:-1:-1;;;;;17721:4:0;17707:18;;17700:26;;;;17230:19239;;12:1:-1;9;2:12;22121:691:0;;5:9:-1;2:2;;;27:1;24;17:12;2:2;22121:691:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;-1:-1;;;;;;22121:691:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;35421:255;;5:9:-1;2:2;;;27:1;24;17:12;2:2;35421:255:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;35421:255:0;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;29569:891;;5:9:-1;2:2;;;27:1;24;17:12;2:2;29569:891:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;29569:891:0;;;;;;;;;;;;;;;;;;-1:-1:-1;;;11:28;;8:2;;;52:1;49;42:12;8:2;29569:891:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;29569:891:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;29569:891:0;;-1:-1:-1;29569:891:0;-1:-1:-1;;;;;;29569:891:0;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:100:-1;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;29569:891:0;;;;;;;;;;;;;;;;;36210:256;;5:9:-1;2:2;;;27:1;24;17:12;2:2;36210:256:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;36210:256:0;;;;;;;;;;;;;;-1:-1:-1;;;11:28;;8:2;;;52:1;49;42:12;8:2;36210:256:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;36210:256:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;36210:256:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;36210:256:0;;-1:-1:-1;36210:256:0;;-1:-1:-1;;;;;36210:256:0:i;22820:722::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;22820:722:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;-1:-1;;;;;;22820:722:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;26672:670::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;26672:670:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;26672:670:0;;;;;;;;;;;;;;;;;;-1:-1:-1;;;11:28;;8:2;;;52:1;49;42:12;8:2;26672:670:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;26672:670:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;26672:670:0;;-1:-1:-1;26672:670:0;-1:-1:-1;;;;;;26672:670:0;;;;;;;;:::i;28692:869::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;28692:869:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;28692:869:0;;;;;;;;;;;;;;;;;;-1:-1:-1;;;11:28;;8:2;;;52:1;49;42:12;8:2;28692:869:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;28692:869:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;28692:869:0;;-1:-1:-1;28692:869:0;-1:-1:-1;;;;;;28692:869:0;;;;;;;;:::i;24964:825::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;24964:825:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;-1:-1;;;;;;24964:825:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;32716:759::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;32716:759:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;32716:759:0;;;;;;;;;;;;;;;;;;-1:-1:-1;;;11:28;;8:2;;;52:1;49;42:12;8:2;32716:759:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;32716:759:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;32716:759:0;;-1:-1:-1;32716:759:0;-1:-1:-1;;;;;;32716:759:0;;;;;;;;:::i;34294:844::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;34294:844:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;34294:844:0;;;;;;;;;;;;;;;;;;-1:-1:-1;;;11:28;;8:2;;;52:1;49;42:12;8:2;34294:844:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;34294:844:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;34294:844:0;;-1:-1:-1;34294:844:0;-1:-1:-1;;;;;;34294:844:0;;;;;;;;:::i;28006:678::-;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;28006:678:0;;;;;;;;;;;;;;-1:-1:-1;;;11:28;;8:2;;;52:1;49;42:12;8:2;28006:678:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;28006:678:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;28006:678:0;;-1:-1:-1;28006:678:0;-1:-1:-1;;;;;;28006:678:0;;;;;;;;:::i;35684:254::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;35684:254:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;35684:254:0;;;;;;;;;;;;:::i;27350:648::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;27350:648:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;27350:648:0;;;;;;;;;;;;;;;;;;-1:-1:-1;;;11:28;;8:2;;;52:1;49;42:12;8:2;27350:648:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;27350:648:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;27350:648:0;;-1:-1:-1;27350:648:0;-1:-1:-1;;;;;;27350:648:0;;;;;;;;:::i;17361:38::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;17361:38:0;;;:::i;:::-;;;;-1:-1:-1;;;;;17361:38:0;;;;;;;;;;;;;;35182:231;;5:9:-1;2:2;;;27:1;24;17:12;2:2;35182:231:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;35182:231:0;;;;;;;;;;;;:::i;24343:613::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;24343:613:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;-1:-1;;;;;;24343:613:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;33483:803::-;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;33483:803:0;;;;;;;;;;;;;;-1:-1:-1;;;11:28;;8:2;;;52:1;49;42:12;8:2;33483:803:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;33483:803:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;33483:803:0;;-1:-1:-1;33483:803:0;-1:-1:-1;;;;;;33483:803:0;;;;;;;;:::i;21241:872::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;21241:872:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;-1:-1;;;;;;21241:872:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;17313:41::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;17313:41:0;;;:::i;35946:256::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;35946:256:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;35946:256:0;;;;;;;;;;;;;;-1:-1:-1;;;11:28;;8:2;;;52:1;49;42:12;8:2;35946:256:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;35946:256:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;35946:256:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;35946:256:0;;-1:-1:-1;35946:256:0;;-1:-1:-1;;;;;35946:256:0:i;23550:714::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;23550:714:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;-1:-1;;;;;;23550:714:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;19236:856::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;19236:856:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;-1:-1;;;;;;19236:856:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;20100:1098;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;-1:-1;;;;;;20100:1098:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;30468:791::-;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;30468:791:0;;;;;;;;;;;;;;-1:-1:-1;;;11:28;;8:2;;;52:1;49;42:12;8:2;30468:791:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;30468:791:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;30468:791:0;;-1:-1:-1;30468:791:0;-1:-1:-1;;;;;;30468:791:0;;;;;;;;:::i;22121:691::-;22370:19;22391:17;22351:8;17473:15;17461:8;:27;;17453:61;;;;;-1:-1:-1;;;17453:61:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;17453:61:0;;;;;;;;;;;;;;;22448:196:::1;22478:5;22498:4;22517:9;22541:14;22570:12;22605:4;22625:8;22448:15;:196::i;:::-;22421:223:::0;;-1:-1:-1;22421:223:0;-1:-1:-1;22655:51:0::1;22683:5:::0;22690:2;22421:223;22655:27:::1;:51::i;:::-;22723:4;-1:-1:-1::0;;;;;22717:20:0::1;;22738:9;22717:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;22717:31:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;22717:31:0;;;;22759:45;22790:2;22794:9;22759:30;:45::i;:::-;22121:691:::0;;;;;;;;;;:::o;35421:255::-;35572:17;35609:59;35636:8;35646:9;35657:10;35609:26;:59::i;:::-;35602:66;35421:255;-1:-1:-1;;;;35421:255:0:o;29569:891::-;29799:24;29780:8;17473:15;17461:8;:27;;17453:61;;;;;-1:-1:-1;;;17453:61:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;17453:61:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;29869:4:0::1;29844:29;:4:::0;;-1:-1:-1;;29849:15:0;;29844:21;;::::1;;;;;;;;;;;-1:-1:-1::0;;;;;29844:21:0::1;-1:-1:-1::0;;;;;29844:29:0::1;;29836:68;;;::::0;;-1:-1:-1;;;29836:68:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;;;;;;;;;29836:68:0;;;;;;;;;;;;;::::1;;29925:52;29953:7;29962:8;29972:4;;29925:52;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;29925:27:0::1;::::0;-1:-1:-1;;;29925:52:0:i:1;:::-;29915:62;;30027:12;29996:7;30021:1;30004:7;:14;:18;29996:27;;;;;;;;;;;;;;:43;;29988:96;;;;-1:-1:-1::0;;;29988:96:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30095:177;30141:4;;30146:1;30141:7;;;;;;;;;;;;;-1:-1:-1::0;;;;;30141:7:0::1;30163:10;30188:48;30210:7;30219:4;;30224:1;30219:7;;;;;;;;;;;;;-1:-1:-1::0;;;;;30219:7:0::1;30228:4;;30233:1;30228:7;;;;;;;;;;;;;-1:-1:-1::0;;;;;30228:7:0::1;30188:21;:48::i;:::-;30251:7;30259:1;30251:10;;;;;;;;;;;;;;30095:31;:177::i;:::-;30283:35;30289:7;30298:4;;30283:35;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;30312:4:0::1;::::0;-1:-1:-1;30283:5:0::1;::::0;-1:-1:-1;;30283:35:0:i:1;:::-;30335:4;-1:-1:-1::0;;;;;30329:20:0::1;;30350:7;30375:1;30358:7;:14;:18;30350:27;;;;;;;;;;;;;;30329:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;30329:49:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;30329:49:0;;;;30389:63;30420:2;30424:7;30449:1;30432:7;:14;:18;30424:27;;;;;;;;;;;;;;30389:30;:63::i;:::-;29569:891:::0;;;;;;;;;:::o;36210:256::-;36357:24;36406:52;36433:7;36442:9;36453:4;36406:26;:52::i;:::-;36399:59;;36210:256;;;;;:::o;22820:722::-;23165:15;23182;23210:12;23225:46;23247:7;23256:6;23264;23225:21;:46::i;:::-;23210:61;;23282:13;23298:10;:36;;23325:9;23298:36;;;-1:-1:-1;;23298:36:0;23345:77;;;-1:-1:-1;;;23345:77:0;;23370:10;23345:77;;;;23390:4;23345:77;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23282:52;;-1:-1:-1;;;;;;23345:24:0;;;;;:77;;;;;-1:-1:-1;;23345:77:0;;;;;;;;-1:-1:-1;23345:24:0;:77;;;2:2:-1;;;;27:1;24;17:12;2:2;23345:77:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;23345:77:0;;;;23454:80;23470:6;23478;23486:9;23497:10;23509;23521:2;23525:8;23454:15;:80::i;:::-;23433:101;;;;;;;;22820:722;;;;;;;;;;;;;;;;:::o;26672:670::-;26905:24;26886:8;17473:15;17461:8;:27;;17453:61;;;;;-1:-1:-1;;;17453:61:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;17453:61:0;;;;;;;;;;;;;;;26952:52:::1;26980:7;26989:8;26999:4;;26952:52;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;26952:27:0::1;::::0;-1:-1:-1;;;26952:52:0:i:1;:::-;26942:62;;27054:12;27023:7;27048:1;27031:7;:14;:18;27023:27;;;;;;;;;;;;;;:43;;27015:96;;;;-1:-1:-1::0;;;27015:96:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27122:177;27168:4;;27173:1;27168:7;;;;;;27122:177;27310:24;27316:7;27325:4;;27310:24;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;27331:2:0;;-1:-1:-1;27310:5:0::1;::::0;-1:-1:-1;;27310:24:0:i:1;28692:869::-:0;28922:24;28903:8;17473:15;17461:8;:27;;17453:61;;;;;-1:-1:-1;;;17453:61:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;17453:61:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;28992:4:0::1;28967:29;:4:::0;;-1:-1:-1;;28972:15:0;;28967:21;;::::1;;;;;;;;;;;-1:-1:-1::0;;;;;28967:21:0::1;-1:-1:-1::0;;;;;28967:29:0::1;;28959:68;;;::::0;;-1:-1:-1;;;28959:68:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;;;;;;;;;28959:68:0;;;;;;;;;;;;;::::1;;29048:52;29075:7;29084:9;29095:4;;29048:52;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;29048:26:0::1;::::0;-1:-1:-1;;;29048:52:0:i:1;:::-;29038:62;;29133:11;29119:7;29127:1;29119:10;;;;;;;;;;;;;;:25;;29111:74;;;;-1:-1:-1::0;;;29111:74:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24964:825:::0;25321:17;25351:12;25366:43;25388:7;25397:5;25404:4;25366:21;:43::i;:::-;25351:58;;25420:13;25436:10;:36;;25463:9;25436:36;;;-1:-1:-1;;25436:36:0;25483:77;;;-1:-1:-1;;;25483:77:0;;25508:10;25483:77;;;;25528:4;25483:77;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25420:52;;-1:-1:-1;;;;;;25483:24:0;;;;;:77;;;;;-1:-1:-1;;25483:77:0;;;;;;;;-1:-1:-1;25483:24:0;:77;;;2:2:-1;;;;27:1;24;17:12;2:2;25483:77:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;25483:77:0;;;;25583:198;25645:5;25665:9;25689:14;25718:12;25745:2;25762:8;25583:47;:198::i;:::-;25571:210;24964:825;-1:-1:-1;;;;;;;;;;;;;24964:825:0:o;32716:759::-;32959:8;17473:15;17461:8;:27;;17453:61;;;;;-1:-1:-1;;;17453:61:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;17453:61:0;;;;;;;;;;;;;;;32980:175:::1;33026:4;;33031:1;33026:7;;;;;;;;;;;;;-1:-1:-1::0;;;;;33026:7:0::1;33048:10;33073:48;33095:7;33104:4;;33109:1;33104:7;;;;;;;;;;;;;-1:-1:-1::0;;;;;33104:7:0::1;33113:4;;33118:1;33113:7;;;;;;33073:48;33136:8;32980:31;:175::i;:::-;33166:21;33197:4:::0;;-1:-1:-1;;33202:15:0;;33197:21;;::::1;;;;;;;;;;;-1:-1:-1::0;;;;;33197:21:0::1;-1:-1:-1::0;;;;;33190:39:0::1;;33230:2;33190:43;;;;;;;;;;;;;-1:-1:-1::0;;;;;33190:43:0::1;-1:-1:-1::0;;;;;33190:43:0::1;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;33190:43:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;33190:43:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;33190:43:0;33244:44:::1;::::0;;33190:43:::1;33244:44:::0;;::::1;::::0;;;;;;;;;;;33190:43;;-1:-1:-1;33244:44:0::1;::::0;;;33279:4;;;;;;33244:44;::::1;::::0;33279:4;;33244:44;33279:4;33244:44;1:33:-1::1;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;33285:2:0;;-1:-1:-1;33244:34:0::1;::::0;-1:-1:-1;;33244:44:0:i:1;:::-;33387:12:::0;33321:62:::1;33369:13:::0;33328:4;;-1:-1:-1;;33333:15:0;;33328:21;;::::1;;;;;;;;;;;-1:-1:-1::0;;;;;33328:21:0::1;-1:-1:-1::0;;;;;33321:39:0::1;;33361:2;33321:43;;;;;;;;;;;;;-1:-1:-1::0;;;;;33321:43:0::1;-1:-1:-1::0;;;;;33321:43:0::1;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;33321:43:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;33321:43:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;33321:43:0;;:62:::1;:47;:62;:::i;:::-;:78;;33299:168;;;;-1:-1:-1::0;;;33299:168:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17525:1;32716:759:::0;;;;;;;:::o;34294:844::-;34534:8;17473:15;17461:8;:27;;17453:61;;;;;-1:-1:-1;;;17453:61:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;17453:61:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;34588:4:0::1;34563:29;:4:::0;;-1:-1:-1;;34568:15:0;;34563:21;;::::1;;;;;;;;;;;-1:-1:-1::0;;;;;34563:21:0::1;-1:-1:-1::0;;;;;34563:29:0::1;;34555:68;;;::::0;;-1:-1:-1;;;34555:68:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;;;;;;;;;34555:68:0;;;;;;;;;;;;;::::1;;34634:175;34680:4;;34685:1;34680:7;;;;;;34634:175;34820:55;34855:4;;34820:55;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;34869:4:0::1;::::0;-1:-1:-1;34820:34:0::1;::::0;-1:-1:-1;;34820:55:0:i:1;:::-;34906:37;::::0;;-1:-1:-1;;;34906:37:0;;34937:4:::1;34906:37;::::0;::::1;::::0;;;34886:17:::1;::::0;-1:-1:-1;;;;;34913:4:0::1;34906:22;::::0;::::1;::::0;:37;;;;;::::1;::::0;;;;;;;;;:22;:37;::::1;;2:2:-1::0;::::1;;;27:1;24::::0;17:12:::1;2:2;34906:37:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;34906:37:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;34906:37:0;;-1:-1:-1;34962:25:0;;::::1;;34954:78;;;;-1:-1:-1::0;;;34954:78:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35049:4;-1:-1:-1::0;;;;;35043:20:0::1;;35064:9;35043:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;35043:31:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;35043:31:0;;;;35085:45;35116:2;35120:9;35085:30;:45::i;28006:678::-:0;28217:24;28198:8;17473:15;17461:8;:27;;17453:61;;;;;-1:-1:-1;;;17453:61:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;17453:61:0;;;;;;;;;;;;;;;28273:4:::1;-1:-1:-1::0;;;;;28262:15:0::1;:4;;28267:1;28262:7;;;;;;;;;;;;;-1:-1:-1::0;;;;;28262:7:0::1;-1:-1:-1::0;;;;;28262:15:0::1;;28254:54;;;::::0;;-1:-1:-1;;;28254:54:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;;;;;;;;;28254:54:0;;;;;;;;;;;;;::::1;;28329:53;28357:7;28366:9;28377:4;;28329:53;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;28329:27:0::1;::::0;-1:-1:-1;;;28329:53:0:i:1;:::-;28319:63;;28432:12;28401:7;28426:1;28409:7;:14;:18;28401:27;;;;;;;;;;;;;;:43;;28393:96;;;;-1:-1:-1::0;;;28393:96:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28506:4;-1:-1:-1::0;;;;;28500:19:0::1;;28527:7;28535:1;28527:10;;;;;;;;;;;;;;28500:40;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;28500:40:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;28500:40:0;;;;;28564:4;-1:-1:-1::0;;;;;28558:20:0::1;;28579:48;28601:7;28610:4;;28615:1;28610:7;;;;;;28579:48;28629:7;28637:1;28629:10;;;;;;;;;;;;;;28558:82;;;;;;;;;;;;;-1:-1:-1::0;;;;;28558:82:0::1;-1:-1:-1::0;;;;;28558:82:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;28558:82:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;28558:82:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;28558:82:0;28551:90:::1;;;;28652:24;28658:7;28667:4;;28652:24;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;28673:2:0;;-1:-1:-1;28652:5:0::1;::::0;-1:-1:-1;;28652:24:0:i:1;:::-;28006:678:::0;;;;;;;;:::o;35684:254::-;35835:16;35871:59;35897:9;35908;35919:10;35871:25;:59::i;27350:648::-;27583:24;27564:8;17473:15;17461:8;:27;;17453:61;;;;;-1:-1:-1;;;17453:61:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;17453:61:0;;;;;;;;;;;;;;;27630:52:::1;27657:7;27666:9;27677:4;;27630:52;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;27630:26:0::1;::::0;-1:-1:-1;;;27630:52:0:i:1;:::-;27620:62;;27715:11;27701:7;27709:1;27701:10;;;;;;;;;;;;;;:25;;27693:74;;;;-1:-1:-1::0;;;27693:74:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17361:38:::0;;;:::o;35182:231::-;35322:15;35357:48;35377:7;35386:8;35396;35357:19;:48::i;24343:613::-;24621:17;24602:8;17473:15;17461:8;:27;;17453:61;;;;;-1:-1:-1;;;17453:61:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;17453:61:0;;;;;;;;;;;;;;;24667:94:::1;24683:5;24690:4;24696:9;24707:14;24723:12;24745:4;24752:8;24667:15;:94::i;:::-;24811:38;::::0;;-1:-1:-1;;;24811:38:0;;24843:4:::1;24811:38;::::0;::::1;::::0;;;24651:110;;-1:-1:-1;24772:78:0::1;::::0;-1:-1:-1;24800:5:0;;24807:2;;-1:-1:-1;;;;;24811:23:0;::::1;::::0;::::1;::::0;:38;;;;;::::1;::::0;;;;;;;;;:23;:38;::::1;;2:2:-1::0;::::1;;;27:1;24::::0;17:12:::1;2:2;24811:38:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;24811:38:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;24811:38:0;24772:27:::1;:78::i;:::-;24867:4;-1:-1:-1::0;;;;;24861:20:0::1;;24882:9;24861:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;24861:31:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;24861:31:0;;;;24903:45;24934:2;24938:9;24903:30;:45::i;33483:803::-:0;33704:8;17473:15;17461:8;:27;;17453:61;;;;;-1:-1:-1;;;17453:61:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;17453:61:0;;;;;;;;;;;;;;;33744:4:::1;-1:-1:-1::0;;;;;33733:15:0::1;:4;;33738:1;33733:7;;;;;;;;;;;;;-1:-1:-1::0;;;;;33733:7:0::1;-1:-1:-1::0;;;;;33733:15:0::1;;33725:54;;;::::0;;-1:-1:-1;;;33725:54:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;;;;;;;;;33725:54:0;;;;;;;;;;;;;::::1;;33790:16;33809:9;33790:28;;33835:4;-1:-1:-1::0;;;;;33829:19:0::1;;33856:8;33829:38;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;33829:38:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;33829:38:0;;;;;33891:4;-1:-1:-1::0;;;;;33885:20:0::1;;33906:48;33928:7;33937:4;;33942:1;33937:7;;;;;;33906:48;33956:8;33885:80;;;;;;;;;;;;;-1:-1:-1::0;;;;;33885:80:0::1;-1:-1:-1::0;;;;;33885:80:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;33885:80:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;33885:80:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;33885:80:0;33878:88:::1;;;;33977:21;34008:4:::0;;-1:-1:-1;;34013:15:0;;34008:21;;::::1;;;;;;;;;;;-1:-1:-1::0;;;;;34008:21:0::1;-1:-1:-1::0;;;;;34001:39:0::1;;34041:2;34001:43;;;;;;;;;;;;;-1:-1:-1::0;;;;;34001:43:0::1;-1:-1:-1::0;;;;;34001:43:0::1;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;34001:43:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;34001:43:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;34001:43:0;34055:44:::1;::::0;;34001:43:::1;34055:44:::0;;::::1;::::0;;;;;;;;;;;34001:43;;-1:-1:-1;34055:44:0::1;::::0;;;34090:4;;;;;;34055:44;::::1;::::0;34090:4;;34055:44;34090:4;34055:44;1:33:-1::1;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;34096:2:0;;-1:-1:-1;34055:34:0::1;::::0;-1:-1:-1;;34055:44:0:i:1;:::-;34198:12:::0;34132:62:::1;34180:13:::0;34139:4;;-1:-1:-1;;34144:15:0;;34139:21;;::::1;;;;;;;;;;;-1:-1:-1::0;;;;;34139:21:0::1;-1:-1:-1::0;;;;;34132:39:0::1;;34172:2;34132:43;;;;;;;;;;;;;-1:-1:-1::0;;;;;34132:43:0::1;-1:-1:-1::0;;;;;34132:43:0::1;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;21241:872:0::0;21507:15;21524;21488:8;17473:15;17461:8;:27;;17453:61;;;;;-1:-1:-1;;;17453:61:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;17453:61:0;;;;;;;;;;;;;;;21552:12:::1;21567:46;21589:7;21598:6;21606;21567:21;:46::i;:::-;21624:59;::::0;;-1:-1:-1;;;21624:59:0;;21655:10:::1;21624:59;::::0;::::1;::::0;-1:-1:-1;;;;;21624:30:0;::::1;:59:::0;;;;;;;;;;;;;;21552:61;;-1:-1:-1;21624:30:0;;::::1;::::0;:59;;;;;::::1;::::0;;;;;;;;;-1:-1:-1;21624:30:0;:59;::::1;;2:2:-1::0;::::1;;;27:1;24::::0;17:12:::1;2:2;21624:59:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;21624:59:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;;21757:26:0::1;::::0;;-1:-1:-1;;;21757:26:0;;-1:-1:-1;;;;;21757:26:0;;::::1;;::::0;::::1;::::0;;;21721:15:::1;::::0;;;21757:22;;::::1;::::0;::::1;::::0;:26;;;;;;;;;;;21721:15;21757:22;:26;::::1;;2:2:-1::0;::::1;;;27:1;24::::0;17:12:::1;2:2;21757:26:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;21757:26:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;21757:26:0;;::::1;::::0;;::::1;::::0;;;-1:-1:-1;21757:26:0;-1:-1:-1;21795:14:0::1;21815:40;21840:6:::0;21848;21815:24:::1;:40::i;:::-;21794:61;;;21897:6;-1:-1:-1::0;;;;;21887:16:0::1;:6;-1:-1:-1::0;;;;;21887:16:0::1;;:58;;21928:7;21937;21887:58;;;21907:7;21916;21887:58;21866:79:::0;;-1:-1:-1;21866:79:0;-1:-1:-1;21964:21:0;;::::1;;21956:69;;;;-1:-1:-1::0;;;21956:69:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22055:10;22044:7;:21;;22036:69;;;;-1:-1:-1::0;;;22036:69:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17525:1;;;;21241:872:::0;;;;;;;;;;;:::o;17313:41::-;;;:::o;35946:256::-;36093:24;36142:52;36170:7;36179:8;36189:4;36142:27;:52::i;23550:714::-;23878:19;23899:17;23929:12;23944:43;23966:7;23975:5;23982:4;23944:21;:43::i;:::-;23929:58;;23998:13;24014:10;:36;;24041:9;24014:36;;;-1:-1:-1;;24014:36:0;24061:77;;;-1:-1:-1;;;24061:77:0;;24086:10;24061:77;;;;24106:4;24061:77;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23998:52;;-1:-1:-1;;;;;;24061:24:0;;;;;:77;;;;;-1:-1:-1;;24061:77:0;;;;;;;;-1:-1:-1;24061:24:0;:77;;;2:2:-1;;;;27:1;24;17:12;2:2;24061:77:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;24061:77:0;;;;24176:80;24195:5;24202:9;24213:14;24229:12;24243:2;24247:8;24176:18;:80::i;:::-;24149:107;;;;-1:-1:-1;23550:714:0;-1:-1:-1;;;;;;;;;;;;;23550:714:0:o;19236:856::-;19598:15;19628;19658:17;19556:8;17473:15;17461:8;:27;;17453:61;;;;;-1:-1:-1;;;17453:61:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;17453:61:0;;;;;;;;;;;;;;;19724:85:::1;19738:6;19746;19754:14;19770;19786:10;19798;19724:13;:85::i;:::-;19703:106:::0;;-1:-1:-1;19703:106:0;-1:-1:-1;19820:12:0::1;19835:46;19857:7;19866:6:::0;19874;19835:21:::1;:46::i;:::-;19820:61;;19892:66;19924:6;19932:10;19944:4;19950:7;19892:31;:66::i;:::-;19969;20001:6;20009:10;20021:4;20027:7;19969:31;:66::i;:::-;20070:4;-1:-1:-1::0;;;;;20058:22:0::1;;20081:2;20058:26;;;;;;;;;;;;;-1:-1:-1::0;;;;;20058:26:0::1;-1:-1:-1::0;;;;;20058:26:0::1;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;20058:26:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;20058:26:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;20058:26:0;19236:856;;;;-1:-1:-1;20058:26:0;;-1:-1:-1;19236:856:0;;-1:-1:-1;;;;;;;;;19236:856:0:o;20100:1098::-;20433:19;20467:17;20499;20391:8;17473:15;17461:8;:27;;17453:61;;;;;-1:-1:-1;;;17453:61:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;17453:61:0;;;;;;;;;;;;;;;20571:176:::1;20599:5;20619:4;20638:18;20671:9;20695:14;20724:12;20571:13;:176::i;:::-;20544:203:::0;;-1:-1:-1;20544:203:0;-1:-1:-1;20758:12:0::1;20773:43;20795:7;20804:5:::0;20811:4:::1;20773:21;:43::i;:::-;20758:58;;20827:69;20859:5;20866:10;20878:4;20884:11;20827:31;:69::i;:::-;20913:4;-1:-1:-1::0;;;;;20907:19:0::1;;20934:9;20907:39;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;20907:39:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;20907:39:0;;;;;20970:4;-1:-1:-1::0;;;;;20964:20:0::1;;20985:4;20991:9;20964:37;;;;;;;;;;;;;-1:-1:-1::0;;;;;20964:37:0::1;-1:-1:-1::0;;;;;20964:37:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;20964:37:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;20964:37:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;20964:37:0;20957:45:::1;;;;21037:4;-1:-1:-1::0;;;;;21025:22:0::1;;21048:2;21025:26;;;;;;;;;;;;;-1:-1:-1::0;;;;;21025:26:0::1;-1:-1:-1::0;;;;;21025:26:0::1;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;21025:26:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;21025:26:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;21025:26:0;;-1:-1:-1;21102:9:0::1;:21:::0;-1:-1:-1;21098:92:0::1;;;21125:65;21156:10;21180:9;21168;:21;21125:30;:65::i;:::-;17525:1;20100:1098:::0;;;;;;;;;;;:::o;30468:791::-;30676:24;30657:8;17473:15;17461:8;:27;;17453:61;;;;;-1:-1:-1;;;17453:61:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;17453:61:0;;;;;;;;;;;;;;;30732:4:::1;-1:-1:-1::0;;;;;30721:15:0::1;:4;;30726:1;30721:7;;;;;;;;;;;;;-1:-1:-1::0;;;;;30721:7:0::1;-1:-1:-1::0;;;;;30721:15:0::1;;30713:54;;;::::0;;-1:-1:-1;;;30713:54:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;;;;;;;;;30713:54:0;;;;;;;;;;;;;::::1;;30788:52;30815:7;30824:9;30835:4;;30788:52;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;30788:26:0::1;::::0;-1:-1:-1;;;30788:52:0:i:1;:::-;30778:62;;30873:9;30859:7;30867:1;30859:10;;;;;;;;;;;;;;:23;;30851:72;;;;-1:-1:-1::0;;;30851:72:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30940:4;-1:-1:-1::0;;;;;30934:19:0::1;;30961:7;30969:1;30961:10;;;;;;;;;;;;;;30934:40;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;30934:40:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;30934:40:0;;;;;30998:4;-1:-1:-1::0;;;;;30992:20:0::1;;31013:48;31035:7;31044:4;;31049:1;31044:7;;;;;;31013:48;31063:7;31071:1;31063:10;;;;;;;;;;;;;;30992:82;;;;;;;;;;;;;-1:-1:-1::0;;;;;30992:82:0::1;-1:-1:-1::0;;;;;30992:82:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;30992:82:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;30992:82:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;30992:82:0;30985:90:::1;;;;31086:24;31092:7;31101:4;;31086:24;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;31107:2:0;;-1:-1:-1;31086:5:0::1;::::0;-1:-1:-1;;31086:24:0:i:1;:::-;31173:7;31181:1;31173:10;;;;;;;;;;;;;;31161:9;:22;31157:94;;;31185:66;31216:10;31240:7;31248:1;31240:10;;;;;;;;;;;;;;31228:9;:22;31185:30;:66::i;1116:398::-:0;1348:45;;;-1:-1:-1;;;;;1348:45:0;;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;1348:45:0;;;;;;;25:18:-1;;61:17;;-1:-1;;;;;182:15;-1:-1;;;179:29;160:49;;1337:57:0;;;;1302:12;;1316:17;;1337:10;;;;1348:45;1337:57;;;25:18:-1;1337:57:0;;25:18:-1;36:153;66:2;61:3;58:11;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;1337:57:0;;;;;;;;;;;;;;;;;;;;;;;;12:1:-1;19;14:27;;;;67:4;61:11;56:16;;134:4;130:9;123:4;105:16;101:27;97:43;94:1;90:51;84:4;77:65;157:16;154:1;147:27;211:16;208:1;201:4;198:1;194:12;179:49;5:228;;14:27;32:4;27:9;;5:228;;1301:93:0;;;;1413:7;:57;;;;-1:-1:-1;1425:11:0;;:16;;:44;;;1456:4;1445:24;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;1445:24:0;1425:44;1405:101;;;;;-1:-1:-1;;;1405:101:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;1116:398;;;;;:::o;1978:200::-;2091:12;;;2051;2091;;;;;;;;;-1:-1:-1;;;;;2069:7:0;;;2084:5;;2069:35;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:11;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;2069:35:0;;;;;;;;;;;;;;;;;;;;;;;;;12:1:-1;19;14:27;;;;67:4;61:11;56:16;;134:4;130:9;123:4;105:16;101:27;97:43;94:1;90:51;84:4;77:65;157:16;154:1;147:27;211:16;208:1;201:4;198:1;194:12;179:49;5:228;;14:27;32:4;27:9;;5:228;;2050:54:0;;;2123:7;2115:55;;;;-1:-1:-1;;;2115:55:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1978:200;;;:::o;4569:570::-;4705:17;4754:1;4743:8;:12;4735:65;;;;-1:-1:-1;;;4735:65:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4831:1;4819:9;:13;:31;;;;;4849:1;4836:10;:14;4819:31;4811:81;;;;-1:-1:-1;;;4811:81:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4903:23;4929:19;:8;4942:5;4929:19;:12;:19;:::i;:::-;4903:45;-1:-1:-1;4959:17:0;4979:31;4903:45;4999:10;4979:31;:19;:31;:::i;:::-;4959:51;-1:-1:-1;5021:19:0;5043:42;5069:15;5043:21;:9;5057:6;5043:21;:13;:21;:::i;:::-;:25;:42;:25;:42;:::i;:::-;5021:64;;5120:11;5108:9;:23;;;;;;;4569:570;-1:-1:-1;;;;;;;4569:570:0:o;5864:560::-;6002:24;6062:1;6047:4;:11;:16;;6039:56;;;;;-1:-1:-1;;;6039:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;6130:4;:11;6116:26;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;6116:26:0;;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;125:4;109:14;101:6;88:42;144:17;;-1:-1;6116:26:0;;6106:36;;6166:8;6153:7;6161:1;6153:10;;;;;;;;;;;;;:21;;;;;6190:9;6185:232;6219:1;6205:4;:11;:15;6201:1;:19;6185:232;;;6243:17;6262:18;6284:42;6296:7;6305:4;6310:1;6305:7;;;;;;;;;;;;;;6314:4;6319:1;6323;6319:5;6314:11;;;;;;;;;;;;;;6284;:42::i;:::-;6242:84;;;;6358:47;6371:7;6379:1;6371:10;;;;;;;;;;;;;;6383:9;6394:10;6358:12;:47::i;:::-;6341:7;6349:1;6353;6349:5;6341:14;;;;;;;;;;;;;;;;;:64;-1:-1:-1;;6222:3:0;;6185:232;;;;5864:560;;;;;:::o;2785:651::-;2908:12;2934:14;2950;2968:26;2979:6;2987;2968:10;:26::i;:::-;3213:32;;;-1:-1:-1;;3213:32:0;;;;;;;;;;;;;;;;;;;;;;;;;22::-1;26:21;;;22:32;6:49;;3213:32:0;;;;;3203:43;;;;;;-1:-1:-1;;;;;;3092:291:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;3092:291:0;;;;;;;3060:342;;;;;;;;;2785:651;-1:-1:-1;;;;;2785:651:0:o;1522:448::-;1793:51;;;-1:-1:-1;;;;;1793:51:0;;;;;;;;;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;1793:51:0;;;;;;;25:18:-1;;61:17;;-1:-1;;;;;182:15;-1:-1;;;179:29;160:49;;1782:63:0;;;;1747:12;;1761:17;;1782:10;;;;1793:51;1782:63;;;25:18:-1;1782:63:0;;25:18:-1;36:153;66:2;61:3;58:11;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;1782:63:0;;;;;;;;;;;;;;;;;;;;;;;;12:1:-1;19;14:27;;;;67:4;61:11;56:16;;134:4;130:9;123:4;105:16;101:27;97:43;94:1;90:51;84:4;77:65;157:16;154:1;147:27;211:16;208:1;201:4;198:1;194:12;179:49;5:228;;14:27;32:4;27:9;;5:228;;1746:99:0;;;;1864:7;:57;;;;-1:-1:-1;1876:11:0;;:16;;:44;;;1907:4;1896:24;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;1896:24:0;1876:44;1856:106;;;;-1:-1:-1;;;1856:106:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1522:448;;;;;;:::o;25900:764::-;26044:9;26039:618;26073:1;26059:4;:11;:15;26055:1;:19;26039:618;;;26097:13;26112:14;26131:4;26136:1;26131:7;;;;;;;;;;;;;;26140:4;26145:1;26149;26145:5;26140:11;;;;;;;;;;;;;;26096:56;;;;26168:14;26188:39;26213:5;26220:6;26188:24;:39::i;:::-;26167:60;;;26242:17;26262:7;26270:1;26274;26270:5;26262:14;;;;;;;;;;;;;;26242:34;;26292:18;26312;26360:6;-1:-1:-1;;;;;26351:15:0;:5;-1:-1:-1;;;;;26351:15:0;;:67;;26396:9;26415:1;26351:67;;;26378:1;26382:9;26351:67;26291:127;;;;26433:10;26464:1;26450:4;:11;:15;26446:1;:19;:79;;26522:3;26446:79;;;26468:51;26490:7;26499:6;26507:4;26512:1;26516;26512:5;26507:11;;;;;;;;;;;;;;26468:21;:51::i;:::-;26433:92;;26552:45;26574:7;26583:5;26590:6;26552:21;:45::i;:::-;-1:-1:-1;;;;;26540:63:0;;26604:10;26616;26628:2;26642:1;26632:12;;;;;;;;;;;;;;;;;;;;;;;;;21:6:-1;;108:14;26632:12:0;87:42:-1;143:17;;-1:-1;26632:12:0;;26540:105;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;26540:105:0;-1:-1:-1;;;;;26540:105:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;26540:105:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;26540:105:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;26076:3:0;;;;;-1:-1:-1;26039:618:0;;-1:-1:-1;;;;;;;;26039:618:0;;;25900:764;;;:::o;6505:581::-;6643:24;6703:1;6688:4;:11;:16;;6680:56;;;;;-1:-1:-1;;;6680:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;6771:4;:11;6757:26;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;6757:26:0;;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;125:4;109:14;101:6;88:42;144:17;;-1:-1;6757:26:0;;6747:36;;6824:9;6794:7;6819:1;6802:7;:14;:18;6794:27;;;;;;;;;;;;;;;;;:39;6861:11;;-1:-1:-1;;6861:15:0;6844:235;6878:5;;6844:235;;6906:17;6925:18;6947:42;6959:7;6968:4;6977:1;6973;:5;6968:11;;;;;;;;;;;;;;6981:4;6986:1;6981:7;;;;;;;6947:42;6905:84;;;;7021:46;7033:7;7041:1;7033:10;;;;;;;;;;;;;;7045:9;7056:10;7021:11;:46::i;:::-;7004:7;7016:1;7012;:5;7004:14;;;;;;;;;;;;;;;;;:63;-1:-1:-1;;;;6885:3:0;6844:235;;31406:1302;31519:9;31514:1187;31548:1;31534:4;:11;:15;31530:1;:19;31514:1187;;;31572:13;31587:14;31606:4;31611:1;31606:7;;;;;;;;;;;;;;31615:4;31620:1;31624;31620:5;31615:11;;;;;;;;;;;;;;31571:56;;;;31643:14;31663:39;31688:5;31695:6;31663:24;:39::i;:::-;31642:60;;;31717:16;31748:45;31770:7;31779:5;31786:6;31748:21;:45::i;:::-;31717:77;;31809:19;31843:20;31955:16;31973;31995:4;-1:-1:-1;;;;;31995:16:0;;:18;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;31995:18:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;31995:18:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;31995:18:0;;;;;;;-1:-1:-1;;;;;31954:59:0;;;;-1:-1:-1;31954:59:0;;-1:-1:-1;32033:20:0;;-1:-1:-1;;;;;32101:15:0;;;;;;;:61;;32143:8;32153;32101:61;;;32120:8;32130;32101:61;32032:130;;;;32195:56;32238:12;32202:5;-1:-1:-1;;;;;32195:23:0;;32227:4;32195:38;;;;;;;;;;;;;-1:-1:-1;;;;;32195:38:0;-1:-1:-1;;;;;32195:38:0;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;32195:56:0;32181:70;;32285:68;32312:11;32325:12;32339:13;32285:26;:68::i;:::-;32270:83;;31514:1187;;;;32384:18;32404;32452:6;-1:-1:-1;;;;;32443:15:0;:5;-1:-1:-1;;;;;32443:15:0;;:73;;32491:12;32513:1;32443:73;;;32470:1;32474:12;32443:73;32383:133;;;;32531:10;32562:1;32548:4;:11;:15;32544:1;:19;:79;;32620:3;32544:79;;;32566:51;32588:7;32597:6;32605:4;32610:1;32614;32610:5;32605:11;;;;;;;32566:51;32676:12;;;32686:1;32676:12;;;;;;;;;;-1:-1:-1;;;32638:51:0;;;;;;;;;;;;;;-1:-1:-1;;;;;32638:51:0;;;;;;;;;;;;;;;;;;;;;;32531:92;;-1:-1:-1;32638:9:0;;;;;;32648:10;;32660;;32531:92;;32676:12;;32638:51;;;;;;;;32676:12;;32638:51;;;;32676:12;;8:100:-1;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;32638:51:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;32638:51:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;31551:3:0;;;;;-1:-1:-1;31514:1187:0;;-1:-1:-1;;;;;;;;;;31514:1187:0;267:138;360:5;;;355:16;;;;347:50;;;;;-1:-1:-1;;;347:50:0;;;;;;;;;;;;-1:-1:-1;;;347:50:0;;;;;;;;;;;;;;5260:522;5396:16;5445:1;5433:9;:13;5425:67;;;;-1:-1:-1;;;5425:67:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5523:1;5511:9;:13;:31;;;;;5541:1;5528:10;:14;5511:31;5503:81;;;;-1:-1:-1;;;5503:81:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5595:17;5615:36;5644:6;5615:24;:9;5629;5615:24;:13;:24;:::i;:::-;:28;:36;:28;:36;:::i;:::-;5595:56;-1:-1:-1;5662:19:0;5684:36;5714:5;5684:25;:10;5699:9;5684:25;:14;:25;:::i;:36::-;5662:58;;5742:32;5772:1;5755:11;5743:9;:23;;;;;;;5742:32;:29;:32;:::i;:::-;5731:43;5260:522;-1:-1:-1;;;;;;5260:522:0:o;4086:361::-;4211:15;4257:1;4247:7;:11;4239:58;;;;-1:-1:-1;;;4239:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4327:1;4316:8;:12;:28;;;;;4343:1;4332:8;:12;4316:28;4308:78;;;;-1:-1:-1;;;4308:78:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4431:8;4407:21;:7;4419:8;4407:21;:11;:21;:::i;:::-;:32;;;;;;;4086:361;-1:-1:-1;;;;4086:361:0:o;2350:343::-;2425:14;2441;2486:6;-1:-1:-1;;;;;2476:16:0;:6;-1:-1:-1;;;;;2476:16:0;;;2468:63;;;;-1:-1:-1;;;2468:63:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2570:6;-1:-1:-1;;;;;2561:15:0;:6;-1:-1:-1;;;;;2561:15:0;;:53;;2599:6;2607;2561:53;;;2580:6;2588;2561:53;2542:72;;-1:-1:-1;2542:72:0;-1:-1:-1;;;;;;2633:20:0;;2625:60;;;;;-1:-1:-1;;;2625:60:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;2350:343;;;;;:::o;17829:1399::-;18160:47;;;-1:-1:-1;;;18160:47:0;;-1:-1:-1;;;;;18160:47:0;;;;;;;;;;;;;;;;18059:15;;;;;;18175:7;18160:31;;;;;;:47;;;;;;;;;;;;;;;:31;:47;;;2:2:-1;;;;27:1;24;17:12;2:2;18160:47:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;18160:47:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;18160:47:0;-1:-1:-1;;;;;18160:61:0;;18156:144;;;18238:50;;;-1:-1:-1;;;18238:50:0;;-1:-1:-1;;;;;18238:50:0;;;;;;;;;;;;;;;;18253:7;18238:34;;;;;;:50;;;;;;;;;;;;;;;-1:-1:-1;18238:34:0;:50;;;2:2:-1;;;;27:1;24;17:12;2:2;18238:50:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;18238:50:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;;18156:144:0;18311:16;18329;18349:50;18375:7;18384:6;18392;18349:25;:50::i;:::-;18310:89;;;;18414:8;18426:1;18414:13;:30;;;;-1:-1:-1;18431:13:0;;18414:30;18410:811;;;18483:14;;-1:-1:-1;18499:14:0;;-1:-1:-1;18410:811:0;;;18547:22;18572:55;18592:14;18608:8;18618;18572:19;:55::i;:::-;18547:80;;18664:14;18646;:32;18642:568;;18725:10;18707:14;:28;;18699:76;;;;-1:-1:-1;;;18699:76:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18816:14;;-1:-1:-1;18832:14:0;-1:-1:-1;18832:14:0;18642:568;;;18888:22;18913:55;18933:14;18949:8;18959;18913:19;:55::i;:::-;18888:80;;19012:14;18994;:32;;18987:40;;;;19072:10;19054:14;:28;;19046:76;;;;-1:-1:-1;;;19046:76:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19163:14;-1:-1:-1;19179:14:0;;-1:-1:-1;18642:568:0;18410:811;;17829:1399;;;;;;;;;;;:::o;413:151::-;471:9;501:6;;;:30;;-1:-1:-1;;516:5:0;;;530:1;525;516:5;525:1;511:15;;;;;:20;501:30;493:63;;;;;-1:-1:-1;;;493:63:0;;;;;;;;;;;;-1:-1:-1;;;493:63:0;;;;;;;;;;;;;;122:137;215:5;;;210:16;;;;202:49;;;;;-1:-1:-1;;;202:49:0;;;;;;;;;;;;-1:-1:-1;;;202:49:0;;;;;;;;;;;;;;3494:479;3621:16;3639;3669:14;3689:26;3700:6;3708;3689:10;:26::i;:::-;3668:47;;;3726:32;3734:7;3743:6;3751;3726:7;:32::i;:::-;;3770:16;3788;3822:32;3830:7;3839:6;3847;3822:7;:32::i;:::-;-1:-1:-1;;;;;3810:57:0;;:59;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;3810:59:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;3810:59:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;3810:59:0;;;;;;;-1:-1:-1;;;;;3769:100:0;;;;-1:-1:-1;3769:100:0;;-1:-1:-1;;;;;;3903:16:0;;;;;;;:62;;3946:8;3956;3903:62;;;3923:8;3933;3903:62;3880:85;;;;-1:-1:-1;3494:479:0;-1:-1:-1;;;;;;;3494:479:0:o

Swarm Source

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