More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 1,654 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Create DODO Vend... | 196573896 | 386 days ago | IN | 1.35 ETH | 0.00001738 | ||||
Create DODO Vend... | 87946570 | 717 days ago | IN | 1.59271077 ETH | 0.00049714 | ||||
Create DODO Vend... | 86190076 | 722 days ago | IN | 1 ETH | 0.00024179 | ||||
Add DVM Liquidit... | 83479737 | 730 days ago | IN | 1.288136 ETH | 0.00014139 | ||||
Add DVM Liquidit... | 81681118 | 735 days ago | IN | 9.5 ETH | 0.00013887 | ||||
Add DVM Liquidit... | 81375797 | 736 days ago | IN | 26.487817 ETH | 0.00013152 | ||||
Add DVM Liquidit... | 81103211 | 737 days ago | IN | 6.902382 ETH | 0.00010583 | ||||
Add DVM Liquidit... | 81094178 | 737 days ago | IN | 1.39883 ETH | 0.0000955 | ||||
Add DVM Liquidit... | 80660300 | 738 days ago | IN | 5 ETH | 0.00008453 | ||||
Add DVM Liquidit... | 78827277 | 744 days ago | IN | 1.98 ETH | 0.00008458 | ||||
Add DVM Liquidit... | 78305228 | 745 days ago | IN | 1.632258 ETH | 0.00008693 | ||||
External Swap | 77535197 | 748 days ago | IN | 4.95 ETH | 0.0001442 | ||||
External Swap | 77516144 | 748 days ago | IN | 2.4 ETH | 0.00019055 | ||||
Add DVM Liquidit... | 77445134 | 748 days ago | IN | 49.299747 ETH | 0.00012968 | ||||
External Swap | 77320195 | 748 days ago | IN | 10 ETH | 0.00042602 | ||||
Add DVM Liquidit... | 77276601 | 748 days ago | IN | 24.892753 ETH | 0.00011575 | ||||
Add DVM Liquidit... | 77276137 | 748 days ago | IN | 29.831169 ETH | 0.00011377 | ||||
External Swap | 77194130 | 749 days ago | IN | 1.5 ETH | 0.00029883 | ||||
External Swap | 77189709 | 749 days ago | IN | 5.3 ETH | 0.00032683 | ||||
External Swap | 76711890 | 750 days ago | IN | 7.5 ETH | 0.00059455 | ||||
External Swap | 76672022 | 750 days ago | IN | 45.44571422 ETH | 0.00028095 | ||||
External Swap | 76554203 | 750 days ago | IN | 5.16 ETH | 0.00019065 | ||||
External Swap | 76553146 | 750 days ago | IN | 4.8 ETH | 0.00025341 | ||||
Add DVM Liquidit... | 76290936 | 751 days ago | IN | 11.05 ETH | 0.00008207 | ||||
External Swap | 76118021 | 752 days ago | IN | 3.342 ETH | 0.00027858 |
Latest 25 internal transactions (View All)
Advanced mode:
Parent Transaction Hash | Block | From | To | |||
---|---|---|---|---|---|---|
329062956 | 16 hrs ago | 0.1 ETH | ||||
329062956 | 16 hrs ago | 0.1 ETH | ||||
327292939 | 5 days ago | 1.60003384 ETH | ||||
327292939 | 5 days ago | 1.60003384 ETH | ||||
327218220 | 6 days ago | 0.1876612 ETH | ||||
327218220 | 6 days ago | 0.1876612 ETH | ||||
324630531 | 13 days ago | 0.90572487 ETH | ||||
324630531 | 13 days ago | 0.90572487 ETH | ||||
324228903 | 14 days ago | 0.05321515 ETH | ||||
324228903 | 14 days ago | 0.05321515 ETH | ||||
323962990 | 15 days ago | 1.9791032 ETH | ||||
323962990 | 15 days ago | 1.9791032 ETH | ||||
323913579 | 15 days ago | 0.19323355 ETH | ||||
323913579 | 15 days ago | 0.19323355 ETH | ||||
323894112 | 15 days ago | 0.06296227 ETH | ||||
323894112 | 15 days ago | 0.06296227 ETH | ||||
323868945 | 15 days ago | 0.34965835 ETH | ||||
323868945 | 15 days ago | 0.34965835 ETH | ||||
323743775 | 16 days ago | 1.09239585 ETH | ||||
323743775 | 16 days ago | 1.09239585 ETH | ||||
323643075 | 16 days ago | 0.29 ETH | ||||
323643075 | 16 days ago | 0.29 ETH | ||||
322540295 | 19 days ago | 0.001 ETH | ||||
322535267 | 19 days ago | 0.001 ETH | ||||
322260269 | 20 days ago | 0.48827719 ETH |
Loading...
Loading
Contract Name:
DODOV2Proxy02
Compiler Version
v0.6.9+commit.3e3065ac
Contract Source Code (Solidity)
/** *Submitted for verification at Arbiscan.io on 2021-08-30 */ // File: contracts/SmartRoute/intf/IDODOV2Proxy01.sol /* Copyright 2020 DODO ZOO. SPDX-License-Identifier: Apache-2.0 */ pragma solidity 0.6.9; pragma experimental ABIEncoderV2; interface IDODOV2Proxy01 { function dodoSwapV2ETHToToken( address toToken, uint256 minReturnAmount, address[] memory dodoPairs, uint256 directions, bool isIncentive, uint256 deadLine ) external payable returns (uint256 returnAmount); function dodoSwapV2TokenToETH( address fromToken, uint256 fromTokenAmount, uint256 minReturnAmount, address[] memory dodoPairs, uint256 directions, bool isIncentive, uint256 deadLine ) external returns (uint256 returnAmount); function dodoSwapV2TokenToToken( address fromToken, address toToken, uint256 fromTokenAmount, uint256 minReturnAmount, address[] memory dodoPairs, uint256 directions, bool isIncentive, uint256 deadLine ) external returns (uint256 returnAmount); function createDODOVendingMachine( address baseToken, address quoteToken, uint256 baseInAmount, uint256 quoteInAmount, uint256 lpFeeRate, uint256 i, uint256 k, bool isOpenTWAP, uint256 deadLine ) external payable returns (address newVendingMachine, uint256 shares); function addDVMLiquidity( address dvmAddress, uint256 baseInAmount, uint256 quoteInAmount, uint256 baseMinAmount, uint256 quoteMinAmount, uint8 flag, // 0 - ERC20, 1 - baseInETH, 2 - quoteInETH uint256 deadLine ) external payable returns ( uint256 shares, uint256 baseAdjustedInAmount, uint256 quoteAdjustedInAmount ); function createDODOPrivatePool( address baseToken, address quoteToken, uint256 baseInAmount, uint256 quoteInAmount, uint256 lpFeeRate, uint256 i, uint256 k, bool isOpenTwap, uint256 deadLine ) external payable returns (address newPrivatePool); function resetDODOPrivatePool( address dppAddress, uint256[] memory paramList, //0 - newLpFeeRate, 1 - newI, 2 - newK uint256[] memory amountList, //0 - baseInAmount, 1 - quoteInAmount, 2 - baseOutAmount, 3 - quoteOutAmount uint8 flag, // 0 - ERC20, 1 - baseInETH, 2 - quoteInETH, 3 - baseOutETH, 4 - quoteOutETH uint256 minBaseReserve, uint256 minQuoteReserve, uint256 deadLine ) external payable; function bid( address cpAddress, uint256 quoteAmount, uint8 flag, // 0 - ERC20, 1 - quoteInETH uint256 deadLine ) external payable; function addLiquidityToV1( address pair, uint256 baseAmount, uint256 quoteAmount, uint256 baseMinShares, uint256 quoteMinShares, uint8 flag, // 0 erc20 Out 1 baseInETH 2 quoteInETH uint256 deadLine ) external payable returns(uint256, uint256); function dodoSwapV1( address fromToken, address toToken, uint256 fromTokenAmount, uint256 minReturnAmount, address[] memory dodoPairs, uint256 directions, bool isIncentive, uint256 deadLine ) external payable returns (uint256 returnAmount); function externalSwap( address fromToken, address toToken, address approveTarget, address to, uint256 fromTokenAmount, uint256 minReturnAmount, bytes memory callDataConcat, bool isIncentive, uint256 deadLine ) external payable returns (uint256 returnAmount); function mixSwap( address fromToken, address toToken, uint256 fromTokenAmount, uint256 minReturnAmount, address[] memory mixAdapters, address[] memory mixPairs, address[] memory assetTo, uint256 directions, bool isIncentive, uint256 deadLine ) external payable returns (uint256 returnAmount); } // File: contracts/SmartRoute/intf/IDODOV2.sol interface IDODOV2 { //========== Common ================== function sellBase(address to) external returns (uint256 receiveQuoteAmount); function sellQuote(address to) external returns (uint256 receiveBaseAmount); function getVaultReserve() external view returns (uint256 baseReserve, uint256 quoteReserve); function _BASE_TOKEN_() external view returns (address); function _QUOTE_TOKEN_() external view returns (address); function getPMMStateForCall() external view returns ( uint256 i, uint256 K, uint256 B, uint256 Q, uint256 B0, uint256 Q0, uint256 R ); function getUserFeeRate(address user) external view returns (uint256 lpFeeRate, uint256 mtFeeRate); function getDODOPoolBidirection(address token0, address token1) external view returns (address[] memory, address[] memory); //========== DODOVendingMachine ======== function createDODOVendingMachine( address baseToken, address quoteToken, uint256 lpFeeRate, uint256 i, uint256 k, bool isOpenTWAP ) external returns (address newVendingMachine); function buyShares(address to) external returns (uint256,uint256,uint256); //========== DODOPrivatePool =========== function createDODOPrivatePool() external returns (address newPrivatePool); function initDODOPrivatePool( address dppAddress, address creator, address baseToken, address quoteToken, uint256 lpFeeRate, uint256 k, uint256 i, bool isOpenTwap ) external; function reset( address operator, uint256 newLpFeeRate, uint256 newI, uint256 newK, uint256 baseOutAmount, uint256 quoteOutAmount, uint256 minBaseReserve, uint256 minQuoteReserve ) external returns (bool); function _OWNER_() external returns (address); //========== CrowdPooling =========== function createCrowdPooling() external returns (address payable newCrowdPooling); function initCrowdPooling( address cpAddress, address creator, address baseToken, address quoteToken, uint256[] memory timeLine, uint256[] memory valueList, bool isOpenTWAP ) external; function bid(address to) external; } // File: contracts/SmartRoute/intf/IDODOV1.sol interface IDODOV1 { function init( address owner, address supervisor, address maintainer, address baseToken, address quoteToken, address oracle, uint256 lpFeeRate, uint256 mtFeeRate, uint256 k, uint256 gasPriceLimit ) external; function transferOwnership(address newOwner) external; function claimOwnership() external; function sellBaseToken( uint256 amount, uint256 minReceiveQuote, bytes calldata data ) external returns (uint256); function buyBaseToken( uint256 amount, uint256 maxPayQuote, bytes calldata data ) external returns (uint256); function querySellBaseToken(uint256 amount) external view returns (uint256 receiveQuote); function queryBuyBaseToken(uint256 amount) external view returns (uint256 payQuote); function depositBaseTo(address to, uint256 amount) external returns (uint256); function withdrawBase(uint256 amount) external returns (uint256); function withdrawAllBase() external returns (uint256); function depositQuoteTo(address to, uint256 amount) external returns (uint256); function withdrawQuote(uint256 amount) external returns (uint256); function withdrawAllQuote() external returns (uint256); function _BASE_CAPITAL_TOKEN_() external returns (address); function _QUOTE_CAPITAL_TOKEN_() external returns (address); function _BASE_TOKEN_() external view returns (address); function _QUOTE_TOKEN_() external view returns (address); function _R_STATUS_() external view returns (uint8); function _QUOTE_BALANCE_() external view returns (uint256); function _BASE_BALANCE_() external view returns (uint256); function _K_() external view returns (uint256); function _MT_FEE_RATE_() external view returns (uint256); function _LP_FEE_RATE_() external view returns (uint256); function getExpectedTarget() external view returns (uint256 baseTarget, uint256 quoteTarget); function getOraclePrice() external view returns (uint256); function getMidPrice() external view returns (uint256 midPrice); } // File: contracts/intf/IDODOApprove.sol interface IDODOApprove { function claimTokens(address token,address who,address dest,uint256 amount) external; function getDODOProxy() external view returns (address); } // File: contracts/lib/InitializableOwnable.sol /** * @title Ownable * @author DODO Breeder * * @notice Ownership related functions */ contract InitializableOwnable { address public _OWNER_; address public _NEW_OWNER_; bool internal _INITIALIZED_; // ============ Events ============ event OwnershipTransferPrepared(address indexed previousOwner, address indexed newOwner); event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); // ============ Modifiers ============ modifier notInitialized() { require(!_INITIALIZED_, "DODO_INITIALIZED"); _; } modifier onlyOwner() { require(msg.sender == _OWNER_, "NOT_OWNER"); _; } // ============ Functions ============ function initOwner(address newOwner) public notInitialized { _INITIALIZED_ = true; _OWNER_ = newOwner; } function transferOwnership(address newOwner) public onlyOwner { emit OwnershipTransferPrepared(_OWNER_, newOwner); _NEW_OWNER_ = newOwner; } function claimOwnership() public { require(msg.sender == _NEW_OWNER_, "INVALID_CLAIM"); emit OwnershipTransferred(_OWNER_, _NEW_OWNER_); _OWNER_ = _NEW_OWNER_; _NEW_OWNER_ = address(0); } } // File: contracts/SmartRoute/DODOApproveProxy.sol interface IDODOApproveProxy { function isAllowedProxy(address _proxy) external view returns (bool); function claimTokens(address token,address who,address dest,uint256 amount) external; } /** * @title DODOApproveProxy * @author DODO Breeder * * @notice Allow different version dodoproxy to claim from DODOApprove */ contract DODOApproveProxy is InitializableOwnable { // ============ Storage ============ uint256 private constant _TIMELOCK_DURATION_ = 3 days; mapping (address => bool) public _IS_ALLOWED_PROXY_; uint256 public _TIMELOCK_; address public _PENDING_ADD_DODO_PROXY_; address public immutable _DODO_APPROVE_; // ============ Modifiers ============ modifier notLocked() { require( _TIMELOCK_ <= block.timestamp, "SetProxy is timelocked" ); _; } constructor(address dodoApporve) public { _DODO_APPROVE_ = dodoApporve; } function init(address owner, address[] memory proxies) external { initOwner(owner); for(uint i = 0; i < proxies.length; i++) _IS_ALLOWED_PROXY_[proxies[i]] = true; } function unlockAddProxy(address newDodoProxy) public onlyOwner { _TIMELOCK_ = block.timestamp + _TIMELOCK_DURATION_; _PENDING_ADD_DODO_PROXY_ = newDodoProxy; } function lockAddProxy() public onlyOwner { _PENDING_ADD_DODO_PROXY_ = address(0); _TIMELOCK_ = 0; } function addDODOProxy() external onlyOwner notLocked() { _IS_ALLOWED_PROXY_[_PENDING_ADD_DODO_PROXY_] = true; lockAddProxy(); } function removeDODOProxy (address oldDodoProxy) public onlyOwner { _IS_ALLOWED_PROXY_[oldDodoProxy] = false; } function claimTokens( address token, address who, address dest, uint256 amount ) external { require(_IS_ALLOWED_PROXY_[msg.sender], "DODOApproveProxy:Access restricted"); IDODOApprove(_DODO_APPROVE_).claimTokens( token, who, dest, amount ); } function isAllowedProxy(address _proxy) external view returns (bool) { return _IS_ALLOWED_PROXY_[_proxy]; } } // File: contracts/lib/SafeMath.sol /** * @title SafeMath * @author DODO Breeder * * @notice Math operations with safety checks that revert on error */ library SafeMath { function mul(uint256 a, uint256 b) internal pure returns (uint256) { if (a == 0) { return 0; } uint256 c = a * b; require(c / a == b, "MUL_ERROR"); return c; } function div(uint256 a, uint256 b) internal pure returns (uint256) { require(b > 0, "DIVIDING_ERROR"); return a / b; } function divCeil(uint256 a, uint256 b) internal pure returns (uint256) { uint256 quotient = div(a, b); uint256 remainder = a - quotient * b; if (remainder > 0) { return quotient + 1; } else { return quotient; } } function sub(uint256 a, uint256 b) internal pure returns (uint256) { require(b <= a, "SUB_ERROR"); return a - b; } function add(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c = a + b; require(c >= a, "ADD_ERROR"); return c; } function sqrt(uint256 x) internal pure returns (uint256 y) { uint256 z = x / 2 + 1; y = x; while (z < y) { y = z; z = (x / z + z) / 2; } } } // File: contracts/lib/DecimalMath.sol /** * @title DecimalMath * @author DODO Breeder * * @notice Functions for fixed point number with 18 decimals */ library DecimalMath { using SafeMath for uint256; uint256 internal constant ONE = 10**18; uint256 internal constant ONE2 = 10**36; function mulFloor(uint256 target, uint256 d) internal pure returns (uint256) { return target.mul(d) / (10**18); } function mulCeil(uint256 target, uint256 d) internal pure returns (uint256) { return target.mul(d).divCeil(10**18); } function divFloor(uint256 target, uint256 d) internal pure returns (uint256) { return target.mul(10**18).div(d); } function divCeil(uint256 target, uint256 d) internal pure returns (uint256) { return target.mul(10**18).divCeil(d); } function reciprocalFloor(uint256 target) internal pure returns (uint256) { return uint256(10**36).div(target); } function reciprocalCeil(uint256 target) internal pure returns (uint256) { return uint256(10**36).divCeil(target); } } // File: contracts/SmartRoute/helper/DODOSellHelper.sol // import {DODOMath} from "../lib/DODOMath.sol"; interface IDODOSellHelper { function querySellQuoteToken(address dodo, uint256 amount) external view returns (uint256); function querySellBaseToken(address dodo, uint256 amount) external view returns (uint256); } 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.mulFloor(i, V1.sub(V2)); // i*delta uint256 V0V0V1V2 = DecimalMath.divCeil(V0.mul(V0).div(V1), V2); uint256 penalty = DecimalMath.mulFloor(k, V0V0V1V2); // k(V0^2/V1/V2) return DecimalMath.mulFloor(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.mulFloor(k, Q0).mul(Q0).div(Q1); // kQ0^2/Q1 uint256 b = DecimalMath.mulFloor(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.mulFloor( DecimalMath.ONE.sub(k).mul(4), DecimalMath.mulFloor(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.mulFloor(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.mulFloor(V1, DecimalMath.ONE.add(premium)); } } contract DODOSellHelper { using SafeMath for uint256; enum RStatus {ONE, ABOVE_ONE, BELOW_ONE} uint256 constant ONE = 10**18; struct DODOState { uint256 oraclePrice; uint256 K; uint256 B; uint256 Q; uint256 baseTarget; uint256 quoteTarget; RStatus rStatus; } function querySellBaseToken(address dodo, uint256 amount) public view returns (uint256) { return IDODOV1(dodo).querySellBaseToken(amount); } function querySellQuoteToken(address dodo, uint256 amount) public view returns (uint256) { DODOState memory state; (state.baseTarget, state.quoteTarget) = IDODOV1(dodo).getExpectedTarget(); state.rStatus = RStatus(IDODOV1(dodo)._R_STATUS_()); state.oraclePrice = IDODOV1(dodo).getOraclePrice(); state.Q = IDODOV1(dodo)._QUOTE_BALANCE_(); state.B = IDODOV1(dodo)._BASE_BALANCE_(); state.K = IDODOV1(dodo)._K_(); uint256 boughtAmount; // Determine the status (RStatus) and calculate the amount // based on the state if (state.rStatus == RStatus.ONE) { boughtAmount = _ROneSellQuoteToken(amount, state); } else if (state.rStatus == RStatus.ABOVE_ONE) { boughtAmount = _RAboveSellQuoteToken(amount, state); } else { uint256 backOneBase = state.B.sub(state.baseTarget); uint256 backOneQuote = state.quoteTarget.sub(state.Q); if (amount <= backOneQuote) { boughtAmount = _RBelowSellQuoteToken(amount, state); } else { boughtAmount = backOneBase.add( _ROneSellQuoteToken(amount.sub(backOneQuote), state) ); } } // Calculate fees return DecimalMath.divFloor( boughtAmount, DecimalMath.ONE.add(IDODOV1(dodo)._MT_FEE_RATE_()).add( IDODOV1(dodo)._LP_FEE_RATE_() ) ); } function _ROneSellQuoteToken(uint256 amount, DODOState memory state) internal pure returns (uint256 receiveBaseToken) { uint256 i = DecimalMath.divFloor(ONE, state.oraclePrice); uint256 B2 = DODOMath._SolveQuadraticFunctionForTrade( state.baseTarget, state.baseTarget, DecimalMath.mulFloor(i, amount), false, state.K ); return state.baseTarget.sub(B2); } function _RAboveSellQuoteToken(uint256 amount, DODOState memory state) internal pure returns (uint256 receieBaseToken) { uint256 i = DecimalMath.divFloor(ONE, state.oraclePrice); uint256 B2 = DODOMath._SolveQuadraticFunctionForTrade( state.baseTarget, state.B, DecimalMath.mulFloor(i, amount), false, state.K ); return state.B.sub(B2); } function _RBelowSellQuoteToken(uint256 amount, DODOState memory state) internal pure returns (uint256 receiveBaseToken) { uint256 Q1 = state.Q.add(amount); uint256 i = DecimalMath.divFloor(ONE, state.oraclePrice); return DODOMath._GeneralIntegrate(state.quoteTarget, Q1, state.Q, i, state.K); } } // File: contracts/intf/IERC20.sol /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); function decimals() external view returns (uint8); function name() external view returns (string memory); function symbol() 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/intf/IWETH.sol interface IWETH { function totalSupply() external view returns (uint256); function balanceOf(address account) external view returns (uint256); function transfer(address recipient, uint256 amount) external returns (bool); function allowance(address owner, address spender) external view returns (uint256); function approve(address spender, uint256 amount) external returns (bool); function transferFrom( address src, address dst, uint256 wad ) external returns (bool); function deposit() external payable; function withdraw(uint256 wad) external; } // File: contracts/SmartRoute/intf/IUni.sol interface IUni { function swapExactTokensForTokens( uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline ) external returns (uint[] memory amounts); function swap(uint amount0Out, uint amount1Out, address to, bytes calldata data) external; function getReserves() external view returns (uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast); function token0() external view returns (address); function token1() external view returns (address); } // File: contracts/lib/SafeERC20.sol /** * @title SafeERC20 * @dev Wrappers around ERC20 operations that throw on failure (when the token * contract returns false). Tokens that return no value (and instead revert or * throw on failure) are also supported, non-reverting calls are assumed to be * successful. * To use this library you can add a `using SafeERC20 for ERC20;` statement to your contract, * which allows you to call the safe operations as `token.safeTransfer(...)`, etc. */ library SafeERC20 { using SafeMath for uint256; function safeTransfer( IERC20 token, address to, uint256 value ) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value)); } function safeTransferFrom( IERC20 token, address from, address to, uint256 value ) internal { _callOptionalReturn( token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value) ); } function safeApprove( IERC20 token, address spender, uint256 value ) internal { // safeApprove should only be called when setting an initial allowance, // or when resetting it to zero. To increase and decrease it, use // 'safeIncreaseAllowance' and 'safeDecreaseAllowance' // solhint-disable-next-line max-line-length require( (value == 0) || (token.allowance(address(this), spender) == 0), "SafeERC20: approve from non-zero to non-zero allowance" ); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value)); } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). */ function _callOptionalReturn(IERC20 token, bytes memory data) private { // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since // we're implementing it ourselves. // A Solidity high level call has three parts: // 1. The target address is checked to verify it contains contract code // 2. The call itself is made, and success asserted // 3. The return value is decoded, which in turn checks the size of the returned data. // solhint-disable-next-line max-line-length // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = address(token).call(data); require(success, "SafeERC20: low-level call failed"); if (returndata.length > 0) { // Return data is optional // solhint-disable-next-line max-line-length require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed"); } } } // File: contracts/SmartRoute/lib/UniversalERC20.sol library UniversalERC20 { using SafeMath for uint256; using SafeERC20 for IERC20; IERC20 private constant ETH_ADDRESS = IERC20(0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE); function universalTransfer( IERC20 token, address payable to, uint256 amount ) internal { if (amount > 0) { if (isETH(token)) { to.transfer(amount); } else { token.safeTransfer(to, amount); } } } function universalApproveMax( IERC20 token, address to, uint256 amount ) internal { uint256 allowance = token.allowance(address(this), to); if (allowance < amount) { if (allowance > 0) { token.safeApprove(to, 0); } token.safeApprove(to, uint256(-1)); } } function universalBalanceOf(IERC20 token, address who) internal view returns (uint256) { if (isETH(token)) { return who.balance; } else { return token.balanceOf(who); } } function tokenBalanceOf(IERC20 token, address who) internal view returns (uint256) { return token.balanceOf(who); } function isETH(IERC20 token) internal pure returns (bool) { return token == ETH_ADDRESS; } } // File: contracts/lib/ReentrancyGuard.sol /** * @title ReentrancyGuard * @author DODO Breeder * * @notice Protect functions from Reentrancy Attack */ contract ReentrancyGuard { // https://solidity.readthedocs.io/en/latest/control-structures.html?highlight=zero-state#scoping-and-declarations // zero-state of _ENTERED_ is false bool private _ENTERED_; modifier preventReentrant() { require(!_ENTERED_, "REENTRANT"); _ENTERED_ = true; _; _ENTERED_ = false; } } // File: contracts/SmartRoute/intf/IDODOAdapter.sol interface IDODOAdapter { function sellBase(address to, address pool, bytes memory data) external; function sellQuote(address to, address pool, bytes memory data) external; } // File: contracts/SmartRoute/DODOV2Proxy02.sol /** * @title DODOV2Proxy02 * @author DODO Breeder * * @notice Entrance of trading in DODO platform */ contract DODOV2Proxy02 is IDODOV2Proxy01, ReentrancyGuard, InitializableOwnable { using SafeMath for uint256; using UniversalERC20 for IERC20; // ============ Storage ============ address constant _ETH_ADDRESS_ = 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE; address public immutable _WETH_; address public immutable _DODO_APPROVE_PROXY_; address public immutable _DODO_SELL_HELPER_; address public immutable _DVM_FACTORY_; address public immutable _DPP_FACTORY_; mapping (address => bool) public isWhiteListed; // ============ Events ============ event OrderHistory( address fromToken, address toToken, address sender, uint256 fromAmount, uint256 returnAmount ); // ============ Modifiers ============ modifier judgeExpired(uint256 deadLine) { require(deadLine >= block.timestamp, "DODOV2Proxy02: EXPIRED"); _; } fallback() external payable {} receive() external payable {} constructor( address dvmFactory, address dppFactory, address payable weth, address dodoApproveProxy, address dodoSellHelper ) public { _DVM_FACTORY_ = dvmFactory; _DPP_FACTORY_ = dppFactory; _WETH_ = weth; _DODO_APPROVE_PROXY_ = dodoApproveProxy; _DODO_SELL_HELPER_ = dodoSellHelper; } function addWhiteList (address contractAddr) public onlyOwner { isWhiteListed[contractAddr] = true; } function removeWhiteList (address contractAddr) public onlyOwner { isWhiteListed[contractAddr] = false; } // ============ DVM Functions (create & add liquidity) ============ function createDODOVendingMachine( address baseToken, address quoteToken, uint256 baseInAmount, uint256 quoteInAmount, uint256 lpFeeRate, uint256 i, uint256 k, bool isOpenTWAP, uint256 deadLine ) external override payable preventReentrant judgeExpired(deadLine) returns (address newVendingMachine, uint256 shares) { { address _baseToken = baseToken == _ETH_ADDRESS_ ? _WETH_ : baseToken; address _quoteToken = quoteToken == _ETH_ADDRESS_ ? _WETH_ : quoteToken; newVendingMachine = IDODOV2(_DVM_FACTORY_).createDODOVendingMachine( _baseToken, _quoteToken, lpFeeRate, i, k, isOpenTWAP ); } { address _baseToken = baseToken; address _quoteToken = quoteToken; _deposit( msg.sender, newVendingMachine, _baseToken, baseInAmount, _baseToken == _ETH_ADDRESS_ ); _deposit( msg.sender, newVendingMachine, _quoteToken, quoteInAmount, _quoteToken == _ETH_ADDRESS_ ); } (shares, , ) = IDODOV2(newVendingMachine).buyShares(msg.sender); } function addDVMLiquidity( address dvmAddress, uint256 baseInAmount, uint256 quoteInAmount, uint256 baseMinAmount, uint256 quoteMinAmount, uint8 flag, // 0 - ERC20, 1 - baseInETH, 2 - quoteInETH uint256 deadLine ) external override payable preventReentrant judgeExpired(deadLine) returns ( uint256 shares, uint256 baseAdjustedInAmount, uint256 quoteAdjustedInAmount ) { address _dvm = dvmAddress; (baseAdjustedInAmount, quoteAdjustedInAmount) = _addDVMLiquidity( _dvm, baseInAmount, quoteInAmount ); require( baseAdjustedInAmount >= baseMinAmount && quoteAdjustedInAmount >= quoteMinAmount, "DODOV2Proxy02: deposit amount is not enough" ); _deposit(msg.sender, _dvm, IDODOV2(_dvm)._BASE_TOKEN_(), baseAdjustedInAmount, flag == 1); _deposit(msg.sender, _dvm, IDODOV2(_dvm)._QUOTE_TOKEN_(), quoteAdjustedInAmount, flag == 2); (shares, , ) = IDODOV2(_dvm).buyShares(msg.sender); // refund dust eth if (flag == 1 && msg.value > baseAdjustedInAmount) msg.sender.transfer(msg.value - baseAdjustedInAmount); if (flag == 2 && msg.value > quoteAdjustedInAmount) msg.sender.transfer(msg.value - quoteAdjustedInAmount); } function _addDVMLiquidity( address dvmAddress, uint256 baseInAmount, uint256 quoteInAmount ) internal view returns (uint256 baseAdjustedInAmount, uint256 quoteAdjustedInAmount) { (uint256 baseReserve, uint256 quoteReserve) = IDODOV2(dvmAddress).getVaultReserve(); if (quoteReserve == 0 && baseReserve == 0) { baseAdjustedInAmount = baseInAmount; quoteAdjustedInAmount = quoteInAmount; } if (quoteReserve == 0 && baseReserve > 0) { baseAdjustedInAmount = baseInAmount; quoteAdjustedInAmount = 0; } if (quoteReserve > 0 && baseReserve > 0) { uint256 baseIncreaseRatio = DecimalMath.divFloor(baseInAmount, baseReserve); uint256 quoteIncreaseRatio = DecimalMath.divFloor(quoteInAmount, quoteReserve); if (baseIncreaseRatio <= quoteIncreaseRatio) { baseAdjustedInAmount = baseInAmount; quoteAdjustedInAmount = DecimalMath.mulFloor(quoteReserve, baseIncreaseRatio); } else { quoteAdjustedInAmount = quoteInAmount; baseAdjustedInAmount = DecimalMath.mulFloor(baseReserve, quoteIncreaseRatio); } } } // ============ DPP Functions (create & reset) ============ function createDODOPrivatePool( address baseToken, address quoteToken, uint256 baseInAmount, uint256 quoteInAmount, uint256 lpFeeRate, uint256 i, uint256 k, bool isOpenTwap, uint256 deadLine ) external override payable preventReentrant judgeExpired(deadLine) returns (address newPrivatePool) { newPrivatePool = IDODOV2(_DPP_FACTORY_).createDODOPrivatePool(); address _baseToken = baseToken; address _quoteToken = quoteToken; _deposit(msg.sender, newPrivatePool, _baseToken, baseInAmount, _baseToken == _ETH_ADDRESS_); _deposit( msg.sender, newPrivatePool, _quoteToken, quoteInAmount, _quoteToken == _ETH_ADDRESS_ ); if (_baseToken == _ETH_ADDRESS_) _baseToken = _WETH_; if (_quoteToken == _ETH_ADDRESS_) _quoteToken = _WETH_; IDODOV2(_DPP_FACTORY_).initDODOPrivatePool( newPrivatePool, msg.sender, _baseToken, _quoteToken, lpFeeRate, k, i, isOpenTwap ); } function resetDODOPrivatePool( address dppAddress, uint256[] memory paramList, //0 - newLpFeeRate, 1 - newI, 2 - newK uint256[] memory amountList, //0 - baseInAmount, 1 - quoteInAmount, 2 - baseOutAmount, 3- quoteOutAmount uint8 flag, // 0 - ERC20, 1 - baseInETH, 2 - quoteInETH, 3 - baseOutETH, 4 - quoteOutETH uint256 minBaseReserve, uint256 minQuoteReserve, uint256 deadLine ) external override payable preventReentrant judgeExpired(deadLine) { _deposit( msg.sender, dppAddress, IDODOV2(dppAddress)._BASE_TOKEN_(), amountList[0], flag == 1 ); _deposit( msg.sender, dppAddress, IDODOV2(dppAddress)._QUOTE_TOKEN_(), amountList[1], flag == 2 ); require(IDODOV2(IDODOV2(dppAddress)._OWNER_()).reset( msg.sender, paramList[0], paramList[1], paramList[2], amountList[2], amountList[3], minBaseReserve, minQuoteReserve ), "Reset Failed"); _withdraw(msg.sender, IDODOV2(dppAddress)._BASE_TOKEN_(), amountList[2], flag == 3); _withdraw(msg.sender, IDODOV2(dppAddress)._QUOTE_TOKEN_(), amountList[3], flag == 4); } // ============ Swap ============ function dodoSwapV2ETHToToken( address toToken, uint256 minReturnAmount, address[] memory dodoPairs, uint256 directions, bool, uint256 deadLine ) external override payable judgeExpired(deadLine) returns (uint256 returnAmount) { require(dodoPairs.length > 0, "DODOV2Proxy02: PAIRS_EMPTY"); require(minReturnAmount > 0, "DODOV2Proxy02: RETURN_AMOUNT_ZERO"); uint256 originToTokenBalance = IERC20(toToken).balanceOf(msg.sender); IWETH(_WETH_).deposit{value: msg.value}(); IWETH(_WETH_).transfer(dodoPairs[0], msg.value); for (uint256 i = 0; i < dodoPairs.length; i++) { if (i == dodoPairs.length - 1) { if (directions & 1 == 0) { IDODOV2(dodoPairs[i]).sellBase(msg.sender); } else { IDODOV2(dodoPairs[i]).sellQuote(msg.sender); } } else { if (directions & 1 == 0) { IDODOV2(dodoPairs[i]).sellBase(dodoPairs[i + 1]); } else { IDODOV2(dodoPairs[i]).sellQuote(dodoPairs[i + 1]); } } directions = directions >> 1; } returnAmount = IERC20(toToken).balanceOf(msg.sender).sub(originToTokenBalance); require(returnAmount >= minReturnAmount, "DODOV2Proxy02: Return amount is not enough"); emit OrderHistory( _ETH_ADDRESS_, toToken, msg.sender, msg.value, returnAmount ); } function dodoSwapV2TokenToETH( address fromToken, uint256 fromTokenAmount, uint256 minReturnAmount, address[] memory dodoPairs, uint256 directions, bool, uint256 deadLine ) external override judgeExpired(deadLine) returns (uint256 returnAmount) { require(dodoPairs.length > 0, "DODOV2Proxy02: PAIRS_EMPTY"); require(minReturnAmount > 0, "DODOV2Proxy02: RETURN_AMOUNT_ZERO"); IDODOApproveProxy(_DODO_APPROVE_PROXY_).claimTokens(fromToken, msg.sender, dodoPairs[0], fromTokenAmount); for (uint256 i = 0; i < dodoPairs.length; i++) { if (i == dodoPairs.length - 1) { if (directions & 1 == 0) { IDODOV2(dodoPairs[i]).sellBase(address(this)); } else { IDODOV2(dodoPairs[i]).sellQuote(address(this)); } } else { if (directions & 1 == 0) { IDODOV2(dodoPairs[i]).sellBase(dodoPairs[i + 1]); } else { IDODOV2(dodoPairs[i]).sellQuote(dodoPairs[i + 1]); } } directions = directions >> 1; } returnAmount = IWETH(_WETH_).balanceOf(address(this)); require(returnAmount >= minReturnAmount, "DODOV2Proxy02: Return amount is not enough"); IWETH(_WETH_).withdraw(returnAmount); msg.sender.transfer(returnAmount); emit OrderHistory( fromToken, _ETH_ADDRESS_, msg.sender, fromTokenAmount, returnAmount ); } function dodoSwapV2TokenToToken( address fromToken, address toToken, uint256 fromTokenAmount, uint256 minReturnAmount, address[] memory dodoPairs, uint256 directions, bool, uint256 deadLine ) external override judgeExpired(deadLine) returns (uint256 returnAmount) { require(dodoPairs.length > 0, "DODOV2Proxy02: PAIRS_EMPTY"); require(minReturnAmount > 0, "DODOV2Proxy02: RETURN_AMOUNT_ZERO"); uint256 originToTokenBalance = IERC20(toToken).balanceOf(msg.sender); IDODOApproveProxy(_DODO_APPROVE_PROXY_).claimTokens(fromToken, msg.sender, dodoPairs[0], fromTokenAmount); for (uint256 i = 0; i < dodoPairs.length; i++) { if (i == dodoPairs.length - 1) { if (directions & 1 == 0) { IDODOV2(dodoPairs[i]).sellBase(msg.sender); } else { IDODOV2(dodoPairs[i]).sellQuote(msg.sender); } } else { if (directions& 1 == 0) { IDODOV2(dodoPairs[i]).sellBase(dodoPairs[i + 1]); } else { IDODOV2(dodoPairs[i]).sellQuote(dodoPairs[i + 1]); } } directions = directions >> 1; } returnAmount = IERC20(toToken).balanceOf(msg.sender).sub(originToTokenBalance); require(returnAmount >= minReturnAmount, "DODOV2Proxy02: Return amount is not enough"); emit OrderHistory( fromToken, toToken, msg.sender, fromTokenAmount, returnAmount ); } function externalSwap( address fromToken, address toToken, address approveTarget, address swapTarget, uint256 fromTokenAmount, uint256 minReturnAmount, bytes memory callDataConcat, bool, uint256 deadLine ) external override payable judgeExpired(deadLine) returns (uint256 returnAmount) { require(minReturnAmount > 0, "DODOV2Proxy02: RETURN_AMOUNT_ZERO"); uint256 toTokenOriginBalance = IERC20(toToken).universalBalanceOf(msg.sender); if (fromToken != _ETH_ADDRESS_) { IDODOApproveProxy(_DODO_APPROVE_PROXY_).claimTokens( fromToken, msg.sender, address(this), fromTokenAmount ); IERC20(fromToken).universalApproveMax(approveTarget, fromTokenAmount); } require(isWhiteListed[swapTarget], "DODOV2Proxy02: Not Whitelist Contract"); (bool success, ) = swapTarget.call{value: fromToken == _ETH_ADDRESS_ ? msg.value : 0}(callDataConcat); require(success, "DODOV2Proxy02: External Swap execution Failed"); IERC20(toToken).universalTransfer( msg.sender, IERC20(toToken).universalBalanceOf(address(this)) ); returnAmount = IERC20(toToken).universalBalanceOf(msg.sender).sub(toTokenOriginBalance); require(returnAmount >= minReturnAmount, "DODOV2Proxy02: Return amount is not enough"); emit OrderHistory( fromToken, toToken, msg.sender, fromTokenAmount, returnAmount ); } function dodoSwapV1( address fromToken, address toToken, uint256 fromTokenAmount, uint256 minReturnAmount, address[] memory dodoPairs, uint256 directions, bool, uint256 deadLine ) external override payable judgeExpired(deadLine) returns (uint256 returnAmount) { require(dodoPairs.length > 0, "DODOV2Proxy02: PAIRS_EMPTY"); require(minReturnAmount > 0, "DODOV2Proxy02: RETURN_AMOUNT_ZERO"); address _fromToken = fromToken; address _toToken = toToken; _deposit(msg.sender, address(this), _fromToken, fromTokenAmount, _fromToken == _ETH_ADDRESS_); for (uint256 i = 0; i < dodoPairs.length; i++) { address curDodoPair = dodoPairs[i]; if (directions & 1 == 0) { address curDodoBase = IDODOV1(curDodoPair)._BASE_TOKEN_(); uint256 curAmountIn = IERC20(curDodoBase).balanceOf(address(this)); IERC20(curDodoBase).universalApproveMax(curDodoPair, curAmountIn); IDODOV1(curDodoPair).sellBaseToken(curAmountIn, 0, ""); } else { address curDodoQuote = IDODOV1(curDodoPair)._QUOTE_TOKEN_(); uint256 curAmountIn = IERC20(curDodoQuote).balanceOf(address(this)); IERC20(curDodoQuote).universalApproveMax(curDodoPair, curAmountIn); uint256 canBuyBaseAmount = IDODOSellHelper(_DODO_SELL_HELPER_).querySellQuoteToken( curDodoPair, curAmountIn ); IDODOV1(curDodoPair).buyBaseToken(canBuyBaseAmount, curAmountIn, ""); } directions = directions >> 1; } if (_toToken == _ETH_ADDRESS_) { returnAmount = IWETH(_WETH_).balanceOf(address(this)); IWETH(_WETH_).withdraw(returnAmount); } else { returnAmount = IERC20(_toToken).tokenBalanceOf(address(this)); } require(returnAmount >= minReturnAmount, "DODOV2Proxy02: Return amount is not enough"); IERC20(_toToken).universalTransfer(msg.sender, returnAmount); emit OrderHistory(_fromToken, _toToken, msg.sender, fromTokenAmount, returnAmount); } function mixSwap( address fromToken, address toToken, uint256 fromTokenAmount, uint256 minReturnAmount, address[] memory mixAdapters, address[] memory mixPairs, address[] memory assetTo, uint256 directions, bool, uint256 deadLine ) external override payable judgeExpired(deadLine) returns (uint256 returnAmount) { require(mixPairs.length > 0, "DODOV2Proxy02: PAIRS_EMPTY"); require(mixPairs.length == mixAdapters.length, "DODOV2Proxy02: PAIR_ADAPTER_NOT_MATCH"); require(mixPairs.length == assetTo.length - 1, "DODOV2Proxy02: PAIR_ASSETTO_NOT_MATCH"); require(minReturnAmount > 0, "DODOV2Proxy02: RETURN_AMOUNT_ZERO"); address _fromToken = fromToken; address _toToken = toToken; uint256 _fromTokenAmount = fromTokenAmount; uint256 toTokenOriginBalance = IERC20(_toToken).universalBalanceOf(msg.sender); _deposit(msg.sender, assetTo[0], _fromToken, _fromTokenAmount, _fromToken == _ETH_ADDRESS_); for (uint256 i = 0; i < mixPairs.length; i++) { if (directions & 1 == 0) { IDODOAdapter(mixAdapters[i]).sellBase(assetTo[i + 1],mixPairs[i], ""); } else { IDODOAdapter(mixAdapters[i]).sellQuote(assetTo[i + 1],mixPairs[i], ""); } directions = directions >> 1; } if(_toToken == _ETH_ADDRESS_) { returnAmount = IWETH(_WETH_).balanceOf(address(this)); IWETH(_WETH_).withdraw(returnAmount); msg.sender.transfer(returnAmount); }else { returnAmount = IERC20(_toToken).tokenBalanceOf(msg.sender).sub(toTokenOriginBalance); } require(returnAmount >= minReturnAmount, "DODOV2Proxy02: Return amount is not enough"); emit OrderHistory( _fromToken, _toToken, msg.sender, _fromTokenAmount, returnAmount ); } //============ CrowdPooling Functions (bid) ============ function bid( address cpAddress, uint256 quoteAmount, uint8 flag, // 0 - ERC20, 1 - quoteInETH uint256 deadLine ) external override payable preventReentrant judgeExpired(deadLine) { _deposit(msg.sender, cpAddress, IDODOV2(cpAddress)._QUOTE_TOKEN_(), quoteAmount, flag == 1); IDODOV2(cpAddress).bid(msg.sender); } function addLiquidityToV1( address pair, uint256 baseAmount, uint256 quoteAmount, uint256 baseMinShares, uint256 quoteMinShares, uint8 flag, // 0 erc20 In 1 baseInETH 2 quoteIn ETH uint256 deadLine ) external override payable preventReentrant judgeExpired(deadLine) returns(uint256 baseShares, uint256 quoteShares) { address _baseToken = IDODOV1(pair)._BASE_TOKEN_(); address _quoteToken = IDODOV1(pair)._QUOTE_TOKEN_(); _deposit(msg.sender, address(this), _baseToken, baseAmount, flag == 1); _deposit(msg.sender, address(this), _quoteToken, quoteAmount, flag == 2); if(baseAmount > 0) { IERC20(_baseToken).universalApproveMax(pair, baseAmount); baseShares = IDODOV1(pair).depositBaseTo(msg.sender, baseAmount); } if(quoteAmount > 0) { IERC20(_quoteToken).universalApproveMax(pair, quoteAmount); quoteShares = IDODOV1(pair).depositQuoteTo(msg.sender, quoteAmount); } require(baseShares >= baseMinShares && quoteShares >= quoteMinShares,"DODOV2Proxy02: Return DLP is not enough"); } function _deposit( address from, address to, address token, uint256 amount, bool isETH ) internal { if (isETH) { if (amount > 0) { IWETH(_WETH_).deposit{value: amount}(); if (to != address(this)) SafeERC20.safeTransfer(IERC20(_WETH_), to, amount); } } else { IDODOApproveProxy(_DODO_APPROVE_PROXY_).claimTokens(token, from, to, amount); } } function _withdraw( address payable to, address token, uint256 amount, bool isETH ) internal { if (isETH) { if (amount > 0) { IWETH(_WETH_).withdraw(amount); to.transfer(amount); } } else { if (amount > 0) { SafeERC20.safeTransfer(IERC20(token), to, amount); } } } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"address","name":"dvmFactory","type":"address"},{"internalType":"address","name":"dppFactory","type":"address"},{"internalType":"address payable","name":"weth","type":"address"},{"internalType":"address","name":"dodoApproveProxy","type":"address"},{"internalType":"address","name":"dodoSellHelper","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"fromToken","type":"address"},{"indexed":false,"internalType":"address","name":"toToken","type":"address"},{"indexed":false,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"uint256","name":"fromAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"returnAmount","type":"uint256"}],"name":"OrderHistory","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"},{"stateMutability":"payable","type":"fallback"},{"inputs":[],"name":"_DODO_APPROVE_PROXY_","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_DODO_SELL_HELPER_","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_DPP_FACTORY_","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_DVM_FACTORY_","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_NEW_OWNER_","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":"_WETH_","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"dvmAddress","type":"address"},{"internalType":"uint256","name":"baseInAmount","type":"uint256"},{"internalType":"uint256","name":"quoteInAmount","type":"uint256"},{"internalType":"uint256","name":"baseMinAmount","type":"uint256"},{"internalType":"uint256","name":"quoteMinAmount","type":"uint256"},{"internalType":"uint8","name":"flag","type":"uint8"},{"internalType":"uint256","name":"deadLine","type":"uint256"}],"name":"addDVMLiquidity","outputs":[{"internalType":"uint256","name":"shares","type":"uint256"},{"internalType":"uint256","name":"baseAdjustedInAmount","type":"uint256"},{"internalType":"uint256","name":"quoteAdjustedInAmount","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"pair","type":"address"},{"internalType":"uint256","name":"baseAmount","type":"uint256"},{"internalType":"uint256","name":"quoteAmount","type":"uint256"},{"internalType":"uint256","name":"baseMinShares","type":"uint256"},{"internalType":"uint256","name":"quoteMinShares","type":"uint256"},{"internalType":"uint8","name":"flag","type":"uint8"},{"internalType":"uint256","name":"deadLine","type":"uint256"}],"name":"addLiquidityToV1","outputs":[{"internalType":"uint256","name":"baseShares","type":"uint256"},{"internalType":"uint256","name":"quoteShares","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"contractAddr","type":"address"}],"name":"addWhiteList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"cpAddress","type":"address"},{"internalType":"uint256","name":"quoteAmount","type":"uint256"},{"internalType":"uint8","name":"flag","type":"uint8"},{"internalType":"uint256","name":"deadLine","type":"uint256"}],"name":"bid","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"claimOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"baseToken","type":"address"},{"internalType":"address","name":"quoteToken","type":"address"},{"internalType":"uint256","name":"baseInAmount","type":"uint256"},{"internalType":"uint256","name":"quoteInAmount","type":"uint256"},{"internalType":"uint256","name":"lpFeeRate","type":"uint256"},{"internalType":"uint256","name":"i","type":"uint256"},{"internalType":"uint256","name":"k","type":"uint256"},{"internalType":"bool","name":"isOpenTwap","type":"bool"},{"internalType":"uint256","name":"deadLine","type":"uint256"}],"name":"createDODOPrivatePool","outputs":[{"internalType":"address","name":"newPrivatePool","type":"address"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"baseToken","type":"address"},{"internalType":"address","name":"quoteToken","type":"address"},{"internalType":"uint256","name":"baseInAmount","type":"uint256"},{"internalType":"uint256","name":"quoteInAmount","type":"uint256"},{"internalType":"uint256","name":"lpFeeRate","type":"uint256"},{"internalType":"uint256","name":"i","type":"uint256"},{"internalType":"uint256","name":"k","type":"uint256"},{"internalType":"bool","name":"isOpenTWAP","type":"bool"},{"internalType":"uint256","name":"deadLine","type":"uint256"}],"name":"createDODOVendingMachine","outputs":[{"internalType":"address","name":"newVendingMachine","type":"address"},{"internalType":"uint256","name":"shares","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"fromToken","type":"address"},{"internalType":"address","name":"toToken","type":"address"},{"internalType":"uint256","name":"fromTokenAmount","type":"uint256"},{"internalType":"uint256","name":"minReturnAmount","type":"uint256"},{"internalType":"address[]","name":"dodoPairs","type":"address[]"},{"internalType":"uint256","name":"directions","type":"uint256"},{"internalType":"bool","name":"","type":"bool"},{"internalType":"uint256","name":"deadLine","type":"uint256"}],"name":"dodoSwapV1","outputs":[{"internalType":"uint256","name":"returnAmount","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"toToken","type":"address"},{"internalType":"uint256","name":"minReturnAmount","type":"uint256"},{"internalType":"address[]","name":"dodoPairs","type":"address[]"},{"internalType":"uint256","name":"directions","type":"uint256"},{"internalType":"bool","name":"","type":"bool"},{"internalType":"uint256","name":"deadLine","type":"uint256"}],"name":"dodoSwapV2ETHToToken","outputs":[{"internalType":"uint256","name":"returnAmount","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"fromToken","type":"address"},{"internalType":"uint256","name":"fromTokenAmount","type":"uint256"},{"internalType":"uint256","name":"minReturnAmount","type":"uint256"},{"internalType":"address[]","name":"dodoPairs","type":"address[]"},{"internalType":"uint256","name":"directions","type":"uint256"},{"internalType":"bool","name":"","type":"bool"},{"internalType":"uint256","name":"deadLine","type":"uint256"}],"name":"dodoSwapV2TokenToETH","outputs":[{"internalType":"uint256","name":"returnAmount","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"fromToken","type":"address"},{"internalType":"address","name":"toToken","type":"address"},{"internalType":"uint256","name":"fromTokenAmount","type":"uint256"},{"internalType":"uint256","name":"minReturnAmount","type":"uint256"},{"internalType":"address[]","name":"dodoPairs","type":"address[]"},{"internalType":"uint256","name":"directions","type":"uint256"},{"internalType":"bool","name":"","type":"bool"},{"internalType":"uint256","name":"deadLine","type":"uint256"}],"name":"dodoSwapV2TokenToToken","outputs":[{"internalType":"uint256","name":"returnAmount","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"fromToken","type":"address"},{"internalType":"address","name":"toToken","type":"address"},{"internalType":"address","name":"approveTarget","type":"address"},{"internalType":"address","name":"swapTarget","type":"address"},{"internalType":"uint256","name":"fromTokenAmount","type":"uint256"},{"internalType":"uint256","name":"minReturnAmount","type":"uint256"},{"internalType":"bytes","name":"callDataConcat","type":"bytes"},{"internalType":"bool","name":"","type":"bool"},{"internalType":"uint256","name":"deadLine","type":"uint256"}],"name":"externalSwap","outputs":[{"internalType":"uint256","name":"returnAmount","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"initOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isWhiteListed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"fromToken","type":"address"},{"internalType":"address","name":"toToken","type":"address"},{"internalType":"uint256","name":"fromTokenAmount","type":"uint256"},{"internalType":"uint256","name":"minReturnAmount","type":"uint256"},{"internalType":"address[]","name":"mixAdapters","type":"address[]"},{"internalType":"address[]","name":"mixPairs","type":"address[]"},{"internalType":"address[]","name":"assetTo","type":"address[]"},{"internalType":"uint256","name":"directions","type":"uint256"},{"internalType":"bool","name":"","type":"bool"},{"internalType":"uint256","name":"deadLine","type":"uint256"}],"name":"mixSwap","outputs":[{"internalType":"uint256","name":"returnAmount","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"contractAddr","type":"address"}],"name":"removeWhiteList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"dppAddress","type":"address"},{"internalType":"uint256[]","name":"paramList","type":"uint256[]"},{"internalType":"uint256[]","name":"amountList","type":"uint256[]"},{"internalType":"uint8","name":"flag","type":"uint8"},{"internalType":"uint256","name":"minBaseReserve","type":"uint256"},{"internalType":"uint256","name":"minQuoteReserve","type":"uint256"},{"internalType":"uint256","name":"deadLine","type":"uint256"}],"name":"resetDODOPrivatePool","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
6101206040523480156200001257600080fd5b5060405162004c9538038062004c9583398101604081905262000035916200006d565b6001600160601b0319606095861b811660e05293851b84166101005291841b8316608052831b821660a05290911b1660c05262000105565b600080600080600060a0868803121562000085578081fd5b85516200009281620000ec565b6020870151909550620000a581620000ec565b6040870151909450620000b881620000ec565b6060870151909350620000cb81620000ec565b6080870151909250620000de81620000ec565b809150509295509295909350565b6001600160a01b03811681146200010257600080fd5b50565b60805160601c60a05160601c60c05160601c60e05160601c6101005160601c614ace620001c7600039806104fa52806106625280612ccb5250806126ea5280612830525080610a845280612ca752508061122b52806122185280612e85528061301d528061347b52508061048452806105fc52806106405280610bd75280610c76528061153b52806115f952806119c65280611a655280611d115280611d8552806127ac52806127f652806133b1528061343952806136d85250614ace6000f3fe60806040526004361061016a5760003560e01c8063674d9422116100d1578063af1280b01161008a578063e7cd4a0411610064578063e7cd4a041461039f578063eb99be12146103bf578063f2fde38b146103d4578063f87dc1b7146103f457610171565b8063af1280b014610362578063b730d15014610377578063db70b5c71461038c57610171565b8063674d9422146102a757806369e4e417146102c95780636f9170f6146102de5780638456db151461030b5780638b3bb0891461032057806399882c8f1461034157610171565b80631e6d24c2116101235780631e6d24c2146102195780632042e5c21461023957806323c38fa3146102595780634e71e0c81461026c5780635028bb951461028157806354bacd131461029457610171565b80630d009297146101735780630d4eec8f146101935780630d9be500146101be5780630dd4ebd9146101d157806312ff148d146101f157806316048bc41461020457610171565b3661017157005b005b34801561017f57600080fd5b5061017161018e366004613d14565b610414565b34801561019f57600080fd5b506101a8610482565b6040516101b59190614367565b60405180910390f35b6101a86101cc366004613fcd565b6104a6565b6101e46101df366004613f31565b610707565b6040516101b591906149a1565b6101716101ff366004614052565b610d74565b34801561021057600080fd5b506101a86111b1565b34801561022557600080fd5b506101e4610234366004614170565b6111c5565b34801561024557600080fd5b50610171610254366004613d14565b6116d5565b6101e4610267366004613e4f565b611725565b34801561027857600080fd5b50610171611b8b565b6101e461028f3660046140f2565b611c2a565b6101e46102a2366004613d4c565b612183565b6102ba6102b53660046141f9565b612420565b6040516101b5939291906149d5565b3480156102d557600080fd5b506101a86126e8565b3480156102ea57600080fd5b506102fe6102f9366004613d14565b61270c565b6040516101b591906144f6565b34801561031757600080fd5b506101a8612721565b61033361032e366004613fcd565b612730565b6040516101b592919061437b565b61035461034f3660046141f9565b6129b4565b6040516101b59291906149c7565b34801561036e57600080fd5b506101a8612ca5565b34801561038357600080fd5b506101a8612cc9565b61017161039a36600461425e565b612ced565b3480156103ab57600080fd5b506101716103ba366004613d14565b612e30565b3480156103cb57600080fd5b506101a8612e83565b3480156103e057600080fd5b506101716103ef366004613d14565b612ea7565b34801561040057600080fd5b506101e461040f366004613f31565b612f36565b600154600160a01b900460ff16156104475760405162461bcd60e51b815260040161043e906147ba565b60405180910390fd5b6001805460ff60a01b1916600160a01b179055600080546001600160a01b0390921661010002610100600160a81b0319909216919091179055565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000805460ff16156104ca5760405162461bcd60e51b815260040161043e9061460b565b6000805460ff1916600117905581428110156104f85760405162461bcd60e51b815260040161043e90614767565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166309b8adb86040518163ffffffff1660e01b8152600401602060405180830381600087803b15801561055357600080fd5b505af1158015610567573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061058b9190613d30565b91508a8a6105b53385848e6001600160a01b038216600080516020614a79833981519152146133a3565b6105db3385838d6001600160a01b038216600080516020614a79833981519152146133a3565b6001600160a01b038216600080516020614a79833981519152141561061e577f000000000000000000000000000000000000000000000000000000000000000091505b6001600160a01b038116600080516020614a79833981519152141561066057507f00000000000000000000000000000000000000000000000000000000000000005b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663195eefe0853385858e8d8f8e6040518963ffffffff1660e01b81526004016106ba989796959493929190614419565b600060405180830381600087803b1580156106d457600080fd5b505af11580156106e8573d6000803e3d6000fd5b50506000805460ff1916905550939d9c50505050505050505050505050565b6000814281101561072a5760405162461bcd60e51b815260040161043e90614767565b600086511161074b5760405162461bcd60e51b815260040161043e90614501565b6000871161076b5760405162461bcd60e51b815260040161043e90614538565b89896107933330848d6001600160a01b038216600080516020614a79833981519152146133a3565b60005b8851811015610ba05760008982815181106107ad57fe5b60200260200101519050886001166000141561095b576000816001600160a01b0316634a248d2a6040518163ffffffff1660e01b815260040160206040518083038186803b1580156107fe57600080fd5b505afa158015610812573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108369190613d30565b90506000816001600160a01b03166370a08231306040518263ffffffff1660e01b81526004016108669190614367565b60206040518083038186803b15801561087e57600080fd5b505afa158015610892573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108b691906142c6565b90506108d26001600160a01b038316848363ffffffff6134f016565b604051638dae733360e01b81526001600160a01b03841690638dae7333906109019084906000906004016149aa565b602060405180830381600087803b15801561091b57600080fd5b505af115801561092f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061095391906142c6565b505050610b93565b6000816001600160a01b031663d4b970466040518163ffffffff1660e01b815260040160206040518083038186803b15801561099657600080fd5b505afa1580156109aa573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109ce9190613d30565b90506000816001600160a01b03166370a08231306040518263ffffffff1660e01b81526004016109fe9190614367565b60206040518083038186803b158015610a1657600080fd5b505afa158015610a2a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a4e91906142c6565b9050610a6a6001600160a01b038316848363ffffffff6134f016565b60405163ca19ebd960e01b81526000906001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063ca19ebd990610abb908790869060040161437b565b60206040518083038186803b158015610ad357600080fd5b505afa158015610ae7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b0b91906142c6565b60405163733e738360e11b81529091506001600160a01b0385169063e67ce70690610b3c90849086906004016149aa565b602060405180830381600087803b158015610b5657600080fd5b505af1158015610b6a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b8e91906142c6565b505050505b50600197881c9701610796565b506001600160a01b038116600080516020614a798339815191521415610ce2576040516370a0823160e01b81526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906370a0823190610c0c903090600401614367565b60206040518083038186803b158015610c2457600080fd5b505afa158015610c38573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c5c91906142c6565b604051632e1a7d4d60e01b81529094506001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690632e1a7d4d90610cab9087906004016149a1565b600060405180830381600087803b158015610cc557600080fd5b505af1158015610cd9573d6000803e3d6000fd5b50505050610cfe565b610cfb6001600160a01b0382163063ffffffff6135be16565b93505b88841015610d1e5760405162461bcd60e51b815260040161043e90614663565b610d386001600160a01b038216338663ffffffff61364616565b600080516020614a598339815191528282338d88604051610d5d959493929190614463565b60405180910390a150505098975050505050505050565b60005460ff1615610d975760405162461bcd60e51b815260040161043e9061460b565b6000805460ff191660011790558042811015610dc55760405162461bcd60e51b815260040161043e90614767565b610e5c33898a6001600160a01b0316634a248d2a6040518163ffffffff1660e01b815260040160206040518083038186803b158015610e0357600080fd5b505afa158015610e17573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e3b9190613d30565b89600081518110610e4857fe5b60200260200101518960ff166001146133a3565b610ef333898a6001600160a01b031663d4b970466040518163ffffffff1660e01b815260040160206040518083038186803b158015610e9a57600080fd5b505afa158015610eae573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ed29190613d30565b89600181518110610edf57fe5b60200260200101518960ff166002146133a3565b876001600160a01b03166316048bc46040518163ffffffff1660e01b8152600401602060405180830381600087803b158015610f2e57600080fd5b505af1158015610f42573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f669190613d30565b6001600160a01b0316638ff3928c3389600081518110610f8257fe5b60200260200101518a600181518110610f9757fe5b60200260200101518b600281518110610fac57fe5b60200260200101518b600281518110610fc157fe5b60200260200101518c600381518110610fd657fe5b60200260200101518b8b6040518963ffffffff1660e01b8152600401611003989796959493929190614394565b602060405180830381600087803b15801561101d57600080fd5b505af1158015611031573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061105591906142aa565b6110715760405162461bcd60e51b815260040161043e906145e5565b61110733896001600160a01b0316634a248d2a6040518163ffffffff1660e01b815260040160206040518083038186803b1580156110ae57600080fd5b505afa1580156110c2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110e69190613d30565b886002815181106110f357fe5b60200260200101518860ff166003146136b5565b61119d33896001600160a01b031663d4b970466040518163ffffffff1660e01b815260040160206040518083038186803b15801561114457600080fd5b505afa158015611158573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061117c9190613d30565b8860038151811061118957fe5b60200260200101518860ff166004146136b5565b50506000805460ff19169055505050505050565b60005461010090046001600160a01b031681565b600081428110156111e85760405162461bcd60e51b815260040161043e90614767565b60008651116112095760405162461bcd60e51b815260040161043e90614501565b600087116112295760405162461bcd60e51b815260040161043e90614538565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316630a5ea4668a338960008151811061126757fe5b60200260200101518c6040518563ffffffff1660e01b815260040161128f94939291906143ef565b600060405180830381600087803b1580156112a957600080fd5b505af11580156112bd573d6000803e3d6000fd5b506000925050505b86518110156115235760018751038114156114115760018616611379578681815181106112ee57fe5b60200260200101516001600160a01b031663bd6015b4306040518263ffffffff1660e01b81526004016113219190614367565b602060405180830381600087803b15801561133b57600080fd5b505af115801561134f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061137391906142c6565b5061140c565b86818151811061138557fe5b60200260200101516001600160a01b031663dd93f59a306040518263ffffffff1660e01b81526004016113b89190614367565b602060405180830381600087803b1580156113d257600080fd5b505af11580156113e6573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061140a91906142c6565b505b611517565b6001861661146e5786818151811061142557fe5b60200260200101516001600160a01b031663bd6015b488836001018151811061144a57fe5b60200260200101516040518263ffffffff1660e01b81526004016113b89190614367565b86818151811061147a57fe5b60200260200101516001600160a01b031663dd93f59a88836001018151811061149f57fe5b60200260200101516040518263ffffffff1660e01b81526004016114c39190614367565b602060405180830381600087803b1580156114dd57600080fd5b505af11580156114f1573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061151591906142c6565b505b600195861c95016112c5565b506040516370a0823160e01b81526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906370a0823190611570903090600401614367565b60206040518083038186803b15801561158857600080fd5b505afa15801561159c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115c091906142c6565b9150868210156115e25760405162461bcd60e51b815260040161043e90614663565b604051632e1a7d4d60e01b81526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690632e1a7d4d9061162e9085906004016149a1565b600060405180830381600087803b15801561164857600080fd5b505af115801561165c573d6000803e3d6000fd5b505060405133925084156108fc02915084906000818181858888f1935050505015801561168d573d6000803e3d6000fd5b50600080516020614a5983398151915289600080516020614a79833981519152338b866040516116c1959493929190614463565b60405180910390a150979650505050505050565b60005461010090046001600160a01b031633146117045760405162461bcd60e51b815260040161043e90614876565b6001600160a01b03166000908152600260205260409020805460ff19169055565b600081428110156117485760405162461bcd60e51b815260040161043e90614767565b60008751116117695760405162461bcd60e51b815260040161043e90614501565b875187511461178a5760405162461bcd60e51b815260040161043e906145a0565b60018651038751146117ae5760405162461bcd60e51b815260040161043e906148e3565b600089116117ce5760405162461bcd60e51b815260040161043e90614538565b8b8b8b60006117ec6001600160a01b0384163363ffffffff61378d16565b9050611831338b6000815181106117ff57fe5b60200260200101518685600080516020614a798339815191526001600160a01b0316896001600160a01b0316146133a3565b60005b8b5181101561198f5760018a166118e6578c818151811061185157fe5b60200260200101516001600160a01b03166330e6ae318c836001018151811061187657fe5b60200260200101518e848151811061188a57fe5b60200260200101516040518363ffffffff1660e01b81526004016118af929190614497565b600060405180830381600087803b1580156118c957600080fd5b505af11580156118dd573d6000803e3d6000fd5b50505050611983565b8c81815181106118f257fe5b60200260200101516001600160a01b0316636f7929f28c836001018151811061191757fe5b60200260200101518e848151811061192b57fe5b60200260200101516040518363ffffffff1660e01b8152600401611950929190614497565b600060405180830381600087803b15801561196a57600080fd5b505af115801561197e573d6000803e3d6000fd5b505050505b6001998a1c9901611834565b506001600160a01b038316600080516020614a798339815191521415611aff576040516370a0823160e01b81526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906370a08231906119fb903090600401614367565b60206040518083038186803b158015611a1357600080fd5b505afa158015611a27573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a4b91906142c6565b604051632e1a7d4d60e01b81529096506001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690632e1a7d4d90611a9a9089906004016149a1565b600060405180830381600087803b158015611ab457600080fd5b505af1158015611ac8573d6000803e3d6000fd5b505060405133925088156108fc02915088906000818181858888f19350505050158015611af9573d6000803e3d6000fd5b50611b2b565b611b2881611b1c6001600160a01b0386163363ffffffff6135be16565b9063ffffffff61383116565b95505b8c861015611b4b5760405162461bcd60e51b815260040161043e90614663565b600080516020614a59833981519152848433858a604051611b70959493929190614463565b60405180910390a150505050509a9950505050505050505050565b6001546001600160a01b03163314611bb55760405162461bcd60e51b815260040161043e90614579565b600154600080546040516001600160a01b0393841693610100909204909116917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a36001805460008054610100600160a81b0319166101006001600160a01b038416021790556001600160a01b0319169055565b60008142811015611c4d5760405162461bcd60e51b815260040161043e90614767565b6000865111611c6e5760405162461bcd60e51b815260040161043e90614501565b60008711611c8e5760405162461bcd60e51b815260040161043e90614538565b6040516370a0823160e01b81526000906001600160a01b038a16906370a0823190611cbd903390600401614367565b60206040518083038186803b158015611cd557600080fd5b505afa158015611ce9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d0d91906142c6565b90507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db0346040518263ffffffff1660e01b81526004016000604051808303818588803b158015611d6a57600080fd5b505af1158015611d7e573d6000803e3d6000fd5b50505050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a9059cbb88600081518110611dbf57fe5b6020026020010151346040518363ffffffff1660e01b8152600401611de592919061437b565b602060405180830381600087803b158015611dff57600080fd5b505af1158015611e13573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e3791906142aa565b5060005b8751811015612099576001885103811415611f875760018716611eef57878181518110611e6457fe5b60200260200101516001600160a01b031663bd6015b4336040518263ffffffff1660e01b8152600401611e979190614367565b602060405180830381600087803b158015611eb157600080fd5b505af1158015611ec5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ee991906142c6565b50611f82565b878181518110611efb57fe5b60200260200101516001600160a01b031663dd93f59a336040518263ffffffff1660e01b8152600401611f2e9190614367565b602060405180830381600087803b158015611f4857600080fd5b505af1158015611f5c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f8091906142c6565b505b61208d565b60018716611fe457878181518110611f9b57fe5b60200260200101516001600160a01b031663bd6015b4898360010181518110611fc057fe5b60200260200101516040518263ffffffff1660e01b8152600401611f2e9190614367565b878181518110611ff057fe5b60200260200101516001600160a01b031663dd93f59a89836001018151811061201557fe5b60200260200101516040518263ffffffff1660e01b81526004016120399190614367565b602060405180830381600087803b15801561205357600080fd5b505af1158015612067573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061208b91906142c6565b505b600196871c9601611e3b565b5061211a818a6001600160a01b03166370a08231336040518263ffffffff1660e01b81526004016120ca9190614367565b60206040518083038186803b1580156120e257600080fd5b505afa1580156120f6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b1c91906142c6565b92508783101561213c5760405162461bcd60e51b815260040161043e90614663565b600080516020614a59833981519152600080516020614a798339815191528a33348760405161216f959493929190614463565b60405180910390a150509695505050505050565b600081428110156121a65760405162461bcd60e51b815260040161043e90614767565b600086116121c65760405162461bcd60e51b815260040161043e90614538565b60006121e16001600160a01b038c163363ffffffff61378d16565b90506001600160a01b038c16600080516020614a798339815191521461229a5760405163052f523360e11b81526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690630a5ea46690612253908f90339030908e906004016143ef565b600060405180830381600087803b15801561226d57600080fd5b505af1158015612281573d6000803e3d6000fd5b5061229a925050506001600160a01b038d168b8a6134f0565b6001600160a01b03891660009081526002602052604090205460ff166122d25760405162461bcd60e51b815260040161043e906147e4565b60006001600160a01b03808b16908e16600080516020614a79833981519152146122fd5760006122ff565b345b8860405161230d919061432e565b60006040518083038185875af1925050503d806000811461234a576040519150601f19603f3d011682016040523d82523d6000602084013e61234f565b606091505b50509050806123705760405162461bcd60e51b815260040161043e90614829565b6123a43361238d6001600160a01b038f163063ffffffff61378d16565b6001600160a01b038f16919063ffffffff61364616565b6123c182611b1c6001600160a01b038f163363ffffffff61378d16565b9350878410156123e35760405162461bcd60e51b815260040161043e90614663565b600080516020614a598339815191528d8d338c88604051612408959493929190614463565b60405180910390a15050509998505050505050505050565b600080548190819060ff16156124485760405162461bcd60e51b815260040161043e9061460b565b6000805460ff1916600117905583428110156124765760405162461bcd60e51b815260040161043e90614767565b8a612482818c8c613859565b90945092508884108015906124975750878310155b6124b35760405162461bcd60e51b815260040161043e9061471c565b6125363382836001600160a01b0316634a248d2a6040518163ffffffff1660e01b815260040160206040518083038186803b1580156124f157600080fd5b505afa158015612505573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125299190613d30565b878b60ff166001146133a3565b6125b93382836001600160a01b031663d4b970466040518163ffffffff1660e01b815260040160206040518083038186803b15801561257457600080fd5b505afa158015612588573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125ac9190613d30565b868b60ff166002146133a3565b604051634c85b42560e01b81526001600160a01b03821690634c85b425906125e5903390600401614367565b606060405180830381600087803b1580156125ff57600080fd5b505af1158015612613573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126379190614301565b5090955050600160ff881614801561264e57508334115b156126845760405133903486900380156108fc02916000818181858888f19350505050158015612682573d6000803e3d6000fd5b505b8660ff16600214801561269657508234115b156126cc5760405133903485900380156108fc02916000818181858888f193505050501580156126ca573d6000803e3d6000fd5b505b50506000805460ff191690559199909850909650945050505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b60026020526000908152604090205460ff1681565b6001546001600160a01b031681565b60008054819060ff16156127565760405162461bcd60e51b815260040161043e9061460b565b6000805460ff1916600117905582428110156127845760405162461bcd60e51b815260040161043e90614767565b60006001600160a01b038d16600080516020614a79833981519152146127aa578c6127cc565b7f00000000000000000000000000000000000000000000000000000000000000005b905060006001600160a01b038d16600080516020614a79833981519152146127f4578c612816565b7f00000000000000000000000000000000000000000000000000000000000000005b60405163e18c40c760e01b81529091506001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063e18c40c79061286f90859085908f908f908f908f906004016144c0565b602060405180830381600087803b15801561288957600080fd5b505af115801561289d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128c19190613d30565b94508d91508c90506128ef3386848f6001600160a01b038216600080516020614a79833981519152146133a3565b6129153386838e6001600160a01b038216600080516020614a79833981519152146133a3565b5050604051634c85b42560e01b81526001600160a01b03841690634c85b42590612943903390600401614367565b606060405180830381600087803b15801561295d57600080fd5b505af1158015612971573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129959190614301565b50506000805460ff19169055929c929b50919950505050505050505050565b60008054819060ff16156129da5760405162461bcd60e51b815260040161043e9061460b565b6000805460ff191660011790558242811015612a085760405162461bcd60e51b815260040161043e90614767565b60008a6001600160a01b0316634a248d2a6040518163ffffffff1660e01b815260040160206040518083038186803b158015612a4357600080fd5b505afa158015612a57573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a7b9190613d30565b905060008b6001600160a01b031663d4b970466040518163ffffffff1660e01b815260040160206040518083038186803b158015612ab857600080fd5b505afa158015612acc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612af09190613d30565b9050612b053330848e8b60ff166001146133a3565b612b183330838d8b60ff166002146133a3565b8a15612bbb57612b386001600160a01b0383168d8d63ffffffff6134f016565b60405163aa06ce9b60e01b81526001600160a01b038d169063aa06ce9b90612b669033908f9060040161437b565b602060405180830381600087803b158015612b8057600080fd5b505af1158015612b94573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612bb891906142c6565b94505b8915612c5e57612bdb6001600160a01b0382168d8c63ffffffff6134f016565b6040516317c5e7d960e21b81526001600160a01b038d1690635f179f6490612c099033908e9060040161437b565b602060405180830381600087803b158015612c2357600080fd5b505af1158015612c37573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c5b91906142c6565b93505b888510158015612c6e5750878410155b612c8a5760405162461bcd60e51b815260040161043e906146ad565b50506000805460ff1916905550909890975095505050505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b7f000000000000000000000000000000000000000000000000000000000000000081565b60005460ff1615612d105760405162461bcd60e51b815260040161043e9061460b565b6000805460ff191660011790558042811015612d3e5760405162461bcd60e51b815260040161043e90614767565b612dc13386876001600160a01b031663d4b970466040518163ffffffff1660e01b815260040160206040518083038186803b158015612d7c57600080fd5b505afa158015612d90573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612db49190613d30565b878760ff166001146133a3565b604051639cf5453d60e01b81526001600160a01b03861690639cf5453d90612ded903390600401614367565b600060405180830381600087803b158015612e0757600080fd5b505af1158015612e1b573d6000803e3d6000fd5b50506000805460ff1916905550505050505050565b60005461010090046001600160a01b03163314612e5f5760405162461bcd60e51b815260040161043e90614876565b6001600160a01b03166000908152600260205260409020805460ff19166001179055565b7f000000000000000000000000000000000000000000000000000000000000000081565b60005461010090046001600160a01b03163314612ed65760405162461bcd60e51b815260040161043e90614876565b600080546040516001600160a01b038085169361010090930416917fdcf55418cee3220104fef63f979ff3c4097ad240c0c43dcb33ce837748983e6291a3600180546001600160a01b0319166001600160a01b0392909216919091179055565b60008142811015612f595760405162461bcd60e51b815260040161043e90614767565b6000865111612f7a5760405162461bcd60e51b815260040161043e90614501565b60008711612f9a5760405162461bcd60e51b815260040161043e90614538565b6040516370a0823160e01b81526000906001600160a01b038b16906370a0823190612fc9903390600401614367565b60206040518083038186803b158015612fe157600080fd5b505afa158015612ff5573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061301991906142c6565b90507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316630a5ea4668c338a60008151811061305957fe5b60200260200101518d6040518563ffffffff1660e01b815260040161308194939291906143ef565b600060405180830381600087803b15801561309b57600080fd5b505af11580156130af573d6000803e3d6000fd5b506000925050505b8751811015613315576001885103811415613203576001871661316b578781815181106130e057fe5b60200260200101516001600160a01b031663bd6015b4336040518263ffffffff1660e01b81526004016131139190614367565b602060405180830381600087803b15801561312d57600080fd5b505af1158015613141573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061316591906142c6565b506131fe565b87818151811061317757fe5b60200260200101516001600160a01b031663dd93f59a336040518263ffffffff1660e01b81526004016131aa9190614367565b602060405180830381600087803b1580156131c457600080fd5b505af11580156131d8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906131fc91906142c6565b505b613309565b600187166132605787818151811061321757fe5b60200260200101516001600160a01b031663bd6015b489836001018151811061323c57fe5b60200260200101516040518263ffffffff1660e01b81526004016131aa9190614367565b87818151811061326c57fe5b60200260200101516001600160a01b031663dd93f59a89836001018151811061329157fe5b60200260200101516040518263ffffffff1660e01b81526004016132b59190614367565b602060405180830381600087803b1580156132cf57600080fd5b505af11580156132e3573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061330791906142c6565b505b600196871c96016130b7565b50613346818b6001600160a01b03166370a08231336040518263ffffffff1660e01b81526004016120ca9190614367565b9250878310156133685760405162461bcd60e51b815260040161043e90614663565b600080516020614a598339815191528b8b338c8760405161338d959493929190614463565b60405180910390a1505098975050505050505050565b801561346457811561345f577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db0836040518263ffffffff1660e01b81526004016000604051808303818588803b15801561340a57600080fd5b505af115801561341e573d6000803e3d6000fd5b505050506001600160a01b0385163014905061345f5761345f7f00000000000000000000000000000000000000000000000000000000000000008584613971565b6134e9565b60405163052f523360e11b81526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690630a5ea466906134b69086908990899088906004016143ef565b600060405180830381600087803b1580156134d057600080fd5b505af11580156134e4573d6000803e3d6000fd5b505050505b5050505050565b604051636eb1769f60e11b81526000906001600160a01b0385169063dd62ed3e9061352190309087906004016143d5565b60206040518083038186803b15801561353957600080fd5b505afa15801561354d573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061357191906142c6565b9050818110156135b857801561359c5761359c6001600160a01b03851684600063ffffffff6139c716565b6135b86001600160a01b0385168460001963ffffffff6139c716565b50505050565b6040516370a0823160e01b81526000906001600160a01b038416906370a08231906135ed908590600401614367565b60206040518083038186803b15801561360557600080fd5b505afa158015613619573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061363d91906142c6565b90505b92915050565b80156136b05761365583613a8a565b15613696576040516001600160a01b0383169082156108fc029083906000818181858888f19350505050158015613690573d6000803e3d6000fd5b506136b0565b6136b06001600160a01b038416838363ffffffff61397116565b505050565b801561377c57811561377757604051632e1a7d4d60e01b81526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690632e1a7d4d9061370d9085906004016149a1565b600060405180830381600087803b15801561372757600080fd5b505af115801561373b573d6000803e3d6000fd5b50506040516001600160a01b038716925084156108fc02915084906000818181858888f19350505050158015613775573d6000803e3d6000fd5b505b6135b8565b81156135b8576135b8838584613971565b600061379883613a8a565b156137ae57506001600160a01b03811631613640565b6040516370a0823160e01b81526001600160a01b038416906370a08231906137da908590600401614367565b60206040518083038186803b1580156137f257600080fd5b505afa158015613806573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061382a91906142c6565b9050613640565b6000828211156138535760405162461bcd60e51b815260040161043e90614797565b50900390565b600080600080866001600160a01b03166336223ce96040518163ffffffff1660e01b8152600401604080518083038186803b15801561389757600080fd5b505afa1580156138ab573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906138cf91906142de565b915091508060001480156138e1575081155b156138ed578593508492505b801580156138fb5750600082115b1561390857859350600092505b6000811180156139185750600082115b156139675760006139298784613aa9565b905060006139378784613aa9565b90508082116139545787955061394d8383613ad3565b9450613964565b8694506139618482613ad3565b95505b50505b5050935093915050565b6136b08363a9059cbb60e01b848460405160240161399092919061437b565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152613afd565b801580613a4f5750604051636eb1769f60e11b81526001600160a01b0384169063dd62ed3e906139fd90309086906004016143d5565b60206040518083038186803b158015613a1557600080fd5b505afa158015613a29573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613a4d91906142c6565b155b613a6b5760405162461bcd60e51b815260040161043e90614928565b6136b08363095ea7b360e01b848460405160240161399092919061437b565b6001600160a01b038116600080516020614a7983398151915214919050565b600061363d82613ac785670de0b6b3a764000063ffffffff613bb416565b9063ffffffff613bee16565b6000670de0b6b3a7640000613aee848463ffffffff613bb416565b81613af557fe5b049392505050565b60006060836001600160a01b031683604051613b19919061432e565b6000604051808303816000865af19150503d8060008114613b56576040519150601f19603f3d011682016040523d82523d6000602084013e613b5b565b606091505b509150915081613b7d5760405162461bcd60e51b815260040161043e9061462e565b8051156135b85780806020019051810190613b9891906142aa565b6135b85760405162461bcd60e51b815260040161043e90614899565b600082613bc357506000613640565b82820282848281613bd057fe5b041461363d5760405162461bcd60e51b815260040161043e9061497e565b6000808211613c0f5760405162461bcd60e51b815260040161043e906146f4565b818381613af557fe5b803561364081614a32565b600082601f830112613c33578081fd5b8135613c46613c4182614a12565b6149eb565b818152915060208083019084810181840286018201871015613c6757600080fd5b60005b84811015613c8f578135613c7d81614a32565b84529282019290820190600101613c6a565b505050505092915050565b600082601f830112613caa578081fd5b8135613cb8613c4182614a12565b818152915060208083019084810181840286018201871015613cd957600080fd5b60005b84811015613c8f57813584529282019290820190600101613cdc565b803561364081614a4a565b803560ff8116811461364057600080fd5b600060208284031215613d25578081fd5b813561363d81614a32565b600060208284031215613d41578081fd5b815161363d81614a32565b60008060008060008060008060006101208a8c031215613d6a578485fd5b8935613d7581614a32565b985060208a810135613d8681614a32565b985060408b0135613d9681614a32565b975060608b0135613da681614a32565b965060808b0135955060a08b0135945060c08b013567ffffffffffffffff80821115613dd0578586fd5b818d018e601f820112613de1578687fd5b8035925081831115613df1578687fd5b613e03601f8401601f191685016149eb565b91508282528e84848301011115613e18578687fd5b82848201858401375090810190910193909352613e388b60e08c01613cf8565b91506101008a013590509295985092959850929598565b6000806000806000806000806000806101408b8d031215613e6e578081fd5b613e788c8c613c18565b9950613e878c60208d01613c18565b985060408b0135975060608b0135965060808b013567ffffffffffffffff80821115613eb1578283fd5b613ebd8e838f01613c23565b975060a08d0135915080821115613ed2578283fd5b613ede8e838f01613c23565b965060c08d0135915080821115613ef3578283fd5b50613f008d828e01613c23565b94505060e08b01359250613f188c6101008d01613cf8565b91506101208b013590509295989b9194979a5092959850565b600080600080600080600080610100898b031215613f4d578384fd5b8835613f5881614a32565b97506020890135613f6881614a32565b96506040890135955060608901359450608089013567ffffffffffffffff811115613f91578485fd5b613f9d8b828c01613c23565b94505060a0890135925060c0890135613fb581614a4a565b8092505060e089013590509295985092959890939650565b60008060008060008060008060006101208a8c031215613feb578485fd5b8935613ff681614a32565b985060208a013561400681614a32565b975060408a0135965060608a0135955060808a0135945060a08a0135935060c08a0135925060e08a013561403981614a4a565b809250506101008a013590509295985092959850929598565b600080600080600080600060e0888a03121561406c578081fd5b873561407781614a32565b9650602088013567ffffffffffffffff80821115614093578283fd5b61409f8b838c01613c9a565b975060408a01359150808211156140b4578283fd5b506140c18a828b01613c9a565b9550506140d18960608a01613d03565b9699959850939660808101359560a0820135955060c0909101359350915050565b60008060008060008060c0878903121561410a578384fd5b863561411581614a32565b955060208701359450604087013567ffffffffffffffff811115614137578485fd5b61414389828a01613c23565b94505060608701359250608087013561415b81614a4a565b8092505060a087013590509295509295509295565b600080600080600080600060e0888a03121561418a578081fd5b873561419581614a32565b96506020880135955060408801359450606088013567ffffffffffffffff8111156141be578182fd5b6141ca8a828b01613c23565b9450506080880135925060a08801356141e281614a4a565b8092505060c0880135905092959891949750929550565b600080600080600080600060e0888a031215614213578081fd5b873561421e81614a32565b9650602088013595506040880135945060608801359350608088013592506142498960a08a01613d03565b915060c0880135905092959891949750929550565b60008060008060808587031215614273578182fd5b843561427e81614a32565b935060208501359250604085013560ff8116811461429a578283fd5b9396929550929360600135925050565b6000602082840312156142bb578081fd5b815161363d81614a4a565b6000602082840312156142d7578081fd5b5051919050565b600080604083850312156142f0578182fd5b505080516020909101519092909150565b600080600060608486031215614315578081fd5b8351925060208401519150604084015190509250925092565b60008251815b8181101561434e5760208186018101518583015201614334565b8181111561435c5782828501525b509190910192915050565b6001600160a01b0391909116815260200190565b6001600160a01b03929092168252602082015260400190565b6001600160a01b03989098168852602088019690965260408701949094526060860192909252608085015260a084015260c083015260e08201526101000190565b6001600160a01b0392831681529116602082015260400190565b6001600160a01b039485168152928416602084015292166040820152606081019190915260800190565b6001600160a01b03988916815296881660208801529487166040870152929095166060850152608084015260a083019390935260c082019290925290151560e08201526101000190565b6001600160a01b03958616815293851660208501529190931660408301526060820192909252608081019190915260a00190565b6001600160a01b0392831681529116602082015260606040820181905260009082015260800190565b6001600160a01b03968716815294909516602085015260408401929092526060830152608082015290151560a082015260c00190565b901515815260200190565b6020808252601a908201527f444f444f563250726f787930323a2050414952535f454d505459000000000000604082015260600190565b60208082526021908201527f444f444f563250726f787930323a2052455455524e5f414d4f554e545f5a45526040820152604f60f81b606082015260800190565b6020808252600d908201526c494e56414c49445f434c41494d60981b604082015260600190565b60208082526025908201527f444f444f563250726f787930323a20504149525f414441505445525f4e4f545f60408201526409a82a886960db1b606082015260800190565b6020808252600c908201526b14995cd95d0811985a5b195960a21b604082015260600190565b60208082526009908201526814915153951490539560ba1b604082015260600190565b6020808252818101527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564604082015260600190565b6020808252602a908201527f444f444f563250726f787930323a2052657475726e20616d6f756e74206973206040820152690dcdee840cadcdeeaced60b31b606082015260800190565b60208082526027908201527f444f444f563250726f787930323a2052657475726e20444c50206973206e6f74604082015266040cadcdeeaced60cb1b606082015260800190565b6020808252600e908201526d2224ab24a224a723afa2a92927a960911b604082015260600190565b6020808252602b908201527f444f444f563250726f787930323a206465706f73697420616d6f756e7420697360408201526a040dcdee840cadcdeeaced60ab1b606082015260800190565b6020808252601690820152751113d113d58c941c9bde1e4c0c8e881156141254915160521b604082015260600190565b60208082526009908201526829aaa12fa2a92927a960b91b604082015260600190565b60208082526010908201526f1113d113d7d25392551250531256915160821b604082015260600190565b60208082526025908201527f444f444f563250726f787930323a204e6f742057686974656c69737420436f6e6040820152641d1c9858dd60da1b606082015260800190565b6020808252602d908201527f444f444f563250726f787930323a2045787465726e616c20537761702065786560408201526c18dd5d1a5bdb8811985a5b1959609a1b606082015260800190565b6020808252600990820152682727aa2fa7aba722a960b91b604082015260600190565b6020808252602a908201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6040820152691bdd081cdd58d8d9595960b21b606082015260800190565b60208082526025908201527f444f444f563250726f787930323a20504149525f4153534554544f5f4e4f545f60408201526409a82a886960db1b606082015260800190565b60208082526036908201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60408201527520746f206e6f6e2d7a65726f20616c6c6f77616e636560501b606082015260800190565b60208082526009908201526826aaa62fa2a92927a960b91b604082015260600190565b90815260200190565b918252602082015260606040820181905260009082015260800190565b918252602082015260400190565b9283526020830191909152604082015260600190565b60405181810167ffffffffffffffff81118282101715614a0a57600080fd5b604052919050565b600067ffffffffffffffff821115614a28578081fd5b5060209081020190565b6001600160a01b0381168114614a4757600080fd5b50565b8015158114614a4757600080fdfe92ceb067a9883c85aba061e46b9edf505a0d6e81927c4b966ebed543a5221787000000000000000000000000eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeea26469706673582212209e0bc417dca50ea265340423113e471559802cf6f48006fee95bc5b4812dedb864736f6c63430006090033000000000000000000000000da4c4411c55b0785e501332354a036c04833b72b000000000000000000000000ddb13e6dd168e1a68dc2285cb212078ae10394a900000000000000000000000082af49447d8a07e3bd95bd0d56f35241523fbab1000000000000000000000000311e670c3305a0bd55184c1c6580ebea1fa611f0000000000000000000000000a5f36e822540efd11fcd77ec46626b916b217c3e
Deployed Bytecode
0x60806040526004361061016a5760003560e01c8063674d9422116100d1578063af1280b01161008a578063e7cd4a0411610064578063e7cd4a041461039f578063eb99be12146103bf578063f2fde38b146103d4578063f87dc1b7146103f457610171565b8063af1280b014610362578063b730d15014610377578063db70b5c71461038c57610171565b8063674d9422146102a757806369e4e417146102c95780636f9170f6146102de5780638456db151461030b5780638b3bb0891461032057806399882c8f1461034157610171565b80631e6d24c2116101235780631e6d24c2146102195780632042e5c21461023957806323c38fa3146102595780634e71e0c81461026c5780635028bb951461028157806354bacd131461029457610171565b80630d009297146101735780630d4eec8f146101935780630d9be500146101be5780630dd4ebd9146101d157806312ff148d146101f157806316048bc41461020457610171565b3661017157005b005b34801561017f57600080fd5b5061017161018e366004613d14565b610414565b34801561019f57600080fd5b506101a8610482565b6040516101b59190614367565b60405180910390f35b6101a86101cc366004613fcd565b6104a6565b6101e46101df366004613f31565b610707565b6040516101b591906149a1565b6101716101ff366004614052565b610d74565b34801561021057600080fd5b506101a86111b1565b34801561022557600080fd5b506101e4610234366004614170565b6111c5565b34801561024557600080fd5b50610171610254366004613d14565b6116d5565b6101e4610267366004613e4f565b611725565b34801561027857600080fd5b50610171611b8b565b6101e461028f3660046140f2565b611c2a565b6101e46102a2366004613d4c565b612183565b6102ba6102b53660046141f9565b612420565b6040516101b5939291906149d5565b3480156102d557600080fd5b506101a86126e8565b3480156102ea57600080fd5b506102fe6102f9366004613d14565b61270c565b6040516101b591906144f6565b34801561031757600080fd5b506101a8612721565b61033361032e366004613fcd565b612730565b6040516101b592919061437b565b61035461034f3660046141f9565b6129b4565b6040516101b59291906149c7565b34801561036e57600080fd5b506101a8612ca5565b34801561038357600080fd5b506101a8612cc9565b61017161039a36600461425e565b612ced565b3480156103ab57600080fd5b506101716103ba366004613d14565b612e30565b3480156103cb57600080fd5b506101a8612e83565b3480156103e057600080fd5b506101716103ef366004613d14565b612ea7565b34801561040057600080fd5b506101e461040f366004613f31565b612f36565b600154600160a01b900460ff16156104475760405162461bcd60e51b815260040161043e906147ba565b60405180910390fd5b6001805460ff60a01b1916600160a01b179055600080546001600160a01b0390921661010002610100600160a81b0319909216919091179055565b7f00000000000000000000000082af49447d8a07e3bd95bd0d56f35241523fbab181565b6000805460ff16156104ca5760405162461bcd60e51b815260040161043e9061460b565b6000805460ff1916600117905581428110156104f85760405162461bcd60e51b815260040161043e90614767565b7f000000000000000000000000ddb13e6dd168e1a68dc2285cb212078ae10394a96001600160a01b03166309b8adb86040518163ffffffff1660e01b8152600401602060405180830381600087803b15801561055357600080fd5b505af1158015610567573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061058b9190613d30565b91508a8a6105b53385848e6001600160a01b038216600080516020614a79833981519152146133a3565b6105db3385838d6001600160a01b038216600080516020614a79833981519152146133a3565b6001600160a01b038216600080516020614a79833981519152141561061e577f00000000000000000000000082af49447d8a07e3bd95bd0d56f35241523fbab191505b6001600160a01b038116600080516020614a79833981519152141561066057507f00000000000000000000000082af49447d8a07e3bd95bd0d56f35241523fbab15b7f000000000000000000000000ddb13e6dd168e1a68dc2285cb212078ae10394a96001600160a01b031663195eefe0853385858e8d8f8e6040518963ffffffff1660e01b81526004016106ba989796959493929190614419565b600060405180830381600087803b1580156106d457600080fd5b505af11580156106e8573d6000803e3d6000fd5b50506000805460ff1916905550939d9c50505050505050505050505050565b6000814281101561072a5760405162461bcd60e51b815260040161043e90614767565b600086511161074b5760405162461bcd60e51b815260040161043e90614501565b6000871161076b5760405162461bcd60e51b815260040161043e90614538565b89896107933330848d6001600160a01b038216600080516020614a79833981519152146133a3565b60005b8851811015610ba05760008982815181106107ad57fe5b60200260200101519050886001166000141561095b576000816001600160a01b0316634a248d2a6040518163ffffffff1660e01b815260040160206040518083038186803b1580156107fe57600080fd5b505afa158015610812573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108369190613d30565b90506000816001600160a01b03166370a08231306040518263ffffffff1660e01b81526004016108669190614367565b60206040518083038186803b15801561087e57600080fd5b505afa158015610892573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108b691906142c6565b90506108d26001600160a01b038316848363ffffffff6134f016565b604051638dae733360e01b81526001600160a01b03841690638dae7333906109019084906000906004016149aa565b602060405180830381600087803b15801561091b57600080fd5b505af115801561092f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061095391906142c6565b505050610b93565b6000816001600160a01b031663d4b970466040518163ffffffff1660e01b815260040160206040518083038186803b15801561099657600080fd5b505afa1580156109aa573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109ce9190613d30565b90506000816001600160a01b03166370a08231306040518263ffffffff1660e01b81526004016109fe9190614367565b60206040518083038186803b158015610a1657600080fd5b505afa158015610a2a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a4e91906142c6565b9050610a6a6001600160a01b038316848363ffffffff6134f016565b60405163ca19ebd960e01b81526000906001600160a01b037f000000000000000000000000a5f36e822540efd11fcd77ec46626b916b217c3e169063ca19ebd990610abb908790869060040161437b565b60206040518083038186803b158015610ad357600080fd5b505afa158015610ae7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b0b91906142c6565b60405163733e738360e11b81529091506001600160a01b0385169063e67ce70690610b3c90849086906004016149aa565b602060405180830381600087803b158015610b5657600080fd5b505af1158015610b6a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b8e91906142c6565b505050505b50600197881c9701610796565b506001600160a01b038116600080516020614a798339815191521415610ce2576040516370a0823160e01b81526001600160a01b037f00000000000000000000000082af49447d8a07e3bd95bd0d56f35241523fbab116906370a0823190610c0c903090600401614367565b60206040518083038186803b158015610c2457600080fd5b505afa158015610c38573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c5c91906142c6565b604051632e1a7d4d60e01b81529094506001600160a01b037f00000000000000000000000082af49447d8a07e3bd95bd0d56f35241523fbab11690632e1a7d4d90610cab9087906004016149a1565b600060405180830381600087803b158015610cc557600080fd5b505af1158015610cd9573d6000803e3d6000fd5b50505050610cfe565b610cfb6001600160a01b0382163063ffffffff6135be16565b93505b88841015610d1e5760405162461bcd60e51b815260040161043e90614663565b610d386001600160a01b038216338663ffffffff61364616565b600080516020614a598339815191528282338d88604051610d5d959493929190614463565b60405180910390a150505098975050505050505050565b60005460ff1615610d975760405162461bcd60e51b815260040161043e9061460b565b6000805460ff191660011790558042811015610dc55760405162461bcd60e51b815260040161043e90614767565b610e5c33898a6001600160a01b0316634a248d2a6040518163ffffffff1660e01b815260040160206040518083038186803b158015610e0357600080fd5b505afa158015610e17573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e3b9190613d30565b89600081518110610e4857fe5b60200260200101518960ff166001146133a3565b610ef333898a6001600160a01b031663d4b970466040518163ffffffff1660e01b815260040160206040518083038186803b158015610e9a57600080fd5b505afa158015610eae573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ed29190613d30565b89600181518110610edf57fe5b60200260200101518960ff166002146133a3565b876001600160a01b03166316048bc46040518163ffffffff1660e01b8152600401602060405180830381600087803b158015610f2e57600080fd5b505af1158015610f42573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f669190613d30565b6001600160a01b0316638ff3928c3389600081518110610f8257fe5b60200260200101518a600181518110610f9757fe5b60200260200101518b600281518110610fac57fe5b60200260200101518b600281518110610fc157fe5b60200260200101518c600381518110610fd657fe5b60200260200101518b8b6040518963ffffffff1660e01b8152600401611003989796959493929190614394565b602060405180830381600087803b15801561101d57600080fd5b505af1158015611031573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061105591906142aa565b6110715760405162461bcd60e51b815260040161043e906145e5565b61110733896001600160a01b0316634a248d2a6040518163ffffffff1660e01b815260040160206040518083038186803b1580156110ae57600080fd5b505afa1580156110c2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110e69190613d30565b886002815181106110f357fe5b60200260200101518860ff166003146136b5565b61119d33896001600160a01b031663d4b970466040518163ffffffff1660e01b815260040160206040518083038186803b15801561114457600080fd5b505afa158015611158573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061117c9190613d30565b8860038151811061118957fe5b60200260200101518860ff166004146136b5565b50506000805460ff19169055505050505050565b60005461010090046001600160a01b031681565b600081428110156111e85760405162461bcd60e51b815260040161043e90614767565b60008651116112095760405162461bcd60e51b815260040161043e90614501565b600087116112295760405162461bcd60e51b815260040161043e90614538565b7f000000000000000000000000311e670c3305a0bd55184c1c6580ebea1fa611f06001600160a01b0316630a5ea4668a338960008151811061126757fe5b60200260200101518c6040518563ffffffff1660e01b815260040161128f94939291906143ef565b600060405180830381600087803b1580156112a957600080fd5b505af11580156112bd573d6000803e3d6000fd5b506000925050505b86518110156115235760018751038114156114115760018616611379578681815181106112ee57fe5b60200260200101516001600160a01b031663bd6015b4306040518263ffffffff1660e01b81526004016113219190614367565b602060405180830381600087803b15801561133b57600080fd5b505af115801561134f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061137391906142c6565b5061140c565b86818151811061138557fe5b60200260200101516001600160a01b031663dd93f59a306040518263ffffffff1660e01b81526004016113b89190614367565b602060405180830381600087803b1580156113d257600080fd5b505af11580156113e6573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061140a91906142c6565b505b611517565b6001861661146e5786818151811061142557fe5b60200260200101516001600160a01b031663bd6015b488836001018151811061144a57fe5b60200260200101516040518263ffffffff1660e01b81526004016113b89190614367565b86818151811061147a57fe5b60200260200101516001600160a01b031663dd93f59a88836001018151811061149f57fe5b60200260200101516040518263ffffffff1660e01b81526004016114c39190614367565b602060405180830381600087803b1580156114dd57600080fd5b505af11580156114f1573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061151591906142c6565b505b600195861c95016112c5565b506040516370a0823160e01b81526001600160a01b037f00000000000000000000000082af49447d8a07e3bd95bd0d56f35241523fbab116906370a0823190611570903090600401614367565b60206040518083038186803b15801561158857600080fd5b505afa15801561159c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115c091906142c6565b9150868210156115e25760405162461bcd60e51b815260040161043e90614663565b604051632e1a7d4d60e01b81526001600160a01b037f00000000000000000000000082af49447d8a07e3bd95bd0d56f35241523fbab11690632e1a7d4d9061162e9085906004016149a1565b600060405180830381600087803b15801561164857600080fd5b505af115801561165c573d6000803e3d6000fd5b505060405133925084156108fc02915084906000818181858888f1935050505015801561168d573d6000803e3d6000fd5b50600080516020614a5983398151915289600080516020614a79833981519152338b866040516116c1959493929190614463565b60405180910390a150979650505050505050565b60005461010090046001600160a01b031633146117045760405162461bcd60e51b815260040161043e90614876565b6001600160a01b03166000908152600260205260409020805460ff19169055565b600081428110156117485760405162461bcd60e51b815260040161043e90614767565b60008751116117695760405162461bcd60e51b815260040161043e90614501565b875187511461178a5760405162461bcd60e51b815260040161043e906145a0565b60018651038751146117ae5760405162461bcd60e51b815260040161043e906148e3565b600089116117ce5760405162461bcd60e51b815260040161043e90614538565b8b8b8b60006117ec6001600160a01b0384163363ffffffff61378d16565b9050611831338b6000815181106117ff57fe5b60200260200101518685600080516020614a798339815191526001600160a01b0316896001600160a01b0316146133a3565b60005b8b5181101561198f5760018a166118e6578c818151811061185157fe5b60200260200101516001600160a01b03166330e6ae318c836001018151811061187657fe5b60200260200101518e848151811061188a57fe5b60200260200101516040518363ffffffff1660e01b81526004016118af929190614497565b600060405180830381600087803b1580156118c957600080fd5b505af11580156118dd573d6000803e3d6000fd5b50505050611983565b8c81815181106118f257fe5b60200260200101516001600160a01b0316636f7929f28c836001018151811061191757fe5b60200260200101518e848151811061192b57fe5b60200260200101516040518363ffffffff1660e01b8152600401611950929190614497565b600060405180830381600087803b15801561196a57600080fd5b505af115801561197e573d6000803e3d6000fd5b505050505b6001998a1c9901611834565b506001600160a01b038316600080516020614a798339815191521415611aff576040516370a0823160e01b81526001600160a01b037f00000000000000000000000082af49447d8a07e3bd95bd0d56f35241523fbab116906370a08231906119fb903090600401614367565b60206040518083038186803b158015611a1357600080fd5b505afa158015611a27573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a4b91906142c6565b604051632e1a7d4d60e01b81529096506001600160a01b037f00000000000000000000000082af49447d8a07e3bd95bd0d56f35241523fbab11690632e1a7d4d90611a9a9089906004016149a1565b600060405180830381600087803b158015611ab457600080fd5b505af1158015611ac8573d6000803e3d6000fd5b505060405133925088156108fc02915088906000818181858888f19350505050158015611af9573d6000803e3d6000fd5b50611b2b565b611b2881611b1c6001600160a01b0386163363ffffffff6135be16565b9063ffffffff61383116565b95505b8c861015611b4b5760405162461bcd60e51b815260040161043e90614663565b600080516020614a59833981519152848433858a604051611b70959493929190614463565b60405180910390a150505050509a9950505050505050505050565b6001546001600160a01b03163314611bb55760405162461bcd60e51b815260040161043e90614579565b600154600080546040516001600160a01b0393841693610100909204909116917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a36001805460008054610100600160a81b0319166101006001600160a01b038416021790556001600160a01b0319169055565b60008142811015611c4d5760405162461bcd60e51b815260040161043e90614767565b6000865111611c6e5760405162461bcd60e51b815260040161043e90614501565b60008711611c8e5760405162461bcd60e51b815260040161043e90614538565b6040516370a0823160e01b81526000906001600160a01b038a16906370a0823190611cbd903390600401614367565b60206040518083038186803b158015611cd557600080fd5b505afa158015611ce9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d0d91906142c6565b90507f00000000000000000000000082af49447d8a07e3bd95bd0d56f35241523fbab16001600160a01b031663d0e30db0346040518263ffffffff1660e01b81526004016000604051808303818588803b158015611d6a57600080fd5b505af1158015611d7e573d6000803e3d6000fd5b50505050507f00000000000000000000000082af49447d8a07e3bd95bd0d56f35241523fbab16001600160a01b031663a9059cbb88600081518110611dbf57fe5b6020026020010151346040518363ffffffff1660e01b8152600401611de592919061437b565b602060405180830381600087803b158015611dff57600080fd5b505af1158015611e13573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e3791906142aa565b5060005b8751811015612099576001885103811415611f875760018716611eef57878181518110611e6457fe5b60200260200101516001600160a01b031663bd6015b4336040518263ffffffff1660e01b8152600401611e979190614367565b602060405180830381600087803b158015611eb157600080fd5b505af1158015611ec5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ee991906142c6565b50611f82565b878181518110611efb57fe5b60200260200101516001600160a01b031663dd93f59a336040518263ffffffff1660e01b8152600401611f2e9190614367565b602060405180830381600087803b158015611f4857600080fd5b505af1158015611f5c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f8091906142c6565b505b61208d565b60018716611fe457878181518110611f9b57fe5b60200260200101516001600160a01b031663bd6015b4898360010181518110611fc057fe5b60200260200101516040518263ffffffff1660e01b8152600401611f2e9190614367565b878181518110611ff057fe5b60200260200101516001600160a01b031663dd93f59a89836001018151811061201557fe5b60200260200101516040518263ffffffff1660e01b81526004016120399190614367565b602060405180830381600087803b15801561205357600080fd5b505af1158015612067573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061208b91906142c6565b505b600196871c9601611e3b565b5061211a818a6001600160a01b03166370a08231336040518263ffffffff1660e01b81526004016120ca9190614367565b60206040518083038186803b1580156120e257600080fd5b505afa1580156120f6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b1c91906142c6565b92508783101561213c5760405162461bcd60e51b815260040161043e90614663565b600080516020614a59833981519152600080516020614a798339815191528a33348760405161216f959493929190614463565b60405180910390a150509695505050505050565b600081428110156121a65760405162461bcd60e51b815260040161043e90614767565b600086116121c65760405162461bcd60e51b815260040161043e90614538565b60006121e16001600160a01b038c163363ffffffff61378d16565b90506001600160a01b038c16600080516020614a798339815191521461229a5760405163052f523360e11b81526001600160a01b037f000000000000000000000000311e670c3305a0bd55184c1c6580ebea1fa611f01690630a5ea46690612253908f90339030908e906004016143ef565b600060405180830381600087803b15801561226d57600080fd5b505af1158015612281573d6000803e3d6000fd5b5061229a925050506001600160a01b038d168b8a6134f0565b6001600160a01b03891660009081526002602052604090205460ff166122d25760405162461bcd60e51b815260040161043e906147e4565b60006001600160a01b03808b16908e16600080516020614a79833981519152146122fd5760006122ff565b345b8860405161230d919061432e565b60006040518083038185875af1925050503d806000811461234a576040519150601f19603f3d011682016040523d82523d6000602084013e61234f565b606091505b50509050806123705760405162461bcd60e51b815260040161043e90614829565b6123a43361238d6001600160a01b038f163063ffffffff61378d16565b6001600160a01b038f16919063ffffffff61364616565b6123c182611b1c6001600160a01b038f163363ffffffff61378d16565b9350878410156123e35760405162461bcd60e51b815260040161043e90614663565b600080516020614a598339815191528d8d338c88604051612408959493929190614463565b60405180910390a15050509998505050505050505050565b600080548190819060ff16156124485760405162461bcd60e51b815260040161043e9061460b565b6000805460ff1916600117905583428110156124765760405162461bcd60e51b815260040161043e90614767565b8a612482818c8c613859565b90945092508884108015906124975750878310155b6124b35760405162461bcd60e51b815260040161043e9061471c565b6125363382836001600160a01b0316634a248d2a6040518163ffffffff1660e01b815260040160206040518083038186803b1580156124f157600080fd5b505afa158015612505573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125299190613d30565b878b60ff166001146133a3565b6125b93382836001600160a01b031663d4b970466040518163ffffffff1660e01b815260040160206040518083038186803b15801561257457600080fd5b505afa158015612588573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125ac9190613d30565b868b60ff166002146133a3565b604051634c85b42560e01b81526001600160a01b03821690634c85b425906125e5903390600401614367565b606060405180830381600087803b1580156125ff57600080fd5b505af1158015612613573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126379190614301565b5090955050600160ff881614801561264e57508334115b156126845760405133903486900380156108fc02916000818181858888f19350505050158015612682573d6000803e3d6000fd5b505b8660ff16600214801561269657508234115b156126cc5760405133903485900380156108fc02916000818181858888f193505050501580156126ca573d6000803e3d6000fd5b505b50506000805460ff191690559199909850909650945050505050565b7f000000000000000000000000da4c4411c55b0785e501332354a036c04833b72b81565b60026020526000908152604090205460ff1681565b6001546001600160a01b031681565b60008054819060ff16156127565760405162461bcd60e51b815260040161043e9061460b565b6000805460ff1916600117905582428110156127845760405162461bcd60e51b815260040161043e90614767565b60006001600160a01b038d16600080516020614a79833981519152146127aa578c6127cc565b7f00000000000000000000000082af49447d8a07e3bd95bd0d56f35241523fbab15b905060006001600160a01b038d16600080516020614a79833981519152146127f4578c612816565b7f00000000000000000000000082af49447d8a07e3bd95bd0d56f35241523fbab15b60405163e18c40c760e01b81529091506001600160a01b037f000000000000000000000000da4c4411c55b0785e501332354a036c04833b72b169063e18c40c79061286f90859085908f908f908f908f906004016144c0565b602060405180830381600087803b15801561288957600080fd5b505af115801561289d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128c19190613d30565b94508d91508c90506128ef3386848f6001600160a01b038216600080516020614a79833981519152146133a3565b6129153386838e6001600160a01b038216600080516020614a79833981519152146133a3565b5050604051634c85b42560e01b81526001600160a01b03841690634c85b42590612943903390600401614367565b606060405180830381600087803b15801561295d57600080fd5b505af1158015612971573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129959190614301565b50506000805460ff19169055929c929b50919950505050505050505050565b60008054819060ff16156129da5760405162461bcd60e51b815260040161043e9061460b565b6000805460ff191660011790558242811015612a085760405162461bcd60e51b815260040161043e90614767565b60008a6001600160a01b0316634a248d2a6040518163ffffffff1660e01b815260040160206040518083038186803b158015612a4357600080fd5b505afa158015612a57573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a7b9190613d30565b905060008b6001600160a01b031663d4b970466040518163ffffffff1660e01b815260040160206040518083038186803b158015612ab857600080fd5b505afa158015612acc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612af09190613d30565b9050612b053330848e8b60ff166001146133a3565b612b183330838d8b60ff166002146133a3565b8a15612bbb57612b386001600160a01b0383168d8d63ffffffff6134f016565b60405163aa06ce9b60e01b81526001600160a01b038d169063aa06ce9b90612b669033908f9060040161437b565b602060405180830381600087803b158015612b8057600080fd5b505af1158015612b94573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612bb891906142c6565b94505b8915612c5e57612bdb6001600160a01b0382168d8c63ffffffff6134f016565b6040516317c5e7d960e21b81526001600160a01b038d1690635f179f6490612c099033908e9060040161437b565b602060405180830381600087803b158015612c2357600080fd5b505af1158015612c37573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c5b91906142c6565b93505b888510158015612c6e5750878410155b612c8a5760405162461bcd60e51b815260040161043e906146ad565b50506000805460ff1916905550909890975095505050505050565b7f000000000000000000000000a5f36e822540efd11fcd77ec46626b916b217c3e81565b7f000000000000000000000000ddb13e6dd168e1a68dc2285cb212078ae10394a981565b60005460ff1615612d105760405162461bcd60e51b815260040161043e9061460b565b6000805460ff191660011790558042811015612d3e5760405162461bcd60e51b815260040161043e90614767565b612dc13386876001600160a01b031663d4b970466040518163ffffffff1660e01b815260040160206040518083038186803b158015612d7c57600080fd5b505afa158015612d90573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612db49190613d30565b878760ff166001146133a3565b604051639cf5453d60e01b81526001600160a01b03861690639cf5453d90612ded903390600401614367565b600060405180830381600087803b158015612e0757600080fd5b505af1158015612e1b573d6000803e3d6000fd5b50506000805460ff1916905550505050505050565b60005461010090046001600160a01b03163314612e5f5760405162461bcd60e51b815260040161043e90614876565b6001600160a01b03166000908152600260205260409020805460ff19166001179055565b7f000000000000000000000000311e670c3305a0bd55184c1c6580ebea1fa611f081565b60005461010090046001600160a01b03163314612ed65760405162461bcd60e51b815260040161043e90614876565b600080546040516001600160a01b038085169361010090930416917fdcf55418cee3220104fef63f979ff3c4097ad240c0c43dcb33ce837748983e6291a3600180546001600160a01b0319166001600160a01b0392909216919091179055565b60008142811015612f595760405162461bcd60e51b815260040161043e90614767565b6000865111612f7a5760405162461bcd60e51b815260040161043e90614501565b60008711612f9a5760405162461bcd60e51b815260040161043e90614538565b6040516370a0823160e01b81526000906001600160a01b038b16906370a0823190612fc9903390600401614367565b60206040518083038186803b158015612fe157600080fd5b505afa158015612ff5573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061301991906142c6565b90507f000000000000000000000000311e670c3305a0bd55184c1c6580ebea1fa611f06001600160a01b0316630a5ea4668c338a60008151811061305957fe5b60200260200101518d6040518563ffffffff1660e01b815260040161308194939291906143ef565b600060405180830381600087803b15801561309b57600080fd5b505af11580156130af573d6000803e3d6000fd5b506000925050505b8751811015613315576001885103811415613203576001871661316b578781815181106130e057fe5b60200260200101516001600160a01b031663bd6015b4336040518263ffffffff1660e01b81526004016131139190614367565b602060405180830381600087803b15801561312d57600080fd5b505af1158015613141573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061316591906142c6565b506131fe565b87818151811061317757fe5b60200260200101516001600160a01b031663dd93f59a336040518263ffffffff1660e01b81526004016131aa9190614367565b602060405180830381600087803b1580156131c457600080fd5b505af11580156131d8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906131fc91906142c6565b505b613309565b600187166132605787818151811061321757fe5b60200260200101516001600160a01b031663bd6015b489836001018151811061323c57fe5b60200260200101516040518263ffffffff1660e01b81526004016131aa9190614367565b87818151811061326c57fe5b60200260200101516001600160a01b031663dd93f59a89836001018151811061329157fe5b60200260200101516040518263ffffffff1660e01b81526004016132b59190614367565b602060405180830381600087803b1580156132cf57600080fd5b505af11580156132e3573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061330791906142c6565b505b600196871c96016130b7565b50613346818b6001600160a01b03166370a08231336040518263ffffffff1660e01b81526004016120ca9190614367565b9250878310156133685760405162461bcd60e51b815260040161043e90614663565b600080516020614a598339815191528b8b338c8760405161338d959493929190614463565b60405180910390a1505098975050505050505050565b801561346457811561345f577f00000000000000000000000082af49447d8a07e3bd95bd0d56f35241523fbab16001600160a01b031663d0e30db0836040518263ffffffff1660e01b81526004016000604051808303818588803b15801561340a57600080fd5b505af115801561341e573d6000803e3d6000fd5b505050506001600160a01b0385163014905061345f5761345f7f00000000000000000000000082af49447d8a07e3bd95bd0d56f35241523fbab18584613971565b6134e9565b60405163052f523360e11b81526001600160a01b037f000000000000000000000000311e670c3305a0bd55184c1c6580ebea1fa611f01690630a5ea466906134b69086908990899088906004016143ef565b600060405180830381600087803b1580156134d057600080fd5b505af11580156134e4573d6000803e3d6000fd5b505050505b5050505050565b604051636eb1769f60e11b81526000906001600160a01b0385169063dd62ed3e9061352190309087906004016143d5565b60206040518083038186803b15801561353957600080fd5b505afa15801561354d573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061357191906142c6565b9050818110156135b857801561359c5761359c6001600160a01b03851684600063ffffffff6139c716565b6135b86001600160a01b0385168460001963ffffffff6139c716565b50505050565b6040516370a0823160e01b81526000906001600160a01b038416906370a08231906135ed908590600401614367565b60206040518083038186803b15801561360557600080fd5b505afa158015613619573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061363d91906142c6565b90505b92915050565b80156136b05761365583613a8a565b15613696576040516001600160a01b0383169082156108fc029083906000818181858888f19350505050158015613690573d6000803e3d6000fd5b506136b0565b6136b06001600160a01b038416838363ffffffff61397116565b505050565b801561377c57811561377757604051632e1a7d4d60e01b81526001600160a01b037f00000000000000000000000082af49447d8a07e3bd95bd0d56f35241523fbab11690632e1a7d4d9061370d9085906004016149a1565b600060405180830381600087803b15801561372757600080fd5b505af115801561373b573d6000803e3d6000fd5b50506040516001600160a01b038716925084156108fc02915084906000818181858888f19350505050158015613775573d6000803e3d6000fd5b505b6135b8565b81156135b8576135b8838584613971565b600061379883613a8a565b156137ae57506001600160a01b03811631613640565b6040516370a0823160e01b81526001600160a01b038416906370a08231906137da908590600401614367565b60206040518083038186803b1580156137f257600080fd5b505afa158015613806573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061382a91906142c6565b9050613640565b6000828211156138535760405162461bcd60e51b815260040161043e90614797565b50900390565b600080600080866001600160a01b03166336223ce96040518163ffffffff1660e01b8152600401604080518083038186803b15801561389757600080fd5b505afa1580156138ab573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906138cf91906142de565b915091508060001480156138e1575081155b156138ed578593508492505b801580156138fb5750600082115b1561390857859350600092505b6000811180156139185750600082115b156139675760006139298784613aa9565b905060006139378784613aa9565b90508082116139545787955061394d8383613ad3565b9450613964565b8694506139618482613ad3565b95505b50505b5050935093915050565b6136b08363a9059cbb60e01b848460405160240161399092919061437b565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152613afd565b801580613a4f5750604051636eb1769f60e11b81526001600160a01b0384169063dd62ed3e906139fd90309086906004016143d5565b60206040518083038186803b158015613a1557600080fd5b505afa158015613a29573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613a4d91906142c6565b155b613a6b5760405162461bcd60e51b815260040161043e90614928565b6136b08363095ea7b360e01b848460405160240161399092919061437b565b6001600160a01b038116600080516020614a7983398151915214919050565b600061363d82613ac785670de0b6b3a764000063ffffffff613bb416565b9063ffffffff613bee16565b6000670de0b6b3a7640000613aee848463ffffffff613bb416565b81613af557fe5b049392505050565b60006060836001600160a01b031683604051613b19919061432e565b6000604051808303816000865af19150503d8060008114613b56576040519150601f19603f3d011682016040523d82523d6000602084013e613b5b565b606091505b509150915081613b7d5760405162461bcd60e51b815260040161043e9061462e565b8051156135b85780806020019051810190613b9891906142aa565b6135b85760405162461bcd60e51b815260040161043e90614899565b600082613bc357506000613640565b82820282848281613bd057fe5b041461363d5760405162461bcd60e51b815260040161043e9061497e565b6000808211613c0f5760405162461bcd60e51b815260040161043e906146f4565b818381613af557fe5b803561364081614a32565b600082601f830112613c33578081fd5b8135613c46613c4182614a12565b6149eb565b818152915060208083019084810181840286018201871015613c6757600080fd5b60005b84811015613c8f578135613c7d81614a32565b84529282019290820190600101613c6a565b505050505092915050565b600082601f830112613caa578081fd5b8135613cb8613c4182614a12565b818152915060208083019084810181840286018201871015613cd957600080fd5b60005b84811015613c8f57813584529282019290820190600101613cdc565b803561364081614a4a565b803560ff8116811461364057600080fd5b600060208284031215613d25578081fd5b813561363d81614a32565b600060208284031215613d41578081fd5b815161363d81614a32565b60008060008060008060008060006101208a8c031215613d6a578485fd5b8935613d7581614a32565b985060208a810135613d8681614a32565b985060408b0135613d9681614a32565b975060608b0135613da681614a32565b965060808b0135955060a08b0135945060c08b013567ffffffffffffffff80821115613dd0578586fd5b818d018e601f820112613de1578687fd5b8035925081831115613df1578687fd5b613e03601f8401601f191685016149eb565b91508282528e84848301011115613e18578687fd5b82848201858401375090810190910193909352613e388b60e08c01613cf8565b91506101008a013590509295985092959850929598565b6000806000806000806000806000806101408b8d031215613e6e578081fd5b613e788c8c613c18565b9950613e878c60208d01613c18565b985060408b0135975060608b0135965060808b013567ffffffffffffffff80821115613eb1578283fd5b613ebd8e838f01613c23565b975060a08d0135915080821115613ed2578283fd5b613ede8e838f01613c23565b965060c08d0135915080821115613ef3578283fd5b50613f008d828e01613c23565b94505060e08b01359250613f188c6101008d01613cf8565b91506101208b013590509295989b9194979a5092959850565b600080600080600080600080610100898b031215613f4d578384fd5b8835613f5881614a32565b97506020890135613f6881614a32565b96506040890135955060608901359450608089013567ffffffffffffffff811115613f91578485fd5b613f9d8b828c01613c23565b94505060a0890135925060c0890135613fb581614a4a565b8092505060e089013590509295985092959890939650565b60008060008060008060008060006101208a8c031215613feb578485fd5b8935613ff681614a32565b985060208a013561400681614a32565b975060408a0135965060608a0135955060808a0135945060a08a0135935060c08a0135925060e08a013561403981614a4a565b809250506101008a013590509295985092959850929598565b600080600080600080600060e0888a03121561406c578081fd5b873561407781614a32565b9650602088013567ffffffffffffffff80821115614093578283fd5b61409f8b838c01613c9a565b975060408a01359150808211156140b4578283fd5b506140c18a828b01613c9a565b9550506140d18960608a01613d03565b9699959850939660808101359560a0820135955060c0909101359350915050565b60008060008060008060c0878903121561410a578384fd5b863561411581614a32565b955060208701359450604087013567ffffffffffffffff811115614137578485fd5b61414389828a01613c23565b94505060608701359250608087013561415b81614a4a565b8092505060a087013590509295509295509295565b600080600080600080600060e0888a03121561418a578081fd5b873561419581614a32565b96506020880135955060408801359450606088013567ffffffffffffffff8111156141be578182fd5b6141ca8a828b01613c23565b9450506080880135925060a08801356141e281614a4a565b8092505060c0880135905092959891949750929550565b600080600080600080600060e0888a031215614213578081fd5b873561421e81614a32565b9650602088013595506040880135945060608801359350608088013592506142498960a08a01613d03565b915060c0880135905092959891949750929550565b60008060008060808587031215614273578182fd5b843561427e81614a32565b935060208501359250604085013560ff8116811461429a578283fd5b9396929550929360600135925050565b6000602082840312156142bb578081fd5b815161363d81614a4a565b6000602082840312156142d7578081fd5b5051919050565b600080604083850312156142f0578182fd5b505080516020909101519092909150565b600080600060608486031215614315578081fd5b8351925060208401519150604084015190509250925092565b60008251815b8181101561434e5760208186018101518583015201614334565b8181111561435c5782828501525b509190910192915050565b6001600160a01b0391909116815260200190565b6001600160a01b03929092168252602082015260400190565b6001600160a01b03989098168852602088019690965260408701949094526060860192909252608085015260a084015260c083015260e08201526101000190565b6001600160a01b0392831681529116602082015260400190565b6001600160a01b039485168152928416602084015292166040820152606081019190915260800190565b6001600160a01b03988916815296881660208801529487166040870152929095166060850152608084015260a083019390935260c082019290925290151560e08201526101000190565b6001600160a01b03958616815293851660208501529190931660408301526060820192909252608081019190915260a00190565b6001600160a01b0392831681529116602082015260606040820181905260009082015260800190565b6001600160a01b03968716815294909516602085015260408401929092526060830152608082015290151560a082015260c00190565b901515815260200190565b6020808252601a908201527f444f444f563250726f787930323a2050414952535f454d505459000000000000604082015260600190565b60208082526021908201527f444f444f563250726f787930323a2052455455524e5f414d4f554e545f5a45526040820152604f60f81b606082015260800190565b6020808252600d908201526c494e56414c49445f434c41494d60981b604082015260600190565b60208082526025908201527f444f444f563250726f787930323a20504149525f414441505445525f4e4f545f60408201526409a82a886960db1b606082015260800190565b6020808252600c908201526b14995cd95d0811985a5b195960a21b604082015260600190565b60208082526009908201526814915153951490539560ba1b604082015260600190565b6020808252818101527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564604082015260600190565b6020808252602a908201527f444f444f563250726f787930323a2052657475726e20616d6f756e74206973206040820152690dcdee840cadcdeeaced60b31b606082015260800190565b60208082526027908201527f444f444f563250726f787930323a2052657475726e20444c50206973206e6f74604082015266040cadcdeeaced60cb1b606082015260800190565b6020808252600e908201526d2224ab24a224a723afa2a92927a960911b604082015260600190565b6020808252602b908201527f444f444f563250726f787930323a206465706f73697420616d6f756e7420697360408201526a040dcdee840cadcdeeaced60ab1b606082015260800190565b6020808252601690820152751113d113d58c941c9bde1e4c0c8e881156141254915160521b604082015260600190565b60208082526009908201526829aaa12fa2a92927a960b91b604082015260600190565b60208082526010908201526f1113d113d7d25392551250531256915160821b604082015260600190565b60208082526025908201527f444f444f563250726f787930323a204e6f742057686974656c69737420436f6e6040820152641d1c9858dd60da1b606082015260800190565b6020808252602d908201527f444f444f563250726f787930323a2045787465726e616c20537761702065786560408201526c18dd5d1a5bdb8811985a5b1959609a1b606082015260800190565b6020808252600990820152682727aa2fa7aba722a960b91b604082015260600190565b6020808252602a908201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6040820152691bdd081cdd58d8d9595960b21b606082015260800190565b60208082526025908201527f444f444f563250726f787930323a20504149525f4153534554544f5f4e4f545f60408201526409a82a886960db1b606082015260800190565b60208082526036908201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60408201527520746f206e6f6e2d7a65726f20616c6c6f77616e636560501b606082015260800190565b60208082526009908201526826aaa62fa2a92927a960b91b604082015260600190565b90815260200190565b918252602082015260606040820181905260009082015260800190565b918252602082015260400190565b9283526020830191909152604082015260600190565b60405181810167ffffffffffffffff81118282101715614a0a57600080fd5b604052919050565b600067ffffffffffffffff821115614a28578081fd5b5060209081020190565b6001600160a01b0381168114614a4757600080fd5b50565b8015158114614a4757600080fdfe92ceb067a9883c85aba061e46b9edf505a0d6e81927c4b966ebed543a5221787000000000000000000000000eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeea26469706673582212209e0bc417dca50ea265340423113e471559802cf6f48006fee95bc5b4812dedb864736f6c63430006090033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000da4c4411c55b0785e501332354a036c04833b72b000000000000000000000000ddb13e6dd168e1a68dc2285cb212078ae10394a900000000000000000000000082af49447d8a07e3bd95bd0d56f35241523fbab1000000000000000000000000311e670c3305a0bd55184c1c6580ebea1fa611f0000000000000000000000000a5f36e822540efd11fcd77ec46626b916b217c3e
-----Decoded View---------------
Arg [0] : dvmFactory (address): 0xDa4c4411c55B0785e501332354A036c04833B72b
Arg [1] : dppFactory (address): 0xDdB13e6dd168E1a68DC2285Cb212078ae10394A9
Arg [2] : weth (address): 0x82aF49447D8a07e3bd95BD0d56f35241523fBab1
Arg [3] : dodoApproveProxy (address): 0x311E670c3305a0BD55184c1C6580eBeA1FA611F0
Arg [4] : dodoSellHelper (address): 0xA5F36E822540eFD11FcD77ec46626b916B217c3e
-----Encoded View---------------
5 Constructor Arguments found :
Arg [0] : 000000000000000000000000da4c4411c55b0785e501332354a036c04833b72b
Arg [1] : 000000000000000000000000ddb13e6dd168e1a68dc2285cb212078ae10394a9
Arg [2] : 00000000000000000000000082af49447d8a07e3bd95bd0d56f35241523fbab1
Arg [3] : 000000000000000000000000311e670c3305a0bd55184c1c6580ebea1fa611f0
Arg [4] : 000000000000000000000000a5f36e822540efd11fcd77ec46626b916b217c3e
Deployed Bytecode Sourcemap
32588:22846:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10285:127;;;;;;;;;;-1:-1:-1;10285:127:0;;;;;;;;:::i;32874:31::-;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;38711:1270;;;;;;;;;:::i;48341:2378::-;;;;;;;;;:::i;:::-;;;;;;;;39989:1391;;;;;;;;;:::i;9652:22::-;;;;;;;;;;;;;:::i;43129:1716::-;;;;;;;;;;-1:-1:-1;43129:1716:0;;;;;;;;:::i;34153:119::-;;;;;;;;;;-1:-1:-1;34153:119:0;;;;;;;;:::i;50729:2075::-;;;;;;;;;:::i;10591:228::-;;;;;;;;;;;;;:::i;41429:1692::-;;;;;;;;;:::i;46597:1736::-;;;;;;;;;:::i;35887:1465::-;;;;;;;;;:::i;:::-;;;;;;;;;;33014:38;;;;;;;;;;;;;:::i;33104:46::-;;;;;;;;;;-1:-1:-1;33104:46:0;;;;;;;;:::i;:::-;;;;;;;;9681:26;;;;;;;;;;;;;:::i;34355:1524::-;;;;;;;;;:::i;:::-;;;;;;;;;53260:1214;;;;;;;;;:::i;:::-;;;;;;;;;32964:43;;;;;;;;;;;;;:::i;33059:38::-;;;;;;;;;;;;;:::i;52874:376::-;;;;;;;;;:::i;34030:115::-;;;;;;;;;;-1:-1:-1;34030:115:0;;;;;;;;:::i;32912:45::-;;;;;;;;;;;;;:::i;10420:163::-;;;;;;;;;;-1:-1:-1;10420:163:0;;;;;;;;:::i;44853:1736::-;;;;;;;;;;-1:-1:-1;44853:1736:0;;;;;;;;:::i;10285:127::-;10074:13;;-1:-1:-1;;;10074:13:0;;;;10073:14;10065:43;;;;-1:-1:-1;;;10065:43:0;;;;;;;;;;;;;;;;;10371:4:::1;10355:20:::0;;-1:-1:-1;;;;10355:20:0::1;-1:-1:-1::0;;;10355:20:0::1;::::0;;;10386:18;;-1:-1:-1;;;;;10386:18:0;;::::1;10355:20;10386:18;-1:-1:-1::0;;;;;;10386:18:0;;::::1;::::0;;;::::1;::::0;;10285:127::o;32874:31::-;;;:::o;38711:1270::-;39119:22;32052:9;;;;32051:10;32043:32;;;;-1:-1:-1;;;32043:32:0;;;;;;;;;32086:9;:16;;-1:-1:-1;;32086:16:0;32098:4;32086:16;;;39091:8;33492:15:::1;33480:27:::0;::::1;;33472:62;;;;-1:-1:-1::0;;;33472:62:0::1;;;;;;;;;39184:13:::2;-1:-1:-1::0;;;;;39176:44:0::2;;:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39159:63:::0;-1:-1:-1;39256:9:0;39298:10;39319:91:::2;39328:10;39159:63:::0;39256:9;39368:12;-1:-1:-1;;;;;39382:27:0;::::2;-1:-1:-1::0;;;;;;;;;;;39382:27:0::2;39319:8;:91::i;:::-;39421:170;39444:10;39469:14:::0;39498:11;39524:13;-1:-1:-1;;;;;39552:28:0;::::2;-1:-1:-1::0;;;;;;;;;;;39552:28:0::2;39421:8;:170::i;:::-;-1:-1:-1::0;;;;;39608:27:0;::::2;-1:-1:-1::0;;;;;;;;;;;39608:27:0::2;39604:52;;;39650:6;39637:19;;39604:52;-1:-1:-1::0;;;;;39671:28:0;::::2;-1:-1:-1::0;;;;;;;;;;;39671:28:0::2;39667:54;;;-1:-1:-1::0;39715:6:0::2;39667:54;39742:13;-1:-1:-1::0;;;;;39734:42:0::2;;39791:14;39820:10;39845;39870:11;39896:9;39920:1;39936;39952:10;39734:239;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;-1:-1:-1::0;;32137:5:0;32125:17;;-1:-1:-1;;32125:17:0;;;-1:-1:-1;38711:1270:0;;;-1:-1:-1;;;;;;;;;;;;;38711:1270:0:o;48341:2378::-;48701:20;48673:8;33492:15;33480:8;:27;;33472:62;;;;-1:-1:-1;;;33472:62:0;;;;;;;;;48766:1:::1;48747:9;:16;:20;48739:59;;;;-1:-1:-1::0;;;48739:59:0::1;;;;;;;;;48835:1;48817:15;:19;48809:65;;;;-1:-1:-1::0;;;48809:65:0::1;;;;;;;;;48918:9:::0;48957:7;48985:93:::1;48994:10;49014:4;48918:9:::0;49033:15;-1:-1:-1;;;;;49050:27:0;::::1;-1:-1:-1::0;;;;;;;;;;;49050:27:0::1;48985:8;:93::i;:::-;49096:9;49091:1070;49115:9;:16;49111:1;:20;49091:1070;;;49153:19;49175:9;49185:1;49175:12;;;;;;;;;;;;;;49153:34;;49206:10;49219:1;49206:14;49224:1;49206:19;49202:905;;;49246:19;49276:11;-1:-1:-1::0;;;;;49268:33:0::1;;:35;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49246:57;;49322:19;49351:11;-1:-1:-1::0;;;;;49344:29:0::1;;49382:4;49344:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49322:66:::0;-1:-1:-1;49407:65:0::1;-1:-1:-1::0;;;;;49407:39:0;::::1;49447:11:::0;49322:66;49407:65:::1;:39;:65;:::i;:::-;49491:54;::::0;-1:-1:-1;;;49491:54:0;;-1:-1:-1;;;;;49491:34:0;::::1;::::0;::::1;::::0;:54:::1;::::0;49526:11;;49539:1:::1;::::0;49491:54:::1;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49202:905;;;;;49586:20;49617:11;-1:-1:-1::0;;;;;49609:34:0::1;;:36;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49586:59;;49664:19;49693:12;-1:-1:-1::0;;;;;49686:30:0::1;;49725:4;49686:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49664:67:::0;-1:-1:-1;49750:66:0::1;-1:-1:-1::0;;;;;49750:40:0;::::1;49791:11:::0;49664:67;49750:66:::1;:40;:66;:::i;:::-;49862:142;::::0;-1:-1:-1;;;49862:142:0;;49835:24:::1;::::0;-1:-1:-1;;;;;49878:18:0::1;49862:55;::::0;::::1;::::0;:142:::1;::::0;49940:11;;49974;;49862:142:::1;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50023:68;::::0;-1:-1:-1;;;50023:68:0;;49835:169;;-1:-1:-1;;;;;;50023:33:0;::::1;::::0;::::1;::::0;:68:::1;::::0;49835:169;;50075:11;;50023:68:::1;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49202:905;;;;-1:-1:-1::0;50148:1:0::1;50134:15:::0;;::::1;::::0;49133:3:::1;49091:1070;;;-1:-1:-1::0;;;;;;50187:25:0;::::1;-1:-1:-1::0;;;;;;;;;;;50187:25:0::1;50183:256;;;50244:38;::::0;-1:-1:-1;;;50244:38:0;;-1:-1:-1;;;;;50250:6:0::1;50244:23;::::0;::::1;::::0;:38:::1;::::0;50276:4:::1;::::0;50244:38:::1;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50297:36;::::0;-1:-1:-1;;;50297:36:0;;50229:53;;-1:-1:-1;;;;;;50303:6:0::1;50297:22;::::0;::::1;::::0;:36:::1;::::0;50229:53;;50297:36:::1;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;50183:256;;;50381:46;-1:-1:-1::0;;;;;50381:31:0;::::1;50421:4;50381:46;:31;:46;:::i;:::-;50366:61;;50183:256;50483:15;50467:12;:31;;50459:86;;;;-1:-1:-1::0;;;50459:86:0::1;;;;;;;;;50556:60;-1:-1:-1::0;;;;;50556:34:0;::::1;50591:10;50603:12:::0;50556:60:::1;:34;:60;:::i;:::-;-1:-1:-1::0;;;;;;;;;;;50647:10:0::1;50659:8;50669:10;50681:15;50698:12;50634:77;;;;;;;;;;;;;;;;;;;33545:1;;48341:2378:::0;;;;;;;;;;;:::o;39989:1391::-;32052:9;;;;32051:10;32043:32;;;;-1:-1:-1;;;32043:32:0;;;;;;;;;32086:9;:16;;-1:-1:-1;;32086:16:0;32098:4;32086:16;;;40494:8;33492:15:::1;33480:27:::0;::::1;;33472:62;;;;-1:-1:-1::0;;;33472:62:0::1;;;;;;;;;40515:170:::2;40538:10;40563;40596;-1:-1:-1::0;;;;;40588:32:0::2;;:34;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40637:10;40648:1;40637:13;;;;;;;;;;;;;;40665:4;:9;;40673:1;40665:9;40515:8;:170::i;:::-;40696:171;40719:10;40744;40777;-1:-1:-1::0;;;;;40769:33:0::2;;:35;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40819:10;40830:1;40819:13;;;;;;;;;;;;;;40847:4;:9;;40855:1;40847:9;40696:8;:171::i;:::-;40904:10;-1:-1:-1::0;;;;;40896:27:0::2;;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;40888:44:0::2;;40947:10;40972:9;40982:1;40972:12;;;;;;;;;;;;;;40999:9;41009:1;40999:12;;;;;;;;;;;;;;41026:9;41036:1;41026:12;;;;;;;;;;;;;;41053:10;41064:1;41053:13;;;;;;;;;;;;;;41081:10;41092:1;41081:13;;;;;;;;;;;;;;41109:14;41138:15;40888:276;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40880:301;;;;-1:-1:-1::0;;;40880:301:0::2;;;;;;;;;41194:83;41204:10;41224;-1:-1:-1::0;;;;;41216:32:0::2;;:34;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41252:10;41263:1;41252:13;;;;;;;;;;;;;;41267:4;:9;;41275:1;41267:9;41194;:83::i;:::-;41288:84;41298:10;41318;-1:-1:-1::0;;;;;41310:33:0::2;;:35;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41347:10;41358:1;41347:13;;;;;;;;;;;;;;41362:4;:9;;41370:1;41362:9;41288;:84::i;:::-;-1:-1:-1::0;;32137:5:0;32125:17;;-1:-1:-1;;32125:17:0;;;-1:-1:-1;;;;;;39989:1391:0:o;9652:22::-;;;;;;-1:-1:-1;;;;;9652:22:0;;:::o;43129:1716::-;43456:20;43428:8;33492:15;33480:8;:27;;33472:62;;;;-1:-1:-1;;;33472:62:0;;;;;;;;;43521:1:::1;43502:9;:16;:20;43494:59;;;;-1:-1:-1::0;;;43494:59:0::1;;;;;;;;;43590:1;43572:15;:19;43564:65;;;;-1:-1:-1::0;;;43564:65:0::1;;;;;;;;;43668:20;-1:-1:-1::0;;;;;43650:51:0::1;;43702:9;43713:10;43725:9;43735:1;43725:12;;;;;;;;;;;;;;43739:15;43650:105;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;43773:9:0::1;::::0;-1:-1:-1;;;43768:643:0::1;43792:9;:16;43788:1;:20;43768:643;;;43858:1;43839:9;:16;:20;43834:1;:25;43830:527;;;43897:1;43884:14:::0;::::1;43880:208;;43936:9;43946:1;43936:12;;;;;;;;;;;;;;-1:-1:-1::0;;;;;43928:30:0::1;;43967:4;43928:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43880:208;;;44030:9;44040:1;44030:12;;;;;;;;;;;;;;-1:-1:-1::0;;;;;44022:31:0::1;;44062:4;44022:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43880:208;43830:527;;;44145:1;44132:14:::0;::::1;44128:214;;44184:9;44194:1;44184:12;;;;;;;;;;;;;;-1:-1:-1::0;;;;;44176:30:0::1;;44207:9;44217:1;44221;44217:5;44207:16;;;;;;;;;;;;;;44176:48;;;;;;;;;;;;;;;;44128:214;44281:9;44291:1;44281:12;;;;;;;;;;;;;;-1:-1:-1::0;;;;;44273:31:0::1;;44305:9;44315:1;44319;44315:5;44305:16;;;;;;;;;;;;;;44273:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44128:214;44398:1;44384:15:::0;;::::1;::::0;43810:3:::1;43768:643;;;-1:-1:-1::0;44436:38:0::1;::::0;-1:-1:-1;;;44436:38:0;;-1:-1:-1;;;;;44442:6:0::1;44436:23;::::0;::::1;::::0;:38:::1;::::0;44468:4:::1;::::0;44436:38:::1;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44421:53;;44509:15;44493:12;:31;;44485:86;;;;-1:-1:-1::0;;;44485:86:0::1;;;;;;;;;44582:36;::::0;-1:-1:-1;;;44582:36:0;;-1:-1:-1;;;;;44588:6:0::1;44582:22;::::0;::::1;::::0;:36:::1;::::0;44605:12;;44582:36:::1;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;44629:33:0::1;::::0;:10:::1;::::0;-1:-1:-1;44629:33:0;::::1;;;::::0;-1:-1:-1;44649:12:0;;44629:33:::1;::::0;;;44649:12;44629:10;:33;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;-1:-1:-1::0;;;;;;;;;;;44707:9:0::1;-1:-1:-1::0;;;;;;;;;;;44759:10:0::1;44784:15;44814:12;44680:157;;;;;;;;;;;;;;;;;;;43129:1716:::0;;;;;;;;;;:::o;34153:119::-;10190:7;;;;;-1:-1:-1;;;;;10190:7:0;10176:10;:21;10168:43;;;;-1:-1:-1;;;10168:43:0;;;;;;;;;-1:-1:-1;;;;;34229:27:0::1;34259:5;34229:27:::0;;;:13:::1;:27;::::0;;;;:35;;-1:-1:-1;;34229:35:0::1;::::0;;34153:119::o;50729:2075::-;51114:20;51095:8;33492:15;33480:8;:27;;33472:62;;;;-1:-1:-1;;;33472:62:0;;;;;;;;;51173:1:::1;51155:8;:15;:19;51147:58;;;;-1:-1:-1::0;;;51147:58:0::1;;;;;;;;;51243:11;:18;51224:8;:15;:37;51216:87;;;;-1:-1:-1::0;;;51216:87:0::1;;;;;;;;;51358:1;51341:7;:14;:18;51322:8;:15;:37;51314:87;;;;-1:-1:-1::0;;;51314:87:0::1;;;;;;;;;51438:1;51420:15;:19;51412:65;;;;-1:-1:-1::0;;;51412:65:0::1;;;;;;;;;51511:9:::0;51550:7;51595:15;51490:18:::1;51662:47;-1:-1:-1::0;;;;;51662:35:0;::::1;51698:10;51662:47;:35;:47;:::i;:::-;51631:78;;51730:91;51739:10;51751:7;51759:1;51751:10;;;;;;;;;;;;;;51763;51775:16;-1:-1:-1::0;;;;;;;;;;;;;;;;51793:27:0::1;:10;-1:-1:-1::0;;;;;51793:27:0::1;;51730:8;:91::i;:::-;51839:9;51834:355;51858:8;:15;51854:1;:19;51834:355;;;51912:1;51899:14:::0;::::1;51895:240;;51952:11;51964:1;51952:14;;;;;;;;;;;;;;-1:-1:-1::0;;;;;51939:37:0::1;;51977:7;51985:1;51989;51985:5;51977:14;;;;;;;;;;;;;;51992:8;52001:1;51992:11;;;;;;;;;;;;;;51939:69;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;51895:240;;;52062:11;52074:1;52062:14;;;;;;;;;;;;;;-1:-1:-1::0;;;;;52049:38:0::1;;52088:7;52096:1;52100;52096:5;52088:14;;;;;;;;;;;;;;52103:8;52112:1;52103:11;;;;;;;;;;;;;;52049:70;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;51895:240;52176:1;52162:15:::0;;::::1;::::0;51875:3:::1;51834:355;;;-1:-1:-1::0;;;;;;52204:25:0;::::1;-1:-1:-1::0;;;;;;;;;;;52204:25:0::1;52201:325;;;52261:38;::::0;-1:-1:-1;;;52261:38:0;;-1:-1:-1;;;;;52267:6:0::1;52261:23;::::0;::::1;::::0;:38:::1;::::0;52293:4:::1;::::0;52261:38:::1;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52314:36;::::0;-1:-1:-1;;;52314:36:0;;52246:53;;-1:-1:-1;;;;;;52320:6:0::1;52314:22;::::0;::::1;::::0;:36:::1;::::0;52246:53;;52314:36:::1;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;52365:33:0::1;::::0;:10:::1;::::0;-1:-1:-1;52365:33:0;::::1;;;::::0;-1:-1:-1;52385:12:0;;52365:33:::1;::::0;;;52385:12;52365:10;:33;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;52201:325;;;52445:69;52493:20:::0;52445:43:::1;-1:-1:-1::0;;;;;52445:31:0;::::1;52477:10;52445:43;:31;:43;:::i;:::-;:47:::0;:69:::1;:47;:69;:::i;:::-;52430:84;;52201:325;52562:15;52546:12;:31;;52538:86;;;;-1:-1:-1::0;;;52538:86:0::1;;;;;;;;;-1:-1:-1::0;;;;;;;;;;;52669:10:0::1;52694:8;52717:10;52742:16;52773:12;52642:154;;;;;;;;;;;;;;;;;;;33545:1;;;;50729:2075:::0;;;;;;;;;;;;;:::o;10591:228::-;10657:11;;-1:-1:-1;;;;;10657:11:0;10643:10;:25;10635:51;;;;-1:-1:-1;;;10635:51:0;;;;;;;;;10732:11;;;10723:7;;10702:42;;-1:-1:-1;;;;;10732:11:0;;;;;10723:7;;;;;;;10702:42;;;10765:11;;;;10755:21;;-1:-1:-1;;;;;;10755:21:0;10765:11;-1:-1:-1;;;;;10765:11:0;;10755:21;;;;-1:-1:-1;;;;;;10787:24:0;;;10591:228::o;41429:1692::-;41737:20;41709:8;33492:15;33480:8;:27;;33472:62;;;;-1:-1:-1;;;33472:62:0;;;;;;;;;41802:1:::1;41783:9;:16;:20;41775:59;;;;-1:-1:-1::0;;;41775:59:0::1;;;;;;;;;41871:1;41853:15;:19;41845:65;;;;-1:-1:-1::0;;;41845:65:0::1;;;;;;;;;41962:37;::::0;-1:-1:-1;;;41962:37:0;;41931:28:::1;::::0;-1:-1:-1;;;;;41962:25:0;::::1;::::0;::::1;::::0;:37:::1;::::0;41988:10:::1;::::0;41962:37:::1;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41931:68;;42016:6;-1:-1:-1::0;;;;;42010:21:0::1;;42039:9;42010:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;42068:6;-1:-1:-1::0;;;;;42062:22:0::1;;42085:9;42095:1;42085:12;;;;;;;;;;;;;;42099:9;42062:47;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;42127:9:0::1;42122:637;42146:9;:16;42142:1;:20;42122:637;;;42212:1;42193:9;:16;:20;42188:1;:25;42184:521;;;42251:1;42238:14:::0;::::1;42234:202;;42290:9;42300:1;42290:12;;;;;;;;;;;;;;-1:-1:-1::0;;;;;42282:30:0::1;;42313:10;42282:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42234:202;;;42381:9;42391:1;42381:12;;;;;;;;;;;;;;-1:-1:-1::0;;;;;42373:31:0::1;;42405:10;42373:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42234:202;42184:521;;;42493:1;42480:14:::0;::::1;42476:214;;42532:9;42542:1;42532:12;;;;;;;;;;;;;;-1:-1:-1::0;;;;;42524:30:0::1;;42555:9;42565:1;42569;42565:5;42555:16;;;;;;;;;;;;;;42524:48;;;;;;;;;;;;;;;;42476:214;42629:9;42639:1;42629:12;;;;;;;;;;;;;;-1:-1:-1::0;;;;;42621:31:0::1;;42653:9;42663:1;42667;42663:5;42653:16;;;;;;;;;;;;;;42621:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42476:214;42746:1;42732:15:::0;;::::1;::::0;42164:3:::1;42122:637;;;;42786:63;42828:20;42793:7;-1:-1:-1::0;;;;;42786:25:0::1;;42812:10;42786:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:63;42771:78;;42884:15;42868:12;:31;;42860:86;;;;-1:-1:-1::0;;;42860:86:0::1;;;;;;;;;-1:-1:-1::0;;;;;;;;;;;;;;;;;;;;;;43019:7:0::1;43041:10;43066:9;43090:12;42964:149;;;;;;;;;;;;;;;;;;;33545:1;41429:1692:::0;;;;;;;;;:::o;46597:1736::-;46992:20;46964:8;33492:15;33480:8;:27;;33472:62;;;;-1:-1:-1;;;33472:62:0;;;;;;;;;47056:1:::1;47038:15;:19;47030:65;;;;-1:-1:-1::0;;;47030:65:0::1;;;;;;;;;47116:28;47147:46;-1:-1:-1::0;;;;;47147:34:0;::::1;47182:10;47147:46;:34;:46;:::i;:::-;47116:77:::0;-1:-1:-1;;;;;;47208:26:0;::::1;-1:-1:-1::0;;;;;;;;;;;47208:26:0::1;47204:332;;47251:189;::::0;-1:-1:-1;;;47251:189:0;;-1:-1:-1;;;;;47269:20:0::1;47251:51;::::0;::::1;::::0;:189:::1;::::0;47321:9;;47349:10:::1;::::0;47386:4:::1;::::0;47410:15;;47251:189:::1;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;47455:69:0::1;::::0;-1:-1:-1;;;;;;;;47455:37:0;::::1;47493:13:::0;47508:15;47455:37:::1;:69::i;:::-;-1:-1:-1::0;;;;;47556:25:0;::::1;;::::0;;;:13:::1;:25;::::0;;;;;::::1;;47548:75;;;;-1:-1:-1::0;;;47548:75:0::1;;;;;;;;;47635:12;-1:-1:-1::0;;;;;47653:15:0;;::::1;::::0;47676:26;::::1;-1:-1:-1::0;;;;;;;;;;;47676:26:0::1;:42;;47717:1;47676:42;;;47705:9;47676:42;47720:14;47653:82;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47634:101;;;47756:7;47748:65;;;;-1:-1:-1::0;;;47748:65:0::1;;;;;;;;;47826:133;47874:10;47899:49;-1:-1:-1::0;;;;;47899:34:0;::::1;47942:4;47899:49;:34;:49;:::i;:::-;-1:-1:-1::0;;;;;47826:33:0;::::1;::::0;:133;::::1;:33;:133;:::i;:::-;47987:72;48038:20:::0;47987:46:::1;-1:-1:-1::0;;;;;47987:34:0;::::1;48022:10;47987:46;:34;:46;:::i;:72::-;47972:87;;48094:15;48078:12;:31;;48070:86;;;;-1:-1:-1::0;;;48070:86:0::1;;;;;;;;;-1:-1:-1::0;;;;;;;;;;;48201:9:0::1;48225:7;48247:10;48272:15;48302:12;48174:151;;;;;;;;;;;;;;;;;;;33545:1;;46597:1736:::0;;;;;;;;;;;;:::o;35887:1465::-;36311:14;32052:9;;36311:14;;;;32052:9;;32051:10;32043:32;;;;-1:-1:-1;;;32043:32:0;;;;;;;;;32086:9;:16;;-1:-1:-1;;32086:16:0;32098:4;32086:16;;;36269:8;33492:15:::1;33480:27:::0;::::1;;33472:62;;;;-1:-1:-1::0;;;33472:62:0::1;;;;;;;;;36455:10:::0;36524:101:::2;36455:10:::0;36574:12;36601:13;36524:16:::2;:101::i;:::-;36476:149:::0;;-1:-1:-1;36476:149:0;-1:-1:-1;36658:37:0;;::::2;::::0;::::2;::::0;:80:::2;;;36724:14;36699:21;:39;;36658:80;36636:173;;;;-1:-1:-1::0;;;36636:173:0::2;;;;;;;;;36822:89;36831:10;36843:4;36857;-1:-1:-1::0;;;;;36849:26:0::2;;:28;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36879:20;36901:4;:9;;36909:1;36901:9;36822:8;:89::i;:::-;36922:91;36931:10;36943:4;36957;-1:-1:-1::0;;;;;36949:27:0::2;;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36980:21;37003:4;:9;;37011:1;37003:9;36922:8;:91::i;:::-;37049:35;::::0;-1:-1:-1;;;37049:35:0;;-1:-1:-1;;;;;37049:23:0;::::2;::::0;::::2;::::0;:35:::2;::::0;37073:10:::2;::::0;37049:35:::2;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;37034:50:0;;-1:-1:-1;;37135:1:0::2;37127:9;::::0;::::2;;:45:::0;::::2;;;;37152:20;37140:9;:32;37127:45;37123:104;;;37174:53;::::0;:10:::2;::::0;37194:9:::2;:32:::0;;::::2;37174:53:::0;::::2;;;::::0;::::2;::::0;;;37194:32;37174:10;:53;::::2;;;;;;;;;;;;;::::0;::::2;;;;;;37123:104;37242:4;:9;;37250:1;37242:9;:46;;;;;37267:21;37255:9;:33;37242:46;37238:106;;;37290:54;::::0;:10:::2;::::0;37310:9:::2;:33:::0;;::::2;37290:54:::0;::::2;;;::::0;::::2;::::0;;;37310:33;37290:10;:54;::::2;;;;;;;;;;;;;::::0;::::2;;;;;;37238:106;-1:-1:-1::0;;32137:5:0;32125:17;;-1:-1:-1;;32125:17:0;;;35887:1465;;;;-1:-1:-1;35887:1465:0;;-1:-1:-1;35887:1465:0;-1:-1:-1;;;;;35887:1465:0:o;33014:38::-;;;:::o;33104:46::-;;;;;;;;;;;;;;;:::o;9681:26::-;;;-1:-1:-1;;;;;9681:26:0;;:::o;34355:1524::-;34766:25;32052:9;;34766:25;;32052:9;;32051:10;32043:32;;;;-1:-1:-1;;;32043:32:0;;;;;;;;;32086:9;:16;;-1:-1:-1;;32086:16:0;32098:4;32086:16;;;34738:8;33492:15:::1;33480:27:::0;::::1;;33472:62;;;;-1:-1:-1::0;;;33472:62:0::1;;;;;;;;;34840:18:::2;-1:-1:-1::0;;;;;34861:26:0;::::2;-1:-1:-1::0;;;;;;;;;;;34861:26:0::2;:47;;34899:9;34861:47;;;34890:6;34861:47;34840:68:::0;-1:-1:-1;34923:19:0::2;-1:-1:-1::0;;;;;34945:27:0;::::2;-1:-1:-1::0;;;;;;;;;;;34945:27:0::2;:49;;34984:10;34945:49;;;34975:6;34945:49;35029:218;::::0;-1:-1:-1;;;35029:218:0;;34923:71;;-1:-1:-1;;;;;;35037:13:0::2;35029:47;::::0;::::2;::::0;:218:::2;::::0;35095:10;;34923:71;;35154:9;;35182:1;;35202;;35222:10;;35029:218:::2;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35009:238:::0;-1:-1:-1;35307:9:0;;-1:-1:-1;35353:10:0;;-1:-1:-1;35378:194:0::2;35405:10;35009:238:::0;35307:9;35499:12;-1:-1:-1;;;;;35530:27:0;::::2;-1:-1:-1::0;;;;;;;;;;;35530:27:0::2;35378:8;:194::i;:::-;35587:197;35614:10;35643:17:::0;35679:11;35709:13;-1:-1:-1;;;;;35741:28:0;::::2;-1:-1:-1::0;;;;;;;;;;;35741:28:0::2;35587:8;:197::i;:::-;-1:-1:-1::0;;35823:48:0::2;::::0;-1:-1:-1;;;35823:48:0;;-1:-1:-1;;;;;35823:36:0;::::2;::::0;::::2;::::0;:48:::2;::::0;35860:10:::2;::::0;35823:48:::2;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;32137:5:0;32125:17;;-1:-1:-1;;32125:17:0;;;34355:1524;;35808:63;;-1:-1:-1;34355:1524:0;;-1:-1:-1;;;;;;;;;;34355:1524:0:o;53260:1214::-;53605:18;32052:9;;53605:18;;32052:9;;32051:10;32043:32;;;;-1:-1:-1;;;32043:32:0;;;;;;;;;32086:9;:16;;-1:-1:-1;;32086:16:0;32098:4;32086:16;;;53587:8;33492:15:::1;33480:27:::0;::::1;;33472:62;;;;-1:-1:-1::0;;;33472:62:0::1;;;;;;;;;53657:18:::2;53686:4;-1:-1:-1::0;;;;;53678:26:0::2;;:28;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53657:49;;53717:19;53747:4;-1:-1:-1::0;;;;;53739:27:0::2;;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53717:51;;53789:70;53798:10;53818:4;53825:10;53837;53849:4;:9;;53857:1;53849:9;53789:8;:70::i;:::-;53870:72;53879:10;53899:4;53906:11;53919;53932:4;:9;;53940:1;53932:9;53870:8;:72::i;:::-;53968:14:::0;;53965:181:::2;;53999:56;-1:-1:-1::0;;;;;53999:38:0;::::2;54038:4:::0;54044:10;53999:56:::2;:38;:56;:::i;:::-;54083:51;::::0;-1:-1:-1;;;54083:51:0;;-1:-1:-1;;;;;54083:27:0;::::2;::::0;::::2;::::0;:51:::2;::::0;54111:10:::2;::::0;54123;;54083:51:::2;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54070:64;;53965:181;54159:15:::0;;54156:187:::2;;54191:58;-1:-1:-1::0;;;;;54191:39:0;::::2;54231:4:::0;54237:11;54191:58:::2;:39;:58;:::i;:::-;54278:53;::::0;-1:-1:-1;;;54278:53:0;;-1:-1:-1;;;;;54278:28:0;::::2;::::0;::::2;::::0;:53:::2;::::0;54307:10:::2;::::0;54319:11;;54278:53:::2;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54264:67;;54156:187;54377:13;54363:10;:27;;:60;;;;;54409:14;54394:11;:29;;54363:60;54355:111;;;;-1:-1:-1::0;;;54355:111:0::2;;;;;;;;;-1:-1:-1::0;;32137:5:0;32125:17;;-1:-1:-1;;32125:17:0;;;-1:-1:-1;53260:1214:0;;;;-1:-1:-1;53260:1214:0;-1:-1:-1;;;;;;53260:1214:0:o;32964:43::-;;;:::o;33059:38::-;;;:::o;52874:376::-;32052:9;;;;32051:10;32043:32;;;;-1:-1:-1;;;32043:32:0;;;;;;;;;32086:9;:16;;-1:-1:-1;;32086:16:0;32098:4;32086:16;;;53085:8;33492:15:::1;33480:27:::0;::::1;;33472:62;;;;-1:-1:-1::0;;;33472:62:0::1;;;;;;;;;53106:91:::2;53115:10;53127:9;53146;-1:-1:-1::0;;;;;53138:32:0::2;;:34;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53174:11;53187:4;:9;;53195:1;53187:9;53106:8;:91::i;:::-;53208:34;::::0;-1:-1:-1;;;53208:34:0;;-1:-1:-1;;;;;53208:22:0;::::2;::::0;::::2;::::0;:34:::2;::::0;53231:10:::2;::::0;53208:34:::2;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;-1:-1:-1::0;;32137:5:0;32125:17;;-1:-1:-1;;32125:17:0;;;-1:-1:-1;;;;;;;52874:376:0:o;34030:115::-;10190:7;;;;;-1:-1:-1;;;;;10190:7:0;10176:10;:21;10168:43;;;;-1:-1:-1;;;10168:43:0;;;;;;;;;-1:-1:-1;;;;;34103:27:0::1;;::::0;;;:13:::1;:27;::::0;;;;:34;;-1:-1:-1;;34103:34:0::1;34133:4;34103:34;::::0;;34030:115::o;32912:45::-;;;:::o;10420:163::-;10190:7;;;;;-1:-1:-1;;;;;10190:7:0;10176:10;:21;10168:43;;;;-1:-1:-1;;;10168:43:0;;;;;;;;;10524:7:::1;::::0;;10498:44:::1;::::0;-1:-1:-1;;;;;10498:44:0;;::::1;::::0;10524:7:::1;::::0;;::::1;;::::0;10498:44:::1;::::0;::::1;10553:11;:22:::0;;-1:-1:-1;;;;;;10553:22:0::1;-1:-1:-1::0;;;;;10553:22:0;;;::::1;::::0;;;::::1;::::0;;10420:163::o;44853:1736::-;45208:20;45180:8;33492:15;33480:8;:27;;33472:62;;;;-1:-1:-1;;;33472:62:0;;;;;;;;;45273:1:::1;45254:9;:16;:20;45246:59;;;;-1:-1:-1::0;;;45246:59:0::1;;;;;;;;;45342:1;45324:15;:19;45316:65;;;;-1:-1:-1::0;;;45316:65:0::1;;;;;;;;;45425:37;::::0;-1:-1:-1;;;45425:37:0;;45394:28:::1;::::0;-1:-1:-1;;;;;45425:25:0;::::1;::::0;::::1;::::0;:37:::1;::::0;45451:10:::1;::::0;45425:37:::1;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45394:68;;45491:20;-1:-1:-1::0;;;;;45473:51:0::1;;45525:9;45536:10;45548:9;45558:1;45548:12;;;;;;;;;;;;;;45562:15;45473:105;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;45596:9:0::1;::::0;-1:-1:-1;;;45591:636:0::1;45615:9;:16;45611:1;:20;45591:636;;;45681:1;45662:9;:16;:20;45657:1;:25;45653:520;;;45720:1;45707:14:::0;::::1;45703:202;;45759:9;45769:1;45759:12;;;;;;;;;;;;;;-1:-1:-1::0;;;;;45751:30:0::1;;45782:10;45751:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45703:202;;;45850:9;45860:1;45850:12;;;;;;;;;;;;;;-1:-1:-1::0;;;;;45842:31:0::1;;45874:10;45842:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45703:202;45653:520;;;45961:1;45949:13:::0;::::1;45945:213;;46000:9;46010:1;46000:12;;;;;;;;;;;;;;-1:-1:-1::0;;;;;45992:30:0::1;;46023:9;46033:1;46037;46033:5;46023:16;;;;;;;;;;;;;;45992:48;;;;;;;;;;;;;;;;45945:213;46097:9;46107:1;46097:12;;;;;;;;;;;;;;-1:-1:-1::0;;;;;46089:31:0::1;;46121:9;46131:1;46135;46131:5;46121:16;;;;;;;;;;;;;;46089:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45945:213;46214:1;46200:15:::0;;::::1;::::0;45633:3:::1;45591:636;;;;46252:63;46294:20;46259:7;-1:-1:-1::0;;;;;46252:25:0::1;;46278:10;46252:37;;;;;;;;;;;;;;;;:63;46237:78;;46350:15;46334:12;:31;;46326:86;;;;-1:-1:-1::0;;;46326:86:0::1;;;;;;;;;-1:-1:-1::0;;;;;;;;;;;46457:9:0::1;46481:7;46503:10;46528:15;46558:12;46430:151;;;;;;;;;;;;;;;;;;;33545:1;44853:1736:::0;;;;;;;;;;;:::o;54488:495::-;54651:5;54647:329;;;54677:10;;54673:183;;54714:6;-1:-1:-1;;;;;54708:21:0;;54737:6;54708:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;54769:19:0;;54783:4;54769:19;;-1:-1:-1;54765:75:0;;54790:50;54820:6;54829:2;54833:6;54790:22;:50::i;:::-;54647:329;;;54888:76;;-1:-1:-1;;;54888:76:0;;-1:-1:-1;;;;;54906:20:0;54888:51;;;;:76;;54940:5;;54947:4;;54953:2;;54957:6;;54888:76;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54647:329;54488:495;;;;;:::o;30747:374::-;30892:34;;-1:-1:-1;;;30892:34:0;;30872:17;;-1:-1:-1;;;;;30892:15:0;;;;;:34;;30916:4;;30923:2;;30892:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30872:54;;30953:6;30941:9;:18;30937:177;;;30980:13;;30976:78;;31014:24;-1:-1:-1;;;;;31014:17:0;;31032:2;31036:1;31014:24;:17;:24;:::i;:::-;31068:34;-1:-1:-1;;;;;31068:17:0;;31086:2;-1:-1:-1;;31068:34:0;:17;:34;:::i;:::-;30747:374;;;;:::o;31365:129::-;31466:20;;-1:-1:-1;;;31466:20:0;;31439:7;;-1:-1:-1;;;;;31466:15:0;;;;;:20;;31482:3;;31466:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31459:27;;31365:129;;;;;:::o;30416:323::-;30551:10;;30547:185;;30582:12;30588:5;30582;:12::i;:::-;30578:143;;;30615:19;;-1:-1:-1;;;;;30615:11:0;;;:19;;;;;30627:6;;30615:19;;;;30627:6;30615:11;:19;;;;;;;;;;;;;;;;;;;;;30578:143;;;30675:30;-1:-1:-1;;;;;30675:18:0;;30694:2;30698:6;30675:30;:18;:30;:::i;:::-;30416:323;;;:::o;54991:440::-;55140:5;55136:288;;;55166:10;;55162:119;;55197:30;;-1:-1:-1;;;55197:30:0;;-1:-1:-1;;;;;55203:6:0;55197:22;;;;:30;;55220:6;;55197:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;55246:19:0;;-1:-1:-1;;;;;55246:11:0;;;-1:-1:-1;55246:19:0;;;;;-1:-1:-1;55258:6:0;;55246:19;;;;55258:6;55246:11;:19;;;;;;;;;;;;;;;;;;;;;55162:119;55136:288;;;55317:10;;55313:100;;55348:49;55378:5;55386:2;55390:6;55348:22;:49::i;31129:228::-;31207:7;31231:12;31237:5;31231;:12::i;:::-;31227:123;;;-1:-1:-1;;;;;;31267:11:0;;;31260:18;;31227:123;31318:20;;-1:-1:-1;;;31318:20:0;;-1:-1:-1;;;;;31318:15:0;;;;;:20;;31334:3;;31318:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31311:27;;;;14074:137;14132:7;14165:1;14160;:6;;14152:28;;;;-1:-1:-1;;;14152:28:0;;;;;;;;;-1:-1:-1;14198:5:0;;;14074:137::o;37360:1276::-;37508:28;37538:29;37581:19;37602:20;37634:10;-1:-1:-1;;;;;37626:35:0;;:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37580:83;;;;37678:12;37694:1;37678:17;:37;;;;-1:-1:-1;37699:16:0;;37678:37;37674:157;;;37755:12;37732:35;;37806:13;37782:37;;37674:157;37845:17;;:36;;;;;37880:1;37866:11;:15;37845:36;37841:144;;;37921:12;37898:35;;37972:1;37948:25;;37841:144;38014:1;37999:12;:16;:35;;;;;38033:1;38019:11;:15;37999:35;37995:634;;;38051:25;38079:47;38100:12;38114:11;38079:20;:47::i;:::-;38051:75;;38141:26;38170:49;38191:13;38206:12;38170:20;:49::i;:::-;38141:78;;38259:18;38238:17;:39;38234:384;;38321:12;38298:35;;38376:53;38397:12;38411:17;38376:20;:53::i;:::-;38352:77;;38234:384;;;38494:13;38470:37;;38549:53;38570:11;38583:18;38549:20;:53::i;:::-;38526:76;;38234:384;37995:634;;;37360:1276;;;;;;;;:::o;27537:211::-;27654:86;27674:5;27704:23;;;27729:2;27733:5;27681:58;;;;;;;;;;;;;;-1:-1:-1;;27681:58:0;;;;;;;;;;;;;;-1:-1:-1;;;;;27681:58:0;-1:-1:-1;;;;;;27681:58:0;;;;;;;;;;27654:19;:86::i;28049:670::-;28467:10;;;28466:62;;-1:-1:-1;28483:39:0;;-1:-1:-1;;;28483:39:0;;-1:-1:-1;;;;;28483:15:0;;;;;:39;;28507:4;;28514:7;;28483:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:44;28466:62;28444:166;;;;-1:-1:-1;;;28444:166:0;;;;;;;;;28621:90;28641:5;28671:22;;;28695:7;28704:5;28648:62;;;;;;;;;;31502:104;-1:-1:-1;;;;;31578:20:0;;-1:-1:-1;;;;;;;;;;;31578:20:0;31502:104;;;:::o;15197:128::-;15265:7;15292:25;15315:1;15292:18;:6;15303;15292:18;:10;:18;:::i;:::-;:22;:25;:22;:25;:::i;14923:127::-;14991:7;15035:6;15018:13;:6;15029:1;15018:13;:10;:13;:::i;:::-;:24;;;;;;;14923:127;-1:-1:-1;;;14923:127:0:o;29110:1046::-;29770:12;29784:23;29819:5;-1:-1:-1;;;;;29811:19:0;29831:4;29811:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29769:67;;;;29855:7;29847:52;;;;-1:-1:-1;;;29847:52:0;;;;;;;;;29916:17;;:21;29912:237;;30071:10;30060:30;;;;;;;;;;;;;;30052:85;;;;-1:-1:-1;;;30052:85:0;;;;;;;;13395:226;13453:7;13477:6;13473:47;;-1:-1:-1;13507:1:0;13500:8;;13473:47;13544:5;;;13548:1;13544;:5;:1;13568:5;;;;;:10;13560:32;;;;-1:-1:-1;;;13560:32:0;;;;;;;;13629:141;13687:7;13719:1;13715;:5;13707:32;;;;-1:-1:-1;;;13707:32:0;;;;;;;;;13761:1;13757;:5;;;;5:130:-1;72:20;;97:33;72:20;97:33;;301:707;;418:3;411:4;403:6;399:17;395:27;385:2;;-1:-1;;426:12;385:2;473:6;460:20;495:80;510:64;567:6;510:64;;;495:80;;;603:21;;;486:89;-1:-1;647:4;660:14;;;;635:17;;;749;;;740:27;;;;737:36;-1:-1;734:2;;;786:1;;776:12;734:2;811:1;796:206;821:6;818:1;815:13;796:206;;;85:6;72:20;97:33;124:5;97:33;;;889:50;;953:14;;;;981;;;;843:1;836:9;796:206;;;800:14;;;;;378:630;;;;;1034:707;;1151:3;1144:4;1136:6;1132:17;1128:27;1118:2;;-1:-1;;1159:12;1118:2;1206:6;1193:20;1228:80;1243:64;1300:6;1243:64;;1228:80;1336:21;;;1219:89;-1:-1;1380:4;1393:14;;;;1368:17;;;1482;;;1473:27;;;;1470:36;-1:-1;1467:2;;;1519:1;;1509:12;1467:2;1544:1;1529:206;1554:6;1551:1;1548:13;1529:206;;;2531:20;;1622:50;;1686:14;;;;1714;;;;1576:1;1569:9;1529:206;;1749:124;1813:20;;1838:30;1813:20;1838:30;;2742:126;2807:20;;45660:4;45649:16;;47033:33;;47023:2;;47080:1;;47070:12;2875:241;;2979:2;2967:9;2958:7;2954:23;2950:32;2947:2;;;-1:-1;;2985:12;2947:2;85:6;72:20;97:33;124:5;97:33;;3123:263;;3238:2;3226:9;3217:7;3213:23;3209:32;3206:2;;;-1:-1;;3244:12;3206:2;226:6;220:13;238:33;265:5;238:33;;3393:1345;;;;;;;;;;3639:3;3627:9;3618:7;3614:23;3610:33;3607:2;;;-1:-1;;3646:12;3607:2;85:6;72:20;97:33;124:5;97:33;;;3698:63;-1:-1;3798:2;3837:22;;;72:20;97:33;72:20;97:33;;;3806:63;-1:-1;3906:2;3945:22;;72:20;97:33;72:20;97:33;;;3914:63;-1:-1;4014:2;4053:22;;72:20;97:33;72:20;97:33;;;4022:63;-1:-1;4122:3;4162:22;;2531:20;;-1:-1;4231:3;4271:22;;2531:20;;-1:-1;4368:3;4353:19;;4340:33;4393:18;4382:30;;;4379:2;;;-1:-1;;4415:12;4379:2;4490:6;4479:9;4475:22;2117:3;2110:4;2102:6;2098:17;2094:27;2084:2;;-1:-1;;2125:12;2084:2;2172:6;2159:20;2145:34;;4393:18;44375:6;44372:30;44369:2;;;-1:-1;;44405:12;44369:2;2194:64;44478:9;44459:17;;-1:-1;;44455:33;44536:15;;2194:64;;;2185:73;;2278:6;2271:5;2264:21;2382:3;3798:2;2373:6;2306;2364:16;;2361:25;2358:2;;;-1:-1;;2389:12;2358:2;46261:6;3798:2;2306:6;2302:17;3798:2;2340:5;2336:16;46238:30;-1:-1;46299:16;;;;;;46292:27;;;;4563:50;4605:7;4544:3;4581:22;;4563:50;;;4553:60;;4650:3;4694:9;4690:22;2531:20;4659:63;;3601:1137;;;;;;;;;;;;4745:1775;;;;;;;;;;;5074:3;5062:9;5053:7;5049:23;5045:33;5042:2;;;-1:-1;;5081:12;5042:2;5143:53;5188:7;5164:22;5143:53;;;5133:63;;5251:53;5296:7;5233:2;5276:9;5272:22;5251:53;;;5241:63;;5341:2;5384:9;5380:22;2531:20;5349:63;;5449:2;5492:9;5488:22;2531:20;5457:63;;5585:3;5574:9;5570:19;5557:33;5610:18;;5602:6;5599:30;5596:2;;;-1:-1;;5632:12;5596:2;5662:78;5732:7;5723:6;5712:9;5708:22;5662:78;;;5652:88;;5805:3;5794:9;5790:19;5777:33;5763:47;;5610:18;5822:6;5819:30;5816:2;;;-1:-1;;5852:12;5816:2;5882:78;5952:7;5943:6;5932:9;5928:22;5882:78;;;5872:88;;6025:3;6014:9;6010:19;5997:33;5983:47;;5610:18;6042:6;6039:30;6036:2;;;-1:-1;;6072:12;6036:2;;6102:78;6172:7;6163:6;6152:9;6148:22;6102:78;;;6092:88;;;6217:3;6261:9;6257:22;2531:20;6226:63;;6345:50;6387:7;6326:3;6367:9;6363:22;6345:50;;;6335:60;;6432:3;6476:9;6472:22;2531:20;6441:63;;5036:1484;;;;;;;;;;;;;;6527:1251;;;;;;;;;6772:3;6760:9;6751:7;6747:23;6743:33;6740:2;;;-1:-1;;6779:12;6740:2;85:6;72:20;97:33;124:5;97:33;;;6831:63;-1:-1;6931:2;6970:22;;72:20;97:33;72:20;97:33;;;6939:63;-1:-1;7039:2;7078:22;;2531:20;;-1:-1;7147:2;7186:22;;2531:20;;-1:-1;7283:3;7268:19;;7255:33;7308:18;7297:30;;7294:2;;;-1:-1;;7330:12;7294:2;7360:78;7430:7;7421:6;7410:9;7406:22;7360:78;;;7350:88;;;7475:3;7519:9;7515:22;2531:20;7484:63;;7584:3;7625:9;7621:22;1813:20;1838:30;1862:5;1838:30;;;7593:60;;;;7690:3;7734:9;7730:22;2531:20;7699:63;;6734:1044;;;;;;;;;;;;7785:1241;;;;;;;;;;8022:3;8010:9;8001:7;7997:23;7993:33;7990:2;;;-1:-1;;8029:12;7990:2;85:6;72:20;97:33;124:5;97:33;;;8081:63;-1:-1;8181:2;8220:22;;72:20;97:33;72:20;97:33;;;8189:63;-1:-1;8289:2;8328:22;;2531:20;;-1:-1;8397:2;8436:22;;2531:20;;-1:-1;8505:3;8545:22;;2531:20;;-1:-1;8614:3;8654:22;;2531:20;;-1:-1;8723:3;8763:22;;2531:20;;-1:-1;8832:3;8869:22;;1813:20;1838:30;1813:20;1838:30;;;8841:60;;;;8938:3;8982:9;8978:22;2531:20;8947:63;;7984:1042;;;;;;;;;;;;9033:1263;;;;;;;;9287:3;9275:9;9266:7;9262:23;9258:33;9255:2;;;-1:-1;;9294:12;9255:2;85:6;72:20;97:33;124:5;97:33;;;9346:63;-1:-1;9474:2;9459:18;;9446:32;9498:18;9487:30;;;9484:2;;;-1:-1;;9520:12;9484:2;9550:78;9620:7;9611:6;9600:9;9596:22;9550:78;;;9540:88;;9693:2;9682:9;9678:18;9665:32;9651:46;;9498:18;9709:6;9706:30;9703:2;;;-1:-1;;9739:12;9703:2;;9769:78;9839:7;9830:6;9819:9;9815:22;9769:78;;;9759:88;;;9902:51;9945:7;9884:2;9925:9;9921:22;9902:51;;;9249:1047;;;;-1:-1;9249:1047;;9990:3;10030:22;;2531:20;;10099:3;10139:22;;2531:20;;-1:-1;10208:3;10248:22;;;2531:20;;-1:-1;9249:1047;-1:-1;;9249:1047;10303:999;;;;;;;10514:3;10502:9;10493:7;10489:23;10485:33;10482:2;;;-1:-1;;10521:12;10482:2;85:6;72:20;97:33;124:5;97:33;;;10573:63;-1:-1;10673:2;10712:22;;2531:20;;-1:-1;10809:2;10794:18;;10781:32;10833:18;10822:30;;10819:2;;;-1:-1;;10855:12;10819:2;10885:78;10955:7;10946:6;10935:9;10931:22;10885:78;;;10875:88;;;11000:2;11043:9;11039:22;2531:20;11008:63;;11108:3;11149:9;11145:22;1813:20;1838:30;1862:5;1838:30;;;11117:60;;;;11214:3;11258:9;11254:22;2531:20;11223:63;;10476:826;;;;;;;;;11309:1125;;;;;;;;11537:3;11525:9;11516:7;11512:23;11508:33;11505:2;;;-1:-1;;11544:12;11505:2;85:6;72:20;97:33;124:5;97:33;;;11596:63;-1:-1;11696:2;11735:22;;2531:20;;-1:-1;11804:2;11843:22;;2531:20;;-1:-1;11940:2;11925:18;;11912:32;11964:18;11953:30;;11950:2;;;-1:-1;;11986:12;11950:2;12016:78;12086:7;12077:6;12066:9;12062:22;12016:78;;;12006:88;;;12131:3;12175:9;12171:22;2531:20;12140:63;;12240:3;12281:9;12277:22;1813:20;1838:30;1862:5;1838:30;;;12249:60;;;;12346:3;12390:9;12386:22;2531:20;12355:63;;11499:935;;;;;;;;;;;12441:991;;;;;;;;12645:3;12633:9;12624:7;12620:23;12616:33;12613:2;;;-1:-1;;12652:12;12613:2;85:6;72:20;97:33;124:5;97:33;;;12704:63;-1:-1;12804:2;12843:22;;2531:20;;-1:-1;12912:2;12951:22;;2531:20;;-1:-1;13020:2;13059:22;;2531:20;;-1:-1;13128:3;13168:22;;2531:20;;-1:-1;13256:51;13299:7;13237:3;13275:22;;13256:51;;;13246:61;;13344:3;13388:9;13384:22;2531:20;13353:63;;12607:825;;;;;;;;;;;13439:613;;;;;13592:3;13580:9;13571:7;13567:23;13563:33;13560:2;;;-1:-1;;13599:12;13560:2;85:6;72:20;97:33;124:5;97:33;;;13651:63;-1:-1;13751:2;13790:22;;2531:20;;-1:-1;13859:2;13896:22;;2807:20;45660:4;45649:16;;47033:33;;47023:2;;-1:-1;;47070:12;47023:2;13554:498;;;;-1:-1;13867:61;;13965:2;14004:22;2531:20;;-1:-1;;13554:498;14059:257;;14171:2;14159:9;14150:7;14146:23;14142:32;14139:2;;;-1:-1;;14177:12;14139:2;1961:6;1955:13;1973:30;1997:5;1973:30;;14323:263;;14438:2;14426:9;14417:7;14413:23;14409:32;14406:2;;;-1:-1;;14444:12;14406:2;-1:-1;2679:13;;14400:186;-1:-1;14400:186;14593:399;;;14725:2;14713:9;14704:7;14700:23;14696:32;14693:2;;;-1:-1;;14731:12;14693:2;-1:-1;;2679:13;;14894:2;14944:22;;;2679:13;;;;;-1:-1;14687:305;14999:535;;;;15148:2;15136:9;15127:7;15123:23;15119:32;15116:2;;;-1:-1;;15154:12;15116:2;2685:6;2679:13;15206:74;;15317:2;15371:9;15367:22;2679:13;15325:74;;15436:2;15490:9;15486:22;2679:13;15444:74;;15110:424;;;;;;24257:271;;16081:5;44655:12;-1:-1;46406:101;46420:6;46417:1;46414:13;46406:101;;;16225:4;46487:11;;;;;46481:18;46468:11;;;46461:39;46435:10;46406:101;;;46522:6;46519:1;46516:13;46513:2;;;-1:-1;46578:6;46573:3;46569:16;46562:27;46513:2;-1:-1;16256:16;;;;;24391:137;-1:-1;;24391:137;24535:222;-1:-1;;;;;45444:54;;;;15761:37;;24662:2;24647:18;;24633:124;25009:349;-1:-1;;;;;45444:54;;;;15620:58;;25344:2;25329:18;;24208:37;25172:2;25157:18;;25143:215;25365:1020;-1:-1;;;;;45444:54;;;;15620:58;;25869:2;25854:18;;24208:37;;;;25952:2;25937:18;;24208:37;;;;26035:2;26020:18;;24208:37;;;;26118:3;26103:19;;24208:37;45455:42;26187:19;;24208:37;26286:3;26271:19;;24208:37;26370:3;26355:19;;24208:37;25696:3;25681:19;;25667:718;26392:333;-1:-1;;;;;45444:54;;;15761:37;;45444:54;;26711:2;26696:18;;15761:37;26547:2;26532:18;;26518:207;26732:588;-1:-1;;;;;45444:54;;;15761:37;;45444:54;;;27132:2;27117:18;;15620:58;45444:54;;27223:2;27208:18;;15620:58;27306:2;27291:18;;24208:37;;;;26959:3;26944:19;;26930:390;27327:1008;-1:-1;;;;;45444:54;;;15761:37;;45444:54;;;27825:2;27810:18;;15620:58;45444:54;;;27908:2;27893:18;;15761:37;45444:54;;;;27991:2;27976:18;;15761:37;28074:3;28059:19;;24208:37;45455:42;28143:19;;24208:37;;;;28242:3;28227:19;;24208:37;;;;45356:13;;45349:21;28320:3;28305:19;;15875:34;27652:3;27637:19;;27623:712;28921:684;-1:-1;;;;;45444:54;;;15761:37;;45444:54;;;29333:2;29318:18;;15761:37;45444:54;;;;29424:2;29409:18;;15620:58;29507:2;29492:18;;24208:37;;;;29590:3;29575:19;;24208:37;;;;29168:3;29153:19;;29139:466;30175:636;-1:-1;;;;;45444:54;;;15761:37;;45444:54;;30594:2;30579:18;;15761:37;30430:2;30631;30616:18;;30609:48;;;30175:636;30415:18;;;44799:19;44839:14;;;30401:410;30818:768;-1:-1;;;;;45444:54;;;15761:37;;45444:54;;;;31244:2;31229:18;;15761:37;31327:2;31312:18;;24208:37;;;;31410:2;31395:18;;24208:37;31493:3;31478:19;;24208:37;45356:13;;45349:21;45455:42;31556:19;;15875:34;31079:3;31064:19;;31050:536;31933:210;45356:13;;45349:21;15875:34;;32054:2;32039:18;;32025:118;32150:416;32350:2;32364:47;;;16658:2;32335:18;;;44799:19;16694:28;44839:14;;;16674:49;16742:12;;;32321:245;32573:416;32773:2;32787:47;;;16993:2;32758:18;;;44799:19;17029:34;44839:14;;;17009:55;-1:-1;;;17084:12;;;17077:25;17121:12;;;32744:245;32996:416;33196:2;33210:47;;;17372:2;33181:18;;;44799:19;-1:-1;;;44839:14;;;17388:36;17443:12;;;33167:245;33419:416;33619:2;33633:47;;;17694:2;33604:18;;;44799:19;17730:34;44839:14;;;17710:55;-1:-1;;;17785:12;;;17778:29;17826:12;;;33590:245;33842:416;34042:2;34056:47;;;18077:2;34027:18;;;44799:19;-1:-1;;;44839:14;;;18093:35;18147:12;;;34013:245;34265:416;34465:2;34479:47;;;18398:1;34450:18;;;44799:19;-1:-1;;;44839:14;;;18413:32;18464:12;;;34436:245;34688:416;34888:2;34902:47;;;34873:18;;;44799:19;18751:34;44839:14;;;18731:55;18805:12;;;34859:245;35111:416;35311:2;35325:47;;;19056:2;35296:18;;;44799:19;19092:34;44839:14;;;19072:55;-1:-1;;;19147:12;;;19140:34;19193:12;;;35282:245;35534:416;35734:2;35748:47;;;19444:2;35719:18;;;44799:19;19480:34;44839:14;;;19460:55;-1:-1;;;19535:12;;;19528:31;19578:12;;;35705:245;35957:416;36157:2;36171:47;;;19829:2;36142:18;;;44799:19;-1:-1;;;44839:14;;;19845:37;19901:12;;;36128:245;36380:416;36580:2;36594:47;;;20152:2;36565:18;;;44799:19;20188:34;44839:14;;;20168:55;-1:-1;;;20243:12;;;20236:35;20290:12;;;36551:245;36803:416;37003:2;37017:47;;;20541:2;36988:18;;;44799:19;-1:-1;;;44839:14;;;20557:45;20621:12;;;36974:245;37226:416;37426:2;37440:47;;;20872:1;37411:18;;;44799:19;-1:-1;;;44839:14;;;20887:32;20938:12;;;37397:245;37649:416;37849:2;37863:47;;;21189:2;37834:18;;;44799:19;-1:-1;;;44839:14;;;21205:39;21263:12;;;37820:245;38072:416;38272:2;38286:47;;;21514:2;38257:18;;;44799:19;21550:34;44839:14;;;21530:55;-1:-1;;;21605:12;;;21598:29;21646:12;;;38243:245;38495:416;38695:2;38709:47;;;22166:2;38680:18;;;44799:19;22202:34;44839:14;;;22182:55;-1:-1;;;22257:12;;;22250:37;22306:12;;;38666:245;38918:416;39118:2;39132:47;;;22557:1;39103:18;;;44799:19;-1:-1;;;44839:14;;;22572:32;22623:12;;;39089:245;39341:416;39541:2;39555:47;;;22874:2;39526:18;;;44799:19;22910:34;44839:14;;;22890:55;-1:-1;;;22965:12;;;22958:34;23011:12;;;39512:245;39764:416;39964:2;39978:47;;;23262:2;39949:18;;;44799:19;23298:34;44839:14;;;23278:55;-1:-1;;;23353:12;;;23346:29;23394:12;;;39935:245;40187:416;40387:2;40401:47;;;23645:2;40372:18;;;44799:19;23681:34;44839:14;;;23661:55;-1:-1;;;23736:12;;;23729:46;23794:12;;;40358:245;40610:416;40810:2;40824:47;;;24045:1;40795:18;;;44799:19;-1:-1;;;44839:14;;;24060:32;24111:12;;;40781:245;41033:222;24208:37;;;41160:2;41145:18;;41131:124;41262:652;24208:37;;;41697:2;41682:18;;16363:58;41525:2;41734;41719:18;;41712:48;;;41262:652;41510:18;;;44799:19;44839:14;;;41496:418;41921:333;24208:37;;;42240:2;42225:18;;24208:37;42076:2;42061:18;;42047:207;42904:444;24208:37;;;43251:2;43236:18;;24208:37;;;;43334:2;43319:18;;24208:37;43087:2;43072:18;;43058:290;43355:256;43417:2;43411:9;43443:17;;;43518:18;43503:34;;43539:22;;;43500:62;43497:2;;;43575:1;;43565:12;43497:2;43417;43584:22;43395:216;;-1:-1;43395:216;43618:304;;43777:18;43769:6;43766:30;43763:2;;;-1:-1;;43799:12;43763:2;-1:-1;43844:4;43832:17;;;43897:15;;43700:222;46610:117;-1:-1;;;;;45444:54;;46669:35;;46659:2;;46718:1;;46708:12;46659:2;46653:74;;46734:111;46815:5;45356:13;45349:21;46793:5;46790:32;46780:2;;46836:1;;46826:12
Swarm Source
ipfs://9e0bc417dca50ea265340423113e471559802cf6f48006fee95bc5b4812dedb8
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 34 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|---|---|---|---|---|
BSC | 100.00% | $1 | 0.5834 | $0.5838 |
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.