More Info
Private Name Tags
ContractCreator
TokenTracker
Latest 6 from a total of 6 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Clone Convex Old... | 14964594 | 966 days ago | IN | 0 ETH | 0.02074122 | ||||
Clone Convex Old... | 14964593 | 966 days ago | IN | 0 ETH | 0.0219882 | ||||
Clone Convex Old... | 14964592 | 966 days ago | IN | 0 ETH | 0.02407862 | ||||
Set Strategist | 14898176 | 977 days ago | IN | 0 ETH | 0.00160617 | ||||
Set Rewards | 14898170 | 977 days ago | IN | 0 ETH | 0.003639 | ||||
Set Keeper | 14898170 | 977 days ago | IN | 0 ETH | 0.00171639 |
Latest 23 internal transactions
Advanced mode:
Parent Transaction Hash | Block |
From
|
To
|
|||
---|---|---|---|---|---|---|
17845590 | 550 days ago | 0.1331833 ETH | ||||
17845590 | 550 days ago | 0.1331833 ETH | ||||
17244335 | 634 days ago | 3.18172787 ETH | ||||
17244335 | 634 days ago | 3.18172787 ETH | ||||
16673315 | 715 days ago | 3.25532067 ETH | ||||
16673315 | 715 days ago | 3.25532067 ETH | ||||
16424294 | 750 days ago | 1.81962975 ETH | ||||
16424294 | 750 days ago | 1.81962975 ETH | ||||
16339569 | 762 days ago | 5.29575307 ETH | ||||
16339569 | 762 days ago | 5.29575307 ETH | ||||
15886783 | 825 days ago | 4.44046514 ETH | ||||
15886783 | 825 days ago | 4.44046514 ETH | ||||
15594581 | 866 days ago | 7.37911805 ETH | ||||
15594581 | 866 days ago | 7.37911805 ETH | ||||
15131080 | 938 days ago | 1.94377968 ETH | ||||
15131080 | 938 days ago | 1.94377968 ETH | ||||
15035837 | 953 days ago | 0.40295651 ETH | ||||
15035837 | 953 days ago | 0.40295651 ETH | ||||
15008208 | 958 days ago | 0.36935318 ETH | ||||
15008208 | 958 days ago | 0.36935318 ETH | ||||
14964594 | 966 days ago | Contract Creation | 0 ETH | |||
14964593 | 966 days ago | Contract Creation | 0 ETH | |||
14964592 | 966 days ago | Contract Creation | 0 ETH |
Loading...
Loading
This contract may be a proxy contract. Click on More Options and select Is this a proxy? to confirm and enable the "Read as Proxy" & "Write as Proxy" tabs.
Contract Source Code Verified (Exact Match)
Contract Name:
StrategyConvexEthPoolsClonable
Compiler Version
v0.6.12+commit.27d51765
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-06-03 */ // SPDX-License-Identifier: AGPL-3.0 pragma solidity 0.6.12; pragma experimental ABIEncoderV2; // Global Enums and Structs struct StrategyParams { uint256 performanceFee; uint256 activation; uint256 debtRatio; uint256 minDebtPerHarvest; uint256 maxDebtPerHarvest; uint256 lastReport; uint256 totalDebt; uint256 totalGain; uint256 totalLoss; } // Part: IBaseFee interface IBaseFee { function isCurrentBaseFeeAcceptable() external view returns (bool); } // Part: IConvexDeposit interface IConvexDeposit { // deposit into convex, receive a tokenized deposit. parameter to stake immediately (we always do this). function deposit( uint256 _pid, uint256 _amount, bool _stake ) external returns (bool); // burn a tokenized deposit (Convex deposit tokens) to receive curve lp tokens back function withdraw(uint256 _pid, uint256 _amount) external returns (bool); // give us info about a pool based on its pid function poolInfo(uint256) external view returns ( address, address, address, address, address, bool ); } // Part: IConvexRewards interface IConvexRewards { // strategy's staked balance in the synthetix staking contract function balanceOf(address account) external view returns (uint256); // read how much claimable CRV a strategy has function earned(address account) external view returns (uint256); // stake a convex tokenized deposit function stake(uint256 _amount) external returns (bool); // withdraw to a convex tokenized deposit, probably never need to use this function withdraw(uint256 _amount, bool _claim) external returns (bool); // withdraw directly to curve LP token, this is what we primarily use function withdrawAndUnwrap(uint256 _amount, bool _claim) external returns (bool); // claim rewards, with an option to claim extra rewards or not function getReward(address _account, bool _claimExtras) external returns (bool); // check if we have rewards on a pool function extraRewardsLength() external view returns (uint256); // if we have rewards, see what the address is function extraRewards(uint256 _reward) external view returns (address); // read our rewards token function rewardToken() external view returns (address); // check our reward period finish function periodFinish() external view returns (uint256); } // Part: IOracle interface IOracle { function latestAnswer() external view returns (uint256); } // Part: IUniswapV2Router01 interface IUniswapV2Router01 { function factory() external pure returns (address); function WETH() external pure returns (address); function addLiquidity( address tokenA, address tokenB, uint256 amountADesired, uint256 amountBDesired, uint256 amountAMin, uint256 amountBMin, address to, uint256 deadline ) external returns ( uint256 amountA, uint256 amountB, uint256 liquidity ); function addLiquidityETH( address token, uint256 amountTokenDesired, uint256 amountTokenMin, uint256 amountETHMin, address to, uint256 deadline ) external payable returns ( uint256 amountToken, uint256 amountETH, uint256 liquidity ); function removeLiquidity( address tokenA, address tokenB, uint256 liquidity, uint256 amountAMin, uint256 amountBMin, address to, uint256 deadline ) external returns (uint256 amountA, uint256 amountB); function removeLiquidityETH( address token, uint256 liquidity, uint256 amountTokenMin, uint256 amountETHMin, address to, uint256 deadline ) external returns (uint256 amountToken, uint256 amountETH); function removeLiquidityWithPermit( address tokenA, address tokenB, uint256 liquidity, uint256 amountAMin, uint256 amountBMin, address to, uint256 deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external returns (uint256 amountA, uint256 amountB); function removeLiquidityETHWithPermit( address token, uint256 liquidity, uint256 amountTokenMin, uint256 amountETHMin, address to, uint256 deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external returns (uint256 amountToken, uint256 amountETH); function swapExactTokensForTokens( uint256 amountIn, uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external returns (uint256[] memory amounts); function swapTokensForExactTokens( uint256 amountOut, uint256 amountInMax, address[] calldata path, address to, uint256 deadline ) external returns (uint256[] memory amounts); function swapExactETHForTokens( uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external payable returns (uint256[] memory amounts); function swapTokensForExactETH( uint256 amountOut, uint256 amountInMax, address[] calldata path, address to, uint256 deadline ) external returns (uint256[] memory amounts); function swapExactTokensForETH( uint256 amountIn, uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external returns (uint256[] memory amounts); function swapETHForExactTokens( uint256 amountOut, address[] calldata path, address to, uint256 deadline ) external payable returns (uint256[] memory amounts); function quote( uint256 amountA, uint256 reserveA, uint256 reserveB ) external pure returns (uint256 amountB); function getAmountOut( uint256 amountIn, uint256 reserveIn, uint256 reserveOut ) external pure returns (uint256 amountOut); function getAmountIn( uint256 amountOut, uint256 reserveIn, uint256 reserveOut ) external pure returns (uint256 amountIn); function getAmountsOut(uint256 amountIn, address[] calldata path) external view returns (uint256[] memory amounts); function getAmountsIn(uint256 amountOut, address[] calldata path) external view returns (uint256[] memory amounts); } // Part: IWeth interface IWeth { function withdraw(uint256 wad) external; } // Part: OpenZeppelin/[email protected]/Address /** * @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 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]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); // solhint-disable-next-line avoid-low-level-calls, avoid-call-value (bool success, ) = recipient.call{ value: amount }(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain`call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) { return _functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); return _functionCallWithValue(target, data, value, errorMessage); } function _functionCallWithValue(address target, bytes memory data, uint256 weiValue, string memory errorMessage) private returns (bytes memory) { require(isContract(target), "Address: call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.call{ value: weiValue }(data); if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly // solhint-disable-next-line no-inline-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // Part: OpenZeppelin/[email protected]/IERC20 /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @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); } // Part: OpenZeppelin/[email protected]/Math /** * @dev Standard math utilities missing in the Solidity language. */ library Math { /** * @dev Returns the largest of two numbers. */ function max(uint256 a, uint256 b) internal pure returns (uint256) { return a >= b ? a : b; } /** * @dev Returns the smallest of two numbers. */ function min(uint256 a, uint256 b) internal pure returns (uint256) { return a < b ? a : b; } /** * @dev Returns the average of two numbers. The result is rounded towards * zero. */ function average(uint256 a, uint256 b) internal pure returns (uint256) { // (a + b) / 2 can overflow, so we distribute return (a / 2) + (b / 2) + ((a % 2 + b % 2) / 2); } } // Part: OpenZeppelin/[email protected]/SafeMath /** * @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. */ 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. */ function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { 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. */ function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b != 0, errorMessage); return a % b; } } // Part: yearn/[email protected]/HealthCheck interface HealthCheck { function check( uint256 profit, uint256 loss, uint256 debtPayment, uint256 debtOutstanding, uint256 totalDebt ) external view returns (bool); } // Part: ICurveFi interface ICurveFi is IERC20 { function get_virtual_price() external view returns (uint256); function coins(uint256) external view returns (address); function add_liquidity( // EURt uint256[2] calldata amounts, uint256 min_mint_amount ) external payable; function add_liquidity( // Compound, sAave uint256[2] calldata amounts, uint256 min_mint_amount, bool _use_underlying ) external payable returns (uint256); function add_liquidity( // Iron Bank, Aave uint256[3] calldata amounts, uint256 min_mint_amount, bool _use_underlying ) external payable returns (uint256); function add_liquidity( // 3Crv Metapools address pool, uint256[4] calldata amounts, uint256 min_mint_amount ) external; function add_liquidity( // Y and yBUSD uint256[4] calldata amounts, uint256 min_mint_amount, bool _use_underlying ) external payable returns (uint256); function add_liquidity( // 3pool uint256[3] calldata amounts, uint256 min_mint_amount ) external payable; function add_liquidity( // sUSD uint256[4] calldata amounts, uint256 min_mint_amount ) external payable; function remove_liquidity_imbalance( uint256[2] calldata amounts, uint256 max_burn_amount ) external; function remove_liquidity(uint256 _amount, uint256[2] calldata amounts) external; function remove_liquidity_one_coin( uint256 _token_amount, int128 i, uint256 min_amount ) external; function exchange( // CRV-ETH and CVX-ETH uint256 from, uint256 to, uint256 _from_amount, uint256 _min_to_amount, bool use_eth ) external; function exchange( // sETH int128 from, int128 to, uint256 _from_amount, uint256 _min_to_amount ) external payable returns (uint256); function balances(uint256) external view returns (uint256); function price_oracle() external view returns (uint256); function get_dy( int128 from, int128 to, uint256 _from_amount ) external view returns (uint256); // EURt function calc_token_amount(uint256[2] calldata _amounts, bool _is_deposit) external view returns (uint256); // 3Crv Metapools function calc_token_amount( address _pool, uint256[4] calldata _amounts, bool _is_deposit ) external view returns (uint256); // sUSD, Y pool, etc function calc_token_amount(uint256[4] calldata _amounts, bool _is_deposit) external view returns (uint256); // 3pool, Iron Bank, etc function calc_token_amount(uint256[3] calldata _amounts, bool _is_deposit) external view returns (uint256); function calc_withdraw_one_coin(uint256 amount, int128 i) external view returns (uint256); } // Part: IUniswapV2Router02 interface IUniswapV2Router02 is IUniswapV2Router01 { function removeLiquidityETHSupportingFeeOnTransferTokens( address token, uint256 liquidity, uint256 amountTokenMin, uint256 amountETHMin, address to, uint256 deadline ) external returns (uint256 amountETH); function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens( address token, uint256 liquidity, uint256 amountTokenMin, uint256 amountETHMin, address to, uint256 deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external returns (uint256 amountETH); function swapExactTokensForTokensSupportingFeeOnTransferTokens( uint256 amountIn, uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external; function swapExactETHForTokensSupportingFeeOnTransferTokens( uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external payable; function swapExactTokensForETHSupportingFeeOnTransferTokens( uint256 amountIn, uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external; } // Part: OpenZeppelin/[email protected]/SafeERC20 /** * @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 IERC20;` 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)); } /** * @dev Deprecated. This function has issues similar to the ones found in * {IERC20-approve}, and its usage is discouraged. * * Whenever possible, use {safeIncreaseAllowance} and * {safeDecreaseAllowance} instead. */ 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. We use {Address.functionCall} to perform this call, which verifies that // the target address contains contract code and also asserts for success in the low-level call. bytes memory returndata = address(token).functionCall(data, "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"); } } } // Part: yearn/[email protected]/VaultAPI interface VaultAPI is IERC20 { function name() external view returns (string calldata); function symbol() external view returns (string calldata); function decimals() external view returns (uint256); function apiVersion() external pure returns (string memory); function permit( address owner, address spender, uint256 amount, uint256 expiry, bytes calldata signature ) external returns (bool); // NOTE: Vyper produces multiple signatures for a given function with "default" args function deposit() external returns (uint256); function deposit(uint256 amount) external returns (uint256); function deposit(uint256 amount, address recipient) external returns (uint256); // NOTE: Vyper produces multiple signatures for a given function with "default" args function withdraw() external returns (uint256); function withdraw(uint256 maxShares) external returns (uint256); function withdraw(uint256 maxShares, address recipient) external returns (uint256); function token() external view returns (address); function strategies(address _strategy) external view returns (StrategyParams memory); function pricePerShare() external view returns (uint256); function totalAssets() external view returns (uint256); function depositLimit() external view returns (uint256); function maxAvailableShares() external view returns (uint256); /** * View how much the Vault would increase this Strategy's borrow limit, * based on its present performance (since its last report). Can be used to * determine expectedReturn in your Strategy. */ function creditAvailable() external view returns (uint256); /** * View how much the Vault would like to pull back from the Strategy, * based on its present performance (since its last report). Can be used to * determine expectedReturn in your Strategy. */ function debtOutstanding() external view returns (uint256); /** * View how much the Vault expect this Strategy to return at the current * block, based on its present performance (since its last report). Can be * used to determine expectedReturn in your Strategy. */ function expectedReturn() external view returns (uint256); /** * This is the main contact point where the Strategy interacts with the * Vault. It is critical that this call is handled as intended by the * Strategy. Therefore, this function will be called by BaseStrategy to * make sure the integration is correct. */ function report( uint256 _gain, uint256 _loss, uint256 _debtPayment ) external returns (uint256); /** * This function should only be used in the scenario where the Strategy is * being retired but no migration of the positions are possible, or in the * extreme scenario that the Strategy needs to be put into "Emergency Exit" * mode in order for it to exit as quickly as possible. The latter scenario * could be for any reason that is considered "critical" that the Strategy * exits its position as fast as possible, such as a sudden change in * market conditions leading to losses, or an imminent failure in an * external dependency. */ function revokeStrategy() external; /** * View the governance address of the Vault to assert privileged functions * can only be called by governance. The Strategy serves the Vault, so it * is subject to governance defined by the Vault. */ function governance() external view returns (address); /** * View the management address of the Vault to assert privileged functions * can only be called by management. The Strategy serves the Vault, so it * is subject to management defined by the Vault. */ function management() external view returns (address); /** * View the guardian address of the Vault to assert privileged functions * can only be called by guardian. The Strategy serves the Vault, so it * is subject to guardian defined by the Vault. */ function guardian() external view returns (address); } // Part: yearn/[email protected]/BaseStrategy /** * @title Yearn Base Strategy * @author yearn.finance * @notice * BaseStrategy implements all of the required functionality to interoperate * closely with the Vault contract. This contract should be inherited and the * abstract methods implemented to adapt the Strategy to the particular needs * it has to create a return. * * Of special interest is the relationship between `harvest()` and * `vault.report()'. `harvest()` may be called simply because enough time has * elapsed since the last report, and not because any funds need to be moved * or positions adjusted. This is critical so that the Vault may maintain an * accurate picture of the Strategy's performance. See `vault.report()`, * `harvest()`, and `harvestTrigger()` for further details. */ abstract contract BaseStrategy { using SafeMath for uint256; using SafeERC20 for IERC20; string public metadataURI; // health checks bool public doHealthCheck; address public healthCheck; /** * @notice * Used to track which version of `StrategyAPI` this Strategy * implements. * @dev The Strategy's version must match the Vault's `API_VERSION`. * @return A string which holds the current API version of this contract. */ function apiVersion() public pure returns (string memory) { return "0.4.3"; } /** * @notice This Strategy's name. * @dev * You can use this field to manage the "version" of this Strategy, e.g. * `StrategySomethingOrOtherV1`. However, "API Version" is managed by * `apiVersion()` function above. * @return This Strategy's name. */ function name() external view virtual returns (string memory); /** * @notice * The amount (priced in want) of the total assets managed by this strategy should not count * towards Yearn's TVL calculations. * @dev * You can override this field to set it to a non-zero value if some of the assets of this * Strategy is somehow delegated inside another part of of Yearn's ecosystem e.g. another Vault. * Note that this value must be strictly less than or equal to the amount provided by * `estimatedTotalAssets()` below, as the TVL calc will be total assets minus delegated assets. * Also note that this value is used to determine the total assets under management by this * strategy, for the purposes of computing the management fee in `Vault` * @return * The amount of assets this strategy manages that should not be included in Yearn's Total Value * Locked (TVL) calculation across it's ecosystem. */ function delegatedAssets() external view virtual returns (uint256) { return 0; } VaultAPI public vault; address public strategist; address public rewards; address public keeper; IERC20 public want; // So indexers can keep track of this event Harvested(uint256 profit, uint256 loss, uint256 debtPayment, uint256 debtOutstanding); event UpdatedStrategist(address newStrategist); event UpdatedKeeper(address newKeeper); event UpdatedRewards(address rewards); event UpdatedMinReportDelay(uint256 delay); event UpdatedMaxReportDelay(uint256 delay); event UpdatedProfitFactor(uint256 profitFactor); event UpdatedDebtThreshold(uint256 debtThreshold); event EmergencyExitEnabled(); event UpdatedMetadataURI(string metadataURI); event SetHealthCheck(address); event SetDoHealthCheck(bool); // The minimum number of seconds between harvest calls. See // `setMinReportDelay()` for more details. uint256 public minReportDelay; // The maximum number of seconds between harvest calls. See // `setMaxReportDelay()` for more details. uint256 public maxReportDelay; // The minimum multiple that `callCost` must be above the credit/profit to // be "justifiable". See `setProfitFactor()` for more details. uint256 public profitFactor; // Use this to adjust the threshold at which running a debt causes a // harvest trigger. See `setDebtThreshold()` for more details. uint256 public debtThreshold; // See note on `setEmergencyExit()`. bool public emergencyExit; // modifiers modifier onlyAuthorized() { require(msg.sender == strategist || msg.sender == governance(), "!authorized"); _; } modifier onlyEmergencyAuthorized() { require( msg.sender == strategist || msg.sender == governance() || msg.sender == vault.guardian() || msg.sender == vault.management(), "!authorized" ); _; } modifier onlyStrategist() { require(msg.sender == strategist, "!strategist"); _; } modifier onlyGovernance() { require(msg.sender == governance(), "!authorized"); _; } modifier onlyKeepers() { require( msg.sender == keeper || msg.sender == strategist || msg.sender == governance() || msg.sender == vault.guardian() || msg.sender == vault.management(), "!authorized" ); _; } modifier onlyVaultManagers() { require(msg.sender == vault.management() || msg.sender == governance(), "!authorized"); _; } constructor(address _vault) public { _initialize(_vault, msg.sender, msg.sender, msg.sender); } /** * @notice * Initializes the Strategy, this is called only once, when the * contract is deployed. * @dev `_vault` should implement `VaultAPI`. * @param _vault The address of the Vault responsible for this Strategy. * @param _strategist The address to assign as `strategist`. * The strategist is able to change the reward address * @param _rewards The address to use for pulling rewards. * @param _keeper The adddress of the _keeper. _keeper * can harvest and tend a strategy. */ function _initialize( address _vault, address _strategist, address _rewards, address _keeper ) internal { require(address(want) == address(0), "Strategy already initialized"); vault = VaultAPI(_vault); want = IERC20(vault.token()); want.safeApprove(_vault, uint256(-1)); // Give Vault unlimited access (might save gas) strategist = _strategist; rewards = _rewards; keeper = _keeper; // initialize variables minReportDelay = 0; maxReportDelay = 86400; profitFactor = 100; debtThreshold = 0; vault.approve(rewards, uint256(-1)); // Allow rewards to be pulled } function setHealthCheck(address _healthCheck) external onlyVaultManagers { emit SetHealthCheck(_healthCheck); healthCheck = _healthCheck; } function setDoHealthCheck(bool _doHealthCheck) external onlyVaultManagers { emit SetDoHealthCheck(_doHealthCheck); doHealthCheck = _doHealthCheck; } /** * @notice * Used to change `strategist`. * * This may only be called by governance or the existing strategist. * @param _strategist The new address to assign as `strategist`. */ function setStrategist(address _strategist) external onlyAuthorized { require(_strategist != address(0)); strategist = _strategist; emit UpdatedStrategist(_strategist); } /** * @notice * Used to change `keeper`. * * `keeper` is the only address that may call `tend()` or `harvest()`, * other than `governance()` or `strategist`. However, unlike * `governance()` or `strategist`, `keeper` may *only* call `tend()` * and `harvest()`, and no other authorized functions, following the * principle of least privilege. * * This may only be called by governance or the strategist. * @param _keeper The new address to assign as `keeper`. */ function setKeeper(address _keeper) external onlyAuthorized { require(_keeper != address(0)); keeper = _keeper; emit UpdatedKeeper(_keeper); } /** * @notice * Used to change `rewards`. EOA or smart contract which has the permission * to pull rewards from the vault. * * This may only be called by the strategist. * @param _rewards The address to use for pulling rewards. */ function setRewards(address _rewards) external onlyStrategist { require(_rewards != address(0)); vault.approve(rewards, 0); rewards = _rewards; vault.approve(rewards, uint256(-1)); emit UpdatedRewards(_rewards); } /** * @notice * Used to change `minReportDelay`. `minReportDelay` is the minimum number * of blocks that should pass for `harvest()` to be called. * * For external keepers (such as the Keep3r network), this is the minimum * time between jobs to wait. (see `harvestTrigger()` * for more details.) * * This may only be called by governance or the strategist. * @param _delay The minimum number of seconds to wait between harvests. */ function setMinReportDelay(uint256 _delay) external onlyAuthorized { minReportDelay = _delay; emit UpdatedMinReportDelay(_delay); } /** * @notice * Used to change `maxReportDelay`. `maxReportDelay` is the maximum number * of blocks that should pass for `harvest()` to be called. * * For external keepers (such as the Keep3r network), this is the maximum * time between jobs to wait. (see `harvestTrigger()` * for more details.) * * This may only be called by governance or the strategist. * @param _delay The maximum number of seconds to wait between harvests. */ function setMaxReportDelay(uint256 _delay) external onlyAuthorized { maxReportDelay = _delay; emit UpdatedMaxReportDelay(_delay); } /** * @notice * Used to change `profitFactor`. `profitFactor` is used to determine * if it's worthwhile to harvest, given gas costs. (See `harvestTrigger()` * for more details.) * * This may only be called by governance or the strategist. * @param _profitFactor A ratio to multiply anticipated * `harvest()` gas cost against. */ function setProfitFactor(uint256 _profitFactor) external onlyAuthorized { profitFactor = _profitFactor; emit UpdatedProfitFactor(_profitFactor); } /** * @notice * Sets how far the Strategy can go into loss without a harvest and report * being required. * * By default this is 0, meaning any losses would cause a harvest which * will subsequently report the loss to the Vault for tracking. (See * `harvestTrigger()` for more details.) * * This may only be called by governance or the strategist. * @param _debtThreshold How big of a loss this Strategy may carry without * being required to report to the Vault. */ function setDebtThreshold(uint256 _debtThreshold) external onlyAuthorized { debtThreshold = _debtThreshold; emit UpdatedDebtThreshold(_debtThreshold); } /** * @notice * Used to change `metadataURI`. `metadataURI` is used to store the URI * of the file describing the strategy. * * This may only be called by governance or the strategist. * @param _metadataURI The URI that describe the strategy. */ function setMetadataURI(string calldata _metadataURI) external onlyAuthorized { metadataURI = _metadataURI; emit UpdatedMetadataURI(_metadataURI); } /** * Resolve governance address from Vault contract, used to make assertions * on protected functions in the Strategy. */ function governance() internal view returns (address) { return vault.governance(); } /** * @notice * Provide an accurate conversion from `_amtInWei` (denominated in wei) * to `want` (using the native decimal characteristics of `want`). * @dev * Care must be taken when working with decimals to assure that the conversion * is compatible. As an example: * * given 1e17 wei (0.1 ETH) as input, and want is USDC (6 decimals), * with USDC/ETH = 1800, this should give back 1800000000 (180 USDC) * * @param _amtInWei The amount (in wei/1e-18 ETH) to convert to `want` * @return The amount in `want` of `_amtInEth` converted to `want` **/ function ethToWant(uint256 _amtInWei) public view virtual returns (uint256); /** * @notice * Provide an accurate estimate for the total amount of assets * (principle + return) that this Strategy is currently managing, * denominated in terms of `want` tokens. * * This total should be "realizable" e.g. the total value that could * *actually* be obtained from this Strategy if it were to divest its * entire position based on current on-chain conditions. * @dev * Care must be taken in using this function, since it relies on external * systems, which could be manipulated by the attacker to give an inflated * (or reduced) value produced by this function, based on current on-chain * conditions (e.g. this function is possible to influence through * flashloan attacks, oracle manipulations, or other DeFi attack * mechanisms). * * It is up to governance to use this function to correctly order this * Strategy relative to its peers in the withdrawal queue to minimize * losses for the Vault based on sudden withdrawals. This value should be * higher than the total debt of the Strategy and higher than its expected * value to be "safe". * @return The estimated total assets in this Strategy. */ function estimatedTotalAssets() public view virtual returns (uint256); /* * @notice * Provide an indication of whether this strategy is currently "active" * in that it is managing an active position, or will manage a position in * the future. This should correlate to `harvest()` activity, so that Harvest * events can be tracked externally by indexing agents. * @return True if the strategy is actively managing a position. */ function isActive() public view returns (bool) { return vault.strategies(address(this)).debtRatio > 0 || estimatedTotalAssets() > 0; } /** * Perform any Strategy unwinding or other calls necessary to capture the * "free return" this Strategy has generated since the last time its core * position(s) were adjusted. Examples include unwrapping extra rewards. * This call is only used during "normal operation" of a Strategy, and * should be optimized to minimize losses as much as possible. * * This method returns any realized profits and/or realized losses * incurred, and should return the total amounts of profits/losses/debt * payments (in `want` tokens) for the Vault's accounting (e.g. * `want.balanceOf(this) >= _debtPayment + _profit`). * * `_debtOutstanding` will be 0 if the Strategy is not past the configured * debt limit, otherwise its value will be how far past the debt limit * the Strategy is. The Strategy's debt limit is configured in the Vault. * * NOTE: `_debtPayment` should be less than or equal to `_debtOutstanding`. * It is okay for it to be less than `_debtOutstanding`, as that * should only used as a guide for how much is left to pay back. * Payments should be made to minimize loss from slippage, debt, * withdrawal fees, etc. * * See `vault.debtOutstanding()`. */ function prepareReturn(uint256 _debtOutstanding) internal virtual returns ( uint256 _profit, uint256 _loss, uint256 _debtPayment ); /** * Perform any adjustments to the core position(s) of this Strategy given * what change the Vault made in the "investable capital" available to the * Strategy. Note that all "free capital" in the Strategy after the report * was made is available for reinvestment. Also note that this number * could be 0, and you should handle that scenario accordingly. * * See comments regarding `_debtOutstanding` on `prepareReturn()`. */ function adjustPosition(uint256 _debtOutstanding) internal virtual; /** * Liquidate up to `_amountNeeded` of `want` of this strategy's positions, * irregardless of slippage. Any excess will be re-invested with `adjustPosition()`. * This function should return the amount of `want` tokens made available by the * liquidation. If there is a difference between them, `_loss` indicates whether the * difference is due to a realized loss, or if there is some other sitution at play * (e.g. locked funds) where the amount made available is less than what is needed. * * NOTE: The invariant `_liquidatedAmount + _loss <= _amountNeeded` should always be maintained */ function liquidatePosition(uint256 _amountNeeded) internal virtual returns (uint256 _liquidatedAmount, uint256 _loss); /** * Liquidate everything and returns the amount that got freed. * This function is used during emergency exit instead of `prepareReturn()` to * liquidate all of the Strategy's positions back to the Vault. */ function liquidateAllPositions() internal virtual returns (uint256 _amountFreed); /** * @notice * Provide a signal to the keeper that `tend()` should be called. The * keeper will provide the estimated gas cost that they would pay to call * `tend()`, and this function should use that estimate to make a * determination if calling it is "worth it" for the keeper. This is not * the only consideration into issuing this trigger, for example if the * position would be negatively affected if `tend()` is not called * shortly, then this can return `true` even if the keeper might be * "at a loss" (keepers are always reimbursed by Yearn). * @dev * `callCostInWei` must be priced in terms of `wei` (1e-18 ETH). * * This call and `harvestTrigger()` should never return `true` at the same * time. * @param callCostInWei The keeper's estimated gas cost to call `tend()` (in wei). * @return `true` if `tend()` should be called, `false` otherwise. */ function tendTrigger(uint256 callCostInWei) public view virtual returns (bool) { // We usually don't need tend, but if there are positions that need // active maintainence, overriding this function is how you would // signal for that. // If your implementation uses the cost of the call in want, you can // use uint256 callCost = ethToWant(callCostInWei); return false; } /** * @notice * Adjust the Strategy's position. The purpose of tending isn't to * realize gains, but to maximize yield by reinvesting any returns. * * See comments on `adjustPosition()`. * * This may only be called by governance, the strategist, or the keeper. */ function tend() external onlyKeepers { // Don't take profits with this call, but adjust for better gains adjustPosition(vault.debtOutstanding()); } /** * @notice * Provide a signal to the keeper that `harvest()` should be called. The * keeper will provide the estimated gas cost that they would pay to call * `harvest()`, and this function should use that estimate to make a * determination if calling it is "worth it" for the keeper. This is not * the only consideration into issuing this trigger, for example if the * position would be negatively affected if `harvest()` is not called * shortly, then this can return `true` even if the keeper might be "at a * loss" (keepers are always reimbursed by Yearn). * @dev * `callCostInWei` must be priced in terms of `wei` (1e-18 ETH). * * This call and `tendTrigger` should never return `true` at the * same time. * * See `min/maxReportDelay`, `profitFactor`, `debtThreshold` to adjust the * strategist-controlled parameters that will influence whether this call * returns `true` or not. These parameters will be used in conjunction * with the parameters reported to the Vault (see `params`) to determine * if calling `harvest()` is merited. * * It is expected that an external system will check `harvestTrigger()`. * This could be a script run off a desktop or cloud bot (e.g. * https://github.com/iearn-finance/yearn-vaults/blob/main/scripts/keep.py), * or via an integration with the Keep3r network (e.g. * https://github.com/Macarse/GenericKeep3rV2/blob/master/contracts/keep3r/GenericKeep3rV2.sol). * @param callCostInWei The keeper's estimated gas cost to call `harvest()` (in wei). * @return `true` if `harvest()` should be called, `false` otherwise. */ function harvestTrigger(uint256 callCostInWei) public view virtual returns (bool) { uint256 callCost = ethToWant(callCostInWei); StrategyParams memory params = vault.strategies(address(this)); // Should not trigger if Strategy is not activated if (params.activation == 0) return false; // Should not trigger if we haven't waited long enough since previous harvest if (block.timestamp.sub(params.lastReport) < minReportDelay) return false; // Should trigger if hasn't been called in a while if (block.timestamp.sub(params.lastReport) >= maxReportDelay) return true; // If some amount is owed, pay it back // NOTE: Since debt is based on deposits, it makes sense to guard against large // changes to the value from triggering a harvest directly through user // behavior. This should ensure reasonable resistance to manipulation // from user-initiated withdrawals as the outstanding debt fluctuates. uint256 outstanding = vault.debtOutstanding(); if (outstanding > debtThreshold) return true; // Check for profits and losses uint256 total = estimatedTotalAssets(); // Trigger if we have a loss to report if (total.add(debtThreshold) < params.totalDebt) return true; uint256 profit = 0; if (total > params.totalDebt) profit = total.sub(params.totalDebt); // We've earned a profit! // Otherwise, only trigger if it "makes sense" economically (gas cost // is <N% of value moved) uint256 credit = vault.creditAvailable(); return (profitFactor.mul(callCost) < credit.add(profit)); } /** * @notice * Harvests the Strategy, recognizing any profits or losses and adjusting * the Strategy's position. * * In the rare case the Strategy is in emergency shutdown, this will exit * the Strategy's position. * * This may only be called by governance, the strategist, or the keeper. * @dev * When `harvest()` is called, the Strategy reports to the Vault (via * `vault.report()`), so in some cases `harvest()` must be called in order * to take in profits, to borrow newly available funds from the Vault, or * otherwise adjust its position. In other cases `harvest()` must be * called to report to the Vault on the Strategy's position, especially if * any losses have occurred. */ function harvest() external onlyKeepers { uint256 profit = 0; uint256 loss = 0; uint256 debtOutstanding = vault.debtOutstanding(); uint256 debtPayment = 0; if (emergencyExit) { // Free up as much capital as possible uint256 amountFreed = liquidateAllPositions(); if (amountFreed < debtOutstanding) { loss = debtOutstanding.sub(amountFreed); } else if (amountFreed > debtOutstanding) { profit = amountFreed.sub(debtOutstanding); } debtPayment = debtOutstanding.sub(loss); } else { // Free up returns for Vault to pull (profit, loss, debtPayment) = prepareReturn(debtOutstanding); } // Allow Vault to take up to the "harvested" balance of this contract, // which is the amount it has earned since the last time it reported to // the Vault. uint256 totalDebt = vault.strategies(address(this)).totalDebt; debtOutstanding = vault.report(profit, loss, debtPayment); // Check if free returns are left, and re-invest them adjustPosition(debtOutstanding); // call healthCheck contract if (doHealthCheck && healthCheck != address(0)) { require(HealthCheck(healthCheck).check(profit, loss, debtPayment, debtOutstanding, totalDebt), "!healthcheck"); } else { emit SetDoHealthCheck(true); doHealthCheck = true; } emit Harvested(profit, loss, debtPayment, debtOutstanding); } /** * @notice * Withdraws `_amountNeeded` to `vault`. * * This may only be called by the Vault. * @param _amountNeeded How much `want` to withdraw. * @return _loss Any realized losses */ function withdraw(uint256 _amountNeeded) external returns (uint256 _loss) { require(msg.sender == address(vault), "!vault"); // Liquidate as much as possible to `want`, up to `_amountNeeded` uint256 amountFreed; (amountFreed, _loss) = liquidatePosition(_amountNeeded); // Send it directly back (NOTE: Using `msg.sender` saves some gas here) want.safeTransfer(msg.sender, amountFreed); // NOTE: Reinvest anything leftover on next `tend`/`harvest` } /** * Do anything necessary to prepare this Strategy for migration, such as * transferring any reserve or LP tokens, CDPs, or other tokens or stores of * value. */ function prepareMigration(address _newStrategy) internal virtual; /** * @notice * Transfers all `want` from this Strategy to `_newStrategy`. * * This may only be called by the Vault. * @dev * The new Strategy's Vault must be the same as this Strategy's Vault. * The migration process should be carefully performed to make sure all * the assets are migrated to the new address, which should have never * interacted with the vault before. * @param _newStrategy The Strategy to migrate to. */ function migrate(address _newStrategy) external { require(msg.sender == address(vault)); require(BaseStrategy(_newStrategy).vault() == vault); prepareMigration(_newStrategy); want.safeTransfer(_newStrategy, want.balanceOf(address(this))); } /** * @notice * Activates emergency exit. Once activated, the Strategy will exit its * position upon the next harvest, depositing all funds into the Vault as * quickly as is reasonable given on-chain conditions. * * This may only be called by governance or the strategist. * @dev * See `vault.setEmergencyShutdown()` and `harvest()` for further details. */ function setEmergencyExit() external onlyEmergencyAuthorized { emergencyExit = true; vault.revokeStrategy(); emit EmergencyExitEnabled(); } /** * Override this to add all tokens/tokenized positions this contract * manages on a *persistent* basis (e.g. not just for swapping back to * want ephemerally). * * NOTE: Do *not* include `want`, already included in `sweep` below. * * Example: * ``` * function protectedTokens() internal override view returns (address[] memory) { * address[] memory protected = new address[](3); * protected[0] = tokenA; * protected[1] = tokenB; * protected[2] = tokenC; * return protected; * } * ``` */ function protectedTokens() internal view virtual returns (address[] memory); /** * @notice * Removes tokens from this Strategy that are not the type of tokens * managed by this Strategy. This may be used in case of accidentally * sending the wrong kind of token to this Strategy. * * Tokens will be sent to `governance()`. * * This will fail if an attempt is made to sweep `want`, or any tokens * that are protected by this Strategy. * * This may only be called by governance. * @dev * Implement `protectedTokens()` to specify any additional tokens that * should be protected from sweeping in addition to `want`. * @param _token The token to transfer out of this vault. */ function sweep(address _token) external onlyGovernance { require(_token != address(want), "!want"); require(_token != address(vault), "!shares"); address[] memory _protectedTokens = protectedTokens(); for (uint256 i; i < _protectedTokens.length; i++) require(_token != _protectedTokens[i], "!protected"); IERC20(_token).safeTransfer(governance(), IERC20(_token).balanceOf(address(this))); } } // Part: StrategyConvexBase abstract contract StrategyConvexBase is BaseStrategy { using Address for address; /* ========== STATE VARIABLES ========== */ // these should stay the same across different wants. // convex stuff address internal constant depositContract = 0xF403C135812408BFbE8713b5A23a04b3D48AAE31; // this is the deposit contract that all pools use, aka booster IConvexRewards public rewardsContract; // This is unique to each curve pool address public virtualRewardsPool; // This is only if we have bonus rewards uint256 public pid; // this is unique to each pool // keepCRV stuff uint256 public keepCRV; // the percentage of CRV we re-lock for boost (in basis points) uint256 public keepCVX; // the percentage of CVX we keep for boosting yield (in basis points) address public keepCVXDestination; // where we send the CVX we are keeping address internal constant voter = 0xF147b8125d2ef93FB6965Db97D6746952a133934; // Yearn's veCRV voter, we send some extra CRV here uint256 internal constant FEE_DENOMINATOR = 10000; // this means all of our fee values are in basis points // Swap stuff address internal constant sushiswap = 0xd9e1cE17f2641f24aE83637ab66a2cca9C378B9F; // we use this to sell our bonus token IERC20 internal constant crv = IERC20(0xD533a949740bb3306d119CC777fa900bA034cd52); IERC20 internal constant convexToken = IERC20(0x4e3FBD56CD56c3e72c1403e103b45Db9da5B9D2B); IERC20 internal constant weth = IERC20(0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2); // keeper stuff uint256 public harvestProfitMin; // minimum size in USD (6 decimals) that we want to harvest uint256 public harvestProfitMax; // maximum size in USD (6 decimals) that we want to harvest uint256 public creditThreshold; // amount of credit in underlying tokens that will automatically trigger a harvest bool internal forceHarvestTriggerOnce; // only set this to true when we want to trigger our keepers to harvest for us string internal stratName; // convex-specific variables bool public claimRewards; // boolean if we should always claim rewards when withdrawing, usually via withdrawAndUnwrap (generally this should be false) /* ========== CONSTRUCTOR ========== */ constructor(address _vault) public BaseStrategy(_vault) {} /* ========== VIEWS ========== */ function name() external view override returns (string memory) { return stratName; } /// @notice How much want we have staked in Convex function stakedBalance() public view returns (uint256) { return rewardsContract.balanceOf(address(this)); } /// @notice Balance of want sitting in our strategy function balanceOfWant() public view returns (uint256) { return want.balanceOf(address(this)); } /// @notice How much CRV we can claim from the staking contract function claimableBalance() public view returns (uint256) { return rewardsContract.earned(address(this)); } function estimatedTotalAssets() public view override returns (uint256) { return balanceOfWant().add(stakedBalance()); } /* ========== MUTATIVE FUNCTIONS ========== */ function adjustPosition(uint256 _debtOutstanding) internal override { if (emergencyExit) { return; } // Send all of our Curve pool tokens to be deposited uint256 _toInvest = balanceOfWant(); // deposit into convex and stake immediately (but only if we have something to invest) if (_toInvest > 0) { IConvexDeposit(depositContract).deposit(pid, _toInvest, true); } } function liquidatePosition(uint256 _amountNeeded) internal override returns (uint256 _liquidatedAmount, uint256 _loss) { uint256 _wantBal = balanceOfWant(); if (_amountNeeded > _wantBal) { uint256 _stakedBal = stakedBalance(); if (_stakedBal > 0) { rewardsContract.withdrawAndUnwrap( Math.min(_stakedBal, _amountNeeded.sub(_wantBal)), claimRewards ); } uint256 _withdrawnBal = balanceOfWant(); _liquidatedAmount = Math.min(_amountNeeded, _withdrawnBal); _loss = _amountNeeded.sub(_liquidatedAmount); } else { // we have enough balance to cover the liquidation available return (_amountNeeded, 0); } } // fire sale, get rid of it all! function liquidateAllPositions() internal override returns (uint256) { uint256 _stakedBal = stakedBalance(); if (_stakedBal > 0) { // don't bother withdrawing zero rewardsContract.withdrawAndUnwrap(_stakedBal, claimRewards); } return balanceOfWant(); } // in case we need to exit into the convex deposit token, this will allow us to do that // make sure to check claimRewards before this step if needed // plan to have gov sweep convex deposit tokens from strategy after this function withdrawToConvexDepositTokens() external onlyVaultManagers { uint256 _stakedBal = stakedBalance(); if (_stakedBal > 0) { rewardsContract.withdraw(_stakedBal, claimRewards); } } // we don't want for these tokens to be swept out. We allow gov to sweep out cvx vault tokens; we would only be holding these if things were really, really rekt. function protectedTokens() internal view override returns (address[] memory) {} /* ========== SETTERS ========== */ // These functions are useful for setting parameters of the strategy that may need to be adjusted. // Set the amount of CRV to be locked in Yearn's veCRV voter from each harvest. Default is 10%. Option to keep CVX as well. function setKeep( uint256 _keepCRV, uint256 _keepCVX, address _keepCVXDestination ) external onlyGovernance { require(_keepCRV <= 10_000 && _keepCVX <= 10_000); keepCRV = _keepCRV; keepCVX = _keepCVX; keepCVXDestination = _keepCVXDestination; } // We usually don't need to claim rewards on withdrawals, but might change our mind for migrations etc function setClaimRewards(bool _claimRewards) external onlyVaultManagers { claimRewards = _claimRewards; } // This allows us to manually harvest with our keeper as needed function setForceHarvestTriggerOnce(bool _forceHarvestTriggerOnce) external onlyVaultManagers { forceHarvestTriggerOnce = _forceHarvestTriggerOnce; } } // File: StrategyConvexEthPoolsClonable.sol contract StrategyConvexEthPoolsClonable is StrategyConvexBase { /* ========== STATE VARIABLES ========== */ // these will likely change across different wants. // Curve stuff ICurveFi public curve; // Curve Pool, this is our pool specific to this vault bool public checkEarmark; // this determines if we should check if we need to earmark rewards before harvesting // use Curve to sell our CVX and CRV rewards to WETH ICurveFi internal constant crveth = ICurveFi(0x8301AE4fc9c624d1D396cbDAa1ed877821D7C511); // use curve's new CRV-ETH crypto pool to sell our CRV ICurveFi internal constant cvxeth = ICurveFi(0xB576491F1E6e5E62f1d8F26062Ee822B40B0E0d4); // use curve's new CVX-ETH crypto pool to sell our CVX // use this to check on our claimable profit IERC20 internal constant usdt = IERC20(0xdAC17F958D2ee523a2206206994597C13D831ec7); // rewards token info. we can have more than 1 reward token but this is rare, so we don't include this in the template IERC20 public rewardsToken; bool public hasRewards; address[] internal rewardsPath; // check for cloning bool internal isOriginal = true; /* ========== CONSTRUCTOR ========== */ constructor( address _vault, uint256 _pid, address _curvePool, string memory _name ) public StrategyConvexBase(_vault) { _initializeStrat(_pid, _curvePool, _name); } /* ========== CLONING ========== */ event Cloned(address indexed clone); // we use this to clone our original strategy to other vaults function cloneConvexOldEth( address _vault, address _strategist, address _rewards, address _keeper, uint256 _pid, address _curvePool, string memory _name ) external returns (address payable newStrategy) { require(isOriginal); // Copied from https://github.com/optionality/clone-factory/blob/master/contracts/CloneFactory.sol bytes20 addressBytes = bytes20(address(this)); assembly { // EIP-1167 bytecode let clone_code := mload(0x40) mstore( clone_code, 0x3d602d80600a3d3981f3363d3d373d3d3d363d73000000000000000000000000 ) mstore(add(clone_code, 0x14), addressBytes) mstore( add(clone_code, 0x28), 0x5af43d82803e903d91602b57fd5bf30000000000000000000000000000000000 ) newStrategy := create(0, clone_code, 0x37) } StrategyConvexEthPoolsClonable(newStrategy).initialize( _vault, _strategist, _rewards, _keeper, _pid, _curvePool, _name ); emit Cloned(newStrategy); } // this will only be called by the clone function above function initialize( address _vault, address _strategist, address _rewards, address _keeper, uint256 _pid, address _curvePool, string memory _name ) public { _initialize(_vault, _strategist, _rewards, _keeper); _initializeStrat(_pid, _curvePool, _name); } // this is called by our original strategy, as well as any clones function _initializeStrat( uint256 _pid, address _curvePool, string memory _name ) internal { // make sure that we haven't initialized this before require(address(curve) == address(0)); // already initialized. // You can set these parameters on deployment to whatever you want maxReportDelay = 21 days; // 21 days in seconds, if we hit this then harvestTrigger = True healthCheck = 0xDDCea799fF1699e98EDF118e0629A974Df7DF012; // health.ychad.eth harvestProfitMin = 60000e6; harvestProfitMax = 120000e6; creditThreshold = 4000 * 1e18; // roughly $1m in ETH keepCRV = 1000; // default of 10% keepCVXDestination = 0x93A62dA5a14C80f265DAbC077fCEE437B1a0Efde; // default to treasury // want = Curve LP want.approve(address(depositContract), type(uint256).max); convexToken.approve(address(cvxeth), type(uint256).max); crv.approve(address(crveth), type(uint256).max); // this is the pool specific to this vault curve = ICurveFi(_curvePool); // setup our rewards contract pid = _pid; // this is the pool ID on convex, we use this to determine what the reweardsContract address is (address lptoken, , , address _rewardsContract, , ) = IConvexDeposit(depositContract).poolInfo(_pid); // set up our rewardsContract rewardsContract = IConvexRewards(_rewardsContract); // check that our LP token based on our pid matches our want require(address(lptoken) == address(want)); // set our strategy's name stratName = _name; } /* ========== MUTATIVE FUNCTIONS ========== */ function prepareReturn(uint256 _debtOutstanding) internal override returns ( uint256 _profit, uint256 _loss, uint256 _debtPayment ) { // this claims our CRV, CVX, and any extra tokens like SNX or ANKR. no harm leaving this true even if no extra rewards currently. rewardsContract.getReward(address(this), true); uint256 crvBalance = crv.balanceOf(address(this)); uint256 convexBalance = convexToken.balanceOf(address(this)); uint256 _sendToVoter = crvBalance.mul(keepCRV).div(FEE_DENOMINATOR); if (_sendToVoter > 0) { crv.safeTransfer(voter, _sendToVoter); crvBalance = crv.balanceOf(address(this)); } uint256 _cvxToKeep = convexBalance.mul(keepCVX).div(FEE_DENOMINATOR); if (_cvxToKeep > 0) { convexToken.safeTransfer(keepCVXDestination, _cvxToKeep); convexBalance = convexToken.balanceOf(address(this)); } // claim and sell our rewards if we have them if (hasRewards) { uint256 _rewardsBalance = IERC20(rewardsToken).balanceOf(address(this)); if (_rewardsBalance > 0) { _sellRewards(_rewardsBalance); } } _sellCrvAndCvx(crvBalance, convexBalance); // deposit our ETH to the pool uint256 ethBalance = address(this).balance; if (ethBalance > 0) { curve.add_liquidity{value: ethBalance}([ethBalance, 0], 0); } // debtOustanding will only be > 0 in the event of revoking or if we need to rebalance from a withdrawal or lowering the debtRatio if (_debtOutstanding > 0) { uint256 _stakedBal = stakedBalance(); if (_stakedBal > 0) { rewardsContract.withdrawAndUnwrap( Math.min(_stakedBal, _debtOutstanding), claimRewards ); } uint256 _withdrawnBal = balanceOfWant(); _debtPayment = Math.min(_debtOutstanding, _withdrawnBal); } // serious loss should never happen, but if it does (for instance, if Curve is hacked), let's record it accurately uint256 assets = estimatedTotalAssets(); uint256 debt = vault.strategies(address(this)).totalDebt; // if assets are greater than debt, things are working great! if (assets > debt) { _profit = assets.sub(debt); uint256 _wantBal = balanceOfWant(); if (_profit.add(_debtPayment) > _wantBal) { // this should only be hit following donations to strategy liquidateAllPositions(); } } // if assets are less than debt, we are in trouble else { _loss = debt.sub(assets); } // we're done harvesting, so reset our trigger if we used it forceHarvestTriggerOnce = false; } // migrate our want token to a new strategy if needed, make sure to check claimRewards first // also send over any CRV or CVX that is claimed; for migrations we definitely want to claim function prepareMigration(address _newStrategy) internal override { uint256 _stakedBal = stakedBalance(); if (_stakedBal > 0) { rewardsContract.withdrawAndUnwrap(_stakedBal, claimRewards); } crv.safeTransfer(_newStrategy, crv.balanceOf(address(this))); convexToken.safeTransfer( _newStrategy, convexToken.balanceOf(address(this)) ); } // Sells our CRV -> WETH and CVX -> WETH on Curve, and the unwraps this and any other WETH from our rewards. function _sellCrvAndCvx(uint256 _crvAmount, uint256 _convexAmount) internal { if (_convexAmount > 1e17) { // don't want to swap dust or we might revert cvxeth.exchange(1, 0, _convexAmount, 0, false); } if (_crvAmount > 1e17) { // don't want to swap dust or we might revert crveth.exchange(1, 0, _crvAmount, 0, false); } uint256 wethBalance = weth.balanceOf(address(this)); if (wethBalance > 0) { IWeth(address(weth)).withdraw(wethBalance); } } // Sells our harvested reward token into the selected output. function _sellRewards(uint256 _amount) internal { IUniswapV2Router02(sushiswap).swapExactTokensForTokens( _amount, uint256(0), rewardsPath, address(this), block.timestamp ); } /* ========== KEEP3RS ========== */ // use this to determine when to harvest function harvestTrigger(uint256 callCostinEth) public view override returns (bool) { // Should not trigger if strategy is not active (no assets and no debtRatio). This means we don't need to adjust keeper job. if (!isActive()) { return false; } // only check if we need to earmark on vaults we know are problematic if (checkEarmark) { // don't harvest if we need to earmark convex rewards if (needsEarmarkReward()) { return false; } } // harvest if we have a profit to claim at our upper limit without considering gas price uint256 claimableProfit = claimableProfitInUsdt(); if (claimableProfit > harvestProfitMax) { return true; } // check if the base fee gas price is higher than we allow. if it is, block harvests. if (!isBaseFeeAcceptable()) { return false; } // trigger if we want to manually harvest, but only if our gas price is acceptable if (forceHarvestTriggerOnce) { return true; } // harvest if we have a sufficient profit to claim, but only if our gas price is acceptable if (claimableProfit > harvestProfitMin) { return true; } StrategyParams memory params = vault.strategies(address(this)); // harvest no matter what once we reach our maxDelay if (block.timestamp.sub(params.lastReport) > maxReportDelay) { return true; } // harvest our credit if it's above our threshold if (vault.creditAvailable() > creditThreshold) { return true; } // otherwise, we don't harvest return false; } /// @notice The value in dollars that our claimable rewards are worth (in USDT, 6 decimals). function claimableProfitInUsdt() public view returns (uint256) { // calculations pulled directly from CVX's contract for minting CVX per CRV claimed uint256 totalCliffs = 1_000; uint256 maxSupply = 100 * 1_000_000 * 1e18; // 100mil uint256 reductionPerCliff = 100_000 * 1e18; // 100,000 uint256 supply = convexToken.totalSupply(); uint256 mintableCvx; uint256 cliff = supply.div(reductionPerCliff); uint256 _claimableBal = claimableBalance(); //mint if below total cliffs if (cliff < totalCliffs) { //for reduction% take inverse of current cliff uint256 reduction = totalCliffs.sub(cliff); //reduce mintableCvx = _claimableBal.mul(reduction).div(totalCliffs); //supply cap check uint256 amtTillMax = maxSupply.sub(supply); if (mintableCvx > amtTillMax) { mintableCvx = amtTillMax; } } // our chainlink oracle returns prices normalized to 8 decimals, we convert it to 6 IOracle ethOracle = IOracle(0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419); uint256 ethPrice = ethOracle.latestAnswer().div(1e2); // 1e8 div 1e2 = 1e6 uint256 crvPrice = crveth.price_oracle().mul(ethPrice).div(1e18); // 1e18 mul 1e6 div 1e18 = 1e6 uint256 cvxPrice = cvxeth.price_oracle().mul(ethPrice).div(1e18); // 1e18 mul 1e6 div 1e18 = 1e6 uint256 crvValue = crvPrice.mul(_claimableBal).div(1e18); // 1e6 mul 1e18 div 1e18 = 1e6 uint256 cvxValue = cvxPrice.mul(mintableCvx).div(1e18); // 1e6 mul 1e18 div 1e18 = 1e6 // get the value of our rewards token if we have one uint256 rewardsValue; if (hasRewards) { address[] memory usd_path = new address[](3); usd_path[0] = address(rewardsToken); usd_path[1] = address(weth); usd_path[2] = address(usdt); uint256 _claimableBonusBal = IConvexRewards(virtualRewardsPool).earned(address(this)); if (_claimableBonusBal > 0) { uint256[] memory rewardSwap = IUniswapV2Router02(sushiswap).getAmountsOut( _claimableBonusBal, usd_path ); rewardsValue = rewardSwap[rewardSwap.length - 1]; } } return crvValue.add(cvxValue).add(rewardsValue); } // convert our keeper's eth cost into want, we don't need this anymore since we don't use baseStrategy harvestTrigger function ethToWant(uint256 _ethAmount) public view override returns (uint256) {} // check if the current baseFee is below our external target function isBaseFeeAcceptable() internal view returns (bool) { return IBaseFee(0xb5e1CAcB567d98faaDB60a1fD4820720141f064F) .isCurrentBaseFeeAcceptable(); } /// @notice True if someone needs to earmark rewards on Convex before keepers harvest again function needsEarmarkReward() public view returns (bool needsEarmark) { // check if there is any CRV we need to earmark uint256 crvExpiry = rewardsContract.periodFinish(); if (crvExpiry < block.timestamp) { return true; } else if (hasRewards) { // check if there is any bonus reward we need to earmark uint256 rewardsExpiry = IConvexRewards(virtualRewardsPool).periodFinish(); return rewardsExpiry < block.timestamp; } } // include so our contract plays nicely with ether receive() external payable {} /* ========== SETTERS ========== */ // These functions are useful for setting parameters of the strategy that may need to be adjusted. // Use to add, update or remove rewards function updateRewards(bool _hasRewards, uint256 _rewardsIndex) external onlyGovernance { if ( address(rewardsToken) != address(0) && address(rewardsToken) != address(convexToken) ) { rewardsToken.approve(sushiswap, uint256(0)); } if (_hasRewards == false) { hasRewards = false; rewardsToken = IERC20(address(0)); virtualRewardsPool = address(0); } else { // update with our new token. get this via our virtualRewardsPool virtualRewardsPool = rewardsContract.extraRewards(_rewardsIndex); address _rewardsToken = IConvexRewards(virtualRewardsPool).rewardToken(); rewardsToken = IERC20(_rewardsToken); // approve, setup our path, and turn on rewards rewardsToken.approve(sushiswap, type(uint256).max); rewardsPath = [address(rewardsToken), address(weth)]; hasRewards = true; } } // Min profit to start checking for harvests if gas is good, max will harvest no matter gas (both in USDT, 6 decimals). // Credit threshold is in want token, and will trigger a harvest if credit is large enough. check earmark to look at convex's booster. function setHarvestTriggerParams( uint256 _harvestProfitMin, uint256 _harvestProfitMax, uint256 _creditThreshold, bool _checkEarmark ) external onlyVaultManagers { harvestProfitMin = _harvestProfitMin; harvestProfitMax = _harvestProfitMax; creditThreshold = _creditThreshold; checkEarmark = _checkEarmark; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"_vault","type":"address"},{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"address","name":"_curvePool","type":"address"},{"internalType":"string","name":"_name","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"clone","type":"address"}],"name":"Cloned","type":"event"},{"anonymous":false,"inputs":[],"name":"EmergencyExitEnabled","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"profit","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"loss","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"debtPayment","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"debtOutstanding","type":"uint256"}],"name":"Harvested","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"","type":"bool"}],"name":"SetDoHealthCheck","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"","type":"address"}],"name":"SetHealthCheck","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"debtThreshold","type":"uint256"}],"name":"UpdatedDebtThreshold","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"newKeeper","type":"address"}],"name":"UpdatedKeeper","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"delay","type":"uint256"}],"name":"UpdatedMaxReportDelay","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"metadataURI","type":"string"}],"name":"UpdatedMetadataURI","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"delay","type":"uint256"}],"name":"UpdatedMinReportDelay","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"profitFactor","type":"uint256"}],"name":"UpdatedProfitFactor","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"rewards","type":"address"}],"name":"UpdatedRewards","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"newStrategist","type":"address"}],"name":"UpdatedStrategist","type":"event"},{"inputs":[],"name":"apiVersion","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"balanceOfWant","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"checkEarmark","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"claimRewards","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"claimableBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"claimableProfitInUsdt","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_vault","type":"address"},{"internalType":"address","name":"_strategist","type":"address"},{"internalType":"address","name":"_rewards","type":"address"},{"internalType":"address","name":"_keeper","type":"address"},{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"address","name":"_curvePool","type":"address"},{"internalType":"string","name":"_name","type":"string"}],"name":"cloneConvexOldEth","outputs":[{"internalType":"address payable","name":"newStrategy","type":"address"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"creditThreshold","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"curve","outputs":[{"internalType":"contract ICurveFi","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"debtThreshold","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"delegatedAssets","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"doHealthCheck","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"emergencyExit","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"estimatedTotalAssets","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_ethAmount","type":"uint256"}],"name":"ethToWant","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"harvest","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"harvestProfitMax","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"harvestProfitMin","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"callCostinEth","type":"uint256"}],"name":"harvestTrigger","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"hasRewards","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"healthCheck","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_vault","type":"address"},{"internalType":"address","name":"_strategist","type":"address"},{"internalType":"address","name":"_rewards","type":"address"},{"internalType":"address","name":"_keeper","type":"address"},{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"address","name":"_curvePool","type":"address"},{"internalType":"string","name":"_name","type":"string"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"isActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"keepCRV","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"keepCVX","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"keepCVXDestination","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"keeper","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxReportDelay","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"metadataURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_newStrategy","type":"address"}],"name":"migrate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"minReportDelay","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"needsEarmarkReward","outputs":[{"internalType":"bool","name":"needsEarmark","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pid","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"profitFactor","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rewards","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rewardsContract","outputs":[{"internalType":"contract IConvexRewards","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rewardsToken","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"_claimRewards","type":"bool"}],"name":"setClaimRewards","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_debtThreshold","type":"uint256"}],"name":"setDebtThreshold","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_doHealthCheck","type":"bool"}],"name":"setDoHealthCheck","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"setEmergencyExit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_forceHarvestTriggerOnce","type":"bool"}],"name":"setForceHarvestTriggerOnce","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_harvestProfitMin","type":"uint256"},{"internalType":"uint256","name":"_harvestProfitMax","type":"uint256"},{"internalType":"uint256","name":"_creditThreshold","type":"uint256"},{"internalType":"bool","name":"_checkEarmark","type":"bool"}],"name":"setHarvestTriggerParams","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_healthCheck","type":"address"}],"name":"setHealthCheck","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_keepCRV","type":"uint256"},{"internalType":"uint256","name":"_keepCVX","type":"uint256"},{"internalType":"address","name":"_keepCVXDestination","type":"address"}],"name":"setKeep","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_keeper","type":"address"}],"name":"setKeeper","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_delay","type":"uint256"}],"name":"setMaxReportDelay","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_metadataURI","type":"string"}],"name":"setMetadataURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_delay","type":"uint256"}],"name":"setMinReportDelay","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_profitFactor","type":"uint256"}],"name":"setProfitFactor","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_rewards","type":"address"}],"name":"setRewards","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_strategist","type":"address"}],"name":"setStrategist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"stakedBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"strategist","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"}],"name":"sweep","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"tend","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"callCostInWei","type":"uint256"}],"name":"tendTrigger","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"_hasRewards","type":"bool"},{"internalType":"uint256","name":"_rewardsIndex","type":"uint256"}],"name":"updateRewards","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"vault","outputs":[{"internalType":"contract VaultAPI","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"virtualRewardsPool","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"want","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amountNeeded","type":"uint256"}],"name":"withdraw","outputs":[{"internalType":"uint256","name":"_loss","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawToConvexDepositTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
60806040526019805460ff191660011790553480156200001e57600080fd5b506040516200660b3803806200660b833981016040819052620000419162000a2f565b838062000051813380806200006b565b506200006190508383836200024f565b5050505062000d2e565b6006546001600160a01b031615620000a05760405162461bcd60e51b8152600401620000979062000bb6565b60405180910390fd5b600280546001600160a01b0319166001600160a01b03868116919091179182905560408051637e062a3560e11b81529051929091169163fc0c546a91600480820192602092909190829003018186803b158015620000fd57600080fd5b505afa15801562000112573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200013891906200097e565b600680546001600160a01b0319166001600160a01b03928316179081905562000172911685600019620005f5602090811b620034aa17901c565b600380546001600160a01b038086166001600160a01b03199283161790925560048054858416908316178082556005805486861694169390931790925560006007819055620151806008556064600955600a5560025460405163095ea7b360e01b81529084169363095ea7b393620001f293911691600019910162000b68565b602060405180830381600087803b1580156200020d57600080fd5b505af115801562000222573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000248919062000af5565b5050505050565b60165461010090046001600160a01b0316156200026b57600080fd5b621baf8060085560018054610100600160a81b03191674ddcea799ff1699e98edf118e0629a974df7df01200179055640df8475800601155641bf08eb00060125568d8d726b7177a8000006013556103e8600e55601080547393a62da5a14c80f265dabc077fcee437b1a0efde6001600160a01b031990911617905560065460405163095ea7b360e01b81526001600160a01b039091169063095ea7b390620003319073f403c135812408bfbe8713b5a23a04b3d48aae31906000199060040162000b68565b602060405180830381600087803b1580156200034c57600080fd5b505af115801562000361573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000387919062000af5565b5060405163095ea7b360e01b8152734e3fbd56cd56c3e72c1403e103b45db9da5b9d2b9063095ea7b390620003d99073b576491f1e6e5e62f1d8f26062ee822b40b0e0d4906000199060040162000b68565b602060405180830381600087803b158015620003f457600080fd5b505af115801562000409573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200042f919062000af5565b5060405163095ea7b360e01b815273d533a949740bb3306d119cc777fa900ba034cd529063095ea7b3906200048190738301ae4fc9c624d1d396cbdaa1ed877821d7c511906000199060040162000b68565b602060405180830381600087803b1580156200049c57600080fd5b505af1158015620004b1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620004d7919062000af5565b5060168054610100600160a81b0319166101006001600160a01b03851602179055600d839055604051631526fe2760e01b8152600090819073f403c135812408bfbe8713b5a23a04b3d48aae3190631526fe27906200053b90889060040162000ccb565b60c06040518083038186803b1580156200055457600080fd5b505afa15801562000569573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200058f9190620009a3565b5050600b80546001600160a01b0380841661010002610100600160a81b0319909216919091179091556006549496509094508086169316929092149150620005d8905057600080fd5b8251620005ed906015906020860190620008c4565b505050505050565b801580620006845750604051636eb1769f60e11b81526001600160a01b0384169063dd62ed3e906200062e903090869060040162000b4e565b60206040518083038186803b1580156200064757600080fd5b505afa1580156200065c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000682919062000b17565b155b620006a35760405162461bcd60e51b8152600401620000979062000c6e565b620006fe8363095ea7b360e01b8484604051602401620006c592919062000b68565b60408051808303601f190181529190526020810180516001600160e01b0319939093166001600160e01b03938416179052906200070316565b505050565b60606200075f826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166200079f60201b620035a9179092919060201c565b805190915015620006fe578080602001905181019062000780919062000af5565b620006fe5760405162461bcd60e51b8152600401620000979062000c24565b6060620007b08484600085620007b8565b949350505050565b6060620007c5856200088a565b620007e45760405162461bcd60e51b8152600401620000979062000bed565b60006060866001600160a01b0316858760405162000803919062000b30565b60006040518083038185875af1925050503d806000811462000842576040519150601f19603f3d011682016040523d82523d6000602084013e62000847565b606091505b509150915081156200085d579150620007b09050565b8051156200086e5780518082602001fd5b8360405162461bcd60e51b815260040162000097919062000b81565b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470818114801590620007b0575050151592915050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106200090757805160ff191683800117855562000937565b8280016001018555821562000937579182015b82811115620009375782518255916020019190600101906200091a565b506200094592915062000949565b5090565b5b808211156200094557600081556001016200094a565b80516001600160a01b03811681146200097857600080fd5b92915050565b60006020828403121562000990578081fd5b6200099c838362000960565b9392505050565b60008060008060008060c08789031215620009bc578182fd5b620009c8888862000960565b9550620009d9886020890162000960565b9450620009ea886040890162000960565b9350620009fb886060890162000960565b925062000a0c886080890162000960565b915060a0870151801515811462000a21578182fd5b809150509295509295509295565b6000806000806080858703121562000a45578384fd5b62000a51868662000960565b93506020850151925062000a69866040870162000960565b60608601519092506001600160401b038082111562000a86578283fd5b818701915087601f83011262000a9a578283fd5b81518181111562000aa9578384fd5b62000abe601f8201601f191660200162000cd4565b915080825288602082850101111562000ad5578384fd5b62000ae881602084016020860162000cfb565b5094979396509194505050565b60006020828403121562000b07578081fd5b815180151581146200099c578182fd5b60006020828403121562000b29578081fd5b5051919050565b6000825162000b4481846020870162000cfb565b9190910192915050565b6001600160a01b0392831681529116602082015260400190565b6001600160a01b03929092168252602082015260400190565b600060208252825180602084015262000ba281604085016020870162000cfb565b601f01601f19169190910160400192915050565b6020808252601c908201527f537472617465677920616c726561647920696e697469616c697a656400000000604082015260600190565b6020808252601d908201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604082015260600190565b6020808252602a908201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6040820152691bdd081cdd58d8d9595960b21b606082015260800190565b60208082526036908201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60408201527f20746f206e6f6e2d7a65726f20616c6c6f77616e636500000000000000000000606082015260800190565b90815260200190565b6040518181016001600160401b038111828210171562000cf357600080fd5b604052919050565b60005b8381101562000d1857818101518382015260200162000cfe565b8381111562000d28576000848401525b50505050565b6158cd8062000d3e6000396000f3fe6080604052600436106103c75760003560e01c8063780022a0116101f2578063c4f454231161010d578063ed882c2b116100a0578063f09338df1161006f578063f09338df146109f6578063f106845414610a0b578063fbfa77cf14610a20578063fcf2d0ad14610a35576103ce565b8063ed882c2b1461098c578063ef86b23c146109ac578063efbb5cb0146109c1578063f017c92f146109d6576103ce565b8063dbad1ab1116100dc578063dbad1ab114610922578063ec2f105014610942578063ec38a86214610957578063ecf04e1514610977576103ce565b8063c4f45423146108b8578063c7b9d530146108cd578063ce5494bb146108ed578063d1af0c7d1461090d576103ce565b8063a98f929611610185578063b252720b11610154578063b252720b14610859578063b4d48fd41461086e578063ba28e59c1461088e578063c1a3d44c146108a3576103ce565b8063a98f9296146107ef578063aa5480cf1461080f578063ac00ff2614610824578063aced166114610844576103ce565b80638e6350e2116101c15780638e6350e21461079057806391397ab4146107a557806395e80c50146107c55780639ec5a894146107da576103ce565b8063780022a01461072b5780637fef901a146107465780638c926b991461075b5780638cdfe1661461077b576103ce565b806334659dc5116102e25780635b9f0016116102755780636c3d9186116102445780636c3d9186146106b65780637165485d146106d6578063748747e6146106eb578063750521f51461070b576103ce565b80635b9f0016146106575780635fbeb25f1461066c578063650d1880146106815780636718835f146106a1576103ce565b8063440368a3116102b1578063440368a3146106035780634641257d146106185780634b31217e1461062d5780635641ec0314610642576103ce565b806334659dc5146105a4578063372500ab146105b957806339a172a8146105ce5780633b7c6e2f146105ee576103ce565b80631d12f28b1161035a57806322f3e2d41161032957806322f3e2d414610538578063258294101461055a57806328b7ccf71461056f5780632e1a7d4d14610584576103ce565b80631d12f28b146104d75780631f1fcd51146104ec5780631fe4a6861461050e578063220cce9714610523576103ce565b80630ada4dab116103965780630ada4dab146104575780630f969b87146104775780631111fe1c1461049757806311bc8245146104b7576103ce565b806301681a62146103d357806303ee438c146103f557806306cfb3c01461042057806306fdde0314610442576103ce565b366103ce57005b600080fd5b3480156103df57600080fd5b506103f36103ee366004614e4d565b610a4a565b005b34801561040157600080fd5b5061040a610be9565b6040516104179190615422565b60405180910390f35b34801561042c57600080fd5b50610435610c77565b60405161041791906156af565b34801561044e57600080fd5b5061040a611199565b34801561046357600080fd5b506103f3610472366004615093565b61122f565b34801561048357600080fd5b506103f36104923660046151e1565b61131b565b3480156104a357600080fd5b506103f36104b2366004615211565b6113a8565b3480156104c357600080fd5b506103f36104d2366004614e4d565b611427565b3480156104e357600080fd5b5061043561155f565b3480156104f857600080fd5b50610501611565565b60405161041791906152d1565b34801561051a57600080fd5b50610501611574565b34801561052f57600080fd5b50610501611583565b34801561054457600080fd5b5061054d611597565b60405161041791906153c3565b34801561056657600080fd5b5061040a611639565b34801561057b57600080fd5b50610435611658565b34801561059057600080fd5b5061043561059f3660046151e1565b61165e565b3480156105b057600080fd5b506103f36116b9565b3480156105c557600080fd5b5061054d611834565b3480156105da57600080fd5b506103f36105e93660046151e1565b61183d565b3480156105fa57600080fd5b506104356118bf565b34801561060f57600080fd5b506103f36118c5565b34801561062457600080fd5b506103f3611aee565b34801561063957600080fd5b50610435611fff565b34801561064e57600080fd5b5061054d612005565b34801561066357600080fd5b5061043561200e565b34801561067857600080fd5b50610435612094565b34801561068d57600080fd5b5061054d61069c3660046151e1565b61209a565b3480156106ad57600080fd5b5061054d6120a2565b3480156106c257600080fd5b506103f36106d1366004614f0b565b6120ab565b3480156106e257600080fd5b506105016120cb565b3480156106f757600080fd5b506103f3610706366004614e4d565b6120df565b34801561071757600080fd5b506103f36107263660046150f6565b61218a565b34801561073757600080fd5b5061043561069c3660046151e1565b34801561075257600080fd5b50610435612221565b34801561076757600080fd5b50610501610776366004614f0b565b612227565b34801561078757600080fd5b5061043561232e565b34801561079c57600080fd5b50610435612334565b3480156107b157600080fd5b506103f36107c03660046151e1565b612339565b3480156107d157600080fd5b506104356123bb565b3480156107e657600080fd5b506105016123c1565b3480156107fb57600080fd5b506103f361080a366004615093565b6123d0565b34801561081b57600080fd5b506104356124bc565b34801561083057600080fd5b506103f361083f366004615093565b6124c2565b34801561085057600080fd5b506105016125e5565b34801561086557600080fd5b506105016125f4565b34801561087a57600080fd5b506103f3610889366004615249565b612608565b34801561089a57600080fd5b5061050161270e565b3480156108af57600080fd5b5061043561271d565b3480156108c457600080fd5b5061043561274e565b3480156108d957600080fd5b506103f36108e8366004614e4d565b612782565b3480156108f957600080fd5b506103f3610908366004614e4d565b61282d565b34801561091957600080fd5b50610501612978565b34801561092e57600080fd5b506103f361093d3660046150cb565b612987565b34801561094e57600080fd5b5061054d612ce5565b34801561096357600080fd5b506103f3610972366004614e4d565b612cf5565b34801561098357600080fd5b5061054d612e88565b34801561099857600080fd5b5061054d6109a73660046151e1565b612e98565b3480156109b857600080fd5b5061050161308e565b3480156109cd57600080fd5b5061043561309d565b3480156109e257600080fd5b506103f36109f13660046151e1565b6130b2565b348015610a0257600080fd5b5061054d613134565b348015610a1757600080fd5b50610435613270565b348015610a2c57600080fd5b50610501613276565b348015610a4157600080fd5b506103f3613285565b610a526135c0565b6001600160a01b0316336001600160a01b031614610a8b5760405162461bcd60e51b8152600401610a82906155c6565b60405180910390fd5b6006546001600160a01b0382811691161415610ab95760405162461bcd60e51b8152600401610a829061545a565b6002546001600160a01b0382811691161415610ae75760405162461bcd60e51b8152600401610a829061556e565b6060610af161363d565b905060005b8151811015610b4c57818181518110610b0b57fe5b60200260200101516001600160a01b0316836001600160a01b03161415610b445760405162461bcd60e51b8152600401610a8290615635565b600101610af6565b50610be5610b586135c0565b6040516370a0823160e01b81526001600160a01b038516906370a0823190610b849030906004016152d1565b60206040518083038186803b158015610b9c57600080fd5b505afa158015610bb0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bd491906151f9565b6001600160a01b0385169190613642565b5050565b6000805460408051602060026001851615610100026000190190941693909304601f81018490048402820184019092528181529291830182828015610c6f5780601f10610c4457610100808354040283529160200191610c6f565b820191906000526020600020905b815481529060010190602001808311610c5257829003601f168201915b505050505081565b6000806103e8905060006a52b7d2dcc80cd2e40000009050600069152d02c7e14af680000090506000734e3fbd56cd56c3e72c1403e103b45db9da5b9d2b6001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b158015610ced57600080fd5b505afa158015610d01573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d2591906151f9565b9050600080610d348385613661565b90506000610d4061274e565b905086821015610d8b576000610d5688846136ac565b9050610d6c88610d6684846136ee565b90613661565b93506000610d7a88876136ac565b905080851115610d88578094505b50505b6000735f4ec3df9cbd43714fe2740f5e3616155c5b841990506000610e1c6064836001600160a01b03166350d25bcd6040518163ffffffff1660e01b815260040160206040518083038186803b158015610de457600080fd5b505afa158015610df8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d6691906151f9565b90506000610ebb670de0b6b3a7640000610d6684738301ae4fc9c624d1d396cbdaa1ed877821d7c5116001600160a01b03166386fc88d36040518163ffffffff1660e01b815260040160206040518083038186803b158015610e7d57600080fd5b505afa158015610e91573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610eb591906151f9565b906136ee565b90506000610f1c670de0b6b3a7640000610d668573b576491f1e6e5e62f1d8f26062ee822b40b0e0d46001600160a01b03166386fc88d36040518163ffffffff1660e01b815260040160206040518083038186803b158015610e7d57600080fd5b90506000610f36670de0b6b3a7640000610d6685896136ee565b90506000610f50670de0b6b3a7640000610d66858c6136ee565b601754909150600090600160a01b900460ff16156111715760408051600380825260808201909252606091602082018380368337505060175482519293506001600160a01b031691839150600090610fa457fe5b60200260200101906001600160a01b031690816001600160a01b03168152505073c02aaa39b223fe8d0a0e5c4f27ead9083c756cc281600181518110610fe657fe5b60200260200101906001600160a01b031690816001600160a01b03168152505073dac17f958d2ee523a2206206994597c13d831ec78160028151811061102857fe5b6001600160a01b039283166020918202929092010152600c546040516246613160e11b81526000929190911690628cc262906110689030906004016152d1565b60206040518083038186803b15801561108057600080fd5b505afa158015611094573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110b891906151f9565b9050801561116e5760405163d06ca61f60e01b815260609073d9e1ce17f2641f24ae83637ab66a2cca9c378b9f9063d06ca61f906110fc90859087906004016156b8565b60006040518083038186803b15801561111457600080fd5b505afa158015611128573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526111509190810190614ffe565b90508060018251038151811061116257fe5b60200260200101519350505b50505b6111858161117f8585613728565b90613728565b9e5050505050505050505050505050505b90565b60158054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156112255780601f106111fa57610100808354040283529160200191611225565b820191906000526020600020905b81548152906001019060200180831161120857829003601f168201915b5050505050905090565b600260009054906101000a90046001600160a01b03166001600160a01b03166388a8d6026040518163ffffffff1660e01b815260040160206040518083038186803b15801561127d57600080fd5b505afa158015611291573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112b59190614e69565b6001600160a01b0316336001600160a01b031614806112ec57506112d76135c0565b6001600160a01b0316336001600160a01b0316145b6113085760405162461bcd60e51b8152600401610a82906155c6565b6014805460ff1916911515919091179055565b6003546001600160a01b031633148061134c57506113376135c0565b6001600160a01b0316336001600160a01b0316145b6113685760405162461bcd60e51b8152600401610a82906155c6565b600a8190556040517fa68ba126373d04c004c5748c300c9fca12bd444b3d4332e261f3bd2bac4a86009061139d9083906156af565b60405180910390a150565b6113b06135c0565b6001600160a01b0316336001600160a01b0316146113e05760405162461bcd60e51b8152600401610a82906155c6565b61271083111580156113f457506127108211155b6113fd57600080fd5b600e92909255600f55601080546001600160a01b0319166001600160a01b03909216919091179055565b600260009054906101000a90046001600160a01b03166001600160a01b03166388a8d6026040518163ffffffff1660e01b815260040160206040518083038186803b15801561147557600080fd5b505afa158015611489573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114ad9190614e69565b6001600160a01b0316336001600160a01b031614806114e457506114cf6135c0565b6001600160a01b0316336001600160a01b0316145b6115005760405162461bcd60e51b8152600401610a82906155c6565b7fc8db9c35f716b87af1fbb83f03c78646061931269301fd7ba6dcf189b4cdc2fc8160405161152f91906152d1565b60405180910390a1600180546001600160a01b0390921661010002610100600160a81b0319909216919091179055565b600a5481565b6006546001600160a01b031681565b6003546001600160a01b031681565b600b5461010090046001600160a01b031681565b6002546040516339ebf82360e01b815260009182916001600160a01b03909116906339ebf823906115cc9030906004016152d1565b6101206040518083038186803b1580156115e557600080fd5b505afa1580156115f9573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061161d9190615163565b6040015111806116345750600061163261309d565b115b905090565b604080518082019091526005815264302e342e3360d81b602082015290565b60085481565b6002546000906001600160a01b0316331461168b5760405162461bcd60e51b8152600401610a829061554e565b60006116968361374d565b6006549093509091506116b3906001600160a01b03163383613642565b50919050565b600260009054906101000a90046001600160a01b03166001600160a01b03166388a8d6026040518163ffffffff1660e01b815260040160206040518083038186803b15801561170757600080fd5b505afa15801561171b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061173f9190614e69565b6001600160a01b0316336001600160a01b0316148061177657506117616135c0565b6001600160a01b0316336001600160a01b0316145b6117925760405162461bcd60e51b8152600401610a82906155c6565b600061179c61200e565b9050801561183157600b54601654604051631c683a1b60e11b81526101009092046001600160a01b0316916338d07436916117df91859160ff169060040161570e565b602060405180830381600087803b1580156117f957600080fd5b505af115801561180d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610be591906150af565b50565b60165460ff1681565b6003546001600160a01b031633148061186e57506118596135c0565b6001600160a01b0316336001600160a01b0316145b61188a5760405162461bcd60e51b8152600401610a82906155c6565b60078190556040517fbb2c369a0355a34b02ab5fce0643150c87e1c8dfe7c918d465591879f57948b19061139d9083906156af565b60125481565b6005546001600160a01b03163314806118e857506003546001600160a01b031633145b8061190b57506118f66135c0565b6001600160a01b0316336001600160a01b0316145b806119ac5750600260009054906101000a90046001600160a01b03166001600160a01b031663452a93206040518163ffffffff1660e01b815260040160206040518083038186803b15801561195f57600080fd5b505afa158015611973573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119979190614e69565b6001600160a01b0316336001600160a01b0316145b80611a4d5750600260009054906101000a90046001600160a01b03166001600160a01b03166388a8d6026040518163ffffffff1660e01b815260040160206040518083038186803b158015611a0057600080fd5b505afa158015611a14573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a389190614e69565b6001600160a01b0316336001600160a01b0316145b611a695760405162461bcd60e51b8152600401610a82906155c6565b6002546040805163bf3759b560e01b81529051611aec926001600160a01b03169163bf3759b5916004808301926020929190829003018186803b158015611aaf57600080fd5b505afa158015611ac3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ae791906151f9565b61385a565b565b6005546001600160a01b0316331480611b1157506003546001600160a01b031633145b80611b345750611b1f6135c0565b6001600160a01b0316336001600160a01b0316145b80611bd55750600260009054906101000a90046001600160a01b03166001600160a01b031663452a93206040518163ffffffff1660e01b815260040160206040518083038186803b158015611b8857600080fd5b505afa158015611b9c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bc09190614e69565b6001600160a01b0316336001600160a01b0316145b80611c765750600260009054906101000a90046001600160a01b03166001600160a01b03166388a8d6026040518163ffffffff1660e01b815260040160206040518083038186803b158015611c2957600080fd5b505afa158015611c3d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c619190614e69565b6001600160a01b0316336001600160a01b0316145b611c925760405162461bcd60e51b8152600401610a82906155c6565b6000806000600260009054906101000a90046001600160a01b03166001600160a01b031663bf3759b56040518163ffffffff1660e01b815260040160206040518083038186803b158015611ce557600080fd5b505afa158015611cf9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d1d91906151f9565b600b5490915060009060ff1615611d7a576000611d3861390c565b905082811015611d5357611d4c83826136ac565b9350611d68565b82811115611d6857611d6581846136ac565b94505b611d7283856136ac565b915050611d8b565b611d83826139bc565b919550935090505b6002546040516339ebf82360e01b81526000916001600160a01b0316906339ebf82390611dbc9030906004016152d1565b6101206040518083038186803b158015611dd557600080fd5b505afa158015611de9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e0d9190615163565b60c001516002546040516328766ebf60e21b81529192506001600160a01b03169063a1d9bafc90611e46908890889087906004016157a9565b602060405180830381600087803b158015611e6057600080fd5b505af1158015611e74573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e9891906151f9565b9250611ea38361385a565b60015460ff168015611ec4575060015461010090046001600160a01b031615155b15611f765760015460405163c70fa00b60e01b81526101009091046001600160a01b03169063c70fa00b90611f0590889088908790899088906004016157da565b60206040518083038186803b158015611f1d57600080fd5b505afa158015611f31573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f5591906150af565b611f715760405162461bcd60e51b8152600401610a82906154b0565b611fbb565b7ff769f6bf659bbbdabf212d830720ce893eedc57f25ebb8e44edf5b300618a35b6001604051611fa691906153c3565b60405180910390a16001805460ff1916811790555b7f4c0f499ffe6befa0ca7c826b0916cf87bea98de658013e76938489368d60d50985858486604051611ff094939291906157bf565b60405180910390a15050505050565b600f5481565b600b5460ff1681565b600b546040516370a0823160e01b815260009161010090046001600160a01b0316906370a08231906120449030906004016152d1565b60206040518083038186803b15801561205c57600080fd5b505afa158015612070573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061163491906151f9565b60115481565b60005b919050565b60015460ff1681565b6120b787878787614025565b6120c28383836141e5565b50505050505050565b60165461010090046001600160a01b031681565b6003546001600160a01b031633148061211057506120fb6135c0565b6001600160a01b0316336001600160a01b0316145b61212c5760405162461bcd60e51b8152600401610a82906155c6565b6001600160a01b03811661213f57600080fd5b600580546001600160a01b0319166001600160a01b0383161790556040517f2f202ddb4a2e345f6323ed90f8fc8559d770a7abbbeee84dde8aca3351fe71549061139d9083906152d1565b6003546001600160a01b03163314806121bb57506121a66135c0565b6001600160a01b0316336001600160a01b0316145b6121d75760405162461bcd60e51b8152600401610a82906155c6565b6121e360008383614c84565b507f300e67d5a415b6d015a471d9c7b95dd58f3e8290af965e84e0f845de2996dda682826040516122159291906153f3565b60405180910390a15050565b600e5481565b60195460009060ff1661223957600080fd5b604051733d602d80600a3d3981f3363d3d373d3d3d363d7360601b81523060601b601482018190526e5af43d82803e903d91602b57fd5bf360881b6028830152906037816000f060405163361ec8c360e11b81529093506001600160a01b0384169150636c3d9186906122bc908c908c908c908c908c908c908c9060040161531a565b600060405180830381600087803b1580156122d657600080fd5b505af11580156122ea573d6000803e3d6000fd5b50506040516001600160a01b03851692507f783540fb4221a3238720dc7038937d0d79982bcf895274aa6ad179f82cf0d53c9150600090a250979650505050505050565b60095481565b600090565b6003546001600160a01b031633148061236a57506123556135c0565b6001600160a01b0316336001600160a01b0316145b6123865760405162461bcd60e51b8152600401610a82906155c6565b60098190556040517fd94596337df4c2f0f44d30a7fc5db1c7bb60d9aca4185ed77c6fd96eb45ec2989061139d9083906156af565b60075481565b6004546001600160a01b031681565b600260009054906101000a90046001600160a01b03166001600160a01b03166388a8d6026040518163ffffffff1660e01b815260040160206040518083038186803b15801561241e57600080fd5b505afa158015612432573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124569190614e69565b6001600160a01b0316336001600160a01b0316148061248d57506124786135c0565b6001600160a01b0316336001600160a01b0316145b6124a95760405162461bcd60e51b8152600401610a82906155c6565b6016805460ff1916911515919091179055565b60135481565b600260009054906101000a90046001600160a01b03166001600160a01b03166388a8d6026040518163ffffffff1660e01b815260040160206040518083038186803b15801561251057600080fd5b505afa158015612524573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125489190614e69565b6001600160a01b0316336001600160a01b0316148061257f575061256a6135c0565b6001600160a01b0316336001600160a01b0316145b61259b5760405162461bcd60e51b8152600401610a82906155c6565b7ff769f6bf659bbbdabf212d830720ce893eedc57f25ebb8e44edf5b300618a35b816040516125ca91906153c3565b60405180910390a16001805460ff1916911515919091179055565b6005546001600160a01b031681565b60015461010090046001600160a01b031681565b600260009054906101000a90046001600160a01b03166001600160a01b03166388a8d6026040518163ffffffff1660e01b815260040160206040518083038186803b15801561265657600080fd5b505afa15801561266a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061268e9190614e69565b6001600160a01b0316336001600160a01b031614806126c557506126b06135c0565b6001600160a01b0316336001600160a01b0316145b6126e15760405162461bcd60e51b8152600401610a82906155c6565b60119390935560129190915560135560168054911515600160a81b0260ff60a81b19909216919091179055565b600c546001600160a01b031681565b6006546040516370a0823160e01b81526000916001600160a01b0316906370a08231906120449030906004016152d1565b600b546040516246613160e11b815260009161010090046001600160a01b031690628cc262906120449030906004016152d1565b6003546001600160a01b03163314806127b3575061279e6135c0565b6001600160a01b0316336001600160a01b0316145b6127cf5760405162461bcd60e51b8152600401610a82906155c6565b6001600160a01b0381166127e257600080fd5b600380546001600160a01b0319166001600160a01b0383161790556040517f352ececae6d7d1e6d26bcf2c549dfd55be1637e9b22dc0cf3b71ddb36097a6b49061139d9083906152d1565b6002546001600160a01b0316331461284457600080fd5b6002546040805163fbfa77cf60e01b815290516001600160a01b039283169284169163fbfa77cf916004808301926020929190829003018186803b15801561288b57600080fd5b505afa15801561289f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128c39190614e69565b6001600160a01b0316146128d657600080fd5b6128df8161456f565b6006546040516370a0823160e01b81526118319183916001600160a01b03909116906370a08231906129159030906004016152d1565b60206040518083038186803b15801561292d57600080fd5b505afa158015612941573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061296591906151f9565b6006546001600160a01b03169190613642565b6017546001600160a01b031681565b61298f6135c0565b6001600160a01b0316336001600160a01b0316146129bf5760405162461bcd60e51b8152600401610a82906155c6565b6017546001600160a01b0316158015906129f857506017546001600160a01b0316734e3fbd56cd56c3e72c1403e103b45db9da5b9d2b14155b15612a985760175460405163095ea7b360e01b81526001600160a01b039091169063095ea7b390612a449073d9e1ce17f2641f24ae83637ab66a2cca9c378b9f90600090600401615372565b602060405180830381600087803b158015612a5e57600080fd5b505af1158015612a72573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a9691906150af565b505b81612ac257601780546001600160a81b0319169055600c80546001600160a01b0319169055610be5565b600b54604051632061aa2360e11b81526101009091046001600160a01b0316906340c3544690612af69084906004016156af565b60206040518083038186803b158015612b0e57600080fd5b505afa158015612b22573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b469190614e69565b600c80546001600160a01b0319166001600160a01b0392831617908190556040805163f7c618c160e01b81529051600093929092169163f7c618c191600480820192602092909190829003018186803b158015612ba257600080fd5b505afa158015612bb6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612bda9190614e69565b601780546001600160a01b0319166001600160a01b03838116919091179182905560405163095ea7b360e01b8152929350169063095ea7b390612c399073d9e1ce17f2641f24ae83637ab66a2cca9c378b9f9060001990600401615372565b602060405180830381600087803b158015612c5357600080fd5b505af1158015612c67573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c8b91906150af565b50604080518082019091526017546001600160a01b0316815273c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26020820152612ccc906018906002614cfe565b50506017805460ff60a01b1916600160a01b1790555050565b601654600160a81b900460ff1681565b6003546001600160a01b03163314612d1f5760405162461bcd60e51b8152600401610a8290615435565b6001600160a01b038116612d3257600080fd5b6002546004805460405163095ea7b360e01b81526001600160a01b039384169363095ea7b393612d69939091169160009101615372565b602060405180830381600087803b158015612d8357600080fd5b505af1158015612d97573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612dbb91906150af565b50600480546001600160a01b0319166001600160a01b038381169190911780835560025460405163095ea7b360e01b81529083169363095ea7b393612e069316916000199101615372565b602060405180830381600087803b158015612e2057600080fd5b505af1158015612e34573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612e5891906150af565b507fafbb66abf8f3b719799940473a4052a3717cdd8e40fb6c8a3faadab316b1a0698160405161139d91906152d1565b601754600160a01b900460ff1681565b6000612ea2611597565b612eae5750600061209d565b601654600160a81b900460ff1615612ed557612ec8613134565b15612ed55750600061209d565b6000612edf610c77565b9050601254811115612ef557600191505061209d565b612efd614762565b612f0b57600091505061209d565b60145460ff1615612f2057600191505061209d565b601154811115612f3457600191505061209d565b612f3c614d5f565b6002546040516339ebf82360e01b81526001600160a01b03909116906339ebf82390612f6c9030906004016152d1565b6101206040518083038186803b158015612f8557600080fd5b505afa158015612f99573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612fbd9190615163565b9050600854612fd98260a00151426136ac90919063ffffffff16565b1115612fea5760019250505061209d565b601354600260009054906101000a90046001600160a01b03166001600160a01b031663112c1f9b6040518163ffffffff1660e01b815260040160206040518083038186803b15801561303b57600080fd5b505afa15801561304f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061307391906151f9565b11156130845760019250505061209d565b5060009392505050565b6010546001600160a01b031681565b60006116346130aa61200e565b61117f61271d565b6003546001600160a01b03163314806130e357506130ce6135c0565b6001600160a01b0316336001600160a01b0316145b6130ff5760405162461bcd60e51b8152600401610a82906155c6565b60088190556040517f5430e11864ad7aa9775b07d12657fe52df9aa2ba734355bd8ef8747be2c800c59061139d9083906156af565b600080600b60019054906101000a90046001600160a01b03166001600160a01b031663ebe2b12b6040518163ffffffff1660e01b815260040160206040518083038186803b15801561318557600080fd5b505afa158015613199573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906131bd91906151f9565b9050428110156131d1576001915050611196565b601754600160a01b900460ff161561326c57600c546040805163ebe2b12b60e01b815290516000926001600160a01b03169163ebe2b12b916004808301926020929190829003018186803b15801561322857600080fd5b505afa15801561323c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061326091906151f9565b42119250611196915050565b5090565b600d5481565b6002546001600160a01b031681565b6003546001600160a01b03163314806132b657506132a16135c0565b6001600160a01b0316336001600160a01b0316145b806133575750600260009054906101000a90046001600160a01b03166001600160a01b031663452a93206040518163ffffffff1660e01b815260040160206040518083038186803b15801561330a57600080fd5b505afa15801561331e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906133429190614e69565b6001600160a01b0316336001600160a01b0316145b806133f85750600260009054906101000a90046001600160a01b03166001600160a01b03166388a8d6026040518163ffffffff1660e01b815260040160206040518083038186803b1580156133ab57600080fd5b505afa1580156133bf573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906133e39190614e69565b6001600160a01b0316336001600160a01b0316145b6134145760405162461bcd60e51b8152600401610a82906155c6565b600b805460ff191660011790556002546040805163507257cd60e11b815290516001600160a01b039092169163a0e4af9a9160048082019260009290919082900301818387803b15801561346757600080fd5b505af115801561347b573d6000803e3d6000fd5b50506040517f97e963041e952738788b9d4871d854d282065b8f90a464928d6528f2e9a4fd0b925060009150a1565b8015806135325750604051636eb1769f60e11b81526001600160a01b0384169063dd62ed3e906134e09030908690600401615300565b60206040518083038186803b1580156134f857600080fd5b505afa15801561350c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061353091906151f9565b155b61354e5760405162461bcd60e51b8152600401610a8290615659565b6135a48363095ea7b360e01b848460405160240161356d929190615372565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b0319909316929092179091526147e9565b505050565b60606135b88484600085614878565b949350505050565b60025460408051635aa6e67560e01b815290516000926001600160a01b031691635aa6e675916004808301926020929190829003018186803b15801561360557600080fd5b505afa158015613619573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116349190614e69565b606090565b6135a48363a9059cbb60e01b848460405160240161356d929190615372565b60006136a383836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f00000000000081525061493c565b90505b92915050565b60006136a383836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250614973565b6000826136fd575060006136a6565b8282028284828161370a57fe5b04146136a35760405162461bcd60e51b8152600401610a829061550d565b6000828201838110156136a35760405162461bcd60e51b8152600401610a8290615479565b600080600061375a61271d565b90508084111561384657600061376e61200e565b9050801561381b57600b5461010090046001600160a01b031663c32e720261379f8361379a89876136ac565b61499f565b6016546040516001600160e01b031960e085901b1681526137c7929160ff169060040161570e565b602060405180830381600087803b1580156137e157600080fd5b505af11580156137f5573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061381991906150af565b505b600061382561271d565b9050613831868261499f565b945061383d86866136ac565b93505050613853565b8360009250925050613855565b505b915091565b600b5460ff161561386a57611831565b600061387461271d565b90508015610be557600d546040516321d0683360e11b815273f403c135812408bfbe8713b5a23a04b3d48aae31916343a0d066916138ba91908590600190600401615791565b602060405180830381600087803b1580156138d457600080fd5b505af11580156138e8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906135a491906150af565b60008061391761200e565b905080156139ae57600b54601654604051636197390160e11b81526101009092046001600160a01b03169163c32e72029161395a91859160ff169060040161570e565b602060405180830381600087803b15801561397457600080fd5b505af1158015613988573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906139ac91906150af565b505b6139b661271d565b91505090565b600b54604051637050ccd960e01b81526000918291829161010090046001600160a01b031690637050ccd9906139f99030906001906004016152e5565b602060405180830381600087803b158015613a1357600080fd5b505af1158015613a27573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613a4b91906150af565b506040516370a0823160e01b815260009073d533a949740bb3306d119cc777fa900ba034cd52906370a0823190613a869030906004016152d1565b60206040518083038186803b158015613a9e57600080fd5b505afa158015613ab2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613ad691906151f9565b6040516370a0823160e01b8152909150600090734e3fbd56cd56c3e72c1403e103b45db9da5b9d2b906370a0823190613b139030906004016152d1565b60206040518083038186803b158015613b2b57600080fd5b505afa158015613b3f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613b6391906151f9565b90506000613b82612710610d66600e54866136ee90919063ffffffff16565b90508015613c4757613bbd73d533a949740bb3306d119cc777fa900ba034cd5273f147b8125d2ef93fb6965db97d6746952a13393483613642565b6040516370a0823160e01b815273d533a949740bb3306d119cc777fa900ba034cd52906370a0823190613bf49030906004016152d1565b60206040518083038186803b158015613c0c57600080fd5b505afa158015613c20573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613c4491906151f9565b92505b6000613c64612710610d66600f54866136ee90919063ffffffff16565b90508015613d2257601054613c9890734e3fbd56cd56c3e72c1403e103b45db9da5b9d2b906001600160a01b031683613642565b6040516370a0823160e01b8152734e3fbd56cd56c3e72c1403e103b45db9da5b9d2b906370a0823190613ccf9030906004016152d1565b60206040518083038186803b158015613ce757600080fd5b505afa158015613cfb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613d1f91906151f9565b92505b601754600160a01b900460ff1615613dc8576017546040516370a0823160e01b81526000916001600160a01b0316906370a0823190613d659030906004016152d1565b60206040518083038186803b158015613d7d57600080fd5b505afa158015613d91573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613db591906151f9565b90508015613dc657613dc6816149b5565b505b613dd28484614a4c565b478015613e57576016546040805180820182528381526000602082018190529151630b4c7e4d60e01b81526101009093046001600160a01b031692630b4c7e4d928592613e249290919060040161538b565b6000604051808303818588803b158015613e3d57600080fd5b505af1158015613e51573d6000803e3d6000fd5b50505050505b8815613f26576000613e6761200e565b90508015613f0b57600b5461010090046001600160a01b031663c32e7202613e8f838d61499f565b6016546040516001600160e01b031960e085901b168152613eb7929160ff169060040161570e565b602060405180830381600087803b158015613ed157600080fd5b505af1158015613ee5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613f0991906150af565b505b6000613f1561271d565b9050613f218b8261499f565b975050505b6000613f3061309d565b6002546040516339ebf82360e01b81529192506000916001600160a01b03909116906339ebf82390613f669030906004016152d1565b6101206040518083038186803b158015613f7f57600080fd5b505afa158015613f93573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613fb79190615163565b60c00151905080821115613ffe57613fcf82826136ac565b99506000613fdb61271d565b905080613fe88c8b613728565b1115613ff857613ff661390c565b505b5061400b565b61400881836136ac565b98505b50506014805460ff19169055509597949650929450505050565b6006546001600160a01b03161561404e5760405162461bcd60e51b8152600401610a82906154d6565b600280546001600160a01b0319166001600160a01b03868116919091179182905560408051637e062a3560e11b81529051929091169163fc0c546a91600480820192602092909190829003018186803b1580156140aa57600080fd5b505afa1580156140be573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906140e29190614e69565b600680546001600160a01b0319166001600160a01b03928316179081905561410e9116856000196134aa565b600380546001600160a01b038086166001600160a01b03199283161790925560048054858416908316178082556005805486861694169390931790925560006007819055620151806008556064600955600a5560025460405163095ea7b360e01b81529084169363095ea7b39361418c939116916000199101615372565b602060405180830381600087803b1580156141a657600080fd5b505af11580156141ba573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906141de91906150af565b5050505050565b60165461010090046001600160a01b03161561420057600080fd5b621baf8060085560018054610100600160a81b03191674ddcea799ff1699e98edf118e0629a974df7df01200179055640df8475800601155641bf08eb00060125568d8d726b7177a8000006013556103e8600e55601080547393a62da5a14c80f265dabc077fcee437b1a0efde6001600160a01b031990911617905560065460405163095ea7b360e01b81526001600160a01b039091169063095ea7b3906142c49073f403c135812408bfbe8713b5a23a04b3d48aae319060001990600401615372565b602060405180830381600087803b1580156142de57600080fd5b505af11580156142f2573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061431691906150af565b5060405163095ea7b360e01b8152734e3fbd56cd56c3e72c1403e103b45db9da5b9d2b9063095ea7b3906143669073b576491f1e6e5e62f1d8f26062ee822b40b0e0d49060001990600401615372565b602060405180830381600087803b15801561438057600080fd5b505af1158015614394573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906143b891906150af565b5060405163095ea7b360e01b815273d533a949740bb3306d119cc777fa900ba034cd529063095ea7b39061440890738301ae4fc9c624d1d396cbdaa1ed877821d7c5119060001990600401615372565b602060405180830381600087803b15801561442257600080fd5b505af1158015614436573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061445a91906150af565b5060168054610100600160a81b0319166101006001600160a01b03851602179055600d839055604051631526fe2760e01b8152600090819073f403c135812408bfbe8713b5a23a04b3d48aae3190631526fe27906144bc9088906004016156af565b60c06040518083038186803b1580156144d457600080fd5b505afa1580156144e8573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061450c9190614e85565b5050600b80546001600160a01b0380841661010002610100600160a81b0319909216919091179091556006549496509094508086169316929092149150614554905057600080fd5b8251614567906015906020860190614dab565b505050505050565b600061457961200e565b9050801561461057600b54601654604051636197390160e11b81526101009092046001600160a01b03169163c32e7202916145bc91859160ff169060040161570e565b602060405180830381600087803b1580156145d657600080fd5b505af11580156145ea573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061460e91906150af565b505b6040516370a0823160e01b81526146b990839073d533a949740bb3306d119cc777fa900ba034cd52906370a082319061464d9030906004016152d1565b60206040518083038186803b15801561466557600080fd5b505afa158015614679573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061469d91906151f9565b73d533a949740bb3306d119cc777fa900ba034cd529190613642565b6040516370a0823160e01b8152610be5908390734e3fbd56cd56c3e72c1403e103b45db9da5b9d2b906370a08231906146f69030906004016152d1565b60206040518083038186803b15801561470e57600080fd5b505afa158015614722573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061474691906151f9565b734e3fbd56cd56c3e72c1403e103b45db9da5b9d2b9190613642565b600073b5e1cacb567d98faadb60a1fd4820720141f064f6001600160a01b03166334a9e75c6040518163ffffffff1660e01b815260040160206040518083038186803b1580156147b157600080fd5b505afa1580156147c5573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061163491906150af565b606061483e826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166135a99092919063ffffffff16565b8051909150156135a4578080602001905181019061485c91906150af565b6135a45760405162461bcd60e51b8152600401610a82906155eb565b606061488385614c4b565b61489f5760405162461bcd60e51b8152600401610a829061558f565b60006060866001600160a01b031685876040516148bc91906152b5565b60006040518083038185875af1925050503d80600081146148f9576040519150601f19603f3d011682016040523d82523d6000602084013e6148fe565b606091505b509150915081156149125791506135b89050565b8051156149225780518082602001fd5b8360405162461bcd60e51b8152600401610a829190615422565b6000818361495d5760405162461bcd60e51b8152600401610a829190615422565b50600083858161496957fe5b0495945050505050565b600081848411156149975760405162461bcd60e51b8152600401610a829190615422565b505050900390565b60008183106149ae57816136a3565b5090919050565b6040516338ed173960e01b815273d9e1ce17f2641f24ae83637ab66a2cca9c378b9f906338ed1739906149f69084906000906018903090429060040161571e565b600060405180830381600087803b158015614a1057600080fd5b505af1158015614a24573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610be59190810190614ffe565b67016345785d8a0000811115614ad05760405163394747c560e01b815273b576491f1e6e5e62f1d8f26062ee822b40b0e0d49063394747c590614a9d906001906000908690829081906004016153ce565b600060405180830381600087803b158015614ab757600080fd5b505af1158015614acb573d6000803e3d6000fd5b505050505b67016345785d8a0000821115614b545760405163394747c560e01b8152738301ae4fc9c624d1d396cbdaa1ed877821d7c5119063394747c590614b21906001906000908790829081906004016153ce565b600060405180830381600087803b158015614b3b57600080fd5b505af1158015614b4f573d6000803e3d6000fd5b505050505b6040516370a0823160e01b815260009073c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2906370a0823190614b8e9030906004016152d1565b60206040518083038186803b158015614ba657600080fd5b505afa158015614bba573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614bde91906151f9565b905080156135a457604051632e1a7d4d60e01b815273c02aaa39b223fe8d0a0e5c4f27ead9083c756cc290632e1a7d4d90614c1d9084906004016156af565b600060405180830381600087803b158015614c3757600080fd5b505af11580156120c2573d6000803e3d6000fd5b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a4708181148015906135b8575050151592915050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10614cc55782800160ff19823516178555614cf2565b82800160010185558215614cf2579182015b82811115614cf2578235825591602001919060010190614cd7565b5061326c929150614e19565b828054828255906000526020600020908101928215614d53579160200282015b82811115614d5357825182546001600160a01b0319166001600160a01b03909116178255602090920191600190910190614d1e565b5061326c929150614e2e565b6040518061012001604052806000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10614dec57805160ff1916838001178555614cf2565b82800160010185558215614cf2579182015b82811115614cf2578251825591602001919060010190614dfe565b5b8082111561326c5760008155600101614e1a565b5b8082111561326c5780546001600160a01b0319168155600101614e2f565b600060208284031215614e5e578081fd5b81356136a381615874565b600060208284031215614e7a578081fd5b81516136a381615874565b60008060008060008060c08789031215614e9d578182fd5b8651614ea881615874565b6020880151909650614eb981615874565b6040880151909550614eca81615874565b6060880151909450614edb81615874565b6080880151909350614eec81615874565b60a0880151909250614efd81615889565b809150509295509295509295565b600080600080600080600060e0888a031215614f25578081fd5b8735614f3081615874565b9650602088810135614f4181615874565b96506040890135614f5181615874565b95506060890135614f6181615874565b94506080890135935060a0890135614f7881615874565b925060c089013567ffffffffffffffff80821115614f94578384fd5b818b0191508b601f830112614fa7578384fd5b813581811115614fb5578485fd5b614fc7601f8201601f191685016157fd565b91508082528c84828501011115614fdc578485fd5b8084840185840137848482840101525080935050505092959891949750929550565b60006020808385031215615010578182fd5b825167ffffffffffffffff811115615026578283fd5b8301601f81018513615036578283fd5b805161504961504482615824565b6157fd565b8181528381019083850185840285018601891015615065578687fd5b8694505b83851015615087578051835260019490940193918501918501615069565b50979650505050505050565b6000602082840312156150a4578081fd5b81356136a381615889565b6000602082840312156150c0578081fd5b81516136a381615889565b600080604083850312156150dd578182fd5b82356150e881615889565b946020939093013593505050565b60008060208385031215615108578182fd5b823567ffffffffffffffff8082111561511f578384fd5b818501915085601f830112615132578384fd5b813581811115615140578485fd5b866020828501011115615151578485fd5b60209290920196919550909350505050565b6000610120808385031215615176578182fd5b61517f816157fd565b9050825181526020830151602082015260408301516040820152606083015160608201526080830151608082015260a083015160a082015260c083015160c082015260e083015160e08201526101008084015181830152508091505092915050565b6000602082840312156151f2578081fd5b5035919050565b60006020828403121561520a578081fd5b5051919050565b600080600060608486031215615225578081fd5b8335925060208401359150604084013561523e81615874565b809150509250925092565b6000806000806080858703121561525e578182fd5b843593506020850135925060408501359150606085013561527e81615889565b939692955090935050565b600081518084526152a1816020860160208601615844565b601f01601f19169290920160200192915050565b600082516152c7818460208701615844565b9190910192915050565b6001600160a01b0391909116815260200190565b6001600160a01b039290921682521515602082015260400190565b6001600160a01b0392831681529116602082015260400190565b6001600160a01b03888116825287811660208301528681166040830152858116606083015260808201859052831660a082015260e060c0820181905260009061536590830184615289565b9998505050505050505050565b6001600160a01b03929092168252602082015260400190565b60608101818460005b60028110156153b3578151835260209283019290910190600101615394565b5050508260408301529392505050565b901515815260200190565b9485526020850193909352604084019190915260608301521515608082015260a00190565b60006020825282602083015282846040840137818301604090810191909152601f909201601f19160101919050565b6000602082526136a36020830184615289565b6020808252600b908201526a085cdd1c985d1959da5cdd60aa1b604082015260600190565b602080825260059082015264085dd85b9d60da1b604082015260600190565b6020808252601b908201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604082015260600190565b6020808252600c908201526b216865616c7468636865636b60a01b604082015260600190565b6020808252601c908201527f537472617465677920616c726561647920696e697469616c697a656400000000604082015260600190565b60208082526021908201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6040820152607760f81b606082015260800190565b602080825260069082015265085d985d5b1d60d21b604082015260600190565b6020808252600790820152662173686172657360c81b604082015260600190565b6020808252601d908201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604082015260600190565b6020808252600b908201526a08585d5d1a1bdc9a5e995960aa1b604082015260600190565b6020808252602a908201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6040820152691bdd081cdd58d8d9595960b21b606082015260800190565b6020808252600a9082015269085c1c9bdd1958dd195960b21b604082015260600190565b60208082526036908201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60408201527520746f206e6f6e2d7a65726f20616c6c6f77616e636560501b606082015260800190565b90815260200190565b60006040820184835260206040818501528185518084526060860191508287019350845b818110156157015784516001600160a01b0316835293830193918301916001016156dc565b5090979650505050505050565b9182521515602082015260400190565b600060a082018783526020878185015260a0604085015281875480845260c0860191508885528285209350845b818110156157705784546001600160a01b03168352600194850194928401920161574b565b50506001600160a01b03969096166060850152505050608001529392505050565b92835260208301919091521515604082015260600190565b9283526020830191909152604082015260600190565b93845260208401929092526040830152606082015260800190565b948552602085019390935260408401919091526060830152608082015260a00190565b60405181810167ffffffffffffffff8111828210171561581c57600080fd5b604052919050565b600067ffffffffffffffff82111561583a578081fd5b5060209081020190565b60005b8381101561585f578181015183820152602001615847565b8381111561586e576000848401525b50505050565b6001600160a01b038116811461183157600080fd5b801515811461183157600080fdfea264697066735822122093313172a40a75690b648bf71aadbeede331496094d260c559337cce5ba6b17164736f6c634300060c0033000000000000000000000000986b4aff588a109c09b50a03f42e4110e29d353f0000000000000000000000000000000000000000000000000000000000000017000000000000000000000000c5424b857f758e906013f3555dad202e4bdb4567000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000125374726174656779436f6e766578734554480000000000000000000000000000
Deployed Bytecode
0x6080604052600436106103c75760003560e01c8063780022a0116101f2578063c4f454231161010d578063ed882c2b116100a0578063f09338df1161006f578063f09338df146109f6578063f106845414610a0b578063fbfa77cf14610a20578063fcf2d0ad14610a35576103ce565b8063ed882c2b1461098c578063ef86b23c146109ac578063efbb5cb0146109c1578063f017c92f146109d6576103ce565b8063dbad1ab1116100dc578063dbad1ab114610922578063ec2f105014610942578063ec38a86214610957578063ecf04e1514610977576103ce565b8063c4f45423146108b8578063c7b9d530146108cd578063ce5494bb146108ed578063d1af0c7d1461090d576103ce565b8063a98f929611610185578063b252720b11610154578063b252720b14610859578063b4d48fd41461086e578063ba28e59c1461088e578063c1a3d44c146108a3576103ce565b8063a98f9296146107ef578063aa5480cf1461080f578063ac00ff2614610824578063aced166114610844576103ce565b80638e6350e2116101c15780638e6350e21461079057806391397ab4146107a557806395e80c50146107c55780639ec5a894146107da576103ce565b8063780022a01461072b5780637fef901a146107465780638c926b991461075b5780638cdfe1661461077b576103ce565b806334659dc5116102e25780635b9f0016116102755780636c3d9186116102445780636c3d9186146106b65780637165485d146106d6578063748747e6146106eb578063750521f51461070b576103ce565b80635b9f0016146106575780635fbeb25f1461066c578063650d1880146106815780636718835f146106a1576103ce565b8063440368a3116102b1578063440368a3146106035780634641257d146106185780634b31217e1461062d5780635641ec0314610642576103ce565b806334659dc5146105a4578063372500ab146105b957806339a172a8146105ce5780633b7c6e2f146105ee576103ce565b80631d12f28b1161035a57806322f3e2d41161032957806322f3e2d414610538578063258294101461055a57806328b7ccf71461056f5780632e1a7d4d14610584576103ce565b80631d12f28b146104d75780631f1fcd51146104ec5780631fe4a6861461050e578063220cce9714610523576103ce565b80630ada4dab116103965780630ada4dab146104575780630f969b87146104775780631111fe1c1461049757806311bc8245146104b7576103ce565b806301681a62146103d357806303ee438c146103f557806306cfb3c01461042057806306fdde0314610442576103ce565b366103ce57005b600080fd5b3480156103df57600080fd5b506103f36103ee366004614e4d565b610a4a565b005b34801561040157600080fd5b5061040a610be9565b6040516104179190615422565b60405180910390f35b34801561042c57600080fd5b50610435610c77565b60405161041791906156af565b34801561044e57600080fd5b5061040a611199565b34801561046357600080fd5b506103f3610472366004615093565b61122f565b34801561048357600080fd5b506103f36104923660046151e1565b61131b565b3480156104a357600080fd5b506103f36104b2366004615211565b6113a8565b3480156104c357600080fd5b506103f36104d2366004614e4d565b611427565b3480156104e357600080fd5b5061043561155f565b3480156104f857600080fd5b50610501611565565b60405161041791906152d1565b34801561051a57600080fd5b50610501611574565b34801561052f57600080fd5b50610501611583565b34801561054457600080fd5b5061054d611597565b60405161041791906153c3565b34801561056657600080fd5b5061040a611639565b34801561057b57600080fd5b50610435611658565b34801561059057600080fd5b5061043561059f3660046151e1565b61165e565b3480156105b057600080fd5b506103f36116b9565b3480156105c557600080fd5b5061054d611834565b3480156105da57600080fd5b506103f36105e93660046151e1565b61183d565b3480156105fa57600080fd5b506104356118bf565b34801561060f57600080fd5b506103f36118c5565b34801561062457600080fd5b506103f3611aee565b34801561063957600080fd5b50610435611fff565b34801561064e57600080fd5b5061054d612005565b34801561066357600080fd5b5061043561200e565b34801561067857600080fd5b50610435612094565b34801561068d57600080fd5b5061054d61069c3660046151e1565b61209a565b3480156106ad57600080fd5b5061054d6120a2565b3480156106c257600080fd5b506103f36106d1366004614f0b565b6120ab565b3480156106e257600080fd5b506105016120cb565b3480156106f757600080fd5b506103f3610706366004614e4d565b6120df565b34801561071757600080fd5b506103f36107263660046150f6565b61218a565b34801561073757600080fd5b5061043561069c3660046151e1565b34801561075257600080fd5b50610435612221565b34801561076757600080fd5b50610501610776366004614f0b565b612227565b34801561078757600080fd5b5061043561232e565b34801561079c57600080fd5b50610435612334565b3480156107b157600080fd5b506103f36107c03660046151e1565b612339565b3480156107d157600080fd5b506104356123bb565b3480156107e657600080fd5b506105016123c1565b3480156107fb57600080fd5b506103f361080a366004615093565b6123d0565b34801561081b57600080fd5b506104356124bc565b34801561083057600080fd5b506103f361083f366004615093565b6124c2565b34801561085057600080fd5b506105016125e5565b34801561086557600080fd5b506105016125f4565b34801561087a57600080fd5b506103f3610889366004615249565b612608565b34801561089a57600080fd5b5061050161270e565b3480156108af57600080fd5b5061043561271d565b3480156108c457600080fd5b5061043561274e565b3480156108d957600080fd5b506103f36108e8366004614e4d565b612782565b3480156108f957600080fd5b506103f3610908366004614e4d565b61282d565b34801561091957600080fd5b50610501612978565b34801561092e57600080fd5b506103f361093d3660046150cb565b612987565b34801561094e57600080fd5b5061054d612ce5565b34801561096357600080fd5b506103f3610972366004614e4d565b612cf5565b34801561098357600080fd5b5061054d612e88565b34801561099857600080fd5b5061054d6109a73660046151e1565b612e98565b3480156109b857600080fd5b5061050161308e565b3480156109cd57600080fd5b5061043561309d565b3480156109e257600080fd5b506103f36109f13660046151e1565b6130b2565b348015610a0257600080fd5b5061054d613134565b348015610a1757600080fd5b50610435613270565b348015610a2c57600080fd5b50610501613276565b348015610a4157600080fd5b506103f3613285565b610a526135c0565b6001600160a01b0316336001600160a01b031614610a8b5760405162461bcd60e51b8152600401610a82906155c6565b60405180910390fd5b6006546001600160a01b0382811691161415610ab95760405162461bcd60e51b8152600401610a829061545a565b6002546001600160a01b0382811691161415610ae75760405162461bcd60e51b8152600401610a829061556e565b6060610af161363d565b905060005b8151811015610b4c57818181518110610b0b57fe5b60200260200101516001600160a01b0316836001600160a01b03161415610b445760405162461bcd60e51b8152600401610a8290615635565b600101610af6565b50610be5610b586135c0565b6040516370a0823160e01b81526001600160a01b038516906370a0823190610b849030906004016152d1565b60206040518083038186803b158015610b9c57600080fd5b505afa158015610bb0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bd491906151f9565b6001600160a01b0385169190613642565b5050565b6000805460408051602060026001851615610100026000190190941693909304601f81018490048402820184019092528181529291830182828015610c6f5780601f10610c4457610100808354040283529160200191610c6f565b820191906000526020600020905b815481529060010190602001808311610c5257829003601f168201915b505050505081565b6000806103e8905060006a52b7d2dcc80cd2e40000009050600069152d02c7e14af680000090506000734e3fbd56cd56c3e72c1403e103b45db9da5b9d2b6001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b158015610ced57600080fd5b505afa158015610d01573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d2591906151f9565b9050600080610d348385613661565b90506000610d4061274e565b905086821015610d8b576000610d5688846136ac565b9050610d6c88610d6684846136ee565b90613661565b93506000610d7a88876136ac565b905080851115610d88578094505b50505b6000735f4ec3df9cbd43714fe2740f5e3616155c5b841990506000610e1c6064836001600160a01b03166350d25bcd6040518163ffffffff1660e01b815260040160206040518083038186803b158015610de457600080fd5b505afa158015610df8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d6691906151f9565b90506000610ebb670de0b6b3a7640000610d6684738301ae4fc9c624d1d396cbdaa1ed877821d7c5116001600160a01b03166386fc88d36040518163ffffffff1660e01b815260040160206040518083038186803b158015610e7d57600080fd5b505afa158015610e91573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610eb591906151f9565b906136ee565b90506000610f1c670de0b6b3a7640000610d668573b576491f1e6e5e62f1d8f26062ee822b40b0e0d46001600160a01b03166386fc88d36040518163ffffffff1660e01b815260040160206040518083038186803b158015610e7d57600080fd5b90506000610f36670de0b6b3a7640000610d6685896136ee565b90506000610f50670de0b6b3a7640000610d66858c6136ee565b601754909150600090600160a01b900460ff16156111715760408051600380825260808201909252606091602082018380368337505060175482519293506001600160a01b031691839150600090610fa457fe5b60200260200101906001600160a01b031690816001600160a01b03168152505073c02aaa39b223fe8d0a0e5c4f27ead9083c756cc281600181518110610fe657fe5b60200260200101906001600160a01b031690816001600160a01b03168152505073dac17f958d2ee523a2206206994597c13d831ec78160028151811061102857fe5b6001600160a01b039283166020918202929092010152600c546040516246613160e11b81526000929190911690628cc262906110689030906004016152d1565b60206040518083038186803b15801561108057600080fd5b505afa158015611094573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110b891906151f9565b9050801561116e5760405163d06ca61f60e01b815260609073d9e1ce17f2641f24ae83637ab66a2cca9c378b9f9063d06ca61f906110fc90859087906004016156b8565b60006040518083038186803b15801561111457600080fd5b505afa158015611128573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526111509190810190614ffe565b90508060018251038151811061116257fe5b60200260200101519350505b50505b6111858161117f8585613728565b90613728565b9e5050505050505050505050505050505b90565b60158054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156112255780601f106111fa57610100808354040283529160200191611225565b820191906000526020600020905b81548152906001019060200180831161120857829003601f168201915b5050505050905090565b600260009054906101000a90046001600160a01b03166001600160a01b03166388a8d6026040518163ffffffff1660e01b815260040160206040518083038186803b15801561127d57600080fd5b505afa158015611291573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112b59190614e69565b6001600160a01b0316336001600160a01b031614806112ec57506112d76135c0565b6001600160a01b0316336001600160a01b0316145b6113085760405162461bcd60e51b8152600401610a82906155c6565b6014805460ff1916911515919091179055565b6003546001600160a01b031633148061134c57506113376135c0565b6001600160a01b0316336001600160a01b0316145b6113685760405162461bcd60e51b8152600401610a82906155c6565b600a8190556040517fa68ba126373d04c004c5748c300c9fca12bd444b3d4332e261f3bd2bac4a86009061139d9083906156af565b60405180910390a150565b6113b06135c0565b6001600160a01b0316336001600160a01b0316146113e05760405162461bcd60e51b8152600401610a82906155c6565b61271083111580156113f457506127108211155b6113fd57600080fd5b600e92909255600f55601080546001600160a01b0319166001600160a01b03909216919091179055565b600260009054906101000a90046001600160a01b03166001600160a01b03166388a8d6026040518163ffffffff1660e01b815260040160206040518083038186803b15801561147557600080fd5b505afa158015611489573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114ad9190614e69565b6001600160a01b0316336001600160a01b031614806114e457506114cf6135c0565b6001600160a01b0316336001600160a01b0316145b6115005760405162461bcd60e51b8152600401610a82906155c6565b7fc8db9c35f716b87af1fbb83f03c78646061931269301fd7ba6dcf189b4cdc2fc8160405161152f91906152d1565b60405180910390a1600180546001600160a01b0390921661010002610100600160a81b0319909216919091179055565b600a5481565b6006546001600160a01b031681565b6003546001600160a01b031681565b600b5461010090046001600160a01b031681565b6002546040516339ebf82360e01b815260009182916001600160a01b03909116906339ebf823906115cc9030906004016152d1565b6101206040518083038186803b1580156115e557600080fd5b505afa1580156115f9573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061161d9190615163565b6040015111806116345750600061163261309d565b115b905090565b604080518082019091526005815264302e342e3360d81b602082015290565b60085481565b6002546000906001600160a01b0316331461168b5760405162461bcd60e51b8152600401610a829061554e565b60006116968361374d565b6006549093509091506116b3906001600160a01b03163383613642565b50919050565b600260009054906101000a90046001600160a01b03166001600160a01b03166388a8d6026040518163ffffffff1660e01b815260040160206040518083038186803b15801561170757600080fd5b505afa15801561171b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061173f9190614e69565b6001600160a01b0316336001600160a01b0316148061177657506117616135c0565b6001600160a01b0316336001600160a01b0316145b6117925760405162461bcd60e51b8152600401610a82906155c6565b600061179c61200e565b9050801561183157600b54601654604051631c683a1b60e11b81526101009092046001600160a01b0316916338d07436916117df91859160ff169060040161570e565b602060405180830381600087803b1580156117f957600080fd5b505af115801561180d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610be591906150af565b50565b60165460ff1681565b6003546001600160a01b031633148061186e57506118596135c0565b6001600160a01b0316336001600160a01b0316145b61188a5760405162461bcd60e51b8152600401610a82906155c6565b60078190556040517fbb2c369a0355a34b02ab5fce0643150c87e1c8dfe7c918d465591879f57948b19061139d9083906156af565b60125481565b6005546001600160a01b03163314806118e857506003546001600160a01b031633145b8061190b57506118f66135c0565b6001600160a01b0316336001600160a01b0316145b806119ac5750600260009054906101000a90046001600160a01b03166001600160a01b031663452a93206040518163ffffffff1660e01b815260040160206040518083038186803b15801561195f57600080fd5b505afa158015611973573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119979190614e69565b6001600160a01b0316336001600160a01b0316145b80611a4d5750600260009054906101000a90046001600160a01b03166001600160a01b03166388a8d6026040518163ffffffff1660e01b815260040160206040518083038186803b158015611a0057600080fd5b505afa158015611a14573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a389190614e69565b6001600160a01b0316336001600160a01b0316145b611a695760405162461bcd60e51b8152600401610a82906155c6565b6002546040805163bf3759b560e01b81529051611aec926001600160a01b03169163bf3759b5916004808301926020929190829003018186803b158015611aaf57600080fd5b505afa158015611ac3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ae791906151f9565b61385a565b565b6005546001600160a01b0316331480611b1157506003546001600160a01b031633145b80611b345750611b1f6135c0565b6001600160a01b0316336001600160a01b0316145b80611bd55750600260009054906101000a90046001600160a01b03166001600160a01b031663452a93206040518163ffffffff1660e01b815260040160206040518083038186803b158015611b8857600080fd5b505afa158015611b9c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bc09190614e69565b6001600160a01b0316336001600160a01b0316145b80611c765750600260009054906101000a90046001600160a01b03166001600160a01b03166388a8d6026040518163ffffffff1660e01b815260040160206040518083038186803b158015611c2957600080fd5b505afa158015611c3d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c619190614e69565b6001600160a01b0316336001600160a01b0316145b611c925760405162461bcd60e51b8152600401610a82906155c6565b6000806000600260009054906101000a90046001600160a01b03166001600160a01b031663bf3759b56040518163ffffffff1660e01b815260040160206040518083038186803b158015611ce557600080fd5b505afa158015611cf9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d1d91906151f9565b600b5490915060009060ff1615611d7a576000611d3861390c565b905082811015611d5357611d4c83826136ac565b9350611d68565b82811115611d6857611d6581846136ac565b94505b611d7283856136ac565b915050611d8b565b611d83826139bc565b919550935090505b6002546040516339ebf82360e01b81526000916001600160a01b0316906339ebf82390611dbc9030906004016152d1565b6101206040518083038186803b158015611dd557600080fd5b505afa158015611de9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e0d9190615163565b60c001516002546040516328766ebf60e21b81529192506001600160a01b03169063a1d9bafc90611e46908890889087906004016157a9565b602060405180830381600087803b158015611e6057600080fd5b505af1158015611e74573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e9891906151f9565b9250611ea38361385a565b60015460ff168015611ec4575060015461010090046001600160a01b031615155b15611f765760015460405163c70fa00b60e01b81526101009091046001600160a01b03169063c70fa00b90611f0590889088908790899088906004016157da565b60206040518083038186803b158015611f1d57600080fd5b505afa158015611f31573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f5591906150af565b611f715760405162461bcd60e51b8152600401610a82906154b0565b611fbb565b7ff769f6bf659bbbdabf212d830720ce893eedc57f25ebb8e44edf5b300618a35b6001604051611fa691906153c3565b60405180910390a16001805460ff1916811790555b7f4c0f499ffe6befa0ca7c826b0916cf87bea98de658013e76938489368d60d50985858486604051611ff094939291906157bf565b60405180910390a15050505050565b600f5481565b600b5460ff1681565b600b546040516370a0823160e01b815260009161010090046001600160a01b0316906370a08231906120449030906004016152d1565b60206040518083038186803b15801561205c57600080fd5b505afa158015612070573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061163491906151f9565b60115481565b60005b919050565b60015460ff1681565b6120b787878787614025565b6120c28383836141e5565b50505050505050565b60165461010090046001600160a01b031681565b6003546001600160a01b031633148061211057506120fb6135c0565b6001600160a01b0316336001600160a01b0316145b61212c5760405162461bcd60e51b8152600401610a82906155c6565b6001600160a01b03811661213f57600080fd5b600580546001600160a01b0319166001600160a01b0383161790556040517f2f202ddb4a2e345f6323ed90f8fc8559d770a7abbbeee84dde8aca3351fe71549061139d9083906152d1565b6003546001600160a01b03163314806121bb57506121a66135c0565b6001600160a01b0316336001600160a01b0316145b6121d75760405162461bcd60e51b8152600401610a82906155c6565b6121e360008383614c84565b507f300e67d5a415b6d015a471d9c7b95dd58f3e8290af965e84e0f845de2996dda682826040516122159291906153f3565b60405180910390a15050565b600e5481565b60195460009060ff1661223957600080fd5b604051733d602d80600a3d3981f3363d3d373d3d3d363d7360601b81523060601b601482018190526e5af43d82803e903d91602b57fd5bf360881b6028830152906037816000f060405163361ec8c360e11b81529093506001600160a01b0384169150636c3d9186906122bc908c908c908c908c908c908c908c9060040161531a565b600060405180830381600087803b1580156122d657600080fd5b505af11580156122ea573d6000803e3d6000fd5b50506040516001600160a01b03851692507f783540fb4221a3238720dc7038937d0d79982bcf895274aa6ad179f82cf0d53c9150600090a250979650505050505050565b60095481565b600090565b6003546001600160a01b031633148061236a57506123556135c0565b6001600160a01b0316336001600160a01b0316145b6123865760405162461bcd60e51b8152600401610a82906155c6565b60098190556040517fd94596337df4c2f0f44d30a7fc5db1c7bb60d9aca4185ed77c6fd96eb45ec2989061139d9083906156af565b60075481565b6004546001600160a01b031681565b600260009054906101000a90046001600160a01b03166001600160a01b03166388a8d6026040518163ffffffff1660e01b815260040160206040518083038186803b15801561241e57600080fd5b505afa158015612432573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124569190614e69565b6001600160a01b0316336001600160a01b0316148061248d57506124786135c0565b6001600160a01b0316336001600160a01b0316145b6124a95760405162461bcd60e51b8152600401610a82906155c6565b6016805460ff1916911515919091179055565b60135481565b600260009054906101000a90046001600160a01b03166001600160a01b03166388a8d6026040518163ffffffff1660e01b815260040160206040518083038186803b15801561251057600080fd5b505afa158015612524573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125489190614e69565b6001600160a01b0316336001600160a01b0316148061257f575061256a6135c0565b6001600160a01b0316336001600160a01b0316145b61259b5760405162461bcd60e51b8152600401610a82906155c6565b7ff769f6bf659bbbdabf212d830720ce893eedc57f25ebb8e44edf5b300618a35b816040516125ca91906153c3565b60405180910390a16001805460ff1916911515919091179055565b6005546001600160a01b031681565b60015461010090046001600160a01b031681565b600260009054906101000a90046001600160a01b03166001600160a01b03166388a8d6026040518163ffffffff1660e01b815260040160206040518083038186803b15801561265657600080fd5b505afa15801561266a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061268e9190614e69565b6001600160a01b0316336001600160a01b031614806126c557506126b06135c0565b6001600160a01b0316336001600160a01b0316145b6126e15760405162461bcd60e51b8152600401610a82906155c6565b60119390935560129190915560135560168054911515600160a81b0260ff60a81b19909216919091179055565b600c546001600160a01b031681565b6006546040516370a0823160e01b81526000916001600160a01b0316906370a08231906120449030906004016152d1565b600b546040516246613160e11b815260009161010090046001600160a01b031690628cc262906120449030906004016152d1565b6003546001600160a01b03163314806127b3575061279e6135c0565b6001600160a01b0316336001600160a01b0316145b6127cf5760405162461bcd60e51b8152600401610a82906155c6565b6001600160a01b0381166127e257600080fd5b600380546001600160a01b0319166001600160a01b0383161790556040517f352ececae6d7d1e6d26bcf2c549dfd55be1637e9b22dc0cf3b71ddb36097a6b49061139d9083906152d1565b6002546001600160a01b0316331461284457600080fd5b6002546040805163fbfa77cf60e01b815290516001600160a01b039283169284169163fbfa77cf916004808301926020929190829003018186803b15801561288b57600080fd5b505afa15801561289f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128c39190614e69565b6001600160a01b0316146128d657600080fd5b6128df8161456f565b6006546040516370a0823160e01b81526118319183916001600160a01b03909116906370a08231906129159030906004016152d1565b60206040518083038186803b15801561292d57600080fd5b505afa158015612941573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061296591906151f9565b6006546001600160a01b03169190613642565b6017546001600160a01b031681565b61298f6135c0565b6001600160a01b0316336001600160a01b0316146129bf5760405162461bcd60e51b8152600401610a82906155c6565b6017546001600160a01b0316158015906129f857506017546001600160a01b0316734e3fbd56cd56c3e72c1403e103b45db9da5b9d2b14155b15612a985760175460405163095ea7b360e01b81526001600160a01b039091169063095ea7b390612a449073d9e1ce17f2641f24ae83637ab66a2cca9c378b9f90600090600401615372565b602060405180830381600087803b158015612a5e57600080fd5b505af1158015612a72573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a9691906150af565b505b81612ac257601780546001600160a81b0319169055600c80546001600160a01b0319169055610be5565b600b54604051632061aa2360e11b81526101009091046001600160a01b0316906340c3544690612af69084906004016156af565b60206040518083038186803b158015612b0e57600080fd5b505afa158015612b22573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b469190614e69565b600c80546001600160a01b0319166001600160a01b0392831617908190556040805163f7c618c160e01b81529051600093929092169163f7c618c191600480820192602092909190829003018186803b158015612ba257600080fd5b505afa158015612bb6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612bda9190614e69565b601780546001600160a01b0319166001600160a01b03838116919091179182905560405163095ea7b360e01b8152929350169063095ea7b390612c399073d9e1ce17f2641f24ae83637ab66a2cca9c378b9f9060001990600401615372565b602060405180830381600087803b158015612c5357600080fd5b505af1158015612c67573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c8b91906150af565b50604080518082019091526017546001600160a01b0316815273c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26020820152612ccc906018906002614cfe565b50506017805460ff60a01b1916600160a01b1790555050565b601654600160a81b900460ff1681565b6003546001600160a01b03163314612d1f5760405162461bcd60e51b8152600401610a8290615435565b6001600160a01b038116612d3257600080fd5b6002546004805460405163095ea7b360e01b81526001600160a01b039384169363095ea7b393612d69939091169160009101615372565b602060405180830381600087803b158015612d8357600080fd5b505af1158015612d97573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612dbb91906150af565b50600480546001600160a01b0319166001600160a01b038381169190911780835560025460405163095ea7b360e01b81529083169363095ea7b393612e069316916000199101615372565b602060405180830381600087803b158015612e2057600080fd5b505af1158015612e34573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612e5891906150af565b507fafbb66abf8f3b719799940473a4052a3717cdd8e40fb6c8a3faadab316b1a0698160405161139d91906152d1565b601754600160a01b900460ff1681565b6000612ea2611597565b612eae5750600061209d565b601654600160a81b900460ff1615612ed557612ec8613134565b15612ed55750600061209d565b6000612edf610c77565b9050601254811115612ef557600191505061209d565b612efd614762565b612f0b57600091505061209d565b60145460ff1615612f2057600191505061209d565b601154811115612f3457600191505061209d565b612f3c614d5f565b6002546040516339ebf82360e01b81526001600160a01b03909116906339ebf82390612f6c9030906004016152d1565b6101206040518083038186803b158015612f8557600080fd5b505afa158015612f99573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612fbd9190615163565b9050600854612fd98260a00151426136ac90919063ffffffff16565b1115612fea5760019250505061209d565b601354600260009054906101000a90046001600160a01b03166001600160a01b031663112c1f9b6040518163ffffffff1660e01b815260040160206040518083038186803b15801561303b57600080fd5b505afa15801561304f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061307391906151f9565b11156130845760019250505061209d565b5060009392505050565b6010546001600160a01b031681565b60006116346130aa61200e565b61117f61271d565b6003546001600160a01b03163314806130e357506130ce6135c0565b6001600160a01b0316336001600160a01b0316145b6130ff5760405162461bcd60e51b8152600401610a82906155c6565b60088190556040517f5430e11864ad7aa9775b07d12657fe52df9aa2ba734355bd8ef8747be2c800c59061139d9083906156af565b600080600b60019054906101000a90046001600160a01b03166001600160a01b031663ebe2b12b6040518163ffffffff1660e01b815260040160206040518083038186803b15801561318557600080fd5b505afa158015613199573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906131bd91906151f9565b9050428110156131d1576001915050611196565b601754600160a01b900460ff161561326c57600c546040805163ebe2b12b60e01b815290516000926001600160a01b03169163ebe2b12b916004808301926020929190829003018186803b15801561322857600080fd5b505afa15801561323c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061326091906151f9565b42119250611196915050565b5090565b600d5481565b6002546001600160a01b031681565b6003546001600160a01b03163314806132b657506132a16135c0565b6001600160a01b0316336001600160a01b0316145b806133575750600260009054906101000a90046001600160a01b03166001600160a01b031663452a93206040518163ffffffff1660e01b815260040160206040518083038186803b15801561330a57600080fd5b505afa15801561331e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906133429190614e69565b6001600160a01b0316336001600160a01b0316145b806133f85750600260009054906101000a90046001600160a01b03166001600160a01b03166388a8d6026040518163ffffffff1660e01b815260040160206040518083038186803b1580156133ab57600080fd5b505afa1580156133bf573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906133e39190614e69565b6001600160a01b0316336001600160a01b0316145b6134145760405162461bcd60e51b8152600401610a82906155c6565b600b805460ff191660011790556002546040805163507257cd60e11b815290516001600160a01b039092169163a0e4af9a9160048082019260009290919082900301818387803b15801561346757600080fd5b505af115801561347b573d6000803e3d6000fd5b50506040517f97e963041e952738788b9d4871d854d282065b8f90a464928d6528f2e9a4fd0b925060009150a1565b8015806135325750604051636eb1769f60e11b81526001600160a01b0384169063dd62ed3e906134e09030908690600401615300565b60206040518083038186803b1580156134f857600080fd5b505afa15801561350c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061353091906151f9565b155b61354e5760405162461bcd60e51b8152600401610a8290615659565b6135a48363095ea7b360e01b848460405160240161356d929190615372565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b0319909316929092179091526147e9565b505050565b60606135b88484600085614878565b949350505050565b60025460408051635aa6e67560e01b815290516000926001600160a01b031691635aa6e675916004808301926020929190829003018186803b15801561360557600080fd5b505afa158015613619573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116349190614e69565b606090565b6135a48363a9059cbb60e01b848460405160240161356d929190615372565b60006136a383836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f00000000000081525061493c565b90505b92915050565b60006136a383836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250614973565b6000826136fd575060006136a6565b8282028284828161370a57fe5b04146136a35760405162461bcd60e51b8152600401610a829061550d565b6000828201838110156136a35760405162461bcd60e51b8152600401610a8290615479565b600080600061375a61271d565b90508084111561384657600061376e61200e565b9050801561381b57600b5461010090046001600160a01b031663c32e720261379f8361379a89876136ac565b61499f565b6016546040516001600160e01b031960e085901b1681526137c7929160ff169060040161570e565b602060405180830381600087803b1580156137e157600080fd5b505af11580156137f5573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061381991906150af565b505b600061382561271d565b9050613831868261499f565b945061383d86866136ac565b93505050613853565b8360009250925050613855565b505b915091565b600b5460ff161561386a57611831565b600061387461271d565b90508015610be557600d546040516321d0683360e11b815273f403c135812408bfbe8713b5a23a04b3d48aae31916343a0d066916138ba91908590600190600401615791565b602060405180830381600087803b1580156138d457600080fd5b505af11580156138e8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906135a491906150af565b60008061391761200e565b905080156139ae57600b54601654604051636197390160e11b81526101009092046001600160a01b03169163c32e72029161395a91859160ff169060040161570e565b602060405180830381600087803b15801561397457600080fd5b505af1158015613988573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906139ac91906150af565b505b6139b661271d565b91505090565b600b54604051637050ccd960e01b81526000918291829161010090046001600160a01b031690637050ccd9906139f99030906001906004016152e5565b602060405180830381600087803b158015613a1357600080fd5b505af1158015613a27573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613a4b91906150af565b506040516370a0823160e01b815260009073d533a949740bb3306d119cc777fa900ba034cd52906370a0823190613a869030906004016152d1565b60206040518083038186803b158015613a9e57600080fd5b505afa158015613ab2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613ad691906151f9565b6040516370a0823160e01b8152909150600090734e3fbd56cd56c3e72c1403e103b45db9da5b9d2b906370a0823190613b139030906004016152d1565b60206040518083038186803b158015613b2b57600080fd5b505afa158015613b3f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613b6391906151f9565b90506000613b82612710610d66600e54866136ee90919063ffffffff16565b90508015613c4757613bbd73d533a949740bb3306d119cc777fa900ba034cd5273f147b8125d2ef93fb6965db97d6746952a13393483613642565b6040516370a0823160e01b815273d533a949740bb3306d119cc777fa900ba034cd52906370a0823190613bf49030906004016152d1565b60206040518083038186803b158015613c0c57600080fd5b505afa158015613c20573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613c4491906151f9565b92505b6000613c64612710610d66600f54866136ee90919063ffffffff16565b90508015613d2257601054613c9890734e3fbd56cd56c3e72c1403e103b45db9da5b9d2b906001600160a01b031683613642565b6040516370a0823160e01b8152734e3fbd56cd56c3e72c1403e103b45db9da5b9d2b906370a0823190613ccf9030906004016152d1565b60206040518083038186803b158015613ce757600080fd5b505afa158015613cfb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613d1f91906151f9565b92505b601754600160a01b900460ff1615613dc8576017546040516370a0823160e01b81526000916001600160a01b0316906370a0823190613d659030906004016152d1565b60206040518083038186803b158015613d7d57600080fd5b505afa158015613d91573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613db591906151f9565b90508015613dc657613dc6816149b5565b505b613dd28484614a4c565b478015613e57576016546040805180820182528381526000602082018190529151630b4c7e4d60e01b81526101009093046001600160a01b031692630b4c7e4d928592613e249290919060040161538b565b6000604051808303818588803b158015613e3d57600080fd5b505af1158015613e51573d6000803e3d6000fd5b50505050505b8815613f26576000613e6761200e565b90508015613f0b57600b5461010090046001600160a01b031663c32e7202613e8f838d61499f565b6016546040516001600160e01b031960e085901b168152613eb7929160ff169060040161570e565b602060405180830381600087803b158015613ed157600080fd5b505af1158015613ee5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613f0991906150af565b505b6000613f1561271d565b9050613f218b8261499f565b975050505b6000613f3061309d565b6002546040516339ebf82360e01b81529192506000916001600160a01b03909116906339ebf82390613f669030906004016152d1565b6101206040518083038186803b158015613f7f57600080fd5b505afa158015613f93573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613fb79190615163565b60c00151905080821115613ffe57613fcf82826136ac565b99506000613fdb61271d565b905080613fe88c8b613728565b1115613ff857613ff661390c565b505b5061400b565b61400881836136ac565b98505b50506014805460ff19169055509597949650929450505050565b6006546001600160a01b03161561404e5760405162461bcd60e51b8152600401610a82906154d6565b600280546001600160a01b0319166001600160a01b03868116919091179182905560408051637e062a3560e11b81529051929091169163fc0c546a91600480820192602092909190829003018186803b1580156140aa57600080fd5b505afa1580156140be573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906140e29190614e69565b600680546001600160a01b0319166001600160a01b03928316179081905561410e9116856000196134aa565b600380546001600160a01b038086166001600160a01b03199283161790925560048054858416908316178082556005805486861694169390931790925560006007819055620151806008556064600955600a5560025460405163095ea7b360e01b81529084169363095ea7b39361418c939116916000199101615372565b602060405180830381600087803b1580156141a657600080fd5b505af11580156141ba573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906141de91906150af565b5050505050565b60165461010090046001600160a01b03161561420057600080fd5b621baf8060085560018054610100600160a81b03191674ddcea799ff1699e98edf118e0629a974df7df01200179055640df8475800601155641bf08eb00060125568d8d726b7177a8000006013556103e8600e55601080547393a62da5a14c80f265dabc077fcee437b1a0efde6001600160a01b031990911617905560065460405163095ea7b360e01b81526001600160a01b039091169063095ea7b3906142c49073f403c135812408bfbe8713b5a23a04b3d48aae319060001990600401615372565b602060405180830381600087803b1580156142de57600080fd5b505af11580156142f2573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061431691906150af565b5060405163095ea7b360e01b8152734e3fbd56cd56c3e72c1403e103b45db9da5b9d2b9063095ea7b3906143669073b576491f1e6e5e62f1d8f26062ee822b40b0e0d49060001990600401615372565b602060405180830381600087803b15801561438057600080fd5b505af1158015614394573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906143b891906150af565b5060405163095ea7b360e01b815273d533a949740bb3306d119cc777fa900ba034cd529063095ea7b39061440890738301ae4fc9c624d1d396cbdaa1ed877821d7c5119060001990600401615372565b602060405180830381600087803b15801561442257600080fd5b505af1158015614436573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061445a91906150af565b5060168054610100600160a81b0319166101006001600160a01b03851602179055600d839055604051631526fe2760e01b8152600090819073f403c135812408bfbe8713b5a23a04b3d48aae3190631526fe27906144bc9088906004016156af565b60c06040518083038186803b1580156144d457600080fd5b505afa1580156144e8573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061450c9190614e85565b5050600b80546001600160a01b0380841661010002610100600160a81b0319909216919091179091556006549496509094508086169316929092149150614554905057600080fd5b8251614567906015906020860190614dab565b505050505050565b600061457961200e565b9050801561461057600b54601654604051636197390160e11b81526101009092046001600160a01b03169163c32e7202916145bc91859160ff169060040161570e565b602060405180830381600087803b1580156145d657600080fd5b505af11580156145ea573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061460e91906150af565b505b6040516370a0823160e01b81526146b990839073d533a949740bb3306d119cc777fa900ba034cd52906370a082319061464d9030906004016152d1565b60206040518083038186803b15801561466557600080fd5b505afa158015614679573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061469d91906151f9565b73d533a949740bb3306d119cc777fa900ba034cd529190613642565b6040516370a0823160e01b8152610be5908390734e3fbd56cd56c3e72c1403e103b45db9da5b9d2b906370a08231906146f69030906004016152d1565b60206040518083038186803b15801561470e57600080fd5b505afa158015614722573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061474691906151f9565b734e3fbd56cd56c3e72c1403e103b45db9da5b9d2b9190613642565b600073b5e1cacb567d98faadb60a1fd4820720141f064f6001600160a01b03166334a9e75c6040518163ffffffff1660e01b815260040160206040518083038186803b1580156147b157600080fd5b505afa1580156147c5573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061163491906150af565b606061483e826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166135a99092919063ffffffff16565b8051909150156135a4578080602001905181019061485c91906150af565b6135a45760405162461bcd60e51b8152600401610a82906155eb565b606061488385614c4b565b61489f5760405162461bcd60e51b8152600401610a829061558f565b60006060866001600160a01b031685876040516148bc91906152b5565b60006040518083038185875af1925050503d80600081146148f9576040519150601f19603f3d011682016040523d82523d6000602084013e6148fe565b606091505b509150915081156149125791506135b89050565b8051156149225780518082602001fd5b8360405162461bcd60e51b8152600401610a829190615422565b6000818361495d5760405162461bcd60e51b8152600401610a829190615422565b50600083858161496957fe5b0495945050505050565b600081848411156149975760405162461bcd60e51b8152600401610a829190615422565b505050900390565b60008183106149ae57816136a3565b5090919050565b6040516338ed173960e01b815273d9e1ce17f2641f24ae83637ab66a2cca9c378b9f906338ed1739906149f69084906000906018903090429060040161571e565b600060405180830381600087803b158015614a1057600080fd5b505af1158015614a24573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610be59190810190614ffe565b67016345785d8a0000811115614ad05760405163394747c560e01b815273b576491f1e6e5e62f1d8f26062ee822b40b0e0d49063394747c590614a9d906001906000908690829081906004016153ce565b600060405180830381600087803b158015614ab757600080fd5b505af1158015614acb573d6000803e3d6000fd5b505050505b67016345785d8a0000821115614b545760405163394747c560e01b8152738301ae4fc9c624d1d396cbdaa1ed877821d7c5119063394747c590614b21906001906000908790829081906004016153ce565b600060405180830381600087803b158015614b3b57600080fd5b505af1158015614b4f573d6000803e3d6000fd5b505050505b6040516370a0823160e01b815260009073c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2906370a0823190614b8e9030906004016152d1565b60206040518083038186803b158015614ba657600080fd5b505afa158015614bba573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614bde91906151f9565b905080156135a457604051632e1a7d4d60e01b815273c02aaa39b223fe8d0a0e5c4f27ead9083c756cc290632e1a7d4d90614c1d9084906004016156af565b600060405180830381600087803b158015614c3757600080fd5b505af11580156120c2573d6000803e3d6000fd5b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a4708181148015906135b8575050151592915050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10614cc55782800160ff19823516178555614cf2565b82800160010185558215614cf2579182015b82811115614cf2578235825591602001919060010190614cd7565b5061326c929150614e19565b828054828255906000526020600020908101928215614d53579160200282015b82811115614d5357825182546001600160a01b0319166001600160a01b03909116178255602090920191600190910190614d1e565b5061326c929150614e2e565b6040518061012001604052806000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10614dec57805160ff1916838001178555614cf2565b82800160010185558215614cf2579182015b82811115614cf2578251825591602001919060010190614dfe565b5b8082111561326c5760008155600101614e1a565b5b8082111561326c5780546001600160a01b0319168155600101614e2f565b600060208284031215614e5e578081fd5b81356136a381615874565b600060208284031215614e7a578081fd5b81516136a381615874565b60008060008060008060c08789031215614e9d578182fd5b8651614ea881615874565b6020880151909650614eb981615874565b6040880151909550614eca81615874565b6060880151909450614edb81615874565b6080880151909350614eec81615874565b60a0880151909250614efd81615889565b809150509295509295509295565b600080600080600080600060e0888a031215614f25578081fd5b8735614f3081615874565b9650602088810135614f4181615874565b96506040890135614f5181615874565b95506060890135614f6181615874565b94506080890135935060a0890135614f7881615874565b925060c089013567ffffffffffffffff80821115614f94578384fd5b818b0191508b601f830112614fa7578384fd5b813581811115614fb5578485fd5b614fc7601f8201601f191685016157fd565b91508082528c84828501011115614fdc578485fd5b8084840185840137848482840101525080935050505092959891949750929550565b60006020808385031215615010578182fd5b825167ffffffffffffffff811115615026578283fd5b8301601f81018513615036578283fd5b805161504961504482615824565b6157fd565b8181528381019083850185840285018601891015615065578687fd5b8694505b83851015615087578051835260019490940193918501918501615069565b50979650505050505050565b6000602082840312156150a4578081fd5b81356136a381615889565b6000602082840312156150c0578081fd5b81516136a381615889565b600080604083850312156150dd578182fd5b82356150e881615889565b946020939093013593505050565b60008060208385031215615108578182fd5b823567ffffffffffffffff8082111561511f578384fd5b818501915085601f830112615132578384fd5b813581811115615140578485fd5b866020828501011115615151578485fd5b60209290920196919550909350505050565b6000610120808385031215615176578182fd5b61517f816157fd565b9050825181526020830151602082015260408301516040820152606083015160608201526080830151608082015260a083015160a082015260c083015160c082015260e083015160e08201526101008084015181830152508091505092915050565b6000602082840312156151f2578081fd5b5035919050565b60006020828403121561520a578081fd5b5051919050565b600080600060608486031215615225578081fd5b8335925060208401359150604084013561523e81615874565b809150509250925092565b6000806000806080858703121561525e578182fd5b843593506020850135925060408501359150606085013561527e81615889565b939692955090935050565b600081518084526152a1816020860160208601615844565b601f01601f19169290920160200192915050565b600082516152c7818460208701615844565b9190910192915050565b6001600160a01b0391909116815260200190565b6001600160a01b039290921682521515602082015260400190565b6001600160a01b0392831681529116602082015260400190565b6001600160a01b03888116825287811660208301528681166040830152858116606083015260808201859052831660a082015260e060c0820181905260009061536590830184615289565b9998505050505050505050565b6001600160a01b03929092168252602082015260400190565b60608101818460005b60028110156153b3578151835260209283019290910190600101615394565b5050508260408301529392505050565b901515815260200190565b9485526020850193909352604084019190915260608301521515608082015260a00190565b60006020825282602083015282846040840137818301604090810191909152601f909201601f19160101919050565b6000602082526136a36020830184615289565b6020808252600b908201526a085cdd1c985d1959da5cdd60aa1b604082015260600190565b602080825260059082015264085dd85b9d60da1b604082015260600190565b6020808252601b908201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604082015260600190565b6020808252600c908201526b216865616c7468636865636b60a01b604082015260600190565b6020808252601c908201527f537472617465677920616c726561647920696e697469616c697a656400000000604082015260600190565b60208082526021908201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6040820152607760f81b606082015260800190565b602080825260069082015265085d985d5b1d60d21b604082015260600190565b6020808252600790820152662173686172657360c81b604082015260600190565b6020808252601d908201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604082015260600190565b6020808252600b908201526a08585d5d1a1bdc9a5e995960aa1b604082015260600190565b6020808252602a908201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6040820152691bdd081cdd58d8d9595960b21b606082015260800190565b6020808252600a9082015269085c1c9bdd1958dd195960b21b604082015260600190565b60208082526036908201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60408201527520746f206e6f6e2d7a65726f20616c6c6f77616e636560501b606082015260800190565b90815260200190565b60006040820184835260206040818501528185518084526060860191508287019350845b818110156157015784516001600160a01b0316835293830193918301916001016156dc565b5090979650505050505050565b9182521515602082015260400190565b600060a082018783526020878185015260a0604085015281875480845260c0860191508885528285209350845b818110156157705784546001600160a01b03168352600194850194928401920161574b565b50506001600160a01b03969096166060850152505050608001529392505050565b92835260208301919091521515604082015260600190565b9283526020830191909152604082015260600190565b93845260208401929092526040830152606082015260800190565b948552602085019390935260408401919091526060830152608082015260a00190565b60405181810167ffffffffffffffff8111828210171561581c57600080fd5b604052919050565b600067ffffffffffffffff82111561583a578081fd5b5060209081020190565b60005b8381101561585f578181015183820152602001615847565b8381111561586e576000848401525b50505050565b6001600160a01b038116811461183157600080fd5b801515811461183157600080fdfea264697066735822122093313172a40a75690b648bf71aadbeede331496094d260c559337cce5ba6b17164736f6c634300060c0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000986b4aff588a109c09b50a03f42e4110e29d353f0000000000000000000000000000000000000000000000000000000000000017000000000000000000000000c5424b857f758e906013f3555dad202e4bdb4567000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000125374726174656779436f6e766578734554480000000000000000000000000000
-----Decoded View---------------
Arg [0] : _vault (address): 0x986b4AFF588a109c09B50A03f42E4110E29D353F
Arg [1] : _pid (uint256): 23
Arg [2] : _curvePool (address): 0xc5424B857f758E906013F3555Dad202e4bdB4567
Arg [3] : _name (string): StrategyConvexsETH
-----Encoded View---------------
6 Constructor Arguments found :
Arg [0] : 000000000000000000000000986b4aff588a109c09b50a03f42e4110e29d353f
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000017
Arg [2] : 000000000000000000000000c5424b857f758e906013f3555dad202e4bdb4567
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000080
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000012
Arg [5] : 5374726174656779436f6e766578734554480000000000000000000000000000
Deployed Bytecode Sourcemap
72715:17710:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;65299:444;;;;;;;;;;-1:-1:-1;65299:444:0;;;;;:::i;:::-;;:::i;:::-;;36321:25;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;84708:2530;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;68245:98::-;;;;;;;;;;;;;:::i;72475:186::-;;;;;;;;;;-1:-1:-1;72475:186:0;;;;;:::i;:::-;;:::i;46859:175::-;;;;;;;;;;-1:-1:-1;46859:175:0;;;;;:::i;:::-;;:::i;71846:317::-;;;;;;;;;;-1:-1:-1;71846:317:0;;;;;:::i;:::-;;:::i;42335:162::-;;;;;;;;;;-1:-1:-1;42335:162:0;;;;;:::i;:::-;;:::i;39673:28::-;;;;;;;;;;;;;:::i;38348:18::-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;38257:25::-;;;;;;;;;;;;;:::i;66172:37::-;;;;;;;;;;;;;:::i;50261:148::-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;36720:91::-;;;;;;;;;;;;;:::i;39309:29::-;;;;;;;;;;;;;:::i;61703:515::-;;;;;;;;;;-1:-1:-1;61703:515:0;;;;;:::i;:::-;;:::i;71035:230::-;;;;;;;;;;;;;:::i;67932:24::-;;;;;;;;;;;;;:::i;44908:154::-;;;;;;;;;;-1:-1:-1;44908:154:0;;;;;:::i;:::-;;:::i;67521:31::-;;;;;;;;;;;;;:::i;55358:170::-;;;;;;;;;;;;;:::i;59837:1622::-;;;;;;;;;;;;;:::i;66507:22::-;;;;;;;;;;;;;:::i;39752:25::-;;;;;;;;;;;;;:::i;68407:121::-;;;;;;;;;;;;;:::i;67423:31::-;;;;;;;;;;;;;:::i;54597:432::-;;;;;;;;;;-1:-1:-1;54597:432:0;;;;;:::i;:::-;;:::i;36377:25::-;;;;;;;;;;;;;:::i;75707:346::-;;;;;;;;;;-1:-1:-1;75707:346:0;;;;;:::i;:::-;;:::i;72912:21::-;;;;;;;;;;;;;:::i;43665:174::-;;;;;;;;;;-1:-1:-1;43665:174:0;;;;;:::i;:::-;;:::i;47337:171::-;;;;;;;;;;-1:-1:-1;47337:171:0;;;;;:::i;:::-;;:::i;87369:121::-;;;;;;;;;;-1:-1:-1;87369:121:0;;;;;:::i;66414:22::-;;;;;;;;;;;;;:::i;74364:1274::-;;;;;;;;;;-1:-1:-1;74364:1274:0;;;;;:::i;:::-;;:::i;39495:27::-;;;;;;;;;;;;;:::i;38127:94::-;;;;;;;;;;;;;:::i;46133:169::-;;;;;;;;;;-1:-1:-1;46133:169:0;;;;;:::i;:::-;;:::i;39158:29::-;;;;;;;;;;;;;:::i;38289:22::-;;;;;;;;;;;;;:::i;72279:119::-;;;;;;;;;;-1:-1:-1;72279:119:0;;;;;:::i;:::-;;:::i;67619:30::-;;;;;;;;;;;;;:::i;42505:171::-;;;;;;;;;;-1:-1:-1;42505:171:0;;;;;:::i;:::-;;:::i;38318:21::-;;;;;;;;;;;;;:::i;36409:26::-;;;;;;;;;;;;;:::i;90033:389::-;;;;;;;;;;-1:-1:-1;90033:389:0;;;;;:::i;:::-;;:::i;66253:33::-;;;;;;;;;;;;;:::i;68593:110::-;;;;;;;;;;;;;:::i;68780:121::-;;;;;;;;;;;;;:::i;42909:202::-;;;;;;;;;;-1:-1:-1;42909:202:0;;;;;:::i;:::-;;:::i;62990:281::-;;;;;;;;;;-1:-1:-1;62990:281:0;;;;;:::i;:::-;;:::i;73768:26::-;;;;;;;;;;;;;:::i;88701:1059::-;;;;;;;;;;-1:-1:-1;88701:1059:0;;;;;:::i;:::-;;:::i;72997:24::-;;;;;;;;;;;;;:::i;44128:263::-;;;;;;;;;;-1:-1:-1;44128:263:0;;;;;:::i;:::-;;:::i;73801:22::-;;;;;;;;;;;;;:::i;82744:1858::-;;;;;;;;;;-1:-1:-1;82744:1858:0;;;;;:::i;:::-;;:::i;66606:33::-;;;;;;;;;;;;;:::i;68909:133::-;;;;;;;;;;;;;:::i;45579:154::-;;;;;;;;;;-1:-1:-1;45579:154:0;;;;;:::i;:::-;;:::i;87867:539::-;;;;;;;;;;;;;:::i;66334:18::-;;;;;;;;;;;;;:::i;38229:21::-;;;;;;;;;;;;;:::i;63700:173::-;;;;;;;;;;;;;:::i;65299:444::-;40378:12;:10;:12::i;:::-;-1:-1:-1;;;;;40364:26:0;:10;-1:-1:-1;;;;;40364:26:0;;40356:50;;;;-1:-1:-1;;;40356:50:0;;;;;;;:::i;:::-;;;;;;;;;65391:4:::1;::::0;-1:-1:-1;;;;;65373:23:0;;::::1;65391:4:::0;::::1;65373:23;;65365:41;;;;-1:-1:-1::0;;;65365:41:0::1;;;;;;;:::i;:::-;65443:5;::::0;-1:-1:-1;;;;;65425:24:0;;::::1;65443:5:::0;::::1;65425:24;;65417:44;;;;-1:-1:-1::0;;;65417:44:0::1;;;;;;;:::i;:::-;65474:33;65510:17;:15;:17::i;:::-;65474:53;;65543:9;65538:102;65558:16;:23;65554:1;:27;65538:102;;;65606:16;65623:1;65606:19;;;;;;;;;;;;;;-1:-1:-1::0;;;;;65596:29:0::1;:6;-1:-1:-1::0;;;;;65596:29:0::1;;;65588:52;;;;-1:-1:-1::0;;;65588:52:0::1;;;;;;;:::i;:::-;65583:3;;65538:102;;;;65653:82;65681:12;:10;:12::i;:::-;65695:39;::::0;-1:-1:-1;;;65695:39:0;;-1:-1:-1;;;;;65695:24:0;::::1;::::0;::::1;::::0;:39:::1;::::0;65728:4:::1;::::0;65695:39:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;65653:27:0;::::1;::::0;:82;:27:::1;:82::i;:::-;40417:1;65299:444:::0;:::o;36321:25::-;;;;;;;;;;;;;;;-1:-1:-1;;36321:25:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;84708:2530::-;84762:7;84875:19;84897:5;84875:27;;84913:17;84933:22;84913:42;;84976:25;85004:14;84976:42;;85040:14;67252:42;-1:-1:-1;;;;;85057:23:0;;:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;85040:42;-1:-1:-1;85093:19:0;;85141:29;85040:42;85152:17;85141:10;:29::i;:::-;85125:45;;85181:21;85205:18;:16;:18::i;:::-;85181:42;;85284:11;85276:5;:19;85272:444;;;85372:17;85392:22;:11;85408:5;85392:15;:22::i;:::-;85372:42;-1:-1:-1;85465:45:0;85498:11;85465:28;:13;85372:42;85465:17;:28::i;:::-;:32;;:45::i;:::-;85451:59;-1:-1:-1;85559:18:0;85580:21;:9;85594:6;85580:13;:21::i;:::-;85559:42;;85634:10;85620:11;:24;85616:89;;;85679:10;85665:24;;85616:89;85272:444;;;85821:17;85849:42;85821:71;;85903:16;85922:33;85951:3;85922:9;-1:-1:-1;;;;;85922:22:0;;:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:33::-;85903:52;;85987:16;86006:45;86046:4;86006:35;86032:8;73228:42;-1:-1:-1;;;;;86006:19:0;;:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:25;;:35::i;:45::-;85987:64;;86093:16;86112:45;86152:4;86112:35;86138:8;73387:42;-1:-1:-1;;;;;86112:19:0;;:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:45;86093:64;-1:-1:-1;86201:16:0;86220:37;86252:4;86220:27;:8;86233:13;86220:12;:27::i;:37::-;86201:56;-1:-1:-1;86299:16:0;86318:35;86348:4;86318:25;:8;86331:11;86318:12;:25::i;:35::-;86494:10;;86299:54;;-1:-1:-1;86459:20:0;;-1:-1:-1;;;86494:10:0;;;;86490:681;;;86549:16;;;86563:1;86549:16;;;;;;;;;86521:25;;86549:16;;;86521:25;;86549:16;;;-1:-1:-1;;86602:12:0;;86580:11;;;;-1:-1:-1;;;;;;86602:12:0;;86580:11;;-1:-1:-1;86602:12:0;;86580:11;;;;;;;;;:35;-1:-1:-1;;;;;86580:35:0;;;-1:-1:-1;;;;;86580:35:0;;;;;67350:42;86630:8;86639:1;86630:11;;;;;;;;;;;;;:27;-1:-1:-1;;;;;86630:27:0;;;-1:-1:-1;;;;;86630:27:0;;;;;73592:42;86672:8;86681:1;86672:11;;;;;;;;-1:-1:-1;;;;;86672:27:0;;;:11;;;;;;;;;:27;86777:18;;86762:56;;-1:-1:-1;;;86762:56:0;;86716:26;;86777:18;;;;;86762:41;;:56;;86812:4;;86762:56;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;86716:102;-1:-1:-1;86837:22:0;;86833:327;;86931:146;;-1:-1:-1;;;86931:146:0;;86880:27;;67010:42;;86931:43;;:146;;87001:18;;87046:8;;86931:146;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;86931:146:0;;;;;;;;;;;;:::i;:::-;86880:197;;87111:10;87142:1;87122:10;:17;:21;87111:33;;;;;;;;;;;;;;87096:48;;86833:327;;86490:681;;;87190:40;87217:12;87190:22;:8;87203;87190:12;:22::i;:::-;:26;;:40::i;:::-;87183:47;;;;;;;;;;;;;;;;84708:2530;;:::o;68245:98::-;68326:9;68319:16;;;;;;;;-1:-1:-1;;68319:16:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;68293:13;;68319:16;;68326:9;;68319:16;;68326:9;68319:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;68245:98;:::o;72475:186::-;40835:5;;;;;;;;;-1:-1:-1;;;;;40835:5:0;-1:-1:-1;;;;;40835:16:0;;:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;40821:32:0;:10;-1:-1:-1;;;;;40821:32:0;;:62;;;;40871:12;:10;:12::i;:::-;-1:-1:-1;;;;;40857:26:0;:10;-1:-1:-1;;;;;40857:26:0;;40821:62;40813:86;;;;-1:-1:-1;;;40813:86:0;;;;;;;:::i;:::-;72603:23:::1;:50:::0;;-1:-1:-1;;72603:50:0::1;::::0;::::1;;::::0;;;::::1;::::0;;72475:186::o;46859:175::-;39863:10;;-1:-1:-1;;;;;39863:10:0;39849;:24;;:54;;;39891:12;:10;:12::i;:::-;-1:-1:-1;;;;;39877:26:0;:10;-1:-1:-1;;;;;39877:26:0;;39849:54;39841:78;;;;-1:-1:-1;;;39841:78:0;;;;;;;:::i;:::-;46944:13:::1;:30:::0;;;46990:36:::1;::::0;::::1;::::0;::::1;::::0;46960:14;;46990:36:::1;:::i;:::-;;;;;;;;46859:175:::0;:::o;71846:317::-;40378:12;:10;:12::i;:::-;-1:-1:-1;;;;;40364:26:0;:10;-1:-1:-1;;;;;40364:26:0;;40356:50;;;;-1:-1:-1;;;40356:50:0;;;;;;;:::i;:::-;72017:6:::1;72005:8;:18;;:40;;;;;72039:6;72027:8;:18;;72005:40;71997:49;;;::::0;::::1;;72057:7;:18:::0;;;;72086:7:::1;:18:::0;72115::::1;:40:::0;;-1:-1:-1;;;;;;72115:40:0::1;-1:-1:-1::0;;;;;72115:40:0;;::::1;::::0;;;::::1;::::0;;71846:317::o;42335:162::-;40835:5;;;;;;;;;-1:-1:-1;;;;;40835:5:0;-1:-1:-1;;;;;40835:16:0;;:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;40821:32:0;:10;-1:-1:-1;;;;;40821:32:0;;:62;;;;40871:12;:10;:12::i;:::-;-1:-1:-1;;;;;40857:26:0;:10;-1:-1:-1;;;;;40857:26:0;;40821:62;40813:86;;;;-1:-1:-1;;;40813:86:0;;;;;;;:::i;:::-;42424:28:::1;42439:12;42424:28;;;;;;:::i;:::-;;;;;;;;42463:11;:26:::0;;-1:-1:-1;;;;;42463:26:0;;::::1;;;-1:-1:-1::0;;;;;;42463:26:0;;::::1;::::0;;;::::1;::::0;;42335:162::o;39673:28::-;;;;:::o;38348:18::-;;;-1:-1:-1;;;;;38348:18:0;;:::o;38257:25::-;;;-1:-1:-1;;;;;38257:25:0;;:::o;66172:37::-;;;;;;-1:-1:-1;;;;;66172:37:0;;:::o;50261:148::-;50326:5;;:31;;-1:-1:-1;;;50326:31:0;;50302:4;;;;-1:-1:-1;;;;;50326:5:0;;;;:16;;:31;;50351:4;;50326:31;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:41;;;:45;:75;;;;50400:1;50375:22;:20;:22::i;:::-;:26;50326:75;50319:82;;50261:148;:::o;36720:91::-;36789:14;;;;;;;;;;;;-1:-1:-1;;;36789:14:0;;;;36720:91;:::o;39309:29::-;;;;:::o;61703:515::-;61818:5;;61762:13;;-1:-1:-1;;;;;61818:5:0;61796:10;:28;61788:47;;;;-1:-1:-1;;;61788:47:0;;;;;;;:::i;:::-;61921:19;61974:32;61992:13;61974:17;:32::i;:::-;62098:4;;61951:55;;-1:-1:-1;61951:55:0;;-1:-1:-1;62098:42:0;;-1:-1:-1;;;;;62098:4:0;62116:10;61951:55;62098:17;:42::i;:::-;61703:515;;;;:::o;71035:230::-;40835:5;;;;;;;;;-1:-1:-1;;;;;40835:5:0;-1:-1:-1;;;;;40835:16:0;;:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;40821:32:0;:10;-1:-1:-1;;;;;40821:32:0;;:62;;;;40871:12;:10;:12::i;:::-;-1:-1:-1;;;;;40857:26:0;:10;-1:-1:-1;;;;;40857:26:0;;40821:62;40813:86;;;;-1:-1:-1;;;40813:86:0;;;;;;;:::i;:::-;71114:18:::1;71135:15;:13;:15::i;:::-;71114:36:::0;-1:-1:-1;71165:14:0;;71161:97:::1;;71196:15;::::0;71233:12:::1;::::0;71196:50:::1;::::0;-1:-1:-1;;;71196:50:0;;:15:::1;::::0;;::::1;-1:-1:-1::0;;;;;71196:15:0::1;::::0;:24:::1;::::0;:50:::1;::::0;71221:10;;71233:12:::1;;::::0;71196:50:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;71161:97::-;40910:1;71035:230::o:0;67932:24::-;;;;;;:::o;44908:154::-;39863:10;;-1:-1:-1;;;;;39863:10:0;39849;:24;;:54;;;39891:12;:10;:12::i;:::-;-1:-1:-1;;;;;39877:26:0;:10;-1:-1:-1;;;;;39877:26:0;;39849:54;39841:78;;;;-1:-1:-1;;;39841:78:0;;;;;;;:::i;:::-;44986:14:::1;:23:::0;;;45025:29:::1;::::0;::::1;::::0;::::1;::::0;45003:6;;45025:29:::1;:::i;67521:31::-:0;;;;:::o;55358:170::-;40504:6;;-1:-1:-1;;;;;40504:6:0;40490:10;:20;;:65;;-1:-1:-1;40545:10:0;;-1:-1:-1;;;;;40545:10:0;40531;:24;40490:65;:112;;;;40590:12;:10;:12::i;:::-;-1:-1:-1;;;;;40576:26:0;:10;-1:-1:-1;;;;;40576:26:0;;40490:112;:163;;;;40637:5;;;;;;;;;-1:-1:-1;;;;;40637:5:0;-1:-1:-1;;;;;40637:14:0;;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;40623:30:0;:10;-1:-1:-1;;;;;40623:30:0;;40490:163;:216;;;;40688:5;;;;;;;;;-1:-1:-1;;;;;40688:5:0;-1:-1:-1;;;;;40688:16:0;;:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;40674:32:0;:10;-1:-1:-1;;;;;40674:32:0;;40490:216;40468:277;;;;-1:-1:-1;;;40468:277:0;;;;;;;:::i;:::-;55496:5:::1;::::0;:23:::1;::::0;;-1:-1:-1;;;55496:23:0;;;;55481:39:::1;::::0;-1:-1:-1;;;;;55496:5:0::1;::::0;:21:::1;::::0;:23:::1;::::0;;::::1;::::0;::::1;::::0;;;;;;;;:5;:23;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;55481:14;:39::i;:::-;55358:170::o:0;59837:1622::-;40504:6;;-1:-1:-1;;;;;40504:6:0;40490:10;:20;;:65;;-1:-1:-1;40545:10:0;;-1:-1:-1;;;;;40545:10:0;40531;:24;40490:65;:112;;;;40590:12;:10;:12::i;:::-;-1:-1:-1;;;;;40576:26:0;:10;-1:-1:-1;;;;;40576:26:0;;40490:112;:163;;;;40637:5;;;;;;;;;-1:-1:-1;;;;;40637:5:0;-1:-1:-1;;;;;40637:14:0;;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;40623:30:0;:10;-1:-1:-1;;;;;40623:30:0;;40490:163;:216;;;;40688:5;;;;;;;;;-1:-1:-1;;;;;40688:5:0;-1:-1:-1;;;;;40688:16:0;;:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;40674:32:0;:10;-1:-1:-1;;;;;40674:32:0;;40490:216;40468:277;;;;-1:-1:-1;;;40468:277:0;;;;;;;:::i;:::-;59888:14:::1;59917:12:::0;59944:23:::1;59970:5;;;;;;;;;-1:-1:-1::0;;;;;59970:5:0::1;-1:-1:-1::0;;;;;59970:21:0::1;;:23;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;60042:13;::::0;59944:49;;-1:-1:-1;60004:19:0::1;::::0;60042:13:::1;;60038:580;;;60124:19;60146:23;:21;:23::i;:::-;60124:45;;60202:15;60188:11;:29;60184:226;;;60245:32;:15:::0;60265:11;60245:19:::1;:32::i;:::-;60238:39;;60184:226;;;60317:15;60303:11;:29;60299:111;;;60362:32;:11:::0;60378:15;60362::::1;:32::i;:::-;60353:41;;60299:111;60438:25;:15:::0;60458:4;60438:19:::1;:25::i;:::-;60424:39;;60038:580;;;;60576:30;60590:15;60576:13;:30::i;:::-;60546:60:::0;;-1:-1:-1;60546:60:0;-1:-1:-1;60546:60:0;-1:-1:-1;60038:580:0::1;60834:5;::::0;:31:::1;::::0;-1:-1:-1;;;60834:31:0;;60814:17:::1;::::0;-1:-1:-1;;;;;60834:5:0::1;::::0;:16:::1;::::0;:31:::1;::::0;60859:4:::1;::::0;60834:31:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:41;;::::0;60904:5:::1;::::0;:39:::1;::::0;-1:-1:-1;;;60904:39:0;;60834:41;;-1:-1:-1;;;;;;60904:5:0::1;::::0;:12:::1;::::0;:39:::1;::::0;60917:6;;60925:4;;60931:11;;60904:39:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;60886:57;;61019:31;61034:15;61019:14;:31::i;:::-;61105:13;::::0;::::1;;:42:::0;::::1;;;-1:-1:-1::0;61122:11:0::1;::::0;::::1;::::0;::::1;-1:-1:-1::0;;;;;61122:11:0::1;:25:::0;::::1;61105:42;61101:280;;;61184:11;::::0;61172:85:::1;::::0;-1:-1:-1;;;61172:85:0;;61184:11:::1;::::0;;::::1;-1:-1:-1::0;;;;;61184:11:0::1;::::0;61172:30:::1;::::0;:85:::1;::::0;61203:6;;61211:4;;61217:11;;61230:15;;61247:9;;61172:85:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;61164:110;;;;-1:-1:-1::0;;;61164:110:0::1;;;;;;;:::i;:::-;61101:280;;;61312:22;61329:4;61312:22;;;;;;:::i;:::-;;;;;;;;61365:4;61349:20:::0;;-1:-1:-1;;61349:20:0::1;::::0;::::1;::::0;;61101:280:::1;61398:53;61408:6;61416:4;61422:11;61435:15;61398:53;;;;;;;;;:::i;:::-;;;;;;;;40756:1;;;;;59837:1622::o:0;66507:22::-;;;;:::o;39752:25::-;;;;;;:::o;68407:121::-;68480:15;;:40;;-1:-1:-1;;;68480:40:0;;68453:7;;68480:15;;;-1:-1:-1;;;;;68480:15:0;;:25;;:40;;68514:4;;68480:40;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;67423:31::-;;;;:::o;54597:432::-;54670:4;54597:432;;;;:::o;36377:25::-;;;;;;:::o;75707:346::-;75942:51;75954:6;75962:11;75975:8;75985:7;75942:11;:51::i;:::-;76004:41;76021:4;76027:10;76039:5;76004:16;:41::i;:::-;75707:346;;;;;;;:::o;72912:21::-;;;;;;-1:-1:-1;;;;;72912:21:0;;:::o;43665:174::-;39863:10;;-1:-1:-1;;;;;39863:10:0;39849;:24;;:54;;;39891:12;:10;:12::i;:::-;-1:-1:-1;;;;;39877:26:0;:10;-1:-1:-1;;;;;39877:26:0;;39849:54;39841:78;;;;-1:-1:-1;;;39841:78:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;43744:21:0;::::1;43736:30;;;::::0;::::1;;43777:6;:16:::0;;-1:-1:-1;;;;;;43777:16:0::1;-1:-1:-1::0;;;;;43777:16:0;::::1;;::::0;;43809:22:::1;::::0;::::1;::::0;::::1;::::0;43777:16;;43809:22:::1;:::i;47337:171::-:0;39863:10;;-1:-1:-1;;;;;39863:10:0;39849;:24;;:54;;;39891:12;:10;:12::i;:::-;-1:-1:-1;;;;;39877:26:0;:10;-1:-1:-1;;;;;39877:26:0;;39849:54;39841:78;;;;-1:-1:-1;;;39841:78:0;;;;;;;:::i;:::-;47426:26:::1;:11;47440:12:::0;;47426:26:::1;:::i;:::-;;47468:32;47487:12;;47468:32;;;;;;;:::i;:::-;;;;;;;;47337:171:::0;;:::o;66414:22::-;;;;:::o;74364:1274::-;74654:10;;74606:27;;74654:10;;74646:19;;;;;;74922:4;74916:11;-1:-1:-1;;;74941:135:0;;74823:4;74807:22;;75113:4;75097:21;;75090:43;;;-1:-1:-1;;;75188:4:0;75172:21;;75147:146;74807:22;75344:4;74916:11;74784:20;75322:27;75372:221;;-1:-1:-1;;;75372:221:0;;75307:42;;-1:-1:-1;;;;;;75372:54:0;;;-1:-1:-1;75372:54:0;;:221;;75441:6;;75462:11;;75488:8;;75511:7;;75533:4;;75552:10;;75577:5;;75372:221;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;75611:19:0;;-1:-1:-1;;;;;75611:19:0;;;-1:-1:-1;75611:19:0;;-1:-1:-1;75611:19:0;;;74364:1274;;;;;;;;;;:::o;39495:27::-;;;;:::o;38127:94::-;38185:7;38127:94;:::o;46133:169::-;39863:10;;-1:-1:-1;;;;;39863:10:0;39849;:24;;:54;;;39891:12;:10;:12::i;:::-;-1:-1:-1;;;;;39877:26:0;:10;-1:-1:-1;;;;;39877:26:0;;39849:54;39841:78;;;;-1:-1:-1;;;39841:78:0;;;;;;;:::i;:::-;46216:12:::1;:28:::0;;;46260:34:::1;::::0;::::1;::::0;::::1;::::0;46231:13;;46260:34:::1;:::i;39158:29::-:0;;;;:::o;38289:22::-;;;-1:-1:-1;;;;;38289:22:0;;:::o;72279:119::-;40835:5;;;;;;;;;-1:-1:-1;;;;;40835:5:0;-1:-1:-1;;;;;40835:16:0;;:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;40821:32:0;:10;-1:-1:-1;;;;;40821:32:0;;:62;;;;40871:12;:10;:12::i;:::-;-1:-1:-1;;;;;40857:26:0;:10;-1:-1:-1;;;;;40857:26:0;;40821:62;40813:86;;;;-1:-1:-1;;;40813:86:0;;;;;;;:::i;:::-;72362:12:::1;:28:::0;;-1:-1:-1;;72362:28:0::1;::::0;::::1;;::::0;;;::::1;::::0;;72279:119::o;67619:30::-;;;;:::o;42505:171::-;40835:5;;;;;;;;;-1:-1:-1;;;;;40835:5:0;-1:-1:-1;;;;;40835:16:0;;:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;40821:32:0;:10;-1:-1:-1;;;;;40821:32:0;;:62;;;;40871:12;:10;:12::i;:::-;-1:-1:-1;;;;;40857:26:0;:10;-1:-1:-1;;;;;40857:26:0;;40821:62;40813:86;;;;-1:-1:-1;;;40813:86:0;;;;;;;:::i;:::-;42595:32:::1;42612:14;42595:32;;;;;;:::i;:::-;;;;;;;;42638:13;:30:::0;;-1:-1:-1;;42638:30:0::1;::::0;::::1;;::::0;;;::::1;::::0;;42505:171::o;38318:21::-;;;-1:-1:-1;;;;;38318:21:0;;:::o;36409:26::-;;;;;;-1:-1:-1;;;;;36409:26:0;;:::o;90033:389::-;40835:5;;;;;;;;;-1:-1:-1;;;;;40835:5:0;-1:-1:-1;;;;;40835:16:0;;:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;40821:32:0;:10;-1:-1:-1;;;;;40821:32:0;;:62;;;;40871:12;:10;:12::i;:::-;-1:-1:-1;;;;;40857:26:0;:10;-1:-1:-1;;;;;40857:26:0;;40821:62;40813:86;;;;-1:-1:-1;;;40813:86:0;;;;;;;:::i;:::-;90247:16:::1;:36:::0;;;;90294:16:::1;:36:::0;;;;90341:15:::1;:34:::0;90386:12:::1;:28:::0;;;::::1;;-1:-1:-1::0;;;90386:28:0::1;-1:-1:-1::0;;;;90386:28:0;;::::1;::::0;;;::::1;::::0;;90033:389::o;66253:33::-;;;-1:-1:-1;;;;;66253:33:0;;:::o;68593:110::-;68666:4;;:29;;-1:-1:-1;;;68666:29:0;;68639:7;;-1:-1:-1;;;;;68666:4:0;;:14;;:29;;68689:4;;68666:29;;;:::i;68780:121::-;68856:15;;:37;;-1:-1:-1;;;68856:37:0;;68829:7;;68856:15;;;-1:-1:-1;;;;;68856:15:0;;:22;;:37;;68887:4;;68856:37;;;:::i;42909:202::-;39863:10;;-1:-1:-1;;;;;39863:10:0;39849;:24;;:54;;;39891:12;:10;:12::i;:::-;-1:-1:-1;;;;;39877:26:0;:10;-1:-1:-1;;;;;39877:26:0;;39849:54;39841:78;;;;-1:-1:-1;;;39841:78:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;42996:25:0;::::1;42988:34;;;::::0;::::1;;43033:10;:24:::0;;-1:-1:-1;;;;;;43033:24:0::1;-1:-1:-1::0;;;;;43033:24:0;::::1;;::::0;;43073:30:::1;::::0;::::1;::::0;::::1;::::0;43033:24;;43073:30:::1;:::i;62990:281::-:0;63079:5;;-1:-1:-1;;;;;63079:5:0;63057:10;:28;63049:37;;;;;;63143:5;;63105:34;;;-1:-1:-1;;;63105:34:0;;;;-1:-1:-1;;;;;63143:5:0;;;;63105:32;;;;;:34;;;;;;;;;;;;;;:32;:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;63105:43:0;;63097:52;;;;;;63160:30;63177:12;63160:16;:30::i;:::-;63233:4;;:29;;-1:-1:-1;;;63233:29:0;;63201:62;;63219:12;;-1:-1:-1;;;;;63233:4:0;;;;:14;;:29;;63256:4;;63233:29;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;63201:4;;-1:-1:-1;;;;;63201:4:0;;:62;:17;:62::i;73768:26::-;;;-1:-1:-1;;;;;73768:26:0;;:::o;88701:1059::-;40378:12;:10;:12::i;:::-;-1:-1:-1;;;;;40364:26:0;:10;-1:-1:-1;;;;;40364:26:0;;40356:50;;;;-1:-1:-1;;;40356:50:0;;;;;;;:::i;:::-;88849:12:::1;::::0;-1:-1:-1;;;;;88849:12:0::1;88841:35:::0;;::::1;::::0;:97:::1;;-1:-1:-1::0;88901:12:0::1;::::0;-1:-1:-1;;;;;88901:12:0::1;67252:42;88893:45;;88841:97;88823:197;;;88965:12;::::0;:43:::1;::::0;-1:-1:-1;;;88965:43:0;;-1:-1:-1;;;;;88965:12:0;;::::1;::::0;:20:::1;::::0;:43:::1;::::0;67010:42:::1;::::0;88965:12:::1;::::0;:43:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;88823:197;89034:20:::0;89030:723:::1;;89071:10;:18:::0;;-1:-1:-1;;;;;;89104:33:0;;;89152:18:::1;:31:::0;;-1:-1:-1;;;;;;89152:31:0::1;::::0;;89030:723:::1;;;89316:15;::::0;:43:::1;::::0;-1:-1:-1;;;89316:43:0;;:15:::1;::::0;;::::1;-1:-1:-1::0;;;;;89316:15:0::1;::::0;:28:::1;::::0;:43:::1;::::0;89345:13;;89316:43:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;89295:18;:64:::0;;-1:-1:-1;;;;;;89295:64:0::1;-1:-1:-1::0;;;;;89295:64:0;;::::1;;::::0;;;;89415:48:::1;::::0;;-1:-1:-1;;;89415:48:0;;;;-1:-1:-1;;89430:18:0;;;::::1;::::0;89415:46:::1;::::0;:48:::1;::::0;;::::1;::::0;::::1;::::0;;;;;;;;;89430:18;89415:48;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;89478:12;:36:::0;;-1:-1:-1;;;;;;89478:36:0::1;-1:-1:-1::0;;;;;89478:36:0;;::::1;::::0;;;::::1;::::0;;;;89592:50:::1;::::0;-1:-1:-1;;;89592:50:0;;89478:36;;-1:-1:-1;89592:12:0::1;::::0;:20:::1;::::0;:50:::1;::::0;67010:42:::1;::::0;-1:-1:-1;;89624:17:0;89592:50:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;89657:52:0::1;::::0;;;;::::1;::::0;;;89680:12:::1;::::0;-1:-1:-1;;;;;89680:12:0::1;89657:52:::0;;67350:42:::1;89657:52;::::0;::::1;::::0;::::1;::::0;:11:::1;::::0;:52:::1;;:::i;:::-;-1:-1:-1::0;;89724:10:0::1;:17:::0;;-1:-1:-1;;;;89724:17:0::1;-1:-1:-1::0;;;89724:17:0::1;::::0;;88701:1059;;:::o;72997:24::-;;;-1:-1:-1;;;72997:24:0;;;;;:::o;44128:263::-;40265:10;;-1:-1:-1;;;;;40265:10:0;40251;:24;40243:48;;;;-1:-1:-1;;;40243:48:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;44209:22:0;::::1;44201:31;;;::::0;::::1;;44243:5;::::0;44257:7:::1;::::0;;44243:25:::1;::::0;-1:-1:-1;;;44243:25:0;;-1:-1:-1;;;;;44243:5:0;;::::1;::::0;:13:::1;::::0;:25:::1;::::0;44257:7;;::::1;::::0;44243:5:::1;::::0;:25:::1;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;44279:7:0::1;:18:::0;;-1:-1:-1;;;;;;44279:18:0::1;-1:-1:-1::0;;;;;44279:18:0;;::::1;::::0;;;::::1;::::0;;;44308:5:::1;::::0;:35:::1;::::0;-1:-1:-1;;;44308:35:0;;:5;;::::1;::::0;:13:::1;::::0;:35:::1;::::0;44322:7:::1;::::0;-1:-1:-1;;44339:2:0;44308:35:::1;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;44359:24;44374:8;44359:24;;;;;;:::i;73801:22::-:0;;;-1:-1:-1;;;73801:22:0;;;;;:::o;82744:1858::-;82857:4;83018:10;:8;:10::i;:::-;83013:56;;-1:-1:-1;83052:5:0;83045:12;;83013:56;83164:12;;-1:-1:-1;;;83164:12:0;;;;83160:184;;;83264:20;:18;:20::i;:::-;83260:73;;;-1:-1:-1;83312:5:0;83305:12;;83260:73;83454:23;83480;:21;:23::i;:::-;83454:49;;83536:16;;83518:15;:34;83514:78;;;83576:4;83569:11;;;;;83514:78;83704:21;:19;:21::i;:::-;83699:67;;83749:5;83742:12;;;;;83699:67;83874:23;;;;83870:67;;;83921:4;83914:11;;;;;83870:67;84072:16;;84054:15;:34;84050:78;;;84112:4;84105:11;;;;;84050:78;84140:28;;:::i;:::-;84171:5;;:31;;-1:-1:-1;;;84171:31:0;;-1:-1:-1;;;;;84171:5:0;;;;:16;;:31;;84196:4;;84171:31;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;84140:62;;84320:14;;84279:38;84299:6;:17;;;84279:15;:19;;:38;;;;:::i;:::-;:55;84275:99;;;84358:4;84351:11;;;;;;84275:99;84475:15;;84449:5;;;;;;;;;-1:-1:-1;;;;;84449:5:0;-1:-1:-1;;;;;84449:21:0;;:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:41;84445:85;;;84514:4;84507:11;;;;;;84445:85;-1:-1:-1;84589:5:0;;82744:1858;-1:-1:-1;;;82744:1858:0:o;66606:33::-;;;-1:-1:-1;;;;;66606:33:0;;:::o;68909:133::-;68971:7;68998:36;69018:15;:13;:15::i;:::-;68998;:13;:15::i;45579:154::-;39863:10;;-1:-1:-1;;;;;39863:10:0;39849;:24;;:54;;;39891:12;:10;:12::i;:::-;-1:-1:-1;;;;;39877:26:0;:10;-1:-1:-1;;;;;39877:26:0;;39849:54;39841:78;;;;-1:-1:-1;;;39841:78:0;;;;;;;:::i;:::-;45657:14:::1;:23:::0;;;45696:29:::1;::::0;::::1;::::0;::::1;::::0;45674:6;;45696:29:::1;:::i;87867:539::-:0;87918:17;88005;88025:15;;;;;;;;;-1:-1:-1;;;;;88025:15:0;-1:-1:-1;;;;;88025:28:0;;:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;88005:50;;88082:15;88070:9;:27;88066:333;;;88121:4;88114:11;;;;;88066:333;88147:10;;-1:-1:-1;;;88147:10:0;;;;88143:256;;;88300:18;;88285:49;;;-1:-1:-1;;;88285:49:0;;;;88244:21;;-1:-1:-1;;;;;88300:18:0;;88285:47;;:49;;;;;;;;;;;;;;88300:18;88285:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;88372:15;-1:-1:-1;88356:31:0;-1:-1:-1;88349:38:0;;-1:-1:-1;;88349:38:0;88143:256;87867:539;;:::o;66334:18::-;;;;:::o;38229:21::-;;;-1:-1:-1;;;;;38229:21:0;;:::o;63700:173::-;40029:10;;-1:-1:-1;;;;;40029:10:0;40015;:24;;:54;;;40057:12;:10;:12::i;:::-;-1:-1:-1;;;;;40043:26:0;:10;-1:-1:-1;;;;;40043:26:0;;40015:54;:88;;;;40087:5;;;;;;;;;-1:-1:-1;;;;;40087:5:0;-1:-1:-1;;;;;40087:14:0;;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;40073:30:0;:10;-1:-1:-1;;;;;40073:30:0;;40015:88;:124;;;;40121:5;;;;;;;;;-1:-1:-1;;;;;40121:5:0;-1:-1:-1;;;;;40121:16:0;;:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;40107:32:0;:10;-1:-1:-1;;;;;40107:32:0;;40015:124;39993:185;;;;-1:-1:-1;;;39993:185:0;;;;;;;:::i;:::-;63772:13:::1;:20:::0;;-1:-1:-1;;63772:20:0::1;63788:4;63772:20;::::0;;63803:5:::1;::::0;:22:::1;::::0;;-1:-1:-1;;;63803:22:0;;;;-1:-1:-1;;;;;63803:5:0;;::::1;::::0;:20:::1;::::0;:22:::1;::::0;;::::1;::::0;63772:13:::1;::::0;63803:22;;;;;;;;63772:13;63803:5;:22;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;63843:22:0::1;::::0;::::1;::::0;-1:-1:-1;63843:22:0;;-1:-1:-1;63843:22:0::1;63700:173::o:0;28568:622::-;28938:10;;;28937:62;;-1:-1:-1;28954:39:0;;-1:-1:-1;;;28954:39:0;;-1:-1:-1;;;;;28954:15:0;;;;;:39;;28978:4;;28985:7;;28954:39;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:44;28937:62;28929:152;;;;-1:-1:-1;;;28929:152:0;;;;;;;:::i;:::-;29092:90;29112:5;29142:22;;;29166:7;29175:5;29119:62;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;29119:62:0;;;;;;;;;;;;;;-1:-1:-1;;;;;29119:62:0;-1:-1:-1;;;;;;29119:62:0;;;;;;;;;;29092:19;:90::i;:::-;28568:622;;;:::o;11055:196::-;11158:12;11190:53;11213:6;11221:4;11227:1;11230:12;11190:22;:53::i;:::-;11183:60;11055:196;-1:-1:-1;;;;11055:196:0:o;47662:98::-;47734:5;;:18;;;-1:-1:-1;;;47734:18:0;;;;47707:7;;-1:-1:-1;;;;;47734:5:0;;:16;;:18;;;;;;;;;;;;;;:5;:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;71440:120::-;71535:16;71440:120;:::o;27909:177::-;27992:86;28012:5;28042:23;;;28067:2;28071:5;28019:58;;;;;;;;;:::i;20227:132::-;20285:7;20312:39;20316:1;20319;20312:39;;;;;;;;;;;;;;;;;:3;:39::i;:::-;20305:46;;20227:132;;;;;:::o;18390:136::-;18448:7;18475:43;18479:1;18482;18475:43;;;;;;;;;;;;;;;;;:3;:43::i;19280:471::-;19338:7;19583:6;19579:47;;-1:-1:-1;19613:1:0;19606:8;;19579:47;19650:5;;;19654:1;19650;:5;:1;19674:5;;;;;:10;19666:56;;;;-1:-1:-1;;;19666:56:0;;;;;;;:::i;17926:181::-;17984:7;18016:5;;;18040:6;;;;18032:46;;;;-1:-1:-1;;;18032:46:0;;;;;;;:::i;69571:853::-;69675:25;69702:13;69733:16;69752:15;:13;:15::i;:::-;69733:34;;69798:8;69782:13;:24;69778:639;;;69823:18;69844:15;:13;:15::i;:::-;69823:36;-1:-1:-1;69878:14:0;;69874:214;;69913:15;;;;;-1:-1:-1;;;;;69913:15:0;:33;69969:49;69978:10;69990:27;:13;70008:8;69990:17;:27::i;:::-;69969:8;:49::i;:::-;70041:12;;69913:159;;-1:-1:-1;;;;;;69913:159:0;;;;;;;;;;70041:12;;;69913:159;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;69874:214;70102:21;70126:15;:13;:15::i;:::-;70102:39;;70176:38;70185:13;70200;70176:8;:38::i;:::-;70156:58;-1:-1:-1;70237:36:0;:13;70156:58;70237:17;:36::i;:::-;70229:44;;69778:639;;;;;70388:13;70403:1;70380:25;;;;;;;69778:639;69571:853;;;;;:::o;69104:459::-;69187:13;;;;69183:52;;;69217:7;;69183:52;69307:17;69327:15;:13;:15::i;:::-;69307:35;-1:-1:-1;69453:13:0;;69449:107;;69523:3;;69483:61;;-1:-1:-1;;;69483:61:0;;66059:42;;69483:39;;:61;;69523:3;69528:9;;69539:4;;69483:61;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;70470:319::-;70530:7;70550:18;70571:15;:13;:15::i;:::-;70550:36;-1:-1:-1;70601:14:0;;70597:152;;70678:15;;70724:12;;70678:59;;-1:-1:-1;;;70678:59:0;;:15;;;;-1:-1:-1;;;;;70678:15:0;;:33;;:59;;70712:10;;70724:12;;;70678:59;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;70597:152;70766:15;:13;:15::i;:::-;70759:22;;;70470:319;:::o;77892:3067::-;78254:15;;:46;;-1:-1:-1;;;78254:46:0;;78009:15;;;;;;78254;;;-1:-1:-1;;;;;78254:15:0;;:25;;:46;;78288:4;;78254:15;;:46;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;78334:28:0;;-1:-1:-1;;;78334:28:0;;78313:18;;67147:42;;78334:13;;:28;;78356:4;;78334:28;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;78397:36;;-1:-1:-1;;;78397:36:0;;78313:49;;-1:-1:-1;78373:21:0;;67252:42;;78397:21;;:36;;78427:4;;78397:36;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;78373:60;;78446:20;78469:44;66874:5;78469:23;78484:7;;78469:10;:14;;:23;;;;:::i;:44::-;78446:67;-1:-1:-1;78528:16:0;;78524:142;;78561:37;67147:42;66729;78585:12;78561:16;:37::i;:::-;78626:28;;-1:-1:-1;;;78626:28:0;;67147:42;;78626:13;;:28;;78648:4;;78626:28;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;78613:41;;78524:142;78678:18;78699:47;66874:5;78699:26;78717:7;;78699:13;:17;;:26;;;;:::i;:47::-;78678:68;-1:-1:-1;78761:14:0;;78757:170;;78817:18;;78792:56;;67252:42;;-1:-1:-1;;;;;78817:18:0;78837:10;78792:24;:56::i;:::-;78879:36;;-1:-1:-1;;;78879:36:0;;67252:42;;78879:21;;:36;;78909:4;;78879:36;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;78863:52;;78757:170;78998:10;;-1:-1:-1;;;78998:10:0;;;;78994:234;;;79075:12;;79068:45;;-1:-1:-1;;;79068:45:0;;79025:23;;-1:-1:-1;;;;;79075:12:0;;79068:30;;:45;;79107:4;;79068:45;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;79025:88;-1:-1:-1;79132:19:0;;79128:89;;79172:29;79185:15;79172:12;:29::i;:::-;78994:234;;79240:41;79255:10;79267:13;79240:14;:41::i;:::-;79355:21;79391:14;;79387:105;;79422:5;;:58;;;;;;;;;;;-1:-1:-1;79422:58:0;;;;;;;;-1:-1:-1;;;79422:58:0;;:5;;;;-1:-1:-1;;;;;79422:5:0;;:19;;:58;;;;;;-1:-1:-1;79422:58:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;79387:105;79648:20;;79644:431;;79685:18;79706:15;:13;:15::i;:::-;79685:36;-1:-1:-1;79740:14:0;;79736:203;;79775:15;;;;;-1:-1:-1;;;;;79775:15:0;:33;79831:38;79840:10;79852:16;79831:8;:38::i;:::-;79892:12;;79775:148;;-1:-1:-1;;;;;;79775:148:0;;;;;;;;;;79892:12;;;79775:148;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;79736:203;79953:21;79977:15;:13;:15::i;:::-;79953:39;;80022:41;80031:16;80049:13;80022:8;:41::i;:::-;80007:56;;79644:431;;;80211:14;80228:22;:20;:22::i;:::-;80276:5;;:31;;-1:-1:-1;;;80276:31:0;;80211:39;;-1:-1:-1;80261:12:0;;-1:-1:-1;;;;;80276:5:0;;;;:16;;:31;;80301:4;;80276:31;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:41;;;80261:56;;80414:4;80405:6;:13;80401:437;;;80445:16;:6;80456:4;80445:10;:16::i;:::-;80435:26;;80476:16;80495:15;:13;:15::i;:::-;80476:34;-1:-1:-1;80476:34:0;80529:25;:7;80541:12;80529:11;:25::i;:::-;:36;80525:176;;;80662:23;:21;:23::i;:::-;;80525:176;80401:437;;;;80810:16;:4;80819:6;80810:8;:16::i;:::-;80802:24;;80401:437;-1:-1:-1;;80920:23:0;:31;;-1:-1:-1;;80920:31:0;;;-1:-1:-1;77892:3067:0;;;;-1:-1:-1;77892:3067:0;;-1:-1:-1;;;;77892:3067:0:o;41600:727::-;41772:4;;-1:-1:-1;;;;;41772:4:0;41764:27;41756:68;;;;-1:-1:-1;;;41756:68:0;;;;;;;:::i;:::-;41837:5;:24;;-1:-1:-1;;;;;;41837:24:0;-1:-1:-1;;;;;41837:24:0;;;;;;;;;;;41886:13;;;-1:-1:-1;;;41886:13:0;;;;:5;;;;;:11;;:13;;;;;;;;;;;;;;;:5;:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;41872:4;:28;;-1:-1:-1;;;;;;41872:28:0;-1:-1:-1;;;;;41872:28:0;;;;;;;;41911:37;;:4;41928:6;-1:-1:-1;;41911:16:0;:37::i;:::-;42007:10;:24;;-1:-1:-1;;;;;42007:24:0;;;-1:-1:-1;;;;;;42007:24:0;;;;;;;42042:7;:18;;;;;;;;;;;;42071:6;:16;;;;;;;;;;;;;;42007:10;42133:14;:18;;;42179:5;42162:14;:22;42210:3;42195:12;:18;42224:13;:17;42254:5;;:35;;-1:-1:-1;;;42254:35:0;;:5;;;;:13;;:35;;42268:7;;;-1:-1:-1;;;42254:35:0;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;41600:727;;;;:::o;76132:1698::-;76345:5;;;;;-1:-1:-1;;;;;76345:5:0;76337:28;76329:37;;;;;;76496:7;76479:14;:24;76579:11;:56;;-1:-1:-1;;;;;;76579:56:0;;;;;76685:7;76666:16;:26;76722:8;76703:16;:27;76759:11;76741:15;:29;76813:4;76803:7;:14;76846:18;:63;;76867:42;-1:-1:-1;;;;;;76846:63:0;;;;;;76973:4;;:57;;-1:-1:-1;;;76973:57:0;;-1:-1:-1;;;;;76973:4:0;;;;:12;;:57;;66059:42;;-1:-1:-1;;;;76973:57:0;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;77041:55:0;;-1:-1:-1;;;77041:55:0;;67252:42;;77041:19;;:55;;73387:42;;-1:-1:-1;;77078:17:0;77041:55;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;77107:47:0;;-1:-1:-1;;;77107:47:0;;67147:42;;77107:11;;:47;;73228:42;;-1:-1:-1;;77136:17:0;77107:47;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;77219:5:0;:28;;-1:-1:-1;;;;;;77219:28:0;;-1:-1:-1;;;;;77219:28:0;;;;;;77299:3;:10;;;77483:46;;-1:-1:-1;;;77483:46:0;;-1:-1:-1;;;;66059:42:0;;77483:40;;:46;;77299:10;;77483:46;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;77581:15:0;:50;;-1:-1:-1;;;;;77581:50:0;;;;;-1:-1:-1;;;;;;77581:50:0;;;;;;;;;;77750:4;;77416:113;;-1:-1:-1;77416:113:0;;-1:-1:-1;77722:33:0;;;77750:4;;77722:33;;;;;-1:-1:-1;77714:42:0;;-1:-1:-1;77714:42:0;;;;;77805:17;;;;:9;;:17;;;;;:::i;:::-;;76132:1698;;;;;:::o;81163:432::-;81240:18;81261:15;:13;:15::i;:::-;81240:36;-1:-1:-1;81291:14:0;;81287:106;;81322:15;;81368:12;;81322:59;;-1:-1:-1;;;81322:59:0;;:15;;;;-1:-1:-1;;;;;81322:15:0;;:33;;:59;;81356:10;;81368:12;;;81322:59;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;81287:106;81434:28;;-1:-1:-1;;;81434:28:0;;81403:60;;81420:12;;67147:42;;81434:13;;:28;;81456:4;;81434:28;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;67147:42;;81403:60;:16;:60::i;:::-;81540:36;;-1:-1:-1;;;81540:36:0;;81474:113;;81513:12;;67252:42;;81540:21;;:36;;81570:4;;81540:36;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;67252:42;;81474:113;:24;:113::i;87564:198::-;87618:4;87664:42;-1:-1:-1;;;;;87655:97:0;;:99;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;30214:761::-;30638:23;30664:69;30692:4;30664:69;;;;;;;;;;;;;;;;;30672:5;-1:-1:-1;;;;;30664:27:0;;;:69;;;;;:::i;:::-;30748:17;;30638:95;;-1:-1:-1;30748:21:0;30744:224;;30890:10;30879:30;;;;;;;;;;;;:::i;:::-;30871:85;;;;-1:-1:-1;;;30871:85:0;;;;;;;:::i;12432:979::-;12562:12;12595:18;12606:6;12595:10;:18::i;:::-;12587:60;;;;-1:-1:-1;;;12587:60:0;;;;;;;:::i;:::-;12721:12;12735:23;12762:6;-1:-1:-1;;;;;12762:11:0;12782:8;12793:4;12762:36;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12720:78;;;;12813:7;12809:595;;;12844:10;-1:-1:-1;12837:17:0;;-1:-1:-1;12837:17:0;12809:595;12958:17;;:21;12954:439;;13221:10;13215:17;13282:15;13269:10;13265:2;13261:19;13254:44;13169:148;13364:12;13357:20;;-1:-1:-1;;;13357:20:0;;;;;;;;:::i;20855:278::-;20941:7;20976:12;20969:5;20961:28;;;;-1:-1:-1;;;20961:28:0;;;;;;;;:::i;:::-;;21000:9;21016:1;21012;:5;;;;;;;20855:278;-1:-1:-1;;;;;20855:278:0:o;18829:192::-;18915:7;18951:12;18943:6;;;;18935:29;;;;-1:-1:-1;;;18935:29:0;;;;;;;;:::i;:::-;-1:-1:-1;;;18987:5:0;;;18829:192::o;16598:106::-;16656:7;16687:1;16683;:5;:13;;16695:1;16683:13;;;-1:-1:-1;16691:1:0;;16598:106;-1:-1:-1;16598:106:0:o;82386:263::-;82445:196;;-1:-1:-1;;;82445:196:0;;67010:42;;82445:54;;:196;;82514:7;;82544:1;;82561:11;;82595:4;;82615:15;;82445:196;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;82445:196:0;;;;;;;;;;;;:::i;81717:594::-;81838:4;81822:13;:20;81818:158;;;81918:46;;-1:-1:-1;;;81918:46:0;;73387:42;;81918:15;;:46;;81934:1;;81937;;81940:13;;81937:1;;;;81918:46;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;81818:158;82005:4;81992:10;:17;81988:152;;;82085:43;;-1:-1:-1;;;82085:43:0;;73228:42;;82085:15;;:43;;82101:1;;82104;;82107:10;;82104:1;;;;82085:43;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;81988:152;82174:29;;-1:-1:-1;;;82174:29:0;;82152:19;;67350:42;;82174:14;;:29;;82197:4;;82174:29;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;82152:51;-1:-1:-1;82218:15:0;;82214:90;;82250:42;;-1:-1:-1;;;82250:42:0;;67350;;82250:29;;:42;;82280:11;;82250:42;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7940:619;8000:4;8468:20;;8311:66;8508:23;;;;;;:42;;-1:-1:-1;;8535:15:0;;;8500:51;-1:-1:-1;;7940:619:0:o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4265:241;;4369:2;4357:9;4348:7;4344:23;4340:32;4337:2;;;-1:-1;;4375:12;4337:2;85:6;72:20;97:33;124:5;97:33;:::i;4513:263::-;;4628:2;4616:9;4607:7;4603:23;4599:32;4596:2;;;-1:-1;;4634:12;4596:2;226:6;220:13;238:33;265:5;238:33;:::i;4783:940::-;;;;;;;4980:3;4968:9;4959:7;4955:23;4951:33;4948:2;;;-1:-1;;4987:12;4948:2;226:6;220:13;238:33;265:5;238:33;:::i;:::-;5150:2;5200:22;;220:13;5039:74;;-1:-1;238:33;220:13;238:33;:::i;:::-;5269:2;5319:22;;220:13;5158:74;;-1:-1;238:33;220:13;238:33;:::i;:::-;5388:2;5438:22;;220:13;5277:74;;-1:-1;238:33;220:13;238:33;:::i;:::-;5507:3;5558:22;;220:13;5396:74;;-1:-1;238:33;220:13;238:33;:::i;:::-;5627:3;5675:22;;1237:13;5516:74;;-1:-1;1255:30;1237:13;1255:30;:::i;:::-;5636:71;;;;4942:781;;;;;;;;:::o;5730:1101::-;;;;;;;;5946:3;5934:9;5925:7;5921:23;5917:33;5914:2;;;-1:-1;;5953:12;5914:2;85:6;72:20;97:33;124:5;97:33;:::i;:::-;6005:63;-1:-1;6105:2;6144:22;;;72:20;97:33;72:20;97:33;:::i;:::-;6113:63;-1:-1;6213:2;6252:22;;72:20;97:33;72:20;97:33;:::i;:::-;6221:63;-1:-1;6321:2;6360:22;;72:20;97:33;72:20;97:33;:::i;:::-;6329:63;-1:-1;6429:3;6469:22;;4054:20;;-1:-1;6538:3;6578:22;;72:20;97:33;72:20;97:33;:::i;:::-;6547:63;-1:-1;6675:3;6660:19;;6647:33;6700:18;6689:30;;;6686:2;;;-1:-1;;6722:12;6686:2;6798:6;6787:9;6783:22;;;1935:3;1928:4;1920:6;1916:17;1912:27;1902:2;;-1:-1;;1943:12;1902:2;1990:6;1977:20;6700:18;37260:6;37257:30;37254:2;;;-1:-1;;37290:12;37254:2;2012:65;37363:9;37344:17;;-1:-1;;37340:33;37421:15;;2012:65;:::i;:::-;2003:74;;2097:6;2090:5;2083:21;2201:3;6105:2;2192:6;2125;2183:16;;2180:25;2177:2;;;-1:-1;;2208:12;2177:2;42208:6;6105:2;2125:6;2121:17;6105:2;2159:5;2155:16;42185:30;-1:-1;6105:2;42255:6;2159:5;42246:16;;42239:27;;6742:73;;;;;;5908:923;;;;;;;;;;:::o;6838:392::-;;6978:2;;6966:9;6957:7;6953:23;6949:32;6946:2;;;-1:-1;;6984:12;6946:2;7035:17;7029:24;7073:18;7065:6;7062:30;7059:2;;;-1:-1;;7095:12;7059:2;7182:22;;422:4;410:17;;406:27;-1:-1;396:2;;-1:-1;;437:12;396:2;477:6;471:13;499:80;514:64;571:6;514:64;:::i;:::-;499:80;:::i;:::-;607:21;;;664:14;;;;639:17;;;753;;;744:27;;;;741:36;-1:-1;738:2;;;-1:-1;;780:12;738:2;-1:-1;806:10;;800:217;825:6;822:1;819:13;800:217;;;4202:13;;893:61;;847:1;840:9;;;;;968:14;;;;996;;800:217;;;-1:-1;7115:99;6940:290;-1:-1;;;;;;;6940:290::o;7237:235::-;;7338:2;7326:9;7317:7;7313:23;7309:32;7306:2;;;-1:-1;;7344:12;7306:2;1108:6;1095:20;1120:30;1144:5;1120:30;:::i;7479:257::-;;7591:2;7579:9;7570:7;7566:23;7562:32;7559:2;;;-1:-1;;7597:12;7559:2;1243:6;1237:13;1255:30;1279:5;1255:30;:::i;7743:360::-;;;7861:2;7849:9;7840:7;7836:23;7832:32;7829:2;;;-1:-1;;7867:12;7829:2;1108:6;1095:20;1120:30;1144:5;1120:30;:::i;:::-;7919:60;8016:2;8055:22;;;;4054:20;;-1:-1;;;7823:280::o;8414:367::-;;;8538:2;8526:9;8517:7;8513:23;8509:32;8506:2;;;-1:-1;;8544:12;8506:2;8602:17;8589:31;8640:18;;8632:6;8629:30;8626:2;;;-1:-1;;8662:12;8626:2;8748:6;8737:9;8733:22;;;1602:3;1595:4;1587:6;1583:17;1579:27;1569:2;;-1:-1;;1610:12;1569:2;1653:6;1640:20;8640:18;1672:6;1669:30;1666:2;;;-1:-1;;1702:12;1666:2;1797:3;8538:2;1777:17;1738:6;1763:32;;1760:41;1757:2;;;-1:-1;;1804:12;1757:2;8538;1734:17;;;;;8682:83;;-1:-1;8500:281;;-1:-1;;;;8500:281::o;8788:324::-;;8933:3;;8921:9;8912:7;8908:23;8904:33;8901:2;;;-1:-1;;8940:12;8901:2;2479:22;8933:3;2479:22;:::i;:::-;2470:31;;2625:22;4202:13;2575:16;2568:86;2721:2;2790:9;2786:22;4202:13;2721:2;2740:5;2736:16;2729:86;2881:2;2950:9;2946:22;4202:13;2881:2;2900:5;2896:16;2889:86;3049:2;3118:9;3114:22;4202:13;3049:2;3068:5;3064:16;3057:86;3217:3;3287:9;3283:22;4202:13;3217:3;3237:5;3233:16;3226:86;3379:3;3449:9;3445:22;4202:13;3379:3;3399:5;3395:16;3388:86;3540:3;3610:9;3606:22;4202:13;3540:3;3560:5;3556:16;3549:86;3701:3;3771:9;3767:22;4202:13;3701:3;3721:5;3717:16;3710:86;3862:3;;3934:9;3930:22;4202:13;3862:3;3882:5;3878:18;3871:88;;8992:104;;;;8895:217;;;;:::o;9119:241::-;;9223:2;9211:9;9202:7;9198:23;9194:32;9191:2;;;-1:-1;;9229:12;9191:2;-1:-1;4054:20;;9185:175;-1:-1;9185:175::o;9367:263::-;;9482:2;9470:9;9461:7;9457:23;9453:32;9450:2;;;-1:-1;;9488:12;9450:2;-1:-1;4202:13;;9444:186;-1:-1;9444:186::o;9637:491::-;;;;9775:2;9763:9;9754:7;9750:23;9746:32;9743:2;;;-1:-1;;9781:12;9743:2;4067:6;4054:20;9833:63;;9933:2;9976:9;9972:22;4054:20;9941:63;;10041:2;10084:9;10080:22;72:20;97:33;124:5;97:33;:::i;:::-;10049:63;;;;9737:391;;;;;:::o;10135:611::-;;;;;10287:3;10275:9;10266:7;10262:23;10258:33;10255:2;;;-1:-1;;10294:12;10255:2;4067:6;4054:20;10346:63;;10446:2;10489:9;10485:22;4054:20;10454:63;;10554:2;10597:9;10593:22;4054:20;10562:63;;10662:2;10702:9;10698:22;1095:20;1120:30;1144:5;1120:30;:::i;:::-;10249:497;;;;-1:-1;10249:497;;-1:-1;;10249:497::o;15595:347::-;;15740:5;37998:12;39030:6;39025:3;39018:19;15834:52;15879:6;39067:4;39062:3;39058:14;39067:4;15860:5;15856:16;15834:52;:::i;:::-;37363:9;42938:14;-1:-1;;42934:28;15898:39;;;;39067:4;15898:39;;15687:255;-1:-1;;15687:255::o;20579:271::-;;14089:5;37998:12;14200:52;14245:6;14240:3;14233:4;14226:5;14222:16;14200:52;:::i;:::-;14264:16;;;;;20713:137;-1:-1;;20713:137::o;20857:222::-;-1:-1;;;;;39635:54;;;;11353:45;;20984:2;20969:18;;20955:124::o;21592:337::-;-1:-1;;;;;39635:54;;;;11196:58;;39971:13;39964:21;21915:2;21900:18;;13883:34;21749:2;21734:18;;21720:209::o;21936:333::-;-1:-1;;;;;39635:54;;;11353:45;;39635:54;;22255:2;22240:18;;11353:45;22091:2;22076:18;;22062:207::o;22276:980::-;-1:-1;;;;;39635:54;;;11353:45;;39635:54;;;22756:2;22741:18;;11353:45;39635:54;;;22839:2;22824:18;;11353:45;39635:54;;;22922:2;22907:18;;11353:45;23005:3;22990:19;;20410:37;;;39635:54;;39646:42;23074:19;;11353:45;22591:3;23127;23112:19;;23105:49;;;22276:980;;23168:78;;22576:19;;23232:6;23168:78;:::i;:::-;23160:86;22562:694;-1:-1;;;;;;;;;22562:694::o;23263:349::-;-1:-1;;;;;39635:54;;;;11353:45;;23598:2;23583:18;;15043:58;23426:2;23411:18;;23397:215::o;23959:441::-;24168:2;24153:18;;24157:9;13513:21;23959:441;13540:258;38281:4;13562:1;13559:13;13540:258;;;13626:13;;20410:37;;11098:4;11089:14;;;;38648;;;;13587:1;13580:9;13540:258;;;13544:14;;;15094:5;24386:2;24375:9;24371:18;15043:58;24139:261;;;;;:::o;24407:210::-;39971:13;;39964:21;13883:34;;24528:2;24513:18;;24499:118::o;25680:704::-;15043:58;;;26118:2;26103:18;;15043:58;;;;26201:2;26186:18;;20410:37;;;;26292:2;26277:18;;15043:58;39971:13;39964:21;26369:3;26354:19;;13883:34;25937:3;25922:19;;25908:476::o;26391:330::-;;26548:2;26569:17;26562:47;39030:6;26548:2;26537:9;26533:18;39018:19;42208:6;42203:3;39058:14;26537:9;39058:14;42185:30;42246:16;;;39058:14;42246:16;;;42239:27;;;;37363:9;42938:14;;;-1:-1;;42934:28;15542:39;;;26519:202;-1:-1;26519:202::o;26728:310::-;;26875:2;26896:17;26889:47;26950:78;26875:2;26864:9;26860:18;27014:6;26950:78;:::i;27045:416::-;27245:2;27259:47;;;16174:2;27230:18;;;39018:19;-1:-1;;;39058:14;;;16190:34;16243:12;;;27216:245::o;27468:416::-;27668:2;27682:47;;;16494:1;27653:18;;;39018:19;-1:-1;;;39058:14;;;16509:28;16556:12;;;27639:245::o;27891:416::-;28091:2;28105:47;;;16807:2;28076:18;;;39018:19;16843:29;39058:14;;;16823:50;16892:12;;;28062:245::o;28314:416::-;28514:2;28528:47;;;17143:2;28499:18;;;39018:19;-1:-1;;;39058:14;;;17159:35;17213:12;;;28485:245::o;28737:416::-;28937:2;28951:47;;;17464:2;28922:18;;;39018:19;17500:30;39058:14;;;17480:51;17550:12;;;28908:245::o;29160:416::-;29360:2;29374:47;;;17801:2;29345:18;;;39018:19;17837:34;39058:14;;;17817:55;-1:-1;;;17892:12;;;17885:25;17929:12;;;29331:245::o;29583:416::-;29783:2;29797:47;;;18180:1;29768:18;;;39018:19;-1:-1;;;39058:14;;;18195:29;18243:12;;;29754:245::o;30006:416::-;30206:2;30220:47;;;18494:1;30191:18;;;39018:19;-1:-1;;;39058:14;;;18509:30;18558:12;;;30177:245::o;30429:416::-;30629:2;30643:47;;;18809:2;30614:18;;;39018:19;18845:31;39058:14;;;18825:52;18896:12;;;30600:245::o;30852:416::-;31052:2;31066:47;;;19147:2;31037:18;;;39018:19;-1:-1;;;39058:14;;;19163:34;19216:12;;;31023:245::o;31275:416::-;31475:2;31489:47;;;19467:2;31460:18;;;39018:19;19503:34;39058:14;;;19483:55;-1:-1;;;19558:12;;;19551:34;19604:12;;;31446:245::o;31698:416::-;31898:2;31912:47;;;19855:2;31883:18;;;39018:19;-1:-1;;;39058:14;;;19871:33;19923:12;;;31869:245::o;32121:416::-;32321:2;32335:47;;;20174:2;32306:18;;;39018:19;20210:34;39058:14;;;20190:55;-1:-1;;;20265:12;;;20258:46;20323:12;;;32292:245::o;32544:222::-;20410:37;;;32671:2;32656:18;;32642:124::o;32773:481::-;;32978:2;32967:9;32963:18;20440:5;20417:3;20410:37;33096:2;32978;33096;33085:9;33081:18;33074:48;33136:108;11864:5;37998:12;39030:6;39025:3;39018:19;39058:14;32967:9;39058:14;11876:93;;33096:2;12040:5;37568:14;12052:21;;-1:-1;12079:260;12104:6;12101:1;12098:13;12079:260;;;12165:13;;-1:-1;;;;;39635:54;11353:45;;38648:14;;;;10907;;;;6700:18;12119:9;12079:260;;;-1:-1;33128:116;;32949:305;-1:-1;;;;;;;32949:305::o;33261:321::-;20410:37;;;39971:13;39964:21;33568:2;33553:18;;13883:34;33410:2;33395:18;;33381:201::o;33589:826::-;;33883:3;33872:9;33868:19;20440:5;20417:3;20410:37;34048:2;20440:5;34048:2;34037:9;34033:18;20410:37;33883:3;34085:2;34074:9;34070:18;34063:48;34125:105;12587:5;38145:12;39030:6;39025:3;39018:19;39058:14;33872:9;39058:14;12599:93;;37731:3;-1:-1;37721:14;34048:2;-1:-1;37750:18;12772:21;;-1:-1;12799:288;12824:6;12821:1;12818:13;12799:288;;;42846:11;;-1:-1;;;;;39635:54;11353:45;;6700:18;38760:14;;;;10907;;;;12839:9;12799:288;;;-1:-1;;;;;;;39635:54;;;;34317:2;34302:18;;11196:58;-1:-1;;;34400:3;34385:19;20410:37;34117:113;33854:561;-1:-1;;;33854:561::o;34422:432::-;20410:37;;;34763:2;34748:18;;20410:37;;;;39971:13;39964:21;34840:2;34825:18;;13883:34;34599:2;34584:18;;34570:284::o;34861:444::-;20410:37;;;35208:2;35193:18;;20410:37;;;;35291:2;35276:18;;20410:37;35044:2;35029:18;;35015:290::o;35312:556::-;20410:37;;;35688:2;35673:18;;20410:37;;;;35771:2;35756:18;;20410:37;35854:2;35839:18;;20410:37;35523:3;35508:19;;35494:374::o;35875:668::-;20410:37;;;36279:2;36264:18;;20410:37;;;;36362:2;36347:18;;20410:37;;;;36445:2;36430:18;;20410:37;36528:3;36513:19;;20410:37;36114:3;36099:19;;36085:458::o;36550:256::-;36612:2;36606:9;36638:17;;;36713:18;36698:34;;36734:22;;;36695:62;36692:2;;;36770:1;;36760:12;36692:2;36612;36779:22;36590:216;;-1:-1;36590:216::o;36813:304::-;;36972:18;36964:6;36961:30;36958:2;;;-1:-1;;36994:12;36958:2;-1:-1;37039:4;37027:17;;;37092:15;;36895:222::o;42281:268::-;42346:1;42353:101;42367:6;42364:1;42361:13;42353:101;;;42434:11;;;42428:18;42415:11;;;42408:39;42389:2;42382:10;42353:101;;;42469:6;42466:1;42463:13;42460:2;;;42346:1;42525:6;42520:3;42516:16;42509:27;42460:2;;42330:219;;;:::o;43085:117::-;-1:-1;;;;;39635:54;;43144:35;;43134:2;;43193:1;;43183:12;43209:111;43290:5;39971:13;39964:21;43268:5;43265:32;43255:2;;43311:1;;43301:12
Swarm Source
ipfs://93313172a40a75690b648bf71aadbeede331496094d260c559337cce5ba6b171
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.