Contract 0xE11b93B61f6291d35c5a2beA0A9fF169080160cF 9

 
Txn Hash Method
Block
From
To
Value
0xb39841c950b43c2cb1cb82feee3019a793a2747f3f320c12b096c2b148126e28Swap Exact Token...132240652024-04-16 3:17:5720 mins ago0x67c5ca6b8967b13753d70521e97ac34492a82171 IN  0xe11b93b61f6291d35c5a2bea0a9ff169080160cf0 ETH0.0000058823260.029087499
0x3de13942bf7550879407bad4247dcfd84c5a73938a08335c53346855532d1068Swap Exact Token...132238462024-04-16 3:10:3927 mins ago0x0631fea3c82cd021b84459ce91576c94b57c0fcd IN  0xe11b93b61f6291d35c5a2bea0a9ff169080160cf0 ETH0.0000081367040.031517221
0x2a36b8998854ab907926ca87cfcd7e8a2ecdd818e58be80d1de4da749d78ba6cSwap Exact Token...132236372024-04-16 3:03:4134 mins ago0x68ec6b5038dcf1e00a6780b9031e978168298f82 IN  0xe11b93b61f6291d35c5a2bea0a9ff169080160cf0 ETH0.0000086949560.033001798
0x577267a514d2e8c6a43f4344625be8c5175497868a9887fea73c5a6543542399Swap Exact Token...132232352024-04-16 2:50:1747 mins ago0x0631fea3c82cd021b84459ce91576c94b57c0fcd IN  0xe11b93b61f6291d35c5a2bea0a9ff169080160cf0 ETH0.0000099018880.04068658
0xeb7efb541290e864e90ef7c7ae996c20d61710d0e6b9b074c4b1475d6da8721dSwap Exact Token...132219532024-04-16 2:07:331 hr 30 mins ago0x0631fea3c82cd021b84459ce91576c94b57c0fcd IN  0xe11b93b61f6291d35c5a2bea0a9ff169080160cf0 ETH0.0000083702360.032439644
0x7c6a5ba41d6bbc1c71b587815f7f3346484e33b378edd87a37b2c39e5654c1f2Swap Exact Token...132215882024-04-16 1:55:231 hr 42 mins ago0x0631fea3c82cd021b84459ce91576c94b57c0fcd IN  0xe11b93b61f6291d35c5a2bea0a9ff169080160cf0 ETH0.000007492840.03173446
0x61cbebe3c0c01a2076fcad48e74d37b2c4f87476cc45ffb1130d6aebddac1222Swap Exact Token...132210002024-04-16 1:35:472 hrs 2 mins ago0x0631fea3c82cd021b84459ce91576c94b57c0fcd IN  0xe11b93b61f6291d35c5a2bea0a9ff169080160cf0 ETH0.0000072566130.026513527
0xda8a56b62385a631feb5058d613b93dc3bf6d0c992501fedfedc24bde5c03982Swap Exact Token...132205452024-04-16 1:20:372 hrs 17 mins ago0x0631fea3c82cd021b84459ce91576c94b57c0fcd IN  0xe11b93b61f6291d35c5a2bea0a9ff169080160cf0 ETH0.0000051723630.021181618
0x068be6a849e61330621e5338365157d5943be94c987f0ac3e1b7ff0db959d62dSwap Exact Token...132193512024-04-16 0:40:492 hrs 57 mins ago0x0631fea3c82cd021b84459ce91576c94b57c0fcd IN  0xe11b93b61f6291d35c5a2bea0a9ff169080160cf0 ETH0.0000038770120.016372323
0x2521719e787d05cce504638801501a8904921df3a187b72d9468e5e991ee2285Swap Exact Token...132190112024-04-16 0:29:293 hrs 8 mins ago0x0631fea3c82cd021b84459ce91576c94b57c0fcd IN  0xe11b93b61f6291d35c5a2bea0a9ff169080160cf0 ETH0.0000044366870.017139032
0x7c5df5a9dc4c7091583a57e8de857a15b129d91065f8d07eeea9ed0206401f76Swap Exact Token...132180682024-04-15 23:58:033 hrs 40 mins ago0x0631fea3c82cd021b84459ce91576c94b57c0fcd IN  0xe11b93b61f6291d35c5a2bea0a9ff169080160cf0 ETH0.0000038743480.014943838
0x53a411e5c713e5277888c130827316141fea7f82360f83e68c1c4654db9a1317Swap Exact Token...132171862024-04-15 23:28:394 hrs 9 mins ago0x0631fea3c82cd021b84459ce91576c94b57c0fcd IN  0xe11b93b61f6291d35c5a2bea0a9ff169080160cf0 ETH0.0000030636780.017512561
0x18bbbf14f3b6c38dc3baf194a5bcd094946bef7cbb458616c2d994fb95ff5d68Swap Exact Token...132171172024-04-15 23:26:214 hrs 11 mins ago0x0631fea3c82cd021b84459ce91576c94b57c0fcd IN  0xe11b93b61f6291d35c5a2bea0a9ff169080160cf0 ETH0.0000045995720.017762132
0x954db6eb826af6c8eaedfcc0dcff7a4b1e1705a27eb9cae8ea40d5d62a21f357Swap Exact Token...132161792024-04-15 22:55:054 hrs 42 mins ago0x0631fea3c82cd021b84459ce91576c94b57c0fcd IN  0xe11b93b61f6291d35c5a2bea0a9ff169080160cf0 ETH0.0000056478970.020569152
0x75fc54a21180a04edb6059e62b8b19d43ddaf04caba39023e8f7d431c0a7c53dSwap Exact Token...132156012024-04-15 22:35:495 hrs 2 mins ago0x0631fea3c82cd021b84459ce91576c94b57c0fcd IN  0xe11b93b61f6291d35c5a2bea0a9ff169080160cf0 ETH0.0000053838770.022015249
0x0ef43bcce775d5826de7923efd8612915f68bb9f550d3032a21a37317a6b0e57Remove Liquidity132149002024-04-15 22:12:275 hrs 25 mins ago0x131fbae075ca53bd5a60075d08314e684cca2543 IN  0xe11b93b61f6291d35c5a2bea0a9ff169080160cf0 ETH0.0000061539480.027550807
0x8c5ab8ce43be26289600e553bdf38959642a03d8c79bbdf0fe3bdee5935398c5Swap Exact Token...132139792024-04-15 21:41:455 hrs 56 mins ago0x0631fea3c82cd021b84459ce91576c94b57c0fcd IN  0xe11b93b61f6291d35c5a2bea0a9ff169080160cf0 ETH0.0000125021590.04846303
0xa8316c7add90eb5e070064dacaff4127548e1d6b03c54c0a7d2660348bc8115fSwap Exact Token...132135792024-04-15 21:28:256 hrs 9 mins ago0x0631fea3c82cd021b84459ce91576c94b57c0fcd IN  0xe11b93b61f6291d35c5a2bea0a9ff169080160cf0 ETH0.0000103717770.059595182
0xd2c2200de33b8cf552f59b8785457bfabd6111c8c373151e445de70c4f3755bdSwap Exact Token...132135392024-04-15 21:27:056 hrs 10 mins ago0x0631fea3c82cd021b84459ce91576c94b57c0fcd IN  0xe11b93b61f6291d35c5a2bea0a9ff169080160cf0 ETH0.0000142383180.060344926
0x8f42abba7735b8471ff3c097d4a37b0d904238e1dbb0c006625e86226fa97785Swap Exact Token...132130422024-04-15 21:10:316 hrs 27 mins ago0x0631fea3c82cd021b84459ce91576c94b57c0fcd IN  0xe11b93b61f6291d35c5a2bea0a9ff169080160cf0 ETH0.0000221803090.086128734
0x2c754bd8ecc6f1b235e9412892739902896e671e48a60625150afe2aa082fbe0Swap Exact Token...132120962024-04-15 20:38:596 hrs 59 mins ago0x0631fea3c82cd021b84459ce91576c94b57c0fcd IN  0xe11b93b61f6291d35c5a2bea0a9ff169080160cf0 ETH0.0000325824930.126634875
0xebbdfe789df01169f4a529f4b354b703fcf99f127cb0c7c2d5919e4c66a67a98Swap Exact Token...132111592024-04-15 20:07:457 hrs 30 mins ago0x0631fea3c82cd021b84459ce91576c94b57c0fcd IN  0xe11b93b61f6291d35c5a2bea0a9ff169080160cf0 ETH0.0000307231160.112489076
0x2e19bd1446b096ef8c7dd7ee514ef31b3cb7ea8dc9c1095c25a7cc68f5615d7fSwap Exact Token...132104142024-04-15 19:42:557 hrs 55 mins ago0x9bb46e25b9701ef0674a068033b443434ab24596 IN  0xe11b93b61f6291d35c5a2bea0a9ff169080160cf0 ETH0.0005184308083.062499299
0xf951fbaaf85b0665c1b456c0dd01b30eceb2c9fca26d99ebc64c74ff3be1b443Swap Exact ETH F...132103962024-04-15 19:42:197 hrs 55 mins ago0x5b7f8c34125da55f969379a4c1a073a8eb3ef913 IN  0xe11b93b61f6291d35c5a2bea0a9ff169080160cf0.0277 ETH0.0000109213070.063779419
0x05ae55af32d31bc5aa2a139d5231873677a96ecf79f22e19fd91a731b9d3e1a2Swap Exact Token...132103432024-04-15 19:40:337 hrs 57 mins ago0xe620db71ca52cbf535055f957bd6d5284f0192a0 IN  0xe11b93b61f6291d35c5a2bea0a9ff169080160cf0 ETH0.000011008070.065072343
[ Download CSV Export 
Latest 25 internal transaction
Parent Txn Hash Block From To Value
0x2a36b8998854ab907926ca87cfcd7e8a2ecdd818e58be80d1de4da749d78ba6c132236372024-04-16 3:03:4134 mins ago 0xe11b93b61f6291d35c5a2bea0a9ff169080160cf0x68ec6b5038dcf1e00a6780b9031e978168298f820.000591731834336869 ETH
0x2a36b8998854ab907926ca87cfcd7e8a2ecdd818e58be80d1de4da749d78ba6c132236372024-04-16 3:03:4134 mins ago Wrapped Ether 0xe11b93b61f6291d35c5a2bea0a9ff169080160cf0.000591731834336869 ETH
0xf951fbaaf85b0665c1b456c0dd01b30eceb2c9fca26d99ebc64c74ff3be1b443132103962024-04-15 19:42:197 hrs 55 mins ago 0xe11b93b61f6291d35c5a2bea0a9ff169080160cfWrapped Ether0.0277 ETH
0x8dc0746d2a129538077efd429bed4cec25dda72b6d2399e5858e41dc1cf9d4b5132025432024-04-15 15:20:3312 hrs 17 mins ago 0xe11b93b61f6291d35c5a2bea0a9ff169080160cfWrapped Ether0.0001 ETH
0x8dc0746d2a129538077efd429bed4cec25dda72b6d2399e5858e41dc1cf9d4b5132025432024-04-15 15:20:3312 hrs 17 mins ago 0xea749fd6ba492dbc14c24fe8a3d08769229b896c 0xe11b93b61f6291d35c5a2bea0a9ff169080160cf0.0001 ETH
0x72c2d21320b2db371d43e2b7747f320762e22067e44dfdf382e24289b4c06a5c132014822024-04-15 14:45:1112 hrs 52 mins ago 0xe11b93b61f6291d35c5a2bea0a9ff169080160cfWrapped Ether0.0001 ETH
0x72c2d21320b2db371d43e2b7747f320762e22067e44dfdf382e24289b4c06a5c132014822024-04-15 14:45:1112 hrs 52 mins ago 0xea749fd6ba492dbc14c24fe8a3d08769229b896c 0xe11b93b61f6291d35c5a2bea0a9ff169080160cf0.0001 ETH
0x31c06254ae5468c05a221c2638d12db0376fd01adbc3295bafe0c2cf09f6ca90132001452024-04-15 14:00:3713 hrs 37 mins ago 0xe11b93b61f6291d35c5a2bea0a9ff169080160cfWrapped Ether0.0001 ETH
0x31c06254ae5468c05a221c2638d12db0376fd01adbc3295bafe0c2cf09f6ca90132001452024-04-15 14:00:3713 hrs 37 mins ago 0xea749fd6ba492dbc14c24fe8a3d08769229b896c 0xe11b93b61f6291d35c5a2bea0a9ff169080160cf0.0001 ETH
0x1d347d7890c15cc9691890b3f164001462b5dfe6a59b9bc8e5be249da45d6975131698292024-04-14 21:10:051 day 6 hrs ago 0xe11b93b61f6291d35c5a2bea0a9ff169080160cf0x2061013a5d413990a8442f38011740be841f8d7c0.078341629553219941 ETH
0x1d347d7890c15cc9691890b3f164001462b5dfe6a59b9bc8e5be249da45d6975131698292024-04-14 21:10:051 day 6 hrs ago Wrapped Ether 0xe11b93b61f6291d35c5a2bea0a9ff169080160cf0.078341629553219941 ETH
0x9bd185bd320e28e7f88f79f035f50105e9a85b8cc99010fa307ad80eea01327b131658542024-04-14 18:57:351 day 8 hrs ago 0xe11b93b61f6291d35c5a2bea0a9ff169080160cf0x1980cccfa8d05b99b378c575c8b767081fbdffec0.031245300676760693 ETH
0x9bd185bd320e28e7f88f79f035f50105e9a85b8cc99010fa307ad80eea01327b131658542024-04-14 18:57:351 day 8 hrs ago Wrapped Ether 0xe11b93b61f6291d35c5a2bea0a9ff169080160cf0.031245300676760693 ETH
0xd159750fcc571072ab756017502ce9deae3abc9f0ca4d072a2b3b5b74d9032f3131642532024-04-14 18:04:131 day 9 hrs ago 0xe11b93b61f6291d35c5a2bea0a9ff169080160cfWrapped Ether0.0001 ETH
0xd159750fcc571072ab756017502ce9deae3abc9f0ca4d072a2b3b5b74d9032f3131642532024-04-14 18:04:131 day 9 hrs ago 0xea749fd6ba492dbc14c24fe8a3d08769229b896c 0xe11b93b61f6291d35c5a2bea0a9ff169080160cf0.0001 ETH
0xf81c1efb266606edea659536044c5bd62737a0ea139549caca65bd18a6143ba9131577592024-04-14 14:27:451 day 13 hrs ago 0xe11b93b61f6291d35c5a2bea0a9ff169080160cfWrapped Ether0.000030275630430105 ETH
0xf81c1efb266606edea659536044c5bd62737a0ea139549caca65bd18a6143ba9131577592024-04-14 14:27:451 day 13 hrs ago 0xea749fd6ba492dbc14c24fe8a3d08769229b896c 0xe11b93b61f6291d35c5a2bea0a9ff169080160cf0.000030275630430105 ETH
0xcf0eef2e20ad460c2721a7e6337c85c82b170b702b72ca99784b0248476f4e5b131569832024-04-14 14:01:531 day 13 hrs ago 0xe11b93b61f6291d35c5a2bea0a9ff169080160cfWrapped Ether0.000006 ETH
0x69552592f535e0a767139deba6a5dacb1065f5bc094e17faf2daf3a6a846aa9d131286702024-04-13 22:18:072 days 5 hrs ago 0xe11b93b61f6291d35c5a2bea0a9ff169080160cfWrapped Ether0.0001 ETH
0x69552592f535e0a767139deba6a5dacb1065f5bc094e17faf2daf3a6a846aa9d131286702024-04-13 22:18:072 days 5 hrs ago 0xea749fd6ba492dbc14c24fe8a3d08769229b896c 0xe11b93b61f6291d35c5a2bea0a9ff169080160cf0.0001 ETH
0x759ecd908e4ec4fff41ba881c028408dd54ae8eb4828c1d71a2e1597e55d772b131217612024-04-13 18:27:492 days 9 hrs ago 0xe11b93b61f6291d35c5a2bea0a9ff169080160cfWrapped Ether0.0000055 ETH
0x24caf975d402c67c45017f52a5aaf9d3882818c041325855fc156847e8d20e7d131210242024-04-13 18:03:152 days 9 hrs ago 0xe11b93b61f6291d35c5a2bea0a9ff169080160cfWrapped Ether0.0001 ETH
0x24caf975d402c67c45017f52a5aaf9d3882818c041325855fc156847e8d20e7d131210242024-04-13 18:03:152 days 9 hrs ago 0xea749fd6ba492dbc14c24fe8a3d08769229b896c 0xe11b93b61f6291d35c5a2bea0a9ff169080160cf0.0001 ETH
0xb12acb4884270d0c979302d69b44f15953febd952307d1eedeb46c74edf2edfc131201202024-04-13 17:33:072 days 10 hrs ago 0xe11b93b61f6291d35c5a2bea0a9ff169080160cfWrapped Ether0.02 ETH
0x9478c1aa7d3262f935f96aad9e434f73f09c1d74aa8da5e2dde3e47224ba0e44130929832024-04-13 2:28:333 days 1 hr ago 0xe11b93b61f6291d35c5a2bea0a9ff169080160cfWrapped Ether0.02 ETH
[ Download CSV Export 
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
Router

Compiler Version
v0.8.13+commit.abaa5c0e

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, GNU AGPLv3 license

Contract Source Code (Solidity)

/**
 *Submitted for verification at basescan.org on 2023-08-02
*/

// SPDX-License-Identifier: MIT

pragma solidity 0.8.13;


// OpenZeppelin Contracts (last updated v4.9.0) (utils/math/Math.sol)



/**
 * @dev Standard math utilities missing in the Solidity language.
 */
library Math {
    enum Rounding {
        Down, // Toward negative infinity
        Up, // Toward infinity
        Zero // Toward zero
    }

    /**
     * @dev Returns the largest of two numbers.
     */
    function max(uint256 a, uint256 b) internal pure returns (uint256) {
        return a > b ? a : b;
    }

    /**
     * @dev Returns the smallest of two numbers.
     */
    function min(uint256 a, uint256 b) internal pure returns (uint256) {
        return a < b ? a : b;
    }

    /**
     * @dev Returns the average of two numbers. The result is rounded towards
     * zero.
     */
    function average(uint256 a, uint256 b) internal pure returns (uint256) {
        // (a + b) / 2 can overflow.
        return (a & b) + (a ^ b) / 2;
    }

    /**
     * @dev Returns the ceiling of the division of two numbers.
     *
     * This differs from standard division with `/` in that it rounds up instead
     * of rounding down.
     */
    function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {
        // (a + b - 1) / b can overflow on addition, so we distribute.
        return a == 0 ? 0 : (a - 1) / b + 1;
    }

    /**
     * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0
     * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv)
     * with further edits by Uniswap Labs also under MIT license.
     */
    function mulDiv(uint256 x, uint256 y, uint256 denominator) internal pure returns (uint256 result) {
        unchecked {
            // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use
            // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256
            // variables such that product = prod1 * 2^256 + prod0.
            uint256 prod0; // Least significant 256 bits of the product
            uint256 prod1; // Most significant 256 bits of the product
            assembly {
                let mm := mulmod(x, y, not(0))
                prod0 := mul(x, y)
                prod1 := sub(sub(mm, prod0), lt(mm, prod0))
            }

            // Handle non-overflow cases, 256 by 256 division.
            if (prod1 == 0) {
                // Solidity will revert if denominator == 0, unlike the div opcode on its own.
                // The surrounding unchecked block does not change this fact.
                // See https://docs.soliditylang.org/en/latest/control-structures.html#checked-or-unchecked-arithmetic.
                return prod0 / denominator;
            }

            // Make sure the result is less than 2^256. Also prevents denominator == 0.
            require(denominator > prod1, "Math: mulDiv overflow");

            ///////////////////////////////////////////////
            // 512 by 256 division.
            ///////////////////////////////////////////////

            // Make division exact by subtracting the remainder from [prod1 prod0].
            uint256 remainder;
            assembly {
                // Compute remainder using mulmod.
                remainder := mulmod(x, y, denominator)

                // Subtract 256 bit number from 512 bit number.
                prod1 := sub(prod1, gt(remainder, prod0))
                prod0 := sub(prod0, remainder)
            }

            // Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1.
            // See https://cs.stackexchange.com/q/138556/92363.

            // Does not overflow because the denominator cannot be zero at this stage in the function.
            uint256 twos = denominator & (~denominator + 1);
            assembly {
                // Divide denominator by twos.
                denominator := div(denominator, twos)

                // Divide [prod1 prod0] by twos.
                prod0 := div(prod0, twos)

                // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one.
                twos := add(div(sub(0, twos), twos), 1)
            }

            // Shift in bits from prod1 into prod0.
            prod0 |= prod1 * twos;

            // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such
            // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for
            // four bits. That is, denominator * inv = 1 mod 2^4.
            uint256 inverse = (3 * denominator) ^ 2;

            // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works
            // in modular arithmetic, doubling the correct bits in each step.
            inverse *= 2 - denominator * inverse; // inverse mod 2^8
            inverse *= 2 - denominator * inverse; // inverse mod 2^16
            inverse *= 2 - denominator * inverse; // inverse mod 2^32
            inverse *= 2 - denominator * inverse; // inverse mod 2^64
            inverse *= 2 - denominator * inverse; // inverse mod 2^128
            inverse *= 2 - denominator * inverse; // inverse mod 2^256

            // Because the division is now exact we can divide by multiplying with the modular inverse of denominator.
            // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is
            // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1
            // is no longer required.
            result = prod0 * inverse;
            return result;
        }
    }

    /**
     * @notice Calculates x * y / denominator with full precision, following the selected rounding direction.
     */
    function mulDiv(uint256 x, uint256 y, uint256 denominator, Rounding rounding) internal pure returns (uint256) {
        uint256 result = mulDiv(x, y, denominator);
        if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) {
            result += 1;
        }
        return result;
    }

    /**
     * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded down.
     *
     * Inspired by Henry S. Warren, Jr.'s "Hacker's Delight" (Chapter 11).
     */
    function sqrt(uint256 a) internal pure returns (uint256) {
        if (a == 0) {
            return 0;
        }

        // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target.
        //
        // We know that the "msb" (most significant bit) of our target number `a` is a power of 2 such that we have
        // `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`.
        //
        // This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)`
        // → `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))`
        // → `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)`
        //
        // Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit.
        uint256 result = 1 << (log2(a) >> 1);

        // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128,
        // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at
        // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision
        // into the expected uint128 result.
        unchecked {
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            return min(result, a / result);
        }
    }

    /**
     * @notice Calculates sqrt(a), following the selected rounding direction.
     */
    function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) {
        unchecked {
            uint256 result = sqrt(a);
            return result + (rounding == Rounding.Up && result * result < a ? 1 : 0);
        }
    }

    /**
     * @dev Return the log in base 2, rounded down, of a positive value.
     * Returns 0 if given 0.
     */
    function log2(uint256 value) internal pure returns (uint256) {
        uint256 result = 0;
        unchecked {
            if (value >> 128 > 0) {
                value >>= 128;
                result += 128;
            }
            if (value >> 64 > 0) {
                value >>= 64;
                result += 64;
            }
            if (value >> 32 > 0) {
                value >>= 32;
                result += 32;
            }
            if (value >> 16 > 0) {
                value >>= 16;
                result += 16;
            }
            if (value >> 8 > 0) {
                value >>= 8;
                result += 8;
            }
            if (value >> 4 > 0) {
                value >>= 4;
                result += 4;
            }
            if (value >> 2 > 0) {
                value >>= 2;
                result += 2;
            }
            if (value >> 1 > 0) {
                result += 1;
            }
        }
        return result;
    }

    /**
     * @dev Return the log in base 2, following the selected rounding direction, of a positive value.
     * Returns 0 if given 0.
     */
    function log2(uint256 value, Rounding rounding) internal pure returns (uint256) {
        unchecked {
            uint256 result = log2(value);
            return result + (rounding == Rounding.Up && 1 << result < value ? 1 : 0);
        }
    }

    /**
     * @dev Return the log in base 10, rounded down, of a positive value.
     * Returns 0 if given 0.
     */
    function log10(uint256 value) internal pure returns (uint256) {
        uint256 result = 0;
        unchecked {
            if (value >= 10 ** 64) {
                value /= 10 ** 64;
                result += 64;
            }
            if (value >= 10 ** 32) {
                value /= 10 ** 32;
                result += 32;
            }
            if (value >= 10 ** 16) {
                value /= 10 ** 16;
                result += 16;
            }
            if (value >= 10 ** 8) {
                value /= 10 ** 8;
                result += 8;
            }
            if (value >= 10 ** 4) {
                value /= 10 ** 4;
                result += 4;
            }
            if (value >= 10 ** 2) {
                value /= 10 ** 2;
                result += 2;
            }
            if (value >= 10 ** 1) {
                result += 1;
            }
        }
        return result;
    }

    /**
     * @dev Return the log in base 10, following the selected rounding direction, of a positive value.
     * Returns 0 if given 0.
     */
    function log10(uint256 value, Rounding rounding) internal pure returns (uint256) {
        unchecked {
            uint256 result = log10(value);
            return result + (rounding == Rounding.Up && 10 ** result < value ? 1 : 0);
        }
    }

    /**
     * @dev Return the log in base 256, rounded down, of a positive value.
     * Returns 0 if given 0.
     *
     * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string.
     */
    function log256(uint256 value) internal pure returns (uint256) {
        uint256 result = 0;
        unchecked {
            if (value >> 128 > 0) {
                value >>= 128;
                result += 16;
            }
            if (value >> 64 > 0) {
                value >>= 64;
                result += 8;
            }
            if (value >> 32 > 0) {
                value >>= 32;
                result += 4;
            }
            if (value >> 16 > 0) {
                value >>= 16;
                result += 2;
            }
            if (value >> 8 > 0) {
                result += 1;
            }
        }
        return result;
    }

    /**
     * @dev Return the log in base 256, following the selected rounding direction, of a positive value.
     * Returns 0 if given 0.
     */
    function log256(uint256 value, Rounding rounding) internal pure returns (uint256) {
        unchecked {
            uint256 result = log256(value);
            return result + (rounding == Rounding.Up && 1 << (result << 3) < value ? 1 : 0);
        }
    }
}


interface IERC20 {
    function totalSupply() external view returns (uint256);
    function transfer(address recipient, uint amount) external returns (bool);
    function decimals() external view returns (uint8);
    function symbol() external view returns (string memory);
    function balanceOf(address) external view returns (uint);
    function transferFrom(address sender, address recipient, uint amount) external returns (bool);
    function allowance(address owner, address spender) external view returns (uint);
    function approve(address spender, uint value) external returns (bool);

    event Transfer(address indexed from, address indexed to, uint value);
    event Approval(address indexed owner, address indexed spender, uint value);
}



interface IPair {
    function metadata() external view returns (uint dec0, uint dec1, uint r0, uint r1, bool st, address t0, address t1);
    function tokens() external returns (address, address);
    function token0() external returns (address);
    function token1() external returns (address);
    function externalBribe() external returns (address);
    function transferFrom(address src, address dst, uint amount) external returns (bool);
    function permit(address owner, address spender, uint value, uint deadline, uint8 v, bytes32 r, bytes32 s) external;
    function swap(uint amount0Out, uint amount1Out, address to, bytes calldata data) external;
    function burn(address to) external returns (uint amount0, uint amount1);
    function mint(address to) external returns (uint liquidity);
    function getReserves() external view returns (uint _reserve0, uint _reserve1, uint _blockTimestampLast);
    function getAmountOut(uint, address) external view returns (uint);
    function setHasGauge(bool value) external;
    function setExternalBribe(address _externalBribe) external;
    function hasGauge() external view returns (bool);
    function stable() external view returns (bool);
    function prices(address tokenIn, uint amountIn, uint points) external view returns (uint[] memory);
}



interface IPairFactory {
    function allPairsLength() external view returns (uint);
    function isPair(address pair) external view returns (bool);
    function isPaused() external view returns (bool);
    function pairCodeHash() external pure returns (bytes32);
    function getFee(address pair) external view returns (uint256);
    function getPair(address tokenA, address token, bool stable) external view returns (address);
    function getInitializable() external view returns (address, address, bool);
    function createPair(address tokenA, address tokenB, bool stable) external returns (address pair);
    function voter() external view returns (address);
    function tank() external view returns (address);
}



interface IRouter {
    function pairFor(address tokenA, address tokenB, bool stable) external view returns (address pair);
    function swapExactTokensForTokensSimple(uint amountIn, uint amountOutMin, address tokenFrom, address tokenTo, bool stable, address to, uint deadline) external returns (uint[] memory amounts);
    function getAmountOut(uint amountIn, address tokenIn, address tokenOut, bool stable) external view returns (uint amount);
	function getReserves(address tokenA, address tokenB, bool stable) external view returns (uint, uint);
    function addLiquidity(
        address tokenA,
        address tokenB,
        bool stable,
        uint amountADesired,
        uint amountBDesired,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline
    ) external returns (uint, uint, uint);
}


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


contract Router is IRouter {

    struct route {
        address from;
        address to;
        bool stable;
    }

    address public immutable factory;
    IWETH public immutable weth;
    uint internal constant MINIMUM_LIQUIDITY = 10**3;
    bytes32 immutable pairCodeHash;

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

    constructor(address _factory, address _weth) {
        factory = _factory;
        pairCodeHash = IPairFactory(_factory).pairCodeHash();
        weth = IWETH(_weth);
    }

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

    function sortTokens(address tokenA, address tokenB) public pure returns (address token0, address token1) {
        require(tokenA != tokenB, 'Router: IDENTICAL_ADDRESSES');
        (token0, token1) = tokenA < tokenB ? (tokenA, tokenB) : (tokenB, tokenA);
        require(token0 != address(0), 'Router: ZERO_ADDRESS');
    }

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

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

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

    // performs chained getAmountOut calculations on any number of pairs
    function getAmountOut(uint amountIn, address tokenIn, address tokenOut) public view returns (uint amount, bool stable) {
        address pair = pairFor(tokenIn, tokenOut, true);
        uint amountStable;
        uint amountVolatile;
        if (IPairFactory(factory).isPair(pair)) {
            amountStable = IPair(pair).getAmountOut(amountIn, tokenIn);
        }
        pair = pairFor(tokenIn, tokenOut, false);
        if (IPairFactory(factory).isPair(pair)) {
            amountVolatile = IPair(pair).getAmountOut(amountIn, tokenIn);
        }
        return amountStable > amountVolatile ? (amountStable, true) : (amountVolatile, false);
    }

    //@override
    //getAmountOut	:	bool stable
    //Gets exact output for specific pair-type(S|V)
    function getAmountOut(uint amountIn, address tokenIn, address tokenOut, bool stable) public view returns (uint amount) {
        address pair = pairFor(tokenIn, tokenOut, stable);
        if (IPairFactory(factory).isPair(pair)) {
            amount = IPair(pair).getAmountOut(amountIn, tokenIn);
        }
    }

    // performs chained getAmountOut calculations on any number of pairs
    function getAmountsOut(uint amountIn, route[] memory routes) public view returns (uint[] memory amounts) {
        require(routes.length >= 1, 'Router: INVALID_PATH');
        amounts = new uint[](routes.length+1);
        amounts[0] = amountIn;
        for (uint i = 0; i < routes.length; i++) {
            address pair = pairFor(routes[i].from, routes[i].to, routes[i].stable);
            if (IPairFactory(factory).isPair(pair)) {
                amounts[i+1] = IPair(pair).getAmountOut(amounts[i], routes[i].from);
            }
        }
    }

    function isPair(address pair) external view returns (bool) {
        return IPairFactory(factory).isPair(pair);
    }

    function quoteAddLiquidity(
        address tokenA,
        address tokenB,
        bool stable,
        uint amountADesired,
        uint amountBDesired
    ) external view returns (uint amountA, uint amountB, uint liquidity) {
        // create the pair if it doesn't exist yet
        address _pair = IPairFactory(factory).getPair(tokenA, tokenB, stable);
        (uint reserveA, uint reserveB) = (0,0);
        uint _totalSupply = 0;
        if (_pair != address(0)) {
            _totalSupply = IERC20(_pair).totalSupply();
            (reserveA, reserveB) = getReserves(tokenA, tokenB, stable);
        }
        if (reserveA == 0 && reserveB == 0) {
            (amountA, amountB) = (amountADesired, amountBDesired);
            liquidity = Math.sqrt(amountA * amountB) - MINIMUM_LIQUIDITY;
        } else {

            uint amountBOptimal = quoteLiquidity(amountADesired, reserveA, reserveB);
            if (amountBOptimal <= amountBDesired) {
                (amountA, amountB) = (amountADesired, amountBOptimal);
                liquidity = Math.min(amountA * _totalSupply / reserveA, amountB * _totalSupply / reserveB);
            } else {
                uint amountAOptimal = quoteLiquidity(amountBDesired, reserveB, reserveA);
                (amountA, amountB) = (amountAOptimal, amountBDesired);
                liquidity = Math.min(amountA * _totalSupply / reserveA, amountB * _totalSupply / reserveB);
            }
        }
    }

    function quoteRemoveLiquidity(
        address tokenA,
        address tokenB,
        bool stable,
        uint liquidity
    ) external view returns (uint amountA, uint amountB) {
        // create the pair if it doesn't exist yet
        address _pair = IPairFactory(factory).getPair(tokenA, tokenB, stable);

        if (_pair == address(0)) {
            return (0,0);
        }

        (uint reserveA, uint reserveB) = getReserves(tokenA, tokenB, stable);
        uint _totalSupply = IERC20(_pair).totalSupply();

        amountA = liquidity * reserveA / _totalSupply; // using balances ensures pro-rata distribution
        amountB = liquidity * reserveB / _totalSupply; // using balances ensures pro-rata distribution

    }

    function _addLiquidity(
        address tokenA,
        address tokenB,
        bool stable,
        uint amountADesired,
        uint amountBDesired,
        uint amountAMin,
        uint amountBMin
    ) internal returns (uint amountA, uint amountB) {
        require(amountADesired >= amountAMin);
        require(amountBDesired >= amountBMin);
        // create the pair if it doesn't exist yet
        address _pair = IPairFactory(factory).getPair(tokenA, tokenB, stable);
        if (_pair == address(0)) {
            _pair = IPairFactory(factory).createPair(tokenA, tokenB, stable);
        }
        (uint reserveA, uint reserveB) = getReserves(tokenA, tokenB, stable);
        if (reserveA == 0 && reserveB == 0) {
            (amountA, amountB) = (amountADesired, amountBDesired);
        } else {
            uint amountBOptimal = quoteLiquidity(amountADesired, reserveA, reserveB);
            if (amountBOptimal <= amountBDesired) {
                require(amountBOptimal >= amountBMin, 'Router: INSUFFICIENT_B_AMOUNT');
                (amountA, amountB) = (amountADesired, amountBOptimal);
            } else {
                uint amountAOptimal = quoteLiquidity(amountBDesired, reserveB, reserveA);
                assert(amountAOptimal <= amountADesired);
                require(amountAOptimal >= amountAMin, 'Router: INSUFFICIENT_A_AMOUNT');
                (amountA, amountB) = (amountAOptimal, amountBDesired);
            }
        }
    }

    function addLiquidity(
        address tokenA,
        address tokenB,
        bool stable,
        uint amountADesired,
        uint amountBDesired,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline
    ) external ensure(deadline) returns (uint amountA, uint amountB, uint liquidity) {
        (amountA, amountB) = _addLiquidity(tokenA, tokenB, stable, amountADesired, amountBDesired, amountAMin, amountBMin);
        address pair = pairFor(tokenA, tokenB, stable);
        _safeTransferFrom(tokenA, msg.sender, pair, amountA);
        _safeTransferFrom(tokenB, msg.sender, pair, amountB);
        liquidity = IPair(pair).mint(to);
    }

    function addLiquidityETH(
        address token,
        bool stable,
        uint amountTokenDesired,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external payable ensure(deadline) returns (uint amountToken, uint amountETH, uint liquidity) {
        (amountToken, amountETH) = _addLiquidity(
            token,
            address(weth),
            stable,
            amountTokenDesired,
            msg.value,
            amountTokenMin,
            amountETHMin
        );
        address pair = pairFor(token, address(weth), stable);
        _safeTransferFrom(token, msg.sender, pair, amountToken);
        weth.deposit{value: amountETH}();
        assert(weth.transfer(pair, amountETH));
        liquidity = IPair(pair).mint(to);
        // refund dust eth, if any
        if (msg.value > amountETH) _safeTransferETH(msg.sender, msg.value - amountETH);
    }

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

    function removeLiquidityETH(
        address token,
        bool stable,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) public ensure(deadline) returns (uint amountToken, uint amountETH) {
        (amountToken, amountETH) = removeLiquidity(
            token,
            address(weth),
            stable,
            liquidity,
            amountTokenMin,
            amountETHMin,
            address(this),
            deadline
        );
        _safeTransfer(token, to, amountToken);
        weth.withdraw(amountETH);
        _safeTransferETH(to, amountETH);
    }

    function removeLiquidityWithPermit(
        address tokenA,
        address tokenB,
        bool stable,
        uint liquidity,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external returns (uint amountA, uint amountB) {
        address pair = pairFor(tokenA, tokenB, stable);
        {
            uint value = approveMax ? type(uint).max : liquidity;
            IPair(pair).permit(msg.sender, address(this), value, deadline, v, r, s);
        }

        (amountA, amountB) = removeLiquidity(tokenA, tokenB, stable, liquidity, amountAMin, amountBMin, to, deadline);
    }

    function removeLiquidityETHWithPermit(
        address token,
        bool stable,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external returns (uint amountToken, uint amountETH) {
        address pair = pairFor(token, address(weth), stable);
        uint value = approveMax ? type(uint).max : liquidity;
        IPair(pair).permit(msg.sender, address(this), value, deadline, v, r, s);
        (amountToken, amountETH) = removeLiquidityETH(token, stable, liquidity, amountTokenMin, amountETHMin, to, deadline);
    }

    // **** SWAP ****
    // requires the initial amount to have already been sent to the first pair
    function _swap(uint[] memory amounts, route[] memory routes, address _to) internal virtual {
        for (uint i = 0; i < routes.length; i++) {
            (address token0,) = sortTokens(routes[i].from, routes[i].to);
            uint amountOut = amounts[i + 1];
            (uint amount0Out, uint amount1Out) = routes[i].from == token0 ? (uint(0), amountOut) : (amountOut, uint(0));
            address to = i < routes.length - 1 ? pairFor(routes[i+1].from, routes[i+1].to, routes[i+1].stable) : _to;
            IPair(pairFor(routes[i].from, routes[i].to, routes[i].stable)).swap(
                amount0Out, amount1Out, to, new bytes(0)
            );
        }
    }

    function swapExactTokensForTokensSimple(
        uint amountIn,
        uint amountOutMin,
        address tokenFrom,
        address tokenTo,
        bool stable,
        address to,
        uint deadline
    ) external ensure(deadline) returns (uint[] memory amounts) {
        route[] memory routes = new route[](1);
        routes[0].from = tokenFrom;
        routes[0].to = tokenTo;
        routes[0].stable = stable;
        amounts = getAmountsOut(amountIn, routes);
        require(amounts[amounts.length - 1] >= amountOutMin, 'Router: INSUFFICIENT_OUTPUT_AMOUNT');
        _safeTransferFrom(
            routes[0].from, msg.sender, pairFor(routes[0].from, routes[0].to, routes[0].stable), amounts[0]
        );
        _swap(amounts, routes, to);
    }

    function swapExactTokensForTokens(
        uint amountIn,
        uint amountOutMin,
        route[] calldata routes,
        address to,
        uint deadline
    ) external ensure(deadline) returns (uint[] memory amounts) {
        amounts = getAmountsOut(amountIn, routes);
        require(amounts[amounts.length - 1] >= amountOutMin, 'Router: INSUFFICIENT_OUTPUT_AMOUNT');
        _safeTransferFrom(
            routes[0].from, msg.sender, pairFor(routes[0].from, routes[0].to, routes[0].stable), amounts[0]
        );
        _swap(amounts, routes, to);
    }

    function swapExactETHForTokens(uint amountOutMin, route[] calldata routes, address to, uint deadline)
    external
    payable
    ensure(deadline)
    returns (uint[] memory amounts)
    {
        require(routes[0].from == address(weth), 'Router: INVALID_PATH');
        amounts = getAmountsOut(msg.value, routes);
        require(amounts[amounts.length - 1] >= amountOutMin, 'Router: INSUFFICIENT_OUTPUT_AMOUNT');
        weth.deposit{value: amounts[0]}();
        assert(weth.transfer(pairFor(routes[0].from, routes[0].to, routes[0].stable), amounts[0]));
        _swap(amounts, routes, to);
    }

    function swapExactTokensForETH(uint amountIn, uint amountOutMin, route[] calldata routes, address to, uint deadline)
    external
    ensure(deadline)
    returns (uint[] memory amounts)
    {
        require(routes[routes.length - 1].to == address(weth), 'Router: INVALID_PATH');
        amounts = getAmountsOut(amountIn, routes);
        require(amounts[amounts.length - 1] >= amountOutMin, 'Router: INSUFFICIENT_OUTPUT_AMOUNT');
        _safeTransferFrom(
            routes[0].from, msg.sender, pairFor(routes[0].from, routes[0].to, routes[0].stable), amounts[0]
        );
        _swap(amounts, routes, address(this));
        weth.withdraw(amounts[amounts.length - 1]);
        _safeTransferETH(to, amounts[amounts.length - 1]);
    }

    function UNSAFE_swapExactTokensForTokens(
        uint[] memory amounts,
        route[] calldata routes,
        address to,
        uint deadline
    ) external ensure(deadline) returns (uint[] memory) {
        _safeTransferFrom(routes[0].from, msg.sender, pairFor(routes[0].from, routes[0].to, routes[0].stable), amounts[0]);
        _swap(amounts, routes, to);
        return amounts;
    }

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

    function _safeTransfer(address token, address to, uint256 value) internal {
        require(token.code.length > 0);
        (bool success, bytes memory data) =
        token.call(abi.encodeWithSelector(IERC20.transfer.selector, to, value));
        require(success && (data.length == 0 || abi.decode(data, (bool))));
    }

    function _safeTransferFrom(address token, address from, address to, uint256 value) internal {
        require(token.code.length > 0);
        (bool success, bytes memory data) =
        token.call(abi.encodeWithSelector(IERC20.transferFrom.selector, from, to, value));
        require(success && (data.length == 0 || abi.decode(data, (bool))));
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"_factory","type":"address"},{"internalType":"address","name":"_weth","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"},{"components":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"bool","name":"stable","type":"bool"}],"internalType":"struct Router.route[]","name":"routes","type":"tuple[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"UNSAFE_swapExactTokensForTokens","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"},{"internalType":"bool","name":"stable","type":"bool"},{"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":"bool","name":"stable","type":"bool"},{"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":"amountIn","type":"uint256"},{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"address","name":"tokenOut","type":"address"}],"name":"getAmountOut","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bool","name":"stable","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"address","name":"tokenOut","type":"address"},{"internalType":"bool","name":"stable","type":"bool"}],"name":"getAmountOut","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"components":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"bool","name":"stable","type":"bool"}],"internalType":"struct Router.route[]","name":"routes","type":"tuple[]"}],"name":"getAmountsOut","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"},{"internalType":"bool","name":"stable","type":"bool"}],"name":"getReserves","outputs":[{"internalType":"uint256","name":"reserveA","type":"uint256"},{"internalType":"uint256","name":"reserveB","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"pair","type":"address"}],"name":"isPair","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"},{"internalType":"bool","name":"stable","type":"bool"}],"name":"pairFor","outputs":[{"internalType":"address","name":"pair","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"},{"internalType":"bool","name":"stable","type":"bool"},{"internalType":"uint256","name":"amountADesired","type":"uint256"},{"internalType":"uint256","name":"amountBDesired","type":"uint256"}],"name":"quoteAddLiquidity","outputs":[{"internalType":"uint256","name":"amountA","type":"uint256"},{"internalType":"uint256","name":"amountB","type":"uint256"},{"internalType":"uint256","name":"liquidity","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"},{"internalType":"bool","name":"stable","type":"bool"},{"internalType":"uint256","name":"liquidity","type":"uint256"}],"name":"quoteRemoveLiquidity","outputs":[{"internalType":"uint256","name":"amountA","type":"uint256"},{"internalType":"uint256","name":"amountB","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"},{"internalType":"bool","name":"stable","type":"bool"},{"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":"bool","name":"stable","type":"bool"},{"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":"bool","name":"stable","type":"bool"},{"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":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"},{"internalType":"bool","name":"stable","type":"bool"},{"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":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"}],"name":"sortTokens","outputs":[{"internalType":"address","name":"token0","type":"address"},{"internalType":"address","name":"token1","type":"address"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"components":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"bool","name":"stable","type":"bool"}],"internalType":"struct Router.route[]","name":"routes","type":"tuple[]"},{"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":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"components":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"bool","name":"stable","type":"bool"}],"internalType":"struct Router.route[]","name":"routes","type":"tuple[]"},{"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"},{"components":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"bool","name":"stable","type":"bool"}],"internalType":"struct Router.route[]","name":"routes","type":"tuple[]"},{"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":"tokenFrom","type":"address"},{"internalType":"address","name":"tokenTo","type":"address"},{"internalType":"bool","name":"stable","type":"bool"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactTokensForTokensSimple","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"weth","outputs":[{"internalType":"contract IWETH","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]

60e06040523480156200001157600080fd5b5060405162003c9a38038062003c9a8339810160408190526200003491620000d8565b6001600160a01b038216608081905260408051631355724960e31b81529051639aab9248916004808201926020929091908290030181865afa1580156200007f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620000a5919062000110565b60c0526001600160a01b031660a052506200012a565b80516001600160a01b0381168114620000d357600080fd5b919050565b60008060408385031215620000ec57600080fd5b620000f783620000bb565b91506200010760208401620000bb565b90509250929050565b6000602082840312156200012357600080fd5b5051919050565b60805160a05160c051613a9f620001fb6000396000610f32015260008181610149015281816102160152818161095201528181610b9101528181610de2015281816114a9015281816115bc0152818161164a01528181611e2201528181611e5801528181611e8d01528181611f220152818161206101526120b101526000818161043801528181610c7701528181610ef7015281816111b0015281816112c4015281816119cf01528181611b430152818161215c0152818161226d0152818161285701526128f80152613a9f6000f3fe6080604052600436106101395760003560e01c806367ffb66a116100ab578063b7e0d4c01161006f578063b7e0d4c014610413578063c45a015514610426578063d7b0e0a51461045a578063da2142311461047a578063e5e31b13146104a8578063f41766d8146104d857600080fd5b806367ffb66a146103805780637301e3c8146103935780639881fcb4146103b357806398a0fb3c146103d3578063a32b1fcd146103f357600080fd5b8063448725b4116100fd578063448725b4146102705780634c1ee03e14610290578063544caa56146102b05780635a47ddc3146102f05780635e1e63251461032b5780635e60dab51461036057600080fd5b80630dede6c41461017d57806313dcfc59146101b757806318a13086146101e45780633fc8cef3146102045780634386e63c1461025057600080fd5b3661017857336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461017657610176612df0565b005b600080fd5b34801561018957600080fd5b5061019d610198366004612e3c565b6104f8565b604080519283526020830191909152015b60405180910390f35b3480156101c357600080fd5b506101d76101d2366004612ec1565b610712565b6040516101ae9190612f3c565b3480156101f057600080fd5b506101d76101ff366004612fc5565b610925565b34801561021057600080fd5b506102387f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020016101ae565b34801561025c57600080fd5b5061019d61026b366004613038565b610c70565b34801561027c57600080fd5b5061019d61028b36600461309a565b610dd7565b34801561029c57600080fd5b506102386102ab366004613144565b610eb0565b3480156102bc57600080fd5b506102d06102cb36600461318f565b610fb8565b604080516001600160a01b039384168152929091166020830152016101ae565b3480156102fc57600080fd5b5061031061030b3660046131c8565b611098565b604080519384526020840192909252908201526060016101ae565b34801561033757600080fd5b5061034b610346366004613257565b611178565b604080519283529015156020830152016101ae565b34801561036c57600080fd5b5061019d61037b366004613144565b6113cc565b6101d761038e36600461328e565b611484565b34801561039f57600080fd5b506101d76103ae366004613360565b6117e3565b3480156103bf57600080fd5b506101d76103ce3660046134a2565b6118b9565b3480156103df57600080fd5b506103106103ee366004613548565b611b3b565b3480156103ff57600080fd5b5061019d61040e3660046135a3565b611d3b565b61031061042136600461365f565b611df6565b34801561043257600080fd5b506102387f000000000000000000000000000000000000000000000000000000000000000081565b34801561046657600080fd5b5061019d61047536600461365f565b612037565b34801561048657600080fd5b5061049a6104953660046136ba565b61212c565b6040519081526020016101ae565b3480156104b457600080fd5b506104c86104c336600461370d565b61224b565b60405190151581526020016101ae565b3480156104e457600080fd5b506101d76104f3366004612fc5565b6122e0565b60008082428110156105255760405162461bcd60e51b815260040161051c9061372a565b60405180910390fd5b60006105328c8c8c610eb0565b6040516323b872dd60e01b81523360048201526001600160a01b03821660248201819052604482018c90529192506323b872dd906064016020604051808303816000875af1158015610588573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105ac9190613753565b6105b557600080fd5b60405163226bf2d160e21b81526001600160a01b03878116600483015260009182918416906389afcb449060240160408051808303816000875af1158015610601573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106259190613770565b9150915060006106358f8f610fb8565b509050806001600160a01b03168f6001600160a01b03161461065857818361065b565b82825b90975095508a8710156106b05760405162461bcd60e51b815260206004820152601d60248201527f526f757465723a20494e53554646494349454e545f415f414d4f554e54000000604482015260640161051c565b898610156107005760405162461bcd60e51b815260206004820152601d60248201527f526f757465723a20494e53554646494349454e545f425f414d4f554e54000000604482015260640161051c565b50505050509850989650505050505050565b606081428110156107355760405162461bcd60e51b815260040161051c9061372a565b604080516001808252818301909252600091816020015b604080516060810182526000808252602080830182905292820152825260001990920191018161074c579050509050878160008151811061078f5761078f613794565b6020026020010151600001906001600160a01b031690816001600160a01b03168152505086816000815181106107c7576107c7613794565b6020026020010151602001906001600160a01b031690816001600160a01b03168152505085816000815181106107ff576107ff613794565b602090810291909101015190151560409091015261081d8a826118b9565b925088836001855161082f91906137c0565b8151811061083f5761083f613794565b602002602001015110156108655760405162461bcd60e51b815260040161051c906137d7565b61090d8160008151811061087b5761087b613794565b602002602001015160000151336108ed8460008151811061089e5761089e613794565b602002602001015160000151856000815181106108bd576108bd613794565b602002602001015160200151866000815181106108dc576108dc613794565b602002602001015160400151610eb0565b8660008151811061090057610900613794565b6020026020010151612405565b6109188382876124fd565b5050979650505050505050565b606081428110156109485760405162461bcd60e51b815260040161051c9061372a565b6001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016868661097f6001826137c0565b81811061098e5761098e613794565b90506060020160200160208101906109a6919061370d565b6001600160a01b0316146109cc5760405162461bcd60e51b815260040161051c90613819565b610a28888787808060200260200160405190810160405280939291908181526020016000905b82821015610a1e57610a0f60608302860136819003810190613847565b815260200190600101906109f2565b50505050506118b9565b9150868260018451610a3a91906137c0565b81518110610a4a57610a4a613794565b60200260200101511015610a705760405162461bcd60e51b815260040161051c906137d7565b610b3286866000818110610a8657610a86613794565b610a9c926020606090920201908101915061370d565b33610b1f89896000818110610ab357610ab3613794565b610ac9926020606090920201908101915061370d565b8a8a6000818110610adc57610adc613794565b9050606002016020016020810190610af4919061370d565b8b8b6000818110610b0757610b07613794565b90506060020160400160208101906102ab9190613863565b8560008151811061090057610900613794565b610b8f828787808060200260200160405190810160405280939291908181526020016000905b82821015610b8457610b7560608302860136819003810190613847565b81526020019060010190610b58565b5050505050306124fd565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632e1a7d4d8360018551610bcd91906137c0565b81518110610bdd57610bdd613794565b60200260200101516040518263ffffffff1660e01b8152600401610c0391815260200190565b600060405180830381600087803b158015610c1d57600080fd5b505af1158015610c31573d6000803e3d6000fd5b50505050610c65848360018551610c4891906137c0565b81518110610c5857610c58613794565b6020026020010151612752565b509695505050505050565b60008060007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316636801cc308888886040518463ffffffff1660e01b8152600401610cc593929190613880565b602060405180830381865afa158015610ce2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d0691906138a4565b90506001600160a01b038116610d23576000809250925050610dce565b600080610d318989896113cc565b915091506000836001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610d75573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d9991906138c1565b905080610da684896138da565b610db0919061390f565b955080610dbd83896138da565b610dc7919061390f565b9450505050505b94509492505050565b6000806000610e078e7f00000000000000000000000000000000000000000000000000000000000000008f610eb0565b9050600087610e16578c610e1a565b6000195b60405163d505accf60e01b81529091506001600160a01b0383169063d505accf90610e55903390309086908f908e908e908e90600401613931565b600060405180830381600087803b158015610e6f57600080fd5b505af1158015610e83573d6000803e3d6000fd5b50505050610e968f8f8f8f8f8f8f612037565b809450819550505050509b509b9950505050505050505050565b6000806000610ebf8686610fb8565b6040516bffffffffffffffffffffffff19606084811b8216602084015283901b16603482015286151560f81b604882015291935091507f000000000000000000000000000000000000000000000000000000000000000090604901604051602081830303815290604052805190602001207f0000000000000000000000000000000000000000000000000000000000000000604051602001610f96939291906001600160f81b0319815260609390931b6bffffffffffffffffffffffff191660018401526015830191909152603582015260550190565b60408051601f1981840301815291905280516020909101209695505050505050565b600080826001600160a01b0316846001600160a01b03160361101c5760405162461bcd60e51b815260206004820152601b60248201527f526f757465723a204944454e544943414c5f4144445245535345530000000000604482015260640161051c565b826001600160a01b0316846001600160a01b03161061103c57828461103f565b83835b90925090506001600160a01b0382166110915760405162461bcd60e51b8152602060048201526014602482015273526f757465723a205a45524f5f4144445245535360601b604482015260640161051c565b9250929050565b600080600083428110156110be5760405162461bcd60e51b815260040161051c9061372a565b6110cd8d8d8d8d8d8d8d612820565b909450925060006110df8e8e8e610eb0565b90506110ed8e338388612405565b6110f98d338387612405565b6040516335313c2160e11b81526001600160a01b038881166004830152821690636a627842906024016020604051808303816000875af1158015611141573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061116591906138c1565b9250505099509950999650505050505050565b600080600061118985856001610eb0565b60405163e5e31b1360e01b81526001600160a01b03828116600483015291925060009182917f00000000000000000000000000000000000000000000000000000000000000009091169063e5e31b1390602401602060405180830381865afa1580156111f9573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061121d9190613753565b15611296576040516378a051ad60e11b8152600481018990526001600160a01b03888116602483015284169063f140a35a90604401602060405180830381865afa15801561126f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061129391906138c1565b91505b6112a287876000610eb0565b60405163e5e31b1360e01b81526001600160a01b0380831660048301529194507f00000000000000000000000000000000000000000000000000000000000000009091169063e5e31b1390602401602060405180830381865afa15801561130d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113319190613753565b156113aa576040516378a051ad60e11b8152600481018990526001600160a01b03888116602483015284169063f140a35a90604401602060405180830381865afa158015611383573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113a791906138c1565b90505b8082116113b9578060006113bd565b8160015b94509450505050935093915050565b60008060006113db8686610fb8565b5090506000806113ec888888610eb0565b6001600160a01b0316630902f1ac6040518163ffffffff1660e01b8152600401606060405180830381865afa158015611429573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061144d9190613972565b5091509150826001600160a01b0316886001600160a01b031614611472578082611475565b81815b90999098509650505050505050565b606081428110156114a75760405162461bcd60e51b815260040161051c9061372a565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316868660008181106114e4576114e4613794565b6114fa926020606090920201908101915061370d565b6001600160a01b0316146115205760405162461bcd60e51b815260040161051c90613819565b611572348787808060200260200160405190810160405280939291908181526020016000905b82821015610a1e5761156360608302860136819003810190613847565b81526020019060010190611546565b915086826001845161158491906137c0565b8151811061159457611594613794565b602002602001015110156115ba5760405162461bcd60e51b815260040161051c906137d7565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db0836000815181106115fc576115fc613794565b60200260200101516040518263ffffffff1660e01b81526004016000604051808303818588803b15801561162f57600080fd5b505af1158015611643573d6000803e3d6000fd5b50505050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a9059cbb6116e18888600081811061168d5761168d613794565b6116a3926020606090920201908101915061370d565b898960008181106116b6576116b6613794565b90506060020160200160208101906116ce919061370d565b8a8a6000818110610b0757610b07613794565b846000815181106116f4576116f4613794565b60200260200101516040518363ffffffff1660e01b815260040161172d9291906001600160a01b03929092168252602082015260400190565b6020604051808303816000875af115801561174c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117709190613753565b61177c5761177c612df0565b6117d9828787808060200260200160405190810160405280939291908181526020016000905b828210156117ce576117bf60608302860136819003810190613847565b815260200190600101906117a2565b5050505050866124fd565b5095945050505050565b606081428110156118065760405162461bcd60e51b815260040161051c9061372a565b61185c8686600081811061181c5761181c613794565b611832926020606090920201908101915061370d565b3361184989896000818110610ab357610ab3613794565b8a60008151811061090057610900613794565b6118ae878787808060200260200160405190810160405280939291908181526020016000905b828210156117ce5761189f60608302860136819003810190613847565b81526020019060010190611882565b509495945050505050565b60606001825110156118dd5760405162461bcd60e51b815260040161051c90613819565b81516118ea9060016139a0565b67ffffffffffffffff811115611902576119026132f5565b60405190808252806020026020018201604052801561192b578160200160208202803683370190505b509050828160008151811061194257611942613794565b60200260200101818152505060005b8251811015611b345760006119ad84838151811061197157611971613794565b60200260200101516000015185848151811061198f5761198f613794565b6020026020010151602001518685815181106108dc576108dc613794565b60405163e5e31b1360e01b81526001600160a01b0380831660048301529192507f00000000000000000000000000000000000000000000000000000000000000009091169063e5e31b1390602401602060405180830381865afa158015611a18573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a3c9190613753565b15611b2157806001600160a01b031663f140a35a848481518110611a6257611a62613794565b6020026020010151868581518110611a7c57611a7c613794565b6020026020010151600001516040518363ffffffff1660e01b8152600401611ab79291909182526001600160a01b0316602082015260400190565b602060405180830381865afa158015611ad4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611af891906138c1565b83611b048460016139a0565b81518110611b1457611b14613794565b6020026020010181815250505b5080611b2c816139b8565b915050611951565b5092915050565b6000806000807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316636801cc308a8a8a6040518463ffffffff1660e01b8152600401611b9193929190613880565b602060405180830381865afa158015611bae573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bd291906138a4565b9050600080806001600160a01b03841615611c5c57836001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611c25573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c4991906138c1565b9050611c568c8c8c6113cc565b90935091505b82158015611c68575081155b15611c99578896508795506103e8611c88611c83888a6138da565b612a9e565b611c9291906137c0565b9450611d2c565b6000611ca68a8585612b8d565b9050888111611cee57899750955085611ce784611cc3848b6138da565b611ccd919061390f565b84611cd8858b6138da565b611ce2919061390f565b612c57565b9550611d2a565b6000611cfb8a8587612b8d565b9850899750889050611d2685611d1185846138da565b611d1b919061390f565b85611cd8868c6138da565b9650505b505b50505050955095509592505050565b6000806000611d4b8f8f8f610eb0565b9050600087611d5a578c611d5e565b6000195b60405163d505accf60e01b81529091506001600160a01b0383169063d505accf90611d99903390309086908f908e908e908e90600401613931565b600060405180830381600087803b158015611db357600080fd5b505af1158015611dc7573d6000803e3d6000fd5b5050505050611ddc8f8f8f8f8f8f8f8f6104f8565b8093508194505050509c509c9a5050505050505050505050565b60008060008342811015611e1c5760405162461bcd60e51b815260040161051c9061372a565b611e4b8b7f00000000000000000000000000000000000000000000000000000000000000008c8c348d8d612820565b90945092506000611e7d8c7f00000000000000000000000000000000000000000000000000000000000000008d610eb0565b9050611e8b8c338388612405565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db0856040518263ffffffff1660e01b81526004016000604051808303818588803b158015611ee657600080fd5b505af1158015611efa573d6000803e3d6000fd5b505060405163a9059cbb60e01b81526001600160a01b038581166004830152602482018990527f000000000000000000000000000000000000000000000000000000000000000016935063a9059cbb925060440190506020604051808303816000875af1158015611f6f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f939190613753565b611f9f57611f9f612df0565b6040516335313c2160e11b81526001600160a01b038881166004830152821690636a627842906024016020604051808303816000875af1158015611fe7573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061200b91906138c1565b925083341115612028576120283361202386346137c0565b612752565b50509750975097945050505050565b600080824281101561205b5760405162461bcd60e51b815260040161051c9061372a565b61208b8a7f00000000000000000000000000000000000000000000000000000000000000008b8b8b8b308b6104f8565b909350915061209b8a8685612c6d565b604051632e1a7d4d60e01b8152600481018390527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690632e1a7d4d90602401600060405180830381600087803b1580156120fd57600080fd5b505af1158015612111573d6000803e3d6000fd5b5050505061211f8583612752565b5097509795505050505050565b60008061213a858585610eb0565b60405163e5e31b1360e01b81526001600160a01b0380831660048301529192507f00000000000000000000000000000000000000000000000000000000000000009091169063e5e31b1390602401602060405180830381865afa1580156121a5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121c99190613753565b15612242576040516378a051ad60e11b8152600481018790526001600160a01b03868116602483015282169063f140a35a90604401602060405180830381865afa15801561221b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061223f91906138c1565b91505b50949350505050565b60405163e5e31b1360e01b81526001600160a01b0382811660048301526000917f00000000000000000000000000000000000000000000000000000000000000009091169063e5e31b1390602401602060405180830381865afa1580156122b6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122da9190613753565b92915050565b606081428110156123035760405162461bcd60e51b815260040161051c9061372a565b612355888787808060200260200160405190810160405280939291908181526020016000905b82821015610a1e5761234660608302860136819003810190613847565b81526020019060010190612329565b915086826001845161236791906137c0565b8151811061237757612377613794565b6020026020010151101561239d5760405162461bcd60e51b815260040161051c906137d7565b6123b386866000818110610a8657610a86613794565b610c65828787808060200260200160405190810160405280939291908181526020016000905b828210156117ce576123f660608302860136819003810190613847565b815260200190600101906123d9565b6000846001600160a01b03163b1161241c57600080fd5b604080516001600160a01b0385811660248301528481166044830152606480830185905283518084039091018152608490920183526020820180516001600160e01b03166323b872dd60e01b179052915160009283929088169161248091906139fd565b6000604051808303816000865af19150503d80600081146124bd576040519150601f19603f3d011682016040523d82523d6000602084013e6124c2565b606091505b50915091508180156124ec5750805115806124ec5750808060200190518101906124ec9190613753565b6124f557600080fd5b505050505050565b60005b825181101561274c57600061254f84838151811061252057612520613794565b60200260200101516000015185848151811061253e5761253e613794565b602002602001015160200151610fb8565b5090506000856125608460016139a0565b8151811061257057612570613794565b60200260200101519050600080836001600160a01b031687868151811061259957612599613794565b6020026020010151600001516001600160a01b0316146125bb578260006125bf565b6000835b915091506000600188516125d391906137c0565b86106125df5786612652565b612652886125ee8860016139a0565b815181106125fe576125fe613794565b6020026020010151600001518988600161261891906139a0565b8151811061262857612628613794565b6020026020010151602001518a89600161264291906139a0565b815181106108dc576108dc613794565b90506126a588878151811061266957612669613794565b60200260200101516000015189888151811061268757612687613794565b6020026020010151602001518a89815181106108dc576108dc613794565b6001600160a01b031663022c0d9f84848460006040519080825280601f01601f1916602001820160405280156126e2576020820181803683370190505b506040518563ffffffff1660e01b81526004016127029493929190613a19565b600060405180830381600087803b15801561271c57600080fd5b505af1158015612730573d6000803e3d6000fd5b5050505050505050508080612744906139b8565b915050612500565b50505050565b604080516000808252602082019092526001600160a01b03841690839060405161277c91906139fd565b60006040518083038185875af1925050503d80600081146127b9576040519150601f19603f3d011682016040523d82523d6000602084013e6127be565b606091505b505090508061281b5760405162461bcd60e51b815260206004820152602360248201527f5472616e7366657248656c7065723a204554485f5452414e534645525f46414960448201526213115160ea1b606482015260840161051c565b505050565b6000808386101561283057600080fd5b8285101561283d57600080fd5b6040516306801cc360e41b81526000906001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690636801cc3090612890908d908d908d90600401613880565b602060405180830381865afa1580156128ad573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128d191906138a4565b90506001600160a01b038116612977576040516320b7f73960e21b81526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906382dfdce490612931908d908d908d90600401613880565b6020604051808303816000875af1158015612950573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061297491906138a4565b90505b6000806129858c8c8c6113cc565b91509150816000148015612997575080155b156129a757889450879350612a8f565b60006129b48a8484612b8d565b9050888111612a185786811015612a0d5760405162461bcd60e51b815260206004820152601d60248201527f526f757465723a20494e53554646494349454e545f425f414d4f554e54000000604482015260640161051c565b899550935083612a8d565b6000612a258a8486612b8d565b90508a811115612a3757612a37612df0565b88811015612a875760405162461bcd60e51b815260206004820152601d60248201527f526f757465723a20494e53554646494349454e545f415f414d4f554e54000000604482015260640161051c565b95508894505b505b50505097509795505050505050565b600081600003612ab057506000919050565b60006001612abd84612d5c565b901c6001901b90506001818481612ad657612ad66138f9565b048201901c90506001818481612aee57612aee6138f9565b048201901c90506001818481612b0657612b066138f9565b048201901c90506001818481612b1e57612b1e6138f9565b048201901c90506001818481612b3657612b366138f9565b048201901c90506001818481612b4e57612b4e6138f9565b048201901c90506001818481612b6657612b666138f9565b048201901c9050612b8681828581612b8057612b806138f9565b04612c57565b9392505050565b6000808411612bde5760405162461bcd60e51b815260206004820152601b60248201527f526f757465723a20494e53554646494349454e545f414d4f554e540000000000604482015260640161051c565b600083118015612bee5750600082115b612c3a5760405162461bcd60e51b815260206004820152601e60248201527f526f757465723a20494e53554646494349454e545f4c49515549444954590000604482015260640161051c565b82612c4583866138da565b612c4f919061390f565b949350505050565b6000818310612c665781612b86565b5090919050565b6000836001600160a01b03163b11612c8457600080fd5b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180516001600160e01b031663a9059cbb60e01b1790529151600092839290871691612ce091906139fd565b6000604051808303816000865af19150503d8060008114612d1d576040519150601f19603f3d011682016040523d82523d6000602084013e612d22565b606091505b5091509150818015612d4c575080511580612d4c575080806020019051810190612d4c9190613753565b612d5557600080fd5b5050505050565b600080608083901c15612d7157608092831c92015b604083901c15612d8357604092831c92015b602083901c15612d9557602092831c92015b601083901c15612da757601092831c92015b600883901c15612db957600892831c92015b600483901c15612dcb57600492831c92015b600283901c15612ddd57600292831c92015b600183901c156122da5760010192915050565b634e487b7160e01b600052600160045260246000fd5b6001600160a01b0381168114612e1b57600080fd5b50565b8035612e2981612e06565b919050565b8015158114612e1b57600080fd5b600080600080600080600080610100898b031215612e5957600080fd5b8835612e6481612e06565b97506020890135612e7481612e06565b96506040890135612e8481612e2e565b9550606089013594506080890135935060a0890135925060c0890135612ea981612e06565b8092505060e089013590509295985092959890939650565b600080600080600080600060e0888a031215612edc57600080fd5b87359650602088013595506040880135612ef581612e06565b94506060880135612f0581612e06565b93506080880135612f1581612e2e565b925060a0880135612f2581612e06565b8092505060c0880135905092959891949750929550565b6020808252825182820181905260009190848201906040850190845b81811015612f7457835183529284019291840191600101612f58565b50909695505050505050565b60008083601f840112612f9257600080fd5b50813567ffffffffffffffff811115612faa57600080fd5b60208301915083602060608302850101111561109157600080fd5b60008060008060008060a08789031215612fde57600080fd5b8635955060208701359450604087013567ffffffffffffffff81111561300357600080fd5b61300f89828a01612f80565b909550935050606087013561302381612e06565b80925050608087013590509295509295509295565b6000806000806080858703121561304e57600080fd5b843561305981612e06565b9350602085013561306981612e06565b9250604085013561307981612e2e565b9396929550929360600135925050565b803560ff81168114612e2957600080fd5b60008060008060008060008060008060006101608c8e0312156130bc57600080fd5b8b356130c781612e06565b9a5060208c01356130d781612e2e565b995060408c0135985060608c0135975060808c0135965060a08c01356130fc81612e06565b955060c08c0135945060e08c013561311381612e2e565b93506131226101008d01613089565b92506101208c013591506101408c013590509295989b509295989b9093969950565b60008060006060848603121561315957600080fd5b833561316481612e06565b9250602084013561317481612e06565b9150604084013561318481612e2e565b809150509250925092565b600080604083850312156131a257600080fd5b82356131ad81612e06565b915060208301356131bd81612e06565b809150509250929050565b60008060008060008060008060006101208a8c0312156131e757600080fd5b89356131f281612e06565b985060208a013561320281612e06565b975060408a013561321281612e2e565b965060608a0135955060808a0135945060a08a0135935060c08a0135925060e08a013561323e81612e06565b809250506101008a013590509295985092959850929598565b60008060006060848603121561326c57600080fd5b83359250602084013561327e81612e06565b9150604084013561318481612e06565b6000806000806000608086880312156132a657600080fd5b85359450602086013567ffffffffffffffff8111156132c457600080fd5b6132d088828901612f80565b90955093505060408601356132e481612e06565b949793965091946060013592915050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff81118282101715613334576133346132f5565b604052919050565b600067ffffffffffffffff821115613356576133566132f5565b5060051b60200190565b60008060008060006080868803121561337857600080fd5b853567ffffffffffffffff8082111561339057600080fd5b818801915088601f8301126133a457600080fd5b813560206133b96133b48361333c565b61330b565b82815260059290921b8401810191818101908c8411156133d857600080fd5b948201945b838610156133f6578535825294820194908201906133dd565b9950508901359250508082111561340c57600080fd5b5061341988828901612f80565b90955093506132e4905060408701612e1e565b60006060828403121561343e57600080fd5b6040516060810181811067ffffffffffffffff82111715613461576134616132f5565b604052905080823561347281612e06565b8152602083013561348281612e06565b6020820152604083013561349581612e2e565b6040919091015292915050565b600080604083850312156134b557600080fd5b8235915060208084013567ffffffffffffffff8111156134d457600080fd5b8401601f810186136134e557600080fd5b80356134f36133b48261333c565b8181526060918202830184019184820191908984111561351257600080fd5b938501935b83851015613538576135298a8661342c565b83529384019391850191613517565b5080955050505050509250929050565b600080600080600060a0868803121561356057600080fd5b853561356b81612e06565b9450602086013561357b81612e06565b9350604086013561358b81612e2e565b94979396509394606081013594506080013592915050565b6000806000806000806000806000806000806101808d8f0312156135c657600080fd5b8c356135d181612e06565b9b5060208d01356135e181612e06565b9a5060408d01356135f181612e2e565b995060608d0135985060808d0135975060a08d0135965060c08d013561361681612e06565b955060e08d013594506101008d013561362e81612e2e565b935061363d6101208e01613089565b92506101408d013591506101608d013590509295989b509295989b509295989b565b600080600080600080600060e0888a03121561367a57600080fd5b873561368581612e06565b9650602088013561369581612e2e565b955060408801359450606088013593506080880135925060a0880135612f2581612e06565b600080600080608085870312156136d057600080fd5b8435935060208501356136e281612e06565b925060408501356136f281612e06565b9150606085013561370281612e2e565b939692955090935050565b60006020828403121561371f57600080fd5b8135612b8681612e06565b6020808252600f908201526e149bdd5d195c8e8811561412549151608a1b604082015260600190565b60006020828403121561376557600080fd5b8151612b8681612e2e565b6000806040838503121561378357600080fd5b505080516020909101519092909150565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b6000828210156137d2576137d26137aa565b500390565b60208082526022908201527f526f757465723a20494e53554646494349454e545f4f55545055545f414d4f55604082015261139560f21b606082015260800190565b6020808252601490820152730a4deeae8cae47440929cac82989288bea082a8960631b604082015260600190565b60006060828403121561385957600080fd5b612b86838361342c565b60006020828403121561387557600080fd5b8135612b8681612e2e565b6001600160a01b039384168152919092166020820152901515604082015260600190565b6000602082840312156138b657600080fd5b8151612b8681612e06565b6000602082840312156138d357600080fd5b5051919050565b60008160001904831182151516156138f4576138f46137aa565b500290565b634e487b7160e01b600052601260045260246000fd5b60008261392c57634e487b7160e01b600052601260045260246000fd5b500490565b6001600160a01b0397881681529590961660208601526040850193909352606084019190915260ff16608083015260a082015260c081019190915260e00190565b60008060006060848603121561398757600080fd5b8351925060208401519150604084015190509250925092565b600082198211156139b3576139b36137aa565b500190565b6000600182016139ca576139ca6137aa565b5060010190565b60005b838110156139ec5781810151838201526020016139d4565b8381111561274c5750506000910152565b60008251613a0f8184602087016139d1565b9190910192915050565b84815283602082015260018060a01b03831660408201526080606082015260008251806080840152613a528160a08501602087016139d1565b601f01601f19169190910160a0019594505050505056fea26469706673582212200c9c676354dd0001fb8ca566100ca1eeea60d7cd729cf793e9572f36a0fbc8d164736f6c634300080d0033000000000000000000000000e21aac7f113bd5dc2389e4d8a8db854a87fd69510000000000000000000000004200000000000000000000000000000000000006

Deployed Bytecode

0x6080604052600436106101395760003560e01c806367ffb66a116100ab578063b7e0d4c01161006f578063b7e0d4c014610413578063c45a015514610426578063d7b0e0a51461045a578063da2142311461047a578063e5e31b13146104a8578063f41766d8146104d857600080fd5b806367ffb66a146103805780637301e3c8146103935780639881fcb4146103b357806398a0fb3c146103d3578063a32b1fcd146103f357600080fd5b8063448725b4116100fd578063448725b4146102705780634c1ee03e14610290578063544caa56146102b05780635a47ddc3146102f05780635e1e63251461032b5780635e60dab51461036057600080fd5b80630dede6c41461017d57806313dcfc59146101b757806318a13086146101e45780633fc8cef3146102045780634386e63c1461025057600080fd5b3661017857336001600160a01b037f0000000000000000000000004200000000000000000000000000000000000006161461017657610176612df0565b005b600080fd5b34801561018957600080fd5b5061019d610198366004612e3c565b6104f8565b604080519283526020830191909152015b60405180910390f35b3480156101c357600080fd5b506101d76101d2366004612ec1565b610712565b6040516101ae9190612f3c565b3480156101f057600080fd5b506101d76101ff366004612fc5565b610925565b34801561021057600080fd5b506102387f000000000000000000000000420000000000000000000000000000000000000681565b6040516001600160a01b0390911681526020016101ae565b34801561025c57600080fd5b5061019d61026b366004613038565b610c70565b34801561027c57600080fd5b5061019d61028b36600461309a565b610dd7565b34801561029c57600080fd5b506102386102ab366004613144565b610eb0565b3480156102bc57600080fd5b506102d06102cb36600461318f565b610fb8565b604080516001600160a01b039384168152929091166020830152016101ae565b3480156102fc57600080fd5b5061031061030b3660046131c8565b611098565b604080519384526020840192909252908201526060016101ae565b34801561033757600080fd5b5061034b610346366004613257565b611178565b604080519283529015156020830152016101ae565b34801561036c57600080fd5b5061019d61037b366004613144565b6113cc565b6101d761038e36600461328e565b611484565b34801561039f57600080fd5b506101d76103ae366004613360565b6117e3565b3480156103bf57600080fd5b506101d76103ce3660046134a2565b6118b9565b3480156103df57600080fd5b506103106103ee366004613548565b611b3b565b3480156103ff57600080fd5b5061019d61040e3660046135a3565b611d3b565b61031061042136600461365f565b611df6565b34801561043257600080fd5b506102387f000000000000000000000000e21aac7f113bd5dc2389e4d8a8db854a87fd695181565b34801561046657600080fd5b5061019d61047536600461365f565b612037565b34801561048657600080fd5b5061049a6104953660046136ba565b61212c565b6040519081526020016101ae565b3480156104b457600080fd5b506104c86104c336600461370d565b61224b565b60405190151581526020016101ae565b3480156104e457600080fd5b506101d76104f3366004612fc5565b6122e0565b60008082428110156105255760405162461bcd60e51b815260040161051c9061372a565b60405180910390fd5b60006105328c8c8c610eb0565b6040516323b872dd60e01b81523360048201526001600160a01b03821660248201819052604482018c90529192506323b872dd906064016020604051808303816000875af1158015610588573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105ac9190613753565b6105b557600080fd5b60405163226bf2d160e21b81526001600160a01b03878116600483015260009182918416906389afcb449060240160408051808303816000875af1158015610601573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106259190613770565b9150915060006106358f8f610fb8565b509050806001600160a01b03168f6001600160a01b03161461065857818361065b565b82825b90975095508a8710156106b05760405162461bcd60e51b815260206004820152601d60248201527f526f757465723a20494e53554646494349454e545f415f414d4f554e54000000604482015260640161051c565b898610156107005760405162461bcd60e51b815260206004820152601d60248201527f526f757465723a20494e53554646494349454e545f425f414d4f554e54000000604482015260640161051c565b50505050509850989650505050505050565b606081428110156107355760405162461bcd60e51b815260040161051c9061372a565b604080516001808252818301909252600091816020015b604080516060810182526000808252602080830182905292820152825260001990920191018161074c579050509050878160008151811061078f5761078f613794565b6020026020010151600001906001600160a01b031690816001600160a01b03168152505086816000815181106107c7576107c7613794565b6020026020010151602001906001600160a01b031690816001600160a01b03168152505085816000815181106107ff576107ff613794565b602090810291909101015190151560409091015261081d8a826118b9565b925088836001855161082f91906137c0565b8151811061083f5761083f613794565b602002602001015110156108655760405162461bcd60e51b815260040161051c906137d7565b61090d8160008151811061087b5761087b613794565b602002602001015160000151336108ed8460008151811061089e5761089e613794565b602002602001015160000151856000815181106108bd576108bd613794565b602002602001015160200151866000815181106108dc576108dc613794565b602002602001015160400151610eb0565b8660008151811061090057610900613794565b6020026020010151612405565b6109188382876124fd565b5050979650505050505050565b606081428110156109485760405162461bcd60e51b815260040161051c9061372a565b6001600160a01b037f000000000000000000000000420000000000000000000000000000000000000616868661097f6001826137c0565b81811061098e5761098e613794565b90506060020160200160208101906109a6919061370d565b6001600160a01b0316146109cc5760405162461bcd60e51b815260040161051c90613819565b610a28888787808060200260200160405190810160405280939291908181526020016000905b82821015610a1e57610a0f60608302860136819003810190613847565b815260200190600101906109f2565b50505050506118b9565b9150868260018451610a3a91906137c0565b81518110610a4a57610a4a613794565b60200260200101511015610a705760405162461bcd60e51b815260040161051c906137d7565b610b3286866000818110610a8657610a86613794565b610a9c926020606090920201908101915061370d565b33610b1f89896000818110610ab357610ab3613794565b610ac9926020606090920201908101915061370d565b8a8a6000818110610adc57610adc613794565b9050606002016020016020810190610af4919061370d565b8b8b6000818110610b0757610b07613794565b90506060020160400160208101906102ab9190613863565b8560008151811061090057610900613794565b610b8f828787808060200260200160405190810160405280939291908181526020016000905b82821015610b8457610b7560608302860136819003810190613847565b81526020019060010190610b58565b5050505050306124fd565b7f00000000000000000000000042000000000000000000000000000000000000066001600160a01b0316632e1a7d4d8360018551610bcd91906137c0565b81518110610bdd57610bdd613794565b60200260200101516040518263ffffffff1660e01b8152600401610c0391815260200190565b600060405180830381600087803b158015610c1d57600080fd5b505af1158015610c31573d6000803e3d6000fd5b50505050610c65848360018551610c4891906137c0565b81518110610c5857610c58613794565b6020026020010151612752565b509695505050505050565b60008060007f000000000000000000000000e21aac7f113bd5dc2389e4d8a8db854a87fd69516001600160a01b0316636801cc308888886040518463ffffffff1660e01b8152600401610cc593929190613880565b602060405180830381865afa158015610ce2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d0691906138a4565b90506001600160a01b038116610d23576000809250925050610dce565b600080610d318989896113cc565b915091506000836001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610d75573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d9991906138c1565b905080610da684896138da565b610db0919061390f565b955080610dbd83896138da565b610dc7919061390f565b9450505050505b94509492505050565b6000806000610e078e7f00000000000000000000000042000000000000000000000000000000000000068f610eb0565b9050600087610e16578c610e1a565b6000195b60405163d505accf60e01b81529091506001600160a01b0383169063d505accf90610e55903390309086908f908e908e908e90600401613931565b600060405180830381600087803b158015610e6f57600080fd5b505af1158015610e83573d6000803e3d6000fd5b50505050610e968f8f8f8f8f8f8f612037565b809450819550505050509b509b9950505050505050505050565b6000806000610ebf8686610fb8565b6040516bffffffffffffffffffffffff19606084811b8216602084015283901b16603482015286151560f81b604882015291935091507f000000000000000000000000e21aac7f113bd5dc2389e4d8a8db854a87fd695190604901604051602081830303815290604052805190602001207f0ccd005ee58d5fb11632ef5c2e0866256b240965c62c8e990c0f84a97f311879604051602001610f96939291906001600160f81b0319815260609390931b6bffffffffffffffffffffffff191660018401526015830191909152603582015260550190565b60408051601f1981840301815291905280516020909101209695505050505050565b600080826001600160a01b0316846001600160a01b03160361101c5760405162461bcd60e51b815260206004820152601b60248201527f526f757465723a204944454e544943414c5f4144445245535345530000000000604482015260640161051c565b826001600160a01b0316846001600160a01b03161061103c57828461103f565b83835b90925090506001600160a01b0382166110915760405162461bcd60e51b8152602060048201526014602482015273526f757465723a205a45524f5f4144445245535360601b604482015260640161051c565b9250929050565b600080600083428110156110be5760405162461bcd60e51b815260040161051c9061372a565b6110cd8d8d8d8d8d8d8d612820565b909450925060006110df8e8e8e610eb0565b90506110ed8e338388612405565b6110f98d338387612405565b6040516335313c2160e11b81526001600160a01b038881166004830152821690636a627842906024016020604051808303816000875af1158015611141573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061116591906138c1565b9250505099509950999650505050505050565b600080600061118985856001610eb0565b60405163e5e31b1360e01b81526001600160a01b03828116600483015291925060009182917f000000000000000000000000e21aac7f113bd5dc2389e4d8a8db854a87fd69519091169063e5e31b1390602401602060405180830381865afa1580156111f9573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061121d9190613753565b15611296576040516378a051ad60e11b8152600481018990526001600160a01b03888116602483015284169063f140a35a90604401602060405180830381865afa15801561126f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061129391906138c1565b91505b6112a287876000610eb0565b60405163e5e31b1360e01b81526001600160a01b0380831660048301529194507f000000000000000000000000e21aac7f113bd5dc2389e4d8a8db854a87fd69519091169063e5e31b1390602401602060405180830381865afa15801561130d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113319190613753565b156113aa576040516378a051ad60e11b8152600481018990526001600160a01b03888116602483015284169063f140a35a90604401602060405180830381865afa158015611383573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113a791906138c1565b90505b8082116113b9578060006113bd565b8160015b94509450505050935093915050565b60008060006113db8686610fb8565b5090506000806113ec888888610eb0565b6001600160a01b0316630902f1ac6040518163ffffffff1660e01b8152600401606060405180830381865afa158015611429573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061144d9190613972565b5091509150826001600160a01b0316886001600160a01b031614611472578082611475565b81815b90999098509650505050505050565b606081428110156114a75760405162461bcd60e51b815260040161051c9061372a565b7f00000000000000000000000042000000000000000000000000000000000000066001600160a01b0316868660008181106114e4576114e4613794565b6114fa926020606090920201908101915061370d565b6001600160a01b0316146115205760405162461bcd60e51b815260040161051c90613819565b611572348787808060200260200160405190810160405280939291908181526020016000905b82821015610a1e5761156360608302860136819003810190613847565b81526020019060010190611546565b915086826001845161158491906137c0565b8151811061159457611594613794565b602002602001015110156115ba5760405162461bcd60e51b815260040161051c906137d7565b7f00000000000000000000000042000000000000000000000000000000000000066001600160a01b031663d0e30db0836000815181106115fc576115fc613794565b60200260200101516040518263ffffffff1660e01b81526004016000604051808303818588803b15801561162f57600080fd5b505af1158015611643573d6000803e3d6000fd5b50505050507f00000000000000000000000042000000000000000000000000000000000000066001600160a01b031663a9059cbb6116e18888600081811061168d5761168d613794565b6116a3926020606090920201908101915061370d565b898960008181106116b6576116b6613794565b90506060020160200160208101906116ce919061370d565b8a8a6000818110610b0757610b07613794565b846000815181106116f4576116f4613794565b60200260200101516040518363ffffffff1660e01b815260040161172d9291906001600160a01b03929092168252602082015260400190565b6020604051808303816000875af115801561174c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117709190613753565b61177c5761177c612df0565b6117d9828787808060200260200160405190810160405280939291908181526020016000905b828210156117ce576117bf60608302860136819003810190613847565b815260200190600101906117a2565b5050505050866124fd565b5095945050505050565b606081428110156118065760405162461bcd60e51b815260040161051c9061372a565b61185c8686600081811061181c5761181c613794565b611832926020606090920201908101915061370d565b3361184989896000818110610ab357610ab3613794565b8a60008151811061090057610900613794565b6118ae878787808060200260200160405190810160405280939291908181526020016000905b828210156117ce5761189f60608302860136819003810190613847565b81526020019060010190611882565b509495945050505050565b60606001825110156118dd5760405162461bcd60e51b815260040161051c90613819565b81516118ea9060016139a0565b67ffffffffffffffff811115611902576119026132f5565b60405190808252806020026020018201604052801561192b578160200160208202803683370190505b509050828160008151811061194257611942613794565b60200260200101818152505060005b8251811015611b345760006119ad84838151811061197157611971613794565b60200260200101516000015185848151811061198f5761198f613794565b6020026020010151602001518685815181106108dc576108dc613794565b60405163e5e31b1360e01b81526001600160a01b0380831660048301529192507f000000000000000000000000e21aac7f113bd5dc2389e4d8a8db854a87fd69519091169063e5e31b1390602401602060405180830381865afa158015611a18573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a3c9190613753565b15611b2157806001600160a01b031663f140a35a848481518110611a6257611a62613794565b6020026020010151868581518110611a7c57611a7c613794565b6020026020010151600001516040518363ffffffff1660e01b8152600401611ab79291909182526001600160a01b0316602082015260400190565b602060405180830381865afa158015611ad4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611af891906138c1565b83611b048460016139a0565b81518110611b1457611b14613794565b6020026020010181815250505b5080611b2c816139b8565b915050611951565b5092915050565b6000806000807f000000000000000000000000e21aac7f113bd5dc2389e4d8a8db854a87fd69516001600160a01b0316636801cc308a8a8a6040518463ffffffff1660e01b8152600401611b9193929190613880565b602060405180830381865afa158015611bae573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bd291906138a4565b9050600080806001600160a01b03841615611c5c57836001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611c25573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c4991906138c1565b9050611c568c8c8c6113cc565b90935091505b82158015611c68575081155b15611c99578896508795506103e8611c88611c83888a6138da565b612a9e565b611c9291906137c0565b9450611d2c565b6000611ca68a8585612b8d565b9050888111611cee57899750955085611ce784611cc3848b6138da565b611ccd919061390f565b84611cd8858b6138da565b611ce2919061390f565b612c57565b9550611d2a565b6000611cfb8a8587612b8d565b9850899750889050611d2685611d1185846138da565b611d1b919061390f565b85611cd8868c6138da565b9650505b505b50505050955095509592505050565b6000806000611d4b8f8f8f610eb0565b9050600087611d5a578c611d5e565b6000195b60405163d505accf60e01b81529091506001600160a01b0383169063d505accf90611d99903390309086908f908e908e908e90600401613931565b600060405180830381600087803b158015611db357600080fd5b505af1158015611dc7573d6000803e3d6000fd5b5050505050611ddc8f8f8f8f8f8f8f8f6104f8565b8093508194505050509c509c9a5050505050505050505050565b60008060008342811015611e1c5760405162461bcd60e51b815260040161051c9061372a565b611e4b8b7f00000000000000000000000042000000000000000000000000000000000000068c8c348d8d612820565b90945092506000611e7d8c7f00000000000000000000000042000000000000000000000000000000000000068d610eb0565b9050611e8b8c338388612405565b7f00000000000000000000000042000000000000000000000000000000000000066001600160a01b031663d0e30db0856040518263ffffffff1660e01b81526004016000604051808303818588803b158015611ee657600080fd5b505af1158015611efa573d6000803e3d6000fd5b505060405163a9059cbb60e01b81526001600160a01b038581166004830152602482018990527f000000000000000000000000420000000000000000000000000000000000000616935063a9059cbb925060440190506020604051808303816000875af1158015611f6f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f939190613753565b611f9f57611f9f612df0565b6040516335313c2160e11b81526001600160a01b038881166004830152821690636a627842906024016020604051808303816000875af1158015611fe7573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061200b91906138c1565b925083341115612028576120283361202386346137c0565b612752565b50509750975097945050505050565b600080824281101561205b5760405162461bcd60e51b815260040161051c9061372a565b61208b8a7f00000000000000000000000042000000000000000000000000000000000000068b8b8b8b308b6104f8565b909350915061209b8a8685612c6d565b604051632e1a7d4d60e01b8152600481018390527f00000000000000000000000042000000000000000000000000000000000000066001600160a01b031690632e1a7d4d90602401600060405180830381600087803b1580156120fd57600080fd5b505af1158015612111573d6000803e3d6000fd5b5050505061211f8583612752565b5097509795505050505050565b60008061213a858585610eb0565b60405163e5e31b1360e01b81526001600160a01b0380831660048301529192507f000000000000000000000000e21aac7f113bd5dc2389e4d8a8db854a87fd69519091169063e5e31b1390602401602060405180830381865afa1580156121a5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121c99190613753565b15612242576040516378a051ad60e11b8152600481018790526001600160a01b03868116602483015282169063f140a35a90604401602060405180830381865afa15801561221b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061223f91906138c1565b91505b50949350505050565b60405163e5e31b1360e01b81526001600160a01b0382811660048301526000917f000000000000000000000000e21aac7f113bd5dc2389e4d8a8db854a87fd69519091169063e5e31b1390602401602060405180830381865afa1580156122b6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122da9190613753565b92915050565b606081428110156123035760405162461bcd60e51b815260040161051c9061372a565b612355888787808060200260200160405190810160405280939291908181526020016000905b82821015610a1e5761234660608302860136819003810190613847565b81526020019060010190612329565b915086826001845161236791906137c0565b8151811061237757612377613794565b6020026020010151101561239d5760405162461bcd60e51b815260040161051c906137d7565b6123b386866000818110610a8657610a86613794565b610c65828787808060200260200160405190810160405280939291908181526020016000905b828210156117ce576123f660608302860136819003810190613847565b815260200190600101906123d9565b6000846001600160a01b03163b1161241c57600080fd5b604080516001600160a01b0385811660248301528481166044830152606480830185905283518084039091018152608490920183526020820180516001600160e01b03166323b872dd60e01b179052915160009283929088169161248091906139fd565b6000604051808303816000865af19150503d80600081146124bd576040519150601f19603f3d011682016040523d82523d6000602084013e6124c2565b606091505b50915091508180156124ec5750805115806124ec5750808060200190518101906124ec9190613753565b6124f557600080fd5b505050505050565b60005b825181101561274c57600061254f84838151811061252057612520613794565b60200260200101516000015185848151811061253e5761253e613794565b602002602001015160200151610fb8565b5090506000856125608460016139a0565b8151811061257057612570613794565b60200260200101519050600080836001600160a01b031687868151811061259957612599613794565b6020026020010151600001516001600160a01b0316146125bb578260006125bf565b6000835b915091506000600188516125d391906137c0565b86106125df5786612652565b612652886125ee8860016139a0565b815181106125fe576125fe613794565b6020026020010151600001518988600161261891906139a0565b8151811061262857612628613794565b6020026020010151602001518a89600161264291906139a0565b815181106108dc576108dc613794565b90506126a588878151811061266957612669613794565b60200260200101516000015189888151811061268757612687613794565b6020026020010151602001518a89815181106108dc576108dc613794565b6001600160a01b031663022c0d9f84848460006040519080825280601f01601f1916602001820160405280156126e2576020820181803683370190505b506040518563ffffffff1660e01b81526004016127029493929190613a19565b600060405180830381600087803b15801561271c57600080fd5b505af1158015612730573d6000803e3d6000fd5b5050505050505050508080612744906139b8565b915050612500565b50505050565b604080516000808252602082019092526001600160a01b03841690839060405161277c91906139fd565b60006040518083038185875af1925050503d80600081146127b9576040519150601f19603f3d011682016040523d82523d6000602084013e6127be565b606091505b505090508061281b5760405162461bcd60e51b815260206004820152602360248201527f5472616e7366657248656c7065723a204554485f5452414e534645525f46414960448201526213115160ea1b606482015260840161051c565b505050565b6000808386101561283057600080fd5b8285101561283d57600080fd5b6040516306801cc360e41b81526000906001600160a01b037f000000000000000000000000e21aac7f113bd5dc2389e4d8a8db854a87fd69511690636801cc3090612890908d908d908d90600401613880565b602060405180830381865afa1580156128ad573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128d191906138a4565b90506001600160a01b038116612977576040516320b7f73960e21b81526001600160a01b037f000000000000000000000000e21aac7f113bd5dc2389e4d8a8db854a87fd695116906382dfdce490612931908d908d908d90600401613880565b6020604051808303816000875af1158015612950573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061297491906138a4565b90505b6000806129858c8c8c6113cc565b91509150816000148015612997575080155b156129a757889450879350612a8f565b60006129b48a8484612b8d565b9050888111612a185786811015612a0d5760405162461bcd60e51b815260206004820152601d60248201527f526f757465723a20494e53554646494349454e545f425f414d4f554e54000000604482015260640161051c565b899550935083612a8d565b6000612a258a8486612b8d565b90508a811115612a3757612a37612df0565b88811015612a875760405162461bcd60e51b815260206004820152601d60248201527f526f757465723a20494e53554646494349454e545f415f414d4f554e54000000604482015260640161051c565b95508894505b505b50505097509795505050505050565b600081600003612ab057506000919050565b60006001612abd84612d5c565b901c6001901b90506001818481612ad657612ad66138f9565b048201901c90506001818481612aee57612aee6138f9565b048201901c90506001818481612b0657612b066138f9565b048201901c90506001818481612b1e57612b1e6138f9565b048201901c90506001818481612b3657612b366138f9565b048201901c90506001818481612b4e57612b4e6138f9565b048201901c90506001818481612b6657612b666138f9565b048201901c9050612b8681828581612b8057612b806138f9565b04612c57565b9392505050565b6000808411612bde5760405162461bcd60e51b815260206004820152601b60248201527f526f757465723a20494e53554646494349454e545f414d4f554e540000000000604482015260640161051c565b600083118015612bee5750600082115b612c3a5760405162461bcd60e51b815260206004820152601e60248201527f526f757465723a20494e53554646494349454e545f4c49515549444954590000604482015260640161051c565b82612c4583866138da565b612c4f919061390f565b949350505050565b6000818310612c665781612b86565b5090919050565b6000836001600160a01b03163b11612c8457600080fd5b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180516001600160e01b031663a9059cbb60e01b1790529151600092839290871691612ce091906139fd565b6000604051808303816000865af19150503d8060008114612d1d576040519150601f19603f3d011682016040523d82523d6000602084013e612d22565b606091505b5091509150818015612d4c575080511580612d4c575080806020019051810190612d4c9190613753565b612d5557600080fd5b5050505050565b600080608083901c15612d7157608092831c92015b604083901c15612d8357604092831c92015b602083901c15612d9557602092831c92015b601083901c15612da757601092831c92015b600883901c15612db957600892831c92015b600483901c15612dcb57600492831c92015b600283901c15612ddd57600292831c92015b600183901c156122da5760010192915050565b634e487b7160e01b600052600160045260246000fd5b6001600160a01b0381168114612e1b57600080fd5b50565b8035612e2981612e06565b919050565b8015158114612e1b57600080fd5b600080600080600080600080610100898b031215612e5957600080fd5b8835612e6481612e06565b97506020890135612e7481612e06565b96506040890135612e8481612e2e565b9550606089013594506080890135935060a0890135925060c0890135612ea981612e06565b8092505060e089013590509295985092959890939650565b600080600080600080600060e0888a031215612edc57600080fd5b87359650602088013595506040880135612ef581612e06565b94506060880135612f0581612e06565b93506080880135612f1581612e2e565b925060a0880135612f2581612e06565b8092505060c0880135905092959891949750929550565b6020808252825182820181905260009190848201906040850190845b81811015612f7457835183529284019291840191600101612f58565b50909695505050505050565b60008083601f840112612f9257600080fd5b50813567ffffffffffffffff811115612faa57600080fd5b60208301915083602060608302850101111561109157600080fd5b60008060008060008060a08789031215612fde57600080fd5b8635955060208701359450604087013567ffffffffffffffff81111561300357600080fd5b61300f89828a01612f80565b909550935050606087013561302381612e06565b80925050608087013590509295509295509295565b6000806000806080858703121561304e57600080fd5b843561305981612e06565b9350602085013561306981612e06565b9250604085013561307981612e2e565b9396929550929360600135925050565b803560ff81168114612e2957600080fd5b60008060008060008060008060008060006101608c8e0312156130bc57600080fd5b8b356130c781612e06565b9a5060208c01356130d781612e2e565b995060408c0135985060608c0135975060808c0135965060a08c01356130fc81612e06565b955060c08c0135945060e08c013561311381612e2e565b93506131226101008d01613089565b92506101208c013591506101408c013590509295989b509295989b9093969950565b60008060006060848603121561315957600080fd5b833561316481612e06565b9250602084013561317481612e06565b9150604084013561318481612e2e565b809150509250925092565b600080604083850312156131a257600080fd5b82356131ad81612e06565b915060208301356131bd81612e06565b809150509250929050565b60008060008060008060008060006101208a8c0312156131e757600080fd5b89356131f281612e06565b985060208a013561320281612e06565b975060408a013561321281612e2e565b965060608a0135955060808a0135945060a08a0135935060c08a0135925060e08a013561323e81612e06565b809250506101008a013590509295985092959850929598565b60008060006060848603121561326c57600080fd5b83359250602084013561327e81612e06565b9150604084013561318481612e06565b6000806000806000608086880312156132a657600080fd5b85359450602086013567ffffffffffffffff8111156132c457600080fd5b6132d088828901612f80565b90955093505060408601356132e481612e06565b949793965091946060013592915050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff81118282101715613334576133346132f5565b604052919050565b600067ffffffffffffffff821115613356576133566132f5565b5060051b60200190565b60008060008060006080868803121561337857600080fd5b853567ffffffffffffffff8082111561339057600080fd5b818801915088601f8301126133a457600080fd5b813560206133b96133b48361333c565b61330b565b82815260059290921b8401810191818101908c8411156133d857600080fd5b948201945b838610156133f6578535825294820194908201906133dd565b9950508901359250508082111561340c57600080fd5b5061341988828901612f80565b90955093506132e4905060408701612e1e565b60006060828403121561343e57600080fd5b6040516060810181811067ffffffffffffffff82111715613461576134616132f5565b604052905080823561347281612e06565b8152602083013561348281612e06565b6020820152604083013561349581612e2e565b6040919091015292915050565b600080604083850312156134b557600080fd5b8235915060208084013567ffffffffffffffff8111156134d457600080fd5b8401601f810186136134e557600080fd5b80356134f36133b48261333c565b8181526060918202830184019184820191908984111561351257600080fd5b938501935b83851015613538576135298a8661342c565b83529384019391850191613517565b5080955050505050509250929050565b600080600080600060a0868803121561356057600080fd5b853561356b81612e06565b9450602086013561357b81612e06565b9350604086013561358b81612e2e565b94979396509394606081013594506080013592915050565b6000806000806000806000806000806000806101808d8f0312156135c657600080fd5b8c356135d181612e06565b9b5060208d01356135e181612e06565b9a5060408d01356135f181612e2e565b995060608d0135985060808d0135975060a08d0135965060c08d013561361681612e06565b955060e08d013594506101008d013561362e81612e2e565b935061363d6101208e01613089565b92506101408d013591506101608d013590509295989b509295989b509295989b565b600080600080600080600060e0888a03121561367a57600080fd5b873561368581612e06565b9650602088013561369581612e2e565b955060408801359450606088013593506080880135925060a0880135612f2581612e06565b600080600080608085870312156136d057600080fd5b8435935060208501356136e281612e06565b925060408501356136f281612e06565b9150606085013561370281612e2e565b939692955090935050565b60006020828403121561371f57600080fd5b8135612b8681612e06565b6020808252600f908201526e149bdd5d195c8e8811561412549151608a1b604082015260600190565b60006020828403121561376557600080fd5b8151612b8681612e2e565b6000806040838503121561378357600080fd5b505080516020909101519092909150565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b6000828210156137d2576137d26137aa565b500390565b60208082526022908201527f526f757465723a20494e53554646494349454e545f4f55545055545f414d4f55604082015261139560f21b606082015260800190565b6020808252601490820152730a4deeae8cae47440929cac82989288bea082a8960631b604082015260600190565b60006060828403121561385957600080fd5b612b86838361342c565b60006020828403121561387557600080fd5b8135612b8681612e2e565b6001600160a01b039384168152919092166020820152901515604082015260600190565b6000602082840312156138b657600080fd5b8151612b8681612e06565b6000602082840312156138d357600080fd5b5051919050565b60008160001904831182151516156138f4576138f46137aa565b500290565b634e487b7160e01b600052601260045260246000fd5b60008261392c57634e487b7160e01b600052601260045260246000fd5b500490565b6001600160a01b0397881681529590961660208601526040850193909352606084019190915260ff16608083015260a082015260c081019190915260e00190565b60008060006060848603121561398757600080fd5b8351925060208401519150604084015190509250925092565b600082198211156139b3576139b36137aa565b500190565b6000600182016139ca576139ca6137aa565b5060010190565b60005b838110156139ec5781810151838201526020016139d4565b8381111561274c5750506000910152565b60008251613a0f8184602087016139d1565b9190910192915050565b84815283602082015260018060a01b03831660408201526080606082015260008251806080840152613a528160a08501602087016139d1565b601f01601f19169190910160a0019594505050505056fea26469706673582212200c9c676354dd0001fb8ca566100ca1eeea60d7cd729cf793e9572f36a0fbc8d164736f6c634300080d0033

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

000000000000000000000000e21aac7f113bd5dc2389e4d8a8db854a87fd69510000000000000000000000004200000000000000000000000000000000000006

-----Decoded View---------------
Arg [0] : _factory (address): 0xe21Aac7F113Bd5DC2389e4d8a8db854a87fD6951
Arg [1] : _weth (address): 0x4200000000000000000000000000000000000006

-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 000000000000000000000000e21aac7f113bd5dc2389e4d8a8db854a87fd6951
Arg [1] : 0000000000000000000000004200000000000000000000000000000000000006


Deployed ByteCode Sourcemap

17021:17573:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17672:10;-1:-1:-1;;;;;17694:4:0;17672:27;;17665:35;;;;:::i;:::-;17021:17573;;;;;26854:808;;;;;;;;;;-1:-1:-1;26854:808:0;;;;;:::i;:::-;;:::i;:::-;;;;1664:25:1;;;1720:2;1705:18;;1698:34;;;;1637:18;26854:808:0;;;;;;;;30529:780;;;;;;;;;;-1:-1:-1;30529:780:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;32522:755::-;;;;;;;;;;-1:-1:-1;32522:755:0;;;;;:::i;:::-;;:::i;17191:27::-;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;4646:32:1;;;4628:51;;4616:2;4601:18;17191:27:0;4468:217:1;22896:752:0;;;;;;;;;;-1:-1:-1;22896:752:0;;;;;:::i;:::-;;:::i;29060:670::-;;;;;;;;;;-1:-1:-1;29060:670:0;;;;;:::i;:::-;;:::i;18190:415::-;;;;;;;;;;-1:-1:-1;18190:415:0;;;;;:::i;:::-;;:::i;17771:327::-;;;;;;;;;;-1:-1:-1;17771:327:0;;;;;:::i;:::-;;:::i;:::-;;;;-1:-1:-1;;;;;7958:15:1;;;7940:34;;8010:15;;;;8005:2;7990:18;;7983:43;7875:18;17771:327:0;7728:304:1;25158:696:0;;;;;;;;;;-1:-1:-1;25158:696:0;;;;;:::i;:::-;;:::i;:::-;;;;9254:25:1;;;9310:2;9295:18;;9288:34;;;;9338:18;;;9331:34;9242:2;9227:18;25158:696:0;9052:319:1;19540:662:0;;;;;;;;;;-1:-1:-1;19540:662:0;;;;;:::i;:::-;;:::i;:::-;;;;10005:25:1;;;10073:14;;10066:22;10061:2;10046:18;;10039:50;9978:18;19540:662:0;9837:258:1;19083:375:0;;;;;;;;;;-1:-1:-1;19083:375:0;;;;;:::i;:::-;;:::i;31902:612::-;;;;;;:::i;:::-;;:::i;33285:404::-;;;;;;;;;;-1:-1:-1;33285:404:0;;;;;:::i;:::-;;:::i;20712:559::-;;;;;;;;;;-1:-1:-1;20712:559:0;;;;;:::i;:::-;;:::i;21406:1482::-;;;;;;;;;;-1:-1:-1;21406:1482:0;;;;;:::i;:::-;;:::i;28351:701::-;;;;;;;;;;-1:-1:-1;28351:701:0;;;;;:::i;:::-;;:::i;25862:949::-;;;;;;:::i;:::-;;:::i;17152:32::-;;;;;;;;;;;;;;;27670:673;;;;;;;;;;-1:-1:-1;27670:673:0;;;;;:::i;:::-;;:::i;20314:316::-;;;;;;;;;;-1:-1:-1;20314:316:0;;;;;:::i;:::-;;:::i;:::-;;;18165:25:1;;;18153:2;18138:18;20314:316:0;18019:177:1;21279:119:0;;;;;;;;;;-1:-1:-1;21279:119:0;;;;;:::i;:::-;;:::i;:::-;;;18618:14:1;;18611:22;18593:41;;18581:2;18566:18;21279:119:0;18453:187:1;31317:577:0;;;;;;;;;;-1:-1:-1;31317:577:0;;;;;:::i;:::-;;:::i;26854:808::-;27113:12;27127;27094:8;17381:15;17369:8;:27;;17361:55;;;;-1:-1:-1;;;17361:55:0;;;;;;;:::i;:::-;;;;;;;;;27152:12:::1;27167:31;27175:6;27183;27191;27167:7;:31::i;:::-;27217:53;::::0;-1:-1:-1;;;27217:53:0;;27242:10:::1;27217:53;::::0;::::1;19229:34:1::0;-1:-1:-1;;;;;27217:24:0;::::1;19279:18:1::0;;;19272:43;;;19331:18;;;19324:34;;;27152:46:0;;-1:-1:-1;27217:24:0::1;::::0;19164:18:1;;27217:53:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;27209:62;;;::::0;::::1;;27339:20;::::0;-1:-1:-1;;;27339:20:0;;-1:-1:-1;;;;;4646:32:1;;;27339:20:0::1;::::0;::::1;4628:51:1::0;27309:12:0::1;::::0;;;27339:16;::::1;::::0;::::1;::::0;4601:18:1;;27339:20:0::1;::::0;::::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;27308:51;;;;27371:14;27390:26;27401:6;27409;27390:10;:26::i;:::-;27370:46;;;27458:6;-1:-1:-1::0;;;;;27448:16:0::1;:6;-1:-1:-1::0;;;;;27448:16:0::1;;:58;;27489:7;27498;27448:58;;;27468:7;27477;27448:58;27427:79:::0;;-1:-1:-1;27427:79:0;-1:-1:-1;27525:21:0;;::::1;;27517:63;;;::::0;-1:-1:-1;;;27517:63:0;;20071:2:1;27517:63:0::1;::::0;::::1;20053:21:1::0;20110:2;20090:18;;;20083:30;20149:31;20129:18;;;20122:59;20198:18;;27517:63:0::1;19869:353:1::0;27517:63:0::1;27610:10;27599:7;:21;;27591:63;;;::::0;-1:-1:-1;;;27591:63:0;;20429:2:1;27591:63:0::1;::::0;::::1;20411:21:1::0;20468:2;20448:18;;;20441:30;20507:31;20487:18;;;20480:59;20556:18;;27591:63:0::1;20227:353:1::0;27591:63:0::1;27141:521;;;;26854:808:::0;;;;;;;;;;;;:::o;30529:780::-;30784:21;30765:8;17381:15;17369:8;:27;;17361:55;;;;-1:-1:-1;;;17361:55:0;;;;;;;:::i;:::-;30842:14:::1;::::0;;30854:1:::1;30842:14:::0;;;;;::::1;::::0;;;30818:21:::1;::::0;30842:14:::1;;;;-1:-1:-1::0;;;;;;;;;;;;;;;;;;;;;;;30842:14:0;;-1:-1:-1;;30842:14:0;;;;::::1;::::0;::::1;;;;;30818:38;;30884:9;30867:6;30874:1;30867:9;;;;;;;;:::i;:::-;;;;;;;:14;;:26;-1:-1:-1::0;;;;;30867:26:0::1;;;-1:-1:-1::0;;;;;30867:26:0::1;;;::::0;::::1;30919:7;30904:6;30911:1;30904:9;;;;;;;;:::i;:::-;;;;;;;:12;;:22;-1:-1:-1::0;;;;;30904:22:0::1;;;-1:-1:-1::0;;;;;30904:22:0::1;;;::::0;::::1;30956:6;30937;30944:1;30937:9;;;;;;;;:::i;:::-;;::::0;;::::1;::::0;;;;;;:25;::::1;;:16;::::0;;::::1;:25:::0;30983:31:::1;30997:8:::0;31007:6;30983:13:::1;:31::i;:::-;30973:41;;31064:12;31033:7;31058:1;31041:7;:14;:18;;;;:::i;:::-;31033:27;;;;;;;;:::i;:::-;;;;;;;:43;;31025:90;;;;-1:-1:-1::0;;;31025:90:0::1;;;;;;;:::i;:::-;31126:138;31158:6;31165:1;31158:9;;;;;;;;:::i;:::-;;;;;;;:14;;;31174:10;31186:55;31194:6;31201:1;31194:9;;;;;;;;:::i;:::-;;;;;;;:14;;;31210:6;31217:1;31210:9;;;;;;;;:::i;:::-;;;;;;;:12;;;31224:6;31231:1;31224:9;;;;;;;;:::i;:::-;;;;;;;:16;;;31186:7;:55::i;:::-;31243:7;31251:1;31243:10;;;;;;;;:::i;:::-;;;;;;;31126:17;:138::i;:::-;31275:26;31281:7;31290:6;31298:2;31275:5;:26::i;:::-;30807:502;30529:780:::0;;;;;;;;;;:::o;32522:755::-;32689:21;32665:8;17381:15;17369:8;:27;;17361:55;;;;-1:-1:-1;;;17361:55:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;32776:4:0::1;32736:45;:6:::0;;32743:17:::1;32759:1;32736:6:::0;32743:17:::1;:::i;:::-;32736:25;;;;;;;:::i;:::-;;;;;;:28;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;32736:45:0::1;;32728:78;;;;-1:-1:-1::0;;;32728:78:0::1;;;;;;;:::i;:::-;32827:31;32841:8;32851:6;;32827:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;::::1;;::::0;;::::1;::::0;::::1;::::0;::::1;:::i;:::-;;;;;;;;;;;;;;;;;:13;:31::i;:::-;32817:41;;32908:12;32877:7;32902:1;32885:7;:14;:18;;;;:::i;:::-;32877:27;;;;;;;;:::i;:::-;;;;;;;:43;;32869:90;;;;-1:-1:-1::0;;;32869:90:0::1;;;;;;;:::i;:::-;32970:138;33002:6;;33009:1;33002:9;;;;;;;:::i;:::-;:14;::::0;::::1;:9;::::0;;::::1;;:14:::0;;::::1;::::0;-1:-1:-1;33002:14:0::1;:::i;:::-;33018:10;33030:55;33038:6;;33045:1;33038:9;;;;;;;:::i;:::-;:14;::::0;::::1;:9;::::0;;::::1;;:14:::0;;::::1;::::0;-1:-1:-1;33038:14:0::1;:::i;:::-;33054:6;;33061:1;33054:9;;;;;;;:::i;:::-;;;;;;:12;;;;;;;;;;:::i;:::-;33068:6;;33075:1;33068:9;;;;;;;:::i;:::-;;;;;;:16;;;;;;;;;;:::i;33030:55::-;33087:7;33095:1;33087:10;;;;;;;;:::i;32970:138::-;33119:37;33125:7;33134:6;;33119:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;::::1;;::::0;;::::1;::::0;::::1;::::0;::::1;:::i;:::-;;;;;;;;;;;;;;;;;33150:4;33119:5;:37::i;:::-;33167:4;-1:-1:-1::0;;;;;33167:13:0::1;;33181:7;33206:1;33189:7;:14;:18;;;;:::i;:::-;33181:27;;;;;;;;:::i;:::-;;;;;;;33167:42;;;;;;;;;;;;;18165:25:1::0;;18153:2;18138:18;;18019:177;33167:42:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;33220:49;33237:2;33241:7;33266:1;33249:7;:14;:18;;;;:::i;:::-;33241:27;;;;;;;;:::i;:::-;;;;;;;33220:16;:49::i;:::-;32522:755:::0;;;;;;;;;:::o;22896:752::-;23053:12;23067;23144:13;23173:7;-1:-1:-1;;;;;23160:29:0;;23190:6;23198;23206;23160:53;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;23144:69;-1:-1:-1;;;;;;23230:19:0;;23226:64;;23274:1;23276;23266:12;;;;;;;23226:64;23303:13;23318;23335:35;23347:6;23355;23363;23335:11;:35::i;:::-;23302:68;;;;23381:17;23408:5;-1:-1:-1;;;;;23401:25:0;;:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;23381:47;-1:-1:-1;23381:47:0;23451:20;23463:8;23451:9;:20;:::i;:::-;:35;;;;:::i;:::-;23441:45;-1:-1:-1;23578:12:0;23555:20;23567:8;23555:9;:20;:::i;:::-;:35;;;;:::i;:::-;23545:45;;23081:567;;;;22896:752;;;;;;;;:::o;29060:670::-;29354:16;29372:14;29399:12;29414:37;29422:5;29437:4;29444:6;29414:7;:37::i;:::-;29399:52;;29462:10;29475;:39;;29505:9;29475:39;;;-1:-1:-1;;29475:39:0;29525:71;;-1:-1:-1;;;29525:71:0;;29462:52;;-1:-1:-1;;;;;;29525:18:0;;;;;:71;;29544:10;;29564:4;;29462:52;;29578:8;;29588:1;;29591;;29594;;29525:71;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29634:88;29653:5;29660:6;29668:9;29679:14;29695:12;29709:2;29713:8;29634:18;:88::i;:::-;29607:115;;;;;;;;29388:342;;29060:670;;;;;;;;;;;;;;:::o;18190:415::-;18273:12;18299:14;18315;18333:26;18344:6;18352;18333:10;:26::i;:::-;18496:40;;-1:-1:-1;;24491:2:1;24487:15;;;24483:24;;18496:40:0;;;24471:37:1;24542:15;;;24538:24;24524:12;;;24517:46;24609:14;;24602:22;24597:3;24593:32;24579:12;;;24572:54;18298:61:0;;-1:-1:-1;18298:61:0;-1:-1:-1;18464:7:0;;24642:12:1;;18496:40:0;;;;;;;;;;;;18486:51;;;;;;18552:12;18411:182;;;;;;;;;-1:-1:-1;;;;;;24951:26:1;;25014:2;25010:15;;;;-1:-1:-1;;25006:53:1;25002:1;24993:11;;24986:74;25085:2;25076:12;;25069:28;;;;25122:2;25113:12;;25106:28;25159:2;25150:12;;24665:503;18411:182:0;;;;-1:-1:-1;;18411:182:0;;;;;;;;;18401:193;;18411:182;18401:193;;;;;18190:415;-1:-1:-1;;;;;;18190:415:0:o;17771:327::-;17844:14;17860;17905:6;-1:-1:-1;;;;;17895:16:0;:6;-1:-1:-1;;;;;17895:16:0;;17887:56;;;;-1:-1:-1;;;17887:56:0;;25375:2:1;17887:56:0;;;25357:21:1;25414:2;25394:18;;;25387:30;25453:29;25433:18;;;25426:57;25500:18;;17887:56:0;25173:351:1;17887:56:0;17982:6;-1:-1:-1;;;;;17973:15:0;:6;-1:-1:-1;;;;;17973:15:0;;:53;;18011:6;18019;17973:53;;;17992:6;18000;17973:53;17954:72;;-1:-1:-1;17954:72:0;-1:-1:-1;;;;;;18045:20:0;;18037:53;;;;-1:-1:-1;;;18037:53:0;;25731:2:1;18037:53:0;;;25713:21:1;25770:2;25750:18;;;25743:30;-1:-1:-1;;;25789:18:1;;;25782:50;25849:18;;18037:53:0;25529:344:1;18037:53:0;17771:327;;;;;:::o;25158:696::-;25451:12;25465;25479:14;25432:8;17381:15;17369:8;:27;;17361:55;;;;-1:-1:-1;;;17361:55:0;;;;;;;:::i;:::-;25527:93:::1;25541:6;25549;25557;25565:14;25581;25597:10;25609;25527:13;:93::i;:::-;25506:114:::0;;-1:-1:-1;25506:114:0;-1:-1:-1;25631:12:0::1;25646:31;25654:6:::0;25662;25670;25646:7:::1;:31::i;:::-;25631:46;;25688:52;25706:6;25714:10;25726:4;25732:7;25688:17;:52::i;:::-;25751;25769:6;25777:10;25789:4;25795:7;25751:17;:52::i;:::-;25826:20;::::0;-1:-1:-1;;;25826:20:0;;-1:-1:-1;;;;;4646:32:1;;;25826:20:0::1;::::0;::::1;4628:51:1::0;25826:16:0;::::1;::::0;::::1;::::0;4601:18:1;;25826:20:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;25814:32;;25495:359;25158:696:::0;;;;;;;;;;;;;;:::o;19540:662::-;19633:11;19646;19670:12;19685:32;19693:7;19702:8;19712:4;19685:7;:32::i;:::-;19790:34;;-1:-1:-1;;;19790:34:0;;-1:-1:-1;;;;;4646:32:1;;;19790:34:0;;;4628:51:1;4646:32;;-1:-1:-1;;;;;19803:7:0;19790:28;;;;;;4601:18:1;;19790:34:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;19786:125;;;19856:43;;-1:-1:-1;;;19856:43:0;;;;;26052:25:1;;;-1:-1:-1;;;;;26113:32:1;;;26093:18;;;26086:60;19856:24:0;;;;;26025:18:1;;19856:43:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;19841:58;;19786:125;19928:33;19936:7;19945:8;19955:5;19928:7;:33::i;:::-;19976:34;;-1:-1:-1;;;19976:34:0;;-1:-1:-1;;;;;4646:32:1;;;19976:34:0;;;4628:51:1;19921:40:0;;-1:-1:-1;19989:7:0;19976:28;;;;;;4601:18:1;;19976:34:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;19972:127;;;20044:43;;-1:-1:-1;;;20044:43:0;;;;;26052:25:1;;;-1:-1:-1;;;;;26113:32:1;;;26093:18;;;26086:60;20044:24:0;;;;;26025:18:1;;20044:43:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;20027:60;;19972:127;20131:14;20116:12;:29;:78;;20172:14;20188:5;20116:78;;;20149:12;20163:4;20116:78;20109:85;;;;;;;19540:662;;;;;;:::o;19083:375::-;19170:13;19185;19212:14;19231:26;19242:6;19250;19231:10;:26::i;:::-;19211:46;;;19269:13;19284;19308:31;19316:6;19324;19332;19308:7;:31::i;:::-;-1:-1:-1;;;;;19302:50:0;;:52;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;19268:86;;;;;19398:6;-1:-1:-1;;;;;19388:16:0;:6;-1:-1:-1;;;;;19388:16:0;;:62;;19431:8;19441;19388:62;;;19408:8;19418;19388:62;19365:85;;;;-1:-1:-1;19083:375:0;-1:-1:-1;;;;;;;19083:375:0:o;31902:612::-;32067:21;32043:8;17381:15;17369:8;:27;;17361:55;;;;-1:-1:-1;;;17361:55:0;;;;;;;:::i;:::-;32140:4:::1;-1:-1:-1::0;;;;;32114:31:0::1;:6;;32121:1;32114:9;;;;;;;:::i;:::-;:14;::::0;::::1;:9;::::0;;::::1;;:14:::0;;::::1;::::0;-1:-1:-1;32114:14:0::1;:::i;:::-;-1:-1:-1::0;;;;;32114:31:0::1;;32106:64;;;;-1:-1:-1::0;;;32106:64:0::1;;;;;;;:::i;:::-;32191:32;32205:9;32216:6;;32191:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;::::1;;::::0;;::::1;::::0;::::1;::::0;::::1;:::i;:::-;;;;;;;;;;;;32181:42;;32273:12;32242:7;32267:1;32250:7;:14;:18;;;;:::i;:::-;32242:27;;;;;;;;:::i;:::-;;;;;;;:43;;32234:90;;;;-1:-1:-1::0;;;32234:90:0::1;;;;;;;:::i;:::-;32335:4;-1:-1:-1::0;;;;;32335:12:0::1;;32355:7;32363:1;32355:10;;;;;;;;:::i;:::-;;;;;;;32335:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;32386:4;-1:-1:-1::0;;;;;32386:13:0::1;;32400:55;32408:6;;32415:1;32408:9;;;;;;;:::i;:::-;:14;::::0;::::1;:9;::::0;;::::1;;:14:::0;;::::1;::::0;-1:-1:-1;32408:14:0::1;:::i;:::-;32424:6;;32431:1;32424:9;;;;;;;:::i;:::-;;;;;;:12;;;;;;;;;;:::i;:::-;32438:6;;32445:1;32438:9;;;;;;;:::i;32400:55::-;32457:7;32465:1;32457:10;;;;;;;;:::i;:::-;;;;;;;32386:82;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;26660:32:1;;;;26642:51;;26724:2;26709:18;;26702:34;26630:2;26615:18;;26468:274;32386:82:0::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;32379:90;;;;:::i;:::-;32480:26;32486:7;32495:6;;32480:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;::::1;;::::0;;::::1;::::0;::::1;::::0;::::1;:::i;:::-;;;;;;;;;;;;;;;;;32503:2;32480:5;:26::i;:::-;31902:612:::0;;;;;;;;:::o;33285:404::-;33479:13;33460:8;17381:15;17369:8;:27;;17361:55;;;;-1:-1:-1;;;17361:55:0;;;;;;;:::i;:::-;33505:114:::1;33523:6;;33530:1;33523:9;;;;;;;:::i;:::-;:14;::::0;::::1;:9;::::0;;::::1;;:14:::0;;::::1;::::0;-1:-1:-1;33523:14:0::1;:::i;:::-;33539:10;33551:55;33559:6;;33566:1;33559:9;;;;;;;:::i;33551:55::-;33608:7;33616:1;33608:10;;;;;;;;:::i;33505:114::-;33630:26;33636:7;33645:6;;33630:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;::::1;;::::0;;::::1;::::0;::::1;::::0;::::1;:::i;:::-;;;;;;;;;;;;-1:-1:-1::0;33674:7:0;;33285:404;-1:-1:-1;;;;;33285:404:0:o;20712:559::-;20794:21;20853:1;20836:6;:13;:18;;20828:51;;;;-1:-1:-1;;;20828:51:0;;;;;;;:::i;:::-;20911:13;;:15;;20925:1;20911:15;:::i;:::-;20900:27;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;20900:27:0;;20890:37;;20951:8;20938:7;20946:1;20938:10;;;;;;;;:::i;:::-;;;;;;:21;;;;;20975:6;20970:294;20991:6;:13;20987:1;:17;20970:294;;;21026:12;21041:55;21049:6;21056:1;21049:9;;;;;;;;:::i;:::-;;;;;;;:14;;;21065:6;21072:1;21065:9;;;;;;;;:::i;:::-;;;;;;;:12;;;21079:6;21086:1;21079:9;;;;;;;;:::i;21041:55::-;21115:34;;-1:-1:-1;;;21115:34:0;;-1:-1:-1;;;;;4646:32:1;;;21115:34:0;;;4628:51:1;21026:70:0;;-1:-1:-1;21128:7:0;21115:28;;;;;;4601:18:1;;21115:34:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;21111:142;;;21191:4;-1:-1:-1;;;;;21185:24:0;;21210:7;21218:1;21210:10;;;;;;;;:::i;:::-;;;;;;;21222:6;21229:1;21222:9;;;;;;;;:::i;:::-;;;;;;;:14;;;21185:52;;;;;;;;;;;;;;;26052:25:1;;;-1:-1:-1;;;;;26113:32:1;26108:2;26093:18;;26086:60;26040:2;26025:18;;25878:274;21185:52:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;21170:7;21178:3;:1;21180;21178:3;:::i;:::-;21170:12;;;;;;;;:::i;:::-;;;;;;:67;;;;;21111:142;-1:-1:-1;21006:3:0;;;;:::i;:::-;;;;20970:294;;;;20712:559;;;;:::o;21406:1482::-;21595:12;21609;21623:14;21702:13;21731:7;-1:-1:-1;;;;;21718:29:0;;21748:6;21756;21764;21718:53;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;21702:69;-1:-1:-1;21783:13:0;;;-1:-1:-1;;;;;21867:19:0;;;21863:167;;21925:5;-1:-1:-1;;;;;21918:25:0;;:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;21903:42;;21983:35;21995:6;22003;22011;21983:11;:35::i;:::-;21960:58;;-1:-1:-1;21960:58:0;-1:-1:-1;21863:167:0;22044:13;;:30;;;;-1:-1:-1;22061:13:0;;22044:30;22040:841;;;22113:14;;-1:-1:-1;22129:14:0;;-1:-1:-1;17268:5:0;22171:28;22181:17;22129:14;22113;22181:17;:::i;:::-;22171:9;:28::i;:::-;:48;;;;:::i;:::-;22159:60;;22040:841;;;22254:19;22276:50;22291:14;22307:8;22317;22276:14;:50::i;:::-;22254:72;;22363:14;22345;:32;22341:529;;22420:14;;-1:-1:-1;22436:14:0;-1:-1:-1;22436:14:0;22482:78;22516:8;22491:22;22501:12;22420:14;22491:22;:::i;:::-;:33;;;;:::i;:::-;22551:8;22526:22;22536:12;22526:7;:22;:::i;:::-;:33;;;;:::i;:::-;22482:8;:78::i;:::-;22470:90;;22341:529;;;22601:19;22623:50;22638:14;22654:8;22664;22623:14;:50::i;:::-;22601:72;-1:-1:-1;22730:14:0;;-1:-1:-1;22601:72:0;;-1:-1:-1;22776:78:0;22810:8;22785:22;22795:12;22601:72;22785:22;:::i;:::-;:33;;;;:::i;:::-;22845:8;22820:22;22830:12;22820:7;:22;:::i;22776:78::-;22764:90;;22582:288;22341:529;22237:644;22040:841;21639:1249;;;;21406:1482;;;;;;;;;:::o;28351:701::-;28662:12;28676;28701;28716:31;28724:6;28732;28740;28716:7;:31::i;:::-;28701:46;;28773:10;28786;:39;;28816:9;28786:39;;;-1:-1:-1;;28786:39:0;28840:71;;-1:-1:-1;;;28840:71:0;;28773:52;;-1:-1:-1;;;;;;28840:18:0;;;;;:71;;28859:10;;28879:4;;28773:52;;28893:8;;28903:1;;28906;;28909;;28840:71;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28758:165;28956:88;28972:6;28980;28988;28996:9;29007:10;29019;29031:2;29035:8;28956:15;:88::i;:::-;28935:109;;;;;;;;28690:362;28351:701;;;;;;;;;;;;;;;:::o;25862:949::-;26120:16;26138:14;26154;26101:8;17381:15;17369:8;:27;;17361:55;;;;-1:-1:-1;;;17361:55:0;;;;;;;:::i;:::-;26208:206:::1;26236:5;26264:4;26284:6;26305:18;26338:9;26362:14;26391:12;26208:13;:206::i;:::-;26181:233:::0;;-1:-1:-1;26181:233:0;-1:-1:-1;26425:12:0::1;26440:37;26448:5:::0;26463:4:::1;26470:6:::0;26440:7:::1;:37::i;:::-;26425:52;;26488:55;26506:5;26513:10;26525:4;26531:11;26488:17;:55::i;:::-;26554:4;-1:-1:-1::0;;;;;26554:12:0::1;;26574:9;26554:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;26604:30:0::1;::::0;-1:-1:-1;;;26604:30:0;;-1:-1:-1;;;;;26660:32:1;;;26604:30:0::1;::::0;::::1;26642:51:1::0;26709:18;;;26702:34;;;26604:4:0::1;:13;::::0;-1:-1:-1;26604:13:0::1;::::0;-1:-1:-1;26615:18:1;;;-1:-1:-1;26604:30:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;26597:38;;;;:::i;:::-;26658:20;::::0;-1:-1:-1;;;26658:20:0;;-1:-1:-1;;;;;4646:32:1;;;26658:20:0::1;::::0;::::1;4628:51:1::0;26658:16:0;::::1;::::0;::::1;::::0;4601:18:1;;26658:20:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;26646:32;;26741:9;26729;:21;26725:78;;;26752:51;26769:10;26781:21;26793:9:::0;26781::::1;:21;:::i;:::-;26752:16;:51::i;:::-;26170:641;25862:949:::0;;;;;;;;;;;;:::o;27670:673::-;27912:16;27930:14;27893:8;17381:15;17369:8;:27;;17361:55;;;;-1:-1:-1;;;17361:55:0;;;;;;;:::i;:::-;27984:226:::1;28014:5;28042:4;28062:6;28083:9;28107:14;28136:12;28171:4;28191:8;27984:15;:226::i;:::-;27957:253:::0;;-1:-1:-1;27957:253:0;-1:-1:-1;28221:37:0::1;28235:5:::0;28242:2;27957:253;28221:13:::1;:37::i;:::-;28269:24;::::0;-1:-1:-1;;;28269:24:0;;::::1;::::0;::::1;18165:25:1::0;;;28269:4:0::1;-1:-1:-1::0;;;;;28269:13:0::1;::::0;::::1;::::0;18138:18:1;;28269:24:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;28304:31;28321:2;28325:9;28304:16;:31::i;:::-;27670:673:::0;;;;;;;;;;;:::o;20314:316::-;20420:11;20444:12;20459:34;20467:7;20476:8;20486:6;20459:7;:34::i;:::-;20508;;-1:-1:-1;;;20508:34:0;;-1:-1:-1;;;;;4646:32:1;;;20508:34:0;;;4628:51:1;20444:49:0;;-1:-1:-1;20521:7:0;20508:28;;;;;;4601:18:1;;20508:34:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;20504:119;;;20568:43;;-1:-1:-1;;;20568:43:0;;;;;26052:25:1;;;-1:-1:-1;;;;;26113:32:1;;;26093:18;;;26086:60;20568:24:0;;;;;26025:18:1;;20568:43:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;20559:52;;20504:119;20433:197;20314:316;;;;;;:::o;21279:119::-;21356:34;;-1:-1:-1;;;21356:34:0;;-1:-1:-1;;;;;4646:32:1;;;21356:34:0;;;4628:51:1;21332:4:0;;21369:7;21356:28;;;;;;4601:18:1;;21356:34:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;21349:41;21279:119;-1:-1:-1;;21279:119:0:o;31317:577::-;31524:21;31505:8;17381:15;17369:8;:27;;17361:55;;;;-1:-1:-1;;;17361:55:0;;;;;;;:::i;:::-;31568:31:::1;31582:8;31592:6;;31568:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;::::1;;::::0;;::::1;::::0;::::1;::::0;::::1;:::i;:::-;;;;;;;;;;;;31558:41;;31649:12;31618:7;31643:1;31626:7;:14;:18;;;;:::i;:::-;31618:27;;;;;;;;:::i;:::-;;;;;;;:43;;31610:90;;;;-1:-1:-1::0;;;31610:90:0::1;;;;;;;:::i;:::-;31711:138;31743:6;;31750:1;31743:9;;;;;;;:::i;31711:138::-;31860:26;31866:7;31875:6;;31860:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;::::1;;::::0;;::::1;::::0;::::1;::::0;::::1;:::i;:::-;;;;;;;;;;;34236:355:::0;34367:1;34347:5;-1:-1:-1;;;;;34347:17:0;;:21;34339:30;;;;;;34436:69;;;-1:-1:-1;;;;;19247:15:1;;;34436:69:0;;;19229:34:1;19299:15;;;19279:18;;;19272:43;19331:18;;;;19324:34;;;34436:69:0;;;;;;;;;;19164:18:1;;;;34436:69:0;;;;;;;-1:-1:-1;;;;;34436:69:0;-1:-1:-1;;;34436:69:0;;;34425:81;;-1:-1:-1;;;;34425:10:0;;;;:81;;34436:69;34425:81;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34380:126;;;;34525:7;:57;;;;-1:-1:-1;34537:11:0;;:16;;:44;;;34568:4;34557:24;;;;;;;;;;;;:::i;:::-;34517:66;;;;;;34328:263;;34236:355;;;;:::o;29841:680::-;29948:6;29943:571;29964:6;:13;29960:1;:17;29943:571;;;30000:14;30019:40;30030:6;30037:1;30030:9;;;;;;;;:::i;:::-;;;;;;;:14;;;30046:6;30053:1;30046:9;;;;;;;;:::i;:::-;;;;;;;:12;;;30019:10;:40::i;:::-;-1:-1:-1;29999:60:0;-1:-1:-1;30074:14:0;30091:7;30099:5;:1;30103;30099:5;:::i;:::-;30091:14;;;;;;;;:::i;:::-;;;;;;;30074:31;;30121:15;30138;30175:6;-1:-1:-1;;;;;30157:24:0;:6;30164:1;30157:9;;;;;;;;:::i;:::-;;;;;;;:14;;;-1:-1:-1;;;;;30157:24:0;;:70;;30208:9;30224:1;30157:70;;;30190:1;30194:9;30157:70;30120:107;;;;30242:10;30275:1;30259:6;:13;:17;;;;:::i;:::-;30255:1;:21;:91;;30343:3;30255:91;;;30279:61;30287:6;30294:3;:1;30296;30294:3;:::i;:::-;30287:11;;;;;;;;:::i;:::-;;;;;;;:16;;;30305:6;30312:1;30314;30312:3;;;;:::i;:::-;30305:11;;;;;;;;:::i;:::-;;;;;;;:14;;;30321:6;30328:1;30330;30328:3;;;;:::i;:::-;30321:11;;;;;;;;:::i;30279:61::-;30242:104;;30367:55;30375:6;30382:1;30375:9;;;;;;;;:::i;:::-;;;;;;;:14;;;30391:6;30398:1;30391:9;;;;;;;;:::i;:::-;;;;;;;:12;;;30405:6;30412:1;30405:9;;;;;;;;:::i;30367:55::-;-1:-1:-1;;;;;30361:67:0;;30447:10;30459;30471:2;30485:1;30475:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;30475:12:0;;30361:141;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29984:530;;;;;29979:3;;;;;:::i;:::-;;;;29943:571;;;;29841:680;;;:::o;33697:196::-;33806:12;;;33768;33806;;;;;;;;;-1:-1:-1;;;;;33785:7:0;;;33799:5;;33785:34;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33767:52;;;33838:7;33830:55;;;;-1:-1:-1;;;33830:55:0;;28393:2:1;33830:55:0;;;28375:21:1;28432:2;28412:18;;;28405:30;28471:34;28451:18;;;28444:62;-1:-1:-1;;;28522:18:1;;;28515:33;28565:19;;33830:55:0;28191:399:1;33830:55:0;33756:137;33697:196;;:::o;23656:1494::-;23888:12;23902;23953:10;23935:14;:28;;23927:37;;;;;;24001:10;23983:14;:28;;23975:37;;;;;;24091:53;;-1:-1:-1;;;24091:53:0;;24075:13;;-1:-1:-1;;;;;24104:7:0;24091:29;;;;:53;;24121:6;;24129;;24137;;24091:53;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;24075:69;-1:-1:-1;;;;;;24159:19:0;;24155:116;;24203:56;;-1:-1:-1;;;24203:56:0;;-1:-1:-1;;;;;24216:7:0;24203:32;;;;:56;;24236:6;;24244;;24252;;24203:56;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;24195:64;;24155:116;24282:13;24297;24314:35;24326:6;24334;24342;24314:11;:35::i;:::-;24281:68;;;;24364:8;24376:1;24364:13;:30;;;;-1:-1:-1;24381:13:0;;24364:30;24360:783;;;24433:14;;-1:-1:-1;24449:14:0;;-1:-1:-1;24360:783:0;;;24497:19;24519:50;24534:14;24550:8;24560;24519:14;:50::i;:::-;24497:72;;24606:14;24588;:32;24584:548;;24667:10;24649:14;:28;;24641:70;;;;-1:-1:-1;;;24641:70:0;;20429:2:1;24641:70:0;;;20411:21:1;20468:2;20448:18;;;20441:30;20507:31;20487:18;;;20480:59;20556:18;;24641:70:0;20227:353:1;24641:70:0;24752:14;;-1:-1:-1;24768:14:0;-1:-1:-1;24768:14:0;24584:548;;;24824:19;24846:50;24861:14;24877:8;24887;24846:14;:50::i;:::-;24824:72;;24940:14;24922;:32;;24915:40;;;;:::i;:::-;25000:10;24982:14;:28;;24974:70;;;;-1:-1:-1;;;24974:70:0;;20071:2:1;24974:70:0;;;20053:21:1;20110:2;20090:18;;;20083:30;20149:31;20129:18;;;20122:59;20198:18;;24974:70:0;19869:353:1;24974:70:0;25085:14;-1:-1:-1;25101:14:0;;-1:-1:-1;24584:548:0;24482:661;24360:783;23916:1234;;;23656:1494;;;;;;;;;;:::o;6689:1673::-;6737:7;6761:1;6766;6761:6;6757:47;;-1:-1:-1;6791:1:0;;6689:1673;-1:-1:-1;6689:1673:0:o;6757:47::-;7495:14;7529:1;7518:7;7523:1;7518:4;:7::i;:::-;:12;;7512:1;:19;;7495:36;;7997:1;7986:6;7982:1;:10;;;;;:::i;:::-;;7973:6;:19;7972:26;;7963:35;;8047:1;8036:6;8032:1;:10;;;;;:::i;:::-;;8023:6;:19;8022:26;;8013:35;;8097:1;8086:6;8082:1;:10;;;;;:::i;:::-;;8073:6;:19;8072:26;;8063:35;;8147:1;8136:6;8132:1;:10;;;;;:::i;:::-;;8123:6;:19;8122:26;;8113:35;;8197:1;8186:6;8182:1;:10;;;;;:::i;:::-;;8173:6;:19;8172:26;;8163:35;;8247:1;8236:6;8232:1;:10;;;;;:::i;:::-;;8223:6;:19;8222:26;;8213:35;;8297:1;8286:6;8282:1;:10;;;;;:::i;:::-;;8273:6;:19;8272:26;;8263:35;;8320:23;8324:6;8336;8332:1;:10;;;;;:::i;:::-;;8320:3;:23::i;:::-;8313:30;6689:1673;-1:-1:-1;;;6689:1673:0:o;18718:307::-;18809:12;18852:1;18842:7;:11;18834:51;;;;-1:-1:-1;;;18834:51:0;;28797:2:1;18834:51:0;;;28779:21:1;28836:2;28816:18;;;28809:30;28875:29;28855:18;;;28848:57;28922:18;;18834:51:0;28595:351:1;18834:51:0;18915:1;18904:8;:12;:28;;;;;18931:1;18920:8;:12;18904:28;18896:71;;;;-1:-1:-1;;;18896:71:0;;29153:2:1;18896:71:0;;;29135:21:1;29192:2;29172:18;;;29165:30;29231:32;29211:18;;;29204:60;29281:18;;18896:71:0;28951:354:1;18896:71:0;19009:8;18988:18;18998:8;18988:7;:18;:::i;:::-;:29;;;;:::i;:::-;18978:39;18718:307;-1:-1:-1;;;;18718:307:0:o;621:106::-;679:7;710:1;706;:5;:13;;718:1;706:13;;;-1:-1:-1;714:1:0;;699:20;-1:-1:-1;621:106:0:o;33901:327::-;34014:1;33994:5;-1:-1:-1;;;;;33994:17:0;;:21;33986:30;;;;;;34083:59;;;-1:-1:-1;;;;;26660:32:1;;;34083:59:0;;;26642:51:1;26709:18;;;;26702:34;;;34083:59:0;;;;;;;;;;26615:18:1;;;;34083:59:0;;;;;;;-1:-1:-1;;;;;34083:59:0;-1:-1:-1;;;34083:59:0;;;34072:71;;-1:-1:-1;;;;34072:10:0;;;;:71;;34083:59;34072:71;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34027:116;;;;34162:7;:57;;;;-1:-1:-1;34174:11:0;;:16;;:44;;;34205:4;34194:24;;;;;;;;;;;;:::i;:::-;34154:66;;;;;;33975:253;;33901:327;;;:::o;8839:1019::-;8891:7;;8978:3;8969:12;;;:16;8965:102;;9016:3;9006:13;;;;9038;8965:102;9094:2;9085:11;;;:15;9081:99;;9131:2;9121:12;;;;9152;9081:99;9207:2;9198:11;;;:15;9194:99;;9244:2;9234:12;;;;9265;9194:99;9320:2;9311:11;;;:15;9307:99;;9357:2;9347:12;;;;9378;9307:99;9433:1;9424:10;;;:14;9420:96;;9469:1;9459:11;;;;9489;9420:96;9543:1;9534:10;;;:14;9530:96;;9579:1;9569:11;;;;9599;9530:96;9653:1;9644:10;;;:14;9640:96;;9689:1;9679:11;;;;9709;9640:96;9763:1;9754:10;;;:14;9750:66;;9799:1;9789:11;9844:6;8839:1019;-1:-1:-1;;8839:1019:0:o;14:127:1:-;75:10;70:3;66:20;63:1;56:31;106:4;103:1;96:15;130:4;127:1;120:15;146:131;-1:-1:-1;;;;;221:31:1;;211:42;;201:70;;267:1;264;257:12;201:70;146:131;:::o;282:134::-;350:20;;379:31;350:20;379:31;:::i;:::-;282:134;;;:::o;421:118::-;507:5;500:13;493:21;486:5;483:32;473:60;;529:1;526;519:12;544:941;663:6;671;679;687;695;703;711;719;772:3;760:9;751:7;747:23;743:33;740:53;;;789:1;786;779:12;740:53;828:9;815:23;847:31;872:5;847:31;:::i;:::-;897:5;-1:-1:-1;954:2:1;939:18;;926:32;967:33;926:32;967:33;:::i;:::-;1019:7;-1:-1:-1;1078:2:1;1063:18;;1050:32;1091:30;1050:32;1091:30;:::i;:::-;1140:7;-1:-1:-1;1194:2:1;1179:18;;1166:32;;-1:-1:-1;1245:3:1;1230:19;;1217:33;;-1:-1:-1;1297:3:1;1282:19;;1269:33;;-1:-1:-1;1354:3:1;1339:19;;1326:33;1368;1326;1368;:::i;:::-;1420:7;1410:17;;;1474:3;1463:9;1459:19;1446:33;1436:43;;544:941;;;;;;;;;;;:::o;1743:872::-;1853:6;1861;1869;1877;1885;1893;1901;1954:3;1942:9;1933:7;1929:23;1925:33;1922:53;;;1971:1;1968;1961:12;1922:53;2007:9;1994:23;1984:33;;2064:2;2053:9;2049:18;2036:32;2026:42;;2118:2;2107:9;2103:18;2090:32;2131:31;2156:5;2131:31;:::i;:::-;2181:5;-1:-1:-1;2238:2:1;2223:18;;2210:32;2251:33;2210:32;2251:33;:::i;:::-;2303:7;-1:-1:-1;2362:3:1;2347:19;;2334:33;2376:30;2334:33;2376:30;:::i;:::-;2425:7;-1:-1:-1;2484:3:1;2469:19;;2456:33;2498;2456;2498;:::i;:::-;2550:7;2540:17;;;2604:3;2593:9;2589:19;2576:33;2566:43;;1743:872;;;;;;;;;;:::o;2620:632::-;2791:2;2843:21;;;2913:13;;2816:18;;;2935:22;;;2762:4;;2791:2;3014:15;;;;2988:2;2973:18;;;2762:4;3057:169;3071:6;3068:1;3065:13;3057:169;;;3132:13;;3120:26;;3201:15;;;;3166:12;;;;3093:1;3086:9;3057:169;;;-1:-1:-1;3243:3:1;;2620:632;-1:-1:-1;;;;;;2620:632:1:o;3257:384::-;3334:8;3344:6;3398:3;3391:4;3383:6;3379:17;3375:27;3365:55;;3416:1;3413;3406:12;3365:55;-1:-1:-1;3439:20:1;;3482:18;3471:30;;3468:50;;;3514:1;3511;3504:12;3468:50;3551:4;3543:6;3539:17;3527:29;;3614:3;3607:4;3599;3591:6;3587:17;3579:6;3575:30;3571:41;3568:50;3565:70;;;3631:1;3628;3621:12;3646:817;3793:6;3801;3809;3817;3825;3833;3886:3;3874:9;3865:7;3861:23;3857:33;3854:53;;;3903:1;3900;3893:12;3854:53;3939:9;3926:23;3916:33;;3996:2;3985:9;3981:18;3968:32;3958:42;;4051:2;4040:9;4036:18;4023:32;4078:18;4070:6;4067:30;4064:50;;;4110:1;4107;4100:12;4064:50;4149:84;4225:7;4216:6;4205:9;4201:22;4149:84;:::i;:::-;4252:8;;-1:-1:-1;4123:110:1;-1:-1:-1;;4337:2:1;4322:18;;4309:32;4350:31;4309:32;4350:31;:::i;:::-;4400:5;4390:15;;;4452:3;4441:9;4437:19;4424:33;4414:43;;3646:817;;;;;;;;:::o;4690:592::-;4773:6;4781;4789;4797;4850:3;4838:9;4829:7;4825:23;4821:33;4818:53;;;4867:1;4864;4857:12;4818:53;4906:9;4893:23;4925:31;4950:5;4925:31;:::i;:::-;4975:5;-1:-1:-1;5032:2:1;5017:18;;5004:32;5045:33;5004:32;5045:33;:::i;:::-;5097:7;-1:-1:-1;5156:2:1;5141:18;;5128:32;5169:30;5128:32;5169:30;:::i;:::-;4690:592;;;;-1:-1:-1;5218:7:1;;5272:2;5257:18;5244:32;;-1:-1:-1;;4690:592:1:o;5287:156::-;5353:20;;5413:4;5402:16;;5392:27;;5382:55;;5433:1;5430;5423:12;5448:1146;5589:6;5597;5605;5613;5621;5629;5637;5645;5653;5661;5669:7;5723:3;5711:9;5702:7;5698:23;5694:33;5691:53;;;5740:1;5737;5730:12;5691:53;5779:9;5766:23;5798:31;5823:5;5798:31;:::i;:::-;5848:5;-1:-1:-1;5905:2:1;5890:18;;5877:32;5918:30;5877:32;5918:30;:::i;:::-;5967:7;-1:-1:-1;6021:2:1;6006:18;;5993:32;;-1:-1:-1;6072:2:1;6057:18;;6044:32;;-1:-1:-1;6123:3:1;6108:19;;6095:33;;-1:-1:-1;6180:3:1;6165:19;;6152:33;6194;6152;6194;:::i;:::-;6246:7;-1:-1:-1;6300:3:1;6285:19;;6272:33;;-1:-1:-1;6357:3:1;6342:19;;6329:33;6371:30;6329:33;6371:30;:::i;:::-;6420:7;-1:-1:-1;6446:37:1;6478:3;6463:19;;6446:37;:::i;:::-;6436:47;;6530:3;6519:9;6515:19;6502:33;6492:43;;6583:3;6572:9;6568:19;6555:33;6544:44;;5448:1146;;;;;;;;;;;;;;:::o;6599:523::-;6673:6;6681;6689;6742:2;6730:9;6721:7;6717:23;6713:32;6710:52;;;6758:1;6755;6748:12;6710:52;6797:9;6784:23;6816:31;6841:5;6816:31;:::i;:::-;6866:5;-1:-1:-1;6923:2:1;6908:18;;6895:32;6936:33;6895:32;6936:33;:::i;:::-;6988:7;-1:-1:-1;7047:2:1;7032:18;;7019:32;7060:30;7019:32;7060:30;:::i;:::-;7109:7;7099:17;;;6599:523;;;;;:::o;7335:388::-;7403:6;7411;7464:2;7452:9;7443:7;7439:23;7435:32;7432:52;;;7480:1;7477;7470:12;7432:52;7519:9;7506:23;7538:31;7563:5;7538:31;:::i;:::-;7588:5;-1:-1:-1;7645:2:1;7630:18;;7617:32;7658:33;7617:32;7658:33;:::i;:::-;7710:7;7700:17;;;7335:388;;;;;:::o;8037:1010::-;8165:6;8173;8181;8189;8197;8205;8213;8221;8229;8282:3;8270:9;8261:7;8257:23;8253:33;8250:53;;;8299:1;8296;8289:12;8250:53;8338:9;8325:23;8357:31;8382:5;8357:31;:::i;:::-;8407:5;-1:-1:-1;8464:2:1;8449:18;;8436:32;8477:33;8436:32;8477:33;:::i;:::-;8529:7;-1:-1:-1;8588:2:1;8573:18;;8560:32;8601:30;8560:32;8601:30;:::i;:::-;8650:7;-1:-1:-1;8704:2:1;8689:18;;8676:32;;-1:-1:-1;8755:3:1;8740:19;;8727:33;;-1:-1:-1;8807:3:1;8792:19;;8779:33;;-1:-1:-1;8859:3:1;8844:19;;8831:33;;-1:-1:-1;8916:3:1;8901:19;;8888:33;8930;8888;8930;:::i;:::-;8982:7;8972:17;;;9036:3;9025:9;9021:19;9008:33;8998:43;;8037:1010;;;;;;;;;;;:::o;9376:456::-;9453:6;9461;9469;9522:2;9510:9;9501:7;9497:23;9493:32;9490:52;;;9538:1;9535;9528:12;9490:52;9574:9;9561:23;9551:33;;9634:2;9623:9;9619:18;9606:32;9647:31;9672:5;9647:31;:::i;:::-;9697:5;-1:-1:-1;9754:2:1;9739:18;;9726:32;9767:33;9726:32;9767:33;:::i;10100:748::-;10238:6;10246;10254;10262;10270;10323:3;10311:9;10302:7;10298:23;10294:33;10291:53;;;10340:1;10337;10330:12;10291:53;10376:9;10363:23;10353:33;;10437:2;10426:9;10422:18;10409:32;10464:18;10456:6;10453:30;10450:50;;;10496:1;10493;10486:12;10450:50;10535:84;10611:7;10602:6;10591:9;10587:22;10535:84;:::i;:::-;10638:8;;-1:-1:-1;10509:110:1;-1:-1:-1;;10723:2:1;10708:18;;10695:32;10736:31;10695:32;10736:31;:::i;:::-;10100:748;;;;-1:-1:-1;10100:748:1;;10838:2;10823:18;10810:32;;10100:748;-1:-1:-1;;10100:748:1:o;10853:127::-;10914:10;10909:3;10905:20;10902:1;10895:31;10945:4;10942:1;10935:15;10969:4;10966:1;10959:15;10985:275;11056:2;11050:9;11121:2;11102:13;;-1:-1:-1;;11098:27:1;11086:40;;11156:18;11141:34;;11177:22;;;11138:62;11135:88;;;11203:18;;:::i;:::-;11239:2;11232:22;10985:275;;-1:-1:-1;10985:275:1:o;11265:183::-;11325:4;11358:18;11350:6;11347:30;11344:56;;;11380:18;;:::i;:::-;-1:-1:-1;11425:1:1;11421:14;11437:4;11417:25;;11265:183::o;11453:1411::-;11616:6;11624;11632;11640;11648;11701:3;11689:9;11680:7;11676:23;11672:33;11669:53;;;11718:1;11715;11708:12;11669:53;11758:9;11745:23;11787:18;11828:2;11820:6;11817:14;11814:34;;;11844:1;11841;11834:12;11814:34;11882:6;11871:9;11867:22;11857:32;;11927:7;11920:4;11916:2;11912:13;11908:27;11898:55;;11949:1;11946;11939:12;11898:55;11985:2;11972:16;12007:4;12031:60;12047:43;12087:2;12047:43;:::i;:::-;12031:60;:::i;:::-;12125:15;;;12207:1;12203:10;;;;12195:19;;12191:28;;;12156:12;;;;12231:19;;;12228:39;;;12263:1;12260;12253:12;12228:39;12287:11;;;;12307:142;12323:6;12318:3;12315:15;12307:142;;;12389:17;;12377:30;;12340:12;;;;12427;;;;12307:142;;;12468:5;-1:-1:-1;;12511:18:1;;12498:32;;-1:-1:-1;;12542:16:1;;;12539:36;;;12571:1;12568;12561:12;12539:36;;12610:86;12688:7;12677:8;12666:9;12662:24;12610:86;:::i;:::-;12715:8;;-1:-1:-1;12584:112:1;-1:-1:-1;12769:38:1;;-1:-1:-1;12803:2:1;12788:18;;12769:38;:::i;12869:752::-;12921:5;12969:4;12957:9;12952:3;12948:19;12944:30;12941:50;;;12987:1;12984;12977:12;12941:50;13020:2;13014:9;13062:4;13054:6;13050:17;13133:6;13121:10;13118:22;13097:18;13085:10;13082:34;13079:62;13076:88;;;13144:18;;:::i;:::-;13180:2;13173:22;13213:6;-1:-1:-1;13213:6:1;13243:23;;13275:33;13243:23;13275:33;:::i;:::-;13317:23;;13392:2;13377:18;;13364:32;13405:33;13364:32;13405:33;:::i;:::-;13466:2;13454:15;;13447:32;13531:2;13516:18;;13503:32;13544:30;13503:32;13544:30;:::i;:::-;13602:2;13590:15;;;;13583:32;12869:752;;-1:-1:-1;;12869:752:1:o;13626:1026::-;13742:6;13750;13803:2;13791:9;13782:7;13778:23;13774:32;13771:52;;;13819:1;13816;13809:12;13771:52;13855:9;13842:23;13832:33;;13884:2;13937;13926:9;13922:18;13909:32;13964:18;13956:6;13953:30;13950:50;;;13996:1;13993;13986:12;13950:50;14019:22;;14072:4;14064:13;;14060:27;-1:-1:-1;14050:55:1;;14101:1;14098;14091:12;14050:55;14137:2;14124:16;14160:60;14176:43;14216:2;14176:43;:::i;14160:60::-;14254:15;;;14316:4;14355:11;;;14347:20;;14343:29;;;14285:12;;;;14242:3;14384:19;;;14381:39;;;14416:1;14413;14406:12;14381:39;14440:11;;;;14460:162;14476:6;14471:3;14468:15;14460:162;;;14542:37;14571:7;14566:3;14542:37;:::i;:::-;14530:50;;14493:12;;;;14600;;;;14460:162;;;14464:3;14641:5;14631:15;;;;;;;13626:1026;;;;;:::o;14657:661::-;14749:6;14757;14765;14773;14781;14834:3;14822:9;14813:7;14809:23;14805:33;14802:53;;;14851:1;14848;14841:12;14802:53;14890:9;14877:23;14909:31;14934:5;14909:31;:::i;:::-;14959:5;-1:-1:-1;15016:2:1;15001:18;;14988:32;15029:33;14988:32;15029:33;:::i;:::-;15081:7;-1:-1:-1;15140:2:1;15125:18;;15112:32;15153:30;15112:32;15153:30;:::i;:::-;14657:661;;;;-1:-1:-1;15202:7:1;;15256:2;15241:18;;15228:32;;-1:-1:-1;15307:3:1;15292:19;15279:33;;14657:661;-1:-1:-1;;14657:661:1:o;15323:1290::-;15473:6;15481;15489;15497;15505;15513;15521;15529;15537;15545;15553:7;15562;15616:3;15604:9;15595:7;15591:23;15587:33;15584:53;;;15633:1;15630;15623:12;15584:53;15672:9;15659:23;15691:31;15716:5;15691:31;:::i;:::-;15741:5;-1:-1:-1;15798:2:1;15783:18;;15770:32;15811:33;15770:32;15811:33;:::i;:::-;15863:7;-1:-1:-1;15922:2:1;15907:18;;15894:32;15935:30;15894:32;15935:30;:::i;:::-;15984:7;-1:-1:-1;16038:2:1;16023:18;;16010:32;;-1:-1:-1;16089:3:1;16074:19;;16061:33;;-1:-1:-1;16141:3:1;16126:19;;16113:33;;-1:-1:-1;16198:3:1;16183:19;;16170:33;16212;16170;16212;:::i;:::-;16264:7;-1:-1:-1;16318:3:1;16303:19;;16290:33;;-1:-1:-1;16375:3:1;16360:19;;16347:33;16389:30;16347:33;16389:30;:::i;:::-;16438:7;-1:-1:-1;16464:37:1;16496:3;16481:19;;16464:37;:::i;:::-;16454:47;;16549:3;16538:9;16534:19;16521:33;16510:44;;16602:3;16591:9;16587:19;16574:33;16563:44;;15323:1290;;;;;;;;;;;;;;:::o;16618:799::-;16728:6;16736;16744;16752;16760;16768;16776;16829:3;16817:9;16808:7;16804:23;16800:33;16797:53;;;16846:1;16843;16836:12;16797:53;16885:9;16872:23;16904:31;16929:5;16904:31;:::i;:::-;16954:5;-1:-1:-1;17011:2:1;16996:18;;16983:32;17024:30;16983:32;17024:30;:::i;:::-;17073:7;-1:-1:-1;17127:2:1;17112:18;;17099:32;;-1:-1:-1;17178:2:1;17163:18;;17150:32;;-1:-1:-1;17229:3:1;17214:19;;17201:33;;-1:-1:-1;17286:3:1;17271:19;;17258:33;17300;17258;17300;:::i;17422:592::-;17505:6;17513;17521;17529;17582:3;17570:9;17561:7;17557:23;17553:33;17550:53;;;17599:1;17596;17589:12;17550:53;17635:9;17622:23;17612:33;;17695:2;17684:9;17680:18;17667:32;17708:31;17733:5;17708:31;:::i;:::-;17758:5;-1:-1:-1;17815:2:1;17800:18;;17787:32;17828:33;17787:32;17828:33;:::i;:::-;17880:7;-1:-1:-1;17939:2:1;17924:18;;17911:32;17952:30;17911:32;17952:30;:::i;:::-;17422:592;;;;-1:-1:-1;17422:592:1;;-1:-1:-1;;17422:592:1:o;18201:247::-;18260:6;18313:2;18301:9;18292:7;18288:23;18284:32;18281:52;;;18329:1;18326;18319:12;18281:52;18368:9;18355:23;18387:31;18412:5;18387:31;:::i;18645:339::-;18847:2;18829:21;;;18886:2;18866:18;;;18859:30;-1:-1:-1;;;18920:2:1;18905:18;;18898:45;18975:2;18960:18;;18645:339::o;19369:245::-;19436:6;19489:2;19477:9;19468:7;19464:23;19460:32;19457:52;;;19505:1;19502;19495:12;19457:52;19537:9;19531:16;19556:28;19578:5;19556:28;:::i;19619:245::-;19698:6;19706;19759:2;19747:9;19738:7;19734:23;19730:32;19727:52;;;19775:1;19772;19765:12;19727:52;-1:-1:-1;;19798:16:1;;19854:2;19839:18;;;19833:25;19798:16;;19833:25;;-1:-1:-1;19619:245:1:o;20585:127::-;20646:10;20641:3;20637:20;20634:1;20627:31;20677:4;20674:1;20667:15;20701:4;20698:1;20691:15;20717:127;20778:10;20773:3;20769:20;20766:1;20759:31;20809:4;20806:1;20799:15;20833:4;20830:1;20823:15;20849:125;20889:4;20917:1;20914;20911:8;20908:34;;;20922:18;;:::i;:::-;-1:-1:-1;20959:9:1;;20849:125::o;20979:398::-;21181:2;21163:21;;;21220:2;21200:18;;;21193:30;21259:34;21254:2;21239:18;;21232:62;-1:-1:-1;;;21325:2:1;21310:18;;21303:32;21367:3;21352:19;;20979:398::o;21382:344::-;21584:2;21566:21;;;21623:2;21603:18;;;21596:30;-1:-1:-1;;;21657:2:1;21642:18;;21635:50;21717:2;21702:18;;21382:344::o;21731:223::-;21813:6;21866:2;21854:9;21845:7;21841:23;21837:32;21834:52;;;21882:1;21879;21872:12;21834:52;21905:43;21940:7;21929:9;21905:43;:::i;21959:241::-;22015:6;22068:2;22056:9;22047:7;22043:23;22039:32;22036:52;;;22084:1;22081;22074:12;22036:52;22123:9;22110:23;22142:28;22164:5;22142:28;:::i;22205:385::-;-1:-1:-1;;;;;22457:15:1;;;22439:34;;22509:15;;;;22504:2;22489:18;;22482:43;22568:14;;22561:22;22556:2;22541:18;;22534:50;22389:2;22374:18;;22205:385::o;22595:251::-;22665:6;22718:2;22706:9;22697:7;22693:23;22689:32;22686:52;;;22734:1;22731;22724:12;22686:52;22766:9;22760:16;22785:31;22810:5;22785:31;:::i;22851:184::-;22921:6;22974:2;22962:9;22953:7;22949:23;22945:32;22942:52;;;22990:1;22987;22980:12;22942:52;-1:-1:-1;23013:16:1;;22851:184;-1:-1:-1;22851:184:1:o;23040:168::-;23080:7;23146:1;23142;23138:6;23134:14;23131:1;23128:21;23123:1;23116:9;23109:17;23105:45;23102:71;;;23153:18;;:::i;:::-;-1:-1:-1;23193:9:1;;23040:168::o;23213:127::-;23274:10;23269:3;23265:20;23262:1;23255:31;23305:4;23302:1;23295:15;23329:4;23326:1;23319:15;23345:217;23385:1;23411;23401:132;;23455:10;23450:3;23446:20;23443:1;23436:31;23490:4;23487:1;23480:15;23518:4;23515:1;23508:15;23401:132;-1:-1:-1;23547:9:1;;23345:217::o;23567:670::-;-1:-1:-1;;;;;23934:15:1;;;23916:34;;23986:15;;;;23981:2;23966:18;;23959:43;24033:2;24018:18;;24011:34;;;;24076:2;24061:18;;24054:34;;;;24137:4;24125:17;24119:3;24104:19;;24097:46;23896:3;24159:19;;24152:35;24218:3;24203:19;;24196:35;;;;23865:3;23850:19;;23567:670::o;26157:306::-;26245:6;26253;26261;26314:2;26302:9;26293:7;26289:23;26285:32;26282:52;;;26330:1;26327;26320:12;26282:52;26359:9;26353:16;26343:26;;26409:2;26398:9;26394:18;26388:25;26378:35;;26453:2;26442:9;26438:18;26432:25;26422:35;;26157:306;;;;;:::o;26747:128::-;26787:3;26818:1;26814:6;26811:1;26808:13;26805:39;;;26824:18;;:::i;:::-;-1:-1:-1;26860:9:1;;26747:128::o;26880:135::-;26919:3;26940:17;;;26937:43;;26960:18;;:::i;:::-;-1:-1:-1;27007:1:1;26996:13;;26880:135::o;27020:258::-;27092:1;27102:113;27116:6;27113:1;27110:13;27102:113;;;27192:11;;;27186:18;27173:11;;;27166:39;27138:2;27131:10;27102:113;;;27233:6;27230:1;27227:13;27224:48;;;-1:-1:-1;;27268:1:1;27250:16;;27243:27;27020:258::o;27283:274::-;27412:3;27450:6;27444:13;27466:53;27512:6;27507:3;27500:4;27492:6;27488:17;27466:53;:::i;:::-;27535:16;;;;;27283:274;-1:-1:-1;;27283:274:1:o;27562:624::-;27793:6;27782:9;27775:25;27836:6;27831:2;27820:9;27816:18;27809:34;27908:1;27904;27899:3;27895:11;27891:19;27883:6;27879:32;27874:2;27863:9;27859:18;27852:60;27948:3;27943:2;27932:9;27928:18;27921:31;27756:4;27981:6;27975:13;28025:6;28019:3;28008:9;28004:19;27997:35;28041:67;28101:6;28095:3;28084:9;28080:19;28075:2;28067:6;28063:15;28041:67;:::i;:::-;28169:2;28148:15;-1:-1:-1;;28144:29:1;28129:45;;;;28176:3;28125:55;;27562:624;-1:-1:-1;;;;;27562:624:1:o

Swarm Source

ipfs://0c9c676354dd0001fb8ca566100ca1eeea60d7cd729cf793e9572f36a0fbc8d1
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.