Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
Latest 1 from a total of 1 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
0x60806040 | 10613573 | 1517 days ago | IN | 0 ETH | 0.30679688 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
DODO
Compiler Version
v0.6.9+commit.3e3065ac
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2020-08-07 */ /* 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 // This is a file copied from https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC20/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 /* Copyright 2020 DODO ZOO. */ /** * @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 /* Copyright 2020 DODO ZOO. */ /** * @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 /* Copyright 2020 DODO ZOO. */ /** * @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 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 /* Copyright 2020 DODO ZOO. */ /** * @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 /* Copyright 2020 DODO ZOO. */ interface IOracle { function getPrice() external view returns (uint256); } // File: contracts/intf/IDODOLpToken.sol /* Copyright 2020 DODO ZOO. */ 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 /* Copyright 2020 DODO ZOO. */ /** * @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_; // ============ 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 100; // 1.0.0 } } // File: contracts/intf/IDODOCallee.sol /* Copyright 2020 DODO ZOO. */ interface IDODOCallee { function dodoCall( bool isBuyBaseToken, uint256 baseAmount, uint256 quoteAmount, bytes calldata data ) external; } // File: contracts/lib/DODOMath.sol /* Copyright 2020 DODO ZOO. */ /** * @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 /* Copyright 2020 DODO ZOO. */ /** * @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.mul(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 /* Copyright 2020 DODO ZOO. This is a simplified version of OpenZepplin's SafeERC20 library */ /** * @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) ); } /** * @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 /* Copyright 2020 DODO ZOO. */ /** * @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 { IERC20(_BASE_TOKEN_).safeTransferFrom(from, address(this), amount); _BASE_BALANCE_ = _BASE_BALANCE_.add(amount); } function _quoteTokenTransferIn(address from, uint256 amount) internal { 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 quoteAmount = DecimalMath.mul( getBaseCapitalBalanceOf(msg.sender), _BASE_CAPITAL_RECEIVE_QUOTE_ ); uint256 baseAmount = DecimalMath.mul( getQuoteCapitalBalanceOf(msg.sender), _QUOTE_CAPITAL_RECEIVE_BASE_ ); _baseTokenTransferOut(msg.sender, baseAmount); _quoteTokenTransferOut(msg.sender, quoteAmount); 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 /* Copyright 2020 DODO ZOO. */ /** * @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 gasPriceLimit() { require(tx.gasprice <= _GAS_PRICE_LIMIT_, "GAS_PRICE_EXCEED"); _; } // ============ Trade Functions ============ function sellBaseToken( uint256 amount, uint256 minReceiveQuote, bytes calldata data ) external tradeAllowed 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 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 /* Copyright 2020 DODO ZOO. */ /** * @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"); _; } // ============ 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 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 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 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 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 /* Copyright 2020 DODO ZOO. */ /** * @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; } } // File: contracts/lib/Ownable.sol /* Copyright 2020 DODO ZOO. */ /** * @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 /* Copyright 2020 DODO ZOO. */ /** * @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 /* Copyright 2020 DODO ZOO. */ /** * @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_ = true; _DEPOSIT_QUOTE_ALLOWED_ = true; _TRADE_ALLOWED_ = true; _GAS_PRICE_LIMIT_ = gasPriceLimit; _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 Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"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_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":[{"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_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":"_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":"disableQuoteDeposit","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":"enableQuoteDeposit","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":"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":"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"}]
Contract Creation Code
608060405234801561001057600080fd5b506154aa806100206000396000f3fe60806040523480156200001157600080fd5b5060043610620004a85760003560e01c80637c9b8e89116200026d578063c5bbffe81162000159578063ed0aa42811620000d5578063f2fde38b1162000093578063f2fde38b146200091f578063f3ae6c5f1462000936578063f67ed448146200094d578063f98bea151462000964578063ffa64225146200097b57620004a8565b8063ed0aa42814620008b9578063ee27c68914620008d0578063ee5150b314620008da578063f00f9a0914620008f1578063f2220416146200090857620004a8565b8063d689107c1162000123578063d689107c146200087a578063dd58b41c1462000884578063e67ce706146200088e578063eab5d20e14620008a5578063ec2fd46d14620008af57620004a8565b8063c5bbffe81462000852578063c6b73cf9146200085c578063d47eaa371462000866578063d4b97046146200087057620004a8565b8063aa06ce9b11620001e9578063bc7d679d11620001b3578063bc7d679d1462000806578063c0a5f6ff1462000810578063c0ffa1781462000827578063c3a2a6651462000831578063c59203af146200084857620004a8565b8063aa06ce9b14620007d1578063ab44a7a314620007e8578063ac1fbc9814620007f2578063b2094fd314620007fc57620004a8565b80639299eb3011620002375780639299eb30146200076b578063947cf92b146200078257806395faa5f61462000799578063a2801e1614620007b0578063a598aca714620007c757620004a8565b80637c9b8e8914620007365780638456db1514620007405780638a8c523c146200074a5780638dae7333146200075457620004a8565b806336a53bbb11620003995780635bb7552a11620003155780636ec6a58d11620002d35780636ec6a58d14620006ea57806373a2ab7c14620006f4578063796da7af14620006fe5780637adbf97314620007085780637aed942d146200071f57620004a8565b80635bb7552a14620006755780635f179f64146200068c578063648a4fac14620006a357806367de8be914620006ad57806368be20ad14620006c457620004a8565b80634322ec8311620003635780634322ec8314620006435780634a248d2a146200064d5780634de4527e14620006575780634e71e0c8146200066157806354fd4d50146200066b57620004a8565b806336a53bbb146200060157806336ac41a81462000618578063387b0c1114620006225780633960f142146200063957620004a8565b806316048bc411620004295780631e34b9cc11620003f35780631e34b9cc14620005b55780631f3c156e14620005cc578063245c968514620005d657806327bed8ee14620005e05780632aa82c6514620005f757620004a8565b806316048bc4146200056257806317700f01146200057b57806317be952e146200058557806318c0bbe4146200059e57620004a8565b80630e6518e911620004775780630e6518e91462000516578063108db74414620005205780631184d8be146200053757806313c57624146200054157806313ea5d29146200054b57620004a8565b806304512dc414620004ad5780630923160214620004dc5780630c9f7bd014620004f55780630cd1667d146200050c575b600080fd5b620004c4620004be36600462003b8a565b62000995565b604051620004d39190620043e0565b60405180910390f35b620004f3620004ed36600462003ca7565b62000b1b565b005b620004c46200050636600462003ca7565b62000ba0565b620004c462000c95565b620004c462000d1c565b620004c46200053136600462003c58565b62000d22565b620004f362000f19565b620004f362000f88565b620004f36200055c36600462003b8a565b62000fda565b6200056c62001029565b604051620004d3919062003d97565b620004f362001038565b6200058f6200108a565b604051620004d3919062003e61565b620004c4620005af36600462003ca7565b62001093565b620004c4620005c636600462003b8a565b620010ac565b620004f3620011f9565b620004c462001357565b620004c4620005f136600462003ca7565b6200135d565b620004c462001371565b620004c46200061236600462003b8a565b620013b7565b620004f36200141e565b620004f36200063336600462003ca7565b6200148d565b6200056c620014f4565b6200056c62001503565b6200056c62001512565b620004c462001521565b620004f362001527565b620004c4620015b8565b620004f36200068636600462003ca7565b620015bd565b620004c46200069d36600462003c58565b6200163a565b620004f362001799565b620004f3620006be36600462003ca7565b620018c9565b620006db620006d536600462003b8a565b62001942565b604051620004d3919062003de8565b620006db62001957565b6200056c62001967565b620004c462001976565b620004f36200071936600462003b8a565b620019bc565b620004c46200073036600462003b8a565b62001a0b565b620004c462001a92565b6200056c62001a98565b620004f362001aa7565b620004c46200076536600462003cd9565b62001b16565b620004f36200077c36600462003b8a565b62001daa565b620004c46200079336600462003c58565b62001df9565b620004c4620007aa36600462003b8a565b62001fb2565b620004c4620007c136600462003ca7565b62001ff7565b620006db62002004565b620004c4620007e236600462003c58565b62002014565b620004c462002155565b6200056c6200215b565b620004c46200216a565b620004f362002170565b620004c46200082136600462003ca7565b620021c2565b620004c4620021d0565b620004f36200084236600462003c58565b620021d6565b620004c4620023c5565b620006db620023d2565b620004c4620023e2565b620004c4620023e8565b6200056c620023f5565b6200056c62002404565b620006db62002413565b620004c46200089f36600462003cd9565b62002423565b620004c462002693565b620004c462002699565b620004f3620008ca36600462003ca7565b6200269f565b620004c4620026f6565b620004c4620008eb36600462003ca7565b62002807565b620004f36200090236600462003ba8565b620028b6565b620004f36200091936600462003ca7565b62002ab8565b620004f36200093036600462003b8a565b62002b31565b620004c46200094736600462003ca7565b62002be2565b620004c46200095e36600462003b8a565b62002bf0565b620004c46200097536600462003ca7565b62002c23565b6200098562002c31565b604051620004d3929190620043f9565b600154600090600160a01b900460ff1615620009ce5760405162461bcd60e51b8152600401620009c59062003f83565b60405180910390fd5b6001805460ff60a01b1916600160a01b1790556000620009ee33620013b7565b90506000620009fd3362002bf0565b9050600062000a0c8362000ba0565b90508281111562000a315760405162461bcd60e51b8152600401620009c59062004178565b600d5462000a46908463ffffffff62002d0616565b600d5562000a55338362002d31565b62000a728562000a6c858463ffffffff62002d0616565b62002d9d565b62000a7d8162002dd8565b846001600160a01b0316336001600160a01b0316600080516020620054358339815191526000868660405162000ab69392919062003e03565b60405180910390a3336001600160a01b03166000805160206200545583398151915260008360405162000aeb92919062003df3565b60405180910390a262000b05838263ffffffff62002d0616565b6001805460ff60a01b1916905595945050505050565b6003546001600160a01b031633148062000b3f57506000546001600160a01b031633145b62000b5e5760405162461bcd60e51b8152600401620009c5906200406b565b7f808f99cfd15f1be6019f93dc76c81d5bd82e0b3e0b3d23a54f5a2e647a6cc3cc6002548260405162000b93929190620043f9565b60405180910390a1600255565b6000600f5482111562000bc75760405162461bcd60e51b8152600401620009c59062003e76565b6002600b5460ff16600281111562000bdb57fe5b141562000c8c57600062000bfd600c54600e5462002d0690919063ffffffff16565b9050600062000c0b62001976565b9050600062000c1b838362002e30565b9050600062000c30600f54600a548462002e5d565b9050600062000c5962000c4f88600f5462002d0690919063ffffffff16565b600a548562002e5d565b905062000c7f62000c71828963ffffffff62002f1416565b839063ffffffff62002d0616565b9550505050505062000c90565b5060005b919050565b601054604080516318160ddd60e01b815290516000926001600160a01b0316916318160ddd916004808301926020929190829003018186803b15801562000cdb57600080fd5b505afa15801562000cf0573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000d16919062003cc0565b90505b90565b60135481565b600154600090600160a01b900460ff161562000d525760405162461bcd60e51b8152600401620009c59062003f83565b6001805460ff60a01b1916600160a01b179055600062000d7162002c31565b915050600062000d8062001371565b90506000811162000da55760405162461bcd60e51b8152600401620009c59062003fa6565b600062000dcb8362000dbe878563ffffffff62002f4316565b9063ffffffff62002f8316565b905062000dd83362002bf0565b81111562000dfa5760405162461bcd60e51b8152600401620009c59062004028565b600062000e078662000ba0565b905085811062000e2b5760405162461bcd60e51b8152600401620009c59062004178565b600d5462000e40908763ffffffff62002d0616565b600d5562000e4f338362002d31565b62000e668762000a6c888463ffffffff62002d0616565b62000e718162002dd8565b6001600160a01b0387163360008051602062005435833981519152600062000ea08a8663ffffffff62002d0616565b8660405162000eb29392919062003e03565b60405180910390a3336001600160a01b03166000805160206200545583398151915260008360405162000ee792919062003df3565b60405180910390a262000f01868263ffffffff62002d0616565b6001805460ff60a01b19169055979650505050505050565b6000546001600160a01b0316331462000f465760405162461bcd60e51b8152600401620009c590620041ea565b600154600160b01b900460ff161562000f735760405162461bcd60e51b8152600401620009c590620041a0565b6001805460ff60c01b1916600160c01b179055565b6003546001600160a01b031633148062000fac57506000546001600160a01b031633145b62000fcb5760405162461bcd60e51b8152600401620009c5906200406b565b6001805460ff60c01b19169055565b6000546001600160a01b03163314620010075760405162461bcd60e51b8152600401620009c590620041ea565b600480546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b031681565b6003546001600160a01b03163314806200105c57506000546001600160a01b031633145b6200107b5760405162461bcd60e51b8152600401620009c5906200406b565b6001805460ff60c81b19169055565b600b5460ff1681565b6000620010a08262002fb5565b50939695505050505050565b600154600090600160a01b900460ff1615620010dc5760405162461bcd60e51b8152600401620009c59062003f83565b6001805460ff60a01b1916600160a01b1790556000620010fc3362001fb2565b905060006200110b3362001a0b565b905060006200111a8362002807565b9050828111156200113f5760405162461bcd60e51b8152600401620009c59062004178565b600c5462001154908463ffffffff62002d0616565b600c5562001163338362003136565b62001180856200117a858463ffffffff62002d0616565b6200316a565b6200118b81620031a5565b846001600160a01b0316336001600160a01b03166000805160206200543583398151915260018686604051620011c49392919062003e03565b60405180910390a3336001600160a01b03166000805160206200545583398151915260018360405162000aeb92919062003df3565b600154600160a01b900460ff1615620012265760405162461bcd60e51b8152600401620009c59062003f83565b6001805460ff60a01b1916600160a01b1790819055600160b01b900460ff16620012645760405162461bcd60e51b8152600401620009c590620043b7565b3360009081526014602052604090205460ff1615620012975760405162461bcd60e51b8152600401620009c5906200438e565b336000818152601460205260408120805460ff1916600117905590620012cb90620012c29062001a0b565b60125462002e30565b90506000620012e7620012de3362002bf0565b60135462002e30565b9050620012f533826200316a565b62001301338362002d9d565b336001600160a01b03167fbe5f7fe66d16c6a87bb5b8b08a96634fe4f1c2bac9e5e413efe41a782d4d0c4382846040516200133e929190620043f9565b60405180910390a250506001805460ff60a01b19169055565b600d5481565b60006200136b338362002014565b92915050565b601154604080516318160ddd60e01b815290516000926001600160a01b0316916318160ddd916004808301926020929190829003018186803b15801562000cdb57600080fd5b600080620013c462001371565b90506000620013d262002c31565b91505081620013e75760009250505062000c90565b62001416826200140983620013fc8862002bf0565b9063ffffffff62002f4316565b9063ffffffff620031f216565b949350505050565b6000546001600160a01b031633146200144b5760405162461bcd60e51b8152600401620009c590620041ea565b600154600160b01b900460ff1615620014785760405162461bcd60e51b8152600401620009c590620041a0565b6001805460ff60b81b1916600160b81b179055565b600154600160a01b900460ff1615620014ba5760405162461bcd60e51b8152600401620009c59062003f83565b6001805460ff60a01b1916600160a01b179055620014d9338262003220565b620014e48162002dd8565b506001805460ff60a01b19169055565b6003546001600160a01b031681565b6004546001600160a01b031681565b6005546001600160a01b031681565b60025481565b6001546001600160a01b03163314620015545760405162461bcd60e51b8152600401620009c59062003eca565b600154600080546040516001600160a01b0393841693909116917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a360018054600080546001600160a01b03199081166001600160a01b03841617909155169055565b606490565b6000546001600160a01b03163314620015ea5760405162461bcd60e51b8152600401620009c590620041ea565b7f3ce6ea91adda496b7a0546fa6558e5b52c3a509de6015820efb00ca4020e0a07600854826040516200161f929190620043f9565b60405180910390a160088190556200163662003255565b5050565b600154600090600160a01b900460ff16156200166a5760405162461bcd60e51b8152600401620009c59062003f83565b6001805460ff60a01b1916600160a01b1790819055600160b81b900460ff16620016a85760405162461bcd60e51b8152600401620009c59062003f4c565b6000620016b462002c31565b9150506000620016c362001371565b90508381620016e657620016de858463ffffffff62002f1416565b905062001707565b82156200170757620017048362001409878563ffffffff62002f4316565b90505b62001713338662003220565b6200171f8682620032ea565b600d5462001734908663ffffffff62002f1416565b600d556040516001600160a01b0387169033907f18081cde2fa64894914e1080b98cca17bb6d1acf633e57f6e26ebdb945ad830b906200177b906000908a90879062003e03565b60405180910390a36001805460ff60a01b1916905595945050505050565b6000546001600160a01b03163314620017c65760405162461bcd60e51b8152600401620009c590620041ea565b600154600160b01b900460ff1615620017f35760405162461bcd60e51b8152600401620009c590620041a0565b6001805462ffffff60b81b1960ff60b01b19909116600160b01b1716905560006200181d62000c95565b905060006200182b62001371565b9050600d54600f5411156200186d57600062001855600d54600f5462002d0690919063ffffffff16565b90506200186381846200331e565b6012555062001874565b600f54600d555b600c54600e541115620018b45760006200189c600c54600e5462002d0690919063ffffffff16565b9050620018aa81836200331e565b60135550620018bb565b600e54600c555b5050600b805460ff19169055565b6000546001600160a01b03163314620018f65760405162461bcd60e51b8152600401620009c590620041ea565b7f023a40bebf7ac113f81c3d628073246cf9e0bc49980a9d6a9531498ce9e3dd1c600a54826040516200192b929190620043f9565b60405180910390a1600a8190556200163662003255565b60146020526000908152604090205460ff1681565b600154600160b01b900460ff1681565b6007546001600160a01b031681565b60075460408051634c6afee560e11b815290516000926001600160a01b0316916398d5fdca916004808301926020929190829003018186803b15801562000cdb57600080fd5b6000546001600160a01b03163314620019e95760405162461bcd60e51b8152600401620009c590620041ea565b600780546001600160a01b0319166001600160a01b0392909216919091179055565b6010546040516370a0823160e01b81526000916001600160a01b0316906370a082319062001a3e90859060040162003d97565b60206040518083038186803b15801562001a5757600080fd5b505afa15801562001a6c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200136b919062003cc0565b600f5481565b6001546001600160a01b031681565b6000546001600160a01b0316331462001ad45760405162461bcd60e51b8152600401620009c590620041ea565b600154600160b01b900460ff161562001b015760405162461bcd60e51b8152600401620009c590620041a0565b6001805460ff60c81b1916600160c81b179055565b600154600090600160c81b900460ff1662001b455760405162461bcd60e51b8152600401620009c59062004126565b6002543a111562001b6a5760405162461bcd60e51b8152600401620009c59062004364565b600154600160a01b900460ff161562001b975760405162461bcd60e51b8152600401620009c59062003f83565b6001805460ff60a01b1916600160a01b1790556000808080808062001bbc8b6200333f565b9550955095509550955095508986101562001beb5760405162461bcd60e51b8152600401620009c590620042bc565b62001bf7338762002d9d565b871562001c615760405163301bc67560e11b815233906360378cea9062001c2c906000908f908b908f908f9060040162003e1b565b600060405180830381600087803b15801562001c4757600080fd5b505af115801562001c5c573d6000803e3d6000fd5b505050505b62001c6d338c620034c6565b831562001cd95760045462001c8c906001600160a01b03168562002d9d565b6004546040516001600160a01b03909116907fe4fed5362e2669c70e5da5a18942d1e617d8917f6adc0164d9668bd3a6d0cebe9062001cd090600090889062003df3565b60405180910390a25b81600d541462001ce957600d8290555b80600c541462001cf957600c8190555b82600281111562001d0657fe5b600b5460ff16600281111562001d1857fe5b1462001d3e57600b805484919060ff1916600183600281111562001d3857fe5b02179055505b62001d498562002dd8565b336001600160a01b03167fd8648b6ac54162763c86fd54bf2005af8ecd2f9cb273a5775921fd7f91e17b2d8c8860405162001d86929190620043f9565b60405180910390a250506001805460ff60a01b191690555091979650505050505050565b6000546001600160a01b0316331462001dd75760405162461bcd60e51b8152600401620009c590620041ea565b600380546001600160a01b0319166001600160a01b0392909216919091179055565b600154600090600160a01b900460ff161562001e295760405162461bcd60e51b8152600401620009c59062003f83565b6001805460ff60a01b1916600160a01b179055600062001e4862002c31565b509050600062001e5762000c95565b90506000811162001e7c5760405162461bcd60e51b8152600401620009c59062003ef1565b600062001e958362000dbe878563ffffffff62002f4316565b905062001ea23362001a0b565b81111562001ec45760405162461bcd60e51b8152600401620009c5906200427a565b600062001ed18662002807565b90508581111562001ef65760405162461bcd60e51b8152600401620009c59062004178565b600c5462001f0b908763ffffffff62002d0616565b600c5562001f1a338362003136565b62001f31876200117a888463ffffffff62002d0616565b62001f3c81620031a5565b6001600160a01b0387163360008051602062005435833981519152600162001f6b8a8663ffffffff62002d0616565b8660405162001f7d9392919062003e03565b60405180910390a3336001600160a01b03166000805160206200545583398151915260018360405162000ee792919062003df3565b60008062001fbf62000c95565b9050600062001fcd62002c31565b5090508162001fe25760009250505062000c90565b62001416826200140983620013fc8862001a0b565b6000620010a0826200333f565b600154600160c01b900460ff1681565b600154600090600160a01b900460ff1615620020445760405162461bcd60e51b8152600401620009c59062003f83565b6001805460ff60a01b1916600160a01b1790819055600160c01b900460ff16620020825760405162461bcd60e51b8152600401620009c59062003f15565b60006200208e62002c31565b50905060006200209d62000c95565b90508381620020c057620020b8858463ffffffff62002f1416565b9050620020e1565b8215620020e157620020de8362001409878563ffffffff62002f4316565b90505b620020ed3386620034c6565b620020f98682620034fb565b600c546200210e908663ffffffff62002f1416565b600c556040516001600160a01b0387169033907f18081cde2fa64894914e1080b98cca17bb6d1acf633e57f6e26ebdb945ad830b906200177b906001908a90879062003e03565b60085481565b6011546001600160a01b031681565b600c5481565b6003546001600160a01b03163314806200219457506000546001600160a01b031633145b620021b35760405162461bcd60e51b8152600401620009c5906200406b565b6001805460ff60b81b19169055565b60006200136b338362000d22565b60095481565b6000546001600160a01b03163314620022035760405162461bcd60e51b8152600401620009c590620041ea565b6005546001600160a01b0383811691161415620022d657600e546200222f908263ffffffff62002f1416565b6005546040516370a0823160e01b81526001600160a01b03909116906370a08231906200226190309060040162003d97565b60206040518083038186803b1580156200227a57600080fd5b505afa1580156200228f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620022b5919062003cc0565b1015620022d65760405162461bcd60e51b8152600401620009c590620040ef565b6006546001600160a01b0383811691161415620023a957600f5462002302908263ffffffff62002f1416565b6006546040516370a0823160e01b81526001600160a01b03909116906370a08231906200233490309060040162003d97565b60206040518083038186803b1580156200234d57600080fd5b505afa15801562002362573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062002388919062003cc0565b1015620023a95760405162461bcd60e51b8152600401620009c59062003e76565b620016366001600160a01b038316338363ffffffff6200352f16565b600062000d163362000995565b600154600160b81b900460ff1681565b60125481565b600062000d1633620010ac565b6006546001600160a01b031681565b6010546001600160a01b031681565b600154600160c81b900460ff1681565b600154600090600160c81b900460ff16620024525760405162461bcd60e51b8152600401620009c59062004126565b6002543a1115620024775760405162461bcd60e51b8152600401620009c59062004364565b600154600160a01b900460ff1615620024a45760405162461bcd60e51b8152600401620009c59062003f83565b6001805460ff60a01b1916600160a01b17905560008080808080620024c98b62002fb5565b95509550955095509550955089861115620024f85760405162461bcd60e51b8152600401620009c590620042f3565b62002504338c6200316a565b87156200256e5760405163301bc67560e11b815233906360378cea9062002539906001908f908b908f908f9060040162003e1b565b600060405180830381600087803b1580156200255457600080fd5b505af115801562002569573d6000803e3d6000fd5b505050505b6200257a338762003220565b8315620025e65760045462002599906001600160a01b0316856200316a565b6004546040516001600160a01b03909116907fe4fed5362e2669c70e5da5a18942d1e617d8917f6adc0164d9668bd3a6d0cebe90620025dd90600190889062003df3565b60405180910390a25b81600d5414620025f657600d8290555b80600c54146200260657600c8190555b8260028111156200261357fe5b600b5460ff1660028111156200262557fe5b146200264b57600b805484919060ff191660018360028111156200264557fe5b02179055505b6200265685620031a5565b336001600160a01b03167fe93ad76094f247c0dafc1c61adc2187de1ac2738f7a3b49cb20b2263420251a38c8860405162001d86929190620043f9565b600e5481565b600a5481565b600154600160a01b900460ff1615620026cc5760405162461bcd60e51b8152600401620009c59062003f83565b6001805460ff60a01b1916600160a01b179055620026eb3382620034c6565b620014e481620031a5565b60008060006200270562002c31565b90925090506002600b5460ff1660028111156200271e57fe5b1415620027b15760006200275062002747600f5462001409858662002f4390919063ffffffff16565b600f546200331e565b90506200278f62002764600a548362002e30565b600a546200278290670de0b6b3a76400009063ffffffff62002d0616565b9063ffffffff62002f1416565b9050620027a66200279f62001976565b826200331e565b935050505062000d19565b6000620027dc620027d3600e5462001409868762002f4390919063ffffffff16565b600e546200331e565b9050620027f062002764600a548362002e30565b9050620027a66200280062001976565b8262002e30565b6000600e548211156200282e5760405162461bcd60e51b8152600401620009c590620040ef565b6001600b5460ff1660028111156200284257fe5b141562000c8c57600062002864600d54600f5462002d0690919063ffffffff16565b905060006200287262001976565b905060006200288283836200331e565b9050600062002897600e54600a548462002e5d565b9050600062000c5962000c4f88600e5462002d0690919063ffffffff16565b600154600160a81b900460ff1615620028e35760405162461bcd60e51b8152600401620009c590620040c5565b6001805460ff60a81b1916600160a81b179055600080546001600160a01b03808d166001600160a01b031990921691909117808355604051911691907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a3600380546001600160a01b038b81166001600160a01b031992831617909255600480548b8416908316179055600580548a84169083161790819055600680548a8516908416179055600780548985169316929092179091556001805460ff60c81b1960ff60b81b1960ff60c01b19909216600160c01b1791909116600160b81b1716600160c81b179055600283905560088690556009859055600a849055600b805460ff19169055604051911690620029fd9062003b64565b62002a09919062003d97565b604051809103906000f08015801562002a26573d6000803e3d6000fd5b50601080546001600160a01b0319166001600160a01b0392831617905560065460405191169062002a579062003b64565b62002a63919062003d97565b604051809103906000f08015801562002a80573d6000803e3d6000fd5b50601180546001600160a01b0319166001600160a01b039290921691909117905562002aab62003255565b5050505050505050505050565b6000546001600160a01b0316331462002ae55760405162461bcd60e51b8152600401620009c590620041ea565b7f6b04da3d58e4b37d99652babb3ea2bc25ce94379bfff3059f03d61b26c59e5536009548260405162002b1a929190620043f9565b60405180910390a160098190556200163662003255565b6000546001600160a01b0316331462002b5e5760405162461bcd60e51b8152600401620009c590620041ea565b6001600160a01b03811662002b875760405162461bcd60e51b8152600401620009c59062004151565b600080546040516001600160a01b03808516939216917fdcf55418cee3220104fef63f979ff3c4097ad240c0c43dcb33ce837748983e6291a3600180546001600160a01b0319166001600160a01b0392909216919091179055565b60006200136b33836200163a565b6011546040516370a0823160e01b81526000916001600160a01b0316906370a082319062001a3e90859060040162003d97565b60006200136b338362001df9565b600f54600e54600091829182600b5460ff16600281111562002c4f57fe5b141562002c6857600c54600d5493509350505062002d02565b6002600b5460ff16600281111562002c7c57fe5b141562002cb457600062002c8f6200358e565b600c5490915062002ca7848363ffffffff62002f1416565b9450945050505062002d02565b6001600b5460ff16600281111562002cc857fe5b141562002cff57600062002cdb620035ff565b905062002cef828263ffffffff62002f1416565b600d549450945050505062002d02565b50505b9091565b60008282111562002d2b5760405162461bcd60e51b8152600401620009c590620040a2565b50900390565b601154604051632770a7eb60e21b81526001600160a01b0390911690639dc29fac9062002d65908590859060040162003dcf565b600060405180830381600087803b15801562002d8057600080fd5b505af115801562002d95573d6000803e3d6000fd5b505050505050565b60065462002dbc906001600160a01b0316838363ffffffff6200352f16565b600f5462002dd1908263ffffffff62002d0616565b600f555050565b600d5462002ded908263ffffffff62002f1416565b600d556040517fa259c93818139b6bc90fb80e8feb75122b42edaae49560f81392cf4e1946726e9062002e25908390600090620043e9565b60405180910390a150565b6000670de0b6b3a764000062002e4d848463ffffffff62002f4316565b8162002e5557fe5b049392505050565b60008062002e7d62002e766004620013fc878762002e30565b8662003667565b905062002ea862002ea2670de0b6b3a7640000620013fc848263ffffffff62002f1416565b62003688565b9050600062002ee362002eca83670de0b6b3a764000063ffffffff62002d0616565b62002edd87600263ffffffff62002f4316565b62003667565b905062002f0a8662002f04670de0b6b3a76400008463ffffffff62002f1416565b62002e30565b9695505050505050565b60008282018381101562002f3c5760405162461bcd60e51b8152600401620009c5906200420d565b9392505050565b60008262002f54575060006200136b565b8282028284828162002f6257fe5b041462002f3c5760405162461bcd60e51b8152600401620009c59062004323565b60008062002f928484620031f2565b90508281028403801562002fac575060010190506200136b565b5090506200136b565b60008060008060008062002fc862002c31565b809350819250505062002fde8760085462002e30565b945062002fee8760095462002e30565b935060006200300985620027828a8963ffffffff62002f1416565b90506000600b5460ff1660028111156200301f57fe5b14156200303e57620030328183620036c3565b9650600193506200312c565b6001600b5460ff1660028111156200305257fe5b141562003068576200303281600e54846200370a565b6002600b5460ff1660028111156200307c57fe5b14156200312c5760006200309c600f548562002d0690919063ffffffff16565b90506000620030b784600e5462002d0690919063ffffffff16565b905080831015620030dd57620030d183600f54876200375a565b98506002955062003129565b80831415620030f3578198506000955062003129565b62003122620031146200310d858463ffffffff62002d0616565b86620036c3565b839063ffffffff62002f1416565b9850600195505b50505b5091939550919395565b601054604051632770a7eb60e21b81526001600160a01b0390911690639dc29fac9062002d65908590859060040162003dcf565b60055462003189906001600160a01b0316838363ffffffff6200352f16565b600e546200319e908263ffffffff62002d0616565b600e555050565b600c54620031ba908263ffffffff62002f1416565b600c556040517fa259c93818139b6bc90fb80e8feb75122b42edaae49560f81392cf4e1946726e9062002e25908390600190620043e9565b6000808211620032165760405162461bcd60e51b8152600401620009c59062004000565b81838162002e5557fe5b60065462003240906001600160a01b031683308463ffffffff6200379c16565b600f5462002dd1908263ffffffff62002f1416565b6000670de0b6b3a7640000600a5410620032835760405162461bcd60e51b8152600401620009c59062004346565b6000600a5411620032a85760405162461bcd60e51b8152600401620009c59062003ead565b670de0b6b3a7640000620032ca60095460085462002f1490919063ffffffff16565b1062000d195760405162461bcd60e51b8152600401620009c590620041c5565b6011546040516340c10f1960e01b81526001600160a01b03909116906340c10f199062002d65908590859060040162003dcf565b600062002f3c826200140985670de0b6b3a764000063ffffffff62002f4316565b6000806000806000806200335262002c31565b92509050866000600b5460ff1660028111156200336b57fe5b14156200338a576200337e8184620037c6565b96506002935062003476565b6001600b5460ff1660028111156200339e57fe5b141562003460576000620033be600e548462002d0690919063ffffffff16565b90506000620033d985600f5462002d0690919063ffffffff16565b9050818310156200340c57620033f383600e548662003808565b9850600195508089111562003406578098505b62003458565b8183141562003422578098506000955062003458565b62003451620034436200343c858563ffffffff62002d0616565b87620037c6565b829063ffffffff62002f1416565b9850600295505b505062003476565b6200346f81600f54856200382c565b9650600293505b620034848760085462002e30565b9550620034948760095462002e30565b9450620034ba85620034ad898963ffffffff62002d0616565b9063ffffffff62002d0616565b96505091939550919395565b600554620034e6906001600160a01b031683308463ffffffff6200379c16565b600e546200319e908263ffffffff62002f1416565b6010546040516340c10f1960e01b81526001600160a01b03909116906340c10f199062002d65908590859060040162003dcf565b620035898363a9059cbb60e01b84846040516024016200355192919062003dcf565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b03199093169290921790915262003863565b505050565b600080620035aa600c54600e5462002d0690919063ffffffff16565b90506000620035b862001976565b90506000620035c8838362002e30565b90506000620035dd600f54600a548462002e5d565b9050620035f6600f548262002d0690919063ffffffff16565b94505050505090565b6000806200361b600d54600f5462002d0690919063ffffffff16565b905060006200362962001976565b905060006200363983836200331e565b905060006200364e600e54600a548462002e5d565b9050620035f6600e548262002d0690919063ffffffff16565b600062002f3c8262000dbe85670de0b6b3a764000063ffffffff62002f4316565b80600160028204015b81811015620036bd57809150600281828581620036aa57fe5b040181620036b457fe5b04905062003691565b50919050565b6000818310620036e75760405162461bcd60e51b8152600401620009c590620040ef565b6000620036fb838563ffffffff62002d0616565b90506200141683848362003927565b60008284106200372e5760405162461bcd60e51b8152600401620009c590620040ef565b600062003742848663ffffffff62002d0616565b90506200375183858362003927565b95945050505050565b6000806200376762001976565b905060006200378884866200377d858a62002e30565b6001600a5462003947565b905062002f0a818663ffffffff62002d0616565b620037c0846323b872dd60e01b858585604051602401620035519392919062003dab565b50505050565b600080620037d362001976565b90506000620037f48485620037e9858962002e30565b6000600a5462003947565b905062003751848263ffffffff62002d0616565b6000806200381d848663ffffffff62002f1416565b90506200375183828662003927565b6000806200383962001976565b905060006200384f8486620037e9858a62002e30565b905062002f0a858263ffffffff62002d0616565b60006060836001600160a01b03168360405162003881919062003d5b565b6000604051808303816000865af19150503d8060008114620038c0576040519150601f19603f3d011682016040523d82523d6000602084013e620038c5565b606091505b509150915081620038ea5760405162461bcd60e51b8152600401620009c59062003fcb565b805115620037c0578080602001905181019062003908919062003c85565b620037c05760405162461bcd60e51b8152600401620009c59062004230565b6000806200393462001976565b90506200375185858584600a5462003ae1565b60008062003960866200140989620013fc878c62002e30565b905060006200398962003982670de0b6b3a76400008663ffffffff62002d0616565b8862002e30565b905060018515620039ae57620039a6828863ffffffff62002f1416565b9150620039c3565b620039c0838863ffffffff62002f1416565b92505b828210620039e957620039dd828463ffffffff62002d0616565b91506001905062003a02565b620039fb838363ffffffff62002d0616565b9150600090505b600062003a3962003a286004620013fc670de0b6b3a76400008a63ffffffff62002d0616565b62002f048c620013fc8a8f62002e30565b905062003a5662002ea28262002782868063ffffffff62002f4316565b9050600062003a7a6002620013fc670de0b6b3a76400008a63ffffffff62002d0616565b90506000831562003a9f5762003a97858463ffffffff62002f1416565b905062003ab4565b62003ab1838663ffffffff62002d0616565b90505b881562003ad55762003ac781836200331e565b965050505050505062003751565b62003ac7818362003667565b60008062003afb8462002f04888863ffffffff62002d0616565b9050600062003b2162003b1a88620014098b8063ffffffff62002f4316565b8762003667565b9050600062003b31858362002e30565b905062003b578362002f048362002782670de0b6b3a76400008a63ffffffff62002d0616565b9998505050505050505050565b61102d806200440883390190565b80356001600160a01b03811681146200136b57600080fd5b60006020828403121562003b9c578081fd5b62002f3c838362003b72565b6000806000806000806000806000806101408b8d03121562003bc8578586fd5b62003bd48c8c62003b72565b995062003be58c60208d0162003b72565b985062003bf68c60408d0162003b72565b975062003c078c60608d0162003b72565b965062003c188c60808d0162003b72565b955062003c298c60a08d0162003b72565b945060c08b0135935060e08b013592506101008b013591506101208b013590509295989b9194979a5092959850565b6000806040838503121562003c6b578182fd5b62003c77848462003b72565b946020939093013593505050565b60006020828403121562003c97578081fd5b8151801515811462002f3c578182fd5b60006020828403121562003cb9578081fd5b5035919050565b60006020828403121562003cd2578081fd5b5051919050565b6000806000806060858703121562003cef578384fd5b8435935060208501359250604085013567ffffffffffffffff8082111562003d15578384fd5b81870188601f82011262003d27578485fd5b803592508183111562003d38578485fd5b88602084830101111562003d4a578485fd5b959894975050602090940194505050565b60008251815b8181101562003d7d576020818601810151858301520162003d61565b8181111562003d8c5782828501525b509190910192915050565b6001600160a01b0391909116815260200190565b6001600160a01b039384168152919092166020820152604081019190915260600190565b6001600160a01b03929092168252602082015260400190565b901515815260200190565b9115158252602082015260400190565b92151583526020830191909152604082015260600190565b6000861515825285602083015284604083015260806060830152826080830152828460a084013781830160a090810191909152601f909201601f19160101949350505050565b602081016003831062003e7057fe5b91905290565b6020808252601d908201527f444f444f5f51554f54455f42414c414e43455f4e4f545f454e4f554748000000604082015260600190565b60208082526003908201526204b3d360ec1b604082015260600190565b6020808252600d908201526c494e56414c49445f434c41494d60981b604082015260600190565b6020808252600a908201526904e4f5f424153455f4c560b41b604082015260600190565b60208082526018908201527f4445504f5349545f424153455f4e4f545f414c4c4f5745440000000000000000604082015260600190565b60208082526019908201527f4445504f5349545f51554f54455f4e4f545f414c4c4f57454400000000000000604082015260600190565b60208082526009908201526814915153951490539560ba1b604082015260600190565b6020808252600b908201526a04e4f5f51554f54455f4c560ac1b604082015260600190565b6020808252818101527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564604082015260600190565b6020808252600e908201526d2224ab24a224a723afa2a92927a960911b604082015260600190565b60208082526023908201527f4c505f51554f54455f4341504954414c5f42414c414e43455f4e4f545f454e4f6040820152620aa8e960eb1b606082015260800190565b60208082526017908201527f4e4f545f53555045525649534f525f4f525f4f574e4552000000000000000000604082015260600190565b60208082526009908201526829aaa12fa2a92927a960b91b604082015260600190565b60208082526010908201526f1113d113d7d25392551250531256915160821b604082015260600190565b6020808252601c908201527f444f444f5f424153455f42414c414e43455f4e4f545f454e4f55474800000000604082015260600190565b602080825260119082015270151490511157d393d517d0531313d5d151607a1b604082015260600190565b6020808252600d908201526c24a72b20a624a22fa7aba722a960991b604082015260600190565b6020808252600e908201526d1411539053151657d15610d1515160921b604082015260600190565b6020808252600b908201526a1113d113d7d0d313d4d15160aa1b604082015260600190565b6020808252600b908201526a4645455f524154453e3d3160a81b604082015260600190565b6020808252600990820152682727aa2fa7aba722a960b91b604082015260600190565b60208082526009908201526820a2222fa2a92927a960b91b604082015260600190565b6020808252602a908201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6040820152691bdd081cdd58d8d9595960b21b606082015260800190565b60208082526022908201527f4c505f424153455f4341504954414c5f42414c414e43455f4e4f545f454e4f5560408201526108e960f31b606082015260800190565b6020808252601c908201527f53454c4c5f424153455f524543454956455f4e4f545f454e4f55474800000000604082015260600190565b602080825260169082015275084aab2be8482a68abe869ea6a8bea89e9ebe9aaa86960531b604082015260600190565b60208082526009908201526826aaa62fa2a92927a960b91b604082015260600190565b6020808252600490820152634b3e3d3160e01b604082015260600190565b60208082526010908201526f11d054d7d4149250d157d15610d1515160821b604082015260600190565b6020808252600f908201526e1053149150511657d0d31052535151608a1b604082015260600190565b6020808252600f908201526e1113d113d7d393d517d0d313d4d151608a1b604082015260600190565b90815260200190565b9182521515602082015260400190565b91825260208201526040019056fe60c060405260036080819052620444c560ec1b60a0908152620000269160029190620000c6565b503480156200003457600080fd5b506040516200102d3803806200102d83398101604081905262000057916200016b565b600080546001600160a01b03191633178082556040516001600160a01b039190911691907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a3600380546001600160a01b0319166001600160a01b03929092169190911790556200019b565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106200010957805160ff191683800117855562000139565b8280016001018555821562000139579182015b82811115620001395782518255916020019190600101906200011c565b50620001479291506200014b565b5090565b6200016891905b8082111562000147576000815560010162000152565b90565b6000602082840312156200017d578081fd5b81516001600160a01b038116811462000194578182fd5b9392505050565b610e8280620001ab6000396000f3fe608060405234801561001057600080fd5b50600436106101005760003560e01c80634e71e0c8116100975780639dc29fac116100665780639dc29fac146101dd578063a9059cbb146101f0578063dd62ed3e14610203578063f2fde38b1461021657610100565b80634e71e0c8146101b257806370a08231146101ba5780638456db15146101cd57806395d89b41146101d557610100565b806318160ddd116100d357806318160ddd1461016057806323b872dd14610175578063313ce5671461018857806340c10f191461019d57610100565b806306fdde0314610105578063095ea7b31461012357806313096a411461014357806316048bc414610158575b600080fd5b61010d610229565b60405161011a9190610c89565b60405180910390f35b610136610131366004610b56565b6102f6565b60405161011a9190610c7e565b61014b610361565b60405161011a9190610c6a565b61014b610370565b61016861037f565b60405161011a9190610dcd565b610136610183366004610b16565b610385565b610190610509565b60405161011a9190610dd6565b6101b06101ab366004610b56565b61058b565b005b6101b061068e565b6101686101c8366004610ac7565b61071c565b61014b610737565b61010d610746565b6101b06101eb366004610b56565b6107d1565b6101366101fe366004610b56565b6108c8565b610168610211366004610ae2565b610986565b6101b0610224366004610ac7565b6109b1565b604080518082018252600f81526e5f444f444f5f4c505f544f4b454e5f60881b602082015260035482516306fdde0360e01b815292516060936001600160a01b03909216916306fdde03916004808301926000929190829003018186803b15801561029357600080fd5b505afa1580156102a7573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526102cf9190810190610b80565b816040516020016102e1929190610c3c565b60405160208183030381529060405291505090565b3360008181526006602090815260408083206001600160a01b038716808552925280832085905551919290917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259061034f908690610dcd565b60405180910390a35060015b92915050565b6003546001600160a01b031681565b6000546001600160a01b031681565b60045481565b6001600160a01b0383166000908152600560205260408120548211156103c65760405162461bcd60e51b81526004016103bd90610d5b565b60405180910390fd5b6001600160a01b03841660009081526006602090815260408083203384529091529020548211156104095760405162461bcd60e51b81526004016103bd90610ce3565b6001600160a01b038416600090815260056020526040902054610432908363ffffffff610a5c16565b6001600160a01b038086166000908152600560205260408082209390935590851681522054610467908363ffffffff610a8416565b6001600160a01b0380851660009081526005602090815260408083209490945591871681526006825282812033825290915220546104ab908363ffffffff610a5c16565b6001600160a01b038086166000818152600660209081526040808320338452909152908190209390935591519085169190600080516020610e2d833981519152906104f7908690610dcd565b60405180910390a35060019392505050565b6003546040805163313ce56760e01b815290516000926001600160a01b03169163313ce567916004808301926020929190829003018186803b15801561054e57600080fd5b505afa158015610562573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105869190610c1b565b905090565b6000546001600160a01b031633146105b55760405162461bcd60e51b81526004016103bd90610d87565b6001600160a01b0382166000908152600560205260409020546105de908263ffffffff610a8416565b6001600160a01b03831660009081526005602052604090205560045461060a908263ffffffff610a8416565b6004556040516001600160a01b038316907f0f6798a560793a54c3bcfe86a93cde1e73087d944c0ea20544137d412139688590610648908490610dcd565b60405180910390a2816001600160a01b031660006001600160a01b0316600080516020610e2d833981519152836040516106829190610dcd565b60405180910390a35050565b6001546001600160a01b031633146106b85760405162461bcd60e51b81526004016103bd90610cbc565b600154600080546040516001600160a01b0393841693909116917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a360018054600080546001600160a01b03199081166001600160a01b03841617909155169055565b6001600160a01b031660009081526005602052604090205490565b6001546001600160a01b031681565b6002805460408051602060018416156101000260001901909316849004601f810184900484028201840190925281815292918301828280156107c95780601f1061079e576101008083540402835291602001916107c9565b820191906000526020600020905b8154815290600101906020018083116107ac57829003601f168201915b505050505081565b6000546001600160a01b031633146107fb5760405162461bcd60e51b81526004016103bd90610d87565b6001600160a01b038216600090815260056020526040902054610824908263ffffffff610a5c16565b6001600160a01b038316600090815260056020526040902055600454610850908263ffffffff610a5c16565b6004556040516001600160a01b038316907fcc16f5dbb4873280815c1ee09dbd06736cffcc184412cf7a71a0fdb75d397ca59061088e908490610dcd565b60405180910390a260006001600160a01b0316826001600160a01b0316600080516020610e2d833981519152836040516106829190610dcd565b336000908152600560205260408120548211156108f75760405162461bcd60e51b81526004016103bd90610d5b565b33600090815260056020526040902054610917908363ffffffff610a5c16565b33600090815260056020526040808220929092556001600160a01b03851681522054610949908363ffffffff610a8416565b6001600160a01b038416600081815260056020526040908190209290925590513390600080516020610e2d8339815191529061034f908690610dcd565b6001600160a01b03918216600090815260066020908152604080832093909416825291909152205490565b6000546001600160a01b031633146109db5760405162461bcd60e51b81526004016103bd90610d87565b6001600160a01b038116610a015760405162461bcd60e51b81526004016103bd90610d34565b600080546040516001600160a01b03808516939216917fdcf55418cee3220104fef63f979ff3c4097ad240c0c43dcb33ce837748983e6291a3600180546001600160a01b0319166001600160a01b0392909216919091179055565b600082821115610a7e5760405162461bcd60e51b81526004016103bd90610d11565b50900390565b600082820183811015610aa95760405162461bcd60e51b81526004016103bd90610daa565b9392505050565b80356001600160a01b038116811461035b57600080fd5b600060208284031215610ad8578081fd5b610aa98383610ab0565b60008060408385031215610af4578081fd5b610afe8484610ab0565b9150610b0d8460208501610ab0565b90509250929050565b600080600060608486031215610b2a578081fd5b8335610b3581610e14565b92506020840135610b4581610e14565b929592945050506040919091013590565b60008060408385031215610b68578182fd5b610b728484610ab0565b946020939093013593505050565b600060208284031215610b91578081fd5b815167ffffffffffffffff80821115610ba8578283fd5b81840185601f820112610bb9578384fd5b8051925081831115610bc9578384fd5b604051601f8401601f191681016020018381118282101715610be9578586fd5b604052838152818401602001871015610c00578485fd5b610c11846020830160208501610de4565b9695505050505050565b600060208284031215610c2c578081fd5b815160ff81168114610aa9578182fd5b60008351610c4e818460208801610de4565b8351908301610c61828260208801610de4565b01949350505050565b6001600160a01b0391909116815260200190565b901515815260200190565b6000602082528251806020840152610ca8816040850160208701610de4565b601f01601f19169190910160400192915050565b6020808252600d908201526c494e56414c49445f434c41494d60981b604082015260600190565b60208082526014908201527308298989eae829c868abe9c9ea8be8a9c9eaa8e960631b604082015260600190565b60208082526009908201526829aaa12fa2a92927a960b91b604082015260600190565b6020808252600d908201526c24a72b20a624a22fa7aba722a960991b604082015260600190565b6020808252601290820152710848298829c868abe9c9ea8be8a9c9eaa8e960731b604082015260600190565b6020808252600990820152682727aa2fa7aba722a960b91b604082015260600190565b60208082526009908201526820a2222fa2a92927a960b91b604082015260600190565b90815260200190565b60ff91909116815260200190565b60005b83811015610dff578181015183820152602001610de7565b83811115610e0e576000848401525b50505050565b6001600160a01b0381168114610e2957600080fd5b5056feddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa2646970667358221220841bccf74b44eca30e990eb033f46ce3d579e580f6773f839326e8d16131a6b264736f6c63430006090033e89c586bd81ee35a18f7eac22a732b56e589a2821497cce12a0208828540a36d581f351e2bdb9fa9021bb2a24def989f06ac236f8a92aac14bcbc618ddf3826aa2646970667358221220c1e1b62e47948255d166a6fb5548391cda62d6922ddf060330947b348adb869664736f6c63430006090033
Deployed Bytecode
0x60806040523480156200001157600080fd5b5060043610620004a85760003560e01c80637c9b8e89116200026d578063c5bbffe81162000159578063ed0aa42811620000d5578063f2fde38b1162000093578063f2fde38b146200091f578063f3ae6c5f1462000936578063f67ed448146200094d578063f98bea151462000964578063ffa64225146200097b57620004a8565b8063ed0aa42814620008b9578063ee27c68914620008d0578063ee5150b314620008da578063f00f9a0914620008f1578063f2220416146200090857620004a8565b8063d689107c1162000123578063d689107c146200087a578063dd58b41c1462000884578063e67ce706146200088e578063eab5d20e14620008a5578063ec2fd46d14620008af57620004a8565b8063c5bbffe81462000852578063c6b73cf9146200085c578063d47eaa371462000866578063d4b97046146200087057620004a8565b8063aa06ce9b11620001e9578063bc7d679d11620001b3578063bc7d679d1462000806578063c0a5f6ff1462000810578063c0ffa1781462000827578063c3a2a6651462000831578063c59203af146200084857620004a8565b8063aa06ce9b14620007d1578063ab44a7a314620007e8578063ac1fbc9814620007f2578063b2094fd314620007fc57620004a8565b80639299eb3011620002375780639299eb30146200076b578063947cf92b146200078257806395faa5f61462000799578063a2801e1614620007b0578063a598aca714620007c757620004a8565b80637c9b8e8914620007365780638456db1514620007405780638a8c523c146200074a5780638dae7333146200075457620004a8565b806336a53bbb11620003995780635bb7552a11620003155780636ec6a58d11620002d35780636ec6a58d14620006ea57806373a2ab7c14620006f4578063796da7af14620006fe5780637adbf97314620007085780637aed942d146200071f57620004a8565b80635bb7552a14620006755780635f179f64146200068c578063648a4fac14620006a357806367de8be914620006ad57806368be20ad14620006c457620004a8565b80634322ec8311620003635780634322ec8314620006435780634a248d2a146200064d5780634de4527e14620006575780634e71e0c8146200066157806354fd4d50146200066b57620004a8565b806336a53bbb146200060157806336ac41a81462000618578063387b0c1114620006225780633960f142146200063957620004a8565b806316048bc411620004295780631e34b9cc11620003f35780631e34b9cc14620005b55780631f3c156e14620005cc578063245c968514620005d657806327bed8ee14620005e05780632aa82c6514620005f757620004a8565b806316048bc4146200056257806317700f01146200057b57806317be952e146200058557806318c0bbe4146200059e57620004a8565b80630e6518e911620004775780630e6518e91462000516578063108db74414620005205780631184d8be146200053757806313c57624146200054157806313ea5d29146200054b57620004a8565b806304512dc414620004ad5780630923160214620004dc5780630c9f7bd014620004f55780630cd1667d146200050c575b600080fd5b620004c4620004be36600462003b8a565b62000995565b604051620004d39190620043e0565b60405180910390f35b620004f3620004ed36600462003ca7565b62000b1b565b005b620004c46200050636600462003ca7565b62000ba0565b620004c462000c95565b620004c462000d1c565b620004c46200053136600462003c58565b62000d22565b620004f362000f19565b620004f362000f88565b620004f36200055c36600462003b8a565b62000fda565b6200056c62001029565b604051620004d3919062003d97565b620004f362001038565b6200058f6200108a565b604051620004d3919062003e61565b620004c4620005af36600462003ca7565b62001093565b620004c4620005c636600462003b8a565b620010ac565b620004f3620011f9565b620004c462001357565b620004c4620005f136600462003ca7565b6200135d565b620004c462001371565b620004c46200061236600462003b8a565b620013b7565b620004f36200141e565b620004f36200063336600462003ca7565b6200148d565b6200056c620014f4565b6200056c62001503565b6200056c62001512565b620004c462001521565b620004f362001527565b620004c4620015b8565b620004f36200068636600462003ca7565b620015bd565b620004c46200069d36600462003c58565b6200163a565b620004f362001799565b620004f3620006be36600462003ca7565b620018c9565b620006db620006d536600462003b8a565b62001942565b604051620004d3919062003de8565b620006db62001957565b6200056c62001967565b620004c462001976565b620004f36200071936600462003b8a565b620019bc565b620004c46200073036600462003b8a565b62001a0b565b620004c462001a92565b6200056c62001a98565b620004f362001aa7565b620004c46200076536600462003cd9565b62001b16565b620004f36200077c36600462003b8a565b62001daa565b620004c46200079336600462003c58565b62001df9565b620004c4620007aa36600462003b8a565b62001fb2565b620004c4620007c136600462003ca7565b62001ff7565b620006db62002004565b620004c4620007e236600462003c58565b62002014565b620004c462002155565b6200056c6200215b565b620004c46200216a565b620004f362002170565b620004c46200082136600462003ca7565b620021c2565b620004c4620021d0565b620004f36200084236600462003c58565b620021d6565b620004c4620023c5565b620006db620023d2565b620004c4620023e2565b620004c4620023e8565b6200056c620023f5565b6200056c62002404565b620006db62002413565b620004c46200089f36600462003cd9565b62002423565b620004c462002693565b620004c462002699565b620004f3620008ca36600462003ca7565b6200269f565b620004c4620026f6565b620004c4620008eb36600462003ca7565b62002807565b620004f36200090236600462003ba8565b620028b6565b620004f36200091936600462003ca7565b62002ab8565b620004f36200093036600462003b8a565b62002b31565b620004c46200094736600462003ca7565b62002be2565b620004c46200095e36600462003b8a565b62002bf0565b620004c46200097536600462003ca7565b62002c23565b6200098562002c31565b604051620004d3929190620043f9565b600154600090600160a01b900460ff1615620009ce5760405162461bcd60e51b8152600401620009c59062003f83565b60405180910390fd5b6001805460ff60a01b1916600160a01b1790556000620009ee33620013b7565b90506000620009fd3362002bf0565b9050600062000a0c8362000ba0565b90508281111562000a315760405162461bcd60e51b8152600401620009c59062004178565b600d5462000a46908463ffffffff62002d0616565b600d5562000a55338362002d31565b62000a728562000a6c858463ffffffff62002d0616565b62002d9d565b62000a7d8162002dd8565b846001600160a01b0316336001600160a01b0316600080516020620054358339815191526000868660405162000ab69392919062003e03565b60405180910390a3336001600160a01b03166000805160206200545583398151915260008360405162000aeb92919062003df3565b60405180910390a262000b05838263ffffffff62002d0616565b6001805460ff60a01b1916905595945050505050565b6003546001600160a01b031633148062000b3f57506000546001600160a01b031633145b62000b5e5760405162461bcd60e51b8152600401620009c5906200406b565b7f808f99cfd15f1be6019f93dc76c81d5bd82e0b3e0b3d23a54f5a2e647a6cc3cc6002548260405162000b93929190620043f9565b60405180910390a1600255565b6000600f5482111562000bc75760405162461bcd60e51b8152600401620009c59062003e76565b6002600b5460ff16600281111562000bdb57fe5b141562000c8c57600062000bfd600c54600e5462002d0690919063ffffffff16565b9050600062000c0b62001976565b9050600062000c1b838362002e30565b9050600062000c30600f54600a548462002e5d565b9050600062000c5962000c4f88600f5462002d0690919063ffffffff16565b600a548562002e5d565b905062000c7f62000c71828963ffffffff62002f1416565b839063ffffffff62002d0616565b9550505050505062000c90565b5060005b919050565b601054604080516318160ddd60e01b815290516000926001600160a01b0316916318160ddd916004808301926020929190829003018186803b15801562000cdb57600080fd5b505afa15801562000cf0573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000d16919062003cc0565b90505b90565b60135481565b600154600090600160a01b900460ff161562000d525760405162461bcd60e51b8152600401620009c59062003f83565b6001805460ff60a01b1916600160a01b179055600062000d7162002c31565b915050600062000d8062001371565b90506000811162000da55760405162461bcd60e51b8152600401620009c59062003fa6565b600062000dcb8362000dbe878563ffffffff62002f4316565b9063ffffffff62002f8316565b905062000dd83362002bf0565b81111562000dfa5760405162461bcd60e51b8152600401620009c59062004028565b600062000e078662000ba0565b905085811062000e2b5760405162461bcd60e51b8152600401620009c59062004178565b600d5462000e40908763ffffffff62002d0616565b600d5562000e4f338362002d31565b62000e668762000a6c888463ffffffff62002d0616565b62000e718162002dd8565b6001600160a01b0387163360008051602062005435833981519152600062000ea08a8663ffffffff62002d0616565b8660405162000eb29392919062003e03565b60405180910390a3336001600160a01b03166000805160206200545583398151915260008360405162000ee792919062003df3565b60405180910390a262000f01868263ffffffff62002d0616565b6001805460ff60a01b19169055979650505050505050565b6000546001600160a01b0316331462000f465760405162461bcd60e51b8152600401620009c590620041ea565b600154600160b01b900460ff161562000f735760405162461bcd60e51b8152600401620009c590620041a0565b6001805460ff60c01b1916600160c01b179055565b6003546001600160a01b031633148062000fac57506000546001600160a01b031633145b62000fcb5760405162461bcd60e51b8152600401620009c5906200406b565b6001805460ff60c01b19169055565b6000546001600160a01b03163314620010075760405162461bcd60e51b8152600401620009c590620041ea565b600480546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b031681565b6003546001600160a01b03163314806200105c57506000546001600160a01b031633145b6200107b5760405162461bcd60e51b8152600401620009c5906200406b565b6001805460ff60c81b19169055565b600b5460ff1681565b6000620010a08262002fb5565b50939695505050505050565b600154600090600160a01b900460ff1615620010dc5760405162461bcd60e51b8152600401620009c59062003f83565b6001805460ff60a01b1916600160a01b1790556000620010fc3362001fb2565b905060006200110b3362001a0b565b905060006200111a8362002807565b9050828111156200113f5760405162461bcd60e51b8152600401620009c59062004178565b600c5462001154908463ffffffff62002d0616565b600c5562001163338362003136565b62001180856200117a858463ffffffff62002d0616565b6200316a565b6200118b81620031a5565b846001600160a01b0316336001600160a01b03166000805160206200543583398151915260018686604051620011c49392919062003e03565b60405180910390a3336001600160a01b03166000805160206200545583398151915260018360405162000aeb92919062003df3565b600154600160a01b900460ff1615620012265760405162461bcd60e51b8152600401620009c59062003f83565b6001805460ff60a01b1916600160a01b1790819055600160b01b900460ff16620012645760405162461bcd60e51b8152600401620009c590620043b7565b3360009081526014602052604090205460ff1615620012975760405162461bcd60e51b8152600401620009c5906200438e565b336000818152601460205260408120805460ff1916600117905590620012cb90620012c29062001a0b565b60125462002e30565b90506000620012e7620012de3362002bf0565b60135462002e30565b9050620012f533826200316a565b62001301338362002d9d565b336001600160a01b03167fbe5f7fe66d16c6a87bb5b8b08a96634fe4f1c2bac9e5e413efe41a782d4d0c4382846040516200133e929190620043f9565b60405180910390a250506001805460ff60a01b19169055565b600d5481565b60006200136b338362002014565b92915050565b601154604080516318160ddd60e01b815290516000926001600160a01b0316916318160ddd916004808301926020929190829003018186803b15801562000cdb57600080fd5b600080620013c462001371565b90506000620013d262002c31565b91505081620013e75760009250505062000c90565b62001416826200140983620013fc8862002bf0565b9063ffffffff62002f4316565b9063ffffffff620031f216565b949350505050565b6000546001600160a01b031633146200144b5760405162461bcd60e51b8152600401620009c590620041ea565b600154600160b01b900460ff1615620014785760405162461bcd60e51b8152600401620009c590620041a0565b6001805460ff60b81b1916600160b81b179055565b600154600160a01b900460ff1615620014ba5760405162461bcd60e51b8152600401620009c59062003f83565b6001805460ff60a01b1916600160a01b179055620014d9338262003220565b620014e48162002dd8565b506001805460ff60a01b19169055565b6003546001600160a01b031681565b6004546001600160a01b031681565b6005546001600160a01b031681565b60025481565b6001546001600160a01b03163314620015545760405162461bcd60e51b8152600401620009c59062003eca565b600154600080546040516001600160a01b0393841693909116917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a360018054600080546001600160a01b03199081166001600160a01b03841617909155169055565b606490565b6000546001600160a01b03163314620015ea5760405162461bcd60e51b8152600401620009c590620041ea565b7f3ce6ea91adda496b7a0546fa6558e5b52c3a509de6015820efb00ca4020e0a07600854826040516200161f929190620043f9565b60405180910390a160088190556200163662003255565b5050565b600154600090600160a01b900460ff16156200166a5760405162461bcd60e51b8152600401620009c59062003f83565b6001805460ff60a01b1916600160a01b1790819055600160b81b900460ff16620016a85760405162461bcd60e51b8152600401620009c59062003f4c565b6000620016b462002c31565b9150506000620016c362001371565b90508381620016e657620016de858463ffffffff62002f1416565b905062001707565b82156200170757620017048362001409878563ffffffff62002f4316565b90505b62001713338662003220565b6200171f8682620032ea565b600d5462001734908663ffffffff62002f1416565b600d556040516001600160a01b0387169033907f18081cde2fa64894914e1080b98cca17bb6d1acf633e57f6e26ebdb945ad830b906200177b906000908a90879062003e03565b60405180910390a36001805460ff60a01b1916905595945050505050565b6000546001600160a01b03163314620017c65760405162461bcd60e51b8152600401620009c590620041ea565b600154600160b01b900460ff1615620017f35760405162461bcd60e51b8152600401620009c590620041a0565b6001805462ffffff60b81b1960ff60b01b19909116600160b01b1716905560006200181d62000c95565b905060006200182b62001371565b9050600d54600f5411156200186d57600062001855600d54600f5462002d0690919063ffffffff16565b90506200186381846200331e565b6012555062001874565b600f54600d555b600c54600e541115620018b45760006200189c600c54600e5462002d0690919063ffffffff16565b9050620018aa81836200331e565b60135550620018bb565b600e54600c555b5050600b805460ff19169055565b6000546001600160a01b03163314620018f65760405162461bcd60e51b8152600401620009c590620041ea565b7f023a40bebf7ac113f81c3d628073246cf9e0bc49980a9d6a9531498ce9e3dd1c600a54826040516200192b929190620043f9565b60405180910390a1600a8190556200163662003255565b60146020526000908152604090205460ff1681565b600154600160b01b900460ff1681565b6007546001600160a01b031681565b60075460408051634c6afee560e11b815290516000926001600160a01b0316916398d5fdca916004808301926020929190829003018186803b15801562000cdb57600080fd5b6000546001600160a01b03163314620019e95760405162461bcd60e51b8152600401620009c590620041ea565b600780546001600160a01b0319166001600160a01b0392909216919091179055565b6010546040516370a0823160e01b81526000916001600160a01b0316906370a082319062001a3e90859060040162003d97565b60206040518083038186803b15801562001a5757600080fd5b505afa15801562001a6c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200136b919062003cc0565b600f5481565b6001546001600160a01b031681565b6000546001600160a01b0316331462001ad45760405162461bcd60e51b8152600401620009c590620041ea565b600154600160b01b900460ff161562001b015760405162461bcd60e51b8152600401620009c590620041a0565b6001805460ff60c81b1916600160c81b179055565b600154600090600160c81b900460ff1662001b455760405162461bcd60e51b8152600401620009c59062004126565b6002543a111562001b6a5760405162461bcd60e51b8152600401620009c59062004364565b600154600160a01b900460ff161562001b975760405162461bcd60e51b8152600401620009c59062003f83565b6001805460ff60a01b1916600160a01b1790556000808080808062001bbc8b6200333f565b9550955095509550955095508986101562001beb5760405162461bcd60e51b8152600401620009c590620042bc565b62001bf7338762002d9d565b871562001c615760405163301bc67560e11b815233906360378cea9062001c2c906000908f908b908f908f9060040162003e1b565b600060405180830381600087803b15801562001c4757600080fd5b505af115801562001c5c573d6000803e3d6000fd5b505050505b62001c6d338c620034c6565b831562001cd95760045462001c8c906001600160a01b03168562002d9d565b6004546040516001600160a01b03909116907fe4fed5362e2669c70e5da5a18942d1e617d8917f6adc0164d9668bd3a6d0cebe9062001cd090600090889062003df3565b60405180910390a25b81600d541462001ce957600d8290555b80600c541462001cf957600c8190555b82600281111562001d0657fe5b600b5460ff16600281111562001d1857fe5b1462001d3e57600b805484919060ff1916600183600281111562001d3857fe5b02179055505b62001d498562002dd8565b336001600160a01b03167fd8648b6ac54162763c86fd54bf2005af8ecd2f9cb273a5775921fd7f91e17b2d8c8860405162001d86929190620043f9565b60405180910390a250506001805460ff60a01b191690555091979650505050505050565b6000546001600160a01b0316331462001dd75760405162461bcd60e51b8152600401620009c590620041ea565b600380546001600160a01b0319166001600160a01b0392909216919091179055565b600154600090600160a01b900460ff161562001e295760405162461bcd60e51b8152600401620009c59062003f83565b6001805460ff60a01b1916600160a01b179055600062001e4862002c31565b509050600062001e5762000c95565b90506000811162001e7c5760405162461bcd60e51b8152600401620009c59062003ef1565b600062001e958362000dbe878563ffffffff62002f4316565b905062001ea23362001a0b565b81111562001ec45760405162461bcd60e51b8152600401620009c5906200427a565b600062001ed18662002807565b90508581111562001ef65760405162461bcd60e51b8152600401620009c59062004178565b600c5462001f0b908763ffffffff62002d0616565b600c5562001f1a338362003136565b62001f31876200117a888463ffffffff62002d0616565b62001f3c81620031a5565b6001600160a01b0387163360008051602062005435833981519152600162001f6b8a8663ffffffff62002d0616565b8660405162001f7d9392919062003e03565b60405180910390a3336001600160a01b03166000805160206200545583398151915260018360405162000ee792919062003df3565b60008062001fbf62000c95565b9050600062001fcd62002c31565b5090508162001fe25760009250505062000c90565b62001416826200140983620013fc8862001a0b565b6000620010a0826200333f565b600154600160c01b900460ff1681565b600154600090600160a01b900460ff1615620020445760405162461bcd60e51b8152600401620009c59062003f83565b6001805460ff60a01b1916600160a01b1790819055600160c01b900460ff16620020825760405162461bcd60e51b8152600401620009c59062003f15565b60006200208e62002c31565b50905060006200209d62000c95565b90508381620020c057620020b8858463ffffffff62002f1416565b9050620020e1565b8215620020e157620020de8362001409878563ffffffff62002f4316565b90505b620020ed3386620034c6565b620020f98682620034fb565b600c546200210e908663ffffffff62002f1416565b600c556040516001600160a01b0387169033907f18081cde2fa64894914e1080b98cca17bb6d1acf633e57f6e26ebdb945ad830b906200177b906001908a90879062003e03565b60085481565b6011546001600160a01b031681565b600c5481565b6003546001600160a01b03163314806200219457506000546001600160a01b031633145b620021b35760405162461bcd60e51b8152600401620009c5906200406b565b6001805460ff60b81b19169055565b60006200136b338362000d22565b60095481565b6000546001600160a01b03163314620022035760405162461bcd60e51b8152600401620009c590620041ea565b6005546001600160a01b0383811691161415620022d657600e546200222f908263ffffffff62002f1416565b6005546040516370a0823160e01b81526001600160a01b03909116906370a08231906200226190309060040162003d97565b60206040518083038186803b1580156200227a57600080fd5b505afa1580156200228f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620022b5919062003cc0565b1015620022d65760405162461bcd60e51b8152600401620009c590620040ef565b6006546001600160a01b0383811691161415620023a957600f5462002302908263ffffffff62002f1416565b6006546040516370a0823160e01b81526001600160a01b03909116906370a08231906200233490309060040162003d97565b60206040518083038186803b1580156200234d57600080fd5b505afa15801562002362573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062002388919062003cc0565b1015620023a95760405162461bcd60e51b8152600401620009c59062003e76565b620016366001600160a01b038316338363ffffffff6200352f16565b600062000d163362000995565b600154600160b81b900460ff1681565b60125481565b600062000d1633620010ac565b6006546001600160a01b031681565b6010546001600160a01b031681565b600154600160c81b900460ff1681565b600154600090600160c81b900460ff16620024525760405162461bcd60e51b8152600401620009c59062004126565b6002543a1115620024775760405162461bcd60e51b8152600401620009c59062004364565b600154600160a01b900460ff1615620024a45760405162461bcd60e51b8152600401620009c59062003f83565b6001805460ff60a01b1916600160a01b17905560008080808080620024c98b62002fb5565b95509550955095509550955089861115620024f85760405162461bcd60e51b8152600401620009c590620042f3565b62002504338c6200316a565b87156200256e5760405163301bc67560e11b815233906360378cea9062002539906001908f908b908f908f9060040162003e1b565b600060405180830381600087803b1580156200255457600080fd5b505af115801562002569573d6000803e3d6000fd5b505050505b6200257a338762003220565b8315620025e65760045462002599906001600160a01b0316856200316a565b6004546040516001600160a01b03909116907fe4fed5362e2669c70e5da5a18942d1e617d8917f6adc0164d9668bd3a6d0cebe90620025dd90600190889062003df3565b60405180910390a25b81600d5414620025f657600d8290555b80600c54146200260657600c8190555b8260028111156200261357fe5b600b5460ff1660028111156200262557fe5b146200264b57600b805484919060ff191660018360028111156200264557fe5b02179055505b6200265685620031a5565b336001600160a01b03167fe93ad76094f247c0dafc1c61adc2187de1ac2738f7a3b49cb20b2263420251a38c8860405162001d86929190620043f9565b600e5481565b600a5481565b600154600160a01b900460ff1615620026cc5760405162461bcd60e51b8152600401620009c59062003f83565b6001805460ff60a01b1916600160a01b179055620026eb3382620034c6565b620014e481620031a5565b60008060006200270562002c31565b90925090506002600b5460ff1660028111156200271e57fe5b1415620027b15760006200275062002747600f5462001409858662002f4390919063ffffffff16565b600f546200331e565b90506200278f62002764600a548362002e30565b600a546200278290670de0b6b3a76400009063ffffffff62002d0616565b9063ffffffff62002f1416565b9050620027a66200279f62001976565b826200331e565b935050505062000d19565b6000620027dc620027d3600e5462001409868762002f4390919063ffffffff16565b600e546200331e565b9050620027f062002764600a548362002e30565b9050620027a66200280062001976565b8262002e30565b6000600e548211156200282e5760405162461bcd60e51b8152600401620009c590620040ef565b6001600b5460ff1660028111156200284257fe5b141562000c8c57600062002864600d54600f5462002d0690919063ffffffff16565b905060006200287262001976565b905060006200288283836200331e565b9050600062002897600e54600a548462002e5d565b9050600062000c5962000c4f88600e5462002d0690919063ffffffff16565b600154600160a81b900460ff1615620028e35760405162461bcd60e51b8152600401620009c590620040c5565b6001805460ff60a81b1916600160a81b179055600080546001600160a01b03808d166001600160a01b031990921691909117808355604051911691907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a3600380546001600160a01b038b81166001600160a01b031992831617909255600480548b8416908316179055600580548a84169083161790819055600680548a8516908416179055600780548985169316929092179091556001805460ff60c81b1960ff60b81b1960ff60c01b19909216600160c01b1791909116600160b81b1716600160c81b179055600283905560088690556009859055600a849055600b805460ff19169055604051911690620029fd9062003b64565b62002a09919062003d97565b604051809103906000f08015801562002a26573d6000803e3d6000fd5b50601080546001600160a01b0319166001600160a01b0392831617905560065460405191169062002a579062003b64565b62002a63919062003d97565b604051809103906000f08015801562002a80573d6000803e3d6000fd5b50601180546001600160a01b0319166001600160a01b039290921691909117905562002aab62003255565b5050505050505050505050565b6000546001600160a01b0316331462002ae55760405162461bcd60e51b8152600401620009c590620041ea565b7f6b04da3d58e4b37d99652babb3ea2bc25ce94379bfff3059f03d61b26c59e5536009548260405162002b1a929190620043f9565b60405180910390a160098190556200163662003255565b6000546001600160a01b0316331462002b5e5760405162461bcd60e51b8152600401620009c590620041ea565b6001600160a01b03811662002b875760405162461bcd60e51b8152600401620009c59062004151565b600080546040516001600160a01b03808516939216917fdcf55418cee3220104fef63f979ff3c4097ad240c0c43dcb33ce837748983e6291a3600180546001600160a01b0319166001600160a01b0392909216919091179055565b60006200136b33836200163a565b6011546040516370a0823160e01b81526000916001600160a01b0316906370a082319062001a3e90859060040162003d97565b60006200136b338362001df9565b600f54600e54600091829182600b5460ff16600281111562002c4f57fe5b141562002c6857600c54600d5493509350505062002d02565b6002600b5460ff16600281111562002c7c57fe5b141562002cb457600062002c8f6200358e565b600c5490915062002ca7848363ffffffff62002f1416565b9450945050505062002d02565b6001600b5460ff16600281111562002cc857fe5b141562002cff57600062002cdb620035ff565b905062002cef828263ffffffff62002f1416565b600d549450945050505062002d02565b50505b9091565b60008282111562002d2b5760405162461bcd60e51b8152600401620009c590620040a2565b50900390565b601154604051632770a7eb60e21b81526001600160a01b0390911690639dc29fac9062002d65908590859060040162003dcf565b600060405180830381600087803b15801562002d8057600080fd5b505af115801562002d95573d6000803e3d6000fd5b505050505050565b60065462002dbc906001600160a01b0316838363ffffffff6200352f16565b600f5462002dd1908263ffffffff62002d0616565b600f555050565b600d5462002ded908263ffffffff62002f1416565b600d556040517fa259c93818139b6bc90fb80e8feb75122b42edaae49560f81392cf4e1946726e9062002e25908390600090620043e9565b60405180910390a150565b6000670de0b6b3a764000062002e4d848463ffffffff62002f4316565b8162002e5557fe5b049392505050565b60008062002e7d62002e766004620013fc878762002e30565b8662003667565b905062002ea862002ea2670de0b6b3a7640000620013fc848263ffffffff62002f1416565b62003688565b9050600062002ee362002eca83670de0b6b3a764000063ffffffff62002d0616565b62002edd87600263ffffffff62002f4316565b62003667565b905062002f0a8662002f04670de0b6b3a76400008463ffffffff62002f1416565b62002e30565b9695505050505050565b60008282018381101562002f3c5760405162461bcd60e51b8152600401620009c5906200420d565b9392505050565b60008262002f54575060006200136b565b8282028284828162002f6257fe5b041462002f3c5760405162461bcd60e51b8152600401620009c59062004323565b60008062002f928484620031f2565b90508281028403801562002fac575060010190506200136b565b5090506200136b565b60008060008060008062002fc862002c31565b809350819250505062002fde8760085462002e30565b945062002fee8760095462002e30565b935060006200300985620027828a8963ffffffff62002f1416565b90506000600b5460ff1660028111156200301f57fe5b14156200303e57620030328183620036c3565b9650600193506200312c565b6001600b5460ff1660028111156200305257fe5b141562003068576200303281600e54846200370a565b6002600b5460ff1660028111156200307c57fe5b14156200312c5760006200309c600f548562002d0690919063ffffffff16565b90506000620030b784600e5462002d0690919063ffffffff16565b905080831015620030dd57620030d183600f54876200375a565b98506002955062003129565b80831415620030f3578198506000955062003129565b62003122620031146200310d858463ffffffff62002d0616565b86620036c3565b839063ffffffff62002f1416565b9850600195505b50505b5091939550919395565b601054604051632770a7eb60e21b81526001600160a01b0390911690639dc29fac9062002d65908590859060040162003dcf565b60055462003189906001600160a01b0316838363ffffffff6200352f16565b600e546200319e908263ffffffff62002d0616565b600e555050565b600c54620031ba908263ffffffff62002f1416565b600c556040517fa259c93818139b6bc90fb80e8feb75122b42edaae49560f81392cf4e1946726e9062002e25908390600190620043e9565b6000808211620032165760405162461bcd60e51b8152600401620009c59062004000565b81838162002e5557fe5b60065462003240906001600160a01b031683308463ffffffff6200379c16565b600f5462002dd1908263ffffffff62002f1416565b6000670de0b6b3a7640000600a5410620032835760405162461bcd60e51b8152600401620009c59062004346565b6000600a5411620032a85760405162461bcd60e51b8152600401620009c59062003ead565b670de0b6b3a7640000620032ca60095460085462002f1490919063ffffffff16565b1062000d195760405162461bcd60e51b8152600401620009c590620041c5565b6011546040516340c10f1960e01b81526001600160a01b03909116906340c10f199062002d65908590859060040162003dcf565b600062002f3c826200140985670de0b6b3a764000063ffffffff62002f4316565b6000806000806000806200335262002c31565b92509050866000600b5460ff1660028111156200336b57fe5b14156200338a576200337e8184620037c6565b96506002935062003476565b6001600b5460ff1660028111156200339e57fe5b141562003460576000620033be600e548462002d0690919063ffffffff16565b90506000620033d985600f5462002d0690919063ffffffff16565b9050818310156200340c57620033f383600e548662003808565b9850600195508089111562003406578098505b62003458565b8183141562003422578098506000955062003458565b62003451620034436200343c858563ffffffff62002d0616565b87620037c6565b829063ffffffff62002f1416565b9850600295505b505062003476565b6200346f81600f54856200382c565b9650600293505b620034848760085462002e30565b9550620034948760095462002e30565b9450620034ba85620034ad898963ffffffff62002d0616565b9063ffffffff62002d0616565b96505091939550919395565b600554620034e6906001600160a01b031683308463ffffffff6200379c16565b600e546200319e908263ffffffff62002f1416565b6010546040516340c10f1960e01b81526001600160a01b03909116906340c10f199062002d65908590859060040162003dcf565b620035898363a9059cbb60e01b84846040516024016200355192919062003dcf565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b03199093169290921790915262003863565b505050565b600080620035aa600c54600e5462002d0690919063ffffffff16565b90506000620035b862001976565b90506000620035c8838362002e30565b90506000620035dd600f54600a548462002e5d565b9050620035f6600f548262002d0690919063ffffffff16565b94505050505090565b6000806200361b600d54600f5462002d0690919063ffffffff16565b905060006200362962001976565b905060006200363983836200331e565b905060006200364e600e54600a548462002e5d565b9050620035f6600e548262002d0690919063ffffffff16565b600062002f3c8262000dbe85670de0b6b3a764000063ffffffff62002f4316565b80600160028204015b81811015620036bd57809150600281828581620036aa57fe5b040181620036b457fe5b04905062003691565b50919050565b6000818310620036e75760405162461bcd60e51b8152600401620009c590620040ef565b6000620036fb838563ffffffff62002d0616565b90506200141683848362003927565b60008284106200372e5760405162461bcd60e51b8152600401620009c590620040ef565b600062003742848663ffffffff62002d0616565b90506200375183858362003927565b95945050505050565b6000806200376762001976565b905060006200378884866200377d858a62002e30565b6001600a5462003947565b905062002f0a818663ffffffff62002d0616565b620037c0846323b872dd60e01b858585604051602401620035519392919062003dab565b50505050565b600080620037d362001976565b90506000620037f48485620037e9858962002e30565b6000600a5462003947565b905062003751848263ffffffff62002d0616565b6000806200381d848663ffffffff62002f1416565b90506200375183828662003927565b6000806200383962001976565b905060006200384f8486620037e9858a62002e30565b905062002f0a858263ffffffff62002d0616565b60006060836001600160a01b03168360405162003881919062003d5b565b6000604051808303816000865af19150503d8060008114620038c0576040519150601f19603f3d011682016040523d82523d6000602084013e620038c5565b606091505b509150915081620038ea5760405162461bcd60e51b8152600401620009c59062003fcb565b805115620037c0578080602001905181019062003908919062003c85565b620037c05760405162461bcd60e51b8152600401620009c59062004230565b6000806200393462001976565b90506200375185858584600a5462003ae1565b60008062003960866200140989620013fc878c62002e30565b905060006200398962003982670de0b6b3a76400008663ffffffff62002d0616565b8862002e30565b905060018515620039ae57620039a6828863ffffffff62002f1416565b9150620039c3565b620039c0838863ffffffff62002f1416565b92505b828210620039e957620039dd828463ffffffff62002d0616565b91506001905062003a02565b620039fb838363ffffffff62002d0616565b9150600090505b600062003a3962003a286004620013fc670de0b6b3a76400008a63ffffffff62002d0616565b62002f048c620013fc8a8f62002e30565b905062003a5662002ea28262002782868063ffffffff62002f4316565b9050600062003a7a6002620013fc670de0b6b3a76400008a63ffffffff62002d0616565b90506000831562003a9f5762003a97858463ffffffff62002f1416565b905062003ab4565b62003ab1838663ffffffff62002d0616565b90505b881562003ad55762003ac781836200331e565b965050505050505062003751565b62003ac7818362003667565b60008062003afb8462002f04888863ffffffff62002d0616565b9050600062003b2162003b1a88620014098b8063ffffffff62002f4316565b8762003667565b9050600062003b31858362002e30565b905062003b578362002f048362002782670de0b6b3a76400008a63ffffffff62002d0616565b9998505050505050505050565b61102d806200440883390190565b80356001600160a01b03811681146200136b57600080fd5b60006020828403121562003b9c578081fd5b62002f3c838362003b72565b6000806000806000806000806000806101408b8d03121562003bc8578586fd5b62003bd48c8c62003b72565b995062003be58c60208d0162003b72565b985062003bf68c60408d0162003b72565b975062003c078c60608d0162003b72565b965062003c188c60808d0162003b72565b955062003c298c60a08d0162003b72565b945060c08b0135935060e08b013592506101008b013591506101208b013590509295989b9194979a5092959850565b6000806040838503121562003c6b578182fd5b62003c77848462003b72565b946020939093013593505050565b60006020828403121562003c97578081fd5b8151801515811462002f3c578182fd5b60006020828403121562003cb9578081fd5b5035919050565b60006020828403121562003cd2578081fd5b5051919050565b6000806000806060858703121562003cef578384fd5b8435935060208501359250604085013567ffffffffffffffff8082111562003d15578384fd5b81870188601f82011262003d27578485fd5b803592508183111562003d38578485fd5b88602084830101111562003d4a578485fd5b959894975050602090940194505050565b60008251815b8181101562003d7d576020818601810151858301520162003d61565b8181111562003d8c5782828501525b509190910192915050565b6001600160a01b0391909116815260200190565b6001600160a01b039384168152919092166020820152604081019190915260600190565b6001600160a01b03929092168252602082015260400190565b901515815260200190565b9115158252602082015260400190565b92151583526020830191909152604082015260600190565b6000861515825285602083015284604083015260806060830152826080830152828460a084013781830160a090810191909152601f909201601f19160101949350505050565b602081016003831062003e7057fe5b91905290565b6020808252601d908201527f444f444f5f51554f54455f42414c414e43455f4e4f545f454e4f554748000000604082015260600190565b60208082526003908201526204b3d360ec1b604082015260600190565b6020808252600d908201526c494e56414c49445f434c41494d60981b604082015260600190565b6020808252600a908201526904e4f5f424153455f4c560b41b604082015260600190565b60208082526018908201527f4445504f5349545f424153455f4e4f545f414c4c4f5745440000000000000000604082015260600190565b60208082526019908201527f4445504f5349545f51554f54455f4e4f545f414c4c4f57454400000000000000604082015260600190565b60208082526009908201526814915153951490539560ba1b604082015260600190565b6020808252600b908201526a04e4f5f51554f54455f4c560ac1b604082015260600190565b6020808252818101527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564604082015260600190565b6020808252600e908201526d2224ab24a224a723afa2a92927a960911b604082015260600190565b60208082526023908201527f4c505f51554f54455f4341504954414c5f42414c414e43455f4e4f545f454e4f6040820152620aa8e960eb1b606082015260800190565b60208082526017908201527f4e4f545f53555045525649534f525f4f525f4f574e4552000000000000000000604082015260600190565b60208082526009908201526829aaa12fa2a92927a960b91b604082015260600190565b60208082526010908201526f1113d113d7d25392551250531256915160821b604082015260600190565b6020808252601c908201527f444f444f5f424153455f42414c414e43455f4e4f545f454e4f55474800000000604082015260600190565b602080825260119082015270151490511157d393d517d0531313d5d151607a1b604082015260600190565b6020808252600d908201526c24a72b20a624a22fa7aba722a960991b604082015260600190565b6020808252600e908201526d1411539053151657d15610d1515160921b604082015260600190565b6020808252600b908201526a1113d113d7d0d313d4d15160aa1b604082015260600190565b6020808252600b908201526a4645455f524154453e3d3160a81b604082015260600190565b6020808252600990820152682727aa2fa7aba722a960b91b604082015260600190565b60208082526009908201526820a2222fa2a92927a960b91b604082015260600190565b6020808252602a908201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6040820152691bdd081cdd58d8d9595960b21b606082015260800190565b60208082526022908201527f4c505f424153455f4341504954414c5f42414c414e43455f4e4f545f454e4f5560408201526108e960f31b606082015260800190565b6020808252601c908201527f53454c4c5f424153455f524543454956455f4e4f545f454e4f55474800000000604082015260600190565b602080825260169082015275084aab2be8482a68abe869ea6a8bea89e9ebe9aaa86960531b604082015260600190565b60208082526009908201526826aaa62fa2a92927a960b91b604082015260600190565b6020808252600490820152634b3e3d3160e01b604082015260600190565b60208082526010908201526f11d054d7d4149250d157d15610d1515160821b604082015260600190565b6020808252600f908201526e1053149150511657d0d31052535151608a1b604082015260600190565b6020808252600f908201526e1113d113d7d393d517d0d313d4d151608a1b604082015260600190565b90815260200190565b9182521515602082015260400190565b91825260208201526040019056fe60c060405260036080819052620444c560ec1b60a0908152620000269160029190620000c6565b503480156200003457600080fd5b506040516200102d3803806200102d83398101604081905262000057916200016b565b600080546001600160a01b03191633178082556040516001600160a01b039190911691907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a3600380546001600160a01b0319166001600160a01b03929092169190911790556200019b565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106200010957805160ff191683800117855562000139565b8280016001018555821562000139579182015b82811115620001395782518255916020019190600101906200011c565b50620001479291506200014b565b5090565b6200016891905b8082111562000147576000815560010162000152565b90565b6000602082840312156200017d578081fd5b81516001600160a01b038116811462000194578182fd5b9392505050565b610e8280620001ab6000396000f3fe608060405234801561001057600080fd5b50600436106101005760003560e01c80634e71e0c8116100975780639dc29fac116100665780639dc29fac146101dd578063a9059cbb146101f0578063dd62ed3e14610203578063f2fde38b1461021657610100565b80634e71e0c8146101b257806370a08231146101ba5780638456db15146101cd57806395d89b41146101d557610100565b806318160ddd116100d357806318160ddd1461016057806323b872dd14610175578063313ce5671461018857806340c10f191461019d57610100565b806306fdde0314610105578063095ea7b31461012357806313096a411461014357806316048bc414610158575b600080fd5b61010d610229565b60405161011a9190610c89565b60405180910390f35b610136610131366004610b56565b6102f6565b60405161011a9190610c7e565b61014b610361565b60405161011a9190610c6a565b61014b610370565b61016861037f565b60405161011a9190610dcd565b610136610183366004610b16565b610385565b610190610509565b60405161011a9190610dd6565b6101b06101ab366004610b56565b61058b565b005b6101b061068e565b6101686101c8366004610ac7565b61071c565b61014b610737565b61010d610746565b6101b06101eb366004610b56565b6107d1565b6101366101fe366004610b56565b6108c8565b610168610211366004610ae2565b610986565b6101b0610224366004610ac7565b6109b1565b604080518082018252600f81526e5f444f444f5f4c505f544f4b454e5f60881b602082015260035482516306fdde0360e01b815292516060936001600160a01b03909216916306fdde03916004808301926000929190829003018186803b15801561029357600080fd5b505afa1580156102a7573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526102cf9190810190610b80565b816040516020016102e1929190610c3c565b60405160208183030381529060405291505090565b3360008181526006602090815260408083206001600160a01b038716808552925280832085905551919290917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259061034f908690610dcd565b60405180910390a35060015b92915050565b6003546001600160a01b031681565b6000546001600160a01b031681565b60045481565b6001600160a01b0383166000908152600560205260408120548211156103c65760405162461bcd60e51b81526004016103bd90610d5b565b60405180910390fd5b6001600160a01b03841660009081526006602090815260408083203384529091529020548211156104095760405162461bcd60e51b81526004016103bd90610ce3565b6001600160a01b038416600090815260056020526040902054610432908363ffffffff610a5c16565b6001600160a01b038086166000908152600560205260408082209390935590851681522054610467908363ffffffff610a8416565b6001600160a01b0380851660009081526005602090815260408083209490945591871681526006825282812033825290915220546104ab908363ffffffff610a5c16565b6001600160a01b038086166000818152600660209081526040808320338452909152908190209390935591519085169190600080516020610e2d833981519152906104f7908690610dcd565b60405180910390a35060019392505050565b6003546040805163313ce56760e01b815290516000926001600160a01b03169163313ce567916004808301926020929190829003018186803b15801561054e57600080fd5b505afa158015610562573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105869190610c1b565b905090565b6000546001600160a01b031633146105b55760405162461bcd60e51b81526004016103bd90610d87565b6001600160a01b0382166000908152600560205260409020546105de908263ffffffff610a8416565b6001600160a01b03831660009081526005602052604090205560045461060a908263ffffffff610a8416565b6004556040516001600160a01b038316907f0f6798a560793a54c3bcfe86a93cde1e73087d944c0ea20544137d412139688590610648908490610dcd565b60405180910390a2816001600160a01b031660006001600160a01b0316600080516020610e2d833981519152836040516106829190610dcd565b60405180910390a35050565b6001546001600160a01b031633146106b85760405162461bcd60e51b81526004016103bd90610cbc565b600154600080546040516001600160a01b0393841693909116917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a360018054600080546001600160a01b03199081166001600160a01b03841617909155169055565b6001600160a01b031660009081526005602052604090205490565b6001546001600160a01b031681565b6002805460408051602060018416156101000260001901909316849004601f810184900484028201840190925281815292918301828280156107c95780601f1061079e576101008083540402835291602001916107c9565b820191906000526020600020905b8154815290600101906020018083116107ac57829003601f168201915b505050505081565b6000546001600160a01b031633146107fb5760405162461bcd60e51b81526004016103bd90610d87565b6001600160a01b038216600090815260056020526040902054610824908263ffffffff610a5c16565b6001600160a01b038316600090815260056020526040902055600454610850908263ffffffff610a5c16565b6004556040516001600160a01b038316907fcc16f5dbb4873280815c1ee09dbd06736cffcc184412cf7a71a0fdb75d397ca59061088e908490610dcd565b60405180910390a260006001600160a01b0316826001600160a01b0316600080516020610e2d833981519152836040516106829190610dcd565b336000908152600560205260408120548211156108f75760405162461bcd60e51b81526004016103bd90610d5b565b33600090815260056020526040902054610917908363ffffffff610a5c16565b33600090815260056020526040808220929092556001600160a01b03851681522054610949908363ffffffff610a8416565b6001600160a01b038416600081815260056020526040908190209290925590513390600080516020610e2d8339815191529061034f908690610dcd565b6001600160a01b03918216600090815260066020908152604080832093909416825291909152205490565b6000546001600160a01b031633146109db5760405162461bcd60e51b81526004016103bd90610d87565b6001600160a01b038116610a015760405162461bcd60e51b81526004016103bd90610d34565b600080546040516001600160a01b03808516939216917fdcf55418cee3220104fef63f979ff3c4097ad240c0c43dcb33ce837748983e6291a3600180546001600160a01b0319166001600160a01b0392909216919091179055565b600082821115610a7e5760405162461bcd60e51b81526004016103bd90610d11565b50900390565b600082820183811015610aa95760405162461bcd60e51b81526004016103bd90610daa565b9392505050565b80356001600160a01b038116811461035b57600080fd5b600060208284031215610ad8578081fd5b610aa98383610ab0565b60008060408385031215610af4578081fd5b610afe8484610ab0565b9150610b0d8460208501610ab0565b90509250929050565b600080600060608486031215610b2a578081fd5b8335610b3581610e14565b92506020840135610b4581610e14565b929592945050506040919091013590565b60008060408385031215610b68578182fd5b610b728484610ab0565b946020939093013593505050565b600060208284031215610b91578081fd5b815167ffffffffffffffff80821115610ba8578283fd5b81840185601f820112610bb9578384fd5b8051925081831115610bc9578384fd5b604051601f8401601f191681016020018381118282101715610be9578586fd5b604052838152818401602001871015610c00578485fd5b610c11846020830160208501610de4565b9695505050505050565b600060208284031215610c2c578081fd5b815160ff81168114610aa9578182fd5b60008351610c4e818460208801610de4565b8351908301610c61828260208801610de4565b01949350505050565b6001600160a01b0391909116815260200190565b901515815260200190565b6000602082528251806020840152610ca8816040850160208701610de4565b601f01601f19169190910160400192915050565b6020808252600d908201526c494e56414c49445f434c41494d60981b604082015260600190565b60208082526014908201527308298989eae829c868abe9c9ea8be8a9c9eaa8e960631b604082015260600190565b60208082526009908201526829aaa12fa2a92927a960b91b604082015260600190565b6020808252600d908201526c24a72b20a624a22fa7aba722a960991b604082015260600190565b6020808252601290820152710848298829c868abe9c9ea8be8a9c9eaa8e960731b604082015260600190565b6020808252600990820152682727aa2fa7aba722a960b91b604082015260600190565b60208082526009908201526820a2222fa2a92927a960b91b604082015260600190565b90815260200190565b60ff91909116815260200190565b60005b83811015610dff578181015183820152602001610de7565b83811115610e0e576000848401525b50505050565b6001600160a01b0381168114610e2957600080fd5b5056feddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa2646970667358221220841bccf74b44eca30e990eb033f46ce3d579e580f6773f839326e8d16131a6b264736f6c63430006090033e89c586bd81ee35a18f7eac22a732b56e589a2821497cce12a0208828540a36d581f351e2bdb9fa9021bb2a24def989f06ac236f8a92aac14bcbc618ddf3826aa2646970667358221220c1e1b62e47948255d166a6fb5548391cda62d6922ddf060330947b348adb869664736f6c63430006090033
Deployed Bytecode Sourcemap
57952:1214:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44189:850;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;51093:210;;;;;;;;;:::i;:::-;;47382:985;;;;;;;;;:::i;9617:135::-;;;:::i;8643:43::-;;;:::i;41791:1172::-;;;;;;;;;:::i;51936:106::-;;;:::i;51818:110::-;;;:::i;50285:112::-;;;;;;;;;:::i;2990:22::-;;;:::i;:::-;;;;;;;;51372:99;;;:::i;8229:31::-;;;:::i;:::-;;;;;;;;32645:178;;;;;;;;;:::i;45047:839::-;;;;;;;;;:::i;27086:703::-;;;:::i;8315:42::-;;;:::i;39307:123::-;;;;;;;;;:::i;9919:137::-;;;:::i;46979:395::-;;;;;;;;;:::i;51702:108::-;;;:::i;25724:164::-;;;;;;;;;:::i;7814:27::-;;;:::i;7884:::-;;;:::i;7967:::-;;;:::i;7724:32::-;;;:::i;3713:230::-;;;:::i;10114:89::-;;;:::i;50405:278::-;;;;;;;;;:::i;39996:870::-;;;;;;;;;:::i;25995:1029::-;;;:::i;50942:143::-;;;;;;;;;:::i;8693:41::-;;;;;;;;;:::i;:::-;;;;;;;;7580:20;;;:::i;8036:23::-;;;:::i;9342:110::-;;;:::i;50061:96::-;;;;;;;;;:::i;9460:149::-;;;;;;;;;:::i;8400:30::-;;;:::i;3019:26::-;;;:::i;51479:95::-;;;:::i;29376:1526::-;;;;;;;;;:::i;50165:112::-;;;;;;;;;:::i;42971:1151::-;;;;;;;;;:::i;46584:387::-;;;;;;;;;:::i;32445:192::-;;;;;;;;;:::i;7649:34::-;;;:::i;40874:854::-;;;;;;;;;:::i;8132:28::-;;;:::i;8481:36::-;;;:::i;8267:41::-;;;:::i;51582:112::-;;;:::i;39438:127::-;;;;;;;;;:::i;8167:28::-;;;:::i;27851:595::-;;;;;;;;;:::i;39823:111::-;;;:::i;7607:35::-;;;:::i;8593:43::-;;;:::i;39706:109::-;;;:::i;8001:28::-;;;:::i;8439:35::-;;;:::i;7690:27::-;;;:::i;30910:1475::-;;;;;;;;;:::i;8364:29::-;;;:::i;8202:18::-;;;:::i;25555:161::-;;;;;;;;;:::i;19703:816::-;;;:::i;48375:984::-;;;;;;;;;:::i;58009:1154::-;;;;;;;;;:::i;50691:243::-;;;;;;;;;:::i;3481:224::-;;;;;;;;;:::i;39573:125::-;;;;;;;;;:::i;9760:151::-;;;;;;;;;:::i;39174:125::-;;;;;;;;;:::i;19004:691::-;;;:::i;:::-;;;;;;;;;44189:850;6573:9;;44262:7;;-1:-1:-1;;;6573:9:0;;;;6572:10;6564:32;;;;-1:-1:-1;;;6564:32:0;;;;;;;;;;;;;;;;;6619:4;6607:16;;-1:-1:-1;;;;6607:16:0;-1:-1:-1;;;6607:16:0;;;;44307:29:::1;44325:10;44307:17;:29::i;:::-;44282:54;;44347:15;44365:36;44390:10;44365:24;:36::i;:::-;44347:54;;44468:15;44486:39;44510:14;44486:23;:39::i;:::-;44468:57;;44555:14;44544:7;:25;;44536:52;;;;-1:-1:-1::0;;;44536:52:0::1;;;;;;;;;44654:27;::::0;:47:::1;::::0;44686:14;44654:47:::1;:31;:47;:::i;:::-;44624:27;:77:::0;44712:38:::1;44730:10;44742:7:::0;44712:17:::1;:38::i;:::-;44761:55;44784:2:::0;44788:27:::1;:14:::0;44807:7;44788:27:::1;:18;:27;:::i;:::-;44761:22;:55::i;:::-;44827:26;44845:7;44827:17;:26::i;:::-;44892:2;-1:-1:-1::0;;;;;44871:56:0::1;44880:10;-1:-1:-1::0;;;;;44871:56:0::1;-1:-1:-1::0;;;;;;;;;;;44896:5:0::1;44903:14;44919:7;44871:56;;;;;;;;;;;;;;;;;44957:10;-1:-1:-1::0;;;;;44943:41:0::1;-1:-1:-1::0;;;;;;;;;;;44969:5:0::1;44976:7;44943:41;;;;;;;;;;;;;;;;45004:27;:14:::0;45023:7;45004:27:::1;:18;:27;:::i;:::-;6646:9:::0;:17;;-1:-1:-1;;;;6646:17:0;;;44997:34;44189:850;-1:-1:-1;;;;;44189:850:0:o;51093:210::-;8855:12;;-1:-1:-1;;;;;8855:12:0;8841:10;:26;;:51;;-1:-1:-1;8885:7:0;;-1:-1:-1;;;;;8885:7:0;8871:10;:21;8841:51;8833:87;;;;-1:-1:-1;;;8833:87:0;;;;;;;;;51192:56:::1;51212:17;;51231:16;51192:56;;;;;;;;;;;;;;;;51259:17;:36:::0;51093:210::o;47382:985::-;47452:15;47498;;47488:6;:25;;47480:67;;;;-1:-1:-1;;;47480:67:0;;;;;;;;;47576:23;47562:10;;;;:37;;;;;;;;;47558:802;;;47616:17;47636:46;47655:26;;47636:14;;:18;;:46;;;;:::i;:::-;47616:66;;47697:13;47713:16;:14;:16::i;:::-;47697:32;;47744:18;47765:33;47781:9;47792:5;47765:15;:33::i;:::-;47744:54;;47813:19;47835:141;47895:15;;47929:3;;47951:10;47835:41;:141::i;:::-;47813:163;;48046:31;48080:153;48140:27;48160:6;48140:15;;:19;;:27;;;;:::i;:::-;48186:3;;48208:10;48080:41;:153::i;:::-;48046:187;-1:-1:-1;48255:52:0;48271:35;48046:187;48299:6;48271:35;:27;:35;:::i;:::-;48255:11;;:52;:15;:52;:::i;:::-;48248:59;;;;;;;;;47558:802;-1:-1:-1;48347:1:0;47558:802;47382:985;;;:::o;9617:135::-;9709:20;;9696:48;;;-1:-1:-1;;;9696:48:0;;;;9669:7;;-1:-1:-1;;;;;9709:20:0;;9696:46;;:48;;;;;;;;;;;;;;9709:20;9696:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9689:55;;9617:135;;:::o;8643:43::-;;;;:::o;41791:1172::-;6573:9;;41877:7;;-1:-1:-1;;;6573:9:0;;;;6572:10;6564:32;;;;-1:-1:-1;;;6564:32:0;;;;;;;;;6619:4;6607:16;;-1:-1:-1;;;;6607:16:0;-1:-1:-1;;;6607:16:0;;;;41953:19:::1;:17;:19::i;:::-;41927:45;;;41983:25;42011:22;:20;:22::i;:::-;41983:50;;42072:1;42052:17;:21;42044:45;;;;-1:-1:-1::0;;;42044:45:0::1;;;;;;;;;42102:27;42132:50;42170:11:::0;42132:29:::1;:6:::0;42143:17;42132:29:::1;:10;:29;:::i;:::-;:37:::0;:50:::1;:37;:50;:::i;:::-;42102:80;;42238:36;42263:10;42238:24;:36::i;:::-;42215:19;:59;;42193:144;;;;-1:-1:-1::0;;;42193:144:0::1;;;;;;;;;42404:15;42422:31;42446:6;42422:23;:31::i;:::-;42404:49;;42482:6;42472:7;:16;42464:43;;;;-1:-1:-1::0;;;42464:43:0::1;;;;;;;;;42573:27;::::0;:39:::1;::::0;42605:6;42573:39:::1;:31;:39;:::i;:::-;42543:27;:69:::0;42623:50:::1;42641:10;42653:19:::0;42623:17:::1;:50::i;:::-;42684:47;42707:2:::0;42711:19:::1;:6:::0;42722:7;42711:19:::1;:10;:19;:::i;42684:47::-;42742:26;42760:7;42742:17;:26::i;:::-;-1:-1:-1::0;;;;;42786:73:0;::::1;42795:10;-1:-1:-1::0;;;;;;;;;;;42811:5:0::1;42818:19;:6:::0;42829:7;42818:19:::1;:10;:19;:::i;:::-;42839;42786:73;;;;;;;;;;;;;;;;;42889:10;-1:-1:-1::0;;;;;42875:41:0::1;-1:-1:-1::0;;;;;;;;;;;42901:5:0::1;42908:7;42875:41;;;;;;;;;;;;;;;;42936:19;:6:::0;42947:7;42936:19:::1;:10;:19;:::i;:::-;6646:9:::0;:17;;-1:-1:-1;;;;6646:17:0;;;42929:26;41791:1172;-1:-1:-1;;;;;;;41791:1172:0:o;51936:106::-;3386:7;;-1:-1:-1;;;;;3386:7:0;3372:10;:21;3364:43;;;;-1:-1:-1;;;3364:43:0;;;;;;;;;8989:8:::1;::::0;-1:-1:-1;;;8989:8:0;::::1;;;8988:9;8980:33;;;;-1:-1:-1::0;;;8980:33:0::1;;;;;;;;;52030:4:::2;52005:29:::0;;-1:-1:-1;;;;52005:29:0::2;-1:-1:-1::0;;;52005:29:0::2;::::0;;51936:106::o;51818:110::-;8855:12;;-1:-1:-1;;;;;8855:12:0;8841:10;:26;;:51;;-1:-1:-1;8885:7:0;;-1:-1:-1;;;;;8885:7:0;8871:10;:21;8841:51;8833:87;;;;-1:-1:-1;;;8833:87:0;;;;;;;;;51890:22:::1;:30:::0;;-1:-1:-1;;;;51890:30:0::1;::::0;;51818:110::o;50285:112::-;3386:7;;-1:-1:-1;;;;;3386:7:0;3372:10;:21;3364:43;;;;-1:-1:-1;;;3364:43:0;;;;;;;;;50361:12:::1;:28:::0;;-1:-1:-1;;;;;;50361:28:0::1;-1:-1:-1::0;;;;;50361:28:0;;;::::1;::::0;;;::::1;::::0;;50285:112::o;2990:22::-;;;-1:-1:-1;;;;;2990:22:0;;:::o;51372:99::-;8855:12;;-1:-1:-1;;;;;8855:12:0;8841:10;:26;;:51;;-1:-1:-1;8885:7:0;;-1:-1:-1;;;;;8885:7:0;8871:10;:21;8841:51;8833:87;;;;-1:-1:-1;;;8833:87:0;;;;;;;;;51440:15:::1;:23:::0;;-1:-1:-1;;;;51440:23:0::1;::::0;;51372:99::o;8229:31::-;;;;;;:::o;32645:178::-;32711:16;32763:26;32782:6;32763:18;:26::i;:::-;-1:-1:-1;32740:49:0;;32645:178;-1:-1:-1;;;;;;32645:178:0:o;45047:839::-;6573:9;;45119:7;;-1:-1:-1;;;6573:9:0;;;;6572:10;6564:32;;;;-1:-1:-1;;;6564:32:0;;;;;;;;;6619:4;6607:16;;-1:-1:-1;;;;6607:16:0;-1:-1:-1;;;6607:16:0;;;;45164:28:::1;45181:10;45164:16;:28::i;:::-;45139:53;;45203:15;45221:35;45245:10;45221:23;:35::i;:::-;45203:53;;45323:15;45341:38;45364:14;45341:22;:38::i;:::-;45323:56;;45409:14;45398:7;:25;;45390:52;;;;-1:-1:-1::0;;;45390:52:0::1;;;;;;;;;45507:26;::::0;:46:::1;::::0;45538:14;45507:46:::1;:30;:46;:::i;:::-;45478:26;:75:::0;45564:37:::1;45581:10;45593:7:::0;45564:16:::1;:37::i;:::-;45612:54;45634:2:::0;45638:27:::1;:14:::0;45657:7;45638:27:::1;:18;:27;:::i;:::-;45612:21;:54::i;:::-;45677:25;45694:7;45677:16;:25::i;:::-;45741:2;-1:-1:-1::0;;;;;45720:55:0::1;45729:10;-1:-1:-1::0;;;;;45720:55:0::1;-1:-1:-1::0;;;;;;;;;;;45745:4:0::1;45751:14;45767:7;45720:55;;;;;;;;;;;;;;;;;45805:10;-1:-1:-1::0;;;;;45791:40:0::1;-1:-1:-1::0;;;;;;;;;;;45817:4:0::1;45823:7;45791:40;;;;;;;;27086:703:::0;6573:9;;-1:-1:-1;;;6573:9:0;;;;6572:10;6564:32;;;;-1:-1:-1;;;6564:32:0;;;;;;;;;6619:4;6607:16;;-1:-1:-1;;;;6607:16:0;-1:-1:-1;;;6607:16:0;;;;;-1:-1:-1;;;27154:8:0;::::1;6607:16:::0;27154:8:::1;27146:36;;;;-1:-1:-1::0;;;27146:36:0::1;;;;;;;;;27212:10;27202:21;::::0;;;:9:::1;:21;::::0;;;;;::::1;;27201:22;27193:50;;;;-1:-1:-1::0;;;27193:50:0::1;;;;;;;;;27264:10;27254:21;::::0;;;:9:::1;:21;::::0;;;;:28;;-1:-1:-1;;27254:28:0::1;27278:4;27254:28;::::0;;:21;27315:119:::1;::::0;27345:35:::1;::::0;:23:::1;:35::i;:::-;27395:28;;27315:15;:119::i;:::-;27293:141;;27445:18;27466:120;27496:36;27521:10;27496:24;:36::i;:::-;27547:28;;27466:15;:120::i;:::-;27445:141;;27597:45;27619:10;27631;27597:21;:45::i;:::-;27653:47;27676:10;27688:11;27653:22;:47::i;:::-;27728:10;-1:-1:-1::0;;;;;27716:48:0::1;;27740:10;27752:11;27716:48;;;;;;;;;;;;;;;;27775:7;;6646:9:::0;:17;;-1:-1:-1;;;;6646:17:0;;;27086:703::o;8315:42::-;;;;:::o;39307:123::-;39362:7;39389:33;39403:10;39415:6;39389:13;:33::i;:::-;39382:40;39307:123;-1:-1:-1;;39307:123:0:o;9919:137::-;10012:21;;9999:49;;;-1:-1:-1;;;9999:49:0;;;;9972:7;;-1:-1:-1;;;;;10012:21:0;;9999:47;;:49;;;;;;;;;;;;;;10012:21;9999:49;;;;;;;;;;46979:395;47039:17;47069:25;47097:22;:20;:22::i;:::-;47069:50;;47133:19;47156;:17;:19::i;:::-;47130:45;-1:-1:-1;;47190:22:0;47186:63;;47236:1;47229:8;;;;;;47186:63;47271:68;47321:17;47271:45;47304:11;47271:28;47296:2;47271:24;:28::i;:::-;:32;:45;:32;:45;:::i;:::-;:49;:68;:49;:68;:::i;:::-;47259:80;46979:395;-1:-1:-1;;;;46979:395:0:o;51702:108::-;3386:7;;-1:-1:-1;;;;;3386:7:0;3372:10;:21;3364:43;;;;-1:-1:-1;;;3364:43:0;;;;;;;;;8989:8:::1;::::0;-1:-1:-1;;;8989:8:0;::::1;;;8988:9;8980:33;;;;-1:-1:-1::0;;;8980:33:0::1;;;;;;;;;51798:4:::2;51772:30:::0;;-1:-1:-1;;;;51772:30:0::2;-1:-1:-1::0;;;51772:30:0::2;::::0;;51702:108::o;25724:164::-;6573:9;;-1:-1:-1;;;6573:9:0;;;;6572:10;6564:32;;;;-1:-1:-1;;;6564:32:0;;;;;;;;;6619:4;6607:16;;-1:-1:-1;;;;6607:16:0;-1:-1:-1;;;6607:16:0;;;25803:41:::1;25825:10;25837:6:::0;25803:21:::1;:41::i;:::-;25855:25;25873:6;25855:17;:25::i;:::-;-1:-1:-1::0;6646:9:0;:17;;-1:-1:-1;;;;6646:17:0;;;25724:164::o;7814:27::-;;;-1:-1:-1;;;;;7814:27:0;;:::o;7884:::-;;;-1:-1:-1;;;;;7884:27:0;;:::o;7967:::-;;;-1:-1:-1;;;;;7967:27:0;;:::o;7724:32::-;;;;:::o;3713:230::-;3781:11;;-1:-1:-1;;;;;3781:11:0;3767:10;:25;3759:51;;;;-1:-1:-1;;;3759:51:0;;;;;;;;;3856:11;;;3847:7;;3826:42;;-1:-1:-1;;;;;3856:11:0;;;;3847:7;;;;3826:42;;;3889:11;;;;3879:21;;-1:-1:-1;;;;;;3879:21:0;;;-1:-1:-1;;;;;3889:11:0;;3879:21;;;;3911:24;;;3713:230::o;10114:89::-;10183:3;10114:89;:::o;50405:278::-;3386:7;;-1:-1:-1;;;;;3386:7:0;3372:10;:21;3364:43;;;;-1:-1:-1;;;3364:43:0;;;;;;;;;50514:74:::1;50545:13;;50560:27;50514:74;;;;;;;;;;;;;;;;50599:13;:43:::0;;;50653:22:::1;:20;:22::i;:::-;;50405:278:::0;:::o;39996:870::-;6573:9;;40137:7;;-1:-1:-1;;;6573:9:0;;;;6572:10;6564:32;;;;-1:-1:-1;;;6564:32:0;;;;;;;;;6619:4;6607:16;;-1:-1:-1;;;;6607:16:0;-1:-1:-1;;;6607:16:0;;;;;-1:-1:-1;;;38911:23:0;::::1;6607:16:::0;38911:23:::1;38903:61;;;;-1:-1:-1::0;;;38903:61:0::1;;;;;;;;;40165:19:::2;40188;:17;:19::i;:::-;40162:45;;;40218:25;40246:22;:20;:22::i;:::-;40218:50:::0;-1:-1:-1;40297:6:0;40318:22;40314:257:::2;;40426:23;:6:::0;40437:11;40426:23:::2;:10;:23;:::i;:::-;40416:33;;40314:257;;;40471:15:::0;;40467:104:::2;;40513:46;40547:11:::0;40513:29:::2;:6:::0;40524:17;40513:29:::2;:10;:29;:::i;:46::-;40503:56;;40467:104;40606:41;40628:10;40640:6;40606:21;:41::i;:::-;40658:30;40676:2;40680:7;40658:17;:30::i;:::-;40729:27;::::0;:39:::2;::::0;40761:6;40729:39:::2;:31;:39;:::i;:::-;40699:27;:69:::0;40786:47:::2;::::0;-1:-1:-1;;;;;40786:47:0;::::2;::::0;40794:10:::2;::::0;40786:47:::2;::::0;::::2;::::0;40810:5:::2;::::0;40817:6;;40825:7;;40786:47:::2;;;;;;;;;;6646:9:::0;:17;;-1:-1:-1;;;;6646:17:0;;;40851:7;39996:870;-1:-1:-1;;;;;39996:870:0:o;25995:1029::-;3386:7;;-1:-1:-1;;;;;3386:7:0;3372:10;:21;3364:43;;;;-1:-1:-1;;;3364:43:0;;;;;;;;;8989:8:::1;::::0;-1:-1:-1;;;8989:8:0;::::1;;;8988:9;8980:33;;;;-1:-1:-1::0;;;8980:33:0::1;;;;;;;;;26073:4:::2;26062:15:::0;;-1:-1:-1;;;;;;;;26062:15:0;;::::2;-1:-1:-1::0;;;26062:15:0::2;26171:23:::0;;;26062:15;26232:21:::2;:19;:21::i;:::-;26205:48;;26264:25;26292:22;:20;:22::i;:::-;26264:50;;26349:27;;26331:15;;:45;26327:321;;;26393:18;26414:48;26434:27;;26414:15;;:19;;:48;;;;:::i;:::-;26393:69;;26508:50;26529:10;26541:16;26508:20;:50::i;:::-;26477:28;:81:::0;-1:-1:-1;26327:321:0::2;;;26621:15;::::0;26591:27:::2;:45:::0;26327:321:::2;26681:26;;26664:14;;:43;26660:314;;;26724:17;26744:46;26763:26;;26744:14;;:18;;:46;;;;:::i;:::-;26724:66;;26836:50;26857:9;26868:17;26836:20;:50::i;:::-;26805:28;:81:::0;-1:-1:-1;26660:314:0::2;;;26948:14;::::0;26919:26:::2;:43:::0;26660:314:::2;-1:-1:-1::0;;26986:10:0::2;:30:::0;;-1:-1:-1;;26986:30:0::2;::::0;;25995:1029::o;50942:143::-;3386:7;;-1:-1:-1;;;;;3386:7:0;3372:10;:21;3364:43;;;;-1:-1:-1;;;3364:43:0;;;;;;;;;51005:18:::1;51013:3;;51018:4;51005:18;;;;;;;;;;;;;;;;51034:3;:10:::0;;;51055:22:::1;:20;:22::i;8693:41::-:0;;;;;;;;;;;;;;;:::o;7580:20::-;;;-1:-1:-1;;;7580:20:0;;;;;:::o;8036:23::-;;;-1:-1:-1;;;;;8036:23:0;;:::o;9342:110::-;9424:8;;9416:28;;;-1:-1:-1;;;9416:28:0;;;;9389:7;;-1:-1:-1;;;;;9424:8:0;;9416:26;;:28;;;;;;;;;;;;;;9424:8;9416:28;;;;;;;;;;50061:96;3386:7;;-1:-1:-1;;;;;3386:7:0;3372:10;:21;3364:43;;;;-1:-1:-1;;;3364:43:0;;;;;;;;;50129:8:::1;:20:::0;;-1:-1:-1;;;;;;50129:20:0::1;-1:-1:-1::0;;;;;50129:20:0;;;::::1;::::0;;;::::1;::::0;;50061:96::o;9460:149::-;9566:20;;9553:48;;-1:-1:-1;;;9553:48:0;;9526:7;;-1:-1:-1;;;;;9566:20:0;;9553:44;;:48;;9598:2;;9553:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8400:30;;;;:::o;3019:26::-;;;-1:-1:-1;;;;;3019:26:0;;:::o;51479:95::-;3386:7;;-1:-1:-1;;;;;3386:7:0;3372:10;:21;3364:43;;;;-1:-1:-1;;;3364:43:0;;;;;;;;;8989:8:::1;::::0;-1:-1:-1;;;8989:8:0;::::1;;;8988:9;8980:33;;;;-1:-1:-1::0;;;8980:33:0::1;;;;;;;;;51562:4:::2;51544:22:::0;;-1:-1:-1;;;;51544:22:0::2;-1:-1:-1::0;;;51544:22:0::2;::::0;;51479:95::o;29376:1526::-;29134:15;;29557:7;;-1:-1:-1;;;29134:15:0;;;;29126:45;;;;-1:-1:-1;;;29126:45:0;;;;;;;;;29258:17:::1;;29243:11;:32;;29235:61;;;;-1:-1:-1::0;;;29235:61:0::1;;;;;;;;;6573:9:::2;::::0;-1:-1:-1;;;6573:9:0;::::2;;;6572:10;6564:32;;;;-1:-1:-1::0;;;6564:32:0::2;;;;;;;;;6619:4;6607:16:::0;;-1:-1:-1;;;;6607:16:0::2;-1:-1:-1::0;;;6607:16:0::2;::::0;;;;;;;;29828:27:::3;29848:6:::0;29828:19:::3;:27::i;:::-;29601:254;;;;;;;;;;;;29890:15;29874:12;:31;;29866:72;;;;-1:-1:-1::0;;;29866:72:0::3;;;;;;;;;29977:48;30000:10;30012:12;29977:22;:48::i;:::-;30040:15:::0;;30036:115:::3;;30072:67;::::0;-1:-1:-1;;;30072:67:0;;30084:10:::3;::::0;30072:32:::3;::::0;:67:::3;::::0;30105:5:::3;::::0;30112:6;;30120:12;;30134:4;;;;30072:67:::3;;;;;;;;;;;;;;;;;;;;;;::::0;::::3;;;;;;;;;;;;::::0;::::3;;;;;;;;;30036:115;30161:40;30182:10;30194:6;30161:20;:40::i;:::-;30216:15:::0;;30212:168:::3;;30271:12;::::0;30248:48:::3;::::0;-1:-1:-1;;;;;30271:12:0::3;30285:10:::0;30248:22:::3;:48::i;:::-;30336:12;::::0;30316:52:::3;::::0;-1:-1:-1;;;;;30336:12:0;;::::3;::::0;30316:52:::3;::::0;::::3;::::0;30336:12:::3;::::0;30357:10;;30316:52:::3;;;;;;;;;;30212:168;30453:14;30422:27;;:45;30418:122;;30484:27;:44:::0;;;30418:122:::3;30584:13;30554:26;;:43;30550:118;;30614:26;:42:::0;;;30550:118:::3;30696:10;30682:24;;;;;;;;:10;::::0;::::3;;:24;::::0;::::3;;;;;;;30678:80;;30723:10;:23:::0;;30736:10;;30723;-1:-1:-1;;30723:23:0::3;::::0;30736:10;30723:23:::3;::::0;::::3;;;;;;;;;;;30678:80;30770:29;30788:10;30770:17;:29::i;:::-;30829:10;-1:-1:-1::0;;;;;30815:47:0::3;;30841:6;30849:12;30815:47;;;;;;;;;;;;;;;;-1:-1:-1::0;;6646:9:0::2;:17:::0;;-1:-1:-1;;;;6646:17:0::2;::::0;;-1:-1:-1;30882:12:0;;29376:1526;-1:-1:-1;;;;;;;29376:1526:0:o;50165:112::-;3386:7;;-1:-1:-1;;;;;3386:7:0;3372:10;:21;3364:43;;;;-1:-1:-1;;;3364:43:0;;;;;;;;;50241:12:::1;:28:::0;;-1:-1:-1;;;;;;50241:28:0::1;-1:-1:-1::0;;;;;50241:28:0;;;::::1;::::0;;;::::1;::::0;;50165:112::o;42971:1151::-;6573:9;;43056:7;;-1:-1:-1;;;6573:9:0;;;;6572:10;6564:32;;;;-1:-1:-1;;;6564:32:0;;;;;;;;;6619:4;6607:16;;-1:-1:-1;;;;6607:16:0;-1:-1:-1;;;6607:16:0;;;;43131:19:::1;:17;:19::i;:::-;43106:44;;;43161:24;43188:21;:19;:21::i;:::-;43161:48;;43247:1;43228:16;:20;43220:43;;;;-1:-1:-1::0;;;43220:43:0::1;;;;;;;;;43276:26;43305:48;43342:10:::0;43305:28:::1;:6:::0;43316:16;43305:28:::1;:10;:28;:::i;:48::-;43276:77;;43408:35;43432:10;43408:23;:35::i;:::-;43386:18;:57;;43364:141;;;;-1:-1:-1::0;;;43364:141:0::1;;;;;;;;;43572:15;43590:30;43613:6;43590:22;:30::i;:::-;43572:48;;43650:6;43639:7;:17;;43631:44;;;;-1:-1:-1::0;;;43631:44:0::1;;;;;;;;;43740:26;::::0;:38:::1;::::0;43771:6;43740:38:::1;:30;:38;:::i;:::-;43711:26;:67:::0;43789:48:::1;43806:10;43818:18:::0;43789:16:::1;:48::i;:::-;43848:46;43870:2:::0;43874:19:::1;:6:::0;43885:7;43874:19:::1;:10;:19;:::i;43848:46::-;43905:25;43922:7;43905:16;:25::i;:::-;-1:-1:-1::0;;;;;43948:71:0;::::1;43957:10;-1:-1:-1::0;;;;;;;;;;;43973:4:0::1;43979:19;:6:::0;43990:7;43979:19:::1;:10;:19;:::i;:::-;44000:18;43948:71;;;;;;;;;;;;;;;;;44049:10;-1:-1:-1::0;;;;;44035:40:0::1;-1:-1:-1::0;;;;;;;;;;;44061:4:0::1;44067:7;44035:40;;;;;;;;46584:387:::0;46643:17;46673:24;46700:21;:19;:21::i;:::-;46673:48;;46733:18;46757:19;:17;:19::i;:::-;-1:-1:-1;46732:44:0;-1:-1:-1;46791:21:0;46787:62;;46836:1;46829:8;;;;;;46787:62;46871:65;46919:16;46871:43;46903:10;46871:27;46895:2;46871:23;:27::i;32445:192::-;32512:20;32572:27;32592:6;32572:19;:27::i;7649:34::-;;;-1:-1:-1;;;7649:34:0;;;;;:::o;40874:854::-;6573:9;;41013:7;;-1:-1:-1;;;6573:9:0;;;;6572:10;6564:32;;;;-1:-1:-1;;;6564:32:0;;;;;;;;;6619:4;6607:16;;-1:-1:-1;;;;6607:16:0;-1:-1:-1;;;6607:16:0;;;;;-1:-1:-1;;;39041:22:0;::::1;6607:16:::0;39041:22:::1;39033:59;;;;-1:-1:-1::0;;;39033:59:0::1;;;;;;;;;41039:18:::2;41063:19;:17;:19::i;:::-;41038:44;;;41093:24;41120:21;:19;:21::i;:::-;41093:48:::0;-1:-1:-1;41170:6:0;41191:21;41187:251:::2;;41297:22;:6:::0;41308:10;41297:22:::2;:10;:22;:::i;:::-;41287:32;;41187:251;;;41341:14:::0;;41337:101:::2;;41382:44;41415:10:::0;41382:28:::2;:6:::0;41393:16;41382:28:::2;:10;:28;:::i;:44::-;41372:54;;41337:101;41473:40;41494:10;41506:6;41473:20;:40::i;:::-;41524:29;41541:2;41545:7;41524:16;:29::i;:::-;41593:26;::::0;:38:::2;::::0;41624:6;41593:38:::2;:30;:38;:::i;:::-;41564:26;:67:::0;41649:46:::2;::::0;-1:-1:-1;;;;;41649:46:0;::::2;::::0;41657:10:::2;::::0;41649:46:::2;::::0;::::2;::::0;41673:4:::2;::::0;41679:6;;41687:7;;41649:46:::2;;8132:28:::0;;;;:::o;8481:36::-;;;-1:-1:-1;;;;;8481:36:0;;:::o;8267:41::-;;;;:::o;51582:112::-;8855:12;;-1:-1:-1;;;;;8855:12:0;8841:10;:26;;:51;;-1:-1:-1;8885:7:0;;-1:-1:-1;;;;;8885:7:0;8871:10;:21;8841:51;8833:87;;;;-1:-1:-1;;;8833:87:0;;;;;;;;;51655:23:::1;:31:::0;;-1:-1:-1;;;;51655:31:0::1;::::0;;51582:112::o;39438:127::-;39495:7;39522:35;39538:10;39550:6;39522:15;:35::i;8167:28::-;;;;:::o;27851:595::-;3386:7;;-1:-1:-1;;;;;3386:7:0;3372:10;:21;3364:43;;;;-1:-1:-1;;;3364:43:0;;;;;;;;;27943:12:::1;::::0;-1:-1:-1;;;;;27934:21:0;;::::1;27943:12:::0;::::1;27934:21;27930:219;;;28047:14;::::0;:26:::1;::::0;28066:6;28047:26:::1;:18;:26;:::i;:::-;28005:12;::::0;27998:45:::1;::::0;-1:-1:-1;;;27998:45:0;;-1:-1:-1;;;;;28005:12:0;;::::1;::::0;27998:30:::1;::::0;:45:::1;::::0;28037:4:::1;::::0;27998:45:::1;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:75;;27972:165;;;;-1:-1:-1::0;;;27972:165:0::1;;;;;;;;;28172:13;::::0;-1:-1:-1;;;;;28163:22:0;;::::1;28172:13:::0;::::1;28163:22;28159:223;;;28278:15;::::0;:27:::1;::::0;28298:6;28278:27:::1;:19;:27;:::i;:::-;28235:13;::::0;28228:46:::1;::::0;-1:-1:-1;;;28228:46:0;;-1:-1:-1;;;;;28235:13:0;;::::1;::::0;28228:31:::1;::::0;:46:::1;::::0;28268:4:::1;::::0;28228:46:::1;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:77;;28202:168;;;;-1:-1:-1::0;;;28202:168:0::1;;;;;;;;;28392:46;-1:-1:-1::0;;;;;28392:26:0;::::1;28419:10;28431:6:::0;28392:46:::1;:26;:46;:::i;39823:111::-:0;39869:7;39896:30;39915:10;39896:18;:30::i;7607:35::-;;;-1:-1:-1;;;7607:35:0;;;;;:::o;8593:43::-;;;;:::o;39706:109::-;39751:7;39778:29;39796:10;39778:17;:29::i;8001:28::-;;;-1:-1:-1;;;;;8001:28:0;;:::o;8439:35::-;;;-1:-1:-1;;;;;8439:35:0;;:::o;7690:27::-;;;-1:-1:-1;;;7690:27:0;;;;;:::o;30910:1475::-;29134:15;;31086:7;;-1:-1:-1;;;29134:15:0;;;;29126:45;;;;-1:-1:-1;;;29126:45:0;;;;;;;;;29258:17:::1;;29243:11;:32;;29235:61;;;;-1:-1:-1::0;;;29235:61:0::1;;;;;;;;;6573:9:::2;::::0;-1:-1:-1;;;6573:9:0;::::2;;;6572:10;6564:32;;;;-1:-1:-1::0;;;6564:32:0::2;;;;;;;;;6619:4;6607:16:::0;;-1:-1:-1;;;;6607:16:0::2;-1:-1:-1::0;;;6607:16:0::2;::::0;;;;;;;;31351:26:::3;31370:6:::0;31351:18:::3;:26::i;:::-;31130:247;;;;;;;;;;;;31408:11;31396:8;:23;;31388:58;;;;-1:-1:-1::0;;;31388:58:0::3;;;;;;;;;31485:41;31507:10;31519:6;31485:21;:41::i;:::-;31541:15:::0;;31537:110:::3;;31573:62;::::0;-1:-1:-1;;;31573:62:0;;31585:10:::3;::::0;31573:32:::3;::::0;:62:::3;::::0;31606:4:::3;::::0;31612:6;;31620:8;;31630:4;;;;31573:62:::3;;;;;;;;;;;;;;;;;;;;;;::::0;::::3;;;;;;;;;;;;::::0;::::3;;;;;;;;;31537:110;31657:43;31679:10;31691:8;31657:21;:43::i;:::-;31715:14:::0;;31711:163:::3;;31768:12;::::0;31746:46:::3;::::0;-1:-1:-1;;;;;31768:12:0::3;31782:9:::0;31746:21:::3;:46::i;:::-;31832:12;::::0;31812:50:::3;::::0;-1:-1:-1;;;;;31832:12:0;;::::3;::::0;31812:50:::3;::::0;::::3;::::0;31832:12;;31852:9;;31812:50:::3;;;;;;;;;;31711:163;31947:14;31916:27;;:45;31912:122;;31978:27;:44:::0;;;31912:122:::3;32078:13;32048:26;;:43;32044:118;;32108:26;:42:::0;;;32044:118:::3;32190:10;32176:24;;;;;;;;:10;::::0;::::3;;:24;::::0;::::3;;;;;;;32172:80;;32217:10;:23:::0;;32230:10;;32217;-1:-1:-1;;32217:23:0::3;::::0;32230:10;32217:23:::3;::::0;::::3;;;;;;;;;;;32172:80;32264:27;32281:9;32264:16;:27::i;:::-;32320:10;-1:-1:-1::0;;;;;32307:42:0::3;;32332:6;32340:8;32307:42;;;;;;;;8364:29:::0;;;;:::o;8202:18::-;;;;:::o;25555:161::-;6573:9;;-1:-1:-1;;;6573:9:0;;;;6572:10;6564:32;;;;-1:-1:-1;;;6564:32:0;;;;;;;;;6619:4;6607:16;;-1:-1:-1;;;;6607:16:0;-1:-1:-1;;;6607:16:0;;;25633:40:::1;25654:10;25666:6:::0;25633:20:::1;:40::i;:::-;25684:24;25701:6;25684:16;:24::i;19703:816::-:0;19747:16;19777:18;19797:19;19820;:17;:19::i;:::-;19776:63;;-1:-1:-1;19776:63:0;-1:-1:-1;19868:23:0;19854:10;;;;:37;;;;;;;;;19850:662;;;19908:9;19920:137;19959:49;19992:15;;19959:28;19975:11;19959;:15;;:28;;;;:::i;:49::-;20027:15;;19920:20;:137::i;:::-;19908:149;;20076:53;20105:23;20121:3;;20126:1;20105:15;:23::i;:::-;20096:3;;20076:24;;5684:6;;20076:24;:19;:24;:::i;:::-;:28;:53;:28;:53;:::i;:::-;20072:57;;20151:41;20172:16;:14;:16::i;:::-;20190:1;20151:20;:41::i;:::-;20144:48;;;;;;;19850:662;20225:9;20237:133;20276:46;20307:14;;20276:26;20291:10;20276;:14;;:26;;;;:::i;:46::-;20341:14;;20237:20;:133::i;:::-;20225:145;;20389:53;20418:23;20434:3;;20439:1;20418:15;:23::i;20389:53::-;20385:57;;20464:36;20480:16;:14;:16::i;:::-;20498:1;20464:15;:36::i;48375:984::-;48444:15;48490:14;;48480:6;:24;;48472:65;;;;-1:-1:-1;;;48472:65:0;;;;;;;;;48566:23;48552:10;;;;:37;;;;;;;;;48548:804;;;48606:18;48627:48;48647:27;;48627:15;;:19;;:48;;;;:::i;:::-;48606:69;;48690:13;48706:16;:14;:16::i;:::-;48690:32;;48737:18;48758:39;48779:10;48791:5;48758:20;:39::i;:::-;48737:60;;48812:18;48833:140;48893:14;;48926:3;;48948:10;48833:41;:140::i;:::-;48812:161;;49042:30;49075:152;49135:26;49154:6;49135:14;;:18;;:26;;;;:::i;58009:1154::-;58331:13;;-1:-1:-1;;;58331:13:0;;;;58330:14;58322:43;;;;-1:-1:-1;;;58322:43:0;;;;;;;;;58392:4;58376:20;;-1:-1:-1;;;;58376:20:0;-1:-1:-1;;;58376:20:0;;;;58433:15;;-1:-1:-1;;;;;58433:15:0;;;-1:-1:-1;;;;;;58433:15:0;;;;;;;;;;58464:41;;58497:7;;;58376:20;58464:41;;58376:20;;58464:41;58518:12;:25;;-1:-1:-1;;;;;58518:25:0;;;-1:-1:-1;;;;;;58518:25:0;;;;;;;58554:12;:25;;;;;;;;;;;58590:12;:24;;;;;;;;;;;;;58625:13;:26;;;;;;;;;;;58662:8;:17;;;;;;;;;;;;;;-1:-1:-1;58692:29:0;;-1:-1:-1;;;;;;;;;;;;58692:29:0;;;-1:-1:-1;;;58692:29:0;58732:30;;;;-1:-1:-1;;;58732:30:0;58773:22;-1:-1:-1;;;58773:22:0;;;-1:-1:-1;58806:33:0;;;58852:13;:25;;;58888:13;:25;;;58924:3;:7;;;58942:10;:30;;-1:-1:-1;;58942:30:0;;;59016:29;;59032:12;;;59016:29;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;58985:20:0;:61;;-1:-1:-1;;;;;;58985:61:0;-1:-1:-1;;;;;58985:61:0;;;;;;59105:13;;59089:30;;59105:13;;;59089:30;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;59057:21:0;:63;;-1:-1:-1;;;;;;59057:63:0;-1:-1:-1;;;;;59057:63:0;;;;;;;;;;59133:22;:20;:22::i;:::-;;58009:1154;;;;;;;;;;:::o;50691:243::-;3386:7;;-1:-1:-1;;;;;3386:7:0;3372:10;:21;3364:43;;;;-1:-1:-1;;;3364:43:0;;;;;;;;;50786:60:::1;50810:13;;50825:20;50786:60;;;;;;;;;;;;;;;;50857:13;:36:::0;;;50904:22:::1;:20;:22::i;3481:224::-:0;3386:7;;-1:-1:-1;;;;;3386:7:0;3372:10;:21;3364:43;;;;-1:-1:-1;;;3364:43:0;;;;;;;;;-1:-1:-1;;;;;3564:22:0;::::1;3556:48;;;;-1:-1:-1::0;;;3556:48:0::1;;;;;;;;;3646:7;::::0;;3620:44:::1;::::0;-1:-1:-1;;;;;3620:44:0;;::::1;::::0;3646:7;::::1;::::0;3620:44:::1;::::0;::::1;3675:11;:22:::0;;-1:-1:-1;;;;;;3675:22:0::1;-1:-1:-1::0;;;;;3675:22:0;;;::::1;::::0;;;::::1;::::0;;3481:224::o;39573:125::-;39629:7;39656:34;39671:10;39683:6;39656:14;:34::i;9760:151::-;9867:21;;9854:49;;-1:-1:-1;;;9854:49:0;;9827:7;;-1:-1:-1;;;;;9867:21:0;;9854:45;;:49;;9900:2;;9854:49;;;;39174:125;39230:7;39257:34;39272:10;39284:6;39257:14;:34::i;19004:691::-;19118:15;;19156:14;;19054:18;;;;;19185:10;;;;:31;;;;;;;;;19181:507;;;19241:26;;19269:27;;19233:64;;;;;;;;19181:507;19333:23;19319:10;;;;:37;;;;;;;;;19315:373;;;19373:21;19397:18;:16;:18::i;:::-;19438:26;;19373:42;;-1:-1:-1;19466:20:0;:1;19373:42;19466:20;:5;:20;:::i;:::-;19430:57;;;;;;;;;19315:373;19523:23;19509:10;;;;:37;;;;;;;;;19505:183;;;19563:20;19586:18;:16;:18::i;:::-;19563:41;-1:-1:-1;19627:19:0;:1;19563:41;19627:19;:5;:19;:::i;:::-;19648:27;;19619:57;;;;;;;;;19505:183;19004:691;;;;;:::o;4863:137::-;4921:7;4954:1;4949;:6;;4941:28;;;;-1:-1:-1;;;4941:28:0;;;;;;;;;-1:-1:-1;4987:5:0;;;4863:137::o;46384:139::-;46474:21;;46461:54;;-1:-1:-1;;;46461:54:0;;-1:-1:-1;;;;;46474:21:0;;;;46461:40;;:54;;46502:4;;46508:6;;46461:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46384:139;;:::o;24920:190::-;25007:13;;25000:46;;-1:-1:-1;;;;;25007:13:0;25035:2;25039:6;25000:46;:34;:46;:::i;:::-;25075:15;;:27;;25095:6;25075:27;:19;:27;:::i;:::-;25057:15;:45;-1:-1:-1;;24920:190:0:o;25370:177::-;25463:27;;:39;;25495:6;25463:39;:31;:39;:::i;:::-;25433:27;:69;25518:21;;;;;;25525:6;;25533:5;;25518:21;;;;;;;;;;25370:177;:::o;5699:117::-;5762:7;5684:6;5789:13;:6;5800:1;5789:13;:10;:13;:::i;:::-;:19;;;;;;;5699:117;-1:-1:-1;;;5699:117:0:o;13751:580::-;13893:10;13951:12;13966:62;13986:37;14021:1;13986:30;14002:1;14005:10;13986:15;:30::i;:37::-;14025:2;13966:19;:62::i;:::-;13951:77;-1:-1:-1;14046:53:0;:46;5684:6;14046:25;13951:77;5684:6;14046:25;:8;:25;:::i;:46::-;:51;:53::i;:::-;14039:60;-1:-1:-1;14110:15:0;14128:56;14148:25;14039:60;5684:6;14148:25;:8;:25;:::i;:::-;14175:8;:1;14181;14175:8;:5;:8;:::i;:::-;14128:19;:56::i;:::-;14110:74;-1:-1:-1;14274:49:0;14290:2;14294:28;5684:6;14110:74;14294:28;:19;:28;:::i;:::-;14274:15;:49::i;:::-;14267:56;13751:580;-1:-1:-1;;;;;;13751:580:0:o;5008:161::-;5066:7;5098:5;;;5122:6;;;;5114:28;;;;-1:-1:-1;;;5114:28:0;;;;;;;;;5160:1;5008:161;-1:-1:-1;;;5008:161:0:o;4184:226::-;4242:7;4266:6;4262:47;;-1:-1:-1;4296:1:0;4289:8;;4262:47;4333:5;;;4337:1;4333;:5;:1;4357:5;;;;;:10;4349:32;;;;-1:-1:-1;;;4349:32:0;;;;;;;;4567:288;4629:7;4649:16;4668:9;4672:1;4675;4668:3;:9::i;:::-;4649:28;-1:-1:-1;4712:12:0;;;4708:16;;4739:13;;4735:113;;-1:-1:-1;4787:1:0;4776:12;;-1:-1:-1;4769:19:0;;4735:113;-1:-1:-1;4828:8:0;-1:-1:-1;4821:15:0;;35642:2359;35750:16;35781:17;35813;35845:24;35884:22;35921:21;36004:19;:17;:19::i;:::-;35970:53;;;;;;;;36096:38;36112:6;36120:13;;36096:15;:38::i;:::-;36084:50;;36157:38;36173:6;36181:13;;36157:15;:38::i;:::-;36145:50;-1:-1:-1;36206:21:0;36230:36;36145:50;36230:21;:6;36241:9;36230:21;:10;:21;:::i;:36::-;36206:60;-1:-1:-1;36297:17:0;36283:10;;;;:31;;;;;;;;;36279:1620;;;36370:47;36388:13;36403;36370:17;:47::i;:::-;36359:58;;36445:23;36432:36;;36279:1620;;;36504:23;36490:10;;;;:37;;;;;;;;;36486:1413;;;36583:65;36603:13;36618:14;;36634:13;36583:19;:65::i;36486:1413::-;36735:23;36721:10;;;;:37;;;;;;;;;36717:1182;;;36775:25;36803:35;36822:15;;36803:14;:18;;:35;;;;:::i;:::-;36775:63;;36853:28;36884:33;36903:13;36884:14;;:18;;:33;;;;:::i;:::-;36853:64;;37030:20;37014:13;:36;37010:878;;;37232:67;37252:13;37267:15;;37284:14;37232:19;:67::i;:::-;37221:78;;37331:23;37318:36;;37010:878;;;37397:20;37380:13;:37;37376:512;;;37503:17;37492:28;;37552:17;37539:30;;37376:512;;;37681:136;37725:73;37743:39;:13;37761:20;37743:39;:17;:39;:::i;:::-;37784:13;37725:17;:73::i;:::-;37681:17;;:136;:21;:136;:::i;:::-;37670:147;;37849:23;37836:36;;37376:512;36717:1182;;;-1:-1:-1;35642:2359:0;;;;;;;:::o;46239:137::-;46328:20;;46315:53;;-1:-1:-1;;;46315:53:0;;-1:-1:-1;;;;;46328:20:0;;;;46315:39;;:53;;46355:4;;46361:6;;46315:53;;;;24726:186;24812:12;;24805:45;;-1:-1:-1;;;;;24812:12:0;24839:2;24843:6;24805:45;:33;:45;:::i;:::-;24878:14;;:26;;24897:6;24878:26;:18;:26;:::i;:::-;24861:14;:43;-1:-1:-1;;24726:186:0:o;25189:173::-;25280:26;;:38;;25311:6;25280:38;:30;:38;:::i;:::-;25251:26;:67;25334:20;;;;;;25341:6;;25349:4;;25334:20;;4418:141;4476:7;4508:1;4504;:5;4496:32;;;;-1:-1:-1;;;4496:32:0;;;;;;;;;4550:1;4546;:5;;;;24506:212;24594:13;;24587:67;;-1:-1:-1;;;;;24594:13:0;24626:4;24640;24647:6;24587:67;:38;:67;:::i;:::-;24683:15;;:27;;24703:6;24683:27;:19;:27;:::i;9094:240::-;9149:7;5684:6;9177:3;;:21;9169:38;;;;-1:-1:-1;;;9169:38:0;;;;;;;;;9232:1;9226:3;;:7;9218:23;;;;-1:-1:-1;;;9218:23:0;;;;;;;;;5684:6;9260:32;9278:13;;9260;;:17;;:32;;;;:::i;:::-;:50;9252:74;;;;-1:-1:-1;;;9252:74:0;;;;;;;;46092:139;46182:21;;46169:54;;-1:-1:-1;;;46169:54:0;;-1:-1:-1;;;;;46182:21:0;;;;46169:40;;:54;;46210:4;;46216:6;;46169:54;;;;5824:125;5892:7;5919:22;5939:1;5919:15;:6;5684;5919:15;:10;:15;:::i;32831:2803::-;32940:20;32975:18;33008;33041:24;33080:22;33117:21;33200:19;:17;:19::i;:::-;33166:53;-1:-1:-1;33166:53:0;-1:-1:-1;33257:6:0;33232:22;33280:10;;;;:31;;;;;;;;;33276:2019;;;33405:50;33424:14;33440;33405:18;:50::i;:::-;33390:65;;33483:23;33470:36;;33276:2019;;;33542:23;33528:10;;;;:37;;;;;;;;;33524:1771;;;33582:24;33609:33;33627:14;;33609:13;:17;;:33;;;;:::i;:::-;33582:60;;33657:29;33689:35;33709:14;33689:15;;:19;;:35;;;;:::i;:::-;33657:67;;33853:16;33836:14;:33;33832:1202;;;33958:67;33979:14;33995;;34011:13;33958:20;:67::i;:::-;33943:82;;34057:23;34044:36;;34118:21;34103:12;:36;34099:390;;;34448:21;34433:36;;34099:390;33832:1202;;;34532:16;34514:14;:34;34510:524;;;34638:21;34623:36;;34691:17;34678:30;;34510:524;;;34824:139;34872:72;34891:36;:14;34910:16;34891:36;:18;:36;:::i;:::-;34929:14;34872:18;:72::i;:::-;34824:21;;:139;:25;:139;:::i;:::-;34809:154;;34995:23;34982:36;;34510:524;33524:1771;;;;;35163:69;35184:14;35200:15;;35217:14;35163:20;:69::i;:::-;35148:84;;35260:23;35247:36;;33524:1771;35343:44;35359:12;35373:13;;35343:15;:44::i;:::-;35330:57;;35411:44;35427:12;35441:13;;35411:15;:44::i;:::-;35398:57;-1:-1:-1;35481:44:0;35398:57;35481:28;:12;35498:10;35481:28;:16;:28;:::i;:::-;:32;:44;:32;:44;:::i;:::-;35466:59;-1:-1:-1;;32831:2803:0;;;;;;;:::o;24290:208::-;24377:12;;24370:66;;-1:-1:-1;;;;;24377:12:0;24408:4;24422;24429:6;24370:66;:37;:66;:::i;:::-;24464:14;;:26;;24483:6;24464:26;:18;:26;:::i;45947:137::-;46036:20;;46023:53;;-1:-1:-1;;;46023:53:0;;-1:-1:-1;;;;;46036:20:0;;;;46023:39;;:53;;46063:4;;46069:6;;46023:53;;;;21788:211;21905:86;21925:5;21955:23;;;21980:2;21984:5;21932:58;;;;;;;;;;;;;;-1:-1:-1;;21932:58:0;;;;;;;;;;;;;;-1:-1:-1;;;;;21932:58:0;-1:-1:-1;;;;;;21932:58:0;;;;;;;;;;21905:19;:86::i;:::-;21788:211;;;:::o;16869:589::-;16920:21;17062:17;17082:46;17101:26;;17082:14;;:18;;:46;;;;:::i;:::-;17062:66;;17139:13;17155:16;:14;:16::i;:::-;17139:32;;17182:18;17203:33;17219:9;17230:5;17203:15;:33::i;:::-;17182:54;;17247:22;17272:125;17328:15;;17358:3;;17376:10;17272:41;:125::i;:::-;17247:150;;17415:35;17434:15;;17415:14;:18;;:35;;;;:::i;:::-;17408:42;;;;;;16869:589;:::o;18350:593::-;18401:20;18542:18;18563:48;18583:27;;18563:15;;:19;;:48;;;;:::i;:::-;18542:69;;18622:13;18638:16;:14;:16::i;:::-;18622:32;;18665:18;18686:39;18707:10;18719:5;18686:20;:39::i;:::-;18665:60;;18736:21;18760:124;18816:14;;18845:3;;18863:10;18760:41;:124::i;:::-;18736:148;;18902:33;18920:14;;18902:13;:17;;:33;;;;:::i;5957:128::-;6024:7;6051:26;6075:1;6051:15;:6;5684;6051:15;:10;:15;:::i;5177:205::-;5259:1;5267;5263;5259:5;;:9;5295:80;5306:1;5302;:5;5295:80;;;5328:1;5324:5;;5362:1;5357;5353;5349;:5;;;;;;:9;5348:15;;;;;;5344:19;;5295:80;;;5177:205;;;;:::o;15272:423::-;15396:21;15452;15443:6;:30;15435:71;;;;-1:-1:-1;;;15435:71:0;;;;;;;;;15517:10;15530:33;:21;15556:6;15530:33;:25;:33;:::i;:::-;15517:46;;15590:66;15607:21;15630;15653:2;15590:16;:66::i;17514:368::-;17663:21;17714:11;17705:6;:20;17697:61;;;;-1:-1:-1;;;17697:61:0;;;;;;;;;17769:10;17782:23;:11;17798:6;17782:23;:15;:23;:::i;:::-;17769:36;;17823:51;17840:16;17858:11;17871:2;17823:16;:51::i;:::-;17816:58;17514:368;-1:-1:-1;;;;;17514:368:0:o;16235:626::-;16386:21;16575:9;16587:16;:14;:16::i;:::-;16575:28;;16614:10;16627:188;16682:17;16714:12;16741:26;16757:1;16760:6;16741:15;:26::i;:::-;16782:4;16801:3;;16627:40;:188::i;:::-;16614:201;-1:-1:-1;16833:20:0;16614:201;16840:12;16833:20;:6;:20;:::i;22007:285::-;22151:133;22185:5;22228:27;;;22257:4;22263:2;22267:5;22205:68;;;;;;;;;;;22151:133;22007:285;;;;:::o;14628:636::-;14754:25;14797:9;14809:16;:14;:16::i;:::-;14797:28;;14836:10;14849:204;14904:22;14941;14978:26;14994:1;14997:6;14978:15;:26::i;:::-;15019:5;15039:3;;14849:40;:204::i;:::-;14836:217;-1:-1:-1;15226:30:0;:22;14836:217;15226:30;:26;:30;:::i;17890:452::-;18040:25;;18242:23;:11;18258:6;18242:23;:15;:23;:::i;:::-;18229:36;;18283:51;18300:16;18318:2;18322:11;18283:16;:51::i;15751:476::-;15903:24;15940:9;15952:16;:14;:16::i;:::-;15940:28;;15979:10;15992:189;16047:17;16079:12;16106:26;16122:1;16125:6;16106:15;:26::i;15992:189::-;15979:202;-1:-1:-1;16199:20:0;:12;15979:202;16199:20;:16;:20;:::i;22683:1046::-;23343:12;23357:23;23392:5;-1:-1:-1;;;;;23384:19:0;23404:4;23384:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23342:67;;;;23428:7;23420:52;;;;-1:-1:-1;;;23420:52:0;;;;;;;;;23489:17;;:21;23485:237;;23644:10;23633:30;;;;;;;;;;;;;;23625:85;;;;-1:-1:-1;;;23625:85:0;;;;;;;;20527:239;20646:7;20666:9;20678:16;:14;:16::i;:::-;20666:28;;20712:46;20739:2;20743;20747;20751:1;20754:3;;20712:26;:46::i;11995:1553::-;12179:7;12281:14;12298:38;12333:2;12298:30;12325:2;12298:22;12314:1;12317:2;12298:15;:22::i;:38::-;12281:55;-1:-1:-1;12359:9:0;12371:43;12387:22;5684:6;12407:1;12387:22;:19;:22;:::i;:::-;12411:2;12371:15;:43::i;:::-;12359:55;-1:-1:-1;12453:4:0;12468:162;;;;12502:14;:1;12508:7;12502:14;:5;:14;:::i;:::-;12498:18;;12468:162;;;12578:19;:6;12589:7;12578:19;:10;:19;:::i;:::-;12569:28;;12468:162;12649:6;12644:1;:11;12640:174;;12676:13;:1;12682:6;12676:13;:5;:13;:::i;:::-;12672:17;;12716:4;12704:16;;12640:174;;;12757:13;:6;12768:1;12757:13;:10;:13;:::i;:::-;12753:17;;12797:5;12785:17;;12640:174;12853:18;12874:115;12904:29;12931:1;12904:22;5684:6;12924:1;12904:22;:19;:22;:::i;:29::-;12948:30;12975:2;12948:22;12964:1;12967:2;12948:15;:22::i;12874:115::-;12853:136;-1:-1:-1;13028:31:0;:24;12853:136;13028:8;13034:1;;13028:8;:5;:8;:::i;:31::-;13015:44;-1:-1:-1;13120:19:0;13142:29;13169:1;13142:22;5684:6;13162:1;13142:22;:19;:22;:::i;:29::-;13120:51;;13192:17;13224:9;13220:133;;;13262:17;:1;13268:10;13262:17;:5;:17;:::i;:::-;13250:29;;13220:133;;;13324:17;:10;13339:1;13324:17;:14;:17;:::i;:::-;13312:29;;13220:133;13369:9;13365:176;;;13402:44;13423:9;13434:11;13402:20;:44::i;:::-;13395:51;;;;;;;;;;13365:176;13486:43;13506:9;13517:11;13486:19;:43::i;10994:479::-;11154:7;;11195:30;11211:1;11214:10;:2;11221;11214:10;:6;:10;:::i;11195:30::-;11174:51;-1:-1:-1;11247:16:0;11266:43;11286:18;11301:2;11286:10;11293:2;;11286:10;:6;:10;:::i;:18::-;11306:2;11266:19;:43::i;:::-;11247:62;;11320:15;11338:28;11354:1;11357:8;11338:15;:28::i;:::-;11320:46;-1:-1:-1;11401:64:0;11417:10;11429:35;11320:46;11429:22;5684:6;11449:1;11429:22;:19;:22;:::i;11401:64::-;11394:71;10994:479;-1:-1:-1;;;;;;;;;10994:479:0:o;-1:-1:-1:-;;;;;;;;:::o;5:130::-;72:20;;-1:-1;;;;;33937:54;;34915:35;;34905:2;;34964:1;;34954: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;35061:5;33718:13;33711:21;35039:5;35036:32;35026:2;;-1:-1;;35072: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;15740:271;;5037:5;33017:12;-1:-1;34440:101;34454:6;34451:1;34448:13;34440:101;;;5181:4;34521:11;;;;;34515:18;34502:11;;;34495:39;34469:10;34440:101;;;34556:6;34553:1;34550:13;34547:2;;;-1:-1;34612:6;34607:3;34603:16;34596:27;34547:2;-1:-1;5212:16;;;;;15874:137;-1:-1;;15874:137;16018:222;-1:-1;;;;;33937:54;;;;4389:37;;16145:2;16130:18;;16116:124;16247:444;-1:-1;;;;;33937:54;;;4389:37;;33937:54;;;;16594:2;16579:18;;4389:37;16677:2;16662:18;;15691:37;;;;16430:2;16415:18;;16401:290;16698:333;-1:-1;;;;;33937:54;;;;4389:37;;17017:2;17002:18;;15691:37;16853:2;16838:18;;16824:207;17038:210;33718:13;;33711:21;4503:34;;17159:2;17144:18;;17130:118;17255:321;33718:13;;33711:21;4503:34;;17562:2;17547:18;;15691:37;17404:2;17389:18;;17375:201;17583:432;33718:13;;33711:21;4503:34;;17918:2;17903:18;;15691:37;;;;18001:2;17986:18;;15691:37;17760:2;17745:18;;17731:284;18022:648;;4530:5;33718:13;33711:21;4510:3;4503:34;15721:5;18414:2;18403:9;18399:18;15691:37;15721:5;18497:2;18486:9;18482:18;15691:37;18255:3;18534:2;18523:9;18519:18;18512:48;33173:6;18255:3;18244:9;18240:19;33161;34295:6;34290:3;33201:14;18244:9;33201:14;34272:30;34333:16;;;33201:14;34333:16;;;34326:27;;;;34728:7;34712:14;;;-1:-1;;34708:28;4824:39;;;18226:444;-1:-1;;;;18226:444;18677:236;18811:2;18796:18;;34827:1;34817:12;;34807:2;;34833:9;34807:2;5318:57;;;18782:131;;18920:416;19120:2;19134:47;;;5612:2;19105:18;;;33161:19;5648:31;33201:14;;;5628:52;5699:12;;;19091:245;19343:416;19543:2;19557:47;;;5950:1;19528:18;;;33161:19;-1:-1;;;33201:14;;;5965:26;6010:12;;;19514:245;19766:416;19966:2;19980:47;;;6261:2;19951:18;;;33161:19;-1:-1;;;33201:14;;;6277:36;6332:12;;;19937:245;20189:416;20389:2;20403:47;;;6583:2;20374:18;;;33161:19;-1:-1;;;33201:14;;;6599:33;6651:12;;;20360:245;20612:416;20812:2;20826:47;;;6902:2;20797:18;;;33161:19;6938:26;33201:14;;;6918:47;6984:12;;;20783:245;21035:416;21235:2;21249:47;;;7235:2;21220:18;;;33161:19;7271:27;33201:14;;;7251:48;7318:12;;;21206:245;21458:416;21658:2;21672:47;;;7569:1;21643:18;;;33161:19;-1:-1;;;33201:14;;;7584:32;7635:12;;;21629:245;21881:416;22081:2;22095:47;;;7886:2;22066:18;;;33161:19;-1:-1;;;33201:14;;;7902:34;7955:12;;;22052:245;22304:416;22504:2;22518:47;;;22489:18;;;33161:19;8242:34;33201:14;;;8222:55;8296:12;;;22475:245;22727:416;22927:2;22941:47;;;8547:2;22912:18;;;33161:19;-1:-1;;;33201:14;;;8563:37;8619:12;;;22898:245;23150:416;23350:2;23364:47;;;8870:2;23335:18;;;33161:19;8906:34;33201:14;;;8886:55;-1:-1;;;8961:12;;;8954:27;9000:12;;;23321:245;23573:416;23773:2;23787:47;;;9251:2;23758:18;;;33161:19;9287:25;33201:14;;;9267:46;9332:12;;;23744:245;23996:416;24196:2;24210:47;;;9583:1;24181:18;;;33161:19;-1:-1;;;33201:14;;;9598:32;9649:12;;;24167:245;24419:416;24619:2;24633:47;;;9900:2;24604:18;;;33161:19;-1:-1;;;33201:14;;;9916:39;9974:12;;;24590:245;24842:416;25042:2;25056:47;;;10225:2;25027:18;;;33161:19;10261:30;33201:14;;;10241:51;10311:12;;;25013:245;25265:416;25465:2;25479:47;;;10562:2;25450:18;;;33161:19;-1:-1;;;33201:14;;;10578:40;10637:12;;;25436:245;25688:416;25888:2;25902:47;;;10888:2;25873:18;;;33161:19;-1:-1;;;33201:14;;;10904:36;10959:12;;;25859:245;26111:416;26311:2;26325:47;;;11210:2;26296:18;;;33161:19;-1:-1;;;33201:14;;;11226:37;11282:12;;;26282:245;26534:416;26734:2;26748:47;;;11533:2;26719:18;;;33161:19;-1:-1;;;33201:14;;;11549:34;11602:12;;;26705:245;26957:416;27157:2;27171:47;;;11853:2;27142:18;;;33161:19;-1:-1;;;33201:14;;;11869:34;11922:12;;;27128:245;27380:416;27580:2;27594:47;;;12173:1;27565:18;;;33161:19;-1:-1;;;33201:14;;;12188:32;12239:12;;;27551:245;27803:416;28003:2;28017:47;;;12490:1;27988:18;;;33161:19;-1:-1;;;33201:14;;;12505:32;12556:12;;;27974:245;28226:416;28426:2;28440:47;;;12807:2;28411:18;;;33161:19;12843:34;33201:14;;;12823:55;-1:-1;;;12898:12;;;12891:34;12944:12;;;28397:245;28649:416;28849:2;28863:47;;;13195:2;28834:18;;;33161:19;13231:34;33201:14;;;13211:55;-1:-1;;;13286:12;;;13279:26;13324:12;;;28820:245;29072:416;29272:2;29286:47;;;13575:2;29257:18;;;33161:19;13611:30;33201:14;;;13591:51;13661:12;;;29243:245;29495:416;29695:2;29709:47;;;13912:2;29680:18;;;33161:19;-1:-1;;;33201:14;;;13928:45;13992:12;;;29666:245;29918:416;30118:2;30132:47;;;14243:1;30103:18;;;33161:19;-1:-1;;;33201:14;;;14258:32;14309:12;;;30089:245;30341:416;30541:2;30555:47;;;14560:1;30526:18;;;33161:19;-1:-1;;;33201:14;;;14575:27;14621:12;;;30512:245;30764:416;30964:2;30978:47;;;14872:2;30949:18;;;33161:19;-1:-1;;;33201:14;;;14888:39;14946:12;;;30935:245;31187:416;31387:2;31401:47;;;15197:2;31372:18;;;33161:19;-1:-1;;;33201:14;;;15213:38;15270:12;;;31358:245;31610:416;31810:2;31824:47;;;15521:2;31795:18;;;33161:19;-1:-1;;;33201:14;;;15537:38;15594:12;;;31781:245;32033:222;15691:37;;;32160:2;32145:18;;32131:124;32262:321;15691:37;;;33718:13;33711:21;32569:2;32554:18;;4503:34;32411:2;32396:18;;32382:201;32590:333;15691:37;;;32909:2;32894:18;;15691:37;32745:2;32730:18;;32716:207
Swarm Source
ipfs://c1e1b62e47948255d166a6fb5548391cda62d6922ddf060330947b348adb8696
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 27 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.