ETH Price: $3,268.79 (+4.97%)
 

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Approve173293942023-05-24 13:38:59617 days ago1684935539IN
0xEd48FC5C...6A0fc3660
0 ETH0.0015820865.50796839
Exit Pool123486222021-05-01 13:38:201370 days ago1619876300IN
0xEd48FC5C...6A0fc3660
0 ETH0.0046691729
Approve122459612021-04-15 17:17:441386 days ago1618507064IN
0xEd48FC5C...6A0fc3660
0 ETH0.0032040169
Exit Pool122397842021-04-14 18:19:201387 days ago1618424360IN
0xEd48FC5C...6A0fc3660
0 ETH0.02388529143
Exitswap Pool Am...122187402021-04-11 12:56:371390 days ago1618145797IN
0xEd48FC5C...6A0fc3660
0 ETH0.0079915783
Approve121957402021-04-07 23:40:301393 days ago1617838830IN
0xEd48FC5C...6A0fc3660
0 ETH0.00609606137.5
Approve121942602021-04-07 18:17:481394 days ago1617819468IN
0xEd48FC5C...6A0fc3660
0 ETH0.00625123141
Approve121940352021-04-07 17:31:311394 days ago1617816691IN
0xEd48FC5C...6A0fc3660
0 ETH0.00731527165
Exit Pool121878152021-04-06 18:26:581395 days ago1617733618IN
0xEd48FC5C...6A0fc3660
0 ETH0.03073352184
Exit Pool121797712021-04-05 12:52:381396 days ago1617627158IN
0xEd48FC5C...6A0fc3660
0 ETH0.0233842140
Exit Pool121359792021-03-29 19:17:521403 days ago1617045472IN
0xEd48FC5C...6A0fc3660
0 ETH0.03496138230
Exit Pool121271912021-03-28 10:53:131404 days ago1616928793IN
0xEd48FC5C...6A0fc3660
0 ETH0.0167456592
Exit Pool121269982021-03-28 10:04:091404 days ago1616925849IN
0xEd48FC5C...6A0fc3660
0 ETH0.0121614480.00000145
Approve121261552021-03-28 7:04:321404 days ago1616915072IN
0xEd48FC5C...6A0fc3660
0 ETH0.002010880.00000134
Approve121261532021-03-28 7:04:091404 days ago1616915049IN
0xEd48FC5C...6A0fc3660
0 ETH0.003546880.00000134
Exit Pool121249312021-03-28 2:26:221404 days ago1616898382IN
0xEd48FC5C...6A0fc3660
0 ETH0.0140299384.00000145
Approve121221092021-03-27 16:17:401405 days ago1616861860IN
0xEd48FC5C...6A0fc3660
0 ETH0.00802463181
Approve121219192021-03-27 15:33:191405 days ago1616859199IN
0xEd48FC5C...6A0fc3660
0 ETH0.00554187125
Approve121218072021-03-27 15:08:141405 days ago1616857694IN
0xEd48FC5C...6A0fc3660
0 ETH0.00580788131
Approve121217192021-03-27 14:50:001405 days ago1616856600IN
0xEd48FC5C...6A0fc3660
0 ETH0.00536453121
Approve121216302021-03-27 14:31:221405 days ago1616855482IN
0xEd48FC5C...6A0fc3660
0 ETH0.00492118111
Approve121211582021-03-27 12:48:331405 days ago1616849313IN
0xEd48FC5C...6A0fc3660
0 ETH0.00447783101
Approve121210072021-03-27 12:14:391405 days ago1616847279IN
0xEd48FC5C...6A0fc3660
0 ETH0.0043891699

Latest 1 internal transaction

Advanced mode:
Parent Transaction Hash Block
From
To
121138382021-03-26 9:34:351406 days ago1616751275  Contract Creation0 ETH
Loading...
Loading

Similar Match Source Code
This contract matches the deployed Bytecode of the Source Code for Contract 0x9436c214...Bee3F868d
The constructor portion of the code might be different and could alter the actual behaviour of the contract

Contract Name:
XPool

Compiler Version
v0.5.17+commit.d19bba13

Optimization Enabled:
Yes with 200 runs

Other Settings:
istanbul EvmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2021-03-13
*/

// File: contracts/XVersion.sol

pragma solidity 0.5.17;

contract XVersion {
    function getVersion() external view returns (bytes32);
}

contract XApollo is XVersion {
    function getVersion() external view returns (bytes32) {
        return bytes32("APOLLO");
    }
}

// File: contracts/XConst.sol

pragma solidity 0.5.17;

contract XConst {
    uint256 public constant BONE = 10**18;

    uint256 public constant MIN_BOUND_TOKENS = 2;
    uint256 public constant MAX_BOUND_TOKENS = 8;

    uint256 public constant EXIT_ZERO_FEE = 0;

    uint256 public constant MIN_WEIGHT = BONE;
    uint256 public constant MAX_WEIGHT = BONE * 50;
    uint256 public constant MAX_TOTAL_WEIGHT = BONE * 50;

    // min effective value: 0.000001 TOKEN
    uint256 public constant MIN_BALANCE = 10**6;

    // BONE/(10**10) XPT
    uint256 public constant MIN_POOL_AMOUNT = 10**8;

    uint256 public constant INIT_POOL_SUPPLY = BONE * 100;

    uint256 public constant MAX_IN_RATIO = BONE / 2;
    uint256 public constant MAX_OUT_RATIO = (BONE / 3) + 1 wei;
}

// File: contracts/lib/XNum.sol

pragma solidity 0.5.17;

library XNum {
    uint256 public constant BONE = 10**18;
    uint256 public constant MIN_BPOW_BASE = 1 wei;
    uint256 public constant MAX_BPOW_BASE = (2 * BONE) - 1 wei;
    uint256 public constant BPOW_PRECISION = BONE / 10**10;

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

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

    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 (uint256, 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 + (BONE / 2);
        require(c1 >= c0, "ERR_MUL_OVERFLOW");
        uint256 c2 = c1 / BONE;
        return c2;
    }

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

    // DSMath.wpow
    function bpowi(uint256 a, uint256 n) internal pure returns (uint256) {
        uint256 z = n % 2 != 0 ? a : BONE;

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

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

    // Compute b^(e.w) by splitting it into (b^e)*(b^0.w).
    // Use `bpowi` for `b^e` and `bpowK` for k iterations
    // of approximation of b^0.w
    function bpow(uint256 base, uint256 exp) internal pure returns (uint256) {
        require(base >= MIN_BPOW_BASE, "ERR_BPOW_BASE_TOO_LOW");
        require(base <= MAX_BPOW_BASE, "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, BPOW_PRECISION);
        return bmul(wholePow, partialResult);
    }

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

        // term(k) = numer / denom
        //         = (product(a - i + 1, i=1-->k) * x^k) / (k!)
        // each iteration, multiply previous term by (a-(k-1)) * x / k
        // continue until term is less than precision
        for (uint256 i = 1; term >= precision; i++) {
            uint256 bigK = i * BONE;
            (uint256 c, bool cneg) = bsubSign(a, bsub(bigK, BONE));
            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;
    }
}

// File: contracts/interface/IERC20.sol

pragma solidity 0.5.17;

interface IERC20 {
    function name() external view returns (string memory);

    function symbol() external view returns (string memory);

    function decimals() external view returns (uint8);

    function totalSupply() external view returns (uint256);

    function balanceOf(address _owner) external view returns (uint256 balance);

    function transfer(address _to, uint256 _value)
        external
        returns (bool success);

    function transferFrom(
        address _from,
        address _to,
        uint256 _value
    ) external returns (bool success);

    function approve(address _spender, uint256 _value)
        external
        returns (bool success);

    function allowance(address _owner, address _spender)
        external
        view
        returns (uint256 remaining);
}

// File: contracts/XPToken.sol

pragma solidity 0.5.17;




// Highly opinionated token implementation
contract XTokenBase {
    using XNum for uint256;

    mapping(address => uint256) internal _balance;
    mapping(address => mapping(address => uint256)) internal _allowance;
    uint256 internal _totalSupply;

    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)] = (_balance[address(this)]).badd(amt);
        _totalSupply = _totalSupply.badd(amt);
        emit Transfer(address(0), address(this), amt);
    }

    function _burn(uint256 amt) internal {
        require(_balance[address(this)] >= amt, "ERR_INSUFFICIENT_BAL");
        _balance[address(this)] = (_balance[address(this)]).bsub(amt);
        _totalSupply = _totalSupply.bsub(amt);
        emit Transfer(address(this), address(0), amt);
    }

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

contract XPToken is XTokenBase, IERC20, XApollo {
    using XNum for uint256;

    string private constant _name = "XDeFi Pool Token";
    string private constant _symbol = "XPT";
    uint8 private constant _decimals = 18;

    function name() external view returns (string memory) {
        return _name;
    }

    function symbol() external view returns (string memory) {
        return _symbol;
    }

    function decimals() external view returns (uint8) {
        return _decimals;
    }

    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 totalSupply() public view returns (uint256) {
        return _totalSupply;
    }

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

    function transfer(address dst, uint256 amt) external returns (bool) {
        _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],
            "ERR_BTOKEN_BAD_CALLER"
        );
        _move(src, dst, amt);
        if (msg.sender != src && _allowance[src][msg.sender] != uint256(-1)) {
            _allowance[src][msg.sender] = (_allowance[src][msg.sender]).bsub(
                amt
            );
            emit Approval(msg.sender, dst, _allowance[src][msg.sender]);
        }
        return true;
    }
}

// File: contracts/lib/XMath.sol

// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.

// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
// GNU General Public License for more details.

// You should have received a copy of the GNU General Public License
// along with this program.  If not, see <http://www.gnu.org/licenses/>.

pragma solidity 0.5.17;


library XMath {
    using XNum for uint256;

    uint256 public constant BONE = 10**18;
    uint256 public constant EXIT_ZERO_FEE = 0;

    /**********************************************************************************************
    // calcSpotPrice                                                                             //
    // sP = spotPrice                                                                            //
    // bI = tokenBalanceIn                ( bI / wI )         1                                  //
    // bO = tokenBalanceOut         sP =  -----------  *  ----------                             //
    // wI = tokenWeightIn                 ( bO / wO )     ( 1 - sF )                             //
    // wO = tokenWeightOut                                                                       //
    // sF = swapFee                                                                              //
    **********************************************************************************************/
    function calcSpotPrice(
        uint256 tokenBalanceIn,
        uint256 tokenWeightIn,
        uint256 tokenBalanceOut,
        uint256 tokenWeightOut,
        uint256 swapFee
    ) public pure returns (uint256 spotPrice) {
        uint256 numer = tokenBalanceIn.bdiv(tokenWeightIn);
        uint256 denom = tokenBalanceOut.bdiv(tokenWeightOut);
        uint256 ratio = numer.bdiv(denom);
        uint256 scale = BONE.bdiv(BONE.bsub(swapFee));
        return (spotPrice = ratio.bmul(scale));
    }

    /**********************************************************************************************
    // calcOutGivenIn                                                                            //
    // aO = tokenAmountOut                                                                       //
    // bO = tokenBalanceOut                                                                      //
    // bI = tokenBalanceIn              /      /            bI             \    (wI / wO) \      //
    // aI = tokenAmountIn    aO = bO * |  1 - | --------------------------  | ^            |     //
    // wI = tokenWeightIn               \      \ ( bI + ( aI * ( 1 - sF )) /              /      //
    // wO = tokenWeightOut                                                                       //
    // sF = swapFee                                                                              //
    **********************************************************************************************/
    function calcOutGivenIn(
        uint256 tokenBalanceIn,
        uint256 tokenWeightIn,
        uint256 tokenBalanceOut,
        uint256 tokenWeightOut,
        uint256 tokenAmountIn,
        uint256 swapFee
    ) public pure returns (uint256 tokenAmountOut) {
        uint256 weightRatio;
        if (tokenWeightIn == tokenWeightOut) {
            weightRatio = 1 * BONE;
        } else if (tokenWeightIn >> 1 == tokenWeightOut) {
            weightRatio = 2 * BONE;
        } else {
            weightRatio = tokenWeightIn.bdiv(tokenWeightOut);
        }
        uint256 adjustedIn = BONE.bsub(swapFee);
        adjustedIn = tokenAmountIn.bmul(adjustedIn);
        uint256 y = tokenBalanceIn.bdiv(tokenBalanceIn.badd(adjustedIn));
        uint256 foo;
        if (tokenWeightIn == tokenWeightOut) {
            foo = y;
        } else if (tokenWeightIn >> 1 == tokenWeightOut) {
            foo = y.bmul(y);
        } else {
            foo = y.bpow(weightRatio);
        }
        uint256 bar = BONE.bsub(foo);
        tokenAmountOut = tokenBalanceOut.bmul(bar);
        return tokenAmountOut;
    }

    /**********************************************************************************************
    // calcInGivenOut                                                                            //
    // aI = tokenAmountIn                                                                        //
    // bO = tokenBalanceOut               /  /     bO      \    (wO / wI)      \                 //
    // bI = tokenBalanceIn          bI * |  | ------------  | ^            - 1  |                //
    // aO = tokenAmountOut    aI =        \  \ ( bO - aO ) /                   /                 //
    // wI = tokenWeightIn           --------------------------------------------                 //
    // wO = tokenWeightOut                          ( 1 - sF )                                   //
    // sF = swapFee                                                                              //
    **********************************************************************************************/
    function calcInGivenOut(
        uint256 tokenBalanceIn,
        uint256 tokenWeightIn,
        uint256 tokenBalanceOut,
        uint256 tokenWeightOut,
        uint256 tokenAmountOut,
        uint256 swapFee
    ) public pure returns (uint256 tokenAmountIn) {
        uint256 weightRatio;
        if (tokenWeightOut == tokenWeightIn) {
            weightRatio = 1 * BONE;
        } else if (tokenWeightOut >> 1 == tokenWeightIn) {
            weightRatio = 2 * BONE;
        } else {
            weightRatio = tokenWeightOut.bdiv(tokenWeightIn);
        }
        uint256 diff = tokenBalanceOut.bsub(tokenAmountOut);
        uint256 y = tokenBalanceOut.bdiv(diff);
        uint256 foo;
        if (tokenWeightOut == tokenWeightIn) {
            foo = y;
        } else if (tokenWeightOut >> 1 == tokenWeightIn) {
            foo = y.bmul(y);
        } else {
            foo = y.bpow(weightRatio);
        }
        foo = foo.bsub(BONE);
        tokenAmountIn = BONE.bsub(swapFee);
        tokenAmountIn = tokenBalanceIn.bmul(foo).bdiv(tokenAmountIn);
        return tokenAmountIn;
    }

    /**********************************************************************************************
    // calcPoolOutGivenSingleIn                                                                  //
    // pAo = poolAmountOut         /                                              \              //
    // tAi = tokenAmountIn        ///      /     //    wI \      \\       \     wI \             //
    // wI = tokenWeightIn        //| tAi *| 1 - || 1 - --  | * sF || + tBi \    --  \            //
    // tW = totalWeight     pAo=||  \      \     \\    tW /      //         | ^ tW   | * pS - pS //
    // tBi = tokenBalanceIn      \\  ------------------------------------- /        /            //
    // pS = poolSupply            \\                    tBi               /        /             //
    // sF = swapFee                \                                              /              //
    **********************************************************************************************/
    function calcPoolOutGivenSingleIn(
        uint256 tokenBalanceIn,
        uint256 tokenWeightIn,
        uint256 poolSupply,
        uint256 totalWeight,
        uint256 tokenAmountIn,
        uint256 swapFee
    ) public pure returns (uint256 poolAmountOut) {
        // Charge the trading fee for the proportion of tokenAi
        ///  which is implicitly traded to the other pool tokens.
        // That proportion is (1- weightTokenIn)
        // tokenAiAfterFee = tAi * (1 - (1-weightTi) * poolFee);
        uint256 normalizedWeight = tokenWeightIn.bdiv(totalWeight);
        uint256 zaz = BONE.bsub(normalizedWeight).bmul(swapFee);
        uint256 tokenAmountInAfterFee = tokenAmountIn.bmul(BONE.bsub(zaz));

        uint256 newTokenBalanceIn = tokenBalanceIn.badd(tokenAmountInAfterFee);
        uint256 tokenInRatio = newTokenBalanceIn.bdiv(tokenBalanceIn);

        // uint newPoolSupply = (ratioTi ^ weightTi) * poolSupply;
        uint256 poolRatio = tokenInRatio.bpow(normalizedWeight);
        uint256 newPoolSupply = poolRatio.bmul(poolSupply);
        poolAmountOut = newPoolSupply.bsub(poolSupply);
        return poolAmountOut;
    }

    /**********************************************************************************************
    // calcSingleOutGivenPoolIn                                                                  //
    // tAo = tokenAmountOut            /      /                                             \\   //
    // bO = tokenBalanceOut           /      // pS - (pAi * (1 - eF)) \     /    1    \      \\  //
    // pAi = poolAmountIn            | bO - || ----------------------- | ^ | --------- | * b0 || //
    // ps = poolSupply                \      \\          pS           /     \(wO / tW)/      //  //
    // wI = tokenWeightIn      tAo =   \      \                                             //   //
    // tW = totalWeight                    /     /      wO \       \                             //
    // sF = swapFee                    *  | 1 - |  1 - ---- | * sF  |                            //
    // eF = exitFee                        \     \      tW /       /                             //
    **********************************************************************************************/
    function calcSingleOutGivenPoolIn(
        uint256 tokenBalanceOut,
        uint256 tokenWeightOut,
        uint256 poolSupply,
        uint256 totalWeight,
        uint256 poolAmountIn,
        uint256 swapFee
    ) public pure returns (uint256 tokenAmountOut) {
        uint256 normalizedWeight = tokenWeightOut.bdiv(totalWeight);
        // charge exit fee on the pool token side
        // pAiAfterExitFee = pAi*(1-exitFee)
        uint256 poolAmountInAfterExitFee =
            poolAmountIn.bmul(BONE.bsub(EXIT_ZERO_FEE));
        uint256 newPoolSupply = poolSupply.bsub(poolAmountInAfterExitFee);
        uint256 poolRatio = newPoolSupply.bdiv(poolSupply);

        // newBalTo = poolRatio^(1/weightTo) * balTo;
        uint256 tokenOutRatio = poolRatio.bpow(BONE.bdiv(normalizedWeight));
        uint256 newTokenBalanceOut = tokenOutRatio.bmul(tokenBalanceOut);

        uint256 tokenAmountOutBeforeSwapFee =
            tokenBalanceOut.bsub(newTokenBalanceOut);

        // charge swap fee on the output token side
        //uint tAo = tAoBeforeSwapFee * (1 - (1-weightTo) * swapFee)
        uint256 zaz = BONE.bsub(normalizedWeight).bmul(swapFee);
        tokenAmountOut = tokenAmountOutBeforeSwapFee.bmul(BONE.bsub(zaz));
        return tokenAmountOut;
    }
}

// File: contracts/interface/IXConfig.sol

pragma solidity 0.5.17;

interface IXConfig {
    function getCore() external view returns (address);

    function getSAFU() external view returns (address);

    function getMaxExitFee() external view returns (uint256);

    function getSafuFee() external view returns (uint256);

    function getSwapProxy() external view returns (address);

    function dedupPool(address[] calldata tokens, uint256[] calldata denorms)
        external
        returns (bool exist, bytes32 sig);

    function addPoolSig(bytes32 sig, address pool) external;
}

// File: contracts/XPool.sol

pragma solidity 0.5.17;







contract XPool is XApollo, XPToken, XConst {
    using XNum for uint256;

    //Swap Fees: 0.1%, 0.25%, 1%, 2.5%, 10%
    uint256[5] public SWAP_FEES = [
        BONE / 1000,
        (25 * BONE) / 10000,
        BONE / 100,
        (25 * BONE) / 1000,
        BONE / 10
    ];

    struct Record {
        bool bound; // is token bound to pool
        uint256 index; // private
        uint256 denorm; // denormalized weight
        uint256 balance;
    }

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

    event LOG_REFER(
        address indexed caller,
        address indexed ref,
        address indexed tokenIn,
        uint256 fee
    );

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

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

    event LOG_BIND(
        address indexed caller,
        address indexed token,
        uint256 denorm,
        uint256 balance
    );

    event LOG_UPDATE_SAFU(address indexed safu, uint256 fee);

    event LOG_EXIT_FEE(uint256 fee);

    event LOG_FINAL(uint256 swapFee);

    event SET_CONTROLLER(address indexed manager);

    event UPDATE_FARM(address indexed caller, bool isFarm);

    // anonymous event
    event LOG_CALL(
        bytes4 indexed sig,
        address indexed caller,
        bytes data
    ) anonymous;

    modifier _logs_() {
        emit LOG_CALL(msg.sig, msg.sender, msg.data);
        _;
    }

    modifier _lock_() {
        require(!_mutex, "ERR_REENTRY");
        _mutex = true;
        _;
        _mutex = false;
    }

    modifier _viewlock_() {
        require(!_mutex, "ERR_REENTRY");
        _;
    }

    bool private _mutex;

    address public controller; // has CONTROL role

    // `finalize` require CONTROL, `finalize` sets `can SWAP and can JOIN`
    bool public finalized;

    uint256 public swapFee;
    uint256 public exitFee;

    // Pool Governance
    address public SAFU;
    uint256 public safuFee;
    bool public isFarmPool;

    address[] internal _tokens;
    mapping(address => Record) internal _records;
    uint256 private _totalWeight;

    IXConfig public xconfig;
    address public origin;

    constructor(address _xconfig, address _controller) public {
        controller = _controller;
        origin = tx.origin;
        swapFee = SWAP_FEES[1];
        exitFee = EXIT_ZERO_FEE;
        finalized = false;
        xconfig = IXConfig(_xconfig);
        SAFU = xconfig.getSAFU();
        safuFee = xconfig.getSafuFee();
    }

    function isBound(address t) external view returns (bool) {
        return _records[t].bound;
    }

    function getNumTokens() external view returns (uint256) {
        return _tokens.length;
    }

    function getFinalTokens()
        external
        view
        _viewlock_
        returns (address[] memory tokens)
    {
        require(finalized, "ERR_NOT_FINALIZED");
        return _tokens;
    }

    function getDenormalizedWeight(address token)
        external
        view
        _viewlock_
        returns (uint256)
    {
        require(_records[token].bound, "ERR_NOT_BOUND");
        return _records[token].denorm;
    }

    function getTotalDenormalizedWeight()
        external
        view
        _viewlock_
        returns (uint256)
    {
        return _totalWeight;
    }

    function getNormalizedWeight(address token)
        external
        view
        _viewlock_
        returns (uint256)
    {
        require(_records[token].bound, "ERR_NOT_BOUND");
        uint256 denorm = _records[token].denorm;
        return denorm.bdiv(_totalWeight);
    }

    function getBalance(address token)
        external
        view
        _viewlock_
        returns (uint256)
    {
        require(_records[token].bound, "ERR_NOT_BOUND");
        return _records[token].balance;
    }

    function setController(address manager) external _logs_ {
        require(msg.sender == controller, "ERR_NOT_CONTROLLER");
        require(manager != address(0), "ERR_ZERO_ADDR");
        controller = manager;
        emit SET_CONTROLLER(manager);
    }

    function setExitFee(uint256 fee) external {
        require(!finalized, "ERR_IS_FINALIZED");
        require(msg.sender == controller, "ERR_NOT_CONTROLLER");
        require(fee <= xconfig.getMaxExitFee(), "INVALID_EXIT_FEE");
        exitFee = fee;
        emit LOG_EXIT_FEE(fee);
    }

    // allow SAFU address and SAFE FEE be updated by xconfig
    function updateSafu(address safu, uint256 fee) external {
        require(msg.sender == address(xconfig), "ERR_NOT_CONFIG");
        require(safu != address(0), "ERR_ZERO_ADDR");
        SAFU = safu;
        safuFee = fee;

        emit LOG_UPDATE_SAFU(safu, fee);
    }

    // allow isFarmPool be updated by xconfig
    function updateFarm(bool isFarm) external {
        require(msg.sender == address(xconfig), "ERR_NOT_CONFIG");
        isFarmPool = isFarm;
        emit UPDATE_FARM(msg.sender, isFarm);
    }

    function bind(address token, uint256 denorm) external _lock_ {
        require(msg.sender == controller, "ERR_NOT_CONTROLLER");
        require(!_records[token].bound, "ERR_IS_BOUND");
        require(!finalized, "ERR_IS_FINALIZED");

        require(_tokens.length < MAX_BOUND_TOKENS, "ERR_MAX_TOKENS");

        require(denorm >= MIN_WEIGHT, "ERR_MIN_WEIGHT");
        require(denorm <= MAX_WEIGHT, "ERR_MAX_WEIGHT");

        uint256 balance = IERC20(token).balanceOf(address(this));

        uint256 decimal = 10**uint256(IERC20(token).decimals());
        require(decimal >= 10**6, "ERR_TOO_SMALL");

        // 0.000001 TOKEN
        require(balance >= decimal / MIN_BALANCE, "ERR_MIN_BALANCE");

        _totalWeight = _totalWeight.badd(denorm);
        require(_totalWeight <= MAX_TOTAL_WEIGHT, "ERR_MAX_TOTAL_WEIGHT");

        _records[token] = Record({
            bound: true,
            index: _tokens.length,
            denorm: denorm,
            balance: balance
        });
        _tokens.push(token);

        emit LOG_BIND(msg.sender, token, denorm, balance);
    }

    // _swapFee must be one of SWAP_FEES
    function finalize(uint256 _swapFee) external _lock_ {
        require(msg.sender == controller, "ERR_NOT_CONTROLLER");
        require(!finalized, "ERR_IS_FINALIZED");
        require(_tokens.length >= MIN_BOUND_TOKENS, "ERR_MIN_TOKENS");
        require(_tokens.length <= MAX_BOUND_TOKENS, "ERR_MAX_TOKENS");

        require(_swapFee >= SWAP_FEES[0], "ERR_MIN_FEE");
        require(_swapFee <= SWAP_FEES[SWAP_FEES.length - 1], "ERR_MAX_FEE");

        bool found = false;
        for (uint256 i = 0; i < SWAP_FEES.length; i++) {
            if (_swapFee == SWAP_FEES[i]) {
                found = true;
                break;
            }
        }
        require(found, "ERR_INVALID_SWAP_FEE");
        swapFee = _swapFee;

        finalized = true;

        _mintPoolShare(INIT_POOL_SUPPLY);
        _pushPoolShare(msg.sender, INIT_POOL_SUPPLY);

        emit LOG_FINAL(swapFee);
    }

    // Absorb any tokens that have been sent to this contract into the pool
    function gulp(address token) external _logs_ _lock_ {
        require(_records[token].bound, "ERR_NOT_BOUND");
        _records[token].balance = IERC20(token).balanceOf(address(this));
    }

    function getSpotPrice(address tokenIn, address tokenOut)
        external
        view
        _viewlock_
        returns (uint256 spotPrice)
    {
        require(_records[tokenIn].bound, "ERR_NOT_BOUND");
        require(_records[tokenOut].bound, "ERR_NOT_BOUND");
        Record storage inRecord = _records[tokenIn];
        Record storage outRecord = _records[tokenOut];
        return
            XMath.calcSpotPrice(
                inRecord.balance,
                inRecord.denorm,
                outRecord.balance,
                outRecord.denorm,
                swapFee
            );
    }

    function getSpotPriceSansFee(address tokenIn, address tokenOut)
        external
        view
        _viewlock_
        returns (uint256 spotPrice)
    {
        require(_records[tokenIn].bound, "ERR_NOT_BOUND");
        require(_records[tokenOut].bound, "ERR_NOT_BOUND");
        Record storage inRecord = _records[tokenIn];
        Record storage outRecord = _records[tokenOut];
        return
            XMath.calcSpotPrice(
                inRecord.balance,
                inRecord.denorm,
                outRecord.balance,
                outRecord.denorm,
                0
            );
    }

    function joinPool(uint256 poolAmountOut, uint256[] calldata maxAmountsIn)
        external
        _lock_
    {
        require(finalized, "ERR_NOT_FINALIZED");
        require(maxAmountsIn.length == _tokens.length, "ERR_LENGTH_MISMATCH");

        uint256 poolTotal = totalSupply();
        uint256 ratio = poolAmountOut.bdiv(poolTotal);
        require(ratio != 0, "ERR_MATH_APPROX");

        for (uint256 i = 0; i < _tokens.length; i++) {
            address t = _tokens[i];
            uint256 bal = _records[t].balance;
            uint256 tokenAmountIn = ratio.bmul(bal);
            require(tokenAmountIn != 0, "ERR_MATH_APPROX");
            require(tokenAmountIn <= maxAmountsIn[i], "ERR_LIMIT_IN");
            _records[t].balance = (_records[t].balance).badd(tokenAmountIn);
            emit LOG_JOIN(msg.sender, t, tokenAmountIn);
            _pullUnderlying(t, msg.sender, tokenAmountIn);
        }
        _mintPoolShare(poolAmountOut);
        _pushPoolShare(msg.sender, poolAmountOut);
    }

    function exitPool(uint256 poolAmountIn, uint256[] calldata minAmountsOut)
        external
        _lock_
    {
        require(finalized, "ERR_NOT_FINALIZED");
        require(minAmountsOut.length == _tokens.length, "ERR_LENGTH_MISMATCH");

        // min pool amount
        require(poolAmountIn >= MIN_POOL_AMOUNT, "ERR_MIN_AMOUNT");

        uint256 poolTotal = totalSupply();
        uint256 _exitFee = poolAmountIn.bmul(exitFee);

        // never charge exitFee to pool origin
        if (msg.sender == origin) {
            _exitFee = 0;
        }
        uint256 pAiAfterExitFee = poolAmountIn.bsub(_exitFee);
        uint256 ratio = pAiAfterExitFee.bdiv(poolTotal);
        require(ratio != 0, "ERR_MATH_APPROX");

        _pullPoolShare(msg.sender, poolAmountIn);
        // send exitFee to origin
        if (_exitFee > 0) {
            _pushPoolShare(origin, _exitFee);
        }
        _burnPoolShare(pAiAfterExitFee);

        for (uint256 i = 0; i < _tokens.length; i++) {
            address t = _tokens[i];
            uint256 bal = _records[t].balance;
            uint256 tokenAmountOut = ratio.bmul(bal);
            require(tokenAmountOut != 0, "ERR_MATH_APPROX");
            require(tokenAmountOut >= minAmountsOut[i], "ERR_LIMIT_OUT");
            _records[t].balance = (_records[t].balance).bsub(tokenAmountOut);
            emit LOG_EXIT(msg.sender, t, tokenAmountOut);
            _pushUnderlying(t, msg.sender, tokenAmountOut);
        }
    }

    function swapExactAmountIn(
        address tokenIn,
        uint256 tokenAmountIn,
        address tokenOut,
        uint256 minAmountOut,
        uint256 maxPrice
    ) external returns (uint256 tokenAmountOut, uint256 spotPriceAfter) {
        return
            swapExactAmountInRefer(
                tokenIn,
                tokenAmountIn,
                tokenOut,
                minAmountOut,
                maxPrice,
                address(0x0)
            );
    }

    function swapExactAmountInRefer(
        address tokenIn,
        uint256 tokenAmountIn,
        address tokenOut,
        uint256 minAmountOut,
        uint256 maxPrice,
        address referrer
    ) public _lock_ returns (uint256 tokenAmountOut, uint256 spotPriceAfter) {
        require(_records[tokenIn].bound, "ERR_NOT_BOUND");
        require(_records[tokenOut].bound, "ERR_NOT_BOUND");
        require(finalized, "ERR_NOT_FINALIZED");

        Record storage inRecord = _records[address(tokenIn)];
        Record storage outRecord = _records[address(tokenOut)];

        require(
            tokenAmountIn <= (inRecord.balance).bmul(MAX_IN_RATIO),
            "ERR_MAX_IN_RATIO"
        );

        uint256 spotPriceBefore =
            XMath.calcSpotPrice(
                inRecord.balance,
                inRecord.denorm,
                outRecord.balance,
                outRecord.denorm,
                swapFee
            );
        require(spotPriceBefore <= maxPrice, "ERR_BAD_LIMIT_PRICE");

        tokenAmountOut = calcOutGivenIn(
            inRecord.balance,
            inRecord.denorm,
            outRecord.balance,
            outRecord.denorm,
            tokenAmountIn,
            swapFee
        );
        require(tokenAmountOut >= minAmountOut, "ERR_LIMIT_OUT");
        require(
            spotPriceBefore <= tokenAmountIn.bdiv(tokenAmountOut),
            "ERR_MATH_APPROX"
        );

        inRecord.balance = (inRecord.balance).badd(tokenAmountIn);
        outRecord.balance = (outRecord.balance).bsub(tokenAmountOut);

        spotPriceAfter = XMath.calcSpotPrice(
            inRecord.balance,
            inRecord.denorm,
            outRecord.balance,
            outRecord.denorm,
            swapFee
        );
        require(spotPriceAfter >= spotPriceBefore, "ERR_MATH_APPROX");
        require(spotPriceAfter <= maxPrice, "ERR_LIMIT_PRICE");

        emit LOG_SWAP(
            msg.sender,
            tokenIn,
            tokenOut,
            tokenAmountIn,
            tokenAmountOut
        );

        _pullUnderlying(tokenIn, msg.sender, tokenAmountIn);

        uint256 _swapFee = tokenAmountIn.bmul(swapFee);

        // to referral
        uint256 _referFee = 0;
        if (
            referrer != address(0) &&
            referrer != msg.sender &&
            referrer != tx.origin
        ) {
            _referFee = _swapFee / 5; // 20% to referrer
            _pushUnderlying(tokenIn, referrer, _referFee);
            inRecord.balance = (inRecord.balance).bsub(_referFee);
            emit LOG_REFER(msg.sender, referrer, tokenIn, _referFee);
        }

        // to SAFU
        uint256 _safuFee = tokenAmountIn.bmul(safuFee);
        if (isFarmPool) {
            _safuFee = _swapFee.bsub(_referFee);
        }
        require(_safuFee.badd(_referFee) <= _swapFee, "ERR_FEE_LIMIT");
        _pushUnderlying(tokenIn, SAFU, _safuFee);
        inRecord.balance = (inRecord.balance).bsub(_safuFee);

        _pushUnderlying(tokenOut, msg.sender, tokenAmountOut);
        return (tokenAmountOut, spotPriceAfter);
    }

    function swapExactAmountOut(
        address tokenIn,
        uint256 maxAmountIn,
        address tokenOut,
        uint256 tokenAmountOut,
        uint256 maxPrice
    ) external returns (uint256 tokenAmountIn, uint256 spotPriceAfter) {
        return
            swapExactAmountOutRefer(
                tokenIn,
                maxAmountIn,
                tokenOut,
                tokenAmountOut,
                maxPrice,
                address(0x0)
            );
    }

    function swapExactAmountOutRefer(
        address tokenIn,
        uint256 maxAmountIn,
        address tokenOut,
        uint256 tokenAmountOut,
        uint256 maxPrice,
        address referrer
    ) public _lock_ returns (uint256 tokenAmountIn, uint256 spotPriceAfter) {
        require(_records[tokenIn].bound, "ERR_NOT_BOUND");
        require(_records[tokenOut].bound, "ERR_NOT_BOUND");
        require(finalized, "ERR_NOT_FINALIZED");

        Record storage inRecord = _records[address(tokenIn)];
        Record storage outRecord = _records[address(tokenOut)];

        require(
            tokenAmountOut <= (outRecord.balance).bmul(MAX_OUT_RATIO),
            "ERR_MAX_OUT_RATIO"
        );

        uint256 spotPriceBefore =
            XMath.calcSpotPrice(
                inRecord.balance,
                inRecord.denorm,
                outRecord.balance,
                outRecord.denorm,
                swapFee
            );
        require(spotPriceBefore <= maxPrice, "ERR_BAD_LIMIT_PRICE");

        tokenAmountIn = calcInGivenOut(
            inRecord.balance,
            inRecord.denorm,
            outRecord.balance,
            outRecord.denorm,
            tokenAmountOut,
            swapFee
        );
        require(tokenAmountIn <= maxAmountIn, "ERR_LIMIT_IN");
        require(
            spotPriceBefore <= tokenAmountIn.bdiv(tokenAmountOut),
            "ERR_MATH_APPROX"
        );

        inRecord.balance = (inRecord.balance).badd(tokenAmountIn);
        outRecord.balance = (outRecord.balance).bsub(tokenAmountOut);

        spotPriceAfter = XMath.calcSpotPrice(
            inRecord.balance,
            inRecord.denorm,
            outRecord.balance,
            outRecord.denorm,
            swapFee
        );
        require(spotPriceAfter >= spotPriceBefore, "ERR_MATH_APPROX");
        require(spotPriceAfter <= maxPrice, "ERR_LIMIT_PRICE");

        emit LOG_SWAP(
            msg.sender,
            tokenIn,
            tokenOut,
            tokenAmountIn,
            tokenAmountOut
        );

        _pullUnderlying(tokenIn, msg.sender, tokenAmountIn);

        uint256 _swapFee = tokenAmountIn.bmul(swapFee);
        // to referral
        uint256 _referFee = 0;
        if (
            referrer != address(0) &&
            referrer != msg.sender &&
            referrer != tx.origin
        ) {
            _referFee = _swapFee / 5; // 20% to referrer
            _pushUnderlying(tokenIn, referrer, _referFee);
            inRecord.balance = (inRecord.balance).bsub(_referFee);
            emit LOG_REFER(msg.sender, referrer, tokenIn, _referFee);
        }

        // to SAFU
        uint256 _safuFee = tokenAmountIn.bmul(safuFee);
        if (isFarmPool) {
            _safuFee = _swapFee.bsub(_referFee);
        }
        require(_safuFee.badd(_referFee) <= _swapFee, "ERR_FEE_LIMIT");
        _pushUnderlying(tokenIn, SAFU, _safuFee);
        inRecord.balance = (inRecord.balance).bsub(_safuFee);

        _pushUnderlying(tokenOut, msg.sender, tokenAmountOut);
        return (tokenAmountIn, spotPriceAfter);
    }

    function joinswapExternAmountIn(
        address tokenIn,
        uint256 tokenAmountIn,
        uint256 minPoolAmountOut
    ) external _lock_ returns (uint256 poolAmountOut) {
        require(finalized, "ERR_NOT_FINALIZED");
        require(_records[tokenIn].bound, "ERR_NOT_BOUND");
        require(
            tokenAmountIn <= (_records[tokenIn].balance).bmul(MAX_IN_RATIO),
            "ERR_MAX_IN_RATIO"
        );

        _pullUnderlying(tokenIn, msg.sender, tokenAmountIn);

        // to SAFU
        uint256 _safuFee = tokenAmountIn.bmul(safuFee);
        if (isFarmPool) {
            _safuFee = tokenAmountIn.bmul(swapFee);
        }
        tokenAmountIn = tokenAmountIn.bsub(_safuFee);

        Record storage inRecord = _records[tokenIn];
        poolAmountOut = XMath.calcPoolOutGivenSingleIn(
            inRecord.balance,
            inRecord.denorm,
            _totalSupply,
            _totalWeight,
            tokenAmountIn,
            swapFee
        );
        require(poolAmountOut >= minPoolAmountOut, "ERR_LIMIT_OUT");

        inRecord.balance = (inRecord.balance).badd(tokenAmountIn);

        _pushUnderlying(tokenIn, SAFU, _safuFee);
        emit LOG_JOIN(msg.sender, tokenIn, tokenAmountIn);
        _mintPoolShare(poolAmountOut);
        _pushPoolShare(msg.sender, poolAmountOut);
        return poolAmountOut;
    }

    function exitswapPoolAmountIn(
        address tokenOut,
        uint256 poolAmountIn,
        uint256 minAmountOut
    ) external _logs_ _lock_ returns (uint256 tokenAmountOut) {
        require(finalized, "ERR_NOT_FINALIZED");
        require(_records[tokenOut].bound, "ERR_NOT_BOUND");
        require(poolAmountIn >= MIN_POOL_AMOUNT, "ERR_MIN_AMOUNT");

        _pullPoolShare(msg.sender, poolAmountIn);

        // exit fee to origin
        if (exitFee > 0 && msg.sender != origin) {
            uint256 _exitFee = poolAmountIn.bmul(exitFee);
            _pushPoolShare(origin, _exitFee);
            poolAmountIn = poolAmountIn.bsub(_exitFee);
        }

        _burnPoolShare(poolAmountIn);

        Record storage outRecord = _records[tokenOut];
        tokenAmountOut = XMath.calcSingleOutGivenPoolIn(
            outRecord.balance,
            outRecord.denorm,
            _totalSupply,
            _totalWeight,
            poolAmountIn,
            swapFee
        );

        require(tokenAmountOut >= minAmountOut, "ERR_LIMIT_OUT");
        require(
            tokenAmountOut <= (_records[tokenOut].balance).bmul(MAX_OUT_RATIO),
            "ERR_MAX_OUT_RATIO"
        );

        outRecord.balance = (outRecord.balance).bsub(tokenAmountOut);

        // to SAFU
        uint256 _safuFee = tokenAmountOut.bmul(safuFee);
        if (isFarmPool) {
            _safuFee = tokenAmountOut.bmul(swapFee);
        }

        emit LOG_EXIT(msg.sender, tokenOut, tokenAmountOut);
        _pushUnderlying(tokenOut, SAFU, _safuFee);
        _pushUnderlying(tokenOut, msg.sender, tokenAmountOut.bsub(_safuFee));
        return tokenAmountOut;
    }

    function calcOutGivenIn(
        uint256 tokenBalanceIn,
        uint256 tokenWeightIn,
        uint256 tokenBalanceOut,
        uint256 tokenWeightOut,
        uint256 tokenAmountIn,
        uint256 _swapFee
    ) public pure returns (uint256) {
        return
            XMath.calcOutGivenIn(
                tokenBalanceIn,
                tokenWeightIn,
                tokenBalanceOut,
                tokenWeightOut,
                tokenAmountIn,
                _swapFee
            );
    }

    function calcInGivenOut(
        uint256 tokenBalanceIn,
        uint256 tokenWeightIn,
        uint256 tokenBalanceOut,
        uint256 tokenWeightOut,
        uint256 tokenAmountOut,
        uint256 _swapFee
    ) public pure returns (uint256) {
        return
            XMath.calcInGivenOut(
                tokenBalanceIn,
                tokenWeightIn,
                tokenBalanceOut,
                tokenWeightOut,
                tokenAmountOut,
                _swapFee
            );
    }

    // ==
    // 'Underlying' token-manipulation functions make external calls but are NOT locked
    // You must `_lock_` or otherwise ensure reentry-safety
    // Fixed ERC-20 transfer revert for some special token such as USDT
    function _pullUnderlying(
        address erc20,
        address from,
        uint256 amount
    ) internal {
        // bytes4(keccak256(bytes('transferFrom(address,address,uint256)')));
        (bool success, bytes memory data) =
            erc20.call(
                abi.encodeWithSelector(0x23b872dd, from, address(this), amount)
            );
        require(
            success && (data.length == 0 || abi.decode(data, (bool))),
            "ERC20_TRANSFER_FROM_FAILED"
        );
    }

    function _pushUnderlying(
        address erc20,
        address to,
        uint256 amount
    ) internal {
        // bytes4(keccak256(bytes('transfer(address,uint256)')));
        (bool success, bytes memory data) =
            erc20.call(abi.encodeWithSelector(0xa9059cbb, to, amount));
        require(
            success && (data.length == 0 || abi.decode(data, (bool))),
            "ERC20_TRANSFER_FAILED"
        );
    }

    function _pullPoolShare(address from, uint256 amount) internal {
        _move(from, address(this), amount);
    }

    function _pushPoolShare(address to, uint256 amount) internal {
        _move(address(this), to, amount);
    }

    function _mintPoolShare(uint256 amount) internal {
        _mint(amount);
    }

    function _burnPoolShare(uint256 amount) internal {
        _burn(amount);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"_xconfig","type":"address"},{"internalType":"address","name":"_controller","type":"address"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"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":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"denorm","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"balance","type":"uint256"}],"name":"LOG_BIND","type":"event"},{"anonymous":true,"inputs":[{"indexed":true,"internalType":"bytes4","name":"sig","type":"bytes4"},{"indexed":true,"internalType":"address","name":"caller","type":"address"},{"indexed":false,"internalType":"bytes","name":"data","type":"bytes"}],"name":"LOG_CALL","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"}],"name":"LOG_EXIT","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"fee","type":"uint256"}],"name":"LOG_EXIT_FEE","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"swapFee","type":"uint256"}],"name":"LOG_FINAL","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"}],"name":"LOG_JOIN","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"caller","type":"address"},{"indexed":true,"internalType":"address","name":"ref","type":"address"},{"indexed":true,"internalType":"address","name":"tokenIn","type":"address"},{"indexed":false,"internalType":"uint256","name":"fee","type":"uint256"}],"name":"LOG_REFER","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":"safu","type":"address"},{"indexed":false,"internalType":"uint256","name":"fee","type":"uint256"}],"name":"LOG_UPDATE_SAFU","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"manager","type":"address"}],"name":"SET_CONTROLLER","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"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"caller","type":"address"},{"indexed":false,"internalType":"bool","name":"isFarm","type":"bool"}],"name":"UPDATE_FARM","type":"event"},{"constant":true,"inputs":[],"name":"BONE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"EXIT_ZERO_FEE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"INIT_POOL_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"MAX_BOUND_TOKENS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"MAX_IN_RATIO","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"MAX_OUT_RATIO","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"MAX_TOTAL_WEIGHT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"MAX_WEIGHT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"MIN_BALANCE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"MIN_BOUND_TOKENS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"MIN_POOL_AMOUNT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"MIN_WEIGHT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"SAFU","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"SWAP_FEES","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"src","type":"address"},{"internalType":"address","name":"dst","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"dst","type":"address"},{"internalType":"uint256","name":"amt","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"whom","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"denorm","type":"uint256"}],"name":"bind","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"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":"","type":"uint256"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"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":"","type":"uint256"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[],"name":"controller","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"exitFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"poolAmountIn","type":"uint256"},{"internalType":"uint256[]","name":"minAmountsOut","type":"uint256[]"}],"name":"exitPool","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"tokenOut","type":"address"},{"internalType":"uint256","name":"poolAmountIn","type":"uint256"},{"internalType":"uint256","name":"minAmountOut","type":"uint256"}],"name":"exitswapPoolAmountIn","outputs":[{"internalType":"uint256","name":"tokenAmountOut","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"_swapFee","type":"uint256"}],"name":"finalize","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"finalized","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"getBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"getDenormalizedWeight","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getFinalTokens","outputs":[{"internalType":"address[]","name":"tokens","type":"address[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"getNormalizedWeight","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getNumTokens","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"address","name":"tokenOut","type":"address"}],"name":"getSpotPrice","outputs":[{"internalType":"uint256","name":"spotPrice","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"address","name":"tokenOut","type":"address"}],"name":"getSpotPriceSansFee","outputs":[{"internalType":"uint256","name":"spotPrice","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getTotalDenormalizedWeight","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getVersion","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"gulp","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"t","type":"address"}],"name":"isBound","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"isFarmPool","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"poolAmountOut","type":"uint256"},{"internalType":"uint256[]","name":"maxAmountsIn","type":"uint256[]"}],"name":"joinPool","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"uint256","name":"tokenAmountIn","type":"uint256"},{"internalType":"uint256","name":"minPoolAmountOut","type":"uint256"}],"name":"joinswapExternAmountIn","outputs":[{"internalType":"uint256","name":"poolAmountOut","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"origin","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"safuFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"manager","type":"address"}],"name":"setController","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"fee","type":"uint256"}],"name":"setExitFee","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"uint256","name":"tokenAmountIn","type":"uint256"},{"internalType":"address","name":"tokenOut","type":"address"},{"internalType":"uint256","name":"minAmountOut","type":"uint256"},{"internalType":"uint256","name":"maxPrice","type":"uint256"}],"name":"swapExactAmountIn","outputs":[{"internalType":"uint256","name":"tokenAmountOut","type":"uint256"},{"internalType":"uint256","name":"spotPriceAfter","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"uint256","name":"tokenAmountIn","type":"uint256"},{"internalType":"address","name":"tokenOut","type":"address"},{"internalType":"uint256","name":"minAmountOut","type":"uint256"},{"internalType":"uint256","name":"maxPrice","type":"uint256"},{"internalType":"address","name":"referrer","type":"address"}],"name":"swapExactAmountInRefer","outputs":[{"internalType":"uint256","name":"tokenAmountOut","type":"uint256"},{"internalType":"uint256","name":"spotPriceAfter","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"uint256","name":"maxAmountIn","type":"uint256"},{"internalType":"address","name":"tokenOut","type":"address"},{"internalType":"uint256","name":"tokenAmountOut","type":"uint256"},{"internalType":"uint256","name":"maxPrice","type":"uint256"}],"name":"swapExactAmountOut","outputs":[{"internalType":"uint256","name":"tokenAmountIn","type":"uint256"},{"internalType":"uint256","name":"spotPriceAfter","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"uint256","name":"maxAmountIn","type":"uint256"},{"internalType":"address","name":"tokenOut","type":"address"},{"internalType":"uint256","name":"tokenAmountOut","type":"uint256"},{"internalType":"uint256","name":"maxPrice","type":"uint256"},{"internalType":"address","name":"referrer","type":"address"}],"name":"swapExactAmountOutRefer","outputs":[{"internalType":"uint256","name":"tokenAmountIn","type":"uint256"},{"internalType":"uint256","name":"spotPriceAfter","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"swapFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"dst","type":"address"},{"internalType":"uint256","name":"amt","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"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"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"bool","name":"isFarm","type":"bool"}],"name":"updateFarm","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"safu","type":"address"},{"internalType":"uint256","name":"fee","type":"uint256"}],"name":"updateSafu","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"xconfig","outputs":[{"internalType":"contract IXConfig","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"}]

Deployed Bytecode

0x608060405234801561001057600080fd5b506004361061038e5760003560e01c80638c28cbe8116101de578063ba9530a61161010f578063e5a583a9116100ad578063f699a3911161007c578063f699a39114610ae5578063f77c479114610b02578063f8b2cb4f14610b0a578063f8d6aed414610b305761038e565b8063e5a583a914610a92578063e755f7ea14610aaf578063ec09302114610ab7578063f1b8a9b714610abf5761038e565b8063cd2ed8fb116100e9578063cd2ed8fb14610a30578063cd669be014610a38578063dd62ed3e14610a64578063e4a28a521461046f5761038e565b8063ba9530a61461099d578063be3bbd2e146109d8578063c36596a6146105485761038e565b8063992e2a921161017c578063b02f0b7311610156578063b02f0b731461090e578063b0e0d13614610985578063b3f05b971461098d578063b7b800a4146109955761038e565b8063992e2a92146108ae5780639c649fee146108b6578063a9059cbb146108e25761038e565b80639381cd2b116101b85780639381cd2b14610870578063938b5f3214610878578063948d8ce61461088057806395d89b41146108a65761038e565b80638c28cbe81461081c57806392eefe9b14610842578063936c3477146108685761038e565b80632f37b624116102c35780636a7f63fa116102615780637c5e9ea4116102305780637c5e9ea41461074c57806381efd24a1461078c5780638201aa3f146107d4578063867378c5146108145761038e565b80636a7f63fa146106b557806370a08231146106bd57806371cbfdca146106e35780637ae05237146106eb5761038e565b80634f69c0d41161029d5780634f69c0d4146105fc57806354cf2aeb146106735780635db342771461067b5780636284ae41146106ad5761038e565b80632f37b62414610586578063313ce567146105ac57806346ab38f1146105ca5761038e565b80631446a7ff1161033057806318160ddd1161030a57806318160ddd146105215780631ca22ea514610529578063218b53821461054857806323b872dd146105505761038e565b80631446a7ff146104bd57806315e84af9146104eb57806317ab06e1146105195761038e565b806309a3bbe41161036c57806309a3bbe41461046f5780630d8e6e2c146104895780630dbc6b3e1461049157806311b42b1e146104b55761038e565b806305261aea1461039357806306fdde03146103b2578063095ea7b31461042f575b600080fd5b6103b0600480360360208110156103a957600080fd5b5035610b6b565b005b6103ba610e84565b6040805160208082528351818301528351919283929083019185019080838360005b838110156103f45781810151838201526020016103dc565b50505050905090810190601f1680156104215780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b61045b6004803603604081101561044557600080fd5b506001600160a01b038135169060200135610eae565b604080519115158252519081900360200190f35b610477610f14565b60408051918252519081900360200190f35b610477610f21565b610499610f2e565b604080516001600160a01b039092168252519081900360200190f35b610477610f3d565b610477600480360360408110156104d357600080fd5b506001600160a01b0381358116916020013516610f42565b6104776004803603604081101561050157600080fd5b506001600160a01b038135811691602001351661111d565b6104776112c7565b6104776112cf565b6103b06004803603602081101561053f57600080fd5b503515156112d5565b61047761136f565b61045b6004803603606081101561056657600080fd5b506001600160a01b0381358116916020810135909116906040013561137b565b61045b6004803603602081101561059c57600080fd5b50356001600160a01b03166114ed565b6105b461150b565b6040805160ff9092168252519081900360200190f35b610477600480360360608110156105e057600080fd5b506001600160a01b038135169060208101359060400135611510565b6103b06004803603604081101561061257600080fd5b8135919081019060408101602082013564010000000081111561063457600080fd5b82018360208201111561064657600080fd5b8035906020019184602083028401116401000000008311171561066857600080fd5b509092509050611999565b610477611c9f565b6104776004803603606081101561069157600080fd5b506001600160a01b038135169060208101359060400135611ca5565b61047761200f565b610499612015565b610477600480360360208110156106d357600080fd5b50356001600160a01b0316612024565b61047761203f565b610733600480360360c081101561070157600080fd5b506001600160a01b038135811691602081013591604082013581169160608101359160808201359160a0013516612045565b6040805192835260208301919091528051918290030190f35b610733600480360360a081101561076257600080fd5b506001600160a01b038135811691602081013591604082013516906060810135906080013561277e565b610733600480360360c08110156107a257600080fd5b506001600160a01b038135811691602081013591604082013581169160608101359160808201359160a001351661279e565b610733600480360360a08110156107ea57600080fd5b506001600160a01b0381358116916020810135916040820135169060608101359060800135612eba565b610477612ecc565b6103b06004803603602081101561083257600080fd5b50356001600160a01b0316612ed3565b6103b06004803603602081101561085857600080fd5b50356001600160a01b031661307f565b6104776131d6565b610477613226565b610499613233565b6104776004803603602081101561089657600080fd5b50356001600160a01b0316613242565b6103ba613307565b610477613324565b6103b0600480360360408110156108cc57600080fd5b506001600160a01b038135169060200135613330565b61045b600480360360408110156108f857600080fd5b506001600160a01b03813516906020013561384d565b6103b06004803603604081101561092457600080fd5b8135919081019060408101602082013564010000000081111561094657600080fd5b82018360208201111561095857600080fd5b8035906020019184602083028401116401000000008311171561097a57600080fd5b509092509050613863565b610477613c17565b61045b613c1c565b610477613c2c565b610477600480360360c08110156109b357600080fd5b5080359060208101359060408101359060608101359060808101359060a00135613c31565b6109e0613ce1565b60408051602080825283518183015283519192839290830191858101910280838360005b83811015610a1c578181015183820152602001610a04565b505050509050019250505060405180910390f35b610477613ddc565b6103b060048036036040811015610a4e57600080fd5b506001600160a01b038135169060200135613de2565b61047760048036036040811015610a7a57600080fd5b506001600160a01b0381358116916020013516613ed8565b6103b060048036036020811015610aa857600080fd5b5035613f03565b61045b6140aa565b6104776140b3565b61047760048036036020811015610ad557600080fd5b50356001600160a01b03166140bf565b61047760048036036020811015610afb57600080fd5b503561419c565b6104996141b0565b61047760048036036020811015610b2057600080fd5b50356001600160a01b03166141c4565b610477600480360360c0811015610b4657600080fd5b5080359060208101359060408101359060608101359060808101359060a00135614289565b60085460ff1615610bb1576040805162461bcd60e51b815260206004820152600b60248201526a4552525f5245454e54525960a81b604482015290519081900360640190fd5b60088054600160ff19909116179081905561010090046001600160a01b03163314610c18576040805162461bcd60e51b815260206004820152601260248201527122a9292fa727aa2fa1a7a72a2927a62622a960711b604482015290519081900360640190fd5b600854600160a81b900460ff1615610c6a576040805162461bcd60e51b815260206004820152601060248201526f11549497d254d7d1925390531256915160821b604482015290519081900360640190fd5b600e5460021115610cb3576040805162461bcd60e51b815260206004820152600e60248201526d4552525f4d494e5f544f4b454e5360901b604482015290519081900360640190fd5b600e5460081015610cfc576040805162461bcd60e51b815260206004820152600e60248201526d4552525f4d41585f544f4b454e5360901b604482015290519081900360640190fd5b600354811015610d41576040805162461bcd60e51b815260206004820152600b60248201526a4552525f4d494e5f46454560a81b604482015290519081900360640190fd5b600754811115610d86576040805162461bcd60e51b815260206004820152600b60248201526a4552525f4d41585f46454560a81b604482015290519081900360640190fd5b6000805b6005811015610dba5760038160058110610da057fe5b0154831415610db25760019150610dba565b600101610d8a565b5080610e04576040805162461bcd60e51b81526020600482015260146024820152734552525f494e56414c49445f535741505f46454560601b604482015290519081900360640190fd5b60098290556008805460ff60a81b1916600160a81b179055610e2e68056bc75e2d63100000614302565b610e413368056bc75e2d6310000061430e565b60095460408051918252517f385682b698dbab9a6c443fd4594a08df31e60958fa2369566cc3a76c0072a7fe9181900360200190a150506008805460ff19169055565b60408051808201909152601081526f2c2232a334902837b7b6102a37b5b2b760811b602082015290565b3360008181526001602090815260408083206001600160a01b038716808552908352818420869055815186815291519394909390927f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925928290030190a350600192915050565b6802b5e3af16b188000081565b6541504f4c4c4f60d01b90565b600b546001600160a01b031681565b600081565b60085460009060ff1615610f8b576040805162461bcd60e51b815260206004820152600b60248201526a4552525f5245454e54525960a81b604482015290519081900360640190fd5b6001600160a01b0383166000908152600f602052604090205460ff16610fe8576040805162461bcd60e51b815260206004820152600d60248201526c11549497d393d517d093d55391609a1b604482015290519081900360640190fd5b6001600160a01b0382166000908152600f602052604090205460ff16611045576040805162461bcd60e51b815260206004820152600d60248201526c11549497d393d517d093d55391609a1b604482015290519081900360640190fd5b6001600160a01b038084166000908152600f6020908152604080832093861683528083206003808601546002808801549284015490840154855163a221ee4960e01b81526004810193909352602483019390935260448201526064810191909152608481019490945290519092734f8d1c6dabbb379134272cb1273638cc98212a449263a221ee499260a480840193829003018186803b1580156110e857600080fd5b505af41580156110fc573d6000803e3d6000fd5b505050506040513d602081101561111257600080fd5b505195945050505050565b60085460009060ff1615611166576040805162461bcd60e51b815260206004820152600b60248201526a4552525f5245454e54525960a81b604482015290519081900360640190fd5b6001600160a01b0383166000908152600f602052604090205460ff166111c3576040805162461bcd60e51b815260206004820152600d60248201526c11549497d393d517d093d55391609a1b604482015290519081900360640190fd5b6001600160a01b0382166000908152600f602052604090205460ff16611220576040805162461bcd60e51b815260206004820152600d60248201526c11549497d393d517d093d55391609a1b604482015290519081900360640190fd5b6001600160a01b038084166000908152600f602090815260408083209386168352918290206003808501546002808701549284015490840154600954875163a221ee4960e01b81526004810194909452602484019490945260448301919091526064820152608481019190915292519092734f8d1c6dabbb379134272cb1273638cc98212a449263a221ee499260a480840193829003018186803b1580156110e857600080fd5b6305f5e10081565b60025490565b6011546001600160a01b03163314611325576040805162461bcd60e51b815260206004820152600e60248201526d4552525f4e4f545f434f4e46494760901b604482015290519081900360640190fd5b600d805482151560ff199091168117909155604080519182525133917f1c37382de11fec2ccd27d010eaa40491f045ea806bc44380827628e4f767040d919081900360200190a250565b670de0b6b3a764000081565b6000336001600160a01b03851614806113b757506001600160a01b03841660009081526001602090815260408083203384529091529020548211155b611400576040805162461bcd60e51b815260206004820152601560248201527422a9292fa12a27a5a2a72fa120a22fa1a0a62622a960591b604482015290519081900360640190fd5b61140b84848461431d565b336001600160a01b0385161480159061144957506001600160a01b038416600090815260016020908152604080832033845290915290205460001914155b156114e3576001600160a01b0384166000908152600160209081526040808320338452909152902054611482908363ffffffff61443916565b6001600160a01b03858116600090815260016020908152604080832033808552908352928190208590558051948552519287169391927f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259281900390910190a35b5060019392505050565b6001600160a01b03166000908152600f602052604090205460ff1690565b601290565b6000336001600160a01b03166000356001600160e01b0319166001600160e01b03191660003660405180806020018281038252848482818152602001925080828437600083820152604051601f909101601f19169092018290039550909350505050a260085460ff16156115b9576040805162461bcd60e51b815260206004820152600b60248201526a4552525f5245454e54525960a81b604482015290519081900360640190fd5b6008805460ff191660011790819055600160a81b900460ff16611617576040805162461bcd60e51b815260206004820152601160248201527011549497d393d517d19253905312569151607a1b604482015290519081900360640190fd5b6001600160a01b0384166000908152600f602052604090205460ff16611674576040805162461bcd60e51b815260206004820152600d60248201526c11549497d393d517d093d55391609a1b604482015290519081900360640190fd5b6305f5e1008310156116be576040805162461bcd60e51b815260206004820152600e60248201526d11549497d3525397d05353d5539560921b604482015290519081900360640190fd5b6116c8338461449b565b6000600a541180156116e557506012546001600160a01b03163314155b1561172e576000611701600a54856144a690919063ffffffff16565b60125490915061171a906001600160a01b03168261430e565b61172a848263ffffffff61443916565b9350505b6117378361456f565b6001600160a01b0384166000908152600f6020908152604091829020600381015460028083015490546010546009548751634494c00960e11b815260048101959095526024850193909352604484019190915260648301526084820188905260a482015292519092734f8d1c6dabbb379134272cb1273638cc98212a449263892980129260c480840193829003018186803b1580156117d557600080fd5b505af41580156117e9573d6000803e3d6000fd5b505050506040513d60208110156117ff57600080fd5b5051915082821015611848576040805162461bcd60e51b815260206004820152600d60248201526c11549497d31253525517d3d555609a1b604482015290519081900360640190fd5b6001600160a01b0385166000908152600f6020526040902060030154611876906704a03ce68d2155566144a6565b8211156118be576040805162461bcd60e51b81526020600482015260116024820152704552525f4d41585f4f55545f524154494f60781b604482015290519081900360640190fd5b60038101546118d3908363ffffffff61443916565b6003820155600c546000906118ef90849063ffffffff6144a616565b600d5490915060ff16156119145760095461191190849063ffffffff6144a616565b90505b6040805184815290516001600160a01b0388169133917fe74c91552b64c2e2e7bd255639e004e693bd3e1d01cc33e65610b86afcc1ffed9181900360200190a3600b5461196c9087906001600160a01b031683614578565b6119868633611981868563ffffffff61443916565b614578565b50506008805460ff191690559392505050565b60085460ff16156119df576040805162461bcd60e51b815260206004820152600b60248201526a4552525f5245454e54525960a81b604482015290519081900360640190fd5b6008805460ff191660011790819055600160a81b900460ff16611a3d576040805162461bcd60e51b815260206004820152601160248201527011549497d393d517d19253905312569151607a1b604482015290519081900360640190fd5b600e548114611a89576040805162461bcd60e51b815260206004820152601360248201527208aa4a4be988a9c8ea890be9a92a69a82a8869606b1b604482015290519081900360640190fd5b6000611a936112cf565b90506000611aa7858363ffffffff6146da16565b905080611aed576040805162461bcd60e51b815260206004820152600f60248201526e08aa4a4be9a82a890be82a0a0a49eb608b1b604482015290519081900360640190fd5b60005b600e54811015611c7a576000600e8281548110611b0957fe5b60009182526020808320909101546001600160a01b0316808352600f909152604082206003015490925090611b44858363ffffffff6144a616565b905080611b8a576040805162461bcd60e51b815260206004820152600f60248201526e08aa4a4be9a82a890be82a0a0a49eb608b1b604482015290519081900360640190fd5b878785818110611b9657fe5b90506020020135811115611be0576040805162461bcd60e51b815260206004820152600c60248201526b22a9292fa624a6a4aa2fa4a760a11b604482015290519081900360640190fd5b6001600160a01b0383166000908152600f6020526040902060030154611c0c908263ffffffff6147e216565b6001600160a01b0384166000818152600f60209081526040918290206003019390935580518481529051919233927f63982df10efd8dfaaaa0fcc7f50b2d93b7cba26ccc48adee2873220d485dc39a9281900390910190a3611c6f83338361482f565b505050600101611af0565b50611c8485614302565b611c8e338661430e565b50506008805460ff19169055505050565b60095481565b60085460009060ff1615611cee576040805162461bcd60e51b815260206004820152600b60248201526a4552525f5245454e54525960a81b604482015290519081900360640190fd5b6008805460ff191660011790819055600160a81b900460ff16611d4c576040805162461bcd60e51b815260206004820152601160248201527011549497d393d517d19253905312569151607a1b604482015290519081900360640190fd5b6001600160a01b0384166000908152600f602052604090205460ff16611da9576040805162461bcd60e51b815260206004820152600d60248201526c11549497d393d517d093d55391609a1b604482015290519081900360640190fd5b6001600160a01b0384166000908152600f6020526040902060030154611dd7906706f05b59d3b200006144a6565b831115611e1e576040805162461bcd60e51b815260206004820152601060248201526f4552525f4d41585f494e5f524154494f60801b604482015290519081900360640190fd5b611e2984338561482f565b6000611e40600c54856144a690919063ffffffff16565b600d5490915060ff1615611e6557600954611e6290859063ffffffff6144a616565b90505b611e75848263ffffffff61443916565b6001600160a01b0386166000908152600f6020908152604091829020600381015460028083015490546010546009548751638656b65360e01b815260048101959095526024850193909352604484019190915260648301526084820186905260a4820152925193975092734f8d1c6dabbb379134272cb1273638cc98212a4492638656b6539260c4808301939192829003018186803b158015611f1757600080fd5b505af4158015611f2b573d6000803e3d6000fd5b505050506040513d6020811015611f4157600080fd5b5051925083831015611f8a576040805162461bcd60e51b815260206004820152600d60248201526c11549497d31253525517d3d555609a1b604482015290519081900360640190fd5b6003810154611f9f908663ffffffff6147e216565b6003820155600b54611fbc9087906001600160a01b031684614578565b6040805186815290516001600160a01b0388169133917f63982df10efd8dfaaaa0fcc7f50b2d93b7cba26ccc48adee2873220d485dc39a9181900360200190a361200583614302565b611986338461430e565b600a5481565b6011546001600160a01b031681565b6001600160a01b031660009081526020819052604090205490565b600c5481565b600854600090819060ff1615612090576040805162461bcd60e51b815260206004820152600b60248201526a4552525f5245454e54525960a81b604482015290519081900360640190fd5b6008805460ff191660011790556001600160a01b0388166000908152600f602052604090205460ff166120fa576040805162461bcd60e51b815260206004820152600d60248201526c11549497d393d517d093d55391609a1b604482015290519081900360640190fd5b6001600160a01b0386166000908152600f602052604090205460ff16612157576040805162461bcd60e51b815260206004820152600d60248201526c11549497d393d517d093d55391609a1b604482015290519081900360640190fd5b600854600160a81b900460ff166121a9576040805162461bcd60e51b815260206004820152601160248201527011549497d393d517d19253905312569151607a1b604482015290519081900360640190fd5b6001600160a01b038881166000908152600f60205260408082209289168252902060038201546121e1906706f05b59d3b200006144a6565b891115612228576040805162461bcd60e51b815260206004820152601060248201526f4552525f4d41585f494e5f524154494f60801b604482015290519081900360640190fd5b6000734f8d1c6dabbb379134272cb1273638cc98212a4463a221ee4984600301548560020154856003015486600201546009546040518663ffffffff1660e01b8152600401808681526020018581526020018481526020018381526020018281526020019550505050505060206040518083038186803b1580156122ab57600080fd5b505af41580156122bf573d6000803e3d6000fd5b505050506040513d60208110156122d557600080fd5b5051905086811115612324576040805162461bcd60e51b81526020600482015260136024820152724552525f4241445f4c494d49545f505249434560681b604482015290519081900360640190fd5b61234483600301548460020154846003015485600201548e600954613c31565b94508785101561238b576040805162461bcd60e51b815260206004820152600d60248201526c11549497d31253525517d3d555609a1b604482015290519081900360640190fd5b61239b8a8663ffffffff6146da16565b8111156123e1576040805162461bcd60e51b815260206004820152600f60248201526e08aa4a4be9a82a890be82a0a0a49eb608b1b604482015290519081900360640190fd5b60038301546123f6908b63ffffffff6147e216565b600380850191909155820154612412908663ffffffff61443916565b8260030181905550734f8d1c6dabbb379134272cb1273638cc98212a4463a221ee4984600301548560020154856003015486600201546009546040518663ffffffff1660e01b8152600401808681526020018581526020018481526020018381526020018281526020019550505050505060206040518083038186803b15801561249b57600080fd5b505af41580156124af573d6000803e3d6000fd5b505050506040513d60208110156124c557600080fd5b5051935080841015612510576040805162461bcd60e51b815260206004820152600f60248201526e08aa4a4be9a82a890be82a0a0a49eb608b1b604482015290519081900360640190fd5b86841115612557576040805162461bcd60e51b815260206004820152600f60248201526e4552525f4c494d49545f505249434560881b604482015290519081900360640190fd5b886001600160a01b03168b6001600160a01b0316336001600160a01b03167f908fb5ee8f16c6bc9bc3690973819f32a4d4b10188134543c88706e0e1d433788d89604051808381526020018281526020019250505060405180910390a46125bf8b338c61482f565b60006125d66009548c6144a690919063ffffffff16565b905060006001600160a01b038816158015906125fb57506001600160a01b0388163314155b801561261057506001600160a01b0388163214155b156126985750600581046126258d8983614578565b600385015461263a908263ffffffff61443916565b85600301819055508c6001600160a01b0316886001600160a01b0316336001600160a01b03167f2fa8f551635bc74da38059e0b4294901eedc1258f4dab545bbc85a3b809eb076846040518082815260200191505060405180910390a45b60006126af600c548e6144a690919063ffffffff16565b600d5490915060ff16156126d0576126cd838363ffffffff61443916565b90505b826126e1828463ffffffff6147e216565b1115612724576040805162461bcd60e51b815260206004820152600d60248201526c11549497d1915157d312535255609a1b604482015290519081900360640190fd5b600b5461273c908f906001600160a01b031683614578565b6003860154612751908263ffffffff61443916565b60038701556127618c338a614578565b5050505050506008805460ff191690559097909650945050505050565b6000806127908787878787600061279e565b915091509550959350505050565b600854600090819060ff16156127e9576040805162461bcd60e51b815260206004820152600b60248201526a4552525f5245454e54525960a81b604482015290519081900360640190fd5b6008805460ff191660011790556001600160a01b0388166000908152600f602052604090205460ff16612853576040805162461bcd60e51b815260206004820152600d60248201526c11549497d393d517d093d55391609a1b604482015290519081900360640190fd5b6001600160a01b0386166000908152600f602052604090205460ff166128b0576040805162461bcd60e51b815260206004820152600d60248201526c11549497d393d517d093d55391609a1b604482015290519081900360640190fd5b600854600160a81b900460ff16612902576040805162461bcd60e51b815260206004820152601160248201527011549497d393d517d19253905312569151607a1b604482015290519081900360640190fd5b6001600160a01b038881166000908152600f602052604080822092891682529020600381015461293a906704a03ce68d2155566144a6565b871115612982576040805162461bcd60e51b81526020600482015260116024820152704552525f4d41585f4f55545f524154494f60781b604482015290519081900360640190fd5b6000734f8d1c6dabbb379134272cb1273638cc98212a4463a221ee4984600301548560020154856003015486600201546009546040518663ffffffff1660e01b8152600401808681526020018581526020018481526020018381526020018281526020019550505050505060206040518083038186803b158015612a0557600080fd5b505af4158015612a19573d6000803e3d6000fd5b505050506040513d6020811015612a2f57600080fd5b5051905086811115612a7e576040805162461bcd60e51b81526020600482015260136024820152724552525f4241445f4c494d49545f505249434560681b604482015290519081900360640190fd5b612a9e83600301548460020154846003015485600201548c600954614289565b945089851115612ae4576040805162461bcd60e51b815260206004820152600c60248201526b22a9292fa624a6a4aa2fa4a760a11b604482015290519081900360640190fd5b612af4858963ffffffff6146da16565b811115612b3a576040805162461bcd60e51b815260206004820152600f60248201526e08aa4a4be9a82a890be82a0a0a49eb608b1b604482015290519081900360640190fd5b6003830154612b4f908663ffffffff6147e216565b600380850191909155820154612b6b908963ffffffff61443916565b8260030181905550734f8d1c6dabbb379134272cb1273638cc98212a4463a221ee4984600301548560020154856003015486600201546009546040518663ffffffff1660e01b8152600401808681526020018581526020018481526020018381526020018281526020019550505050505060206040518083038186803b158015612bf457600080fd5b505af4158015612c08573d6000803e3d6000fd5b505050506040513d6020811015612c1e57600080fd5b5051935080841015612c69576040805162461bcd60e51b815260206004820152600f60248201526e08aa4a4be9a82a890be82a0a0a49eb608b1b604482015290519081900360640190fd5b86841115612cb0576040805162461bcd60e51b815260206004820152600f60248201526e4552525f4c494d49545f505249434560881b604482015290519081900360640190fd5b886001600160a01b03168b6001600160a01b0316336001600160a01b03167f908fb5ee8f16c6bc9bc3690973819f32a4d4b10188134543c88706e0e1d43378888c604051808381526020018281526020019250505060405180910390a4612d188b338761482f565b6000612d2f600954876144a690919063ffffffff16565b905060006001600160a01b03881615801590612d5457506001600160a01b0388163314155b8015612d6957506001600160a01b0388163214155b15612df1575060058104612d7e8d8983614578565b6003850154612d93908263ffffffff61443916565b85600301819055508c6001600160a01b0316886001600160a01b0316336001600160a01b03167f2fa8f551635bc74da38059e0b4294901eedc1258f4dab545bbc85a3b809eb076846040518082815260200191505060405180910390a45b6000612e08600c54896144a690919063ffffffff16565b600d5490915060ff1615612e2957612e26838363ffffffff61443916565b90505b82612e3a828463ffffffff6147e216565b1115612e7d576040805162461bcd60e51b815260206004820152600d60248201526c11549497d1915157d312535255609a1b604482015290519081900360640190fd5b600b54612e95908f906001600160a01b031683614578565b6003860154612eaa908263ffffffff61443916565b60038701556127618c338d614578565b60008061279087878787876000612045565b620f424081565b336001600160a01b03166000356001600160e01b0319166001600160e01b03191660003660405180806020018281038252848482818152602001925080828437600083820152604051601f909101601f19169092018290039550909350505050a260085460ff1615612f7a576040805162461bcd60e51b815260206004820152600b60248201526a4552525f5245454e54525960a81b604482015290519081900360640190fd5b6008805460ff191660011790556001600160a01b0381166000908152600f602052604090205460ff16612fe4576040805162461bcd60e51b815260206004820152600d60248201526c11549497d393d517d093d55391609a1b604482015290519081900360640190fd5b604080516370a0823160e01b815230600482015290516001600160a01b038316916370a08231916024808301926020929190829003018186803b15801561302a57600080fd5b505afa15801561303e573d6000803e3d6000fd5b505050506040513d602081101561305457600080fd5b50516001600160a01b039091166000908152600f60205260409020600301556008805460ff19169055565b336001600160a01b03166000356001600160e01b0319166001600160e01b03191660003660405180806020018281038252848482818152602001925080828437600083820152604051601f909101601f19169092018290039550909350505050a260085461010090046001600160a01b03163314613139576040805162461bcd60e51b815260206004820152601260248201527122a9292fa727aa2fa1a7a72a2927a62622a960711b604482015290519081900360640190fd5b6001600160a01b038116613184576040805162461bcd60e51b815260206004820152600d60248201526c22a9292fad22a927afa0a2222960991b604482015290519081900360640190fd5b60088054610100600160a81b0319166101006001600160a01b038416908102919091179091556040517f37f86e4777739e0dbc5682f53e26f091cac39f3d134742d5431c06cbe0a58dff90600090a250565b60085460009060ff161561321f576040805162461bcd60e51b815260206004820152600b60248201526a4552525f5245454e54525960a81b604482015290519081900360640190fd5b5060105490565b68056bc75e2d6310000081565b6012546001600160a01b031681565b60085460009060ff161561328b576040805162461bcd60e51b815260206004820152600b60248201526a4552525f5245454e54525960a81b604482015290519081900360640190fd5b6001600160a01b0382166000908152600f602052604090205460ff166132e8576040805162461bcd60e51b815260206004820152600d60248201526c11549497d393d517d093d55391609a1b604482015290519081900360640190fd5b506001600160a01b03166000908152600f602052604090206002015490565b60408051808201909152600381526216141560ea1b602082015290565b6704a03ce68d21555681565b60085460ff1615613376576040805162461bcd60e51b815260206004820152600b60248201526a4552525f5245454e54525960a81b604482015290519081900360640190fd5b60088054600160ff19909116179081905561010090046001600160a01b031633146133dd576040805162461bcd60e51b815260206004820152601260248201527122a9292fa727aa2fa1a7a72a2927a62622a960711b604482015290519081900360640190fd5b6001600160a01b0382166000908152600f602052604090205460ff161561343a576040805162461bcd60e51b815260206004820152600c60248201526b11549497d254d7d093d5539160a21b604482015290519081900360640190fd5b600854600160a81b900460ff161561348c576040805162461bcd60e51b815260206004820152601060248201526f11549497d254d7d1925390531256915160821b604482015290519081900360640190fd5b600e546008116134d4576040805162461bcd60e51b815260206004820152600e60248201526d4552525f4d41585f544f4b454e5360901b604482015290519081900360640190fd5b670de0b6b3a7640000811015613522576040805162461bcd60e51b815260206004820152600e60248201526d11549497d3525397d5d15251d21560921b604482015290519081900360640190fd5b6802b5e3af16b1880000811115613571576040805162461bcd60e51b815260206004820152600e60248201526d11549497d3505617d5d15251d21560921b604482015290519081900360640190fd5b604080516370a0823160e01b815230600482015290516000916001600160a01b038516916370a0823191602480820192602092909190829003018186803b1580156135bb57600080fd5b505afa1580156135cf573d6000803e3d6000fd5b505050506040513d60208110156135e557600080fd5b50516040805163313ce56760e01b815290519192506000916001600160a01b0386169163313ce567916004808301926020929190829003018186803b15801561362d57600080fd5b505afa158015613641573d6000803e3d6000fd5b505050506040513d602081101561365757600080fd5b505160ff16600a0a9050620f42408110156136a9576040805162461bcd60e51b815260206004820152600d60248201526c11549497d513d3d7d4d3505313609a1b604482015290519081900360640190fd5b620f424081048210156136f5576040805162461bcd60e51b815260206004820152600f60248201526e4552525f4d494e5f42414c414e434560881b604482015290519081900360640190fd5b601054613708908463ffffffff6147e216565b60108190556802b5e3af16b18800001015613761576040805162461bcd60e51b815260206004820152601460248201527311549497d3505617d513d5105317d5d15251d21560621b604482015290519081900360640190fd5b604080516080810182526001808252600e80546020808501918252848601898152606086018981526001600160a01b038c166000818152600f85528981209851895460ff19169015151789559451888801559151600288015551600390960195909555825493840183559190527fbb7b4a454dc3493923482f07822329ed19e8244eff582cc204f8554c3620c3fd90910180546001600160a01b0319168317905582518681529081018590528251919233927f5deb8656732bee68a74ef874b834356bfc2936842bd13b816ec4c219e362a71e9281900390910190a350506008805460ff191690555050565b600061385a33848461431d565b50600192915050565b60085460ff16156138a9576040805162461bcd60e51b815260206004820152600b60248201526a4552525f5245454e54525960a81b604482015290519081900360640190fd5b6008805460ff191660011790819055600160a81b900460ff16613907576040805162461bcd60e51b815260206004820152601160248201527011549497d393d517d19253905312569151607a1b604482015290519081900360640190fd5b600e548114613953576040805162461bcd60e51b815260206004820152601360248201527208aa4a4be988a9c8ea890be9a92a69a82a8869606b1b604482015290519081900360640190fd5b6305f5e10083101561399d576040805162461bcd60e51b815260206004820152600e60248201526d11549497d3525397d05353d5539560921b604482015290519081900360640190fd5b60006139a76112cf565b905060006139c0600a54866144a690919063ffffffff16565b6012549091506001600160a01b03163314156139da575060005b60006139ec868363ffffffff61443916565b90506000613a00828563ffffffff6146da16565b905080613a46576040805162461bcd60e51b815260206004820152600f60248201526e08aa4a4be9a82a890be82a0a0a49eb608b1b604482015290519081900360640190fd5b613a50338861449b565b8215613a6c57601254613a6c906001600160a01b03168461430e565b613a758261456f565b60005b600e54811015613c03576000600e8281548110613a9157fe5b60009182526020808320909101546001600160a01b0316808352600f909152604082206003015490925090613acc858363ffffffff6144a616565b905080613b12576040805162461bcd60e51b815260206004820152600f60248201526e08aa4a4be9a82a890be82a0a0a49eb608b1b604482015290519081900360640190fd5b898985818110613b1e57fe5b90506020020135811015613b69576040805162461bcd60e51b815260206004820152600d60248201526c11549497d31253525517d3d555609a1b604482015290519081900360640190fd5b6001600160a01b0383166000908152600f6020526040902060030154613b95908263ffffffff61443916565b6001600160a01b0384166000818152600f60209081526040918290206003019390935580518481529051919233927fe74c91552b64c2e2e7bd255639e004e693bd3e1d01cc33e65610b86afcc1ffed9281900390910190a3613bf8833383614578565b505050600101613a78565b50506008805460ff19169055505050505050565b600881565b600854600160a81b900460ff1681565b600281565b60408051635d4a985360e11b8152600481018890526024810187905260448101869052606481018590526084810184905260a481018390529051600091734f8d1c6dabbb379134272cb1273638cc98212a449163ba9530a69160c480820192602092909190829003018186803b158015613caa57600080fd5b505af4158015613cbe573d6000803e3d6000fd5b505050506040513d6020811015613cd457600080fd5b5051979650505050505050565b60085460609060ff1615613d2a576040805162461bcd60e51b815260206004820152600b60248201526a4552525f5245454e54525960a81b604482015290519081900360640190fd5b600854600160a81b900460ff16613d7c576040805162461bcd60e51b815260206004820152601160248201527011549497d393d517d19253905312569151607a1b604482015290519081900360640190fd5b600e805480602002602001604051908101604052809291908181526020018280548015613dd257602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311613db4575b5050505050905090565b600e5490565b6011546001600160a01b03163314613e32576040805162461bcd60e51b815260206004820152600e60248201526d4552525f4e4f545f434f4e46494760901b604482015290519081900360640190fd5b6001600160a01b038216613e7d576040805162461bcd60e51b815260206004820152600d60248201526c22a9292fad22a927afa0a2222960991b604482015290519081900360640190fd5b600b80546001600160a01b0384166001600160a01b03199091168117909155600c8290556040805183815290517fccaa809140cb901df601f6c5eae0a0d30849c3b29378df0886f660270c9735e99181900360200190a25050565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b600854600160a81b900460ff1615613f55576040805162461bcd60e51b815260206004820152601060248201526f11549497d254d7d1925390531256915160821b604482015290519081900360640190fd5b60085461010090046001600160a01b03163314613fae576040805162461bcd60e51b815260206004820152601260248201527122a9292fa727aa2fa1a7a72a2927a62622a960711b604482015290519081900360640190fd5b601160009054906101000a90046001600160a01b03166001600160a01b031663ff42517d6040518163ffffffff1660e01b815260040160206040518083038186803b158015613ffc57600080fd5b505afa158015614010573d6000803e3d6000fd5b505050506040513d602081101561402657600080fd5b505181111561406f576040805162461bcd60e51b815260206004820152601060248201526f494e56414c49445f455849545f46454560801b604482015290519081900360640190fd5b600a8190556040805182815290517f09ea89c001139a826eedf1b1b3a690524db01249f803b62c0f6a30b09f4976fc9181900360200190a150565b600d5460ff1681565b6706f05b59d3b2000081565b60085460009060ff1615614108576040805162461bcd60e51b815260206004820152600b60248201526a4552525f5245454e54525960a81b604482015290519081900360640190fd5b6001600160a01b0382166000908152600f602052604090205460ff16614165576040805162461bcd60e51b815260206004820152600d60248201526c11549497d393d517d093d55391609a1b604482015290519081900360640190fd5b6001600160a01b0382166000908152600f602052604090206002015460105461419590829063ffffffff6146da16565b9392505050565b600381600581106141a957fe5b0154905081565b60085461010090046001600160a01b031681565b60085460009060ff161561420d576040805162461bcd60e51b815260206004820152600b60248201526a4552525f5245454e54525960a81b604482015290519081900360640190fd5b6001600160a01b0382166000908152600f602052604090205460ff1661426a576040805162461bcd60e51b815260206004820152600d60248201526c11549497d393d517d093d55391609a1b604482015290519081900360640190fd5b506001600160a01b03166000908152600f602052604090206003015490565b60408051633e35abb560e21b8152600481018890526024810187905260448101869052606481018590526084810184905260a481018390529051600091734f8d1c6dabbb379134272cb1273638cc98212a449163f8d6aed49160c480820192602092909190829003018186803b158015613caa57600080fd5b61430b81614998565b50565b61431930838361431d565b5050565b6001600160a01b038316600090815260208190526040902054811115614381576040805162461bcd60e51b815260206004820152601460248201527311549497d25394d551919250d251539517d0905360621b604482015290519081900360640190fd5b6001600160a01b0383166000908152602081905260409020546143aa908263ffffffff61443916565b6001600160a01b0380851660009081526020819052604080822093909355908416815220546143df908263ffffffff6147e216565b6001600160a01b038084166000818152602081815260409182902094909455805185815290519193928716927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92918290030190a3505050565b60008060006144488585614a19565b915091508015614493576040805162461bcd60e51b81526020600482015260116024820152704552525f5355425f554e444552464c4f5760781b604482015290519081900360640190fd5b509392505050565b61431982308361431d565b60008282028315806144c05750828482816144bd57fe5b04145b614504576040805162461bcd60e51b815260206004820152601060248201526f4552525f4d554c5f4f564552464c4f5760801b604482015290519081900360640190fd5b6706f05b59d3b20000810181811015614557576040805162461bcd60e51b815260206004820152601060248201526f4552525f4d554c5f4f564552464c4f5760801b604482015290519081900360640190fd5b6000670de0b6b3a7640000825b049695505050505050565b61430b81614a3e565b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180516001600160e01b031663a9059cbb60e01b178152925182516000946060949389169392918291908083835b602083106145f55780518252601f1990920191602091820191016145d6565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114614657576040519150601f19603f3d011682016040523d82523d6000602084013e61465c565b606091505b509150915081801561468a57508051158061468a575080806020019051602081101561468757600080fd5b50515b6146d3576040805162461bcd60e51b8152602060048201526015602482015274115490cc8c17d514905394d1915497d19052531151605a1b604482015290519081900360640190fd5b5050505050565b60008161471d576040805162461bcd60e51b815260206004820152600c60248201526b4552525f4449565f5a45524f60a01b604482015290519081900360640190fd5b670de0b6b3a764000083028315806147455750670de0b6b3a764000084828161474257fe5b04145b614789576040805162461bcd60e51b815260206004820152601060248201526f11549497d1125597d25395115493905360821b604482015290519081900360640190fd5b600283048101818110156147d7576040805162461bcd60e51b815260206004820152601060248201526f11549497d1125597d25395115493905360821b604482015290519081900360640190fd5b600084828161456457fe5b600082820183811015614195576040805162461bcd60e51b815260206004820152601060248201526f4552525f4144445f4f564552464c4f5760801b604482015290519081900360640190fd5b604080516001600160a01b038481166024830152306044830152606480830185905283518084039091018152608490920183526020820180516001600160e01b03166323b872dd60e01b178152925182516000946060949389169392918291908083835b602083106148b25780518252601f199092019160209182019101614893565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114614914576040519150601f19603f3d011682016040523d82523d6000602084013e614919565b606091505b5091509150818015614947575080511580614947575080806020019051602081101561494457600080fd5b50515b6146d3576040805162461bcd60e51b815260206004820152601a60248201527f45524332305f5452414e534645525f46524f4d5f4641494c4544000000000000604482015290519081900360640190fd5b306000908152602081905260409020546149b8908263ffffffff6147e216565b306000908152602081905260409020556002546149db908263ffffffff6147e216565b60025560408051828152905130916000917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360200190a350565b600080828410614a2f5750508082036000614a37565b505081810360015b9250929050565b30600090815260208190526040902054811115614a99576040805162461bcd60e51b815260206004820152601460248201527311549497d25394d551919250d251539517d0905360621b604482015290519081900360640190fd5b30600090815260208190526040902054614ab9908263ffffffff61443916565b30600090815260208190526040902055600254614adc908263ffffffff61443916565b60025560408051828152905160009130917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360200190a35056fea265627a7a72315820e4bc0b79265b34f3071fc12ee0e04d56963a3285dc6081942b73e464bfc1c8b064736f6c63430005110032

Deployed Bytecode Sourcemap

21048:24733:0:-;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;21048:24733:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27609:917;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;27609:917:0;;:::i;:::-;;7576:85;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:100:-1;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;7576:85:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8234:187;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;8234:187:0;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;672:52;;;:::i;:::-;;;;;;;;;;;;;;;;184:97;;;:::i;23293:19::-;;;:::i;:::-;;;;-1:-1:-1;;;;;23293:19:0;;;;;;;;;;;;;;521:41;;;:::i;29441:622::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;29441:622:0;;;;;;;;;;:::i;28812:621::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;28812:621:0;;;;;;;;;;:::i;855:47::-;;;:::i;8135:91::-;;;:::i;26239:195::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;26239:195:0;;;;:::i;571:41::-;;;:::i;8573:598::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;8573:598:0;;;;;;;;;;;;;;;;;:::i;23908:100::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;23908:100:0;-1:-1:-1;;;;;23908:100:0;;:::i;7766:85::-;;;:::i;:::-;;;;;;;;;;;;;;;;;;;41398:1702;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;41398:1702:0;;;;;;;;;;;;;:::i;30071:1031::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;30071:1031:0;;;;;;;;;;;;;;21:11:-1;5:28;;2:2;;;46:1;43;36:12;2:2;30071:1031:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;30071:1031:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;39:11;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;-1:-1;30071:1031:0;;-1:-1:-1;30071:1031:0;-1:-1:-1;30071:1031:0;:::i;23209:22::-;;;:::i;39998:1392::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;39998:1392:0;;;;;;;;;;;;;:::i;23238:22::-;;;:::i;23500:23::-;;;:::i;8022:105::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;8022:105:0;-1:-1:-1;;;;;8022:105:0;;:::i;23319:22::-;;;:::i;33130:3176::-;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;;;;;;33130:3176:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;36314:494;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;;;;;;36314:494:0;;;;;;;;;;;;;;;;;;;;;;;;;:::i;36816:3174::-;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;;;;;;36816:3174:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;32629:493::-;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;;;;;;32629:493:0;;;;;;;;;;;;;;;;;;;;;;;;;:::i;777:43::-;;;:::i;28611:193::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;28611:193:0;-1:-1:-1;;;;;28611:193:0;;:::i;25278:258::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;25278:258:0;-1:-1:-1;;;;;25278:258:0;;:::i;24581:160::-;;;:::i;911:53::-;;;:::i;23530:21::-;;;:::i;24337:236::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;24337:236:0;-1:-1:-1;;;;;24337:236:0;;:::i;7669:89::-;;;:::i;1027:58::-;;;:::i;26442:1117::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;26442:1117:0;;;;;;;;:::i;8429:136::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;8429:136:0;;;;;;;;:::i;31110:1511::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;31110:1511:0;;;;;;;;;;;;;;21:11:-1;5:28;;2:2;;;46:1;43;36:12;2:2;31110:1511:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;31110:1511:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;39:11;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;-1:-1;31110:1511:0;;-1:-1:-1;31110:1511:0;-1:-1:-1;31110:1511:0;:::i;468:44::-;;;:::i;23179:21::-;;;:::i;417:44::-;;;:::i;43108:517::-;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;43108:517:0;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;24120:209::-;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:100:-1;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;24120:209:0;;;;;;;;;;;;;;;;;24016:96;;;:::i;25907:277::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;25907:277:0;;;;;;;;:::i;7859:155::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;7859:155:0;;;;;;;;;;:::i;25544:293::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;25544:293:0;;:::i;23348:22::-;;;:::i;973:47::-;;;:::i;24749:287::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;24749:287:0;-1:-1:-1;;;;;24749:287:0;;:::i;21174:159::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;21174:159:0;;:::i;23049:25::-;;;:::i;25044:226::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;25044:226:0;-1:-1:-1;;;;;25044:226:0;;:::i;43633:519::-;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;43633:519:0;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;27609:917::-;22830:6;;;;22829:7;22821:31;;;;;-1:-1:-1;;;22821:31:0;;;;;;;;;;;;-1:-1:-1;;;22821:31:0;;;;;;;;;;;;;;;22863:6;:13;;22872:4;-1:-1:-1;;22863:13:0;;;;;;;;;27694:10;;-1:-1:-1;;;;;27694:10:0;27680;:24;27672:55;;;;;-1:-1:-1;;;27672:55:0;;;;;;;;;;;;-1:-1:-1;;;27672:55:0;;;;;;;;;;;;;;;27747:9;;-1:-1:-1;;;27747:9:0;;;;27746:10;27738:39;;;;;-1:-1:-1;;;27738:39:0;;;;;;;;;;;;-1:-1:-1;;;27738:39:0;;;;;;;;;;;;;;;27796:7;:14;460:1;-1:-1:-1;27796:34:0;27788:61;;;;;-1:-1:-1;;;27788:61:0;;;;;;;;;;;;-1:-1:-1;;;27788:61:0;;;;;;;;;;;;;;;27868:7;:14;511:1;-1:-1:-1;27868:34:0;27860:61;;;;;-1:-1:-1;;;27860:61:0;;;;;;;;;;;;-1:-1:-1;;;27860:61:0;;;;;;;;;;;;;;;27954:9;:12;27942:24;;;27934:48;;;;;-1:-1:-1;;;27934:48:0;;;;;;;;;;;;-1:-1:-1;;;27934:48:0;;;;;;;;;;;;;;;28013:31;;28001:43;;;27993:67;;;;;-1:-1:-1;;;27993:67:0;;;;;;;;;;;;-1:-1:-1;;;27993:67:0;;;;;;;;;;;;;;;28073:10;;28102:174;28126:16;28122:1;:20;28102:174;;;28180:9;28190:1;28180:12;;;;;;;;;28168:8;:24;28164:101;;;28221:4;28213:12;;28244:5;;28164:101;28144:3;;28102:174;;;;28294:5;28286:38;;;;;-1:-1:-1;;;28286:38:0;;;;;;;;;;;;-1:-1:-1;;;28286:38:0;;;;;;;;;;;;;;;28335:7;:18;;;28366:9;:16;;-1:-1:-1;;;;28366:16:0;-1:-1:-1;;;28366:16:0;;;28395:32;954:10;28395:14;:32::i;:::-;28438:44;28453:10;954;28438:14;:44::i;:::-;28510:7;;28500:18;;;;;;;;;;;;;;;;-1:-1:-1;;22899:6:0;:14;;-1:-1:-1;;22899:14:0;;;27609:917::o;7576:85::-;7648:5;;;;;;;;;;;;-1:-1:-1;;;7648:5:0;;;;7576:85;:::o;8234:187::-;8323:10;8295:4;8312:22;;;:10;:22;;;;;;;;-1:-1:-1;;;;;8312:27:0;;;;;;;;;;;:33;;;8361:30;;;;;;;8295:4;;8312:27;;8323:10;;8361:30;;;;;;;;-1:-1:-1;8409:4:0;8234:187;;;;:::o;672:52::-;715:9;672:52;:::o;184:97::-;-1:-1:-1;;;184:97:0;:::o;23293:19::-;;;-1:-1:-1;;;;;23293:19:0;;:::o;521:41::-;561:1;521:41;:::o;29441:622::-;22971:6;;29575:17;;22971:6;;22970:7;22962:31;;;;;-1:-1:-1;;;22962:31:0;;;;;;;;;;;;-1:-1:-1;;;22962:31:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;29618:17:0;;;;;;:8;:17;;;;;:23;;;29610:49;;;;;-1:-1:-1;;;29610:49:0;;;;;;;;;;;;-1:-1:-1;;;29610:49:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;29678:18:0;;;;;;:8;:18;;;;;:24;;;29670:50;;;;;-1:-1:-1;;;29670:50:0;;;;;;;;;;;;-1:-1:-1;;;29670:50:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;29757:17:0;;;29731:23;29757:17;;;:8;:17;;;;;;;;29812:18;;;;;;;;29899:16;;;;;29934:15;;;;;29968:17;;;;30004:16;;;;29861:194;;-1:-1:-1;;;29861:194:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29812:18;;29861:5;;:19;;:194;;;;;;;;;;:5;:194;;;5:2:-1;;;;30:1;27;20:12;5:2;29861:194:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;29861:194:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;29861:194:0;;29441:622;-1:-1:-1;;;;;29441:622:0:o;28812:621::-;22971:6;;28939:17;;22971:6;;22970:7;22962:31;;;;;-1:-1:-1;;;22962:31:0;;;;;;;;;;;;-1:-1:-1;;;22962:31:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;28982:17:0;;;;;;:8;:17;;;;;:23;;;28974:49;;;;;-1:-1:-1;;;28974:49:0;;;;;;;;;;;;-1:-1:-1;;;28974:49:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;29042:18:0;;;;;;:8;:18;;;;;:24;;;29034:50;;;;;-1:-1:-1;;;29034:50:0;;;;;;;;;;;;-1:-1:-1;;;29034:50:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;29121:17:0;;;29095:23;29121:17;;;:8;:17;;;;;;;;29176:18;;;;;;;;;29263:16;;;;;29298:15;;;;;29332:17;;;;29368:16;;;;29403:7;;29225:200;;-1:-1:-1;;;29225:200:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29176:18;;29225:5;;:19;;:200;;;;;;;;;;:5;:200;;;5:2:-1;;;;30:1;27;20:12;855:47:0;897:5;855:47;:::o;8135:91::-;8206:12;;8135:91;:::o;26239:195::-;26322:7;;-1:-1:-1;;;;;26322:7:0;26300:10;:30;26292:57;;;;;-1:-1:-1;;;26292:57:0;;;;;;;;;;;;-1:-1:-1;;;26292:57:0;;;;;;;;;;;;;;;26360:10;:19;;;;;-1:-1:-1;;26360:19:0;;;;;;;;26395:31;;;;;;;26407:10;;26395:31;;;;;;;;;;26239:195;:::o;571:41::-;402:6;571:41;:::o;8573:598::-;8686:4;8725:10;-1:-1:-1;;;;;8725:17:0;;;;:55;;-1:-1:-1;;;;;;8753:15:0;;;;;;:10;:15;;;;;;;;8769:10;8753:27;;;;;;;;8746:34;;;8725:55;8703:126;;;;;-1:-1:-1;;;8703:126:0;;;;;;;;;;;;-1:-1:-1;;;8703:126:0;;;;;;;;;;;;;;;8840:20;8846:3;8851;8856;8840:5;:20::i;:::-;8875:10;-1:-1:-1;;;;;8875:17:0;;;;;;:63;;-1:-1:-1;;;;;;8896:15:0;;;;;;:10;:15;;;;;;;;8912:10;8896:27;;;;;;;;-1:-1:-1;;8896:42:0;;8875:63;8871:271;;;-1:-1:-1;;;;;8986:15:0;;;;;;:10;:15;;;;;;;;9002:10;8986:27;;;;;;;;8985:71;;9038:3;8985:71;:34;:71;:::i;:::-;-1:-1:-1;;;;;8955:15:0;;;;;;;:10;:15;;;;;;;;8971:10;8955:27;;;;;;;;;;:101;;;9076:54;;;;;;;;;;8971:10;;9076:54;;;;;;;;;;8871:271;-1:-1:-1;9159:4:0;8573:598;;;;;:::o;23908:100::-;-1:-1:-1;;;;;23983:11:0;23959:4;23983:11;;;:8;:11;;;;;:17;;;;23908:100::o;7766:85::-;7565:2;7766:85;:::o;41398:1702::-;41556:22;22743:10;-1:-1:-1;;;;;22725:39:0;22734:7;;-1:-1:-1;;;;;;22734:7:0;-1:-1:-1;;;;;22725:39:0;;22755:8;;22725:39;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;;74:27;22725:39:0;;137:4:-1;117:14;;;-1:-1;;113:30;157:16;;;22725:39:0;;;;-1:-1:-1;22725:39:0;;-1:-1:-1;;;;22725:39:0;22830:6;;;;22829:7;22821:31;;;;;-1:-1:-1;;;22821:31:0;;;;;;;;;;;;-1:-1:-1;;;22821:31:0;;;;;;;;;;;;;;;22863:6;:13;;-1:-1:-1;;22863:13:0;22872:4;22863:13;;;;;-1:-1:-1;;;41599:9:0;;22863:13;41599:9;41591:39;;;;;-1:-1:-1;;;41591:39:0;;;;;;;;;;;;-1:-1:-1;;;41591:39:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;41649:18:0;;;;;;:8;:18;;;;;:24;;;41641:50;;;;;-1:-1:-1;;;41641:50:0;;;;;;;;;;;;-1:-1:-1;;;41641:50:0;;;;;;;;;;;;;;;897:5;41710:12;:31;;41702:58;;;;;-1:-1:-1;;;41702:58:0;;;;;;;;;;;;-1:-1:-1;;;41702:58:0;;;;;;;;;;;;;;;41773:40;41788:10;41800:12;41773:14;:40::i;:::-;41871:1;41861:7;;:11;:35;;;;-1:-1:-1;41890:6:0;;-1:-1:-1;;;;;41890:6:0;41876:10;:20;;41861:35;41857:217;;;41913:16;41932:26;41950:7;;41932:12;:17;;:26;;;;:::i;:::-;41988:6;;41913:45;;-1:-1:-1;41973:32:0;;-1:-1:-1;;;;;41988:6:0;41913:45;41973:14;:32::i;:::-;42035:27;:12;42053:8;42035:27;:17;:27;:::i;:::-;42020:42;;41857:217;;42086:28;42101:12;42086:14;:28::i;:::-;-1:-1:-1;;;;;42154:18:0;;42127:24;42154:18;;;:8;:18;;;;;;;;;42245:17;;;;42277:16;;;;;42308:12;;42335;;42389:7;;42200:207;;-1:-1:-1;;;42200:207:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42154:18;;42200:5;;:30;;:207;;;;;;;;;;:5;:207;;;5:2:-1;;;;30:1;27;20:12;5:2;42200:207:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;42200:207:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;42200:207:0;;-1:-1:-1;42428:30:0;;;;42420:56;;;;;-1:-1:-1;;;42420:56:0;;;;;;;;;;;;-1:-1:-1;;;42420:56:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;42528:18:0;;;;;;:8;:18;;;;;1075:1;42528:26;;42527:48;;1067:18;42527:33;:48::i;:::-;42509:14;:66;;42487:133;;;;;-1:-1:-1;;;42487:133:0;;;;;;;;;;;;-1:-1:-1;;;42487:133:0;;;;;;;;;;;;;;;42654:17;;;;42653:40;;42678:14;42653:40;:24;:40;:::i;:::-;42633:17;;;:60;42765:7;;42726:16;;42745:28;;:14;;:28;:19;:28;:::i;:::-;42788:10;;42726:47;;-1:-1:-1;42788:10:0;;42784:82;;;42846:7;;42826:28;;:14;;:28;:19;:28;:::i;:::-;42815:39;;42784:82;42883:46;;;;;;;;-1:-1:-1;;;;;42883:46:0;;;42892:10;;42883:46;;;;;;;;;42966:4;;42940:41;;42956:8;;-1:-1:-1;;;;;42966:4:0;42972:8;42940:15;:41::i;:::-;42992:68;43008:8;43018:10;43030:29;:14;43050:8;43030:29;:19;:29;:::i;:::-;42992:15;:68::i;:::-;-1:-1:-1;;22899:6:0;:14;;-1:-1:-1;;22899:14:0;;;41398:1702;;-1:-1:-1;;;41398:1702:0:o;30071:1031::-;22830:6;;;;22829:7;22821:31;;;;;-1:-1:-1;;;22821:31:0;;;;;;;;;;;;-1:-1:-1;;;22821:31:0;;;;;;;;;;;;;;;22863:6;:13;;-1:-1:-1;;22863:13:0;22872:4;22863:13;;;;;-1:-1:-1;;;30203:9:0;;22863:13;30203:9;30195:39;;;;;-1:-1:-1;;;30195:39:0;;;;;;;;;;;;-1:-1:-1;;;30195:39:0;;;;;;;;;;;;;;;30276:7;:14;30253:37;;30245:69;;;;;-1:-1:-1;;;30245:69:0;;;;;;;;;;;;-1:-1:-1;;;30245:69:0;;;;;;;;;;;;;;;30327:17;30347:13;:11;:13::i;:::-;30327:33;-1:-1:-1;30371:13:0;30387:29;:13;30327:33;30387:29;:18;:29;:::i;:::-;30371:45;-1:-1:-1;30435:10:0;30427:38;;;;;-1:-1:-1;;;30427:38:0;;;;;;;;;;;;-1:-1:-1;;;30427:38:0;;;;;;;;;;;;;;;30483:9;30478:525;30502:7;:14;30498:18;;30478:525;;;30538:9;30550:7;30558:1;30550:10;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;30550:10:0;30589:11;;;:8;:11;;;;;;:19;;;30550:10;;-1:-1:-1;30589:19:0;30647:15;:5;30589:19;30647:15;:10;:15;:::i;:::-;30623:39;-1:-1:-1;30685:18:0;30677:46;;;;;-1:-1:-1;;;30677:46:0;;;;;;;;;;;;-1:-1:-1;;;30677:46:0;;;;;;;;;;;;;;;30763:12;;30776:1;30763:15;;;;;;;;;;;;;30746:13;:32;;30738:57;;;;;-1:-1:-1;;;30738:57:0;;;;;;;;;;;;-1:-1:-1;;;30738:57:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;30833:11:0;;;;;;:8;:11;;;;;:19;;;30832:41;;30859:13;30832:41;:26;:41;:::i;:::-;-1:-1:-1;;;;;30810:11:0;;;;;;:8;:11;;;;;;;;;:19;;:63;;;;30893:38;;;;;;;30810:11;;30902:10;;30893:38;;;;;;;;;;30946:45;30962:1;30965:10;30977:13;30946:15;:45::i;:::-;-1:-1:-1;;;30518:3:0;;30478:525;;;;31013:29;31028:13;31013:14;:29::i;:::-;31053:41;31068:10;31080:13;31053:14;:41::i;:::-;-1:-1:-1;;22899:6:0;:14;;-1:-1:-1;;22899:14:0;;;-1:-1:-1;;;30071:1031:0:o;23209:22::-;;;;:::o;39998:1392::-;22830:6;;40155:21;;22830:6;;22829:7;22821:31;;;;;-1:-1:-1;;;22821:31:0;;;;;;;;;;;;-1:-1:-1;;;22821:31:0;;;;;;;;;;;;;;;22863:6;:13;;-1:-1:-1;;22863:13:0;22872:4;22863:13;;;;;-1:-1:-1;;;40197:9:0;;22863:13;40197:9;40189:39;;;;;-1:-1:-1;;;40189:39:0;;;;;;;;;;;;-1:-1:-1;;;40189:39:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;40247:17:0;;;;;;:8;:17;;;;;:23;;;40239:49;;;;;-1:-1:-1;;;40239:49:0;;;;;;;;;;;;-1:-1:-1;;;40239:49:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;40339:17:0;;;;;;:8;:17;;;;;:25;;;40338:46;;1012:8;40338:32;:46::i;:::-;40321:13;:63;;40299:129;;;;;-1:-1:-1;;;40299:129:0;;;;;;;;;;;;-1:-1:-1;;;40299:129:0;;;;;;;;;;;;;;;40441:51;40457:7;40466:10;40478:13;40441:15;:51::i;:::-;40525:16;40544:27;40563:7;;40544:13;:18;;:27;;;;:::i;:::-;40586:10;;40525:46;;-1:-1:-1;40586:10:0;;40582:81;;;40643:7;;40624:27;;:13;;:27;:18;:27;:::i;:::-;40613:38;;40582:81;40689:28;:13;40708:8;40689:28;:18;:28;:::i;:::-;-1:-1:-1;;;;;40756:17:0;;40730:23;40756:17;;;:8;:17;;;;;;;;;40845:16;;;;40876:15;;;;;40906:12;;40933;;40988:7;;40800:206;;-1:-1:-1;;;40800:206:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40673:44;;-1:-1:-1;40756:17:0;40800:5;;:30;;:206;;;;;40756:17;;40800:206;;;;;:5;:206;;;5:2:-1;;;;30:1;27;20:12;5:2;40800:206:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;40800:206:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;40800:206:0;;-1:-1:-1;41025:33:0;;;;41017:59;;;;;-1:-1:-1;;;41017:59:0;;;;;;;;;;;;-1:-1:-1;;;41017:59:0;;;;;;;;;;;;;;;41109:16;;;;41108:38;;41132:13;41108:38;:23;:38;:::i;:::-;41089:16;;;:57;41184:4;;41159:40;;41175:7;;-1:-1:-1;;;;;41184:4:0;41190:8;41159:15;:40::i;:::-;41215:44;;;;;;;;-1:-1:-1;;;;;41215:44:0;;;41224:10;;41215:44;;;;;;;;;41270:29;41285:13;41270:14;:29::i;:::-;41310:41;41325:10;41337:13;41310:14;:41::i;23238:22::-;;;;:::o;23500:23::-;;;-1:-1:-1;;;;;23500:23:0;;:::o;8022:105::-;-1:-1:-1;;;;;8105:14:0;8078:7;8105:14;;;;;;;;;;;;8022:105::o;23319:22::-;;;;:::o;33130:3176::-;22830:6;;33362:22;;;;22830:6;;22829:7;22821:31;;;;;-1:-1:-1;;;22821:31:0;;;;;;;;;;;;-1:-1:-1;;;22821:31:0;;;;;;;;;;;;;;;22863:6;:13;;-1:-1:-1;;22863:13:0;22872:4;22863:13;;;-1:-1:-1;;;;;33429:17:0;;22863:6;33429:17;;;:8;:17;;;;;:23;22863:13;33429:23;33421:49;;;;;-1:-1:-1;;;33421:49:0;;;;;;;;;;;;-1:-1:-1;;;33421:49:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;33489:18:0;;;;;;:8;:18;;;;;:24;;;33481:50;;;;;-1:-1:-1;;;33481:50:0;;;;;;;;;;;;-1:-1:-1;;;33481:50:0;;;;;;;;;;;;;;;33550:9;;-1:-1:-1;;;33550:9:0;;;;33542:39;;;;;-1:-1:-1;;;33542:39:0;;;;;;;;;;;;-1:-1:-1;;;33542:39:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;33620:26:0;;;33594:23;33620:26;;;:8;:26;;;;;;33684:27;;;;;;;33764:16;;;;33763:37;;1012:8;33763:23;:37::i;:::-;33746:13;:54;;33724:120;;;;;-1:-1:-1;;;33724:120:0;;;;;;;;;;;;-1:-1:-1;;;33724:120:0;;;;;;;;;;;;;;;33857:23;33896:5;:19;33934:8;:16;;;33969:8;:15;;;34003:9;:17;;;34039:9;:16;;;34074:7;;33896:200;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;33896:200:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;33896:200:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;33896:200:0;;-1:-1:-1;34115:27:0;;;;34107:59;;;;;-1:-1:-1;;;34107:59:0;;;;;;;;;;;;-1:-1:-1;;;34107:59:0;;;;;;;;;;;;;;;34196:199;34225:8;:16;;;34256:8;:15;;;34286:9;:17;;;34318:9;:16;;;34349:13;34377:7;;34196:14;:199::i;:::-;34179:216;;34432:12;34414:14;:30;;34406:56;;;;;-1:-1:-1;;;34406:56:0;;;;;;;;;;;;-1:-1:-1;;;34406:56:0;;;;;;;;;;;;;;;34514:34;:13;34533:14;34514:34;:18;:34;:::i;:::-;34495:15;:53;;34473:118;;;;;-1:-1:-1;;;34473:118:0;;;;;;;;;;;;-1:-1:-1;;;34473:118:0;;;;;;;;;;;;;;;34624:16;;;;34623:38;;34647:13;34623:38;:23;:38;:::i;:::-;34604:16;;;;:57;;;;34693:17;;;34692:40;;34717:14;34692:40;:24;:40;:::i;:::-;34672:9;:17;;:60;;;;34762:5;:19;34796:8;:16;;;34827:8;:15;;;34857:9;:17;;;34889:9;:16;;;34920:7;;34762:176;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;34762:176:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;34762:176:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;34762:176:0;;-1:-1:-1;34957:33:0;;;;34949:61;;;;;-1:-1:-1;;;34949:61:0;;;;;;;;;;;;-1:-1:-1;;;34949:61:0;;;;;;;;;;;;;;;35047:8;35029:14;:26;;35021:54;;;;;-1:-1:-1;;;35021:54:0;;;;;;;;;;;;-1:-1:-1;;;35021:54:0;;;;;;;;;;;;;;;35163:8;-1:-1:-1;;;;;35093:146:0;35141:7;-1:-1:-1;;;;;35093:146:0;35116:10;-1:-1:-1;;;;;35093:146:0;;35186:13;35214:14;35093:146;;;;;;;;;;;;;;;;;;;;;;;;35252:51;35268:7;35277:10;35289:13;35252:15;:51::i;:::-;35316:16;35335:27;35354:7;;35335:13;:18;;:27;;;;:::i;:::-;35316:46;-1:-1:-1;35399:17:0;-1:-1:-1;;;;;35449:22:0;;;;;;:61;;-1:-1:-1;;;;;;35488:22:0;;35500:10;35488:22;;35449:61;:99;;;;-1:-1:-1;;;;;;35527:21:0;;35539:9;35527:21;;35449:99;35431:398;;;-1:-1:-1;35598:1:0;35587:12;;35633:45;35649:7;35658:8;35587:12;35633:15;:45::i;:::-;35713:16;;;;35712:34;;35736:9;35712:34;:23;:34;:::i;:::-;35693:8;:16;;:53;;;;35798:7;-1:-1:-1;;;;;35766:51:0;35788:8;-1:-1:-1;;;;;35766:51:0;35776:10;-1:-1:-1;;;;;35766:51:0;;35807:9;35766:51;;;;;;;;;;;;;;;;;;35431:398;35861:16;35880:27;35899:7;;35880:13;:18;;:27;;;;:::i;:::-;35922:10;;35861:46;;-1:-1:-1;35922:10:0;;35918:78;;;35960:24;:8;35974:9;35960:24;:13;:24;:::i;:::-;35949:35;;35918:78;36042:8;36014:24;:8;36028:9;36014:24;:13;:24;:::i;:::-;:36;;36006:62;;;;;-1:-1:-1;;;36006:62:0;;;;;;;;;;;;-1:-1:-1;;;36006:62:0;;;;;;;;;;;;;;;36104:4;;36079:40;;36095:7;;-1:-1:-1;;;;;36104:4:0;36110:8;36079:15;:40::i;:::-;36150:16;;;;36149:33;;36173:8;36149:33;:23;:33;:::i;:::-;36130:16;;;:52;36195:53;36211:8;36221:10;36233:14;36195:15;:53::i;:::-;-1:-1:-1;;;;;;22899:6:0;:14;;-1:-1:-1;;22899:14:0;;;33130:3176;;;;-1:-1:-1;33130:3176:0;-1:-1:-1;;;;;33130:3176:0:o;36314:494::-;36510:21;36533:22;36588:212;36630:7;36656:11;36686:8;36713:14;36746:8;36781:3;36588:23;:212::i;:::-;36568:232;;;;36314:494;;;;;;;;:::o;36816:3174::-;22830:6;;37049:21;;;;22830:6;;22829:7;22821:31;;;;;-1:-1:-1;;;22821:31:0;;;;;;;;;;;;-1:-1:-1;;;22821:31:0;;;;;;;;;;;;;;;22863:6;:13;;-1:-1:-1;;22863:13:0;22872:4;22863:13;;;-1:-1:-1;;;;;37115:17:0;;22863:6;37115:17;;;:8;:17;;;;;:23;22863:13;37115:23;37107:49;;;;;-1:-1:-1;;;37107:49:0;;;;;;;;;;;;-1:-1:-1;;;37107:49:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;37175:18:0;;;;;;:8;:18;;;;;:24;;;37167:50;;;;;-1:-1:-1;;;37167:50:0;;;;;;;;;;;;-1:-1:-1;;;37167:50:0;;;;;;;;;;;;;;;37236:9;;-1:-1:-1;;;37236:9:0;;;;37228:39;;;;;-1:-1:-1;;;37228:39:0;;;;;;;;;;;;-1:-1:-1;;;37228:39:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;37306:26:0;;;37280:23;37306:26;;;:8;:26;;;;;;37370:27;;;;;;;1075:1;37451:17;;;37450:39;;1067:18;37450:24;:39::i;:::-;37432:14;:57;;37410:124;;;;;-1:-1:-1;;;37410:124:0;;;;;;;;;;;;-1:-1:-1;;;37410:124:0;;;;;;;;;;;;;;;37547:23;37586:5;:19;37624:8;:16;;;37659:8;:15;;;37693:9;:17;;;37729:9;:16;;;37764:7;;37586:200;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;37586:200:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;37586:200:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;37586:200:0;;-1:-1:-1;37805:27:0;;;;37797:59;;;;;-1:-1:-1;;;37797:59:0;;;;;;;;;;;;-1:-1:-1;;;37797:59:0;;;;;;;;;;;;;;;37885:200;37914:8;:16;;;37945:8;:15;;;37975:9;:17;;;38007:9;:16;;;38038:14;38067:7;;37885:14;:200::i;:::-;37869:216;;38121:11;38104:13;:28;;38096:53;;;;;-1:-1:-1;;;38096:53:0;;;;;;;;;;;;-1:-1:-1;;;38096:53:0;;;;;;;;;;;;;;;38201:34;:13;38220:14;38201:34;:18;:34;:::i;:::-;38182:15;:53;;38160:118;;;;;-1:-1:-1;;;38160:118:0;;;;;;;;;;;;-1:-1:-1;;;38160:118:0;;;;;;;;;;;;;;;38311:16;;;;38310:38;;38334:13;38310:38;:23;:38;:::i;:::-;38291:16;;;;:57;;;;38380:17;;;38379:40;;38404:14;38379:40;:24;:40;:::i;:::-;38359:9;:17;;:60;;;;38449:5;:19;38483:8;:16;;;38514:8;:15;;;38544:9;:17;;;38576:9;:16;;;38607:7;;38449:176;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;38449:176:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;38449:176:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;38449:176:0;;-1:-1:-1;38644:33:0;;;;38636:61;;;;;-1:-1:-1;;;38636:61:0;;;;;;;;;;;;-1:-1:-1;;;38636:61:0;;;;;;;;;;;;;;;38734:8;38716:14;:26;;38708:54;;;;;-1:-1:-1;;;38708:54:0;;;;;;;;;;;;-1:-1:-1;;;38708:54:0;;;;;;;;;;;;;;;38850:8;-1:-1:-1;;;;;38780:146:0;38828:7;-1:-1:-1;;;;;38780:146:0;38803:10;-1:-1:-1;;;;;38780:146:0;;38873:13;38901:14;38780:146;;;;;;;;;;;;;;;;;;;;;;;;38939:51;38955:7;38964:10;38976:13;38939:15;:51::i;:::-;39003:16;39022:27;39041:7;;39022:13;:18;;:27;;;;:::i;:::-;39003:46;-1:-1:-1;39084:17:0;-1:-1:-1;;;;;39134:22:0;;;;;;:61;;-1:-1:-1;;;;;;39173:22:0;;39185:10;39173:22;;39134:61;:99;;;;-1:-1:-1;;;;;;39212:21:0;;39224:9;39212:21;;39134:99;39116:398;;;-1:-1:-1;39283:1:0;39272:12;;39318:45;39334:7;39343:8;39272:12;39318:15;:45::i;:::-;39398:16;;;;39397:34;;39421:9;39397:34;:23;:34;:::i;:::-;39378:8;:16;;:53;;;;39483:7;-1:-1:-1;;;;;39451:51:0;39473:8;-1:-1:-1;;;;;39451:51:0;39461:10;-1:-1:-1;;;;;39451:51:0;;39492:9;39451:51;;;;;;;;;;;;;;;;;;39116:398;39546:16;39565:27;39584:7;;39565:13;:18;;:27;;;;:::i;:::-;39607:10;;39546:46;;-1:-1:-1;39607:10:0;;39603:78;;;39645:24;:8;39659:9;39645:24;:13;:24;:::i;:::-;39634:35;;39603:78;39727:8;39699:24;:8;39713:9;39699:24;:13;:24;:::i;:::-;:36;;39691:62;;;;;-1:-1:-1;;;39691:62:0;;;;;;;;;;;;-1:-1:-1;;;39691:62:0;;;;;;;;;;;;;;;39789:4;;39764:40;;39780:7;;-1:-1:-1;;;;;39789:4:0;39795:8;39764:15;:40::i;:::-;39835:16;;;;39834:33;;39858:8;39834:33;:23;:33;:::i;:::-;39815:16;;;:52;39880:53;39896:8;39906:10;39918:14;39880:15;:53::i;32629:493::-;32824:22;32848;32903:211;32944:7;32970:13;33002:8;33029:12;33060:8;33095:3;32903:22;:211::i;777:43::-;815:5;777:43;:::o;28611:193::-;22743:10;-1:-1:-1;;;;;22725:39:0;22734:7;;-1:-1:-1;;;;;;22734:7:0;-1:-1:-1;;;;;22725:39:0;;22755:8;;22725:39;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;;74:27;22725:39:0;;137:4:-1;117:14;;;-1:-1;;113:30;157:16;;;22725:39:0;;;;-1:-1:-1;22725:39:0;;-1:-1:-1;;;;22725:39:0;22830:6;;;;22829:7;22821:31;;;;;-1:-1:-1;;;22821:31:0;;;;;;;;;;;;-1:-1:-1;;;22821:31:0;;;;;;;;;;;;;;;22863:6;:13;;-1:-1:-1;;22863:13:0;22872:4;22863:13;;;-1:-1:-1;;;;;28682:15:0;;22863:6;28682:15;;;:8;:15;;;;;:21;22863:13;28682:21;28674:47;;;;;-1:-1:-1;;;28674:47:0;;;;;;;;;;;;-1:-1:-1;;;28674:47:0;;;;;;;;;;;;;;;28758:38;;;-1:-1:-1;;;28758:38:0;;28790:4;28758:38;;;;;;-1:-1:-1;;;;;28758:23:0;;;;;:38;;;;;;;;;;;;;;:23;:38;;;5:2:-1;;;;30:1;27;20:12;5:2;28758:38:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;28758:38:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;28758:38:0;-1:-1:-1;;;;;28732:15:0;;;;;;;:8;28758:38;28732:15;;;;:23;;:64;22899:6;:14;;-1:-1:-1;;22899:14:0;;;28611:193::o;25278:258::-;22743:10;-1:-1:-1;;;;;22725:39:0;22734:7;;-1:-1:-1;;;;;;22734:7:0;-1:-1:-1;;;;;22725:39:0;;22755:8;;22725:39;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;;74:27;22725:39:0;;137:4:-1;117:14;;;-1:-1;;113:30;157:16;;;22725:39:0;;;;-1:-1:-1;22725:39:0;;-1:-1:-1;;;;22725:39:0;25367:10;;;;;-1:-1:-1;;;;;25367:10:0;25353;:24;25345:55;;;;;-1:-1:-1;;;25345:55:0;;;;;;;;;;;;-1:-1:-1;;;25345:55:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;25419:21:0;;25411:47;;;;;-1:-1:-1;;;25411:47:0;;;;;;;;;;;;-1:-1:-1;;;25411:47:0;;;;;;;;;;;;;;;25469:10;:20;;-1:-1:-1;;;;;;25469:20:0;;-1:-1:-1;;;;;25469:20:0;;;;;;;;;;;;25505:23;;;;-1:-1:-1;;25505:23:0;25278:258;:::o;24581:160::-;22971:6;;24689:7;;22971:6;;22970:7;22962:31;;;;;-1:-1:-1;;;22962:31:0;;;;;;;;;;;;-1:-1:-1;;;22962:31:0;;;;;;;;;;;;;;;-1:-1:-1;24721:12:0;;24581:160;:::o;911:53::-;954:10;911:53;:::o;23530:21::-;;;-1:-1:-1;;;;;23530:21:0;;:::o;24337:236::-;22971:6;;24453:7;;22971:6;;22970:7;22962:31;;;;;-1:-1:-1;;;22962:31:0;;;;;;;;;;;;-1:-1:-1;;;22962:31:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;24486:15:0;;;;;;:8;:15;;;;;:21;;;24478:47;;;;;-1:-1:-1;;;24478:47:0;;;;;;;;;;;;-1:-1:-1;;;24478:47:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;;24543:15:0;;;;;:8;:15;;;;;:22;;;;24337:236::o;7669:89::-;7743:7;;;;;;;;;;;;-1:-1:-1;;;7743:7:0;;;;7669:89;:::o;1027:58::-;1067:18;1027:58;:::o;26442:1117::-;22830:6;;;;22829:7;22821:31;;;;;-1:-1:-1;;;22821:31:0;;;;;;;;;;;;-1:-1:-1;;;22821:31:0;;;;;;;;;;;;;;;22863:6;:13;;22872:4;-1:-1:-1;;22863:13:0;;;;;;;;;26536:10;;-1:-1:-1;;;;;26536:10:0;26522;:24;26514:55;;;;;-1:-1:-1;;;26514:55:0;;;;;;;;;;;;-1:-1:-1;;;26514:55:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;26589:15:0;;;;;;:8;:15;;;;;:21;;;26588:22;26580:47;;;;;-1:-1:-1;;;26580:47:0;;;;;;;;;;;;-1:-1:-1;;;26580:47:0;;;;;;;;;;;;;;;26647:9;;-1:-1:-1;;;26647:9:0;;;;26646:10;26638:39;;;;;-1:-1:-1;;;26638:39:0;;;;;;;;;;;;-1:-1:-1;;;26638:39:0;;;;;;;;;;;;;;;26698:7;:14;511:1;-1:-1:-1;26690:60:0;;;;;-1:-1:-1;;;26690:60:0;;;;;;;;;;;;-1:-1:-1;;;26690:60:0;;;;;;;;;;;;;;;402:6;26771;:20;;26763:47;;;;;-1:-1:-1;;;26763:47:0;;;;;;;;;;;;-1:-1:-1;;;26763:47:0;;;;;;;;;;;;;;;656:9;26829:20;;;26821:47;;;;;-1:-1:-1;;;26821:47:0;;;;;;;;;;;;-1:-1:-1;;;26821:47:0;;;;;;;;;;;;;;;26899:38;;;-1:-1:-1;;;26899:38:0;;26931:4;26899:38;;;;;;26881:15;;-1:-1:-1;;;;;26899:23:0;;;;;:38;;;;;;;;;;;;;;;:23;:38;;;5:2:-1;;;;30:1;27;20:12;5:2;26899:38:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;26899:38:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;26899:38:0;26980:24;;;-1:-1:-1;;;26980:24:0;;;;26899:38;;-1:-1:-1;26950:15:0;;-1:-1:-1;;;;;26980:22:0;;;;;:24;;;;;26899:38;;26980:24;;;;;;;:22;:24;;;5:2:-1;;;;30:1;27;20:12;5:2;26980:24:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;26980:24:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;26980:24:0;26972:33;;26968:2;:37;;-1:-1:-1;27035:5:0;27024:16;;;27016:42;;;;;-1:-1:-1;;;27016:42:0;;;;;;;;;;;;-1:-1:-1;;;27016:42:0;;;;;;;;;;;;;;;815:5;27117:7;:21;27106:7;:32;;27098:60;;;;;-1:-1:-1;;;27098:60:0;;;;;;;;;;;;-1:-1:-1;;;27098:60:0;;;;;;;;;;;;;;;27186:12;;:25;;27204:6;27186:25;:17;:25;:::i;:::-;27171:12;:40;;;715:9;-1:-1:-1;27230:32:0;27222:65;;;;;-1:-1:-1;;;27222:65:0;;;;;;;;;;;;-1:-1:-1;;;27222:65:0;;;;;;;;;;;;;;;27318:141;;;;;;;;27347:4;27318:141;;;27373:7;:14;;27318:141;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;27300:15:0;;-1:-1:-1;27300:15:0;;;:8;:15;;;;;:159;;;;-1:-1:-1;;27300:159:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;27:10:-1;;23:18;;;45:23;;27470:19:0;;;;;;;;;-1:-1:-1;;;;;;27470:19:0;;;;;27507:44;;;;;;;;;;;;;27300:15;;27516:10;;27507:44;;;;;;;;;;-1:-1:-1;;22899:6:0;:14;;-1:-1:-1;;22899:14:0;;;-1:-1:-1;;26442:1117:0:o;8429:136::-;8491:4;8508:27;8514:10;8526:3;8531;8508:5;:27::i;:::-;-1:-1:-1;8553:4:0;8429:136;;;;:::o;31110:1511::-;22830:6;;;;22829:7;22821:31;;;;;-1:-1:-1;;;22821:31:0;;;;;;;;;;;;-1:-1:-1;;;22821:31:0;;;;;;;;;;;;;;;22863:6;:13;;-1:-1:-1;;22863:13:0;22872:4;22863:13;;;;;-1:-1:-1;;;31242:9:0;;22863:13;31242:9;31234:39;;;;;-1:-1:-1;;;31234:39:0;;;;;;;;;;;;-1:-1:-1;;;31234:39:0;;;;;;;;;;;;;;;31316:7;:14;31292:38;;31284:70;;;;;-1:-1:-1;;;31284:70:0;;;;;;;;;;;;-1:-1:-1;;;31284:70:0;;;;;;;;;;;;;;;897:5;31403:12;:31;;31395:58;;;;;-1:-1:-1;;;31395:58:0;;;;;;;;;;;;-1:-1:-1;;;31395:58:0;;;;;;;;;;;;;;;31466:17;31486:13;:11;:13::i;:::-;31466:33;;31510:16;31529:26;31547:7;;31529:12;:17;;:26;;;;:::i;:::-;31634:6;;31510:45;;-1:-1:-1;;;;;;31634:6:0;31620:10;:20;31616:65;;;-1:-1:-1;31668:1:0;31616:65;31691:23;31717:27;:12;31735:8;31717:27;:17;:27;:::i;:::-;31691:53;-1:-1:-1;31755:13:0;31771:31;31691:53;31792:9;31771:31;:20;:31;:::i;:::-;31755:47;-1:-1:-1;31821:10:0;31813:38;;;;;-1:-1:-1;;;31813:38:0;;;;;;;;;;;;-1:-1:-1;;;31813:38:0;;;;;;;;;;;;;;;31864:40;31879:10;31891:12;31864:14;:40::i;:::-;31954:12;;31950:77;;31998:6;;31983:32;;-1:-1:-1;;;;;31998:6:0;32006:8;31983:14;:32::i;:::-;32037:31;32052:15;32037:14;:31::i;:::-;32086:9;32081:533;32105:7;:14;32101:18;;32081:533;;;32141:9;32153:7;32161:1;32153:10;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;32153:10:0;32192:11;;;:8;:11;;;;;;:19;;;32153:10;;-1:-1:-1;32192:19:0;32251:15;:5;32192:19;32251:15;:10;:15;:::i;:::-;32226:40;-1:-1:-1;32289:19:0;32281:47;;;;;-1:-1:-1;;;32281:47:0;;;;;;;;;;;;-1:-1:-1;;;32281:47:0;;;;;;;;;;;;;;;32369:13;;32383:1;32369:16;;;;;;;;;;;;;32351:14;:34;;32343:60;;;;;-1:-1:-1;;;32343:60:0;;;;;;;;;;;;-1:-1:-1;;;32343:60:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;32441:11:0;;;;;;:8;:11;;;;;:19;;;32440:42;;32467:14;32440:42;:26;:42;:::i;:::-;-1:-1:-1;;;;;32418:11:0;;;;;;:8;:11;;;;;;;;;:19;;:64;;;;32502:39;;;;;;;32418:11;;32511:10;;32502:39;;;;;;;;;;32556:46;32572:1;32575:10;32587:14;32556:15;:46::i;:::-;-1:-1:-1;;;32121:3:0;;32081:533;;;-1:-1:-1;;22899:6:0;:14;;-1:-1:-1;;22899:14:0;;;-1:-1:-1;;;;;;31110:1511:0:o;468:44::-;511:1;468:44;:::o;23179:21::-;;;-1:-1:-1;;;23179:21:0;;;;;:::o;417:44::-;460:1;417:44;:::o;43108:517::-;43391:226;;;-1:-1:-1;;;43391:226:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43351:7;;43391:5;;:20;;:226;;;;;;;;;;;;;;;:5;:226;;;5:2:-1;;;;30:1;27;20:12;5:2;43391:226:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;43391:226:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;43391:226:0;;43108:517;-1:-1:-1;;;;;;;43108:517:0:o;24120:209::-;22971:6;;24216:23;;22971:6;;22970:7;22962:31;;;;;-1:-1:-1;;;22962:31:0;;;;;;;;;;;;-1:-1:-1;;;22962:31:0;;;;;;;;;;;;;;;24265:9;;-1:-1:-1;;;24265:9:0;;;;24257:39;;;;;-1:-1:-1;;;24257:39:0;;;;;;;;;;;;-1:-1:-1;;;24257:39:0;;;;;;;;;;;;;;;24314:7;24307:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;24307:14:0;;;;;;;;;;;;;;;;;;;;;;;24120:209;:::o;24016:96::-;24090:7;:14;24016:96;:::o;25907:277::-;26004:7;;-1:-1:-1;;;;;26004:7:0;25982:10;:30;25974:57;;;;;-1:-1:-1;;;25974:57:0;;;;;;;;;;;;-1:-1:-1;;;25974:57:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;26050:18:0;;26042:44;;;;;-1:-1:-1;;;26042:44:0;;;;;;;;;;;;-1:-1:-1;;;26042:44:0;;;;;;;;;;;;;;;26097:4;:11;;-1:-1:-1;;;;;26097:11:0;;-1:-1:-1;;;;;;26097:11:0;;;;;;;;26119:7;:13;;;26150:26;;;;;;;;;;;;;;;;;25907:277;;:::o;7859:155::-;-1:-1:-1;;;;;7986:15:0;;;7954:7;7986:15;;;:10;:15;;;;;;;;:20;;;;;;;;;;;;;7859:155::o;25544:293::-;25606:9;;-1:-1:-1;;;25606:9:0;;;;25605:10;25597:39;;;;;-1:-1:-1;;;25597:39:0;;;;;;;;;;;;-1:-1:-1;;;25597:39:0;;;;;;;;;;;;;;;25669:10;;;;;-1:-1:-1;;;;;25669:10:0;25655;:24;25647:55;;;;;-1:-1:-1;;;25647:55:0;;;;;;;;;;;;-1:-1:-1;;;25647:55:0;;;;;;;;;;;;;;;25728:7;;;;;;;;;-1:-1:-1;;;;;25728:7:0;-1:-1:-1;;;;;25728:21:0;;:23;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;25728:23:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;25728:23:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;25728:23:0;25721:30;;;25713:59;;;;;-1:-1:-1;;;25713:59:0;;;;;;;;;;;;-1:-1:-1;;;25713:59:0;;;;;;;;;;;;;;;25783:7;:13;;;25812:17;;;;;;;;;;;;;;;;;25544:293;:::o;23348:22::-;;;;;;:::o;973:47::-;1012:8;973:47;:::o;24749:287::-;22971:6;;24863:7;;22971:6;;22970:7;22962:31;;;;;-1:-1:-1;;;22962:31:0;;;;;;;;;;;;-1:-1:-1;;;22962:31:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;24896:15:0;;;;;;:8;:15;;;;;:21;;;24888:47;;;;;-1:-1:-1;;;24888:47:0;;;;;;;;;;;;-1:-1:-1;;;24888:47:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;24963:15:0;;24946:14;24963:15;;;:8;:15;;;;;:22;;;25015:12;;25003:25;;24963:22;;25003:25;:11;:25;:::i;:::-;24996:32;24749:287;-1:-1:-1;;;24749:287:0:o;21174:159::-;;;;;;;;;;;;;-1:-1:-1;21174:159:0;:::o;23049:25::-;;;;;;-1:-1:-1;;;;;23049:25:0;;:::o;25044:226::-;22971:6;;25149:7;;22971:6;;22970:7;22962:31;;;;;-1:-1:-1;;;22962:31:0;;;;;;;;;;;;-1:-1:-1;;;22962:31:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;25182:15:0;;;;;;:8;:15;;;;;:21;;;25174:47;;;;;-1:-1:-1;;;25174:47:0;;;;;;;;;;;;-1:-1:-1;;;25174:47:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;;25239:15:0;;;;;:8;:15;;;;;:23;;;;25044:226::o;43633:519::-;43917:227;;;-1:-1:-1;;;43917:227:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43877:7;;43917:5;;:20;;:227;;;;;;;;;;;;;;;:5;:227;;;5:2:-1;;;;30:1;27;20:12;45608:81:0;45668:13;45674:6;45668:5;:13::i;:::-;45608:81;:::o;45488:112::-;45560:32;45574:4;45581:2;45585:6;45560:5;:32::i;:::-;45488:112;;:::o;7022:312::-;-1:-1:-1;;;;;7138:13:0;;:8;:13;;;;;;;;;;;:20;-1:-1:-1;7138:20:0;7130:53;;;;;-1:-1:-1;;;7130:53:0;;;;;;;;;;;;-1:-1:-1;;;7130:53:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;7211:13:0;;:8;:13;;;;;;;;;;;7210:25;;7231:3;7210:25;:20;:25;:::i;:::-;-1:-1:-1;;;;;7194:13:0;;;:8;:13;;;;;;;;;;;:41;;;;7263:13;;;;;;;7262:25;;7283:3;7262:25;:20;:25;:::i;:::-;-1:-1:-1;;;;;7246:13:0;;;:8;:13;;;;;;;;;;;;:41;;;;7303:23;;;;;;;7246:13;;7303:23;;;;;;;;;;;;;7022:312;;;:::o;1782:191::-;1841:7;1862:9;1873;1886:14;1895:1;1898;1886:8;:14::i;:::-;1861:39;;;;1920:4;1919:5;1911:35;;;;;-1:-1:-1;;;1911:35:0;;;;;;;;;;;;-1:-1:-1;;;1911:35:0;;;;;;;;;;;;;;;-1:-1:-1;1964:1:0;1782:191;-1:-1:-1;;;1782:191:0:o;45364:116::-;45438:34;45444:4;45458;45465:6;45438:5;:34::i;2230:306::-;2289:7;2322:5;;;2346:6;;;:21;;;2366:1;2361;2356:2;:6;;;;;;:11;2346:21;2338:50;;;;;-1:-1:-1;;;2338:50:0;;;;;;;;;;;;-1:-1:-1;;;2338:50:0;;;;;;;;;;;;;;;2418:8;2412:15;;2446:8;;;;2438:37;;;;;-1:-1:-1;;;2438:37:0;;;;;;;;;;;;-1:-1:-1;;;2438:37:0;;;;;;;;;;;;;;;2486:10;1206:6;2499:2;:9;;;2230:306;-1:-1:-1;;;;;;2230:306:0:o;45697:81::-;45757:13;45763:6;45757:5;:13::i;44913:443::-;45162:46;;;-1:-1:-1;;;;;45162:46:0;;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;45162:46:0;;;;;;;25:18:-1;;61:17;;-1:-1;;;;;182:15;-1:-1;;;179:29;160:49;;45151:58:0;;;;45103:12;;45117:17;;45151:10;;;;45162:46;45151:58;;;25:18:-1;45151:58:0;;25:18:-1;36:153;66:2;61:3;58:11;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;45151:58:0;;;;;;;;;;;;;;;;;;;;;;;;14:1:-1;21;16:31;;;;75:4;69:11;64:16;;144:4;140:9;133:4;115:16;111:27;107:43;104:1;100:51;94:4;87:65;169:16;166:1;159:27;225:16;222:1;215:4;212:1;208:12;193:49;7:242;;16:31;36:4;31:9;;7:242;;45102:107:0;;;;45242:7;:57;;;;-1:-1:-1;45254:11:0;;:16;;:44;;;45285:4;45274:24;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;45274:24:0;45254:44;45220:128;;;;;-1:-1:-1;;;45220:128:0;;;;;;;;;;;;-1:-1:-1;;;45220:128:0;;;;;;;;;;;;;;;44913:443;;;;;:::o;2544:382::-;2603:7;2631:6;2623:31;;;;;-1:-1:-1;;;2623:31:0;;;;;;;;;;;;-1:-1:-1;;;2623:31:0;;;;;;;;;;;;;;;1206:6;2678:8;;2705:6;;;:24;;;1206:6;2720:1;2715:2;:6;;;;;;:14;2705:24;2697:53;;;;;-1:-1:-1;;;2697:53:0;;;;;;;;;;;;-1:-1:-1;;;2697:53:0;;;;;;;;;;;;;;;2801:1;2797:5;;2791:12;;2822:8;;;;2814:37;;;;;-1:-1:-1;;;2814:37:0;;;;;;;;;;;;-1:-1:-1;;;2814:37:0;;;;;;;;;;;;;;;2879:10;2897:1;2892:2;:6;;;;1605:169;1664:7;1696:5;;;1720:6;;;;1712:35;;;;;-1:-1:-1;;;1712:35:0;;;;;;;;;;;;-1:-1:-1;;;1712:35:0;;;;;;;;;;;;;;44394:511;44675:63;;;-1:-1:-1;;;;;44675:63:0;;;;;;;44724:4;44675:63;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;44675:63:0;;;;;;;25:18:-1;;61:17;;-1:-1;;;;;182:15;-1:-1;;;179:29;160:49;;44646:107:0;;;;44598:12;;44612:17;;44646:10;;;;44675:63;44646:107;;;25:18:-1;44646:107:0;;25:18:-1;36:153;66:2;61:3;58:11;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;44646:107:0;;;;;;;;;;;;;;;;;;;;;;;;14:1:-1;21;16:31;;;;75:4;69:11;64:16;;144:4;140:9;133:4;115:16;111:27;107:43;104:1;100:51;94:4;87:65;169:16;166:1;159:27;225:16;222:1;215:4;212:1;208:12;193:49;7:242;;16:31;36:4;31:9;;7:242;;44597:156:0;;;;44786:7;:57;;;;-1:-1:-1;44798:11:0;;:16;;:44;;;44829:4;44818:24;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;44818:24:0;44798:44;44764:133;;;;;-1:-1:-1;;;44764:133:0;;;;;;;;;;;;;;;;;;;;;;;;;;;6490:221;6582:4;6565:8;:23;;;;;;;;;;;6564:35;;6595:3;6564:35;:30;:35;:::i;:::-;6555:4;6538:8;:23;;;;;;;;;;:61;6625:12;;:22;;6643:3;6625:22;:17;:22;:::i;:::-;6610:12;:37;6663:40;;;;;;;;6692:4;;6680:1;;6663:40;;;;;;;;;6490:221;:::o;1981:241::-;2071:7;2080:4;2111:1;2106;:6;2102:113;;-1:-1:-1;;2137:5:0;;;2144;2129:21;;2102:113;-1:-1:-1;;2191:5:0;;;2198:4;2102:113;1981:241;;;;;:::o;6719:295::-;6792:4;6775:8;:23;;;;;;;;;;;:30;-1:-1:-1;6775:30:0;6767:63;;;;;-1:-1:-1;;;6767:63:0;;;;;;;;;;;;-1:-1:-1;;;6767:63:0;;;;;;;;;;;;;;;6885:4;6868:8;:23;;;;;;;;;;;6867:35;;6898:3;6867:35;:30;:35;:::i;:::-;6858:4;6841:8;:23;;;;;;;;;;:61;6928:12;;:22;;6946:3;6928:22;:17;:22;:::i;:::-;6913:12;:37;6966:40;;;;;;;;6998:1;;6983:4;;6966:40;;;;;;;;;6719:295;:::o

Swarm Source

bzzr://e4bc0b79265b34f3071fc12ee0e04d56963a3285dc6081942b73e464bfc1c8b0

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.