Contract 0xa66e7c3e2a7b1f09389d1363d9cc87e3080bff1b

 

Contract Overview

Balance:
0.044733045879677455 BNB

BNB Value:
$16.61 (@ $371.32/BNB)

Token:
 
Txn Hash Method
Block
From
To
Value [Txn Fee]
0x675a50d57706e248bf100b05fac6457498916ed60fc884d38196bd29175df3ebSELL145817562022-01-22 7:44:251 day 19 hrs ago0xa7d9e6435e0fde322eb84e76f019ddf8691d780d IN 0xa66e7c3e2a7b1f09389d1363d9cc87e3080bff1b0 BNB0.005683735
0xabcdb43fe477cbc651167cf57c335aff021c4b3b14b09d8986a24d311b1077baSELL145537492022-01-21 8:19:122 days 18 hrs ago0xa7d9e6435e0fde322eb84e76f019ddf8691d780d IN 0xa66e7c3e2a7b1f09389d1363d9cc87e3080bff1b0 BNB0.00338183
0xb367f25fcde8969a88cd24bc8b12c76deb7374339c621e05430e08852fbc6accSELL145537202022-01-21 8:17:452 days 18 hrs ago0xa7d9e6435e0fde322eb84e76f019ddf8691d780d IN 0xa66e7c3e2a7b1f09389d1363d9cc87e3080bff1b0 BNB0.003164745
0xd13430a71abcef3f2a89ad0efa0aee3d6af5602b841e279f22e2256a5d6a789dBUY145268132022-01-20 9:50:163 days 17 hrs ago0xb9694c5853e94c2a220f30b17a884770af669b32 IN 0xa66e7c3e2a7b1f09389d1363d9cc87e3080bff1b0.24 BNB0.002585965
0x113ffba51f0dd12145346df0336d1a0715d129a3112dff7bebc0d2d5e198ba60SELL145237802022-01-20 7:18:363 days 19 hrs ago0xa7d9e6435e0fde322eb84e76f019ddf8691d780d IN 0xa66e7c3e2a7b1f09389d1363d9cc87e3080bff1b0 BNB0.00338183
0x87731cd8ab0f62318cafebc2ffb3d6336bf327d8ca06854dc6ca580384311eaaSELL145064082022-01-19 16:49:204 days 10 hrs ago0xa7d9e6435e0fde322eb84e76f019ddf8691d780d IN 0xa66e7c3e2a7b1f09389d1363d9cc87e3080bff1b0 BNB0.005683735
0xd4333b287d31e889d8f42bbca66cf9afd4d2eae74bc0325775bc04d67ecc5176BUY145020832022-01-19 13:08:274 days 13 hrs ago0x2c59e747e822807dcec17c59601ec8ac0b55fecd IN 0xa66e7c3e2a7b1f09389d1363d9cc87e3080bff1b0.06 BNB0.002660895
0xdbb2dee78b8e380d453cde1a169df420eaee202bbaeb236fc0f4d6068984bd29Deposit Internal144995812022-01-19 11:03:164 days 16 hrs ago0xffe231ec752fd2b20acc3614ccf92ae04162c99f IN 0xa66e7c3e2a7b1f09389d1363d9cc87e3080bff1b0 BNB0.00096195
0x023920457d24ba7976ebe723fbd5ad0d4ce404cc38e6685a6f7217be3ba83875SELL144945482022-01-19 6:51:154 days 20 hrs ago0xa7d9e6435e0fde322eb84e76f019ddf8691d780d IN 0xa66e7c3e2a7b1f09389d1363d9cc87e3080bff1b0 BNB0.00338183
0x7318bf339057173d62f9c90c22e1c1fb236f2ff690b6ba6e1ed2100436cca44dSELL144770042022-01-18 16:09:565 days 10 hrs ago0xa08827a560ff44fe1c45b7fb30f19f4e91c39bfa IN 0xa66e7c3e2a7b1f09389d1363d9cc87e3080bff1b0 BNB0.00311212
0xd81d9e5473681f019a56c6d81b66f135cfa9e0d56dd5aabc4b88077955a20f13SELL144440282022-01-17 12:13:416 days 14 hrs ago0xa7d9e6435e0fde322eb84e76f019ddf8691d780d IN 0xa66e7c3e2a7b1f09389d1363d9cc87e3080bff1b0 BNB0.00338183
0x15b9f66f8d9cdac28f5b6b99d02d3744e001303a0a0b895e300b8181ec983692BUY144373862022-01-17 6:39:386 days 20 hrs ago0xb9694c5853e94c2a220f30b17a884770af669b32 IN 0xa66e7c3e2a7b1f09389d1363d9cc87e3080bff1b0.38 BNB0.002660965
0x42b0ba09452b982ed696c7cfc6ea4b500313f96f6ecf76bf50582464eccac407SELL144203592022-01-16 16:23:057 days 10 hrs ago0xa7d9e6435e0fde322eb84e76f019ddf8691d780d IN 0xa66e7c3e2a7b1f09389d1363d9cc87e3080bff1b0 BNB0.005683855
0x7fa664a04aa1e20790f0e31b2e1dd208558ed291bed774433e7d764230cc7460SELL143788822022-01-15 5:41:238 days 21 hrs ago0xc569a225659ecaef240f0ed98048eb814d7fd586 IN 0xa66e7c3e2a7b1f09389d1363d9cc87e3080bff1b0 BNB0.003410865
0xedee9cdc155abe7be855e8b8e71c2548b937e542d7bc1005cf5881ea4ef25cb4SELL143788712022-01-15 5:40:508 days 21 hrs ago0xc569a225659ecaef240f0ed98048eb814d7fd586 IN 0xa66e7c3e2a7b1f09389d1363d9cc87e3080bff1b0 BNB0.00311872
0x7dafe3fb08c21caf2cf33d11463c5fba644fb8f3d121645960b0154e21d42517Swap To Swap143442112022-01-14 0:43:1610 days 2 hrs ago0xffe231ec752fd2b20acc3614ccf92ae04162c99f IN 0xa66e7c3e2a7b1f09389d1363d9cc87e3080bff1b0 BNB0.001179225
0xec0c69e67eb4932648c881a67efa30acb948f94ea96d119d7e0f5e15fe0c9c2cBUY142711932022-01-11 11:47:2912 days 15 hrs ago0xb9694c5853e94c2a220f30b17a884770af669b32 IN 0xa66e7c3e2a7b1f09389d1363d9cc87e3080bff1b0.33 BNB0.002585965
0x5e16d7d3d6e914bd394547ad155dbf5ad661210cace8924ac2dace4079de8b0aBUY142679862022-01-11 9:05:2512 days 17 hrs ago0x21a66c0f7b418f7f6a5eecf95dcd29609ba0b1b9 IN 0xa66e7c3e2a7b1f09389d1363d9cc87e3080bff1b0.5 BNB0.002654805
0x0add2070a264d8d8abafc698916f57a927063d87788945f1b5099ce39bd7c62cSwap To Swap142307332022-01-10 1:58:1514 days 1 hr ago0xffe231ec752fd2b20acc3614ccf92ae04162c99f IN 0xa66e7c3e2a7b1f09389d1363d9cc87e3080bff1b0 BNB0.001179225
0x1253a9e860394ca4f479d3f001b5cd692a70b7bd0bbaaab7d1ccf42dbbbf8b31SELL141940302022-01-08 19:22:0615 days 7 hrs ago0x19705126863e94aca1a6ad5b875f8f11cd0ea964 IN 0xa66e7c3e2a7b1f09389d1363d9cc87e3080bff1b0 BNB0.003164865
0xe0f468e9d73da815e1ab0774657fe1dd5a01266e3cab6682ff7cd3977db370e2SELL141940222022-01-08 19:21:4215 days 7 hrs ago0x19705126863e94aca1a6ad5b875f8f11cd0ea964 IN 0xa66e7c3e2a7b1f09389d1363d9cc87e3080bff1b0 BNB0.00338189
0xaf27cdfbf2dbbb8d2cb26ea1d6feb49b04515e7d15e441014e7d6c1d3ad68bc8BUY141462582022-01-07 3:27:3316 days 23 hrs ago0xb9694c5853e94c2a220f30b17a884770af669b32 IN 0xa66e7c3e2a7b1f09389d1363d9cc87e3080bff1b0.28 BNB0.002585965
0x7db7d504bc4fd792d1d3c31ab2c5592655924cec8a1e12474a410766b05bc6fbSELL141450262022-01-07 2:25:5717 days 39 mins ago0x51164f03462578ce4b5594aa0dbcd32f2e451d88 IN 0xa66e7c3e2a7b1f09389d1363d9cc87e3080bff1b0 BNB0.00079313
0x8a50524f0295446b5f3a12d8fff773de1a36539259916ea79bbe9045ad220db8SELL141449642022-01-07 2:22:5117 days 42 mins ago0x51164f03462578ce4b5594aa0dbcd32f2e451d88 IN 0xa66e7c3e2a7b1f09389d1363d9cc87e3080bff1b0 BNB0.00079313
0xa8e68ff5bc33e22515126b9f7569c8bcf85ca471a3a9a928f133181ee9f34ea0BUY141447232022-01-07 2:10:4817 days 54 mins ago0x51164f03462578ce4b5594aa0dbcd32f2e451d88 IN 0xa66e7c3e2a7b1f09389d1363d9cc87e3080bff1b0.02 BNB0.002660835
[ Download CSV Export 
Latest 25 internal transaction
Parent Txn Hash Block From To Value
0x10b1c3b1f797a359006e421fd036db14fbee1a5db01c3e1c343c25888bc11619145817562022-01-22 7:44:251 day 19 hrs ago 0xa66e7c3e2a7b1f09389d1363d9cc87e3080bff1b0xa0045d9864b2b1b29f2f7fa122138e8bce87d9730.003 BNB
0x10b1c3b1f797a359006e421fd036db14fbee1a5db01c3e1c343c25888bc11619145817562022-01-22 7:44:251 day 19 hrs ago 0xa66e7c3e2a7b1f09389d1363d9cc87e3080bff1b 0x87b1acce6a1958e522233a737313c086551a5c760.997 BNB
0x10b1c3b1f797a359006e421fd036db14fbee1a5db01c3e1c343c25888bc11619145817562022-01-22 7:44:251 day 19 hrs ago 0xa0045d9864b2b1b29f2f7fa122138e8bce87d9730xa66e7c3e2a7b1f09389d1363d9cc87e3080bff1b1 BNB
0x10b1c3b1f797a359006e421fd036db14fbee1a5db01c3e1c343c25888bc11619145817562022-01-22 7:44:251 day 19 hrs ago 0xa66e7c3e2a7b1f09389d1363d9cc87e3080bff1b 0x0e4db3ff1bc018c43e847ae0525621b57b37c6240.003 BNB
0x10b1c3b1f797a359006e421fd036db14fbee1a5db01c3e1c343c25888bc11619145817562022-01-22 7:44:251 day 19 hrs ago 0xa66e7c3e2a7b1f09389d1363d9cc87e3080bff1b 0x87b1acce6a1958e522233a737313c086551a5c760.997 BNB
0x10b1c3b1f797a359006e421fd036db14fbee1a5db01c3e1c343c25888bc11619145817562022-01-22 7:44:251 day 19 hrs ago 0x0e4db3ff1bc018c43e847ae0525621b57b37c6240xa66e7c3e2a7b1f09389d1363d9cc87e3080bff1b1 BNB
0x675a50d57706e248bf100b05fac6457498916ed60fc884d38196bd29175df3eb145817562022-01-22 7:44:251 day 19 hrs ago 0xa66e7c3e2a7b1f09389d1363d9cc87e3080bff1b 0x818e2013dd7d9bf4547aaabf6b617c1262578bc70.008637485459196057 BNB
0x675a50d57706e248bf100b05fac6457498916ed60fc884d38196bd29175df3eb145817562022-01-22 7:44:251 day 19 hrs ago 0x87b1acce6a1958e522233a737313c086551a5c760xa66e7c3e2a7b1f09389d1363d9cc87e3080bff1b0.008637485459196057 BNB
0x675a50d57706e248bf100b05fac6457498916ed60fc884d38196bd29175df3eb145817562022-01-22 7:44:251 day 19 hrs ago 0xa66e7c3e2a7b1f09389d1363d9cc87e3080bff1b0xa7d9e6435e0fde322eb84e76f019ddf8691d780d1.35836984826694897 BNB
0x675a50d57706e248bf100b05fac6457498916ed60fc884d38196bd29175df3eb145817562022-01-22 7:44:251 day 19 hrs ago 0x87b1acce6a1958e522233a737313c086551a5c760xa66e7c3e2a7b1f09389d1363d9cc87e3080bff1b1.360435469460758158 BNB
0x89c736ac9fd6ca93268a746069a34034abe0af4cbfca3962700b1d88d55b3bbc145537492022-01-21 8:19:122 days 18 hrs ago 0xa66e7c3e2a7b1f09389d1363d9cc87e3080bff1b0xa1ddd456ad998053a0d429af54446a9d7b9674c90.003 BNB
0x89c736ac9fd6ca93268a746069a34034abe0af4cbfca3962700b1d88d55b3bbc145537492022-01-21 8:19:122 days 18 hrs ago 0xa66e7c3e2a7b1f09389d1363d9cc87e3080bff1b 0x87b1acce6a1958e522233a737313c086551a5c760.997 BNB
0x89c736ac9fd6ca93268a746069a34034abe0af4cbfca3962700b1d88d55b3bbc145537492022-01-21 8:19:122 days 18 hrs ago 0xa1ddd456ad998053a0d429af54446a9d7b9674c90xa66e7c3e2a7b1f09389d1363d9cc87e3080bff1b1 BNB
0x89c736ac9fd6ca93268a746069a34034abe0af4cbfca3962700b1d88d55b3bbc145537492022-01-21 8:19:122 days 18 hrs ago 0xa66e7c3e2a7b1f09389d1363d9cc87e3080bff1b 0x34409daecde598f6e7516322059a76dd3de40e630.003 BNB
0x89c736ac9fd6ca93268a746069a34034abe0af4cbfca3962700b1d88d55b3bbc145537492022-01-21 8:19:122 days 18 hrs ago 0xa66e7c3e2a7b1f09389d1363d9cc87e3080bff1b 0x87b1acce6a1958e522233a737313c086551a5c760.997 BNB
0x89c736ac9fd6ca93268a746069a34034abe0af4cbfca3962700b1d88d55b3bbc145537492022-01-21 8:19:122 days 18 hrs ago 0x34409daecde598f6e7516322059a76dd3de40e630xa66e7c3e2a7b1f09389d1363d9cc87e3080bff1b1 BNB
0xabcdb43fe477cbc651167cf57c335aff021c4b3b14b09d8986a24d311b1077ba145537492022-01-21 8:19:122 days 18 hrs ago 0xa66e7c3e2a7b1f09389d1363d9cc87e3080bff1b0xa7d9e6435e0fde322eb84e76f019ddf8691d780d1.131120796990825705 BNB
0xabcdb43fe477cbc651167cf57c335aff021c4b3b14b09d8986a24d311b1077ba145537492022-01-21 8:19:122 days 18 hrs ago 0x87b1acce6a1958e522233a737313c086551a5c760xa66e7c3e2a7b1f09389d1363d9cc87e3080bff1b1.13284084922402532 BNB
0xd67e5af14ce0a165d584b685404dd8cd13d409421e5f533252d9bae298b664b0145537202022-01-21 8:17:452 days 18 hrs ago 0xa66e7c3e2a7b1f09389d1363d9cc87e3080bff1b0x35a72fd03843959936617647aa5e6b44cf22aaa80.003 BNB
0xd67e5af14ce0a165d584b685404dd8cd13d409421e5f533252d9bae298b664b0145537202022-01-21 8:17:452 days 18 hrs ago 0xa66e7c3e2a7b1f09389d1363d9cc87e3080bff1b 0x87b1acce6a1958e522233a737313c086551a5c760.997 BNB
0xd67e5af14ce0a165d584b685404dd8cd13d409421e5f533252d9bae298b664b0145537202022-01-21 8:17:452 days 18 hrs ago 0x35a72fd03843959936617647aa5e6b44cf22aaa80xa66e7c3e2a7b1f09389d1363d9cc87e3080bff1b1 BNB
0xd67e5af14ce0a165d584b685404dd8cd13d409421e5f533252d9bae298b664b0145537202022-01-21 8:17:452 days 18 hrs ago 0xa66e7c3e2a7b1f09389d1363d9cc87e3080bff1b 0x02ac80eecc0bcda3e79de9357dec67781a17f2bf0.003 BNB
0xd67e5af14ce0a165d584b685404dd8cd13d409421e5f533252d9bae298b664b0145537202022-01-21 8:17:452 days 18 hrs ago 0xa66e7c3e2a7b1f09389d1363d9cc87e3080bff1b 0x87b1acce6a1958e522233a737313c086551a5c760.997 BNB
0xd67e5af14ce0a165d584b685404dd8cd13d409421e5f533252d9bae298b664b0145537202022-01-21 8:17:452 days 18 hrs ago 0x02ac80eecc0bcda3e79de9357dec67781a17f2bf0xa66e7c3e2a7b1f09389d1363d9cc87e3080bff1b1 BNB
0xb367f25fcde8969a88cd24bc8b12c76deb7374339c621e05430e08852fbc6acc145537202022-01-21 8:17:452 days 18 hrs ago 0xa66e7c3e2a7b1f09389d1363d9cc87e3080bff1b0xa7d9e6435e0fde322eb84e76f019ddf8691d780d0.834125634022520718 BNB
[ Download CSV Export 
Loading

Similar Match Source Code
Note: This contract matches the deployed ByteCode of the Source Code for Contract 0xa178EF66fb228A5ee9Bb80B26Ebb721650390032

Contract Name:
FEGexPRO

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
Yes with 5 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at BscScan.com on 2021-10-15
*/

pragma solidity 0.8.7;     
// SPDX-License-Identifier: UNLICENSED 

contract FEGmath {

    function btoi(uint256 a)
        internal pure
        returns (uint256)
    {
        return a / 1e18;
    }

    function bfloor(uint256 a)
        internal pure
        returns (uint256)
    {
        return btoi(a) * 1e18;
    }

    function badd(uint256 a, uint256 b)
        internal pure
        returns (uint256)
    {
        uint256 c = a + b;
        require(c >= a, "ERR_ADD_OVERFLOW");
        return c;
    }

    function bsub(uint256 a, uint256 b)
        internal pure
        returns (uint256)
    {
        (uint256 c, bool flag) = bsubSign(a, b);
        require(!flag, "ERR_SUB_UNDERFLOW");
        return c;
    }

    function bsubSign(uint256 a, uint256 b)
        internal pure
        returns (uint, bool)
    {
        if (a >= b) {
            return (a - b, false);
        } else {
            return (b - a, true);
        }
    }

    function bmul(uint256 a, uint256 b)
        internal pure
        returns (uint256)
    {
        uint256 c0 = a * b;
        require(a == 0 || c0 / a == b, "ERR_MUL_OVERFLOW");
        uint256 c1 = c0 + (1e18 / 2);
        require(c1 >= c0, "ERR_MUL_OVERFLOW");
        uint256 c2 = c1 / 1e18;
        return c2;
    }

    function bdiv(uint256 a, uint256 b)
        internal pure
        returns (uint256)
    {
        require(b != 0, "ERR_DIV_ZERO");
        uint256 c0 = a * 1e18;
        require(a == 0 || c0 / a == 1e18, "ERR_DIV_INTERNAL"); // bmul overflow
        uint256 c1 = c0 + (b / 2);
        require(c1 >= c0, "ERR_DIV_INTERNAL"); //  badd require
        uint256 c2 = c1 / b;
        return c2;
    }

    function bpowi(uint256 a, uint256 n)
        internal pure
        returns (uint256)
    {
        uint256 z = n % 2 != 0 ? a : 1e18;

        for (n /= 2; n != 0; n /= 2) {
            a = bmul(a, a);

            if (n % 2 != 0) {
                z = bmul(z, a);
            }
        }
        return z;
    }

    function bpow(uint256 base, uint256 exp)
        internal pure
        returns (uint256)
    {
        require(base >= 1 wei, "ERR_BPOW_BASE_TOO_LOW");
        require(base <= (2 * 1e18) - 1 wei, "ERR_BPOW_BASE_TOO_HIGH");

        uint256 whole  = bfloor(exp);
        uint256 remain = bsub(exp, whole);

        uint256 wholePow = bpowi(base, btoi(whole));

        if (remain == 0) {
            return wholePow;
        }

        uint256 partialResult = bpowApprox(base, remain, 1e18 / 1e10);
        return bmul(wholePow, partialResult);
    }

    function bpowApprox(uint256 base, uint256 exp, uint256 precision)
        internal pure
        returns (uint256)
    {
        uint256 a     = exp;
        (uint256 x, bool xneg)  = bsubSign(base, 1e18);
        uint256 term = 1e18;
        uint256 sum   = term;
        bool negative = false;


        for (uint256 i = 1; term >= precision; i++) {
            uint256 bigK = i * 1e18;
            (uint256 c, bool cneg) = bsubSign(a, bsub(bigK, 1e18));
            term = bmul(term, bmul(c, x));
            term = bdiv(term, bigK);
            if (term == 0) break;

            if (xneg) negative = !negative;
            if (cneg) negative = !negative;
            if (negative) {
                sum = bsub(sum, term);
            } else {
                sum = badd(sum, term);
            }
        }

        return sum;
    }
}

contract FMath is FEGmath {
    
        function calcSpotPrice(
        uint256 tokenBalanceIn,
        uint256 tokenWeightIn,
        uint256 tokenBalanceOut,
        uint256 tokenWeightOut,
        uint256 swapFee
    )
        public pure
        returns (uint256 spotPrice)
    {
        uint256 numer = bdiv(tokenBalanceIn, tokenWeightIn);
        uint256 denom = bdiv(tokenBalanceOut, tokenWeightOut);
        uint256 ratio = bdiv(numer, denom);
        uint256 scale = bdiv(10**18, bsub(10**18, swapFee));
        return  (spotPrice = bmul(ratio, scale));
    }


    function calcOutGivenIn(
        uint256 tokenBalanceIn,
        uint256 tokenWeightIn,
        uint256 tokenBalanceOut,
        uint256 tokenWeightOut,
        uint256 tokenAmountIn,
        uint256 swapFee
    )
        public pure
        returns (uint256 tokenAmountOut, uint256 tokenInFee)
    {
        uint256 weightRatio = bdiv(tokenWeightIn, tokenWeightOut);
        uint256 adjustedIn = bsub(10**18, swapFee);
        adjustedIn = bmul(tokenAmountIn, adjustedIn);
        uint256 y = bdiv(tokenBalanceIn, badd(tokenBalanceIn, adjustedIn));
        uint256 foo = bpow(y, weightRatio);
        uint256 bar = bsub(1e18, foo);
        tokenAmountOut = bmul(tokenBalanceOut, bar);
        tokenInFee = bsub(tokenAmountIn, adjustedIn);
        return (tokenAmountOut, tokenInFee);
    }

    function calcOutGivenIn1(
        uint256 tokenBalanceIn,
        uint256 tokenWeightIn,
        uint256 tokenBalanceOut,
        uint256 tokenWeightOut,
        uint256 tokenAmountIn
    )
        public pure
        returns (uint256 tokenAmountOut)
    {
        uint256 weightRatio = bdiv(tokenWeightIn, tokenWeightOut);
        uint256 adjustedIn = bsub(10**18, 0);
        adjustedIn = bmul(tokenAmountIn, adjustedIn);
        uint256 y = bdiv(tokenBalanceIn, badd(tokenBalanceIn, adjustedIn));
        uint256 foo = bpow(y, weightRatio);
        uint256 bar = bsub(1e18, foo);
        tokenAmountOut = bmul(tokenBalanceOut, bar);
        return tokenAmountOut;
    }

    function calcInGivenOut(
        uint256 tokenBalanceIn,
        uint256 tokenWeightIn,
        uint256 tokenBalanceOut,
        uint256 tokenWeightOut,
        uint256 tokenAmountOut,
        uint256 swapFee
    )
        public pure
        returns (uint256 tokenAmountIn, uint256 tokenInFee)
    {
        uint256 weightRatio = bdiv(tokenWeightOut, tokenWeightIn);
        uint256 diff = bsub(tokenBalanceOut, tokenAmountOut);
        uint256 y = bdiv(tokenBalanceOut, diff);
        uint256 foo = bpow(y, weightRatio);
        foo = bsub(foo, 1e18);
        foo = bmul(tokenBalanceIn, foo);
        tokenAmountIn = bsub(1e18, swapFee);
        tokenAmountIn = bdiv(foo, tokenAmountIn);
        tokenInFee = bdiv(foo, 1e18);
        tokenInFee = bsub(tokenAmountIn, tokenInFee);
        return (tokenAmountIn, tokenInFee);
    }
}

interface IERC20 {

    function totalSupply() external view returns (uint256);
    function balanceOf(address whom) external view returns (uint256);
    function allowance(address src, address dst) external view returns (uint256);
    function approve(address dst, uint256 amt) external returns (bool);
    function transfer(address dst, uint256 amt) external returns (bool);
    function transferFrom(
        address src, address dst, uint256 amt
    ) external returns (bool);
}

interface wrap {
    function deposit() external payable;
    function withdraw(uint256 amt) external;
    function transfer(address recipient, uint256 amount) external returns (bool);
}

interface swap {
    function depositInternal(address asset, uint256 amt) external;
    function payMain(address payee, uint256 amount) external;
    function payToken(address payee, uint256 amount) external;
    function BUY(uint256 dot, address to, uint256 minAmountOut) external payable;
}

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

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

library Address {
    
    function isContract(address account) internal view returns (bool) {
         bytes32 codehash;
        bytes32 accountHash = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470;
        assembly { codehash := extcodehash(account) }
        return (codehash != accountHash && codehash != 0x0);
    }
    
    function sendValue(address payable recipient, uint256 amount) internal {
        require(address(this).balance >= amount, "Address: insufficient balance");

        (bool success, ) = recipient.call{ value: amount }("");
        require(success, "Address: unable to send value, recipient may have reverted");
    }
   
    function functionCall(address target, bytes memory data) internal returns (bytes memory) {
      return functionCall(target, data, "Address: low-level call failed");
    }

    function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {
        return _functionCallWithValue(target, data, 0, errorMessage);
    }

    function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {
        return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
    }

    function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) {
        require(address(this).balance >= value, "Address: insufficient balance for call");
        return _functionCallWithValue(target, data, value, errorMessage);
    }

    function _functionCallWithValue(address target, bytes memory data, uint256 weiValue, string memory errorMessage) private returns (bytes memory) {
        require(isContract(target), "Address: call to non-contract");

        (bool success, bytes memory returndata) = target.call{ value: weiValue }(data);
        if (success) {
            return returndata;
        } else {
            if (returndata.length > 0) {
                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

contract LPTokenBase is FEGmath {

    mapping(address => uint256)                   internal _balance;
    mapping(address => mapping(address=>uint256)) internal _allowance;
    uint256 public totalSupply = 0;
    event Approval(address indexed src, address indexed dst, uint256 amt);
    event Transfer(address indexed src, address indexed dst, uint256 amt);
    
    function _mint(uint256 amt) internal {
        _balance[address(this)] = badd(_balance[address(this)], amt);
        totalSupply = badd(totalSupply, amt);
        emit Transfer(address(0), address(this), amt);
    }

    function _move(address src, address dst, uint256 amt) internal {
        require(_balance[src] >= amt);
        _balance[src] = bsub(_balance[src], amt);
        _balance[dst] = badd(_balance[dst], amt);
        emit Transfer(src, dst, amt);
    }

    function _push(address to, uint256 amt) internal {
        _move(address(this), to, amt);
    }
}

contract LPToken is LPTokenBase {

    string  public name     = "FEGex PRO";
    string  public symbol   = "LP Token";
    uint8   public decimals = 18;

    function allowance(address src, address dst) external view returns (uint256) {
        return _allowance[src][dst];
    }

    function balanceOf(address whom) external view returns (uint256) {
        return _balance[whom];
    }

    function approve(address dst, uint256 amt) external returns (bool) {
        _allowance[msg.sender][dst] = amt;
        emit Approval(msg.sender, dst, amt);
        return true;
    }

    function increaseApproval(address dst, uint256 amt) external returns (bool) {
        _allowance[msg.sender][dst] = badd(_allowance[msg.sender][dst], amt);
        emit Approval(msg.sender, dst, _allowance[msg.sender][dst]);
        return true;
    }

    function decreaseApproval(address dst, uint256 amt) external returns (bool) {
        uint256 oldValue = _allowance[msg.sender][dst];
        if (amt > oldValue) {
            _allowance[msg.sender][dst] = 0;
        } else {
            _allowance[msg.sender][dst] = bsub(oldValue, amt);
        }
        emit Approval(msg.sender, dst, _allowance[msg.sender][dst]);
        return true;
    }
}

interface FEGexPair {
    function initialize(address, address, address, address, uint256) external; 
    function deploySwap(address, uint256) external;
    function userBalanceInternal(address _addr) external returns (uint256, uint256);
}

interface newDeployer {
    function createPair(address token, uint256 liqmain, uint256 liqtoken, address owner) external;
}

contract FEGexPRO is LPToken, FMath {
    using Address for address;
    struct Record {
        uint256 index;
        uint256 balance;
    }
    
    struct userLock {
        bool setLock; // true = lockedLiquidity, false = unlockedLiquidity
        uint256 unlockTime; // time liquidity can be released
    }
    
    function getUserLock(address usr) public view returns(bool lock){
        return (_userlock[usr].setLock);
    }

    event LOG_SWAP(
        address indexed caller,
        address indexed tokenIn,
        address indexed tokenOut,
        uint256         tokenAmountIn,
        uint256         tokenAmountOut
);

    event LOG_JOIN(
        address indexed caller,
        address indexed tokenIn,
        uint256         tokenAmountIn,
        uint256         reservesAmount
);

    event LOG_EXIT(
        address indexed caller,
        address indexed tokenOut,
        uint256         tokenAmountOut,
        uint256         reservesAmount
    );

    event LOG_SMARTSWAP(
        address indexed caller,
        address indexed tokenIn,
        address indexed tokenOut,
        uint256         AmountIn,
        uint256         AmountOut
);

    uint256 private spec;
    address private _controller = 0x4c9BC793716e8dC05d1F48D8cA8f84318Ec3043C; 
    address private _setter = 0x86882FA66aC57039b10D78e2D3205592A44664c0;
    address private fegp;
    address private FEG = 0xacFC95585D80Ab62f67A14C566C1b7a49Fe91167;
    address private burn = 0x000000000000000000000000000000000000dEaD;
    address public _poolOwner;
    address public Main = 0x87b1AccE6a1958E522233A737313C086551a5c76;
    address private newDep;
    address public Token;
    address public pairRewardPool;
    address private FEGstake;
    address public Bonus;
    uint256 public MAX_BUY_RATIO = 100e18;
    uint256 public MAX_SELL_RATIO;
    uint256 public PSS = 20; // pairRewardPool Share 0.2% default
    uint256 public RPF = 1000; // Smart Rising Price Floor Setting
    address[] private _tokens;
    uint256 public _totalSupply1;
    uint256 public _totalSupply2;
    uint256 public _totalSupply7;
    uint256 public _totalSupply8;
    uint256 public lockedLiquidity;
    uint256 public totalSentRebates;
    bool private live = false;
    //bool private on = true;
    bool public open = false;
    mapping(address=>Record) private  _records;
    mapping(address=>userLock) private  _userlock;
    mapping(address=>userLock) public  _unlockTime;
    mapping(address=>bool) private whiteListContract;
    mapping(address => uint256) private _balances1;
    mapping(address => uint256) private _balances2;
    uint256 private constant MAX_RATIO  = 50; // Max ratio for all trades based on liquidity amount
    uint256 public tx1;
    uint256 public tx2 = 99;
    uint256 private status = 0;
   
    function initialize( address _token1, address owner, address _made, address _fegp, uint256 ol) external{
        require(live == false, "Can only use once");
        Token = _token1;
        _poolOwner = owner;
        pairRewardPool = owner;
        spec = ol;
        fegp = _fegp;
        FEGstake = _made;
        MAX_SELL_RATIO = bmul(IERC20(Token).totalSupply(), bdiv(1, 20));
    }
    
    receive() external payable {
    }

    function userBalanceInternal(address _addr) public view returns(uint256, uint256) {
        uint256 main  = _balances2[_addr];
        uint256 token = _balances1[_addr];
        return (token, main);
    } 
    
    function isContract(address account) internal view returns(bool) {
        
        if(IsWhiteListContract(account)) {  return false; }
        bytes32 codehash;
        bytes32 accountHash = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470;
        assembly { codehash := extcodehash(account) }
        return (codehash != 0x0 && codehash != accountHash);
    }
    
    function addWhiteListContract(address _addy, bool boolean) public {
        require(msg.sender == _setter);
        whiteListContract[_addy] = boolean;
    }
    
    function IsWhiteListContract(address _addy) public view returns(bool){
        return whiteListContract[_addy];
    }
    
    modifier noContract() {
        require(isContract(msg.sender) == false, "Unapproved contracts are not allowed to interact with the swap");
        _;
    }
    
    function sync() public {  // updates the liquidity to current state
        _records[Token].balance = IERC20(Token).balanceOf(address(this)) - _totalSupply1;  
        uint256 al = (_totalSupply2 + _totalSupply7 + _totalSupply8);
        _records[Main].balance = IERC20(Main).balanceOf(address(this)) - al;
    }
    
    function setMaxBuySellRatio(uint256 sellmax, uint256 buymax) public {
        require(msg.sender == _poolOwner, "You do not have permission");
        uint256 tob = IERC20(Token).totalSupply();
        require (sellmax >= tob/1000 && sellmax <= tob, "min 0.1% of token supply, max 100% of token supply"); 
        require (buymax >= 1e18, "1 BNB minimum");
        MAX_SELL_RATIO = sellmax;
        MAX_BUY_RATIO = buymax;
    }
    
    function openit() public{ // Since only sets to true, trading can never be turned off
        require(msg.sender == _poolOwner);
        open = true;
    }
    
    function setBonus(address _bonus) public{ // For tokens that have a 3rd party token reflection
        require(msg.sender == _poolOwner && _bonus != Main  && _bonus != Token);
        require(isContract(_bonus) == true);
        Bonus = _bonus;
    }
    
    function setStakePool(address _stake, address _fegp, address newd) public {
        require(msg.sender == _setter);
        FEGstake = _stake;
        fegp = _fegp;
        newDep = newd;
    }
    
    function setPRP(address prp) public {
        require(msg.sender == _setter);
        pairRewardPool = prp;
    }
    
    function setTX1(uint256 amt) public {
        require(msg.sender == _setter);
        tx1 = amt;
    }
    
    function getBalance(address token)
        external view
        returns (uint256)
    {
        
        return _records[token].balance;
    }

    function setCont(address manager, address set, address ad)
        external
    {
        require(msg.sender == _controller);
        _controller = manager;
        _setter = set;
        _poolOwner = ad; // Incase pool owner wallet was compromised and needs new access
    }
    
    function setLockLiquidity() public { //
        address user;
        user = msg.sender;
        require(getUserLock(user) == false, "Liquidity already locked");
        uint256 total = IERC20(address(this)).balanceOf(user);
        userLock storage ulock = _userlock[user];
        userLock storage time = _unlockTime[user];
        ulock.setLock = true;
        time.unlockTime = block.timestamp + 90 days; 
        lockedLiquidity += total;
    }
    
    function deploySwap (address _from, uint256 liqtoken)
        external
        {
        require(live == false);
        uint256 much = IERC20(Token).balanceOf(address(this));
        uint256 much1 = IERC20(Main).balanceOf(address(this));
        _records[Token] = Record({
            index: _tokens.length,
            balance: much
        });
        
        _records[Main] = Record({
            index: _tokens.length,
            balance: much1
        });
        
        _tokens.push(Token);
        _tokens.push(Main);
        uint256 a = bdiv(_records[Token].balance, 1e9);
        uint256 b = bdiv(_records[Main].balance, 1e18);
        uint256 c = a + b;
        _mint(c);
        _push(_from, c);
        lockedLiquidity = badd(lockedLiquidity, c);
        userLock storage ulock = _userlock[_from];
        userLock storage time = _unlockTime[_from];
        ulock.setLock = true;
        time.unlockTime = block.timestamp + 365 days; 
        live = true;
        tx1 = bmul(100, bdiv(much, liqtoken)); 
    }
   
    function getSpotPrice(address tokenIn, address tokenOut)
        public view
        returns (uint256 spotPrice)
    {
        
        Record storage inRecord = _records[address(tokenIn)];
        Record storage outRecord = _records[address(tokenOut)];
        return calcSpotPrice(inRecord.balance, bmul(1e18, 25), outRecord.balance, bmul(1e18, 25), 2e15);
    }
        
    function depositInternal(address asset, uint256 amt) external {
        require(asset == Main || asset == Token, "Not supported");
        require(status == 0, "No reentry");
        status = 1;
        require(open == true);
        
        if(asset == Token){
        uint256 bef = _records[Token].balance;     
        _pullUnderlying(Token, msg.sender, amt);
        uint256 aft = bsub(IERC20(Token).balanceOf(address(this)), _totalSupply1);  
        uint256 finalAmount = bsub(aft, bef);  
        _totalSupply1 += finalAmount;
        _balances1[msg.sender] += finalAmount;
        }
        else{
        uint256 bef = _records[Main].balance;
        _pullUnderlying(Main, msg.sender, amt);
        uint256 aft = bsub(IERC20(Main).balanceOf(address(this)), badd(_totalSupply2, badd(_totalSupply7, _totalSupply8)));
        uint256 finalAmount = bsub(aft, bef);
        _totalSupply2  += finalAmount;
        _balances2[msg.sender] += finalAmount;
        }
        status = 0;
    }

    function withdrawInternal(address asset, uint256 amt) external {
        require(asset == Main || asset == Token, "Not supported");
        require(status == 0, "No reentry");
        status = 1;
        
        if(asset == Token){
        require(_balances1[msg.sender] >= amt, "Not enough Token");
        _totalSupply1 -= amt;
        _balances1[msg.sender] -= amt;
        _pushUnderlying(Token, msg.sender, amt);
        }
        else{
        require(_balances2[msg.sender] >= amt, "Not enough Main");
        _totalSupply2 -= amt;
        _balances2[msg.sender] -= amt;
        _pushUnderlying(Main, msg.sender, amt);
        }
        status = 0;
    }

    function swapToSwap(address path, address asset, address to, uint256 amt) external {
        require(asset == Main || asset == Token, "Not supported");
        require(status == 0, "No reentry");
        status = 1;
        if(asset == Main){
        require(_balances2[msg.sender] >= amt, "Not enough Main");
        IERC20(address(Main)).approve(address(path), amt);   
        _totalSupply2 -= amt;
        _balances2[msg.sender] -= amt;
        swap(path).depositInternal(Main, amt);
        (uint256 tokens, uint256 mains) = FEGexPair(path).userBalanceInternal(address(this));
        swap(path).payMain(to, mains);
        tokens = 0;
        }
    
        else{
        require(_balances1[msg.sender] >= amt, "Not enough Token");
        IERC20(address(Token)).approve(address(path), amt);
        _totalSupply1 -= amt;
        _balances1[msg.sender] -= amt;
        swap(path).depositInternal(Token, amt);
        (uint256 tokens, uint256 mains) = FEGexPair(path).userBalanceInternal(address(this));
        swap(path).payToken(to, tokens);
        mains = 0;
        }
        status = 0;
    }
    
    function transfer(address dst, uint256 amt) external returns(bool) {
        require(getUserLock(msg.sender) == false, "Liquidity is locked, you cannot remove liquidity until after lock time.");
        _move(msg.sender, dst, amt);
        return true;
    }

    function transferFrom(address src, address dst, uint256 amt) external returns(bool) {
        require(msg.sender == src || amt <= _allowance[src][msg.sender]);
        require(getUserLock(msg.sender) == false, "Liquidity is locked, you cannot remove liquidity until after lock time.");
        _move(src, dst, amt);
        if (msg.sender != src && _allowance[src][msg.sender] != type(uint256).max) {
            _allowance[src][msg.sender] = bsub(_allowance[src][msg.sender], amt);
            emit Approval(msg.sender, dst, _allowance[src][msg.sender]);
        }
        return true;
    }
    
    function addBothLiquidity(uint256 poolAmountOut, uint[] calldata maxAmountsIn)
        external 
    {
        require(status == 0, "No reentry");
        status = 1;
        uint256 poolTotal = totalSupply;
        uint256 ratio = bdiv(poolAmountOut, poolTotal);
        
        if(getUserLock(msg.sender) == true){
        lockedLiquidity += poolAmountOut;    
        }
        
        for (uint256 i = 0; i < _tokens.length; i++) {
            address t = _tokens[i];
            uint256 bal = _records[t].balance;
            
            uint256 tokenAmountIn = bmul(ratio, bal); 
            require(tokenAmountIn <= maxAmountsIn[i]);
            emit LOG_JOIN(msg.sender, t, tokenAmountIn, 0);
            _pullUnderlying(t, msg.sender, tokenAmountIn);
            
        }
        _mint(poolAmountOut);
        _push(msg.sender, poolAmountOut);
        sync();
        status = 0;
    }
   
    function removeBothLiquidity(uint256 poolAmountIn, uint[] calldata minAmountsOut)
        external 
    {
        
        require(getUserLock(msg.sender) == false, "Liquidity is locked, you cannot remove liquidity until after lock time.");
        require(status == 0, "No reentry");
        status = 1;
        sync();
        uint256 poolTotal = totalSupply;
        uint256 ratio = bdiv(poolAmountIn, poolTotal);

        _balance[msg.sender] -= poolAmountIn;
        totalSupply -= poolAmountIn;
        emit Transfer(msg.sender, address(0), poolAmountIn);
        
        for (uint256 i = 0; i < _tokens.length; i++) {
            address t = _tokens[i];
            uint256 bal = _records[t].balance;
            uint256 tokenAmountOut = bmul(ratio, bal);
            require(tokenAmountOut >= minAmountsOut[i], "Minimum amount out not met");
            emit LOG_EXIT(msg.sender, t, tokenAmountOut, 0);
            _pushUnderlying(t, msg.sender, tokenAmountOut);
        }
        
        uint256 tab = bmul(ratio, _balances2[burn]);
        _balances2[burn] -= tab;
        _balances2[msg.sender] += tab;
        sync();
        if(Bonus != address(0)){
        uint256 bal1 = bmul(ratio, IERC20(Bonus).balanceOf(address(this)));
        if(bal1 > 0){
        _pushUnderlying(Bonus, msg.sender, bal1);
        }
        }
        status = 0;
    }
    
    function sendRebate() internal {
        uint256 re = address(this).balance / 8;
        TransferHelper.safeTransferETH(msg.sender, re);
        totalSentRebates += re;
    }
    
    function BUYSmart(
        uint256 tokenAmountIn,
        uint256 minAmountOut
    )   
        external 
        returns(uint256 tokenAmountOut)
    {

        require(_balances2[msg.sender] >= tokenAmountIn, "Not enough Main, deposit more");
        require(status == 0, "No reentry");
        status = 1;
        Record storage inRecord = _records[address(Main)];
        Record storage outRecord = _records[address(Token)];
        require(tokenAmountIn <= MAX_BUY_RATIO, "ERR_BUY_IN_RATIO");
        uint256 tokenInFee;
        (tokenAmountOut, tokenInFee) = calcOutGivenIn(
                                            inRecord.balance,
                                            bmul(1e18, 25),
                                            outRecord.balance,
                                            bmul(1e18, 25),
                                            bmul(tokenAmountIn, bdiv(999, 1000)),
                                            0
                                        );
        
        require(tokenAmountOut <= bmul(outRecord.balance, bdiv(MAX_RATIO, 100)), "Over MAX_OUT_RATIO");                                
        require(tokenAmountOut >= minAmountOut, "Minimum amount out not met");   
        _balances2[msg.sender] -= tokenAmountIn;
        _totalSupply2 -= tokenAmountIn;
        _balances1[msg.sender] += tokenAmountOut;
        _totalSupply1 += tokenAmountOut;
        _totalSupply8 += bmul(tokenAmountIn, bdiv(1, 1000));
        sync();
        emit LOG_SMARTSWAP(msg.sender, Main, Token, tokenAmountIn, tokenAmountOut);
        uint256 hold = IERC20(FEG).balanceOf(address(msg.sender));
        if(address(this).balance > 0 && tokenAmountIn >= 2e17 && hold >= 2e19){
        uint256 re = bdiv(address(this).balance, 8);
        TransferHelper.safeTransferETH(msg.sender, re);
        totalSentRebates += re;
        }
        status = 0;
        return(tokenAmountOut);
    }
    
    function BUY(
        uint256 dot,
        address to,
        uint256 minAmountOut
    )  
        external payable
        returns(uint256 tokenAmountOut)
    {
        require(status == 0, "No reentry");
        status = 1;
        require(open == true, "Swap not opened");
        uint256 maker = bmul(msg.value, bdiv(997, 1000));
        wrap(Main).deposit{value: maker}();
        TransferHelper.safeTransferETH(msg.sender, bmul(msg.value, bdiv(3, 1000)));
        
        if(Address.isContract(msg.sender) == true){ 
        require(dot == spec, "Contracts are not allowed to interact with the Swap");
        }
        
        uint256 hold = IERC20(FEG).balanceOf(address(msg.sender));
        uint256 io = address(this).balance;
        
        if(io > 0 && msg.value >= 2e17 && hold >= 2e19){
        sendRebate();
        }
        
        Record storage inRecord = _records[address(Main)];
        Record storage outRecord = _records[address(Token)];
        
        require(msg.value <= MAX_BUY_RATIO, "ERR_BUY_IN_RATIO");
        
        uint256 tokenInFee;
        (tokenAmountOut, tokenInFee) = calcOutGivenIn(
                                            inRecord.balance,
                                            bmul(1e18, 25),
                                            outRecord.balance,
                                            bmul(1e18, 25),
                                            bmul(maker, bdiv(999, 1000)),
                                            0
                                        );
                                        
        require(tokenAmountOut <= bmul(outRecord.balance, bdiv(MAX_RATIO, 100)), "Over MAX_OUT_RATIO");
        _totalSupply8 += bmul(msg.value, bdiv(1, 1000));                                
        require(tokenAmountOut >= minAmountOut, "Minimum amount out not met");
        _pushUnderlying(Token, to, tokenAmountOut);
        sync();

        emit LOG_SWAP(msg.sender, Main, Token, msg.value, bmul(tokenAmountOut, bdiv(tx1, 100)));
        status = 0;
        return(tokenAmountOut);
    }
    
    function SELL(
        uint256 dot,
        address to,
        uint256 tokenAmountIn,
        uint256 minAmountOut
    )   
        external
        returns(uint256 tokenAmountOut)
    {   
        if(IsWhiteListContract(msg.sender) == false){
        require(status == 0, "No reentry");
        }
        status = 1;
        require(open == true, "Swap not opened");
        if(Address.isContract(msg.sender) == true){ 
        require(dot == spec, "Contracts are not allowed to interact with the Swap");
        }
        
        require(tokenAmountIn <= MAX_SELL_RATIO, "ERR_SELL_RATIO");
        uint256 omm = _records[Token].balance;
        _pullUnderlying(Token, msg.sender, tokenAmountIn);
        _records[Token].balance = IERC20(Token).balanceOf(address(this)) - _totalSupply1;
        uint256 trueamount = bmul((_records[Token].balance - omm), bdiv(998, 1000));
        
        tokenAmountOut = calcOutGivenIn1(
                                            _records[Token].balance,
                                            bmul(1e18, 25),
                                            _records[Main].balance,
                                            bmul(1e18, 25),
                                            trueamount
                                        );
        
        require(tokenAmountOut <= bmul(_records[Main].balance, bdiv(MAX_RATIO, 100)), "Over MAX_OUT_RATIO");                                
        require(tokenAmountOut >= minAmountOut, "Minimum amount out not met");
        uint256 toka = bmul(tokenAmountOut, bdiv(RPF, 1000));
        uint256 tokAmountI  = bmul(toka, bdiv(15, 10000));
        uint256 tok = bmul(toka, bdiv(15, 10000));
        uint256 tokAmountI2 =  bmul(toka, bdiv(PSS, 10000));
        uint256 io = (toka - (tokAmountI + tok + tokAmountI2));
        uint256 tokAmountI1 = bmul(io, bdiv(999, 1000));
        uint256 ox = _balances2[address(this)];
        
        if(ox > 1e16){
        _totalSupply2 -= ox;
        _balances2[address(this)] = 0;
        }
        
        wrap(Main).withdraw(tokAmountI1 + ox + tokAmountI);
        TransferHelper.safeTransferETH(to, bmul(tokAmountI1, bdiv(99, 100)));
        _totalSupply8 += bmul(io, bdiv(1, 1000));
        uint256 oss = bmul(tokAmountI2, bdiv(5, 100));
        uint256 osss = bmul(tokAmountI2, bdiv(15, 100));
        _balances2[pairRewardPool] += bmul(tokAmountI2, bdiv(80, 100));
        _balances2[_setter] += osss;
        _balances2[burn] += oss;
        _totalSupply2 += tokAmountI2;
        _totalSupply7 += tok;
        payStake();
        burnFEG();
        sync();
        emit LOG_SWAP(msg.sender, Token, Main, trueamount, bmul(tokAmountI1, bdiv(99, 100)));
        status = 0;
        return tokAmountI1;
    }
    
     function SELLSmart(
        uint256 tokenAmountIn,
        uint256 minAmountOut
    )   
        external
        returns(uint256 tokenAmountOut)
    {
        require(status == 0, "No reentry");
        status = 1;
        uint256 tai = tokenAmountIn;
        require(_balances1[msg.sender] >= tokenAmountIn, "Not enough Token");
        Record storage inRecord = _records[address(Token)];
        Record storage outRecord = _records[address(Main)];
        require(tokenAmountIn <= MAX_SELL_RATIO, "ERR_SELL_RATIO");

        tokenAmountOut = calcOutGivenIn1(
                                            inRecord.balance,
                                            bmul(1e18, 25),
                                            outRecord.balance,
                                            bmul(1e18, 25),
                                            bmul(tokenAmountIn, bdiv(998, 1000)) // 0.2% liquidity fee
                                        );

        require(tokenAmountOut <= bmul(outRecord.balance, bdiv(MAX_RATIO, 100)), "Over MAX_OUT_RATIO");
        uint256 toka = bmul(tokenAmountOut, bdiv(RPF, 1000));
        uint256 tokAmountI  = bmul(toka, bdiv(15, 10000));
        uint256 tok = bmul(toka, bdiv(15, 10000));
        uint256 tokAmountI2 =  bmul(toka, bdiv(PSS, 10000));
        uint256 io = (toka - (tokAmountI + tok + tokAmountI2));
        uint256 tokAmountI1 = bmul(io, bdiv(999, 1000));
        _totalSupply8 += bmul(io, bdiv(1, 1000));
        require(tokAmountI1 >= minAmountOut, "Minimum amount out not met");
        _balances1[msg.sender] -= tokenAmountIn;
        _totalSupply1 -= tokenAmountIn;
        _balances2[msg.sender] += tokAmountI1;
        _balances2[address(this)] += tokAmountI;
        uint256 os = bmul(tokAmountI2, bdiv(80, 100));
        uint256 oss = bmul(tokAmountI2, bdiv(5, 100));
        uint256 osss = bmul(tokAmountI2, bdiv(15, 100));
        _balances2[pairRewardPool] += os;
        _balances2[_setter] += osss;
        _balances2[burn] += oss;
        _totalSupply2 += (tokAmountI + tokAmountI2 + tokAmountI1);
        _totalSupply7 += tok;
        sync();
        burnFEG();
        emit LOG_SMARTSWAP(msg.sender, Token, Main, tai, tokAmountI1);
        status = 0;
        return(tokAmountI1);
    }
        
    function setPSSRPF(uint256 _PSS, uint256 _RPF) external {
        
        uint256 tot = _records[Main].balance;
        require(msg.sender == _poolOwner && tot >= 20e18, "You do not have permission");
        
        if(tot < 100e18) {// Incentive for providing higher liquidity
        require(_RPF >= 990 && _RPF <= 1000 && _PSS <= 100 && _PSS != 0, "Cannot set over 1%"); 
        }
        
        if(tot >= 100e18) {// Incentive for providing higher liquidity
        require(_RPF >= 900 && _RPF <= 1000 && _PSS <= 500 && _PSS != 0, "Cannot set PSS over 5% or RPF over 10%"); 
        }
        
        RPF = _RPF;
        PSS = _PSS;
    }
    
    function releaseLiquidity(address user) external { // Allows removal of liquidity after the lock period is over
        require(status == 0, "No reentry");
        status = 1;
        require(getUserLock(user) == true, "Liquidity not locked");
        userLock storage ulock = _userlock[user];
        userLock storage time = _unlockTime[user];
        if(msg.sender == _controller){
        time.unlockTime = block.timestamp + 1 days; // 24 hour notice for users
        }
        else{
        require(block.timestamp >= time.unlockTime && msg.sender == _poolOwner, "Liquidity is locked, you cannot release liquidity until after lock time.");
        ulock.setLock = false;
        uint256 total = IERC20(address(this)).balanceOf(user);
        lockedLiquidity -= total;
        }
        status = 0;
    }

    function Migrate() external { //Incase we upgrade to PROv2 in the future
        require(status == 0, "No reentry");
        status = 1;
        require(msg.sender == _poolOwner || msg.sender == _controller && newDep != address(0), "Not ready");
        sync();
        userLock storage ulock = _userlock[_poolOwner];
        IERC20(Main).approve(newDep, 1e30);
        IERC20(Token).approve(newDep, 1e50);
        uint256 tot = _balance[_poolOwner];
        _balance[_poolOwner] -= tot;
        uint256 ts = totalSupply;
        uint256 amt = bmul(_records[Main].balance, bdiv(tot, ts));
        uint256 amt1 = bmul(_records[Token].balance, bdiv(tot, ts));
        totalSupply -= tot;
        ulock.setLock = false;
        lockedLiquidity -= tot;
        newDeployer(newDep).createPair(Token, amt, amt1, _poolOwner);
        sync();
        status = 0;
    }

    function _pullUnderlying(address erc20, address from, uint256 amount)
        internal 
    {   
        bool xfer = IERC20(erc20).transferFrom(from, address(this), amount);
        require(xfer);
    }
    
    function _pushUnderlying(address erc20, address to, uint256 amount)
        internal 
    {   
        bool xfer = IERC20(erc20).transfer(to, amount);
        require(xfer);
    }
    
    function burnFEG() internal {
        if(_totalSupply8 > 75e14){ 
        wrap(Main).withdraw(_totalSupply8);
        swap(fegp).BUY{value:bmul(_totalSupply8, bdiv(99, 100))}(1001, burn, 1);
        _totalSupply8 = 0;
        }
    }
    
    function payStake() internal {   
        if(_totalSupply7 > 25e14) {
        _pushUnderlying(Main, FEGstake, _totalSupply7);
        _totalSupply7 = 0;
        }
    }
    
    function payMain(address payee, uint256 amount)
        external  
        
    {   
        require(_balances2[msg.sender] >= amount, "Not enough token");
        uint256 amt = bmul(amount, bdiv(997, 1000));
        _balances2[msg.sender] -= amount;
        _balances2[payee] += amt;
        _balances2[burn] += bsub(amount, amt);
        status = 0;
    }
    
    function payToken(address payee, uint256 amount)
        external  
        
    {
        require(status == 0, "No reentry");
        status = 1;
        require(_balances1[msg.sender] >= amount, "Not enough token");
        _balances1[msg.sender] -= amount;
        _balances1[payee] += amount;
        status = 0;
    }
}

Contract Security Audit

Contract ABI

[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"src","type":"address"},{"indexed":true,"internalType":"address","name":"dst","type":"address"},{"indexed":false,"internalType":"uint256","name":"amt","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"caller","type":"address"},{"indexed":true,"internalType":"address","name":"tokenOut","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenAmountOut","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"reservesAmount","type":"uint256"}],"name":"LOG_EXIT","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"caller","type":"address"},{"indexed":true,"internalType":"address","name":"tokenIn","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenAmountIn","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"reservesAmount","type":"uint256"}],"name":"LOG_JOIN","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"caller","type":"address"},{"indexed":true,"internalType":"address","name":"tokenIn","type":"address"},{"indexed":true,"internalType":"address","name":"tokenOut","type":"address"},{"indexed":false,"internalType":"uint256","name":"AmountIn","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"AmountOut","type":"uint256"}],"name":"LOG_SMARTSWAP","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"caller","type":"address"},{"indexed":true,"internalType":"address","name":"tokenIn","type":"address"},{"indexed":true,"internalType":"address","name":"tokenOut","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenAmountIn","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"tokenAmountOut","type":"uint256"}],"name":"LOG_SWAP","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"src","type":"address"},{"indexed":true,"internalType":"address","name":"dst","type":"address"},{"indexed":false,"internalType":"uint256","name":"amt","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"uint256","name":"dot","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"minAmountOut","type":"uint256"}],"name":"BUY","outputs":[{"internalType":"uint256","name":"tokenAmountOut","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenAmountIn","type":"uint256"},{"internalType":"uint256","name":"minAmountOut","type":"uint256"}],"name":"BUYSmart","outputs":[{"internalType":"uint256","name":"tokenAmountOut","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"Bonus","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_addy","type":"address"}],"name":"IsWhiteListContract","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_BUY_RATIO","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_SELL_RATIO","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"Main","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"Migrate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"PSS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"RPF","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"dot","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenAmountIn","type":"uint256"},{"internalType":"uint256","name":"minAmountOut","type":"uint256"}],"name":"SELL","outputs":[{"internalType":"uint256","name":"tokenAmountOut","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenAmountIn","type":"uint256"},{"internalType":"uint256","name":"minAmountOut","type":"uint256"}],"name":"SELLSmart","outputs":[{"internalType":"uint256","name":"tokenAmountOut","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"Token","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_poolOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_totalSupply1","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_totalSupply2","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_totalSupply7","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_totalSupply8","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"_unlockTime","outputs":[{"internalType":"bool","name":"setLock","type":"bool"},{"internalType":"uint256","name":"unlockTime","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"poolAmountOut","type":"uint256"},{"internalType":"uint256[]","name":"maxAmountsIn","type":"uint256[]"}],"name":"addBothLiquidity","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_addy","type":"address"},{"internalType":"bool","name":"boolean","type":"bool"}],"name":"addWhiteListContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"src","type":"address"},{"internalType":"address","name":"dst","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"dst","type":"address"},{"internalType":"uint256","name":"amt","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"whom","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenBalanceIn","type":"uint256"},{"internalType":"uint256","name":"tokenWeightIn","type":"uint256"},{"internalType":"uint256","name":"tokenBalanceOut","type":"uint256"},{"internalType":"uint256","name":"tokenWeightOut","type":"uint256"},{"internalType":"uint256","name":"tokenAmountOut","type":"uint256"},{"internalType":"uint256","name":"swapFee","type":"uint256"}],"name":"calcInGivenOut","outputs":[{"internalType":"uint256","name":"tokenAmountIn","type":"uint256"},{"internalType":"uint256","name":"tokenInFee","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenBalanceIn","type":"uint256"},{"internalType":"uint256","name":"tokenWeightIn","type":"uint256"},{"internalType":"uint256","name":"tokenBalanceOut","type":"uint256"},{"internalType":"uint256","name":"tokenWeightOut","type":"uint256"},{"internalType":"uint256","name":"tokenAmountIn","type":"uint256"},{"internalType":"uint256","name":"swapFee","type":"uint256"}],"name":"calcOutGivenIn","outputs":[{"internalType":"uint256","name":"tokenAmountOut","type":"uint256"},{"internalType":"uint256","name":"tokenInFee","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenBalanceIn","type":"uint256"},{"internalType":"uint256","name":"tokenWeightIn","type":"uint256"},{"internalType":"uint256","name":"tokenBalanceOut","type":"uint256"},{"internalType":"uint256","name":"tokenWeightOut","type":"uint256"},{"internalType":"uint256","name":"tokenAmountIn","type":"uint256"}],"name":"calcOutGivenIn1","outputs":[{"internalType":"uint256","name":"tokenAmountOut","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenBalanceIn","type":"uint256"},{"internalType":"uint256","name":"tokenWeightIn","type":"uint256"},{"internalType":"uint256","name":"tokenBalanceOut","type":"uint256"},{"internalType":"uint256","name":"tokenWeightOut","type":"uint256"},{"internalType":"uint256","name":"swapFee","type":"uint256"}],"name":"calcSpotPrice","outputs":[{"internalType":"uint256","name":"spotPrice","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"dst","type":"address"},{"internalType":"uint256","name":"amt","type":"uint256"}],"name":"decreaseApproval","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"uint256","name":"liqtoken","type":"uint256"}],"name":"deploySwap","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"asset","type":"address"},{"internalType":"uint256","name":"amt","type":"uint256"}],"name":"depositInternal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"getBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"address","name":"tokenOut","type":"address"}],"name":"getSpotPrice","outputs":[{"internalType":"uint256","name":"spotPrice","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"usr","type":"address"}],"name":"getUserLock","outputs":[{"internalType":"bool","name":"lock","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"dst","type":"address"},{"internalType":"uint256","name":"amt","type":"uint256"}],"name":"increaseApproval","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_token1","type":"address"},{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"_made","type":"address"},{"internalType":"address","name":"_fegp","type":"address"},{"internalType":"uint256","name":"ol","type":"uint256"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"lockedLiquidity","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"open","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"openit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"pairRewardPool","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"payee","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"payMain","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"payee","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"payToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"releaseLiquidity","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"poolAmountIn","type":"uint256"},{"internalType":"uint256[]","name":"minAmountsOut","type":"uint256[]"}],"name":"removeBothLiquidity","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_bonus","type":"address"}],"name":"setBonus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"manager","type":"address"},{"internalType":"address","name":"set","type":"address"},{"internalType":"address","name":"ad","type":"address"}],"name":"setCont","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"setLockLiquidity","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"sellmax","type":"uint256"},{"internalType":"uint256","name":"buymax","type":"uint256"}],"name":"setMaxBuySellRatio","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"prp","type":"address"}],"name":"setPRP","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_PSS","type":"uint256"},{"internalType":"uint256","name":"_RPF","type":"uint256"}],"name":"setPSSRPF","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_stake","type":"address"},{"internalType":"address","name":"_fegp","type":"address"},{"internalType":"address","name":"newd","type":"address"}],"name":"setStakePool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amt","type":"uint256"}],"name":"setTX1","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"path","type":"address"},{"internalType":"address","name":"asset","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amt","type":"uint256"}],"name":"swapToSwap","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sync","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"totalSentRebates","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"dst","type":"address"},{"internalType":"uint256","name":"amt","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"src","type":"address"},{"internalType":"address","name":"dst","type":"address"},{"internalType":"uint256","name":"amt","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"tx1","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tx2","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_addr","type":"address"}],"name":"userBalanceInternal","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"asset","type":"address"},{"internalType":"uint256","name":"amt","type":"uint256"}],"name":"withdrawInternal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

600060025560c0604052600960808190526846454765782050524f60b81b60a090815262000031916003919062000142565b50604080518082019091526008808252672628102a37b5b2b760c11b6020909201918252620000639160049162000142565b506005805460ff19166012179055600780546001600160a01b0319908116734c9bc793716e8dc05d1f48d8ca8f84318ec3043c179091556008805482167386882fa66ac57039b10d78e2d3205592a44664c0179055600a8054821673acfc95585d80ab62f67a14c566c1b7a49fe91167179055600b8054821661dead179055600d80549091167387b1acce6a1958e522233a737313c086551a5c7617905568056bc75e2d6310000060135560146015556103e8601655601e805461ffff19169055606360265560006027553480156200013b57600080fd5b5062000225565b8280546200015090620001e8565b90600052602060002090601f016020900481019282620001745760008555620001bf565b82601f106200018f57805160ff1916838001178555620001bf565b82800160010185558215620001bf579182015b82811115620001bf578251825591602001919060010190620001a2565b50620001cd929150620001d1565b5090565b5b80821115620001cd5760008155600101620001d2565b600181811c90821680620001fd57607f821691505b602082108114156200021f57634e487b7160e01b600052602260045260246000fd5b50919050565b61557980620002356000396000f3fe6080604052600436106102e15760003560e01c80627b44a7146102ed5780630149e5c714610316578063036fe1bb14610346578063055a03c51461035c57806306fdde031461037257806307d729c414610394578063095ea7b3146103e5578063103ff68d1461040557806310510ec11461042757806312dcff7a1461044757806315e84af91461046757806318160ddd14610487578063192661121461049d578063207aba24146104bd5780632140fb40146104d257806323b872dd146104f257806329dfe3b2146105125780632b9abe1a14610532578063313ce5671461058257806331705705146105ae578063390a73e2146105db57806349a3fa9e146105f15780634f5c3d1b14610611578063520bb81b1461063157806365d1a40d1461065157806366188463146106715780636a8ebcd2146106915780636c5c6814146106a657806370a08231146106bc57806371a1e6dd146106f25780637bc224f91461071257806388f60dcb146107325780638c340f641461075257806395d89b411461077257806396c4b648146107875780639a6204ed146107a7578063a16faa18146107bd578063a221ee49146107d2578063a2e70a2e146107f2578063a9059cbb14610808578063ac7a36a214610828578063add975cc14610848578063ae1931be14610868578063b071148314610888578063b4398244146108a8578063ba9530a6146108be578063bbf12714146108de578063c172715c146108fe578063c241267614610911578063cdfec52d14610931578063d62b6f7e14610947578063d68de8de14610967578063d73dd62314610987578063da6d6578146109a7578063dbb74e22146109bd578063dd62ed3e146109dd578063ef8fdfd814610a23578063f1091b6e14610a43578063f7013ef614610a59578063f8b2cb4f14610a79578063f8d6aed414610ab2578063fbe8998914610ad2578063fcfff16f14610ae8578063fea4393a14610b07578063fff6cae914610b2757600080fd5b366102e857005b600080fd5b3480156102f957600080fd5b5061030360165481565b6040519081526020015b60405180910390f35b34801561032257600080fd5b50610336610331366004614c0f565b610b3c565b604051901515815260200161030d565b34801561035257600080fd5b5061030360195481565b34801561036857600080fd5b5061030360135481565b34801561037e57600080fd5b50610387610b5a565b60405161030d919061501e565b3480156103a057600080fd5b506103ce6103af366004614c0f565b6021602052600090815260409020805460019091015460ff9091169082565b60408051921515835260208301919091520161030d565b3480156103f157600080fd5b50610336610400366004614dba565b610be8565b34801561041157600080fd5b50610425610420366004614d83565b610c43565b005b34801561043357600080fd5b50610425610442366004614dba565b610c85565b34801561045357600080fd5b50610425610462366004614c0f565b610d3c565b34801561047357600080fd5b50610303610482366004614c2a565b610dc0565b34801561049357600080fd5b5061030360025481565b3480156104a957600080fd5b506104256104b8366004614dba565b610e2e565b3480156104c957600080fd5b50610425610fbe565b3480156104de57600080fd5b506103366104ed366004614c0f565b6112ff565b3480156104fe57600080fd5b5061033661050d366004614d47565b61131c565b34801561051e57600080fd5b5061042561052d366004614e93565b61145b565b34801561053e57600080fd5b5061057461054d366004614c0f565b6001600160a01b031660009081526024602090815260408083205460239092529091205491565b60405161030d92919061532a565b34801561058e57600080fd5b5060055461059c9060ff1681565b60405160ff909116815260200161030d565b3480156105ba57600080fd5b506010546105ce906001600160a01b031681565b60405161030d9190614ff1565b3480156105e757600080fd5b50610303601b5481565b3480156105fd57600080fd5b5061042561060c366004614c5d565b611773565b34801561061d57600080fd5b5061030361062c366004614f57565b6117c9565b34801561063d57600080fd5b50600c546105ce906001600160a01b031681565b34801561065d57600080fd5b5061042561066c366004614dba565b61184f565b34801561067d57600080fd5b5061033661068c366004614dba565b61192c565b34801561069d57600080fd5b50610425611a02565b3480156106b257600080fd5b5061030360255481565b3480156106c857600080fd5b506103036106d7366004614c0f565b6001600160a01b031660009081526020819052604090205490565b3480156106fe57600080fd5b5061042561070d366004614e93565b611a2a565b34801561071e57600080fd5b5061042561072d366004614c5d565b611b94565b34801561073e57600080fd5b5061042561074d366004614f11565b611bea565b34801561075e57600080fd5b5061042561076d366004614f11565b611d62565b34801561077e57600080fd5b50610387611ee1565b34801561079357600080fd5b506104256107a2366004614c0f565b611eee565b3480156107b357600080fd5b50610303601d5481565b3480156107c957600080fd5b506104256120de565b3480156107de57600080fd5b506103036107ed366004614f57565b612208565b3480156107fe57600080fd5b5061030360185481565b34801561081457600080fd5b50610336610823366004614dba565b61226d565b34801561083457600080fd5b50610425610843366004614dba565b6122a9565b34801561085457600080fd5b50610303610863366004614e58565b61257b565b34801561087457600080fd5b50610303610883366004614f11565b612b19565b34801561089457600080fd5b506104256108a3366004614cfc565b612f3a565b3480156108b457600080fd5b50610303601c5481565b3480156108ca57600080fd5b506105746108d9366004614f92565b613444565b3480156108ea57600080fd5b506104256108f9366004614dba565b6134d5565b61030361090c366004614e33565b6137a1565b34801561091d57600080fd5b50600f546105ce906001600160a01b031681565b34801561093d57600080fd5b5061030360145481565b34801561095357600080fd5b50600d546105ce906001600160a01b031681565b34801561097357600080fd5b50610425610982366004614e01565b613b17565b34801561099357600080fd5b506103366109a2366004614dba565b613b33565b3480156109b357600080fd5b50610303601a5481565b3480156109c957600080fd5b506104256109d8366004614c0f565b613ba6565b3480156109e957600080fd5b506103036109f8366004614c2a565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b348015610a2f57600080fd5b506012546105ce906001600160a01b031681565b348015610a4f57600080fd5b5061030360155481565b348015610a6557600080fd5b50610425610a74366004614ca0565b613bdf565b348015610a8557600080fd5b50610303610a94366004614c0f565b6001600160a01b03166000908152601f602052604090206001015490565b348015610abe57600080fd5b50610574610acd366004614f92565b613d08565b348015610ade57600080fd5b5061030360265481565b348015610af457600080fd5b50601e5461033690610100900460ff1681565b348015610b1357600080fd5b50610303610b22366004614f11565b613db2565b348015610b3357600080fd5b506104256140d6565b6001600160a01b031660009081526022602052604090205460ff1690565b60038054610b67906153c6565b80601f0160208091040260200160405190810160405280929190818152602001828054610b93906153c6565b8015610be05780601f10610bb557610100808354040283529160200191610be0565b820191906000526020600020905b815481529060010190602001808311610bc357829003601f168201915b505050505081565b3360008181526001602090815260408083206001600160a01b0387168085529252808320859055519192909160008051602061550483398151915290610c319086815260200190565b60405180910390a35060015b92915050565b6008546001600160a01b03163314610c5a57600080fd5b6001600160a01b03919091166000908152602260205260409020805460ff1916911515919091179055565b60275415610cae5760405162461bcd60e51b8152600401610ca590615051565b60405180910390fd5b600160275533600090815260236020526040902054811115610ce25760405162461bcd60e51b8152600401610ca5906150d3565b3360009081526023602052604081208054839290610d01908490615383565b90915550506001600160a01b03821660009081526023602052604081208054839290610d2e908490615338565b909155505060006027555050565b600c546001600160a01b031633148015610d645750600d546001600160a01b03828116911614155b8015610d7e5750600f546001600160a01b03828116911614155b610d8757600080fd5b610d9081614251565b1515600114610d9e57600080fd5b601280546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b038083166000908152601f6020526040808220928416825281206001830154919291610e2590610e00670de0b6b3a76400006019614291565b8360010154610e18670de0b6b3a76400006019614291565b66071afd498d0000612208565b95945050505050565b600d546001600160a01b0383811691161480610e575750600f546001600160a01b038381169116145b610e735760405162461bcd60e51b8152600401610ca590615303565b60275415610e935760405162461bcd60e51b8152600401610ca590615051565b6001602755600f546001600160a01b0383811691161415610f345733600090815260236020526040902054811115610edd5760405162461bcd60e51b8152600401610ca5906150a9565b8060186000828254610eef9190615383565b90915550503360009081526023602052604081208054839290610f13908490615383565b9091555050600f54610f2f906001600160a01b03163383614325565b610fb5565b33600090815260246020526040902054811115610f635760405162461bcd60e51b8152600401610ca5906151ac565b8060196000828254610f759190615383565b90915550503360009081526024602052604081208054839290610f99908490615383565b9091555050600d54610fb5906001600160a01b03163383614325565b50506000602755565b60275415610fde5760405162461bcd60e51b8152600401610ca590615051565b6001602755600c546001600160a01b031633148061101b57506007546001600160a01b03163314801561101b5750600e546001600160a01b031615155b6110535760405162461bcd60e51b81526020600482015260096024820152684e6f7420726561647960b81b6044820152606401610ca5565b61105b6140d6565b600c546001600160a01b03908116600090815260208052604090819020600d54600e54925163095ea7b360e01b815291939081169263095ea7b3926110b592919091169068327cb2734119d3b7a9601e1b90600401615005565b602060405180830381600087803b1580156110cf57600080fd5b505af11580156110e3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111079190614de4565b50600f54600e5460405163095ea7b360e01b81526001600160a01b039283169263095ea7b392611150929116906e111b0ec57e6499a1f4b1014d3f6d5960321b90600401615005565b602060405180830381600087803b15801561116a57600080fd5b505af115801561117e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111a29190614de4565b50600c546001600160a01b031660009081526020819052604081208054918291906111cd8380615383565b9091555050600254600d546001600160a01b03166000908152601f60205260408120600101546112069061120185856143ba565b614291565b600f546001600160a01b03166000908152601f6020526040812060010154919250906112369061120186866143ba565b9050836002600082825461124a9190615383565b9091555050845460ff19168555601c805485919060009061126c908490615383565b9091555050600e54600f54600c54604051632f1c0f2560e01b81526001600160a01b03928316600482015260248101869052604481018590529082166064820152911690632f1c0f2590608401600060405180830381600087803b1580156112d357600080fd5b505af11580156112e7573d6000803e3d6000fd5b505050506112f36140d6565b50506000602755505050565b6001600160a01b0316600090815260208052604090205460ff1690565b6000336001600160a01b038516148061135857506001600160a01b03841660009081526001602090815260408083203384529091529020548211155b61136157600080fd5b61136a336112ff565b156113875760405162461bcd60e51b8152600401610ca590615151565b61139284848461448c565b336001600160a01b038516148015906113d057506001600160a01b038416600090815260016020908152604080832033845290915290205460001914155b15611451576001600160a01b0384166000908152600160209081526040808320338452909152902054611403908361454a565b6001600160a01b038581166000908152600160209081526040808320338085529083529281902085905551938452918616929091600080516020615504833981519152910160405180910390a35b5060019392505050565b611464336112ff565b156114815760405162461bcd60e51b8152600401610ca590615151565b602754156114a15760405162461bcd60e51b8152600401610ca590615051565b60016027556114ae6140d6565b60025460006114bd85836143ba565b336000908152602081905260408120805492935087929091906114e1908490615383565b9250508190555084600260008282546114fa9190615383565b909155505060405185815260009033906000805160206154e48339815191529060200160405180910390a360005b601754811015611625576000601782815481106115475761154761545c565b60009182526020808320909101546001600160a01b0316808352601f90915260408220600101549092509061157c8583614291565b90508787858181106115905761159061545c565b905060200201358110156115b65760405162461bcd60e51b8152600401610ca5906151d5565b826001600160a01b0316336001600160a01b03167f9d9058fd2f25ccc389fec7720abef0ca83472f5abfafd5f10d37f51e6a0493f38360006040516115fc92919061532a565b60405180910390a361160f833383614325565b505050808061161d90615401565b915050611528565b50600b546001600160a01b031660009081526024602052604081205461164c908390614291565b600b546001600160a01b031660009081526024602052604081208054929350839290919061167b908490615383565b9091555050336000908152602460205260408120805483929061169f908490615338565b909155506116ad90506140d6565b6012546001600160a01b031615611766576012546040516370a0823160e01b81526000916117459185916001600160a01b0316906370a08231906116f5903090600401614ff1565b60206040518083038186803b15801561170d57600080fd5b505afa158015611721573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112019190614e1a565b9050801561176457601254611764906001600160a01b03163383614325565b505b5050600060275550505050565b6008546001600160a01b0316331461178a57600080fd5b601180546001600160a01b039485166001600160a01b0319918216179091556009805493851693821693909317909255600e8054919093169116179055565b6000806117d686856143ba565b905060006117ed670de0b6b3a7640000600061454a565b90506117f98482614291565b905060006118108961180b8b856145a7565b6143ba565b9050600061181e8285614600565b90506000611834670de0b6b3a76400008361454a565b90506118408982614291565b9b9a5050505050505050505050565b3360009081526024602052604090205481111561187e5760405162461bcd60e51b8152600401610ca5906150d3565b6000611892826112016103e56103e86143ba565b336000908152602460205260408120805492935084929091906118b6908490615383565b90915550506001600160a01b038316600090815260246020526040812080548392906118e3908490615338565b909155506118f39050828261454a565b600b546001600160a01b03166000908152602460205260408120805490919061191d908490615338565b90915550506000602755505050565b3360009081526001602090815260408083206001600160a01b038616845290915281205480831115611981573360009081526001602090815260408083206001600160a01b03881684529091528120556119b0565b61198b818461454a565b3360009081526001602090815260408083206001600160a01b03891684529091529020555b3360008181526001602090815260408083206001600160a01b03891680855290835292819020549051908152919291600080516020615504833981519152910160405180910390a35060019392505050565b600c546001600160a01b03163314611a1957600080fd5b601e805461ff001916610100179055565b60275415611a4a5760405162461bcd60e51b8152600401610ca590615051565b60016027556002546000611a5e85836143ba565b9050611a69336112ff565b151560011415611a8b5784601c6000828254611a859190615338565b90915550505b60005b601754811015611b7857600060178281548110611aad57611aad61545c565b60009182526020808320909101546001600160a01b0316808352601f909152604082206001015490925090611ae28583614291565b9050878785818110611af657611af661545c565b90506020020135811115611b0957600080fd5b826001600160a01b0316336001600160a01b03167f15a8ca63e37b2cff1677df2b6b82d36fcf8a524228bd7a4b4d02d107c28c1e8a836000604051611b4f92919061532a565b60405180910390a3611b62833383614704565b5050508080611b7090615401565b915050611a8e565b50611b8285614743565b611b8c33866147a6565b6112f36140d6565b6007546001600160a01b03163314611bab57600080fd5b600780546001600160a01b039485166001600160a01b0319918216179091556008805493851693821693909317909255600c8054919093169116179055565b600d546001600160a01b039081166000908152601f6020526040902060010154600c5490911633148015611c2757506801158e460913d000008110155b611c435760405162461bcd60e51b8152600401610ca590615075565b68056bc75e2d63100000811015611cc1576103de8210158015611c6857506103e88211155b8015611c75575060648311155b8015611c8057508215155b611cc15760405162461bcd60e51b815260206004820152601260248201527143616e6e6f7420736574206f76657220312560701b6044820152606401610ca5565b68056bc75e2d631000008110611d59576103848210158015611ce557506103e88211155b8015611cf357506101f48311155b8015611cfe57508215155b611d595760405162461bcd60e51b815260206004820152602660248201527f43616e6e6f742073657420505353206f766572203525206f7220525046206f7660448201526565722031302560d01b6064820152608401610ca5565b50601655601555565b600c546001600160a01b03163314611d8c5760405162461bcd60e51b8152600401610ca590615075565b600f54604080516318160ddd60e01b815290516000926001600160a01b0316916318160ddd916004808301926020929190829003018186803b158015611dd157600080fd5b505afa158015611de5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e099190614e1a565b9050611e176103e882615350565b8310158015611e265750808311155b611e8d5760405162461bcd60e51b815260206004820152603260248201527f6d696e20302e3125206f6620746f6b656e20737570706c792c206d61782031306044820152713025206f6620746f6b656e20737570706c7960701b6064820152608401610ca5565b670de0b6b3a7640000821015611ed55760405162461bcd60e51b815260206004820152600d60248201526c3120424e42206d696e696d756d60981b6044820152606401610ca5565b50601491909155601355565b60048054610b67906153c6565b60275415611f0e5760405162461bcd60e51b8152600401610ca590615051565b6001602755611f1c816112ff565b1515600114611f645760405162461bcd60e51b8152602060048201526014602482015273131a5c5d5a591a5d1e481b9bdd081b1bd8dad95960621b6044820152606401610ca5565b6001600160a01b0381811660009081526020808052604080832060219092529091206007549192909116331415611fac57611fa24262015180615338565b60018201556120d4565b80600101544210158015611fca5750600c546001600160a01b031633145b61203b5760405162461bcd60e51b8152602060048201526048602482015260008051602061552483398151915260448201527f72656c65617365206c697175696469747920756e74696c206166746572206c6f60648201526731b5903a34b6b29760c11b608482015260a401610ca5565b815460ff191682556040516370a0823160e01b815260009030906370a0823190612069908790600401614ff1565b60206040518083038186803b15801561208157600080fd5b505afa158015612095573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120b99190614e1a565b905080601c60008282546120cd9190615383565b9091555050505b5050600060275550565b336120e8816112ff565b156121305760405162461bcd60e51b8152602060048201526018602482015277131a5c5d5a591a5d1e48185b1c9958591e481b1bd8dad95960421b6044820152606401610ca5565b6040516370a0823160e01b815260009030906370a0823190612156908590600401614ff1565b60206040518083038186803b15801561216e57600080fd5b505afa158015612182573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121a69190614e1a565b6001600160a01b0383166000908152602080805260408083206021909252909120815460ff19166001178255919250906121e3426276a700615338565b816001018190555082601c60008282546121fd9190615338565b909155505050505050565b60008061221587876143ba565b9050600061222386866143ba565b9050600061223183836143ba565b90506000612253670de0b6b3a764000061180b670de0b6b3a76400008961454a565b905061225f8282614291565b9a9950505050505050505050565b6000612278336112ff565b156122955760405162461bcd60e51b8152600401610ca590615151565b6122a033848461448c565b50600192915050565b601e5460ff16156122b957600080fd5b600f546040516370a0823160e01b81526000916001600160a01b0316906370a08231906122ea903090600401614ff1565b60206040518083038186803b15801561230257600080fd5b505afa158015612316573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061233a9190614e1a565b600d546040516370a0823160e01b81529192506000916001600160a01b03909116906370a0823190612370903090600401614ff1565b60206040518083038186803b15801561238857600080fd5b505afa15801561239c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123c09190614e1a565b6040805180820182526017805482526020808301878152600f80546001600160a01b039081166000908152601f80865288822097518855935160019788015587518089018952865481528086018a8152600d80548516845295909652888220905181559451948701949094558154855480880187557fc624b66cc0138b8fabc209247f72d758e1cf3343756d543badbf24212bed8c1590810180549284166001600160a01b03199384161790559354865480890190975595909301805495821695909316949094179091555490911681529182200154919250906124a890633b9aca006143ba565b600d546001600160a01b03166000908152601f6020526040812060010154919250906124dc90670de0b6b3a76400006143ba565b905060006124ea8284615338565b90506124f581614743565b6124ff87826147a6565b61250b601c54826145a7565b601c556001600160a01b0387166000908152602080805260408083206021909252909120815460ff19166001178255612548426301e13380615338565b600180830191909155601e805460ff1916909117905561256d6064611201898b6143ba565b602555505050505050505050565b600061258633610b3c565b6125aa57602754156125aa5760405162461bcd60e51b8152600401610ca590615051565b60016027819055601e54610100900460ff161515146125db5760405162461bcd60e51b8152600401610ca590615209565b6125e4336147b5565b15156001141561260f57600654851461260f5760405162461bcd60e51b8152600401610ca5906152b0565b6014548311156126315760405162461bcd60e51b8152600401610ca59061525c565b600f546001600160a01b03166000818152601f60205260409020600101549061265b903386614704565b601854600f546040516370a0823160e01b81526001600160a01b03909116906370a082319061268e903090600401614ff1565b60206040518083038186803b1580156126a657600080fd5b505afa1580156126ba573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126de9190614e1a565b6126e89190615383565b600f80546001600160a01b039081166000908152601f6020526040808220600190810195909555925490911681529081209091015461273a9061272c908490615383565b6112016103e66103e86143ba565b600f546001600160a01b03166000908152601f60205260409020600101549091506127a990612772670de0b6b3a76400006019614291565b600d546001600160a01b03166000908152601f60205260409020600101546127a3670de0b6b3a76400006019614291565b856117c9565b600d546001600160a01b03166000908152601f60205260409020600101549093506127da90611201603260646143ba565b8311156127f95760405162461bcd60e51b8152600401610ca590615284565b838310156128195760405162461bcd60e51b8152600401610ca5906151d5565b600061282d846112016016546103e86143ba565b9050600061284282611201600f6127106143ba565b9050600061285783611201600f6127106143ba565b9050600061286d846112016015546127106143ba565b905060008161287c8486615338565b6128869190615338565b6128909086615383565b905060006128a6826112016103e76103e86143ba565b30600090815260246020526040902054909150662386f26fc100008111156128f05780601960008282546128da9190615383565b9091555050306000908152602460205260408120555b600d546001600160a01b0316632e1a7d4d8761290c8486615338565b6129169190615338565b6040518263ffffffff1660e01b815260040161293491815260200190565b600060405180830381600087803b15801561294e57600080fd5b505af1158015612962573d6000803e3d6000fd5b5050505061297f8d61297a84611201606360646143ba565b6147dc565b6129908361120160016103e86143ba565b601b60008282546129a19190615338565b90915550600090506129b985611201600560646143ba565b905060006129cd86611201600f60646143ba565b90506129df86611201605060646143ba565b6010546001600160a01b031660009081526024602052604081208054909190612a09908490615338565b90915550506008546001600160a01b031660009081526024602052604081208054839290612a38908490615338565b9091555050600b546001600160a01b031660009081526024602052604081208054849290612a67908490615338565b925050819055508560196000828254612a809190615338565b9250508190555086601a6000828254612a999190615338565b90915550612aa790506148aa565b612aaf6148e3565b612ab76140d6565b600d54600f546001600160a01b039182169116336000805160206154c48339815191528d612aeb89611201606360646143ba565b604051612af992919061532a565b60405180910390a450506000602755509c9b505050505050505050505050565b6000602754600014612b3d5760405162461bcd60e51b8152600401610ca590615051565b6001602755336000908152602360205260409020548390811115612b735760405162461bcd60e51b8152600401610ca5906150a9565b600f546001600160a01b039081166000908152601f6020526040808220600d5490931682529020601454861115612bbc5760405162461bcd60e51b8152600401610ca59061525c565b612c018260010154612bd7670de0b6b3a76400006019614291565b8360010154612bef670de0b6b3a76400006019614291565b61062c8b6112016103e66103e86143ba565b9350612c178160010154611201603260646143ba565b841115612c365760405162461bcd60e51b8152600401610ca590615284565b6000612c4a856112016016546103e86143ba565b90506000612c5f82611201600f6127106143ba565b90506000612c7483611201600f6127106143ba565b90506000612c8a846112016015546127106143ba565b9050600081612c998486615338565b612ca39190615338565b612cad9086615383565b90506000612cc3826112016103e76103e86143ba565b9050612cd68261120160016103e86143ba565b601b6000828254612ce79190615338565b90915550508a811015612d0c5760405162461bcd60e51b8152600401610ca5906151d5565b33600090815260236020526040812080548e9290612d2b908490615383565b925050819055508b60186000828254612d449190615383565b90915550503360009081526024602052604081208054839290612d68908490615338565b90915550503060009081526024602052604081208054879290612d8c908490615338565b9091555060009050612da484611201605060646143ba565b90506000612db885611201600560646143ba565b90506000612dcc86611201600f60646143ba565b6010546001600160a01b0316600090815260246020526040812080549293508592909190612dfb908490615338565b90915550506008546001600160a01b031660009081526024602052604081208054839290612e2a908490615338565b9091555050600b546001600160a01b031660009081526024602052604081208054849290612e59908490615338565b90915550849050612e6a878a615338565b612e749190615338565b60196000828254612e859190615338565b9250508190555086601a6000828254612e9e9190615338565b90915550612eac90506140d6565b612eb46148e3565b600d60009054906101000a90046001600160a01b03166001600160a01b0316600f60009054906101000a90046001600160a01b03166001600160a01b0316336001600160a01b03166000805160206154a48339815191528f88604051612f1b92919061532a565b60405180910390a450506000602755509b9a5050505050505050505050565b600d546001600160a01b0384811691161480612f635750600f546001600160a01b038481169116145b612f7f5760405162461bcd60e51b8152600401610ca590615303565b60275415612f9f5760405162461bcd60e51b8152600401610ca590615051565b6001602755600d546001600160a01b03848116911614156131fc5733600090815260246020526040902054811115612fe95760405162461bcd60e51b8152600401610ca5906151ac565b600d5460405163095ea7b360e01b81526001600160a01b039091169063095ea7b39061301b9087908590600401615005565b602060405180830381600087803b15801561303557600080fd5b505af1158015613049573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061306d9190614de4565b5080601960008282546130809190615383565b909155505033600090815260246020526040812080548392906130a4908490615383565b9091555050600d54604051632efc49c560e21b81526001600160a01b038681169263bbf12714926130dd92909116908590600401615005565b600060405180830381600087803b1580156130f757600080fd5b505af115801561310b573d6000803e3d6000fd5b50505050600080856001600160a01b0316632b9abe1a306040518263ffffffff1660e01b815260040161313e9190614ff1565b6040805180830381600087803b15801561315757600080fd5b505af115801561316b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061318f9190614f33565b6040516365d1a40d60e01b815291935091506001600160a01b038716906365d1a40d906131c29087908590600401615005565b600060405180830381600087803b1580156131dc57600080fd5b505af11580156131f0573d6000803e3d6000fd5b50613439945050505050565b3360009081526023602052604090205481111561322b5760405162461bcd60e51b8152600401610ca5906150a9565b600f5460405163095ea7b360e01b81526001600160a01b039091169063095ea7b39061325d9087908590600401615005565b602060405180830381600087803b15801561327757600080fd5b505af115801561328b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906132af9190614de4565b5080601860008282546132c29190615383565b909155505033600090815260236020526040812080548392906132e6908490615383565b9091555050600f54604051632efc49c560e21b81526001600160a01b038681169263bbf127149261331f92909116908590600401615005565b600060405180830381600087803b15801561333957600080fd5b505af115801561334d573d6000803e3d6000fd5b50505050600080856001600160a01b0316632b9abe1a306040518263ffffffff1660e01b81526004016133809190614ff1565b6040805180830381600087803b15801561339957600080fd5b505af11580156133ad573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906133d19190614f33565b6040516310510ec160e01b815291935091506001600160a01b038716906310510ec1906134049087908690600401615005565b600060405180830381600087803b15801561341e57600080fd5b505af1158015613432573d6000803e3d6000fd5b5050505050505b505060006027555050565b600080600061345388876143ba565b90506000613469670de0b6b3a76400008661454a565b90506134758682614291565b905060006134878b61180b8d856145a7565b905060006134958285614600565b905060006134ab670de0b6b3a76400008361454a565b90506134b78b82614291565b96506134c3898561454a565b95505050505050965096945050505050565b600d546001600160a01b03838116911614806134fe5750600f546001600160a01b038381169116145b61351a5760405162461bcd60e51b8152600401610ca590615303565b6027541561353a5760405162461bcd60e51b8152600401610ca590615051565b60016027819055601e54610100900460ff1615151461355857600080fd5b600f546001600160a01b038381169116141561367b57600f546001600160a01b03166000818152601f602052604090206001015490613598903384614704565b600f546040516370a0823160e01b8152600091613627916001600160a01b03909116906370a08231906135cf903090600401614ff1565b60206040518083038186803b1580156135e757600080fd5b505afa1580156135fb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061361f9190614e1a565b60185461454a565b90506000613635828461454a565b905080601860008282546136499190615338565b9091555050336000908152602360205260408120805483929061366d908490615338565b90915550610fb59350505050565b600d546001600160a01b03166000818152601f6020526040902060010154906136a5903384614704565b600d546040516370a0823160e01b815260009161374a916001600160a01b03909116906370a08231906136dc903090600401614ff1565b60206040518083038186803b1580156136f457600080fd5b505afa158015613708573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061372c9190614e1a565b613745601954613740601a54601b546145a7565b6145a7565b61454a565b90506000613758828461454a565b9050806019600082825461376c9190615338565b90915550503360009081526024602052604081208054839290613790908490615338565b909155505050505050506000602755565b60006027546000146137c55760405162461bcd60e51b8152600401610ca590615051565b60016027819055601e54610100900460ff161515146137f65760405162461bcd60e51b8152600401610ca590615209565b600061380a346112016103e56103e86143ba565b9050600d60009054906101000a90046001600160a01b03166001600160a01b031663d0e30db0826040518263ffffffff1660e01b81526004016000604051808303818588803b15801561385c57600080fd5b505af1158015613870573d6000803e3d6000fd5b505050505061388a3361297a3461120160036103e86143ba565b613893336147b5565b1515600114156138be5760065485146138be5760405162461bcd60e51b8152600401610ca5906152b0565b600a546040516370a0823160e01b81526000916001600160a01b0316906370a08231906138ef903390600401614ff1565b60206040518083038186803b15801561390757600080fd5b505afa15801561391b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061393f9190614e1a565b905047801580159061395957506702c68af0bb1400003410155b801561396e57506801158e460913d000008210155b1561397b5761397b6149f5565b600d546001600160a01b039081166000908152601f6020526040808220600f54909316825290206013543411156139c45760405162461bcd60e51b8152600401610ca5906150fd565b6000613a1283600101546139e1670de0b6b3a76400006019614291565b84600101546139f9670de0b6b3a76400006019614291565b613a0b8b6112016103e76103e86143ba565b6000613444565b60018401549198509150613a2c90611201603260646143ba565b871115613a4b5760405162461bcd60e51b8152600401610ca590615284565b613a5c3461120160016103e86143ba565b601b6000828254613a6d9190615338565b909155505087871015613a925760405162461bcd60e51b8152600401610ca5906151d5565b600f54613aa9906001600160a01b03168a89614325565b613ab16140d6565b600f54600d546025546001600160a01b03928316929091169033906000805160206154c4833981519152903490613aef908d906112019060646143ba565b604051613afd92919061532a565b60405180910390a450506000602755505050509392505050565b6008546001600160a01b03163314613b2e57600080fd5b602555565b3360009081526001602090815260408083206001600160a01b0386168452909152812054613b6190836145a7565b3360008181526001602090815260408083206001600160a01b038916808552908352928190208590555193845290926000805160206155048339815191529101610c31565b6008546001600160a01b03163314613bbd57600080fd5b601080546001600160a01b0319166001600160a01b0392909216919091179055565b601e5460ff1615613c265760405162461bcd60e51b815260206004820152601160248201527043616e206f6e6c7920757365206f6e636560781b6044820152606401610ca5565b600f80546001600160a01b038088166001600160a01b03199283168117909355600c8054888316908416811790915560108054841690911790556006849055600980548683169084161790556011805491871691909216179055604080516318160ddd60e01b81529051613cfe92916318160ddd916004808301926020929190829003018186803b158015613cba57600080fd5b505afa158015613cce573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613cf29190614e1a565b611201600160146143ba565b6014555050505050565b6000806000613d1786896143ba565b90506000613d25888761454a565b90506000613d3389836143ba565b90506000613d418285614600565b9050613d5581670de0b6b3a764000061454a565b9050613d618c82614291565b9050613d75670de0b6b3a76400008861454a565b9550613d8181876143ba565b9550613d9581670de0b6b3a76400006143ba565b9450613da1868661454a565b945050505050965096945050505050565b33600090815260246020526040812054831115613e115760405162461bcd60e51b815260206004820152601d60248201527f4e6f7420656e6f756768204d61696e2c206465706f736974206d6f72650000006044820152606401610ca5565b60275415613e315760405162461bcd60e51b8152600401610ca590615051565b6001602755600d546001600160a01b039081166000908152601f6020526040808220600f5490931682529020601354851115613e7f5760405162461bcd60e51b8152600401610ca5906150fd565b6000613e9c83600101546139e1670de0b6b3a76400006019614291565b60018401549195509150613eb690611201603260646143ba565b841115613ed55760405162461bcd60e51b8152600401610ca590615284565b84841015613ef55760405162461bcd60e51b8152600401610ca5906151d5565b3360009081526024602052604081208054889290613f14908490615383565b925050819055508560196000828254613f2d9190615383565b90915550503360009081526023602052604081208054869290613f51908490615338565b925050819055508360186000828254613f6a9190615338565b90915550613f8190508661120160016103e86143ba565b601b6000828254613f929190615338565b90915550613fa090506140d6565b600f54600d546040516001600160a01b03928316929091169033906000805160206154a483398151915290613fd8908b908a9061532a565b60405180910390a4600a546040516370a0823160e01b81526000916001600160a01b0316906370a0823190614011903390600401614ff1565b60206040518083038186803b15801561402957600080fd5b505afa15801561403d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906140619190614e1a565b905060004711801561407b57506702c68af0bb1400008710155b801561409057506801158e460913d000008110155b156140c75760006140a24760086143ba565b90506140ae33826147dc565b80601d60008282546140c09190615338565b9091555050505b50506000602755505092915050565b601854600f546040516370a0823160e01b81526001600160a01b03909116906370a0823190614109903090600401614ff1565b60206040518083038186803b15801561412157600080fd5b505afa158015614135573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906141599190614e1a565b6141639190615383565b600f546001600160a01b03166000908152601f6020526040812060010191909155601b54601a546019546141979190615338565b6141a19190615338565b600d546040516370a0823160e01b815291925082916001600160a01b03909116906370a08231906141d6903090600401614ff1565b60206040518083038186803b1580156141ee57600080fd5b505afa158015614202573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906142269190614e1a565b6142309190615383565b600d546001600160a01b03166000908152601f602052604090206001015550565b600061425c82610b3c565b1561426957506000919050565b813f60008051602061548483398151915281158015906142895750808214155b949350505050565b60008061429e8385615364565b90508315806142b55750826142b38583615350565b145b6142d15760405162461bcd60e51b8152600401610ca590615232565b60006142e5826706f05b59d3b20000615338565b9050818110156143075760405162461bcd60e51b8152600401610ca590615232565b600061431b670de0b6b3a764000083615350565b9695505050505050565b60405163a9059cbb60e01b81526000906001600160a01b0385169063a9059cbb906143569086908690600401615005565b602060405180830381600087803b15801561437057600080fd5b505af1158015614384573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906143a89190614de4565b9050806143b457600080fd5b50505050565b6000816143f85760405162461bcd60e51b815260206004820152600c60248201526b4552525f4449565f5a45524f60a01b6044820152606401610ca5565b600061440c84670de0b6b3a7640000615364565b905083158061442b57506144208482615350565b670de0b6b3a7640000145b6144475760405162461bcd60e51b8152600401610ca590615127565b6000614454600285615350565b61445e9083615338565b9050818110156144805760405162461bcd60e51b8152600401610ca590615127565b600061431b8583615350565b6001600160a01b0383166000908152602081905260409020548111156144b157600080fd5b6001600160a01b0383166000908152602081905260409020546144d4908261454a565b6001600160a01b03808516600090815260208190526040808220939093559084168152205461450390826145a7565b6001600160a01b038381166000818152602081815260409182902094909455518481529092918616916000805160206154e4833981519152910160405180910390a3505050565b60008060006145598585614a28565b91509150801561459f5760405162461bcd60e51b81526020600482015260116024820152704552525f5355425f554e444552464c4f5760781b6044820152606401610ca5565b509392505050565b6000806145b48385615338565b9050838110156145f95760405162461bcd60e51b815260206004820152601060248201526f4552525f4144445f4f564552464c4f5760801b6044820152606401610ca5565b9392505050565b6000600183101561464b5760405162461bcd60e51b81526020600482015260156024820152744552525f42504f575f424153455f544f4f5f4c4f5760581b6044820152606401610ca5565b671bc16d674ec7ffff83111561469c5760405162461bcd60e51b815260206004820152601660248201527508aa4a4be84a09eaebe8482a68abea89e9ebe90928e960531b6044820152606401610ca5565b60006146a783614a5f565b905060006146b5848361454a565b905060006146cb866146c685614a7c565b614a90565b9050816146dc579250610c3d915050565b60006146ed87846305f5e100614b03565b90506146f98282614291565b979650505050505050565b6040516323b872dd60e01b81526001600160a01b03838116600483015230602483015260448201839052600091908516906323b872dd90606401614356565b3060009081526020819052604090205461475d90826145a7565b3060009081526020819052604090205560025461477a90826145a7565b60025560405181815230906000906000805160206154e48339815191529060200160405180910390a350565b6147b130838361448c565b5050565b6000813f600080516020615484833981519152818114801590614289575050151592915050565b604080516000808252602082019092526001600160a01b0384169083906040516148069190614fd5565b60006040518083038185875af1925050503d8060008114614843576040519150601f19603f3d011682016040523d82523d6000602084013e614848565b606091505b50509050806148a55760405162461bcd60e51b815260206004820152602360248201527f5472616e7366657248656c7065723a204554485f5452414e534645525f46414960448201526213115160ea1b6064820152608401610ca5565b505050565b6608e1bc9bf04000601a5411156148e157600d54601154601a546148db926001600160a01b03908116921690614325565b6000601a555b565b661aa535d3d0c000601b5411156148e157600d54601b54604051632e1a7d4d60e01b81526001600160a01b0390921691632e1a7d4d916149299160040190815260200190565b600060405180830381600087803b15801561494357600080fd5b505af1158015614957573d6000803e3d6000fd5b5050600954601b546001600160a01b03909116925063c172715c915061498390611201606360646143ba565b600b5460405160e084901b6001600160e01b03191681526103e960048201526001600160a01b039091166024820152600160448201526064016000604051808303818588803b1580156149d557600080fd5b505af11580156149e9573d6000803e3d6000fd5b50506000601b55505050565b6000614a02600847615350565b9050614a0e33826147dc565b80601d6000828254614a209190615338565b909155505050565b600080828410614a4757614a3c8385615383565b600091509150614a58565b614a518484615383565b6001915091505b9250929050565b6000614a6a82614a7c565b610c3d90670de0b6b3a7640000615364565b6000610c3d670de0b6b3a764000083615350565b600080614a9e60028461541c565b614ab057670de0b6b3a7640000614ab2565b835b9050614abf600284615350565b92505b82156145f957614ad28485614291565b9350614adf60028461541c565b15614af157614aee8185614291565b90505b614afc600284615350565b9250614ac2565b6000828180614b1a87670de0b6b3a7640000614a28565b9092509050670de0b6b3a764000080600060015b888410614be4576000614b4982670de0b6b3a7640000615364565b9050600080614b698a614b6485670de0b6b3a764000061454a565b614a28565b91509150614b7b87611201848c614291565b9650614b8787846143ba565b965086614b9657505050614be4565b8715614ba0579315935b8015614baa579315935b8415614bc157614bba868861454a565b9550614bce565b614bcb86886145a7565b95505b5050508080614bdc90615401565b915050614b2e565b50909998505050505050505050565b80356001600160a01b0381168114614c0a57600080fd5b919050565b600060208284031215614c2157600080fd5b6145f982614bf3565b60008060408385031215614c3d57600080fd5b614c4683614bf3565b9150614c5460208401614bf3565b90509250929050565b600080600060608486031215614c7257600080fd5b614c7b84614bf3565b9250614c8960208501614bf3565b9150614c9760408501614bf3565b90509250925092565b600080600080600060a08688031215614cb857600080fd5b614cc186614bf3565b9450614ccf60208701614bf3565b9350614cdd60408701614bf3565b9250614ceb60608701614bf3565b949793965091946080013592915050565b60008060008060808587031215614d1257600080fd5b614d1b85614bf3565b9350614d2960208601614bf3565b9250614d3760408601614bf3565b9396929550929360600135925050565b600080600060608486031215614d5c57600080fd5b614d6584614bf3565b9250614d7360208501614bf3565b9150604084013590509250925092565b60008060408385031215614d9657600080fd5b614d9f83614bf3565b91506020830135614daf81615472565b809150509250929050565b60008060408385031215614dcd57600080fd5b614dd683614bf3565b946020939093013593505050565b600060208284031215614df657600080fd5b81516145f981615472565b600060208284031215614e1357600080fd5b5035919050565b600060208284031215614e2c57600080fd5b5051919050565b600080600060608486031215614e4857600080fd5b83359250614d7360208501614bf3565b60008060008060808587031215614e6e57600080fd5b84359350614e7e60208601614bf3565b93969395505050506040820135916060013590565b600080600060408486031215614ea857600080fd5b8335925060208401356001600160401b0380821115614ec657600080fd5b818601915086601f830112614eda57600080fd5b813581811115614ee957600080fd5b8760208260051b8501011115614efe57600080fd5b6020830194508093505050509250925092565b60008060408385031215614f2457600080fd5b50508035926020909101359150565b60008060408385031215614f4657600080fd5b505080516020909101519092909150565b600080600080600060a08688031215614f6f57600080fd5b505083359560208501359550604085013594606081013594506080013592509050565b60008060008060008060c08789031215614fab57600080fd5b505084359660208601359650604086013595606081013595506080810135945060a0013592509050565b60008251614fe781846020870161539a565b9190910192915050565b6001600160a01b0391909116815260200190565b6001600160a01b03929092168252602082015260400190565b602081526000825180602084015261503d81604085016020870161539a565b601f01601f19169190910160400192915050565b6020808252600a90820152694e6f207265656e74727960b01b604082015260600190565b6020808252601a90820152792cb7ba903237903737ba103430bb32903832b936b4b9b9b4b7b760311b604082015260600190565b60208082526010908201526f2737ba1032b737bab3b4102a37b5b2b760811b604082015260600190565b60208082526010908201526f2737ba1032b737bab3b4103a37b5b2b760811b604082015260600190565b60208082526010908201526f4552525f4255595f494e5f524154494f60801b604082015260600190565b60208082526010908201526f11549497d1125597d25395115493905360821b604082015260600190565b602080825260479082015260008051602061552483398151915260408201527f72656d6f7665206c697175696469747920756e74696c206166746572206c6f6360608201526635903a34b6b29760c91b608082015260a00190565b6020808252600f908201526e2737ba1032b737bab3b41026b0b4b760891b604082015260600190565b6020808252601a9082015279135a5b9a5b5d5b48185b5bdd5b9d081bdd5d081b9bdd081b595d60321b604082015260600190565b6020808252600f908201526e14ddd85c081b9bdd081bdc195b9959608a1b604082015260600190565b60208082526010908201526f4552525f4d554c5f4f564552464c4f5760801b604082015260600190565b6020808252600e908201526d4552525f53454c4c5f524154494f60901b604082015260600190565b6020808252601290820152714f766572204d41585f4f55545f524154494f60701b604082015260600190565b60208082526033908201527f436f6e74726163747320617265206e6f7420616c6c6f77656420746f20696e7460408201527206572616374207769746820746865205377617606c1b606082015260800190565b6020808252600d908201526c139bdd081cdd5c1c1bdc9d1959609a1b604082015260600190565b918252602082015260400190565b6000821982111561534b5761534b615430565b500190565b60008261535f5761535f615446565b500490565b600081600019048311821515161561537e5761537e615430565b500290565b60008282101561539557615395615430565b500390565b60005b838110156153b557818101518382015260200161539d565b838111156143b45750506000910152565b600181811c908216806153da57607f821691505b602082108114156153fb57634e487b7160e01b600052602260045260246000fd5b50919050565b600060001982141561541557615415615430565b5060010190565b60008261542b5761542b615446565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603260045260246000fd5b801515811461548057600080fd5b5056fec5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470c5f954edb6f50c3415e43c4c343ed2fac83243f08807d721c27e2ccb634c36fa908fb5ee8f16c6bc9bc3690973819f32a4d4b10188134543c88706e0e1d43378ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9254c6971756964697479206973206c6f636b65642c20796f752063616e6e6f7420a2646970667358221220e820958d79af7372991cedfecfc73b17b1b4c78e3732ea480863c5515ad2a90b64736f6c63430008070033

Deployed ByteCode Sourcemap

13032:27963:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15007:25;;;;;;;;;;;;;;;;;;;21195::1;;;21183:2;21168:18;15007:25:0;;;;;;;;17170:119;;;;;;;;;;-1:-1:-1;17170:119:0;;;;;:::i;:::-;;:::i;:::-;;;8732:14:1;;8725:22;8707:41;;8695:2;8680:18;17170:119:0;8567:187:1;15142:28:0;;;;;;;;;;;;;;;;14860:37;;;;;;;;;;;;;;;;11418;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;15517:46::-;;;;;;;;;;-1:-1:-1;15517:46:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8952:14:1;;8945:22;8927:41;;8999:2;8984:18;;8977:34;;;;8900:18;15517:46:0;8759:258:1;11786:187:0;;;;;;;;;;-1:-1:-1;11786:187:0;;;;;:::i;:::-;;:::i;16998:160::-;;;;;;;;;;-1:-1:-1;16998:160:0;;;;;:::i;:::-;;:::i;:::-;;40660:332;;;;;;;;;;-1:-1:-1;40660:332:0;;;;;:::i;:::-;;:::i;18417:254::-;;;;;;;;;;-1:-1:-1;18417:254:0;;;;;:::i;:::-;;:::i;21127:372::-;;;;;;;;;;-1:-1:-1;21127:372:0;;;;;:::i;:::-;;:::i;10591:30::-;;;;;;;;;;;;;;;;22537:680;;;;;;;;;;-1:-1:-1;22537:680:0;;;;;:::i;:::-;;:::i;38543:879::-;;;;;;;;;;;;;:::i;13366:114::-;;;;;;;;;;-1:-1:-1;13366:114:0;;;;;:::i;:::-;;:::i;24637:601::-;;;;;;;;;;-1:-1:-1;24637:601:0;;;;;:::i;:::-;;:::i;26186:1393::-;;;;;;;;;;-1:-1:-1;26186:1393:0;;;;;:::i;:::-;;:::i;16377:209::-;;;;;;;;;;-1:-1:-1;16377:209:0;;;;;:::i;:::-;-1:-1:-1;;;;;16486:17:0;16441:7;16486:17;;;:10;:17;;;;;;;;;16530:10;:17;;;;;;;;16377:209;;;;;;;;;:::i;11505:28::-;;;;;;;;;;-1:-1:-1;11505:28:0;;;;;;;;;;;21917:4:1;21905:17;;;21887:36;;21875:2;21860:18;11505:28:0;21745:184:1;14766:29:0;;;;;;;;;;-1:-1:-1;14766:29:0;;;;-1:-1:-1;;;;;14766:29:0;;;;;;;;;;:::i;15212:28::-;;;;;;;;;;;;;;;;18683:198;;;;;;;;;;-1:-1:-1;18683:198:0;;;;;:::i;:::-;;:::i;4953:690::-;;;;;;;;;;-1:-1:-1;4953:690:0;;;;;:::i;:::-;;:::i;14607:25::-;;;;;;;;;;-1:-1:-1;14607:25:0;;;;-1:-1:-1;;;;;14607:25:0;;;40281:367;;;;;;;;;;-1:-1:-1;40281:367:0;;;;;:::i;:::-;;:::i;12244:403::-;;;;;;;;;;-1:-1:-1;12244:403:0;;;;;:::i;:::-;;:::i;18247:158::-;;;;;;;;;;;;;:::i;15832:18::-;;;;;;;;;;;;;;;;11673:105;;;;;;;;;;-1:-1:-1;11673:105:0;;;;;:::i;:::-;-1:-1:-1;;;;;11756:14:0;11729:7;11756:14;;;;;;;;;;;;11673:105;25250:925;;;;;;;;;;-1:-1:-1;25250:925:0;;;;;:::i;:::-;;:::i;19295:282::-;;;;;;;;;;-1:-1:-1;19295:282:0;;;;;:::i;:::-;;:::i;37035:664::-;;;;;;;;;;-1:-1:-1;37035:664:0;;;;;:::i;:::-;;:::i;17800:435::-;;;;;;;;;;-1:-1:-1;17800:435:0;;;;;:::i;:::-;;:::i;11462:36::-;;;;;;;;;;;;;:::i;37711:824::-;;;;;;;;;;-1:-1:-1;37711:824:0;;;;;:::i;:::-;;:::i;15284:31::-;;;;;;;;;;;;;;;;19589:459;;;;;;;;;;;;;:::i;3582:543::-;;;;;;;;;;-1:-1:-1;3582:543:0;;;;;:::i;:::-;;:::i;15107:28::-;;;;;;;;;;;;;;;;24367:262;;;;;;;;;;-1:-1:-1;24367:262:0;;;;;:::i;:::-;;:::i;20060:1056::-;;;;;;;;;;-1:-1:-1;20060:1056:0;;;;;:::i;:::-;;:::i;31892:2806::-;;;;;;;;;;-1:-1:-1;31892:2806:0;;;;;:::i;:::-;;:::i;34711:2308::-;;;;;;;;;;-1:-1:-1;34711:2308:0;;;;;:::i;:::-;;:::i;23225:1130::-;;;;;;;;;;-1:-1:-1;23225:1130:0;;;;;:::i;:::-;;:::i;15247:30::-;;;;;;;;;;;;;;;;4135:810;;;;;;;;;;-1:-1:-1;4135:810:0;;;;;:::i;:::-;;:::i;21515:1014::-;;;;;;;;;;-1:-1:-1;21515:1014:0;;;;;:::i;:::-;;:::i;29753:2127::-;;;;;;:::i;:::-;;:::i;14739:20::-;;;;;;;;;;-1:-1:-1;14739:20:0;;;;-1:-1:-1;;;;;14739:20:0;;;14904:29;;;;;;;;;;;;;;;;14639:64;;;;;;;;;;-1:-1:-1;14639:64:0;;;;-1:-1:-1;;;;;14639:64:0;;;19021:105;;;;;;;;;;-1:-1:-1;19021:105:0;;;;;:::i;:::-;;:::i;11981:255::-;;;;;;;;;;-1:-1:-1;11981:255:0;;;;;:::i;:::-;;:::i;15177:28::-;;;;;;;;;;;;;;;;18893:116;;;;;;;;;;-1:-1:-1;18893:116:0;;;;;:::i;:::-;;:::i;11542:123::-;;;;;;;;;;-1:-1:-1;11542:123:0;;;;;:::i;:::-;-1:-1:-1;;;;;11637:15:0;;;11610:7;11637:15;;;:10;:15;;;;;;;;:20;;;;;;;;;;;;;11542:123;14833:20;;;;;;;;;;-1:-1:-1;14833:20:0;;;;-1:-1:-1;;;;;14833:20:0;;;14940:23;;;;;;;;;;;;;;;;15925:397;;;;;;;;;;-1:-1:-1;15925:397:0;;;;;:::i;:::-;;:::i;19138:149::-;;;;;;;;;;-1:-1:-1;19138:149:0;;;;;:::i;:::-;-1:-1:-1;;;;;19256:15:0;19214:7;19256:15;;;:8;:15;;;;;:23;;;;19138:149;5651:853;;;;;;;;;;-1:-1:-1;5651:853:0;;;;;:::i;:::-;;:::i;15857:23::-;;;;;;;;;;;;;;;;15385:24;;;;;;;;;;-1:-1:-1;15385:24:0;;;;;;;;;;;27781:1960;;;;;;;;;;-1:-1:-1;27781:1960:0;;;;;:::i;:::-;;:::i;17472:316::-;;;;;;;;;;;;;:::i;17170:119::-;-1:-1:-1;;;;;17257:24:0;17234:4;17257:24;;;:17;:24;;;;;;;;;17170:119::o;11418:37::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;11786:187::-;11875:10;11847:4;11864:22;;;:10;:22;;;;;;;;-1:-1:-1;;;;;11864:27:0;;;;;;;;;;:33;;;11913:30;11847:4;;11864:27;;-1:-1:-1;;;;;;;;;;;11913:30:0;;;11894:3;21195:25:1;;21183:2;21168:18;;21049:177;11913:30:0;;;;;;;;-1:-1:-1;11961:4:0;11786:187;;;;;:::o;16998:160::-;17097:7;;-1:-1:-1;;;;;17097:7:0;17083:10;:21;17075:30;;;;;;-1:-1:-1;;;;;17116:24:0;;;;;;;;:17;:24;;;;;:34;;-1:-1:-1;;17116:34:0;;;;;;;;;;16998:160::o;40660:332::-;40763:6;;:11;40755:34;;;;-1:-1:-1;;;40755:34:0;;;;;;;:::i;:::-;;;;;;;;;40809:1;40800:6;:10;40840;40829:22;;;;:10;:22;;;;;;:32;-1:-1:-1;40829:32:0;40821:61;;;;-1:-1:-1;;;40821:61:0;;;;;;;:::i;:::-;40904:10;40893:22;;;;:10;:22;;;;;:32;;40919:6;;40893:22;:32;;40919:6;;40893:32;:::i;:::-;;;;-1:-1:-1;;;;;;;40936:17:0;;;;;;:10;:17;;;;;:27;;40957:6;;40936:17;:27;;40957:6;;40936:27;:::i;:::-;;;;-1:-1:-1;;40983:1:0;40974:6;:10;-1:-1:-1;;40660:332:0:o;18417:254::-;18543:10;;-1:-1:-1;;;;;18543:10:0;18529;:24;:42;;;;-1:-1:-1;18567:4:0;;-1:-1:-1;;;;;18557:14:0;;;18567:4;;18557:14;;18529:42;:62;;;;-1:-1:-1;18586:5:0;;-1:-1:-1;;;;;18576:15:0;;;18586:5;;18576:15;;18529:62;18521:71;;;;;;18611:18;18622:6;18611:10;:18::i;:::-;:26;;18633:4;18611:26;18603:35;;;;;;18649:5;:14;;-1:-1:-1;;;;;;18649:14:0;-1:-1:-1;;;;;18649:14:0;;;;;;;;;;18417:254::o;21127:372::-;-1:-1:-1;;;;;21294:26:0;;;21223:17;21294:26;;;:8;:26;;;;;;21358:27;;;;;;;21417:16;;;;21223:17;;21294:26;21403:88;;21435:14;21440:4;21446:2;21435:4;:14::i;:::-;21451:9;:17;;;21470:14;21475:4;21481:2;21470:4;:14::i;:::-;21486:4;21403:13;:88::i;:::-;21396:95;21127:372;-1:-1:-1;;;;;21127:372:0:o;22537:680::-;22628:4;;-1:-1:-1;;;;;22619:13:0;;;22628:4;;22619:13;;:31;;-1:-1:-1;22645:5:0;;-1:-1:-1;;;;;22636:14:0;;;22645:5;;22636:14;22619:31;22611:57;;;;-1:-1:-1;;;22611:57:0;;;;;;;:::i;:::-;22687:6;;:11;22679:34;;;;-1:-1:-1;;;22679:34:0;;;;;;;:::i;:::-;22733:1;22724:6;:10;22767:5;;-1:-1:-1;;;;;22758:14:0;;;22767:5;;22758:14;22755:434;;;22803:10;22792:22;;;;:10;:22;;;;;;:29;-1:-1:-1;22792:29:0;22784:58;;;;-1:-1:-1;;;22784:58:0;;;;;;;:::i;:::-;22870:3;22853:13;;:20;;;;;;;:::i;:::-;;;;-1:-1:-1;;22895:10:0;22884:22;;;;:10;:22;;;;;:29;;22910:3;;22884:22;:29;;22910:3;;22884:29;:::i;:::-;;;;-1:-1:-1;;22940:5:0;;22924:39;;-1:-1:-1;;;;;22940:5:0;22947:10;22959:3;22924:15;:39::i;:::-;22755:434;;;23019:10;23008:22;;;;:10;:22;;;;;;:29;-1:-1:-1;23008:29:0;23000:57;;;;-1:-1:-1;;;23000:57:0;;;;;;;:::i;:::-;23085:3;23068:13;;:20;;;;;;;:::i;:::-;;;;-1:-1:-1;;23110:10:0;23099:22;;;;:10;:22;;;;;:29;;23125:3;;23099:22;:29;;23125:3;;23099:29;:::i;:::-;;;;-1:-1:-1;;23155:4:0;;23139:38;;-1:-1:-1;;;;;23155:4:0;23161:10;23173:3;23139:15;:38::i;:::-;-1:-1:-1;;23208:1:0;23199:6;:10;22537:680::o;38543:879::-;38633:6;;:11;38625:34;;;;-1:-1:-1;;;38625:34:0;;;;;;;:::i;:::-;38679:1;38670:6;:10;38713;;-1:-1:-1;;;;;38713:10:0;38699;:24;;:77;;-1:-1:-1;38741:11:0;;-1:-1:-1;;;;;38741:11:0;38727:10;:25;:49;;;;-1:-1:-1;38756:6:0;;-1:-1:-1;;;;;38756:6:0;:20;;38727:49;38691:99;;;;-1:-1:-1;;;38691:99:0;;10675:2:1;38691:99:0;;;10657:21:1;10714:1;10694:18;;;10687:29;-1:-1:-1;;;10732:18:1;;;10725:39;10781:18;;38691:99:0;10473:332:1;38691:99:0;38801:6;:4;:6::i;:::-;38853:10;;-1:-1:-1;;;;;38853:10:0;;;38818:22;38843:21;;;:9;:21;;;;;;;38882:4;;38896:6;;38875:34;;-1:-1:-1;;;38875:34:0;;38843:21;;38882:4;;;;38875:20;;:34;;38896:6;;;;;-1:-1:-1;;;38904:4:0;38875:34;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;38927:5:0;;38942:6;;38920:35;;-1:-1:-1;;;38920:35:0;;-1:-1:-1;;;;;38927:5:0;;;;38920:21;;:35;;38942:6;;;-1:-1:-1;;;38950:4:0;38920:35;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;38989:10:0;;-1:-1:-1;;;;;38989:10:0;38966:11;38980:20;;;;;;;;;;;;;;;;39011:27;38980:20;;39011:27;:::i;:::-;;;;-1:-1:-1;;39062:11:0;;39112:4;;-1:-1:-1;;;;;39112:4:0;39049:10;39103:14;;;:8;:14;;;;;39112:4;39103:22;;39098:43;;39127:13;39132:3;39062:11;39127:4;:13::i;:::-;39098:4;:43::i;:::-;39181:5;;-1:-1:-1;;;;;39181:5:0;39152:12;39172:15;;;:8;:15;;;;;39181:5;39172:23;;39084:57;;-1:-1:-1;39152:12:0;39167:44;;39197:13;39202:3;39207:2;39197:4;:13::i;39167:44::-;39152:59;;39237:3;39222:11;;:18;;;;;;;:::i;:::-;;;;-1:-1:-1;;39251:21:0;;-1:-1:-1;;39251:21:0;;;39283:15;:22;;39302:3;;39283:15;39267:5;;39283:22;;39302:3;;39283:22;:::i;:::-;;;;-1:-1:-1;;39328:6:0;;39347:5;;39365:10;;39316:60;;-1:-1:-1;;;39316:60:0;;-1:-1:-1;;;;;39347:5:0;;;39316:60;;;8384:34:1;8434:18;;;8427:34;;;8477:18;;;8470:34;;;39365:10:0;;;8520:18:1;;;8513:43;39328:6:0;;;39316:30;;8318:19:1;;39316:60:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39387:6;:4;:6::i;:::-;-1:-1:-1;;39413:1:0;39404:6;:10;-1:-1:-1;;;38543:879:0:o;13366:114::-;-1:-1:-1;;;;;13449:14:0;13420:9;13449:14;;;:9;:14;;;;;:22;;;;13366:114::o;24637:601::-;24715:4;24740:10;-1:-1:-1;;;;;24740:17:0;;;;:55;;-1:-1:-1;;;;;;24768:15:0;;;;;;:10;:15;;;;;;;;24784:10;24768:27;;;;;;;;24761:34;;;24740:55;24732:64;;;;;;24815:23;24827:10;24815:11;:23::i;:::-;:32;24807:116;;;;-1:-1:-1;;;24807:116:0;;;;;;;:::i;:::-;24934:20;24940:3;24945;24950;24934:5;:20::i;:::-;24969:10;-1:-1:-1;;;;;24969:17:0;;;;;;:69;;-1:-1:-1;;;;;;24990:15:0;;;;;;:10;:15;;;;;;;;25006:10;24990:27;;;;;;;;-1:-1:-1;;24990:48:0;;24969:69;24965:244;;;-1:-1:-1;;;;;25090:15:0;;;;;;:10;:15;;;;;;;;25106:10;25090:27;;;;;;;;25085:38;;25119:3;25085:4;:38::i;:::-;-1:-1:-1;;;;;25055:15:0;;;;;;;:10;:15;;;;;;;;25071:10;25055:27;;;;;;;;;;:68;;;25143:54;21195:25:1;;;25143:54:0;;;;25071:10;;-1:-1:-1;;;;;;;;;;;25143:54:0;21168:18:1;25143:54:0;;;;;;;24965:244;-1:-1:-1;25226:4:0;24637:601;;;;;:::o;26186:1393::-;26321:23;26333:10;26321:11;:23::i;:::-;:32;26313:116;;;;-1:-1:-1;;;26313:116:0;;;;;;;:::i;:::-;26448:6;;:11;26440:34;;;;-1:-1:-1;;;26440:34:0;;;;;;;:::i;:::-;26494:1;26485:6;:10;26506:6;:4;:6::i;:::-;26543:11;;26523:17;26581:29;26586:12;26543:11;26581:4;:29::i;:::-;26632:10;26623:8;:20;;;;;;;;;;:36;;26565:45;;-1:-1:-1;26647:12:0;;26623:20;;:8;:36;;26647:12;;26623:36;:::i;:::-;;;;;;;;26685:12;26670:11;;:27;;;;;;;:::i;:::-;;;;-1:-1:-1;;26713:46:0;;21195:25:1;;;26742:1:0;;26722:10;;-1:-1:-1;;;;;;;;;;;26713:46:0;21183:2:1;21168:18;26713:46:0;;;;;;;26785:9;26780:409;26804:7;:14;26800:18;;26780:409;;;26840:9;26852:7;26860:1;26852:10;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;26852:10:0;26891:11;;;:8;:11;;;;;;26852:10;26891:19;;26852:10;;-1:-1:-1;26891:19:0;26950:16;26955:5;26891:19;26950:4;:16::i;:::-;26925:41;;27007:13;;27021:1;27007:16;;;;;;;:::i;:::-;;;;;;;26989:14;:34;;26981:73;;;;-1:-1:-1;;;26981:73:0;;;;;;;:::i;:::-;27095:1;-1:-1:-1;;;;;27074:42:0;27083:10;-1:-1:-1;;;;;27074:42:0;;27098:14;27114:1;27074:42;;;;;;;:::i;:::-;;;;;;;;27131:46;27147:1;27150:10;27162:14;27131:15;:46::i;:::-;26825:364;;;26820:3;;;;;:::i;:::-;;;;26780:409;;;-1:-1:-1;27246:4:0;;-1:-1:-1;;;;;27246:4:0;27209:11;27235:16;;;:10;:16;;;;;;27223:29;;27228:5;;27223:4;:29::i;:::-;27274:4;;-1:-1:-1;;;;;27274:4:0;27263:16;;;;:10;:16;;;;;:23;;27209:43;;-1:-1:-1;27209:43:0;;27263:16;;;:23;;27209:43;;27263:23;:::i;:::-;;;;-1:-1:-1;;27308:10:0;27297:22;;;;:10;:22;;;;;:29;;27323:3;;27297:22;:29;;27323:3;;27297:29;:::i;:::-;;;;-1:-1:-1;27337:6:0;;-1:-1:-1;27337:4:0;:6::i;:::-;27357:5;;-1:-1:-1;;;;;27357:5:0;:19;27354:197;;27422:5;;27415:38;;-1:-1:-1;;;27415:38:0;;27388:12;;27403:51;;27408:5;;-1:-1:-1;;;;;27422:5:0;;27415:23;;:38;;27447:4;;27415:38;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;27403:51::-;27388:66;-1:-1:-1;27468:8:0;;27465:75;;27504:5;;27488:40;;-1:-1:-1;;;;;27504:5:0;27511:10;27523:4;27488:15;:40::i;:::-;27377:174;27354:197;-1:-1:-1;;27570:1:0;27561:6;:10;-1:-1:-1;;;;26186:1393:0:o;18683:198::-;18790:7;;-1:-1:-1;;;;;18790:7:0;18776:10;:21;18768:30;;;;;;18809:8;:17;;-1:-1:-1;;;;;18809:17:0;;;-1:-1:-1;;;;;;18809:17:0;;;;;;;18837:4;:12;;;;;;;;;;;;;;;18860:6;:13;;;;;;;;;;;18683:198::o;4953:690::-;5188:22;5228:19;5250:35;5255:13;5270:14;5250:4;:35::i;:::-;5228:57;;5296:18;5317:15;5322:6;5330:1;5317:4;:15::i;:::-;5296:36;;5356:31;5361:13;5376:10;5356:4;:31::i;:::-;5343:44;;5398:9;5410:54;5415:14;5431:32;5436:14;5452:10;5431:4;:32::i;:::-;5410:4;:54::i;:::-;5398:66;;5475:11;5489:20;5494:1;5497:11;5489:4;:20::i;:::-;5475:34;;5520:11;5534:15;5539:4;5545:3;5534:4;:15::i;:::-;5520:29;;5577:26;5582:15;5599:3;5577:4;:26::i;:::-;5560:43;4953:690;-1:-1:-1;;;;;;;;;;;4953:690:0:o;40281:367::-;40397:10;40386:22;;;;:10;:22;;;;;;:32;-1:-1:-1;40386:32:0;40378:61;;;;-1:-1:-1;;;40378:61:0;;;;;;;:::i;:::-;40450:11;40464:29;40469:6;40477:15;40482:3;40487:4;40477;:15::i;40464:29::-;40515:10;40504:22;;;;:10;:22;;;;;:32;;40450:43;;-1:-1:-1;40530:6:0;;40504:22;;;:32;;40530:6;;40504:32;:::i;:::-;;;;-1:-1:-1;;;;;;;40547:17:0;;;;;;:10;:17;;;;;:24;;40568:3;;40547:17;:24;;40568:3;;40547:24;:::i;:::-;;;;-1:-1:-1;40602:17:0;;-1:-1:-1;40607:6:0;40615:3;40602:4;:17::i;:::-;40593:4;;-1:-1:-1;;;;;40593:4:0;40582:16;;;;:10;:16;;;;;:37;;:16;;;:37;;;;;:::i;:::-;;;;-1:-1:-1;;40639:1:0;40630:6;:10;-1:-1:-1;;;40281:367:0:o;12244:403::-;12361:10;12314:4;12350:22;;;:10;:22;;;;;;;;-1:-1:-1;;;;;12350:27:0;;;;;;;;;;12392:14;;;12388:160;;;12434:10;12453:1;12423:22;;;:10;:22;;;;;;;;-1:-1:-1;;;;;12423:27:0;;;;;;;;;:31;12388:160;;;12517:19;12522:8;12532:3;12517:4;:19::i;:::-;12498:10;12487:22;;;;:10;:22;;;;;;;;-1:-1:-1;;;;;12487:27:0;;;;;;;;;:49;12388:160;12572:10;12589:22;;;;:10;:22;;;;;;;;-1:-1:-1;;;;;12563:54:0;;12589:27;;;;;;;;;;;12563:54;;21195:25:1;;;12563:54:0;;12572:10;-1:-1:-1;;;;;;;;;;;12563:54:0;21168:18:1;12563:54:0;;;;;;;-1:-1:-1;12635:4:0;;12244:403;-1:-1:-1;;;12244:403:0:o;18247:158::-;18364:10;;-1:-1:-1;;;;;18364:10:0;18350;:24;18342:33;;;;;;18386:4;:11;;-1:-1:-1;;18386:11:0;;;;;18247:158::o;25250:925::-;25372:6;;:11;25364:34;;;;-1:-1:-1;;;25364:34:0;;;;;;;:::i;:::-;25418:1;25409:6;:10;25450:11;;25430:17;25488:30;25493:13;25450:11;25488:4;:30::i;:::-;25472:46;;25542:23;25554:10;25542:11;:23::i;:::-;:31;;25569:4;25542:31;25539:94;;;25604:13;25585:15;;:32;;;;;;;:::i;:::-;;;;-1:-1:-1;;25539:94:0;25658:9;25653:403;25677:7;:14;25673:18;;25653:403;;;25713:9;25725:7;25733:1;25725:10;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;25725:10:0;25764:11;;;:8;:11;;;;;;25725:10;25764:19;;25725:10;;-1:-1:-1;25764:19:0;25836:16;25841:5;25764:19;25836:4;:16::i;:::-;25812:40;;25893:12;;25906:1;25893:15;;;;;;;:::i;:::-;;;;;;;25876:13;:32;;25868:41;;;;;;25950:1;-1:-1:-1;;;;;25929:41:0;25938:10;-1:-1:-1;;;;;25929:41:0;;25953:13;25968:1;25929:41;;;;;;;:::i;:::-;;;;;;;;25985:45;26001:1;26004:10;26016:13;25985:15;:45::i;:::-;25698:358;;;25693:3;;;;;:::i;:::-;;;;25653:403;;;;26066:20;26072:13;26066:5;:20::i;:::-;26097:32;26103:10;26115:13;26097:5;:32::i;:::-;26140:6;:4;:6::i;19295:282::-;19410:11;;-1:-1:-1;;;;;19410:11:0;19396:10;:25;19388:34;;;;;;19433:11;:21;;-1:-1:-1;;;;;19433:21:0;;;-1:-1:-1;;;;;;19433:21:0;;;;;;;19465:7;:13;;;;;;;;;;;;;;;19489:10;:15;;;;;;;;;;;19295:282::o;37035:664::-;37135:4;;-1:-1:-1;;;;;37135:4:0;;;37112:11;37126:14;;;:8;:14;;;;;37135:4;37126:22;;37181:10;;37126:22;;37181:10;37167;:24;:40;;;;;37202:5;37195:3;:12;;37167:40;37159:79;;;;-1:-1:-1;;;37159:79:0;;;;;;;:::i;:::-;37268:6;37262:3;:12;37259:170;;;37346:3;37338:4;:11;;:27;;;;;37361:4;37353;:12;;37338:27;:42;;;;;37377:3;37369:4;:11;;37338:42;:55;;;;-1:-1:-1;37384:9:0;;;37338:55;37330:86;;;;-1:-1:-1;;;37330:86:0;;20553:2:1;37330:86:0;;;20535:21:1;20592:2;20572:18;;;20565:30;-1:-1:-1;;;20611:18:1;;;20604:48;20669:18;;37330:86:0;20351:342:1;37330:86:0;37459:6;37452:3;:13;37449:191;;37537:3;37529:4;:11;;:27;;;;;37552:4;37544;:12;;37529:27;:42;;;;;37568:3;37560:4;:11;;37529:42;:55;;;;-1:-1:-1;37575:9:0;;;37529:55;37521:106;;;;-1:-1:-1;;;37521:106:0;;15157:2:1;37521:106:0;;;15139:21:1;15196:2;15176:18;;;15169:30;15235:34;15215:18;;;15208:62;-1:-1:-1;;;15286:18:1;;;15279:36;15332:19;;37521:106:0;14955:402:1;37521:106:0;-1:-1:-1;37660:3:0;:10;37681:3;:10;37035:664::o;17800:435::-;17901:10;;-1:-1:-1;;;;;17901:10:0;17887;:24;17879:63;;;;-1:-1:-1;;;17879:63:0;;;;;;;:::i;:::-;17974:5;;17967:27;;;-1:-1:-1;;;17967:27:0;;;;17953:11;;-1:-1:-1;;;;;17974:5:0;;17967:25;;:27;;;;;;;;;;;;;;17974:5;17967:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;17953:41;-1:-1:-1;18025:8:0;18029:4;17953:41;18025:8;:::i;:::-;18014:7;:19;;:37;;;;;18048:3;18037:7;:14;;18014:37;18005:101;;;;-1:-1:-1;;;18005:101:0;;14048:2:1;18005:101:0;;;14030:21:1;14087:2;14067:18;;;14060:30;14126:34;14106:18;;;14099:62;-1:-1:-1;;;14177:18:1;;;14170:48;14235:19;;18005:101:0;13846:414:1;18005:101:0;18137:4;18127:6;:14;;18118:41;;;;-1:-1:-1;;;18118:41:0;;12191:2:1;18118:41:0;;;12173:21:1;12230:2;12210:18;;;12203:30;-1:-1:-1;;;12249:18:1;;;12242:43;12302:18;;18118:41:0;11989:337:1;18118:41:0;-1:-1:-1;18170:14:0;:24;;;;18205:13;:22;17800:435::o;11462:36::-;;;;;;;:::i;37711:824::-;37840:6;;:11;37832:34;;;;-1:-1:-1;;;37832:34:0;;;;;;;:::i;:::-;37886:1;37877:6;:10;37906:17;37918:4;37906:11;:17::i;:::-;:25;;37927:4;37906:25;37898:58;;;;-1:-1:-1;;;37898:58:0;;15919:2:1;37898:58:0;;;15901:21:1;15958:2;15938:18;;;15931:30;-1:-1:-1;;;15977:18:1;;;15970:50;16037:18;;37898:58:0;15717:344:1;37898:58:0;-1:-1:-1;;;;;37992:15:0;;;37967:22;37992:15;;;:9;:15;;;;;;;38042:11;:17;;;;;;38087:11;;37992:15;;38042:17;;38087:11;38073:10;:25;38070:437;;;38128:24;:15;38146:6;38128:24;:::i;:::-;38110:15;;;:42;38070:437;;;38244:4;:15;;;38225;:34;;:62;;;;-1:-1:-1;38277:10:0;;-1:-1:-1;;;;;38277:10:0;38263;:24;38225:62;38217:147;;;;-1:-1:-1;;;38217:147:0;;11710:2:1;38217:147:0;;;11692:21:1;11749:2;11729:18;;;11722:30;-1:-1:-1;;;;;;;;;;;11768:18:1;;;11761:62;11859:34;11839:18;;;11832:62;-1:-1:-1;;;11910:19:1;;;11903:39;11959:19;;38217:147:0;11508:476:1;38217:147:0;38375:21;;-1:-1:-1;;38375:21:0;;;38423:37;;-1:-1:-1;;;38423:37:0;;38391:5;;38438:4;;38423:31;;:37;;38455:4;;38423:37;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;38407:53;;38490:5;38471:15;;:24;;;;;;;:::i;:::-;;;;-1:-1:-1;;;38070:437:0;-1:-1:-1;;38526:1:0;38517:6;:10;-1:-1:-1;37711:824:0:o;19589:459::-;19668:10;19697:17;19668:10;19697:11;:17::i;:::-;:26;19689:63;;;;-1:-1:-1;;;19689:63:0;;11357:2:1;19689:63:0;;;11339:21:1;11396:2;11376:18;;;11369:30;-1:-1:-1;;;11415:18:1;;;11408:54;11479:18;;19689:63:0;11155:348:1;19689:63:0;19779:37;;-1:-1:-1;;;19779:37:0;;19763:13;;19794:4;;19779:31;;:37;;19811:4;;19779:37;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;19852:15:0;;19827:22;19852:15;;;:9;:15;;;;;;;19902:11;:17;;;;;;19930:20;;-1:-1:-1;;19930:20:0;19946:4;19930:20;;;19763:53;;-1:-1:-1;19852:15:0;19979:25;:15;19997:7;19979:25;:::i;:::-;19961:4;:15;;:43;;;;20035:5;20016:15;;:24;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;;19589:459:0:o;3582:543::-;3809:17;3844:13;3860:35;3865:14;3881:13;3860:4;:35::i;:::-;3844:51;;3906:13;3922:37;3927:15;3944:14;3922:4;:37::i;:::-;3906:53;;3970:13;3986:18;3991:5;3998;3986:4;:18::i;:::-;3970:34;;4015:13;4031:35;4036:6;4044:21;4049:6;4057:7;4044:4;:21::i;4031:35::-;4015:51;;4098:18;4103:5;4110;4098:4;:18::i;:::-;4086:30;3582:543;-1:-1:-1;;;;;;;;;;3582:543:0:o;24367:262::-;24428:4;24453:23;24465:10;24453:11;:23::i;:::-;:32;24445:116;;;;-1:-1:-1;;;24445:116:0;;;;;;;:::i;:::-;24572:27;24578:10;24590:3;24595;24572:5;:27::i;:::-;-1:-1:-1;24617:4:0;24367:262;;;;:::o;20060:1056::-;20160:4;;;;:13;20152:22;;;;;;20207:5;;20200:38;;-1:-1:-1;;;20200:38:0;;20185:12;;-1:-1:-1;;;;;20207:5:0;;20200:23;;:38;;20232:4;;20200:38;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;20272:4;;20265:37;;-1:-1:-1;;;20265:37:0;;20185:53;;-1:-1:-1;20249:13:0;;-1:-1:-1;;;;;20272:4:0;;;;20265:22;;:37;;20296:4;;20265:37;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;20331:83;;;;;;;;20360:7;:14;;20331:83;;;;;;;;;20322:5;;;-1:-1:-1;;;;;20322:5:0;;;-1:-1:-1;20313:15:0;;;:8;:15;;;;;;:101;;;;;;20322:5;20313:101;;;;20452:84;;;;;;;20481:14;;20452:84;;;;;;;;20444:4;;;;;20435:14;;;;;;;;;:101;;;;;;;;;;;;;20570:5;;20557:19;;;;;;;;;;;;;20570:5;;;-1:-1:-1;;;;;;20557:19:0;;;;;;20600:4;;20587:18;;;;;;;;;;;;;;20600:4;;;20587:18;;;;;;;;;;;20642:5;;;;20633:15;;;;;:23;;20452:84;;-1:-1:-1;;20628:34:0;;20658:3;20628:4;:34::i;:::-;20699:4;;-1:-1:-1;;;;;20699:4:0;20673:9;20690:14;;;:8;:14;;;;;20699:4;20690:22;;20616:46;;-1:-1:-1;20673:9:0;20685:34;;20714:4;20685;:34::i;:::-;20673:46;-1:-1:-1;20730:9:0;20742:5;20673:46;20742:1;:5;:::i;:::-;20730:17;;20758:8;20764:1;20758:5;:8::i;:::-;20777:15;20783:5;20790:1;20777:5;:15::i;:::-;20821:24;20826:15;;20843:1;20821:4;:24::i;:::-;20803:15;:42;-1:-1:-1;;;;;20881:16:0;;20856:22;20881:16;;;:9;:16;;;;;;;20932:11;:18;;;;;;20961:20;;-1:-1:-1;;20961:20:0;20977:4;20961:20;;;21010:26;:15;21028:8;21010:26;:::i;:::-;20992:15;;;;:44;;;;21048:4;:11;;-1:-1:-1;;21048:11:0;;;;;;21076:31;21081:3;21086:20;21091:4;21097:8;21086:4;:20::i;21076:31::-;21070:3;:37;-1:-1:-1;;;;;;;;;20060:1056:0:o;31892:2806::-;32057:22;32103:31;32123:10;32103:19;:31::i;:::-;32100:101;;32163:6;;:11;32155:34;;;;-1:-1:-1;;;32155:34:0;;;;;;;:::i;:::-;32220:1;32211:6;:10;;;32240:4;;;;;;;:12;;;32232:40;;;;-1:-1:-1;;;32232:40:0;;;;;;;:::i;:::-;32286:30;32305:10;32286:18;:30::i;:::-;:38;;32320:4;32286:38;32283:141;;;32352:4;;32345:3;:11;32337:75;;;;-1:-1:-1;;;32337:75:0;;;;;;;:::i;:::-;32469:14;;32452:13;:31;;32444:58;;;;-1:-1:-1;;;32444:58:0;;;;;;;:::i;:::-;32536:5;;-1:-1:-1;;;;;32536:5:0;32513:11;32527:15;;;:8;:15;;;;;32536:5;32527:23;;;32561:49;;32584:10;32596:13;32561:15;:49::i;:::-;32688:13;;32654:5;;32647:38;;-1:-1:-1;;;32647:38:0;;-1:-1:-1;;;;;32654:5:0;;;;32647:23;;:38;;32679:4;;32647:38;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:54;;;;:::i;:::-;32630:5;;;-1:-1:-1;;;;;32630:5:0;;;32621:15;;;;:8;:15;;;;;;32630:5;32621:23;;;:80;;;;32748:5;;;;;32739:15;;;;;:23;;;;32733:54;;32739:29;;32765:3;;32739:29;:::i;:::-;32771:15;32776:3;32781:4;32771;:15::i;32733:54::-;32896:5;;-1:-1:-1;;;;;32896:5:0;32887:15;;;;:8;:15;;;;;32896:5;32887:23;;32712:75;;-1:-1:-1;32825:376:0;;32957:14;32962:4;32968:2;32957:4;:14::i;:::-;33027:4;;-1:-1:-1;;;;;33027:4:0;33018:14;;;;:8;:14;;;;;33027:4;33018:22;;33087:14;33092:4;33098:2;33087:4;:14::i;:::-;33148:10;32825:15;:376::i;:::-;33262:4;;-1:-1:-1;;;;;33262:4:0;33253:14;;;;:8;:14;;;;;33262:4;33253:22;;32808:393;;-1:-1:-1;33248:50:0;;33277:20;15769:2;33293:3;33277:4;:20::i;33248:50::-;33230:14;:68;;33222:99;;;;-1:-1:-1;;;33222:99:0;;;;;;;:::i;:::-;33390:12;33372:14;:30;;33364:69;;;;-1:-1:-1;;;33364:69:0;;;;;;;:::i;:::-;33444:12;33459:37;33464:14;33480:15;33485:3;;33490:4;33480;:15::i;33459:37::-;33444:52;;33507:18;33529:27;33534:4;33540:15;33545:2;33549:5;33540:4;:15::i;33529:27::-;33507:49;;33567:11;33581:27;33586:4;33592:15;33597:2;33601:5;33592:4;:15::i;33581:27::-;33567:41;;33619:19;33642:28;33647:4;33653:16;33658:3;;33663:5;33653:4;:16::i;33642:28::-;33619:51;-1:-1:-1;33681:10:0;33619:51;33703:16;33716:3;33703:10;:16;:::i;:::-;:30;;;;:::i;:::-;33695:39;;:4;:39;:::i;:::-;33681:54;;33746:19;33768:25;33773:2;33777:15;33782:3;33787:4;33777;:15::i;33768:25::-;33836:4;33804:10;33817:25;;;:10;:25;;;;;;33746:47;;-1:-1:-1;33871:4:0;33866:9;;33863:95;;;33904:2;33887:13;;:19;;;;;;;:::i;:::-;;;;-1:-1:-1;;33936:4:0;33945:1;33917:25;;;:10;:25;;;;;:29;33863:95;33983:4;;-1:-1:-1;;;;;33983:4:0;33978:19;34017:10;33998:16;34012:2;33998:11;:16;:::i;:::-;:29;;;;:::i;:::-;33978:50;;;;;;;;;;;;;21195:25:1;;21183:2;21168:18;;21049:177;33978:50:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34039:68;34070:2;34074:32;34079:11;34092:13;34097:2;34101:3;34092:4;:13::i;34074:32::-;34039:30;:68::i;:::-;34135:23;34140:2;34144:13;34149:1;34152:4;34144;:13::i;34135:23::-;34118:13;;:40;;;;;;;:::i;:::-;;;;-1:-1:-1;34169:11:0;;-1:-1:-1;34183:31:0;34188:11;34201:12;34206:1;34209:3;34201:4;:12::i;34183:31::-;34169:45;;34225:12;34240:32;34245:11;34258:13;34263:2;34267:3;34258:4;:13::i;34240:32::-;34225:47;;34313:32;34318:11;34331:13;34336:2;34340:3;34331:4;:13::i;34313:32::-;34294:14;;-1:-1:-1;;;;;34294:14:0;34283:26;;;;:10;:26;;;;;:62;;:26;;;:62;;;;;:::i;:::-;;;;-1:-1:-1;;34367:7:0;;-1:-1:-1;;;;;34367:7:0;34356:19;;;;:10;:19;;;;;:27;;34379:4;;34356:19;:27;;34379:4;;34356:27;:::i;:::-;;;;-1:-1:-1;;34405:4:0;;-1:-1:-1;;;;;34405:4:0;34394:16;;;;:10;:16;;;;;:23;;34414:3;;34394:16;:23;;34414:3;;34394:23;:::i;:::-;;;;;;;;34445:11;34428:13;;:28;;;;;;;:::i;:::-;;;;;;;;34484:3;34467:13;;:20;;;;;;;:::i;:::-;;;;-1:-1:-1;34498:10:0;;-1:-1:-1;34498:8:0;:10::i;:::-;34519:9;:7;:9::i;:::-;34539:6;:4;:6::i;:::-;34589:4;;34582:5;;-1:-1:-1;;;;;34589:4:0;;;;34582:5;34570:10;-1:-1:-1;;;;;;;;;;;34595:10:0;34607:32;34612:11;34625:13;34630:2;34634:3;34625:4;:13::i;34607:32::-;34561:79;;;;;;;:::i;:::-;;;;;;;;-1:-1:-1;;34660:1:0;34651:6;:10;-1:-1:-1;34679:11:0;31892:2806;-1:-1:-1;;;;;;;;;;;;31892:2806:0:o;34711:2308::-;34838:22;34886:6;;34896:1;34886:11;34878:34;;;;-1:-1:-1;;;34878:34:0;;;;;;;:::i;:::-;34932:1;34923:6;:10;35001;34944:11;34990:22;;;:10;:22;;;;;;34958:13;;34990:39;-1:-1:-1;34990:39:0;34982:68;;;;-1:-1:-1;;;34982:68:0;;;;;;;:::i;:::-;35104:5;;-1:-1:-1;;;;;35104:5:0;;;35061:23;35087:24;;;:8;:24;;;;;;35166:4;;;;;35149:23;;;;35208:14;;35191:31;;;35183:58;;;;-1:-1:-1;;;35183:58:0;;;;;;;:::i;:::-;35271:412;35333:8;:16;;;35396:14;35401:4;35407:2;35396:4;:14::i;:::-;35457:9;:17;;;35521:14;35526:4;35532:2;35521:4;:14::i;:::-;35582:36;35587:13;35602:15;35607:3;35612:4;35602;:15::i;35271:412::-;35254:429;;35722:45;35727:9;:17;;;35746:20;15769:2;35762:3;35746:4;:20::i;35722:45::-;35704:14;:63;;35696:94;;;;-1:-1:-1;;;35696:94:0;;;;;;;:::i;:::-;35801:12;35816:37;35821:14;35837:15;35842:3;;35847:4;35837;:15::i;35816:37::-;35801:52;;35864:18;35886:27;35891:4;35897:15;35902:2;35906:5;35897:4;:15::i;35886:27::-;35864:49;;35924:11;35938:27;35943:4;35949:15;35954:2;35958:5;35949:4;:15::i;35938:27::-;35924:41;;35976:19;35999:28;36004:4;36010:16;36015:3;;36020:5;36010:4;:16::i;35999:28::-;35976:51;-1:-1:-1;36038:10:0;35976:51;36060:16;36073:3;36060:10;:16;:::i;:::-;:30;;;;:::i;:::-;36052:39;;:4;:39;:::i;:::-;36038:54;;36103:19;36125:25;36130:2;36134:15;36139:3;36144:4;36134;:15::i;36125:25::-;36103:47;;36178:23;36183:2;36187:13;36192:1;36195:4;36187;:13::i;36178:23::-;36161:13;;:40;;;;;;;:::i;:::-;;;;-1:-1:-1;;36220:27:0;;;;36212:66;;;;-1:-1:-1;;;36212:66:0;;;;;;;:::i;:::-;36300:10;36289:22;;;;:10;:22;;;;;:39;;36315:13;;36289:22;:39;;36315:13;;36289:39;:::i;:::-;;;;;;;;36356:13;36339;;:30;;;;;;;:::i;:::-;;;;-1:-1:-1;;36391:10:0;36380:22;;;;:10;:22;;;;;:37;;36406:11;;36380:22;:37;;36406:11;;36380:37;:::i;:::-;;;;-1:-1:-1;;36447:4:0;36428:25;;;;:10;:25;;;;;:39;;36457:10;;36428:25;:39;;36457:10;;36428:39;:::i;:::-;;;;-1:-1:-1;36478:10:0;;-1:-1:-1;36491:32:0;36496:11;36509:13;36514:2;36518:3;36509:4;:13::i;36491:32::-;36478:45;;36534:11;36548:31;36553:11;36566:12;36571:1;36574:3;36566:4;:12::i;36548:31::-;36534:45;;36590:12;36605:32;36610:11;36623:13;36628:2;36632:3;36623:4;:13::i;36605:32::-;36659:14;;-1:-1:-1;;;;;36659:14:0;36648:26;;;;:10;:26;;;;;:32;;36590:47;;-1:-1:-1;36678:2:0;;36648:26;;;:32;;36678:2;;36648:32;:::i;:::-;;;;-1:-1:-1;;36702:7:0;;-1:-1:-1;;;;;36702:7:0;36691:19;;;;:10;:19;;;;;:27;;36714:4;;36691:19;:27;;36714:4;;36691:27;:::i;:::-;;;;-1:-1:-1;;36740:4:0;;-1:-1:-1;;;;;36740:4:0;36729:16;;;;:10;:16;;;;;:23;;36749:3;;36729:16;:23;;36749:3;;36729:23;:::i;:::-;;;;-1:-1:-1;36808:11:0;;-1:-1:-1;36781:24:0;36794:11;36781:10;:24;:::i;:::-;:38;;;;:::i;:::-;36763:13;;:57;;;;;;;:::i;:::-;;;;;;;;36848:3;36831:13;;:20;;;;;;;:::i;:::-;;;;-1:-1:-1;36862:6:0;;-1:-1:-1;36862:4:0;:6::i;:::-;36879:9;:7;:9::i;:::-;36937:4;;;;;;;;;-1:-1:-1;;;;;36937:4:0;-1:-1:-1;;;;;36904:56:0;36930:5;;;;;;;;;-1:-1:-1;;;;;36930:5:0;-1:-1:-1;;;;;36904:56:0;36918:10;-1:-1:-1;;;;;36904:56:0;-1:-1:-1;;;;;;;;;;;36943:3:0;36948:11;36904:56;;;;;;;:::i;:::-;;;;;;;;-1:-1:-1;;36980:1:0;36971:6;:10;-1:-1:-1;36999:11:0;34711:2308;-1:-1:-1;;;;;;;;;;;34711:2308:0:o;23225:1130::-;23336:4;;-1:-1:-1;;;;;23327:13:0;;;23336:4;;23327:13;;:31;;-1:-1:-1;23353:5:0;;-1:-1:-1;;;;;23344:14:0;;;23353:5;;23344:14;23327:31;23319:57;;;;-1:-1:-1;;;23319:57:0;;;;;;;:::i;:::-;23395:6;;:11;23387:34;;;;-1:-1:-1;;;23387:34:0;;;;;;;:::i;:::-;23441:1;23432:6;:10;23465:4;;-1:-1:-1;;;;;23456:13:0;;;23465:4;;23456:13;23453:874;;;23500:10;23489:22;;;;:10;:22;;;;;;:29;-1:-1:-1;23489:29:0;23481:57;;;;-1:-1:-1;;;23481:57:0;;;;;;;:::i;:::-;23564:4;;23549:49;;-1:-1:-1;;;23549:49:0;;-1:-1:-1;;;;;23564:4:0;;;;23549:29;;:49;;23587:4;;23594:3;;23549:49;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;23629:3;23612:13;;:20;;;;;;;:::i;:::-;;;;-1:-1:-1;;23654:10:0;23643:22;;;;:10;:22;;;;;:29;;23669:3;;23643:22;:29;;23669:3;;23643:29;:::i;:::-;;;;-1:-1:-1;;23710:4:0;;23683:37;;-1:-1:-1;;;23683:37:0;;-1:-1:-1;;;;;23683:26:0;;;;;;:37;;23710:4;;;;23716:3;;23683:37;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23732:14;23748:13;23775:4;-1:-1:-1;;;;;23765:35:0;;23809:4;23765:50;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;23826:29;;-1:-1:-1;;;23826:29:0;;23731:84;;-1:-1:-1;23731:84:0;-1:-1:-1;;;;;;23826:18:0;;;;;:29;;23845:2;;23731:84;;23826:29;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;23453:874:0;;-1:-1:-1;;;;;23453:874:0;;23938:10;23927:22;;;;:10;:22;;;;;;:29;-1:-1:-1;23927:29:0;23919:58;;;;-1:-1:-1;;;23919:58:0;;;;;;;:::i;:::-;24003:5;;23988:50;;-1:-1:-1;;;23988:50:0;;-1:-1:-1;;;;;24003:5:0;;;;23988:30;;:50;;24027:4;;24034:3;;23988:50;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;24066:3;24049:13;;:20;;;;;;;:::i;:::-;;;;-1:-1:-1;;24091:10:0;24080:22;;;;:10;:22;;;;;:29;;24106:3;;24080:22;:29;;24106:3;;24080:29;:::i;:::-;;;;-1:-1:-1;;24147:5:0;;24120:38;;-1:-1:-1;;;24120:38:0;;-1:-1:-1;;;;;24120:26:0;;;;;;:38;;24147:5;;;;24154:3;;24120:38;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24170:14;24186:13;24213:4;-1:-1:-1;;;;;24203:35:0;;24247:4;24203:50;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;24264:31;;-1:-1:-1;;;24264:31:0;;24169:84;;-1:-1:-1;24169:84:0;-1:-1:-1;;;;;;24264:19:0;;;;;:31;;24284:2;;24169:84;;24264:31;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;23453:874:0;-1:-1:-1;;24346:1:0;24337:6;:10;-1:-1:-1;;23225:1130:0:o;4135:810::-;4395:22;4419:18;4455:19;4477:35;4482:13;4497:14;4477:4;:35::i;:::-;4455:57;;4523:18;4544:21;4549:6;4557:7;4544:4;:21::i;:::-;4523:42;;4589:31;4594:13;4609:10;4589:4;:31::i;:::-;4576:44;;4631:9;4643:54;4648:14;4664:32;4669:14;4685:10;4664:4;:32::i;4643:54::-;4631:66;;4708:11;4722:20;4727:1;4730:11;4722:4;:20::i;:::-;4708:34;;4753:11;4767:15;4772:4;4778:3;4767:4;:15::i;:::-;4753:29;;4810:26;4815:15;4832:3;4810:4;:26::i;:::-;4793:43;;4860:31;4865:13;4880:10;4860:4;:31::i;:::-;4847:44;;4902:35;;;;;4135:810;;;;;;;;;:::o;21515:1014::-;21605:4;;-1:-1:-1;;;;;21596:13:0;;;21605:4;;21596:13;;:31;;-1:-1:-1;21622:5:0;;-1:-1:-1;;;;;21613:14:0;;;21622:5;;21613:14;21596:31;21588:57;;;;-1:-1:-1;;;21588:57:0;;;;;;;:::i;:::-;21664:6;;:11;21656:34;;;;-1:-1:-1;;;21656:34:0;;;;;;;:::i;:::-;21710:1;21701:6;:10;;;21730:4;;;;;;;:12;;;21722:21;;;;;;21776:5;;-1:-1:-1;;;;;21767:14:0;;;21776:5;;21767:14;21764:737;;;21816:5;;-1:-1:-1;;;;;21816:5:0;21793:11;21807:15;;;:8;:15;;;;;21816:5;21807:23;;;21846:39;;21869:10;21881:3;21846:15;:39::i;:::-;21922:5;;21915:38;;-1:-1:-1;;;21915:38:0;;21896:11;;21910:59;;-1:-1:-1;;;;;21922:5:0;;;;21915:23;;:38;;21947:4;;21915:38;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;21955:13;;21910:4;:59::i;:::-;21896:73;;21982:19;22004:14;22009:3;22014;22004:4;:14::i;:::-;21982:36;;22048:11;22031:13;;:28;;;;;;;:::i;:::-;;;;-1:-1:-1;;22081:10:0;22070:22;;;;:10;:22;;;;;:37;;22096:11;;22070:22;:37;;22096:11;;22070:37;:::i;:::-;;;;-1:-1:-1;21764:737:0;;-1:-1:-1;;;;21764:737:0;;22167:4;;-1:-1:-1;;;;;22167:4:0;22144:11;22158:14;;;:8;:14;;;;;22167:4;22158:22;;;22191:38;;22213:10;22225:3;22191:15;:38::i;:::-;22266:4;;22259:37;;-1:-1:-1;;;22259:37:0;;22240:11;;22254:100;;-1:-1:-1;;;;;22266:4:0;;;;22259:22;;:37;;22290:4;;22259:37;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;22298:55;22303:13;;22318:34;22323:13;;22338;;22318:4;:34::i;:::-;22298:4;:55::i;:::-;22254:4;:100::i;:::-;22240:114;;22365:19;22387:14;22392:3;22397;22387:4;:14::i;:::-;22365:36;;22430:11;22412:13;;:29;;;;;;;:::i;:::-;;;;-1:-1:-1;;22463:10:0;22452:22;;;;:10;:22;;;;;:37;;22478:11;;22452:22;:37;;22478:11;;22452:37;:::i;:::-;;;;-1:-1:-1;;;;;;;22520:1:0;22511:6;:10;21515:1014::o;29753:2127::-;29892:22;29940:6;;29950:1;29940:11;29932:34;;;;-1:-1:-1;;;29932:34:0;;;;;;;:::i;:::-;29986:1;29977:6;:10;;;30006:4;;;;;;;:12;;;29998:40;;;;-1:-1:-1;;;29998:40:0;;;;;;;:::i;:::-;30049:13;30065:32;30070:9;30081:15;30086:3;30091:4;30081;:15::i;30065:32::-;30049:48;;30113:4;;;;;;;;;-1:-1:-1;;;;;30113:4:0;-1:-1:-1;;;;;30108:18:0;;30134:5;30108:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30153:74;30184:10;30196:30;30201:9;30212:13;30217:1;30220:4;30212;:13::i;30153:74::-;30251:30;30270:10;30251:18;:30::i;:::-;:38;;30285:4;30251:38;30248:141;;;30317:4;;30310:3;:11;30302:75;;;;-1:-1:-1;;;30302:75:0;;;;;;;:::i;:::-;30431:3;;30424:42;;-1:-1:-1;;;30424:42:0;;30409:12;;-1:-1:-1;;;;;30431:3:0;;30424:21;;:42;;30454:10;;30424:42;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;30409:57;-1:-1:-1;30490:21:0;30535:6;;;;;:27;;;30558:4;30545:9;:17;;30535:27;:43;;;;;30574:4;30566;:12;;30535:43;30532:82;;;30590:12;:10;:12::i;:::-;30677:4;;-1:-1:-1;;;;;30677:4:0;;;30634:23;30660;;;:8;:23;;;;;;30738:5;;;;;30721:24;;;;30787:13;;30774:9;:26;;30766:55;;;;-1:-1:-1;;;30766:55:0;;;;;;;:::i;:::-;30842:18;30902:429;30963:8;:16;;;31026:14;31031:4;31037:2;31026:4;:14::i;:::-;31087:9;:17;;;31151:14;31156:4;31162:2;31151:4;:14::i;:::-;31212:28;31217:5;31224:15;31229:3;31234:4;31224;:15::i;31212:28::-;31287:1;30902:14;:429::i;:::-;31415:17;;;;30871:460;;-1:-1:-1;30871:460:0;-1:-1:-1;31410:45:0;;31434:20;15769:2;31450:3;31434:4;:20::i;31410:45::-;31392:14;:63;;31384:94;;;;-1:-1:-1;;;31384:94:0;;;;;;;:::i;:::-;31506:30;31511:9;31522:13;31527:1;31530:4;31522;:13::i;31506:30::-;31489:13;;:47;;;;;;;:::i;:::-;;;;-1:-1:-1;;31587:30:0;;;;31579:69;;;;-1:-1:-1;;;31579:69:0;;;;;;;:::i;:::-;31675:5;;31659:42;;-1:-1:-1;;;;;31675:5:0;31682:2;31686:14;31659:15;:42::i;:::-;31712:6;:4;:6::i;:::-;31763:5;;31757:4;;31807:3;;-1:-1:-1;;;;;31763:5:0;;;;31757:4;;;;31745:10;;-1:-1:-1;;;;;;;;;;;31736:82:0;31770:9;;31781:36;;31786:14;;31802;;31812:3;31802:4;:14::i;31781:36::-;31736:82;;;;;;;:::i;:::-;;;;;;;;-1:-1:-1;;31838:1:0;31829:6;:10;-1:-1:-1;;;;29753:2127:0;;;;;:::o;19021:105::-;19090:7;;-1:-1:-1;;;;;19090:7:0;19076:10;:21;19068:30;;;;;;19109:3;:9;19021:105::o;11981:255::-;12114:10;12051:4;12103:22;;;:10;:22;;;;;;;;-1:-1:-1;;;;;12103:27:0;;;;;;;;;;12098:38;;12132:3;12098:4;:38::i;:::-;12079:10;12068:22;;;;:10;:22;;;;;;;;-1:-1:-1;;;;;12068:27:0;;;;;;;;;;;;:68;;;12152:54;21195:25:1;;;12068:27:0;;-1:-1:-1;;;;;;;;;;;12152:54:0;21168:18:1;12152:54:0;21049:177:1;18893:116:0;18962:7;;-1:-1:-1;;;;;18962:7:0;18948:10;:21;18940:30;;;;;;18981:14;:20;;-1:-1:-1;;;;;;18981:20:0;-1:-1:-1;;;;;18981:20:0;;;;;;;;;;18893:116::o;15925:397::-;16047:4;;;;:13;16039:43;;;;-1:-1:-1;;;16039:43:0;;14811:2:1;16039:43:0;;;14793:21:1;14850:2;14830:18;;;14823:30;-1:-1:-1;;;14869:18:1;;;14862:47;14926:18;;16039:43:0;14609:341:1;16039:43:0;16093:5;:15;;-1:-1:-1;;;;;16093:15:0;;;-1:-1:-1;;;;;;16093:15:0;;;;;;;;16119:10;:18;;;;;;;;;;;;;16148:14;:22;;;;;;;;;16181:4;:9;;;-1:-1:-1;16201:12:0;;;;;;;;;;;16224:8;:16;;;;;;;;;;;;16273:27;;;-1:-1:-1;;;16273:27:0;;;;16268:46;;16093:15;16273:25;;:27;;;;;;;;;;;;;;16093:15;16273:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;16302:11;16307:1;16310:2;16302:4;:11::i;16268:46::-;16251:14;:63;-1:-1:-1;;;;;15925:397:0:o;5651:853::-;5912:21;5935:18;5971:19;5993:35;5998:14;6014:13;5993:4;:35::i;:::-;5971:57;;6039:12;6054:37;6059:15;6076:14;6054:4;:37::i;:::-;6039:52;;6102:9;6114:27;6119:15;6136:4;6114;:27::i;:::-;6102:39;;6152:11;6166:20;6171:1;6174:11;6166:4;:20::i;:::-;6152:34;;6203:15;6208:3;6213:4;6203;:15::i;:::-;6197:21;;6235:25;6240:14;6256:3;6235:4;:25::i;:::-;6229:31;;6287:19;6292:4;6298:7;6287:4;:19::i;:::-;6271:35;;6333:24;6338:3;6343:13;6333:4;:24::i;:::-;6317:40;;6381:15;6386:3;6391:4;6381;:15::i;:::-;6368:28;;6420:31;6425:13;6440:10;6420:4;:31::i;:::-;6407:44;;6462:34;;;;5651:853;;;;;;;;;:::o;27781:1960::-;27969:10;27908:22;27958;;;:10;:22;;;;;;:39;-1:-1:-1;27958:39:0;27950:81;;;;-1:-1:-1;;;27950:81:0;;18758:2:1;27950:81:0;;;18740:21:1;18797:2;18777:18;;;18770:30;18836:31;18816:18;;;18809:59;18885:18;;27950:81:0;18556:353:1;27950:81:0;28050:6;;:11;28042:34;;;;-1:-1:-1;;;28042:34:0;;;;;;;:::i;:::-;28096:1;28087:6;:10;28151:4;;-1:-1:-1;;;;;28151:4:0;;;28108:23;28134;;;:8;:23;;;;;;28212:5;;;;;28195:24;;;;28255:13;;28238:30;;;28230:59;;;;-1:-1:-1;;;28230:59:0;;;;;;;:::i;:::-;28300:18;28360:437;28421:8;:16;;;28484:14;28489:4;28495:2;28484:4;:14::i;28360:437::-;28849:17;;;;28329:468;;-1:-1:-1;28329:468:0;-1:-1:-1;28844:45:0;;28868:20;15769:2;28884:3;28868:4;:20::i;28844:45::-;28826:14;:63;;28818:94;;;;-1:-1:-1;;;28818:94:0;;;;;;;:::i;:::-;28981:12;28963:14;:30;;28955:69;;;;-1:-1:-1;;;28955:69:0;;;;;;;:::i;:::-;29049:10;29038:22;;;;:10;:22;;;;;:39;;29064:13;;29038:22;:39;;29064:13;;29038:39;:::i;:::-;;;;;;;;29105:13;29088;;:30;;;;;;;:::i;:::-;;;;-1:-1:-1;;29140:10:0;29129:22;;;;:10;:22;;;;;:40;;29155:14;;29129:22;:40;;29155:14;;29129:40;:::i;:::-;;;;;;;;29197:14;29180:13;;:31;;;;;;;:::i;:::-;;;;-1:-1:-1;29239:34:0;;-1:-1:-1;29244:13:0;29259;29264:1;29267:4;29259;:13::i;29239:34::-;29222:13;;:51;;;;;;;:::i;:::-;;;;-1:-1:-1;29284:6:0;;-1:-1:-1;29284:4:0;:6::i;:::-;29338:5;;29332:4;;29306:69;;-1:-1:-1;;;;;29338:5:0;;;;29332:4;;;;29320:10;;-1:-1:-1;;;;;;;;;;;29306:69:0;;;29345:13;;29360:14;;29306:69;:::i;:::-;;;;;;;;29408:3;;29401:42;;-1:-1:-1;;;29401:42:0;;29386:12;;-1:-1:-1;;;;;29408:3:0;;29401:21;;:42;;29431:10;;29401:42;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;29386:57;;29481:1;29457:21;:25;:50;;;;;29503:4;29486:13;:21;;29457:50;:66;;;;;29519:4;29511;:12;;29457:66;29454:226;;;29535:10;29548:30;29553:21;29576:1;29548:4;:30::i;:::-;29535:43;;29589:46;29620:10;29632:2;29589:30;:46::i;:::-;29666:2;29646:16;;:22;;;;;;;:::i;:::-;;;;-1:-1:-1;;;29454:226:0;-1:-1:-1;;29699:1:0;29690:6;:10;-1:-1:-1;;27781:1960:0;;;;:::o;17472:316::-;17616:13;;17582:5;;17575:38;;-1:-1:-1;;;17575:38:0;;-1:-1:-1;;;;;17582:5:0;;;;17575:23;;:38;;17607:4;;17575:38;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:54;;;;:::i;:::-;17558:5;;-1:-1:-1;;;;;17558:5:0;17549:15;;;;:8;:15;;;;;17558:5;17549:23;:80;;;;17688:13;;17672;;17656;;:29;;17672:13;17656:29;:::i;:::-;:45;;;;:::i;:::-;17745:4;;17738:37;;-1:-1:-1;;;17738:37:0;;17642:60;;-1:-1:-1;17642:60:0;;-1:-1:-1;;;;;17745:4:0;;;;17738:22;;:37;;17769:4;;17738:37;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:42;;;;:::i;:::-;17722:4;;-1:-1:-1;;;;;17722:4:0;17713:14;;;;:8;:14;;;;;17722:4;17713:22;:67;-1:-1:-1;17472:316:0:o;16599:387::-;16658:4;16688:28;16708:7;16688:19;:28::i;:::-;16685:51;;;-1:-1:-1;16728:5:0;;16599:387;-1:-1:-1;16599:387:0:o;16685:51::-;16895:20;;-1:-1:-1;;;;;;;;;;;16935:15:0;;;;;:42;;;16966:11;16954:8;:23;;16935:42;16927:51;16599:387;-1:-1:-1;;;;16599:387:0:o;1009:329::-;1086:7;;1124:5;1128:1;1124;:5;:::i;:::-;1111:18;-1:-1:-1;1148:6:0;;;:21;;-1:-1:-1;1168:1:0;1158:6;1163:1;1158:2;:6;:::i;:::-;:11;1148:21;1140:50;;;;-1:-1:-1;;;1140:50:0;;;;;;;:::i;:::-;1201:10;1214:15;:2;1220:8;1214:15;:::i;:::-;1201:28;;1254:2;1248;:8;;1240:37;;;;-1:-1:-1;;;1240:37:0;;;;;;;:::i;:::-;1288:10;1301:9;1306:4;1301:2;:9;:::i;:::-;1288:22;1009:329;-1:-1:-1;;;;;;1009:329:0:o;39649:184::-;39767:34;;-1:-1:-1;;;39767:34:0;;39755:9;;-1:-1:-1;;;;;39767:22:0;;;;;:34;;39790:2;;39794:6;;39767:34;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;39755:46;;39820:4;39812:13;;;;;;39741:92;39649:184;;;:::o;1346:405::-;1423:7;1456:6;1448:31;;;;-1:-1:-1;;;1448:31:0;;16957:2:1;1448:31:0;;;16939:21:1;16996:2;16976:18;;;16969:30;-1:-1:-1;;;17015:18:1;;;17008:42;17067:18;;1448:31:0;16755:336:1;1448:31:0;1490:10;1503:8;:1;1507:4;1503:8;:::i;:::-;1490:21;-1:-1:-1;1530:6:0;;;:24;;-1:-1:-1;1540:6:0;1545:1;1540:2;:6;:::i;:::-;1550:4;1540:14;1530:24;1522:53;;;;-1:-1:-1;;;1522:53:0;;;;;;;:::i;:::-;1603:10;1622:5;1626:1;1622;:5;:::i;:::-;1616:12;;:2;:12;:::i;:::-;1603:25;;1653:2;1647;:8;;1639:37;;;;-1:-1:-1;;;1639:37:0;;;;;;;:::i;:::-;1704:10;1717:6;1722:1;1717:2;:6;:::i;11013:252::-;-1:-1:-1;;;;;11095:13:0;;:8;:13;;;;;;;;;;;:20;-1:-1:-1;11095:20:0;11087:29;;;;;;-1:-1:-1;;;;;11148:13:0;;:8;:13;;;;;;;;;;;11143:24;;11163:3;11143:4;:24::i;:::-;-1:-1:-1;;;;;11127:13:0;;;:8;:13;;;;;;;;;;;:40;;;;11199:13;;;;;;;11194:24;;11214:3;11194:4;:24::i;:::-;-1:-1:-1;;;;;11178:13:0;;;:8;:13;;;;;;;;;;;;:40;;;;11234:23;21195:25:1;;;11178:13:0;;11234:23;;;;-1:-1:-1;;;;;;;;;;;11234:23:0;21168:18:1;11234:23:0;;;;;;;11013:252;;;:::o;550:214::-;627:7;653:9;664;677:14;686:1;689;677:8;:14::i;:::-;652:39;;;;711:4;710:5;702:35;;;;-1:-1:-1;;;702:35:0;;19520:2:1;702:35:0;;;19502:21:1;19559:2;19539:18;;;19532:30;-1:-1:-1;;;19578:18:1;;;19571:47;19635:18;;702:35:0;19318:341:1;702:35:0;-1:-1:-1;755:1:0;550:214;-1:-1:-1;;;550:214:0:o;350:192::-;427:7;;464:5;468:1;464;:5;:::i;:::-;452:17;;493:1;488;:6;;480:35;;;;-1:-1:-1;;;480:35:0;;19866:2:1;480:35:0;;;19848:21:1;19905:2;19885:18;;;19878:30;-1:-1:-1;;;19924:18:1;;;19917:46;19980:18;;480:35:0;19664:340:1;480:35:0;533:1;350:192;-1:-1:-1;;;350:192:0:o;2093:567::-;2175:7;2216:5;2208:4;:13;;2200:47;;;;-1:-1:-1;;;2200:47:0;;18408:2:1;2200:47:0;;;18390:21:1;18447:2;18427:18;;;18420:30;-1:-1:-1;;;18466:18:1;;;18459:51;18527:18;;2200:47:0;18206:345:1;2200:47:0;2274:18;2266:4;:26;;2258:61;;;;-1:-1:-1;;;2258:61:0;;20900:2:1;2258:61:0;;;20882:21:1;20939:2;20919:18;;;20912:30;-1:-1:-1;;;20958:18:1;;;20951:52;21020:18;;2258:61:0;20698:346:1;2258:61:0;2332:13;2349:11;2356:3;2349:6;:11::i;:::-;2332:28;;2371:14;2388:16;2393:3;2398:5;2388:4;:16::i;:::-;2371:33;;2417:16;2436:24;2442:4;2448:11;2453:5;2448:4;:11::i;:::-;2436:5;:24::i;:::-;2417:43;-1:-1:-1;2477:11:0;2473:59;;2512:8;-1:-1:-1;2505:15:0;;-1:-1:-1;;2505:15:0;2473:59;2544:21;2568:37;2579:4;2585:6;2593:11;2568:10;:37::i;:::-;2544:61;;2623:29;2628:8;2638:13;2623:4;:29::i;:::-;2616:36;2093:567;-1:-1:-1;;;;;;;2093:567:0:o;39430:207::-;39550:55;;-1:-1:-1;;;39550:55:0;;-1:-1:-1;;;;;7060:15:1;;;39550:55:0;;;7042:34:1;39591:4:0;7092:18:1;;;7085:43;7144:18;;;7137:34;;;39538:9:0;;39550:26;;;;;;6977:18:1;;39550:55:0;6802:375:1;10786:219:0;10882:4;10865:8;:23;;;;;;;;;;;10860:34;;10890:3;10860:4;:34::i;:::-;10851:4;10834:8;:23;;;;;;;;;;:60;10924:11;;10919:22;;10937:3;10919:4;:22::i;:::-;10905:11;:36;10957:40;;21195:25:1;;;10986:4:0;;10974:1;;-1:-1:-1;;;;;;;;;;;10957:40:0;21183:2:1;21168:18;10957:40:0;;;;;;;10786:219;:::o;11273:97::-;11333:29;11347:4;11354:2;11358:3;11333:5;:29::i;:::-;11273:97;;:::o;8106:318::-;8166:4;8333:20;;-1:-1:-1;;;;;;;;;;;8373:23:0;;;;;;:42;;-1:-1:-1;;8400:15:0;;;8365:51;-1:-1:-1;;8106:318:0:o;7872:198::-;7983:12;;;7945;7983;;;;;;;;;-1:-1:-1;;;;;7962:7:0;;;7976:5;;7962:34;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7944:52;;;8015:7;8007:55;;;;-1:-1:-1;;;8007:55:0;;19116:2:1;8007:55:0;;;19098:21:1;19155:2;19135:18;;;19128:30;19194:34;19174:18;;;19167:62;-1:-1:-1;;;19245:18:1;;;19238:33;19288:19;;8007:55:0;18914:399:1;8007:55:0;7933:137;7872:198;;:::o;40096:173::-;40158:5;40142:13;;:21;40139:123;;;40192:4;;40198:8;;40208:13;;40176:46;;-1:-1:-1;;;;;40192:4:0;;;;40198:8;;40176:15;:46::i;:::-;40249:1;40233:13;:17;40139:123;40096:173::o;39845:239::-;39903:5;39887:13;;:21;39884:193;;;39926:4;;39941:13;;39921:34;;-1:-1:-1;;;39921:34:0;;-1:-1:-1;;;;;39926:4:0;;;;39921:19;;:34;;;;21195:25:1;;;21183:2;21168:18;;21049:177;39921:34:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;39971:4:0;;39992:13;;-1:-1:-1;;;;;39971:4:0;;;;-1:-1:-1;39966:14:0;;-1:-1:-1;39987:34:0;;40007:13;40012:2;40016:3;40007:4;:13::i;39987:34::-;40029:4;;39966:71;;;;;;-1:-1:-1;;;;;;39966:71:0;;;40023:4;39966:71;;;9243:25:1;-1:-1:-1;;;;;40029:4:0;;;9284:18:1;;;9277:60;40029:4:0;9353:18:1;;;9346:34;9216:18;;39966:71:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;40064:1:0;40048:13;:17;-1:-1:-1;;;39845:239:0:o;27591:178::-;27633:10;27646:25;27670:1;27646:21;:25;:::i;:::-;27633:38;;27682:46;27713:10;27725:2;27682:30;:46::i;:::-;27759:2;27739:16;;:22;;;;;;;:::i;:::-;;;;-1:-1:-1;;;27591:178:0:o;772:229::-;853:4;859;890:1;885;:6;881:113;;916:5;920:1;916;:5;:::i;:::-;923;908:21;;;;;;881:113;970:5;974:1;970;:5;:::i;:::-;977:4;962:20;;;;881:113;772:229;;;;;:::o;220:122::-;288:7;320;325:1;320:4;:7::i;:::-;:14;;330:4;320:14;:::i;98:114::-;164:7;196:8;200:4;196:1;:8;:::i;1759:326::-;1837:7;;1874:5;1878:1;1874;:5;:::i;:::-;:21;;1891:4;1874:21;;;1887:1;1874:21;1862:33;-1:-1:-1;1913:6:0;1918:1;1913:6;;:::i;:::-;;;1908:151;1921:6;;1908:151;;1956:10;1961:1;1964;1956:4;:10::i;:::-;1952:14;-1:-1:-1;1987:5:0;1991:1;1987;:5;:::i;:::-;:10;1983:65;;2022:10;2027:1;2030;2022:4;:10::i;:::-;2018:14;;1983:65;1929:6;1934:1;1929:6;;:::i;:::-;;;1908:151;;2668:864;2775:7;2816:3;2775:7;;2856:20;2865:4;2871;2856:8;:20::i;:::-;2830:46;;-1:-1:-1;2830:46:0;-1:-1:-1;2902:4:0;;2887:12;3001:1;2984:518;3012:9;3004:4;:17;2984:518;;3043:12;3058:8;:1;3062:4;3058:8;:::i;:::-;3043:23;;3082:9;3093;3106:29;3115:1;3118:16;3123:4;3129;3118;:16::i;:::-;3106:8;:29::i;:::-;3081:54;;;;3157:22;3162:4;3168:10;3173:1;3176;3168:4;:10::i;3157:22::-;3150:29;;3201:16;3206:4;3212;3201;:16::i;:::-;3194:23;-1:-1:-1;3236:9:0;3232:20;;3247:5;;;;;3232:20;3273:4;3269:30;;;3290:9;;;3269:30;3318:4;3314:30;;;3335:9;;;3314:30;3363:8;3359:132;;;3398:15;3403:3;3408:4;3398;:15::i;:::-;3392:21;;3359:132;;;3460:15;3465:3;3470:4;3460;:15::i;:::-;3454:21;;3359:132;3028:474;;;3023:3;;;;;:::i;:::-;;;;2984:518;;;-1:-1:-1;3521:3:0;;2668:864;-1:-1:-1;;;;;;;;;2668:864:0:o;14:173:1:-;82:20;;-1:-1:-1;;;;;131:31:1;;121:42;;111:70;;177:1;174;167:12;111:70;14:173;;;:::o;192:186::-;251:6;304:2;292:9;283:7;279:23;275:32;272:52;;;320:1;317;310:12;272:52;343:29;362:9;343:29;:::i;383:260::-;451:6;459;512:2;500:9;491:7;487:23;483:32;480:52;;;528:1;525;518:12;480:52;551:29;570:9;551:29;:::i;:::-;541:39;;599:38;633:2;622:9;618:18;599:38;:::i;:::-;589:48;;383:260;;;;;:::o;648:334::-;725:6;733;741;794:2;782:9;773:7;769:23;765:32;762:52;;;810:1;807;800:12;762:52;833:29;852:9;833:29;:::i;:::-;823:39;;881:38;915:2;904:9;900:18;881:38;:::i;:::-;871:48;;938:38;972:2;961:9;957:18;938:38;:::i;:::-;928:48;;648:334;;;;;:::o;987:478::-;1082:6;1090;1098;1106;1114;1167:3;1155:9;1146:7;1142:23;1138:33;1135:53;;;1184:1;1181;1174:12;1135:53;1207:29;1226:9;1207:29;:::i;:::-;1197:39;;1255:38;1289:2;1278:9;1274:18;1255:38;:::i;:::-;1245:48;;1312:38;1346:2;1335:9;1331:18;1312:38;:::i;:::-;1302:48;;1369:38;1403:2;1392:9;1388:18;1369:38;:::i;:::-;987:478;;;;-1:-1:-1;987:478:1;;1454:3;1439:19;1426:33;;987:478;-1:-1:-1;;987:478:1:o;1470:403::-;1556:6;1564;1572;1580;1633:3;1621:9;1612:7;1608:23;1604:33;1601:53;;;1650:1;1647;1640:12;1601:53;1673:29;1692:9;1673:29;:::i;:::-;1663:39;;1721:38;1755:2;1744:9;1740:18;1721:38;:::i;:::-;1711:48;;1778:38;1812:2;1801:9;1797:18;1778:38;:::i;:::-;1470:403;;;;-1:-1:-1;1768:48:1;;1863:2;1848:18;1835:32;;-1:-1:-1;;1470:403:1:o;1878:328::-;1955:6;1963;1971;2024:2;2012:9;2003:7;1999:23;1995:32;1992:52;;;2040:1;2037;2030:12;1992:52;2063:29;2082:9;2063:29;:::i;:::-;2053:39;;2111:38;2145:2;2134:9;2130:18;2111:38;:::i;:::-;2101:48;;2196:2;2185:9;2181:18;2168:32;2158:42;;1878:328;;;;;:::o;2211:315::-;2276:6;2284;2337:2;2325:9;2316:7;2312:23;2308:32;2305:52;;;2353:1;2350;2343:12;2305:52;2376:29;2395:9;2376:29;:::i;:::-;2366:39;;2455:2;2444:9;2440:18;2427:32;2468:28;2490:5;2468:28;:::i;:::-;2515:5;2505:15;;;2211:315;;;;;:::o;2531:254::-;2599:6;2607;2660:2;2648:9;2639:7;2635:23;2631:32;2628:52;;;2676:1;2673;2666:12;2628:52;2699:29;2718:9;2699:29;:::i;:::-;2689:39;2775:2;2760:18;;;;2747:32;;-1:-1:-1;;;2531:254:1:o;2790:245::-;2857:6;2910:2;2898:9;2889:7;2885:23;2881:32;2878:52;;;2926:1;2923;2916:12;2878:52;2958:9;2952:16;2977:28;2999:5;2977:28;:::i;3040:180::-;3099:6;3152:2;3140:9;3131:7;3127:23;3123:32;3120:52;;;3168:1;3165;3158:12;3120:52;-1:-1:-1;3191:23:1;;3040:180;-1:-1:-1;3040:180:1:o;3225:184::-;3295:6;3348:2;3336:9;3327:7;3323:23;3319:32;3316:52;;;3364:1;3361;3354:12;3316:52;-1:-1:-1;3387:16:1;;3225:184;-1:-1:-1;3225:184:1:o;3414:322::-;3491:6;3499;3507;3560:2;3548:9;3539:7;3535:23;3531:32;3528:52;;;3576:1;3573;3566:12;3528:52;3612:9;3599:23;3589:33;;3641:38;3675:2;3664:9;3660:18;3641:38;:::i;3741:391::-;3827:6;3835;3843;3851;3904:3;3892:9;3883:7;3879:23;3875:33;3872:53;;;3921:1;3918;3911:12;3872:53;3957:9;3944:23;3934:33;;3986:38;4020:2;4009:9;4005:18;3986:38;:::i;:::-;3741:391;;3976:48;;-1:-1:-1;;;;4071:2:1;4056:18;;4043:32;;4122:2;4107:18;4094:32;;3741:391::o;4137:683::-;4232:6;4240;4248;4301:2;4289:9;4280:7;4276:23;4272:32;4269:52;;;4317:1;4314;4307:12;4269:52;4340:23;;;-1:-1:-1;4414:2:1;4399:18;;4386:32;-1:-1:-1;;;;;4467:14:1;;;4464:34;;;4494:1;4491;4484:12;4464:34;4532:6;4521:9;4517:22;4507:32;;4577:7;4570:4;4566:2;4562:13;4558:27;4548:55;;4599:1;4596;4589:12;4548:55;4639:2;4626:16;4665:2;4657:6;4654:14;4651:34;;;4681:1;4678;4671:12;4651:34;4734:7;4729:2;4719:6;4716:1;4712:14;4708:2;4704:23;4700:32;4697:45;4694:65;;;4755:1;4752;4745:12;4694:65;4786:2;4782;4778:11;4768:21;;4808:6;4798:16;;;;;4137:683;;;;;:::o;4825:248::-;4893:6;4901;4954:2;4942:9;4933:7;4929:23;4925:32;4922:52;;;4970:1;4967;4960:12;4922:52;-1:-1:-1;;4993:23:1;;;5063:2;5048:18;;;5035:32;;-1:-1:-1;4825:248:1:o;5078:245::-;5157:6;5165;5218:2;5206:9;5197:7;5193:23;5189:32;5186:52;;;5234:1;5231;5224:12;5186:52;-1:-1:-1;;5257:16:1;;5313:2;5298:18;;;5292:25;5257:16;;5292:25;;-1:-1:-1;5078:245:1:o;5328:454::-;5423:6;5431;5439;5447;5455;5508:3;5496:9;5487:7;5483:23;5479:33;5476:53;;;5525:1;5522;5515:12;5476:53;-1:-1:-1;;5548:23:1;;;5618:2;5603:18;;5590:32;;-1:-1:-1;5669:2:1;5654:18;;5641:32;;5720:2;5705:18;;5692:32;;-1:-1:-1;5771:3:1;5756:19;5743:33;;-1:-1:-1;5328:454:1;-1:-1:-1;5328:454:1:o;5787:523::-;5891:6;5899;5907;5915;5923;5931;5984:3;5972:9;5963:7;5959:23;5955:33;5952:53;;;6001:1;5998;5991:12;5952:53;-1:-1:-1;;6024:23:1;;;6094:2;6079:18;;6066:32;;-1:-1:-1;6145:2:1;6130:18;;6117:32;;6196:2;6181:18;;6168:32;;-1:-1:-1;6247:3:1;6232:19;;6219:33;;-1:-1:-1;6299:3:1;6284:19;6271:33;;-1:-1:-1;5787:523:1;-1:-1:-1;5787:523:1:o;6315:274::-;6444:3;6482:6;6476:13;6498:53;6544:6;6539:3;6532:4;6524:6;6520:17;6498:53;:::i;:::-;6567:16;;;;;6315:274;-1:-1:-1;;6315:274:1:o;6594:203::-;-1:-1:-1;;;;;6758:32:1;;;;6740:51;;6728:2;6713:18;;6594:203::o;7182:332::-;-1:-1:-1;;;;;7432:32:1;;;;7414:51;;7496:2;7481:18;;7474:34;7402:2;7387:18;;7182:332::o;9391:383::-;9540:2;9529:9;9522:21;9503:4;9572:6;9566:13;9615:6;9610:2;9599:9;9595:18;9588:34;9631:66;9690:6;9685:2;9674:9;9670:18;9665:2;9657:6;9653:15;9631:66;:::i;:::-;9758:2;9737:15;-1:-1:-1;;9733:29:1;9718:45;;;;9765:2;9714:54;;9391:383;-1:-1:-1;;9391:383:1:o;9779:334::-;9981:2;9963:21;;;10020:2;10000:18;;;9993:30;-1:-1:-1;;;10054:2:1;10039:18;;10032:40;10104:2;10089:18;;9779:334::o;10118:350::-;10320:2;10302:21;;;10359:2;10339:18;;;10332:30;-1:-1:-1;;;10393:2:1;10378:18;;10371:56;10459:2;10444:18;;10118:350::o;10810:340::-;11012:2;10994:21;;;11051:2;11031:18;;;11024:30;-1:-1:-1;;;11085:2:1;11070:18;;11063:46;11141:2;11126:18;;10810:340::o;12331:::-;12533:2;12515:21;;;12572:2;12552:18;;;12545:30;-1:-1:-1;;;12606:2:1;12591:18;;12584:46;12662:2;12647:18;;12331:340::o;12676:::-;12878:2;12860:21;;;12917:2;12897:18;;;12890:30;-1:-1:-1;;;12951:2:1;12936:18;;12929:46;13007:2;12992:18;;12676:340::o;13021:::-;13223:2;13205:21;;;13262:2;13242:18;;;13235:30;-1:-1:-1;;;13296:2:1;13281:18;;13274:46;13352:2;13337:18;;13021:340::o;13366:475::-;13568:2;13550:21;;;13607:2;13587:18;;;13580:30;-1:-1:-1;;;;;;;;;;;13641:2:1;13626:18;;13619:62;13717:34;13712:2;13697:18;;13690:62;-1:-1:-1;;;13783:3:1;13768:19;;13761:38;13831:3;13816:19;;13366:475::o;14265:339::-;14467:2;14449:21;;;14506:2;14486:18;;;14479:30;-1:-1:-1;;;14540:2:1;14525:18;;14518:45;14595:2;14580:18;;14265:339::o;15362:350::-;15564:2;15546:21;;;15603:2;15583:18;;;15576:30;-1:-1:-1;;;15637:2:1;15622:18;;15615:56;15703:2;15688:18;;15362:350::o;16066:339::-;16268:2;16250:21;;;16307:2;16287:18;;;16280:30;-1:-1:-1;;;16341:2:1;16326:18;;16319:45;16396:2;16381:18;;16066:339::o;16410:340::-;16612:2;16594:21;;;16651:2;16631:18;;;16624:30;-1:-1:-1;;;16685:2:1;16670:18;;16663:46;16741:2;16726:18;;16410:340::o;17096:338::-;17298:2;17280:21;;;17337:2;17317:18;;;17310:30;-1:-1:-1;;;17371:2:1;17356:18;;17349:44;17425:2;17410:18;;17096:338::o;17439:342::-;17641:2;17623:21;;;17680:2;17660:18;;;17653:30;-1:-1:-1;;;17714:2:1;17699:18;;17692:48;17772:2;17757:18;;17439:342::o;17786:415::-;17988:2;17970:21;;;18027:2;18007:18;;;18000:30;18066:34;18061:2;18046:18;;18039:62;-1:-1:-1;;;18132:2:1;18117:18;;18110:49;18191:3;18176:19;;17786:415::o;20009:337::-;20211:2;20193:21;;;20250:2;20230:18;;;20223:30;-1:-1:-1;;;20284:2:1;20269:18;;20262:43;20337:2;20322:18;;20009:337::o;21231:256::-;21413:25;;;21469:2;21454:18;;21447:34;21401:2;21386:18;;21231:256::o;21934:128::-;21974:3;22005:1;22001:6;21998:1;21995:13;21992:39;;;22011:18;;:::i;:::-;-1:-1:-1;22047:9:1;;21934:128::o;22067:120::-;22107:1;22133;22123:35;;22138:18;;:::i;:::-;-1:-1:-1;22172:9:1;;22067:120::o;22192:168::-;22232:7;22298:1;22294;22290:6;22286:14;22283:1;22280:21;22275:1;22268:9;22261:17;22257:45;22254:71;;;22305:18;;:::i;:::-;-1:-1:-1;22345:9:1;;22192:168::o;22365:125::-;22405:4;22433:1;22430;22427:8;22424:34;;;22438:18;;:::i;:::-;-1:-1:-1;22475:9:1;;22365:125::o;22495:258::-;22567:1;22577:113;22591:6;22588:1;22585:13;22577:113;;;22667:11;;;22661:18;22648:11;;;22641:39;22613:2;22606:10;22577:113;;;22708:6;22705:1;22702:13;22699:48;;;-1:-1:-1;;22743:1:1;22725:16;;22718:27;22495:258::o;22758:380::-;22837:1;22833:12;;;;22880;;;22901:61;;22955:4;22947:6;22943:17;22933:27;;22901:61;23008:2;23000:6;22997:14;22977:18;22974:38;22971:161;;;23054:10;23049:3;23045:20;23042:1;23035:31;23089:4;23086:1;23079:15;23117:4;23114:1;23107:15;22971:161;;22758:380;;;:::o;23143:135::-;23182:3;-1:-1:-1;;23203:17:1;;23200:43;;;23223:18;;:::i;:::-;-1:-1:-1;23270:1:1;23259:13;;23143:135::o;23283:112::-;23315:1;23341;23331:35;;23346:18;;:::i;:::-;-1:-1:-1;23380:9:1;;23283:112::o;23400:127::-;23461:10;23456:3;23452:20;23449:1;23442:31;23492:4;23489:1;23482:15;23516:4;23513:1;23506:15;23532:127;23593:10;23588:3;23584:20;23581:1;23574:31;23624:4;23621:1;23614:15;23648:4;23645:1;23638:15;23664:127;23725:10;23720:3;23716:20;23713:1;23706:31;23756:4;23753:1;23746:15;23780:4;23777:1;23770:15;23928:118;24014:5;24007:13;24000:21;23993:5;23990:32;23980:60;;24036:1;24033;24026:12;23980:60;23928:118;:::o

Swarm Source

ipfs://e820958d79af7372991cedfecfc73b17b1b4c78e3732ea480863c5515ad2a90b
Block Transaction Gas Used Reward
Age Block Fee Address BC Fee Address Voting Power Jailed Incoming
Block Uncle Number Difficulty Gas Used Reward
Loading
Loading
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.