Feature Tip: Add private address tag to any address under My Name Tag !
More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 251 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Withdraw To Adap... | 16721136 | 715 days ago | IN | 0 ETH | 0.00144379 | ||||
Strategy Harvest | 16721083 | 715 days ago | IN | 0 ETH | 0.05137302 | ||||
Strategy Harvest | 16721082 | 715 days ago | IN | 0 ETH | 0.06003633 | ||||
Strategy Harvest | 15933918 | 825 days ago | IN | 0 ETH | 0.08690863 | ||||
Strategy Harvest | 15916903 | 827 days ago | IN | 0 ETH | 0.03731777 | ||||
Strategy Harvest | 15916860 | 827 days ago | IN | 0 ETH | 0.01741077 | ||||
Strategy Harvest | 15171390 | 939 days ago | IN | 0 ETH | 0.04664998 | ||||
Strategy Harvest | 15162875 | 940 days ago | IN | 0 ETH | 0.05144341 | ||||
Strategy Harvest | 15147672 | 942 days ago | IN | 0 ETH | 0.14044568 | ||||
Strategy Harvest | 15143068 | 943 days ago | IN | 0 ETH | 0.06635476 | ||||
Strategy Harvest | 15114104 | 947 days ago | IN | 0 ETH | 0.02514047 | ||||
Strategy Harvest | 15100508 | 949 days ago | IN | 0 ETH | 0.03814402 | ||||
Strategy Harvest | 15078000 | 953 days ago | IN | 0 ETH | 0.02579137 | ||||
Strategy Harvest | 15072115 | 954 days ago | IN | 0 ETH | 0.03990857 | ||||
Strategy Harvest | 15030629 | 961 days ago | IN | 0 ETH | 0.08781293 | ||||
Strategy Harvest | 15029870 | 961 days ago | IN | 0 ETH | 0.10118403 | ||||
Strategy Harvest | 15029773 | 961 days ago | IN | 0 ETH | 0.11406353 | ||||
Strategy Harvest | 14944286 | 976 days ago | IN | 0 ETH | 0.04597797 | ||||
Strategy Harvest | 14944285 | 976 days ago | IN | 0 ETH | 0.04973416 | ||||
Strategy Harvest | 14922192 | 980 days ago | IN | 0 ETH | 0.32020334 | ||||
Strategy Harvest | 14922132 | 980 days ago | IN | 0 ETH | 0.15172431 | ||||
Strategy Harvest | 14773199 | 1004 days ago | IN | 0 ETH | 0.1032406 | ||||
Strategy Harvest | 14767905 | 1005 days ago | IN | 0 ETH | 0.19566296 | ||||
Strategy Harvest | 14767897 | 1005 days ago | IN | 0 ETH | 0.24677484 | ||||
Strategy Harvest | 14767838 | 1005 days ago | IN | 0 ETH | 0.11523311 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Source Code Verified (Exact Match)
Contract Name:
VaultAdaptorYearnV2_032
Compiler Version
v0.6.12+commit.27d51765
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2021-07-17 */ // SPDX-License-Identifier: AGPLv3 pragma solidity >=0.6.0 <0.7.0; interface IYearnV2Strategy { function vault() external view returns (address); function setVault(address _vault) external; function keeper() external view returns (address); function setKeeper(address _keeper) external; function harvestTrigger(uint256 callCost) external view returns (bool); function harvest() external; function withdraw(uint256 _amount) external; function estimatedTotalAssets() external view returns (uint256); } pragma solidity >=0.6.0 <0.8.0; /* * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with GSN meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address payable) { return msg.sender; } function _msgData() internal view virtual returns (bytes memory) { this; return msg.data; } } pragma solidity >=0.6.0 <0.8.0; /** * @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: * * 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); } pragma solidity >=0.6.0 <0.8.0; /** * @dev Wrappers over Solidity's arithmetic operations with added overflow * checks. * * Arithmetic operations in Solidity wrap on overflow. This can easily result * in bugs, because programmers usually assume that an overflow raises an * error, which is the standard behavior in high level programming languages. * `SafeMath` restores this intuition by reverting the transaction when an * operation overflows. * * Using this library instead of the unchecked operations eliminates an entire * class of bugs, so it's recommended to use it always. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c = a + b; require(c >= a, "SafeMath: addition overflow"); return c; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { return sub(a, b, "SafeMath: subtraction overflow"); } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ 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) { 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; 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; } } pragma solidity >=0.6.0 <0.8.0; /** * @dev Implementation of the {IERC20} interface. * * This implementation is agnostic to the way tokens are created. This means * that a supply mechanism has to be added in a derived contract using {_mint}. * For a generic mechanism see {ERC20PresetMinterPauser}. * * TIP: For a detailed writeup see our guide * https: * to implement supply mechanisms]. * * We have followed general OpenZeppelin guidelines: functions revert instead * of returning `false` on failure. This behavior is nonetheless conventional * and does not conflict with the expectations of ERC20 applications. * * Additionally, an {Approval} event is emitted on calls to {transferFrom}. * This allows applications to reconstruct the allowance for all accounts just * by listening to said events. Other implementations of the EIP may not emit * these events, as it isn't required by the specification. * * Finally, the non-standard {decreaseAllowance} and {increaseAllowance} * functions have been added to mitigate the well-known issues around setting * allowances. See {IERC20-approve}. */ contract ERC20 is Context, IERC20 { using SafeMath for uint256; mapping (address => uint256) private _balances; mapping (address => mapping (address => uint256)) private _allowances; uint256 private _totalSupply; string private _name; string private _symbol; uint8 private _decimals; /** * @dev Sets the values for {name} and {symbol}, initializes {decimals} with * a default value of 18. * * To select a different value for {decimals}, use {_setupDecimals}. * * All three of these values are immutable: they can only be set once during * construction. */ constructor (string memory name_, string memory symbol_) public { _name = name_; _symbol = symbol_; _decimals = 18; } /** * @dev Returns the name of the token. */ function name() public view returns (string memory) { return _name; } /** * @dev Returns the symbol of the token, usually a shorter version of the * name. */ function symbol() public view returns (string memory) { return _symbol; } /** * @dev Returns the number of decimals used to get its user representation. * For example, if `decimals` equals `2`, a balance of `505` tokens should * be displayed to a user as `5,05` (`505 / 10 ** 2`). * * Tokens usually opt for a value of 18, imitating the relationship between * Ether and Wei. This is the value {ERC20} uses, unless {_setupDecimals} is * called. * * NOTE: This information is only used for _display_ purposes: it in * no way affects any of the arithmetic of the contract, including * {IERC20-balanceOf} and {IERC20-transfer}. */ function decimals() public view returns (uint8) { return _decimals; } /** * @dev See {IERC20-totalSupply}. */ function totalSupply() public view override returns (uint256) { return _totalSupply; } /** * @dev See {IERC20-balanceOf}. */ function balanceOf(address account) public view override returns (uint256) { return _balances[account]; } /** * @dev See {IERC20-transfer}. * * Requirements: * * - `recipient` cannot be the zero address. * - the caller must have a balance of at least `amount`. */ function transfer(address recipient, uint256 amount) public virtual override returns (bool) { _transfer(_msgSender(), recipient, amount); return true; } /** * @dev See {IERC20-allowance}. */ function allowance(address owner, address spender) public view virtual override returns (uint256) { return _allowances[owner][spender]; } /** * @dev See {IERC20-approve}. * * Requirements: * * - `spender` cannot be the zero address. */ function approve(address spender, uint256 amount) public virtual override returns (bool) { _approve(_msgSender(), spender, amount); return true; } /** * @dev See {IERC20-transferFrom}. * * Emits an {Approval} event indicating the updated allowance. This is not * required by the EIP. See the note at the beginning of {ERC20}. * * Requirements: * * - `sender` and `recipient` cannot be the zero address. * - `sender` must have a balance of at least `amount`. * - the caller must have allowance for ``sender``'s tokens of at least * `amount`. */ function transferFrom(address sender, address recipient, uint256 amount) public virtual override returns (bool) { _transfer(sender, recipient, amount); _approve(sender, _msgSender(), _allowances[sender][_msgSender()].sub(amount, "ERC20: transfer amount exceeds allowance")); return true; } /** * @dev Atomically increases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. */ function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) { _approve(_msgSender(), spender, _allowances[_msgSender()][spender].add(addedValue)); return true; } /** * @dev Atomically decreases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. * - `spender` must have allowance for the caller of at least * `subtractedValue`. */ function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) { _approve(_msgSender(), spender, _allowances[_msgSender()][spender].sub(subtractedValue, "ERC20: decreased allowance below zero")); return true; } /** * @dev Moves tokens `amount` from `sender` to `recipient`. * * This is internal function is equivalent to {transfer}, and can be used to * e.g. implement automatic token fees, slashing mechanisms, etc. * * Emits a {Transfer} event. * * Requirements: * * - `sender` cannot be the zero address. * - `recipient` cannot be the zero address. * - `sender` must have a balance of at least `amount`. */ function _transfer(address sender, address recipient, uint256 amount) internal virtual { require(sender != address(0), "ERC20: transfer from the zero address"); require(recipient != address(0), "ERC20: transfer to the zero address"); _beforeTokenTransfer(sender, recipient, amount); _balances[sender] = _balances[sender].sub(amount, "ERC20: transfer amount exceeds balance"); _balances[recipient] = _balances[recipient].add(amount); emit Transfer(sender, recipient, amount); } /** @dev Creates `amount` tokens and assigns them to `account`, increasing * the total supply. * * Emits a {Transfer} event with `from` set to the zero address. * * Requirements: * * - `to` cannot be the zero address. */ function _mint(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: mint to the zero address"); _beforeTokenTransfer(address(0), account, amount); _totalSupply = _totalSupply.add(amount); _balances[account] = _balances[account].add(amount); emit Transfer(address(0), account, amount); } /** * @dev Destroys `amount` tokens from `account`, reducing the * total supply. * * Emits a {Transfer} event with `to` set to the zero address. * * Requirements: * * - `account` cannot be the zero address. * - `account` must have at least `amount` tokens. */ function _burn(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: burn from the zero address"); _beforeTokenTransfer(account, address(0), amount); _balances[account] = _balances[account].sub(amount, "ERC20: burn amount exceeds balance"); _totalSupply = _totalSupply.sub(amount); emit Transfer(account, address(0), amount); } /** * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens. * * This internal function is equivalent to `approve`, and can be used to * e.g. set automatic allowances for certain subsystems, etc. * * Emits an {Approval} event. * * Requirements: * * - `owner` cannot be the zero address. * - `spender` cannot be the zero address. */ function _approve(address owner, address spender, uint256 amount) internal virtual { require(owner != address(0), "ERC20: approve from the zero address"); require(spender != address(0), "ERC20: approve to the zero address"); _allowances[owner][spender] = amount; emit Approval(owner, spender, amount); } /** * @dev Sets {decimals} to a value other than the default one of 18. * * WARNING: This function should only be called from the constructor. Most * applications that interact with token contracts will not expect * {decimals} to ever change, and may work incorrectly if it does. */ function _setupDecimals(uint8 decimals_) internal { _decimals = decimals_; } /** * @dev Hook that is called before any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens * will be to transferred to `to`. * - when `from` is zero, `amount` tokens will be minted for `to`. * - when `to` is zero, `amount` of ``from``'s tokens will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer(address from, address to, uint256 amount) internal virtual { } } pragma solidity >=0.6.2 <0.8.0; /** * @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) { uint256 size; assembly { size := extcodesize(account) } return size > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https: * 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: * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https: */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (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: * * 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"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{ value: value }(data); return _verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data, string memory errorMessage) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return _verifyCallResult(success, returndata, errorMessage); } function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private pure returns(bytes memory) { if (success) { return returndata; } else { if (returndata.length > 0) { assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } pragma solidity >=0.6.0 <0.8.0; /** * @title SafeERC20 * @dev Wrappers around ERC20 operations that throw on failure (when the token * contract returns false). Tokens that return no value (and instead revert or * throw on failure) are also supported, non-reverting calls are assumed to be * successful. * To use this library you can add a `using SafeERC20 for 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 { 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 { bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed"); if (returndata.length > 0) { require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed"); } } } pragma solidity >=0.6.0 <0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor () internal { address msgSender = _msgSender(); _owner = msgSender; emit OwnershipTransferred(address(0), msgSender); } /** * @dev Returns the address of the current owner. */ function owner() public view returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(_owner == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { emit OwnershipTransferred(_owner, address(0)); _owner = address(0); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); emit OwnershipTransferred(_owner, newOwner); _owner = newOwner; } } pragma solidity >=0.6.0 <0.7.0; pragma experimental ABIEncoderV2; struct StrategyParams { uint256 activation; uint256 debtRatio; uint256 minDebtPerHarvest; uint256 maxDebtPerHarvest; uint256 lastReport; uint256 totalDebt; uint256 totalGain; uint256 totalLoss; } interface IYearnV2Vault { function strategies(address _strategy) external view returns (StrategyParams memory); function totalAssets() external view returns (uint256); function deposit(uint256 _amount) external; function withdraw( uint256 amount, address recipient, uint256 maxLoss ) external returns ( uint256, uint256, uint256, uint256 ); function withdrawByStrategy( address[20] calldata _strategies, uint256 amount, address recipient, uint256 maxLoss ) external returns (uint256); function depositLimit() external view returns (uint256); function debtOutstanding(address strategy) external view returns (uint256); function totalDebt() external view returns (uint256); function updateStrategyDebtRatio(address strategy, uint256 ratio) external; function withdrawalQueue(uint256 index) external view returns (address); function report( uint256 _gain, uint256 _loss, uint256 _debtPayment ) external returns (uint256); } pragma solidity >=0.6.0 <0.7.0; interface IController { function stablecoins() external view returns (address[3] memory); function vaults() external view returns (address[3] memory); function underlyingVaults(uint256 i) external view returns (address vault); function curveVault() external view returns (address); function pnl() external view returns (address); function insurance() external view returns (address); function lifeGuard() external view returns (address); function buoy() external view returns (address); function reward() external view returns (address); function isValidBigFish( bool pwrd, bool deposit, uint256 amount ) external view returns (bool); function withdrawHandler() external view returns (address); function emergencyHandler() external view returns (address); function depositHandler() external view returns (address); function totalAssets() external view returns (uint256); function gTokenTotalAssets() external view returns (uint256); function eoaOnly(address sender) external; function getSkimPercent() external view returns (uint256); function gToken(bool _pwrd) external view returns (address); function emergencyState() external view returns (bool); function deadCoin() external view returns (uint256); function distributeStrategyGainLoss(uint256 gain, uint256 loss) external; function burnGToken( bool pwrd, bool all, address account, uint256 amount, uint256 bonus ) external; function mintGToken( bool pwrd, address account, uint256 amount ) external; function getUserAssets(bool pwrd, address account) external view returns (uint256 deductUsd); function referrals(address account) external view returns (address); function addReferral(address account, address referral) external; function getStrategiesTargetRatio() external view returns (uint256[] memory); function withdrawalFee(bool pwrd) external view returns (uint256); function validGTokenDecrease(uint256 amount) external view returns (bool); } pragma solidity >=0.6.0 <0.7.0; interface IPausable { function paused() external view returns (bool); } pragma solidity >=0.6.0 <0.7.0; contract Controllable is Ownable { address public controller; event ChangeController(address indexed oldController, address indexed newController); modifier whenNotPaused() { require(!_pausable().paused(), "Pausable: paused"); _; } modifier whenPaused() { require(_pausable().paused(), "Pausable: not paused"); _; } function ctrlPaused() public view returns (bool) { return _pausable().paused(); } function setController(address newController) external onlyOwner { require(newController != address(0), "setController: !0x"); address oldController = controller; controller = newController; emit ChangeController(oldController, newController); } function _controller() internal view returns (IController) { require(controller != address(0), "Controller not set"); return IController(controller); } function _pausable() internal view returns (IPausable) { require(controller != address(0), "Controller not set"); return IPausable(controller); } } pragma solidity >=0.6.0 <0.7.0; interface IVault { function withdraw(uint256 amount) external; function withdraw(uint256 amount, address recipient) external; function withdrawByStrategyOrder( uint256 amount, address recipient, bool reversed ) external; function withdrawByStrategyIndex( uint256 amount, address recipient, uint256 strategyIndex ) external; function deposit(uint256 amount) external; function updateStrategyRatio(uint256[] calldata strategyRetios) external; function totalAssets() external view returns (uint256); function getStrategiesLength() external view returns (uint256); function strategyHarvestTrigger(uint256 index, uint256 callCost) external view returns (bool); function strategyHarvest(uint256 index) external returns (bool); function getStrategyAssets(uint256 index) external view returns (uint256); function token() external view returns (address); function vault() external view returns (address); function investTrigger() external view returns (bool); function invest() external; } pragma solidity >=0.6.0 <0.7.0; contract Constants { uint8 public constant N_COINS = 3; uint8 public constant DEFAULT_DECIMALS = 18; uint256 public constant DEFAULT_DECIMALS_FACTOR = uint256(10)**DEFAULT_DECIMALS; uint8 public constant CHAINLINK_PRICE_DECIMALS = 8; uint256 public constant CHAINLINK_PRICE_DECIMAL_FACTOR = uint256(10)**CHAINLINK_PRICE_DECIMALS; uint8 public constant PERCENTAGE_DECIMALS = 4; uint256 public constant PERCENTAGE_DECIMAL_FACTOR = uint256(10)**PERCENTAGE_DECIMALS; uint256 public constant CURVE_RATIO_DECIMALS = 6; uint256 public constant CURVE_RATIO_DECIMALS_FACTOR = uint256(10)**CURVE_RATIO_DECIMALS; } pragma solidity >=0.6.0 <0.7.0; interface IERC20Detailed { function name() external view returns (string memory); function symbol() external view returns (string memory); function decimals() external view returns (uint8); } pragma solidity >=0.6.0 <0.7.0; contract Whitelist is Ownable { mapping(address => bool) public whitelist; event LogAddToWhitelist(address indexed user); event LogRemoveFromWhitelist(address indexed user); modifier onlyWhitelist() { require(whitelist[msg.sender], "only whitelist"); _; } function addToWhitelist(address user) external onlyOwner { require(user != address(0), "WhiteList: 0x"); whitelist[user] = true; emit LogAddToWhitelist(user); } function removeFromWhitelist(address user) external onlyOwner { require(user != address(0), "WhiteList: 0x"); whitelist[user] = false; emit LogRemoveFromWhitelist(user); } } pragma solidity >=0.6.0 <0.7.0; abstract contract BaseVaultAdaptor is Controllable, Constants, Whitelist, IVault { using SafeMath for uint256; using SafeERC20 for IERC20; uint256 constant MAX_STRATS = 20; address public immutable override token; uint256 public immutable decimals; address public immutable override vault; uint256 public strategiesLength; uint256 public investThreshold; uint256 public strategyRatioBuffer; uint256 public vaultReserve; bool public openHarvest; bool public entered; uint256 public gasBounty; uint256 public baseProfit; event LogAdaptorReserve(uint256 reserve); event LogAdaptorStrategies(uint256 length); event LogNewAdaptorInvestThreshold(uint256 threshold); event LogNewAdaptorStrategyBuffer(uint256 buffer); event LogNewDebtRatios(uint256[] strategyRetios); event LogMigrate(address parent, address child, uint256 amount); event LogWithdrawToAdapter(uint256 totalLoss, uint256 maxLoss, uint256 value, uint256 MAX_BPS); modifier onlyVault() { require(msg.sender == vault); _; } constructor(address _vault, address _token) public { vault = _vault; token = _token; IERC20(_token).safeApprove(address(_vault), 0); IERC20(_token).safeApprove(address(_vault), type(uint256).max); uint256 _decimals = IERC20Detailed(_token).decimals(); baseProfit = uint256(100)*(uint256(10)**_decimals); decimals = _decimals; } function setVaultReserve(uint256 reserve) external onlyOwner { require(reserve <= PERCENTAGE_DECIMAL_FACTOR); vaultReserve = reserve; emit LogAdaptorReserve(reserve); } function setStrategiesLength(uint256 _strategiesLength) external onlyOwner { strategiesLength = _strategiesLength; emit LogAdaptorStrategies(_strategiesLength); } function setInvestThreshold(uint256 _investThreshold) external onlyOwner { investThreshold = _investThreshold; emit LogNewAdaptorInvestThreshold(_investThreshold); } function setStrategyRatioBuffer(uint256 _strategyRatioBuffer) external onlyOwner { strategyRatioBuffer = _strategyRatioBuffer; emit LogNewAdaptorStrategyBuffer(_strategyRatioBuffer); } function setOpenHarvest(bool status) external onlyOwner { openHarvest = status; } function setGasBounty(uint256 bounty) external onlyOwner { gasBounty = bounty; } function investTrigger() external view override returns (bool) { uint256 vaultHold = _totalAssets().mul(vaultReserve).div(PERCENTAGE_DECIMAL_FACTOR); uint256 _investThreshold = investThreshold.mul(uint256(10)**decimals); uint256 balance = IERC20(token).balanceOf(address(this)); if (balance < _investThreshold) { return false; } else if (balance.sub(_investThreshold) > vaultHold) { return true; } else { return false; } } function invest() external override onlyWhitelist { uint256 vaultHold = _totalAssets().mul(vaultReserve).div(PERCENTAGE_DECIMAL_FACTOR); uint256 _investThreshold = investThreshold.mul(uint256(10)**decimals); uint256 balance = IERC20(token).balanceOf(address(this)); if (balance <= vaultHold) return; if (balance.sub(vaultHold) > _investThreshold) { depositToUnderlyingVault(balance.sub(vaultHold)); } if (strategiesLength > 1) { uint256[] memory targetRatios = _controller().getStrategiesTargetRatio(); uint256[] memory currentRatios = getStrategiesDebtRatio(); bool update; for (uint256 i; i < strategiesLength; i++) { if (currentRatios[i] < targetRatios[i] && targetRatios[i].sub(currentRatios[i]) > strategyRatioBuffer) { update = true; break; } if (currentRatios[i] > targetRatios[i] && currentRatios[i].sub(targetRatios[i]) > strategyRatioBuffer) { update = true; break; } } if (update) { updateStrategiesDebtRatio(targetRatios); } } } function totalAssets() external view override returns (uint256) { return _totalAssets(); } function getStrategiesLength() external view override returns (uint256) { return strategiesLength; } function withdraw(uint256 amount) external override { require(msg.sender == _controller().lifeGuard(), "withdraw: !lifeguard"); if (!_withdrawFromAdapter(amount, msg.sender)) { _withdraw(amount, msg.sender); } } function withdraw(uint256 amount, address recipient) external override { require(msg.sender == _controller().insurance(), "withdraw: !insurance"); if (!_withdrawFromAdapter(amount, recipient)) { _withdraw(amount, recipient); } } function withdrawToAdapter(uint256 amount, uint256 maxLoss) external onlyWhitelist { _withdraw(amount, maxLoss); } function withdrawByStrategyOrder( uint256 amount, address recipient, bool reversed ) external override { IController ctrl = _controller(); require( msg.sender == ctrl.withdrawHandler() || msg.sender == ctrl.insurance() || msg.sender == ctrl.emergencyHandler(), "withdraw: !withdrawHandler|insurance|emergencyHandler" ); if (!_withdrawFromAdapter(amount, recipient)) { _withdrawByStrategyOrder(amount, recipient, reversed); } } function withdrawByStrategyIndex( uint256 amount, address recipient, uint256 strategyIndex ) external override { require(msg.sender == _controller().insurance(), "withdraw: !insurance"); if (!_withdrawFromAdapter(amount, recipient)) { _withdrawByStrategyIndex(amount, recipient, strategyIndex); } } function _withdrawFromAdapter(uint256 amount, address recipient) private returns (bool _success) { uint256 adapterAmount = IERC20(token).balanceOf(address(this)); if (adapterAmount >= amount) { IERC20(token).safeTransfer(recipient, amount); return true; } else { return false; } } function getStrategyAssets(uint256 index) external view override returns (uint256 amount) { return getStrategyTotalAssets(index); } function deposit(uint256 amount) external override { require(msg.sender == _controller().lifeGuard(), "withdraw: !lifeguard"); IERC20(token).safeTransferFrom(msg.sender, address(this), amount); } function updateStrategyRatio(uint256[] calldata strategyRatios) external override { require( msg.sender == _controller().insurance() || msg.sender == owner(), "!updateStrategyRatio: !owner|insurance" ); updateStrategiesDebtRatio(strategyRatios); emit LogNewDebtRatios(strategyRatios); } function strategyHarvestTrigger(uint256 index, uint256 callCost) external view override returns (bool harvested) { require(index < strategiesLength, "invalid index"); return _strategyHarvestTrigger(index, callCost); } function strategyHarvest(uint256 index) external override returns (bool harvested) { require(!entered, 'Harvest already running'); require(index < strategiesLength, "invalid index"); entered = true; if (!openHarvest) { require(whitelist[msg.sender], 'StrategyHarvest: !whitelist'); } uint256 beforeAssets = vaultTotalAssets(); _strategyHarvest(index); uint256 afterAssets = vaultTotalAssets(); if (afterAssets > beforeAssets) { if (gasBounty > 0) { uint256 profit = afterAssets.sub(beforeAssets); if (profit > baseProfit) { uint256 reward = profit.mul(gasBounty).div(10000); afterAssets = afterAssets.sub(reward); IERC20(token).safeTransfer(msg.sender, reward); } } _controller().distributeStrategyGainLoss(afterAssets.sub(beforeAssets), 0); } else if (afterAssets < beforeAssets) { _controller().distributeStrategyGainLoss(0, beforeAssets.sub(afterAssets)); } harvested = true; entered = false; } function migrate(address child) external onlyOwner { require(child != address(0), "migrate: child == 0x"); IERC20 _token = IERC20(token); uint256 balance = _token.balanceOf(address(this)); _token.safeTransfer(child, balance); emit LogMigrate(address(this), child, balance); } function _strategyHarvest(uint256 index) internal virtual; function updateStrategiesDebtRatio(uint256[] memory ratios) internal virtual; function getStrategiesDebtRatio() internal view virtual returns (uint256[] memory); function depositToUnderlyingVault(uint256 amount) internal virtual; function _withdraw(uint256 amount, address recipient) internal virtual returns (uint256); function _withdraw(uint256 amount, uint256 maxLoss) internal virtual returns (uint256); function _withdrawByStrategyOrder( uint256 amount, address recipient, bool reversed ) internal virtual returns (uint256); function _withdrawByStrategyIndex( uint256 amount, address recipient, uint256 index ) internal virtual returns (uint256); function _strategyHarvestTrigger(uint256 index, uint256 callCost) internal view virtual returns (bool); function getStrategyEstimatedTotalAssets(uint256 index) internal view virtual returns (uint256); function getStrategyTotalAssets(uint256 index) internal view virtual returns (uint256); function vaultTotalAssets() internal view virtual returns (uint256); function _totalAssets() internal view returns (uint256) { uint256 total = IERC20(token).balanceOf(address(this)).add(vaultTotalAssets()); return total; } function totalEstimatedAssets() external view returns (uint256) { uint256 total = IERC20(token).balanceOf(address(this)).add(IERC20(token).balanceOf(address(vault))); for (uint256 i = 0; i < strategiesLength; i++) { total = total.add(getStrategyEstimatedTotalAssets(i)); } return total; } } pragma solidity >=0.6.0 <0.7.0; contract VaultAdaptorYearnV2_032 is BaseVaultAdaptor { constructor(address _vault, address _token) public BaseVaultAdaptor(_vault, _token) {} function _withdrawByStrategyOrder( uint256 amount, address recipient, bool pwrd ) internal override returns (uint256) { if (pwrd) { address[MAX_STRATS] memory _strategies; for (uint256 i = strategiesLength; i > 0; i--) { _strategies[i - 1] = IYearnV2Vault(vault).withdrawalQueue((strategiesLength - i)); } return IYearnV2Vault(vault).withdrawByStrategy(_strategies, amount, recipient, 1); } else { return _withdraw(amount, recipient); } } function _withdrawByStrategyIndex( uint256 amount, address recipient, uint256 index ) internal override returns (uint256) { if (index != 0) { address[MAX_STRATS] memory _strategies; uint256 strategyIndex = 0; _strategies[strategyIndex] = IYearnV2Vault(vault).withdrawalQueue(index); for (uint256 i = 0; i < strategiesLength; i++) { if (i == index) { continue; } strategyIndex++; _strategies[strategyIndex] = IYearnV2Vault(vault).withdrawalQueue(i); } return IYearnV2Vault(vault).withdrawByStrategy(_strategies, amount, recipient, 0); } else { return _withdraw(amount, recipient); } } function depositToUnderlyingVault(uint256 _amount) internal override { if (_amount > 0) { IYearnV2Vault(vault).deposit(_amount); } } function _strategyHarvest(uint256 index) internal override { IYearnV2Vault yearnVault = IYearnV2Vault(vault); IYearnV2Strategy(yearnVault.withdrawalQueue(index)).harvest(); } function resetStrategyDeltaRatio() private { IYearnV2Vault yearnVault = IYearnV2Vault(vault); for (uint256 i = 0; i < strategiesLength; i++) { yearnVault.updateStrategyDebtRatio(yearnVault.withdrawalQueue(i), 0); } } function updateStrategiesDebtRatio(uint256[] memory ratios) internal override { uint256 ratioTotal = 0; for (uint256 i = 0; i < ratios.length; i++) { ratioTotal = ratioTotal.add(ratios[i]); } require(ratioTotal <= PERCENTAGE_DECIMAL_FACTOR, "The total of ratios is more than 10000"); resetStrategyDeltaRatio(); IYearnV2Vault yearnVault = IYearnV2Vault(vault); for (uint256 i = 0; i < ratios.length; i++) { yearnVault.updateStrategyDebtRatio(yearnVault.withdrawalQueue(i), ratios[i]); } } function getStrategiesDebtRatio() internal view override returns (uint256[] memory ratios) { ratios = new uint256[](strategiesLength); IYearnV2Vault yearnVault = IYearnV2Vault(vault); StrategyParams memory strategyParam; for (uint256 i; i < strategiesLength; i++) { strategyParam = yearnVault.strategies(yearnVault.withdrawalQueue(i)); ratios[i] = strategyParam.debtRatio; } } function _strategyHarvestTrigger(uint256 index, uint256 callCost) internal view override returns (bool) { IYearnV2Vault yearnVault = IYearnV2Vault(vault); return IYearnV2Strategy(yearnVault.withdrawalQueue(index)).harvestTrigger(callCost); } function getStrategyEstimatedTotalAssets(uint256 index) internal view override returns (uint256) { IYearnV2Vault yearnVault = IYearnV2Vault(vault); return IYearnV2Strategy(yearnVault.withdrawalQueue(index)).estimatedTotalAssets(); } function getStrategyTotalAssets(uint256 index) internal view override returns (uint256) { IYearnV2Vault yearnVault = IYearnV2Vault(vault); StrategyParams memory strategyParam = yearnVault.strategies(yearnVault.withdrawalQueue(index)); return strategyParam.totalDebt; } function _withdraw(uint256 amount, address recipient) internal override returns (uint256 withdrawalAmount) { (, , withdrawalAmount, ) = IYearnV2Vault(vault).withdraw(amount, recipient, 1); } function _withdraw(uint256 _amount, uint256 _maxLoss) internal override returns (uint256 withdrawalAmount) { uint256 totalLoss; uint256 maxLoss; uint256 value; uint256 MAX_BPS; (totalLoss, maxLoss, value, MAX_BPS) = IYearnV2Vault(vault).withdraw(_amount, address(this), _maxLoss); emit LogWithdrawToAdapter(totalLoss, maxLoss, value, MAX_BPS); } function vaultTotalAssets() internal view override returns (uint256) { return IYearnV2Vault(vault).totalAssets(); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"_vault","type":"address"},{"internalType":"address","name":"_token","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"oldController","type":"address"},{"indexed":true,"internalType":"address","name":"newController","type":"address"}],"name":"ChangeController","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"reserve","type":"uint256"}],"name":"LogAdaptorReserve","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"length","type":"uint256"}],"name":"LogAdaptorStrategies","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"}],"name":"LogAddToWhitelist","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"parent","type":"address"},{"indexed":false,"internalType":"address","name":"child","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"LogMigrate","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"threshold","type":"uint256"}],"name":"LogNewAdaptorInvestThreshold","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"buffer","type":"uint256"}],"name":"LogNewAdaptorStrategyBuffer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256[]","name":"strategyRetios","type":"uint256[]"}],"name":"LogNewDebtRatios","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"}],"name":"LogRemoveFromWhitelist","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"totalLoss","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"maxLoss","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"MAX_BPS","type":"uint256"}],"name":"LogWithdrawToAdapter","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"inputs":[],"name":"CHAINLINK_PRICE_DECIMALS","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"CHAINLINK_PRICE_DECIMAL_FACTOR","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"CURVE_RATIO_DECIMALS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"CURVE_RATIO_DECIMALS_FACTOR","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DEFAULT_DECIMALS","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DEFAULT_DECIMALS_FACTOR","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"N_COINS","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PERCENTAGE_DECIMALS","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PERCENTAGE_DECIMAL_FACTOR","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"addToWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"baseProfit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"controller","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ctrlPaused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"deposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"entered","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"gasBounty","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getStrategiesLength","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"getStrategyAssets","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"invest","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"investThreshold","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"investTrigger","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"child","type":"address"}],"name":"migrate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"openHarvest","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"removeFromWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newController","type":"address"}],"name":"setController","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"bounty","type":"uint256"}],"name":"setGasBounty","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_investThreshold","type":"uint256"}],"name":"setInvestThreshold","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"status","type":"bool"}],"name":"setOpenHarvest","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_strategiesLength","type":"uint256"}],"name":"setStrategiesLength","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_strategyRatioBuffer","type":"uint256"}],"name":"setStrategyRatioBuffer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"reserve","type":"uint256"}],"name":"setVaultReserve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"strategiesLength","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"strategyHarvest","outputs":[{"internalType":"bool","name":"harvested","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"},{"internalType":"uint256","name":"callCost","type":"uint256"}],"name":"strategyHarvestTrigger","outputs":[{"internalType":"bool","name":"harvested","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"strategyRatioBuffer","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"token","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalAssets","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalEstimatedAssets","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"strategyRatios","type":"uint256[]"}],"name":"updateStrategyRatio","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"vault","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"vaultReserve","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"whitelist","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address","name":"recipient","type":"address"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"strategyIndex","type":"uint256"}],"name":"withdrawByStrategyIndex","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"bool","name":"reversed","type":"bool"}],"name":"withdrawByStrategyOrder","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"maxLoss","type":"uint256"}],"name":"withdrawToAdapter","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60e06040523480156200001157600080fd5b506040516200443f3803806200443f83398101604081905262000034916200046c565b818160006200004262000186565b600080546001600160a01b0319166001600160a01b0383169081178255604051929350917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a350606082811b6001600160601b031990811660c0529082901b16608052620000cb6001600160a01b0382168360006200018a602090811b62001d2317901c565b620000f282600019836001600160a01b03166200018a60201b62001d23179092919060201c565b6000816001600160a01b031663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b1580156200012e57600080fd5b505afa15801562000143573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620001699190620004e5565b60ff16600a81900a60640260095560a05250620006fe9350505050565b3390565b801580620002195750604051636eb1769f60e11b81526001600160a01b0384169063dd62ed3e90620001c3903090869060040162000526565b60206040518083038186803b158015620001dc57600080fd5b505afa158015620001f1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620002179190620004cc565b155b620002415760405162461bcd60e51b8152600401620002389062000655565b60405180910390fd5b6200029c8363095ea7b360e01b84846040516024016200026392919062000540565b60408051808303601f190181529190526020810180516001600160e01b0319939093166001600160e01b0393841617905290620002a116565b505050565b6060620002fd826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166200033d60201b62001e1d179092919060201c565b8051909150156200029c57808060200190518101906200031e9190620004aa565b6200029c5760405162461bcd60e51b815260040162000238906200060b565b60606200034e848460008562000358565b90505b9392505050565b6060824710156200037d5760405162461bcd60e51b815260040162000238906200058e565b620003888562000428565b620003a75760405162461bcd60e51b81526004016200023890620005d4565b60006060866001600160a01b03168587604051620003c6919062000508565b60006040518083038185875af1925050503d806000811462000405576040519150601f19603f3d011682016040523d82523d6000602084013e6200040a565b606091505b5090925090506200041d8282866200042e565b979650505050505050565b3b151590565b606083156200043f57508162000351565b825115620004505782518084602001fd5b8160405162461bcd60e51b815260040162000238919062000559565b600080604083850312156200047f578182fd5b82516200048c81620006e5565b60208401519092506200049f81620006e5565b809150509250929050565b600060208284031215620004bc578081fd5b8151801515811462000351578182fd5b600060208284031215620004de578081fd5b5051919050565b600060208284031215620004f7578081fd5b815160ff8116811462000351578182fd5b600082516200051c818460208701620006b2565b9190910192915050565b6001600160a01b0392831681529116602082015260400190565b6001600160a01b03929092168252602082015260400190565b60006020825282518060208401526200057a816040850160208701620006b2565b601f01601f19169190910160400192915050565b60208082526026908201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6040820152651c8818d85b1b60d21b606082015260800190565b6020808252601d908201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604082015260600190565b6020808252602a908201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6040820152691bdd081cdd58d8d9595960b21b606082015260800190565b60208082526036908201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60408201527f20746f206e6f6e2d7a65726f20616c6c6f77616e636500000000000000000000606082015260800190565b60005b83811015620006cf578181015183820152602001620006b5565b83811115620006df576000848401525b50505050565b6001600160a01b0381168114620006fb57600080fd5b50565b60805160601c60a05160c05160601c613c82620007bd600039806113ea5280611cdd5280611f7b528061202952806120c7528061228f528061239352806124cf52806125aa528061266f528061276c528061283652806129035280612a6c5280612b8e5280612ccf5280612d7c528061307c525080610ac35280610b5552806118e95250806107b75280610b8e52806111a152806113bb528061148c52806116f752806119225280611d015280611e765280611f265250613c826000f3fe608060405234801561001057600080fd5b50600436106102f05760003560e01c80638da5cb5b1161019d578063ccbffb53116100e9578063e963f18f116100a2578063f77c47911161007c578063f77c479114610593578063f8f9a9b31461059b578063fbfa77cf146105ae578063fc0c546a146105b6576102f0565b8063e963f18f14610570578063ea0d5c5214610578578063f2fde38b14610580576102f0565b8063ccbffb5314610514578063ce5494bb14610527578063e04e73411461053a578063e0501ecf1461054d578063e43252d714610555578063e8b5e51f14610568576102f0565b8063a384e6a311610156578063b6b55f2511610130578063b6b55f25146104de578063c0936b94146104f1578063c5008f4614610504578063cab208081461050c576102f0565b8063a384e6a3146104bb578063a77f05e9146104ce578063ae70b98a146104d6576102f0565b80638da5cb5b14610468578063907064251461047d57806392eefe9b146104855780639666b83b146104985780639b19251a146104a05780639c7e40a9146104b3576102f0565b80633f74bb891161025c5780635cb44e251161021557806371dad28e116101ef57806371dad28e1461042757806376b9df6d1461042f578063828c873a146104425780638ab1d68114610455576102f0565b80635cb44e25146104045780636f923e7314610417578063715018a61461041f576102f0565b80633f74bb89146103be57806343d04c3c146103c65780634b37d603146103ce578063561d1ede146103e157806357beada2146103e95780635c484904146103fc576102f0565b806329357750116102ae578063293577501461036057806329a26346146103755780632a765e0e146103885780632e1a7d4d146103905780632f3ea4cc146103a3578063313ce567146103b6576102f0565b8062f714ce146102f557806301e1d1141461030a578063135ccc47146103285780631476c14c1461034857806319e4099314610350578063250108f614610358575b600080fd5b610308610303366004613442565b6105be565b005b61031261068d565b60405161031f9190613b65565b60405180910390f35b61033b610336366004613412565b61069d565b60405161031f9190613662565b6103126108e7565b61033b6108ed565b610312610967565b61036861096e565b60405161031f9190613ba8565b610308610383366004613368565b610973565b61033b6109bb565b61030861039e366004613412565b6109c4565b6103086103b1366004613412565b610a87565b610312610ac1565b610312610ae5565b610312610aeb565b6103086103dc3660046134e9565b610af1565b61033b610b2a565b6103086103f7366004613412565b610c6d565b610312610ce2565b61033b6104123660046134e9565b610ce8565b610368610d1e565b610308610d23565b610312610da2565b61030861043d366004613412565b610da8565b6103086104503660046134b2565b610e12565b61030861046336600461322c565b610ed9565b610470610f7d565b60405161031f9190613587565b610368610f8c565b61030861049336600461322c565b610f91565b61031261103e565b61033b6104ae36600461322c565b611044565b610312611059565b6103086104c9366004613412565b61105f565b61033b6110d8565b6103126110e6565b6103086104ec366004613412565b6110ec565b6103086104ff366004613471565b6111c9565b6103686113ae565b6103126113b3565b610308610522366004613264565b611549565b61030861053536600461322c565b61168d565b610312610548366004613412565b6117df565b6103126117ea565b61030861056336600461322c565b6117ef565b610308611896565b610312611b98565b610312611ba0565b61030861058e36600461322c565b611bac565b610470611c62565b6103086105a9366004613412565b611c71565b610470611cdb565b610470611cff565b6105c6611e36565b6001600160a01b03166389cf32046040518163ffffffff1660e01b815260040160206040518083038186803b1580156105fe57600080fd5b505afa158015610612573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106369190613248565b6001600160a01b0316336001600160a01b03161461066f5760405162461bcd60e51b8152600401610666906139ea565b60405180910390fd5b6106798282611e71565b610689576106878282611f61565b505b5050565b6000610697612011565b90505b90565b600754600090610100900460ff16156106c85760405162461bcd60e51b8152600401610666906136dc565b60035482106106e95760405162461bcd60e51b815260040161066690613ae8565b6007805461ff001916610100179081905560ff16610730573360009081526002602052604090205460ff166107305760405162461bcd60e51b8152600401610666906137d6565b600061073a612025565b9050610745836120b8565b600061074f612025565b90508181111561085857600854156107e257600061076d82846121a4565b90506009548111156107e057600061079c612710610796600854856121e690919063ffffffff16565b90612220565b90506107a883826121a4565b92506107de6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000163383612262565b505b505b6107ea611e36565b6001600160a01b03166393ce07b261080283856121a4565b60006040518363ffffffff1660e01b815260040161082192919061366d565b600060405180830381600087803b15801561083b57600080fd5b505af115801561084f573d6000803e3d6000fd5b505050506108d2565b818110156108d257610868611e36565b6001600160a01b03166393ce07b2600061088285856121a4565b6040518363ffffffff1660e01b815260040161089f92919061366d565b600060405180830381600087803b1580156108b957600080fd5b505af11580156108cd573d6000803e3d6000fd5b505050505b50506007805461ff0019169055506001919050565b60085481565b60006108f7611e36565b6001600160a01b0316635c975abb6040518163ffffffff1660e01b815260040160206040518083038186803b15801561092f57600080fd5b505afa158015610943573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106979190613384565b620f424081565b600381565b61097b612281565b6000546001600160a01b039081169116146109a85760405162461bcd60e51b8152600401610666906139b5565b6007805460ff1916911515919091179055565b60075460ff1681565b6109cc611e36565b6001600160a01b031663b39f9cc86040518163ffffffff1660e01b815260040160206040518083038186803b158015610a0457600080fd5b505afa158015610a18573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a3c9190613248565b6001600160a01b0316336001600160a01b031614610a6c5760405162461bcd60e51b8152600401610666906138ee565b610a768133611e71565b610a84576106898133611f61565b50565b610a8f612281565b6000546001600160a01b03908116911614610abc5760405162461bcd60e51b8152600401610666906139b5565b600855565b7f000000000000000000000000000000000000000000000000000000000000000081565b60035481565b60055481565b3360009081526002602052604090205460ff16610b205760405162461bcd60e51b815260040161066690613a18565b6106878282612285565b600080610b4c600460ff16600a0a610796600654610b46612011565b906121e6565b90506000610b887f0000000000000000000000000000000000000000000000000000000000000000600a0a6004546121e690919063ffffffff16565b905060007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166370a08231306040518263ffffffff1660e01b8152600401610bd89190613587565b60206040518083038186803b158015610bf057600080fd5b505afa158015610c04573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c28919061342a565b905081811015610c3e576000935050505061069a565b82610c4982846121a4565b1115610c5b576001935050505061069a565b6000935050505061069a565b50505090565b610c75612281565b6000546001600160a01b03908116911614610ca25760405162461bcd60e51b8152600401610666906139b5565b60048190556040517f11e947f20d9cf91da626ad19379828f8e7373fad0eb8596851ba53df95d53ec490610cd7908390613b65565b60405180910390a150565b60065481565b60006003548310610d0b5760405162461bcd60e51b815260040161066690613ae8565b610d158383612381565b90505b92915050565b600881565b610d2b612281565b6000546001600160a01b03908116911614610d585760405162461bcd60e51b8152600401610666906139b5565b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b60095481565b610db0612281565b6000546001600160a01b03908116911614610ddd5760405162461bcd60e51b8152600401610666906139b5565b60038190556040517f3ee4175a8c4b93fdf5b18ca36e74178656967c78d245e2021e0f065d754d26f890610cd7908390613b65565b610e1a611e36565b6001600160a01b03166389cf32046040518163ffffffff1660e01b815260040160206040518083038186803b158015610e5257600080fd5b505afa158015610e66573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e8a9190613248565b6001600160a01b0316336001600160a01b031614610eba5760405162461bcd60e51b8152600401610666906139ea565b610ec48383611e71565b61068757610ed38383836124a5565b50505050565b610ee1612281565b6000546001600160a01b03908116911614610f0e5760405162461bcd60e51b8152600401610666906139b5565b6001600160a01b038116610f345760405162461bcd60e51b815260040161066690613ac1565b6001600160a01b038116600081815260026020526040808220805460ff19169055517f9e9499495e2efd848d33cb197bde94612c1ec36f30605b60d445511e056069e19190a250565b6000546001600160a01b031690565b600481565b610f99612281565b6000546001600160a01b03908116911614610fc65760405162461bcd60e51b8152600401610666906139b5565b6001600160a01b038116610fec5760405162461bcd60e51b815260040161066690613989565b600180546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f7bd9aab74fc8b860dff8328bda449632993abb9bd61340154740618a3debeb8990600090a35050565b60035490565b60026020526000908152604090205460ff1681565b60045481565b611067612281565b6000546001600160a01b039081169116146110945760405162461bcd60e51b8152600401610666906139b5565b6127108111156110a357600080fd5b60068190556040517f4139824e8abecbe54cf799fbfd95217b3e57d6ff622cc1e39c90d47275468ad390610cd7908390613b65565b600754610100900460ff1681565b61271081565b6110f4611e36565b6001600160a01b031663b39f9cc86040518163ffffffff1660e01b815260040160206040518083038186803b15801561112c57600080fd5b505afa158015611140573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111649190613248565b6001600160a01b0316336001600160a01b0316146111945760405162461bcd60e51b8152600401610666906138ee565b610a846001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016333084612717565b60006111d3611e36565b9050806001600160a01b031663083473ef6040518163ffffffff1660e01b815260040160206040518083038186803b15801561120e57600080fd5b505afa158015611222573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112469190613248565b6001600160a01b0316336001600160a01b031614806112e65750806001600160a01b03166389cf32046040518163ffffffff1660e01b815260040160206040518083038186803b15801561129957600080fd5b505afa1580156112ad573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112d19190613248565b6001600160a01b0316336001600160a01b0316145b806113725750806001600160a01b031663f06d00416040518163ffffffff1660e01b815260040160206040518083038186803b15801561132557600080fd5b505afa158015611339573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061135d9190613248565b6001600160a01b0316336001600160a01b0316145b61138e5760405162461bcd60e51b815260040161066690613899565b6113988484611e71565b610ed3576113a7848484612738565b5050505050565b601281565b6000806115177f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166370a082317f00000000000000000000000000000000000000000000000000000000000000006040518263ffffffff1660e01b81526004016114259190613587565b60206040518083038186803b15801561143d57600080fd5b505afa158015611451573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611475919061342a565b6040516370a0823160e01b81526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906370a08231906114c1903090600401613587565b60206040518083038186803b1580156114d957600080fd5b505afa1580156114ed573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611511919061342a565b906128cc565b905060005b60035481101561154357611539611532826128f1565b83906128cc565b915060010161151c565b50905090565b611551611e36565b6001600160a01b03166389cf32046040518163ffffffff1660e01b815260040160206040518083038186803b15801561158957600080fd5b505afa15801561159d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115c19190613248565b6001600160a01b0316336001600160a01b031614806115f857506115e3610f7d565b6001600160a01b0316336001600160a01b0316145b6116145760405162461bcd60e51b815260040161066690613853565b611650828280806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250612a0292505050565b7ffd045726e6f6eb4ca9a760b21e7679234fd4cb9cebfdb5717c98947b51384e338282604051611681929190613628565b60405180910390a15050565b611695612281565b6000546001600160a01b039081169116146116c25760405162461bcd60e51b8152600401610666906139b5565b6001600160a01b0381166116e85760405162461bcd60e51b8152600401610666906136ae565b6040516370a0823160e01b81527f0000000000000000000000000000000000000000000000000000000000000000906000906001600160a01b038316906370a0823190611739903090600401613587565b60206040518083038186803b15801561175157600080fd5b505afa158015611765573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611789919061342a565b905061179f6001600160a01b0383168483612262565b7ff0fee1f70845d356d6a3e0baa0944ce846437b6469ea89416dad2cd7067919a43084836040516117d2939291906135b5565b60405180910390a1505050565b6000610d1882612b8a565b600681565b6117f7612281565b6000546001600160a01b039081169116146118245760405162461bcd60e51b8152600401610666906139b5565b6001600160a01b03811661184a5760405162461bcd60e51b815260040161066690613ac1565b6001600160a01b038116600081815260026020526040808220805460ff19166001179055517f4e3d8c117d484081f7268ed79cded71ad42979b92feb5f8f7f9824ac5cbfe3759190a250565b3360009081526002602052604090205460ff166118c55760405162461bcd60e51b815260040161066690613a18565b60006118e0600460ff16600a0a610796600654610b46612011565b9050600061191c7f0000000000000000000000000000000000000000000000000000000000000000600a0a6004546121e690919063ffffffff16565b905060007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166370a08231306040518263ffffffff1660e01b815260040161196c9190613587565b60206040518083038186803b15801561198457600080fd5b505afa158015611998573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119bc919061342a565b90508281116119cd57505050611b96565b816119d882856121a4565b11156119f0576119f06119eb82856121a4565b612cb2565b60016003541115610687576060611a05611e36565b6001600160a01b031663dbfdc6e76040518163ffffffff1660e01b815260040160006040518083038186803b158015611a3d57600080fd5b505afa158015611a51573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611a7991908101906132d3565b90506060611a85612d32565b90506000805b600354811015611b7f57838181518110611aa157fe5b6020026020010151838281518110611ab557fe5b6020026020010151108015611b035750600554611b01848381518110611ad757fe5b6020026020010151868481518110611aeb57fe5b60200260200101516121a490919063ffffffff16565b115b15611b115760019150611b7f565b838181518110611b1d57fe5b6020026020010151838281518110611b3157fe5b6020026020010151118015611b695750600554611b67858381518110611b5357fe5b6020026020010151858481518110611aeb57fe5b115b15611b775760019150611b7f565b600101611a8b565b508015611b8f57611b8f83612a02565b5050505050505b565b6305f5e10081565b670de0b6b3a764000081565b611bb4612281565b6000546001600160a01b03908116911614611be15760405162461bcd60e51b8152600401610666906139b5565b6001600160a01b038116611c075760405162461bcd60e51b815260040161066690613713565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b6001546001600160a01b031681565b611c79612281565b6000546001600160a01b03908116911614611ca65760405162461bcd60e51b8152600401610666906139b5565b60058190556040517fa47a499601f93b4043628f4f1e885f51e1c6f2bdd338811d4a0597c4a22cf4a890610cd7908390613b65565b7f000000000000000000000000000000000000000000000000000000000000000081565b7f000000000000000000000000000000000000000000000000000000000000000081565b801580611dab5750604051636eb1769f60e11b81526001600160a01b0384169063dd62ed3e90611d59903090869060040161359b565b60206040518083038186803b158015611d7157600080fd5b505afa158015611d85573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611da9919061342a565b155b611dc75760405162461bcd60e51b815260040161066690613b0f565b6106878363095ea7b360e01b8484604051602401611de69291906135d9565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152612ec7565b6060611e2c8484600085612f56565b90505b9392505050565b6001546000906001600160a01b0316611e615760405162461bcd60e51b81526004016106669061395d565b506001546001600160a01b031690565b6000807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166370a08231306040518263ffffffff1660e01b8152600401611ec09190613587565b60206040518083038186803b158015611ed857600080fd5b505afa158015611eec573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f10919061342a565b9050838110611f5757611f4d6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000168486612262565b6001915050610d18565b6000915050610d18565b604051631cc6d2f960e31b81526000906001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063e63697c890611fb59086908690600190600401613b6e565b608060405180830381600087803b158015611fcf57600080fd5b505af1158015611fe3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612007919061350a565b5095945050505050565b60008061201f611475612025565b91505090565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166301e1d1146040518163ffffffff1660e01b815260040160206040518083038186803b15801561208057600080fd5b505afa158015612094573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610697919061342a565b60405163641156ed60e11b81527f0000000000000000000000000000000000000000000000000000000000000000906001600160a01b0382169063c822adda90612106908590600401613b65565b60206040518083038186803b15801561211e57600080fd5b505afa158015612132573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121569190613248565b6001600160a01b0316634641257d6040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561219057600080fd5b505af1158015611b8f573d6000803e3d6000fd5b6000610d1583836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250613017565b6000826121f557506000610d18565b8282028284828161220257fe5b0414610d155760405162461bcd60e51b81526004016106669061391c565b6000610d1583836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250613043565b6106878363a9059cbb60e01b8484604051602401611de69291906135d9565b3390565b60008060008060007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663e63697c88830896040518463ffffffff1660e01b81526004016122dd93929190613b6e565b608060405180830381600087803b1580156122f757600080fd5b505af115801561230b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061232f919061350a565b604051939750919550935091507f95def7718f425b366370245f41afdb8c40d20b66f61bb2fda6893f3e7ee1f7a89061236f908690869086908690613b8d565b60405180910390a15050505092915050565b60405163641156ed60e11b81526000907f0000000000000000000000000000000000000000000000000000000000000000906001600160a01b0382169063c822adda906123d2908790600401613b65565b60206040518083038186803b1580156123ea57600080fd5b505afa1580156123fe573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124229190613248565b6001600160a01b031663ed882c2b846040518263ffffffff1660e01b815260040161244d9190613b65565b60206040518083038186803b15801561246557600080fd5b505afa158015612479573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061249d9190613384565b949350505050565b60008115612706576124b56131c8565b60405163641156ed60e11b81526000906001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063c822adda90612504908790600401613b65565b60206040518083038186803b15801561251c57600080fd5b505afa158015612530573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125549190613248565b82826014811061256057fe5b6001600160a01b03909216602092909202015260005b600354811015612657578481141561258d5761264f565b60405163641156ed60e11b81526001909201916001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063c822adda906125df908490600401613b65565b60206040518083038186803b1580156125f757600080fd5b505afa15801561260b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061262f9190613248565b83836014811061263b57fe5b6001600160a01b0390921660209290920201525b600101612576565b50604051630bc997ab60e31b81526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690635e4cbd58906126ab9085908a908a906000906004016135f2565b602060405180830381600087803b1580156126c557600080fd5b505af11580156126d9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126fd919061342a565b92505050611e2f565b6127108484611f61565b9050611e2f565b610ed3846323b872dd60e01b858585604051602401611de6939291906135b5565b60008115612706576127486131c8565b6003545b801561281e5760035460405163641156ed60e11b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169163c822adda916127a39185900390600401613b65565b60206040518083038186803b1580156127bb57600080fd5b505afa1580156127cf573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127f39190613248565b82600183036014811061280257fe5b6001600160a01b0390921660209290920201526000190161274c565b50604051630bc997ab60e31b81526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690635e4cbd5890612872908490899089906001906004016135f2565b602060405180830381600087803b15801561288c57600080fd5b505af11580156128a0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128c4919061342a565b915050611e2f565b600082820183811015610d155760405162461bcd60e51b815260040161066690613759565b60405163641156ed60e11b81526000907f0000000000000000000000000000000000000000000000000000000000000000906001600160a01b0382169063c822adda90612942908690600401613b65565b60206040518083038186803b15801561295a57600080fd5b505afa15801561296e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129929190613248565b6001600160a01b031663efbb5cb06040518163ffffffff1660e01b815260040160206040518083038186803b1580156129ca57600080fd5b505afa1580156129de573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e2f919061342a565b6000805b8251811015612a3f57612a35838281518110612a1e57fe5b6020026020010151836128cc90919063ffffffff16565b9150600101612a06565b50612710811115612a625760405162461bcd60e51b815260040161066690613790565b612a6a61307a565b7f000000000000000000000000000000000000000000000000000000000000000060005b8351811015610ed35760405163641156ed60e11b81526001600160a01b03831690637c6a4f2490829063c822adda90612acb908690600401613b65565b60206040518083038186803b158015612ae357600080fd5b505afa158015612af7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b1b9190613248565b868481518110612b2757fe5b60200260200101516040518363ffffffff1660e01b8152600401612b4c9291906135d9565b600060405180830381600087803b158015612b6657600080fd5b505af1158015612b7a573d6000803e3d6000fd5b505060019092019150612a8e9050565b60007f0000000000000000000000000000000000000000000000000000000000000000612bb56131e7565b60405163641156ed60e11b81526001600160a01b038316906339ebf82390829063c822adda90612be9908990600401613b65565b60206040518083038186803b158015612c0157600080fd5b505afa158015612c15573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c399190613248565b6040518263ffffffff1660e01b8152600401612c559190613587565b6101006040518083038186803b158015612c6e57600080fd5b505afa158015612c82573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ca691906133a0565b60a00151949350505050565b8015610a845760405163b6b55f2560e01b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063b6b55f2590612d04908490600401613b65565b600060405180830381600087803b158015612d1e57600080fd5b505af11580156113a7573d6000803e3d6000fd5b606060035467ffffffffffffffff81118015612d4d57600080fd5b50604051908082528060200260200182016040528015612d77578160200160208202803683370190505b5090507f0000000000000000000000000000000000000000000000000000000000000000612da36131e7565b60005b600354811015610c675760405163641156ed60e11b81526001600160a01b038416906339ebf82390829063c822adda90612de4908690600401613b65565b60206040518083038186803b158015612dfc57600080fd5b505afa158015612e10573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612e349190613248565b6040518263ffffffff1660e01b8152600401612e509190613587565b6101006040518083038186803b158015612e6957600080fd5b505afa158015612e7d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ea191906133a0565b91508160200151848281518110612eb457fe5b6020908102919091010152600101612da6565b6060612f1c826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316611e1d9092919063ffffffff16565b8051909150156106875780806020019051810190612f3a9190613384565b6106875760405162461bcd60e51b815260040161066690613a77565b606082471015612f785760405162461bcd60e51b81526004016106669061380d565b612f8185613189565b612f9d5760405162461bcd60e51b815260040161066690613a40565b60006060866001600160a01b03168587604051612fba919061356b565b60006040518083038185875af1925050503d8060008114612ff7576040519150601f19603f3d011682016040523d82523d6000602084013e612ffc565b606091505b509150915061300c82828661318f565b979650505050505050565b6000818484111561303b5760405162461bcd60e51b8152600401610666919061367b565b505050900390565b600081836130645760405162461bcd60e51b8152600401610666919061367b565b50600083858161307057fe5b0495945050505050565b7f000000000000000000000000000000000000000000000000000000000000000060005b6003548110156106895760405163641156ed60e11b81526001600160a01b03831690637c6a4f2490829063c822adda906130dc908690600401613b65565b60206040518083038186803b1580156130f457600080fd5b505afa158015613108573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061312c9190613248565b60006040518363ffffffff1660e01b815260040161314b9291906135d9565b600060405180830381600087803b15801561316557600080fd5b505af1158015613179573d6000803e3d6000fd5b50506001909201915061309e9050565b3b151590565b6060831561319e575081611e2f565b8251156131ae5782518084602001fd5b8160405162461bcd60e51b8152600401610666919061367b565b6040518061028001604052806014906020820280368337509192915050565b60405180610100016040528060008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b60006020828403121561323d578081fd5b8135610d1581613c29565b600060208284031215613259578081fd5b8151610d1581613c29565b60008060208385031215613276578081fd5b823567ffffffffffffffff8082111561328d578283fd5b818501915085601f8301126132a0578283fd5b8135818111156132ae578384fd5b86602080830285010111156132c1578384fd5b60209290920196919550909350505050565b600060208083850312156132e5578182fd5b825167ffffffffffffffff8111156132fb578283fd5b8301601f8101851361330b578283fd5b805161331e61331982613bdd565b613bb6565b818152838101908385018584028501860189101561333a578687fd5b8694505b8385101561335c57805183526001949094019391850191850161333e565b50979650505050505050565b600060208284031215613379578081fd5b8135610d1581613c3e565b600060208284031215613395578081fd5b8151610d1581613c3e565b60006101008083850312156133b3578182fd5b6133bc81613bb6565b9050825181526020830151602082015260408301516040820152606083015160608201526080830151608082015260a083015160a082015260c083015160c082015260e083015160e08201528091505092915050565b600060208284031215613423578081fd5b5035919050565b60006020828403121561343b578081fd5b5051919050565b60008060408385031215613454578182fd5b82359150602083013561346681613c29565b809150509250929050565b600080600060608486031215613485578081fd5b83359250602084013561349781613c29565b915060408401356134a781613c3e565b809150509250925092565b6000806000606084860312156134c6578283fd5b8335925060208401356134d881613c29565b929592945050506040919091013590565b600080604083850312156134fb578182fd5b50508035926020909101359150565b6000806000806080858703121561351f578081fd5b505082516020840151604085015160609095015191969095509092509050565b8060005b6014811015610ed35781516001600160a01b0316845260209384019390910190600101613543565b6000825161357d818460208701613bfd565b9190910192915050565b6001600160a01b0391909116815260200190565b6001600160a01b0392831681529116602082015260400190565b6001600160a01b039384168152919092166020820152604081019190915260600190565b6001600160a01b03929092168252602082015260400190565b6102e08101613601828761353f565b6102808201949094526001600160a01b03929092166102a08301526102c090910152919050565b6020808252810182905260006001600160fb1b03831115613647578081fd5b60208302808560408501379190910160400190815292915050565b901515815260200190565b918252602082015260400190565b600060208252825180602084015261369a816040850160208701613bfd565b601f01601f19169190910160400192915050565b6020808252601490820152730dad2cee4c2e8ca7440c6d0d2d8c8407a7a4060f60631b604082015260600190565b60208082526017908201527f4861727665737420616c72656164792072756e6e696e67000000000000000000604082015260600190565b60208082526026908201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160408201526564647265737360d01b606082015260800190565b6020808252601b908201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604082015260600190565b60208082526026908201527f54686520746f74616c206f6620726174696f73206973206d6f7265207468616e60408201526502031303030360d41b606082015260800190565b6020808252601b908201527f5374726174656779486172766573743a202177686974656c6973740000000000604082015260600190565b60208082526026908201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6040820152651c8818d85b1b60d21b606082015260800190565b60208082526026908201527f217570646174655374726174656779526174696f3a20216f776e65727c696e736040820152657572616e636560d01b606082015260800190565b60208082526035908201527f77697468647261773a2021776974686472617748616e646c65727c696e73757260408201527430b731b2be32b6b2b933b2b731bca430b7323632b960591b606082015260800190565b6020808252601490820152731dda5d1a191c985dce88085b1a599959dd585c9960621b604082015260600190565b60208082526021908201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6040820152607760f81b606082015260800190565b60208082526012908201527110dbdb9d1c9bdb1b195c881b9bdd081cd95d60721b604082015260600190565b6020808252601290820152710e6cae886dedce8e4ded8d8cae474404260f60731b604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526014908201527377697468647261773a2021696e737572616e636560601b604082015260600190565b6020808252600e908201526d1bdb9b1e481dda1a5d195b1a5cdd60921b604082015260600190565b6020808252601d908201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604082015260600190565b6020808252602a908201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6040820152691bdd081cdd58d8d9595960b21b606082015260800190565b6020808252600d908201526c0aed0d2e8ca98d2e6e8744060f609b1b604082015260600190565b6020808252600d908201526c0d2dcecc2d8d2c840d2dcc8caf609b1b604082015260600190565b60208082526036908201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60408201527520746f206e6f6e2d7a65726f20616c6c6f77616e636560501b606082015260800190565b90815260200190565b9283526001600160a01b03919091166020830152604082015260600190565b93845260208401929092526040830152606082015260800190565b60ff91909116815260200190565b60405181810167ffffffffffffffff81118282101715613bd557600080fd5b604052919050565b600067ffffffffffffffff821115613bf3578081fd5b5060209081020190565b60005b83811015613c18578181015183820152602001613c00565b83811115610ed35750506000910152565b6001600160a01b0381168114610a8457600080fd5b8015158114610a8457600080fdfea264697066735822122024c103a501f40dff641fac1474b807231e9a929e8cdee31b383070cac449a44a64736f6c634300060c00330000000000000000000000006a01bc748d71489372bd8fb743b23f63d99aac850000000000000000000000006b175474e89094c44da98b954eedeac495271d0f
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106102f05760003560e01c80638da5cb5b1161019d578063ccbffb53116100e9578063e963f18f116100a2578063f77c47911161007c578063f77c479114610593578063f8f9a9b31461059b578063fbfa77cf146105ae578063fc0c546a146105b6576102f0565b8063e963f18f14610570578063ea0d5c5214610578578063f2fde38b14610580576102f0565b8063ccbffb5314610514578063ce5494bb14610527578063e04e73411461053a578063e0501ecf1461054d578063e43252d714610555578063e8b5e51f14610568576102f0565b8063a384e6a311610156578063b6b55f2511610130578063b6b55f25146104de578063c0936b94146104f1578063c5008f4614610504578063cab208081461050c576102f0565b8063a384e6a3146104bb578063a77f05e9146104ce578063ae70b98a146104d6576102f0565b80638da5cb5b14610468578063907064251461047d57806392eefe9b146104855780639666b83b146104985780639b19251a146104a05780639c7e40a9146104b3576102f0565b80633f74bb891161025c5780635cb44e251161021557806371dad28e116101ef57806371dad28e1461042757806376b9df6d1461042f578063828c873a146104425780638ab1d68114610455576102f0565b80635cb44e25146104045780636f923e7314610417578063715018a61461041f576102f0565b80633f74bb89146103be57806343d04c3c146103c65780634b37d603146103ce578063561d1ede146103e157806357beada2146103e95780635c484904146103fc576102f0565b806329357750116102ae578063293577501461036057806329a26346146103755780632a765e0e146103885780632e1a7d4d146103905780632f3ea4cc146103a3578063313ce567146103b6576102f0565b8062f714ce146102f557806301e1d1141461030a578063135ccc47146103285780631476c14c1461034857806319e4099314610350578063250108f614610358575b600080fd5b610308610303366004613442565b6105be565b005b61031261068d565b60405161031f9190613b65565b60405180910390f35b61033b610336366004613412565b61069d565b60405161031f9190613662565b6103126108e7565b61033b6108ed565b610312610967565b61036861096e565b60405161031f9190613ba8565b610308610383366004613368565b610973565b61033b6109bb565b61030861039e366004613412565b6109c4565b6103086103b1366004613412565b610a87565b610312610ac1565b610312610ae5565b610312610aeb565b6103086103dc3660046134e9565b610af1565b61033b610b2a565b6103086103f7366004613412565b610c6d565b610312610ce2565b61033b6104123660046134e9565b610ce8565b610368610d1e565b610308610d23565b610312610da2565b61030861043d366004613412565b610da8565b6103086104503660046134b2565b610e12565b61030861046336600461322c565b610ed9565b610470610f7d565b60405161031f9190613587565b610368610f8c565b61030861049336600461322c565b610f91565b61031261103e565b61033b6104ae36600461322c565b611044565b610312611059565b6103086104c9366004613412565b61105f565b61033b6110d8565b6103126110e6565b6103086104ec366004613412565b6110ec565b6103086104ff366004613471565b6111c9565b6103686113ae565b6103126113b3565b610308610522366004613264565b611549565b61030861053536600461322c565b61168d565b610312610548366004613412565b6117df565b6103126117ea565b61030861056336600461322c565b6117ef565b610308611896565b610312611b98565b610312611ba0565b61030861058e36600461322c565b611bac565b610470611c62565b6103086105a9366004613412565b611c71565b610470611cdb565b610470611cff565b6105c6611e36565b6001600160a01b03166389cf32046040518163ffffffff1660e01b815260040160206040518083038186803b1580156105fe57600080fd5b505afa158015610612573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106369190613248565b6001600160a01b0316336001600160a01b03161461066f5760405162461bcd60e51b8152600401610666906139ea565b60405180910390fd5b6106798282611e71565b610689576106878282611f61565b505b5050565b6000610697612011565b90505b90565b600754600090610100900460ff16156106c85760405162461bcd60e51b8152600401610666906136dc565b60035482106106e95760405162461bcd60e51b815260040161066690613ae8565b6007805461ff001916610100179081905560ff16610730573360009081526002602052604090205460ff166107305760405162461bcd60e51b8152600401610666906137d6565b600061073a612025565b9050610745836120b8565b600061074f612025565b90508181111561085857600854156107e257600061076d82846121a4565b90506009548111156107e057600061079c612710610796600854856121e690919063ffffffff16565b90612220565b90506107a883826121a4565b92506107de6001600160a01b037f0000000000000000000000006b175474e89094c44da98b954eedeac495271d0f163383612262565b505b505b6107ea611e36565b6001600160a01b03166393ce07b261080283856121a4565b60006040518363ffffffff1660e01b815260040161082192919061366d565b600060405180830381600087803b15801561083b57600080fd5b505af115801561084f573d6000803e3d6000fd5b505050506108d2565b818110156108d257610868611e36565b6001600160a01b03166393ce07b2600061088285856121a4565b6040518363ffffffff1660e01b815260040161089f92919061366d565b600060405180830381600087803b1580156108b957600080fd5b505af11580156108cd573d6000803e3d6000fd5b505050505b50506007805461ff0019169055506001919050565b60085481565b60006108f7611e36565b6001600160a01b0316635c975abb6040518163ffffffff1660e01b815260040160206040518083038186803b15801561092f57600080fd5b505afa158015610943573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106979190613384565b620f424081565b600381565b61097b612281565b6000546001600160a01b039081169116146109a85760405162461bcd60e51b8152600401610666906139b5565b6007805460ff1916911515919091179055565b60075460ff1681565b6109cc611e36565b6001600160a01b031663b39f9cc86040518163ffffffff1660e01b815260040160206040518083038186803b158015610a0457600080fd5b505afa158015610a18573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a3c9190613248565b6001600160a01b0316336001600160a01b031614610a6c5760405162461bcd60e51b8152600401610666906138ee565b610a768133611e71565b610a84576106898133611f61565b50565b610a8f612281565b6000546001600160a01b03908116911614610abc5760405162461bcd60e51b8152600401610666906139b5565b600855565b7f000000000000000000000000000000000000000000000000000000000000001281565b60035481565b60055481565b3360009081526002602052604090205460ff16610b205760405162461bcd60e51b815260040161066690613a18565b6106878282612285565b600080610b4c600460ff16600a0a610796600654610b46612011565b906121e6565b90506000610b887f0000000000000000000000000000000000000000000000000000000000000012600a0a6004546121e690919063ffffffff16565b905060007f0000000000000000000000006b175474e89094c44da98b954eedeac495271d0f6001600160a01b03166370a08231306040518263ffffffff1660e01b8152600401610bd89190613587565b60206040518083038186803b158015610bf057600080fd5b505afa158015610c04573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c28919061342a565b905081811015610c3e576000935050505061069a565b82610c4982846121a4565b1115610c5b576001935050505061069a565b6000935050505061069a565b50505090565b610c75612281565b6000546001600160a01b03908116911614610ca25760405162461bcd60e51b8152600401610666906139b5565b60048190556040517f11e947f20d9cf91da626ad19379828f8e7373fad0eb8596851ba53df95d53ec490610cd7908390613b65565b60405180910390a150565b60065481565b60006003548310610d0b5760405162461bcd60e51b815260040161066690613ae8565b610d158383612381565b90505b92915050565b600881565b610d2b612281565b6000546001600160a01b03908116911614610d585760405162461bcd60e51b8152600401610666906139b5565b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b60095481565b610db0612281565b6000546001600160a01b03908116911614610ddd5760405162461bcd60e51b8152600401610666906139b5565b60038190556040517f3ee4175a8c4b93fdf5b18ca36e74178656967c78d245e2021e0f065d754d26f890610cd7908390613b65565b610e1a611e36565b6001600160a01b03166389cf32046040518163ffffffff1660e01b815260040160206040518083038186803b158015610e5257600080fd5b505afa158015610e66573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e8a9190613248565b6001600160a01b0316336001600160a01b031614610eba5760405162461bcd60e51b8152600401610666906139ea565b610ec48383611e71565b61068757610ed38383836124a5565b50505050565b610ee1612281565b6000546001600160a01b03908116911614610f0e5760405162461bcd60e51b8152600401610666906139b5565b6001600160a01b038116610f345760405162461bcd60e51b815260040161066690613ac1565b6001600160a01b038116600081815260026020526040808220805460ff19169055517f9e9499495e2efd848d33cb197bde94612c1ec36f30605b60d445511e056069e19190a250565b6000546001600160a01b031690565b600481565b610f99612281565b6000546001600160a01b03908116911614610fc65760405162461bcd60e51b8152600401610666906139b5565b6001600160a01b038116610fec5760405162461bcd60e51b815260040161066690613989565b600180546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f7bd9aab74fc8b860dff8328bda449632993abb9bd61340154740618a3debeb8990600090a35050565b60035490565b60026020526000908152604090205460ff1681565b60045481565b611067612281565b6000546001600160a01b039081169116146110945760405162461bcd60e51b8152600401610666906139b5565b6127108111156110a357600080fd5b60068190556040517f4139824e8abecbe54cf799fbfd95217b3e57d6ff622cc1e39c90d47275468ad390610cd7908390613b65565b600754610100900460ff1681565b61271081565b6110f4611e36565b6001600160a01b031663b39f9cc86040518163ffffffff1660e01b815260040160206040518083038186803b15801561112c57600080fd5b505afa158015611140573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111649190613248565b6001600160a01b0316336001600160a01b0316146111945760405162461bcd60e51b8152600401610666906138ee565b610a846001600160a01b037f0000000000000000000000006b175474e89094c44da98b954eedeac495271d0f16333084612717565b60006111d3611e36565b9050806001600160a01b031663083473ef6040518163ffffffff1660e01b815260040160206040518083038186803b15801561120e57600080fd5b505afa158015611222573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112469190613248565b6001600160a01b0316336001600160a01b031614806112e65750806001600160a01b03166389cf32046040518163ffffffff1660e01b815260040160206040518083038186803b15801561129957600080fd5b505afa1580156112ad573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112d19190613248565b6001600160a01b0316336001600160a01b0316145b806113725750806001600160a01b031663f06d00416040518163ffffffff1660e01b815260040160206040518083038186803b15801561132557600080fd5b505afa158015611339573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061135d9190613248565b6001600160a01b0316336001600160a01b0316145b61138e5760405162461bcd60e51b815260040161066690613899565b6113988484611e71565b610ed3576113a7848484612738565b5050505050565b601281565b6000806115177f0000000000000000000000006b175474e89094c44da98b954eedeac495271d0f6001600160a01b03166370a082317f0000000000000000000000006a01bc748d71489372bd8fb743b23f63d99aac856040518263ffffffff1660e01b81526004016114259190613587565b60206040518083038186803b15801561143d57600080fd5b505afa158015611451573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611475919061342a565b6040516370a0823160e01b81526001600160a01b037f0000000000000000000000006b175474e89094c44da98b954eedeac495271d0f16906370a08231906114c1903090600401613587565b60206040518083038186803b1580156114d957600080fd5b505afa1580156114ed573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611511919061342a565b906128cc565b905060005b60035481101561154357611539611532826128f1565b83906128cc565b915060010161151c565b50905090565b611551611e36565b6001600160a01b03166389cf32046040518163ffffffff1660e01b815260040160206040518083038186803b15801561158957600080fd5b505afa15801561159d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115c19190613248565b6001600160a01b0316336001600160a01b031614806115f857506115e3610f7d565b6001600160a01b0316336001600160a01b0316145b6116145760405162461bcd60e51b815260040161066690613853565b611650828280806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250612a0292505050565b7ffd045726e6f6eb4ca9a760b21e7679234fd4cb9cebfdb5717c98947b51384e338282604051611681929190613628565b60405180910390a15050565b611695612281565b6000546001600160a01b039081169116146116c25760405162461bcd60e51b8152600401610666906139b5565b6001600160a01b0381166116e85760405162461bcd60e51b8152600401610666906136ae565b6040516370a0823160e01b81527f0000000000000000000000006b175474e89094c44da98b954eedeac495271d0f906000906001600160a01b038316906370a0823190611739903090600401613587565b60206040518083038186803b15801561175157600080fd5b505afa158015611765573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611789919061342a565b905061179f6001600160a01b0383168483612262565b7ff0fee1f70845d356d6a3e0baa0944ce846437b6469ea89416dad2cd7067919a43084836040516117d2939291906135b5565b60405180910390a1505050565b6000610d1882612b8a565b600681565b6117f7612281565b6000546001600160a01b039081169116146118245760405162461bcd60e51b8152600401610666906139b5565b6001600160a01b03811661184a5760405162461bcd60e51b815260040161066690613ac1565b6001600160a01b038116600081815260026020526040808220805460ff19166001179055517f4e3d8c117d484081f7268ed79cded71ad42979b92feb5f8f7f9824ac5cbfe3759190a250565b3360009081526002602052604090205460ff166118c55760405162461bcd60e51b815260040161066690613a18565b60006118e0600460ff16600a0a610796600654610b46612011565b9050600061191c7f0000000000000000000000000000000000000000000000000000000000000012600a0a6004546121e690919063ffffffff16565b905060007f0000000000000000000000006b175474e89094c44da98b954eedeac495271d0f6001600160a01b03166370a08231306040518263ffffffff1660e01b815260040161196c9190613587565b60206040518083038186803b15801561198457600080fd5b505afa158015611998573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119bc919061342a565b90508281116119cd57505050611b96565b816119d882856121a4565b11156119f0576119f06119eb82856121a4565b612cb2565b60016003541115610687576060611a05611e36565b6001600160a01b031663dbfdc6e76040518163ffffffff1660e01b815260040160006040518083038186803b158015611a3d57600080fd5b505afa158015611a51573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611a7991908101906132d3565b90506060611a85612d32565b90506000805b600354811015611b7f57838181518110611aa157fe5b6020026020010151838281518110611ab557fe5b6020026020010151108015611b035750600554611b01848381518110611ad757fe5b6020026020010151868481518110611aeb57fe5b60200260200101516121a490919063ffffffff16565b115b15611b115760019150611b7f565b838181518110611b1d57fe5b6020026020010151838281518110611b3157fe5b6020026020010151118015611b695750600554611b67858381518110611b5357fe5b6020026020010151858481518110611aeb57fe5b115b15611b775760019150611b7f565b600101611a8b565b508015611b8f57611b8f83612a02565b5050505050505b565b6305f5e10081565b670de0b6b3a764000081565b611bb4612281565b6000546001600160a01b03908116911614611be15760405162461bcd60e51b8152600401610666906139b5565b6001600160a01b038116611c075760405162461bcd60e51b815260040161066690613713565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b6001546001600160a01b031681565b611c79612281565b6000546001600160a01b03908116911614611ca65760405162461bcd60e51b8152600401610666906139b5565b60058190556040517fa47a499601f93b4043628f4f1e885f51e1c6f2bdd338811d4a0597c4a22cf4a890610cd7908390613b65565b7f0000000000000000000000006a01bc748d71489372bd8fb743b23f63d99aac8581565b7f0000000000000000000000006b175474e89094c44da98b954eedeac495271d0f81565b801580611dab5750604051636eb1769f60e11b81526001600160a01b0384169063dd62ed3e90611d59903090869060040161359b565b60206040518083038186803b158015611d7157600080fd5b505afa158015611d85573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611da9919061342a565b155b611dc75760405162461bcd60e51b815260040161066690613b0f565b6106878363095ea7b360e01b8484604051602401611de69291906135d9565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152612ec7565b6060611e2c8484600085612f56565b90505b9392505050565b6001546000906001600160a01b0316611e615760405162461bcd60e51b81526004016106669061395d565b506001546001600160a01b031690565b6000807f0000000000000000000000006b175474e89094c44da98b954eedeac495271d0f6001600160a01b03166370a08231306040518263ffffffff1660e01b8152600401611ec09190613587565b60206040518083038186803b158015611ed857600080fd5b505afa158015611eec573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f10919061342a565b9050838110611f5757611f4d6001600160a01b037f0000000000000000000000006b175474e89094c44da98b954eedeac495271d0f168486612262565b6001915050610d18565b6000915050610d18565b604051631cc6d2f960e31b81526000906001600160a01b037f0000000000000000000000006a01bc748d71489372bd8fb743b23f63d99aac85169063e63697c890611fb59086908690600190600401613b6e565b608060405180830381600087803b158015611fcf57600080fd5b505af1158015611fe3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612007919061350a565b5095945050505050565b60008061201f611475612025565b91505090565b60007f0000000000000000000000006a01bc748d71489372bd8fb743b23f63d99aac856001600160a01b03166301e1d1146040518163ffffffff1660e01b815260040160206040518083038186803b15801561208057600080fd5b505afa158015612094573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610697919061342a565b60405163641156ed60e11b81527f0000000000000000000000006a01bc748d71489372bd8fb743b23f63d99aac85906001600160a01b0382169063c822adda90612106908590600401613b65565b60206040518083038186803b15801561211e57600080fd5b505afa158015612132573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121569190613248565b6001600160a01b0316634641257d6040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561219057600080fd5b505af1158015611b8f573d6000803e3d6000fd5b6000610d1583836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250613017565b6000826121f557506000610d18565b8282028284828161220257fe5b0414610d155760405162461bcd60e51b81526004016106669061391c565b6000610d1583836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250613043565b6106878363a9059cbb60e01b8484604051602401611de69291906135d9565b3390565b60008060008060007f0000000000000000000000006a01bc748d71489372bd8fb743b23f63d99aac856001600160a01b031663e63697c88830896040518463ffffffff1660e01b81526004016122dd93929190613b6e565b608060405180830381600087803b1580156122f757600080fd5b505af115801561230b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061232f919061350a565b604051939750919550935091507f95def7718f425b366370245f41afdb8c40d20b66f61bb2fda6893f3e7ee1f7a89061236f908690869086908690613b8d565b60405180910390a15050505092915050565b60405163641156ed60e11b81526000907f0000000000000000000000006a01bc748d71489372bd8fb743b23f63d99aac85906001600160a01b0382169063c822adda906123d2908790600401613b65565b60206040518083038186803b1580156123ea57600080fd5b505afa1580156123fe573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124229190613248565b6001600160a01b031663ed882c2b846040518263ffffffff1660e01b815260040161244d9190613b65565b60206040518083038186803b15801561246557600080fd5b505afa158015612479573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061249d9190613384565b949350505050565b60008115612706576124b56131c8565b60405163641156ed60e11b81526000906001600160a01b037f0000000000000000000000006a01bc748d71489372bd8fb743b23f63d99aac85169063c822adda90612504908790600401613b65565b60206040518083038186803b15801561251c57600080fd5b505afa158015612530573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125549190613248565b82826014811061256057fe5b6001600160a01b03909216602092909202015260005b600354811015612657578481141561258d5761264f565b60405163641156ed60e11b81526001909201916001600160a01b037f0000000000000000000000006a01bc748d71489372bd8fb743b23f63d99aac85169063c822adda906125df908490600401613b65565b60206040518083038186803b1580156125f757600080fd5b505afa15801561260b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061262f9190613248565b83836014811061263b57fe5b6001600160a01b0390921660209290920201525b600101612576565b50604051630bc997ab60e31b81526001600160a01b037f0000000000000000000000006a01bc748d71489372bd8fb743b23f63d99aac851690635e4cbd58906126ab9085908a908a906000906004016135f2565b602060405180830381600087803b1580156126c557600080fd5b505af11580156126d9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126fd919061342a565b92505050611e2f565b6127108484611f61565b9050611e2f565b610ed3846323b872dd60e01b858585604051602401611de6939291906135b5565b60008115612706576127486131c8565b6003545b801561281e5760035460405163641156ed60e11b81526001600160a01b037f0000000000000000000000006a01bc748d71489372bd8fb743b23f63d99aac85169163c822adda916127a39185900390600401613b65565b60206040518083038186803b1580156127bb57600080fd5b505afa1580156127cf573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127f39190613248565b82600183036014811061280257fe5b6001600160a01b0390921660209290920201526000190161274c565b50604051630bc997ab60e31b81526001600160a01b037f0000000000000000000000006a01bc748d71489372bd8fb743b23f63d99aac851690635e4cbd5890612872908490899089906001906004016135f2565b602060405180830381600087803b15801561288c57600080fd5b505af11580156128a0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128c4919061342a565b915050611e2f565b600082820183811015610d155760405162461bcd60e51b815260040161066690613759565b60405163641156ed60e11b81526000907f0000000000000000000000006a01bc748d71489372bd8fb743b23f63d99aac85906001600160a01b0382169063c822adda90612942908690600401613b65565b60206040518083038186803b15801561295a57600080fd5b505afa15801561296e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129929190613248565b6001600160a01b031663efbb5cb06040518163ffffffff1660e01b815260040160206040518083038186803b1580156129ca57600080fd5b505afa1580156129de573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e2f919061342a565b6000805b8251811015612a3f57612a35838281518110612a1e57fe5b6020026020010151836128cc90919063ffffffff16565b9150600101612a06565b50612710811115612a625760405162461bcd60e51b815260040161066690613790565b612a6a61307a565b7f0000000000000000000000006a01bc748d71489372bd8fb743b23f63d99aac8560005b8351811015610ed35760405163641156ed60e11b81526001600160a01b03831690637c6a4f2490829063c822adda90612acb908690600401613b65565b60206040518083038186803b158015612ae357600080fd5b505afa158015612af7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b1b9190613248565b868481518110612b2757fe5b60200260200101516040518363ffffffff1660e01b8152600401612b4c9291906135d9565b600060405180830381600087803b158015612b6657600080fd5b505af1158015612b7a573d6000803e3d6000fd5b505060019092019150612a8e9050565b60007f0000000000000000000000006a01bc748d71489372bd8fb743b23f63d99aac85612bb56131e7565b60405163641156ed60e11b81526001600160a01b038316906339ebf82390829063c822adda90612be9908990600401613b65565b60206040518083038186803b158015612c0157600080fd5b505afa158015612c15573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c399190613248565b6040518263ffffffff1660e01b8152600401612c559190613587565b6101006040518083038186803b158015612c6e57600080fd5b505afa158015612c82573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ca691906133a0565b60a00151949350505050565b8015610a845760405163b6b55f2560e01b81526001600160a01b037f0000000000000000000000006a01bc748d71489372bd8fb743b23f63d99aac85169063b6b55f2590612d04908490600401613b65565b600060405180830381600087803b158015612d1e57600080fd5b505af11580156113a7573d6000803e3d6000fd5b606060035467ffffffffffffffff81118015612d4d57600080fd5b50604051908082528060200260200182016040528015612d77578160200160208202803683370190505b5090507f0000000000000000000000006a01bc748d71489372bd8fb743b23f63d99aac85612da36131e7565b60005b600354811015610c675760405163641156ed60e11b81526001600160a01b038416906339ebf82390829063c822adda90612de4908690600401613b65565b60206040518083038186803b158015612dfc57600080fd5b505afa158015612e10573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612e349190613248565b6040518263ffffffff1660e01b8152600401612e509190613587565b6101006040518083038186803b158015612e6957600080fd5b505afa158015612e7d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ea191906133a0565b91508160200151848281518110612eb457fe5b6020908102919091010152600101612da6565b6060612f1c826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316611e1d9092919063ffffffff16565b8051909150156106875780806020019051810190612f3a9190613384565b6106875760405162461bcd60e51b815260040161066690613a77565b606082471015612f785760405162461bcd60e51b81526004016106669061380d565b612f8185613189565b612f9d5760405162461bcd60e51b815260040161066690613a40565b60006060866001600160a01b03168587604051612fba919061356b565b60006040518083038185875af1925050503d8060008114612ff7576040519150601f19603f3d011682016040523d82523d6000602084013e612ffc565b606091505b509150915061300c82828661318f565b979650505050505050565b6000818484111561303b5760405162461bcd60e51b8152600401610666919061367b565b505050900390565b600081836130645760405162461bcd60e51b8152600401610666919061367b565b50600083858161307057fe5b0495945050505050565b7f0000000000000000000000006a01bc748d71489372bd8fb743b23f63d99aac8560005b6003548110156106895760405163641156ed60e11b81526001600160a01b03831690637c6a4f2490829063c822adda906130dc908690600401613b65565b60206040518083038186803b1580156130f457600080fd5b505afa158015613108573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061312c9190613248565b60006040518363ffffffff1660e01b815260040161314b9291906135d9565b600060405180830381600087803b15801561316557600080fd5b505af1158015613179573d6000803e3d6000fd5b50506001909201915061309e9050565b3b151590565b6060831561319e575081611e2f565b8251156131ae5782518084602001fd5b8160405162461bcd60e51b8152600401610666919061367b565b6040518061028001604052806014906020820280368337509192915050565b60405180610100016040528060008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b60006020828403121561323d578081fd5b8135610d1581613c29565b600060208284031215613259578081fd5b8151610d1581613c29565b60008060208385031215613276578081fd5b823567ffffffffffffffff8082111561328d578283fd5b818501915085601f8301126132a0578283fd5b8135818111156132ae578384fd5b86602080830285010111156132c1578384fd5b60209290920196919550909350505050565b600060208083850312156132e5578182fd5b825167ffffffffffffffff8111156132fb578283fd5b8301601f8101851361330b578283fd5b805161331e61331982613bdd565b613bb6565b818152838101908385018584028501860189101561333a578687fd5b8694505b8385101561335c57805183526001949094019391850191850161333e565b50979650505050505050565b600060208284031215613379578081fd5b8135610d1581613c3e565b600060208284031215613395578081fd5b8151610d1581613c3e565b60006101008083850312156133b3578182fd5b6133bc81613bb6565b9050825181526020830151602082015260408301516040820152606083015160608201526080830151608082015260a083015160a082015260c083015160c082015260e083015160e08201528091505092915050565b600060208284031215613423578081fd5b5035919050565b60006020828403121561343b578081fd5b5051919050565b60008060408385031215613454578182fd5b82359150602083013561346681613c29565b809150509250929050565b600080600060608486031215613485578081fd5b83359250602084013561349781613c29565b915060408401356134a781613c3e565b809150509250925092565b6000806000606084860312156134c6578283fd5b8335925060208401356134d881613c29565b929592945050506040919091013590565b600080604083850312156134fb578182fd5b50508035926020909101359150565b6000806000806080858703121561351f578081fd5b505082516020840151604085015160609095015191969095509092509050565b8060005b6014811015610ed35781516001600160a01b0316845260209384019390910190600101613543565b6000825161357d818460208701613bfd565b9190910192915050565b6001600160a01b0391909116815260200190565b6001600160a01b0392831681529116602082015260400190565b6001600160a01b039384168152919092166020820152604081019190915260600190565b6001600160a01b03929092168252602082015260400190565b6102e08101613601828761353f565b6102808201949094526001600160a01b03929092166102a08301526102c090910152919050565b6020808252810182905260006001600160fb1b03831115613647578081fd5b60208302808560408501379190910160400190815292915050565b901515815260200190565b918252602082015260400190565b600060208252825180602084015261369a816040850160208701613bfd565b601f01601f19169190910160400192915050565b6020808252601490820152730dad2cee4c2e8ca7440c6d0d2d8c8407a7a4060f60631b604082015260600190565b60208082526017908201527f4861727665737420616c72656164792072756e6e696e67000000000000000000604082015260600190565b60208082526026908201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160408201526564647265737360d01b606082015260800190565b6020808252601b908201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604082015260600190565b60208082526026908201527f54686520746f74616c206f6620726174696f73206973206d6f7265207468616e60408201526502031303030360d41b606082015260800190565b6020808252601b908201527f5374726174656779486172766573743a202177686974656c6973740000000000604082015260600190565b60208082526026908201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6040820152651c8818d85b1b60d21b606082015260800190565b60208082526026908201527f217570646174655374726174656779526174696f3a20216f776e65727c696e736040820152657572616e636560d01b606082015260800190565b60208082526035908201527f77697468647261773a2021776974686472617748616e646c65727c696e73757260408201527430b731b2be32b6b2b933b2b731bca430b7323632b960591b606082015260800190565b6020808252601490820152731dda5d1a191c985dce88085b1a599959dd585c9960621b604082015260600190565b60208082526021908201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6040820152607760f81b606082015260800190565b60208082526012908201527110dbdb9d1c9bdb1b195c881b9bdd081cd95d60721b604082015260600190565b6020808252601290820152710e6cae886dedce8e4ded8d8cae474404260f60731b604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526014908201527377697468647261773a2021696e737572616e636560601b604082015260600190565b6020808252600e908201526d1bdb9b1e481dda1a5d195b1a5cdd60921b604082015260600190565b6020808252601d908201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604082015260600190565b6020808252602a908201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6040820152691bdd081cdd58d8d9595960b21b606082015260800190565b6020808252600d908201526c0aed0d2e8ca98d2e6e8744060f609b1b604082015260600190565b6020808252600d908201526c0d2dcecc2d8d2c840d2dcc8caf609b1b604082015260600190565b60208082526036908201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60408201527520746f206e6f6e2d7a65726f20616c6c6f77616e636560501b606082015260800190565b90815260200190565b9283526001600160a01b03919091166020830152604082015260600190565b93845260208401929092526040830152606082015260800190565b60ff91909116815260200190565b60405181810167ffffffffffffffff81118282101715613bd557600080fd5b604052919050565b600067ffffffffffffffff821115613bf3578081fd5b5060209081020190565b60005b83811015613c18578181015183820152602001613c00565b83811115610ed35750506000910152565b6001600160a01b0381168114610a8457600080fd5b8015158114610a8457600080fdfea264697066735822122024c103a501f40dff641fac1474b807231e9a929e8cdee31b383070cac449a44a64736f6c634300060c0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000006a01bc748d71489372bd8fb743b23f63d99aac850000000000000000000000006b175474e89094c44da98b954eedeac495271d0f
-----Decoded View---------------
Arg [0] : _vault (address): 0x6a01bC748d71489372BD8fB743b23F63d99aac85
Arg [1] : _token (address): 0x6B175474E89094C44Da98b954EedeAC495271d0F
-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 0000000000000000000000006a01bc748d71489372bd8fb743b23f63d99aac85
Arg [1] : 0000000000000000000000006b175474e89094c44da98b954eedeac495271d0f
Deployed Bytecode Sourcemap
50285:4894:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44192:273;;;;;;:::i;:::-;;:::i;:::-;;43694:104;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46937:1216;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;39812:24::-;;;:::i;35565:95::-;;;:::i;38100:87::-;;;:::i;37567:33::-;;;:::i;:::-;;;;;;;:::i;41620:95::-;;;;;;:::i;:::-;;:::i;39756:23::-;;;:::i;43928:256::-;;;;;;:::i;:::-;;:::i;41723:94::-;;;;;;:::i;:::-;;:::i;39484:33::-;;;:::i;39582:31::-;;;:::i;39669:34::-;;;:::i;44473:128::-;;;;;;:::i;:::-;;:::i;41825:531::-;;;:::i;41209:188::-;;;;;;:::i;:::-;;:::i;39716:27::-;;;:::i;46689:240::-;;;;;;:::i;:::-;;:::i;37744:50::-;;;:::i;30710:148::-;;;:::i;39843:25::-;;;:::i;41016:185::-;;;;;;:::i;:::-;;:::i;45198:375::-;;;;;;:::i;:::-;;:::i;38990:203::-;;;;;;:::i;:::-;;:::i;30068:79::-;;;:::i;:::-;;;;;;;:::i;37902:45::-;;;:::i;35668:286::-;;;;;;:::i;:::-;;:::i;43806:114::-;;;:::i;38517:41::-;;;;;;:::i;:::-;;:::i;39626:30::-;;;:::i;40808:200::-;;;;;;:::i;:::-;;:::i;39786:19::-;;;:::i;37954:84::-;;;:::i;46102:218::-;;;;;;:::i;:::-;;:::i;44609:581::-;;;;;;:::i;:::-;;:::i;37607:43::-;;;:::i;49901:342::-;;;:::i;46328:353::-;;;;;;:::i;:::-;;:::i;48161:325::-;;;;;;:::i;:::-;;:::i;45949:145::-;;;;;;:::i;:::-;;:::i;38045:48::-;;;:::i;38790:192::-;;;;;;:::i;:::-;;:::i;42364:1322::-;;;:::i;37801:94::-;;;:::i;37658:79::-;;;:::i;31013:244::-;;;;;;:::i;:::-;;:::i;35210:25::-;;;:::i;41405:207::-;;;;;;:::i;:::-;;:::i;39530:39::-;;;:::i;39438:::-;;;:::i;44192:273::-;44296:13;:11;:13::i;:::-;-1:-1:-1;;;;;44296:23:0;;:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;44282:39:0;:10;-1:-1:-1;;;;;44282:39:0;;44274:72;;;;-1:-1:-1;;;44274:72:0;;;;;;;:::i;:::-;;;;;;;;;44362:39;44383:6;44391:9;44362:20;:39::i;:::-;44357:101;;44418:28;44428:6;44436:9;44418;:28::i;:::-;;44357:101;44192:273;;:::o;43694:104::-;43749:7;43776:14;:12;:14::i;:::-;43769:21;;43694:104;;:::o;46937:1216::-;47040:7;;47004:14;;47040:7;;;;;47039:8;47031:44;;;;-1:-1:-1;;;47031:44:0;;;;;;;:::i;:::-;47102:16;;47094:5;:24;47086:50;;;;-1:-1:-1;;;47086:50:0;;;;;;;:::i;:::-;47147:7;:14;;-1:-1:-1;;47147:14:0;;;;;;;;47177:11;47172:106;;47223:10;47213:21;;;;:9;:21;;;;;;;;47205:61;;;;-1:-1:-1;;;47205:61:0;;;;;;;:::i;:::-;47288:20;47311:18;:16;:18::i;:::-;47288:41;;47340:23;47357:5;47340:16;:23::i;:::-;47374:19;47396:18;:16;:18::i;:::-;47374:40;;47443:12;47429:11;:26;47425:668;;;47476:9;;:13;47472:382;;47528:14;47545:29;:11;47561:12;47545:15;:29::i;:::-;47528:46;;47606:10;;47597:6;:19;47593:246;;;47641:14;47658:32;47684:5;47658:21;47669:9;;47658:6;:10;;:21;;;;:::i;:::-;:25;;:32::i;:::-;47641:49;-1:-1:-1;47727:23:0;:11;47641:49;47727:15;:23::i;:::-;47713:37;-1:-1:-1;47773:46:0;-1:-1:-1;;;;;47780:5:0;47773:26;47800:10;47812:6;47773:26;:46::i;:::-;47593:246;;47472:382;;47868:13;:11;:13::i;:::-;-1:-1:-1;;;;;47868:40:0;;47909:29;:11;47925:12;47909:15;:29::i;:::-;47940:1;47868:74;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47425:668;;;47978:12;47964:11;:26;47960:133;;;48007:13;:11;:13::i;:::-;-1:-1:-1;;;;;48007:40:0;;48048:1;48051:29;:12;48068:11;48051:16;:29::i;:::-;48007:74;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47960:133;-1:-1:-1;;48130:7:0;:15;;-1:-1:-1;;48130:15:0;;;-1:-1:-1;48115:4:0;;46937:1216;-1:-1:-1;46937:1216:0:o;39812:24::-;;;;:::o;35565:95::-;35608:4;35632:11;:9;:11::i;:::-;-1:-1:-1;;;;;35632:18:0;;:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;38100:87::-;38154:33;38100:87;:::o;37567:33::-;37599:1;37567:33;:::o;41620:95::-;30290:12;:10;:12::i;:::-;30280:6;;-1:-1:-1;;;;;30280:6:0;;;:22;;;30272:67;;;;-1:-1:-1;;;30272:67:0;;;;;;;:::i;:::-;41687:11:::1;:20:::0;;-1:-1:-1;;41687:20:0::1;::::0;::::1;;::::0;;;::::1;::::0;;41620:95::o;39756:23::-;;;;;;:::o;43928:256::-;44013:13;:11;:13::i;:::-;-1:-1:-1;;;;;44013:23:0;;:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;43999:39:0;:10;-1:-1:-1;;;;;43999:39:0;;43991:72;;;;-1:-1:-1;;;43991:72:0;;;;;;;:::i;:::-;44079:40;44100:6;44108:10;44079:20;:40::i;:::-;44074:103;;44136:29;44146:6;44154:10;44136:9;:29::i;44074:103::-;43928:256;:::o;41723:94::-;30290:12;:10;:12::i;:::-;30280:6;;-1:-1:-1;;;;;30280:6:0;;;:22;;;30272:67;;;;-1:-1:-1;;;30272:67:0;;;;;;;:::i;:::-;41791:9:::1;:18:::0;41723:94::o;39484:33::-;;;:::o;39582:31::-;;;;:::o;39669:34::-;;;;:::o;44473:128::-;38732:10;38722:21;;;;:9;:21;;;;;;;;38714:48;;;;-1:-1:-1;;;38714:48:0;;;;;;;:::i;:::-;44567:26:::1;44577:6;44585:7;44567:9;:26::i;41825:531::-:0;41882:4;41899:17;41919:63;37946:1;38006:32;;38014:2;38006:32;41919;41938:12;;41919:14;:12;:14::i;:::-;:18;;:32::i;:63::-;41899:83;;41993:24;42020:42;42053:8;42048:2;42040:21;42020:15;;:19;;:42;;;;:::i;:::-;41993:69;;42073:15;42098:5;-1:-1:-1;;;;;42091:23:0;;42123:4;42091:38;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;42073:56;;42156:16;42146:7;:26;42142:207;;;42196:5;42189:12;;;;;;;42142:207;42255:9;42223:29;:7;42235:16;42223:11;:29::i;:::-;:41;42219:130;;;42288:4;42281:11;;;;;;;42219:130;42332:5;42325:12;;;;;;;42219:130;41825:531;;;;:::o;41209:188::-;30290:12;:10;:12::i;:::-;30280:6;;-1:-1:-1;;;;;30280:6:0;;;:22;;;30272:67;;;;-1:-1:-1;;;30272:67:0;;;;;;;:::i;:::-;41293:15:::1;:34:::0;;;41343:46:::1;::::0;::::1;::::0;::::1;::::0;41311:16;;41343:46:::1;:::i;:::-;;;;;;;;41209:188:::0;:::o;39716:27::-;;;;:::o;46689:240::-;46786:14;46829:16;;46821:5;:24;46813:50;;;;-1:-1:-1;;;46813:50:0;;;;;;;:::i;:::-;46881:40;46905:5;46912:8;46881:23;:40::i;:::-;46874:47;;46689:240;;;;;:::o;37744:50::-;37793:1;37744:50;:::o;30710:148::-;30290:12;:10;:12::i;:::-;30280:6;;-1:-1:-1;;;;;30280:6:0;;;:22;;;30272:67;;;;-1:-1:-1;;;30272:67:0;;;;;;;:::i;:::-;30817:1:::1;30801:6:::0;;30780:40:::1;::::0;-1:-1:-1;;;;;30801:6:0;;::::1;::::0;30780:40:::1;::::0;30817:1;;30780:40:::1;30848:1;30831:19:::0;;-1:-1:-1;;;;;;30831:19:0::1;::::0;;30710:148::o;39843:25::-;;;;:::o;41016:185::-;30290:12;:10;:12::i;:::-;30280:6;;-1:-1:-1;;;;;30280:6:0;;;:22;;;30272:67;;;;-1:-1:-1;;;30272:67:0;;;;;;;:::i;:::-;41102:16:::1;:36:::0;;;41154:39:::1;::::0;::::1;::::0;::::1;::::0;41121:17;;41154:39:::1;:::i;45198:375::-:0;45374:13;:11;:13::i;:::-;-1:-1:-1;;;;;45374:23:0;;:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;45360:39:0;:10;-1:-1:-1;;;;;45360:39:0;;45352:72;;;;-1:-1:-1;;;45352:72:0;;;;;;;:::i;:::-;45440:39;45461:6;45469:9;45440:20;:39::i;:::-;45435:131;;45496:58;45521:6;45529:9;45540:13;45496:24;:58::i;:::-;;45198:375;;;:::o;38990:203::-;30290:12;:10;:12::i;:::-;30280:6;;-1:-1:-1;;;;;30280:6:0;;;:22;;;30272:67;;;;-1:-1:-1;;;30272:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;39071:18:0;::::1;39063:44;;;;-1:-1:-1::0;;;39063:44:0::1;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;39118:15:0;::::1;39136:5;39118:15:::0;;;:9:::1;:15;::::0;;;;;:23;;-1:-1:-1;;39118:23:0::1;::::0;;39157:28;::::1;::::0;39136:5;39157:28:::1;38990:203:::0;:::o;30068:79::-;30106:7;30133:6;-1:-1:-1;;;;;30133:6:0;30068:79;:::o;37902:45::-;37946:1;37902:45;:::o;35668:286::-;30290:12;:10;:12::i;:::-;30280:6;;-1:-1:-1;;;;;30280:6:0;;;:22;;;30272:67;;;;-1:-1:-1;;;30272:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;35752:27:0;::::1;35744:58;;;;-1:-1:-1::0;;;35744:58:0::1;;;;;;;:::i;:::-;35837:10;::::0;;-1:-1:-1;;;;;35858:26:0;;::::1;-1:-1:-1::0;;;;;;35858:26:0;::::1;::::0;::::1;::::0;;;35900:46:::1;::::0;35837:10;::::1;::::0;35858:26;35837:10;;35900:46:::1;::::0;35813:21:::1;::::0;35900:46:::1;30350:1;35668:286:::0;:::o;43806:114::-;43896:16;;43806:114;:::o;38517:41::-;;;;;;;;;;;;;;;:::o;39626:30::-;;;;:::o;40808:200::-;30290:12;:10;:12::i;:::-;30280:6;;-1:-1:-1;;;;;30280:6:0;;;:22;;;30272:67;;;;-1:-1:-1;;;30272:67:0;;;;;;;:::i;:::-;38006:32;40888:36;::::1;;40880:45;;;::::0;::::1;;40936:12;:22:::0;;;40974:26:::1;::::0;::::1;::::0;::::1;::::0;40951:7;;40974:26:::1;:::i;39786:19::-:0;;;;;;;;;:::o;37954:84::-;38006:32;37954:84;:::o;46102:218::-;46186:13;:11;:13::i;:::-;-1:-1:-1;;;;;46186:23:0;;:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;46172:39:0;:10;-1:-1:-1;;;;;46172:39:0;;46164:72;;;;-1:-1:-1;;;46164:72:0;;;;;;;:::i;:::-;46247:65;-1:-1:-1;;;;;46254:5:0;46247:30;46278:10;46298:4;46305:6;46247:30;:65::i;44609:581::-;44755:16;44774:13;:11;:13::i;:::-;44755:32;;44834:4;-1:-1:-1;;;;;44834:20:0;;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;44820:36:0;:10;-1:-1:-1;;;;;44820:36:0;;:87;;;;44891:4;-1:-1:-1;;;;;44891:14:0;;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;44877:30:0;:10;-1:-1:-1;;;;;44877:30:0;;44820:87;:145;;;;44942:4;-1:-1:-1;;;;;44942:21:0;;:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;44928:37:0;:10;-1:-1:-1;;;;;44928:37:0;;44820:145;44798:248;;;;-1:-1:-1;;;44798:248:0;;;;;;;:::i;:::-;45062:39;45083:6;45091:9;45062:20;:39::i;:::-;45057:126;;45118:53;45143:6;45151:9;45162:8;45118:24;:53::i;:::-;;44609:581;;;;:::o;37607:43::-;37648:2;37607:43;:::o;49901:342::-;49956:7;49976:13;49992:83;50042:5;-1:-1:-1;;;;;50035:23:0;;50067:5;50035:39;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;49992:38;;-1:-1:-1;;;49992:38:0;;-1:-1:-1;;;;;49999:5:0;49992:23;;;;:38;;50024:4;;49992:38;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:42;;:83::i;:::-;49976:99;;50091:9;50086:127;50110:16;;50106:1;:20;50086:127;;;50156:45;50166:34;50198:1;50166:31;:34::i;:::-;50156:5;;:9;:45::i;:::-;50148:53;-1:-1:-1;50128:3:0;;50086:127;;;-1:-1:-1;50230:5:0;-1:-1:-1;49901:342:0;:::o;46328:353::-;46457:13;:11;:13::i;:::-;-1:-1:-1;;;;;46457:23:0;;:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;46443:39:0;:10;-1:-1:-1;;;;;46443:39:0;;:64;;;;46500:7;:5;:7::i;:::-;-1:-1:-1;;;;;46486:21:0;:10;-1:-1:-1;;;;;46486:21:0;;46443:64;46421:152;;;;-1:-1:-1;;;46421:152:0;;;;;;;:::i;:::-;46584:41;46610:14;;46584:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;46584:25:0;;-1:-1:-1;;;46584:41:0:i;:::-;46641:32;46658:14;;46641:32;;;;;;;:::i;:::-;;;;;;;;46328:353;;:::o;48161:325::-;30290:12;:10;:12::i;:::-;30280:6;;-1:-1:-1;;;;;30280:6:0;;;:22;;;30272:67;;;;-1:-1:-1;;;30272:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;48231:19:0;::::1;48223:52;;;;-1:-1:-1::0;;;48223:52:0::1;;;;;;;:::i;:::-;48344:31;::::0;-1:-1:-1;;;48344:31:0;;48309:5:::1;::::0;48286:13:::1;::::0;-1:-1:-1;;;;;48344:16:0;::::1;::::0;::::1;::::0;:31:::1;::::0;48369:4:::1;::::0;48344:31:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;48326:49:::0;-1:-1:-1;48386:35:0::1;-1:-1:-1::0;;;;;48386:19:0;::::1;48406:5:::0;48326:49;48386:19:::1;:35::i;:::-;48437:41;48456:4;48463:5;48470:7;48437:41;;;;;;;;:::i;:::-;;;;;;;;30350:1;;48161:325:::0;:::o;45949:145::-;46023:14;46057:29;46080:5;46057:22;:29::i;38045:48::-;38092:1;38045:48;:::o;38790:192::-;30290:12;:10;:12::i;:::-;30280:6;;-1:-1:-1;;;;;30280:6:0;;;:22;;;30272:67;;;;-1:-1:-1;;;30272:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;38866:18:0;::::1;38858:44;;;;-1:-1:-1::0;;;38858:44:0::1;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;38913:15:0;::::1;;::::0;;;:9:::1;:15;::::0;;;;;:22;;-1:-1:-1;;38913:22:0::1;38931:4;38913:22;::::0;;38951:23;::::1;::::0;38913:15;38951:23:::1;38790:192:::0;:::o;42364:1322::-;38732:10;38722:21;;;;:9;:21;;;;;;;;38714:48;;;;-1:-1:-1;;;38714:48:0;;;;;;;:::i;:::-;42425:17:::1;42445:63;37946:1;38006:32;;38014:2;38006:32;42445;42464:12;;42445:14;:12;:14::i;:63::-;42425:83;;42519:24;42546:42;42579:8;42574:2;42566:21;42546:15;;:19;;:42;;;;:::i;:::-;42519:69;;42599:15;42624:5;-1:-1:-1::0;;;;;42617:23:0::1;;42649:4;42617:38;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;42599:56;;42683:9;42672:7;:20;42668:33;;42694:7;;;;;42668:33;42742:16:::0;42717:22:::1;:7:::0;42729:9;42717:11:::1;:22::i;:::-;:41;42713:122;;;42775:48;42800:22;:7:::0;42812:9;42800:11:::1;:22::i;:::-;42775:24;:48::i;:::-;42880:1;42861:16;;:20;42857:822;;;42912:29;42944:13;:11;:13::i;:::-;-1:-1:-1::0;;;;;42944:38:0::1;;:40;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;::::0;;::::1;-1:-1:-1::0;;42944:40:0::1;::::0;::::1;;::::0;::::1;::::0;;;::::1;::::0;::::1;:::i;:::-;42912:72;;42999:30;43032:24;:22;:24::i;:::-;42999:57;;43071:11;43102:9:::0;43097:471:::1;43117:16;;43113:1;:20;43097:471;;;43182:12;43195:1;43182:15;;;;;;;;;;;;;;43163:13;43177:1;43163:16;;;;;;;;;;;;;;:34;:97;;;;;43241:19;;43201:37;43221:13;43235:1;43221:16;;;;;;;;;;;;;;43201:12;43214:1;43201:15;;;;;;;;;;;;;;:19;;:37;;;;:::i;:::-;:59;43163:97;43159:187;;;43294:4;43285:13;;43321:5;;43159:187;43389:12;43402:1;43389:15;;;;;;;;;;;;;;43370:13;43384:1;43370:16;;;;;;;;;;;;;;:34;:97;;;;;43448:19;;43408:37;43429:12;43442:1;43429:15;;;;;;;;;;;;;;43408:13;43422:1;43408:16;;;;;;;:37;:59;43370:97;43366:187;;;43501:4;43492:13;;43528:5;;43366:187;43135:3;;43097:471;;;;43586:6;43582:86;;;43613:39;43639:12;43613:25;:39::i;:::-;42857:822;;;38773:1;;;;42364:1322::o:0;37801:94::-;37858:37;37801:94;:::o;37658:79::-;37708:29;37658:79;:::o;31013:244::-;30290:12;:10;:12::i;:::-;30280:6;;-1:-1:-1;;;;;30280:6:0;;;:22;;;30272:67;;;;-1:-1:-1;;;30272:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;31102:22:0;::::1;31094:73;;;;-1:-1:-1::0;;;31094:73:0::1;;;;;;;:::i;:::-;31204:6;::::0;;31183:38:::1;::::0;-1:-1:-1;;;;;31183:38:0;;::::1;::::0;31204:6;::::1;::::0;31183:38:::1;::::0;::::1;31232:6;:17:::0;;-1:-1:-1;;;;;;31232:17:0::1;-1:-1:-1::0;;;;;31232:17:0;;;::::1;::::0;;;::::1;::::0;;31013:244::o;35210:25::-;;;-1:-1:-1;;;;;35210:25:0;;:::o;41405:207::-;30290:12;:10;:12::i;:::-;30280:6;;-1:-1:-1;;;;;30280:6:0;;;:22;;;30272:67;;;;-1:-1:-1;;;30272:67:0;;;;;;;:::i;:::-;41497:19:::1;:42:::0;;;41555:49:::1;::::0;::::1;::::0;::::1;::::0;41519:20;;41555:49:::1;:::i;39530:39::-:0;;;:::o;39438:::-;;;:::o;27217:388::-;27353:10;;;27352:62;;-1:-1:-1;27369:39:0;;-1:-1:-1;;;27369:39:0;;-1:-1:-1;;;;;27369:15:0;;;;;:39;;27393:4;;27400:7;;27369:39;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:44;27352:62;27344:152;;;;-1:-1:-1;;;27344:152:0;;;;;;;:::i;:::-;27507:90;27527:5;27557:22;;;27581:7;27590:5;27534:62;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;27534:62:0;;;;;;;;;;;;;;-1:-1:-1;;;;;27534:62:0;-1:-1:-1;;;;;;27534:62:0;;;;;;;;;;27507:19;:90::i;22902:195::-;23005:12;23037:52;23059:6;23067:4;23073:1;23076:12;23037:21;:52::i;:::-;23030:59;;22902:195;;;;;;:::o;35962:174::-;36040:10;;36008:11;;-1:-1:-1;;;;;36040:10:0;36032:55;;;;-1:-1:-1;;;36032:55:0;;;;;;;:::i;:::-;-1:-1:-1;36117:10:0;;-1:-1:-1;;;;;36117:10:0;35962:174;:::o;45581:360::-;45663:13;45689:21;45720:5;-1:-1:-1;;;;;45713:23:0;;45745:4;45713:38;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;45689:62;;45783:6;45766:13;:23;45762:172;;45806:45;-1:-1:-1;;;;;45813:5:0;45806:26;45833:9;45844:6;45806:26;:45::i;:::-;45873:4;45866:11;;;;;45762:172;45917:5;45910:12;;;;;54421:204;54566:51;;-1:-1:-1;;;54566:51:0;;54502:24;;-1:-1:-1;;;;;54580:5:0;54566:29;;;;:51;;54596:6;;54604:9;;54615:1;;54566:51;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;54539:78:0;54421:204;-1:-1:-1;;;;;54421:204:0:o;49717:176::-;49764:7;49784:13;49800:62;49843:18;:16;:18::i;49800:62::-;49784:78;-1:-1:-1;;49717:176:0;:::o;55047:129::-;55107:7;55148:5;-1:-1:-1;;;;;55134:32:0;;:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;52042:197::-;52187:33;;-1:-1:-1;;;52187:33:0;;52153:5;;-1:-1:-1;;;;;52187:26:0;;;;;:33;;52214:5;;52187:33;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;52170:59:0;;:61;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5404:136;5462:7;5489:43;5493:1;5496;5489:43;;;;;;;;;;;;;;;;;:3;:43::i;6294:280::-;6352:7;6406:6;6402:47;;-1:-1:-1;6436:1:0;6429:8;;6402:47;6473:5;;;6477:1;6473;:5;:1;6497:5;;;;;:10;6489:56;;;;-1:-1:-1;;;6489:56:0;;;;;;;:::i;7050:132::-;7108:7;7135:39;7139:1;7142;7135:39;;;;;;;;;;;;;;;;;:3;:39::i;26558:177::-;26641:86;26661:5;26691:23;;;26716:2;26720:5;26668:58;;;;;;;;;:::i;1140:106::-;1228:10;1140:106;:::o;54633:406::-;54714:24;54751:17;54779:15;54805:13;54829:15;54910:5;-1:-1:-1;;;;;54896:29:0;;54926:7;54943:4;54950:8;54896:63;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;54975:56;;54857:102;;-1:-1:-1;54857:102:0;;-1:-1:-1;54857:102:0;-1:-1:-1;54857:102:0;-1:-1:-1;54975:56:0;;;;54857:102;;;;;;;;54975:56;:::i;:::-;;;;;;;;54633:406;;;;;;;;:::o;53578:264::-;53775:33;;-1:-1:-1;;;53775:33:0;;53676:4;;53734:5;;-1:-1:-1;;;;;53775:26:0;;;;;:33;;53802:5;;53775:33;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;53758:66:0;;53825:8;53758:76;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;53751:83;53578:264;-1:-1:-1;;;;53578:264:0:o;51031:827::-;51176:7;51200:10;;51196:655;;51227:38;;:::i;:::-;51349:43;;-1:-1:-1;;;51349:43:0;;51280:21;;-1:-1:-1;;;;;51363:5:0;51349:36;;;;:43;;51386:5;;51349:43;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;51320:11;51332:13;51320:26;;;;;;;-1:-1:-1;;;;;51320:72:0;;;:26;;;;;;:72;51412:9;51407:269;51431:16;;51427:1;:20;51407:269;;;51482:5;51477:1;:10;51473:67;;;51512:8;;51473:67;51621:39;;-1:-1:-1;;;51621:39:0;;51558:15;;;;;-1:-1:-1;;;;;51635:5:0;51621:36;;;;:39;;51658:1;;51621:39;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;51592:11;51604:13;51592:26;;;;;;;-1:-1:-1;;;;;51592:68:0;;;:26;;;;;;:68;51407:269;51449:3;;51407:269;;;-1:-1:-1;51697:74:0;;-1:-1:-1;;;51697:74:0;;-1:-1:-1;;;;;51711:5:0;51697:39;;;;:74;;51737:11;;51750:6;;51758:9;;51769:1;;51697:74;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;51690:81;;;;;;51196:655;51811:28;51821:6;51829:9;51811;:28::i;:::-;51804:35;;;;26743:205;26844:96;26864:5;26894:27;;;26923:4;26929:2;26933:5;26871:68;;;;;;;;;;:::i;50439:584::-;50580:7;50604:4;50600:416;;;50625:38;;:::i;:::-;50695:16;;50678:163;50713:5;;50678:163;;50803:16;;50765:60;;-1:-1:-1;;;50765:60:0;;-1:-1:-1;;;;;50779:5:0;50765:36;;;;:60;;50803:20;;;;50765:60;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;50744:11;50760:1;50756;:5;50744:18;;;;;;;-1:-1:-1;;;;;50744:81:0;;;:18;;;;;;:81;-1:-1:-1;;50720:3:0;50678:163;;;-1:-1:-1;50862:74:0;;-1:-1:-1;;;50862:74:0;;-1:-1:-1;;;;;50876:5:0;50862:39;;;;:74;;50902:11;;50915:6;;50923:9;;50934:1;;50862:74;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;50855:81;;;;;4940:181;4998:7;5030:5;;;5054:6;;;;5046:46;;;;-1:-1:-1;;;5046:46:0;;;;;;;:::i;53850:255::-;54040:33;;-1:-1:-1;;;54040:33:0;;53938:7;;53999:5;;-1:-1:-1;;;;;54040:26:0;;;;;:33;;54067:5;;54040:33;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;54023:72:0;;:74;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;52516:594::-;52605:18;52643:9;52638:109;52662:6;:13;52658:1;:17;52638:109;;;52710:25;52725:6;52732:1;52725:9;;;;;;;;;;;;;;52710:10;:14;;:25;;;;:::i;:::-;52697:38;-1:-1:-1;52677:3:0;;52638:109;;;-1:-1:-1;38006:32:0;52765:39;;;52757:90;;;;-1:-1:-1;;;52757:90:0;;;;;;;:::i;:::-;52860:25;:23;:25::i;:::-;52939:5;52898:24;52956:147;52980:6;:13;52976:1;:17;52956:147;;;53050:29;;-1:-1:-1;;;53050:29:0;;-1:-1:-1;;;;;53015:34:0;;;;;;;53050:26;;:29;;53077:1;;53050:29;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;53081:6;53088:1;53081:9;;;;;;;;;;;;;;53015:76;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;52995:3:0;;;;;-1:-1:-1;52956:147:0;;-1:-1:-1;52956:147:0;54113:300;54192:7;54253:5;54270:35;;:::i;:::-;54330:33;;-1:-1:-1;;;54330:33:0;;-1:-1:-1;;;;;54308:21:0;;;;;;;54330:26;;:33;;54357:5;;54330:33;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;54308:56;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;54382:23;;;;54113:300;-1:-1:-1;;;;54113:300:0:o;51866:168::-;51950:11;;51946:81;;51978:37;;-1:-1:-1;;;51978:37:0;;-1:-1:-1;;;;;51992:5:0;51978:28;;;;:37;;52007:7;;51978:37;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53118:452;53184:23;53243:16;;53229:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;53229:31:0;-1:-1:-1;53220:40:0;-1:-1:-1;53312:5:0;53329:35;;:::i;:::-;53380:9;53375:188;53395:16;;53391:1;:20;53375:188;;;53471:29;;-1:-1:-1;;;53471:29:0;;-1:-1:-1;;;;;53449:21:0;;;;;;;53471:26;;:29;;53498:1;;53471:29;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;53449:52;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;53433:68;;53528:13;:23;;;53516:6;53523:1;53516:9;;;;;;;;;;;;;;;;;:35;53413:3;;53375:188;;28629:380;28742:23;28768:69;28796:4;28768:69;;;;;;;;;;;;;;;;;28776:5;-1:-1:-1;;;;;28768:27:0;;;:69;;;;;:::i;:::-;28852:17;;28742:95;;-1:-1:-1;28852:21:0;28848:154;;28924:10;28913:30;;;;;;;;;;;;:::i;:::-;28905:85;;;;-1:-1:-1;;;28905:85:0;;;;;;;:::i;23954:480::-;24081:12;24139:5;24114:21;:30;;24106:81;;;;-1:-1:-1;;;24106:81:0;;;;;;;:::i;:::-;24206:18;24217:6;24206:10;:18::i;:::-;24198:60;;;;-1:-1:-1;;;24198:60:0;;;;;;;:::i;:::-;24282:12;24296:23;24323:6;-1:-1:-1;;;;;24323:11:0;24343:5;24351:4;24323:33;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24281:75;;;;24374:52;24392:7;24401:10;24413:12;24374:17;:52::i;:::-;24367:59;23954:480;-1:-1:-1;;;;;;;23954:480:0:o;5843:192::-;5929:7;5965:12;5957:6;;;;5949:29;;;;-1:-1:-1;;;5949:29:0;;;;;;;;:::i;:::-;-1:-1:-1;;;6001:5:0;;;5843:192::o;7678:201::-;7764:7;7799:12;7792:5;7784:28;;;;-1:-1:-1;;;7784:28:0;;;;;;;;:::i;:::-;;7823:9;7839:1;7835;:5;;;;;;;7678:201;-1:-1:-1;;;;;7678:201:0:o;52247:261::-;52342:5;52301:24;52359:142;52383:16;;52379:1;:20;52359:142;;;52456:29;;-1:-1:-1;;;52456:29:0;;-1:-1:-1;;;;;52421:34:0;;;;;;;52456:26;;:29;;52483:1;;52456:29;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;52487:1;52421:68;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;52401:3:0;;;;;-1:-1:-1;52359:142:0;;-1:-1:-1;52359:142:0;20696:216;20857:20;20896:8;;;20696:216::o;25390:567::-;25505:12;25534:7;25530:420;;;-1:-1:-1;25565:10:0;25558:17;;25530:420;25626:17;;:21;25622:317;;25767:10;25761:17;25828:15;25815:10;25811:2;25807:19;25800:44;25715:148;25910:12;25903:20;;-1:-1:-1;;;25903:20:0;;;;;;;;:::i;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;3491:241::-;;3595:2;3583:9;3574:7;3570:23;3566:32;3563:2;;;-1:-1;;3601:12;3563:2;85:6;72:20;97:33;124:5;97:33;:::i;3739:263::-;;3854:2;3842:9;3833:7;3829:23;3825:32;3822:2;;;-1:-1;;3860:12;3822:2;226:6;220:13;238:33;265:5;238:33;:::i;4009:397::-;;;4148:2;4136:9;4127:7;4123:23;4119:32;4116:2;;;-1:-1;;4154:12;4116:2;4212:17;4199:31;4250:18;;4242:6;4239:30;4236:2;;;-1:-1;;4272:12;4236:2;4373:6;4362:9;4358:22;;;431:3;424:4;416:6;412:17;408:27;398:2;;-1:-1;;439:12;398:2;482:6;469:20;4250:18;501:6;498:30;495:2;;;-1:-1;;531:12;495:2;626:3;4148:2;;610:6;606:17;567:6;592:32;;589:41;586:2;;;-1:-1;;633:12;586:2;4148;563:17;;;;;4292:98;;-1:-1;4110:296;;-1:-1;;;;4110:296::o;4413:392::-;;4553:2;;4541:9;4532:7;4528:23;4524:32;4521:2;;;-1:-1;;4559:12;4521:2;4610:17;4604:24;4648:18;4640:6;4637:30;4634:2;;;-1:-1;;4670:12;4634:2;4757:22;;800:4;788:17;;784:27;-1:-1;774:2;;-1:-1;;815:12;774:2;855:6;849:13;877:80;892:64;949:6;892:64;:::i;:::-;877:80;:::i;:::-;985:21;;;1042:14;;;;1017:17;;;1131;;;1122:27;;;;1119:36;-1:-1;1116:2;;;-1:-1;;1158:12;1116:2;-1:-1;1184:10;;1178:217;1203:6;1200:1;1197:13;1178:217;;;3428:13;;1271:61;;1225:1;1218:9;;;;;1346:14;;;;1374;;1178:217;;;-1:-1;4690:99;4515:290;-1:-1;;;;;;;4515:290::o;4812:235::-;;4913:2;4901:9;4892:7;4888:23;4884:32;4881:2;;;-1:-1;;4919:12;4881:2;1486:6;1473:20;1498:30;1522:5;1498:30;:::i;5054:257::-;;5166:2;5154:9;5145:7;5141:23;5137:32;5134:2;;;-1:-1;;5172:12;5134:2;1621:6;1615:13;1633:30;1657:5;1633:30;:::i;5318:328::-;;5465:3;;5453:9;5444:7;5440:23;5436:33;5433:2;;;-1:-1;;5472:12;5433:2;1873:22;5465:3;1873:22;:::i;:::-;1864:31;;2015:22;3428:13;1965:16;1958:86;2110:2;2179:9;2175:22;3428:13;2110:2;2129:5;2125:16;2118:86;2278:2;2347:9;2343:22;3428:13;2278:2;2297:5;2293:16;2286:86;2446:2;2515:9;2511:22;3428:13;2446:2;2465:5;2461:16;2454:86;2607:3;2677:9;2673:22;3428:13;2607:3;2627:5;2623:16;2616:86;2768:3;2838:9;2834:22;3428:13;2768:3;2788:5;2784:16;2777:86;2929:3;2999:9;2995:22;3428:13;2929:3;2949:5;2945:16;2938:86;3090:3;3160:9;3156:22;3428:13;3090:3;3110:5;3106:16;3099:86;5524:106;;;;5427:219;;;;:::o;5653:241::-;;5757:2;5745:9;5736:7;5732:23;5728:32;5725:2;;;-1:-1;;5763:12;5725:2;-1:-1;3280:20;;5719:175;-1:-1;5719:175::o;5901:263::-;;6016:2;6004:9;5995:7;5991:23;5987:32;5984:2;;;-1:-1;;6022:12;5984:2;-1:-1;3428:13;;5978:186;-1:-1;5978:186::o;6171:366::-;;;6292:2;6280:9;6271:7;6267:23;6263:32;6260:2;;;-1:-1;;6298:12;6260:2;3293:6;3280:20;6350:63;;6450:2;6493:9;6489:22;72:20;97:33;124:5;97:33;:::i;:::-;6458:63;;;;6254:283;;;;;:::o;6544:485::-;;;;6679:2;6667:9;6658:7;6654:23;6650:32;6647:2;;;-1:-1;;6685:12;6647:2;3293:6;3280:20;6737:63;;6837:2;6880:9;6876:22;72:20;97:33;124:5;97:33;:::i;:::-;6845:63;-1:-1;6945:2;6981:22;;1473:20;1498:30;1473:20;1498:30;:::i;:::-;6953:60;;;;6641:388;;;;;:::o;7036:491::-;;;;7174:2;7162:9;7153:7;7149:23;7145:32;7142:2;;;-1:-1;;7180:12;7142:2;3293:6;3280:20;7232:63;;7332:2;7375:9;7371:22;72:20;97:33;124:5;97:33;:::i;:::-;7136:391;;7340:63;;-1:-1;;;7440:2;7479:22;;;;3280:20;;7136:391::o;7534:366::-;;;7655:2;7643:9;7634:7;7630:23;7626:32;7623:2;;;-1:-1;;7661:12;7623:2;-1:-1;;3280:20;;;7813:2;7852:22;;;3280:20;;-1:-1;7617:283::o;7907:672::-;;;;;8073:3;8061:9;8052:7;8048:23;8044:33;8041:2;;;-1:-1;;8080:12;8041:2;-1:-1;;3428:13;;8243:2;8293:22;;3428:13;8362:2;8412:22;;3428:13;8481:2;8531:22;;;3428:13;;;;;-1:-1;3428:13;;-1:-1;8035:544;-1:-1;8035:544::o;9033:666::-;9401:21;9443:1;9428:259;35547:4;9450:1;9447:13;9428:259;;;9514:13;;-1:-1;;;;;36853:54;8829:37;;8749:4;8740:14;;;;35913;;;;4250:18;9468:9;9428:259;;18966:271;;10484:5;35655:12;10595:52;10640:6;10635:3;10628:4;10621:5;10617:16;10595:52;:::i;:::-;10659:16;;;;;19100:137;-1:-1;;19100:137::o;19244:222::-;-1:-1;;;;;36853:54;;;;8829:37;;19371:2;19356:18;;19342:124::o;19473:333::-;-1:-1;;;;;36853:54;;;8829:37;;36853:54;;19792:2;19777:18;;8829:37;19628:2;19613:18;;19599:207::o;19813:444::-;-1:-1;;;;;36853:54;;;8829:37;;36853:54;;;;20160:2;20145:18;;8829:37;20243:2;20228:18;;18803:37;;;;19996:2;19981:18;;19967:290::o;20264:349::-;-1:-1;;;;;36853:54;;;;8829:37;;20599:2;20584:18;;10766:58;20427:2;20412:18;;20398:215::o;20960:671::-;21227:3;21212:19;;21242:119;21216:9;21334:6;21242:119;:::i;:::-;21440:3;21425:19;;18803:37;;;;-1:-1;;;;;36853:54;;;;21524:3;21509:19;;8829:37;21616:3;21601:19;;;10766:58;21198:433;;-1:-1;21198:433::o;22316:390::-;22503:2;22517:47;;;22488:18;;36208:19;;;22316:390;-1:-1;;;;;9986:78;;9983:2;;;-1:-1;;10067:12;9983:2;22503;10102:6;10098:17;37414:6;37409:3;36248:14;22492:9;36248:14;37391:30;37452:16;;;;36248:14;37452:16;37445:27;;;37452:16;22474:232;-1:-1;;22474:232::o;22713:210::-;36765:13;;36758:21;10278:34;;22834:2;22819:18;;22805:118::o;22930:349::-;10766:58;;;23265:2;23250:18;;18803:37;23093:2;23078:18;;23064:215::o;23286:310::-;;23433:2;23454:17;23447:47;11130:5;35655:12;36220:6;23433:2;23422:9;23418:18;36208:19;11224:52;11269:6;36248:14;23422:9;36248:14;23433:2;11250:5;11246:16;11224:52;:::i;:::-;37847:7;37831:14;-1:-1;;37827:28;11288:39;;;;36248:14;11288:39;;23404:192;-1:-1;;23404:192::o;23603:416::-;23803:2;23817:47;;;11564:2;23788:18;;;36208:19;-1:-1;;;36248:14;;;11580:43;11642:12;;;23774:245::o;24026:416::-;24226:2;24240:47;;;11893:2;24211:18;;;36208:19;11929:25;36248:14;;;11909:46;11974:12;;;24197:245::o;24449:416::-;24649:2;24663:47;;;12225:2;24634:18;;;36208:19;12261:34;36248:14;;;12241:55;-1:-1;;;12316:12;;;12309:30;12358:12;;;24620:245::o;24872:416::-;25072:2;25086:47;;;12609:2;25057:18;;;36208:19;12645:29;36248:14;;;12625:50;12694:12;;;25043:245::o;25295:416::-;25495:2;25509:47;;;12945:2;25480:18;;;36208:19;12981:34;36248:14;;;12961:55;-1:-1;;;13036:12;;;13029:30;13078:12;;;25466:245::o;25718:416::-;25918:2;25932:47;;;13329:2;25903:18;;;36208:19;13365:29;36248:14;;;13345:50;13414:12;;;25889:245::o;26141:416::-;26341:2;26355:47;;;13665:2;26326:18;;;36208:19;13701:34;36248:14;;;13681:55;-1:-1;;;13756:12;;;13749:30;13798:12;;;26312:245::o;26564:416::-;26764:2;26778:47;;;14049:2;26749:18;;;36208:19;14085:34;36248:14;;;14065:55;-1:-1;;;14140:12;;;14133:30;14182:12;;;26735:245::o;26987:416::-;27187:2;27201:47;;;14433:2;27172:18;;;36208:19;14469:34;36248:14;;;14449:55;-1:-1;;;14524:12;;;14517:45;14581:12;;;27158:245::o;27410:416::-;27610:2;27624:47;;;14832:2;27595:18;;;36208:19;-1:-1;;;36248:14;;;14848:43;14910:12;;;27581:245::o;27833:416::-;28033:2;28047:47;;;15161:2;28018:18;;;36208:19;15197:34;36248:14;;;15177:55;-1:-1;;;15252:12;;;15245:25;15289:12;;;28004:245::o;28256:416::-;28456:2;28470:47;;;15540:2;28441:18;;;36208:19;-1:-1;;;36248:14;;;15556:41;15616:12;;;28427:245::o;28679:416::-;28879:2;28893:47;;;15867:2;28864:18;;;36208:19;-1:-1;;;36248:14;;;15883:41;15943:12;;;28850:245::o;29102:416::-;29302:2;29316:47;;;29287:18;;;36208:19;16230:34;36248:14;;;16210:55;16284:12;;;29273:245::o;29525:416::-;29725:2;29739:47;;;16535:2;29710:18;;;36208:19;-1:-1;;;36248:14;;;16551:43;16613:12;;;29696:245::o;29948:416::-;30148:2;30162:47;;;16864:2;30133:18;;;36208:19;-1:-1;;;36248:14;;;16880:37;16936:12;;;30119:245::o;30371:416::-;30571:2;30585:47;;;17187:2;30556:18;;;36208:19;17223:31;36248:14;;;17203:52;17274:12;;;30542:245::o;30794:416::-;30994:2;31008:47;;;17525:2;30979:18;;;36208:19;17561:34;36248:14;;;17541:55;-1:-1;;;17616:12;;;17609:34;17662:12;;;30965:245::o;31217:416::-;31417:2;31431:47;;;17913:2;31402:18;;;36208:19;-1:-1;;;36248:14;;;17929:36;17984:12;;;31388:245::o;31640:416::-;31840:2;31854:47;;;18235:2;31825:18;;;36208:19;-1:-1;;;36248:14;;;18251:36;18306:12;;;31811:245::o;32063:416::-;32263:2;32277:47;;;18557:2;32248:18;;;36208:19;18593:34;36248:14;;;18573:55;-1:-1;;;18648:12;;;18641:46;18706:12;;;32234:245::o;32486:222::-;18803:37;;;32613:2;32598:18;;32584:124::o;32715:460::-;18803:37;;;-1:-1;;;;;36853:54;;;;33070:2;33055:18;;8829:37;33161:2;33146:18;;10766:58;32906:2;32891:18;;32877:298::o;33989:556::-;18803:37;;;34365:2;34350:18;;18803:37;;;;34448:2;34433:18;;18803:37;34531:2;34516:18;;18803:37;34200:3;34185:19;;34171:374::o;34552:214::-;37069:4;37058:16;;;;18919:35;;34675:2;34660:18;;34646:120::o;34773:256::-;34835:2;34829:9;34861:17;;;34936:18;34921:34;;34957:22;;;34918:62;34915:2;;;34993:1;;34983:12;34915:2;34835;35002:22;34813:216;;-1:-1;34813:216::o;35036:304::-;;35195:18;35187:6;35184:30;35181:2;;;-1:-1;;35217:12;35181:2;-1:-1;35262:4;35250:17;;;35315:15;;35118:222::o;37487:268::-;37552:1;37559:101;37573:6;37570:1;37567:13;37559:101;;;37640:11;;;37634:18;37621:11;;;37614:39;37595:2;37588:10;37559:101;;;37675:6;37672:1;37669:13;37666:2;;;-1:-1;;37552:1;37722:16;;37715:27;37536:219::o;37868:117::-;-1:-1;;;;;36853:54;;37927:35;;37917:2;;37976:1;;37966:12;37992:111;38073:5;36765:13;36758:21;38051:5;38048:32;38038:2;;38094:1;;38084:12
Swarm Source
ipfs://24c103a501f40dff641fac1474b807231e9a929e8cdee31b383070cac449a44a
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.