Contract 0xe33c4f54212e6690e923c39ab6fb9ec9e36c7735

 
Txn Hash Method
Block
From
To
Value [Txn Fee]
0x0b2284e609855078ad4094aefaf515a1e772df49a1340e0b353637a96830ee360x608060402266502021-08-30 10:12:08994 days 1 hr ago0x7081685ff3ff16fb6c0df08ac93bdb7299eeefc9 IN  Create: DODO0 ETH0.164325818202 ETH0.868038491
[ Download CSV Export 
Latest 25 internal transaction
Parent Txn Hash Block From To Value
0x48f4a5524db7960441318ae4147eda2dd453924b36d564590fca5f6402bb1824720865502023-03-21 10:18:18426 days 1 hr ago DODO: USDT-USDC Pair V1 0xe33c4f54212e6690e923c39ab6fb9ec9e36c77350 ETH
0x48f4a5524db7960441318ae4147eda2dd453924b36d564590fca5f6402bb1824720865502023-03-21 10:18:18426 days 1 hr ago DODO: USDT-USDC Pair V1 0xe33c4f54212e6690e923c39ab6fb9ec9e36c77350 ETH
0x5688b4dce2dbfe775db3d877737029b337979fca3f0181b0646c5a2d4c3ed270720853882023-03-21 10:13:29426 days 1 hr ago DODO: USDT-USDC Pair V1 0xe33c4f54212e6690e923c39ab6fb9ec9e36c77350 ETH
0x5688b4dce2dbfe775db3d877737029b337979fca3f0181b0646c5a2d4c3ed270720853882023-03-21 10:13:29426 days 1 hr ago DODO: USDT-USDC Pair V1 0xe33c4f54212e6690e923c39ab6fb9ec9e36c77350 ETH
0x2d32b9b47b70005916eb1d6120644e67eec9b2c008eaceee620dde7b2eea2fc9720850752023-03-21 10:12:10426 days 1 hr ago DODO: USDT-USDC Pair V1 0xe33c4f54212e6690e923c39ab6fb9ec9e36c77350 ETH
0x2d32b9b47b70005916eb1d6120644e67eec9b2c008eaceee620dde7b2eea2fc9720850752023-03-21 10:12:10426 days 1 hr ago DODO: USDT-USDC Pair V1 0xe33c4f54212e6690e923c39ab6fb9ec9e36c77350 ETH
0x2d32b9b47b70005916eb1d6120644e67eec9b2c008eaceee620dde7b2eea2fc9720850752023-03-21 10:12:10426 days 1 hr ago DODO: USDT-USDC Pair V1 0xe33c4f54212e6690e923c39ab6fb9ec9e36c77350 ETH
0x2d32b9b47b70005916eb1d6120644e67eec9b2c008eaceee620dde7b2eea2fc9720850752023-03-21 10:12:10426 days 1 hr ago DODO: USDT-USDC Pair V1 0xe33c4f54212e6690e923c39ab6fb9ec9e36c77350 ETH
0x2d32b9b47b70005916eb1d6120644e67eec9b2c008eaceee620dde7b2eea2fc9720850752023-03-21 10:12:10426 days 1 hr ago DODO: USDT-USDC Pair V1 0xe33c4f54212e6690e923c39ab6fb9ec9e36c77350 ETH
0x2d32b9b47b70005916eb1d6120644e67eec9b2c008eaceee620dde7b2eea2fc9720850752023-03-21 10:12:10426 days 1 hr ago DODO: USDT-USDC Pair V1 0xe33c4f54212e6690e923c39ab6fb9ec9e36c77350 ETH
0x7927aa6ea1463c4a21f6023373101e7175efb8554065876692752d6fdb33846c720849182023-03-21 10:11:37426 days 1 hr ago DODO: USDT-USDC Pair V1 0xe33c4f54212e6690e923c39ab6fb9ec9e36c77350 ETH
0x7927aa6ea1463c4a21f6023373101e7175efb8554065876692752d6fdb33846c720849182023-03-21 10:11:37426 days 1 hr ago DODO: USDT-USDC Pair V1 0xe33c4f54212e6690e923c39ab6fb9ec9e36c77350 ETH
0x1486d3a8965cac1e8dc09fefb3038aed01bf36dd09d5676d954130824f2d2695720845722023-03-21 10:10:07426 days 1 hr ago DODO: USDT-USDC Pair V1 0xe33c4f54212e6690e923c39ab6fb9ec9e36c77350 ETH
0x1486d3a8965cac1e8dc09fefb3038aed01bf36dd09d5676d954130824f2d2695720845722023-03-21 10:10:07426 days 1 hr ago DODO: USDT-USDC Pair V1 0xe33c4f54212e6690e923c39ab6fb9ec9e36c77350 ETH
0x1486d3a8965cac1e8dc09fefb3038aed01bf36dd09d5676d954130824f2d2695720845722023-03-21 10:10:07426 days 1 hr ago DODO: USDT-USDC Pair V1 0xe33c4f54212e6690e923c39ab6fb9ec9e36c77350 ETH
0xe9811b9bd4a74bcc520bda8f24abbbc37b2898d5895334cab247a0ba12a9f91d720845252023-03-21 10:09:56426 days 1 hr ago DODO: USDT-USDC Pair V1 0xe33c4f54212e6690e923c39ab6fb9ec9e36c77350 ETH
0xe9811b9bd4a74bcc520bda8f24abbbc37b2898d5895334cab247a0ba12a9f91d720845252023-03-21 10:09:56426 days 1 hr ago DODO: USDT-USDC Pair V1 0xe33c4f54212e6690e923c39ab6fb9ec9e36c77350 ETH
0x668f8b9e0f8ed5c178bce70ec4bd85bcd071a5e6bfb82ae9354ee9874bb42334720843542023-03-21 10:09:13426 days 1 hr ago DODO: USDT-USDC Pair V1 0xe33c4f54212e6690e923c39ab6fb9ec9e36c77350 ETH
0x668f8b9e0f8ed5c178bce70ec4bd85bcd071a5e6bfb82ae9354ee9874bb42334720843542023-03-21 10:09:13426 days 1 hr ago DODO: USDT-USDC Pair V1 0xe33c4f54212e6690e923c39ab6fb9ec9e36c77350 ETH
0x03ba35f89e20efba570ab79cd364fc9465f50c8dacf36271da8bce4b9a84e0d4720837342023-03-21 10:06:36426 days 1 hr ago DODO: USDT-USDC Pair V1 0xe33c4f54212e6690e923c39ab6fb9ec9e36c77350 ETH
0x03ba35f89e20efba570ab79cd364fc9465f50c8dacf36271da8bce4b9a84e0d4720837342023-03-21 10:06:36426 days 1 hr ago DODO: USDT-USDC Pair V1 0xe33c4f54212e6690e923c39ab6fb9ec9e36c77350 ETH
0x03ba35f89e20efba570ab79cd364fc9465f50c8dacf36271da8bce4b9a84e0d4720837342023-03-21 10:06:36426 days 1 hr ago DODO: USDT-USDC Pair V1 0xe33c4f54212e6690e923c39ab6fb9ec9e36c77350 ETH
0x03ba35f89e20efba570ab79cd364fc9465f50c8dacf36271da8bce4b9a84e0d4720837342023-03-21 10:06:36426 days 1 hr ago DODO: USDT-USDC Pair V1 0xe33c4f54212e6690e923c39ab6fb9ec9e36c77350 ETH
0x03ba35f89e20efba570ab79cd364fc9465f50c8dacf36271da8bce4b9a84e0d4720837342023-03-21 10:06:36426 days 1 hr ago DODO: USDT-USDC Pair V1 0xe33c4f54212e6690e923c39ab6fb9ec9e36c77350 ETH
0x03ba35f89e20efba570ab79cd364fc9465f50c8dacf36271da8bce4b9a84e0d4720837342023-03-21 10:06:36426 days 1 hr ago DODO: USDT-USDC Pair V1 0xe33c4f54212e6690e923c39ab6fb9ec9e36c77350 ETH
[ Download CSV Export 
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
DODO

Compiler Version
v0.6.9+commit.3e3065ac

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, Apache-2.0 license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Arbiscan.io on 2021-08-30
*/

// File: contracts/lib/Types.sol

/*

    Copyright 2020 DODO ZOO.
    SPDX-License-Identifier: Apache-2.0

*/

pragma solidity 0.6.9;
pragma experimental ABIEncoderV2;

library Types {
    enum RStatus {ONE, ABOVE_ONE, BELOW_ONE}
}

// File: contracts/intf/IERC20.sol


/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

    function decimals() external view returns (uint8);

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

    /**
     * @dev Returns the amount of tokens owned by `account`.
     */
    function balanceOf(address account) external view returns (uint256);

    /**
     * @dev Moves `amount` tokens from the caller's account to `recipient`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address recipient, uint256 amount) external returns (bool);

    /**
     * @dev Returns the remaining number of tokens that `spender` will be
     * allowed to spend on behalf of `owner` through {transferFrom}. This is
     * zero by default.
     *
     * This value changes when {approve} or {transferFrom} are called.
     */
    function allowance(address owner, address spender) external view returns (uint256);

    /**
     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * IMPORTANT: Beware that changing an allowance with this method brings the risk
     * that someone may use both the old and the new allowance by unfortunate
     * transaction ordering. One possible solution to mitigate this race
     * condition is to first reduce the spender's allowance to 0 and set the
     * desired value afterwards:
     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
     *
     * Emits an {Approval} event.
     */
    function approve(address spender, uint256 amount) external returns (bool);

    /**
     * @dev Moves `amount` tokens from `sender` to `recipient` using the
     * allowance mechanism. `amount` is then deducted from the caller's
     * allowance.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address sender,
        address recipient,
        uint256 amount
    ) external returns (bool);
}

// File: contracts/lib/InitializableOwnable.sol

/**
 * @title Ownable
 * @author DODO Breeder
 *
 * @notice Ownership related functions
 */
contract InitializableOwnable {
    address public _OWNER_;
    address public _NEW_OWNER_;

    // ============ Events ============

    event OwnershipTransferPrepared(address indexed previousOwner, address indexed newOwner);

    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);

    // ============ Modifiers ============

    modifier onlyOwner() {
        require(msg.sender == _OWNER_, "NOT_OWNER");
        _;
    }

    // ============ Functions ============

    function transferOwnership(address newOwner) external onlyOwner {
        require(newOwner != address(0), "INVALID_OWNER");
        emit OwnershipTransferPrepared(_OWNER_, newOwner);
        _NEW_OWNER_ = newOwner;
    }

    function claimOwnership() external {
        require(msg.sender == _NEW_OWNER_, "INVALID_CLAIM");
        emit OwnershipTransferred(_OWNER_, _NEW_OWNER_);
        _OWNER_ = _NEW_OWNER_;
        _NEW_OWNER_ = address(0);
    }
}

// File: contracts/lib/SafeMath.sol


/**
 * @title SafeMath
 * @author DODO Breeder
 *
 * @notice Math operations with safety checks that revert on error
 */
library SafeMath {
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        if (a == 0) {
            return 0;
        }

        uint256 c = a * b;
        require(c / a == b, "MUL_ERROR");

        return c;
    }

    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        require(b > 0, "DIVIDING_ERROR");
        return a / b;
    }

    function divCeil(uint256 a, uint256 b) internal pure returns (uint256) {
        uint256 quotient = div(a, b);
        uint256 remainder = a - quotient * b;
        if (remainder > 0) {
            return quotient + 1;
        } else {
            return quotient;
        }
    }

    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        require(b <= a, "SUB_ERROR");
        return a - b;
    }

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

    function sqrt(uint256 x) internal pure returns (uint256 y) {
        uint256 z = x / 2 + 1;
        y = x;
        while (z < y) {
            y = z;
            z = (x / z + z) / 2;
        }
    }
}

// File: contracts/lib/DecimalMath.sol


/**
 * @title DecimalMath
 * @author DODO Breeder
 *
 * @notice Functions for fixed point number with 18 decimals
 */
library DecimalMath {
    using SafeMath for uint256;

    uint256 constant ONE = 10**18;

    function mul(uint256 target, uint256 d) internal pure returns (uint256) {
        return target.mul(d) / ONE;
    }

    function mulCeil(uint256 target, uint256 d) internal pure returns (uint256) {
        return target.mul(d).divCeil(ONE);
    }

    function divFloor(uint256 target, uint256 d) internal pure returns (uint256) {
        return target.mul(ONE).div(d);
    }

    function divCeil(uint256 target, uint256 d) internal pure returns (uint256) {
        return target.mul(ONE).divCeil(d);
    }
}

// File: contracts/lib/ReentrancyGuard.sol


/**
 * @title ReentrancyGuard
 * @author DODO Breeder
 *
 * @notice Protect functions from Reentrancy Attack
 */
contract ReentrancyGuard {
    // https://solidity.readthedocs.io/en/latest/control-structures.html?highlight=zero-state#scoping-and-declarations
    // zero-state of _ENTERED_ is false
    bool private _ENTERED_;

    modifier preventReentrant() {
        require(!_ENTERED_, "REENTRANT");
        _ENTERED_ = true;
        _;
        _ENTERED_ = false;
    }
}

// File: contracts/intf/IOracle.sol



interface IOracle {
    function getPrice() external view returns (uint256);
}

// File: contracts/intf/IDODOLpToken.sol



interface IDODOLpToken {
    function mint(address user, uint256 value) external;

    function burn(address user, uint256 value) external;

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

    function totalSupply() external view returns (uint256);
}

// File: contracts/impl/Storage.sol




/**
 * @title Storage
 * @author DODO Breeder
 *
 * @notice Local Variables
 */
contract Storage is InitializableOwnable, ReentrancyGuard {
    using SafeMath for uint256;

    // ============ Variables for Control ============

    bool internal _INITIALIZED_;
    bool public _CLOSED_;
    bool public _DEPOSIT_QUOTE_ALLOWED_;
    bool public _DEPOSIT_BASE_ALLOWED_;
    bool public _TRADE_ALLOWED_;
    uint256 public _GAS_PRICE_LIMIT_;

    // ============ Advanced Controls ============
    bool public _BUYING_ALLOWED_;
    bool public _SELLING_ALLOWED_;
    uint256 public _BASE_BALANCE_LIMIT_;
    uint256 public _QUOTE_BALANCE_LIMIT_;

    // ============ Core Address ============

    address public _SUPERVISOR_; // could freeze system in emergency
    address public _MAINTAINER_; // collect maintainer fee to buy food for DODO

    address public _BASE_TOKEN_;
    address public _QUOTE_TOKEN_;
    address public _ORACLE_;

    // ============ Variables for PMM Algorithm ============

    uint256 public _LP_FEE_RATE_;
    uint256 public _MT_FEE_RATE_;
    uint256 public _K_;

    Types.RStatus public _R_STATUS_;
    uint256 public _TARGET_BASE_TOKEN_AMOUNT_;
    uint256 public _TARGET_QUOTE_TOKEN_AMOUNT_;
    uint256 public _BASE_BALANCE_;
    uint256 public _QUOTE_BALANCE_;

    address public _BASE_CAPITAL_TOKEN_;
    address public _QUOTE_CAPITAL_TOKEN_;

    // ============ Variables for Final Settlement ============

    uint256 public _BASE_CAPITAL_RECEIVE_QUOTE_;
    uint256 public _QUOTE_CAPITAL_RECEIVE_BASE_;
    mapping(address => bool) public _CLAIMED_;

    // ============ Modifiers ============

    modifier onlySupervisorOrOwner() {
        require(msg.sender == _SUPERVISOR_ || msg.sender == _OWNER_, "NOT_SUPERVISOR_OR_OWNER");
        _;
    }

    modifier notClosed() {
        require(!_CLOSED_, "DODO_CLOSED");
        _;
    }

    // ============ Helper Functions ============

    function _checkDODOParameters() internal view returns (uint256) {
        require(_K_ < DecimalMath.ONE, "K>=1");
        require(_K_ > 0, "K=0");
        require(_LP_FEE_RATE_.add(_MT_FEE_RATE_) < DecimalMath.ONE, "FEE_RATE>=1");
    }

    function getOraclePrice() public view returns (uint256) {
        return IOracle(_ORACLE_).getPrice();
    }

    function getBaseCapitalBalanceOf(address lp) public view returns (uint256) {
        return IDODOLpToken(_BASE_CAPITAL_TOKEN_).balanceOf(lp);
    }

    function getTotalBaseCapital() public view returns (uint256) {
        return IDODOLpToken(_BASE_CAPITAL_TOKEN_).totalSupply();
    }

    function getQuoteCapitalBalanceOf(address lp) public view returns (uint256) {
        return IDODOLpToken(_QUOTE_CAPITAL_TOKEN_).balanceOf(lp);
    }

    function getTotalQuoteCapital() public view returns (uint256) {
        return IDODOLpToken(_QUOTE_CAPITAL_TOKEN_).totalSupply();
    }

    // ============ Version Control ============
    function version() external pure returns (uint256) {
        return 101; // 1.0.1
    }
}

// File: contracts/intf/IDODOCallee.sol


interface IDODOCallee {
    function dodoCall(
        bool isBuyBaseToken,
        uint256 baseAmount,
        uint256 quoteAmount,
        bytes calldata data
    ) external;
}

// File: contracts/lib/DODOMath.sol


/**
 * @title DODOMath
 * @author DODO Breeder
 *
 * @notice Functions for complex calculating. Including ONE Integration and TWO Quadratic solutions
 */
library DODOMath {
    using SafeMath for uint256;

    /*
        Integrate dodo curve fron V1 to V2
        require V0>=V1>=V2>0
        res = (1-k)i(V1-V2)+ikV0*V0(1/V2-1/V1)
        let V1-V2=delta
        res = i*delta*(1-k+k(V0^2/V1/V2))
    */
    function _GeneralIntegrate(
        uint256 V0,
        uint256 V1,
        uint256 V2,
        uint256 i,
        uint256 k
    ) internal pure returns (uint256) {
        uint256 fairAmount = DecimalMath.mul(i, V1.sub(V2)); // i*delta
        uint256 V0V0V1V2 = DecimalMath.divCeil(V0.mul(V0).div(V1), V2);
        uint256 penalty = DecimalMath.mul(k, V0V0V1V2); // k(V0^2/V1/V2)
        return DecimalMath.mul(fairAmount, DecimalMath.ONE.sub(k).add(penalty));
    }

    /*
        The same with integration expression above, we have:
        i*deltaB = (Q2-Q1)*(1-k+kQ0^2/Q1/Q2)
        Given Q1 and deltaB, solve Q2
        This is a quadratic function and the standard version is
        aQ2^2 + bQ2 + c = 0, where
        a=1-k
        -b=(1-k)Q1-kQ0^2/Q1+i*deltaB
        c=-kQ0^2
        and Q2=(-b+sqrt(b^2+4(1-k)kQ0^2))/2(1-k)
        note: another root is negative, abondan
        if deltaBSig=true, then Q2>Q1
        if deltaBSig=false, then Q2<Q1
    */
    function _SolveQuadraticFunctionForTrade(
        uint256 Q0,
        uint256 Q1,
        uint256 ideltaB,
        bool deltaBSig,
        uint256 k
    ) internal pure returns (uint256) {
        // calculate -b value and sig
        // -b = (1-k)Q1-kQ0^2/Q1+i*deltaB
        uint256 kQ02Q1 = DecimalMath.mul(k, Q0).mul(Q0).div(Q1); // kQ0^2/Q1
        uint256 b = DecimalMath.mul(DecimalMath.ONE.sub(k), Q1); // (1-k)Q1
        bool minusbSig = true;
        if (deltaBSig) {
            b = b.add(ideltaB); // (1-k)Q1+i*deltaB
        } else {
            kQ02Q1 = kQ02Q1.add(ideltaB); // i*deltaB+kQ0^2/Q1
        }
        if (b >= kQ02Q1) {
            b = b.sub(kQ02Q1);
            minusbSig = true;
        } else {
            b = kQ02Q1.sub(b);
            minusbSig = false;
        }

        // calculate sqrt
        uint256 squareRoot = DecimalMath.mul(
            DecimalMath.ONE.sub(k).mul(4),
            DecimalMath.mul(k, Q0).mul(Q0)
        ); // 4(1-k)kQ0^2
        squareRoot = b.mul(b).add(squareRoot).sqrt(); // sqrt(b*b+4(1-k)kQ0*Q0)

        // final res
        uint256 denominator = DecimalMath.ONE.sub(k).mul(2); // 2(1-k)
        uint256 numerator;
        if (minusbSig) {
            numerator = b.add(squareRoot);
        } else {
            numerator = squareRoot.sub(b);
        }

        if (deltaBSig) {
            return DecimalMath.divFloor(numerator, denominator);
        } else {
            return DecimalMath.divCeil(numerator, denominator);
        }
    }

    /*
        Start from the integration function
        i*deltaB = (Q2-Q1)*(1-k+kQ0^2/Q1/Q2)
        Assume Q2=Q0, Given Q1 and deltaB, solve Q0
        let fairAmount = i*deltaB
    */
    function _SolveQuadraticFunctionForTarget(
        uint256 V1,
        uint256 k,
        uint256 fairAmount
    ) internal pure returns (uint256 V0) {
        // V0 = V1+V1*(sqrt-1)/2k
        uint256 sqrt = DecimalMath.divCeil(DecimalMath.mul(k, fairAmount).mul(4), V1);
        sqrt = sqrt.add(DecimalMath.ONE).mul(DecimalMath.ONE).sqrt();
        uint256 premium = DecimalMath.divCeil(sqrt.sub(DecimalMath.ONE), k.mul(2));
        // V0 is greater than or equal to V1 according to the solution
        return DecimalMath.mul(V1, DecimalMath.ONE.add(premium));
    }
}

// File: contracts/impl/Pricing.sol


/**
 * @title Pricing
 * @author DODO Breeder
 *
 * @notice DODO Pricing model
 */
contract Pricing is Storage {
    using SafeMath for uint256;

    // ============ R = 1 cases ============

    function _ROneSellBaseToken(uint256 amount, uint256 targetQuoteTokenAmount)
        internal
        view
        returns (uint256 receiveQuoteToken)
    {
        uint256 i = getOraclePrice();
        uint256 Q2 = DODOMath._SolveQuadraticFunctionForTrade(
            targetQuoteTokenAmount,
            targetQuoteTokenAmount,
            DecimalMath.mul(i, amount),
            false,
            _K_
        );
        // in theory Q2 <= targetQuoteTokenAmount
        // however when amount is close to 0, precision problems may cause Q2 > targetQuoteTokenAmount
        return targetQuoteTokenAmount.sub(Q2);
    }

    function _ROneBuyBaseToken(uint256 amount, uint256 targetBaseTokenAmount)
        internal
        view
        returns (uint256 payQuoteToken)
    {
        require(amount < targetBaseTokenAmount, "DODO_BASE_BALANCE_NOT_ENOUGH");
        uint256 B2 = targetBaseTokenAmount.sub(amount);
        payQuoteToken = _RAboveIntegrate(targetBaseTokenAmount, targetBaseTokenAmount, B2);
        return payQuoteToken;
    }

    // ============ R < 1 cases ============

    function _RBelowSellBaseToken(
        uint256 amount,
        uint256 quoteBalance,
        uint256 targetQuoteAmount
    ) internal view returns (uint256 receieQuoteToken) {
        uint256 i = getOraclePrice();
        uint256 Q2 = DODOMath._SolveQuadraticFunctionForTrade(
            targetQuoteAmount,
            quoteBalance,
            DecimalMath.mul(i, amount),
            false,
            _K_
        );
        return quoteBalance.sub(Q2);
    }

    function _RBelowBuyBaseToken(
        uint256 amount,
        uint256 quoteBalance,
        uint256 targetQuoteAmount
    ) internal view returns (uint256 payQuoteToken) {
        // Here we don't require amount less than some value
        // Because it is limited at upper function
        // See Trader.queryBuyBaseToken
        uint256 i = getOraclePrice();
        uint256 Q2 = DODOMath._SolveQuadraticFunctionForTrade(
            targetQuoteAmount,
            quoteBalance,
            DecimalMath.mulCeil(i, amount),
            true,
            _K_
        );
        return Q2.sub(quoteBalance);
    }

    function _RBelowBackToOne() internal view returns (uint256 payQuoteToken) {
        // important: carefully design the system to make sure spareBase always greater than or equal to 0
        uint256 spareBase = _BASE_BALANCE_.sub(_TARGET_BASE_TOKEN_AMOUNT_);
        uint256 price = getOraclePrice();
        uint256 fairAmount = DecimalMath.mul(spareBase, price);
        uint256 newTargetQuote = DODOMath._SolveQuadraticFunctionForTarget(
            _QUOTE_BALANCE_,
            _K_,
            fairAmount
        );
        return newTargetQuote.sub(_QUOTE_BALANCE_);
    }

    // ============ R > 1 cases ============

    function _RAboveBuyBaseToken(
        uint256 amount,
        uint256 baseBalance,
        uint256 targetBaseAmount
    ) internal view returns (uint256 payQuoteToken) {
        require(amount < baseBalance, "DODO_BASE_BALANCE_NOT_ENOUGH");
        uint256 B2 = baseBalance.sub(amount);
        return _RAboveIntegrate(targetBaseAmount, baseBalance, B2);
    }

    function _RAboveSellBaseToken(
        uint256 amount,
        uint256 baseBalance,
        uint256 targetBaseAmount
    ) internal view returns (uint256 receiveQuoteToken) {
        // here we don't require B1 <= targetBaseAmount
        // Because it is limited at upper function
        // See Trader.querySellBaseToken
        uint256 B1 = baseBalance.add(amount);
        return _RAboveIntegrate(targetBaseAmount, B1, baseBalance);
    }

    function _RAboveBackToOne() internal view returns (uint256 payBaseToken) {
        // important: carefully design the system to make sure spareBase always greater than or equal to 0
        uint256 spareQuote = _QUOTE_BALANCE_.sub(_TARGET_QUOTE_TOKEN_AMOUNT_);
        uint256 price = getOraclePrice();
        uint256 fairAmount = DecimalMath.divFloor(spareQuote, price);
        uint256 newTargetBase = DODOMath._SolveQuadraticFunctionForTarget(
            _BASE_BALANCE_,
            _K_,
            fairAmount
        );
        return newTargetBase.sub(_BASE_BALANCE_);
    }

    // ============ Helper functions ============

    function getExpectedTarget() public view returns (uint256 baseTarget, uint256 quoteTarget) {
        uint256 Q = _QUOTE_BALANCE_;
        uint256 B = _BASE_BALANCE_;
        if (_R_STATUS_ == Types.RStatus.ONE) {
            return (_TARGET_BASE_TOKEN_AMOUNT_, _TARGET_QUOTE_TOKEN_AMOUNT_);
        } else if (_R_STATUS_ == Types.RStatus.BELOW_ONE) {
            uint256 payQuoteToken = _RBelowBackToOne();
            return (_TARGET_BASE_TOKEN_AMOUNT_, Q.add(payQuoteToken));
        } else if (_R_STATUS_ == Types.RStatus.ABOVE_ONE) {
            uint256 payBaseToken = _RAboveBackToOne();
            return (B.add(payBaseToken), _TARGET_QUOTE_TOKEN_AMOUNT_);
        }
    }

    function getMidPrice() public view returns (uint256 midPrice) {
        (uint256 baseTarget, uint256 quoteTarget) = getExpectedTarget();
        if (_R_STATUS_ == Types.RStatus.BELOW_ONE) {
            uint256 R = DecimalMath.divFloor(
                quoteTarget.mul(quoteTarget).div(_QUOTE_BALANCE_),
                _QUOTE_BALANCE_
            );
            R = DecimalMath.ONE.sub(_K_).add(DecimalMath.mul(_K_, R));
            return DecimalMath.divFloor(getOraclePrice(), R);
        } else {
            uint256 R = DecimalMath.divFloor(
                baseTarget.mul(baseTarget).div(_BASE_BALANCE_),
                _BASE_BALANCE_
            );
            R = DecimalMath.ONE.sub(_K_).add(DecimalMath.mul(_K_, R));
            return DecimalMath.mul(getOraclePrice(), R);
        }
    }

    function _RAboveIntegrate(
        uint256 B0,
        uint256 B1,
        uint256 B2
    ) internal view returns (uint256) {
        uint256 i = getOraclePrice();
        return DODOMath._GeneralIntegrate(B0, B1, B2, i, _K_);
    }

    // function _RBelowIntegrate(
    //     uint256 Q0,
    //     uint256 Q1,
    //     uint256 Q2
    // ) internal view returns (uint256) {
    //     uint256 i = getOraclePrice();
    //     i = DecimalMath.divFloor(DecimalMath.ONE, i); // 1/i
    //     return DODOMath._GeneralIntegrate(Q0, Q1, Q2, i, _K_);
    // }
}

// File: contracts/lib/SafeERC20.sol


/**
 * @title SafeERC20
 * @dev Wrappers around ERC20 operations that throw on failure (when the token
 * contract returns false). Tokens that return no value (and instead revert or
 * throw on failure) are also supported, non-reverting calls are assumed to be
 * successful.
 * To use this library you can add a `using SafeERC20 for ERC20;` statement to your contract,
 * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.
 */
library SafeERC20 {
    using SafeMath for uint256;

    function safeTransfer(
        IERC20 token,
        address to,
        uint256 value
    ) internal {
        _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));
    }

    function safeTransferFrom(
        IERC20 token,
        address from,
        address to,
        uint256 value
    ) internal {
        _callOptionalReturn(
            token,
            abi.encodeWithSelector(token.transferFrom.selector, from, to, value)
        );
    }

    function safeApprove(
        IERC20 token,
        address spender,
        uint256 value
    ) internal {
        // safeApprove should only be called when setting an initial allowance,
        // or when resetting it to zero. To increase and decrease it, use
        // 'safeIncreaseAllowance' and 'safeDecreaseAllowance'
        // solhint-disable-next-line max-line-length
        require(
            (value == 0) || (token.allowance(address(this), spender) == 0),
            "SafeERC20: approve from non-zero to non-zero allowance"
        );
        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));
    }

    /**
     * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement
     * on the return value: the return value is optional (but if data is returned, it must not be false).
     * @param token The token targeted by the call.
     * @param data The call data (encoded using abi.encode or one of its variants).
     */
    function _callOptionalReturn(IERC20 token, bytes memory data) private {
        // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since
        // we're implementing it ourselves.

        // A Solidity high level call has three parts:
        //  1. The target address is checked to verify it contains contract code
        //  2. The call itself is made, and success asserted
        //  3. The return value is decoded, which in turn checks the size of the returned data.
        // solhint-disable-next-line max-line-length

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = address(token).call(data);
        require(success, "SafeERC20: low-level call failed");

        if (returndata.length > 0) {
            // Return data is optional
            // solhint-disable-next-line max-line-length
            require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed");
        }
    }
}

// File: contracts/impl/Settlement.sol


/**
 * @title Settlement
 * @author DODO Breeder
 *
 * @notice Functions for assets settlement
 */
contract Settlement is Storage {
    using SafeMath for uint256;
    using SafeERC20 for IERC20;

    // ============ Events ============

    event Donate(uint256 amount, bool isBaseToken);

    event ClaimAssets(address indexed user, uint256 baseTokenAmount, uint256 quoteTokenAmount);

    // ============ Assets IN/OUT Functions ============

    function _baseTokenTransferIn(address from, uint256 amount) internal {
        require(_BASE_BALANCE_.add(amount) <= _BASE_BALANCE_LIMIT_, "BASE_BALANCE_LIMIT_EXCEEDED");
        IERC20(_BASE_TOKEN_).safeTransferFrom(from, address(this), amount);
        _BASE_BALANCE_ = _BASE_BALANCE_.add(amount);
    }

    function _quoteTokenTransferIn(address from, uint256 amount) internal {
        require(
            _QUOTE_BALANCE_.add(amount) <= _QUOTE_BALANCE_LIMIT_,
            "QUOTE_BALANCE_LIMIT_EXCEEDED"
        );
        IERC20(_QUOTE_TOKEN_).safeTransferFrom(from, address(this), amount);
        _QUOTE_BALANCE_ = _QUOTE_BALANCE_.add(amount);
    }

    function _baseTokenTransferOut(address to, uint256 amount) internal {
        IERC20(_BASE_TOKEN_).safeTransfer(to, amount);
        _BASE_BALANCE_ = _BASE_BALANCE_.sub(amount);
    }

    function _quoteTokenTransferOut(address to, uint256 amount) internal {
        IERC20(_QUOTE_TOKEN_).safeTransfer(to, amount);
        _QUOTE_BALANCE_ = _QUOTE_BALANCE_.sub(amount);
    }

    // ============ Donate to Liquidity Pool Functions ============

    function _donateBaseToken(uint256 amount) internal {
        _TARGET_BASE_TOKEN_AMOUNT_ = _TARGET_BASE_TOKEN_AMOUNT_.add(amount);
        emit Donate(amount, true);
    }

    function _donateQuoteToken(uint256 amount) internal {
        _TARGET_QUOTE_TOKEN_AMOUNT_ = _TARGET_QUOTE_TOKEN_AMOUNT_.add(amount);
        emit Donate(amount, false);
    }

    function donateBaseToken(uint256 amount) external preventReentrant {
        _baseTokenTransferIn(msg.sender, amount);
        _donateBaseToken(amount);
    }

    function donateQuoteToken(uint256 amount) external preventReentrant {
        _quoteTokenTransferIn(msg.sender, amount);
        _donateQuoteToken(amount);
    }

    // ============ Final Settlement Functions ============

    // last step to shut down dodo
    function finalSettlement() external onlyOwner notClosed {
        _CLOSED_ = true;
        _DEPOSIT_QUOTE_ALLOWED_ = false;
        _DEPOSIT_BASE_ALLOWED_ = false;
        _TRADE_ALLOWED_ = false;
        uint256 totalBaseCapital = getTotalBaseCapital();
        uint256 totalQuoteCapital = getTotalQuoteCapital();

        if (_QUOTE_BALANCE_ > _TARGET_QUOTE_TOKEN_AMOUNT_) {
            uint256 spareQuote = _QUOTE_BALANCE_.sub(_TARGET_QUOTE_TOKEN_AMOUNT_);
            _BASE_CAPITAL_RECEIVE_QUOTE_ = DecimalMath.divFloor(spareQuote, totalBaseCapital);
        } else {
            _TARGET_QUOTE_TOKEN_AMOUNT_ = _QUOTE_BALANCE_;
        }

        if (_BASE_BALANCE_ > _TARGET_BASE_TOKEN_AMOUNT_) {
            uint256 spareBase = _BASE_BALANCE_.sub(_TARGET_BASE_TOKEN_AMOUNT_);
            _QUOTE_CAPITAL_RECEIVE_BASE_ = DecimalMath.divFloor(spareBase, totalQuoteCapital);
        } else {
            _TARGET_BASE_TOKEN_AMOUNT_ = _BASE_BALANCE_;
        }

        _R_STATUS_ = Types.RStatus.ONE;
    }

    // claim remaining assets after final settlement
    function claimAssets() external preventReentrant {
        require(_CLOSED_, "DODO_NOT_CLOSED");
        require(!_CLAIMED_[msg.sender], "ALREADY_CLAIMED");
        _CLAIMED_[msg.sender] = true;

        uint256 quoteCapital = getQuoteCapitalBalanceOf(msg.sender);
        uint256 baseCapital = getBaseCapitalBalanceOf(msg.sender);

        uint256 quoteAmount = 0;
        if (quoteCapital > 0) {
            quoteAmount = _TARGET_QUOTE_TOKEN_AMOUNT_.mul(quoteCapital).div(getTotalQuoteCapital());
        }
        uint256 baseAmount = 0;
        if (baseCapital > 0) {
            baseAmount = _TARGET_BASE_TOKEN_AMOUNT_.mul(baseCapital).div(getTotalBaseCapital());
        }

        _TARGET_QUOTE_TOKEN_AMOUNT_ = _TARGET_QUOTE_TOKEN_AMOUNT_.sub(quoteAmount);
        _TARGET_BASE_TOKEN_AMOUNT_ = _TARGET_BASE_TOKEN_AMOUNT_.sub(baseAmount);

        quoteAmount = quoteAmount.add(DecimalMath.mul(baseCapital, _BASE_CAPITAL_RECEIVE_QUOTE_));
        baseAmount = baseAmount.add(DecimalMath.mul(quoteCapital, _QUOTE_CAPITAL_RECEIVE_BASE_));

        _baseTokenTransferOut(msg.sender, baseAmount);
        _quoteTokenTransferOut(msg.sender, quoteAmount);

        IDODOLpToken(_BASE_CAPITAL_TOKEN_).burn(msg.sender, baseCapital);
        IDODOLpToken(_QUOTE_CAPITAL_TOKEN_).burn(msg.sender, quoteCapital);

        emit ClaimAssets(msg.sender, baseAmount, quoteAmount);
        return;
    }

    // in case someone transfer to contract directly
    function retrieve(address token, uint256 amount) external onlyOwner {
        if (token == _BASE_TOKEN_) {
            require(
                IERC20(_BASE_TOKEN_).balanceOf(address(this)) >= _BASE_BALANCE_.add(amount),
                "DODO_BASE_BALANCE_NOT_ENOUGH"
            );
        }
        if (token == _QUOTE_TOKEN_) {
            require(
                IERC20(_QUOTE_TOKEN_).balanceOf(address(this)) >= _QUOTE_BALANCE_.add(amount),
                "DODO_QUOTE_BALANCE_NOT_ENOUGH"
            );
        }
        IERC20(token).safeTransfer(msg.sender, amount);
    }
}

// File: contracts/impl/Trader.sol


/**
 * @title Trader
 * @author DODO Breeder
 *
 * @notice Functions for trader operations
 */
contract Trader is Storage, Pricing, Settlement {
    using SafeMath for uint256;

    // ============ Events ============

    event SellBaseToken(address indexed seller, uint256 payBase, uint256 receiveQuote);

    event BuyBaseToken(address indexed buyer, uint256 receiveBase, uint256 payQuote);

    event ChargeMaintainerFee(address indexed maintainer, bool isBaseToken, uint256 amount);

    // ============ Modifiers ============

    modifier tradeAllowed() {
        require(_TRADE_ALLOWED_, "TRADE_NOT_ALLOWED");
        _;
    }

    modifier buyingAllowed() {
        require(_BUYING_ALLOWED_, "BUYING_NOT_ALLOWED");
        _;
    }

    modifier sellingAllowed() {
        require(_SELLING_ALLOWED_, "SELLING_NOT_ALLOWED");
        _;
    }

    modifier gasPriceLimit() {
        require(tx.gasprice <= _GAS_PRICE_LIMIT_, "GAS_PRICE_EXCEED");
        _;
    }

    // ============ Trade Functions ============

    function sellBaseToken(
        uint256 amount,
        uint256 minReceiveQuote,
        bytes calldata data
    ) external tradeAllowed sellingAllowed gasPriceLimit preventReentrant returns (uint256) {
        // query price
        (
            uint256 receiveQuote,
            uint256 lpFeeQuote,
            uint256 mtFeeQuote,
            Types.RStatus newRStatus,
            uint256 newQuoteTarget,
            uint256 newBaseTarget
        ) = _querySellBaseToken(amount);
        require(receiveQuote >= minReceiveQuote, "SELL_BASE_RECEIVE_NOT_ENOUGH");

        // settle assets
        _quoteTokenTransferOut(msg.sender, receiveQuote);
        if (data.length > 0) {
            IDODOCallee(msg.sender).dodoCall(false, amount, receiveQuote, data);
        }
        _baseTokenTransferIn(msg.sender, amount);
        if (mtFeeQuote != 0) {
            _quoteTokenTransferOut(_MAINTAINER_, mtFeeQuote);
            emit ChargeMaintainerFee(_MAINTAINER_, false, mtFeeQuote);
        }

        // update TARGET
        if (_TARGET_QUOTE_TOKEN_AMOUNT_ != newQuoteTarget) {
            _TARGET_QUOTE_TOKEN_AMOUNT_ = newQuoteTarget;
        }
        if (_TARGET_BASE_TOKEN_AMOUNT_ != newBaseTarget) {
            _TARGET_BASE_TOKEN_AMOUNT_ = newBaseTarget;
        }
        if (_R_STATUS_ != newRStatus) {
            _R_STATUS_ = newRStatus;
        }

        _donateQuoteToken(lpFeeQuote);
        emit SellBaseToken(msg.sender, amount, receiveQuote);

        return receiveQuote;
    }

    function buyBaseToken(
        uint256 amount,
        uint256 maxPayQuote,
        bytes calldata data
    ) external tradeAllowed buyingAllowed gasPriceLimit preventReentrant returns (uint256) {
        // query price
        (
            uint256 payQuote,
            uint256 lpFeeBase,
            uint256 mtFeeBase,
            Types.RStatus newRStatus,
            uint256 newQuoteTarget,
            uint256 newBaseTarget
        ) = _queryBuyBaseToken(amount);
        require(payQuote <= maxPayQuote, "BUY_BASE_COST_TOO_MUCH");

        // settle assets
        _baseTokenTransferOut(msg.sender, amount);
        if (data.length > 0) {
            IDODOCallee(msg.sender).dodoCall(true, amount, payQuote, data);
        }
        _quoteTokenTransferIn(msg.sender, payQuote);
        if (mtFeeBase != 0) {
            _baseTokenTransferOut(_MAINTAINER_, mtFeeBase);
            emit ChargeMaintainerFee(_MAINTAINER_, true, mtFeeBase);
        }

        // update TARGET
        if (_TARGET_QUOTE_TOKEN_AMOUNT_ != newQuoteTarget) {
            _TARGET_QUOTE_TOKEN_AMOUNT_ = newQuoteTarget;
        }
        if (_TARGET_BASE_TOKEN_AMOUNT_ != newBaseTarget) {
            _TARGET_BASE_TOKEN_AMOUNT_ = newBaseTarget;
        }
        if (_R_STATUS_ != newRStatus) {
            _R_STATUS_ = newRStatus;
        }

        _donateBaseToken(lpFeeBase);
        emit BuyBaseToken(msg.sender, amount, payQuote);

        return payQuote;
    }

    // ============ Query Functions ============

    function querySellBaseToken(uint256 amount) external view returns (uint256 receiveQuote) {
        (receiveQuote, , , , , ) = _querySellBaseToken(amount);
        return receiveQuote;
    }

    function queryBuyBaseToken(uint256 amount) external view returns (uint256 payQuote) {
        (payQuote, , , , , ) = _queryBuyBaseToken(amount);
        return payQuote;
    }

    function _querySellBaseToken(uint256 amount)
        internal
        view
        returns (
            uint256 receiveQuote,
            uint256 lpFeeQuote,
            uint256 mtFeeQuote,
            Types.RStatus newRStatus,
            uint256 newQuoteTarget,
            uint256 newBaseTarget
        )
    {
        (newBaseTarget, newQuoteTarget) = getExpectedTarget();

        uint256 sellBaseAmount = amount;

        if (_R_STATUS_ == Types.RStatus.ONE) {
            // case 1: R=1
            // R falls below one
            receiveQuote = _ROneSellBaseToken(sellBaseAmount, newQuoteTarget);
            newRStatus = Types.RStatus.BELOW_ONE;
        } else if (_R_STATUS_ == Types.RStatus.ABOVE_ONE) {
            uint256 backToOnePayBase = newBaseTarget.sub(_BASE_BALANCE_);
            uint256 backToOneReceiveQuote = _QUOTE_BALANCE_.sub(newQuoteTarget);
            // case 2: R>1
            // complex case, R status depends on trading amount
            if (sellBaseAmount < backToOnePayBase) {
                // case 2.1: R status do not change
                receiveQuote = _RAboveSellBaseToken(sellBaseAmount, _BASE_BALANCE_, newBaseTarget);
                newRStatus = Types.RStatus.ABOVE_ONE;
                if (receiveQuote > backToOneReceiveQuote) {
                    // [Important corner case!] may enter this branch when some precision problem happens. And consequently contribute to negative spare quote amount
                    // to make sure spare quote>=0, mannually set receiveQuote=backToOneReceiveQuote
                    receiveQuote = backToOneReceiveQuote;
                }
            } else if (sellBaseAmount == backToOnePayBase) {
                // case 2.2: R status changes to ONE
                receiveQuote = backToOneReceiveQuote;
                newRStatus = Types.RStatus.ONE;
            } else {
                // case 2.3: R status changes to BELOW_ONE
                receiveQuote = backToOneReceiveQuote.add(
                    _ROneSellBaseToken(sellBaseAmount.sub(backToOnePayBase), newQuoteTarget)
                );
                newRStatus = Types.RStatus.BELOW_ONE;
            }
        } else {
            // _R_STATUS_ == Types.RStatus.BELOW_ONE
            // case 3: R<1
            receiveQuote = _RBelowSellBaseToken(sellBaseAmount, _QUOTE_BALANCE_, newQuoteTarget);
            newRStatus = Types.RStatus.BELOW_ONE;
        }

        // count fees
        lpFeeQuote = DecimalMath.mul(receiveQuote, _LP_FEE_RATE_);
        mtFeeQuote = DecimalMath.mul(receiveQuote, _MT_FEE_RATE_);
        receiveQuote = receiveQuote.sub(lpFeeQuote).sub(mtFeeQuote);

        return (receiveQuote, lpFeeQuote, mtFeeQuote, newRStatus, newQuoteTarget, newBaseTarget);
    }

    function _queryBuyBaseToken(uint256 amount)
        internal
        view
        returns (
            uint256 payQuote,
            uint256 lpFeeBase,
            uint256 mtFeeBase,
            Types.RStatus newRStatus,
            uint256 newQuoteTarget,
            uint256 newBaseTarget
        )
    {
        (newBaseTarget, newQuoteTarget) = getExpectedTarget();

        // charge fee from user receive amount
        lpFeeBase = DecimalMath.mul(amount, _LP_FEE_RATE_);
        mtFeeBase = DecimalMath.mul(amount, _MT_FEE_RATE_);
        uint256 buyBaseAmount = amount.add(lpFeeBase).add(mtFeeBase);

        if (_R_STATUS_ == Types.RStatus.ONE) {
            // case 1: R=1
            payQuote = _ROneBuyBaseToken(buyBaseAmount, newBaseTarget);
            newRStatus = Types.RStatus.ABOVE_ONE;
        } else if (_R_STATUS_ == Types.RStatus.ABOVE_ONE) {
            // case 2: R>1
            payQuote = _RAboveBuyBaseToken(buyBaseAmount, _BASE_BALANCE_, newBaseTarget);
            newRStatus = Types.RStatus.ABOVE_ONE;
        } else if (_R_STATUS_ == Types.RStatus.BELOW_ONE) {
            uint256 backToOnePayQuote = newQuoteTarget.sub(_QUOTE_BALANCE_);
            uint256 backToOneReceiveBase = _BASE_BALANCE_.sub(newBaseTarget);
            // case 3: R<1
            // complex case, R status may change
            if (buyBaseAmount < backToOneReceiveBase) {
                // case 3.1: R status do not change
                // no need to check payQuote because spare base token must be greater than zero
                payQuote = _RBelowBuyBaseToken(buyBaseAmount, _QUOTE_BALANCE_, newQuoteTarget);
                newRStatus = Types.RStatus.BELOW_ONE;
            } else if (buyBaseAmount == backToOneReceiveBase) {
                // case 3.2: R status changes to ONE
                payQuote = backToOnePayQuote;
                newRStatus = Types.RStatus.ONE;
            } else {
                // case 3.3: R status changes to ABOVE_ONE
                payQuote = backToOnePayQuote.add(
                    _ROneBuyBaseToken(buyBaseAmount.sub(backToOneReceiveBase), newBaseTarget)
                );
                newRStatus = Types.RStatus.ABOVE_ONE;
            }
        }

        return (payQuote, lpFeeBase, mtFeeBase, newRStatus, newQuoteTarget, newBaseTarget);
    }
}

// File: contracts/impl/LiquidityProvider.sol


/**
 * @title LiquidityProvider
 * @author DODO Breeder
 *
 * @notice Functions for liquidity provider operations
 */
contract LiquidityProvider is Storage, Pricing, Settlement {
    using SafeMath for uint256;

    // ============ Events ============

    event Deposit(
        address indexed payer,
        address indexed receiver,
        bool isBaseToken,
        uint256 amount,
        uint256 lpTokenAmount
    );

    event Withdraw(
        address indexed payer,
        address indexed receiver,
        bool isBaseToken,
        uint256 amount,
        uint256 lpTokenAmount
    );

    event ChargePenalty(address indexed payer, bool isBaseToken, uint256 amount);

    // ============ Modifiers ============

    modifier depositQuoteAllowed() {
        require(_DEPOSIT_QUOTE_ALLOWED_, "DEPOSIT_QUOTE_NOT_ALLOWED");
        _;
    }

    modifier depositBaseAllowed() {
        require(_DEPOSIT_BASE_ALLOWED_, "DEPOSIT_BASE_NOT_ALLOWED");
        _;
    }

    modifier dodoNotClosed() {
        require(!_CLOSED_, "DODO_CLOSED");
        _;
    }

    // ============ Routine Functions ============

    function withdrawBase(uint256 amount) external returns (uint256) {
        return withdrawBaseTo(msg.sender, amount);
    }

    function depositBase(uint256 amount) external returns (uint256) {
        return depositBaseTo(msg.sender, amount);
    }

    function withdrawQuote(uint256 amount) external returns (uint256) {
        return withdrawQuoteTo(msg.sender, amount);
    }

    function depositQuote(uint256 amount) external returns (uint256) {
        return depositQuoteTo(msg.sender, amount);
    }

    function withdrawAllBase() external returns (uint256) {
        return withdrawAllBaseTo(msg.sender);
    }

    function withdrawAllQuote() external returns (uint256) {
        return withdrawAllQuoteTo(msg.sender);
    }

    // ============ Deposit Functions ============

    function depositQuoteTo(address to, uint256 amount)
        public
        preventReentrant
        depositQuoteAllowed
        returns (uint256)
    {
        (, uint256 quoteTarget) = getExpectedTarget();
        uint256 totalQuoteCapital = getTotalQuoteCapital();
        uint256 capital = amount;
        if (totalQuoteCapital == 0) {
            // give remaining quote token to lp as a gift
            capital = amount.add(quoteTarget);
        } else if (quoteTarget > 0) {
            capital = amount.mul(totalQuoteCapital).div(quoteTarget);
        }

        // settlement
        _quoteTokenTransferIn(msg.sender, amount);
        _mintQuoteCapital(to, capital);
        _TARGET_QUOTE_TOKEN_AMOUNT_ = _TARGET_QUOTE_TOKEN_AMOUNT_.add(amount);

        emit Deposit(msg.sender, to, false, amount, capital);
        return capital;
    }

    function depositBaseTo(address to, uint256 amount)
        public
        preventReentrant
        depositBaseAllowed
        returns (uint256)
    {
        (uint256 baseTarget, ) = getExpectedTarget();
        uint256 totalBaseCapital = getTotalBaseCapital();
        uint256 capital = amount;
        if (totalBaseCapital == 0) {
            // give remaining base token to lp as a gift
            capital = amount.add(baseTarget);
        } else if (baseTarget > 0) {
            capital = amount.mul(totalBaseCapital).div(baseTarget);
        }

        // settlement
        _baseTokenTransferIn(msg.sender, amount);
        _mintBaseCapital(to, capital);
        _TARGET_BASE_TOKEN_AMOUNT_ = _TARGET_BASE_TOKEN_AMOUNT_.add(amount);

        emit Deposit(msg.sender, to, true, amount, capital);
        return capital;
    }

    // ============ Withdraw Functions ============

    function withdrawQuoteTo(address to, uint256 amount)
        public
        preventReentrant
        dodoNotClosed
        returns (uint256)
    {
        // calculate capital
        (, uint256 quoteTarget) = getExpectedTarget();
        uint256 totalQuoteCapital = getTotalQuoteCapital();
        require(totalQuoteCapital > 0, "NO_QUOTE_LP");

        uint256 requireQuoteCapital = amount.mul(totalQuoteCapital).divCeil(quoteTarget);
        require(
            requireQuoteCapital <= getQuoteCapitalBalanceOf(msg.sender),
            "LP_QUOTE_CAPITAL_BALANCE_NOT_ENOUGH"
        );

        // handle penalty, penalty may exceed amount
        uint256 penalty = getWithdrawQuotePenalty(amount);
        require(penalty < amount, "PENALTY_EXCEED");

        // settlement
        _TARGET_QUOTE_TOKEN_AMOUNT_ = _TARGET_QUOTE_TOKEN_AMOUNT_.sub(amount);
        _burnQuoteCapital(msg.sender, requireQuoteCapital);
        _quoteTokenTransferOut(to, amount.sub(penalty));
        _donateQuoteToken(penalty);

        emit Withdraw(msg.sender, to, false, amount.sub(penalty), requireQuoteCapital);
        emit ChargePenalty(msg.sender, false, penalty);

        return amount.sub(penalty);
    }

    function withdrawBaseTo(address to, uint256 amount)
        public
        preventReentrant
        dodoNotClosed
        returns (uint256)
    {
        // calculate capital
        (uint256 baseTarget, ) = getExpectedTarget();
        uint256 totalBaseCapital = getTotalBaseCapital();
        require(totalBaseCapital > 0, "NO_BASE_LP");

        uint256 requireBaseCapital = amount.mul(totalBaseCapital).divCeil(baseTarget);
        require(
            requireBaseCapital <= getBaseCapitalBalanceOf(msg.sender),
            "LP_BASE_CAPITAL_BALANCE_NOT_ENOUGH"
        );

        // handle penalty, penalty may exceed amount
        uint256 penalty = getWithdrawBasePenalty(amount);
        require(penalty <= amount, "PENALTY_EXCEED");

        // settlement
        _TARGET_BASE_TOKEN_AMOUNT_ = _TARGET_BASE_TOKEN_AMOUNT_.sub(amount);
        _burnBaseCapital(msg.sender, requireBaseCapital);
        _baseTokenTransferOut(to, amount.sub(penalty));
        _donateBaseToken(penalty);

        emit Withdraw(msg.sender, to, true, amount.sub(penalty), requireBaseCapital);
        emit ChargePenalty(msg.sender, true, penalty);

        return amount.sub(penalty);
    }

    // ============ Withdraw all Functions ============

    function withdrawAllQuoteTo(address to)
        public
        preventReentrant
        dodoNotClosed
        returns (uint256)
    {
        uint256 withdrawAmount = getLpQuoteBalance(msg.sender);
        uint256 capital = getQuoteCapitalBalanceOf(msg.sender);

        // handle penalty, penalty may exceed amount
        uint256 penalty = getWithdrawQuotePenalty(withdrawAmount);
        require(penalty <= withdrawAmount, "PENALTY_EXCEED");

        // settlement
        _TARGET_QUOTE_TOKEN_AMOUNT_ = _TARGET_QUOTE_TOKEN_AMOUNT_.sub(withdrawAmount);
        _burnQuoteCapital(msg.sender, capital);
        _quoteTokenTransferOut(to, withdrawAmount.sub(penalty));
        _donateQuoteToken(penalty);

        emit Withdraw(msg.sender, to, false, withdrawAmount, capital);
        emit ChargePenalty(msg.sender, false, penalty);

        return withdrawAmount.sub(penalty);
    }

    function withdrawAllBaseTo(address to) public preventReentrant dodoNotClosed returns (uint256) {
        uint256 withdrawAmount = getLpBaseBalance(msg.sender);
        uint256 capital = getBaseCapitalBalanceOf(msg.sender);

        // handle penalty, penalty may exceed amount
        uint256 penalty = getWithdrawBasePenalty(withdrawAmount);
        require(penalty <= withdrawAmount, "PENALTY_EXCEED");

        // settlement
        _TARGET_BASE_TOKEN_AMOUNT_ = _TARGET_BASE_TOKEN_AMOUNT_.sub(withdrawAmount);
        _burnBaseCapital(msg.sender, capital);
        _baseTokenTransferOut(to, withdrawAmount.sub(penalty));
        _donateBaseToken(penalty);

        emit Withdraw(msg.sender, to, true, withdrawAmount, capital);
        emit ChargePenalty(msg.sender, true, penalty);

        return withdrawAmount.sub(penalty);
    }

    // ============ Helper Functions ============

    function _mintBaseCapital(address user, uint256 amount) internal {
        IDODOLpToken(_BASE_CAPITAL_TOKEN_).mint(user, amount);
    }

    function _mintQuoteCapital(address user, uint256 amount) internal {
        IDODOLpToken(_QUOTE_CAPITAL_TOKEN_).mint(user, amount);
    }

    function _burnBaseCapital(address user, uint256 amount) internal {
        IDODOLpToken(_BASE_CAPITAL_TOKEN_).burn(user, amount);
    }

    function _burnQuoteCapital(address user, uint256 amount) internal {
        IDODOLpToken(_QUOTE_CAPITAL_TOKEN_).burn(user, amount);
    }

    // ============ Getter Functions ============

    function getLpBaseBalance(address lp) public view returns (uint256 lpBalance) {
        uint256 totalBaseCapital = getTotalBaseCapital();
        (uint256 baseTarget, ) = getExpectedTarget();
        if (totalBaseCapital == 0) {
            return 0;
        }
        lpBalance = getBaseCapitalBalanceOf(lp).mul(baseTarget).div(totalBaseCapital);
        return lpBalance;
    }

    function getLpQuoteBalance(address lp) public view returns (uint256 lpBalance) {
        uint256 totalQuoteCapital = getTotalQuoteCapital();
        (, uint256 quoteTarget) = getExpectedTarget();
        if (totalQuoteCapital == 0) {
            return 0;
        }
        lpBalance = getQuoteCapitalBalanceOf(lp).mul(quoteTarget).div(totalQuoteCapital);
        return lpBalance;
    }

    function getWithdrawQuotePenalty(uint256 amount) public view returns (uint256 penalty) {
        require(amount <= _QUOTE_BALANCE_, "DODO_QUOTE_BALANCE_NOT_ENOUGH");
        if (_R_STATUS_ == Types.RStatus.BELOW_ONE) {
            uint256 spareBase = _BASE_BALANCE_.sub(_TARGET_BASE_TOKEN_AMOUNT_);
            uint256 price = getOraclePrice();
            uint256 fairAmount = DecimalMath.mul(spareBase, price);
            uint256 targetQuote = DODOMath._SolveQuadraticFunctionForTarget(
                _QUOTE_BALANCE_,
                _K_,
                fairAmount
            );
            // if amount = _QUOTE_BALANCE_, div error
            uint256 targetQuoteWithWithdraw = DODOMath._SolveQuadraticFunctionForTarget(
                _QUOTE_BALANCE_.sub(amount),
                _K_,
                fairAmount
            );
            return targetQuote.sub(targetQuoteWithWithdraw.add(amount));
        } else {
            return 0;
        }
    }

    function getWithdrawBasePenalty(uint256 amount) public view returns (uint256 penalty) {
        require(amount <= _BASE_BALANCE_, "DODO_BASE_BALANCE_NOT_ENOUGH");
        if (_R_STATUS_ == Types.RStatus.ABOVE_ONE) {
            uint256 spareQuote = _QUOTE_BALANCE_.sub(_TARGET_QUOTE_TOKEN_AMOUNT_);
            uint256 price = getOraclePrice();
            uint256 fairAmount = DecimalMath.divFloor(spareQuote, price);
            uint256 targetBase = DODOMath._SolveQuadraticFunctionForTarget(
                _BASE_BALANCE_,
                _K_,
                fairAmount
            );
            // if amount = _BASE_BALANCE_, div error
            uint256 targetBaseWithWithdraw = DODOMath._SolveQuadraticFunctionForTarget(
                _BASE_BALANCE_.sub(amount),
                _K_,
                fairAmount
            );
            return targetBase.sub(targetBaseWithWithdraw.add(amount));
        } else {
            return 0;
        }
    }
}

// File: contracts/impl/Admin.sol


/**
 * @title Admin
 * @author DODO Breeder
 *
 * @notice Functions for admin operations
 */
contract Admin is Storage {
    // ============ Events ============

    event UpdateGasPriceLimit(uint256 oldGasPriceLimit, uint256 newGasPriceLimit);

    event UpdateLiquidityProviderFeeRate(
        uint256 oldLiquidityProviderFeeRate,
        uint256 newLiquidityProviderFeeRate
    );

    event UpdateMaintainerFeeRate(uint256 oldMaintainerFeeRate, uint256 newMaintainerFeeRate);

    event UpdateK(uint256 oldK, uint256 newK);

    // ============ Params Setting Functions ============

    function setOracle(address newOracle) external onlyOwner {
        _ORACLE_ = newOracle;
    }

    function setSupervisor(address newSupervisor) external onlyOwner {
        _SUPERVISOR_ = newSupervisor;
    }

    function setMaintainer(address newMaintainer) external onlyOwner {
        _MAINTAINER_ = newMaintainer;
    }

    function setLiquidityProviderFeeRate(uint256 newLiquidityPorviderFeeRate) external onlyOwner {
        emit UpdateLiquidityProviderFeeRate(_LP_FEE_RATE_, newLiquidityPorviderFeeRate);
        _LP_FEE_RATE_ = newLiquidityPorviderFeeRate;
        _checkDODOParameters();
    }

    function setMaintainerFeeRate(uint256 newMaintainerFeeRate) external onlyOwner {
        emit UpdateMaintainerFeeRate(_MT_FEE_RATE_, newMaintainerFeeRate);
        _MT_FEE_RATE_ = newMaintainerFeeRate;
        _checkDODOParameters();
    }

    function setK(uint256 newK) external onlyOwner {
        emit UpdateK(_K_, newK);
        _K_ = newK;
        _checkDODOParameters();
    }

    function setGasPriceLimit(uint256 newGasPriceLimit) external onlySupervisorOrOwner {
        emit UpdateGasPriceLimit(_GAS_PRICE_LIMIT_, newGasPriceLimit);
        _GAS_PRICE_LIMIT_ = newGasPriceLimit;
    }

    // ============ System Control Functions ============

    function disableTrading() external onlySupervisorOrOwner {
        _TRADE_ALLOWED_ = false;
    }

    function enableTrading() external onlyOwner notClosed {
        _TRADE_ALLOWED_ = true;
    }

    function disableQuoteDeposit() external onlySupervisorOrOwner {
        _DEPOSIT_QUOTE_ALLOWED_ = false;
    }

    function enableQuoteDeposit() external onlyOwner notClosed {
        _DEPOSIT_QUOTE_ALLOWED_ = true;
    }

    function disableBaseDeposit() external onlySupervisorOrOwner {
        _DEPOSIT_BASE_ALLOWED_ = false;
    }

    function enableBaseDeposit() external onlyOwner notClosed {
        _DEPOSIT_BASE_ALLOWED_ = true;
    }

    // ============ Advanced Control Functions ============

    function disableBuying() external onlySupervisorOrOwner {
        _BUYING_ALLOWED_ = false;
    }

    function enableBuying() external onlyOwner notClosed {
        _BUYING_ALLOWED_ = true;
    }

    function disableSelling() external onlySupervisorOrOwner {
        _SELLING_ALLOWED_ = false;
    }

    function enableSelling() external onlyOwner notClosed {
        _SELLING_ALLOWED_ = true;
    }

    function setBaseBalanceLimit(uint256 newBaseBalanceLimit) external onlyOwner notClosed {
        _BASE_BALANCE_LIMIT_ = newBaseBalanceLimit;
    }

    function setQuoteBalanceLimit(uint256 newQuoteBalanceLimit) external onlyOwner notClosed {
        _QUOTE_BALANCE_LIMIT_ = newQuoteBalanceLimit;
    }
}

// File: contracts/lib/Ownable.sol


/**
 * @title Ownable
 * @author DODO Breeder
 *
 * @notice Ownership related functions
 */
contract Ownable {
    address public _OWNER_;
    address public _NEW_OWNER_;

    // ============ Events ============

    event OwnershipTransferPrepared(address indexed previousOwner, address indexed newOwner);

    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);

    // ============ Modifiers ============

    modifier onlyOwner() {
        require(msg.sender == _OWNER_, "NOT_OWNER");
        _;
    }

    // ============ Functions ============

    constructor() internal {
        _OWNER_ = msg.sender;
        emit OwnershipTransferred(address(0), _OWNER_);
    }

    function transferOwnership(address newOwner) external onlyOwner {
        require(newOwner != address(0), "INVALID_OWNER");
        emit OwnershipTransferPrepared(_OWNER_, newOwner);
        _NEW_OWNER_ = newOwner;
    }

    function claimOwnership() external {
        require(msg.sender == _NEW_OWNER_, "INVALID_CLAIM");
        emit OwnershipTransferred(_OWNER_, _NEW_OWNER_);
        _OWNER_ = _NEW_OWNER_;
        _NEW_OWNER_ = address(0);
    }
}

// File: contracts/impl/DODOLpToken.sol


/**
 * @title DODOLpToken
 * @author DODO Breeder
 *
 * @notice Tokenize liquidity pool assets. An ordinary ERC20 contract with mint and burn functions
 */
contract DODOLpToken is Ownable {
    using SafeMath for uint256;

    string public symbol = "DLP";
    address public originToken;

    uint256 public totalSupply;
    mapping(address => uint256) internal balances;
    mapping(address => mapping(address => uint256)) internal allowed;

    // ============ Events ============

    event Transfer(address indexed from, address indexed to, uint256 amount);

    event Approval(address indexed owner, address indexed spender, uint256 amount);

    event Mint(address indexed user, uint256 value);

    event Burn(address indexed user, uint256 value);

    // ============ Functions ============

    constructor(address _originToken) public {
        originToken = _originToken;
    }

    function name() public view returns (string memory) {
        string memory lpTokenSuffix = "_DODO_LP_TOKEN_";
        return string(abi.encodePacked(IERC20(originToken).name(), lpTokenSuffix));
    }

    function decimals() public view returns (uint8) {
        return IERC20(originToken).decimals();
    }

    /**
     * @dev transfer token for a specified address
     * @param to The address to transfer to.
     * @param amount The amount to be transferred.
     */
    function transfer(address to, uint256 amount) public returns (bool) {
        require(amount <= balances[msg.sender], "BALANCE_NOT_ENOUGH");

        balances[msg.sender] = balances[msg.sender].sub(amount);
        balances[to] = balances[to].add(amount);
        emit Transfer(msg.sender, to, amount);
        return true;
    }

    /**
     * @dev Gets the balance of the specified address.
     * @param owner The address to query the the balance of.
     * @return balance An uint256 representing the amount owned by the passed address.
     */
    function balanceOf(address owner) external view returns (uint256 balance) {
        return balances[owner];
    }

    /**
     * @dev Transfer tokens from one address to another
     * @param from address The address which you want to send tokens from
     * @param to address The address which you want to transfer to
     * @param amount uint256 the amount of tokens to be transferred
     */
    function transferFrom(
        address from,
        address to,
        uint256 amount
    ) public returns (bool) {
        require(amount <= balances[from], "BALANCE_NOT_ENOUGH");
        require(amount <= allowed[from][msg.sender], "ALLOWANCE_NOT_ENOUGH");

        balances[from] = balances[from].sub(amount);
        balances[to] = balances[to].add(amount);
        allowed[from][msg.sender] = allowed[from][msg.sender].sub(amount);
        emit Transfer(from, to, amount);
        return true;
    }

    /**
     * @dev Approve the passed address to spend the specified amount of tokens on behalf of msg.sender.
     * @param spender The address which will spend the funds.
     * @param amount The amount of tokens to be spent.
     */
    function approve(address spender, uint256 amount) public returns (bool) {
        allowed[msg.sender][spender] = amount;
        emit Approval(msg.sender, spender, amount);
        return true;
    }

    /**
     * @dev Function to check the amount of tokens that an owner allowed to a spender.
     * @param owner address The address which owns the funds.
     * @param spender address The address which will spend the funds.
     * @return A uint256 specifying the amount of tokens still available for the spender.
     */
    function allowance(address owner, address spender) public view returns (uint256) {
        return allowed[owner][spender];
    }

    function mint(address user, uint256 value) external onlyOwner {
        balances[user] = balances[user].add(value);
        totalSupply = totalSupply.add(value);
        emit Mint(user, value);
        emit Transfer(address(0), user, value);
    }

    function burn(address user, uint256 value) external onlyOwner {
        balances[user] = balances[user].sub(value);
        totalSupply = totalSupply.sub(value);
        emit Burn(user, value);
        emit Transfer(user, address(0), value);
    }
}

// File: contracts/dodo.sol



/**
 * @title DODO
 * @author DODO Breeder
 *
 * @notice Entrance for users
 */
contract DODO is Admin, Trader, LiquidityProvider {
    function init(
        address owner,
        address supervisor,
        address maintainer,
        address baseToken,
        address quoteToken,
        address oracle,
        uint256 lpFeeRate,
        uint256 mtFeeRate,
        uint256 k,
        uint256 gasPriceLimit
    ) external {
        require(!_INITIALIZED_, "DODO_INITIALIZED");
        _INITIALIZED_ = true;

        // constructor
        _OWNER_ = owner;
        emit OwnershipTransferred(address(0), _OWNER_);

        _SUPERVISOR_ = supervisor;
        _MAINTAINER_ = maintainer;
        _BASE_TOKEN_ = baseToken;
        _QUOTE_TOKEN_ = quoteToken;
        _ORACLE_ = oracle;

        _DEPOSIT_BASE_ALLOWED_ = false;
        _DEPOSIT_QUOTE_ALLOWED_ = false;
        _TRADE_ALLOWED_ = false;
        _GAS_PRICE_LIMIT_ = gasPriceLimit;

        // Advanced controls are disabled by default
        _BUYING_ALLOWED_ = true;
        _SELLING_ALLOWED_ = true;
        uint256 MAX_INT = 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff;
        _BASE_BALANCE_LIMIT_ = MAX_INT;
        _QUOTE_BALANCE_LIMIT_ = MAX_INT;

        _LP_FEE_RATE_ = lpFeeRate;
        _MT_FEE_RATE_ = mtFeeRate;
        _K_ = k;
        _R_STATUS_ = Types.RStatus.ONE;

        _BASE_CAPITAL_TOKEN_ = address(new DODOLpToken(_BASE_TOKEN_));
        _QUOTE_CAPITAL_TOKEN_ = address(new DODOLpToken(_QUOTE_TOKEN_));

        _checkDODOParameters();
    }
}

Contract ABI

[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"buyer","type":"address"},{"indexed":false,"internalType":"uint256","name":"receiveBase","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"payQuote","type":"uint256"}],"name":"BuyBaseToken","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"maintainer","type":"address"},{"indexed":false,"internalType":"bool","name":"isBaseToken","type":"bool"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"ChargeMaintainerFee","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"payer","type":"address"},{"indexed":false,"internalType":"bool","name":"isBaseToken","type":"bool"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"ChargePenalty","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"baseTokenAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"quoteTokenAmount","type":"uint256"}],"name":"ClaimAssets","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"payer","type":"address"},{"indexed":true,"internalType":"address","name":"receiver","type":"address"},{"indexed":false,"internalType":"bool","name":"isBaseToken","type":"bool"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"lpTokenAmount","type":"uint256"}],"name":"Deposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"bool","name":"isBaseToken","type":"bool"}],"name":"Donate","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferPrepared","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"seller","type":"address"},{"indexed":false,"internalType":"uint256","name":"payBase","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"receiveQuote","type":"uint256"}],"name":"SellBaseToken","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"oldGasPriceLimit","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newGasPriceLimit","type":"uint256"}],"name":"UpdateGasPriceLimit","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"oldK","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newK","type":"uint256"}],"name":"UpdateK","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"oldLiquidityProviderFeeRate","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newLiquidityProviderFeeRate","type":"uint256"}],"name":"UpdateLiquidityProviderFeeRate","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"oldMaintainerFeeRate","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newMaintainerFeeRate","type":"uint256"}],"name":"UpdateMaintainerFeeRate","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"payer","type":"address"},{"indexed":true,"internalType":"address","name":"receiver","type":"address"},{"indexed":false,"internalType":"bool","name":"isBaseToken","type":"bool"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"lpTokenAmount","type":"uint256"}],"name":"Withdraw","type":"event"},{"inputs":[],"name":"_BASE_BALANCE_","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_BASE_BALANCE_LIMIT_","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_BASE_CAPITAL_RECEIVE_QUOTE_","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_BASE_CAPITAL_TOKEN_","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_BASE_TOKEN_","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_BUYING_ALLOWED_","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"_CLAIMED_","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_CLOSED_","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_DEPOSIT_BASE_ALLOWED_","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_DEPOSIT_QUOTE_ALLOWED_","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_GAS_PRICE_LIMIT_","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_K_","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_LP_FEE_RATE_","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_MAINTAINER_","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_MT_FEE_RATE_","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_NEW_OWNER_","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_ORACLE_","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_OWNER_","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_QUOTE_BALANCE_","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_QUOTE_BALANCE_LIMIT_","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_QUOTE_CAPITAL_RECEIVE_BASE_","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_QUOTE_CAPITAL_TOKEN_","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_QUOTE_TOKEN_","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_R_STATUS_","outputs":[{"internalType":"enum Types.RStatus","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_SELLING_ALLOWED_","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_SUPERVISOR_","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_TARGET_BASE_TOKEN_AMOUNT_","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_TARGET_QUOTE_TOKEN_AMOUNT_","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_TRADE_ALLOWED_","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"maxPayQuote","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"buyBaseToken","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"claimAssets","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"claimOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"depositBase","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"depositBaseTo","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"depositQuote","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"depositQuoteTo","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"disableBaseDeposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"disableBuying","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"disableQuoteDeposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"disableSelling","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"disableTrading","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"donateBaseToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"donateQuoteToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"enableBaseDeposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"enableBuying","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"enableQuoteDeposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"enableSelling","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"enableTrading","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"finalSettlement","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"lp","type":"address"}],"name":"getBaseCapitalBalanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getExpectedTarget","outputs":[{"internalType":"uint256","name":"baseTarget","type":"uint256"},{"internalType":"uint256","name":"quoteTarget","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"lp","type":"address"}],"name":"getLpBaseBalance","outputs":[{"internalType":"uint256","name":"lpBalance","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"lp","type":"address"}],"name":"getLpQuoteBalance","outputs":[{"internalType":"uint256","name":"lpBalance","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getMidPrice","outputs":[{"internalType":"uint256","name":"midPrice","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getOraclePrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"lp","type":"address"}],"name":"getQuoteCapitalBalanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTotalBaseCapital","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTotalQuoteCapital","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"getWithdrawBasePenalty","outputs":[{"internalType":"uint256","name":"penalty","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"getWithdrawQuotePenalty","outputs":[{"internalType":"uint256","name":"penalty","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"supervisor","type":"address"},{"internalType":"address","name":"maintainer","type":"address"},{"internalType":"address","name":"baseToken","type":"address"},{"internalType":"address","name":"quoteToken","type":"address"},{"internalType":"address","name":"oracle","type":"address"},{"internalType":"uint256","name":"lpFeeRate","type":"uint256"},{"internalType":"uint256","name":"mtFeeRate","type":"uint256"},{"internalType":"uint256","name":"k","type":"uint256"},{"internalType":"uint256","name":"gasPriceLimit","type":"uint256"}],"name":"init","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"queryBuyBaseToken","outputs":[{"internalType":"uint256","name":"payQuote","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"querySellBaseToken","outputs":[{"internalType":"uint256","name":"receiveQuote","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"retrieve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"minReceiveQuote","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"sellBaseToken","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newBaseBalanceLimit","type":"uint256"}],"name":"setBaseBalanceLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newGasPriceLimit","type":"uint256"}],"name":"setGasPriceLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newK","type":"uint256"}],"name":"setK","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newLiquidityPorviderFeeRate","type":"uint256"}],"name":"setLiquidityProviderFeeRate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newMaintainer","type":"address"}],"name":"setMaintainer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newMaintainerFeeRate","type":"uint256"}],"name":"setMaintainerFeeRate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOracle","type":"address"}],"name":"setOracle","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newQuoteBalanceLimit","type":"uint256"}],"name":"setQuoteBalanceLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newSupervisor","type":"address"}],"name":"setSupervisor","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"version","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"withdrawAllBase","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"}],"name":"withdrawAllBaseTo","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawAllQuote","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"}],"name":"withdrawAllQuoteTo","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdrawBase","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdrawBaseTo","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdrawQuote","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdrawQuoteTo","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"}]

608060405234801561001057600080fd5b50615bc5806100206000396000f3fe60806040523480156200001157600080fd5b5060043610620005205760003560e01c80638a8c523c11620002a9578063c59203af1162000171578063ec2fd46d11620000e1578063f2220416116200009f578063f222041614620009fe578063f2fde38b1462000a15578063f3ae6c5f1462000a2c578063f67ed4481462000a43578063f98bea151462000a5a578063ffa642251462000a715762000520565b8063ec2fd46d14620009a5578063ed0aa42814620009af578063ee27c68914620009c6578063ee5150b314620009d0578063f00f9a0914620009e75762000520565b8063d4b97046116200012f578063d4b970461462000966578063d689107c1462000970578063dd58b41c146200097a578063e67ce7061462000984578063eab5d20e146200099b5762000520565b8063c59203af1462000934578063c5bbffe8146200093e578063c6b73cf91462000948578063cc062b581462000952578063d47eaa37146200095c5762000520565b8063a3161a561162000219578063aceecbc811620001d7578063aceecbc814620008de578063b2094fd314620008e8578063bc7d679d14620008f2578063c0a5f6ff14620008fc578063c0ffa1781462000913578063c3a2a665146200091d5762000520565b8063a3161a56146200089f578063a598aca714620008a9578063aa06ce9b14620008b3578063ab44a7a314620008ca578063ac1fbc9814620008d45762000520565b8063947cf92b1162000267578063947cf92b146200083957806395faa5f6146200085057806397316ad814620008675780639b020fba146200087e578063a2801e1614620008885762000520565b80638a8c523c14620007ed5780638dae733314620007f75780638ff5e742146200080e57806390cbf82214620008185780639299eb3014620008225762000520565b806336ac41a811620003ed578063648a4fac116200035d578063796da7af116200031b578063796da7af146200078a5780637adbf97314620007945780637aed942d14620007ab5780637c9b8e8914620007c25780638456db1514620007cc578063892daf0514620007d65762000520565b8063648a4fac146200072f57806367de8be9146200073957806368be20ad14620007505780636ec6a58d146200077657806373a2ab7c14620007805762000520565b80634de4527e11620003ab5780634de4527e14620006e35780634e71e0c814620006ed57806354fd4d5014620006f75780635bb7552a14620007015780635f179f6414620007185762000520565b806336ac41a814620006a4578063387b0c1114620006ae5780633960f14214620006c55780634322ec8314620006cf5780634a248d2a14620006d95762000520565b80631769ddaa11620004955780631f3c156e11620004535780631f3c156e146200064e578063245c96851462000658578063247f993b146200066257806327bed8ee146200066c5780632aa82c65146200068357806336a53bbb146200068d5762000520565b80631769ddaa14620005f357806317700f0114620005fd57806317be952e146200060757806318c0bbe414620006205780631e34b9cc14620006375762000520565b8063108db74411620004e3578063108db74414620005985780631184d8be14620005af57806313c5762414620005b957806313ea5d2914620005c357806316048bc414620005da5762000520565b806304512dc414620005255780630923160214620005545780630c9f7bd0146200056d5780630cd1667d14620005845780630e6518e9146200058e575b600080fd5b6200053c62000536366004620041de565b62000a8b565b6040516200054b919062004afb565b60405180910390f35b6200056b62000565366004620042fb565b62000c3d565b005b6200053c6200057e366004620042fb565b62000cc2565b6200053c62000db7565b6200053c62000e3e565b6200053c620005a9366004620042ac565b62000e44565b6200056b62001067565b6200056b620010d6565b6200056b620005d4366004620041de565b62001128565b620005e462001177565b6040516200054b9190620043eb565b6200053c62001186565b6200056b6200118c565b62000611620011de565b6040516200054b9190620044b5565b6200053c62000631366004620042fb565b620011e7565b6200053c62000648366004620041de565b62001200565b6200056b62001379565b6200053c62001670565b6200056b62001676565b6200053c6200067d366004620042fb565b620016c5565b6200053c620016d9565b6200053c6200069e366004620041de565b6200171f565b6200056b62001779565b6200056b620006bf366004620042fb565b620017e8565b620005e46200184f565b620005e46200185e565b620005e46200186d565b6200053c6200187c565b6200056b62001882565b6200053c62001913565b6200056b62000712366004620042fb565b62001918565b6200053c62000729366004620042ac565b62001995565b6200056b62001af4565b6200056b6200074a366004620042fb565b62001c24565b6200076762000761366004620041de565b62001c9d565b6040516200054b91906200443c565b6200076762001cb2565b620005e462001cc2565b6200053c62001cd1565b6200056b620007a5366004620041de565b62001d17565b6200053c620007bc366004620041de565b62001d66565b6200053c62001ded565b620005e462001df3565b6200056b620007e7366004620042fb565b62001e02565b6200056b62001e61565b6200053c620008083660046200432d565b62001ed0565b620007676200218e565b6200056b6200219c565b6200056b62000833366004620041de565b62002205565b6200053c6200084a366004620042ac565b62002254565b6200053c62000861366004620041de565b62002439565b6200056b62000878366004620042fb565b6200247e565b6200053c620024dd565b6200053c62000899366004620042fb565b620024e3565b62000767620024f0565b62000767620024f9565b6200053c620008c4366004620042ac565b62002509565b6200053c6200264a565b620005e462002650565b6200056b6200265f565b6200053c620026af565b6200056b620026b5565b6200053c6200090d366004620042fb565b62002707565b6200053c62002715565b6200056b6200092e366004620042ac565b6200271b565b6200053c6200290a565b6200076762002917565b6200053c62002927565b6200056b6200292d565b6200053c62002998565b620005e4620029a5565b620005e4620029b4565b62000767620029c3565b6200053c620009953660046200432d565b620029d3565b6200053c62002c68565b6200053c62002c6e565b6200056b620009c0366004620042fb565b62002c74565b6200053c62002ccb565b6200053c620009e1366004620042fb565b62002ddc565b6200056b620009f8366004620041fc565b62002e8b565b6200056b62000a0f366004620042fb565b62003095565b6200056b62000a26366004620041de565b6200310e565b6200053c62000a3d366004620042fb565b620031bf565b6200053c62000a54366004620041de565b620031cd565b6200053c62000a6b366004620042fb565b62003200565b62000a7b6200320e565b6040516200054b92919062004b14565b600154600090600160a01b900460ff161562000ac45760405162461bcd60e51b815260040162000abb90620045d7565b60405180910390fd5b6001805460ff60a01b1916600160a01b1790819055600160b01b900460ff161562000b035760405162461bcd60e51b815260040162000abb9062004862565b600062000b10336200171f565b9050600062000b1f33620031cd565b9050600062000b2e8362000cc2565b90508281111562000b535760405162461bcd60e51b815260040162000abb906200483a565b60105462000b68908463ffffffff620032e316565b60105562000b7733836200330e565b62000b948562000b8e858463ffffffff620032e316565b6200337a565b62000b9f81620033b5565b846001600160a01b0316336001600160a01b031660008051602062005b508339815191526000868660405162000bd89392919062004457565b60405180910390a3336001600160a01b031660008051602062005b7083398151915260008360405162000c0d92919062004447565b60405180910390a262000c27838263ffffffff620032e316565b6001805460ff60a01b1916905595945050505050565b6006546001600160a01b031633148062000c6157506000546001600160a01b031633145b62000c805760405162461bcd60e51b815260040162000abb90620046f6565b7f808f99cfd15f1be6019f93dc76c81d5bd82e0b3e0b3d23a54f5a2e647a6cc3cc6002548260405162000cb592919062004b14565b60405180910390a1600255565b600060125482111562000ce95760405162461bcd60e51b815260040162000abb90620044ca565b6002600e5460ff16600281111562000cfd57fe5b141562000dae57600062000d1f600f54601154620032e390919063ffffffff16565b9050600062000d2d62001cd1565b9050600062000d3d83836200340d565b9050600062000d52601254600d54846200343a565b9050600062000d7b62000d7188601254620032e390919063ffffffff16565b600d54856200343a565b905062000da162000d93828963ffffffff620034f116565b839063ffffffff620032e316565b9550505050505062000db2565b5060005b919050565b601354604080516318160ddd60e01b815290516000926001600160a01b0316916318160ddd916004808301926020929190829003018186803b15801562000dfd57600080fd5b505afa15801562000e12573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000e38919062004314565b90505b90565b60165481565b600154600090600160a01b900460ff161562000e745760405162461bcd60e51b815260040162000abb90620045d7565b6001805460ff60a01b1916600160a01b1790819055600160b01b900460ff161562000eb35760405162461bcd60e51b815260040162000abb9062004862565b600062000ebf6200320e565b915050600062000ece620016d9565b90506000811162000ef35760405162461bcd60e51b815260040162000abb90620045fa565b600062000f198362000f0c878563ffffffff6200352016565b9063ffffffff6200356016565b905062000f2633620031cd565b81111562000f485760405162461bcd60e51b815260040162000abb90620046b3565b600062000f558662000cc2565b905085811062000f795760405162461bcd60e51b815260040162000abb906200483a565b60105462000f8e908763ffffffff620032e316565b60105562000f9d33836200330e565b62000fb48762000b8e888463ffffffff620032e316565b62000fbf81620033b5565b6001600160a01b0387163360008051602062005b50833981519152600062000fee8a8663ffffffff620032e316565b86604051620010009392919062004457565b60405180910390a3336001600160a01b031660008051602062005b708339815191526000836040516200103592919062004447565b60405180910390a26200104f868263ffffffff620032e316565b6001805460ff60a01b19169055979650505050505050565b6000546001600160a01b03163314620010945760405162461bcd60e51b815260040162000abb90620048d9565b600154600160b01b900460ff1615620010c15760405162461bcd60e51b815260040162000abb9062004862565b6001805460ff60c01b1916600160c01b179055565b6006546001600160a01b0316331480620010fa57506000546001600160a01b031633145b620011195760405162461bcd60e51b815260040162000abb90620046f6565b6001805460ff60c01b19169055565b6000546001600160a01b03163314620011555760405162461bcd60e51b815260040162000abb90620048d9565b600780546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b031681565b60055481565b6006546001600160a01b0316331480620011b057506000546001600160a01b031633145b620011cf5760405162461bcd60e51b815260040162000abb90620046f6565b6001805460ff60c81b19169055565b600e5460ff1681565b6000620011f48262003592565b50939695505050505050565b600154600090600160a01b900460ff1615620012305760405162461bcd60e51b815260040162000abb90620045d7565b6001805460ff60a01b1916600160a01b1790819055600160b01b900460ff16156200126f5760405162461bcd60e51b815260040162000abb9062004862565b60006200127c3362002439565b905060006200128b3362001d66565b905060006200129a8362002ddc565b905082811115620012bf5760405162461bcd60e51b815260040162000abb906200483a565b600f54620012d4908463ffffffff620032e316565b600f55620012e3338362003705565b6200130085620012fa858463ffffffff620032e316565b62003739565b6200130b8162003774565b846001600160a01b0316336001600160a01b031660008051602062005b5083398151915260018686604051620013449392919062004457565b60405180910390a3336001600160a01b031660008051602062005b7083398151915260018360405162000c0d92919062004447565b600154600160a01b900460ff1615620013a65760405162461bcd60e51b815260040162000abb90620045d7565b6001805460ff60a01b1916600160a01b1790819055600160b01b900460ff16620013e45760405162461bcd60e51b815260040162000abb9062004aa6565b3360009081526017602052604090205460ff1615620014175760405162461bcd60e51b815260040162000abb9062004a7d565b336000818152601760205260408120805460ff19166001179055906200143d90620031cd565b905060006200144c3362001d66565b9050600082156200148a576200148762001465620016d9565b6010546200147a908663ffffffff6200352016565b9063ffffffff620037c116565b90505b60008215620014b957620014b6620014a162000db7565b600f546200147a908663ffffffff6200352016565b90505b601054620014ce908363ffffffff620032e316565b601055600f54620014e6908263ffffffff620032e316565b600f819055506200150c620014fe846015546200340d565b839063ffffffff620034f116565b91506200152e62001520856016546200340d565b829063ffffffff620034f116565b90506200153c338262003739565b6200154833836200337a565b601354604051632770a7eb60e21b81526001600160a01b0390911690639dc29fac906200157c9033908790600401620043ff565b600060405180830381600087803b1580156200159757600080fd5b505af1158015620015ac573d6000803e3d6000fd5b5050601454604051632770a7eb60e21b81526001600160a01b039091169250639dc29fac9150620015e49033908890600401620043ff565b600060405180830381600087803b158015620015ff57600080fd5b505af115801562001614573d6000803e3d6000fd5b50505050336001600160a01b03167fbe5f7fe66d16c6a87bb5b8b08a96634fe4f1c2bac9e5e413efe41a782d4d0c4382846040516200165592919062004b14565b60405180910390a2505050506001805460ff60a01b19169055565b60105481565b6006546001600160a01b03163314806200169a57506000546001600160a01b031633145b620016b95760405162461bcd60e51b815260040162000abb90620046f6565b6003805460ff19169055565b6000620016d3338362002509565b92915050565b601454604080516318160ddd60e01b815290516000926001600160a01b0316916318160ddd916004808301926020929190829003018186803b15801562000dfd57600080fd5b6000806200172c620016d9565b905060006200173a6200320e565b915050816200174f5760009250505062000db2565b62001771826200147a836200176488620031cd565b9063ffffffff6200352016565b949350505050565b6000546001600160a01b03163314620017a65760405162461bcd60e51b815260040162000abb90620048d9565b600154600160b01b900460ff1615620017d35760405162461bcd60e51b815260040162000abb9062004862565b6001805460ff60b81b1916600160b81b179055565b600154600160a01b900460ff1615620018155760405162461bcd60e51b815260040162000abb90620045d7565b6001805460ff60a01b1916600160a01b179055620018343382620037ef565b6200183f81620033b5565b506001805460ff60a01b19169055565b6006546001600160a01b031681565b6007546001600160a01b031681565b6008546001600160a01b031681565b60025481565b6001546001600160a01b03163314620018af5760405162461bcd60e51b815260040162000abb906200451e565b600154600080546040516001600160a01b0393841693909116917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a360018054600080546001600160a01b03199081166001600160a01b03841617909155169055565b606590565b6000546001600160a01b03163314620019455760405162461bcd60e51b815260040162000abb90620048d9565b7f3ce6ea91adda496b7a0546fa6558e5b52c3a509de6015820efb00ca4020e0a07600b54826040516200197a92919062004b14565b60405180910390a1600b819055620019916200385d565b5050565b600154600090600160a01b900460ff1615620019c55760405162461bcd60e51b815260040162000abb90620045d7565b6001805460ff60a01b1916600160a01b1790819055600160b81b900460ff1662001a035760405162461bcd60e51b815260040162000abb90620045a0565b600062001a0f6200320e565b915050600062001a1e620016d9565b9050838162001a415762001a39858463ffffffff620034f116565b905062001a62565b821562001a625762001a5f836200147a878563ffffffff6200352016565b90505b62001a6e3386620037ef565b62001a7a8682620038f2565b60105462001a8f908663ffffffff620034f116565b6010556040516001600160a01b0387169033907f18081cde2fa64894914e1080b98cca17bb6d1acf633e57f6e26ebdb945ad830b9062001ad6906000908a90879062004457565b60405180910390a36001805460ff60a01b1916905595945050505050565b6000546001600160a01b0316331462001b215760405162461bcd60e51b815260040162000abb90620048d9565b600154600160b01b900460ff161562001b4e5760405162461bcd60e51b815260040162000abb9062004862565b6001805462ffffff60b81b1960ff60b01b19909116600160b01b17169055600062001b7862000db7565b9050600062001b86620016d9565b9050601054601254111562001bc857600062001bb0601054601254620032e390919063ffffffff16565b905062001bbe818462003926565b6015555062001bcf565b6012546010555b600f54601154111562001c0f57600062001bf7600f54601154620032e390919063ffffffff16565b905062001c05818362003926565b6016555062001c16565b601154600f555b5050600e805460ff19169055565b6000546001600160a01b0316331462001c515760405162461bcd60e51b815260040162000abb90620048d9565b7f023a40bebf7ac113f81c3d628073246cf9e0bc49980a9d6a9531498ce9e3dd1c600d548260405162001c8692919062004b14565b60405180910390a1600d819055620019916200385d565b60176020526000908152604090205460ff1681565b600154600160b01b900460ff1681565b600a546001600160a01b031681565b600a5460408051634c6afee560e11b815290516000926001600160a01b0316916398d5fdca916004808301926020929190829003018186803b15801562000dfd57600080fd5b6000546001600160a01b0316331462001d445760405162461bcd60e51b815260040162000abb90620048d9565b600a80546001600160a01b0319166001600160a01b0392909216919091179055565b6013546040516370a0823160e01b81526000916001600160a01b0316906370a082319062001d99908590600401620043eb565b60206040518083038186803b15801562001db257600080fd5b505afa15801562001dc7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620016d3919062004314565b60125481565b6001546001600160a01b031681565b6000546001600160a01b0316331462001e2f5760405162461bcd60e51b815260040162000abb90620048d9565b600154600160b01b900460ff161562001e5c5760405162461bcd60e51b815260040162000abb9062004862565b600455565b6000546001600160a01b0316331462001e8e5760405162461bcd60e51b815260040162000abb90620048d9565b600154600160b01b900460ff161562001ebb5760405162461bcd60e51b815260040162000abb9062004862565b6001805460ff60c81b1916600160c81b179055565b600154600090600160c81b900460ff1662001eff5760405162461bcd60e51b815260040162000abb90620047e8565b600354610100900460ff1662001f295760405162461bcd60e51b815260040162000abb9062004887565b6002543a111562001f4e5760405162461bcd60e51b815260040162000abb9062004a53565b600154600160a01b900460ff161562001f7b5760405162461bcd60e51b815260040162000abb90620045d7565b6001805460ff60a01b1916600160a01b1790556000808080808062001fa08b62003947565b9550955095509550955095508986101562001fcf5760405162461bcd60e51b815260040162000abb90620049ab565b62001fdb33876200337a565b8715620020455760405163301bc67560e11b815233906360378cea9062002010906000908f908b908f908f906004016200446f565b600060405180830381600087803b1580156200202b57600080fd5b505af115801562002040573d6000803e3d6000fd5b505050505b62002051338c62003ac0565b8315620020bd5760075462002070906001600160a01b0316856200337a565b6007546040516001600160a01b03909116907fe4fed5362e2669c70e5da5a18942d1e617d8917f6adc0164d9668bd3a6d0cebe90620020b490600090889062004447565b60405180910390a25b8160105414620020cd5760108290555b80600f5414620020dd57600f8190555b826002811115620020ea57fe5b600e5460ff166002811115620020fc57fe5b146200212257600e805484919060ff191660018360028111156200211c57fe5b02179055505b6200212d85620033b5565b336001600160a01b03167fd8648b6ac54162763c86fd54bf2005af8ecd2f9cb273a5775921fd7f91e17b2d8c886040516200216a92919062004b14565b60405180910390a250506001805460ff60a01b191690555091979650505050505050565b600354610100900460ff1681565b6000546001600160a01b03163314620021c95760405162461bcd60e51b815260040162000abb90620048d9565b600154600160b01b900460ff1615620021f65760405162461bcd60e51b815260040162000abb9062004862565b6003805460ff19166001179055565b6000546001600160a01b03163314620022325760405162461bcd60e51b815260040162000abb90620048d9565b600680546001600160a01b0319166001600160a01b0392909216919091179055565b600154600090600160a01b900460ff1615620022845760405162461bcd60e51b815260040162000abb90620045d7565b6001805460ff60a01b1916600160a01b1790819055600160b01b900460ff1615620022c35760405162461bcd60e51b815260040162000abb9062004862565b6000620022cf6200320e565b5090506000620022de62000db7565b905060008111620023035760405162461bcd60e51b815260040162000abb9062004545565b60006200231c8362000f0c878563ffffffff6200352016565b9050620023293362001d66565b8111156200234b5760405162461bcd60e51b815260040162000abb9062004969565b6000620023588662002ddc565b9050858111156200237d5760405162461bcd60e51b815260040162000abb906200483a565b600f5462002392908763ffffffff620032e316565b600f55620023a1338362003705565b620023b887620012fa888463ffffffff620032e316565b620023c38162003774565b6001600160a01b0387163360008051602062005b508339815191526001620023f28a8663ffffffff620032e316565b86604051620024049392919062004457565b60405180910390a3336001600160a01b031660008051602062005b708339815191526001836040516200103592919062004447565b6000806200244662000db7565b90506000620024546200320e565b50905081620024695760009250505062000db2565b62001771826200147a83620017648862001d66565b6000546001600160a01b03163314620024ab5760405162461bcd60e51b815260040162000abb90620048d9565b600154600160b01b900460ff1615620024d85760405162461bcd60e51b815260040162000abb9062004862565b600555565b60045481565b6000620011f48262003947565b60035460ff1681565b600154600160c01b900460ff1681565b600154600090600160a01b900460ff1615620025395760405162461bcd60e51b815260040162000abb90620045d7565b6001805460ff60a01b1916600160a01b1790819055600160c01b900460ff16620025775760405162461bcd60e51b815260040162000abb9062004569565b6000620025836200320e565b50905060006200259262000db7565b90508381620025b557620025ad858463ffffffff620034f116565b9050620025d6565b8215620025d657620025d3836200147a878563ffffffff6200352016565b90505b620025e2338662003ac0565b620025ee868262003b2e565b600f5462002603908663ffffffff620034f116565b600f556040516001600160a01b0387169033907f18081cde2fa64894914e1080b98cca17bb6d1acf633e57f6e26ebdb945ad830b9062001ad6906001908a90879062004457565b600b5481565b6014546001600160a01b031681565b6006546001600160a01b03163314806200268357506000546001600160a01b031633145b620026a25760405162461bcd60e51b815260040162000abb90620046f6565b6003805461ff0019169055565b600f5481565b6006546001600160a01b0316331480620026d957506000546001600160a01b031633145b620026f85760405162461bcd60e51b815260040162000abb90620046f6565b6001805460ff60b81b19169055565b6000620016d3338362000e44565b600c5481565b6000546001600160a01b03163314620027485760405162461bcd60e51b815260040162000abb90620048d9565b6008546001600160a01b03838116911614156200281b5760115462002774908263ffffffff620034f116565b6008546040516370a0823160e01b81526001600160a01b03909116906370a0823190620027a6903090600401620043eb565b60206040518083038186803b158015620027bf57600080fd5b505afa158015620027d4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620027fa919062004314565b10156200281b5760405162461bcd60e51b815260040162000abb90620047b1565b6009546001600160a01b0383811691161415620028ee5760125462002847908263ffffffff620034f116565b6009546040516370a0823160e01b81526001600160a01b03909116906370a082319062002879903090600401620043eb565b60206040518083038186803b1580156200289257600080fd5b505afa158015620028a7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620028cd919062004314565b1015620028ee5760405162461bcd60e51b815260040162000abb90620044ca565b620019916001600160a01b038316338363ffffffff62003b6216565b600062000e383362000a8b565b600154600160b81b900460ff1681565b60155481565b6000546001600160a01b031633146200295a5760405162461bcd60e51b815260040162000abb90620048d9565b600154600160b01b900460ff1615620029875760405162461bcd60e51b815260040162000abb9062004862565b6003805461ff001916610100179055565b600062000e383362001200565b6009546001600160a01b031681565b6013546001600160a01b031681565b600154600160c81b900460ff1681565b600154600090600160c81b900460ff1662002a025760405162461bcd60e51b815260040162000abb90620047e8565b60035460ff1662002a275760405162461bcd60e51b815260040162000abb9062004acf565b6002543a111562002a4c5760405162461bcd60e51b815260040162000abb9062004a53565b600154600160a01b900460ff161562002a795760405162461bcd60e51b815260040162000abb90620045d7565b6001805460ff60a01b1916600160a01b1790556000808080808062002a9e8b62003592565b9550955095509550955095508986111562002acd5760405162461bcd60e51b815260040162000abb90620049e2565b62002ad9338c62003739565b871562002b435760405163301bc67560e11b815233906360378cea9062002b0e906001908f908b908f908f906004016200446f565b600060405180830381600087803b15801562002b2957600080fd5b505af115801562002b3e573d6000803e3d6000fd5b505050505b62002b4f3387620037ef565b831562002bbb5760075462002b6e906001600160a01b03168562003739565b6007546040516001600160a01b03909116907fe4fed5362e2669c70e5da5a18942d1e617d8917f6adc0164d9668bd3a6d0cebe9062002bb290600190889062004447565b60405180910390a25b816010541462002bcb5760108290555b80600f541462002bdb57600f8190555b82600281111562002be857fe5b600e5460ff16600281111562002bfa57fe5b1462002c2057600e805484919060ff1916600183600281111562002c1a57fe5b02179055505b62002c2b8562003774565b336001600160a01b03167fe93ad76094f247c0dafc1c61adc2187de1ac2738f7a3b49cb20b2263420251a38c886040516200216a92919062004b14565b60115481565b600d5481565b600154600160a01b900460ff161562002ca15760405162461bcd60e51b815260040162000abb90620045d7565b6001805460ff60a01b1916600160a01b17905562002cc0338262003ac0565b6200183f8162003774565b600080600062002cda6200320e565b90925090506002600e5460ff16600281111562002cf357fe5b141562002d8657600062002d2562002d1c6012546200147a85866200352090919063ffffffff16565b60125462003926565b905062002d6462002d39600d54836200340d565b600d5462002d5790670de0b6b3a76400009063ffffffff620032e316565b9063ffffffff620034f116565b905062002d7b62002d7462001cd1565b8262003926565b935050505062000e3b565b600062002db162002da86011546200147a86876200352090919063ffffffff16565b60115462003926565b905062002dc562002d39600d54836200340d565b905062002d7b62002dd562001cd1565b826200340d565b600060115482111562002e035760405162461bcd60e51b815260040162000abb90620047b1565b6001600e5460ff16600281111562002e1757fe5b141562000dae57600062002e39601054601254620032e390919063ffffffff16565b9050600062002e4762001cd1565b9050600062002e57838362003926565b9050600062002e6c601154600d54846200343a565b9050600062000d7b62000d7188601154620032e390919063ffffffff16565b600154600160a81b900460ff161562002eb85760405162461bcd60e51b815260040162000abb9062004787565b6001805460ff60a81b1916600160a81b179055600080546001600160a01b03808d166001600160a01b031990921691909117808355604051911691907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a3600680546001600160a01b03199081166001600160a01b038c8116919091179092556007805482168b84161790556008805482168a841617908190556009805483168a8516179055600a8054909216888416179091556001805462ffffff60b81b1916815560028490556003805461010060ff1991821690931761ff00191692909217905560001960048190556005819055600b889055600c879055600d869055600e80549092169091556040519092919091169062002fd990620041b8565b62002fe59190620043eb565b604051809103906000f08015801562003002573d6000803e3d6000fd5b50601380546001600160a01b0319166001600160a01b039283161790556009546040519116906200303390620041b8565b6200303f9190620043eb565b604051809103906000f0801580156200305c573d6000803e3d6000fd5b50601480546001600160a01b0319166001600160a01b0392909216919091179055620030876200385d565b505050505050505050505050565b6000546001600160a01b03163314620030c25760405162461bcd60e51b815260040162000abb90620048d9565b7f6b04da3d58e4b37d99652babb3ea2bc25ce94379bfff3059f03d61b26c59e553600c5482604051620030f792919062004b14565b60405180910390a1600c819055620019916200385d565b6000546001600160a01b031633146200313b5760405162461bcd60e51b815260040162000abb90620048d9565b6001600160a01b038116620031645760405162461bcd60e51b815260040162000abb9062004813565b600080546040516001600160a01b03808516939216917fdcf55418cee3220104fef63f979ff3c4097ad240c0c43dcb33ce837748983e6291a3600180546001600160a01b0319166001600160a01b0392909216919091179055565b6000620016d3338362001995565b6014546040516370a0823160e01b81526000916001600160a01b0316906370a082319062001d99908590600401620043eb565b6000620016d3338362002254565b601254601154600091829182600e5460ff1660028111156200322c57fe5b14156200324557600f54601054935093505050620032df565b6002600e5460ff1660028111156200325957fe5b1415620032915760006200326c62003bc1565b600f5490915062003284848363ffffffff620034f116565b94509450505050620032df565b6001600e5460ff166002811115620032a557fe5b1415620032dc576000620032b862003c32565b9050620032cc828263ffffffff620034f116565b60105494509450505050620032df565b50505b9091565b600082821115620033085760405162461bcd60e51b815260040162000abb9062004764565b50900390565b601454604051632770a7eb60e21b81526001600160a01b0390911690639dc29fac90620033429085908590600401620043ff565b600060405180830381600087803b1580156200335d57600080fd5b505af115801562003372573d6000803e3d6000fd5b505050505050565b60095462003399906001600160a01b0316838363ffffffff62003b6216565b601254620033ae908263ffffffff620032e316565b6012555050565b601054620033ca908263ffffffff620034f116565b6010556040517fa259c93818139b6bc90fb80e8feb75122b42edaae49560f81392cf4e1946726e906200340290839060009062004b04565b60405180910390a150565b6000670de0b6b3a76400006200342a848463ffffffff6200352016565b816200343257fe5b049392505050565b6000806200345a6200345360046200176487876200340d565b8662003c9a565b9050620034856200347f670de0b6b3a764000062001764848263ffffffff620034f116565b62003cbb565b90506000620034c0620034a783670de0b6b3a764000063ffffffff620032e316565b620034ba87600263ffffffff6200352016565b62003c9a565b9050620034e786620034e1670de0b6b3a76400008463ffffffff620034f116565b6200340d565b9695505050505050565b600082820183811015620035195760405162461bcd60e51b815260040162000abb90620048fc565b9392505050565b6000826200353157506000620016d3565b828202828482816200353f57fe5b0414620035195760405162461bcd60e51b815260040162000abb9062004a12565b6000806200356f8484620037c1565b9050828102840380156200358957506001019050620016d3565b509050620016d3565b600080600080600080620035a56200320e565b8093508192505050620035bb87600b546200340d565b9450620035cb87600c546200340d565b93506000620035e68562002d578a8963ffffffff620034f116565b90506000600e5460ff166002811115620035fc57fe5b14156200361b576200360f818362003cf6565b965060019350620036fb565b6001600e5460ff1660028111156200362f57fe5b141562003645576200360f816011548462003d3d565b6002600e5460ff1660028111156200365957fe5b1415620036fb5760006200367960125485620032e390919063ffffffff16565b905060006200369484601154620032e390919063ffffffff16565b905080831015620036ba57620036ae836012548762003d8d565b985060029550620036f8565b80831415620036d05781985060009550620036f8565b620036f1620014fe620036ea858463ffffffff620032e316565b8662003cf6565b9850600195505b50505b5091939550919395565b601354604051632770a7eb60e21b81526001600160a01b0390911690639dc29fac90620033429085908590600401620043ff565b60085462003758906001600160a01b0316838363ffffffff62003b6216565b6011546200376d908263ffffffff620032e316565b6011555050565b600f5462003789908263ffffffff620034f116565b600f556040517fa259c93818139b6bc90fb80e8feb75122b42edaae49560f81392cf4e1946726e906200340290839060019062004b04565b6000808211620037e55760405162461bcd60e51b815260040162000abb906200468b565b8183816200343257fe5b60055460125462003807908363ffffffff620034f116565b1115620038285760405162461bcd60e51b815260040162000abb906200461f565b60095462003848906001600160a01b031683308463ffffffff62003dcf16565b601254620033ae908263ffffffff620034f116565b6000670de0b6b3a7640000600d54106200388b5760405162461bcd60e51b815260040162000abb9062004a35565b6000600d5411620038b05760405162461bcd60e51b815260040162000abb9062004501565b670de0b6b3a7640000620038d2600c54600b54620034f190919063ffffffff16565b1062000e3b5760405162461bcd60e51b815260040162000abb90620048b4565b6014546040516340c10f1960e01b81526001600160a01b03909116906340c10f1990620033429085908590600401620043ff565b600062003519826200147a85670de0b6b3a764000063ffffffff6200352016565b6000806000806000806200395a6200320e565b92509050866000600e5460ff1660028111156200397357fe5b1415620039925762003986818462003df9565b96506002935062003a70565b6001600e5460ff166002811115620039a657fe5b141562003a5a576000620039c660115484620032e390919063ffffffff16565b90506000620039e185601254620032e390919063ffffffff16565b90508183101562003a1457620039fb836011548662003e3b565b9850600195508089111562003a0e578098505b62003a52565b8183141562003a2a578098506000955062003a52565b62003a4b6200152062003a44858563ffffffff620032e316565b8762003df9565b9850600295505b505062003a70565b62003a69816012548562003e5f565b9650600293505b62003a7e87600b546200340d565b955062003a8e87600c546200340d565b945062003ab48562003aa7898963ffffffff620032e316565b9063ffffffff620032e316565b96505091939550919395565b60045460115462003ad8908363ffffffff620034f116565b111562003af95760405162461bcd60e51b815260040162000abb906200472d565b60085462003b19906001600160a01b031683308463ffffffff62003dcf16565b6011546200376d908263ffffffff620034f116565b6013546040516340c10f1960e01b81526001600160a01b03909116906340c10f1990620033429085908590600401620043ff565b62003bbc8363a9059cbb60e01b848460405160240162003b84929190620043ff565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b03199093169290921790915262003e96565b505050565b60008062003bdd600f54601154620032e390919063ffffffff16565b9050600062003beb62001cd1565b9050600062003bfb83836200340d565b9050600062003c10601254600d54846200343a565b905062003c2960125482620032e390919063ffffffff16565b94505050505090565b60008062003c4e601054601254620032e390919063ffffffff16565b9050600062003c5c62001cd1565b9050600062003c6c838362003926565b9050600062003c81601154600d54846200343a565b905062003c2960115482620032e390919063ffffffff16565b6000620035198262000f0c85670de0b6b3a764000063ffffffff6200352016565b80600160028204015b8181101562003cf05780915060028182858162003cdd57fe5b04018162003ce757fe5b04905062003cc4565b50919050565b600081831062003d1a5760405162461bcd60e51b815260040162000abb90620047b1565b600062003d2e838563ffffffff620032e316565b90506200177183848362003f5a565b600082841062003d615760405162461bcd60e51b815260040162000abb90620047b1565b600062003d75848663ffffffff620032e316565b905062003d8483858362003f5a565b95945050505050565b60008062003d9a62001cd1565b9050600062003dbb848662003db0858a62003f7a565b6001600d5462003f9b565b9050620034e7818663ffffffff620032e316565b62003df3846323b872dd60e01b85858560405160240162003b849392919062004418565b50505050565b60008062003e0662001cd1565b9050600062003e27848562003e1c85896200340d565b6000600d5462003f9b565b905062003d84848263ffffffff620032e316565b60008062003e50848663ffffffff620034f116565b905062003d8483828662003f5a565b60008062003e6c62001cd1565b9050600062003e82848662003e1c858a6200340d565b9050620034e7858263ffffffff620032e316565b60006060836001600160a01b03168360405162003eb49190620043af565b6000604051808303816000865af19150503d806000811462003ef3576040519150601f19603f3d011682016040523d82523d6000602084013e62003ef8565b606091505b50915091508162003f1d5760405162461bcd60e51b815260040162000abb9062004656565b80511562003df3578080602001905181019062003f3b9190620042d9565b62003df35760405162461bcd60e51b815260040162000abb906200491f565b60008062003f6762001cd1565b905062003d8485858584600d5462004135565b600062003519670de0b6b3a764000062000f0c858563ffffffff6200352016565b60008062003fb4866200147a8962001764878c6200340d565b9050600062003fdd62003fd6670de0b6b3a76400008663ffffffff620032e316565b886200340d565b905060018515620040025762003ffa828863ffffffff620034f116565b915062004017565b62004014838863ffffffff620034f116565b92505b8282106200403d5762004031828463ffffffff620032e316565b91506001905062004056565b6200404f838363ffffffff620032e316565b9150600090505b60006200408d6200407c600462001764670de0b6b3a76400008a63ffffffff620032e316565b620034e18c620017648a8f6200340d565b9050620040aa6200347f8262002d57868063ffffffff6200352016565b90506000620040ce600262001764670de0b6b3a76400008a63ffffffff620032e316565b905060008315620040f357620040eb858463ffffffff620034f116565b905062004108565b62004105838663ffffffff620032e316565b90505b881562004129576200411b818362003926565b965050505050505062003d84565b6200411b818362003c9a565b6000806200414f84620034e1888863ffffffff620032e316565b90506000620041756200416e886200147a8b8063ffffffff6200352016565b8762003c9a565b905060006200418585836200340d565b9050620041ab83620034e18362002d57670de0b6b3a76400008a63ffffffff620032e316565b9998505050505050505050565b61102d8062004b2383390190565b80356001600160a01b0381168114620016d357600080fd5b600060208284031215620041f0578081fd5b620035198383620041c6565b6000806000806000806000806000806101408b8d0312156200421c578586fd5b620042288c8c620041c6565b9950620042398c60208d01620041c6565b98506200424a8c60408d01620041c6565b97506200425b8c60608d01620041c6565b96506200426c8c60808d01620041c6565b95506200427d8c60a08d01620041c6565b945060c08b0135935060e08b013592506101008b013591506101208b013590509295989b9194979a5092959850565b60008060408385031215620042bf578182fd5b620042cb8484620041c6565b946020939093013593505050565b600060208284031215620042eb578081fd5b8151801515811462003519578182fd5b6000602082840312156200430d578081fd5b5035919050565b60006020828403121562004326578081fd5b5051919050565b6000806000806060858703121562004343578384fd5b8435935060208501359250604085013567ffffffffffffffff8082111562004369578384fd5b81870188601f8201126200437b578485fd5b80359250818311156200438c578485fd5b8860208483010111156200439e578485fd5b959894975050602090940194505050565b60008251815b81811015620043d15760208186018101518583015201620043b5565b81811115620043e05782828501525b509190910192915050565b6001600160a01b0391909116815260200190565b6001600160a01b03929092168252602082015260400190565b6001600160a01b039384168152919092166020820152604081019190915260600190565b901515815260200190565b9115158252602082015260400190565b92151583526020830191909152604082015260600190565b6000861515825285602083015284604083015260806060830152826080830152828460a084013781830160a090810191909152601f909201601f19160101949350505050565b6020810160038310620044c457fe5b91905290565b6020808252601d908201527f444f444f5f51554f54455f42414c414e43455f4e4f545f454e4f554748000000604082015260600190565b60208082526003908201526204b3d360ec1b604082015260600190565b6020808252600d908201526c494e56414c49445f434c41494d60981b604082015260600190565b6020808252600a908201526904e4f5f424153455f4c560b41b604082015260600190565b60208082526018908201527f4445504f5349545f424153455f4e4f545f414c4c4f5745440000000000000000604082015260600190565b60208082526019908201527f4445504f5349545f51554f54455f4e4f545f414c4c4f57454400000000000000604082015260600190565b60208082526009908201526814915153951490539560ba1b604082015260600190565b6020808252600b908201526a04e4f5f51554f54455f4c560ac1b604082015260600190565b6020808252601c908201527f51554f54455f42414c414e43455f4c494d49545f455843454544454400000000604082015260600190565b6020808252818101527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564604082015260600190565b6020808252600e908201526d2224ab24a224a723afa2a92927a960911b604082015260600190565b60208082526023908201527f4c505f51554f54455f4341504954414c5f42414c414e43455f4e4f545f454e4f6040820152620aa8e960eb1b606082015260800190565b60208082526017908201527f4e4f545f53555045525649534f525f4f525f4f574e4552000000000000000000604082015260600190565b6020808252601b908201527f424153455f42414c414e43455f4c494d49545f45584345454445440000000000604082015260600190565b60208082526009908201526829aaa12fa2a92927a960b91b604082015260600190565b60208082526010908201526f1113d113d7d25392551250531256915160821b604082015260600190565b6020808252601c908201527f444f444f5f424153455f42414c414e43455f4e4f545f454e4f55474800000000604082015260600190565b602080825260119082015270151490511157d393d517d0531313d5d151607a1b604082015260600190565b6020808252600d908201526c24a72b20a624a22fa7aba722a960991b604082015260600190565b6020808252600e908201526d1411539053151657d15610d1515160921b604082015260600190565b6020808252600b908201526a1113d113d7d0d313d4d15160aa1b604082015260600190565b60208082526013908201527214d15313125391d7d393d517d0531313d5d151606a1b604082015260600190565b6020808252600b908201526a4645455f524154453e3d3160a81b604082015260600190565b6020808252600990820152682727aa2fa7aba722a960b91b604082015260600190565b60208082526009908201526820a2222fa2a92927a960b91b604082015260600190565b6020808252602a908201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6040820152691bdd081cdd58d8d9595960b21b606082015260800190565b60208082526022908201527f4c505f424153455f4341504954414c5f42414c414e43455f4e4f545f454e4f5560408201526108e960f31b606082015260800190565b6020808252601c908201527f53454c4c5f424153455f524543454956455f4e4f545f454e4f55474800000000604082015260600190565b602080825260169082015275084aab2be8482a68abe869ea6a8bea89e9ebe9aaa86960531b604082015260600190565b60208082526009908201526826aaa62fa2a92927a960b91b604082015260600190565b6020808252600490820152634b3e3d3160e01b604082015260600190565b60208082526010908201526f11d054d7d4149250d157d15610d1515160821b604082015260600190565b6020808252600f908201526e1053149150511657d0d31052535151608a1b604082015260600190565b6020808252600f908201526e1113d113d7d393d517d0d313d4d151608a1b604082015260600190565b602080825260129082015271109556525391d7d393d517d0531313d5d15160721b604082015260600190565b90815260200190565b9182521515602082015260400190565b91825260208201526040019056fe60c060405260036080819052620444c560ec1b60a0908152620000269160029190620000c6565b503480156200003457600080fd5b506040516200102d3803806200102d83398101604081905262000057916200016b565b600080546001600160a01b03191633178082556040516001600160a01b039190911691907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a3600380546001600160a01b0319166001600160a01b03929092169190911790556200019b565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106200010957805160ff191683800117855562000139565b8280016001018555821562000139579182015b82811115620001395782518255916020019190600101906200011c565b50620001479291506200014b565b5090565b6200016891905b8082111562000147576000815560010162000152565b90565b6000602082840312156200017d578081fd5b81516001600160a01b038116811462000194578182fd5b9392505050565b610e8280620001ab6000396000f3fe608060405234801561001057600080fd5b50600436106101005760003560e01c80634e71e0c8116100975780639dc29fac116100665780639dc29fac146101dd578063a9059cbb146101f0578063dd62ed3e14610203578063f2fde38b1461021657610100565b80634e71e0c8146101b257806370a08231146101ba5780638456db15146101cd57806395d89b41146101d557610100565b806318160ddd116100d357806318160ddd1461016057806323b872dd14610175578063313ce5671461018857806340c10f191461019d57610100565b806306fdde0314610105578063095ea7b31461012357806313096a411461014357806316048bc414610158575b600080fd5b61010d610229565b60405161011a9190610c89565b60405180910390f35b610136610131366004610b56565b6102f6565b60405161011a9190610c7e565b61014b610361565b60405161011a9190610c6a565b61014b610370565b61016861037f565b60405161011a9190610dcd565b610136610183366004610b16565b610385565b610190610509565b60405161011a9190610dd6565b6101b06101ab366004610b56565b61058b565b005b6101b061068e565b6101686101c8366004610ac7565b61071c565b61014b610737565b61010d610746565b6101b06101eb366004610b56565b6107d1565b6101366101fe366004610b56565b6108c8565b610168610211366004610ae2565b610986565b6101b0610224366004610ac7565b6109b1565b604080518082018252600f81526e5f444f444f5f4c505f544f4b454e5f60881b602082015260035482516306fdde0360e01b815292516060936001600160a01b03909216916306fdde03916004808301926000929190829003018186803b15801561029357600080fd5b505afa1580156102a7573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526102cf9190810190610b80565b816040516020016102e1929190610c3c565b60405160208183030381529060405291505090565b3360008181526006602090815260408083206001600160a01b038716808552925280832085905551919290917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259061034f908690610dcd565b60405180910390a35060015b92915050565b6003546001600160a01b031681565b6000546001600160a01b031681565b60045481565b6001600160a01b0383166000908152600560205260408120548211156103c65760405162461bcd60e51b81526004016103bd90610d5b565b60405180910390fd5b6001600160a01b03841660009081526006602090815260408083203384529091529020548211156104095760405162461bcd60e51b81526004016103bd90610ce3565b6001600160a01b038416600090815260056020526040902054610432908363ffffffff610a5c16565b6001600160a01b038086166000908152600560205260408082209390935590851681522054610467908363ffffffff610a8416565b6001600160a01b0380851660009081526005602090815260408083209490945591871681526006825282812033825290915220546104ab908363ffffffff610a5c16565b6001600160a01b038086166000818152600660209081526040808320338452909152908190209390935591519085169190600080516020610e2d833981519152906104f7908690610dcd565b60405180910390a35060019392505050565b6003546040805163313ce56760e01b815290516000926001600160a01b03169163313ce567916004808301926020929190829003018186803b15801561054e57600080fd5b505afa158015610562573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105869190610c1b565b905090565b6000546001600160a01b031633146105b55760405162461bcd60e51b81526004016103bd90610d87565b6001600160a01b0382166000908152600560205260409020546105de908263ffffffff610a8416565b6001600160a01b03831660009081526005602052604090205560045461060a908263ffffffff610a8416565b6004556040516001600160a01b038316907f0f6798a560793a54c3bcfe86a93cde1e73087d944c0ea20544137d412139688590610648908490610dcd565b60405180910390a2816001600160a01b031660006001600160a01b0316600080516020610e2d833981519152836040516106829190610dcd565b60405180910390a35050565b6001546001600160a01b031633146106b85760405162461bcd60e51b81526004016103bd90610cbc565b600154600080546040516001600160a01b0393841693909116917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a360018054600080546001600160a01b03199081166001600160a01b03841617909155169055565b6001600160a01b031660009081526005602052604090205490565b6001546001600160a01b031681565b6002805460408051602060018416156101000260001901909316849004601f810184900484028201840190925281815292918301828280156107c95780601f1061079e576101008083540402835291602001916107c9565b820191906000526020600020905b8154815290600101906020018083116107ac57829003601f168201915b505050505081565b6000546001600160a01b031633146107fb5760405162461bcd60e51b81526004016103bd90610d87565b6001600160a01b038216600090815260056020526040902054610824908263ffffffff610a5c16565b6001600160a01b038316600090815260056020526040902055600454610850908263ffffffff610a5c16565b6004556040516001600160a01b038316907fcc16f5dbb4873280815c1ee09dbd06736cffcc184412cf7a71a0fdb75d397ca59061088e908490610dcd565b60405180910390a260006001600160a01b0316826001600160a01b0316600080516020610e2d833981519152836040516106829190610dcd565b336000908152600560205260408120548211156108f75760405162461bcd60e51b81526004016103bd90610d5b565b33600090815260056020526040902054610917908363ffffffff610a5c16565b33600090815260056020526040808220929092556001600160a01b03851681522054610949908363ffffffff610a8416565b6001600160a01b038416600081815260056020526040908190209290925590513390600080516020610e2d8339815191529061034f908690610dcd565b6001600160a01b03918216600090815260066020908152604080832093909416825291909152205490565b6000546001600160a01b031633146109db5760405162461bcd60e51b81526004016103bd90610d87565b6001600160a01b038116610a015760405162461bcd60e51b81526004016103bd90610d34565b600080546040516001600160a01b03808516939216917fdcf55418cee3220104fef63f979ff3c4097ad240c0c43dcb33ce837748983e6291a3600180546001600160a01b0319166001600160a01b0392909216919091179055565b600082821115610a7e5760405162461bcd60e51b81526004016103bd90610d11565b50900390565b600082820183811015610aa95760405162461bcd60e51b81526004016103bd90610daa565b9392505050565b80356001600160a01b038116811461035b57600080fd5b600060208284031215610ad8578081fd5b610aa98383610ab0565b60008060408385031215610af4578081fd5b610afe8484610ab0565b9150610b0d8460208501610ab0565b90509250929050565b600080600060608486031215610b2a578081fd5b8335610b3581610e14565b92506020840135610b4581610e14565b929592945050506040919091013590565b60008060408385031215610b68578182fd5b610b728484610ab0565b946020939093013593505050565b600060208284031215610b91578081fd5b815167ffffffffffffffff80821115610ba8578283fd5b81840185601f820112610bb9578384fd5b8051925081831115610bc9578384fd5b604051601f8401601f191681016020018381118282101715610be9578586fd5b604052838152818401602001871015610c00578485fd5b610c11846020830160208501610de4565b9695505050505050565b600060208284031215610c2c578081fd5b815160ff81168114610aa9578182fd5b60008351610c4e818460208801610de4565b8351908301610c61828260208801610de4565b01949350505050565b6001600160a01b0391909116815260200190565b901515815260200190565b6000602082528251806020840152610ca8816040850160208701610de4565b601f01601f19169190910160400192915050565b6020808252600d908201526c494e56414c49445f434c41494d60981b604082015260600190565b60208082526014908201527308298989eae829c868abe9c9ea8be8a9c9eaa8e960631b604082015260600190565b60208082526009908201526829aaa12fa2a92927a960b91b604082015260600190565b6020808252600d908201526c24a72b20a624a22fa7aba722a960991b604082015260600190565b6020808252601290820152710848298829c868abe9c9ea8be8a9c9eaa8e960731b604082015260600190565b6020808252600990820152682727aa2fa7aba722a960b91b604082015260600190565b60208082526009908201526820a2222fa2a92927a960b91b604082015260600190565b90815260200190565b60ff91909116815260200190565b60005b83811015610dff578181015183820152602001610de7565b83811115610e0e576000848401525b50505050565b6001600160a01b0381168114610e2957600080fd5b5056feddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa2646970667358221220071f92fc39e640ba34f7c58b08640e58982fe1da55cd37c7d4d5049d5184cfc164736f6c63430006090033e89c586bd81ee35a18f7eac22a732b56e589a2821497cce12a0208828540a36d581f351e2bdb9fa9021bb2a24def989f06ac236f8a92aac14bcbc618ddf3826aa26469706673582212208e792128c846e2a66129bbb60ee1407f3e7ff4680e80271776a75729e5abf29b64736f6c63430006090033

Deployed Bytecode

0x60806040523480156200001157600080fd5b5060043610620005205760003560e01c80638a8c523c11620002a9578063c59203af1162000171578063ec2fd46d11620000e1578063f2220416116200009f578063f222041614620009fe578063f2fde38b1462000a15578063f3ae6c5f1462000a2c578063f67ed4481462000a43578063f98bea151462000a5a578063ffa642251462000a715762000520565b8063ec2fd46d14620009a5578063ed0aa42814620009af578063ee27c68914620009c6578063ee5150b314620009d0578063f00f9a0914620009e75762000520565b8063d4b97046116200012f578063d4b970461462000966578063d689107c1462000970578063dd58b41c146200097a578063e67ce7061462000984578063eab5d20e146200099b5762000520565b8063c59203af1462000934578063c5bbffe8146200093e578063c6b73cf91462000948578063cc062b581462000952578063d47eaa37146200095c5762000520565b8063a3161a561162000219578063aceecbc811620001d7578063aceecbc814620008de578063b2094fd314620008e8578063bc7d679d14620008f2578063c0a5f6ff14620008fc578063c0ffa1781462000913578063c3a2a665146200091d5762000520565b8063a3161a56146200089f578063a598aca714620008a9578063aa06ce9b14620008b3578063ab44a7a314620008ca578063ac1fbc9814620008d45762000520565b8063947cf92b1162000267578063947cf92b146200083957806395faa5f6146200085057806397316ad814620008675780639b020fba146200087e578063a2801e1614620008885762000520565b80638a8c523c14620007ed5780638dae733314620007f75780638ff5e742146200080e57806390cbf82214620008185780639299eb3014620008225762000520565b806336ac41a811620003ed578063648a4fac116200035d578063796da7af116200031b578063796da7af146200078a5780637adbf97314620007945780637aed942d14620007ab5780637c9b8e8914620007c25780638456db1514620007cc578063892daf0514620007d65762000520565b8063648a4fac146200072f57806367de8be9146200073957806368be20ad14620007505780636ec6a58d146200077657806373a2ab7c14620007805762000520565b80634de4527e11620003ab5780634de4527e14620006e35780634e71e0c814620006ed57806354fd4d5014620006f75780635bb7552a14620007015780635f179f6414620007185762000520565b806336ac41a814620006a4578063387b0c1114620006ae5780633960f14214620006c55780634322ec8314620006cf5780634a248d2a14620006d95762000520565b80631769ddaa11620004955780631f3c156e11620004535780631f3c156e146200064e578063245c96851462000658578063247f993b146200066257806327bed8ee146200066c5780632aa82c65146200068357806336a53bbb146200068d5762000520565b80631769ddaa14620005f357806317700f0114620005fd57806317be952e146200060757806318c0bbe414620006205780631e34b9cc14620006375762000520565b8063108db74411620004e3578063108db74414620005985780631184d8be14620005af57806313c5762414620005b957806313ea5d2914620005c357806316048bc414620005da5762000520565b806304512dc414620005255780630923160214620005545780630c9f7bd0146200056d5780630cd1667d14620005845780630e6518e9146200058e575b600080fd5b6200053c62000536366004620041de565b62000a8b565b6040516200054b919062004afb565b60405180910390f35b6200056b62000565366004620042fb565b62000c3d565b005b6200053c6200057e366004620042fb565b62000cc2565b6200053c62000db7565b6200053c62000e3e565b6200053c620005a9366004620042ac565b62000e44565b6200056b62001067565b6200056b620010d6565b6200056b620005d4366004620041de565b62001128565b620005e462001177565b6040516200054b9190620043eb565b6200053c62001186565b6200056b6200118c565b62000611620011de565b6040516200054b9190620044b5565b6200053c62000631366004620042fb565b620011e7565b6200053c62000648366004620041de565b62001200565b6200056b62001379565b6200053c62001670565b6200056b62001676565b6200053c6200067d366004620042fb565b620016c5565b6200053c620016d9565b6200053c6200069e366004620041de565b6200171f565b6200056b62001779565b6200056b620006bf366004620042fb565b620017e8565b620005e46200184f565b620005e46200185e565b620005e46200186d565b6200053c6200187c565b6200056b62001882565b6200053c62001913565b6200056b62000712366004620042fb565b62001918565b6200053c62000729366004620042ac565b62001995565b6200056b62001af4565b6200056b6200074a366004620042fb565b62001c24565b6200076762000761366004620041de565b62001c9d565b6040516200054b91906200443c565b6200076762001cb2565b620005e462001cc2565b6200053c62001cd1565b6200056b620007a5366004620041de565b62001d17565b6200053c620007bc366004620041de565b62001d66565b6200053c62001ded565b620005e462001df3565b6200056b620007e7366004620042fb565b62001e02565b6200056b62001e61565b6200053c620008083660046200432d565b62001ed0565b620007676200218e565b6200056b6200219c565b6200056b62000833366004620041de565b62002205565b6200053c6200084a366004620042ac565b62002254565b6200053c62000861366004620041de565b62002439565b6200056b62000878366004620042fb565b6200247e565b6200053c620024dd565b6200053c62000899366004620042fb565b620024e3565b62000767620024f0565b62000767620024f9565b6200053c620008c4366004620042ac565b62002509565b6200053c6200264a565b620005e462002650565b6200056b6200265f565b6200053c620026af565b6200056b620026b5565b6200053c6200090d366004620042fb565b62002707565b6200053c62002715565b6200056b6200092e366004620042ac565b6200271b565b6200053c6200290a565b6200076762002917565b6200053c62002927565b6200056b6200292d565b6200053c62002998565b620005e4620029a5565b620005e4620029b4565b62000767620029c3565b6200053c620009953660046200432d565b620029d3565b6200053c62002c68565b6200053c62002c6e565b6200056b620009c0366004620042fb565b62002c74565b6200053c62002ccb565b6200053c620009e1366004620042fb565b62002ddc565b6200056b620009f8366004620041fc565b62002e8b565b6200056b62000a0f366004620042fb565b62003095565b6200056b62000a26366004620041de565b6200310e565b6200053c62000a3d366004620042fb565b620031bf565b6200053c62000a54366004620041de565b620031cd565b6200053c62000a6b366004620042fb565b62003200565b62000a7b6200320e565b6040516200054b92919062004b14565b600154600090600160a01b900460ff161562000ac45760405162461bcd60e51b815260040162000abb90620045d7565b60405180910390fd5b6001805460ff60a01b1916600160a01b1790819055600160b01b900460ff161562000b035760405162461bcd60e51b815260040162000abb9062004862565b600062000b10336200171f565b9050600062000b1f33620031cd565b9050600062000b2e8362000cc2565b90508281111562000b535760405162461bcd60e51b815260040162000abb906200483a565b60105462000b68908463ffffffff620032e316565b60105562000b7733836200330e565b62000b948562000b8e858463ffffffff620032e316565b6200337a565b62000b9f81620033b5565b846001600160a01b0316336001600160a01b031660008051602062005b508339815191526000868660405162000bd89392919062004457565b60405180910390a3336001600160a01b031660008051602062005b7083398151915260008360405162000c0d92919062004447565b60405180910390a262000c27838263ffffffff620032e316565b6001805460ff60a01b1916905595945050505050565b6006546001600160a01b031633148062000c6157506000546001600160a01b031633145b62000c805760405162461bcd60e51b815260040162000abb90620046f6565b7f808f99cfd15f1be6019f93dc76c81d5bd82e0b3e0b3d23a54f5a2e647a6cc3cc6002548260405162000cb592919062004b14565b60405180910390a1600255565b600060125482111562000ce95760405162461bcd60e51b815260040162000abb90620044ca565b6002600e5460ff16600281111562000cfd57fe5b141562000dae57600062000d1f600f54601154620032e390919063ffffffff16565b9050600062000d2d62001cd1565b9050600062000d3d83836200340d565b9050600062000d52601254600d54846200343a565b9050600062000d7b62000d7188601254620032e390919063ffffffff16565b600d54856200343a565b905062000da162000d93828963ffffffff620034f116565b839063ffffffff620032e316565b9550505050505062000db2565b5060005b919050565b601354604080516318160ddd60e01b815290516000926001600160a01b0316916318160ddd916004808301926020929190829003018186803b15801562000dfd57600080fd5b505afa15801562000e12573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000e38919062004314565b90505b90565b60165481565b600154600090600160a01b900460ff161562000e745760405162461bcd60e51b815260040162000abb90620045d7565b6001805460ff60a01b1916600160a01b1790819055600160b01b900460ff161562000eb35760405162461bcd60e51b815260040162000abb9062004862565b600062000ebf6200320e565b915050600062000ece620016d9565b90506000811162000ef35760405162461bcd60e51b815260040162000abb90620045fa565b600062000f198362000f0c878563ffffffff6200352016565b9063ffffffff6200356016565b905062000f2633620031cd565b81111562000f485760405162461bcd60e51b815260040162000abb90620046b3565b600062000f558662000cc2565b905085811062000f795760405162461bcd60e51b815260040162000abb906200483a565b60105462000f8e908763ffffffff620032e316565b60105562000f9d33836200330e565b62000fb48762000b8e888463ffffffff620032e316565b62000fbf81620033b5565b6001600160a01b0387163360008051602062005b50833981519152600062000fee8a8663ffffffff620032e316565b86604051620010009392919062004457565b60405180910390a3336001600160a01b031660008051602062005b708339815191526000836040516200103592919062004447565b60405180910390a26200104f868263ffffffff620032e316565b6001805460ff60a01b19169055979650505050505050565b6000546001600160a01b03163314620010945760405162461bcd60e51b815260040162000abb90620048d9565b600154600160b01b900460ff1615620010c15760405162461bcd60e51b815260040162000abb9062004862565b6001805460ff60c01b1916600160c01b179055565b6006546001600160a01b0316331480620010fa57506000546001600160a01b031633145b620011195760405162461bcd60e51b815260040162000abb90620046f6565b6001805460ff60c01b19169055565b6000546001600160a01b03163314620011555760405162461bcd60e51b815260040162000abb90620048d9565b600780546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b031681565b60055481565b6006546001600160a01b0316331480620011b057506000546001600160a01b031633145b620011cf5760405162461bcd60e51b815260040162000abb90620046f6565b6001805460ff60c81b19169055565b600e5460ff1681565b6000620011f48262003592565b50939695505050505050565b600154600090600160a01b900460ff1615620012305760405162461bcd60e51b815260040162000abb90620045d7565b6001805460ff60a01b1916600160a01b1790819055600160b01b900460ff16156200126f5760405162461bcd60e51b815260040162000abb9062004862565b60006200127c3362002439565b905060006200128b3362001d66565b905060006200129a8362002ddc565b905082811115620012bf5760405162461bcd60e51b815260040162000abb906200483a565b600f54620012d4908463ffffffff620032e316565b600f55620012e3338362003705565b6200130085620012fa858463ffffffff620032e316565b62003739565b6200130b8162003774565b846001600160a01b0316336001600160a01b031660008051602062005b5083398151915260018686604051620013449392919062004457565b60405180910390a3336001600160a01b031660008051602062005b7083398151915260018360405162000c0d92919062004447565b600154600160a01b900460ff1615620013a65760405162461bcd60e51b815260040162000abb90620045d7565b6001805460ff60a01b1916600160a01b1790819055600160b01b900460ff16620013e45760405162461bcd60e51b815260040162000abb9062004aa6565b3360009081526017602052604090205460ff1615620014175760405162461bcd60e51b815260040162000abb9062004a7d565b336000818152601760205260408120805460ff19166001179055906200143d90620031cd565b905060006200144c3362001d66565b9050600082156200148a576200148762001465620016d9565b6010546200147a908663ffffffff6200352016565b9063ffffffff620037c116565b90505b60008215620014b957620014b6620014a162000db7565b600f546200147a908663ffffffff6200352016565b90505b601054620014ce908363ffffffff620032e316565b601055600f54620014e6908263ffffffff620032e316565b600f819055506200150c620014fe846015546200340d565b839063ffffffff620034f116565b91506200152e62001520856016546200340d565b829063ffffffff620034f116565b90506200153c338262003739565b6200154833836200337a565b601354604051632770a7eb60e21b81526001600160a01b0390911690639dc29fac906200157c9033908790600401620043ff565b600060405180830381600087803b1580156200159757600080fd5b505af1158015620015ac573d6000803e3d6000fd5b5050601454604051632770a7eb60e21b81526001600160a01b039091169250639dc29fac9150620015e49033908890600401620043ff565b600060405180830381600087803b158015620015ff57600080fd5b505af115801562001614573d6000803e3d6000fd5b50505050336001600160a01b03167fbe5f7fe66d16c6a87bb5b8b08a96634fe4f1c2bac9e5e413efe41a782d4d0c4382846040516200165592919062004b14565b60405180910390a2505050506001805460ff60a01b19169055565b60105481565b6006546001600160a01b03163314806200169a57506000546001600160a01b031633145b620016b95760405162461bcd60e51b815260040162000abb90620046f6565b6003805460ff19169055565b6000620016d3338362002509565b92915050565b601454604080516318160ddd60e01b815290516000926001600160a01b0316916318160ddd916004808301926020929190829003018186803b15801562000dfd57600080fd5b6000806200172c620016d9565b905060006200173a6200320e565b915050816200174f5760009250505062000db2565b62001771826200147a836200176488620031cd565b9063ffffffff6200352016565b949350505050565b6000546001600160a01b03163314620017a65760405162461bcd60e51b815260040162000abb90620048d9565b600154600160b01b900460ff1615620017d35760405162461bcd60e51b815260040162000abb9062004862565b6001805460ff60b81b1916600160b81b179055565b600154600160a01b900460ff1615620018155760405162461bcd60e51b815260040162000abb90620045d7565b6001805460ff60a01b1916600160a01b179055620018343382620037ef565b6200183f81620033b5565b506001805460ff60a01b19169055565b6006546001600160a01b031681565b6007546001600160a01b031681565b6008546001600160a01b031681565b60025481565b6001546001600160a01b03163314620018af5760405162461bcd60e51b815260040162000abb906200451e565b600154600080546040516001600160a01b0393841693909116917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a360018054600080546001600160a01b03199081166001600160a01b03841617909155169055565b606590565b6000546001600160a01b03163314620019455760405162461bcd60e51b815260040162000abb90620048d9565b7f3ce6ea91adda496b7a0546fa6558e5b52c3a509de6015820efb00ca4020e0a07600b54826040516200197a92919062004b14565b60405180910390a1600b819055620019916200385d565b5050565b600154600090600160a01b900460ff1615620019c55760405162461bcd60e51b815260040162000abb90620045d7565b6001805460ff60a01b1916600160a01b1790819055600160b81b900460ff1662001a035760405162461bcd60e51b815260040162000abb90620045a0565b600062001a0f6200320e565b915050600062001a1e620016d9565b9050838162001a415762001a39858463ffffffff620034f116565b905062001a62565b821562001a625762001a5f836200147a878563ffffffff6200352016565b90505b62001a6e3386620037ef565b62001a7a8682620038f2565b60105462001a8f908663ffffffff620034f116565b6010556040516001600160a01b0387169033907f18081cde2fa64894914e1080b98cca17bb6d1acf633e57f6e26ebdb945ad830b9062001ad6906000908a90879062004457565b60405180910390a36001805460ff60a01b1916905595945050505050565b6000546001600160a01b0316331462001b215760405162461bcd60e51b815260040162000abb90620048d9565b600154600160b01b900460ff161562001b4e5760405162461bcd60e51b815260040162000abb9062004862565b6001805462ffffff60b81b1960ff60b01b19909116600160b01b17169055600062001b7862000db7565b9050600062001b86620016d9565b9050601054601254111562001bc857600062001bb0601054601254620032e390919063ffffffff16565b905062001bbe818462003926565b6015555062001bcf565b6012546010555b600f54601154111562001c0f57600062001bf7600f54601154620032e390919063ffffffff16565b905062001c05818362003926565b6016555062001c16565b601154600f555b5050600e805460ff19169055565b6000546001600160a01b0316331462001c515760405162461bcd60e51b815260040162000abb90620048d9565b7f023a40bebf7ac113f81c3d628073246cf9e0bc49980a9d6a9531498ce9e3dd1c600d548260405162001c8692919062004b14565b60405180910390a1600d819055620019916200385d565b60176020526000908152604090205460ff1681565b600154600160b01b900460ff1681565b600a546001600160a01b031681565b600a5460408051634c6afee560e11b815290516000926001600160a01b0316916398d5fdca916004808301926020929190829003018186803b15801562000dfd57600080fd5b6000546001600160a01b0316331462001d445760405162461bcd60e51b815260040162000abb90620048d9565b600a80546001600160a01b0319166001600160a01b0392909216919091179055565b6013546040516370a0823160e01b81526000916001600160a01b0316906370a082319062001d99908590600401620043eb565b60206040518083038186803b15801562001db257600080fd5b505afa15801562001dc7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620016d3919062004314565b60125481565b6001546001600160a01b031681565b6000546001600160a01b0316331462001e2f5760405162461bcd60e51b815260040162000abb90620048d9565b600154600160b01b900460ff161562001e5c5760405162461bcd60e51b815260040162000abb9062004862565b600455565b6000546001600160a01b0316331462001e8e5760405162461bcd60e51b815260040162000abb90620048d9565b600154600160b01b900460ff161562001ebb5760405162461bcd60e51b815260040162000abb9062004862565b6001805460ff60c81b1916600160c81b179055565b600154600090600160c81b900460ff1662001eff5760405162461bcd60e51b815260040162000abb90620047e8565b600354610100900460ff1662001f295760405162461bcd60e51b815260040162000abb9062004887565b6002543a111562001f4e5760405162461bcd60e51b815260040162000abb9062004a53565b600154600160a01b900460ff161562001f7b5760405162461bcd60e51b815260040162000abb90620045d7565b6001805460ff60a01b1916600160a01b1790556000808080808062001fa08b62003947565b9550955095509550955095508986101562001fcf5760405162461bcd60e51b815260040162000abb90620049ab565b62001fdb33876200337a565b8715620020455760405163301bc67560e11b815233906360378cea9062002010906000908f908b908f908f906004016200446f565b600060405180830381600087803b1580156200202b57600080fd5b505af115801562002040573d6000803e3d6000fd5b505050505b62002051338c62003ac0565b8315620020bd5760075462002070906001600160a01b0316856200337a565b6007546040516001600160a01b03909116907fe4fed5362e2669c70e5da5a18942d1e617d8917f6adc0164d9668bd3a6d0cebe90620020b490600090889062004447565b60405180910390a25b8160105414620020cd5760108290555b80600f5414620020dd57600f8190555b826002811115620020ea57fe5b600e5460ff166002811115620020fc57fe5b146200212257600e805484919060ff191660018360028111156200211c57fe5b02179055505b6200212d85620033b5565b336001600160a01b03167fd8648b6ac54162763c86fd54bf2005af8ecd2f9cb273a5775921fd7f91e17b2d8c886040516200216a92919062004b14565b60405180910390a250506001805460ff60a01b191690555091979650505050505050565b600354610100900460ff1681565b6000546001600160a01b03163314620021c95760405162461bcd60e51b815260040162000abb90620048d9565b600154600160b01b900460ff1615620021f65760405162461bcd60e51b815260040162000abb9062004862565b6003805460ff19166001179055565b6000546001600160a01b03163314620022325760405162461bcd60e51b815260040162000abb90620048d9565b600680546001600160a01b0319166001600160a01b0392909216919091179055565b600154600090600160a01b900460ff1615620022845760405162461bcd60e51b815260040162000abb90620045d7565b6001805460ff60a01b1916600160a01b1790819055600160b01b900460ff1615620022c35760405162461bcd60e51b815260040162000abb9062004862565b6000620022cf6200320e565b5090506000620022de62000db7565b905060008111620023035760405162461bcd60e51b815260040162000abb9062004545565b60006200231c8362000f0c878563ffffffff6200352016565b9050620023293362001d66565b8111156200234b5760405162461bcd60e51b815260040162000abb9062004969565b6000620023588662002ddc565b9050858111156200237d5760405162461bcd60e51b815260040162000abb906200483a565b600f5462002392908763ffffffff620032e316565b600f55620023a1338362003705565b620023b887620012fa888463ffffffff620032e316565b620023c38162003774565b6001600160a01b0387163360008051602062005b508339815191526001620023f28a8663ffffffff620032e316565b86604051620024049392919062004457565b60405180910390a3336001600160a01b031660008051602062005b708339815191526001836040516200103592919062004447565b6000806200244662000db7565b90506000620024546200320e565b50905081620024695760009250505062000db2565b62001771826200147a83620017648862001d66565b6000546001600160a01b03163314620024ab5760405162461bcd60e51b815260040162000abb90620048d9565b600154600160b01b900460ff1615620024d85760405162461bcd60e51b815260040162000abb9062004862565b600555565b60045481565b6000620011f48262003947565b60035460ff1681565b600154600160c01b900460ff1681565b600154600090600160a01b900460ff1615620025395760405162461bcd60e51b815260040162000abb90620045d7565b6001805460ff60a01b1916600160a01b1790819055600160c01b900460ff16620025775760405162461bcd60e51b815260040162000abb9062004569565b6000620025836200320e565b50905060006200259262000db7565b90508381620025b557620025ad858463ffffffff620034f116565b9050620025d6565b8215620025d657620025d3836200147a878563ffffffff6200352016565b90505b620025e2338662003ac0565b620025ee868262003b2e565b600f5462002603908663ffffffff620034f116565b600f556040516001600160a01b0387169033907f18081cde2fa64894914e1080b98cca17bb6d1acf633e57f6e26ebdb945ad830b9062001ad6906001908a90879062004457565b600b5481565b6014546001600160a01b031681565b6006546001600160a01b03163314806200268357506000546001600160a01b031633145b620026a25760405162461bcd60e51b815260040162000abb90620046f6565b6003805461ff0019169055565b600f5481565b6006546001600160a01b0316331480620026d957506000546001600160a01b031633145b620026f85760405162461bcd60e51b815260040162000abb90620046f6565b6001805460ff60b81b19169055565b6000620016d3338362000e44565b600c5481565b6000546001600160a01b03163314620027485760405162461bcd60e51b815260040162000abb90620048d9565b6008546001600160a01b03838116911614156200281b5760115462002774908263ffffffff620034f116565b6008546040516370a0823160e01b81526001600160a01b03909116906370a0823190620027a6903090600401620043eb565b60206040518083038186803b158015620027bf57600080fd5b505afa158015620027d4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620027fa919062004314565b10156200281b5760405162461bcd60e51b815260040162000abb90620047b1565b6009546001600160a01b0383811691161415620028ee5760125462002847908263ffffffff620034f116565b6009546040516370a0823160e01b81526001600160a01b03909116906370a082319062002879903090600401620043eb565b60206040518083038186803b1580156200289257600080fd5b505afa158015620028a7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620028cd919062004314565b1015620028ee5760405162461bcd60e51b815260040162000abb90620044ca565b620019916001600160a01b038316338363ffffffff62003b6216565b600062000e383362000a8b565b600154600160b81b900460ff1681565b60155481565b6000546001600160a01b031633146200295a5760405162461bcd60e51b815260040162000abb90620048d9565b600154600160b01b900460ff1615620029875760405162461bcd60e51b815260040162000abb9062004862565b6003805461ff001916610100179055565b600062000e383362001200565b6009546001600160a01b031681565b6013546001600160a01b031681565b600154600160c81b900460ff1681565b600154600090600160c81b900460ff1662002a025760405162461bcd60e51b815260040162000abb90620047e8565b60035460ff1662002a275760405162461bcd60e51b815260040162000abb9062004acf565b6002543a111562002a4c5760405162461bcd60e51b815260040162000abb9062004a53565b600154600160a01b900460ff161562002a795760405162461bcd60e51b815260040162000abb90620045d7565b6001805460ff60a01b1916600160a01b1790556000808080808062002a9e8b62003592565b9550955095509550955095508986111562002acd5760405162461bcd60e51b815260040162000abb90620049e2565b62002ad9338c62003739565b871562002b435760405163301bc67560e11b815233906360378cea9062002b0e906001908f908b908f908f906004016200446f565b600060405180830381600087803b15801562002b2957600080fd5b505af115801562002b3e573d6000803e3d6000fd5b505050505b62002b4f3387620037ef565b831562002bbb5760075462002b6e906001600160a01b03168562003739565b6007546040516001600160a01b03909116907fe4fed5362e2669c70e5da5a18942d1e617d8917f6adc0164d9668bd3a6d0cebe9062002bb290600190889062004447565b60405180910390a25b816010541462002bcb5760108290555b80600f541462002bdb57600f8190555b82600281111562002be857fe5b600e5460ff16600281111562002bfa57fe5b1462002c2057600e805484919060ff1916600183600281111562002c1a57fe5b02179055505b62002c2b8562003774565b336001600160a01b03167fe93ad76094f247c0dafc1c61adc2187de1ac2738f7a3b49cb20b2263420251a38c886040516200216a92919062004b14565b60115481565b600d5481565b600154600160a01b900460ff161562002ca15760405162461bcd60e51b815260040162000abb90620045d7565b6001805460ff60a01b1916600160a01b17905562002cc0338262003ac0565b6200183f8162003774565b600080600062002cda6200320e565b90925090506002600e5460ff16600281111562002cf357fe5b141562002d8657600062002d2562002d1c6012546200147a85866200352090919063ffffffff16565b60125462003926565b905062002d6462002d39600d54836200340d565b600d5462002d5790670de0b6b3a76400009063ffffffff620032e316565b9063ffffffff620034f116565b905062002d7b62002d7462001cd1565b8262003926565b935050505062000e3b565b600062002db162002da86011546200147a86876200352090919063ffffffff16565b60115462003926565b905062002dc562002d39600d54836200340d565b905062002d7b62002dd562001cd1565b826200340d565b600060115482111562002e035760405162461bcd60e51b815260040162000abb90620047b1565b6001600e5460ff16600281111562002e1757fe5b141562000dae57600062002e39601054601254620032e390919063ffffffff16565b9050600062002e4762001cd1565b9050600062002e57838362003926565b9050600062002e6c601154600d54846200343a565b9050600062000d7b62000d7188601154620032e390919063ffffffff16565b600154600160a81b900460ff161562002eb85760405162461bcd60e51b815260040162000abb9062004787565b6001805460ff60a81b1916600160a81b179055600080546001600160a01b03808d166001600160a01b031990921691909117808355604051911691907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a3600680546001600160a01b03199081166001600160a01b038c8116919091179092556007805482168b84161790556008805482168a841617908190556009805483168a8516179055600a8054909216888416179091556001805462ffffff60b81b1916815560028490556003805461010060ff1991821690931761ff00191692909217905560001960048190556005819055600b889055600c879055600d869055600e80549092169091556040519092919091169062002fd990620041b8565b62002fe59190620043eb565b604051809103906000f08015801562003002573d6000803e3d6000fd5b50601380546001600160a01b0319166001600160a01b039283161790556009546040519116906200303390620041b8565b6200303f9190620043eb565b604051809103906000f0801580156200305c573d6000803e3d6000fd5b50601480546001600160a01b0319166001600160a01b0392909216919091179055620030876200385d565b505050505050505050505050565b6000546001600160a01b03163314620030c25760405162461bcd60e51b815260040162000abb90620048d9565b7f6b04da3d58e4b37d99652babb3ea2bc25ce94379bfff3059f03d61b26c59e553600c5482604051620030f792919062004b14565b60405180910390a1600c819055620019916200385d565b6000546001600160a01b031633146200313b5760405162461bcd60e51b815260040162000abb90620048d9565b6001600160a01b038116620031645760405162461bcd60e51b815260040162000abb9062004813565b600080546040516001600160a01b03808516939216917fdcf55418cee3220104fef63f979ff3c4097ad240c0c43dcb33ce837748983e6291a3600180546001600160a01b0319166001600160a01b0392909216919091179055565b6000620016d3338362001995565b6014546040516370a0823160e01b81526000916001600160a01b0316906370a082319062001d99908590600401620043eb565b6000620016d3338362002254565b601254601154600091829182600e5460ff1660028111156200322c57fe5b14156200324557600f54601054935093505050620032df565b6002600e5460ff1660028111156200325957fe5b1415620032915760006200326c62003bc1565b600f5490915062003284848363ffffffff620034f116565b94509450505050620032df565b6001600e5460ff166002811115620032a557fe5b1415620032dc576000620032b862003c32565b9050620032cc828263ffffffff620034f116565b60105494509450505050620032df565b50505b9091565b600082821115620033085760405162461bcd60e51b815260040162000abb9062004764565b50900390565b601454604051632770a7eb60e21b81526001600160a01b0390911690639dc29fac90620033429085908590600401620043ff565b600060405180830381600087803b1580156200335d57600080fd5b505af115801562003372573d6000803e3d6000fd5b505050505050565b60095462003399906001600160a01b0316838363ffffffff62003b6216565b601254620033ae908263ffffffff620032e316565b6012555050565b601054620033ca908263ffffffff620034f116565b6010556040517fa259c93818139b6bc90fb80e8feb75122b42edaae49560f81392cf4e1946726e906200340290839060009062004b04565b60405180910390a150565b6000670de0b6b3a76400006200342a848463ffffffff6200352016565b816200343257fe5b049392505050565b6000806200345a6200345360046200176487876200340d565b8662003c9a565b9050620034856200347f670de0b6b3a764000062001764848263ffffffff620034f116565b62003cbb565b90506000620034c0620034a783670de0b6b3a764000063ffffffff620032e316565b620034ba87600263ffffffff6200352016565b62003c9a565b9050620034e786620034e1670de0b6b3a76400008463ffffffff620034f116565b6200340d565b9695505050505050565b600082820183811015620035195760405162461bcd60e51b815260040162000abb90620048fc565b9392505050565b6000826200353157506000620016d3565b828202828482816200353f57fe5b0414620035195760405162461bcd60e51b815260040162000abb9062004a12565b6000806200356f8484620037c1565b9050828102840380156200358957506001019050620016d3565b509050620016d3565b600080600080600080620035a56200320e565b8093508192505050620035bb87600b546200340d565b9450620035cb87600c546200340d565b93506000620035e68562002d578a8963ffffffff620034f116565b90506000600e5460ff166002811115620035fc57fe5b14156200361b576200360f818362003cf6565b965060019350620036fb565b6001600e5460ff1660028111156200362f57fe5b141562003645576200360f816011548462003d3d565b6002600e5460ff1660028111156200365957fe5b1415620036fb5760006200367960125485620032e390919063ffffffff16565b905060006200369484601154620032e390919063ffffffff16565b905080831015620036ba57620036ae836012548762003d8d565b985060029550620036f8565b80831415620036d05781985060009550620036f8565b620036f1620014fe620036ea858463ffffffff620032e316565b8662003cf6565b9850600195505b50505b5091939550919395565b601354604051632770a7eb60e21b81526001600160a01b0390911690639dc29fac90620033429085908590600401620043ff565b60085462003758906001600160a01b0316838363ffffffff62003b6216565b6011546200376d908263ffffffff620032e316565b6011555050565b600f5462003789908263ffffffff620034f116565b600f556040517fa259c93818139b6bc90fb80e8feb75122b42edaae49560f81392cf4e1946726e906200340290839060019062004b04565b6000808211620037e55760405162461bcd60e51b815260040162000abb906200468b565b8183816200343257fe5b60055460125462003807908363ffffffff620034f116565b1115620038285760405162461bcd60e51b815260040162000abb906200461f565b60095462003848906001600160a01b031683308463ffffffff62003dcf16565b601254620033ae908263ffffffff620034f116565b6000670de0b6b3a7640000600d54106200388b5760405162461bcd60e51b815260040162000abb9062004a35565b6000600d5411620038b05760405162461bcd60e51b815260040162000abb9062004501565b670de0b6b3a7640000620038d2600c54600b54620034f190919063ffffffff16565b1062000e3b5760405162461bcd60e51b815260040162000abb90620048b4565b6014546040516340c10f1960e01b81526001600160a01b03909116906340c10f1990620033429085908590600401620043ff565b600062003519826200147a85670de0b6b3a764000063ffffffff6200352016565b6000806000806000806200395a6200320e565b92509050866000600e5460ff1660028111156200397357fe5b1415620039925762003986818462003df9565b96506002935062003a70565b6001600e5460ff166002811115620039a657fe5b141562003a5a576000620039c660115484620032e390919063ffffffff16565b90506000620039e185601254620032e390919063ffffffff16565b90508183101562003a1457620039fb836011548662003e3b565b9850600195508089111562003a0e578098505b62003a52565b8183141562003a2a578098506000955062003a52565b62003a4b6200152062003a44858563ffffffff620032e316565b8762003df9565b9850600295505b505062003a70565b62003a69816012548562003e5f565b9650600293505b62003a7e87600b546200340d565b955062003a8e87600c546200340d565b945062003ab48562003aa7898963ffffffff620032e316565b9063ffffffff620032e316565b96505091939550919395565b60045460115462003ad8908363ffffffff620034f116565b111562003af95760405162461bcd60e51b815260040162000abb906200472d565b60085462003b19906001600160a01b031683308463ffffffff62003dcf16565b6011546200376d908263ffffffff620034f116565b6013546040516340c10f1960e01b81526001600160a01b03909116906340c10f1990620033429085908590600401620043ff565b62003bbc8363a9059cbb60e01b848460405160240162003b84929190620043ff565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b03199093169290921790915262003e96565b505050565b60008062003bdd600f54601154620032e390919063ffffffff16565b9050600062003beb62001cd1565b9050600062003bfb83836200340d565b9050600062003c10601254600d54846200343a565b905062003c2960125482620032e390919063ffffffff16565b94505050505090565b60008062003c4e601054601254620032e390919063ffffffff16565b9050600062003c5c62001cd1565b9050600062003c6c838362003926565b9050600062003c81601154600d54846200343a565b905062003c2960115482620032e390919063ffffffff16565b6000620035198262000f0c85670de0b6b3a764000063ffffffff6200352016565b80600160028204015b8181101562003cf05780915060028182858162003cdd57fe5b04018162003ce757fe5b04905062003cc4565b50919050565b600081831062003d1a5760405162461bcd60e51b815260040162000abb90620047b1565b600062003d2e838563ffffffff620032e316565b90506200177183848362003f5a565b600082841062003d615760405162461bcd60e51b815260040162000abb90620047b1565b600062003d75848663ffffffff620032e316565b905062003d8483858362003f5a565b95945050505050565b60008062003d9a62001cd1565b9050600062003dbb848662003db0858a62003f7a565b6001600d5462003f9b565b9050620034e7818663ffffffff620032e316565b62003df3846323b872dd60e01b85858560405160240162003b849392919062004418565b50505050565b60008062003e0662001cd1565b9050600062003e27848562003e1c85896200340d565b6000600d5462003f9b565b905062003d84848263ffffffff620032e316565b60008062003e50848663ffffffff620034f116565b905062003d8483828662003f5a565b60008062003e6c62001cd1565b9050600062003e82848662003e1c858a6200340d565b9050620034e7858263ffffffff620032e316565b60006060836001600160a01b03168360405162003eb49190620043af565b6000604051808303816000865af19150503d806000811462003ef3576040519150601f19603f3d011682016040523d82523d6000602084013e62003ef8565b606091505b50915091508162003f1d5760405162461bcd60e51b815260040162000abb9062004656565b80511562003df3578080602001905181019062003f3b9190620042d9565b62003df35760405162461bcd60e51b815260040162000abb906200491f565b60008062003f6762001cd1565b905062003d8485858584600d5462004135565b600062003519670de0b6b3a764000062000f0c858563ffffffff6200352016565b60008062003fb4866200147a8962001764878c6200340d565b9050600062003fdd62003fd6670de0b6b3a76400008663ffffffff620032e316565b886200340d565b905060018515620040025762003ffa828863ffffffff620034f116565b915062004017565b62004014838863ffffffff620034f116565b92505b8282106200403d5762004031828463ffffffff620032e316565b91506001905062004056565b6200404f838363ffffffff620032e316565b9150600090505b60006200408d6200407c600462001764670de0b6b3a76400008a63ffffffff620032e316565b620034e18c620017648a8f6200340d565b9050620040aa6200347f8262002d57868063ffffffff6200352016565b90506000620040ce600262001764670de0b6b3a76400008a63ffffffff620032e316565b905060008315620040f357620040eb858463ffffffff620034f116565b905062004108565b62004105838663ffffffff620032e316565b90505b881562004129576200411b818362003926565b965050505050505062003d84565b6200411b818362003c9a565b6000806200414f84620034e1888863ffffffff620032e316565b90506000620041756200416e886200147a8b8063ffffffff6200352016565b8762003c9a565b905060006200418585836200340d565b9050620041ab83620034e18362002d57670de0b6b3a76400008a63ffffffff620032e316565b9998505050505050505050565b61102d8062004b2383390190565b80356001600160a01b0381168114620016d357600080fd5b600060208284031215620041f0578081fd5b620035198383620041c6565b6000806000806000806000806000806101408b8d0312156200421c578586fd5b620042288c8c620041c6565b9950620042398c60208d01620041c6565b98506200424a8c60408d01620041c6565b97506200425b8c60608d01620041c6565b96506200426c8c60808d01620041c6565b95506200427d8c60a08d01620041c6565b945060c08b0135935060e08b013592506101008b013591506101208b013590509295989b9194979a5092959850565b60008060408385031215620042bf578182fd5b620042cb8484620041c6565b946020939093013593505050565b600060208284031215620042eb578081fd5b8151801515811462003519578182fd5b6000602082840312156200430d578081fd5b5035919050565b60006020828403121562004326578081fd5b5051919050565b6000806000806060858703121562004343578384fd5b8435935060208501359250604085013567ffffffffffffffff8082111562004369578384fd5b81870188601f8201126200437b578485fd5b80359250818311156200438c578485fd5b8860208483010111156200439e578485fd5b959894975050602090940194505050565b60008251815b81811015620043d15760208186018101518583015201620043b5565b81811115620043e05782828501525b509190910192915050565b6001600160a01b0391909116815260200190565b6001600160a01b03929092168252602082015260400190565b6001600160a01b039384168152919092166020820152604081019190915260600190565b901515815260200190565b9115158252602082015260400190565b92151583526020830191909152604082015260600190565b6000861515825285602083015284604083015260806060830152826080830152828460a084013781830160a090810191909152601f909201601f19160101949350505050565b6020810160038310620044c457fe5b91905290565b6020808252601d908201527f444f444f5f51554f54455f42414c414e43455f4e4f545f454e4f554748000000604082015260600190565b60208082526003908201526204b3d360ec1b604082015260600190565b6020808252600d908201526c494e56414c49445f434c41494d60981b604082015260600190565b6020808252600a908201526904e4f5f424153455f4c560b41b604082015260600190565b60208082526018908201527f4445504f5349545f424153455f4e4f545f414c4c4f5745440000000000000000604082015260600190565b60208082526019908201527f4445504f5349545f51554f54455f4e4f545f414c4c4f57454400000000000000604082015260600190565b60208082526009908201526814915153951490539560ba1b604082015260600190565b6020808252600b908201526a04e4f5f51554f54455f4c560ac1b604082015260600190565b6020808252601c908201527f51554f54455f42414c414e43455f4c494d49545f455843454544454400000000604082015260600190565b6020808252818101527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564604082015260600190565b6020808252600e908201526d2224ab24a224a723afa2a92927a960911b604082015260600190565b60208082526023908201527f4c505f51554f54455f4341504954414c5f42414c414e43455f4e4f545f454e4f6040820152620aa8e960eb1b606082015260800190565b60208082526017908201527f4e4f545f53555045525649534f525f4f525f4f574e4552000000000000000000604082015260600190565b6020808252601b908201527f424153455f42414c414e43455f4c494d49545f45584345454445440000000000604082015260600190565b60208082526009908201526829aaa12fa2a92927a960b91b604082015260600190565b60208082526010908201526f1113d113d7d25392551250531256915160821b604082015260600190565b6020808252601c908201527f444f444f5f424153455f42414c414e43455f4e4f545f454e4f55474800000000604082015260600190565b602080825260119082015270151490511157d393d517d0531313d5d151607a1b604082015260600190565b6020808252600d908201526c24a72b20a624a22fa7aba722a960991b604082015260600190565b6020808252600e908201526d1411539053151657d15610d1515160921b604082015260600190565b6020808252600b908201526a1113d113d7d0d313d4d15160aa1b604082015260600190565b60208082526013908201527214d15313125391d7d393d517d0531313d5d151606a1b604082015260600190565b6020808252600b908201526a4645455f524154453e3d3160a81b604082015260600190565b6020808252600990820152682727aa2fa7aba722a960b91b604082015260600190565b60208082526009908201526820a2222fa2a92927a960b91b604082015260600190565b6020808252602a908201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6040820152691bdd081cdd58d8d9595960b21b606082015260800190565b60208082526022908201527f4c505f424153455f4341504954414c5f42414c414e43455f4e4f545f454e4f5560408201526108e960f31b606082015260800190565b6020808252601c908201527f53454c4c5f424153455f524543454956455f4e4f545f454e4f55474800000000604082015260600190565b602080825260169082015275084aab2be8482a68abe869ea6a8bea89e9ebe9aaa86960531b604082015260600190565b60208082526009908201526826aaa62fa2a92927a960b91b604082015260600190565b6020808252600490820152634b3e3d3160e01b604082015260600190565b60208082526010908201526f11d054d7d4149250d157d15610d1515160821b604082015260600190565b6020808252600f908201526e1053149150511657d0d31052535151608a1b604082015260600190565b6020808252600f908201526e1113d113d7d393d517d0d313d4d151608a1b604082015260600190565b602080825260129082015271109556525391d7d393d517d0531313d5d15160721b604082015260600190565b90815260200190565b9182521515602082015260400190565b91825260208201526040019056fe60c060405260036080819052620444c560ec1b60a0908152620000269160029190620000c6565b503480156200003457600080fd5b506040516200102d3803806200102d83398101604081905262000057916200016b565b600080546001600160a01b03191633178082556040516001600160a01b039190911691907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a3600380546001600160a01b0319166001600160a01b03929092169190911790556200019b565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106200010957805160ff191683800117855562000139565b8280016001018555821562000139579182015b82811115620001395782518255916020019190600101906200011c565b50620001479291506200014b565b5090565b6200016891905b8082111562000147576000815560010162000152565b90565b6000602082840312156200017d578081fd5b81516001600160a01b038116811462000194578182fd5b9392505050565b610e8280620001ab6000396000f3fe608060405234801561001057600080fd5b50600436106101005760003560e01c80634e71e0c8116100975780639dc29fac116100665780639dc29fac146101dd578063a9059cbb146101f0578063dd62ed3e14610203578063f2fde38b1461021657610100565b80634e71e0c8146101b257806370a08231146101ba5780638456db15146101cd57806395d89b41146101d557610100565b806318160ddd116100d357806318160ddd1461016057806323b872dd14610175578063313ce5671461018857806340c10f191461019d57610100565b806306fdde0314610105578063095ea7b31461012357806313096a411461014357806316048bc414610158575b600080fd5b61010d610229565b60405161011a9190610c89565b60405180910390f35b610136610131366004610b56565b6102f6565b60405161011a9190610c7e565b61014b610361565b60405161011a9190610c6a565b61014b610370565b61016861037f565b60405161011a9190610dcd565b610136610183366004610b16565b610385565b610190610509565b60405161011a9190610dd6565b6101b06101ab366004610b56565b61058b565b005b6101b061068e565b6101686101c8366004610ac7565b61071c565b61014b610737565b61010d610746565b6101b06101eb366004610b56565b6107d1565b6101366101fe366004610b56565b6108c8565b610168610211366004610ae2565b610986565b6101b0610224366004610ac7565b6109b1565b604080518082018252600f81526e5f444f444f5f4c505f544f4b454e5f60881b602082015260035482516306fdde0360e01b815292516060936001600160a01b03909216916306fdde03916004808301926000929190829003018186803b15801561029357600080fd5b505afa1580156102a7573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526102cf9190810190610b80565b816040516020016102e1929190610c3c565b60405160208183030381529060405291505090565b3360008181526006602090815260408083206001600160a01b038716808552925280832085905551919290917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259061034f908690610dcd565b60405180910390a35060015b92915050565b6003546001600160a01b031681565b6000546001600160a01b031681565b60045481565b6001600160a01b0383166000908152600560205260408120548211156103c65760405162461bcd60e51b81526004016103bd90610d5b565b60405180910390fd5b6001600160a01b03841660009081526006602090815260408083203384529091529020548211156104095760405162461bcd60e51b81526004016103bd90610ce3565b6001600160a01b038416600090815260056020526040902054610432908363ffffffff610a5c16565b6001600160a01b038086166000908152600560205260408082209390935590851681522054610467908363ffffffff610a8416565b6001600160a01b0380851660009081526005602090815260408083209490945591871681526006825282812033825290915220546104ab908363ffffffff610a5c16565b6001600160a01b038086166000818152600660209081526040808320338452909152908190209390935591519085169190600080516020610e2d833981519152906104f7908690610dcd565b60405180910390a35060019392505050565b6003546040805163313ce56760e01b815290516000926001600160a01b03169163313ce567916004808301926020929190829003018186803b15801561054e57600080fd5b505afa158015610562573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105869190610c1b565b905090565b6000546001600160a01b031633146105b55760405162461bcd60e51b81526004016103bd90610d87565b6001600160a01b0382166000908152600560205260409020546105de908263ffffffff610a8416565b6001600160a01b03831660009081526005602052604090205560045461060a908263ffffffff610a8416565b6004556040516001600160a01b038316907f0f6798a560793a54c3bcfe86a93cde1e73087d944c0ea20544137d412139688590610648908490610dcd565b60405180910390a2816001600160a01b031660006001600160a01b0316600080516020610e2d833981519152836040516106829190610dcd565b60405180910390a35050565b6001546001600160a01b031633146106b85760405162461bcd60e51b81526004016103bd90610cbc565b600154600080546040516001600160a01b0393841693909116917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a360018054600080546001600160a01b03199081166001600160a01b03841617909155169055565b6001600160a01b031660009081526005602052604090205490565b6001546001600160a01b031681565b6002805460408051602060018416156101000260001901909316849004601f810184900484028201840190925281815292918301828280156107c95780601f1061079e576101008083540402835291602001916107c9565b820191906000526020600020905b8154815290600101906020018083116107ac57829003601f168201915b505050505081565b6000546001600160a01b031633146107fb5760405162461bcd60e51b81526004016103bd90610d87565b6001600160a01b038216600090815260056020526040902054610824908263ffffffff610a5c16565b6001600160a01b038316600090815260056020526040902055600454610850908263ffffffff610a5c16565b6004556040516001600160a01b038316907fcc16f5dbb4873280815c1ee09dbd06736cffcc184412cf7a71a0fdb75d397ca59061088e908490610dcd565b60405180910390a260006001600160a01b0316826001600160a01b0316600080516020610e2d833981519152836040516106829190610dcd565b336000908152600560205260408120548211156108f75760405162461bcd60e51b81526004016103bd90610d5b565b33600090815260056020526040902054610917908363ffffffff610a5c16565b33600090815260056020526040808220929092556001600160a01b03851681522054610949908363ffffffff610a8416565b6001600160a01b038416600081815260056020526040908190209290925590513390600080516020610e2d8339815191529061034f908690610dcd565b6001600160a01b03918216600090815260066020908152604080832093909416825291909152205490565b6000546001600160a01b031633146109db5760405162461bcd60e51b81526004016103bd90610d87565b6001600160a01b038116610a015760405162461bcd60e51b81526004016103bd90610d34565b600080546040516001600160a01b03808516939216917fdcf55418cee3220104fef63f979ff3c4097ad240c0c43dcb33ce837748983e6291a3600180546001600160a01b0319166001600160a01b0392909216919091179055565b600082821115610a7e5760405162461bcd60e51b81526004016103bd90610d11565b50900390565b600082820183811015610aa95760405162461bcd60e51b81526004016103bd90610daa565b9392505050565b80356001600160a01b038116811461035b57600080fd5b600060208284031215610ad8578081fd5b610aa98383610ab0565b60008060408385031215610af4578081fd5b610afe8484610ab0565b9150610b0d8460208501610ab0565b90509250929050565b600080600060608486031215610b2a578081fd5b8335610b3581610e14565b92506020840135610b4581610e14565b929592945050506040919091013590565b60008060408385031215610b68578182fd5b610b728484610ab0565b946020939093013593505050565b600060208284031215610b91578081fd5b815167ffffffffffffffff80821115610ba8578283fd5b81840185601f820112610bb9578384fd5b8051925081831115610bc9578384fd5b604051601f8401601f191681016020018381118282101715610be9578586fd5b604052838152818401602001871015610c00578485fd5b610c11846020830160208501610de4565b9695505050505050565b600060208284031215610c2c578081fd5b815160ff81168114610aa9578182fd5b60008351610c4e818460208801610de4565b8351908301610c61828260208801610de4565b01949350505050565b6001600160a01b0391909116815260200190565b901515815260200190565b6000602082528251806020840152610ca8816040850160208701610de4565b601f01601f19169190910160400192915050565b6020808252600d908201526c494e56414c49445f434c41494d60981b604082015260600190565b60208082526014908201527308298989eae829c868abe9c9ea8be8a9c9eaa8e960631b604082015260600190565b60208082526009908201526829aaa12fa2a92927a960b91b604082015260600190565b6020808252600d908201526c24a72b20a624a22fa7aba722a960991b604082015260600190565b6020808252601290820152710848298829c868abe9c9ea8be8a9c9eaa8e960731b604082015260600190565b6020808252600990820152682727aa2fa7aba722a960b91b604082015260600190565b60208082526009908201526820a2222fa2a92927a960b91b604082015260600190565b90815260200190565b60ff91909116815260200190565b60005b83811015610dff578181015183820152602001610de7565b83811115610e0e576000848401525b50505050565b6001600160a01b0381168114610e2957600080fd5b5056feddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa2646970667358221220071f92fc39e640ba34f7c58b08640e58982fe1da55cd37c7d4d5049d5184cfc164736f6c63430006090033e89c586bd81ee35a18f7eac22a732b56e589a2821497cce12a0208828540a36d581f351e2bdb9fa9021bb2a24def989f06ac236f8a92aac14bcbc618ddf3826aa26469706673582212208e792128c846e2a66129bbb60ee1407f3e7ff4680e80271776a75729e5abf29b64736f6c63430006090033

Deployed ByteCode Sourcemap

60363:1520:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45894:905;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;52825:210;;;;;;;;;:::i;:::-;;49156:985;;;;;;;;;:::i;9580:135::-;;;:::i;8606:43::-;;;:::i;43386:1227::-;;;;;;;;;:::i;53668:106::-;;;:::i;53550:110::-;;;:::i;52017:112::-;;;;;;;;;:::i;2851:22::-;;;:::i;:::-;;;;;;;;7683:36;;;:::i;53104:99::-;;;:::i;8192:31::-;;;:::i;:::-;;;;;;;;34185:178;;;;;;;;;:::i;46807:853::-;;;;;;;;;:::i;27694:1423::-;;;:::i;8278:42::-;;;:::i;53845:99::-;;;:::i;40902:123::-;;;;;;;;;:::i;9882:137::-;;;:::i;48753:395::-;;;;;;;;;:::i;53434:108::-;;;:::i;26332:164::-;;;;;;;;;:::i;7777:27::-;;;:::i;7847:::-;;;:::i;7930:::-;;;:::i;7477:32::-;;;:::i;3574:230::-;;;:::i;10077:89::-;;;:::i;52137:278::-;;;;;;;;;:::i;41591:870::-;;;;;;;;;:::i;26603:1029::-;;;:::i;52674:143::-;;;;;;;;;:::i;8656:41::-;;;;;;;;;:::i;:::-;;;;;;;;7333:20;;;:::i;7999:23::-;;;:::i;9305:110::-;;;:::i;51793:96::-;;;;;;;;;:::i;9423:149::-;;;;;;;;;:::i;8363:30::-;;;:::i;2880:26::-;;;:::i;54269:148::-;;;;;;;;;:::i;53211:95::-;;;:::i;30887:1541::-;;;;;;;;;:::i;7605:29::-;;;:::i;53952:95::-;;;:::i;51897:112::-;;;;;;;;;:::i;44621:1206::-;;;;;;;;;:::i;48358:387::-;;;;;;;;;:::i;54425:152::-;;;;;;;;;:::i;7641:35::-;;;:::i;33985:192::-;;;;;;;;;:::i;7570:28::-;;;:::i;7402:34::-;;;:::i;42469:854::-;;;;;;;;;:::i;8095:28::-;;;:::i;8444:36::-;;;:::i;54055:101::-;;;:::i;8230:41::-;;;:::i;53314:112::-;;;:::i;41033:127::-;;;;;;;;;:::i;8130:28::-;;;:::i;29179:595::-;;;;;;;;;:::i;41418:111::-;;;:::i;7360:35::-;;;:::i;8556:43::-;;;:::i;54164:97::-;;;:::i;41301:109::-;;;:::i;7964:28::-;;;:::i;8402:35::-;;;:::i;7443:27::-;;;:::i;32436:1489::-;;;;;;;;;:::i;8327:29::-;;;:::i;8165:18::-;;;:::i;26163:161::-;;;;;;;;;:::i;19544:816::-;;;:::i;50149:984::-;;;;;;;;;:::i;60420:1460::-;;;;;;;;;:::i;52423:243::-;;;;;;;;;:::i;3342:224::-;;;;;;;;;:::i;41168:125::-;;;;;;;;;:::i;9723:151::-;;;;;;;;;:::i;40769:125::-;;;;;;;;;:::i;18845:691::-;;;:::i;:::-;;;;;;;;;45894:905;6444:9;;46017:7;;-1:-1:-1;;;6444:9:0;;;;6443:10;6435:32;;;;-1:-1:-1;;;6435:32:0;;;;;;;;;;;;;;;;;6490:4;6478:16;;-1:-1:-1;;;;6478:16:0;-1:-1:-1;;;6478:16:0;;;;;-1:-1:-1;;;40663:8:0;::::1;6478:16:::0;40663:8:::1;40662:9;40654:33;;;;-1:-1:-1::0;;;40654:33:0::1;;;;;;;;;46042:22:::2;46067:29;46085:10;46067:17;:29::i;:::-;46042:54;;46107:15;46125:36;46150:10;46125:24;:36::i;:::-;46107:54;;46228:15;46246:39;46270:14;46246:23;:39::i;:::-;46228:57;;46315:14;46304:7;:25;;46296:52;;;;-1:-1:-1::0;;;46296:52:0::2;;;;;;;;;46414:27;::::0;:47:::2;::::0;46446:14;46414:47:::2;:31;:47;:::i;:::-;46384:27;:77:::0;46472:38:::2;46490:10;46502:7:::0;46472:17:::2;:38::i;:::-;46521:55;46544:2:::0;46548:27:::2;:14:::0;46567:7;46548:27:::2;:18;:27;:::i;:::-;46521:22;:55::i;:::-;46587:26;46605:7;46587:17;:26::i;:::-;46652:2;-1:-1:-1::0;;;;;46631:56:0::2;46640:10;-1:-1:-1::0;;;;;46631:56:0::2;-1:-1:-1::0;;;;;;;;;;;46656:5:0::2;46663:14;46679:7;46631:56;;;;;;;;;;;;;;;;;46717:10;-1:-1:-1::0;;;;;46703:41:0::2;-1:-1:-1::0;;;;;;;;;;;46729:5:0::2;46736:7;46703:41;;;;;;;;;;;;;;;;46764:27;:14:::0;46783:7;46764:27:::2;:18;:27;:::i;:::-;6517:9:::0;:17;;-1:-1:-1;;;;6517:17:0;;;46757:34;45894:905;-1:-1:-1;;;;;45894:905:0:o;52825:210::-;8818:12;;-1:-1:-1;;;;;8818:12:0;8804:10;:26;;:51;;-1:-1:-1;8848:7:0;;-1:-1:-1;;;;;8848:7:0;8834:10;:21;8804:51;8796:87;;;;-1:-1:-1;;;8796:87:0;;;;;;;;;52924:56:::1;52944:17;;52963:16;52924:56;;;;;;;;;;;;;;;;52991:17;:36:::0;52825:210::o;49156:985::-;49226:15;49272;;49262:6;:25;;49254:67;;;;-1:-1:-1;;;49254:67:0;;;;;;;;;49350:23;49336:10;;;;:37;;;;;;;;;49332:802;;;49390:17;49410:46;49429:26;;49410:14;;:18;;:46;;;;:::i;:::-;49390:66;;49471:13;49487:16;:14;:16::i;:::-;49471:32;;49518:18;49539:33;49555:9;49566:5;49539:15;:33::i;:::-;49518:54;;49587:19;49609:141;49669:15;;49703:3;;49725:10;49609:41;:141::i;:::-;49587:163;;49820:31;49854:153;49914:27;49934:6;49914:15;;:19;;:27;;;;:::i;:::-;49960:3;;49982:10;49854:41;:153::i;:::-;49820:187;-1:-1:-1;50029:52:0;50045:35;49820:187;50073:6;50045:35;:27;:35;:::i;:::-;50029:11;;:52;:15;:52;:::i;:::-;50022:59;;;;;;;;;49332:802;-1:-1:-1;50121:1:0;49332:802;49156:985;;;:::o;9580:135::-;9672:20;;9659:48;;;-1:-1:-1;;;9659:48:0;;;;9632:7;;-1:-1:-1;;;;;9672:20:0;;9659:46;;:48;;;;;;;;;;;;;;9672:20;9659:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9652:55;;9580:135;;:::o;8606:43::-;;;;:::o;43386:1227::-;6444:9;;43522:7;;-1:-1:-1;;;6444:9:0;;;;6443:10;6435:32;;;;-1:-1:-1;;;6435:32:0;;;;;;;;;6490:4;6478:16;;-1:-1:-1;;;;6478:16:0;-1:-1:-1;;;6478:16:0;;;;;-1:-1:-1;;;40663:8:0;::::1;6478:16:::0;40663:8:::1;40662:9;40654:33;;;;-1:-1:-1::0;;;40654:33:0::1;;;;;;;;;43580:19:::2;43603;:17;:19::i;:::-;43577:45;;;43633:25;43661:22;:20;:22::i;:::-;43633:50;;43722:1;43702:17;:21;43694:45;;;;-1:-1:-1::0;;;43694:45:0::2;;;;;;;;;43752:27;43782:50;43820:11:::0;43782:29:::2;:6:::0;43793:17;43782:29:::2;:10;:29;:::i;:::-;:37:::0;:50:::2;:37;:50;:::i;:::-;43752:80;;43888:36;43913:10;43888:24;:36::i;:::-;43865:19;:59;;43843:144;;;;-1:-1:-1::0;;;43843:144:0::2;;;;;;;;;44054:15;44072:31;44096:6;44072:23;:31::i;:::-;44054:49;;44132:6;44122:7;:16;44114:43;;;;-1:-1:-1::0;;;44114:43:0::2;;;;;;;;;44223:27;::::0;:39:::2;::::0;44255:6;44223:39:::2;:31;:39;:::i;:::-;44193:27;:69:::0;44273:50:::2;44291:10;44303:19:::0;44273:17:::2;:50::i;:::-;44334:47;44357:2:::0;44361:19:::2;:6:::0;44372:7;44361:19:::2;:10;:19;:::i;44334:47::-;44392:26;44410:7;44392:17;:26::i;:::-;-1:-1:-1::0;;;;;44436:73:0;::::2;44445:10;-1:-1:-1::0;;;;;;;;;;;44461:5:0::2;44468:19;:6:::0;44479:7;44468:19:::2;:10;:19;:::i;:::-;44489;44436:73;;;;;;;;;;;;;;;;;44539:10;-1:-1:-1::0;;;;;44525:41:0::2;-1:-1:-1::0;;;;;;;;;;;44551:5:0::2;44558:7;44525:41;;;;;;;;;;;;;;;;44586:19;:6:::0;44597:7;44586:19:::2;:10;:19;:::i;:::-;6517:9:::0;:17;;-1:-1:-1;;;;6517:17:0;;;44579:26;43386:1227;-1:-1:-1;;;;;;;43386:1227:0:o;53668:106::-;3247:7;;-1:-1:-1;;;;;3247:7:0;3233:10;:21;3225:43;;;;-1:-1:-1;;;3225:43:0;;;;;;;;;8952:8:::1;::::0;-1:-1:-1;;;8952:8:0;::::1;;;8951:9;8943:33;;;;-1:-1:-1::0;;;8943:33:0::1;;;;;;;;;53762:4:::2;53737:29:::0;;-1:-1:-1;;;;53737:29:0::2;-1:-1:-1::0;;;53737:29:0::2;::::0;;53668:106::o;53550:110::-;8818:12;;-1:-1:-1;;;;;8818:12:0;8804:10;:26;;:51;;-1:-1:-1;8848:7:0;;-1:-1:-1;;;;;8848:7:0;8834:10;:21;8804:51;8796:87;;;;-1:-1:-1;;;8796:87:0;;;;;;;;;53622:22:::1;:30:::0;;-1:-1:-1;;;;53622:30:0::1;::::0;;53550:110::o;52017:112::-;3247:7;;-1:-1:-1;;;;;3247:7:0;3233:10;:21;3225:43;;;;-1:-1:-1;;;3225:43:0;;;;;;;;;52093:12:::1;:28:::0;;-1:-1:-1;;;;;;52093:28:0::1;-1:-1:-1::0;;;;;52093:28:0;;;::::1;::::0;;;::::1;::::0;;52017:112::o;2851:22::-;;;-1:-1:-1;;;;;2851:22:0;;:::o;7683:36::-;;;;:::o;53104:99::-;8818:12;;-1:-1:-1;;;;;8818:12:0;8804:10;:26;;:51;;-1:-1:-1;8848:7:0;;-1:-1:-1;;;;;8848:7:0;8834:10;:21;8804:51;8796:87;;;;-1:-1:-1;;;8796:87:0;;;;;;;;;53172:15:::1;:23:::0;;-1:-1:-1;;;;53172:23:0::1;::::0;;53104:99::o;8192:31::-;;;;;;:::o;34185:178::-;34251:16;34303:26;34322:6;34303:18;:26::i;:::-;-1:-1:-1;34280:49:0;;34185:178;-1:-1:-1;;;;;;34185:178:0:o;46807:853::-;6444:9;;46893:7;;-1:-1:-1;;;6444:9:0;;;;6443:10;6435:32;;;;-1:-1:-1;;;6435:32:0;;;;;;;;;6490:4;6478:16;;-1:-1:-1;;;;6478:16:0;-1:-1:-1;;;6478:16:0;;;;;-1:-1:-1;;;40663:8:0;::::1;6478:16:::0;40663:8:::1;40662:9;40654:33;;;;-1:-1:-1::0;;;40654:33:0::1;;;;;;;;;46913:22:::2;46938:28;46955:10;46938:16;:28::i;:::-;46913:53;;46977:15;46995:35;47019:10;46995:23;:35::i;:::-;46977:53;;47097:15;47115:38;47138:14;47115:22;:38::i;:::-;47097:56;;47183:14;47172:7;:25;;47164:52;;;;-1:-1:-1::0;;;47164:52:0::2;;;;;;;;;47281:26;::::0;:46:::2;::::0;47312:14;47281:46:::2;:30;:46;:::i;:::-;47252:26;:75:::0;47338:37:::2;47355:10;47367:7:::0;47338:16:::2;:37::i;:::-;47386:54;47408:2:::0;47412:27:::2;:14:::0;47431:7;47412:27:::2;:18;:27;:::i;:::-;47386:21;:54::i;:::-;47451:25;47468:7;47451:16;:25::i;:::-;47515:2;-1:-1:-1::0;;;;;47494:55:0::2;47503:10;-1:-1:-1::0;;;;;47494:55:0::2;-1:-1:-1::0;;;;;;;;;;;47519:4:0::2;47525:14;47541:7;47494:55;;;;;;;;;;;;;;;;;47579:10;-1:-1:-1::0;;;;;47565:40:0::2;-1:-1:-1::0;;;;;;;;;;;47591:4:0::2;47597:7;47565:40;;;;;;;;27694:1423:::0;6444:9;;-1:-1:-1;;;6444:9:0;;;;6443:10;6435:32;;;;-1:-1:-1;;;6435:32:0;;;;;;;;;6490:4;6478:16;;-1:-1:-1;;;;6478:16:0;-1:-1:-1;;;6478:16:0;;;;;-1:-1:-1;;;27762:8:0;::::1;6478:16:::0;27762:8:::1;27754:36;;;;-1:-1:-1::0;;;27754:36:0::1;;;;;;;;;27820:10;27810:21;::::0;;;:9:::1;:21;::::0;;;;;::::1;;27809:22;27801:50;;;;-1:-1:-1::0;;;27801:50:0::1;;;;;;;;;27872:10;27862:21;::::0;;;:9:::1;:21;::::0;;;;:28;;-1:-1:-1;;27862:28:0::1;27886:4;27862:28;::::0;;:21;27926:36:::1;::::0;:24:::1;:36::i;:::-;27903:59;;27973:19;27995:35;28019:10;27995:23;:35::i;:::-;27973:57:::0;-1:-1:-1;28043:19:0::1;28081:16:::0;;28077:136:::1;;28128:73;28178:22;:20;:22::i;:::-;28128:27;::::0;:45:::1;::::0;28160:12;28128:45:::1;:31;:45;:::i;:::-;:49:::0;:73:::1;:49;:73;:::i;:::-;28114:87;;28077:136;28223:18;28260:15:::0;;28256:131:::1;;28305:70;28353:21;:19;:21::i;:::-;28305:26;::::0;:43:::1;::::0;28336:11;28305:43:::1;:30;:43;:::i;:70::-;28292:83;;28256:131;28429:27;::::0;:44:::1;::::0;28461:11;28429:44:::1;:31;:44;:::i;:::-;28399:27;:74:::0;28513:26:::1;::::0;:42:::1;::::0;28544:10;28513:42:::1;:30;:42;:::i;:::-;28484:26;:71;;;;28582:75;28598:58;28614:11;28627:28;;28598:15;:58::i;:::-;28582:11:::0;;:75:::1;:15;:75;:::i;:::-;28568:89;;28681:75;28696:59;28712:12;28726:28;;28696:15;:59::i;:::-;28681:10:::0;;:75:::1;:14;:75;:::i;:::-;28668:88;;28769:45;28791:10;28803;28769:21;:45::i;:::-;28825:47;28848:10;28860:11;28825:22;:47::i;:::-;28898:20;::::0;28885:64:::1;::::0;-1:-1:-1;;;28885:64:0;;-1:-1:-1;;;;;28898:20:0;;::::1;::::0;28885:39:::1;::::0;:64:::1;::::0;28925:10:::1;::::0;28937:11;;28885:64:::1;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;28973:21:0::1;::::0;28960:66:::1;::::0;-1:-1:-1;;;28960:66:0;;-1:-1:-1;;;;;28973:21:0;;::::1;::::0;-1:-1:-1;28960:40:0::1;::::0;-1:-1:-1;28960:66:0::1;::::0;29001:10:::1;::::0;29013:12;;28960:66:::1;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;29056:10;-1:-1:-1::0;;;;;29044:48:0::1;;29068:10;29080:11;29044:48;;;;;;;;;;;;;;;;29103:7;;;;6517:9:::0;:17;;-1:-1:-1;;;;6517:17:0;;;27694:1423::o;8278:42::-;;;;:::o;53845:99::-;8818:12;;-1:-1:-1;;;;;8818:12:0;8804:10;:26;;:51;;-1:-1:-1;8848:7:0;;-1:-1:-1;;;;;8848:7:0;8834:10;:21;8804:51;8796:87;;;;-1:-1:-1;;;8796:87:0;;;;;;;;;53912:16:::1;:24:::0;;-1:-1:-1;;53912:24:0::1;::::0;;53845:99::o;40902:123::-;40957:7;40984:33;40998:10;41010:6;40984:13;:33::i;:::-;40977:40;40902:123;-1:-1:-1;;40902:123:0:o;9882:137::-;9975:21;;9962:49;;;-1:-1:-1;;;9962:49:0;;;;9935:7;;-1:-1:-1;;;;;9975:21:0;;9962:47;;:49;;;;;;;;;;;;;;9975:21;9962:49;;;;;;;;;;48753:395;48813:17;48843:25;48871:22;:20;:22::i;:::-;48843:50;;48907:19;48930;:17;:19::i;:::-;48904:45;-1:-1:-1;;48964:22:0;48960:63;;49010:1;49003:8;;;;;;48960:63;49045:68;49095:17;49045:45;49078:11;49045:28;49070:2;49045:24;:28::i;:::-;:32;:45;:32;:45;:::i;:68::-;49033:80;48753:395;-1:-1:-1;;;;48753:395:0:o;53434:108::-;3247:7;;-1:-1:-1;;;;;3247:7:0;3233:10;:21;3225:43;;;;-1:-1:-1;;;3225:43:0;;;;;;;;;8952:8:::1;::::0;-1:-1:-1;;;8952:8:0;::::1;;;8951:9;8943:33;;;;-1:-1:-1::0;;;8943:33:0::1;;;;;;;;;53530:4:::2;53504:30:::0;;-1:-1:-1;;;;53504:30:0::2;-1:-1:-1::0;;;53504:30:0::2;::::0;;53434:108::o;26332:164::-;6444:9;;-1:-1:-1;;;6444:9:0;;;;6443:10;6435:32;;;;-1:-1:-1;;;6435:32:0;;;;;;;;;6490:4;6478:16;;-1:-1:-1;;;;6478:16:0;-1:-1:-1;;;6478:16:0;;;26411:41:::1;26433:10;26445:6:::0;26411:21:::1;:41::i;:::-;26463:25;26481:6;26463:17;:25::i;:::-;-1:-1:-1::0;6517:9:0;:17;;-1:-1:-1;;;;6517:17:0;;;26332:164::o;7777:27::-;;;-1:-1:-1;;;;;7777:27:0;;:::o;7847:::-;;;-1:-1:-1;;;;;7847:27:0;;:::o;7930:::-;;;-1:-1:-1;;;;;7930:27:0;;:::o;7477:32::-;;;;:::o;3574:230::-;3642:11;;-1:-1:-1;;;;;3642:11:0;3628:10;:25;3620:51;;;;-1:-1:-1;;;3620:51:0;;;;;;;;;3717:11;;;3708:7;;3687:42;;-1:-1:-1;;;;;3717:11:0;;;;3708:7;;;;3687:42;;;3750:11;;;;3740:21;;-1:-1:-1;;;;;;3740:21:0;;;-1:-1:-1;;;;;3750:11:0;;3740:21;;;;3772:24;;;3574:230::o;10077:89::-;10146:3;10077:89;:::o;52137:278::-;3247:7;;-1:-1:-1;;;;;3247:7:0;3233:10;:21;3225:43;;;;-1:-1:-1;;;3225:43:0;;;;;;;;;52246:74:::1;52277:13;;52292:27;52246:74;;;;;;;;;;;;;;;;52331:13;:43:::0;;;52385:22:::1;:20;:22::i;:::-;;52137:278:::0;:::o;41591:870::-;6444:9;;41732:7;;-1:-1:-1;;;6444:9:0;;;;6443:10;6435:32;;;;-1:-1:-1;;;6435:32:0;;;;;;;;;6490:4;6478:16;;-1:-1:-1;;;;6478:16:0;-1:-1:-1;;;6478:16:0;;;;;-1:-1:-1;;;40409:23:0;::::1;6478:16:::0;40409:23:::1;40401:61;;;;-1:-1:-1::0;;;40401:61:0::1;;;;;;;;;41760:19:::2;41783;:17;:19::i;:::-;41757:45;;;41813:25;41841:22;:20;:22::i;:::-;41813:50:::0;-1:-1:-1;41892:6:0;41913:22;41909:257:::2;;42021:23;:6:::0;42032:11;42021:23:::2;:10;:23;:::i;:::-;42011:33;;41909:257;;;42066:15:::0;;42062:104:::2;;42108:46;42142:11:::0;42108:29:::2;:6:::0;42119:17;42108:29:::2;:10;:29;:::i;:46::-;42098:56;;42062:104;42201:41;42223:10;42235:6;42201:21;:41::i;:::-;42253:30;42271:2;42275:7;42253:17;:30::i;:::-;42324:27;::::0;:39:::2;::::0;42356:6;42324:39:::2;:31;:39;:::i;:::-;42294:27;:69:::0;42381:47:::2;::::0;-1:-1:-1;;;;;42381:47:0;::::2;::::0;42389:10:::2;::::0;42381:47:::2;::::0;::::2;::::0;42405:5:::2;::::0;42412:6;;42420:7;;42381:47:::2;;;;;;;;;;6517:9:::0;:17;;-1:-1:-1;;;;6517:17:0;;;42446:7;41591:870;-1:-1:-1;;;;;41591:870:0:o;26603:1029::-;3247:7;;-1:-1:-1;;;;;3247:7:0;3233:10;:21;3225:43;;;;-1:-1:-1;;;3225:43:0;;;;;;;;;8952:8:::1;::::0;-1:-1:-1;;;8952:8:0;::::1;;;8951:9;8943:33;;;;-1:-1:-1::0;;;8943:33:0::1;;;;;;;;;26681:4:::2;26670:15:::0;;-1:-1:-1;;;;;;;;26670:15:0;;::::2;-1:-1:-1::0;;;26670:15:0::2;26779:23:::0;;;26670:15;26840:21:::2;:19;:21::i;:::-;26813:48;;26872:25;26900:22;:20;:22::i;:::-;26872:50;;26957:27;;26939:15;;:45;26935:321;;;27001:18;27022:48;27042:27;;27022:15;;:19;;:48;;;;:::i;:::-;27001:69;;27116:50;27137:10;27149:16;27116:20;:50::i;:::-;27085:28;:81:::0;-1:-1:-1;26935:321:0::2;;;27229:15;::::0;27199:27:::2;:45:::0;26935:321:::2;27289:26;;27272:14;;:43;27268:314;;;27332:17;27352:46;27371:26;;27352:14;;:18;;:46;;;;:::i;:::-;27332:66;;27444:50;27465:9;27476:17;27444:20;:50::i;:::-;27413:28;:81:::0;-1:-1:-1;27268:314:0::2;;;27556:14;::::0;27527:26:::2;:43:::0;27268:314:::2;-1:-1:-1::0;;27594:10:0::2;:30:::0;;-1:-1:-1;;27594:30:0::2;::::0;;26603:1029::o;52674:143::-;3247:7;;-1:-1:-1;;;;;3247:7:0;3233:10;:21;3225:43;;;;-1:-1:-1;;;3225:43:0;;;;;;;;;52737:18:::1;52745:3;;52750:4;52737:18;;;;;;;;;;;;;;;;52766:3;:10:::0;;;52787:22:::1;:20;:22::i;8656:41::-:0;;;;;;;;;;;;;;;:::o;7333:20::-;;;-1:-1:-1;;;7333:20:0;;;;;:::o;7999:23::-;;;-1:-1:-1;;;;;7999:23:0;;:::o;9305:110::-;9387:8;;9379:28;;;-1:-1:-1;;;9379:28:0;;;;9352:7;;-1:-1:-1;;;;;9387:8:0;;9379:26;;:28;;;;;;;;;;;;;;9387:8;9379:28;;;;;;;;;;51793:96;3247:7;;-1:-1:-1;;;;;3247:7:0;3233:10;:21;3225:43;;;;-1:-1:-1;;;3225:43:0;;;;;;;;;51861:8:::1;:20:::0;;-1:-1:-1;;;;;;51861:20:0::1;-1:-1:-1::0;;;;;51861:20:0;;;::::1;::::0;;;::::1;::::0;;51793:96::o;9423:149::-;9529:20;;9516:48;;-1:-1:-1;;;9516:48:0;;9489:7;;-1:-1:-1;;;;;9529:20:0;;9516:44;;:48;;9561:2;;9516:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8363:30;;;;:::o;2880:26::-;;;-1:-1:-1;;;;;2880:26:0;;:::o;54269:148::-;3247:7;;-1:-1:-1;;;;;3247:7:0;3233:10;:21;3225:43;;;;-1:-1:-1;;;3225:43:0;;;;;;;;;8952:8:::1;::::0;-1:-1:-1;;;8952:8:0;::::1;;;8951:9;8943:33;;;;-1:-1:-1::0;;;8943:33:0::1;;;;;;;;;54367:20:::2;:42:::0;54269:148::o;53211:95::-;3247:7;;-1:-1:-1;;;;;3247:7:0;3233:10;:21;3225:43;;;;-1:-1:-1;;;3225:43:0;;;;;;;;;8952:8:::1;::::0;-1:-1:-1;;;8952:8:0;::::1;;;8951:9;8943:33;;;;-1:-1:-1::0;;;8943:33:0::1;;;;;;;;;53294:4:::2;53276:22:::0;;-1:-1:-1;;;;53276:22:0::2;-1:-1:-1::0;;;53276:22:0::2;::::0;;53211:95::o;30887:1541::-;30420:15;;31083:7;;-1:-1:-1;;;30420:15:0;;;;30412:45;;;;-1:-1:-1;;;30412:45:0;;;;;;;;;30641:17:::1;::::0;::::1;::::0;::::1;;;30633:49;;;;-1:-1:-1::0;;;30633:49:0::1;;;;;;;;;30769:17:::2;;30754:11;:32;;30746:61;;;;-1:-1:-1::0;;;30746:61:0::2;;;;;;;;;6444:9:::3;::::0;-1:-1:-1;;;6444:9:0;::::3;;;6443:10;6435:32;;;;-1:-1:-1::0;;;6435:32:0::3;;;;;;;;;6490:4;6478:16:::0;;-1:-1:-1;;;;6478:16:0::3;-1:-1:-1::0;;;6478:16:0::3;::::0;;;;;;;;31354:27:::4;31374:6:::0;31354:19:::4;:27::i;:::-;31127:254;;;;;;;;;;;;31416:15;31400:12;:31;;31392:72;;;;-1:-1:-1::0;;;31392:72:0::4;;;;;;;;;31503:48;31526:10;31538:12;31503:22;:48::i;:::-;31566:15:::0;;31562:115:::4;;31598:67;::::0;-1:-1:-1;;;31598:67:0;;31610:10:::4;::::0;31598:32:::4;::::0;:67:::4;::::0;31631:5:::4;::::0;31638:6;;31646:12;;31660:4;;;;31598:67:::4;;;;;;;;;;;;;;;;;;;;;;::::0;::::4;;;;;;;;;;;;::::0;::::4;;;;;;;;;31562:115;31687:40;31708:10;31720:6;31687:20;:40::i;:::-;31742:15:::0;;31738:168:::4;;31797:12;::::0;31774:48:::4;::::0;-1:-1:-1;;;;;31797:12:0::4;31811:10:::0;31774:22:::4;:48::i;:::-;31862:12;::::0;31842:52:::4;::::0;-1:-1:-1;;;;;31862:12:0;;::::4;::::0;31842:52:::4;::::0;::::4;::::0;31862:12:::4;::::0;31883:10;;31842:52:::4;;;;;;;;;;31738:168;31979:14;31948:27;;:45;31944:122;;32010:27;:44:::0;;;31944:122:::4;32110:13;32080:26;;:43;32076:118;;32140:26;:42:::0;;;32076:118:::4;32222:10;32208:24;;;;;;;;:10;::::0;::::4;;:24;::::0;::::4;;;;;;;32204:80;;32249:10;:23:::0;;32262:10;;32249;-1:-1:-1;;32249:23:0::4;::::0;32262:10;32249:23:::4;::::0;::::4;;;;;;;;;;;32204:80;32296:29;32314:10;32296:17;:29::i;:::-;32355:10;-1:-1:-1::0;;;;;32341:47:0::4;;32367:6;32375:12;32341:47;;;;;;;;;;;;;;;;-1:-1:-1::0;;6517:9:0::3;:17:::0;;-1:-1:-1;;;;6517:17:0::3;::::0;;-1:-1:-1;32408:12:0;;30887:1541;-1:-1:-1;;;;;;;30887:1541:0:o;7605:29::-;;;;;;;;;:::o;53952:95::-;3247:7;;-1:-1:-1;;;;;3247:7:0;3233:10;:21;3225:43;;;;-1:-1:-1;;;3225:43:0;;;;;;;;;8952:8:::1;::::0;-1:-1:-1;;;8952:8:0;::::1;;;8951:9;8943:33;;;;-1:-1:-1::0;;;8943:33:0::1;;;;;;;;;54016:16:::2;:23:::0;;-1:-1:-1;;54016:23:0::2;54035:4;54016:23;::::0;;53952:95::o;51897:112::-;3247:7;;-1:-1:-1;;;;;3247:7:0;3233:10;:21;3225:43;;;;-1:-1:-1;;;3225:43:0;;;;;;;;;51973:12:::1;:28:::0;;-1:-1:-1;;;;;;51973:28:0::1;-1:-1:-1::0;;;;;51973:28:0;;;::::1;::::0;;;::::1;::::0;;51897:112::o;44621:1206::-;6444:9;;44756:7;;-1:-1:-1;;;6444:9:0;;;;6443:10;6435:32;;;;-1:-1:-1;;;6435:32:0;;;;;;;;;6490:4;6478:16;;-1:-1:-1;;;;6478:16:0;-1:-1:-1;;;6478:16:0;;;;;-1:-1:-1;;;40663:8:0;::::1;6478:16:::0;40663:8:::1;40662:9;40654:33;;;;-1:-1:-1::0;;;40654:33:0::1;;;;;;;;;44812:18:::2;44836:19;:17;:19::i;:::-;44811:44;;;44866:24;44893:21;:19;:21::i;:::-;44866:48;;44952:1;44933:16;:20;44925:43;;;;-1:-1:-1::0;;;44925:43:0::2;;;;;;;;;44981:26;45010:48;45047:10:::0;45010:28:::2;:6:::0;45021:16;45010:28:::2;:10;:28;:::i;:48::-;44981:77;;45113:35;45137:10;45113:23;:35::i;:::-;45091:18;:57;;45069:141;;;;-1:-1:-1::0;;;45069:141:0::2;;;;;;;;;45277:15;45295:30;45318:6;45295:22;:30::i;:::-;45277:48;;45355:6;45344:7;:17;;45336:44;;;;-1:-1:-1::0;;;45336:44:0::2;;;;;;;;;45445:26;::::0;:38:::2;::::0;45476:6;45445:38:::2;:30;:38;:::i;:::-;45416:26;:67:::0;45494:48:::2;45511:10;45523:18:::0;45494:16:::2;:48::i;:::-;45553:46;45575:2:::0;45579:19:::2;:6:::0;45590:7;45579:19:::2;:10;:19;:::i;45553:46::-;45610:25;45627:7;45610:16;:25::i;:::-;-1:-1:-1::0;;;;;45653:71:0;::::2;45662:10;-1:-1:-1::0;;;;;;;;;;;45678:4:0::2;45684:19;:6:::0;45695:7;45684:19:::2;:10;:19;:::i;:::-;45705:18;45653:71;;;;;;;;;;;;;;;;;45754:10;-1:-1:-1::0;;;;;45740:40:0::2;-1:-1:-1::0;;;;;;;;;;;45766:4:0::2;45772:7;45740:40;;;;;;;;48358:387:::0;48417:17;48447:24;48474:21;:19;:21::i;:::-;48447:48;;48507:18;48531:19;:17;:19::i;:::-;-1:-1:-1;48506:44:0;-1:-1:-1;48565:21:0;48561:62;;48610:1;48603:8;;;;;;48561:62;48645:65;48693:16;48645:43;48677:10;48645:27;48669:2;48645:23;:27::i;54425:152::-;3247:7;;-1:-1:-1;;;;;3247:7:0;3233:10;:21;3225:43;;;;-1:-1:-1;;;3225:43:0;;;;;;;;;8952:8:::1;::::0;-1:-1:-1;;;8952:8:0;::::1;;;8951:9;8943:33;;;;-1:-1:-1::0;;;8943:33:0::1;;;;;;;;;54525:21:::2;:44:::0;54425:152::o;7641:35::-;;;;:::o;33985:192::-;34052:20;34112:27;34132:6;34112:19;:27::i;7570:28::-;;;;;;:::o;7402:34::-;;;-1:-1:-1;;;7402:34:0;;;;;:::o;42469:854::-;6444:9;;42608:7;;-1:-1:-1;;;6444:9:0;;;;6443:10;6435:32;;;;-1:-1:-1;;;6435:32:0;;;;;;;;;6490:4;6478:16;;-1:-1:-1;;;;6478:16:0;-1:-1:-1;;;6478:16:0;;;;;-1:-1:-1;;;40539:22:0;::::1;6478:16:::0;40539:22:::1;40531:59;;;;-1:-1:-1::0;;;40531:59:0::1;;;;;;;;;42634:18:::2;42658:19;:17;:19::i;:::-;42633:44;;;42688:24;42715:21;:19;:21::i;:::-;42688:48:::0;-1:-1:-1;42765:6:0;42786:21;42782:251:::2;;42892:22;:6:::0;42903:10;42892:22:::2;:10;:22;:::i;:::-;42882:32;;42782:251;;;42936:14:::0;;42932:101:::2;;42977:44;43010:10:::0;42977:28:::2;:6:::0;42988:16;42977:28:::2;:10;:28;:::i;:44::-;42967:54;;42932:101;43068:40;43089:10;43101:6;43068:20;:40::i;:::-;43119:29;43136:2;43140:7;43119:16;:29::i;:::-;43188:26;::::0;:38:::2;::::0;43219:6;43188:38:::2;:30;:38;:::i;:::-;43159:26;:67:::0;43244:46:::2;::::0;-1:-1:-1;;;;;43244:46:0;::::2;::::0;43252:10:::2;::::0;43244:46:::2;::::0;::::2;::::0;43268:4:::2;::::0;43274:6;;43282:7;;43244:46:::2;;8095:28:::0;;;;:::o;8444:36::-;;;-1:-1:-1;;;;;8444:36:0;;:::o;54055:101::-;8818:12;;-1:-1:-1;;;;;8818:12:0;8804:10;:26;;:51;;-1:-1:-1;8848:7:0;;-1:-1:-1;;;;;8848:7:0;8834:10;:21;8804:51;8796:87;;;;-1:-1:-1;;;8796:87:0;;;;;;;;;54123:17:::1;:25:::0;;-1:-1:-1;;54123:25:0::1;::::0;;54055:101::o;8230:41::-;;;;:::o;53314:112::-;8818:12;;-1:-1:-1;;;;;8818:12:0;8804:10;:26;;:51;;-1:-1:-1;8848:7:0;;-1:-1:-1;;;;;8848:7:0;8834:10;:21;8804:51;8796:87;;;;-1:-1:-1;;;8796:87:0;;;;;;;;;53387:23:::1;:31:::0;;-1:-1:-1;;;;53387:31:0::1;::::0;;53314:112::o;41033:127::-;41090:7;41117:35;41133:10;41145:6;41117:15;:35::i;8130:28::-;;;;:::o;29179:595::-;3247:7;;-1:-1:-1;;;;;3247:7:0;3233:10;:21;3225:43;;;;-1:-1:-1;;;3225:43:0;;;;;;;;;29271:12:::1;::::0;-1:-1:-1;;;;;29262:21:0;;::::1;29271:12:::0;::::1;29262:21;29258:219;;;29375:14;::::0;:26:::1;::::0;29394:6;29375:26:::1;:18;:26;:::i;:::-;29333:12;::::0;29326:45:::1;::::0;-1:-1:-1;;;29326:45:0;;-1:-1:-1;;;;;29333:12:0;;::::1;::::0;29326:30:::1;::::0;:45:::1;::::0;29365:4:::1;::::0;29326:45:::1;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:75;;29300:165;;;;-1:-1:-1::0;;;29300:165:0::1;;;;;;;;;29500:13;::::0;-1:-1:-1;;;;;29491:22:0;;::::1;29500:13:::0;::::1;29491:22;29487:223;;;29606:15;::::0;:27:::1;::::0;29626:6;29606:27:::1;:19;:27;:::i;:::-;29563:13;::::0;29556:46:::1;::::0;-1:-1:-1;;;29556:46:0;;-1:-1:-1;;;;;29563:13:0;;::::1;::::0;29556:31:::1;::::0;:46:::1;::::0;29596:4:::1;::::0;29556:46:::1;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:77;;29530:168;;;;-1:-1:-1::0;;;29530:168:0::1;;;;;;;;;29720:46;-1:-1:-1::0;;;;;29720:26:0;::::1;29747:10;29759:6:::0;29720:46:::1;:26;:46;:::i;41418:111::-:0;41464:7;41491:30;41510:10;41491:18;:30::i;7360:35::-;;;-1:-1:-1;;;7360:35:0;;;;;:::o;8556:43::-;;;;:::o;54164:97::-;3247:7;;-1:-1:-1;;;;;3247:7:0;3233:10;:21;3225:43;;;;-1:-1:-1;;;3225:43:0;;;;;;;;;8952:8:::1;::::0;-1:-1:-1;;;8952:8:0;::::1;;;8951:9;8943:33;;;;-1:-1:-1::0;;;8943:33:0::1;;;;;;;;;54229:17:::2;:24:::0;;-1:-1:-1;;54229:24:0::2;;;::::0;;54164:97::o;41301:109::-;41346:7;41373:29;41391:10;41373:17;:29::i;7964:28::-;;;-1:-1:-1;;;;;7964:28:0;;:::o;8402:35::-;;;-1:-1:-1;;;;;8402:35:0;;:::o;7443:27::-;;;-1:-1:-1;;;7443:27:0;;;;;:::o;32436:1489::-;30420:15;;32626:7;;-1:-1:-1;;;30420:15:0;;;;30412:45;;;;-1:-1:-1;;;30412:45:0;;;;;;;;;30529:16:::1;::::0;::::1;;30521:47;;;;-1:-1:-1::0;;;30521:47:0::1;;;;;;;;;30769:17:::2;;30754:11;:32;;30746:61;;;;-1:-1:-1::0;;;30746:61:0::2;;;;;;;;;6444:9:::3;::::0;-1:-1:-1;;;6444:9:0;::::3;;;6443:10;6435:32;;;;-1:-1:-1::0;;;6435:32:0::3;;;;;;;;;6490:4;6478:16:::0;;-1:-1:-1;;;;6478:16:0::3;-1:-1:-1::0;;;6478:16:0::3;::::0;;;;;;;;32891:26:::4;32910:6:::0;32891:18:::4;:26::i;:::-;32670:247;;;;;;;;;;;;32948:11;32936:8;:23;;32928:58;;;;-1:-1:-1::0;;;32928:58:0::4;;;;;;;;;33025:41;33047:10;33059:6;33025:21;:41::i;:::-;33081:15:::0;;33077:110:::4;;33113:62;::::0;-1:-1:-1;;;33113:62:0;;33125:10:::4;::::0;33113:32:::4;::::0;:62:::4;::::0;33146:4:::4;::::0;33152:6;;33160:8;;33170:4;;;;33113:62:::4;;;;;;;;;;;;;;;;;;;;;;::::0;::::4;;;;;;;;;;;;::::0;::::4;;;;;;;;;33077:110;33197:43;33219:10;33231:8;33197:21;:43::i;:::-;33255:14:::0;;33251:163:::4;;33308:12;::::0;33286:46:::4;::::0;-1:-1:-1;;;;;33308:12:0::4;33322:9:::0;33286:21:::4;:46::i;:::-;33372:12;::::0;33352:50:::4;::::0;-1:-1:-1;;;;;33372:12:0;;::::4;::::0;33352:50:::4;::::0;::::4;::::0;33372:12;;33392:9;;33352:50:::4;;;;;;;;;;33251:163;33487:14;33456:27;;:45;33452:122;;33518:27;:44:::0;;;33452:122:::4;33618:13;33588:26;;:43;33584:118;;33648:26;:42:::0;;;33584:118:::4;33730:10;33716:24;;;;;;;;:10;::::0;::::4;;:24;::::0;::::4;;;;;;;33712:80;;33757:10;:23:::0;;33770:10;;33757;-1:-1:-1;;33757:23:0::4;::::0;33770:10;33757:23:::4;::::0;::::4;;;;;;;;;;;33712:80;33804:27;33821:9;33804:16;:27::i;:::-;33860:10;-1:-1:-1::0;;;;;33847:42:0::4;;33872:6;33880:8;33847:42;;;;;;;;8327:29:::0;;;;:::o;8165:18::-;;;;:::o;26163:161::-;6444:9;;-1:-1:-1;;;6444:9:0;;;;6443:10;6435:32;;;;-1:-1:-1;;;6435:32:0;;;;;;;;;6490:4;6478:16;;-1:-1:-1;;;;6478:16:0;-1:-1:-1;;;6478:16:0;;;26241:40:::1;26262:10;26274:6:::0;26241:20:::1;:40::i;:::-;26292:24;26309:6;26292:16;:24::i;19544:816::-:0;19588:16;19618:18;19638:19;19661;:17;:19::i;:::-;19617:63;;-1:-1:-1;19617:63:0;-1:-1:-1;19709:23:0;19695:10;;;;:37;;;;;;;;;19691:662;;;19749:9;19761:137;19800:49;19833:15;;19800:28;19816:11;19800;:15;;:28;;;;:::i;:49::-;19868:15;;19761:20;:137::i;:::-;19749:149;;19917:53;19946:23;19962:3;;19967:1;19946:15;:23::i;:::-;19937:3;;19917:24;;5461:6;;19917:24;:19;:24;:::i;:::-;:28;:53;:28;:53;:::i;:::-;19913:57;;19992:41;20013:16;:14;:16::i;:::-;20031:1;19992:20;:41::i;:::-;19985:48;;;;;;;19691:662;20066:9;20078:133;20117:46;20148:14;;20117:26;20132:10;20117;:14;;:26;;;;:::i;:46::-;20182:14;;20078:20;:133::i;:::-;20066:145;;20230:53;20259:23;20275:3;;20280:1;20259:15;:23::i;20230:53::-;20226:57;;20305:36;20321:16;:14;:16::i;:::-;20339:1;20305:15;:36::i;50149:984::-;50218:15;50264:14;;50254:6;:24;;50246:65;;;;-1:-1:-1;;;50246:65:0;;;;;;;;;50340:23;50326:10;;;;:37;;;;;;;;;50322:804;;;50380:18;50401:48;50421:27;;50401:15;;:19;;:48;;;;:::i;:::-;50380:69;;50464:13;50480:16;:14;:16::i;:::-;50464:32;;50511:18;50532:39;50553:10;50565:5;50532:20;:39::i;:::-;50511:60;;50586:18;50607:140;50667:14;;50700:3;;50722:10;50607:41;:140::i;:::-;50586:161;;50816:30;50849:152;50909:26;50928:6;50909:14;;:18;;:26;;;;:::i;60420:1460::-;60742:13;;-1:-1:-1;;;60742:13:0;;;;60741:14;60733:43;;;;-1:-1:-1;;;60733:43:0;;;;;;;;;60803:4;60787:20;;-1:-1:-1;;;;60787:20:0;-1:-1:-1;;;60787:20:0;;;;60844:15;;-1:-1:-1;;;;;60844:15:0;;;-1:-1:-1;;;;;;60844:15:0;;;;;;;;;;60875:41;;60908:7;;;60787:20;60875:41;;60787:20;;60875:41;60929:12;:25;;-1:-1:-1;;;;;;60929:25:0;;;-1:-1:-1;;;;;60929:25:0;;;;;;;;;;60965:12;:25;;;;;;;;;;61001:12;:24;;;;;;;;;;;;61036:13;:26;;;;;;;;;;61073:8;:17;;;;;;;;;;;;-1:-1:-1;61103:30:0;;-1:-1:-1;;;;61186:23:0;;;61220:17;:33;;;61320:16;:23;;60929:25;-1:-1:-1;;61320:23:0;;;;;;-1:-1:-1;;61354:24:0;;;;;;;-1:-1:-1;;;61484:30:0;;;-1:-1:-1;61525:31:0;;;61569:13;:25;;;61605:13;:25;;;61641:3;:7;;;61659:10;:30;;;;;;;;61733:29;;-1:-1:-1;;61749:12:0;;;;;61733:29;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;61702:20:0;:61;;-1:-1:-1;;;;;;61702:61:0;-1:-1:-1;;;;;61702:61:0;;;;;;61822:13;;61806:30;;61822:13;;;61806:30;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;61774:21:0;:63;;-1:-1:-1;;;;;;61774:63:0;-1:-1:-1;;;;;61774:63:0;;;;;;;;;;61850:22;:20;:22::i;:::-;;60420:1460;;;;;;;;;;;:::o;52423:243::-;3247:7;;-1:-1:-1;;;;;3247:7:0;3233:10;:21;3225:43;;;;-1:-1:-1;;;3225:43:0;;;;;;;;;52518:60:::1;52542:13;;52557:20;52518:60;;;;;;;;;;;;;;;;52589:13;:36:::0;;;52636:22:::1;:20;:22::i;3342:224::-:0;3247:7;;-1:-1:-1;;;;;3247:7:0;3233:10;:21;3225:43;;;;-1:-1:-1;;;3225:43:0;;;;;;;;;-1:-1:-1;;;;;3425:22:0;::::1;3417:48;;;;-1:-1:-1::0;;;3417:48:0::1;;;;;;;;;3507:7;::::0;;3481:44:::1;::::0;-1:-1:-1;;;;;3481:44:0;;::::1;::::0;3507:7;::::1;::::0;3481:44:::1;::::0;::::1;3536:11;:22:::0;;-1:-1:-1;;;;;;3536:22:0::1;-1:-1:-1::0;;;;;3536:22:0;;;::::1;::::0;;;::::1;::::0;;3342:224::o;41168:125::-;41224:7;41251:34;41266:10;41278:6;41251:14;:34::i;9723:151::-;9830:21;;9817:49;;-1:-1:-1;;;9817:49:0;;9790:7;;-1:-1:-1;;;;;9830:21:0;;9817:45;;:49;;9863:2;;9817:49;;;;40769:125;40825:7;40852:34;40867:10;40879:6;40852:14;:34::i;18845:691::-;18959:15;;18997:14;;18895:18;;;;;19026:10;;;;:31;;;;;;;;;19022:507;;;19082:26;;19110:27;;19074:64;;;;;;;;19022:507;19174:23;19160:10;;;;:37;;;;;;;;;19156:373;;;19214:21;19238:18;:16;:18::i;:::-;19279:26;;19214:42;;-1:-1:-1;19307:20:0;:1;19214:42;19307:20;:5;:20;:::i;:::-;19271:57;;;;;;;;;19156:373;19364:23;19350:10;;;;:37;;;;;;;;;19346:183;;;19404:20;19427:18;:16;:18::i;:::-;19404:41;-1:-1:-1;19468:19:0;:1;19404:41;19468:19;:5;:19;:::i;:::-;19489:27;;19460:57;;;;;;;;;19346:183;18845:691;;;;;:::o;4682:137::-;4740:7;4773:1;4768;:6;;4760:28;;;;-1:-1:-1;;;4760:28:0;;;;;;;;;-1:-1:-1;4806:5:0;;;4682:137::o;48158:139::-;48248:21;;48235:54;;-1:-1:-1;;;48235:54:0;;-1:-1:-1;;;;;48248:21:0;;;;48235:40;;:54;;48276:4;;48282:6;;48235:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48158:139;;:::o;25528:190::-;25615:13;;25608:46;;-1:-1:-1;;;;;25615:13:0;25643:2;25647:6;25608:46;:34;:46;:::i;:::-;25683:15;;:27;;25703:6;25683:27;:19;:27;:::i;:::-;25665:15;:45;-1:-1:-1;;25528:190:0:o;25978:177::-;26071:27;;:39;;26103:6;26071:39;:31;:39;:::i;:::-;26041:27;:69;26126:21;;;;;;26133:6;;26141:5;;26126:21;;;;;;;;;;25978:177;:::o;5476:117::-;5539:7;5461:6;5566:13;:6;5577:1;5566:13;:10;:13;:::i;:::-;:19;;;;;;;5476:117;-1:-1:-1;;;5476:117:0:o;13630:580::-;13772:10;13830:12;13845:62;13865:37;13900:1;13865:30;13881:1;13884:10;13865:15;:30::i;:37::-;13904:2;13845:19;:62::i;:::-;13830:77;-1:-1:-1;13925:53:0;:46;5461:6;13925:25;13830:77;5461:6;13925:25;:8;:25;:::i;:46::-;:51;:53::i;:::-;13918:60;-1:-1:-1;13989:15:0;14007:56;14027:25;13918:60;5461:6;14027:25;:8;:25;:::i;:::-;14054:8;:1;14060;14054:8;:5;:8;:::i;:::-;14007:19;:56::i;:::-;13989:74;-1:-1:-1;14153:49:0;14169:2;14173:28;5461:6;13989:74;14173:28;:19;:28;:::i;:::-;14153:15;:49::i;:::-;14146:56;13630:580;-1:-1:-1;;;;;;13630:580:0:o;4827:161::-;4885:7;4917:5;;;4941:6;;;;4933:28;;;;-1:-1:-1;;;4933:28:0;;;;;;;;;4979:1;4827:161;-1:-1:-1;;;4827:161:0:o;4003:226::-;4061:7;4085:6;4081:47;;-1:-1:-1;4115:1:0;4108:8;;4081:47;4152:5;;;4156:1;4152;:5;:1;4176:5;;;;;:10;4168:32;;;;-1:-1:-1;;;4168:32:0;;;;;;;;4386:288;4448:7;4468:16;4487:9;4491:1;4494;4487:3;:9::i;:::-;4468:28;-1:-1:-1;4531:12:0;;;4527:16;;4558:13;;4554:113;;-1:-1:-1;4606:1:0;4595:12;;-1:-1:-1;4588:19:0;;4554:113;-1:-1:-1;4647:8:0;-1:-1:-1;4640:15:0;;37182:2359;37290:16;37321:17;37353;37385:24;37424:22;37461:21;37544:19;:17;:19::i;:::-;37510:53;;;;;;;;37636:38;37652:6;37660:13;;37636:15;:38::i;:::-;37624:50;;37697:38;37713:6;37721:13;;37697:15;:38::i;:::-;37685:50;-1:-1:-1;37746:21:0;37770:36;37685:50;37770:21;:6;37781:9;37770:21;:10;:21;:::i;:36::-;37746:60;-1:-1:-1;37837:17:0;37823:10;;;;:31;;;;;;;;;37819:1620;;;37910:47;37928:13;37943;37910:17;:47::i;:::-;37899:58;;37985:23;37972:36;;37819:1620;;;38044:23;38030:10;;;;:37;;;;;;;;;38026:1413;;;38123:65;38143:13;38158:14;;38174:13;38123:19;:65::i;38026:1413::-;38275:23;38261:10;;;;:37;;;;;;;;;38257:1182;;;38315:25;38343:35;38362:15;;38343:14;:18;;:35;;;;:::i;:::-;38315:63;;38393:28;38424:33;38443:13;38424:14;;:18;;:33;;;;:::i;:::-;38393:64;;38570:20;38554:13;:36;38550:878;;;38772:67;38792:13;38807:15;;38824:14;38772:19;:67::i;:::-;38761:78;;38871:23;38858:36;;38550:878;;;38937:20;38920:13;:37;38916:512;;;39043:17;39032:28;;39092:17;39079:30;;38916:512;;;39221:136;39265:73;39283:39;:13;39301:20;39283:39;:17;:39;:::i;:::-;39324:13;39265:17;:73::i;39221:136::-;39210:147;;39389:23;39376:36;;38916:512;38257:1182;;;-1:-1:-1;37182:2359:0;;;;;;;:::o;48013:137::-;48102:20;;48089:53;;-1:-1:-1;;;48089:53:0;;-1:-1:-1;;;;;48102:20:0;;;;48089:39;;:53;;48129:4;;48135:6;;48089:53;;;;25334:186;25420:12;;25413:45;;-1:-1:-1;;;;;25420:12:0;25447:2;25451:6;25413:45;:33;:45;:::i;:::-;25486:14;;:26;;25505:6;25486:26;:18;:26;:::i;:::-;25469:14;:43;-1:-1:-1;;25334:186:0:o;25797:173::-;25888:26;;:38;;25919:6;25888:38;:30;:38;:::i;:::-;25859:26;:67;25942:20;;;;;;25949:6;;25957:4;;25942:20;;4237:141;4295:7;4327:1;4323;:5;4315:32;;;;-1:-1:-1;;;4315:32:0;;;;;;;;;4369:1;4365;:5;;;;24973:353;25107:21;;25076:15;;:27;;25096:6;25076:27;:19;:27;:::i;:::-;:52;;25054:130;;;;-1:-1:-1;;;25054:130:0;;;;;;;;;25202:13;;25195:67;;-1:-1:-1;;;;;25202:13:0;25234:4;25248;25255:6;25195:67;:38;:67;:::i;:::-;25291:15;;:27;;25311:6;25291:27;:19;:27;:::i;9057:240::-;9112:7;5461:6;9140:3;;:21;9132:38;;;;-1:-1:-1;;;9132:38:0;;;;;;;;;9195:1;9189:3;;:7;9181:23;;;;-1:-1:-1;;;9181:23:0;;;;;;;;;5461:6;9223:32;9241:13;;9223;;:17;;:32;;;;:::i;:::-;:50;9215:74;;;;-1:-1:-1;;;9215:74:0;;;;;;;;47866:139;47956:21;;47943:54;;-1:-1:-1;;;47943:54:0;;-1:-1:-1;;;;;47956:21:0;;;;47943:40;;:54;;47984:4;;47990:6;;47943:54;;;;5737:125;5805:7;5832:22;5852:1;5832:15;:6;5461;5832:15;:10;:15;:::i;34371:2803::-;34480:20;34515:18;34548;34581:24;34620:22;34657:21;34740:19;:17;:19::i;:::-;34706:53;-1:-1:-1;34706:53:0;-1:-1:-1;34797:6:0;34772:22;34820:10;;;;:31;;;;;;;;;34816:2019;;;34945:50;34964:14;34980;34945:18;:50::i;:::-;34930:65;;35023:23;35010:36;;34816:2019;;;35082:23;35068:10;;;;:37;;;;;;;;;35064:1771;;;35122:24;35149:33;35167:14;;35149:13;:17;;:33;;;;:::i;:::-;35122:60;;35197:29;35229:35;35249:14;35229:15;;:19;;:35;;;;:::i;:::-;35197:67;;35393:16;35376:14;:33;35372:1202;;;35498:67;35519:14;35535;;35551:13;35498:20;:67::i;:::-;35483:82;;35597:23;35584:36;;35658:21;35643:12;:36;35639:390;;;35988:21;35973:36;;35639:390;35372:1202;;;36072:16;36054:14;:34;36050:524;;;36178:21;36163:36;;36231:17;36218:30;;36050:524;;;36364:139;36412:72;36431:36;:14;36450:16;36431:36;:18;:36;:::i;:::-;36469:14;36412:18;:72::i;36364:139::-;36349:154;;36535:23;36522:36;;36050:524;35064:1771;;;;;36703:69;36724:14;36740:15;;36757:14;36703:20;:69::i;:::-;36688:84;;36800:23;36787:36;;35064:1771;36883:44;36899:12;36913:13;;36883:15;:44::i;:::-;36870:57;;36951:44;36967:12;36981:13;;36951:15;:44::i;:::-;36938:57;-1:-1:-1;37021:44:0;36938:57;37021:28;:12;37038:10;37021:28;:16;:28;:::i;:::-;:32;:44;:32;:44;:::i;:::-;37006:59;-1:-1:-1;;34371:2803:0;;;;;;;:::o;24656:309::-;24774:20;;24744:14;;:26;;24763:6;24744:26;:18;:26;:::i;:::-;:50;;24736:90;;;;-1:-1:-1;;;24736:90:0;;;;;;;;;24844:12;;24837:66;;-1:-1:-1;;;;;24844:12:0;24875:4;24889;24896:6;24837:66;:37;:66;:::i;:::-;24931:14;;:26;;24950:6;24931:26;:18;:26;:::i;47721:137::-;47810:20;;47797:53;;-1:-1:-1;;;47797:53:0;;-1:-1:-1;;;;;47810:20:0;;;;47797:39;;:53;;47837:4;;47843:6;;47797:53;;;;21518:211;21635:86;21655:5;21685:23;;;21710:2;21714:5;21662:58;;;;;;;;;;;;;;-1:-1:-1;;21662:58:0;;;;;;;;;;;;;;-1:-1:-1;;;;;21662:58:0;-1:-1:-1;;;;;;21662:58:0;;;;;;;;;;21635:19;:86::i;:::-;21518:211;;;:::o;16710:589::-;16761:21;16903:17;16923:46;16942:26;;16923:14;;:18;;:46;;;;:::i;:::-;16903:66;;16980:13;16996:16;:14;:16::i;:::-;16980:32;;17023:18;17044:33;17060:9;17071:5;17044:15;:33::i;:::-;17023:54;;17088:22;17113:125;17169:15;;17199:3;;17217:10;17113:41;:125::i;:::-;17088:150;;17256:35;17275:15;;17256:14;:18;;:35;;;;:::i;:::-;17249:42;;;;;;16710:589;:::o;18191:593::-;18242:20;18383:18;18404:48;18424:27;;18404:15;;:19;;:48;;;;:::i;:::-;18383:69;;18463:13;18479:16;:14;:16::i;:::-;18463:32;;18506:18;18527:39;18548:10;18560:5;18527:20;:39::i;:::-;18506:60;;18577:21;18601:124;18657:14;;18686:3;;18704:10;18601:41;:124::i;:::-;18577:148;;18743:33;18761:14;;18743:13;:17;;:33;;;;:::i;5870:128::-;5937:7;5964:26;5988:1;5964:15;:6;5461;5964:15;:10;:15;:::i;4996:205::-;5078:1;5086;5082;5078:5;;:9;5114:80;5125:1;5121;:5;5114:80;;;5147:1;5143:5;;5181:1;5176;5172;5168;:5;;;;;;:9;5167:15;;;;;;5163:19;;5114:80;;;4996:205;;;;:::o;15109:423::-;15233:21;15289;15280:6;:30;15272:71;;;;-1:-1:-1;;;15272:71:0;;;;;;;;;15354:10;15367:33;:21;15393:6;15367:33;:25;:33;:::i;:::-;15354:46;;15427:66;15444:21;15467;15490:2;15427:16;:66::i;17355:368::-;17504:21;17555:11;17546:6;:20;17538:61;;;;-1:-1:-1;;;17538:61:0;;;;;;;;;17610:10;17623:23;:11;17639:6;17623:23;:15;:23;:::i;:::-;17610:36;;17664:51;17681:16;17699:11;17712:2;17664:16;:51::i;:::-;17657:58;17355:368;-1:-1:-1;;;;;17355:368:0:o;16072:630::-;16223:21;16412:9;16424:16;:14;:16::i;:::-;16412:28;;16451:10;16464:192;16519:17;16551:12;16578:30;16598:1;16601:6;16578:19;:30::i;:::-;16623:4;16642:3;;16464:40;:192::i;:::-;16451:205;-1:-1:-1;16674:20:0;16451:205;16681:12;16674:20;:6;:20;:::i;21737:285::-;21881:133;21915:5;21958:27;;;21987:4;21993:2;21997:5;21935:68;;;;;;;;;;;21881:133;21737:285;;;;:::o;14465:636::-;14591:25;14634:9;14646:16;:14;:16::i;:::-;14634:28;;14673:10;14686:204;14741:22;14778;14815:26;14831:1;14834:6;14815:15;:26::i;:::-;14856:5;14876:3;;14686:40;:204::i;:::-;14673:217;-1:-1:-1;15063:30:0;:22;14673:217;15063:30;:26;:30;:::i;17731:452::-;17881:25;;18083:23;:11;18099:6;18083:23;:15;:23;:::i;:::-;18070:36;;18124:51;18141:16;18159:2;18163:11;18124:16;:51::i;15588:476::-;15740:24;15777:9;15789:16;:14;:16::i;:::-;15777:28;;15816:10;15829:189;15884:17;15916:12;15943:26;15959:1;15962:6;15943:15;:26::i;15829:189::-;15816:202;-1:-1:-1;16036:20:0;:12;15816:202;16036:20;:16;:20;:::i;23091:1046::-;23751:12;23765:23;23800:5;-1:-1:-1;;;;;23792:19:0;23812:4;23792:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23750:67;;;;23836:7;23828:52;;;;-1:-1:-1;;;23828:52:0;;;;;;;;;23897:17;;:21;23893:237;;24052:10;24041:30;;;;;;;;;;;;;;24033:85;;;;-1:-1:-1;;;24033:85:0;;;;;;;;20368:239;20487:7;20507:9;20519:16;:14;:16::i;:::-;20507:28;;20553:46;20580:2;20584;20588;20592:1;20595:3;;20553:26;:46::i;5601:128::-;5668:7;5695:26;5461:6;5695:13;:6;5706:1;5695:13;:10;:13;:::i;11874:1553::-;12058:7;12160:14;12177:38;12212:2;12177:30;12204:2;12177:22;12193:1;12196:2;12177:15;:22::i;:38::-;12160:55;-1:-1:-1;12238:9:0;12250:43;12266:22;5461:6;12286:1;12266:22;:19;:22;:::i;:::-;12290:2;12250:15;:43::i;:::-;12238:55;-1:-1:-1;12332:4:0;12347:162;;;;12381:14;:1;12387:7;12381:14;:5;:14;:::i;:::-;12377:18;;12347:162;;;12457:19;:6;12468:7;12457:19;:10;:19;:::i;:::-;12448:28;;12347:162;12528:6;12523:1;:11;12519:174;;12555:13;:1;12561:6;12555:13;:5;:13;:::i;:::-;12551:17;;12595:4;12583:16;;12519:174;;;12636:13;:6;12647:1;12636:13;:10;:13;:::i;:::-;12632:17;;12676:5;12664:17;;12519:174;12732:18;12753:115;12783:29;12810:1;12783:22;5461:6;12803:1;12783:22;:19;:22;:::i;:29::-;12827:30;12854:2;12827:22;12843:1;12846:2;12827:15;:22::i;12753:115::-;12732:136;-1:-1:-1;12907:31:0;:24;12732:136;12907:8;12913:1;;12907:8;:5;:8;:::i;:31::-;12894:44;-1:-1:-1;12999:19:0;13021:29;13048:1;13021:22;5461:6;13041:1;13021:22;:19;:22;:::i;:29::-;12999:51;;13071:17;13103:9;13099:133;;;13141:17;:1;13147:10;13141:17;:5;:17;:::i;:::-;13129:29;;13099:133;;;13203:17;:10;13218:1;13203:17;:14;:17;:::i;:::-;13191:29;;13099:133;13248:9;13244:176;;;13281:44;13302:9;13313:11;13281:20;:44::i;:::-;13274:51;;;;;;;;;;13244:176;13365:43;13385:9;13396:11;13365:19;:43::i;10873:479::-;11033:7;;11074:30;11090:1;11093:10;:2;11100;11093:10;:6;:10;:::i;11074:30::-;11053:51;-1:-1:-1;11126:16:0;11145:43;11165:18;11180:2;11165:10;11172:2;;11165:10;:6;:10;:::i;:18::-;11185:2;11145:19;:43::i;:::-;11126:62;;11199:15;11217:28;11233:1;11236:8;11217:15;:28::i;:::-;11199:46;-1:-1:-1;11280:64:0;11296:10;11308:35;11199:46;11308:22;5461:6;11328:1;11308:22;:19;:22;:::i;11280:64::-;11273:71;10873:479;-1:-1:-1;;;;;;;;;10873:479:0:o;-1:-1:-1:-;;;;;;;;:::o;5:130::-;72:20;;-1:-1;;;;;37462:54;;38819:35;;38809:2;;38868:1;;38858:12;913:241;;1017:2;1005:9;996:7;992:23;988:32;985:2;;;-1:-1;;1023:12;985:2;1085:53;1130:7;1106:22;1085:53;;1161:1373;;;;;;;;;;;1418:3;1406:9;1397:7;1393:23;1389:33;1386:2;;;-1:-1;;1425:12;1386:2;1487:53;1532:7;1508:22;1487:53;;;1477:63;;1595:53;1640:7;1577:2;1620:9;1616:22;1595:53;;;1585:63;;1703:53;1748:7;1685:2;1728:9;1724:22;1703:53;;;1693:63;;1811:53;1856:7;1793:2;1836:9;1832:22;1811:53;;;1801:63;;1920:53;1965:7;1901:3;1945:9;1941:22;1920:53;;;1910:63;;2029:53;2074:7;2010:3;2054:9;2050:22;2029:53;;;2019:63;;2119:3;2163:9;2159:22;702:20;2128:63;;2228:3;2272:9;2268:22;702:20;2237:63;;2337:3;2381:9;2377:22;702:20;2346:63;;2446:3;2490:9;2486:22;702:20;2455:63;;1380:1154;;;;;;;;;;;;;;2541:366;;;2662:2;2650:9;2641:7;2637:23;2633:32;2630:2;;;-1:-1;;2668:12;2630:2;2730:53;2775:7;2751:22;2730:53;;;2720:63;2820:2;2859:22;;;;702:20;;-1:-1;;;2624:283;2914:257;;3026:2;3014:9;3005:7;3001:23;2997:32;2994:2;;;-1:-1;;3032:12;2994:2;223:6;217:13;38965:5;37243:13;37236:21;38943:5;38940:32;38930:2;;-1:-1;;38976:12;3178:241;;3282:2;3270:9;3261:7;3257:23;3253:32;3250:2;;;-1:-1;;3288:12;3250:2;-1:-1;702:20;;3244:175;-1:-1;3244:175;3426:263;;3541:2;3529:9;3520:7;3516:23;3512:32;3509:2;;;-1:-1;;3547:12;3509:2;-1:-1;850:13;;3503:186;-1:-1;3503:186;3696:615;;;;;3853:2;3841:9;3832:7;3828:23;3824:32;3821:2;;;-1:-1;;3859:12;3821:2;715:6;702:20;3911:63;;4011:2;4054:9;4050:22;702:20;4019:63;;4147:2;4136:9;4132:18;4119:32;4171:18;;4163:6;4160:30;4157:2;;;-1:-1;;4193:12;4157:2;4278:6;4267:9;4263:22;405:3;398:4;390:6;386:17;382:27;372:2;;-1:-1;;413:12;372:2;456:6;443:20;433:30;;4171:18;475:6;472:30;469:2;;;-1:-1;;505:12;469:2;600:3;4011:2;580:17;541:6;566:32;;563:41;560:2;;;-1:-1;;607:12;560:2;3815:496;;;;-1:-1;;4011:2;537:17;;;;-1:-1;;;3815:496;17217:271;;5186:5;36542:12;-1:-1;38344:101;38358:6;38355:1;38352:13;38344:101;;;5330:4;38425:11;;;;;38419:18;38406:11;;;38399:39;38373:10;38344:101;;;38460:6;38457:1;38454:13;38451:2;;;-1:-1;38516:6;38511:3;38507:16;38500:27;38451:2;-1:-1;5361:16;;;;;17351:137;-1:-1;;17351:137;17495:222;-1:-1;;;;;37462:54;;;;4538:37;;17622:2;17607:18;;17593:124;17724:349;-1:-1;;;;;37462:54;;;;4397:58;;18059:2;18044:18;;17168:37;17887:2;17872:18;;17858:215;18080:444;-1:-1;;;;;37462:54;;;4538:37;;37462:54;;;;18427:2;18412:18;;4538:37;18510:2;18495:18;;17168:37;;;;18263:2;18248:18;;18234:290;18871:210;37243:13;;37236:21;4652:34;;18992:2;18977:18;;18963:118;19088:321;37243:13;;37236:21;4652:34;;19395:2;19380:18;;17168:37;19237:2;19222:18;;19208:201;19416:432;37243:13;;37236:21;4652:34;;19751:2;19736:18;;17168:37;;;;19834:2;19819:18;;17168:37;19593:2;19578:18;;19564:284;19855:648;;4679:5;37243:13;37236:21;4659:3;4652:34;17198:5;20247:2;20236:9;20232:18;17168:37;17198:5;20330:2;20319:9;20315:18;17168:37;20088:3;20367:2;20356:9;20352:18;20345:48;36698:6;20088:3;20077:9;20073:19;36686;38199:6;38194:3;36726:14;20077:9;36726:14;38176:30;38237:16;;;36726:14;38237:16;;;38230:27;;;;38632:7;38616:14;;;-1:-1;;38612:28;4973:39;;;20059:444;-1:-1;;;;20059:444;20510:236;20644:2;20629:18;;38731:1;38721:12;;38711:2;;38737:9;38711:2;5467:57;;;20615:131;;20753:416;20953:2;20967:47;;;5761:2;20938:18;;;36686:19;5797:31;36726:14;;;5777:52;5848:12;;;20924:245;21176:416;21376:2;21390:47;;;6099:1;21361:18;;;36686:19;-1:-1;;;36726:14;;;6114:26;6159:12;;;21347:245;21599:416;21799:2;21813:47;;;6410:2;21784:18;;;36686:19;-1:-1;;;36726:14;;;6426:36;6481:12;;;21770:245;22022:416;22222:2;22236:47;;;6732:2;22207:18;;;36686:19;-1:-1;;;36726:14;;;6748:33;6800:12;;;22193:245;22445:416;22645:2;22659:47;;;7051:2;22630:18;;;36686:19;7087:26;36726:14;;;7067:47;7133:12;;;22616:245;22868:416;23068:2;23082:47;;;7384:2;23053:18;;;36686:19;7420:27;36726:14;;;7400:48;7467:12;;;23039:245;23291:416;23491:2;23505:47;;;7718:1;23476:18;;;36686:19;-1:-1;;;36726:14;;;7733:32;7784:12;;;23462:245;23714:416;23914:2;23928:47;;;8035:2;23899:18;;;36686:19;-1:-1;;;36726:14;;;8051:34;8104:12;;;23885:245;24137:416;24337:2;24351:47;;;8355:2;24322:18;;;36686:19;8391:30;36726:14;;;8371:51;8441:12;;;24308:245;24560:416;24760:2;24774:47;;;24745:18;;;36686:19;8728:34;36726:14;;;8708:55;8782:12;;;24731:245;24983:416;25183:2;25197:47;;;9033:2;25168:18;;;36686:19;-1:-1;;;36726:14;;;9049:37;9105:12;;;25154:245;25406:416;25606:2;25620:47;;;9356:2;25591:18;;;36686:19;9392:34;36726:14;;;9372:55;-1:-1;;;9447:12;;;9440:27;9486:12;;;25577:245;25829:416;26029:2;26043:47;;;9737:2;26014:18;;;36686:19;9773:25;36726:14;;;9753:46;9818:12;;;26000:245;26252:416;26452:2;26466:47;;;10069:2;26437:18;;;36686:19;10105:29;36726:14;;;10085:50;10154:12;;;26423:245;26675:416;26875:2;26889:47;;;10405:1;26860:18;;;36686:19;-1:-1;;;36726:14;;;10420:32;10471:12;;;26846:245;27098:416;27298:2;27312:47;;;10722:2;27283:18;;;36686:19;-1:-1;;;36726:14;;;10738:39;10796:12;;;27269:245;27521:416;27721:2;27735:47;;;11047:2;27706:18;;;36686:19;11083:30;36726:14;;;11063:51;11133:12;;;27692:245;27944:416;28144:2;28158:47;;;11384:2;28129:18;;;36686:19;-1:-1;;;36726:14;;;11400:40;11459:12;;;28115:245;28367:416;28567:2;28581:47;;;11710:2;28552:18;;;36686:19;-1:-1;;;36726:14;;;11726:36;11781:12;;;28538:245;28790:416;28990:2;29004:47;;;12032:2;28975:18;;;36686:19;-1:-1;;;36726:14;;;12048:37;12104:12;;;28961:245;29213:416;29413:2;29427:47;;;12355:2;29398:18;;;36686:19;-1:-1;;;36726:14;;;12371:34;12424:12;;;29384:245;29636:416;29836:2;29850:47;;;12675:2;29821:18;;;36686:19;-1:-1;;;36726:14;;;12691:42;12752:12;;;29807:245;30059:416;30259:2;30273:47;;;13003:2;30244:18;;;36686:19;-1:-1;;;36726:14;;;13019:34;13072:12;;;30230:245;30482:416;30682:2;30696:47;;;13323:1;30667:18;;;36686:19;-1:-1;;;36726:14;;;13338:32;13389:12;;;30653:245;30905:416;31105:2;31119:47;;;13640:1;31090:18;;;36686:19;-1:-1;;;36726:14;;;13655:32;13706:12;;;31076:245;31328:416;31528:2;31542:47;;;13957:2;31513:18;;;36686:19;13993:34;36726:14;;;13973:55;-1:-1;;;14048:12;;;14041:34;14094:12;;;31499:245;31751:416;31951:2;31965:47;;;14345:2;31936:18;;;36686:19;14381:34;36726:14;;;14361:55;-1:-1;;;14436:12;;;14429:26;14474:12;;;31922:245;32174:416;32374:2;32388:47;;;14725:2;32359:18;;;36686:19;14761:30;36726:14;;;14741:51;14811:12;;;32345:245;32597:416;32797:2;32811:47;;;15062:2;32782:18;;;36686:19;-1:-1;;;36726:14;;;15078:45;15142:12;;;32768:245;33020:416;33220:2;33234:47;;;15393:1;33205:18;;;36686:19;-1:-1;;;36726:14;;;15408:32;15459:12;;;33191:245;33443:416;33643:2;33657:47;;;15710:1;33628:18;;;36686:19;-1:-1;;;36726:14;;;15725:27;15771:12;;;33614:245;33866:416;34066:2;34080:47;;;16022:2;34051:18;;;36686:19;-1:-1;;;36726:14;;;16038:39;16096:12;;;34037:245;34289:416;34489:2;34503:47;;;16347:2;34474:18;;;36686:19;-1:-1;;;36726:14;;;16363:38;16420:12;;;34460:245;34712:416;34912:2;34926:47;;;16671:2;34897:18;;;36686:19;-1:-1;;;36726:14;;;16687:38;16744:12;;;34883:245;35135:416;35335:2;35349:47;;;16995:2;35320:18;;;36686:19;-1:-1;;;36726:14;;;17011:41;17071:12;;;35306:245;35558:222;17168:37;;;35685:2;35670:18;;35656:124;35787:321;17168:37;;;37243:13;37236:21;36094:2;36079:18;;4652:34;35936:2;35921:18;;35907:201;36115:333;17168:37;;;36434:2;36419:18;;17168:37;36270:2;36255:18;;36241:207

Metadata Hash

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