Contract 0x17c83e2b96acfb5190d63f5e46d93c107ec0b514 3

 
Txn Hash Method
Block
From
To
Value
0x54e6abe5ae5daf0c584cf9344ffa72c773b8ad432d4015af60cfea2ffc77c08fSwap Exact Token...9531942023-01-29 12:16:3311 mins ago0x3e2bf2c26943f14eb5d031c1ac9f852be53b0c84 IN 0x17c83e2b96acfb5190d63f5e46d93c107ec0b5140 Ether0.0002475581
0xe471ca5e87e8d4113a2a284deb1ac39f3d9176dace9b65c9150bd659b15c01bbSwap Exact Token...9531932023-01-29 12:16:1711 mins ago0x3e2bf2c26943f14eb5d031c1ac9f852be53b0c84 IN 0x17c83e2b96acfb5190d63f5e46d93c107ec0b5140 Ether0.0002689811
0x91169962dbbef8875d3722e2e6df2c582b234f3639489db439c0ff8eb0c89b10Remove Liquidity...9531912023-01-29 12:14:3713 mins ago0x3e2bf2c26943f14eb5d031c1ac9f852be53b0c84 IN 0x17c83e2b96acfb5190d63f5e46d93c107ec0b5140 Ether0.0002545421
0xa7ea931b22460b083b47d0702d441a83a18b8886058d0046ecfff871e0ce267eSwap Tokens For ...9531422023-01-29 10:21:022 hrs 6 mins ago0x1e70222c0bead73864a9c4ddde682056dd8f9543 IN 0x17c83e2b96acfb5190d63f5e46d93c107ec0b5140 Ether0.000258218031.31
0xe0e2e06fb265f8092fc3d751d6693cba6fef604474e0e5821e26269bb363d3c3Swap Tokens For ...9531162023-01-29 9:31:112 hrs 56 mins ago0xb28cfe82641446a4d80ca3610e1e062c9fdc9d77 IN 0x17c83e2b96acfb5190d63f5e46d93c107ec0b5140 Ether1.4187799081
0x943e5b590dbc11eb7742b017a5f874a9a57661a556c3490d172317fb344d284cSwap Tokens For ...9531152023-01-29 9:30:492 hrs 56 mins ago0xb28cfe82641446a4d80ca3610e1e062c9fdc9d77 IN 0x17c83e2b96acfb5190d63f5e46d93c107ec0b5140 Ether1.4187799081
0x95164379469eb632992f1683fbdbede4168a593482dae04c1244042750b38a5fSwap Tokens For ...9530792023-01-29 8:03:114 hrs 24 mins ago0x2b8cd75d3e679531918feebb9f095a17c982baca IN 0x17c83e2b96acfb5190d63f5e46d93c107ec0b5140 Ether0.0003696662
0x507600d141843d34870d1fcdcb16b37817bea56c5055eb534c018b1121e920ceSwap Tokens For ...9530772023-01-29 8:02:364 hrs 25 mins ago0x2b8cd75d3e679531918feebb9f095a17c982baca IN 0x17c83e2b96acfb5190d63f5e46d93c107ec0b5140 Ether0.0006458522
0xda8ab94645f516b1aeafb6adbde1a2083ac6e3d1b42528baf949d47205dbf0e4Swap ETH For Exa...9530702023-01-29 7:55:284 hrs 32 mins ago0x2b8cd75d3e679531918feebb9f095a17c982baca IN 0x17c83e2b96acfb5190d63f5e46d93c107ec0b5140.086502280115175 Ether0.0003486342
0x43167100c4e7590cf65877eb5c3b7eaaf7fd751b31a7f71c011aad2433bc9491Swap Tokens For ...9530502023-01-29 7:32:184 hrs 55 mins ago0x2b8cd75d3e679531918feebb9f095a17c982baca IN 0x17c83e2b96acfb5190d63f5e46d93c107ec0b5140 Ether0.000508822
0x53bcf1ffb38d5ea13af4b5f50fdb5e2d198a84354c72aee08bb2fefa886e4c33Swap Tokens For ...9530422023-01-29 7:12:545 hrs 14 mins ago0x2b8cd75d3e679531918feebb9f095a17c982baca IN 0x17c83e2b96acfb5190d63f5e46d93c107ec0b5140 Ether0.0004975442
0x27d720f8b11407e7abe65b4bf55593580f20e8df3484d50b810628e2bfdb9215Swap Tokens For ...9530392023-01-29 7:12:105 hrs 15 mins ago0x2b8cd75d3e679531918feebb9f095a17c982baca IN 0x17c83e2b96acfb5190d63f5e46d93c107ec0b5140 Ether0.0004764242
0x97b40e16fee45ace05e6ef5c607746b18619f0a2b8f39c938ea874d76300b6b7Swap Tokens For ...9530362023-01-29 7:12:005 hrs 15 mins ago0x2b8cd75d3e679531918feebb9f095a17c982baca IN 0x17c83e2b96acfb5190d63f5e46d93c107ec0b5140 Ether0.0004975442
0xdc0cc635f91833d09b80a366957c5ca6dc19d9abeea7cdf7c40388e4bf2971edSwap Tokens For ...9530092023-01-29 6:14:336 hrs 13 mins ago0x2b8cd75d3e679531918feebb9f095a17c982baca IN 0x17c83e2b96acfb5190d63f5e46d93c107ec0b5140 Ether0.0005505742
0x1c0f8752e54049c3ff371e238ce91de755b5779fed6f28b2f8d823b3398d327fSwap Tokens For ...9529472023-01-29 4:00:348 hrs 27 mins ago0x2b8cd75d3e679531918feebb9f095a17c982baca IN 0x17c83e2b96acfb5190d63f5e46d93c107ec0b5140 Ether0.000517142
0x063367431fcae15aa687b6fa5176aca200715a379aac976fe97d4f007881e901Swap Exact Token...9529432023-01-29 3:48:448 hrs 39 mins ago0x2b8cd75d3e679531918feebb9f095a17c982baca IN 0x17c83e2b96acfb5190d63f5e46d93c107ec0b5140 Ether0.0003688022
0xa658408bb255306befc61bec764ab3ea3a28d03dc4f76cc3eb3ef7d10e463cc0Swap Exact Token...9529262023-01-29 3:01:009 hrs 26 mins ago0x2b8cd75d3e679531918feebb9f095a17c982baca IN 0x17c83e2b96acfb5190d63f5e46d93c107ec0b5140 Ether0.0004366242
0x94cfa04f3a9ef35e4a4f647fce061c62890ae3f5c10e76220d8e87b0433ecdf6Swap Exact Token...9529232023-01-29 2:54:169 hrs 33 mins ago0x2b8cd75d3e679531918feebb9f095a17c982baca IN 0x17c83e2b96acfb5190d63f5e46d93c107ec0b5140 Ether0.0005338342
0x38f37dbac2bb14280ebadf78a1a3938a252897583f592348a326c688e7918c28Swap Exact Token...9529092023-01-29 2:08:2610 hrs 19 mins ago0x1e70222c0bead73864a9c4ddde682056dd8f9543 IN 0x17c83e2b96acfb5190d63f5e46d93c107ec0b5140 Ether0.000256583151.31
0x62a5abbb4e7b72803fd43e186f72b55d5c6ee2daa4e91f0c1c7eb710282b960bSwap Exact Token...9529082023-01-29 2:08:2610 hrs 19 mins ago0x1e70222c0bead73864a9c4ddde682056dd8f9543 IN 0x17c83e2b96acfb5190d63f5e46d93c107ec0b5140 Ether0.000248715291.31
0x4a26af1b1e9d009896ec354496ab7fa0a8d9e51574560a5daa0f702e5af035a9Swap Exact Token...9529062023-01-29 2:08:1310 hrs 19 mins ago0x1e70222c0bead73864a9c4ddde682056dd8f9543 IN 0x17c83e2b96acfb5190d63f5e46d93c107ec0b5140 Ether0.000256583151.31
0x906ebe0663118e66b6b776b69784d2b4e400d80b472b695572e02d864a56c446Swap Exact Token...9528972023-01-29 1:42:2110 hrs 45 mins ago0x9f034dddd9c6464e827f648110dda4b6a3a42844 IN 0x17c83e2b96acfb5190d63f5e46d93c107ec0b5140 Ether0.00024550241.3
0x76713787a5e42601a8631d653fc56de84ded670c272294e7d18edc88f39d72b7Swap Exact Token...9528932023-01-29 1:30:3110 hrs 57 mins ago0x9f034dddd9c6464e827f648110dda4b6a3a42844 IN 0x17c83e2b96acfb5190d63f5e46d93c107ec0b5140 Ether0.00025889631.3
0x69ddbca1d12c4308fee95cc73d01808e1fddc4161e0693cc4f86c9b4ae5cf821Swap Exact Token...9528862023-01-29 1:20:2311 hrs 7 mins ago0x9f034dddd9c6464e827f648110dda4b6a3a42844 IN 0x17c83e2b96acfb5190d63f5e46d93c107ec0b5140 Ether0.00029261831.3
0x5ae2a676cad82dbf376deccf798a5ac3066755cb3ab70bef2837e141ea64cfedSwap Tokens For ...9528852023-01-29 1:18:1011 hrs 9 mins ago0x1e70222c0bead73864a9c4ddde682056dd8f9543 IN 0x17c83e2b96acfb5190d63f5e46d93c107ec0b5140 Ether0.000294934711.31
[ Download CSV Export 
Latest 25 internal transaction
Parent Txn Hash Block From To Value
0x54e6abe5ae5daf0c584cf9344ffa72c773b8ad432d4015af60cfea2ffc77c08f9531942023-01-29 12:16:3311 mins ago 0x17c83e2b96acfb5190d63f5e46d93c107ec0b5140x547b227a77813ea70aacf01212b39db7b560fa1c0 Ether
0x54e6abe5ae5daf0c584cf9344ffa72c773b8ad432d4015af60cfea2ffc77c08f9531942023-01-29 12:16:3311 mins ago 0x17c83e2b96acfb5190d63f5e46d93c107ec0b5140xf5ffa0aabf101e651f6cf722031d4efedc835b670 Ether
0x54e6abe5ae5daf0c584cf9344ffa72c773b8ad432d4015af60cfea2ffc77c08f9531942023-01-29 12:16:3311 mins ago 0x17c83e2b96acfb5190d63f5e46d93c107ec0b5140x5008f837883ea9a07271a1b5eb0658404f5a96100 Ether
0x54e6abe5ae5daf0c584cf9344ffa72c773b8ad432d4015af60cfea2ffc77c08f9531942023-01-29 12:16:3311 mins ago 0x17c83e2b96acfb5190d63f5e46d93c107ec0b5140x7ddaf116889d655d1c486beb95017a8211265d290 Ether
0x54e6abe5ae5daf0c584cf9344ffa72c773b8ad432d4015af60cfea2ffc77c08f9531942023-01-29 12:16:3311 mins ago 0x17c83e2b96acfb5190d63f5e46d93c107ec0b5140x7ddaf116889d655d1c486beb95017a8211265d290 Ether
0x54e6abe5ae5daf0c584cf9344ffa72c773b8ad432d4015af60cfea2ffc77c08f9531942023-01-29 12:16:3311 mins ago 0x17c83e2b96acfb5190d63f5e46d93c107ec0b5140x7ddaf116889d655d1c486beb95017a8211265d290 Ether
0x54e6abe5ae5daf0c584cf9344ffa72c773b8ad432d4015af60cfea2ffc77c08f9531942023-01-29 12:16:3311 mins ago 0x17c83e2b96acfb5190d63f5e46d93c107ec0b5140x547b227a77813ea70aacf01212b39db7b560fa1c0 Ether
0x54e6abe5ae5daf0c584cf9344ffa72c773b8ad432d4015af60cfea2ffc77c08f9531942023-01-29 12:16:3311 mins ago 0x17c83e2b96acfb5190d63f5e46d93c107ec0b5140x7ddaf116889d655d1c486beb95017a8211265d290 Ether
0x54e6abe5ae5daf0c584cf9344ffa72c773b8ad432d4015af60cfea2ffc77c08f9531942023-01-29 12:16:3311 mins ago 0x17c83e2b96acfb5190d63f5e46d93c107ec0b5140x7ddaf116889d655d1c486beb95017a8211265d290 Ether
0x54e6abe5ae5daf0c584cf9344ffa72c773b8ad432d4015af60cfea2ffc77c08f9531942023-01-29 12:16:3311 mins ago 0x17c83e2b96acfb5190d63f5e46d93c107ec0b5140x7ddaf116889d655d1c486beb95017a8211265d290 Ether
0x54e6abe5ae5daf0c584cf9344ffa72c773b8ad432d4015af60cfea2ffc77c08f9531942023-01-29 12:16:3311 mins ago 0x17c83e2b96acfb5190d63f5e46d93c107ec0b5140xf5ffa0aabf101e651f6cf722031d4efedc835b670 Ether
0xe471ca5e87e8d4113a2a284deb1ac39f3d9176dace9b65c9150bd659b15c01bb9531932023-01-29 12:16:1711 mins ago 0x17c83e2b96acfb5190d63f5e46d93c107ec0b5140x547b227a77813ea70aacf01212b39db7b560fa1c0 Ether
0xe471ca5e87e8d4113a2a284deb1ac39f3d9176dace9b65c9150bd659b15c01bb9531932023-01-29 12:16:1711 mins ago 0x17c83e2b96acfb5190d63f5e46d93c107ec0b5140x077c28868b84c4b420638ef97041764effbb24280 Ether
0xe471ca5e87e8d4113a2a284deb1ac39f3d9176dace9b65c9150bd659b15c01bb9531932023-01-29 12:16:1711 mins ago 0x17c83e2b96acfb5190d63f5e46d93c107ec0b514Boba Network: BOBA Token0 Ether
0xe471ca5e87e8d4113a2a284deb1ac39f3d9176dace9b65c9150bd659b15c01bb9531932023-01-29 12:16:1711 mins ago 0x17c83e2b96acfb5190d63f5e46d93c107ec0b5140x7ddaf116889d655d1c486beb95017a8211265d290 Ether
0xe471ca5e87e8d4113a2a284deb1ac39f3d9176dace9b65c9150bd659b15c01bb9531932023-01-29 12:16:1711 mins ago 0x17c83e2b96acfb5190d63f5e46d93c107ec0b5140x7ddaf116889d655d1c486beb95017a8211265d290 Ether
0xe471ca5e87e8d4113a2a284deb1ac39f3d9176dace9b65c9150bd659b15c01bb9531932023-01-29 12:16:1711 mins ago 0x17c83e2b96acfb5190d63f5e46d93c107ec0b5140x7ddaf116889d655d1c486beb95017a8211265d290 Ether
0xe471ca5e87e8d4113a2a284deb1ac39f3d9176dace9b65c9150bd659b15c01bb9531932023-01-29 12:16:1711 mins ago 0x17c83e2b96acfb5190d63f5e46d93c107ec0b5140x547b227a77813ea70aacf01212b39db7b560fa1c0 Ether
0xe471ca5e87e8d4113a2a284deb1ac39f3d9176dace9b65c9150bd659b15c01bb9531932023-01-29 12:16:1711 mins ago 0x17c83e2b96acfb5190d63f5e46d93c107ec0b5140x7ddaf116889d655d1c486beb95017a8211265d290 Ether
0xe471ca5e87e8d4113a2a284deb1ac39f3d9176dace9b65c9150bd659b15c01bb9531932023-01-29 12:16:1711 mins ago 0x17c83e2b96acfb5190d63f5e46d93c107ec0b5140x7ddaf116889d655d1c486beb95017a8211265d290 Ether
0xe471ca5e87e8d4113a2a284deb1ac39f3d9176dace9b65c9150bd659b15c01bb9531932023-01-29 12:16:1711 mins ago 0x17c83e2b96acfb5190d63f5e46d93c107ec0b5140x7ddaf116889d655d1c486beb95017a8211265d290 Ether
0xe471ca5e87e8d4113a2a284deb1ac39f3d9176dace9b65c9150bd659b15c01bb9531932023-01-29 12:16:1711 mins ago 0x17c83e2b96acfb5190d63f5e46d93c107ec0b5140x077c28868b84c4b420638ef97041764effbb24280 Ether
0x91169962dbbef8875d3722e2e6df2c582b234f3639489db439c0ff8eb0c89b109531912023-01-29 12:14:3713 mins ago 0x17c83e2b96acfb5190d63f5e46d93c107ec0b5140x52b97d3f7b7cb0df32971b372f43da2f6c1851600 Ether
0x91169962dbbef8875d3722e2e6df2c582b234f3639489db439c0ff8eb0c89b109531912023-01-29 12:14:3713 mins ago 0x17c83e2b96acfb5190d63f5e46d93c107ec0b5140x52b97d3f7b7cb0df32971b372f43da2f6c1851600 Ether
0x91169962dbbef8875d3722e2e6df2c582b234f3639489db439c0ff8eb0c89b109531912023-01-29 12:14:3713 mins ago 0x17c83e2b96acfb5190d63f5e46d93c107ec0b5140x52b97d3f7b7cb0df32971b372f43da2f6c1851600 Ether
[ Download CSV Export 
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
OolongSwapRouter02

Compiler Version
v0.6.12+commit.27d51765

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at bobascan.com on 2022-07-12
*/

// File: contracts/interfaces/IOolongSwapPair.sol

// SPDX-License-Identifier: GPL-3.0

pragma solidity 0.6.12;

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

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

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

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

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

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

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

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

    function initialize(address, address) external;
}

// File: contracts/interfaces/IOolongSwapFactory.sol

pragma solidity 0.6.12;

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

    function feeTo() external view returns (address);
    function feeToSetter() external view returns (address);
    function feeToAlloc() external view returns (uint);
    function defaultFee() external view returns (uint);
    function FEE_DENOMINATOR() external view returns (uint);
    function getPairFee(address pair) external view returns (uint);

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

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

    function setFeeTo(address) external;
    function setFeeToSetter(address) external;
    function setFeeToAlloc(uint) external;
    function setDefaultFee(uint) external;
    function setPairFee(address pair, uint fee) external;
}

// File: contracts/libraries/SafeMath.sol

pragma solidity 0.6.12;

/**
 * @dev Wrappers over Solidity's arithmetic operations with added overflow
 * checks.
 *
 * Arithmetic operations in Solidity wrap on overflow. This can easily result
 * in bugs, because programmers usually assume that an overflow raises an
 * error, which is the standard behavior in high level programming languages.
 * `SafeMath` restores this intuition by reverting the transaction when an
 * operation overflows.
 *
 * Using this library instead of the unchecked operations eliminates an entire
 * class of bugs, so it's recommended to use it always.
 */
library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     *
     * - Addition cannot overflow.
     */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        uint256 c = a + b;
        require(c >= a, "SafeMath: addition overflow");

        return c;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return sub(a, b, "SafeMath: subtraction overflow");
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b <= a, errorMessage);
        uint256 c = a - b;

        return c;
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     *
     * - Multiplication cannot overflow.
     */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
        // benefit is lost if 'b' is also tested.
        // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
        if (a == 0) {
            return 0;
        }

        uint256 c = a * b;
        require(c / a == b, "SafeMath: multiplication overflow");

        return c;
    }

    /**
     * @dev Returns the integer division of two unsigned integers. Reverts on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return div(a, b, "SafeMath: division by zero");
    }

    /**
     * @dev Returns the integer division of two unsigned integers. Reverts with custom message on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b > 0, errorMessage);
        uint256 c = a / b;
        // assert(a == b * c + a % b); // There is no case in which this doesn't hold

        return c;
    }
}

// File: contracts/libraries/OolongSwapLibrary.sol

pragma solidity 0.6.12;




library OolongSwapLibrary {
    using SafeMath for uint;

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

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

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

    // given some amount of an asset and pair reserves, returns an equivalent amount of the other asset
    function quote(uint amountA, uint reserveA, uint reserveB) internal pure returns (uint amountB) {
        require(amountA > 0, 'OolongSwapLibrary: INSUFFICIENT_AMOUNT');
        require(reserveA > 0 && reserveB > 0, 'OolongSwapLibrary: 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(address factory, uint amountIn, uint reserveIn, uint reserveOut, address token0, address token1) internal view returns (uint amountOut) {
        require(amountIn > 0, 'OolongSwapLibrary: INSUFFICIENT_INPUT_AMOUNT');
        require(reserveIn > 0 && reserveOut > 0, 'OolongSwapLibrary: INSUFFICIENT_LIQUIDITY');
        uint256 fee = IOolongSwapFactory(factory).getPairFee(pairFor(factory, token0, token1));
        uint amountInWithFee = amountIn.mul(IOolongSwapFactory(factory).FEE_DENOMINATOR().sub(fee));
        uint numerator = amountInWithFee.mul(reserveOut);
        uint denominator = reserveIn.mul(IOolongSwapFactory(factory).FEE_DENOMINATOR()).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(address factory, uint amountOut, uint reserveIn, uint reserveOut, address token0, address token1) internal view returns (uint amountIn) {
        require(amountOut > 0, 'OolongSwapLibrary: INSUFFICIENT_OUTPUT_AMOUNT');
        require(reserveIn > 0 && reserveOut > 0, 'OolongSwapLibrary: INSUFFICIENT_LIQUIDITY');
        uint256 fee = IOolongSwapFactory(factory).getPairFee(pairFor(factory, token0, token1));
        uint numerator = reserveIn.mul(amountOut).mul(IOolongSwapFactory(factory).FEE_DENOMINATOR());
        uint denominator = reserveOut.sub(amountOut).mul(IOolongSwapFactory(factory).FEE_DENOMINATOR().sub(fee));
        amountIn = (numerator / denominator).add(1);
    }

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

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

// File: contracts/libraries/TransferHelper.sol

pragma solidity 0.6.12;

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

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

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

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

// File: contracts/interfaces/IOolongSwapRouter01.sol

pragma solidity 0.6.12;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

// File: contracts/interfaces/IOolongSwapRouter02.sol

pragma solidity 0.6.12;


interface IOolongSwapRouter02 is IOolongSwapRouter01 {
    function removeLiquidityETHSupportingFeeOnTransferTokens(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external returns (uint amountETH);

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

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

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

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

// File: contracts/interfaces/IERC20.sol

pragma solidity 0.6.12;

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

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

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

// File: contracts/interfaces/IWETH.sol

pragma solidity 0.6.12;

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

// File: contracts/OolongSwapRouter02.sol

pragma solidity 0.6.12;








contract OolongSwapRouter02 is IOolongSwapRouter02 {
    using SafeMath for uint;

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

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

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

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

    // **** ADD LIQUIDITY ****
    function _addLiquidity(
        address tokenA,
        address tokenB,
        uint amountADesired,
        uint amountBDesired,
        uint amountAMin,
        uint amountBMin
    ) internal virtual returns (uint amountA, uint amountB) {
        // create the pair if it doesn't exist yet
        if (IOolongSwapFactory(factory).getPair(tokenA, tokenB) == address(0)) {
            IOolongSwapFactory(factory).createPair(tokenA, tokenB);
        }
        (uint reserveA, uint reserveB) = OolongSwapLibrary.getReserves(factory, tokenA, tokenB);
        if (reserveA == 0 && reserveB == 0) {
            (amountA, amountB) = (amountADesired, amountBDesired);
        } else {
            uint amountBOptimal = OolongSwapLibrary.quote(amountADesired, reserveA, reserveB);
            if (amountBOptimal <= amountBDesired) {
                require(amountBOptimal >= amountBMin, 'OolongSwapRouter: INSUFFICIENT_B_AMOUNT');
                (amountA, amountB) = (amountADesired, amountBOptimal);
            } else {
                uint amountAOptimal = OolongSwapLibrary.quote(amountBDesired, reserveB, reserveA);
                assert(amountAOptimal <= amountADesired);
                require(amountAOptimal >= amountAMin, 'OolongSwapRouter: INSUFFICIENT_A_AMOUNT');
                (amountA, amountB) = (amountAOptimal, amountBDesired);
            }
        }
    }
    function addLiquidity(
        address tokenA,
        address tokenB,
        uint amountADesired,
        uint amountBDesired,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline
    ) external virtual override ensure(deadline) returns (uint amountA, uint amountB, uint liquidity) {
        (amountA, amountB) = _addLiquidity(tokenA, tokenB, amountADesired, amountBDesired, amountAMin, amountBMin);
        address pair = OolongSwapLibrary.pairFor(factory, tokenA, tokenB);
        TransferHelper.safeTransferFrom(tokenA, msg.sender, pair, amountA);
        TransferHelper.safeTransferFrom(tokenB, msg.sender, pair, amountB);
        liquidity = IOolongSwapPair(pair).mint(to);
    }

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

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

    function removeLiquidityETH(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) public virtual override ensure(deadline) returns (uint amountToken, uint amountETH) {
        (amountToken, amountETH) = removeLiquidity(
            token,
            WETH,
            liquidity,
            amountTokenMin,
            amountETHMin,
            address(this),
            deadline
        );
        TransferHelper.safeTransfer(token, to, amountToken);
        IWETH(WETH).withdraw(amountETH);
        TransferHelper.safeTransferETH(to, amountETH);
    }

    function removeLiquidityWithPermit(
        address tokenA,
        address tokenB,
        uint liquidity,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external virtual override returns (uint amountA, uint amountB) {
        address pair = OolongSwapLibrary.pairFor(factory, tokenA, tokenB);
        uint value = approveMax ? uint(-1) : liquidity;
        IOolongSwapPair(pair).permit(msg.sender, address(this), value, deadline, v, r, s);
        (amountA, amountB) = removeLiquidity(tokenA, tokenB, liquidity, amountAMin, amountBMin, to, deadline);
    }

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

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

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

    // **** SWAP ****
    // requires the initial amount to have already been sent to the first pair
    function _swap(uint[] memory amounts, address[] memory path, address _to) internal virtual {
        for (uint i; i < path.length - 1; i++) {
            (address input, address output) = (path[i], path[i + 1]);
            (address token0,) = OolongSwapLibrary.sortTokens(input, output);
            uint amountOut = amounts[i + 1];
            (uint amount0Out, uint amount1Out) = input == token0 ? (uint(0), amountOut) : (amountOut, uint(0));
            address to = i < path.length - 2 ? OolongSwapLibrary.pairFor(factory, output, path[i + 2]) : _to;
            IOolongSwapPair(OolongSwapLibrary.pairFor(factory, input, output)).swap(
                amount0Out, amount1Out, to, new bytes(0)
            );
        }
    }
    function swapExactTokensForTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external virtual override ensure(deadline) returns (uint[] memory amounts) {
        amounts = OolongSwapLibrary.getAmountsOut(factory, amountIn, path);
        require(amounts[amounts.length - 1] >= amountOutMin, 'OolongSwapRouter: INSUFFICIENT_OUTPUT_AMOUNT');
        TransferHelper.safeTransferFrom(
            path[0], msg.sender, OolongSwapLibrary.pairFor(factory, path[0], path[1]), amounts[0]
        );
        _swap(amounts, path, to);
    }
    function swapTokensForExactTokens(
        uint amountOut,
        uint amountInMax,
        address[] calldata path,
        address to,
        uint deadline
    ) external virtual override ensure(deadline) returns (uint[] memory amounts) {
        amounts = OolongSwapLibrary.getAmountsIn(factory, amountOut, path);
        require(amounts[0] <= amountInMax, 'OolongSwapRouter: EXCESSIVE_INPUT_AMOUNT');
        TransferHelper.safeTransferFrom(
            path[0], msg.sender, OolongSwapLibrary.pairFor(factory, path[0], path[1]), amounts[0]
        );
        _swap(amounts, path, to);
    }

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

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

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

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

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

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

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

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

    function getAmountOut(uint amountIn, uint reserveIn, uint reserveOut, address token0, address token1)
        public
        view
        virtual
        override
        returns (uint amountOut)
    {
        return OolongSwapLibrary.getAmountOut(factory, amountIn, reserveIn, reserveOut, token0, token1);
    }

    function getAmountIn(uint amountOut, uint reserveIn, uint reserveOut, address token0, address token1)
        public
        view
        virtual
        override
        returns (uint amountIn)
    {
        return OolongSwapLibrary.getAmountIn(factory, amountOut, reserveIn, reserveOut, token0, token1);
    }

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

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

Contract Security Audit

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"},{"internalType":"address","name":"token0","type":"address"},{"internalType":"address","name":"token1","type":"address"}],"name":"getAmountIn","outputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"reserveIn","type":"uint256"},{"internalType":"uint256","name":"reserveOut","type":"uint256"},{"internalType":"address","name":"token0","type":"address"},{"internalType":"address","name":"token1","type":"address"}],"name":"getAmountOut","outputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"}],"stateMutability":"view","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"}]

60c060405234801561001057600080fd5b5060405162004b0b38038062004b0b8339818101604052604081101561003557600080fd5b5080516020909101516001600160601b0319606092831b8116608052911b1660a05260805160601c60a05160601c614977620001946000398061015f5280610d125280610d4d5280610e2f528061104d52806113d7528061153d52806118ec52806119c75280611aa15280611b6f5280611cb55280611d3d5280611fa6528061202952806120dd52806121a9528061223e52806122b252806127c55280612a2f5280612a855280612ab95280612b2d5280612cbb5280612dfe5280612e86525080610ebd5280610f945280611113528061114c52806112875280611465528061151b528061168b5280611c025280611d6f5280611ebc5280611f7152806122e45280612522528061271a5280612743528061277352806127a352806129105280612a635280612d4e5280612eb8528061369252806136d552806139db5280613b015280613b7452806142975280614350528061440352506149776000f3fe60806040526004361061014f5760003560e01c8063ad5c4648116100b6578063cd7290d51161006f578063cd7290d514610a06578063d06ca61f14610a53578063ded9382a14610b08578063e8e3370014610b7b578063f305d71914610bfb578063fb3bdb4114610c4157610188565b8063ad5c464814610856578063ad615dec14610887578063af2979eb146108bd578063b6f9de9514610910578063baa2abde14610994578063c45a0155146109f157610188565b80635b0d5984116101085780635b0d59841461053e5780635c11d795146105c3578063791ac947146106595780637ff36ab5146106ef5780638803dbee1461077357806399ef4b871461080957610188565b806302751cec1461018d57806318cbafe5146101f95780631f00ca74146102df5780632195995c1461039457806338ed1739146104125780634a25d94a146104a857610188565b3661018857336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461018657fe5b005b600080fd5b34801561019957600080fd5b506101e0600480360360c08110156101b057600080fd5b506001600160a01b0381358116916020810135916040820135916060810135916080820135169060a00135610cc5565b6040805192835260208301919091528051918290030190f35b34801561020557600080fd5b5061028f600480360360a081101561021c57600080fd5b813591602081013591810190606081016040820135600160201b81111561024257600080fd5b82018360208201111561025457600080fd5b803590602001918460208302840111600160201b8311171561027557600080fd5b91935091506001600160a01b038135169060200135610ddf565b60408051602080825283518183015283519192839290830191858101910280838360005b838110156102cb5781810151838201526020016102b3565b505050509050019250505060405180910390f35b3480156102eb57600080fd5b5061028f6004803603604081101561030257600080fd5b81359190810190604081016020820135600160201b81111561032357600080fd5b82018360208201111561033557600080fd5b803590602001918460208302840111600160201b8311171561035657600080fd5b91908080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525092955061110c945050505050565b3480156103a057600080fd5b506101e060048036036101608110156103b857600080fd5b506001600160a01b038135811691602081013582169160408201359160608101359160808201359160a08101359091169060c08101359060e081013515159060ff6101008201351690610120810135906101400135611142565b34801561041e57600080fd5b5061028f600480360360a081101561043557600080fd5b813591602081013591810190606081016040820135600160201b81111561045b57600080fd5b82018360208201111561046d57600080fd5b803590602001918460208302840111600160201b8311171561048e57600080fd5b91935091506001600160a01b03813516906020013561123c565b3480156104b457600080fd5b5061028f600480360360a08110156104cb57600080fd5b813591602081013591810190606081016040820135600160201b8111156104f157600080fd5b82018360208201111561050357600080fd5b803590602001918460208302840111600160201b8311171561052457600080fd5b91935091506001600160a01b038135169060200135611387565b34801561054a57600080fd5b506105b1600480360361014081101561056257600080fd5b506001600160a01b0381358116916020810135916040820135916060810135916080820135169060a08101359060c081013515159060ff60e08201351690610100810135906101200135611513565b60408051918252519081900360200190f35b3480156105cf57600080fd5b50610186600480360360a08110156105e657600080fd5b813591602081013591810190606081016040820135600160201b81111561060c57600080fd5b82018360208201111561061e57600080fd5b803590602001918460208302840111600160201b8311171561063f57600080fd5b91935091506001600160a01b038135169060200135611621565b34801561066557600080fd5b50610186600480360360a081101561067c57600080fd5b813591602081013591810190606081016040820135600160201b8111156106a257600080fd5b8201836020820111156106b457600080fd5b803590602001918460208302840111600160201b831117156106d557600080fd5b91935091506001600160a01b03813516906020013561189e565b61028f6004803603608081101561070557600080fd5b81359190810190604081016020820135600160201b81111561072657600080fd5b82018360208201111561073857600080fd5b803590602001918460208302840111600160201b8311171561075957600080fd5b91935091506001600160a01b038135169060200135611b27565b34801561077f57600080fd5b5061028f600480360360a081101561079657600080fd5b813591602081013591810190606081016040820135600160201b8111156107bc57600080fd5b8201836020820111156107ce57600080fd5b803590602001918460208302840111600160201b831117156107ef57600080fd5b91935091506001600160a01b038135169060200135611e71565b34801561081557600080fd5b506105b1600480360360a081101561082c57600080fd5b508035906020810135906040810135906001600160a01b0360608201358116916080013516611f6a565b34801561086257600080fd5b5061086b611fa4565b604080516001600160a01b039092168252519081900360200190f35b34801561089357600080fd5b506105b1600480360360608110156108aa57600080fd5b5080359060208101359060400135611fc8565b3480156108c957600080fd5b506105b1600480360360c08110156108e057600080fd5b506001600160a01b0381358116916020810135916040820135916060810135916080820135169060a00135611fdd565b6101866004803603608081101561092657600080fd5b81359190810190604081016020820135600160201b81111561094757600080fd5b82018360208201111561095957600080fd5b803590602001918460208302840111600160201b8311171561097a57600080fd5b91935091506001600160a01b038135169060200135612163565b3480156109a057600080fd5b506101e0600480360360e08110156109b757600080fd5b506001600160a01b038135811691602081013582169160408201359160608101359160808201359160a08101359091169060c001356124d4565b3480156109fd57600080fd5b5061086b612718565b348015610a1257600080fd5b506105b1600480360360a0811015610a2957600080fd5b508035906020810135906040810135906001600160a01b036060820135811691608001351661273c565b348015610a5f57600080fd5b5061028f60048036036040811015610a7657600080fd5b81359190810190604081016020820135600160201b811115610a9757600080fd5b820183602082011115610aa957600080fd5b803590602001918460208302840111600160201b83111715610aca57600080fd5b91908080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525092955061276c945050505050565b348015610b1457600080fd5b506101e06004803603610140811015610b2c57600080fd5b506001600160a01b0381358116916020810135916040820135916060810135916080820135169060a08101359060c081013515159060ff60e08201351690610100810135906101200135612799565b348015610b8757600080fd5b50610bdd6004803603610100811015610b9f57600080fd5b506001600160a01b038135811691602081013582169160408201359160608101359160808201359160a08101359160c0820135169060e001356128ad565b60408051938452602084019290925282820152519081900360600190f35b610bdd600480360360c0811015610c1157600080fd5b506001600160a01b0381358116916020810135916040820135916060810135916080820135169060a001356129e0565b61028f60048036036080811015610c5757600080fd5b81359190810190604081016020820135600160201b811115610c7857600080fd5b820183602082011115610c8a57600080fd5b803590602001918460208302840111600160201b83111715610cab57600080fd5b91935091506001600160a01b038135169060200135612c73565b6000808242811015610d0c576040805162461bcd60e51b81526020600482015260196024820152600080516020614818833981519152604482015290519081900360640190fd5b610d3b897f00000000000000000000000000000000000000000000000000000000000000008a8a8a308a6124d4565b9093509150610d4b898685612fec565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632e1a7d4d836040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b158015610db157600080fd5b505af1158015610dc5573d6000803e3d6000fd5b50505050610dd38583613156565b50965096945050505050565b60608142811015610e25576040805162461bcd60e51b81526020600482015260196024820152600080516020614818833981519152604482015290519081900360640190fd5b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001686866000198101818110610e5f57fe5b905060200201356001600160a01b03166001600160a01b031614610eb8576040805162461bcd60e51b815260206004820152601e60248201526000805160206147f8833981519152604482015290519081900360640190fd5b610f167f00000000000000000000000000000000000000000000000000000000000000008988888080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061324e92505050565b91508682600184510381518110610f2957fe5b60200260200101511015610f6e5760405162461bcd60e51b815260040180806020018281038252602c8152602001806148cc602c913960400191505060405180910390fd5b61100c86866000818110610f7e57fe5b905060200201356001600160a01b031633610ff27f00000000000000000000000000000000000000000000000000000000000000008a8a6000818110610fc057fe5b905060200201356001600160a01b03168b8b6001818110610fdd57fe5b905060200201356001600160a01b03166133c6565b85600081518110610fff57fe5b6020026020010151613486565b61104b828787808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152503092506135e3915050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632e1a7d4d8360018551038151811061108a57fe5b60200260200101516040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b1580156110c857600080fd5b505af11580156110dc573d6000803e3d6000fd5b5050505061110184836001855103815181106110f457fe5b6020026020010151613156565b509695505050505050565b60606111397f00000000000000000000000000000000000000000000000000000000000000008484613820565b90505b92915050565b60008060006111727f00000000000000000000000000000000000000000000000000000000000000008f8f6133c6565b9050600087611181578c611185565b6000195b6040805163d505accf60e01b815233600482015230602482015260448101839052606481018c905260ff8a16608482015260a4810189905260c4810188905290519192506001600160a01b0384169163d505accf9160e48082019260009290919082900301818387803b1580156111fb57600080fd5b505af115801561120f573d6000803e3d6000fd5b505050506112228f8f8f8f8f8f8f6124d4565b809450819550505050509b509b9950505050505050505050565b60608142811015611282576040805162461bcd60e51b81526020600482015260196024820152600080516020614818833981519152604482015290519081900360640190fd5b6112e07f00000000000000000000000000000000000000000000000000000000000000008988888080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061324e92505050565b915086826001845103815181106112f357fe5b602002602001015110156113385760405162461bcd60e51b815260040180806020018281038252602c8152602001806148cc602c913960400191505060405180910390fd5b61134886866000818110610f7e57fe5b611101828787808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152508992506135e3915050565b606081428110156113cd576040805162461bcd60e51b81526020600482015260196024820152600080516020614818833981519152604482015290519081900360640190fd5b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000168686600019810181811061140757fe5b905060200201356001600160a01b03166001600160a01b031614611460576040805162461bcd60e51b815260206004820152601e60248201526000805160206147f8833981519152604482015290519081900360640190fd5b6114be7f00000000000000000000000000000000000000000000000000000000000000008988888080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061382092505050565b915086826000815181106114ce57fe5b60200260200101511115610f6e5760405162461bcd60e51b81526004018080602001828103825260288152602001806147a46028913960400191505060405180910390fd5b6000806115617f00000000000000000000000000000000000000000000000000000000000000008d7f00000000000000000000000000000000000000000000000000000000000000006133c6565b9050600086611570578b611574565b6000195b6040805163d505accf60e01b815233600482015230602482015260448101839052606481018b905260ff8916608482015260a4810188905260c4810187905290519192506001600160a01b0384169163d505accf9160e48082019260009290919082900301818387803b1580156115ea57600080fd5b505af11580156115fe573d6000803e3d6000fd5b505050506116108d8d8d8d8d8d611fdd565b9d9c50505050505050505050505050565b8042811015611665576040805162461bcd60e51b81526020600482015260196024820152600080516020614818833981519152604482015290519081900360640190fd5b6116da8585600081811061167557fe5b905060200201356001600160a01b0316336116d47f0000000000000000000000000000000000000000000000000000000000000000898960008181106116b757fe5b905060200201356001600160a01b03168a8a6001818110610fdd57fe5b8a613486565b6000858560001981018181106116ec57fe5b905060200201356001600160a01b03166001600160a01b03166370a08231856040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561174857600080fd5b505afa15801561175c573d6000803e3d6000fd5b505050506040513d602081101561177257600080fd5b505160408051602088810282810182019093528882529293506117b4929091899189918291850190849080828437600092019190915250889250613984915050565b8661185782888860001981018181106117c957fe5b905060200201356001600160a01b03166001600160a01b03166370a08231886040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561182557600080fd5b505afa158015611839573d6000803e3d6000fd5b505050506040513d602081101561184f57600080fd5b505190613ca9565b10156118945760405162461bcd60e51b815260040180806020018281038252602c8152602001806148cc602c913960400191505060405180910390fd5b5050505050505050565b80428110156118e2576040805162461bcd60e51b81526020600482015260196024820152600080516020614818833981519152604482015290519081900360640190fd5b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000168585600019810181811061191c57fe5b905060200201356001600160a01b03166001600160a01b031614611975576040805162461bcd60e51b815260206004820152601e60248201526000805160206147f8833981519152604482015290519081900360640190fd5b6119858585600081811061167557fe5b6119c3858580806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250309250613984915050565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015611a3257600080fd5b505afa158015611a46573d6000803e3d6000fd5b505050506040513d6020811015611a5c57600080fd5b5051905086811015611a9f5760405162461bcd60e51b815260040180806020018281038252602c8152602001806148cc602c913960400191505060405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632e1a7d4d826040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b158015611b0557600080fd5b505af1158015611b19573d6000803e3d6000fd5b505050506118948482613156565b60608142811015611b6d576040805162461bcd60e51b81526020600482015260196024820152600080516020614818833981519152604482015290519081900360640190fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031686866000818110611ba457fe5b905060200201356001600160a01b03166001600160a01b031614611bfd576040805162461bcd60e51b815260206004820152601e60248201526000805160206147f8833981519152604482015290519081900360640190fd5b611c5b7f00000000000000000000000000000000000000000000000000000000000000003488888080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061324e92505050565b91508682600184510381518110611c6e57fe5b60200260200101511015611cb35760405162461bcd60e51b815260040180806020018281038252602c8152602001806148cc602c913960400191505060405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db083600081518110611cef57fe5b60200260200101516040518263ffffffff1660e01b81526004016000604051808303818588803b158015611d2257600080fd5b505af1158015611d36573d6000803e3d6000fd5b50505050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a9059cbb611d9b7f0000000000000000000000000000000000000000000000000000000000000000898960008181106116b757fe5b84600081518110611da857fe5b60200260200101516040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050602060405180830381600087803b158015611df657600080fd5b505af1158015611e0a573d6000803e3d6000fd5b505050506040513d6020811015611e2057600080fd5b5051611e2857fe5b611e67828787808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152508992506135e3915050565b5095945050505050565b60608142811015611eb7576040805162461bcd60e51b81526020600482015260196024820152600080516020614818833981519152604482015290519081900360640190fd5b611f157f00000000000000000000000000000000000000000000000000000000000000008988888080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061382092505050565b91508682600081518110611f2557fe5b602002602001015111156113385760405162461bcd60e51b81526004018080602001828103825260288152602001806147a46028913960400191505060405180910390fd5b6000611f9a7f00000000000000000000000000000000000000000000000000000000000000008787878787613ceb565b9695505050505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000611fd5848484613ef9565b949350505050565b60008142811015612023576040805162461bcd60e51b81526020600482015260196024820152600080516020614818833981519152604482015290519081900360640190fd5b612052887f000000000000000000000000000000000000000000000000000000000000000089898930896124d4565b9050809250506120db88858a6001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b1580156120aa57600080fd5b505afa1580156120be573d6000803e3d6000fd5b505050506040513d60208110156120d457600080fd5b5051612fec565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632e1a7d4d836040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b15801561214157600080fd5b505af1158015612155573d6000803e3d6000fd5b505050506111018483613156565b80428110156121a7576040805162461bcd60e51b81526020600482015260196024820152600080516020614818833981519152604482015290519081900360640190fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316858560008181106121de57fe5b905060200201356001600160a01b03166001600160a01b031614612237576040805162461bcd60e51b815260206004820152601e60248201526000805160206147f8833981519152604482015290519081900360640190fd5b60003490507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db0826040518263ffffffff1660e01b81526004016000604051808303818588803b15801561229757600080fd5b505af11580156122ab573d6000803e3d6000fd5b50505050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a9059cbb6123107f0000000000000000000000000000000000000000000000000000000000000000898960008181106116b757fe5b836040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050602060405180830381600087803b15801561235757600080fd5b505af115801561236b573d6000803e3d6000fd5b505050506040513d602081101561238157600080fd5b505161238957fe5b60008686600019810181811061239b57fe5b905060200201356001600160a01b03166001600160a01b03166370a08231866040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b1580156123f757600080fd5b505afa15801561240b573d6000803e3d6000fd5b505050506040513d602081101561242157600080fd5b505160408051602089810282810182019093528982529293506124639290918a918a918291850190849080828437600092019190915250899250613984915050565b87611857828989600019810181811061247857fe5b905060200201356001600160a01b03166001600160a01b03166370a08231896040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561182557600080fd5b600080824281101561251b576040805162461bcd60e51b81526020600482015260196024820152600080516020614818833981519152604482015290519081900360640190fd5b60006125487f00000000000000000000000000000000000000000000000000000000000000008c8c6133c6565b604080516323b872dd60e01b81523360048201526001600160a01b03831660248201819052604482018d9052915192935090916323b872dd916064808201926020929091908290030181600087803b1580156125a357600080fd5b505af11580156125b7573d6000803e3d6000fd5b505050506040513d60208110156125cd57600080fd5b50506040805163226bf2d160e21b81526001600160a01b03888116600483015282516000938493928616926389afcb44926024808301939282900301818787803b15801561261a57600080fd5b505af115801561262e573d6000803e3d6000fd5b505050506040513d604081101561264457600080fd5b5080516020909101519092509050600061265e8e8e613f9f565b509050806001600160a01b03168e6001600160a01b031614612681578183612684565b82825b90975095508a8710156126c85760405162461bcd60e51b815260040180806020018281038252602781526020018061477d6027913960400191505060405180910390fd5b898610156127075760405162461bcd60e51b81526004018080602001828103825260278152602001806148596027913960400191505060405180910390fd5b505050505097509795505050505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000611f9a7f0000000000000000000000000000000000000000000000000000000000000000878787878761407d565b60606111397f0000000000000000000000000000000000000000000000000000000000000000848461324e565b60008060006127e97f00000000000000000000000000000000000000000000000000000000000000008e7f00000000000000000000000000000000000000000000000000000000000000006133c6565b90506000876127f8578c6127fc565b6000195b6040805163d505accf60e01b815233600482015230602482015260448101839052606481018c905260ff8a16608482015260a4810189905260c4810188905290519192506001600160a01b0384169163d505accf9160e48082019260009290919082900301818387803b15801561287257600080fd5b505af1158015612886573d6000803e3d6000fd5b505050506128988e8e8e8e8e8e610cc5565b909f909e509c50505050505050505050505050565b600080600083428110156128f6576040805162461bcd60e51b81526020600482015260196024820152600080516020614818833981519152604482015290519081900360640190fd5b6129048c8c8c8c8c8c614287565b909450925060006129367f00000000000000000000000000000000000000000000000000000000000000008e8e6133c6565b90506129448d338388613486565b6129508c338387613486565b806001600160a01b0316636a627842886040518263ffffffff1660e01b815260040180826001600160a01b03168152602001915050602060405180830381600087803b15801561299f57600080fd5b505af11580156129b3573d6000803e3d6000fd5b505050506040513d60208110156129c957600080fd5b5051949d939c50939a509198505050505050505050565b60008060008342811015612a29576040805162461bcd60e51b81526020600482015260196024820152600080516020614818833981519152604482015290519081900360640190fd5b612a578a7f00000000000000000000000000000000000000000000000000000000000000008b348c8c614287565b90945092506000612aa97f00000000000000000000000000000000000000000000000000000000000000008c7f00000000000000000000000000000000000000000000000000000000000000006133c6565b9050612ab78b338388613486565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db0856040518263ffffffff1660e01b81526004016000604051808303818588803b158015612b1257600080fd5b505af1158015612b26573d6000803e3d6000fd5b50505050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a9059cbb82866040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050602060405180830381600087803b158015612ba257600080fd5b505af1158015612bb6573d6000803e3d6000fd5b505050506040513d6020811015612bcc57600080fd5b5051612bd457fe5b806001600160a01b0316636a627842886040518263ffffffff1660e01b815260040180826001600160a01b03168152602001915050602060405180830381600087803b158015612c2357600080fd5b505af1158015612c37573d6000803e3d6000fd5b505050506040513d6020811015612c4d57600080fd5b5051925034841015612c6557612c6533853403613156565b505096509650969350505050565b60608142811015612cb9576040805162461bcd60e51b81526020600482015260196024820152600080516020614818833981519152604482015290519081900360640190fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031686866000818110612cf057fe5b905060200201356001600160a01b03166001600160a01b031614612d49576040805162461bcd60e51b815260206004820152601e60248201526000805160206147f8833981519152604482015290519081900360640190fd5b612da77f00000000000000000000000000000000000000000000000000000000000000008888888080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061382092505050565b91503482600081518110612db757fe5b60200260200101511115612dfc5760405162461bcd60e51b81526004018080602001828103825260288152602001806147a46028913960400191505060405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db083600081518110612e3857fe5b60200260200101516040518263ffffffff1660e01b81526004016000604051808303818588803b158015612e6b57600080fd5b505af1158015612e7f573d6000803e3d6000fd5b50505050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a9059cbb612ee47f0000000000000000000000000000000000000000000000000000000000000000898960008181106116b757fe5b84600081518110612ef157fe5b60200260200101516040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050602060405180830381600087803b158015612f3f57600080fd5b505af1158015612f53573d6000803e3d6000fd5b505050506040513d6020811015612f6957600080fd5b5051612f7157fe5b612fb0828787808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152508992506135e3915050565b81600081518110612fbd57fe5b6020026020010151341115611e6757611e673383600081518110612fdd57fe5b60200260200101513403613156565b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180516001600160e01b031663a9059cbb60e01b178152925182516000946060949389169392918291908083835b602083106130695780518252601f19909201916020918201910161304a565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d80600081146130cb576040519150601f19603f3d011682016040523d82523d6000602084013e6130d0565b606091505b50915091508180156130fe5750805115806130fe57508080602001905160208110156130fb57600080fd5b50515b61314f576040805162461bcd60e51b815260206004820152601f60248201527f5472616e7366657248656c7065723a205452414e534645525f4641494c454400604482015290519081900360640190fd5b5050505050565b604080516000808252602082019092526001600160a01b0384169083906040518082805190602001908083835b602083106131a25780518252601f199092019160209182019101613183565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114613204576040519150601f19603f3d011682016040523d82523d6000602084013e613209565b606091505b50509050806132495760405162461bcd60e51b81526004018080602001828103825260238152602001806148a96023913960400191505060405180910390fd5b505050565b60606002825110156132a7576040805162461bcd60e51b815260206004820152601f60248201527f4f6f6c6f6e67537761704c6962726172793a20494e56414c49445f5041544800604482015290519081900360640190fd5b815167ffffffffffffffff811180156132bf57600080fd5b506040519080825280602002602001820160405280156132e9578160200160208202803683370190505b50905082816000815181106132fa57fe5b60200260200101818152505060005b60018351038110156133be5760008061334c8786858151811061332857fe5b602002602001015187866001018151811061333f57fe5b6020026020010151614518565b9150915061339a8785858151811061336057fe5b6020026020010151848489888151811061337657fe5b60200260200101518a896001018151811061338d57fe5b6020026020010151613ceb565b8484600101815181106133a957fe5b60209081029190910101525050600101613309565b509392505050565b60008060006133d58585613f9f565b604080516bffffffffffffffffffffffff19606094851b811660208084019190915293851b81166034830152825160288184030181526048830184528051908501206001600160f81b031960688401529a90941b9093166069840152607d8301989098527f1db9efb13a1398e31bb71895c392fa1217130f78dc65080174491adcec5da9b9609d808401919091528851808403909101815260bd909201909752805196019590952095945050505050565b604080516001600160a01b0385811660248301528481166044830152606480830185905283518084039091018152608490920183526020820180516001600160e01b03166323b872dd60e01b17815292518251600094606094938a169392918291908083835b6020831061350b5780518252601f1990920191602091820191016134ec565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d806000811461356d576040519150601f19603f3d011682016040523d82523d6000602084013e613572565b606091505b50915091508180156135a05750805115806135a0575080806020019051602081101561359d57600080fd5b50515b6135db5760405162461bcd60e51b81526004018080602001828103825260248152602001806148f86024913960400191505060405180910390fd5b505050505050565b60005b600183510381101561381a5760008084838151811061360157fe5b602002602001015185846001018151811061361857fe5b60200260200101519150915060006136308383613f9f565b509050600087856001018151811061364457fe5b60200260200101519050600080836001600160a01b0316866001600160a01b03161461367257826000613676565b6000835b91509150600060028a5103881061368d57886136ce565b6136ce7f0000000000000000000000000000000000000000000000000000000000000000878c8b600201815181106136c157fe5b60200260200101516133c6565b90506136fb7f000000000000000000000000000000000000000000000000000000000000000088886133c6565b6001600160a01b031663022c0d9f84848460006040519080825280601f01601f191660200182016040528015613738576020820181803683370190505b506040518563ffffffff1660e01b815260040180858152602001848152602001836001600160a01b0316815260200180602001828103825283818151815260200191508051906020019080838360005b838110156137a0578181015183820152602001613788565b50505050905090810190601f1680156137cd5780820380516001836020036101000a031916815260200191505b5095505050505050600060405180830381600087803b1580156137ef57600080fd5b505af1158015613803573d6000803e3d6000fd5b5050600190990198506135e6975050505050505050565b50505050565b6060600282511015613879576040805162461bcd60e51b815260206004820152601f60248201527f4f6f6c6f6e67537761704c6962726172793a20494e56414c49445f5041544800604482015290519081900360640190fd5b815167ffffffffffffffff8111801561389157600080fd5b506040519080825280602002602001820160405280156138bb578160200160208202803683370190505b50905082816001835103815181106138cf57fe5b60209081029190910101528151600019015b80156133be57600080613911878660018603815181106138fd57fe5b602002602001015187868151811061333f57fe5b9150915061395f8785858151811061392557fe5b6020026020010151848489600189038151811061393e57fe5b60200260200101518a898151811061395257fe5b602002602001015161407d565b84600185038151811061396e57fe5b60209081029190910101525050600019016138e1565b60005b6001835103811015613249576000808483815181106139a257fe5b60200260200101518584600101815181106139b957fe5b60200260200101519150915060006139d18383613f9f565b5090506000613a017f000000000000000000000000000000000000000000000000000000000000000085856133c6565b9050600080600080846001600160a01b0316630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b158015613a4257600080fd5b505afa158015613a56573d6000803e3d6000fd5b505050506040513d6060811015613a6c57600080fd5b5080516020909101516001600160701b0391821693501690506000806001600160a01b038a811690891614613aa2578284613aa5565b83835b91509150613afa828b6001600160a01b03166370a082318a6040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561182557600080fd5b9550613b2a7f00000000000000000000000000000000000000000000000000000000000000008784848e8e613ceb565b945050505050600080856001600160a01b0316886001600160a01b031614613b5457826000613b58565b6000835b91509150600060028c51038a10613b6f578a613ba3565b613ba37f0000000000000000000000000000000000000000000000000000000000000000898e8d600201815181106136c157fe5b604080516000808252602082019283905263022c0d9f60e01b835260248201878152604483018790526001600160a01b038086166064850152608060848501908152845160a48601819052969750908c169563022c0d9f958a958a958a9591949193919260c486019290918190849084905b83811015613c2d578181015183820152602001613c15565b50505050905090810190601f168015613c5a5780820380516001836020036101000a031916815260200191505b5095505050505050600060405180830381600087803b158015613c7c57600080fd5b505af1158015613c90573d6000803e3d6000fd5b50506001909b019a506139879950505050505050505050565b600061113983836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f7700008152506145df565b6000808611613d2b5760405162461bcd60e51b815260040180806020018281038252602c8152602001806147cc602c913960400191505060405180910390fd5b600085118015613d3b5750600084115b613d765760405162461bcd60e51b81526004018080602001828103825260298152602001806148806029913960400191505060405180910390fd5b6000876001600160a01b0316630cf6ee84613d928a87876133c6565b6040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015613dcf57600080fd5b505afa158015613de3573d6000803e3d6000fd5b505050506040513d6020811015613df957600080fd5b50516040805163d73792a960e01b81529051919250600091613e5391613e4c9185916001600160a01b038e169163d73792a991600480820192602092909190829003018186803b15801561182557600080fd5b8990614676565b90506000613e618288614676565b90506000613ede83613ed88d6001600160a01b031663d73792a96040518163ffffffff1660e01b815260040160206040518083038186803b158015613ea557600080fd5b505afa158015613eb9573d6000803e3d6000fd5b505050506040513d6020811015613ecf57600080fd5b50518c90614676565b906146cf565b9050808281613ee957fe5b049b9a5050505050505050505050565b6000808411613f395760405162461bcd60e51b815260040180806020018281038252602681526020018061491c6026913960400191505060405180910390fd5b600083118015613f495750600082115b613f845760405162461bcd60e51b81526004018080602001828103825260298152602001806148806029913960400191505060405180910390fd5b82613f8f8584614676565b81613f9657fe5b04949350505050565b600080826001600160a01b0316846001600160a01b03161415613ff35760405162461bcd60e51b81526004018080602001828103825260268152602001806147576026913960400191505060405180910390fd5b826001600160a01b0316846001600160a01b031610614013578284614016565b83835b90925090506001600160a01b038216614076576040805162461bcd60e51b815260206004820152601f60248201527f4f6f6c6f6e67537761704c6962726172793a205a45524f5f4144445245535300604482015290519081900360640190fd5b9250929050565b60008086116140bd5760405162461bcd60e51b815260040180806020018281038252602d81526020018061472a602d913960400191505060405180910390fd5b6000851180156140cd5750600084115b6141085760405162461bcd60e51b81526004018080602001828103825260298152602001806148806029913960400191505060405180910390fd5b6000876001600160a01b0316630cf6ee846141248a87876133c6565b6040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561416157600080fd5b505afa158015614175573d6000803e3d6000fd5b505050506040513d602081101561418b57600080fd5b50516040805163d73792a960e01b81529051919250600091614214916001600160a01b038c169163d73792a991600480820192602092909190829003018186803b1580156141d857600080fd5b505afa1580156141ec573d6000803e3d6000fd5b505050506040513d602081101561420257600080fd5b505161420e898b614676565b90614676565b90506000614262614258848c6001600160a01b031663d73792a96040518163ffffffff1660e01b815260040160206040518083038186803b15801561182557600080fd5b61420e898c613ca9565b9050614279600182848161427257fe5b04906146cf565b9a9950505050505050505050565b60008060006001600160a01b03167f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663e6a439058a8a6040518363ffffffff1660e01b815260040180836001600160a01b03168152602001826001600160a01b031681526020019250505060206040518083038186803b15801561431357600080fd5b505afa158015614327573d6000803e3d6000fd5b505050506040513d602081101561433d57600080fd5b50516001600160a01b031614156143fb577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663c9c6539689896040518363ffffffff1660e01b815260040180836001600160a01b03168152602001826001600160a01b0316815260200192505050602060405180830381600087803b1580156143ce57600080fd5b505af11580156143e2573d6000803e3d6000fd5b505050506040513d60208110156143f857600080fd5b50505b6000806144297f00000000000000000000000000000000000000000000000000000000000000008b8b614518565b9150915081600014801561443b575080155b1561444b5787935086925061450b565b6000614458898484613ef9565b90508781116144ab57858110156144a05760405162461bcd60e51b81526004018080602001828103825260278152602001806148596027913960400191505060405180910390fd5b889450925082614509565b60006144b8898486613ef9565b9050898111156144c457fe5b878110156145035760405162461bcd60e51b815260040180806020018281038252602781526020018061477d6027913960400191505060405180910390fd5b94508793505b505b5050965096945050505050565b60008060006145278585613f9f565b5090506000806145388888886133c6565b6001600160a01b0316630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b15801561457057600080fd5b505afa158015614584573d6000803e3d6000fd5b505050506040513d606081101561459a57600080fd5b5080516020909101516001600160701b0391821693501690506001600160a01b03878116908416146145cd5780826145d0565b81815b90999098509650505050505050565b6000818484111561466e5760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561463357818101518382015260200161461b565b50505050905090810190601f1680156146605780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b6000826146855750600061113c565b8282028284828161469257fe5b04146111395760405162461bcd60e51b81526004018080602001828103825260218152602001806148386021913960400191505060405180910390fd5b600082820183811015611139576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fdfe4f6f6c6f6e67537761704c6962726172793a20494e53554646494349454e545f4f55545055545f414d4f554e544f6f6c6f6e67537761704c6962726172793a204944454e544943414c5f4144445245535345534f6f6c6f6e6753776170526f757465723a20494e53554646494349454e545f415f414d4f554e544f6f6c6f6e6753776170526f757465723a204558434553534956455f494e5055545f414d4f554e544f6f6c6f6e67537761704c6962726172793a20494e53554646494349454e545f494e5055545f414d4f554e544f6f6c6f6e6753776170526f757465723a20494e56414c49445f5041544800004f6f6c6f6e6753776170526f757465723a204558504952454400000000000000536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f774f6f6c6f6e6753776170526f757465723a20494e53554646494349454e545f425f414d4f554e544f6f6c6f6e67537761704c6962726172793a20494e53554646494349454e545f4c49515549444954595472616e7366657248656c7065723a204554485f5452414e534645525f4641494c45444f6f6c6f6e6753776170526f757465723a20494e53554646494349454e545f4f55545055545f414d4f554e545472616e7366657248656c7065723a205452414e534645525f46524f4d5f4641494c45444f6f6c6f6e67537761704c6962726172793a20494e53554646494349454e545f414d4f554e54a26469706673582212208e31ab5c8c63b0d4bdb176cf3f4bcde8a1d71e95d4af8f01ec35c62e07cf58f864736f6c634300060c00330000000000000000000000007ddaf116889d655d1c486beb95017a8211265d29000000000000000000000000deaddeaddeaddeaddeaddeaddeaddeaddead0000

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

0000000000000000000000007ddaf116889d655d1c486beb95017a8211265d29000000000000000000000000deaddeaddeaddeaddeaddeaddeaddeaddead0000

-----Decoded View---------------
Arg [0] : _factory (address): 0x7ddaf116889d655d1c486beb95017a8211265d29
Arg [1] : _WETH (address): 0xdeaddeaddeaddeaddeaddeaddeaddeaddead0000

-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 0000000000000000000000007ddaf116889d655d1c486beb95017a8211265d29
Arg [1] : 000000000000000000000000deaddeaddeaddeaddeaddeaddeaddeaddead0000


Deployed ByteCode Sourcemap

20904:18780:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21389:10;-1:-1:-1;;;;;21403:4:0;21389:18;;21382:26;;;;20904:18780;;;;;25560:673;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;25560:673:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;32765:854;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;32765:854:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;32765:854:0;;;;;;;;;;;;-1:-1:-1;32765:854:0;-1:-1:-1;;;;;;32765:854:0;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39427:254;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;39427:254:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;39427:254:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;39427:254:0;;-1:-1:-1;39427:254:0;;-1:-1:-1;;;;;39427:254:0:i;26241:679::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;26241:679:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;29962:631::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;29962:631:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;29962:631:0;;;;;;;;;;;;-1:-1:-1;29962:631:0;-1:-1:-1;;;;;;29962:631:0;;;;;;;;:::i;31925:832::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;31925:832:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;31925:832:0;;;;;;;;;;;;-1:-1:-1;31925:832:0;-1:-1:-1;;;;;;31925:832:0;;;;;;;;:::i;28386:720::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;28386:720:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;35838:716;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;35838:716:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;35838:716:0;;;;;;;;;;;;-1:-1:-1;35838:716:0;-1:-1:-1;;;;;;35838:716:0;;;;;;;;:::i;37423:846::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;37423:846:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;37423:846:0;;;;;;;;;;;;-1:-1:-1;37423:846:0;-1:-1:-1;;;;;;37423:846:0;;;;;;;;:::i;31216:701::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;31216:701:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;31216:701:0;;;;;;;;;;;;-1:-1:-1;31216:701:0;-1:-1:-1;;;;;;31216:701:0;;;;;;;;:::i;30599:609::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;30599:609:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;30599:609:0;;;;;;;;;;;;-1:-1:-1;30599:609:0;-1:-1:-1;;;;;;30599:609:0;;;;;;;;:::i;38510:320::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;38510:320:0;;;;;;;;;;;;;-1:-1:-1;;;;;38510:320:0;;;;;;;;;;;;:::i;21042:38::-;;;;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;21042:38:0;;;;;;;;;;;;;;38313:189;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;38313:189:0;;;;;;;;;;;;:::i;27678:700::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;27678:700:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;36562:853::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;36562:853:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;36562:853:0;;;;;;;;;;;;-1:-1:-1;36562:853:0;-1:-1:-1;;;;;;36562:853:0;;;;;;;;:::i;24681:871::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;24681:871:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;20994:41::-;;;;;;;;;;;;;:::i;38838:319::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;38838:319:0;;;;;;;;;;;;;-1:-1:-1;;;;;38838:319:0;;;;;;;;;;;;:::i;39165:254::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;39165:254:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;39165:254:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;39165:254:0;;-1:-1:-1;39165:254:0;;-1:-1:-1;;;;;39165:254:0:i;26928:671::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;26928:671:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;22914:740::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;22914:740:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;23662:976;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;23662:976:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;33627:814::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;33627:814:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;33627:814:0;;;;;;;;;;;;-1:-1:-1;33627:814:0;-1:-1:-1;;;;;;33627:814:0;;;;;;;;:::i;25560:673::-;25797:16;25815:14;25778:8;21151:15;21139:8;:27;;21131:65;;;;;-1:-1:-1;;;21131:65:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;21131:65:0;;;;;;;;;;;;;;;25869:196:::1;25899:5;25919:4;25938:9;25962:14;25991:12;26026:4;26046:8;25869:15;:196::i;:::-;25842:223:::0;;-1:-1:-1;25842:223:0;-1:-1:-1;26076:51:0::1;26104:5:::0;26111:2;25842:223;26076:27:::1;:51::i;:::-;26144:4;-1:-1:-1::0;;;;;26138:20:0::1;;26159:9;26138:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;26180:45;26211:2;26215:9;26180:30;:45::i;:::-;25560:673:::0;;;;;;;;;;:::o;32765:854::-;32979:21;32951:8;21151:15;21139:8;:27;;21131:65;;;;;-1:-1:-1;;;21131:65:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;21131:65:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;33051:4:0::1;33026:29;:4:::0;;-1:-1:-1;;33031:15:0;;33026:21;;::::1;;;;;;;;;;;-1:-1:-1::0;;;;;33026:21:0::1;-1:-1:-1::0;;;;;33026:29:0::1;;33018:72;;;::::0;;-1:-1:-1;;;33018:72:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;;;;;;;;;33018:72:0;;;;;;;;;;;;;::::1;;33111:56;33143:7;33152:8;33162:4;;33111:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;33111:31:0::1;::::0;-1:-1:-1;;;33111:56:0:i:1;:::-;33101:66;;33217:12;33186:7;33211:1;33194:7;:14;:18;33186:27;;;;;;;;;;;;;;:43;;33178:100;;;;-1:-1:-1::0;;;33178:100:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33289:142;33335:4;;33340:1;33335:7;;;;;;;;;;;;;-1:-1:-1::0;;;;;33335:7:0::1;33344:10;33356:52;33382:7;33391:4;;33396:1;33391:7;;;;;;;;;;;;;-1:-1:-1::0;;;;;33391:7:0::1;33400:4;;33405:1;33400:7;;;;;;;;;;;;;-1:-1:-1::0;;;;;33400:7:0::1;33356:25;:52::i;:::-;33410:7;33418:1;33410:10;;;;;;;;;;;;;;33289:31;:142::i;:::-;33442:35;33448:7;33457:4;;33442:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;33471:4:0::1;::::0;-1:-1:-1;33442:5:0::1;::::0;-1:-1:-1;;33442:35:0:i:1;:::-;33494:4;-1:-1:-1::0;;;;;33488:20:0::1;;33509:7;33534:1;33517:7;:14;:18;33509:27;;;;;;;;;;;;;;33488:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;33548:63;33579:2;33583:7;33608:1;33591:7;:14;:18;33583:27;;;;;;;;;;;;;;33548:30;:63::i;:::-;32765:854:::0;;;;;;;;;:::o;39427:254::-;39571:21;39617:56;39648:7;39657:9;39668:4;39617:30;:56::i;:::-;39610:63;;39427:254;;;;;:::o;26241:679::-;26547:12;26561;26586;26601:50;26627:7;26636:6;26644;26601:25;:50::i;:::-;26586:65;;26662:10;26675;:33;;26699:9;26675:33;;;-1:-1:-1;;26675:33:0;26719:81;;;-1:-1:-1;;;26719:81:0;;26748:10;26719:81;;;;26768:4;26719:81;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26662:46;;-1:-1:-1;;;;;;26719:28:0;;;;;:81;;;;;-1:-1:-1;;26719:81:0;;;;;;;;-1:-1:-1;26719:28:0;:81;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26832:80;26848:6;26856;26864:9;26875:10;26887;26899:2;26903:8;26832:15;:80::i;:::-;26811:101;;;;;;;;26241:679;;;;;;;;;;;;;;;;:::o;29962:631::-;30186:21;30167:8;21151:15;21139:8;:27;;21131:65;;;;;-1:-1:-1;;;21131:65:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;21131:65:0;;;;;;;;;;;;;;;30230:56:::1;30262:7;30271:8;30281:4;;30230:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;30230:31:0::1;::::0;-1:-1:-1;;;30230:56:0:i:1;:::-;30220:66;;30336:12;30305:7;30330:1;30313:7;:14;:18;30305:27;;;;;;;;;;;;;;:43;;30297:100;;;;-1:-1:-1::0;;;30297:100:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30408:142;30454:4;;30459:1;30454:7;;;;;;30408:142;30561:24;30567:7;30576:4;;30561:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;30582:2:0;;-1:-1:-1;30561:5:0::1;::::0;-1:-1:-1;;30561:24:0:i:1;31925:832::-:0;32139:21;32111:8;21151:15;21139:8;:27;;21131:65;;;;;-1:-1:-1;;;21131:65:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;21131:65:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;32211:4:0::1;32186:29;:4:::0;;-1:-1:-1;;32191:15:0;;32186:21;;::::1;;;;;;;;;;;-1:-1:-1::0;;;;;32186:21:0::1;-1:-1:-1::0;;;;;32186:29:0::1;;32178:72;;;::::0;;-1:-1:-1;;;32178:72:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;;;;;;;;;32178:72:0;;;;;;;;;;;;;::::1;;32271:56;32302:7;32311:9;32322:4;;32271:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;32271:30:0::1;::::0;-1:-1:-1;;;32271:56:0:i:1;:::-;32261:66;;32360:11;32346:7;32354:1;32346:10;;;;;;;;;;;;;;:25;;32338:78;;;;-1:-1:-1::0;;;32338:78:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28386:720:::0;28704:14;28731:12;28746:47;28772:7;28781:5;28788:4;28746:25;:47::i;:::-;28731:62;;28804:10;28817;:33;;28841:9;28817:33;;;-1:-1:-1;;28817:33:0;28861:81;;;-1:-1:-1;;;28861:81:0;;28890:10;28861:81;;;;28910:4;28861:81;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28804:46;;-1:-1:-1;;;;;;28861:28:0;;;;;:81;;;;;-1:-1:-1;;28861:81:0;;;;;;;;-1:-1:-1;28861:28:0;:81;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28965:133;29027:5;29034:9;29045:14;29061:12;29075:2;29079:8;28965:47;:133::i;:::-;28953:145;28386:720;-1:-1:-1;;;;;;;;;;;;;28386:720:0:o;35838:716::-;36072:8;21151:15;21139:8;:27;;21131:65;;;;;-1:-1:-1;;;21131:65:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;21131:65:0;;;;;;;;;;;;;;;36093:140:::1;36139:4;;36144:1;36139:7;;;;;;;;;;;;;-1:-1:-1::0;;;;;36139:7:0::1;36148:10;36160:52;36186:7;36195:4;;36200:1;36195:7;;;;;;;;;;;;;-1:-1:-1::0;;;;;36195:7:0::1;36204:4;;36209:1;36204:7;;;;;;36160:52;36214:8;36093:31;:140::i;:::-;36244:18;36272:4:::0;;-1:-1:-1;;36277:15:0;;36272:21;;::::1;;;;;;;;;;;-1:-1:-1::0;;;;;36272:21:0::1;-1:-1:-1::0;;;;;36265:39:0::1;;36305:2;36265:43;;;;;;;;;;;;;-1:-1:-1::0;;;;;36265:43:0::1;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;36265:43:0;36319:44:::1;::::0;;36265:43:::1;36319:44:::0;;::::1;::::0;;;;;;;;;;;36265:43;;-1:-1:-1;36319:44:0::1;::::0;;;36354:4;;;;;;36319:44;::::1;::::0;36354:4;;36319:44;36354:4;36319:44;::::1;;::::0;::::1;::::0;;;;-1:-1:-1;36360:2:0;;-1:-1:-1;36319:34:0::1;::::0;-1:-1:-1;;36319:44:0:i:1;:::-;36462:12:::0;36396:62:::1;36444:13:::0;36403:4;;-1:-1:-1;;36408:15:0;;36403:21;;::::1;;;;;;;;;;;-1:-1:-1::0;;;;;36403:21:0::1;-1:-1:-1::0;;;;;36396:39:0::1;;36436:2;36396:43;;;;;;;;;;;;;-1:-1:-1::0;;;;;36396:43:0::1;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;36396:43:0;;:47:::1;:62::i;:::-;:78;;36374:172;;;;-1:-1:-1::0;;;36374:172:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21207:1;35838:716:::0;;;;;;;:::o;37423:846::-;37690:8;21151:15;21139:8;:27;;21131:65;;;;;-1:-1:-1;;;21131:65:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;21131:65:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;37749:4:0::1;37724:29;:4:::0;;-1:-1:-1;;37729:15:0;;37724:21;;::::1;;;;;;;;;;;-1:-1:-1::0;;;;;37724:21:0::1;-1:-1:-1::0;;;;;37724:29:0::1;;37716:72;;;::::0;;-1:-1:-1;;;37716:72:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;;;;;;;;;37716:72:0;;;;;;;;;;;;;::::1;;37799:140;37845:4;;37850:1;37845:7;;;;;;37799:140;37950:55;37985:4;;37950:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;37999:4:0::1;::::0;-1:-1:-1;37950:34:0::1;::::0;-1:-1:-1;;37950:55:0:i:1;:::-;38016:14;38040:4;-1:-1:-1::0;;;;;38033:22:0::1;;38064:4;38033:37;;;;;;;;;;;;;-1:-1:-1::0;;;;;38033:37:0::1;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;38033:37:0;;-1:-1:-1;38089:25:0;;::::1;;38081:82;;;;-1:-1:-1::0;;;38081:82:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38180:4;-1:-1:-1::0;;;;;38174:20:0::1;;38195:9;38174:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;38216:45;38247:2;38251:9;38216:30;:45::i;31216:701::-:0;31432:21;31404:8;21151:15;21139:8;:27;;21131:65;;;;;-1:-1:-1;;;21131:65:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;21131:65:0;;;;;;;;;;;;;;;31490:4:::1;-1:-1:-1::0;;;;;31479:15:0::1;:4;;31484:1;31479:7;;;;;;;;;;;;;-1:-1:-1::0;;;;;31479:7:0::1;-1:-1:-1::0;;;;;31479:15:0::1;;31471:58;;;::::0;;-1:-1:-1;;;31471:58:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;;;;;;;;;31471:58:0;;;;;;;;;;;;;::::1;;31550:57;31582:7;31591:9;31602:4;;31550:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;31550:31:0::1;::::0;-1:-1:-1;;;31550:57:0:i:1;:::-;31540:67;;31657:12;31626:7;31651:1;31634:7;:14;:18;31626:27;;;;;;;;;;;;;;:43;;31618:100;;;;-1:-1:-1::0;;;31618:100:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31735:4;-1:-1:-1::0;;;;;31729:19:0::1;;31756:7;31764:1;31756:10;;;;;;;;;;;;;;31729:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;31793:4;-1:-1:-1::0;;;;;31787:20:0::1;;31808:52;31834:7;31843:4;;31848:1;31843:7;;;;;;31808:52;31862:7;31870:1;31862:10;;;;;;;;;;;;;;31787:86;;;;;;;;;;;;;-1:-1:-1::0;;;;;31787:86:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;31787:86:0;31780:94:::1;;;;31885:24;31891:7;31900:4;;31885:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;31906:2:0;;-1:-1:-1;31885:5:0::1;::::0;-1:-1:-1;;31885:24:0:i:1;:::-;31216:701:::0;;;;;;;;:::o;30599:609::-;30823:21;30804:8;21151:15;21139:8;:27;;21131:65;;;;;-1:-1:-1;;;21131:65:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;21131:65:0;;;;;;;;;;;;;;;30867:56:::1;30898:7;30907:9;30918:4;;30867:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;30867:30:0::1;::::0;-1:-1:-1;;;30867:56:0:i:1;:::-;30857:66;;30956:11;30942:7;30950:1;30942:10;;;;;;;;;;;;;;:25;;30934:78;;;;-1:-1:-1::0;;;30934:78:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38510:320:::0;38695:14;38734:88;38765:7;38774:8;38784:9;38795:10;38807:6;38815;38734:30;:88::i;:::-;38727:95;38510:320;-1:-1:-1;;;;;;38510:320:0:o;21042:38::-;;;:::o;38313:189::-;38410:12;38442:52;38466:7;38475:8;38485;38442:23;:52::i;:::-;38435:59;38313:189;-1:-1:-1;;;;38313:189:0:o;27678:700::-;27944:14;27925:8;21151:15;21139:8;:27;;21131:65;;;;;-1:-1:-1;;;21131:65:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;21131:65:0;;;;;;;;;;;;;;;27987:196:::1;28017:5;28037:4;28056:9;28080:14;28109:12;28144:4;28164:8;27987:15;:196::i;:::-;27971:212;;;;;;28194:78;28222:5;28229:2;28240:5;-1:-1:-1::0;;;;;28233:23:0::1;;28265:4;28233:38;;;;;;;;;;;;;-1:-1:-1::0;;;;;28233:38:0::1;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;28233:38:0;28194:27:::1;:78::i;:::-;28289:4;-1:-1:-1::0;;;;;28283:20:0::1;;28304:9;28283:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;28325:45;28356:2;28360:9;28325:30;:45::i;36562:853::-:0;36822:8;21151:15;21139:8;:27;;21131:65;;;;;-1:-1:-1;;;21131:65:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;21131:65:0;;;;;;;;;;;;;;;36867:4:::1;-1:-1:-1::0;;;;;36856:15:0::1;:4;;36861:1;36856:7;;;;;;;;;;;;;-1:-1:-1::0;;;;;36856:7:0::1;-1:-1:-1::0;;;;;36856:15:0::1;;36848:58;;;::::0;;-1:-1:-1;;;36848:58:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;;;;;;;;;36848:58:0;;;;;;;;;;;;;::::1;;36917:13;36933:9;36917:25;;36959:4;-1:-1:-1::0;;;;;36953:19:0::1;;36980:8;36953:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;37015:4;-1:-1:-1::0;;;;;37009:20:0::1;;37030:52;37056:7;37065:4;;37070:1;37065:7;;;;;;37030:52;37084:8;37009:84;;;;;;;;;;;;;-1:-1:-1::0;;;;;37009:84:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;37009:84:0;37002:92:::1;;;;37105:18;37133:4:::0;;-1:-1:-1;;37138:15:0;;37133:21;;::::1;;;;;;;;;;;-1:-1:-1::0;;;;;37133:21:0::1;-1:-1:-1::0;;;;;37126:39:0::1;;37166:2;37126:43;;;;;;;;;;;;;-1:-1:-1::0;;;;;37126:43:0::1;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;37126:43:0;37180:44:::1;::::0;;37126:43:::1;37180:44:::0;;::::1;::::0;;;;;;;;;;;37126:43;;-1:-1:-1;37180:44:0::1;::::0;;;37215:4;;;;;;37180:44;::::1;::::0;37215:4;;37180:44;37215:4;37180:44;::::1;;::::0;::::1;::::0;;;;-1:-1:-1;37221:2:0;;-1:-1:-1;37180:34:0::1;::::0;-1:-1:-1;;37180:44:0:i:1;:::-;37323:12:::0;37257:62:::1;37305:13:::0;37264:4;;-1:-1:-1;;37269:15:0;;37264:21;;::::1;;;;;;;;;;;-1:-1:-1::0;;;;;37264:21:0::1;-1:-1:-1::0;;;;;37257:39:0::1;;37297:2;37257:43;;;;;;;;;;;;;-1:-1:-1::0;;;;;37257:43:0::1;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;24681:871:::0;24935:12;24949;24916:8;21151:15;21139:8;:27;;21131:65;;;;;-1:-1:-1;;;21131:65:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;21131:65:0;;;;;;;;;;;;;;;24974:12:::1;24989:50;25015:7;25024:6;25032;24989:25;:50::i;:::-;25050:63;::::0;;-1:-1:-1;;;25050:63:0;;25085:10:::1;25050:63;::::0;::::1;::::0;-1:-1:-1;;;;;25050:34:0;::::1;:63:::0;;;;;;;;;;;;;;24974:65;;-1:-1:-1;25050:34:0;;::::1;::::0;:63;;;;;::::1;::::0;;;;;;;;;-1:-1:-1;25050:34:0;:63;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;;25181:30:0::1;::::0;;-1:-1:-1;;;25181:30:0;;-1:-1:-1;;;;;25181:30:0;;::::1;;::::0;::::1;::::0;;;25151:12:::1;::::0;;;25181:26;;::::1;::::0;::::1;::::0;:30;;;;;;;;;;;25151:12;25181:26;:30;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;25181:30:0;;::::1;::::0;;::::1;::::0;;;-1:-1:-1;25181:30:0;-1:-1:-1;25223:14:0::1;25242:44;25271:6:::0;25279;25242:28:::1;:44::i;:::-;25222:64;;;25328:6;-1:-1:-1::0;;;;;25318:16:0::1;:6;-1:-1:-1::0;;;;;25318:16:0::1;;:58;;25359:7;25368;25318:58;;;25338:7;25347;25318:58;25297:79:::0;;-1:-1:-1;25297:79:0;-1:-1:-1;25395:21:0;;::::1;;25387:73;;;;-1:-1:-1::0;;;25387:73:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25490:10;25479:7;:21;;25471:73;;;;-1:-1:-1::0;;;25471:73:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21207:1;;;;24681:871:::0;;;;;;;;;;;:::o;20994:41::-;;;:::o;38838:319::-;39023:13;39061:88;39091:7;39100:9;39111;39122:10;39134:6;39142;39061:29;:88::i;39165:254::-;39309:21;39355:56;39387:7;39396:8;39406:4;39355:31;:56::i;26928:671::-;27217:16;27235:14;27262:12;27277:47;27303:7;27312:5;27319:4;27277:25;:47::i;:::-;27262:62;;27335:10;27348;:33;;27372:9;27348:33;;;-1:-1:-1;;27348:33:0;27392:81;;;-1:-1:-1;;;27392:81:0;;27421:10;27392:81;;;;27441:4;27392:81;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27335:46;;-1:-1:-1;;;;;;27392:28:0;;;;;:81;;;;;-1:-1:-1;;27392:81:0;;;;;;;;-1:-1:-1;27392:28:0;:81;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27511:80;27530:5;27537:9;27548:14;27564:12;27578:2;27582:8;27511:18;:80::i;:::-;27484:107;;;;-1:-1:-1;26928:671:0;-1:-1:-1;;;;;;;;;;;;;26928:671:0:o;22914:740::-;23202:12;23216;23230:14;23183:8;21151:15;21139:8;:27;;21131:65;;;;;-1:-1:-1;;;21131:65:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;21131:65:0;;;;;;;;;;;;;;;23278:85:::1;23292:6;23300;23308:14;23324;23340:10;23352;23278:13;:85::i;:::-;23257:106:::0;;-1:-1:-1;23257:106:0;-1:-1:-1;23374:12:0::1;23389:50;23415:7;23424:6:::0;23432;23389:25:::1;:50::i;:::-;23374:65;;23450:66;23482:6;23490:10;23502:4;23508:7;23450:31;:66::i;:::-;23527;23559:6;23567:10;23579:4;23585:7;23527:31;:66::i;:::-;23632:4;-1:-1:-1::0;;;;;23616:26:0::1;;23643:2;23616:30;;;;;;;;;;;;;-1:-1:-1::0;;;;;23616:30:0::1;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;23616:30:0;22914:740;;;;-1:-1:-1;23616:30:0;;-1:-1:-1;22914:740:0;;-1:-1:-1;;;;;;;;;22914:740:0:o;23662:976::-;23915:16;23933:14;23949;23896:8;21151:15;21139:8;:27;;21131:65;;;;;-1:-1:-1;;;21131:65:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;21131:65:0;;;;;;;;;;;;;;;24003:176:::1;24031:5;24051:4;24070:18;24103:9;24127:14;24156:12;24003:13;:176::i;:::-;23976:203:::0;;-1:-1:-1;23976:203:0;-1:-1:-1;24190:12:0::1;24205:47;24231:7;24240:5:::0;24247:4:::1;24205:25;:47::i;:::-;24190:62;;24263:69;24295:5;24302:10;24314:4;24320:11;24263:31;:69::i;:::-;24349:4;-1:-1:-1::0;;;;;24343:19:0::1;;24370:9;24343:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;24406:4;-1:-1:-1::0;;;;;24400:20:0::1;;24421:4;24427:9;24400:37;;;;;;;;;;;;;-1:-1:-1::0;;;;;24400:37:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;24400:37:0;24393:45:::1;;;;24477:4;-1:-1:-1::0;;;;;24461:26:0::1;;24488:2;24461:30;;;;;;;;;;;;;-1:-1:-1::0;;;;;24461:30:0::1;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;24461:30:0;;-1:-1:-1;24542:9:0::1;:21:::0;-1:-1:-1;24538:92:0::1;;;24565:65;24596:10;24620:9;24608;:21;24565:30;:65::i;:::-;21207:1;23662:976:::0;;;;;;;;;;;:::o;33627:814::-;33840:21;33812:8;21151:15;21139:8;:27;;21131:65;;;;;-1:-1:-1;;;21131:65:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;21131:65:0;;;;;;;;;;;;;;;33898:4:::1;-1:-1:-1::0;;;;;33887:15:0::1;:4;;33892:1;33887:7;;;;;;;;;;;;;-1:-1:-1::0;;;;;33887:7:0::1;-1:-1:-1::0;;;;;33887:15:0::1;;33879:58;;;::::0;;-1:-1:-1;;;33879:58:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;;;;;;;;;33879:58:0;;;;;;;;;;;;;::::1;;33958:56;33989:7;33998:9;34009:4;;33958:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;33958:30:0::1;::::0;-1:-1:-1;;;33958:56:0:i:1;:::-;33948:66;;34047:9;34033:7;34041:1;34033:10;;;;;;;;;;;;;;:23;;34025:76;;;;-1:-1:-1::0;;;34025:76:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34118:4;-1:-1:-1::0;;;;;34112:19:0::1;;34139:7;34147:1;34139:10;;;;;;;;;;;;;;34112:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;34176:4;-1:-1:-1::0;;;;;34170:20:0::1;;34191:52;34217:7;34226:4;;34231:1;34226:7;;;;;;34191:52;34245:7;34253:1;34245:10;;;;;;;;;;;;;;34170:86;;;;;;;;;;;;;-1:-1:-1::0;;;;;34170:86:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;34170:86:0;34163:94:::1;;;;34268:24;34274:7;34283:4;;34268:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;34289:2:0;;-1:-1:-1;34268:5:0::1;::::0;-1:-1:-1;;34268:24:0:i:1;:::-;34355:7;34363:1;34355:10;;;;;;;;;;;;;;34343:9;:22;34339:94;;;34367:66;34398:10;34422:7;34430:1;34422:10;;;;;;;;;;;;;;34410:9;:22;34367:30;:66::i;13579:361::-:0;13774:45;;;-1:-1:-1;;;;;13774:45:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;13774:45:0;-1:-1:-1;;;13774:45:0;;;13763:57;;;;13728:12;;13742:17;;13763:10;;;;13774:45;13763:57;;;13774:45;13763:57;;13774:45;13763:57;;;;;;;;;;-1:-1:-1;;13763:57:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13727:93;;;;13839:7;:57;;;;-1:-1:-1;13851:11:0;;:16;;:44;;;13882:4;13871:24;;;;;;;;;;;;;;;-1:-1:-1;13871:24:0;13851:44;13831:101;;;;;-1:-1:-1;;;13831:101:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;13579:361;;;;;:::o;14358:195::-;14466:12;;;14428;14466;;;;;;;;;-1:-1:-1;;;;;14445:7:0;;;14459:5;;14445:34;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;14445:34:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14427:52;;;14498:7;14490:55;;;;-1:-1:-1;;;14490:55:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14358:195;;;:::o;11798:543::-;11899:21;11956:1;11941:4;:11;:16;;11933:60;;;;;-1:-1:-1;;;11933:60:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;12025:4;:11;12014:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;12014:23:0;;12004:33;;12061:8;12048:7;12056:1;12048:10;;;;;;;;;;;;;:21;;;;;12085:6;12080:254;12111:1;12097:4;:11;:15;12093:1;:19;12080:254;;;12135:14;12151:15;12170:42;12182:7;12191:4;12196:1;12191:7;;;;;;;;;;;;;;12200:4;12205:1;12209;12205:5;12200:11;;;;;;;;;;;;;;12170;:42::i;:::-;12134:78;;;;12244;12257:7;12266;12274:1;12266:10;;;;;;;;;;;;;;12278:9;12289:10;12301:4;12306:1;12301:7;;;;;;;;;;;;;;12310:4;12315:1;12319;12315:5;12310:11;;;;;;;;;;;;;;12244:12;:78::i;:::-;12227:7;12235:1;12239;12235:5;12227:14;;;;;;;;;;;;;;;;;:95;-1:-1:-1;;12114:3:0;;12080:254;;;;11798:543;;;;;:::o;8609:509::-;8698:12;8724:14;8740;8758:26;8769:6;8777;8758:10;:26::i;:::-;8922:32;;;-1:-1:-1;;8922:32:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8912:43;;;;;;-1:-1:-1;;;;;;8825:282:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8815:293;;;;;;;;;8609:509;-1:-1:-1;;;;;8609:509:0:o;13948:402::-;14173:51;;;-1:-1:-1;;;;;14173:51:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;14173:51:0;-1:-1:-1;;;14173:51:0;;;14162:63;;;;14127:12;;14141:17;;14162:10;;;;14173:51;14162:63;;;14173:51;14162:63;;14173:51;14162:63;;;;;;;;;;-1:-1:-1;;14162:63:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14126:99;;;;14244:7;:57;;;;-1:-1:-1;14256:11:0;;:16;;:44;;;14287:4;14276:24;;;;;;;;;;;;;;;-1:-1:-1;14276:24:0;14256:44;14236:106;;;;-1:-1:-1;;;14236:106:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13948:402;;;;;;:::o;29217:739::-;29324:6;29319:630;29350:1;29336:4;:11;:15;29332:1;:19;29319:630;;;29374:13;29389:14;29408:4;29413:1;29408:7;;;;;;;;;;;;;;29417:4;29422:1;29426;29422:5;29417:11;;;;;;;;;;;;;;29373:56;;;;29445:14;29464:43;29493:5;29500:6;29464:28;:43::i;:::-;29444:63;;;29522:14;29539:7;29547:1;29551;29547:5;29539:14;;;;;;;;;;;;;;29522:31;;29569:15;29586;29614:6;-1:-1:-1;;;;;29605:15:0;:5;-1:-1:-1;;;;;29605:15:0;;:61;;29647:9;29663:1;29605:61;;;29629:1;29633:9;29605:61;29568:98;;;;29681:10;29712:1;29698:4;:11;:15;29694:1;:19;:83;;29774:3;29694:83;;;29716:55;29742:7;29751:6;29759:4;29764:1;29768;29764:5;29759:11;;;;;;;;;;;;;;29716:25;:55::i;:::-;29681:96;;29808:49;29834:7;29843:5;29850:6;29808:25;:49::i;:::-;-1:-1:-1;;;;;29792:71:0;;29882:10;29894;29906:2;29920:1;29910:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;29910:12:0;;29792:145;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;29792:145:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;29353:3:0;;;;;-1:-1:-1;29319:630:0;;-1:-1:-1;;;;;;;;29319:630:0;;;29217:739;;;:::o;12422:564::-;12523:21;12580:1;12565:4;:11;:16;;12557:60;;;;;-1:-1:-1;;;12557:60:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;12649:4;:11;12638:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;12638:23:0;;12628:33;;12702:9;12672:7;12697:1;12680:7;:14;:18;12672:27;;;;;;;;;;;;;;;;;:39;12736:11;;-1:-1:-1;;12736:15:0;12722:257;12753:5;;12722:257;;12781:14;12797:15;12816:42;12828:7;12837:4;12846:1;12842;:5;12837:11;;;;;;;;;;;;;;12850:4;12855:1;12850:7;;;;;;;12816:42;12780:78;;;;12890:77;12902:7;12911;12919:1;12911:10;;;;;;;;;;;;;;12923:9;12934:10;12946:4;12955:1;12951;:5;12946:11;;;;;;;;;;;;;;12959:4;12964:1;12959:7;;;;;;;;;;;;;;12890:11;:77::i;:::-;12873:7;12885:1;12881;:5;12873:14;;;;;;;;;;;;;;;;;:94;-1:-1:-1;;;;12760:3:0;12722:257;;34588:1244;34701:6;34696:1129;34727:1;34713:4;:11;:15;34709:1;:19;34696:1129;;;34751:13;34766:14;34785:4;34790:1;34785:7;;;;;;;;;;;;;;34794:4;34799:1;34803;34799:5;34794:11;;;;;;;;;;;;;;34750:56;;;;34822:14;34841:43;34870:5;34877:6;34841:28;:43::i;:::-;34821:63;;;34899:20;34938:49;34964:7;34973:5;34980:6;34938:25;:49::i;:::-;34899:89;;35003:16;35034:17;35122:13;35137;35155:4;-1:-1:-1;;;;;35155:16:0;;:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;35155:18:0;;;;;;;-1:-1:-1;;;;;35121:52:0;;;;-1:-1:-1;35121:52:0;;-1:-1:-1;35189:17:0;;-1:-1:-1;;;;;35230:15:0;;;;;;;:61;;35272:8;35282;35230:61;;;35249:8;35259;35230:61;35188:103;;;;35320:56;35363:12;35327:5;-1:-1:-1;;;;;35320:23:0;;35352:4;35320:38;;;;;;;;;;;;;-1:-1:-1;;;;;35320:38:0;;;;;;;;;;;;;;;;;;;;;;;;;;:56;35306:70;;35406:96;35437:7;35446:11;35459:12;35473:13;35488:5;35495:6;35406:30;:96::i;:::-;35391:111;;34696:1129;;;;35533:15;35550;35578:6;-1:-1:-1;;;;;35569:15:0;:5;-1:-1:-1;;;;;35569:15:0;;:67;;35614:12;35633:1;35569:67;;;35593:1;35597:12;35569:67;35532:104;;;;35651:10;35682:1;35668:4;:11;:15;35664:1;:19;:83;;35744:3;35664:83;;;35686:55;35712:7;35721:6;35729:4;35734:1;35738;35734:5;35729:11;;;;;;;35686:55;35800:12;;;35810:1;35800:12;;;;;;;;;;-1:-1:-1;;;35762:51:0;;;;;;;;;;;;;;-1:-1:-1;;;;;35762:51:0;;;;;;;;;;;;;;;;;;;;;;35651:96;;-1:-1:-1;35762:9:0;;;;;;35772:10;;35784;;35651:96;;35800:12;;35762:51;;;;;;;;35800:12;;35762:51;;;;35800:12;;35762:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;34730:3:0;;;;;-1:-1:-1;34696:1129:0;;-1:-1:-1;;;;;;;;;;34696:1129:0;5163:136;5221:7;5248:43;5252:1;5255;5248:43;;;;;;;;;;;;;;;;;:3;:43::i;10126:757::-;10268:14;10314:1;10303:8;:12;10295:69;;;;-1:-1:-1;;;10295:69:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10395:1;10383:9;:13;:31;;;;;10413:1;10400:10;:14;10383:31;10375:85;;;;-1:-1:-1;;;10375:85:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10471:11;10504:7;-1:-1:-1;;;;;10485:38:0;;10524:32;10532:7;10541:6;10549;10524:7;:32::i;:::-;10485:72;;;;;;;;;;;;;-1:-1:-1;;;;;10485:72:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;10485:72:0;10604:45;;;-1:-1:-1;;;10604:45:0;;;;10485:72;;-1:-1:-1;10568:20:0;;10591:68;;10604:54;;10485:72;;-1:-1:-1;;;;;10604:43:0;;;;;:45;;;;;10485:72;;10604:45;;;;;;;;:43;:45;;;;;;;;;;:54;10591:8;;:12;:68::i;:::-;10568:91;-1:-1:-1;10670:14:0;10687:31;10568:91;10707:10;10687:19;:31::i;:::-;10670:48;;10729:16;10748:81;10813:15;10748:60;10781:7;-1:-1:-1;;;;;10762:43:0;;:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;10762:45:0;10748:9;;:13;:60::i;:::-;:64;;:81::i;:::-;10729:100;;10864:11;10852:9;:23;;;;;;;10126:757;-1:-1:-1;;;;;;;;;;;10126:757:0:o;9681:323::-;9763:12;9806:1;9796:7;:11;9788:62;;;;-1:-1:-1;;;9788:62:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9880:1;9869:8;:12;:28;;;;;9896:1;9885:8;:12;9869:28;9861:82;;;;-1:-1:-1;;;9861:82:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9988:8;9964:21;:7;9976:8;9964:11;:21::i;:::-;:32;;;;;;;9681:323;-1:-1:-1;;;;9681:323:0:o;8166:351::-;8241:14;8257;8302:6;-1:-1:-1;;;;;8292:16:0;:6;-1:-1:-1;;;;;8292:16:0;;;8284:67;;;;-1:-1:-1;;;8284:67:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8390:6;-1:-1:-1;;;;;8381:15:0;:6;-1:-1:-1;;;;;8381:15:0;;:53;;8419:6;8427;8381:53;;;8400:6;8408;8381:53;8362:72;;-1:-1:-1;8362:72:0;-1:-1:-1;;;;;;8453:20:0;;8445:64;;;;;-1:-1:-1;;;8445:64:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;8166:351;;;;;:::o;11004:712::-;11146:13;11192:1;11180:9;:13;11172:71;;;;-1:-1:-1;;;11172:71:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11274:1;11262:9;:13;:31;;;;;11292:1;11279:10;:14;11262:31;11254:85;;;;-1:-1:-1;;;11254:85:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11350:11;11383:7;-1:-1:-1;;;;;11364:38:0;;11403:32;11411:7;11420:6;11428;11403:7;:32::i;:::-;11364:72;;;;;;;;;;;;;-1:-1:-1;;;;;11364:72:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;11364:72:0;11493:45;;;-1:-1:-1;;;11493:45:0;;;;11364:72;;-1:-1:-1;11447:14:0;;11464:75;;-1:-1:-1;;;;;11493:43:0;;;;;:45;;;;;11364:72;;11493:45;;;;;;;;:43;:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;11493:45:0;11464:24;:9;11478;11464:13;:24::i;:::-;:28;;:75::i;:::-;11447:92;;11550:16;11569:85;11599:54;11649:3;11618:7;-1:-1:-1;;;;;11599:43:0;;:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:54;11569:25;:10;11584:9;11569:14;:25::i;:85::-;11550:104;;11676:32;11706:1;11689:11;11677:9;:23;;;;;;;11676:29;:32::i;:::-;11665:43;11004:712;-1:-1:-1;;;;;;;;;;11004:712:0:o;21511:1397::-;21729:12;21743;21887:1;-1:-1:-1;;;;;21824:65:0;21843:7;-1:-1:-1;;;;;21824:35:0;;21860:6;21868;21824:51;;;;;;;;;;;;;-1:-1:-1;;;;;21824:51:0;;;;;;-1:-1:-1;;;;;21824:51:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;21824:51:0;-1:-1:-1;;;;;21824:65:0;;21820:152;;;21925:7;-1:-1:-1;;;;;21906:38:0;;21945:6;21953;21906:54;;;;;;;;;;;;;-1:-1:-1;;;;;21906:54:0;;;;;;-1:-1:-1;;;;;21906:54:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;21820:152:0;21983:13;21998;22015:54;22045:7;22054:6;22062;22015:29;:54::i;:::-;21982:87;;;;22084:8;22096:1;22084:13;:30;;;;-1:-1:-1;22101:13:0;;22084:30;22080:821;;;22153:14;;-1:-1:-1;22169:14:0;;-1:-1:-1;22080:821:0;;;22217:19;22239:59;22263:14;22279:8;22289;22239:23;:59::i;:::-;22217:81;;22335:14;22317;:32;22313:577;;22396:10;22378:14;:28;;22370:80;;;;-1:-1:-1;;;22370:80:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22491:14;;-1:-1:-1;22507:14:0;-1:-1:-1;22507:14:0;22313:577;;;22563:19;22585:59;22609:14;22625:8;22635;22585:23;:59::i;:::-;22563:81;;22688:14;22670;:32;;22663:40;;;;22748:10;22730:14;:28;;22722:80;;;;-1:-1:-1;;;22722:80:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22843:14;-1:-1:-1;22859:14:0;;-1:-1:-1;22313:577:0;22080:821;;21511:1397;;;;;;;;;;;:::o;9176:392::-;9269:13;9284;9311:14;9330:26;9341:6;9349;9330:10;:26::i;:::-;9310:46;;;9368:13;9383;9417:32;9425:7;9434:6;9442;9417:7;:32::i;:::-;-1:-1:-1;;;;;9401:61:0;;:63;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;9401:63:0;;;;;;;-1:-1:-1;;;;;9367:97:0;;;;-1:-1:-1;9367:97:0;;-1:-1:-1;;;;;;9498:16:0;;;;;;;:62;;9541:8;9551;9498:62;;;9518:8;9528;9498:62;9475:85;;;;-1:-1:-1;9176:392:0;-1:-1:-1;;;;;;;9176:392:0:o;5602:192::-;5688:7;5724:12;5716:6;;;;5708:29;;;;-1:-1:-1;;;5708:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;5760:5:0;;;5602:192::o;6053:471::-;6111:7;6356:6;6352:47;;-1:-1:-1;6386:1:0;6379:8;;6352:47;6423:5;;;6427:1;6423;:5;:1;6447:5;;;;;:10;6439:56;;;;-1:-1:-1;;;6439:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4699:181;4757:7;4789:5;;;4813:6;;;;4805:46;;;;;-1:-1:-1;;;4805:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;

Swarm Source

ipfs://8e31ab5c8c63b0d4bdb176cf3f4bcde8a1d71e95d4af8f01ec35c62e07cf58f8
Block Transaction Difficulty Gas Used Reward
Block Uncle Number Difficulty Gas Used Reward
Loading
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.