Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
Latest 1 from a total of 1 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
0x60806040 | 9562220 | 1716 days ago | IN | 0 ETH | 0.01802913 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
OneSplitView
Compiler Version
v0.5.16+commit.9c3226ce
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2020-02-26 */ // File: @openzeppelin/contracts/token/ERC20/IERC20.sol pragma solidity ^0.5.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. Does not include * the optional functions; to access them see {ERC20Detailed}. */ interface IERC20 { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @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); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); } // File: contracts/IOneSplit.sol pragma solidity ^0.5.0; contract IOneSplitView { // disableFlags = FLAG_UNISWAP + FLAG_KYBER + ... uint256 public constant FLAG_UNISWAP = 0x01; uint256 public constant FLAG_KYBER = 0x02; uint256 public constant FLAG_KYBER_UNISWAP_RESERVE = 0x100000000; // Turned off by default uint256 public constant FLAG_KYBER_OASIS_RESERVE = 0x200000000; // Turned off by default uint256 public constant FLAG_KYBER_BANCOR_RESERVE = 0x400000000; // Turned off by default uint256 public constant FLAG_BANCOR = 0x04; uint256 public constant FLAG_OASIS = 0x08; uint256 public constant FLAG_COMPOUND = 0x10; uint256 public constant FLAG_FULCRUM = 0x20; uint256 public constant FLAG_CHAI = 0x40; uint256 public constant FLAG_AAVE = 0x80; uint256 public constant FLAG_SMART_TOKEN = 0x100; uint256 public constant FLAG_MULTI_PATH_ETH = 0x200; // Turned off by default uint256 public constant FLAG_BDAI = 0x400; uint256 public constant FLAG_IEARN = 0x800; function getExpectedReturn( IERC20 fromToken, IERC20 toToken, uint256 amount, uint256 parts, uint256 disableFlags // 1 - Uniswap, 2 - Kyber, 4 - Bancor, 8 - Oasis, 16 - Compound, 32 - Fulcrum, 64 - Chai, 128 - Aave, 256 - SmartToken, 1024 - bDAI ) public view returns( uint256 returnAmount, uint256[] memory distribution // [Uniswap, Kyber, Bancor, Oasis] ); } contract IOneSplit is IOneSplitView { function swap( IERC20 fromToken, IERC20 toToken, uint256 amount, uint256 minReturn, uint256[] memory distribution, // [Uniswap, Kyber, Bancor, Oasis] uint256 disableFlags // 16 - Compound, 32 - Fulcrum, 64 - Chai, 128 - Aave, 256 - SmartToken, 1024 - bDAI ) public payable; function goodSwap( IERC20 fromToken, IERC20 toToken, uint256 amount, uint256 minReturn, uint256 parts, uint256 disableFlags // 1 - Uniswap, 2 - Kyber, 4 - Bancor, 8 - Oasis, 16 - Compound, 32 - Fulcrum, 64 - Chai, 128 - Aave, 256 - SmartToken, 1024 - bDAI ) public payable; } // File: @openzeppelin/contracts/math/SafeMath.sol pragma solidity ^0.5.0; /** * @dev Wrappers over Solidity's arithmetic operations with added overflow * checks. * * Arithmetic operations in Solidity wrap on overflow. This can easily result * in bugs, because programmers usually assume that an overflow raises an * error, which is the standard behavior in high level programming languages. * `SafeMath` restores this intuition by reverting the transaction when an * operation overflows. * * Using this library instead of the unchecked operations eliminates an entire * class of bugs, so it's recommended to use it always. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c = a + b; require(c >= a, "SafeMath: addition overflow"); return c; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { return sub(a, b, "SafeMath: subtraction overflow"); } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * - Subtraction cannot overflow. * * _Available since v2.4.0._ */ function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b <= a, errorMessage); uint256 c = a - b; return c; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) { return 0; } uint256 c = a * b; require(c / a == b, "SafeMath: multiplication overflow"); return c; } /** * @dev Returns the integer division of two unsigned integers. Reverts on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { return div(a, b, "SafeMath: division by zero"); } /** * @dev Returns the integer division of two unsigned integers. Reverts with custom message on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * - The divisor cannot be zero. * * _Available since v2.4.0._ */ function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { // Solidity only automatically asserts when dividing by 0 require(b > 0, errorMessage); uint256 c = a / b; // assert(a == b * c + a % b); // There is no case in which this doesn't hold return c; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { return mod(a, b, "SafeMath: modulo by zero"); } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts with custom message when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * - The divisor cannot be zero. * * _Available since v2.4.0._ */ function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b != 0, errorMessage); return a % b; } } // File: contracts/interface/IUniswapExchange.sol pragma solidity ^0.5.0; interface IUniswapExchange { function getEthToTokenInputPrice(uint256 ethSold) external view returns (uint256 tokensBought); function getTokenToEthInputPrice(uint256 tokensSold) external view returns (uint256 ethBought); function ethToTokenSwapInput(uint256 minTokens, uint256 deadline) external payable returns (uint256 tokensBought); function tokenToEthSwapInput(uint256 tokensSold, uint256 minEth, uint256 deadline) external returns (uint256 ethBought); function tokenToTokenSwapInput( uint256 tokensSold, uint256 minTokensBought, uint256 minEthBought, uint256 deadline, address tokenAddr ) external returns (uint256 tokensBought); } // File: contracts/interface/IUniswapFactory.sol pragma solidity ^0.5.0; interface IUniswapFactory { function getExchange(IERC20 token) external view returns (IUniswapExchange exchange); } // File: contracts/interface/IKyberNetworkContract.sol pragma solidity ^0.5.0; interface IKyberNetworkContract { function searchBestRate(IERC20 src, IERC20 dest, uint256 srcAmount, bool usePermissionless) external view returns (address reserve, uint256 rate); } // File: contracts/interface/IKyberNetworkProxy.sol pragma solidity ^0.5.0; interface IKyberNetworkProxy { function getExpectedRate(IERC20 src, IERC20 dest, uint256 srcQty) external view returns (uint256 expectedRate, uint256 slippageRate); function tradeWithHint( IERC20 src, uint256 srcAmount, IERC20 dest, address destAddress, uint256 maxDestAmount, uint256 minConversionRate, address walletId, bytes calldata hint ) external payable returns (uint256); function kyberNetworkContract() external view returns (IKyberNetworkContract); // TODO: Limit usage by tx.gasPrice // function maxGasPrice() external view returns (uint256); // TODO: Limit usage by user cap // function getUserCapInWei(address user) external view returns (uint256); // function getUserCapInTokenWei(address user, IERC20 token) external view returns (uint256); } // File: contracts/interface/IKyberUniswapReserve.sol pragma solidity ^0.5.0; interface IKyberUniswapReserve { function uniswapFactory() external view returns (address); } // File: contracts/interface/IKyberOasisReserve.sol pragma solidity ^0.5.0; interface IKyberOasisReserve { function otc() external view returns (address); } // File: contracts/interface/IKyberBancorReserve.sol pragma solidity ^0.5.0; contract IKyberBancorReserve { function bancorEth() public view returns (address); } // File: contracts/interface/IBancorNetwork.sol pragma solidity ^0.5.0; interface IBancorNetwork { function getReturnByPath(address[] calldata path, uint256 amount) external view returns (uint256 returnAmount, uint256 conversionFee); function claimAndConvert(address[] calldata path, uint256 amount, uint256 minReturn) external returns (uint256); function convert(address[] calldata path, uint256 amount, uint256 minReturn) external payable returns (uint256); } // File: contracts/interface/IBancorContractRegistry.sol pragma solidity ^0.5.0; contract IBancorContractRegistry { function addressOf(bytes32 contractName) external view returns (address); } // File: contracts/interface/IBancorNetworkPathFinder.sol pragma solidity ^0.5.0; interface IBancorNetworkPathFinder { function generatePath(IERC20 sourceToken, IERC20 targetToken) external view returns (address[] memory); } // File: contracts/interface/IBancorEtherToken.sol pragma solidity ^0.5.0; contract IBancorEtherToken is IERC20 { function deposit() external payable; function withdraw(uint256 amount) external; } // File: contracts/interface/IOasisExchange.sol pragma solidity ^0.5.0; interface IOasisExchange { function getBuyAmount(IERC20 buyGem, IERC20 payGem, uint256 payAmt) external view returns (uint256 fillAmt); function sellAllAmount(IERC20 payGem, uint256 payAmt, IERC20 buyGem, uint256 minFillAmount) external returns (uint256 fillAmt); } // File: contracts/interface/IWETH.sol pragma solidity ^0.5.0; contract IWETH is IERC20 { function deposit() external payable; function withdraw(uint256 amount) external; } // File: @openzeppelin/contracts/utils/Address.sol pragma solidity ^0.5.5; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // According to EIP-1052, 0x0 is the value returned for not-yet created accounts // and 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470 is returned // for accounts without code, i.e. `keccak256('')` bytes32 codehash; bytes32 accountHash = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470; // solhint-disable-next-line no-inline-assembly assembly { codehash := extcodehash(account) } return (codehash != accountHash && codehash != 0x0); } /** * @dev Converts an `address` into `address payable`. Note that this is * simply a type cast: the actual underlying value is not changed. * * _Available since v2.4.0._ */ function toPayable(address account) internal pure returns (address payable) { return address(uint160(account)); } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. * * _Available since v2.4.0._ */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); // solhint-disable-next-line avoid-call-value (bool success, ) = recipient.call.value(amount)(""); require(success, "Address: unable to send value, recipient may have reverted"); } } // File: @openzeppelin/contracts/token/ERC20/SafeERC20.sol pragma solidity ^0.5.0; /** * @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; using Address for address; 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)); } function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal { uint256 newAllowance = token.allowance(address(this), spender).add(value); callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } function safeDecreaseAllowance(IERC20 token, address spender, uint256 value) internal { uint256 newAllowance = token.allowance(address(this), spender).sub(value, "SafeERC20: decreased allowance below zero"); callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } /** * @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 require(address(token).isContract(), "SafeERC20: call to non-contract"); // 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/UniversalERC20.sol pragma solidity ^0.5.0; library UniversalERC20 { using SafeMath for uint256; using SafeERC20 for IERC20; IERC20 private constant ZERO_ADDRESS = IERC20(0x0000000000000000000000000000000000000000); IERC20 private constant ETH_ADDRESS = IERC20(0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE); function universalTransfer(IERC20 token, address to, uint256 amount) internal returns(bool) { if (amount == 0) { return true; } if (isETH(token)) { address(uint160(to)).transfer(amount); } else { token.safeTransfer(to, amount); return true; } } function universalTransferFrom(IERC20 token, address from, address to, uint256 amount) internal { if (amount == 0) { return; } if (isETH(token)) { require(from == msg.sender && msg.value >= amount, "msg.value is zero"); if (to != address(this)) { address(uint160(to)).transfer(amount); } if (msg.value > amount) { msg.sender.transfer(msg.value.sub(amount)); } } else { token.safeTransferFrom(from, to, amount); } } function universalApprove(IERC20 token, address to, uint256 amount) internal { if (!isETH(token)) { if (amount > 0 && token.allowance(address(this), to) > 0) { token.safeApprove(to, 0); } token.safeApprove(to, amount); } } function universalBalanceOf(IERC20 token, address who) internal view returns (uint256) { if (isETH(token)) { return who.balance; } else { return token.balanceOf(who); } } function universalDecimals(IERC20 token) internal view returns (uint256) { if (isETH(token)) { return 18; } (bool success, bytes memory data) = address(token).staticcall.gas(5000)( abi.encodeWithSignature("decimals()") ); if (!success) { (success, data) = address(token).staticcall.gas(5000)( abi.encodeWithSignature("DECIMALS()") ); } return success ? abi.decode(data, (uint256)) : 18; } function isETH(IERC20 token) internal pure returns(bool) { return (address(token) == address(ZERO_ADDRESS) || address(token) == address(ETH_ADDRESS)); } } // File: contracts/OneSplitBase.sol pragma solidity ^0.5.0; library DisableFlags { function enabled(uint256 disableFlags, uint256 flag) internal pure returns(bool) { return (disableFlags & flag) == 0; } function disabledReserve(uint256 disableFlags, uint256 flag) internal pure returns(bool) { // For flag disabled by default (Kyber reserves) return enabled(disableFlags, flag); } function disabled(uint256 disableFlags, uint256 flag) internal pure returns(bool) { return (disableFlags & flag) != 0; } } contract OneSplitBaseBase { using SafeMath for uint256; using DisableFlags for uint256; using UniversalERC20 for IERC20; using UniversalERC20 for IWETH; using UniversalERC20 for IBancorEtherToken; IERC20 constant public ETH_ADDRESS = IERC20(0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE); IERC20 public dai = IERC20(0x6B175474E89094C44Da98b954EedeAC495271d0F); IWETH public wethToken = IWETH(0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2); IBancorEtherToken public bancorEtherToken = IBancorEtherToken(0xc0829421C1d260BD3cB3E0F06cfE2D52db2cE315); IKyberNetworkProxy public kyberNetworkProxy = IKyberNetworkProxy(0x818E6FECD516Ecc3849DAf6845e3EC868087B755); IUniswapFactory public uniswapFactory = IUniswapFactory(0xc0a47dFe034B400B47bDaD5FecDa2621de6c4d95); IBancorContractRegistry public bancorContractRegistry = IBancorContractRegistry(0x52Ae12ABe5D8BD778BD5397F99cA900624CfADD4); IBancorNetworkPathFinder bancorNetworkPathFinder = IBancorNetworkPathFinder(0x6F0cD8C4f6F06eAB664C7E3031909452b4B72861); IOasisExchange public oasisExchange = IOasisExchange(0x794e6e91555438aFc3ccF1c5076A74F42133d08D); } contract OneSplitBaseView is IOneSplitView, OneSplitBaseBase { function log(uint256) external view { } function getExpectedReturn( IERC20 fromToken, IERC20 toToken, uint256 amount, uint256 parts, uint256 disableFlags // 1 - Uniswap, 2 - Kyber, 4 - Bancor, 8 - Oasis, 16 - Compound, 32 - Fulcrum, 64 - Chai, 128 - Aave, 256 - SmartToken ) public view returns( uint256 returnAmount, uint256[] memory distribution // [Uniswap, Kyber, Bancor, Oasis] ) { distribution = new uint256[](4); if (fromToken == toToken) { return (amount, distribution); } function(IERC20,IERC20,uint256,uint256) view returns(uint256)[4] memory reserves = [ disableFlags.disabled(FLAG_UNISWAP) ? _calculateNoReturn : calculateUniswapReturn, disableFlags.disabled(FLAG_KYBER) ? _calculateNoReturn : calculateKyberReturn, disableFlags.disabled(FLAG_BANCOR) ? _calculateNoReturn : calculateBancorReturn, disableFlags.disabled(FLAG_OASIS) ? _calculateNoReturn : calculateOasisReturn ]; uint256[4] memory rates; uint256[4] memory fullRates; for (uint i = 0; i < rates.length; i++) { rates[i] = reserves[i](fromToken, toToken, amount.div(parts), disableFlags); this.log(rates[i]); fullRates[i] = rates[i]; } for (uint j = 0; j < parts; j++) { // Find best part uint256 bestIndex = 0; for (uint i = 1; i < rates.length; i++) { if (rates[i] > rates[bestIndex]) { bestIndex = i; } } // Add best part returnAmount = returnAmount.add(rates[bestIndex]); distribution[bestIndex]++; // Avoid CompilerError: Stack too deep uint256 srcAmount = amount; // Recalc part if needed if (j + 1 < parts) { uint256 newRate = reserves[bestIndex]( fromToken, toToken, srcAmount.mul(distribution[bestIndex] + 1).div(parts), disableFlags ); if (newRate > fullRates[bestIndex]) { rates[bestIndex] = newRate.sub(fullRates[bestIndex]); } else { rates[bestIndex] = 0; } this.log(rates[bestIndex]); fullRates[bestIndex] = newRate; } } } // View Helpers function calculateUniswapReturn( IERC20 fromToken, IERC20 toToken, uint256 amount, uint256 /*disableFlags*/ ) public view returns(uint256) { uint256 returnAmount = amount; if (!fromToken.isETH()) { IUniswapExchange fromExchange = uniswapFactory.getExchange(fromToken); if (fromExchange != IUniswapExchange(0)) { (bool success, bytes memory data) = address(fromExchange).staticcall.gas(200000)( abi.encodeWithSelector( fromExchange.getTokenToEthInputPrice.selector, returnAmount ) ); if (success) { returnAmount = abi.decode(data, (uint256)); } else { returnAmount = 0; } } else { returnAmount = 0; } } if (!toToken.isETH()) { IUniswapExchange toExchange = uniswapFactory.getExchange(toToken); if (toExchange != IUniswapExchange(0)) { (bool success, bytes memory data) = address(toExchange).staticcall.gas(200000)( abi.encodeWithSelector( toExchange.getEthToTokenInputPrice.selector, returnAmount ) ); if (success) { returnAmount = abi.decode(data, (uint256)); } else { returnAmount = 0; } } else { returnAmount = 0; } } return returnAmount; } function calculateKyberReturn( IERC20 fromToken, IERC20 toToken, uint256 amount, uint256 disableFlags ) public view returns(uint256) { (bool success, bytes memory data) = address(kyberNetworkProxy).staticcall.gas(2300)(abi.encodeWithSelector( kyberNetworkProxy.kyberNetworkContract.selector )); if (!success) { return 0; } IKyberNetworkContract kyberNetworkContract = IKyberNetworkContract(abi.decode(data, (address))); if (fromToken.isETH() || toToken.isETH()) { return _calculateKyberReturnWithEth(kyberNetworkContract, fromToken, toToken, amount, disableFlags); } uint256 value = _calculateKyberReturnWithEth(kyberNetworkContract, fromToken, ETH_ADDRESS, amount, disableFlags); if (value == 0) { return 0; } return _calculateKyberReturnWithEth(kyberNetworkContract, ETH_ADDRESS, toToken, value, disableFlags); } function _calculateKyberReturnWithEth( IKyberNetworkContract kyberNetworkContract, IERC20 fromToken, IERC20 toToken, uint256 amount, uint256 disableFlags ) public view returns(uint256) { require(fromToken.isETH() || toToken.isETH(), "One of the tokens should be ETH"); (bool success, bytes memory data) = address(kyberNetworkContract).staticcall.gas(1500000)(abi.encodeWithSelector( kyberNetworkContract.searchBestRate.selector, fromToken.isETH() ? ETH_ADDRESS : fromToken, toToken.isETH() ? ETH_ADDRESS : toToken, amount, true )); if (!success) { return 0; } (address reserve, uint256 rate) = abi.decode(data, (address,uint256)); if ((reserve == 0x31E085Afd48a1d6e51Cc193153d625e8f0514C7F && disableFlags.disabledReserve(FLAG_KYBER_UNISWAP_RESERVE)) || (reserve == 0x1E158c0e93c30d24e918Ef83d1e0bE23595C3c0f && disableFlags.disabledReserve(FLAG_KYBER_OASIS_RESERVE)) || (reserve == 0x053AA84FCC676113a57e0EbB0bD1913839874bE4 && disableFlags.disabledReserve(FLAG_KYBER_BANCOR_RESERVE))) { return 0; } if (disableFlags.disabledReserve(FLAG_KYBER_UNISWAP_RESERVE)) { (success,) = reserve.staticcall.gas(2300)(abi.encodeWithSelector( IKyberUniswapReserve(reserve).uniswapFactory.selector )); if (success) { return 0; } } if (disableFlags.disabledReserve(FLAG_KYBER_OASIS_RESERVE)) { (success,) = reserve.staticcall.gas(2300)(abi.encodeWithSelector( IKyberOasisReserve(reserve).otc.selector )); if (success) { return 0; } } if (disableFlags.disabledReserve(FLAG_KYBER_BANCOR_RESERVE)) { (success,) = reserve.staticcall.gas(2300)(abi.encodeWithSelector( IKyberBancorReserve(reserve).bancorEth.selector )); if (success) { return 0; } } return rate.mul(amount) .mul(10 ** IERC20(toToken).universalDecimals()) .div(10 ** IERC20(fromToken).universalDecimals()) .div(1e18); } function calculateBancorReturn( IERC20 fromToken, IERC20 toToken, uint256 amount, uint256 /*disableFlags*/ ) public view returns(uint256) { IBancorNetwork bancorNetwork = IBancorNetwork(bancorContractRegistry.addressOf("BancorNetwork")); address[] memory path = bancorNetworkPathFinder.generatePath( fromToken.isETH() ? bancorEtherToken : fromToken, toToken.isETH() ? bancorEtherToken : toToken ); (bool success, bytes memory data) = address(bancorNetwork).staticcall.gas(500000)( abi.encodeWithSelector( bancorNetwork.getReturnByPath.selector, path, amount ) ); if (!success) { return 0; } (uint256 returnAmount,) = abi.decode(data, (uint256,uint256)); return returnAmount; } function calculateOasisReturn( IERC20 fromToken, IERC20 toToken, uint256 amount, uint256 /*disableFlags*/ ) public view returns(uint256) { (bool success, bytes memory data) = address(oasisExchange).staticcall.gas(500000)( abi.encodeWithSelector( oasisExchange.getBuyAmount.selector, toToken.isETH() ? wethToken : toToken, fromToken.isETH() ? wethToken : fromToken, amount ) ); if (!success) { return 0; } return abi.decode(data, (uint256)); } function _calculateNoReturn( IERC20 /*fromToken*/, IERC20 /*toToken*/, uint256 /*amount*/, uint256 /*disableFlags*/ ) internal view returns(uint256) { this; } } contract OneSplitBase is IOneSplit, OneSplitBaseBase { function() external payable { // solium-disable-next-line security/no-tx-origin require(msg.sender != tx.origin); } function _swap( IERC20 fromToken, IERC20 toToken, uint256 amount, uint256[] memory distribution, // [Uniswap, Kyber, Bancor, Oasis] uint256 /*disableFlags*/ // 16 - Compound, 32 - Fulcrum, 64 - Chai, 128 - Aave, 256 - SmartToken ) internal { if (fromToken == toToken) { return; } function(IERC20,IERC20,uint256) returns(uint256)[4] memory reserves = [ _swapOnUniswap, _swapOnKyber, _swapOnBancor, _swapOnOasis ]; uint256 parts = 0; uint256 lastNonZeroIndex = 0; for (uint i = 0; i < reserves.length; i++) { if (distribution[i] > 0) { parts = parts.add(distribution[i]); lastNonZeroIndex = i; } } require(parts > 0, "OneSplit: distribution should contain non-zeros"); uint256 remainingAmount = amount; for (uint i = 0; i < reserves.length; i++) { if (distribution[i] == 0) { continue; } uint256 swapAmount = amount.mul(distribution[i]).div(parts); if (i == lastNonZeroIndex) { swapAmount = remainingAmount; } remainingAmount -= swapAmount; reserves[i](fromToken, toToken, swapAmount); } } // Swap helpers function _swapOnUniswap( IERC20 fromToken, IERC20 toToken, uint256 amount ) internal returns(uint256) { uint256 returnAmount = amount; if (!fromToken.isETH()) { IUniswapExchange fromExchange = uniswapFactory.getExchange(fromToken); if (fromExchange != IUniswapExchange(0)) { _infiniteApproveIfNeeded(fromToken, address(fromExchange)); returnAmount = fromExchange.tokenToEthSwapInput(returnAmount, 1, now); } } if (!toToken.isETH()) { IUniswapExchange toExchange = uniswapFactory.getExchange(toToken); if (toExchange != IUniswapExchange(0)) { returnAmount = toExchange.ethToTokenSwapInput.value(returnAmount)(1, now); } } return returnAmount; } function _swapOnKyber( IERC20 fromToken, IERC20 toToken, uint256 amount ) internal returns(uint256) { _infiniteApproveIfNeeded(fromToken, address(kyberNetworkProxy)); return kyberNetworkProxy.tradeWithHint.value(fromToken.isETH() ? amount : 0)( fromToken.isETH() ? ETH_ADDRESS : fromToken, amount, toToken.isETH() ? ETH_ADDRESS : toToken, address(this), 1 << 255, 0, 0x4D37f28D2db99e8d35A6C725a5f1749A085850a3, "" ); } function _swapOnBancor( IERC20 fromToken, IERC20 toToken, uint256 amount ) internal returns(uint256) { if (fromToken.isETH()) { bancorEtherToken.deposit.value(amount)(); } IBancorNetwork bancorNetwork = IBancorNetwork(bancorContractRegistry.addressOf("BancorNetwork")); address[] memory path = bancorNetworkPathFinder.generatePath( fromToken.isETH() ? bancorEtherToken : fromToken, toToken.isETH() ? bancorEtherToken : toToken ); _infiniteApproveIfNeeded(fromToken.isETH() ? bancorEtherToken : fromToken, address(bancorNetwork)); uint256 returnAmount = bancorNetwork.claimAndConvert(path, amount, 1); if (toToken.isETH()) { bancorEtherToken.withdraw(bancorEtherToken.balanceOf(address(this))); } return returnAmount; } function _swapOnOasis( IERC20 fromToken, IERC20 toToken, uint256 amount ) internal returns(uint256) { if (fromToken.isETH()) { wethToken.deposit.value(amount)(); } _infiniteApproveIfNeeded(fromToken.isETH() ? wethToken : fromToken, address(oasisExchange)); uint256 returnAmount = oasisExchange.sellAllAmount( fromToken.isETH() ? wethToken : fromToken, amount, toToken.isETH() ? wethToken : toToken, 1 ); if (toToken.isETH()) { wethToken.withdraw(wethToken.balanceOf(address(this))); } return returnAmount; } // Helpers function _infiniteApproveIfNeeded(IERC20 token, address to) internal { if (!token.isETH()) { if ((token.allowance(address(this), to) >> 255) == 0) { token.universalApprove(to, uint256(- 1)); } } } } // File: contracts/OneSplitMultiPath.sol pragma solidity ^0.5.0; contract OneSplitMultiPathView is OneSplitBaseView { function getExpectedReturn( IERC20 fromToken, IERC20 toToken, uint256 amount, uint256 parts, uint256 disableFlags ) public view returns ( uint256 returnAmount, uint256[] memory distribution ) { if (fromToken == toToken) { return (amount, new uint256[](4)); } if (!fromToken.isETH() && !toToken.isETH() && !disableFlags.disabledReserve(FLAG_MULTI_PATH_ETH)) { (returnAmount, distribution) = super.getExpectedReturn( fromToken, ETH_ADDRESS, amount, parts, disableFlags | FLAG_BANCOR ); uint256[] memory dist; (returnAmount, dist) = super.getExpectedReturn( ETH_ADDRESS, toToken, returnAmount, parts, disableFlags | FLAG_BANCOR ); for (uint i = 0; i < distribution.length; i++) { distribution[i] = distribution[i].add(dist[i] << 8); } return (returnAmount, distribution); } return super.getExpectedReturn( fromToken, toToken, amount, parts, disableFlags ); } } contract OneSplitMultiPath is OneSplitBase { function _swap( IERC20 fromToken, IERC20 toToken, uint256 amount, uint256[] memory distribution, uint256 disableFlags ) internal { if (!fromToken.isETH() && !toToken.isETH() && !disableFlags.disabledReserve(FLAG_MULTI_PATH_ETH)) { uint256[] memory dist = new uint256[](distribution.length); for (uint i = 0; i < distribution.length; i++) { dist[i] = distribution[i] & 0xFF; } super._swap( fromToken, ETH_ADDRESS, amount, dist, disableFlags ); for (uint i = 0; i < distribution.length; i++) { dist[i] = (distribution[i] >> 8) & 0xFF; } super._swap( ETH_ADDRESS, toToken, address(this).balance, dist, disableFlags ); return; } super._swap( fromToken, toToken, amount, distribution, disableFlags ); } } // File: contracts/interface/ICompound.sol pragma solidity ^0.5.0; contract ICompound { function markets(address cToken) external view returns (bool isListed, uint256 collateralFactorMantissa); } contract ICompoundToken is IERC20 { function underlying() external view returns (address); function exchangeRateStored() external view returns (uint256); function mint(uint256 mintAmount) external returns (uint256); function redeem(uint256 redeemTokens) external returns (uint256); } contract ICompoundEther is IERC20 { function mint() external payable; function redeem(uint256 redeemTokens) external returns (uint256); } // File: contracts/OneSplitCompound.sol pragma solidity ^0.5.0; contract OneSplitCompoundBase { ICompound public compound = ICompound(0x3d9819210A31b4961b30EF54bE2aeD79B9c9Cd3B); ICompoundEther public cETH = ICompoundEther(0x4Ddc2D193948926D02f9B1fE9e1daa0718270ED5); function _isCompoundToken(IERC20 token) internal view returns(bool) { if (token == cETH) { return true; } (bool success, bytes memory data) = address(compound).staticcall.gas(5000)(abi.encodeWithSelector( compound.markets.selector, token )); if (!success) { return false; } (bool isListed,) = abi.decode(data, (bool,uint256)); return isListed; } function _compoundUnderlyingAsset(IERC20 asset) internal view returns(IERC20) { if (asset == cETH) { return IERC20(address(0)); } (bool success, bytes memory data) = address(asset).staticcall.gas(5000)(abi.encodeWithSelector( ICompoundToken(address(asset)).underlying.selector )); if (!success) { return IERC20(-1); } return abi.decode(data, (IERC20)); } } contract OneSplitCompoundView is OneSplitBaseView, OneSplitCompoundBase { function getExpectedReturn( IERC20 fromToken, IERC20 toToken, uint256 amount, uint256 parts, uint256 disableFlags ) public view returns( uint256 returnAmount, uint256[] memory distribution ) { return _compoundGetExpectedReturn( fromToken, toToken, amount, parts, disableFlags ); } function _compoundGetExpectedReturn( IERC20 fromToken, IERC20 toToken, uint256 amount, uint256 parts, uint256 disableFlags ) private view returns( uint256 returnAmount, uint256[] memory distribution ) { if (fromToken == toToken) { return (amount, new uint256[](4)); } if (disableFlags.enabled(FLAG_COMPOUND)) { if (_isCompoundToken(fromToken)) { IERC20 underlying = _compoundUnderlyingAsset(fromToken); if (underlying != IERC20(-1)) { uint256 compoundRate = ICompoundToken(address(fromToken)).exchangeRateStored(); return _compoundGetExpectedReturn( underlying, toToken, amount.mul(compoundRate).div(1e18), parts, disableFlags ); } } if (_isCompoundToken(toToken)) { IERC20 underlying = _compoundUnderlyingAsset(toToken); if (underlying != IERC20(-1)) { uint256 compoundRate = ICompoundToken(address(toToken)).exchangeRateStored(); (returnAmount, distribution) = super.getExpectedReturn( fromToken, underlying, amount, parts, disableFlags ); returnAmount = returnAmount.mul(1e18).div(compoundRate); return (returnAmount, distribution); } } } return super.getExpectedReturn( fromToken, toToken, amount, parts, disableFlags ); } } contract OneSplitCompound is OneSplitBase, OneSplitCompoundBase { function _swap( IERC20 fromToken, IERC20 toToken, uint256 amount, uint256[] memory distribution, uint256 disableFlags ) internal { _compundSwap( fromToken, toToken, amount, distribution, disableFlags ); } function _compundSwap( IERC20 fromToken, IERC20 toToken, uint256 amount, uint256[] memory distribution, uint256 disableFlags ) private { if (fromToken == toToken) { return; } if (disableFlags.enabled(FLAG_COMPOUND)) { if (_isCompoundToken(fromToken)) { IERC20 underlying = _compoundUnderlyingAsset(fromToken); ICompoundToken(address(fromToken)).redeem(amount); uint256 underlyingAmount = underlying.universalBalanceOf(address(this)); return _compundSwap( underlying, toToken, underlyingAmount, distribution, disableFlags ); } if (_isCompoundToken(toToken)) { IERC20 underlying = _compoundUnderlyingAsset(toToken); super._swap( fromToken, underlying, amount, distribution, disableFlags ); uint256 underlyingAmount = underlying.universalBalanceOf(address(this)); if (underlying.isETH()) { cETH.mint.value(underlyingAmount)(); } else { _infiniteApproveIfNeeded(underlying, address(toToken)); ICompoundToken(address(toToken)).mint(underlyingAmount); } return; } } return super._swap( fromToken, toToken, amount, distribution, disableFlags ); } } // File: @openzeppelin/contracts/token/ERC20/ERC20Detailed.sol pragma solidity ^0.5.0; /** * @dev Optional functions from the ERC20 standard. */ contract ERC20Detailed is IERC20 { string private _name; string private _symbol; uint8 private _decimals; /** * @dev Sets the values for `name`, `symbol`, and `decimals`. All three of * these values are immutable: they can only be set once during * construction. */ constructor (string memory name, string memory symbol, uint8 decimals) public { _name = name; _symbol = symbol; _decimals = decimals; } /** * @dev Returns the name of the token. */ function name() public view returns (string memory) { return _name; } /** * @dev Returns the symbol of the token, usually a shorter version of the * name. */ function symbol() public view returns (string memory) { return _symbol; } /** * @dev Returns the number of decimals used to get its user representation. * For example, if `decimals` equals `2`, a balance of `505` tokens should * be displayed to a user as `5,05` (`505 / 10 ** 2`). * * Tokens usually opt for a value of 18, imitating the relationship between * Ether and Wei. * * NOTE: This information is only used for _display_ purposes: it in * no way affects any of the arithmetic of the contract, including * {IERC20-balanceOf} and {IERC20-transfer}. */ function decimals() public view returns (uint8) { return _decimals; } } // File: contracts/interface/IFulcrum.sol pragma solidity ^0.5.0; contract IFulcrumToken is IERC20 { function tokenPrice() external view returns (uint256); function loanTokenAddress() external view returns (address); function mintWithEther(address receiver) external payable returns (uint256 mintAmount); function mint(address receiver, uint256 depositAmount) external returns (uint256 mintAmount); function burnToEther(address receiver, uint256 burnAmount) external returns (uint256 loanAmountPaid); function burn(address receiver, uint256 burnAmount) external returns (uint256 loanAmountPaid); } // File: contracts/OneSplitFulcrum.sol pragma solidity ^0.5.0; contract OneSplitFulcrumBase { using UniversalERC20 for IERC20; function _isFulcrumToken(IERC20 token) public view returns(IERC20) { if (token.isETH()) { return IERC20(-1); } (bool success, bytes memory data) = address(token).staticcall.gas(5000)(abi.encodeWithSelector( ERC20Detailed(address(token)).name.selector )); if (!success) { return IERC20(-1); } bool foundBZX = false; for (uint i = 0; i < data.length - 7; i++) { if (data[i + 0] == "F" && data[i + 1] == "u" && data[i + 2] == "l" && data[i + 3] == "c" && data[i + 4] == "r" && data[i + 5] == "u" && data[i + 6] == "m") { foundBZX = true; break; } } if (!foundBZX) { return IERC20(-1); } (success, data) = address(token).staticcall.gas(5000)(abi.encodeWithSelector( IFulcrumToken(address(token)).loanTokenAddress.selector )); if (!success) { return IERC20(-1); } return abi.decode(data, (IERC20)); } } contract OneSplitFulcrumView is OneSplitBaseView, OneSplitFulcrumBase { function getExpectedReturn( IERC20 fromToken, IERC20 toToken, uint256 amount, uint256 parts, uint256 disableFlags ) public view returns( uint256 returnAmount, uint256[] memory distribution ) { return _fulcrumGetExpectedReturn( fromToken, toToken, amount, parts, disableFlags ); } function _fulcrumGetExpectedReturn( IERC20 fromToken, IERC20 toToken, uint256 amount, uint256 parts, uint256 disableFlags ) public view returns( uint256 returnAmount, uint256[] memory distribution ) { if (fromToken == toToken) { return (amount, new uint256[](4)); } if (disableFlags.enabled(FLAG_FULCRUM)) { IERC20 underlying = _isFulcrumToken(fromToken); if (underlying != IERC20(-1)) { uint256 fulcrumRate = IFulcrumToken(address(fromToken)).tokenPrice(); return _fulcrumGetExpectedReturn( underlying, toToken, amount.mul(fulcrumRate).div(1e18), parts, disableFlags ); } underlying = _isFulcrumToken(toToken); if (underlying != IERC20(-1)) { uint256 fulcrumRate = IFulcrumToken(address(toToken)).tokenPrice(); (returnAmount, distribution) = super.getExpectedReturn( fromToken, underlying, amount, parts, disableFlags ); returnAmount = returnAmount.mul(1e18).div(fulcrumRate); return (returnAmount, distribution); } } return super.getExpectedReturn( fromToken, toToken, amount, parts, disableFlags ); } } contract OneSplitFulcrum is OneSplitBase, OneSplitFulcrumBase { function _swap( IERC20 fromToken, IERC20 toToken, uint256 amount, uint256[] memory distribution, uint256 disableFlags ) internal { _fulcrumSwap( fromToken, toToken, amount, distribution, disableFlags ); } function _fulcrumSwap( IERC20 fromToken, IERC20 toToken, uint256 amount, uint256[] memory distribution, uint256 disableFlags ) private { if (fromToken == toToken) { return; } if (disableFlags.enabled(FLAG_FULCRUM)) { IERC20 underlying = _isFulcrumToken(fromToken); if (underlying != IERC20(-1)) { if (underlying.isETH()) { IFulcrumToken(address(fromToken)).burnToEther(address(this), amount); } else { IFulcrumToken(address(fromToken)).burn(address(this), amount); } uint256 underlyingAmount = underlying.universalBalanceOf(address(this)); return super._swap( underlying, toToken, underlyingAmount, distribution, disableFlags ); } underlying = _isFulcrumToken(toToken); if (underlying != IERC20(-1)) { super._swap( fromToken, underlying, amount, distribution, disableFlags ); uint256 underlyingAmount = underlying.universalBalanceOf(address(this)); if (underlying.isETH()) { IFulcrumToken(address(toToken)).mintWithEther.value(underlyingAmount)(address(this)); } else { _infiniteApproveIfNeeded(underlying, address(toToken)); IFulcrumToken(address(toToken)).mint(address(this), underlyingAmount); } return; } } return super._swap( fromToken, toToken, amount, distribution, disableFlags ); } } // File: contracts/interface/IChai.sol pragma solidity ^0.5.0; interface IPot { function dsr() external view returns (uint256); function chi() external view returns (uint256); function rho() external view returns (uint256); function drip() external returns (uint256); function join(uint256) external; function exit(uint256) external; } contract IChai is IERC20 { function POT() public view returns (IPot); function join(address dst, uint256 wad) external; function exit(address src, uint256 wad) external; } library ChaiHelper { IPot private constant POT = IPot(0x197E90f9FAD81970bA7976f33CbD77088E5D7cf7); uint256 private constant RAY = 10**27; function _mul(uint256 x, uint256 y) private pure returns (uint256 z) { require(y == 0 || (z = x * y) / y == x); } function _rmul(uint256 x, uint256 y) private pure returns (uint256 z) { // always rounds down z = _mul(x, y) / RAY; } function _rdiv(uint256 x, uint256 y) private pure returns (uint256 z) { // always rounds down z = _mul(x, RAY) / y; } function rpow(uint256 x, uint256 n, uint256 base) private pure returns (uint256 z) { // solium-disable-next-line security/no-inline-assembly assembly { switch x case 0 { switch n case 0 { z := base } default { z := 0 } } default { switch mod(n, 2) case 0 { z := base } default { z := x } let half := div(base, 2) // for rounding. for { n := div(n, 2) } n { n := div(n, 2) } { let xx := mul(x, x) if iszero(eq(div(xx, x), x)) { revert(0, 0) } let xxRound := add(xx, half) if lt(xxRound, xx) { revert(0, 0) } x := div(xxRound, base) if mod(n, 2) { let zx := mul(z, x) if and(iszero(iszero(x)), iszero(eq(div(zx, x), z))) { revert(0, 0) } let zxRound := add(zx, half) if lt(zxRound, zx) { revert(0, 0) } z := div(zxRound, base) } } } } } function potDrip() private view returns (uint256) { return _rmul(rpow(POT.dsr(), now - POT.rho(), RAY), POT.chi()); } function daiToChai( IChai, /*chai*/ uint256 amount ) internal view returns (uint256) { uint256 chi = (now > POT.rho()) ? potDrip() : POT.chi(); return _rdiv(amount, chi); } function chaiToDai( IChai, /*chai*/ uint256 amount ) internal view returns (uint256) { uint256 chi = (now > POT.rho()) ? potDrip() : POT.chi(); return _rmul(chi, amount); } } // File: contracts/OneSplitChai.sol pragma solidity ^0.5.0; contract OneSplitChaiBase { using ChaiHelper for IChai; IChai public chai = IChai(0x06AF07097C9Eeb7fD685c692751D5C66dB49c215); } contract OneSplitChaiView is OneSplitBaseView, OneSplitChaiBase { function getExpectedReturn( IERC20 fromToken, IERC20 toToken, uint256 amount, uint256 parts, uint256 disableFlags ) public view returns( uint256 returnAmount, uint256[] memory distribution ) { if (fromToken == toToken) { return (amount, new uint256[](4)); } if (disableFlags.enabled(FLAG_CHAI)) { if (fromToken == IERC20(chai)) { return super.getExpectedReturn( dai, toToken, chai.chaiToDai(amount), parts, disableFlags ); } if (toToken == IERC20(chai)) { (returnAmount, distribution) = super.getExpectedReturn( fromToken, dai, amount, parts, disableFlags ); return (chai.daiToChai(returnAmount), distribution); } } return super.getExpectedReturn( fromToken, toToken, amount, parts, disableFlags ); } } contract OneSplitChai is OneSplitBase, OneSplitChaiBase { function _swap( IERC20 fromToken, IERC20 toToken, uint256 amount, uint256[] memory distribution, uint256 disableFlags ) internal { if (fromToken == toToken) { return; } if (disableFlags.enabled(FLAG_CHAI)) { if (fromToken == IERC20(chai)) { chai.exit(address(this), amount); return super._swap( dai, toToken, dai.balanceOf(address(this)), distribution, disableFlags ); } if (toToken == IERC20(chai)) { super._swap( fromToken, dai, amount, distribution, disableFlags ); _infiniteApproveIfNeeded(dai, address(chai)); chai.join(address(this), dai.balanceOf(address(this))); return; } } return super._swap( fromToken, toToken, amount, distribution, disableFlags ); } } // File: contracts/interface/IBdai.sol pragma solidity ^0.5.0; contract IBdai is IERC20 { function join(uint256) external; function exit(uint256) external; } // File: contracts/OneSplitBdai.sol pragma solidity ^0.5.0; contract OneSplitBdaiBase { IBdai public bdai = IBdai(0x6a4FFAafa8DD400676Df8076AD6c724867b0e2e8); IERC20 public btu = IERC20(0xb683D83a532e2Cb7DFa5275eED3698436371cc9f); } contract OneSplitBdaiView is OneSplitBaseView, OneSplitBdaiBase { function getExpectedReturn( IERC20 fromToken, IERC20 toToken, uint256 amount, uint256 parts, uint256 disableFlags ) public view returns (uint256 returnAmount, uint256[] memory distribution) { if (fromToken == toToken) { return (amount, new uint256[](4)); } if (disableFlags.enabled(FLAG_BDAI)) { if (fromToken == IERC20(bdai)) { return super.getExpectedReturn( dai, toToken, amount, parts, disableFlags ); } if (toToken == IERC20(bdai)) { return super.getExpectedReturn( fromToken, dai, amount, parts, disableFlags ); } } return super.getExpectedReturn( fromToken, toToken, amount, parts, disableFlags ); } } contract OneSplitBdai is OneSplitBase, OneSplitBdaiBase { function _swap( IERC20 fromToken, IERC20 toToken, uint256 amount, uint256[] memory distribution, uint256 disableFlags ) internal { if (fromToken == toToken) { return; } if (disableFlags.enabled(FLAG_BDAI)) { if (fromToken == IERC20(bdai)) { bdai.exit(amount); uint256 btuBalance = btu.balanceOf(address(this)); if (btuBalance > 0) { (,uint256[] memory btuDistribution) = getExpectedReturn( btu, toToken, btuBalance, 1, disableFlags ); _swap( btu, toToken, btuBalance, btuDistribution, disableFlags ); } return super._swap( dai, toToken, amount, distribution, disableFlags ); } if (toToken == IERC20(bdai)) { super._swap(fromToken, dai, amount, distribution, disableFlags); _infiniteApproveIfNeeded(dai, address(bdai)); bdai.join(dai.balanceOf(address(this))); return; } } return super._swap(fromToken, toToken, amount, distribution, disableFlags); } } // File: contracts/interface/IIearn.sol pragma solidity ^0.5.0; contract IIearn is IERC20 { function token() external view returns(IERC20); function calcPoolValueInToken() external view returns(uint256); function deposit(uint256 _amount) external; function withdraw(uint256 _shares) external; } // File: contracts/OneSplitIearn.sol pragma solidity ^0.5.0; contract OneSplitIearnBase { function _yTokens() internal pure returns(IIearn[6] memory) { return [ IIearn(0x16de59092dAE5CcF4A1E6439D611fd0653f0Bd01), IIearn(0x04Aa51bbcB46541455cCF1B8bef2ebc5d3787EC9), IIearn(0x73a052500105205d34Daf004eAb301916DA8190f), IIearn(0x83f798e925BcD4017Eb265844FDDAbb448f1707D), IIearn(0xd6aD7a6750A7593E092a9B218d66C0A814a3436e), IIearn(0xF61718057901F84C4eEC4339EF8f0D86D2B45600) ]; } } contract OneSplitIearnView is OneSplitBaseView, OneSplitIearnBase { function getExpectedReturn( IERC20 fromToken, IERC20 toToken, uint256 amount, uint256 parts, uint256 disableFlags ) public view returns (uint256 returnAmount, uint256[] memory distribution) { return _iearnGetExpectedReturn( fromToken, toToken, amount, parts, disableFlags ); } function _iearnGetExpectedReturn( IERC20 fromToken, IERC20 toToken, uint256 amount, uint256 parts, uint256 disableFlags ) private view returns (uint256 returnAmount, uint256[] memory distribution) { if (fromToken == toToken) { return (amount, new uint256[](4)); } IIearn[6] memory yTokens = _yTokens(); if (disableFlags.enabled(FLAG_IEARN)) { for (uint i = 0; i < yTokens.length; i++) { if (fromToken == IERC20(yTokens[i])) { return _iearnGetExpectedReturn( yTokens[i].token(), toToken, amount .mul(yTokens[i].calcPoolValueInToken()) .div(yTokens[i].totalSupply()), parts, disableFlags ); } } for (uint i = 0; i < yTokens.length; i++) { if (toToken == IERC20(yTokens[i])) { (uint256 ret, uint256[] memory dist) = super.getExpectedReturn( fromToken, yTokens[i].token(), amount, parts, disableFlags ); return ( ret .mul(yTokens[i].totalSupply()) .div(yTokens[i].calcPoolValueInToken()), dist ); } } } return super.getExpectedReturn( fromToken, toToken, amount, parts, disableFlags ); } } contract OneSplitIearn is OneSplitBase, OneSplitIearnBase { function _swap( IERC20 fromToken, IERC20 toToken, uint256 amount, uint256[] memory distribution, uint256 disableFlags ) internal { _iearnSwap( fromToken, toToken, amount, distribution, disableFlags ); } function _iearnSwap( IERC20 fromToken, IERC20 toToken, uint256 amount, uint256[] memory distribution, uint256 disableFlags ) private { if (fromToken == toToken) { return; } IIearn[6] memory yTokens = _yTokens(); if (disableFlags.enabled(FLAG_IEARN)) { for (uint i = 0; i < yTokens.length; i++) { if (fromToken == IERC20(yTokens[i])) { IERC20 underlying = yTokens[i].token(); yTokens[i].withdraw(amount); _iearnSwap(underlying, toToken, underlying.balanceOf(address(this)), distribution, disableFlags); return; } } for (uint i = 0; i < yTokens.length; i++) { if (toToken == IERC20(yTokens[i])) { IERC20 underlying = yTokens[i].token(); super._swap(fromToken, underlying, amount, distribution, disableFlags); _infiniteApproveIfNeeded(underlying, address(yTokens[i])); yTokens[i].deposit(underlying.balanceOf(address(this))); return; } } } return super._swap(fromToken, toToken, amount, distribution, disableFlags); } } // File: contracts/interface/IAaveToken.sol pragma solidity ^0.5.0; interface IAaveToken { function underlyingAssetAddress() external view returns (IERC20); function redeem(uint256 amount) external; } interface IAaveLendingPool { function core() external view returns (address); function deposit(IERC20 token, uint256 amount, uint16 refCode) external payable; } // File: contracts/OneSplitAave.sol pragma solidity ^0.5.0; contract OneSplitAaveBase { using UniversalERC20 for IERC20; IAaveLendingPool public aave = IAaveLendingPool(0x398eC7346DcD622eDc5ae82352F02bE94C62d119); function _isAaveToken(IERC20 token) public view returns(IERC20) { if (token.isETH()) { return IERC20(-1); } (bool success, bytes memory data) = address(token).staticcall.gas(5000)(abi.encodeWithSelector( ERC20Detailed(address(token)).name.selector )); if (!success) { return IERC20(-1); } bool foundAave = false; for (uint i = 0; i < data.length - 4; i++) { if (data[i + 0] == "A" && data[i + 1] == "a" && data[i + 2] == "v" && data[i + 3] == "e") { foundAave = true; break; } } if (!foundAave) { return IERC20(-1); } (success, data) = address(token).staticcall.gas(5000)(abi.encodeWithSelector( IAaveToken(address(token)).underlyingAssetAddress.selector )); if (!success) { return IERC20(-1); } return abi.decode(data, (IERC20)); } } contract OneSplitAaveView is OneSplitBaseView, OneSplitAaveBase { function getExpectedReturn( IERC20 fromToken, IERC20 toToken, uint256 amount, uint256 parts, uint256 disableFlags ) public view returns( uint256 returnAmount, uint256[] memory distribution ) { return _aaveGetExpectedReturn( fromToken, toToken, amount, parts, disableFlags ); } function _aaveGetExpectedReturn( IERC20 fromToken, IERC20 toToken, uint256 amount, uint256 parts, uint256 disableFlags ) private view returns( uint256 returnAmount, uint256[] memory distribution ) { if (fromToken == toToken) { return (amount, distribution); } if (disableFlags.enabled(FLAG_AAVE)) { IERC20 underlying = _isAaveToken(fromToken); if (underlying != IERC20(-1)) { return _aaveGetExpectedReturn( underlying, toToken, amount, parts, disableFlags ); } underlying = _isAaveToken(toToken); if (underlying != IERC20(-1)) { return super.getExpectedReturn( fromToken, underlying, amount, parts, disableFlags ); } } return super.getExpectedReturn( fromToken, toToken, amount, parts, disableFlags ); } } contract OneSplitAave is OneSplitBase, OneSplitAaveBase { function _swap( IERC20 fromToken, IERC20 toToken, uint256 amount, uint256[] memory distribution, uint256 disableFlags ) internal { _aaveSwap( fromToken, toToken, amount, distribution, disableFlags ); } function _aaveSwap( IERC20 fromToken, IERC20 toToken, uint256 amount, uint256[] memory distribution, uint256 disableFlags ) private { if (fromToken == toToken) { return; } if (disableFlags.enabled(FLAG_AAVE)) { IERC20 underlying = _isAaveToken(fromToken); if (underlying != IERC20(-1)) { IAaveToken(address(fromToken)).redeem(amount); return _aaveSwap( underlying, toToken, amount, distribution, disableFlags ); } underlying = _isAaveToken(toToken); if (underlying != IERC20(-1)) { super._swap( fromToken, underlying, amount, distribution, disableFlags ); uint256 underlyingAmount = underlying.universalBalanceOf(address(this)); _infiniteApproveIfNeeded(underlying, aave.core()); aave.deposit.value(underlying.isETH() ? underlyingAmount : 0)( underlying.isETH() ? ETH_ADDRESS : underlying, underlyingAmount, 1101 ); return; } } return super._swap( fromToken, toToken, amount, distribution, disableFlags ); } } // File: contracts/OneSplit.sol pragma solidity ^0.5.0; //import "./OneSplitSmartToken.sol"; contract OneSplitView is IOneSplitView, OneSplitBaseView, OneSplitMultiPathView, OneSplitChaiView, OneSplitBdaiView, OneSplitAaveView, OneSplitFulcrumView, OneSplitCompoundView, OneSplitIearnView //OneSplitSmartTokenView { function getExpectedReturn( IERC20 fromToken, IERC20 toToken, uint256 amount, uint256 parts, uint256 disableFlags // 1 - Uniswap, 2 - Kyber, 4 - Bancor, 8 - Oasis, 16 - Compound, 32 - Fulcrum, 64 - Chai, 128 - Aave, 256 - SmartToken, 1024 - bDAI ) public view returns( uint256 returnAmount, uint256[] memory distribution // [Uniswap, Kyber, Bancor, Oasis] ) { if (fromToken == toToken) { return (amount, new uint256[](4)); } return super.getExpectedReturn( fromToken, toToken, amount, parts, disableFlags ); } } contract OneSplit is IOneSplit, OneSplitBase, OneSplitMultiPath, OneSplitChai, OneSplitBdai, OneSplitAave, OneSplitFulcrum, OneSplitCompound, OneSplitIearn //OneSplitSmartToken { IOneSplitView public oneSplitView; constructor(IOneSplitView _oneSplitView) public { oneSplitView = _oneSplitView; } function getExpectedReturn( IERC20 fromToken, IERC20 toToken, uint256 amount, uint256 parts, uint256 disableFlags // 1 - Uniswap, 2 - Kyber, 4 - Bancor, 8 - Oasis, 16 - Compound, 32 - Fulcrum, 64 - Chai, 128 - Aave, 256 - SmartToken, 1024 - bDAI ) public view returns( uint256 returnAmount, uint256[] memory distribution // [Uniswap, Kyber, Bancor, Oasis] ) { return oneSplitView.getExpectedReturn( fromToken, toToken, amount, parts, disableFlags ); } function swap( IERC20 fromToken, IERC20 toToken, uint256 amount, uint256 minReturn, uint256[] memory distribution, // [Uniswap, Kyber, Bancor, Oasis] uint256 disableFlags // 16 - Compound, 32 - Fulcrum, 64 - Chai, 128 - Aave, 256 - SmartToken, 1024 - bDAI ) public payable { fromToken.universalTransferFrom(msg.sender, address(this), amount); _swap(fromToken, toToken, amount, distribution, disableFlags); uint256 returnAmount = toToken.universalBalanceOf(address(this)); require(returnAmount >= minReturn, "OneSplit: actual return amount is less than minReturn"); toToken.universalTransfer(msg.sender, returnAmount); fromToken.universalTransfer(msg.sender, fromToken.universalBalanceOf(address(this))); } function _swap( IERC20 fromToken, IERC20 toToken, uint256 amount, uint256[] memory distribution, // [Uniswap, Kyber, Bancor, Oasis] uint256 disableFlags // 16 - Compound, 32 - Fulcrum, 64 - Chai, 128 - Aave, 256 - SmartToken, 1024 - bDAI ) internal { if (fromToken == toToken) { return; } return super._swap( fromToken, toToken, amount, distribution, disableFlags ); } function goodSwap( IERC20 fromToken, IERC20 toToken, uint256 amount, uint256 minReturn, uint256 parts, uint256 disableFlags // 1 - Uniswap, 2 - Kyber, 4 - Bancor, 8 - Oasis, 16 - Compound, 32 - Fulcrum, 64 - Chai, 128 - Aave, 256 - SmartToken, 1024 - bDAI ) public payable { (, uint256[] memory distribution) = getExpectedReturn( fromToken, toToken, amount, parts, disableFlags ); swap( fromToken, toToken, amount, minReturn, distribution, disableFlags ); } // DEPERECATED: function getAllRatesForDEX( IERC20 fromToken, IERC20 toToken, uint256 amount, uint256 parts, uint256 disableFlags ) public view returns(uint256[] memory results) { results = new uint256[](parts); for (uint i = 0; i < parts; i++) { (results[i],) = getExpectedReturn( fromToken, toToken, amount.mul(i + 1).div(parts), 1, disableFlags ); } } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"constant":true,"inputs":[],"name":"ETH_ADDRESS","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"FLAG_AAVE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"FLAG_BANCOR","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"FLAG_BDAI","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"FLAG_CHAI","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"FLAG_COMPOUND","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"FLAG_FULCRUM","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"FLAG_IEARN","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"FLAG_KYBER","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"FLAG_KYBER_BANCOR_RESERVE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"FLAG_KYBER_OASIS_RESERVE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"FLAG_KYBER_UNISWAP_RESERVE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"FLAG_MULTI_PATH_ETH","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"FLAG_OASIS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"FLAG_SMART_TOKEN","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"FLAG_UNISWAP","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"contract IKyberNetworkContract","name":"kyberNetworkContract","type":"address"},{"internalType":"contract IERC20","name":"fromToken","type":"address"},{"internalType":"contract IERC20","name":"toToken","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"disableFlags","type":"uint256"}],"name":"_calculateKyberReturnWithEth","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"contract IERC20","name":"fromToken","type":"address"},{"internalType":"contract IERC20","name":"toToken","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"parts","type":"uint256"},{"internalType":"uint256","name":"disableFlags","type":"uint256"}],"name":"_fulcrumGetExpectedReturn","outputs":[{"internalType":"uint256","name":"returnAmount","type":"uint256"},{"internalType":"uint256[]","name":"distribution","type":"uint256[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"contract IERC20","name":"token","type":"address"}],"name":"_isAaveToken","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"contract IERC20","name":"token","type":"address"}],"name":"_isFulcrumToken","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"aave","outputs":[{"internalType":"contract IAaveLendingPool","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"bancorContractRegistry","outputs":[{"internalType":"contract IBancorContractRegistry","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"bancorEtherToken","outputs":[{"internalType":"contract IBancorEtherToken","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"bdai","outputs":[{"internalType":"contract IBdai","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"btu","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"cETH","outputs":[{"internalType":"contract ICompoundEther","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"contract IERC20","name":"fromToken","type":"address"},{"internalType":"contract IERC20","name":"toToken","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"calculateBancorReturn","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"contract IERC20","name":"fromToken","type":"address"},{"internalType":"contract IERC20","name":"toToken","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"disableFlags","type":"uint256"}],"name":"calculateKyberReturn","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"contract IERC20","name":"fromToken","type":"address"},{"internalType":"contract IERC20","name":"toToken","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"calculateOasisReturn","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"contract IERC20","name":"fromToken","type":"address"},{"internalType":"contract IERC20","name":"toToken","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"calculateUniswapReturn","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"chai","outputs":[{"internalType":"contract IChai","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"compound","outputs":[{"internalType":"contract ICompound","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"dai","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"contract IERC20","name":"fromToken","type":"address"},{"internalType":"contract IERC20","name":"toToken","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"parts","type":"uint256"},{"internalType":"uint256","name":"disableFlags","type":"uint256"}],"name":"getExpectedReturn","outputs":[{"internalType":"uint256","name":"returnAmount","type":"uint256"},{"internalType":"uint256[]","name":"distribution","type":"uint256[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"kyberNetworkProxy","outputs":[{"internalType":"contract IKyberNetworkProxy","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"log","outputs":[],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"oasisExchange","outputs":[{"internalType":"contract IOasisExchange","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"uniswapFactory","outputs":[{"internalType":"contract IUniswapFactory","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"wethToken","outputs":[{"internalType":"contract IWETH","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"}]
Contract Creation Code
6080604052600080546001600160a01b0319908116736b175474e89094c44da98b954eedeac495271d0f1790915560018054821673c02aaa39b223fe8d0a0e5c4f27ead9083c756cc217905560028054821673c0829421c1d260bd3cb3e0f06cfe2d52db2ce31517905560038054821673818e6fecd516ecc3849daf6845e3ec868087b75517905560048054821673c0a47dfe034b400b47bdad5fecda2621de6c4d951790556005805482167352ae12abe5d8bd778bd5397f99ca900624cfadd4179055600680548216736f0cd8c4f6f06eab664c7e3031909452b4b7286117905560078054821673794e6e91555438afc3ccf1c5076a74f42133d08d1790556008805482167306af07097c9eeb7fd685c692751d5c66db49c215179055600980548216736a4ffaafa8dd400676df8076ad6c724867b0e2e8179055600a8054821673b683d83a532e2cb7dfa5275eed3698436371cc9f179055600b8054821673398ec7346dcd622edc5ae82352f02be94c62d119179055600c80548216733d9819210a31b4961b30ef54be2aed79b9c9cd3b179055600d8054909116734ddc2d193948926d02f9b1fe9e1daa0718270ed51790553480156101c057600080fd5b50613adf806101d06000396000f3fe608060405234801561001057600080fd5b506004361061023d5760003560e01c80638bdb2afa1161013b578063d77366a4116100b8578063f4b9fa751161007c578063f4b9fa751461055b578063f64a9a4914610563578063f69e20461461056b578063f82c50f114610573578063fe0cb97e146105925761023d565b8063d77366a4146104cb578063db45bced146104d3578063df9116631461050f578063eb16df2a14610517578063edb2fedf1461051f5761023d565b8063b69d0456116100ff578063b69d04561461043b578063c11f4f1114610443578063cd23c63d1461044b578063ceb5411514610487578063d15b3c9c1461048f5761023d565b80638bdb2afa146104135780638c6c11f21461041b578063a1b4d01114610423578063a734f06e1461042b578063a9d3589f146104335761023d565b80635cfcee28116101c9578063767076e41161018d578063767076e4146103b1578063819faf7b146103f357806383366577146103fb57806383a0118f14610403578063851954fa1461040b5761023d565b80635cfcee281461036b5780636b5a4ca214610373578063702bf8fa1461037b57806372b6f1bf1461038357806373eb69d4146103a95761023d565b80633c1a62dc116102105780633c1a62dc146103255780634037f9671461032d5780634b57b0be146103535780634c914a4e1461035b57806358886253146103635761023d565b8063085e2c5b1461024257806311c0c0f7146102df57806312dea160146102f95780631388b4201461031d575b600080fd5b610284600480360360a081101561025857600080fd5b506001600160a01b038135811691602081013590911690604081013590606081013590608001356105d4565b6040518083815260200180602001828103825283818151815260200191508051906020019060200280838360005b838110156102ca5781810151838201526020016102b2565b50505050905001935050505060405180910390f35b6102e7610638565b60408051918252519081900360200190f35b61030161063e565b604080516001600160a01b039092168252519081900360200190f35b61030161064d565b6102e761065c565b6103016004803603602081101561034357600080fd5b50356001600160a01b0316610661565b6103016109d9565b6102e76109e8565b6102e76109ed565b6102e76109f3565b6103016109f8565b6102e7610a07565b6103016004803603602081101561039957600080fd5b50356001600160a01b0316610a10565b6102e7610c60565b610284600480360360a08110156103c757600080fd5b506001600160a01b03813581169160208101359091169060408101359060608101359060800135610c66565b610301610e54565b6102e7610e63565b6102e7610e68565b610301610e6e565b610301610e7d565b6102e7610e8c565b610301610e91565b610301610ea0565b6102e7610eb8565b610301610ec1565b610301610ed0565b6102e76004803603608081101561046157600080fd5b506001600160a01b03813581169160208101359091169060408101359060600135610edf565b6102e7611073565b6102e7600480360360808110156104a557600080fd5b506001600160a01b03813581169160208101359091169060408101359060600135611078565b610301611227565b6102e7600480360360808110156104e957600080fd5b506001600160a01b03813581169160208101359091169060408101359060600135611236565b6102e76115d5565b6102e76115de565b6102e76004803603608081101561053557600080fd5b506001600160a01b038135811691602081013590911690604081013590606001356115e3565b610301611975565b6102e7611984565b610301611989565b6105906004803603602081101561058957600080fd5b5035611998565b005b6102e7600480360360a08110156105a857600080fd5b506001600160a01b0381358116916020810135821691604082013516906060810135906080013561199b565b60006060856001600160a01b0316876001600160a01b0316141561061c5760408051600480825260a0820190925286916020820160808038833901905050909250905061062e565b6106298787878787611fec565b915091505b9550959350505050565b61010081565b6005546001600160a01b031681565b6007546001600160a01b031681565b602081565b6000610675826001600160a01b0316611ffd565b1561068357506000196109d4565b60408051600481526024810182526020810180516001600160e01b03166306fdde0360e01b178152915181516000936060936001600160a01b0388169361138893919290918291908083835b602083106106ee5780518252601f1990920191602091820191016106cf565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303818686fa925050503d806000811461074f576040519150601f19603f3d011682016040523d82523d6000602084013e610754565b606091505b50915091508161076a57600019925050506109d4565b6000805b60078351038110156108c35782816000018151811061078957fe5b6020910101516001600160f81b031916602360f91b1480156107cc57508281600101815181106107b557fe5b6020910101516001600160f81b031916607560f81b145b80156107f957508281600201815181106107e257fe5b6020910101516001600160f81b031916601b60fa1b145b8015610826575082816003018151811061080f57fe5b6020910101516001600160f81b031916606360f81b145b8015610853575082816004018151811061083c57fe5b6020910101516001600160f81b031916603960f91b145b8015610880575082816005018151811061086957fe5b6020910101516001600160f81b031916607560f81b145b80156108ad575082816006018151811061089657fe5b6020910101516001600160f81b031916606d60f81b145b156108bb57600191506108c3565b60010161076e565b50806108d65760001993505050506109d4565b60408051600481526024810182526020810180516001600160e01b031663797bf38560e01b178152915181516001600160a01b038916936113889392918291908083835b602083106109395780518252601f19909201916020918201910161091a565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303818686fa925050503d806000811461099a576040519150601f19603f3d011682016040523d82523d6000602084013e61099f565b606091505b509093509150826109b75760001993505050506109d4565b8180602001905160208110156109cc57600080fd5b505193505050505b919050565b6001546001600160a01b031681565b604081565b61020081565b601081565b600a546001600160a01b031681565b64010000000081565b6000610a24826001600160a01b0316611ffd565b15610a3257506000196109d4565b60408051600481526024810182526020810180516001600160e01b03166306fdde0360e01b178152915181516000936060936001600160a01b0388169361138893919290918291908083835b60208310610a9d5780518252601f199092019160209182019101610a7e565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303818686fa925050503d8060008114610afe576040519150601f19603f3d011682016040523d82523d6000602084013e610b03565b606091505b509150915081610b1957600019925050506109d4565b6000805b6004835103811015610beb57828160000181518110610b3857fe5b6020910101516001600160f81b031916604160f81b148015610b7b5750828160010181518110610b6457fe5b6020910101516001600160f81b031916606160f81b145b8015610ba85750828160020181518110610b9157fe5b6020910101516001600160f81b031916603b60f91b145b8015610bd55750828160030181518110610bbe57fe5b6020910101516001600160f81b031916606560f81b145b15610be35760019150610beb565b600101610b1d565b5080610bfe5760001993505050506109d4565b60408051600481526024810182526020810180516001600160e01b0316632274683f60e21b178152915181516001600160a01b03891693611388939291829190808383602083106109395780518252601f19909201916020918201910161091a565b61080081565b60006060856001600160a01b0316876001600160a01b03161415610cae5760408051600480825260a0820190925286916020820160808038833901905050909250905061062e565b610cbf83602063ffffffff61203716565b15610e47576000610ccf88610661565b90506001600160a01b0380821614610d89576000886001600160a01b0316637ff9b5966040518163ffffffff1660e01b815260040160206040518083038186803b158015610d1c57600080fd5b505afa158015610d30573d6000803e3d6000fd5b505050506040513d6020811015610d4657600080fd5b50519050610d7e8289610d77670de0b6b3a7640000610d6b8c8763ffffffff61203c16565b9063ffffffff61209c16565b8989610c66565b93509350505061062e565b610d9287610661565b90506001600160a01b0380821614610e45576000876001600160a01b0316637ff9b5966040518163ffffffff1660e01b815260040160206040518083038186803b158015610ddf57600080fd5b505afa158015610df3573d6000803e3d6000fd5b505050506040513d6020811015610e0957600080fd5b50519050610e1a89838989896120de565b9094509250610e3b81610d6b86670de0b6b3a764000063ffffffff61203c16565b935061062e915050565b505b61062987878787876120de565b600b546001600160a01b031681565b608081565b61040081565b6002546001600160a01b031681565b6004546001600160a01b031681565b600881565b600d546001600160a01b031681565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee81565b64040000000081565b6008546001600160a01b031681565b6009546001600160a01b031681565b60075460009081906060906001600160a01b03908116906207a12090630a2513a960e11b90610f0f908a16611ffd565b610f195788610f26565b6001546001600160a01b03165b610f388b6001600160a01b0316611ffd565b610f42578a610f4f565b6001546001600160a01b03165b604080516001600160a01b03938416602482015291909216604482015260648082018b905282518083039091018152608490910182526020810180516001600160e01b03166001600160e01b031990941693909317835290518151919290918291908083835b60208310610fd45780518252601f199092019160209182019101610fb5565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303818686fa925050503d8060008114611035576040519150601f19603f3d011682016040523d82523d6000602084013e61103a565b606091505b50915091508161104f5760009250505061106b565b80806020019051602081101561106457600080fd5b5051925050505b949350505050565b600281565b60035460408051600481526024810182526020810180516001600160e01b0316634f61ff8b60e01b1781529151815160009485946060946001600160a01b03909216936108fc93909182918083835b602083106110e65780518252601f1990920191602091820191016110c7565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303818686fa925050503d8060008114611147576040519150601f19603f3d011682016040523d82523d6000602084013e61114c565b606091505b5091509150816111615760009250505061106b565b600081806020019051602081101561117857600080fd5b5051905061118e6001600160a01b038916611ffd565b806111a657506111a6876001600160a01b0316611ffd565b156111c2576111b8818989898961199b565b935050505061106b565b60006111e5828a73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee8a8a61199b565b9050806111f957600094505050505061106b565b61121a8273eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee8a848a61199b565b9998505050505050505050565b6003546001600160a01b031681565b60055460408051632ecd14d360e21b81526c42616e636f724e6574776f726b60981b6004820152905160009283926001600160a01b039091169163bb34534c91602480820192602092909190829003018186803b15801561129657600080fd5b505afa1580156112aa573d6000803e3d6000fd5b505050506040513d60208110156112c057600080fd5b50516006549091506060906001600160a01b03908116906375e1cc82906112e8908a16611ffd565b6112f257886112ff565b6002546001600160a01b03165b611311896001600160a01b0316611ffd565b61131b5788611328565b6002546001600160a01b03165b6040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b03168152602001826001600160a01b03166001600160a01b031681526020019250505060006040518083038186803b15801561138757600080fd5b505afa15801561139b573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405260208110156113c457600080fd5b81019080805160405193929190846401000000008211156113e457600080fd5b9083019060208201858111156113f957600080fd5b825186602082028301116401000000008211171561141657600080fd5b82525081516020918201928201910280838360005b8381101561144357818101518382015260200161142b565b50505050905001604052505050905060006060836001600160a01b03166207a120856001600160a01b0316630c8496cc905060e01b858a6040516024018080602001838152602001828103825284818151815260200191508051906020019060200280838360005b838110156114c35781810151838201526020016114ab565b505050509050019350505050604051602081830303815290604052906001600160e01b0319166020820180516001600160e01b0383818316178352505050506040518082805190602001908083835b602083106115315780518252601f199092019160209182019101611512565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303818686fa925050503d8060008114611592576040519150601f19603f3d011682016040523d82523d6000602084013e611597565b606091505b5091509150816115ae57600094505050505061106b565b60008180602001905160408110156115c557600080fd5b50519a9950505050505050505050565b64020000000081565b600181565b6000826115f86001600160a01b038716611ffd565b6117a95760048054604080516303795fb160e11b81526001600160a01b038a8116948201949094529051600093909216916306f2bf6291602480820192602092909190829003018186803b15801561164f57600080fd5b505afa158015611663573d6000803e3d6000fd5b505050506040513d602081101561167957600080fd5b505190506001600160a01b038116156117a25760408051602480820185905282518083039091018152604490910182526020810180516001600160e01b03166395b68fe760e01b178152915181516000936060936001600160a01b0387169362030d4093919290918291908083835b602083106117075780518252601f1990920191602091820191016116e8565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303818686fa925050503d8060008114611768576040519150601f19603f3d011682016040523d82523d6000602084013e61176d565b606091505b509150915081156117965780806020019051602081101561178d57600080fd5b5051935061179b565b600093505b50506117a7565b600091505b505b6117bb856001600160a01b0316611ffd565b61196c5760048054604080516303795fb160e11b81526001600160a01b03898116948201949094529051600093909216916306f2bf6291602480820192602092909190829003018186803b15801561181257600080fd5b505afa158015611826573d6000803e3d6000fd5b505050506040513d602081101561183c57600080fd5b505190506001600160a01b038116156119655760408051602480820185905282518083039091018152604490910182526020810180516001600160e01b031663cd7724c360e01b178152915181516000936060936001600160a01b0387169362030d4093919290918291908083835b602083106118ca5780518252601f1990920191602091820191016118ab565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303818686fa925050503d806000811461192b576040519150601f19603f3d011682016040523d82523d6000602084013e611930565b606091505b509150915081156119595780806020019051602081101561195057600080fd5b5051935061195e565b600093505b505061196a565b600091505b505b95945050505050565b6000546001600160a01b031681565b600481565b600c546001600160a01b031681565b50565b60006119af856001600160a01b0316611ffd565b806119c757506119c7846001600160a01b0316611ffd565b611a18576040805162461bcd60e51b815260206004820152601f60248201527f4f6e65206f662074686520746f6b656e732073686f756c642062652045544800604482015290519081900360640190fd5b600060606001600160a01b03808916906216e36090630611aecb60e11b90611a41908b16611ffd565b611a4b5789611a61565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee5b611a738a6001600160a01b0316611ffd565b611a7d5789611a93565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee5b604080516001600160a01b039384166024820152919092166044820152606481018a905260016084808301919091528251808303909101815260a490910182526020810180516001600160e01b03166001600160e01b031990941693909317835290518151919290918291908083835b60208310611b225780518252601f199092019160209182019101611b03565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303818686fa925050503d8060008114611b83576040519150601f19603f3d011682016040523d82523d6000602084013e611b88565b606091505b509150915081611b9d5760009250505061196c565b600080828060200190516040811015611bb557600080fd5b50805160209091015190925090507331e085afd48a1d6e51cc193153d625e8f0514c7f6001600160a01b038316148015611bff5750611bff8664010000000063ffffffff6120ef16565b80611c415750731e158c0e93c30d24e918ef83d1e0be23595c3c0f6001600160a01b038316148015611c415750611c418664020000000063ffffffff6120ef16565b80611c83575073053aa84fcc676113a57e0ebb0bd1913839874be46001600160a01b038316148015611c835750611c838664040000000063ffffffff6120ef16565b15611c9557600094505050505061196c565b611caa8664010000000063ffffffff6120ef16565b15611d905760408051600481526024810182526020810180516001600160e01b03166345ed957d60e11b178152915181516001600160a01b038616936108fc9392918291908083835b60208310611d125780518252601f199092019160209182019101611cf3565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303818686fa925050503d8060008114611d73576040519150601f19603f3d011682016040523d82523d6000602084013e611d78565b606091505b50909450508315611d9057600094505050505061196c565b611da58664020000000063ffffffff6120ef16565b15611e8b5760408051600481526024810182526020810180516001600160e01b0316630dad878f60e21b178152915181516001600160a01b038616936108fc9392918291908083835b60208310611e0d5780518252601f199092019160209182019101611dee565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303818686fa925050503d8060008114611e6e576040519150601f19603f3d011682016040523d82523d6000602084013e611e73565b606091505b50909450508315611e8b57600094505050505061196c565b611ea08664040000000063ffffffff6120ef16565b15611f865760408051600481526024810182526020810180516001600160e01b0316634d21dff760e01b178152915181516001600160a01b038616936108fc9392918291908083835b60208310611f085780518252601f199092019160209182019101611ee9565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303818686fa925050503d8060008114611f69576040519150601f19603f3d011682016040523d82523d6000602084013e611f6e565b606091505b50909450508315611f8657600094505050505061196c565b611fde670de0b6b3a7640000610d6b611fa78c6001600160a01b03166120fb565b600a0a610d6b611fbf8d6001600160a01b03166120fb565b600a0a611fd2878e63ffffffff61203c16565b9063ffffffff61203c16565b9a9950505050505050505050565b6000606061062987878787876122e9565b60006001600160a01b038216158061203157506001600160a01b03821673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee145b92915050565b161590565b60008261204b57506000612031565b8282028284828161205857fe5b04146120955760405162461bcd60e51b8152600401808060200182810382526021815260200180613a8a6021913960400191505060405180910390fd5b9392505050565b600061209583836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250612705565b6000606061062987878787876127a7565b60006120958383612037565b600061210682611ffd565b15612113575060126109d4565b60408051600481526024810182526020810180516001600160e01b031663313ce56760e01b178152915181516000936060936001600160a01b0388169361138893919290918291908083835b6020831061217e5780518252601f19909201916020918201910161215f565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303818686fa925050503d80600081146121df576040519150601f19603f3d011682016040523d82523d6000602084013e6121e4565b606091505b5091509150816122be5760408051600481526024810182526020810180516001600160e01b0316632e0f262560e01b178152915181516001600160a01b038816936113889392918291908083835b602083106122515780518252601f199092019160209182019101612232565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303818686fa925050503d80600081146122b2576040519150601f19603f3d011682016040523d82523d6000602084013e6122b7565b606091505b5090925090505b816122ca57601261106b565b8080602001905160208110156122df57600080fd5b5051949350505050565b60006060856001600160a01b0316876001600160a01b031614156123315760408051600480825260a0820190925286916020820160808038833901905050909250905061062e565b612339613a23565b61234161284e565b90506123558461080063ffffffff61203716565b156126e95760005b60068110156125155781816006811061237257fe5b60200201516001600160a01b0316896001600160a01b0316141561250d57610d7e82826006811061239f57fe5b60200201516001600160a01b031663fc0c546a6040518163ffffffff1660e01b815260040160206040518083038186803b1580156123dc57600080fd5b505afa1580156123f0573d6000803e3d6000fd5b505050506040513d602081101561240657600080fd5b50518961250685856006811061241857fe5b60200201516001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b15801561245557600080fd5b505afa158015612469573d6000803e3d6000fd5b505050506040513d602081101561247f57600080fd5b5051610d6b87876006811061249057fe5b60200201516001600160a01b0316637137ef996040518163ffffffff1660e01b815260040160206040518083038186803b1580156124cd57600080fd5b505afa1580156124e1573d6000803e3d6000fd5b505050506040513d60208110156124f757600080fd5b50518d9063ffffffff61203c16565b89896122e9565b60010161235d565b5060005b60068110156126e75781816006811061252e57fe5b60200201516001600160a01b0316886001600160a01b031614156126df57600060606125d18b85856006811061256057fe5b60200201516001600160a01b031663fc0c546a6040518163ffffffff1660e01b815260040160206040518083038186803b15801561259d57600080fd5b505afa1580156125b1573d6000803e3d6000fd5b505050506040513d60208110156125c757600080fd5b50518b8b8b6128ff565b915091506126d28484600681106125e457fe5b60200201516001600160a01b0316637137ef996040518163ffffffff1660e01b815260040160206040518083038186803b15801561262157600080fd5b505afa158015612635573d6000803e3d6000fd5b505050506040513d602081101561264b57600080fd5b5051610d6b86866006811061265c57fe5b60200201516001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b15801561269957600080fd5b505afa1580156126ad573d6000803e3d6000fd5b505050506040513d60208110156126c357600080fd5b5051859063ffffffff61203c16565b9550935061062e92505050565b600101612519565b505b6126f688888888886128ff565b92509250509550959350505050565b600081836127915760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561275657818101518382015260200161273e565b50505050905090810190601f1680156127835780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b50600083858161279d57fe5b0495945050505050565b60006060856001600160a01b0316876001600160a01b031614156127cd5784915061062e565b6127de83608063ffffffff61203716565b156128415760006127ee88610a10565b90506001600160a01b03808216146128175761280d81888888886127a7565b925092505061062e565b61282087610a10565b90506001600160a01b038082161461283f5761280d8882888888612910565b505b6106298787878787612910565b612856613a23565b506040805160c0810182527316de59092dae5ccf4a1e6439d611fd0653f0bd0181527304aa51bbcb46541455ccf1b8bef2ebc5d3787ec960208201527373a052500105205d34daf004eab301916da8190f918101919091527383f798e925bcd4017eb265844fddabb448f1707d606082015273d6ad7a6750a7593e092a9b218d66c0a814a3436e608082015273f61718057901f84c4eec4339ef8f0d86d2b4560060a082015290565b6000606061062987878787876129e4565b60006060856001600160a01b0316876001600160a01b031614156129585760408051600480825260a0820190925286916020820160808038833901905050909250905061062e565b61296a8361040063ffffffff61203716565b156129d7576009546001600160a01b03888116911614156129a75760005461299e906001600160a01b031687878787612bb0565b9150915061062e565b6009546001600160a01b03878116911614156129d75760005461299e9088906001600160a01b0316878787612bb0565b6106298787878787612bb0565b60006060856001600160a01b0316876001600160a01b03161415612a2c5760408051600480825260a0820190925286916020820160808038833901905050909250905061062e565b612a3d83601063ffffffff61203716565b15612ba357612a4b87612cb9565b15612b00576000612a5b88612dec565b90506001600160a01b0380821614612afe576000886001600160a01b031663182df0f56040518163ffffffff1660e01b815260040160206040518083038186803b158015612aa857600080fd5b505afa158015612abc573d6000803e3d6000fd5b505050506040513d6020811015612ad257600080fd5b50519050610d7e8289612af7670de0b6b3a7640000610d6b8c8763ffffffff61203c16565b89896129e4565b505b612b0986612cb9565b15612ba3576000612b1987612dec565b90506001600160a01b0380821614612ba1576000876001600160a01b031663182df0f56040518163ffffffff1660e01b815260040160206040518083038186803b158015612b6657600080fd5b505afa158015612b7a573d6000803e3d6000fd5b505050506040513d6020811015612b9057600080fd5b50519050610e1a8983898989612ef4565b505b6106298787878787612ef4565b60006060856001600160a01b0316876001600160a01b03161415612bf85760408051600480825260a0820190925286916020820160808038833901905050909250905061062e565b612c0983604063ffffffff61203716565b15612cac576008546001600160a01b0388811691161415612c545760005460085461299e916001600160a01b03908116918991612c4d91168963ffffffff612f0516565b8787613019565b6008546001600160a01b0387811691161415612cac57600054612c849088906001600160a01b0316878787613019565b6008549193509150612ca5906001600160a01b03168363ffffffff61318016565b915061062e565b6106298787878787613019565b600d546000906001600160a01b0383811691161415612cda575060016109d4565b600c54604080516001600160a01b0385811660248084019190915283518084039091018152604490920183526020820180516001600160e01b0316638e8f294b60e01b17815292518251600095606095931693611388939092918291908083835b60208310612d5a5780518252601f199092019160209182019101612d3b565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303818686fa925050503d8060008114612dbb576040519150601f19603f3d011682016040523d82523d6000602084013e612dc0565b606091505b509150915081612dd5576000925050506109d4565b60008180602001905160408110156109cc57600080fd5b600d546000906001600160a01b0383811691161415612e0d575060006109d4565b60408051600481526024810182526020810180516001600160e01b0316636f307dc360e01b178152915181516000936060936001600160a01b0388169361138893919290918291908083835b60208310612e785780518252601f199092019160209182019101612e59565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303818686fa925050503d8060008114612ed9576040519150601f19603f3d011682016040523d82523d6000602084013e612ede565b606091505b5091509150816122ca57600019925050506109d4565b600060606106298787878787610c66565b60008073197e90f9fad81970ba7976f33cbd77088e5d7cf76001600160a01b03166320aba08b6040518163ffffffff1660e01b815260040160206040518083038186803b158015612f5557600080fd5b505afa158015612f69573d6000803e3d6000fd5b505050506040513d6020811015612f7f57600080fd5b505142116130055773197e90f9fad81970ba7976f33cbd77088e5d7cf76001600160a01b031663c92aecc46040518163ffffffff1660e01b815260040160206040518083038186803b158015612fd457600080fd5b505afa158015612fe8573d6000803e3d6000fd5b505050506040513d6020811015612ffe57600080fd5b505161300d565b61300d613294565b905061106b8184613423565b60006060856001600160a01b0316876001600160a01b031614156130615760408051600480825260a0820190925286916020820160808038833901905050909250905061062e565b613073876001600160a01b0316611ffd565b15801561308f575061308d866001600160a01b0316611ffd565b155b80156130aa57506130a88361020063ffffffff6120ef16565b155b15613173576130d38773eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee87876004881761344b565b909250905060606130fe73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee8885886004891761344b565b909350905060005b825181101561316b5761314c600883838151811061312057fe5b6020026020010151901b84838151811061313657fe5b602002602001015161382690919063ffffffff16565b83828151811061315857fe5b6020908102919091010152600101613106565b5061062e9050565b610629878787878761344b565b60008073197e90f9fad81970ba7976f33cbd77088e5d7cf76001600160a01b03166320aba08b6040518163ffffffff1660e01b815260040160206040518083038186803b1580156131d057600080fd5b505afa1580156131e4573d6000803e3d6000fd5b505050506040513d60208110156131fa57600080fd5b505142116132805773197e90f9fad81970ba7976f33cbd77088e5d7cf76001600160a01b031663c92aecc46040518163ffffffff1660e01b815260040160206040518083038186803b15801561324f57600080fd5b505afa158015613263573d6000803e3d6000fd5b505050506040513d602081101561327957600080fd5b5051613288565b613288613294565b905061106b8382613880565b600061341e6133a073197e90f9fad81970ba7976f33cbd77088e5d7cf76001600160a01b031663487bf0826040518163ffffffff1660e01b815260040160206040518083038186803b1580156132e957600080fd5b505afa1580156132fd573d6000803e3d6000fd5b505050506040513d602081101561331357600080fd5b5051604080516320aba08b60e01b8152905173197e90f9fad81970ba7976f33cbd77088e5d7cf7916320aba08b916004808301926020929190829003018186803b15801561336057600080fd5b505afa158015613374573d6000803e3d6000fd5b505050506040513d602081101561338a57600080fd5b505142036b033b2e3c9fd0803ce8000000613899565b73197e90f9fad81970ba7976f33cbd77088e5d7cf76001600160a01b031663c92aecc46040518163ffffffff1660e01b815260040160206040518083038186803b1580156133ed57600080fd5b505afa158015613401573d6000803e3d6000fd5b505050506040513d602081101561341757600080fd5b5051613423565b905090565b60006b033b2e3c9fd0803ce800000061343c8484613958565b8161344357fe5b049392505050565b60408051600480825260a082019092526000916060919060208201608080388339019050509050856001600160a01b0316876001600160a01b031614156134945784915061062e565b61349c613a41565b6040805160808101909152806134b986600163ffffffff61397c16565b6134c5576115e36134c9565b6139825b67ffffffffffffffff1681526020016134e986600263ffffffff61397c16565b6134f5576110786134f9565b6139825b67ffffffffffffffff16815260200161351986600463ffffffff61397c16565b61352557611236613529565b6139825b67ffffffffffffffff16815260200161354986600863ffffffff61397c16565b61355557610edf613559565b6139825b67ffffffffffffffff169052905061356f613a69565b613577613a69565b60005b6004811015613650576135b28b8b6135988c8c63ffffffff61209c16565b8a8886600481106135a557fe5b602002015163ffffffff16565b8382600481106135be57fe5b60200201523063f82c50f18483600481106135d557fe5b60200201516040518263ffffffff1660e01b81526004018082815260200191505060006040518083038186803b15801561360e57600080fd5b505afa158015613622573d6000803e3d6000fd5b5050505082816004811061363257fe5b602002015182826004811061364357fe5b602002015260010161357a565b5060005b8781101561381857600060015b600481101561369e5784826004811061367657fe5b602002015185826004811061368757fe5b60200201511115613696578091505b600101613661565b506136c08482600481106136ae57fe5b6020020151889063ffffffff61382616565b96508581815181106136ce57fe5b6020026020010180518091906001018152505060008a90508983600101101561380e5760006137328e8e6137258e610d6b8d898151811061370b57fe5b60200260200101516001018861203c90919063ffffffff16565b8d8b88600481106135a557fe5b905084836004811061374057fe5b60200201518111156137835761376d85846004811061375b57fe5b6020020151829063ffffffff61398c16565b86846004811061377957fe5b6020020152613797565b600086846004811061379157fe5b60200201525b3063f82c50f18785600481106137a957fe5b60200201516040518263ffffffff1660e01b81526004018082815260200191505060006040518083038186803b1580156137e257600080fd5b505afa1580156137f6573d6000803e3d6000fd5b505050508085846004811061380757fe5b6020020152505b5050600101613654565b505050509550959350505050565b600082820183811015612095576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b60008161343c846b033b2e3c9fd0803ce8000000613958565b600083801561393a576001841680156138b4578592506138b8565b8392505b50600283046002850494505b84156139345785860286878204146138db57600080fd5b818101818110156138eb57600080fd5b8581049750600287061561392757878502858982041415891515161561391057600080fd5b8381018181101561392057600080fd5b8790049550505b50506002850494506138c4565b50613950565b83801561394a576000925061394e565b8392505b505b509392505050565b60008115806139735750508082028282828161397057fe5b04145b61203157600080fd5b16151590565b6000949350505050565b600061209583836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f77000081525060008184841115613a1b5760405162461bcd60e51b815260206004820181815283516024840152835190928392604490910191908501908083836000831561275657818101518382015260200161273e565b505050900390565b6040518060c001604052806006906020820280388339509192915050565b60405180608001604052806004905b613a87815260200190600190039081613a505790505090565b60405180608001604052806004906020820280388339509192915050565bfefe536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f77a265627a7a723158208cee42a0167b5da81b5e7a59bfa276d568ca3df48b74a449017376998977646b64736f6c63430005100032
Deployed Bytecode
0x608060405234801561001057600080fd5b506004361061023d5760003560e01c80638bdb2afa1161013b578063d77366a4116100b8578063f4b9fa751161007c578063f4b9fa751461055b578063f64a9a4914610563578063f69e20461461056b578063f82c50f114610573578063fe0cb97e146105925761023d565b8063d77366a4146104cb578063db45bced146104d3578063df9116631461050f578063eb16df2a14610517578063edb2fedf1461051f5761023d565b8063b69d0456116100ff578063b69d04561461043b578063c11f4f1114610443578063cd23c63d1461044b578063ceb5411514610487578063d15b3c9c1461048f5761023d565b80638bdb2afa146104135780638c6c11f21461041b578063a1b4d01114610423578063a734f06e1461042b578063a9d3589f146104335761023d565b80635cfcee28116101c9578063767076e41161018d578063767076e4146103b1578063819faf7b146103f357806383366577146103fb57806383a0118f14610403578063851954fa1461040b5761023d565b80635cfcee281461036b5780636b5a4ca214610373578063702bf8fa1461037b57806372b6f1bf1461038357806373eb69d4146103a95761023d565b80633c1a62dc116102105780633c1a62dc146103255780634037f9671461032d5780634b57b0be146103535780634c914a4e1461035b57806358886253146103635761023d565b8063085e2c5b1461024257806311c0c0f7146102df57806312dea160146102f95780631388b4201461031d575b600080fd5b610284600480360360a081101561025857600080fd5b506001600160a01b038135811691602081013590911690604081013590606081013590608001356105d4565b6040518083815260200180602001828103825283818151815260200191508051906020019060200280838360005b838110156102ca5781810151838201526020016102b2565b50505050905001935050505060405180910390f35b6102e7610638565b60408051918252519081900360200190f35b61030161063e565b604080516001600160a01b039092168252519081900360200190f35b61030161064d565b6102e761065c565b6103016004803603602081101561034357600080fd5b50356001600160a01b0316610661565b6103016109d9565b6102e76109e8565b6102e76109ed565b6102e76109f3565b6103016109f8565b6102e7610a07565b6103016004803603602081101561039957600080fd5b50356001600160a01b0316610a10565b6102e7610c60565b610284600480360360a08110156103c757600080fd5b506001600160a01b03813581169160208101359091169060408101359060608101359060800135610c66565b610301610e54565b6102e7610e63565b6102e7610e68565b610301610e6e565b610301610e7d565b6102e7610e8c565b610301610e91565b610301610ea0565b6102e7610eb8565b610301610ec1565b610301610ed0565b6102e76004803603608081101561046157600080fd5b506001600160a01b03813581169160208101359091169060408101359060600135610edf565b6102e7611073565b6102e7600480360360808110156104a557600080fd5b506001600160a01b03813581169160208101359091169060408101359060600135611078565b610301611227565b6102e7600480360360808110156104e957600080fd5b506001600160a01b03813581169160208101359091169060408101359060600135611236565b6102e76115d5565b6102e76115de565b6102e76004803603608081101561053557600080fd5b506001600160a01b038135811691602081013590911690604081013590606001356115e3565b610301611975565b6102e7611984565b610301611989565b6105906004803603602081101561058957600080fd5b5035611998565b005b6102e7600480360360a08110156105a857600080fd5b506001600160a01b0381358116916020810135821691604082013516906060810135906080013561199b565b60006060856001600160a01b0316876001600160a01b0316141561061c5760408051600480825260a0820190925286916020820160808038833901905050909250905061062e565b6106298787878787611fec565b915091505b9550959350505050565b61010081565b6005546001600160a01b031681565b6007546001600160a01b031681565b602081565b6000610675826001600160a01b0316611ffd565b1561068357506000196109d4565b60408051600481526024810182526020810180516001600160e01b03166306fdde0360e01b178152915181516000936060936001600160a01b0388169361138893919290918291908083835b602083106106ee5780518252601f1990920191602091820191016106cf565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303818686fa925050503d806000811461074f576040519150601f19603f3d011682016040523d82523d6000602084013e610754565b606091505b50915091508161076a57600019925050506109d4565b6000805b60078351038110156108c35782816000018151811061078957fe5b6020910101516001600160f81b031916602360f91b1480156107cc57508281600101815181106107b557fe5b6020910101516001600160f81b031916607560f81b145b80156107f957508281600201815181106107e257fe5b6020910101516001600160f81b031916601b60fa1b145b8015610826575082816003018151811061080f57fe5b6020910101516001600160f81b031916606360f81b145b8015610853575082816004018151811061083c57fe5b6020910101516001600160f81b031916603960f91b145b8015610880575082816005018151811061086957fe5b6020910101516001600160f81b031916607560f81b145b80156108ad575082816006018151811061089657fe5b6020910101516001600160f81b031916606d60f81b145b156108bb57600191506108c3565b60010161076e565b50806108d65760001993505050506109d4565b60408051600481526024810182526020810180516001600160e01b031663797bf38560e01b178152915181516001600160a01b038916936113889392918291908083835b602083106109395780518252601f19909201916020918201910161091a565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303818686fa925050503d806000811461099a576040519150601f19603f3d011682016040523d82523d6000602084013e61099f565b606091505b509093509150826109b75760001993505050506109d4565b8180602001905160208110156109cc57600080fd5b505193505050505b919050565b6001546001600160a01b031681565b604081565b61020081565b601081565b600a546001600160a01b031681565b64010000000081565b6000610a24826001600160a01b0316611ffd565b15610a3257506000196109d4565b60408051600481526024810182526020810180516001600160e01b03166306fdde0360e01b178152915181516000936060936001600160a01b0388169361138893919290918291908083835b60208310610a9d5780518252601f199092019160209182019101610a7e565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303818686fa925050503d8060008114610afe576040519150601f19603f3d011682016040523d82523d6000602084013e610b03565b606091505b509150915081610b1957600019925050506109d4565b6000805b6004835103811015610beb57828160000181518110610b3857fe5b6020910101516001600160f81b031916604160f81b148015610b7b5750828160010181518110610b6457fe5b6020910101516001600160f81b031916606160f81b145b8015610ba85750828160020181518110610b9157fe5b6020910101516001600160f81b031916603b60f91b145b8015610bd55750828160030181518110610bbe57fe5b6020910101516001600160f81b031916606560f81b145b15610be35760019150610beb565b600101610b1d565b5080610bfe5760001993505050506109d4565b60408051600481526024810182526020810180516001600160e01b0316632274683f60e21b178152915181516001600160a01b03891693611388939291829190808383602083106109395780518252601f19909201916020918201910161091a565b61080081565b60006060856001600160a01b0316876001600160a01b03161415610cae5760408051600480825260a0820190925286916020820160808038833901905050909250905061062e565b610cbf83602063ffffffff61203716565b15610e47576000610ccf88610661565b90506001600160a01b0380821614610d89576000886001600160a01b0316637ff9b5966040518163ffffffff1660e01b815260040160206040518083038186803b158015610d1c57600080fd5b505afa158015610d30573d6000803e3d6000fd5b505050506040513d6020811015610d4657600080fd5b50519050610d7e8289610d77670de0b6b3a7640000610d6b8c8763ffffffff61203c16565b9063ffffffff61209c16565b8989610c66565b93509350505061062e565b610d9287610661565b90506001600160a01b0380821614610e45576000876001600160a01b0316637ff9b5966040518163ffffffff1660e01b815260040160206040518083038186803b158015610ddf57600080fd5b505afa158015610df3573d6000803e3d6000fd5b505050506040513d6020811015610e0957600080fd5b50519050610e1a89838989896120de565b9094509250610e3b81610d6b86670de0b6b3a764000063ffffffff61203c16565b935061062e915050565b505b61062987878787876120de565b600b546001600160a01b031681565b608081565b61040081565b6002546001600160a01b031681565b6004546001600160a01b031681565b600881565b600d546001600160a01b031681565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee81565b64040000000081565b6008546001600160a01b031681565b6009546001600160a01b031681565b60075460009081906060906001600160a01b03908116906207a12090630a2513a960e11b90610f0f908a16611ffd565b610f195788610f26565b6001546001600160a01b03165b610f388b6001600160a01b0316611ffd565b610f42578a610f4f565b6001546001600160a01b03165b604080516001600160a01b03938416602482015291909216604482015260648082018b905282518083039091018152608490910182526020810180516001600160e01b03166001600160e01b031990941693909317835290518151919290918291908083835b60208310610fd45780518252601f199092019160209182019101610fb5565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303818686fa925050503d8060008114611035576040519150601f19603f3d011682016040523d82523d6000602084013e61103a565b606091505b50915091508161104f5760009250505061106b565b80806020019051602081101561106457600080fd5b5051925050505b949350505050565b600281565b60035460408051600481526024810182526020810180516001600160e01b0316634f61ff8b60e01b1781529151815160009485946060946001600160a01b03909216936108fc93909182918083835b602083106110e65780518252601f1990920191602091820191016110c7565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303818686fa925050503d8060008114611147576040519150601f19603f3d011682016040523d82523d6000602084013e61114c565b606091505b5091509150816111615760009250505061106b565b600081806020019051602081101561117857600080fd5b5051905061118e6001600160a01b038916611ffd565b806111a657506111a6876001600160a01b0316611ffd565b156111c2576111b8818989898961199b565b935050505061106b565b60006111e5828a73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee8a8a61199b565b9050806111f957600094505050505061106b565b61121a8273eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee8a848a61199b565b9998505050505050505050565b6003546001600160a01b031681565b60055460408051632ecd14d360e21b81526c42616e636f724e6574776f726b60981b6004820152905160009283926001600160a01b039091169163bb34534c91602480820192602092909190829003018186803b15801561129657600080fd5b505afa1580156112aa573d6000803e3d6000fd5b505050506040513d60208110156112c057600080fd5b50516006549091506060906001600160a01b03908116906375e1cc82906112e8908a16611ffd565b6112f257886112ff565b6002546001600160a01b03165b611311896001600160a01b0316611ffd565b61131b5788611328565b6002546001600160a01b03165b6040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b03168152602001826001600160a01b03166001600160a01b031681526020019250505060006040518083038186803b15801561138757600080fd5b505afa15801561139b573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405260208110156113c457600080fd5b81019080805160405193929190846401000000008211156113e457600080fd5b9083019060208201858111156113f957600080fd5b825186602082028301116401000000008211171561141657600080fd5b82525081516020918201928201910280838360005b8381101561144357818101518382015260200161142b565b50505050905001604052505050905060006060836001600160a01b03166207a120856001600160a01b0316630c8496cc905060e01b858a6040516024018080602001838152602001828103825284818151815260200191508051906020019060200280838360005b838110156114c35781810151838201526020016114ab565b505050509050019350505050604051602081830303815290604052906001600160e01b0319166020820180516001600160e01b0383818316178352505050506040518082805190602001908083835b602083106115315780518252601f199092019160209182019101611512565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303818686fa925050503d8060008114611592576040519150601f19603f3d011682016040523d82523d6000602084013e611597565b606091505b5091509150816115ae57600094505050505061106b565b60008180602001905160408110156115c557600080fd5b50519a9950505050505050505050565b64020000000081565b600181565b6000826115f86001600160a01b038716611ffd565b6117a95760048054604080516303795fb160e11b81526001600160a01b038a8116948201949094529051600093909216916306f2bf6291602480820192602092909190829003018186803b15801561164f57600080fd5b505afa158015611663573d6000803e3d6000fd5b505050506040513d602081101561167957600080fd5b505190506001600160a01b038116156117a25760408051602480820185905282518083039091018152604490910182526020810180516001600160e01b03166395b68fe760e01b178152915181516000936060936001600160a01b0387169362030d4093919290918291908083835b602083106117075780518252601f1990920191602091820191016116e8565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303818686fa925050503d8060008114611768576040519150601f19603f3d011682016040523d82523d6000602084013e61176d565b606091505b509150915081156117965780806020019051602081101561178d57600080fd5b5051935061179b565b600093505b50506117a7565b600091505b505b6117bb856001600160a01b0316611ffd565b61196c5760048054604080516303795fb160e11b81526001600160a01b03898116948201949094529051600093909216916306f2bf6291602480820192602092909190829003018186803b15801561181257600080fd5b505afa158015611826573d6000803e3d6000fd5b505050506040513d602081101561183c57600080fd5b505190506001600160a01b038116156119655760408051602480820185905282518083039091018152604490910182526020810180516001600160e01b031663cd7724c360e01b178152915181516000936060936001600160a01b0387169362030d4093919290918291908083835b602083106118ca5780518252601f1990920191602091820191016118ab565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303818686fa925050503d806000811461192b576040519150601f19603f3d011682016040523d82523d6000602084013e611930565b606091505b509150915081156119595780806020019051602081101561195057600080fd5b5051935061195e565b600093505b505061196a565b600091505b505b95945050505050565b6000546001600160a01b031681565b600481565b600c546001600160a01b031681565b50565b60006119af856001600160a01b0316611ffd565b806119c757506119c7846001600160a01b0316611ffd565b611a18576040805162461bcd60e51b815260206004820152601f60248201527f4f6e65206f662074686520746f6b656e732073686f756c642062652045544800604482015290519081900360640190fd5b600060606001600160a01b03808916906216e36090630611aecb60e11b90611a41908b16611ffd565b611a4b5789611a61565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee5b611a738a6001600160a01b0316611ffd565b611a7d5789611a93565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee5b604080516001600160a01b039384166024820152919092166044820152606481018a905260016084808301919091528251808303909101815260a490910182526020810180516001600160e01b03166001600160e01b031990941693909317835290518151919290918291908083835b60208310611b225780518252601f199092019160209182019101611b03565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303818686fa925050503d8060008114611b83576040519150601f19603f3d011682016040523d82523d6000602084013e611b88565b606091505b509150915081611b9d5760009250505061196c565b600080828060200190516040811015611bb557600080fd5b50805160209091015190925090507331e085afd48a1d6e51cc193153d625e8f0514c7f6001600160a01b038316148015611bff5750611bff8664010000000063ffffffff6120ef16565b80611c415750731e158c0e93c30d24e918ef83d1e0be23595c3c0f6001600160a01b038316148015611c415750611c418664020000000063ffffffff6120ef16565b80611c83575073053aa84fcc676113a57e0ebb0bd1913839874be46001600160a01b038316148015611c835750611c838664040000000063ffffffff6120ef16565b15611c9557600094505050505061196c565b611caa8664010000000063ffffffff6120ef16565b15611d905760408051600481526024810182526020810180516001600160e01b03166345ed957d60e11b178152915181516001600160a01b038616936108fc9392918291908083835b60208310611d125780518252601f199092019160209182019101611cf3565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303818686fa925050503d8060008114611d73576040519150601f19603f3d011682016040523d82523d6000602084013e611d78565b606091505b50909450508315611d9057600094505050505061196c565b611da58664020000000063ffffffff6120ef16565b15611e8b5760408051600481526024810182526020810180516001600160e01b0316630dad878f60e21b178152915181516001600160a01b038616936108fc9392918291908083835b60208310611e0d5780518252601f199092019160209182019101611dee565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303818686fa925050503d8060008114611e6e576040519150601f19603f3d011682016040523d82523d6000602084013e611e73565b606091505b50909450508315611e8b57600094505050505061196c565b611ea08664040000000063ffffffff6120ef16565b15611f865760408051600481526024810182526020810180516001600160e01b0316634d21dff760e01b178152915181516001600160a01b038616936108fc9392918291908083835b60208310611f085780518252601f199092019160209182019101611ee9565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303818686fa925050503d8060008114611f69576040519150601f19603f3d011682016040523d82523d6000602084013e611f6e565b606091505b50909450508315611f8657600094505050505061196c565b611fde670de0b6b3a7640000610d6b611fa78c6001600160a01b03166120fb565b600a0a610d6b611fbf8d6001600160a01b03166120fb565b600a0a611fd2878e63ffffffff61203c16565b9063ffffffff61203c16565b9a9950505050505050505050565b6000606061062987878787876122e9565b60006001600160a01b038216158061203157506001600160a01b03821673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee145b92915050565b161590565b60008261204b57506000612031565b8282028284828161205857fe5b04146120955760405162461bcd60e51b8152600401808060200182810382526021815260200180613a8a6021913960400191505060405180910390fd5b9392505050565b600061209583836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250612705565b6000606061062987878787876127a7565b60006120958383612037565b600061210682611ffd565b15612113575060126109d4565b60408051600481526024810182526020810180516001600160e01b031663313ce56760e01b178152915181516000936060936001600160a01b0388169361138893919290918291908083835b6020831061217e5780518252601f19909201916020918201910161215f565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303818686fa925050503d80600081146121df576040519150601f19603f3d011682016040523d82523d6000602084013e6121e4565b606091505b5091509150816122be5760408051600481526024810182526020810180516001600160e01b0316632e0f262560e01b178152915181516001600160a01b038816936113889392918291908083835b602083106122515780518252601f199092019160209182019101612232565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303818686fa925050503d80600081146122b2576040519150601f19603f3d011682016040523d82523d6000602084013e6122b7565b606091505b5090925090505b816122ca57601261106b565b8080602001905160208110156122df57600080fd5b5051949350505050565b60006060856001600160a01b0316876001600160a01b031614156123315760408051600480825260a0820190925286916020820160808038833901905050909250905061062e565b612339613a23565b61234161284e565b90506123558461080063ffffffff61203716565b156126e95760005b60068110156125155781816006811061237257fe5b60200201516001600160a01b0316896001600160a01b0316141561250d57610d7e82826006811061239f57fe5b60200201516001600160a01b031663fc0c546a6040518163ffffffff1660e01b815260040160206040518083038186803b1580156123dc57600080fd5b505afa1580156123f0573d6000803e3d6000fd5b505050506040513d602081101561240657600080fd5b50518961250685856006811061241857fe5b60200201516001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b15801561245557600080fd5b505afa158015612469573d6000803e3d6000fd5b505050506040513d602081101561247f57600080fd5b5051610d6b87876006811061249057fe5b60200201516001600160a01b0316637137ef996040518163ffffffff1660e01b815260040160206040518083038186803b1580156124cd57600080fd5b505afa1580156124e1573d6000803e3d6000fd5b505050506040513d60208110156124f757600080fd5b50518d9063ffffffff61203c16565b89896122e9565b60010161235d565b5060005b60068110156126e75781816006811061252e57fe5b60200201516001600160a01b0316886001600160a01b031614156126df57600060606125d18b85856006811061256057fe5b60200201516001600160a01b031663fc0c546a6040518163ffffffff1660e01b815260040160206040518083038186803b15801561259d57600080fd5b505afa1580156125b1573d6000803e3d6000fd5b505050506040513d60208110156125c757600080fd5b50518b8b8b6128ff565b915091506126d28484600681106125e457fe5b60200201516001600160a01b0316637137ef996040518163ffffffff1660e01b815260040160206040518083038186803b15801561262157600080fd5b505afa158015612635573d6000803e3d6000fd5b505050506040513d602081101561264b57600080fd5b5051610d6b86866006811061265c57fe5b60200201516001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b15801561269957600080fd5b505afa1580156126ad573d6000803e3d6000fd5b505050506040513d60208110156126c357600080fd5b5051859063ffffffff61203c16565b9550935061062e92505050565b600101612519565b505b6126f688888888886128ff565b92509250509550959350505050565b600081836127915760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561275657818101518382015260200161273e565b50505050905090810190601f1680156127835780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b50600083858161279d57fe5b0495945050505050565b60006060856001600160a01b0316876001600160a01b031614156127cd5784915061062e565b6127de83608063ffffffff61203716565b156128415760006127ee88610a10565b90506001600160a01b03808216146128175761280d81888888886127a7565b925092505061062e565b61282087610a10565b90506001600160a01b038082161461283f5761280d8882888888612910565b505b6106298787878787612910565b612856613a23565b506040805160c0810182527316de59092dae5ccf4a1e6439d611fd0653f0bd0181527304aa51bbcb46541455ccf1b8bef2ebc5d3787ec960208201527373a052500105205d34daf004eab301916da8190f918101919091527383f798e925bcd4017eb265844fddabb448f1707d606082015273d6ad7a6750a7593e092a9b218d66c0a814a3436e608082015273f61718057901f84c4eec4339ef8f0d86d2b4560060a082015290565b6000606061062987878787876129e4565b60006060856001600160a01b0316876001600160a01b031614156129585760408051600480825260a0820190925286916020820160808038833901905050909250905061062e565b61296a8361040063ffffffff61203716565b156129d7576009546001600160a01b03888116911614156129a75760005461299e906001600160a01b031687878787612bb0565b9150915061062e565b6009546001600160a01b03878116911614156129d75760005461299e9088906001600160a01b0316878787612bb0565b6106298787878787612bb0565b60006060856001600160a01b0316876001600160a01b03161415612a2c5760408051600480825260a0820190925286916020820160808038833901905050909250905061062e565b612a3d83601063ffffffff61203716565b15612ba357612a4b87612cb9565b15612b00576000612a5b88612dec565b90506001600160a01b0380821614612afe576000886001600160a01b031663182df0f56040518163ffffffff1660e01b815260040160206040518083038186803b158015612aa857600080fd5b505afa158015612abc573d6000803e3d6000fd5b505050506040513d6020811015612ad257600080fd5b50519050610d7e8289612af7670de0b6b3a7640000610d6b8c8763ffffffff61203c16565b89896129e4565b505b612b0986612cb9565b15612ba3576000612b1987612dec565b90506001600160a01b0380821614612ba1576000876001600160a01b031663182df0f56040518163ffffffff1660e01b815260040160206040518083038186803b158015612b6657600080fd5b505afa158015612b7a573d6000803e3d6000fd5b505050506040513d6020811015612b9057600080fd5b50519050610e1a8983898989612ef4565b505b6106298787878787612ef4565b60006060856001600160a01b0316876001600160a01b03161415612bf85760408051600480825260a0820190925286916020820160808038833901905050909250905061062e565b612c0983604063ffffffff61203716565b15612cac576008546001600160a01b0388811691161415612c545760005460085461299e916001600160a01b03908116918991612c4d91168963ffffffff612f0516565b8787613019565b6008546001600160a01b0387811691161415612cac57600054612c849088906001600160a01b0316878787613019565b6008549193509150612ca5906001600160a01b03168363ffffffff61318016565b915061062e565b6106298787878787613019565b600d546000906001600160a01b0383811691161415612cda575060016109d4565b600c54604080516001600160a01b0385811660248084019190915283518084039091018152604490920183526020820180516001600160e01b0316638e8f294b60e01b17815292518251600095606095931693611388939092918291908083835b60208310612d5a5780518252601f199092019160209182019101612d3b565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303818686fa925050503d8060008114612dbb576040519150601f19603f3d011682016040523d82523d6000602084013e612dc0565b606091505b509150915081612dd5576000925050506109d4565b60008180602001905160408110156109cc57600080fd5b600d546000906001600160a01b0383811691161415612e0d575060006109d4565b60408051600481526024810182526020810180516001600160e01b0316636f307dc360e01b178152915181516000936060936001600160a01b0388169361138893919290918291908083835b60208310612e785780518252601f199092019160209182019101612e59565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303818686fa925050503d8060008114612ed9576040519150601f19603f3d011682016040523d82523d6000602084013e612ede565b606091505b5091509150816122ca57600019925050506109d4565b600060606106298787878787610c66565b60008073197e90f9fad81970ba7976f33cbd77088e5d7cf76001600160a01b03166320aba08b6040518163ffffffff1660e01b815260040160206040518083038186803b158015612f5557600080fd5b505afa158015612f69573d6000803e3d6000fd5b505050506040513d6020811015612f7f57600080fd5b505142116130055773197e90f9fad81970ba7976f33cbd77088e5d7cf76001600160a01b031663c92aecc46040518163ffffffff1660e01b815260040160206040518083038186803b158015612fd457600080fd5b505afa158015612fe8573d6000803e3d6000fd5b505050506040513d6020811015612ffe57600080fd5b505161300d565b61300d613294565b905061106b8184613423565b60006060856001600160a01b0316876001600160a01b031614156130615760408051600480825260a0820190925286916020820160808038833901905050909250905061062e565b613073876001600160a01b0316611ffd565b15801561308f575061308d866001600160a01b0316611ffd565b155b80156130aa57506130a88361020063ffffffff6120ef16565b155b15613173576130d38773eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee87876004881761344b565b909250905060606130fe73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee8885886004891761344b565b909350905060005b825181101561316b5761314c600883838151811061312057fe5b6020026020010151901b84838151811061313657fe5b602002602001015161382690919063ffffffff16565b83828151811061315857fe5b6020908102919091010152600101613106565b5061062e9050565b610629878787878761344b565b60008073197e90f9fad81970ba7976f33cbd77088e5d7cf76001600160a01b03166320aba08b6040518163ffffffff1660e01b815260040160206040518083038186803b1580156131d057600080fd5b505afa1580156131e4573d6000803e3d6000fd5b505050506040513d60208110156131fa57600080fd5b505142116132805773197e90f9fad81970ba7976f33cbd77088e5d7cf76001600160a01b031663c92aecc46040518163ffffffff1660e01b815260040160206040518083038186803b15801561324f57600080fd5b505afa158015613263573d6000803e3d6000fd5b505050506040513d602081101561327957600080fd5b5051613288565b613288613294565b905061106b8382613880565b600061341e6133a073197e90f9fad81970ba7976f33cbd77088e5d7cf76001600160a01b031663487bf0826040518163ffffffff1660e01b815260040160206040518083038186803b1580156132e957600080fd5b505afa1580156132fd573d6000803e3d6000fd5b505050506040513d602081101561331357600080fd5b5051604080516320aba08b60e01b8152905173197e90f9fad81970ba7976f33cbd77088e5d7cf7916320aba08b916004808301926020929190829003018186803b15801561336057600080fd5b505afa158015613374573d6000803e3d6000fd5b505050506040513d602081101561338a57600080fd5b505142036b033b2e3c9fd0803ce8000000613899565b73197e90f9fad81970ba7976f33cbd77088e5d7cf76001600160a01b031663c92aecc46040518163ffffffff1660e01b815260040160206040518083038186803b1580156133ed57600080fd5b505afa158015613401573d6000803e3d6000fd5b505050506040513d602081101561341757600080fd5b5051613423565b905090565b60006b033b2e3c9fd0803ce800000061343c8484613958565b8161344357fe5b049392505050565b60408051600480825260a082019092526000916060919060208201608080388339019050509050856001600160a01b0316876001600160a01b031614156134945784915061062e565b61349c613a41565b6040805160808101909152806134b986600163ffffffff61397c16565b6134c5576115e36134c9565b6139825b67ffffffffffffffff1681526020016134e986600263ffffffff61397c16565b6134f5576110786134f9565b6139825b67ffffffffffffffff16815260200161351986600463ffffffff61397c16565b61352557611236613529565b6139825b67ffffffffffffffff16815260200161354986600863ffffffff61397c16565b61355557610edf613559565b6139825b67ffffffffffffffff169052905061356f613a69565b613577613a69565b60005b6004811015613650576135b28b8b6135988c8c63ffffffff61209c16565b8a8886600481106135a557fe5b602002015163ffffffff16565b8382600481106135be57fe5b60200201523063f82c50f18483600481106135d557fe5b60200201516040518263ffffffff1660e01b81526004018082815260200191505060006040518083038186803b15801561360e57600080fd5b505afa158015613622573d6000803e3d6000fd5b5050505082816004811061363257fe5b602002015182826004811061364357fe5b602002015260010161357a565b5060005b8781101561381857600060015b600481101561369e5784826004811061367657fe5b602002015185826004811061368757fe5b60200201511115613696578091505b600101613661565b506136c08482600481106136ae57fe5b6020020151889063ffffffff61382616565b96508581815181106136ce57fe5b6020026020010180518091906001018152505060008a90508983600101101561380e5760006137328e8e6137258e610d6b8d898151811061370b57fe5b60200260200101516001018861203c90919063ffffffff16565b8d8b88600481106135a557fe5b905084836004811061374057fe5b60200201518111156137835761376d85846004811061375b57fe5b6020020151829063ffffffff61398c16565b86846004811061377957fe5b6020020152613797565b600086846004811061379157fe5b60200201525b3063f82c50f18785600481106137a957fe5b60200201516040518263ffffffff1660e01b81526004018082815260200191505060006040518083038186803b1580156137e257600080fd5b505afa1580156137f6573d6000803e3d6000fd5b505050508085846004811061380757fe5b6020020152505b5050600101613654565b505050509550959350505050565b600082820183811015612095576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b60008161343c846b033b2e3c9fd0803ce8000000613958565b600083801561393a576001841680156138b4578592506138b8565b8392505b50600283046002850494505b84156139345785860286878204146138db57600080fd5b818101818110156138eb57600080fd5b8581049750600287061561392757878502858982041415891515161561391057600080fd5b8381018181101561392057600080fd5b8790049550505b50506002850494506138c4565b50613950565b83801561394a576000925061394e565b8392505b505b509392505050565b60008115806139735750508082028282828161397057fe5b04145b61203157600080fd5b16151590565b6000949350505050565b600061209583836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f77000081525060008184841115613a1b5760405162461bcd60e51b815260206004820181815283516024840152835190928392604490910191908501908083836000831561275657818101518382015260200161273e565b505050900390565b6040518060c001604052806006906020820280388339509192915050565b60405180608001604052806004905b613a87815260200190600190039081613a505790505090565b60405180608001604052806004906020820280388339509192915050565bfefe536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f77a265627a7a723158208cee42a0167b5da81b5e7a59bfa276d568ca3df48b74a449017376998977646b64736f6c63430005100032
Deployed Bytecode Sourcemap
80295:1029:0:-;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;80295:1029:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;80574:747;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;;;;;;80574:747:0;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;80574:747:0;;;;;;;;;;;;;;;;;;3707:48;;;:::i;:::-;;;;;;;;;;;;;;;;26355:123;;;:::i;:::-;;;;-1:-1:-1;;;;;26355:123:0;;;;;;;;;;;;;;26611:96;;;:::i;3563:43::-;;;:::i;53433:1205::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;53433:1205:0;-1:-1:-1;;;;;53433:1205:0;;:::i;25939:74::-;;;:::i;3613:40::-;;;:::i;3762:51::-;;;:::i;3512:44::-;;;:::i;66332:70::-;;;:::i;3130:64::-;;;:::i;75143:1091::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;75143:1091:0;-1:-1:-1;;;;;75143:1091:0;;:::i;3893:42::-;;;:::i;55216:1693::-;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;;;;;;55216:1693:0;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;75043:91::-;;;:::i;3660:40::-;;;:::i;3845:41::-;;;:::i;26020:105::-;;;:::i;26249:99::-;;;:::i;3464:41::-;;;:::i;45139:87::-;;;:::i;25766:::-;;;:::i;3320:63::-;;;:::i;63174:69::-;;;:::i;66256:::-;;;:::i;35528:642::-;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;;;;;;35528:642:0;;;;;;;;;;;;;;;;;;;;;;:::i;3082:41::-;;;:::i;31170:1019::-;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;;;;;;31170:1019:0;;;;;;;;;;;;;;;;;;;;;;:::i;26134:108::-;;;:::i;34597:923::-;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;;;;;;34597:923:0;;;;;;;;;;;;;;;;;;;;;;:::i;3226:62::-;;;:::i;3032:43::-;;;:::i;29438:1724::-;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;;;;;;29438:1724:0;;;;;;;;;;;;;;;;;;;;;;:::i;25862:70::-;;;:::i;3415:42::-;;;:::i;45051:81::-;;;:::i;26785:44::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;26785:44:0;;:::i;:::-;;32197:2392;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;;;;;;32197:2392:0;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;80574:747::-;80933:20;80968:29;81077:7;-1:-1:-1;;;;;81064:20:0;:9;-1:-1:-1;;;;;81064:20:0;;81060:86;;;81117:16;;;81131:1;81117:16;;;;;;;;;81109:6;;81117:16;;;17:15:-1;;105:10;81117:16:0;88:34:-1;136:17;;-1:-1;;81101:33:0;;-1:-1:-1;81101:33:0;-1:-1:-1;81101:33:0;;81060:86;81165:148;81203:9;81227:7;81249:6;81270:5;81290:12;81165:23;:148::i;:::-;81158:155;;;;80574:747;;;;;;;;;:::o;3707:48::-;3750:5;3707:48;:::o;26355:123::-;;;-1:-1:-1;;;;;26355:123:0;;:::o;26611:96::-;;;-1:-1:-1;;;;;26611:96:0;;:::o;3563:43::-;3602:4;3563:43;:::o;53433:1205::-;53492:6;53515:13;:5;-1:-1:-1;;;;;53515:11:0;;:13::i;:::-;53511:63;;;-1:-1:-1;;;53545:17:0;;53511:63;53658:91;;;22:32:-1;6:49;;53658:91:0;;;;;49:4:-1;25:18;;61:17;;-1:-1;;;;;182:15;-1:-1;;;179:29;160:49;;53622:128:0;;;;53587:12;;53601:17;;-1:-1:-1;;;;;53622:25:0;;;53652:4;;53658:91;;53622:128;;;;25:18:-1;53622:128:0;;25:18:-1;36:153;66:2;61:3;58:11;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;53622:128:0;;;;;;;;;;;;;;;;;;;;;;;;14:1:-1;21;16:31;;;;75:4;69:11;64:16;;144:4;140:9;133:4;115:16;111:27;107:43;104:1;100:51;94:4;87:65;169:16;166:1;159:27;225:16;222:1;215:4;212:1;208:12;193:49;7:242;;16:31;36:4;31:9;;7:242;;53586:164:0;;;;53766:7;53761:58;;-1:-1:-1;;53790:17:0;;;;;;53761:58;53831:13;;53863:414;53898:1;53884:4;:11;:15;53880:1;:19;53863:414;;;53925:4;53930:1;53934;53930:5;53925:11;;;;;;;;;;;;;-1:-1:-1;;;;;;53925:11:0;-1:-1:-1;;;53925:18:0;:57;;;;;53964:4;53969:1;53973;53969:5;53964:11;;;;;;;;;;;;;-1:-1:-1;;;;;;53964:11:0;-1:-1:-1;;;53964:18:0;53925:57;:96;;;;;54003:4;54008:1;54012;54008:5;54003:11;;;;;;;;;;;;;-1:-1:-1;;;;;;54003:11:0;-1:-1:-1;;;54003:18:0;53925:96;:135;;;;;54042:4;54047:1;54051;54047:5;54042:11;;;;;;;;;;;;;-1:-1:-1;;;;;;54042:11:0;-1:-1:-1;;;54042:18:0;53925:135;:174;;;;;54081:4;54086:1;54090;54086:5;54081:11;;;;;;;;;;;;;-1:-1:-1;;;;;;54081:11:0;-1:-1:-1;;;54081:18:0;53925:174;:213;;;;;54120:4;54125:1;54129;54125:5;54120:11;;;;;;;;;;;;;-1:-1:-1;;;;;;54120:11:0;-1:-1:-1;;;54120:18:0;53925:213;:252;;;;;54159:4;54164:1;54168;54164:5;54159:11;;;;;;;;;;;;;-1:-1:-1;;;;;;54159:11:0;-1:-1:-1;;;54159:18:0;53925:252;53921:345;;;54222:4;54211:15;;54245:5;;53921:345;53901:3;;53863:414;;;;54292:8;54287:59;;-1:-1:-1;;54317:17:0;;;;;;;54287:59;54412:103;;;22:32:-1;6:49;;54412:103:0;;;;;49:4:-1;25:18;;61:17;;-1:-1;;;;;182:15;-1:-1;;;179:29;160:49;;54376:140:0;;;;-1:-1:-1;;;;;54376:25:0;;;54406:4;;54412:103;54376:140;;;25:18:-1;54376:140:0;;25:18:-1;36:153;66:2;61:3;58:11;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;54376:140:0;;;;;;;;;;;;;;;;;;;;;;;;14:1:-1;21;16:31;;;;75:4;69:11;64:16;;144:4;140:9;133:4;115:16;111:27;107:43;104:1;100:51;94:4;87:65;169:16;166:1;159:27;225:16;222:1;215:4;212:1;208:12;193:49;7:242;;16:31;36:4;31:9;;7:242;-1:-1;54358:158:0;;-1:-1:-1;54358:158:0;-1:-1:-1;54358:158:0;54527:58;;-1:-1:-1;;54556:17:0;;;;;;;54527:58;54615:4;54604:26;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;54604:26:0;;-1:-1:-1;;;;53433:1205:0;;;;:::o;25939:74::-;;;-1:-1:-1;;;;;25939:74:0;;:::o;3613:40::-;3649:4;3613:40;:::o;3762:51::-;3808:5;3762:51;:::o;3512:44::-;3552:4;3512:44;:::o;66332:70::-;;;-1:-1:-1;;;;;66332:70:0;;:::o;3130:64::-;3183:11;3130:64;:::o;75143:1091::-;75199:6;75222:13;:5;-1:-1:-1;;;;;75222:11:0;;:13::i;:::-;75218:63;;;-1:-1:-1;;;75252:17:0;;75218:63;75365:91;;;22:32:-1;6:49;;75365:91:0;;;;;49:4:-1;25:18;;61:17;;-1:-1;;;;;182:15;-1:-1;;;179:29;160:49;;75329:128:0;;;;75294:12;;75308:17;;-1:-1:-1;;;;;75329:25:0;;;75359:4;;75365:91;;75329:128;;;;25:18:-1;75329:128:0;;25:18:-1;36:153;66:2;61:3;58:11;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;75329:128:0;;;;;;;;;;;;;;;;;;;;;;;;14:1:-1;21;16:31;;;;75:4;69:11;64:16;;144:4;140:9;133:4;115:16;111:27;107:43;104:1;100:51;94:4;87:65;169:16;166:1;159:27;225:16;222:1;215:4;212:1;208:12;193:49;7:242;;16:31;36:4;31:9;;7:242;;75293:164:0;;;;75473:7;75468:58;;-1:-1:-1;;75497:17:0;;;;;;75468:58;75538:14;;75571:298;75606:1;75592:4;:11;:15;75588:1;:19;75571:298;;;75633:4;75638:1;75642;75638:5;75633:11;;;;;;;;;;;;;-1:-1:-1;;;;;;75633:11:0;-1:-1:-1;;;75633:18:0;:57;;;;;75672:4;75677:1;75681;75677:5;75672:11;;;;;;;;;;;;;-1:-1:-1;;;;;;75672:11:0;-1:-1:-1;;;75672:18:0;75633:57;:96;;;;;75711:4;75716:1;75720;75716:5;75711:11;;;;;;;;;;;;;-1:-1:-1;;;;;;75711:11:0;-1:-1:-1;;;75711:18:0;75633:96;:135;;;;;75750:4;75755:1;75759;75755:5;75750:11;;;;;;;;;;;;;-1:-1:-1;;;;;;75750:11:0;-1:-1:-1;;;75750:18:0;75633:135;75629:229;;;75814:4;75802:16;;75837:5;;75629:229;75609:3;;75571:298;;;;75884:9;75879:60;;-1:-1:-1;;75910:17:0;;;;;;;75879:60;76005:106;;;22:32:-1;6:49;;76005:106:0;;;;;49:4:-1;25:18;;61:17;;-1:-1;;;;;182:15;-1:-1;;;179:29;160:49;;75969:143:0;;;;-1:-1:-1;;;;;75969:25:0;;;75999:4;;76005:106;75969:143;;;25:18:-1;75969:143:0;;25:18:-1;66:2;61:3;58:11;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;3893:42:0;3930:5;3893:42;:::o;55216:1693::-;55451:20;55486:29;55560:7;-1:-1:-1;;;;;55547:20:0;:9;-1:-1:-1;;;;;55547:20:0;;55543:86;;;55600:16;;;55614:1;55600:16;;;;;;;;;55592:6;;55600:16;;;17:15:-1;;105:10;55600:16:0;88:34:-1;136:17;;-1:-1;;55584:33:0;;-1:-1:-1;55584:33:0;-1:-1:-1;55584:33:0;;55543:86;55645:34;:12;3602:4;55645:34;:20;:34;:::i;:::-;55641:1093;;;55696:17;55716:26;55732:9;55716:15;:26::i;:::-;55696:46;-1:-1:-1;;;;;;55761:24:0;;;;55757:387;;55806:19;55850:9;-1:-1:-1;;;;;55828:44:0;;:46;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;55828:46:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;55828:46:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;55828:46:0;;-1:-1:-1;55902:226:0;55950:10;55983:7;56013:33;56041:4;56013:23;:6;55828:46;56013:23;:10;:23;:::i;:::-;:27;:33;:27;:33;:::i;:::-;56069:5;56097:12;55902:25;:226::i;:::-;55895:233;;;;;;;;55757:387;56173:24;56189:7;56173:15;:24::i;:::-;56160:37;-1:-1:-1;;;;;;56216:24:0;;;;56212:511;;56261:19;56305:7;-1:-1:-1;;;;;56283:42:0;;:44;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;56283:44:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;56283:44:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;56283:44:0;;-1:-1:-1;56379:199:0;56425:9;56457:10;56490:6;56519:5;56547:12;56379:23;:199::i;:::-;56348:230;;-1:-1:-1;56348:230:0;-1:-1:-1;56614:39:0;56641:11;56614:22;56348:230;56631:4;56614:22;:16;:22;:::i;:39::-;56599:54;-1:-1:-1;56672:35:0;;-1:-1:-1;;56672:35:0;56212:511;55641:1093;;56753:148;56791:9;56815:7;56837:6;56858:5;56878:12;56753:23;:148::i;75043:91::-;;;-1:-1:-1;;;;;75043:91:0;;:::o;3660:40::-;3696:4;3660:40;:::o;3845:41::-;3881:5;3845:41;:::o;26020:105::-;;;-1:-1:-1;;;;;26020:105:0;;:::o;26249:99::-;;;-1:-1:-1;;;;;26249:99:0;;:::o;3464:41::-;3501:4;3464:41;:::o;45139:87::-;;;-1:-1:-1;;;;;45139:87:0;;:::o;25766:::-;25810:42;25766:87;:::o;3320:63::-;3372:11;3320:63;:::o;63174:69::-;;;-1:-1:-1;;;;;63174:69:0;;:::o;66256:::-;;;-1:-1:-1;;;;;66256:69:0;;:::o;35528:642::-;35761:13;;35697:7;;;;35732:17;;-1:-1:-1;;;;;35761:13:0;;;;35791:6;;-1:-1:-1;;;35854:35:0;35908:15;;:13;;;:15::i;:::-;:37;;35938:7;35908:37;;;35926:9;;-1:-1:-1;;;;;35926:9:0;35908:37;35964:17;:9;-1:-1:-1;;;;;35964:15:0;;:17::i;:::-;:41;;35996:9;35964:41;;;35984:9;;-1:-1:-1;;;;;35984:9:0;35964:41;35813:232;;;-1:-1:-1;;;;;35813:232:0;;;;;;;;;;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;35813:232:0;;;;;;;25:18:-1;;61:17;;-1:-1;;;;;182:15;-1:-1;;;;;;35813:232:0;;;179:29:-1;;;;160:49;;35753:303:0;;;;35813:232;;35753:303;;;;25:18:-1;35753:303:0;;25:18:-1;36:153;66:2;61:3;58:11;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;35753:303:0;;;;;;;;;;;;;;;;;;;;;;;;14:1:-1;21;16:31;;;;75:4;69:11;64:16;;144:4;140:9;133:4;115:16;111:27;107:43;104:1;100:51;94:4;87:65;169:16;166:1;159:27;225:16;222:1;215:4;212:1;208:12;193:49;7:242;;16:31;36:4;31:9;;7:242;;35717:339:0;;;;36072:7;36067:49;;36103:1;36096:8;;;;;;36067:49;36146:4;36135:27;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;36135:27:0;;-1:-1:-1;;;35528:642:0;;;;;;;:::o;3082:41::-;3119:4;3082:41;:::o;31170:1019::-;31399:17;;31439:95;;;22:32:-1;6:49;;31439:95:0;;;;;49:4:-1;25:18;;61:17;;-1:-1;;;;;182:15;-1:-1;;;179:29;160:49;;31391:144:0;;;;31335:7;;;;31370:17;;-1:-1:-1;;;;;31399:17:0;;;;31433:4;;31391:144;;;;;;25:18:-1;36:153;66:2;61:3;58:11;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;31391:144:0;;;;;;;;;;;;;;;;;;;;;;;;14:1:-1;21;16:31;;;;75:4;69:11;64:16;;144:4;140:9;133:4;115:16;111:27;107:43;104:1;100:51;94:4;87:65;169:16;166:1;159:27;225:16;222:1;215:4;212:1;208:12;193:49;7:242;;16:31;36:4;31:9;;7:242;;31355:180:0;;;;31551:7;31546:49;;31582:1;31575:8;;;;;;31546:49;31607:42;31685:4;31674:27;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;31674:27:0;;-1:-1:-1;31719:17:0;-1:-1:-1;;;;;31719:15:0;;;:17::i;:::-;:36;;;;31740:15;:7;-1:-1:-1;;;;;31740:13:0;;:15::i;:::-;31715:168;;;31779:92;31808:20;31830:9;31841:7;31850:6;31858:12;31779:28;:92::i;:::-;31772:99;;;;;;;31715:168;31895:13;31911:96;31940:20;31962:9;25810:42;31986:6;31994:12;31911:28;:96::i;:::-;31895:112;-1:-1:-1;32022:10:0;32018:51;;32056:1;32049:8;;;;;;;;32018:51;32088:93;32117:20;25810:42;32152:7;32161:5;32168:12;32088:28;:93::i;:::-;32081:100;31170:1019;-1:-1:-1;;;;;;;;;31170:1019:0:o;26134:108::-;;;-1:-1:-1;;;;;26134:108:0;;:::o;34597:923::-;34833:22;;:49;;;-1:-1:-1;;;34833:49:0;;-1:-1:-1;;;34833:49:0;;;;;;34767:7;;;;-1:-1:-1;;;;;34833:22:0;;;;:32;;:49;;;;;;;;;;;;;;;:22;:49;;;5:2:-1;;;;30:1;27;20:12;5:2;34833:49:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;34833:49:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;34833:49:0;34918:23;;34833:49;;-1:-1:-1;34894:21:0;;-1:-1:-1;;;;;34918:23:0;;;;:36;;34969:17;;:15;;;:17::i;:::-;:48;;35008:9;34969:48;;;34989:16;;-1:-1:-1;;;;;34989:16:0;34969:48;35032:15;:7;-1:-1:-1;;;;;35032:13:0;;:15::i;:::-;:44;;35069:7;35032:44;;;35050:16;;-1:-1:-1;;;;;35050:16:0;35032:44;34918:169;;;;;;;;;;;;;-1:-1:-1;;;;;34918:169:0;-1:-1:-1;;;;;34918:169:0;;;;;;-1:-1:-1;;;;;34918:169:0;-1:-1:-1;;;;;34918:169:0;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;34918:169:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;34918:169:0;;;;;;39:16:-1;36:1;17:17;2:54;101:4;34918:169:0;80:15:-1;;;-1:-1;;76:31;65:43;;120:4;113:20;13:2;5:11;;2:2;;;29:1;26;19:12;2:2;34918:169:0;;;;;;;;;;;;;19:11:-1;14:3;11:20;8:2;;;44:1;41;34:12;8:2;62:21;;;;123:4;114:14;;138:31;;;135:2;;;182:1;179;172:12;135:2;219:3;213:10;331:9;325:2;311:12;307:21;289:16;285:44;282:59;261:11;247:12;244:29;233:116;230:2;;;362:1;359;352:12;230:2;373:25;;-1:-1;34918:169:0;;421:4:-1;412:14;;;;34918:169:0;;;;;412:14:-1;34918:169:0;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;34918:169:0;;;;;;;;;;;34894:193;;35101:12;35115:17;35144:13;-1:-1:-1;;;;;35136:33:0;35174:6;35237:13;-1:-1:-1;;;;;35237:29:0;;:38;;;;35294:4;35317:6;35196:142;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;35196:142:0;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;35196:142:0;;;;-1:-1:-1;;;;;35196:142:0;;38:4:-1;29:7;25:18;67:10;61:17;-1:-1;;;;;199:8;192:4;186;182:15;179:29;167:10;160:49;0:215;;;35196:142:0;35136:213;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:11;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;35136:213:0;;;;;;;;;;;;;;;;;;;;;;;;14:1:-1;21;16:31;;;;75:4;69:11;64:16;;144:4;140:9;133:4;115:16;111:27;107:43;104:1;100:51;94:4;87:65;169:16;166:1;159:27;225:16;222:1;215:4;212:1;208:12;193:49;7:242;;16:31;36:4;31:9;;7:242;;35100:249:0;;;;35365:7;35360:49;;35396:1;35389:8;;;;;;;;35360:49;35422:20;35458:4;35447:35;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;35447:35:0;;34597:923;-1:-1:-1;;;;;;;;;;34597:923:0:o;3226:62::-;3277:11;3226:62;:::o;3032:43::-;3071:4;3032:43;:::o;29438:1724::-;29609:7;29652:6;29676:17;-1:-1:-1;;;;;29676:15:0;;;:17::i;:::-;29671:726;;29742:14;;;:37;;;-1:-1:-1;;;29742:37:0;;-1:-1:-1;;;;;29742:37:0;;;;;;;;;;;;29710:29;;29742:14;;;;:26;;:37;;;;;;;;;;;;;;;:14;:37;;;5:2:-1;;;;30:1;27;20:12;5:2;29742:37:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;29742:37:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;29742:37:0;;-1:-1:-1;;;;;;29798:35:0;;;29794:592;;29957:156;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;29957:156:0;;;;;;;25:18:-1;;61:17;;-1:-1;;;;;182:15;-1:-1;;;179:29;160:49;;29890:242:0;;;;29855:12;;29869:17;;-1:-1:-1;;;;;29890:32:0;;;29927:6;;29957:156;;29890:242;;;;25:18:-1;29890:242:0;;25:18:-1;36:153;66:2;61:3;58:11;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;29890:242:0;;;;;;;;;;;;;;;;;;;;;;;;14:1:-1;21;16:31;;;;75:4;69:11;64:16;;144:4;140:9;133:4;115:16;111:27;107:43;104:1;100:51;94:4;87:65;169:16;166:1;159:27;225:16;222:1;215:4;212:1;208:12;193:49;7:242;;16:31;36:4;31:9;;7:242;;29854:278:0;;;;30155:7;30151:163;;;30213:4;30202:27;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;30202:27:0;;-1:-1:-1;30151:163:0;;;30293:1;30278:16;;30151:163;29794:592;;;;;30369:1;30354:16;;29794:592;29671:726;;30414:15;:7;-1:-1:-1;;;;;30414:13:0;;:15::i;:::-;30409:714;;30476:14;;;:35;;;-1:-1:-1;;;30476:35:0;;-1:-1:-1;;;;;30476:35:0;;;;;;;;;;;;30446:27;;30476:14;;;;:26;;:35;;;;;;;;;;;;;;;:14;:35;;;5:2:-1;;;;30:1;27;20:12;5:2;30476:35:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;30476:35:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;30476:35:0;;-1:-1:-1;;;;;;30530:33:0;;;30526:586;;30685:154;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;30685:154:0;;;;;;;25:18:-1;;61:17;;-1:-1;;;;;182:15;-1:-1;;;179:29;160:49;;30620:238:0;;;;30585:12;;30599:17;;-1:-1:-1;;;;;30620:30:0;;;30655:6;;30685:154;;30620:238;;;;25:18:-1;30620:238:0;;25:18:-1;36:153;66:2;61:3;58:11;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;30620:238:0;;;;;;;;;;;;;;;;;;;;;;;;14:1:-1;21;16:31;;;;75:4;69:11;64:16;;144:4;140:9;133:4;115:16;111:27;107:43;104:1;100:51;94:4;87:65;169:16;166:1;159:27;225:16;222:1;215:4;212:1;208:12;193:49;7:242;;16:31;36:4;31:9;;7:242;;30584:274:0;;;;30881:7;30877:163;;;30939:4;30928:27;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;30928:27:0;;-1:-1:-1;30877:163:0;;;31019:1;31004:16;;30877:163;30526:586;;;;;31095:1;31080:16;;30526:586;30409:714;;31142:12;29438:1724;-1:-1:-1;;;;;29438:1724:0:o;25862:70::-;;;-1:-1:-1;;;;;25862:70:0;;:::o;3415:42::-;3453:4;3415:42;:::o;45051:81::-;;;-1:-1:-1;;;;;45051:81:0;;:::o;26785:44::-;;:::o;32197:2392::-;32423:7;32451:17;:9;-1:-1:-1;;;;;32451:15:0;;:17::i;:::-;:36;;;;32472:15;:7;-1:-1:-1;;;;;32472:13:0;;:15::i;:::-;32443:80;;;;;-1:-1:-1;;;32443:80:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;32537:12;32551:17;-1:-1:-1;;;;;32572:40:0;;;;32617:7;;-1:-1:-1;;;32663:44:0;32722:17;;:15;;;:17::i;:::-;:43;;32756:9;32722:43;;;25810:42;32722:43;32780:15;:7;-1:-1:-1;;;;;32780:13:0;;:15::i;:::-;:39;;32812:7;32780:39;;;25810:42;32780:39;32626:244;;;-1:-1:-1;;;;;32626:244:0;;;;;;;;;;;;;;;;;;;;;32855:4;32626:244;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;32626:244:0;;;;;;;25:18:-1;;61:17;;-1:-1;;;;;182:15;-1:-1;;;;;;32626:244:0;;;179:29:-1;;;;160:49;;32572:299:0;;;;32626:244;;32572:299;;;;25:18:-1;32572:299:0;;25:18:-1;36:153;66:2;61:3;58:11;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;32572:299:0;;;;;;;;;;;;;;;;;;;;;;;;14:1:-1;21;16:31;;;;75:4;69:11;64:16;;144:4;140:9;133:4;115:16;111:27;107:43;104:1;100:51;94:4;87:65;169:16;166:1;159:27;225:16;222:1;215:4;212:1;208:12;193:49;7:242;;16:31;36:4;31:9;;7:242;;32536:335:0;;;;32887:7;32882:49;;32918:1;32911:8;;;;;;32882:49;32944:15;32961:12;32988:4;32977:35;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;32977:35:0;;;;;;;;;-1:-1:-1;32977:35:0;-1:-1:-1;33041:42:0;-1:-1:-1;;;;;33030:53:0;;;:113;;;;-1:-1:-1;33087:56:0;:12;3183:11;33087:56;:28;:56;:::i;:::-;33029:245;;;-1:-1:-1;33173:42:0;-1:-1:-1;;;;;33162:53:0;;;:111;;;;-1:-1:-1;33219:54:0;:12;3277:11;33219:54;:28;:54;:::i;:::-;33029:376;;;-1:-1:-1;33303:42:0;-1:-1:-1;;;;;33292:53:0;;;:112;;;;-1:-1:-1;33349:55:0;:12;3372:11;33349:55;:28;:55;:::i;:::-;33025:426;;;33438:1;33431:8;;;;;;;;33025:426;33467:56;:12;3183:11;33467:56;:28;:56;:::i;:::-;33463:311;;;33582:109;;;22:32:-1;6:49;;33582:109:0;;;;;49:4:-1;25:18;;61:17;;-1:-1;;;;;182:15;-1:-1;;;179:29;160:49;;33553:139:0;;;;-1:-1:-1;;;;;33553:18:0;;;33576:4;;33582:109;33553:139;;;25:18:-1;33553:139:0;;25:18:-1;36:153;66:2;61:3;58:11;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;33553:139:0;;;;;;;;;;;;;;;;;;;;;;;;14:1:-1;21;16:31;;;;75:4;69:11;64:16;;144:4;140:9;133:4;115:16;111:27;107:43;104:1;100:51;94:4;87:65;169:16;166:1;159:27;225:16;222:1;215:4;212:1;208:12;193:49;7:242;;16:31;36:4;31:9;;7:242;-1:-1;33540:152:0;;-1:-1:-1;;33707:56:0;;;;33746:1;33739:8;;;;;;;;33707:56;33790:54;:12;3277:11;33790:54;:28;:54;:::i;:::-;33786:296;;;33903:96;;;22:32:-1;6:49;;33903:96:0;;;;;49:4:-1;25:18;;61:17;;-1:-1;;;;;182:15;-1:-1;;;179:29;160:49;;33874:126:0;;;;-1:-1:-1;;;;;33874:18:0;;;33897:4;;33903:96;33874:126;;;25:18:-1;33874:126:0;;25:18:-1;36:153;66:2;61:3;58:11;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;33874:126:0;;;;;;;;;;;;;;;;;;;;;;;;14:1:-1;21;16:31;;;;75:4;69:11;64:16;;144:4;140:9;133:4;115:16;111:27;107:43;104:1;100:51;94:4;87:65;169:16;166:1;159:27;225:16;222:1;215:4;212:1;208:12;193:49;7:242;;16:31;36:4;31:9;;7:242;-1:-1;33861:139:0;;-1:-1:-1;;34015:56:0;;;;34054:1;34047:8;;;;;;;;34015:56;34098:55;:12;3372:11;34098:55;:28;:55;:::i;:::-;34094:304;;;34212:103;;;22:32:-1;6:49;;34212:103:0;;;;;49:4:-1;25:18;;61:17;;-1:-1;;;;;182:15;-1:-1;;;179:29;160:49;;34183:133:0;;;;-1:-1:-1;;;;;34183:18:0;;;34206:4;;34212:103;34183:133;;;25:18:-1;34183:133:0;;25:18:-1;36:153;66:2;61:3;58:11;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;34183:133:0;;;;;;;;;;;;;;;;;;;;;;;;14:1:-1;21;16:31;;;;75:4;69:11;64:16;;144:4;140:9;133:4;115:16;111:27;107:43;104:1;100:51;94:4;87:65;169:16;166:1;159:27;225:16;222:1;215:4;212:1;208:12;193:49;7:242;;16:31;36:4;31:9;;7:242;-1:-1;34170:146:0;;-1:-1:-1;;34331:56:0;;;;34370:1;34363:8;;;;;;;;34331:56;34417:164;34576:4;34417:140;34519:37;34526:9;-1:-1:-1;;;;;34519:35:0;;:37::i;:::-;34513:2;:43;34417:77;34458:35;34465:7;-1:-1:-1;;;;;34458:33:0;;:35::i;:::-;34452:2;:41;34417:16;:4;34426:6;34417:16;:8;:16;:::i;:::-;:34;:77;:34;:77;:::i;:164::-;34410:171;32197:2392;-1:-1:-1;;;;;;;;;;32197:2392:0:o;70371:446::-;70585:20;70607:29;70661:148;70699:9;70723:7;70745:6;70766:5;70786:12;70661:23;:148::i;24744:166::-;24795:4;-1:-1:-1;;;;;24820:39:0;;;;:81;;-1:-1:-1;;;;;;24863:38:0;;22653:42;24863:38;24820:81;24812:90;24744:166;-1:-1:-1;;24744:166:0:o;25043:133::-;25143:19;25142:26;;25043:133::o;7430:471::-;7488:7;7733:6;7729:47;;-1:-1:-1;7763:1:0;7756:8;;7729:47;7800:5;;;7804:1;7800;:5;:1;7824:5;;;;;:10;7816:56;;;;-1:-1:-1;;;7816:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7892:1;7430:471;-1:-1:-1;;;7430:471:0:o;8369:132::-;8427:7;8454:39;8458:1;8461;8454:39;;;;;;;;;;;;;;;;;:3;:39::i;76314:481::-;76541:20;76576:29;76640:147;76677:9;76701:7;76723:6;76744:5;76764:12;76640:22;:147::i;25184:200::-;25267:4;25349:27;25357:12;25371:4;25349:7;:27::i;24205:531::-;24269:7;24295:12;24301:5;24295;:12::i;:::-;24291:54;;;-1:-1:-1;24331:2:0;24324:9;;24291:54;24443:37;;;22:32:-1;6:49;;24443:37:0;;;;;49:4:-1;25:18;;61:17;;-1:-1;;;;;182:15;-1:-1;;;179:29;160:49;;24393:98:0;;;;24358:12;;24372:17;;-1:-1:-1;;;;;24393:25:0;;;24423:4;;24443:37;;24393:98;;;;25:18:-1;24393:98:0;;25:18:-1;36:153;66:2;61:3;58:11;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;24393:98:0;;;;;;;;;;;;;;;;;;;;;;;;14:1:-1;21;16:31;;;;75:4;69:11;64:16;;144:4;140:9;133:4;115:16;111:27;107:43;104:1;100:51;94:4;87:65;169:16;166:1;159:27;225:16;222:1;215:4;212:1;208:12;193:49;7:242;;16:31;36:4;31:9;;7:242;;24357:134:0;;;;24507:7;24502:165;;24603:37;;;22:32:-1;6:49;;24603:37:0;;;;;49:4:-1;25:18;;61:17;;-1:-1;;;;;182:15;-1:-1;;;179:29;160:49;;24549:106:0;;;;-1:-1:-1;;;;;24549:25:0;;;24579:4;;24603:37;24549:106;;;25:18:-1;24549:106:0;;25:18:-1;36:153;66:2;61:3;58:11;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;24549:106:0;;;;;;;;;;;;;;;;;;;;;;;;14:1:-1;21;16:31;;;;75:4;69:11;64:16;;144:4;140:9;133:4;115:16;111:27;107:43;104:1;100:51;94:4;87:65;169:16;166:1;159:27;225:16;222:1;215:4;212:1;208:12;193:49;7:242;;16:31;36:4;31:9;;7:242;-1:-1;24531:124:0;;-1:-1:-1;24531:124:0;-1:-1:-1;24502:165:0;24686:7;:42;;24726:2;24686:42;;;24707:4;24696:27;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;24696:27:0;24679:49;24205:531;-1:-1:-1;;;;24205:531:0:o;70825:1883::-;71046:20;71068:29;71132:7;-1:-1:-1;;;;;71119:20:0;:9;-1:-1:-1;;;;;71119:20:0;;71115:86;;;71172:16;;;71186:1;71172:16;;;;;;;;;71164:6;;71172:16;;;17:15:-1;;105:10;71172:16:0;88:34:-1;136:17;;-1:-1;;71156:33:0;;-1:-1:-1;71156:33:0;-1:-1:-1;71156:33:0;;71115:86;71213:24;;:::i;:::-;71240:10;:8;:10::i;:::-;71213:37;-1:-1:-1;71267:32:0;:12;3930:5;71267:32;:20;:32;:::i;:::-;71263:1270;;;71321:6;71316:521;71337:14;71333:1;:18;71316:521;;;71401:7;71409:1;71401:10;;;;;;;;;;;-1:-1:-1;;;;;71381:31:0;:9;-1:-1:-1;;;;;71381:31:0;;71377:445;;;71444:358;71494:7;71502:1;71494:10;;;;;;;;;;;-1:-1:-1;;;;;71494:16:0;;:18;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;71494:18:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;71494:18:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;71494:18:0;71539:7;71573:135;71683:7;71691:1;71683:10;;;;;;;;;;;-1:-1:-1;;;;;71683:22:0;;:24;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;71683:24:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;71683:24:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;71683:24:0;71573:75;71614:7;71622:1;71614:10;;;;;;;;;;;-1:-1:-1;;;;;71614:31:0;;:33;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;71614:33:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;71614:33:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;71614:33:0;71573:6;;:75;:40;:75;:::i;:135::-;71735:5;71767:12;71444:23;:358::i;71377:445::-;71353:3;;71316:521;;;-1:-1:-1;71858:6:0;71853:669;71874:14;71870:1;:18;71853:669;;;71936:7;71944:1;71936:10;;;;;;;;;;;-1:-1:-1;;;;;71918:29:0;:7;-1:-1:-1;;;;;71918:29:0;;71914:593;;;71973:11;71986:21;72011:231;72061:9;72097:7;72105:1;72097:10;;;;;;;;;;;-1:-1:-1;;;;;72097:16:0;;:18;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;72097:18:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;72097:18:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;72097:18:0;72142:6;72175:5;72207:12;72011:23;:231::i;:::-;71972:270;;;;72301:132;72399:7;72407:1;72399:10;;;;;;;;;;;-1:-1:-1;;;;;72399:31:0;;:33;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;72399:33:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;72399:33:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;72399:33:0;72301:63;72339:7;72347:1;72339:10;;;;;;;;;;;-1:-1:-1;;;;;72339:22:0;;:24;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;72339:24:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;72339:24:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;72339:24:0;72301:3;;:63;:37;:63;:::i;:132::-;72267:220;-1:-1:-1;72460:4:0;-1:-1:-1;72267:220:0;;-1:-1:-1;;;72267:220:0;71914:593;71890:3;;71853:669;;;;71263:1270;72552:148;72590:9;72614:7;72636:6;72657:5;72677:12;72552:23;:148::i;:::-;72545:155;;;;;70825:1883;;;;;;;;:::o;9031:345::-;9117:7;9219:12;9212:5;9204:28;;;;-1:-1:-1;;;9204:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;9204:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9243:9;9259:1;9255;:5;;;;;;;9031:345;-1:-1:-1;;;;;9031:345:0:o;76803:1319::-;77036:20;77071:29;77145:7;-1:-1:-1;;;;;77132:20:0;:9;-1:-1:-1;;;;;77132:20:0;;77128:82;;;77177:6;;-1:-1:-1;77169:29:0;;77128:82;77226:31;:12;3696:4;77226:31;:20;:31;:::i;:::-;77222:725;;;77274:17;77294:23;77307:9;77294:12;:23::i;:::-;77274:43;-1:-1:-1;;;;;;77336:24:0;;;;77332:268;;77388:196;77433:10;77466:7;77496:6;77525:5;77553:12;77388:22;:196::i;:::-;77381:203;;;;;;;77332:268;77629:21;77642:7;77629:12;:21::i;:::-;77616:34;-1:-1:-1;;;;;;77669:24:0;;;;77665:271;;77721:199;77767:9;77799:10;77832:6;77861:5;77889:12;77721:23;:199::i;77665:271::-;77222:725;;77966:148;78004:9;78028:7;78050:6;78071:5;78091:12;77966:23;:148::i;69802:487::-;69844:16;;:::i;:::-;-1:-1:-1;69873:408:0;;;;;;;;69902:42;69873:408;;69967:42;69873:408;;;;70032:42;69873:408;;;;;;;70097:42;69873:408;;;;70162:42;69873:408;;;;70227:42;69873:408;;;;69802:487;:::o;46274:485::-;46501:20;46536:29;46600:151;46641:9;46665:7;46687:6;46708:5;46728:12;46600:26;:151::i;66483:1161::-;66697:20;66719:29;66783:7;-1:-1:-1;;;;;66770:20:0;:9;-1:-1:-1;;;;;66770:20:0;;66766:86;;;66823:16;;;66837:1;66823:16;;;;;;;;;66815:6;;66823:16;;;17:15:-1;;105:10;66823:16:0;88:34:-1;136:17;;-1:-1;;66807:33:0;;-1:-1:-1;66807:33:0;-1:-1:-1;66807:33:0;;66766:86;66868:31;:12;3881:5;66868:31;:20;:31;:::i;:::-;66864:605;;;66940:4;;-1:-1:-1;;;;;66920:25:0;;;66940:4;;66920:25;66916:263;;;67019:3;;66973:190;;-1:-1:-1;;;;;67019:3:0;67045:7;67075:6;67104:5;67132:12;66973:23;:190::i;:::-;66966:197;;;;;;66916:263;67217:4;;-1:-1:-1;;;;;67199:23:0;;;67217:4;;67199:23;67195:263;;;67328:3;;67250:192;;67296:9;;-1:-1:-1;;;;;67328:3:0;67354:6;67383:5;67411:12;67250:23;:192::i;67195:263::-;67488:148;67526:9;67550:7;67572:6;67593:5;67613:12;67488:23;:148::i;46767:1964::-;47004:20;47039:29;47113:7;-1:-1:-1;;;;;47100:20:0;:9;-1:-1:-1;;;;;47100:20:0;;47096:86;;;47153:16;;;47167:1;47153:16;;;;;;;;;47145:6;;47153:16;;;17:15:-1;;105:10;47153:16:0;88:34:-1;136:17;;-1:-1;;47137:33:0;;-1:-1:-1;47137:33:0;-1:-1:-1;47137:33:0;;47096:86;47198:35;:12;3552:4;47198:35;:20;:35;:::i;:::-;47194:1362;;;47254:27;47271:9;47254:16;:27::i;:::-;47250:576;;;47302:17;47322:35;47347:9;47322:24;:35::i;:::-;47302:55;-1:-1:-1;;;;;;47380:24:0;;;;47376:435;;47429:20;47475:9;-1:-1:-1;;;;;47452:53:0;;:55;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;47452:55:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;47452:55:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;47452:55:0;;-1:-1:-1;47539:252:0;47592:10;47629:7;47663:34;47692:4;47663:24;:6;47452:55;47663:24;:10;:24;:::i;:34::-;47724:5;47756:12;47539:26;:252::i;47376:435::-;47250:576;;47846:25;47863:7;47846:16;:25::i;:::-;47842:703;;;47892:17;47912:33;47937:7;47912:24;:33::i;:::-;47892:53;-1:-1:-1;;;;;;47968:24:0;;;;47964:566;;48017:20;48063:7;-1:-1:-1;;;;;48040:51:0;;:53;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;48040:53:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;48040:53:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;48040:53:0;;-1:-1:-1;48149:223:0;48199:9;48235:10;48272:6;48305:5;48337:12;48149:23;:223::i;47964:566::-;47842:703;;48575:148;48613:9;48637:7;48659:6;48680:5;48700:12;48575:23;:148::i;63324:1307::-;63551:20;63586:29;63660:7;-1:-1:-1;;;;;63647:20:0;:9;-1:-1:-1;;;;;63647:20:0;;63643:86;;;63700:16;;;63714:1;63700:16;;;;;;;;;63692:6;;63700:16;;;17:15:-1;;105:10;63700:16:0;88:34:-1;136:17;;-1:-1;;63684:33:0;;-1:-1:-1;63684:33:0;-1:-1:-1;63684:33:0;;63643:86;63745:31;:12;3649:4;63745:31;:20;:31;:::i;:::-;63741:715;;;63817:4;;-1:-1:-1;;;;;63797:25:0;;;63817:4;;63797:25;63793:279;;;63896:3;;63952:4;;63850:206;;-1:-1:-1;;;;;63896:3:0;;;;63922:7;;63952:22;;:4;63967:6;63952:22;:14;:22;:::i;:::-;63997:5;64025:12;63850:23;:206::i;63793:279::-;64110:4;;-1:-1:-1;;;;;64092:23:0;;;64110:4;;64092:23;64088:357;;;64245:3;;64167:192;;64213:9;;-1:-1:-1;;;;;64245:3:0;64271:6;64300:5;64328:12;64167:23;:192::i;:::-;64386:4;;64136:223;;-1:-1:-1;64136:223:0;-1:-1:-1;64386:28:0;;-1:-1:-1;;;;;64386:4:0;64136:223;64386:28;:14;:28;:::i;:::-;64378:51;-1:-1:-1;64378:51:0;;64088:357;64475:148;64513:9;64537:7;64559:6;64580:5;64600:12;64475:23;:148::i;45235:478::-;45327:4;;45297;;-1:-1:-1;;;;;45318:13:0;;;45327:4;;45318:13;45314:57;;;-1:-1:-1;45355:4:0;45348:11;;45314:57;45427:8;;45458:93;;;-1:-1:-1;;;;;45458:93:0;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;45458:93:0;;;;;;;25:18:-1;;61:17;;-1:-1;;;;;182:15;-1:-1;;;179:29;160:49;;45419:133:0;;;;45384:12;;45398:17;;45427:8;;;45452:4;;45458:93;;45419:133;;;25:18:-1;45419:133:0;;25:18:-1;36:153;66:2;61:3;58:11;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;45419:133:0;;;;;;;;;;;;;;;;;;;;;;;;14:1:-1;21;16:31;;;;75:4;69:11;64:16;;144:4;140:9;133:4;115:16;111:27;107:43;104:1;100:51;94:4;87:65;169:16;166:1;159:27;225:16;222:1;215:4;212:1;208:12;193:49;7:242;;16:31;36:4;31:9;;7:242;;45383:169:0;;;;45568:7;45563:53;;45599:5;45592:12;;;;;;45563:53;45629:13;45658:4;45647:32;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;45721:465:0;45823:4;;45791:6;;-1:-1:-1;;;;;45814:13:0;;;45823:4;;45814:13;45810:71;;;-1:-1:-1;45866:1:0;45844:25;;45810:71;45965:98;;;22:32:-1;6:49;;45965:98:0;;;;;49:4:-1;25:18;;61:17;;-1:-1;;;;;182:15;-1:-1;;;179:29;160:49;;45929:135:0;;;;45894:12;;45908:17;;-1:-1:-1;;;;;45929:25:0;;;45959:4;;45965:98;;45929:135;;;;25:18:-1;45929:135:0;;25:18:-1;36:153;66:2;61:3;58:11;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;45929:135:0;;;;;;;;;;;;;;;;;;;;;;;;14:1:-1;21;16:31;;;;75:4;69:11;64:16;;144:4;140:9;133:4;115:16;111:27;107:43;104:1;100:51;94:4;87:65;169:16;166:1;159:27;225:16;222:1;215:4;212:1;208:12;193:49;7:242;;16:31;36:4;31:9;;7:242;;45893:171:0;;;;46080:7;46075:58;;-1:-1:-1;;46104:17:0;;;;;;54724:484;54951:20;54986:29;55050:150;55090:9;55114:7;55136:6;55157:5;55177:12;55050:25;:150::i;62809:218::-;62908:7;62928:11;59997:42;-1:-1:-1;;;;;62949:7:0;;:9;;;;;;;;;;;;;;;;;;;;;;8::-1;5:2;;;30:1;27;20:12;5:2;62949:9:0;;;;8::-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;62949:9:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;62949:9:0;62943:3;:15;62942:41;;59997:42;-1:-1:-1;;;;;62974:7:0;;:9;;;;;;;;;;;;;;;;;;;;;;8::-1;5:2;;;30:1;27;20:12;5:2;62974:9:0;;;;8::-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;62974:9:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;62974:9:0;62942:41;;;62962:9;:7;:9::i;:::-;62928:55;;63001:18;63007:3;63012:6;63001:5;:18::i;41561:1406::-;41789:20;41824:29;41898:7;-1:-1:-1;;;;;41885:20:0;:9;-1:-1:-1;;;;;41885:20:0;;41881:86;;;41938:16;;;41952:1;41938:16;;;;;;;;;41930:6;;41938:16;;;17:15:-1;;105:10;41938:16:0;88:34:-1;136:17;;-1:-1;;41922:33:0;;-1:-1:-1;41922:33:0;-1:-1:-1;41922:33:0;;41881:86;41984:17;:9;-1:-1:-1;;;;;41984:15:0;;:17::i;:::-;41983:18;:38;;;;;42006:15;:7;-1:-1:-1;;;;;42006:13:0;;:15::i;:::-;42005:16;41983:38;:92;;;;-1:-1:-1;42026:49:0;:12;3808:5;42026:49;:28;:49;:::i;:::-;42025:50;41983:92;41979:813;;;42123:190;42165:9;25810:42;42223:6;42248:5;3453:4;42272:12;:26;42123:23;:190::i;:::-;42092:221;;-1:-1:-1;42092:221:0;-1:-1:-1;42330:21:0;42389:194;25810:42;42461:7;42092:221;42518:5;3453:4;42542:26;;42389:23;:194::i;:::-;42366:217;;-1:-1:-1;42366:217:0;-1:-1:-1;42603:6:0;42598:133;42619:12;:19;42615:1;:23;42598:133;;;42682:33;42713:1;42702:4;42707:1;42702:7;;;;;;;;;;;;;;:12;;42682;42695:1;42682:15;;;;;;;;;;;;;;:19;;:33;;;;:::i;:::-;42664:12;42677:1;42664:15;;;;;;;;;;;;;;;;;:51;42640:3;;42598:133;;;-1:-1:-1;42745:35:0;;-1:-1:-1;42745:35:0;41979:813;42811:148;42849:9;42873:7;42895:6;42916:5;42936:12;42811:23;:148::i;62583:218::-;62682:7;62702:11;59997:42;-1:-1:-1;;;;;62723:7:0;;:9;;;;;;;;;;;;;;;;;;;;;;8::-1;5:2;;;30:1;27;20:12;5:2;62723:9:0;;;;8::-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;62723:9:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;62723:9:0;62717:3;:15;62716:41;;59997:42;-1:-1:-1;;;;;62748:7:0;;:9;;;;;;;;;;;;;;;;;;;;;;8::-1;5:2;;;30:1;27;20:12;5:2;62748:9:0;;;;8::-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;62748:9:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;62748:9:0;62716:41;;;62736:9;:7;:9::i;:::-;62702:55;;62775:18;62781:6;62789:3;62775:5;:18::i;62444:131::-;62485:7;62512:55;62518:37;59997:42;-1:-1:-1;;;;;62523:7:0;;:9;;;;;;;;;;;;;;;;;;;;;;8::-1;5:2;;;30:1;27;20:12;5:2;62523:9:0;;;;8::-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;62523:9:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;62523:9:0;62540;;;-1:-1:-1;;;62540:9:0;;;;59997:42;;62540:7;;:9;;;;;62523;;62540;;;;;;;59997:42;62540:9;;;5:2:-1;;;;30:1;27;20:12;5:2;62540:9:0;;;;8::-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;62540:9:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;62540:9:0;62534:3;:15;60078:6;62518:4;:37::i;:::-;59997:42;-1:-1:-1;;;;;62557:7:0;;:9;;;;;;;;;;;;;;;;;;;;;;8::-1;5:2;;;30:1;27;20:12;5:2;62557:9:0;;;;8::-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;62557:9:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;62557:9:0;62512:5;:55::i;:::-;62505:62;;62444:131;:::o;60228:140::-;60287:9;60078:6;60344:10;60349:1;60352;60344:4;:10::i;:::-;:16;;;;;;;60228:140;-1:-1:-1;;;60228:140:0:o;26837:2570::-;27325:16;;;27339:1;27325:16;;;;;;;;;27183:20;;27218:29;;27325:16;;;;17:15:-1;;105:10;27325:16:0;88:34:-1;136:17;;-1:-1;27325:16:0;27310:31;;27371:7;-1:-1:-1;;;;;27358:20:0;:9;-1:-1:-1;;;;;27358:20:0;;27354:82;;;27403:6;;-1:-1:-1;27395:29:0;;27354:82;27448:80;;:::i;:::-;:473;;;;;;;;;;27546:35;:12;3071:4;27546:35;:21;:35;:::i;:::-;:81;;27605:22;27546:81;;;27584:18;27546:81;27448:473;;;;;;27642:33;:12;3119:4;27642:33;:21;:33;:::i;:::-;:79;;27701:20;27642:79;;;27680:18;27642:79;27448:473;;;;;;27736:34;:12;3453:4;27736:34;:21;:34;:::i;:::-;:80;;27795:21;27736:80;;;27774:18;27736:80;27448:473;;;;;;27831:33;:12;3501:4;27831:33;:21;:33;:::i;:::-;:79;;27890:20;27831:79;;;27869:18;27831:79;27448:473;;;;;-1:-1:-1;27934:23:0;;:::i;:::-;27968:27;;:::i;:::-;28011:6;28006:213;28027:12;28023:1;:16;28006:213;;;28072:64;28084:9;28095:7;28104:17;:6;28115:5;28104:17;:10;:17;:::i;:::-;28123:12;28072:8;28081:1;28072:11;;;;;;;;;;;:64;;:::i;:::-;28061:5;28067:1;28061:8;;;;;;;;;;:75;28151:4;:8;28160:5;28166:1;28160:8;;;;;;;;;;;28151:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;28151:18:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;28151:18:0;;;;28199:5;28205:1;28199:8;;;;;;;;;;;28184:9;28194:1;28184:12;;;;;;;;;;:23;28041:3;;28006:213;;;-1:-1:-1;28236:6:0;28231:1169;28252:5;28248:1;:9;28231:1169;;;28310:17;28360:1;28346:163;28367:12;28363:1;:16;28346:163;;;28420:5;28426:9;28420:16;;;;;;;;;;;28409:5;28415:1;28409:8;;;;;;;;;;;:27;28405:89;;;28473:1;28461:13;;28405:89;28381:3;;28346:163;;;;28570:34;28587:5;28593:9;28587:16;;;;;;;;;;;28570:12;;:34;:16;:34;:::i;:::-;28555:49;;28619:12;28632:9;28619:23;;;;;;;;;;;;;:25;;;;;;;;;;;28713:17;28733:6;28713:26;;28806:5;28798:1;28802;28798:5;:13;28794:595;;;28832:15;28850:211;28892:9;28924:7;28954:53;29001:5;28954:42;28968:12;28981:9;28968:23;;;;;;;;;;;;;;28994:1;28968:27;28954:9;:13;;:42;;;;:::i;:53::-;29030:12;28850:8;28859:9;28850:19;;;;;;:211;28832:229;;29094:9;29104;29094:20;;;;;;;;;;;29084:7;:30;29080:200;;;29158:33;29170:9;29180;29170:20;;;;;;;;;;;29158:7;;:33;:11;:33;:::i;:::-;29139:5;29145:9;29139:16;;;;;;;;;;:52;29080:200;;;29259:1;29240:5;29246:9;29240:16;;;;;;;;;;:20;29080:200;29298:4;:8;29307:5;29313:9;29307:16;;;;;;;;;;;29298:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;29298:26:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;29298:26:0;;;;29366:7;29343:9;29353;29343:20;;;;;;;;;;:30;-1:-1:-1;28794:595:0;-1:-1:-1;;28259:3:0;;28231:1169;;;;26837:2570;;;;;;;;;;;:::o;6058:181::-;6116:7;6148:5;;;6172:6;;;;6164:46;;;;;-1:-1:-1;;;6164:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;60376:140;60435:9;60507:1;60492:12;60497:1;60078:6;60492:4;:12::i;60524:1912::-;60596:9;60714:1;60733:255;;;;61044:9;;;61079:74;;;;61223:1;61218:6;;61037:214;;61079:74;61122:4;61117:9;;61037:214;;61295:1;61289:4;61285:12;61379:1;61376;61372:9;61367:14;;61336:1063;61405:1;61336:1063;;;61516:1;61513;61509:9;61569:1;61565;61561:2;61557:10;61554:17;61544:2;;61614:1;61611;61604:12;61544:2;61692:4;61688:2;61684:13;61738:2;61729:7;61726:15;61723:2;;;61783:1;61780;61773:12;61723:2;61856:4;61847:7;61843:18;61838:23;;61897:1;61894;61890:9;61887:2;;;61948:1;61945;61941:9;62028:1;62024;62020:2;62016:10;62013:17;62006:25;62001:1;61994:9;61987:17;61983:49;61980:2;;;62078:1;62075;62068:12;61980:2;62164:4;62160:2;62156:13;62214:2;62205:7;62202:15;62199:2;;;62263:1;62260;62253:12;62199:2;62331:18;;;;-1:-1:-1;;61887:2:0;61472:927;;61446:1;61443;61439:9;61434:14;;61336:1063;;;61014:1404;60707:1711;;60733:255;60770:1;60797:74;;;;60941:1;60936:6;;60763:206;;60797:74;60840:4;60835:9;;60763:206;;60707:1711;;60692:1737;;;;;:::o;60093:127::-;60151:9;60181:6;;;:30;;-1:-1:-1;;60196:5:0;;;60210:1;60205;60196:5;60205:1;60191:15;;;;;:20;60181:30;60173:39;;;;;25392:134;25493:19;25492:26;;;25392:134::o;36178:213::-;36359:7;36178:213;;;;;;:::o;6514:136::-;6572:7;6599:43;6603:1;6606;6599:43;;;;;;;;;;;;;;;;;7073:7;7109:12;7101:6;;;;7093:29;;;;-1:-1:-1;;;7093:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27:10:-1;;8:100;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;7093:29:0;-1:-1:-1;;;7145:5:0;;;6987:192::o;80295:1029::-;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;-1:-1;80295:1029:0;;;-1:-1:-1;;80295:1029:0:o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;-1:-1;80295:1029:0;;;-1:-1:-1;;80295:1029:0:o;:::-;
Swarm Source
bzzr://8cee42a0167b5da81b5e7a59bfa276d568ca3df48b74a449017376998977646b
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.