More Info
Private Name Tags
ContractCreator:
Latest 25 from a total of 8,640 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
Value | ||||
---|---|---|---|---|---|---|---|---|---|
Panic | 56746332 | 392 days ago | IN | 0 FTM | 0.0264817 | ||||
Harvest | 56705118 | 393 days ago | IN | 0 FTM | 0.01526854 | ||||
Harvest | 56677235 | 393 days ago | IN | 0 FTM | 0.01523356 | ||||
Harvest | 56632618 | 394 days ago | IN | 0 FTM | 0.01457539 | ||||
Harvest | 56598743 | 394 days ago | IN | 0 FTM | 0.01145 | ||||
Harvest | 56575596 | 395 days ago | IN | 0 FTM | 0.01209699 | ||||
Harvest | 56550858 | 395 days ago | IN | 0 FTM | 0.0116629 | ||||
Harvest | 56528111 | 396 days ago | IN | 0 FTM | 0.01405529 | ||||
Harvest | 56499145 | 396 days ago | IN | 0 FTM | 0.0126138 | ||||
Harvest | 56472741 | 397 days ago | IN | 0 FTM | 0.01085441 | ||||
Harvest | 56449886 | 397 days ago | IN | 0 FTM | 0.02069453 | ||||
Harvest | 56407840 | 398 days ago | IN | 0 FTM | 0.01074898 | ||||
Harvest | 56384910 | 398 days ago | IN | 0 FTM | 0.01730855 | ||||
Harvest | 56324973 | 399 days ago | IN | 0 FTM | 0.01118521 | ||||
Harvest | 56300617 | 399 days ago | IN | 0 FTM | 0.01668283 | ||||
Harvest | 56170978 | 401 days ago | IN | 0 FTM | 0.0120767 | ||||
Harvest | 56144748 | 402 days ago | IN | 0 FTM | 0.0115432 | ||||
Harvest | 56121438 | 402 days ago | IN | 0 FTM | 0.01918975 | ||||
Harvest | 56083328 | 403 days ago | IN | 0 FTM | 0.01297359 | ||||
Harvest | 56056720 | 403 days ago | IN | 0 FTM | 0.02399527 | ||||
Harvest | 56015004 | 404 days ago | IN | 0 FTM | 0.03188727 | ||||
Harvest | 55960462 | 405 days ago | IN | 0 FTM | 0.03882977 | ||||
Harvest | 55809821 | 407 days ago | IN | 0 FTM | 0.0263589 | ||||
Harvest | 55763545 | 408 days ago | IN | 0 FTM | 0.01268264 | ||||
Harvest | 55742030 | 408 days ago | IN | 0 FTM | 0.01668328 |
Latest 1 internal transaction
Parent Txn Hash | Block | From | To | Value | ||
---|---|---|---|---|---|---|
37913153 | 688 days ago | Contract Creation | 0 FTM |
Loading...
Loading
Contract Name:
StrategyBeethovenxVoter
Compiler Version
v0.6.12+commit.27d51765
Contract Source Code (Solidity)
/** *Submitted for verification at ftmscan.com on 2022-05-09 */ // File @openzeppelin/contracts/utils/[email protected] // SPDX-License-Identifier: MIT 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; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 return msg.data; } } // File @openzeppelin/contracts/token/ERC20/[email protected] 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://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `sender` to `recipient` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); } // File @openzeppelin/contracts/math/[email protected] 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, with an overflow flag. * * _Available since v3.4._ */ function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) { uint256 c = a + b; if (c < a) return (false, 0); return (true, c); } /** * @dev Returns the substraction of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) { if (b > a) return (false, 0); return (true, a - b); } /** * @dev Returns the multiplication of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) return (true, 0); uint256 c = a * b; if (c / a != b) return (false, 0); return (true, c); } /** * @dev Returns the division of two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) { if (b == 0) return (false, 0); return (true, a / b); } /** * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) { if (b == 0) return (false, 0); return (true, a % b); } /** * @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) { require(b <= a, "SafeMath: subtraction overflow"); return a - b; } /** * @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, reverting 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) { require(b > 0, "SafeMath: division by zero"); return a / b; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting 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) { require(b > 0, "SafeMath: modulo by zero"); return a % b; } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {trySub}. * * 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); return a - b; } /** * @dev Returns the integer division of two unsigned integers, reverting with custom message on * division by zero. The result is rounded towards zero. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryDiv}. * * 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); return a / b; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting with custom message when dividing by zero. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryMod}. * * 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; } } // File @openzeppelin/contracts/token/ERC20/[email protected] 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://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How * 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 virtual returns (string memory) { return _name; } /** * @dev Returns the symbol of the token, usually a shorter version of the * name. */ function symbol() public view virtual 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 virtual returns (uint8) { return _decimals; } /** * @dev See {IERC20-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { return _totalSupply; } /** * @dev See {IERC20-balanceOf}. */ function balanceOf(address account) public view virtual 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 virtual { _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 { } } // File @openzeppelin/contracts/utils/[email protected] 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) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; // solhint-disable-next-line no-inline-assembly 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://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); // solhint-disable-next-line avoid-low-level-calls, avoid-call-value (bool success, ) = recipient.call{ value: amount }(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain`call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (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"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.staticcall(data); return _verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.delegatecall(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 { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly // solhint-disable-next-line no-inline-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File @openzeppelin/contracts/token/ERC20/[email protected] 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 { // safeApprove should only be called when setting an initial allowance, // or when resetting it to zero. To increase and decrease it, use // 'safeIncreaseAllowance' and 'safeDecreaseAllowance' // solhint-disable-next-line max-line-length require((value == 0) || (token.allowance(address(this), spender) == 0), "SafeERC20: approve from non-zero to non-zero allowance" ); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value)); } function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal { uint256 newAllowance = token.allowance(address(this), spender).add(value); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } function safeDecreaseAllowance(IERC20 token, address spender, uint256 value) internal { uint256 newAllowance = token.allowance(address(this), spender).sub(value, "SafeERC20: decreased allowance below zero"); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). */ function _callOptionalReturn(IERC20 token, bytes memory data) private { // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that // the target address contains contract code and also asserts for success in the low-level call. bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed"); if (returndata.length > 0) { // Return data is optional // solhint-disable-next-line max-line-length require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed"); } } } // File contracts/BIFI/interfaces/beethovenx/IBeethovenxChef.sol pragma solidity ^0.6.0; interface IBeethovenxChef { function deposit(uint256 _pid, uint256 _amount, address _to) external; function withdrawAndHarvest(uint256 _pid, uint256 _amount, address _to) external; function harvest(uint256 _pid, address _to) external; function userInfo(uint256 _pid, address _user) external view returns (uint256, uint256); function emergencyWithdraw(uint256 _pid, address _to) external; function pendingBeets(uint256 _pid, address _to) external view returns (uint256); function rewarder(uint256 _pid) external view returns (address); } // File contracts/BIFI/interfaces/beethovenx/IBalancerVault.sol pragma solidity ^0.6.0; pragma experimental ABIEncoderV2; interface IBalancerVault { function swap( SingleSwap memory singleSwap, FundManagement memory funds, uint256 limit, uint256 deadline ) external payable returns (uint256); function joinPool( bytes32 poolId, address sender, address recipient, JoinPoolRequest memory request ) external; function getPoolTokens(bytes32 poolId) external view returns ( address[] memory tokens, uint256[] memory balances, uint256 lastChangeBlock ); function getPool(bytes32 poolId) external view returns (address, uint8); struct SingleSwap { bytes32 poolId; SwapKind kind; address assetIn; address assetOut; uint256 amount; bytes userData; } struct FundManagement { address sender; bool fromInternalBalance; address payable recipient; bool toInternalBalance; } enum SwapKind { GIVEN_IN, GIVEN_OUT } struct JoinPoolRequest { address[] assets; uint256[] maxAmountsIn; bytes userData; bool fromInternalBalance; } } // File contracts/BIFI/interfaces/common/IBar.sol pragma solidity ^0.6.12; interface IBar { function enter(uint256 _amount) external; function leave(uint256 _share) external; } // File @openzeppelin/contracts/access/[email protected] 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 virtual 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; } } // File @openzeppelin/contracts/utils/[email protected] pragma solidity >=0.6.0 <0.8.0; /** * @dev Contract module which allows children to implement an emergency stop * mechanism that can be triggered by an authorized account. * * This module is used through inheritance. It will make available the * modifiers `whenNotPaused` and `whenPaused`, which can be applied to * the functions of your contract. Note that they will not be pausable by * simply including this module, only once the modifiers are put in place. */ abstract contract Pausable is Context { /** * @dev Emitted when the pause is triggered by `account`. */ event Paused(address account); /** * @dev Emitted when the pause is lifted by `account`. */ event Unpaused(address account); bool private _paused; /** * @dev Initializes the contract in unpaused state. */ constructor () internal { _paused = false; } /** * @dev Returns true if the contract is paused, and false otherwise. */ function paused() public view virtual returns (bool) { return _paused; } /** * @dev Modifier to make a function callable only when the contract is not paused. * * Requirements: * * - The contract must not be paused. */ modifier whenNotPaused() { require(!paused(), "Pausable: paused"); _; } /** * @dev Modifier to make a function callable only when the contract is paused. * * Requirements: * * - The contract must be paused. */ modifier whenPaused() { require(paused(), "Pausable: not paused"); _; } /** * @dev Triggers stopped state. * * Requirements: * * - The contract must not be paused. */ function _pause() internal virtual whenNotPaused { _paused = true; emit Paused(_msgSender()); } /** * @dev Returns to normal state. * * Requirements: * * - The contract must be paused. */ function _unpause() internal virtual whenPaused { _paused = false; emit Unpaused(_msgSender()); } } // File contracts/BIFI/strategies/Common/StratManager.sol pragma solidity ^0.6.12; contract StratManager is Ownable, Pausable { /** * @dev Beefy Contracts: * {keeper} - Address to manage a few lower risk features of the strat * {strategist} - Address of the strategy author/deployer where strategist fee will go. * {vault} - Address of the vault that controls the strategy's funds. * {unirouter} - Address of exchange to execute swaps. */ address public keeper; address public strategist; address public unirouter; address public vault; address public beefyFeeRecipient; /** * @dev Initializes the base strategy. * @param _keeper address to use as alternative owner. * @param _strategist address where strategist fees go. * @param _unirouter router to use for swaps * @param _vault address of parent vault. * @param _beefyFeeRecipient address where to send Beefy's fees. */ constructor( address _keeper, address _strategist, address _unirouter, address _vault, address _beefyFeeRecipient ) public { keeper = _keeper; strategist = _strategist; unirouter = _unirouter; vault = _vault; beefyFeeRecipient = _beefyFeeRecipient; } // checks that caller is either owner or keeper. modifier onlyManager() { require(msg.sender == owner() || msg.sender == keeper, "!manager"); _; } /** * @dev Updates address of the strat keeper. * @param _keeper new keeper address. */ function setKeeper(address _keeper) external onlyManager { keeper = _keeper; } /** * @dev Updates address where strategist fee earnings will go. * @param _strategist new strategist address. */ function setStrategist(address _strategist) external { require(msg.sender == strategist, "!strategist"); strategist = _strategist; } /** * @dev Updates router that will be used for swaps. * @param _unirouter new unirouter address. */ function setUnirouter(address _unirouter) external onlyOwner { unirouter = _unirouter; } /** * @dev Updates parent vault. * @param _vault new vault address. */ function setVault(address _vault) external onlyOwner { vault = _vault; } /** * @dev Updates beefy fee recipient. * @param _beefyFeeRecipient new beefy fee recipient address. */ function setBeefyFeeRecipient(address _beefyFeeRecipient) external onlyOwner { beefyFeeRecipient = _beefyFeeRecipient; } /** * @dev Function to synchronize balances before new user deposit. * Can be overridden in the strategy. */ function beforeDeposit() external virtual {} } // File contracts/BIFI/strategies/Common/FeeManager.sol pragma solidity ^0.6.12; abstract contract FeeManager is StratManager { uint constant public STRATEGIST_FEE = 112; uint constant public MAX_FEE = 1000; uint constant public MAX_CALL_FEE = 111; uint constant public WITHDRAWAL_FEE_CAP = 50; uint constant public WITHDRAWAL_MAX = 10000; uint public withdrawalFee = 10; uint public callFee = 111; uint public beefyFee = MAX_FEE - STRATEGIST_FEE - callFee; function setCallFee(uint256 _fee) public onlyManager { require(_fee <= MAX_CALL_FEE, "!cap"); callFee = _fee; beefyFee = MAX_FEE - STRATEGIST_FEE - callFee; } function setWithdrawalFee(uint256 _fee) public onlyManager { require(_fee <= WITHDRAWAL_FEE_CAP, "!cap"); withdrawalFee = _fee; } } // File contracts/BIFI/strategies/Beethovenx/StrategyBeethovenxfBeets.sol pragma solidity ^0.6.0; contract StrategyBeethovenxfBeets is StratManager, FeeManager { using SafeERC20 for IERC20; using SafeMath for uint256; // Tokens used address public want; address public output = address(0xF24Bcf4d1e507740041C9cFd2DddB29585aDCe1e); address public native = address(0x21be370D5312f44cB42ce377BC9b8a0cEF1A4C83); address public bar = address(0xfcef8a994209d6916EB2C86cDD2AFD60Aa6F54b1); address public input; address[] public lpTokens; // Third party contracts address public chef; uint256 public chefPoolId; bytes32 public wantPoolId; bytes32 public nativeSwapPoolId; bytes32 public inputSwapPoolId; IBalancerVault.SwapKind public swapKind; IBalancerVault.FundManagement public funds; bool public harvestOnDeposit; uint256 public lastHarvest; event StratHarvest(address indexed harvester, uint256 wantHarvested, uint256 tvl); event Deposit(uint256 tvl); event Withdraw(uint256 tvl); event ChargedFees(uint256 callFees, uint256 beefyFees, uint256 strategistFees); constructor( bytes32[] memory _balancerPoolIds, uint256 _chefPoolId, address _chef, address _input, address _vault, address _unirouter, address _keeper, address _strategist, address _beefyFeeRecipient ) StratManager(_keeper, _strategist, _unirouter, _vault, _beefyFeeRecipient) public { wantPoolId = _balancerPoolIds[0]; nativeSwapPoolId = _balancerPoolIds[1]; inputSwapPoolId = _balancerPoolIds[2]; chefPoolId = _chefPoolId; chef = _chef; (want,) = IBalancerVault(unirouter).getPool(wantPoolId); input = _input; (lpTokens,,) = IBalancerVault(unirouter).getPoolTokens(wantPoolId); swapKind = IBalancerVault.SwapKind.GIVEN_IN; funds = IBalancerVault.FundManagement(address(this), false, payable(address(this)), false); _giveAllowances(); } // puts the funds to work function deposit() public whenNotPaused { uint256 wantBal = IERC20(want).balanceOf(address(this)); if (wantBal > 0) { IBar(bar).enter(wantBal); IBeethovenxChef(chef).deposit(chefPoolId, balanceOfBar(), address(this)); emit Deposit(balanceOf()); } } function withdraw(uint256 _amount) external { require(msg.sender == vault, "!vault"); uint256 wantBal = IERC20(want).balanceOf(address(this)); if (wantBal < _amount) { IBeethovenxChef(chef).withdrawAndHarvest(chefPoolId, tokenForBarToken(_amount.sub(wantBal)), address(this)); IBar(bar).leave(balanceOfBar()); wantBal = IERC20(want).balanceOf(address(this)); } if (wantBal > _amount) { wantBal = _amount; } if (tx.origin != owner() && !paused()) { uint256 withdrawalFeeAmount = wantBal.mul(withdrawalFee).div(WITHDRAWAL_MAX); wantBal = wantBal.sub(withdrawalFeeAmount); } IERC20(want).safeTransfer(vault, wantBal); emit Withdraw(balanceOf()); } function beforeDeposit() external virtual override { if (harvestOnDeposit) { require(msg.sender == vault, "!vault"); _harvest(tx.origin); } } function harvest() external virtual { _harvest(tx.origin); } function harvest(address callFeeRecipient) external virtual { _harvest(callFeeRecipient); } function managerHarvest() external onlyManager { _harvest(tx.origin); } // compounds earnings and charges performance fee function _harvest(address callFeeRecipient) internal whenNotPaused { IBeethovenxChef(chef).harvest(chefPoolId, address(this)); uint256 outputBal = IERC20(output).balanceOf(address(this)); if (outputBal > 0) { chargeFees(callFeeRecipient); addLiquidity(); uint256 wantHarvested = balanceOfWant(); deposit(); lastHarvest = block.timestamp; emit StratHarvest(msg.sender, wantHarvested, balanceOf()); } } // performance fees function chargeFees(address callFeeRecipient) internal { uint256 toNative = IERC20(output).balanceOf(address(this)); if (input != native) { toNative = toNative.mul(45).div(1000); } balancerSwap(nativeSwapPoolId, output, native, toNative); uint256 nativeBal = IERC20(native).balanceOf(address(this)); if (input == native) { nativeBal = nativeBal.mul(45).div(1000); } uint256 callFeeAmount = nativeBal.mul(callFee).div(MAX_FEE); IERC20(native).safeTransfer(callFeeRecipient, callFeeAmount); uint256 beefyFeeAmount = nativeBal.mul(beefyFee).div(MAX_FEE); IERC20(native).safeTransfer(beefyFeeRecipient, beefyFeeAmount); uint256 strategistFeeAmount = nativeBal.mul(STRATEGIST_FEE).div(MAX_FEE); IERC20(native).safeTransfer(strategist, strategistFeeAmount); emit ChargedFees(callFeeAmount, beefyFeeAmount, strategistFeeAmount); } // Adds liquidity to AMM and gets more LP tokens. function addLiquidity() internal { if (input != output && input != native) { uint256 outputBal = IERC20(output).balanceOf(address(this)); balancerSwap(inputSwapPoolId, output, input, outputBal); } uint256 inputBal = IERC20(input).balanceOf(address(this)); balancerJoin(wantPoolId, input, inputBal); } function balancerSwap(bytes32 _poolId, address _tokenIn, address _tokenOut, uint256 _amountIn) internal returns (uint256) { IBalancerVault.SingleSwap memory singleSwap = IBalancerVault.SingleSwap(_poolId, swapKind, _tokenIn, _tokenOut, _amountIn, ""); return IBalancerVault(unirouter).swap(singleSwap, funds, 1, now); } function balancerJoin(bytes32 _poolId, address _tokenIn, uint256 _amountIn) internal { uint256[] memory amounts = new uint256[](lpTokens.length); for (uint256 i = 0; i < amounts.length; i++) { amounts[i] = lpTokens[i] == _tokenIn ? _amountIn : 0; } bytes memory userData = abi.encode(1, amounts, 1); IBalancerVault.JoinPoolRequest memory request = IBalancerVault.JoinPoolRequest(lpTokens, amounts, userData, false); IBalancerVault(unirouter).joinPool(_poolId, address(this), address(this), request); } // calculate the total underlaying 'want' held by the strat. function balanceOf() public view returns (uint256) { return balanceOfWant().add(balanceOfPool()); } // it calculates how much 'want' this contract holds. function balanceOfWant() public view returns (uint256) { return IERC20(want).balanceOf(address(this)); } // it calculates how much 'want' the strategy has working in the farm. function balanceOfPool() public view returns (uint256) { (uint256 barAmount,) = IBeethovenxChef(chef).userInfo(chefPoolId, address(this)); uint256 _amount = barTokenForToken(barAmount); return _amount; } // it calculates how much 'bar' this contract holds. function balanceOfBar() public view returns (uint256) { return IERC20(bar).balanceOf(address(this)); } // returns rewards unharvested function rewardsAvailable() public view returns (uint256) { return IBeethovenxChef(chef).pendingBeets(chefPoolId, address(this)); } // native reward amount for calling harvest function callReward() public returns (uint256) { IBeethovenxChef(chef).harvest(chefPoolId, address(this)); uint256 outputBal = IERC20(output).balanceOf(address(this)); uint256 nativeOut; if (outputBal > 0) { nativeOut = balancerSwap(nativeSwapPoolId, output, native, outputBal); } return nativeOut.mul(45).div(1000).mul(callFee).div(MAX_FEE); } function setHarvestOnDeposit(bool _harvestOnDeposit) external onlyManager { harvestOnDeposit = _harvestOnDeposit; if (harvestOnDeposit) { setWithdrawalFee(0); } else { setWithdrawalFee(10); } } // called as part of strat migration. Sends all the available funds back to the vault. function retireStrat() external { require(msg.sender == vault, "!vault"); IBeethovenxChef(chef).emergencyWithdraw(chefPoolId, address(this)); IBar(bar).leave(balanceOfBar()); uint256 wantBal = IERC20(want).balanceOf(address(this)); IERC20(want).transfer(vault, wantBal); } // pauses deposits and withdraws all funds from third party systems. function panic() public onlyManager { pause(); IBeethovenxChef(chef).emergencyWithdraw(chefPoolId, address(this)); IBar(bar).leave(balanceOfBar()); } function pause() public onlyManager { _pause(); _removeAllowances(); } function unpause() external onlyManager { _unpause(); _giveAllowances(); deposit(); } function _giveAllowances() internal { IERC20(want).safeApprove(bar, uint256(-1)); IERC20(bar).safeApprove(chef, uint256(-1)); IERC20(output).safeApprove(unirouter, uint256(-1)); IERC20(input).safeApprove(unirouter, 0); IERC20(input).safeApprove(unirouter, uint256(-1)); } function _removeAllowances() internal { IERC20(want).safeApprove(bar, 0); IERC20(bar).safeApprove(chef, 0); IERC20(output).safeApprove(unirouter, 0); IERC20(input).safeApprove(unirouter, 0); } function nativeSwapPool() external view returns (bytes32) { return nativeSwapPoolId; } function inputSwapPool() external view returns (bytes32) { return inputSwapPoolId; } function exchangeRate() internal view returns (uint256) { return IERC20(want).balanceOf(address(bar)).mul(1e18).div(IERC20(bar).totalSupply()); } function barTokenForToken(uint256 _amount) internal view returns (uint256) { return _amount.mul(exchangeRate()).div(1e18); } function tokenForBarToken(uint256 _amount) internal view returns (uint256) { return _amount.mul(1e18).div(exchangeRate()); } } // File contracts/BIFI/interfaces/common/IDelegateManagerCommon.sol pragma solidity ^0.6.0; interface IDelegateManagerCommon { function setDelegate(bytes32 _id, address _voter) external; function clearDelegate(bytes32 _id) external; function delegation(address _voteHolder, bytes32 _id) external view returns (address); } // File contracts/BIFI/strategies/Common/DelegateManagerCommon.sol pragma solidity ^0.6.0; abstract contract DelegateManagerCommon is StratManager { /** * @dev Contracts: * {delegateManagerCommon} - Address for Snapshot delegation */ IDelegateManagerCommon public delegateManager = IDelegateManagerCommon(0x469788fE6E9E9681C6ebF3bF78e7Fd26Fc015446); bytes32 public id; // Snapshot ENS // Contract Events event NewVoter(address newVoter); event NewVoterParams(IDelegateManagerCommon newDelegateManager, bytes32 newId); /** * @dev Initializes the base strategy. */ constructor (bytes32 _id) public { id = _id; _setVoteDelegation(keeper); } // set voter params function setVoterParams(IDelegateManagerCommon _delegationManager, bytes32 _newId) external onlyManager { emit NewVoterParams(_delegationManager, _newId); delegateManager = _delegationManager; id = _newId; } // set vote delegation function setVoteDelegation (address _voter) external onlyManager { _setVoteDelegation(_voter); } function _setVoteDelegation(address _voter) internal { emit NewVoter(_voter); delegateManager.setDelegate(id, _voter); } // clear vote delegation function clearVoteDelegation() external onlyManager { delegateManager.clearDelegate(id); } function currentVoter() external view returns (address) { return delegateManager.delegation(address(this), id); } } // File contracts/BIFI/strategies/Beethovenx/StrategyBeethovenxVoter.sol pragma solidity ^0.6.0; contract StrategyBeethovenxVoter is StrategyBeethovenxfBeets, DelegateManagerCommon { constructor( bytes32[] memory _balancerPoolIds, uint256 _chefPoolId, address _chef, address _input, address _vault, address _unirouter, address _keeper, address _strategist, address _beefyFeeRecipient ) StrategyBeethovenxfBeets( _balancerPoolIds, _chefPoolId, _chef, _input, _vault, _unirouter, _keeper, _strategist, _beefyFeeRecipient ) DelegateManagerCommon(bytes32(0x62656574732e6574680000000000000000000000000000000000000000000000)) public {} function beforeDeposit() external virtual override(StratManager, StrategyBeethovenxfBeets) { if (harvestOnDeposit) { require(msg.sender == vault, "!vault"); _harvest(tx.origin); } } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"bytes32[]","name":"_balancerPoolIds","type":"bytes32[]"},{"internalType":"uint256","name":"_chefPoolId","type":"uint256"},{"internalType":"address","name":"_chef","type":"address"},{"internalType":"address","name":"_input","type":"address"},{"internalType":"address","name":"_vault","type":"address"},{"internalType":"address","name":"_unirouter","type":"address"},{"internalType":"address","name":"_keeper","type":"address"},{"internalType":"address","name":"_strategist","type":"address"},{"internalType":"address","name":"_beefyFeeRecipient","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"callFees","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"beefyFees","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"strategistFees","type":"uint256"}],"name":"ChargedFees","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tvl","type":"uint256"}],"name":"Deposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"newVoter","type":"address"}],"name":"NewVoter","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"contract IDelegateManagerCommon","name":"newDelegateManager","type":"address"},{"indexed":false,"internalType":"bytes32","name":"newId","type":"bytes32"}],"name":"NewVoterParams","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"harvester","type":"address"},{"indexed":false,"internalType":"uint256","name":"wantHarvested","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"tvl","type":"uint256"}],"name":"StratHarvest","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tvl","type":"uint256"}],"name":"Withdraw","type":"event"},{"inputs":[],"name":"MAX_CALL_FEE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_FEE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"STRATEGIST_FEE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"WITHDRAWAL_FEE_CAP","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"WITHDRAWAL_MAX","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"balanceOfBar","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"balanceOfPool","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"balanceOfWant","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"bar","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"beefyFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"beefyFeeRecipient","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"beforeDeposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"callFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"callReward","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"chef","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"chefPoolId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"clearVoteDelegation","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"currentVoter","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"delegateManager","outputs":[{"internalType":"contract IDelegateManagerCommon","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"deposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"funds","outputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"bool","name":"fromInternalBalance","type":"bool"},{"internalType":"address payable","name":"recipient","type":"address"},{"internalType":"bool","name":"toInternalBalance","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"callFeeRecipient","type":"address"}],"name":"harvest","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"harvest","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"harvestOnDeposit","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"id","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"input","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"inputSwapPool","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"inputSwapPoolId","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"keeper","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastHarvest","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"lpTokens","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"managerHarvest","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"native","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nativeSwapPool","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nativeSwapPoolId","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"output","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"panic","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"retireStrat","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"rewardsAvailable","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_beefyFeeRecipient","type":"address"}],"name":"setBeefyFeeRecipient","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_fee","type":"uint256"}],"name":"setCallFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_harvestOnDeposit","type":"bool"}],"name":"setHarvestOnDeposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_keeper","type":"address"}],"name":"setKeeper","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_strategist","type":"address"}],"name":"setStrategist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_unirouter","type":"address"}],"name":"setUnirouter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_vault","type":"address"}],"name":"setVault","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_voter","type":"address"}],"name":"setVoteDelegation","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IDelegateManagerCommon","name":"_delegationManager","type":"address"},{"internalType":"bytes32","name":"_newId","type":"bytes32"}],"name":"setVoterParams","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_fee","type":"uint256"}],"name":"setWithdrawalFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"strategist","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"swapKind","outputs":[{"internalType":"enum IBalancerVault.SwapKind","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unirouter","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"vault","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"want","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"wantPoolId","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawalFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
6080604052600a6006819055606f60075561030960085580546001600160a01b031990811673f24bcf4d1e507740041c9cfd2dddb29585adce1e17909155600b805482167321be370d5312f44cb42ce377bc9b8a0cef1a4c83179055600c8054821673fcef8a994209d6916eb2c86cdd2afd60aa6f54b11790556019805490911673469788fe6e9e9681c6ebf3bf78e7fd26fc015446179055348015620000a557600080fd5b50604051620041c6380380620041c6833981016040819052620000c89162000ab1565b680c4cacae8e65ccae8d60bb1b89898989898989898982828587846000620000ef62000401565b600080546001600160a01b0319166001600160a01b0383169081178255604051929350917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a3506000805460ff60a01b19168155600180546001600160a01b03199081166001600160a01b039889161790915560028054821696881696909617909555600380548616948716949094179093556004805485169286169290921790915560058054909316931692909217905589518a9190620001b057fe5b602002602001015160118190555088600181518110620001cc57fe5b602002602001015160128190555088600281518110620001e857fe5b60209081029190910101516013556010889055600f80546001600160a01b0319166001600160a01b038981169190911790915560035460115460405163f6c0092760e01b8152919092169163f6c009279162000248919060040162000c83565b604080518083038186803b1580156200026057600080fd5b505afa15801562000275573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200029b91906200098d565b50600980546001600160a01b03199081166001600160a01b0393841617909155600d8054909116888316179055600354601154604051631f29a8cd60e31b8152919092169163f94d466891620002f5919060040162000c83565b60006040518083038186803b1580156200030e57600080fd5b505afa15801562000323573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526200034d9190810190620009d9565b505080516200036490600e9060208401906200086e565b50506014805460ff1916905560408051608081018252308082526000602083018190529282018190526060909101919091526015805460ff60a01b196001600160a01b03199182168417811690925560168054909116909217169055620003ca62000405565b505050601a8790555050600154620003f194506001600160a01b0316925050620004e79050565b5050505050505050505062000e76565b3390565b600c5460095462000432916001600160a01b0391821691166000196200058c602090811b62001b1117901c565b600f54600c546200045f916001600160a01b0391821691166000196200058c602090811b62001b1117901c565b600354600a546200048c916001600160a01b0391821691166000196200058c602090811b62001b1117901c565b600354600d54620004b8916001600160a01b03918216911660006200058c602090811b62001b1117901c565b600354600d54620004e5916001600160a01b0391821691166000196200058c602090811b62001b1117901c565b565b7f668b14b635e60c984edc522ab57ecf4f7df5f95e912da87692905dc5aa1114878160405162000518919062000c3c565b60405180910390a1601954601a546040516317b0dca160e31b81526001600160a01b039092169163bd86e508916200055591859060040162000c8c565b600060405180830381600087803b1580156200057057600080fd5b505af115801562000585573d6000803e3d6000fd5b5050505050565b8015806200061b5750604051636eb1769f60e11b81526001600160a01b0384169063dd62ed3e90620005c5903090869060040162000c50565b60206040518083038186803b158015620005de57600080fd5b505afa158015620005f3573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000619919062000c05565b155b620006435760405162461bcd60e51b81526004016200063a9062000d9f565b60405180910390fd5b6200069e8363095ea7b360e01b84846040516024016200066592919062000c6a565b60408051808303601f190181529190526020810180516001600160e01b0319939093166001600160e01b0393841617905290620006a316565b505050565b6060620006ff826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166200073f60201b62001c10179092919060201c565b8051909150156200069e578080602001905181019062000720919062000be3565b6200069e5760405162461bcd60e51b81526004016200063a9062000d55565b60606200075084846000856200075a565b90505b9392505050565b6060824710156200077f5760405162461bcd60e51b81526004016200063a9062000cd8565b6200078a856200082a565b620007a95760405162461bcd60e51b81526004016200063a9062000d1e565b60006060866001600160a01b03168587604051620007c8919062000c1e565b60006040518083038185875af1925050503d806000811462000807576040519150601f19603f3d011682016040523d82523d6000602084013e6200080c565b606091505b5090925090506200081f82828662000830565b979650505050505050565b3b151590565b606083156200084157508162000753565b825115620008525782518084602001fd5b8160405162461bcd60e51b81526004016200063a919062000ca3565b828054828255906000526020600020908101928215620008c6579160200282015b82811115620008c657825182546001600160a01b0319166001600160a01b039091161782556020909201916001909101906200088f565b50620008d4929150620008d8565b5090565b5b80821115620008d45780546001600160a01b0319168155600101620008d9565b80516001600160a01b03811681146200091157600080fd5b92915050565b600082601f83011262000928578081fd5b81516200093f620009398262000e23565b62000dfc565b8181529150602080830190848101818402860182018710156200096157600080fd5b60005b84811015620009825781518452928201929082019060010162000964565b505050505092915050565b60008060408385031215620009a0578182fd5b82516001600160a01b0381168114620009b7578283fd5b602084015190925060ff81168114620009ce578182fd5b809150509250929050565b600080600060608486031215620009ee578081fd5b83516001600160401b038082111562000a05578283fd5b818601915086601f83011262000a19578283fd5b815162000a2a620009398262000e23565b80828252602080830192508086018b82838702890101111562000a4b578788fd5b8796505b8487101562000a795762000a648c82620008f9565b84526001969096019592810192810162000a4f565b50890151909750935050508082111562000a91578283fd5b5062000aa08682870162000917565b925050604084015190509250925092565b60008060008060008060008060006101208a8c03121562000ad0578485fd5b89516001600160401b0381111562000ae6578586fd5b8a01601f81018c1362000af7578586fd5b805162000b08620009398262000e23565b80828252602082019150602084018f6020808602870101111562000b2a57898afd5b8994505b8385101562000b4f5780518352600194909401936020928301920162000b2e565b50809c505050505060208a0151975062000b6d8b60408c01620008f9565b965062000b7e8b60608c01620008f9565b955062000b8f8b60808c01620008f9565b945062000ba08b60a08c01620008f9565b935062000bb18b60c08c01620008f9565b925062000bc28b60e08c01620008f9565b915062000bd48b6101008c01620008f9565b90509295985092959850929598565b60006020828403121562000bf5578081fd5b8151801515811462000753578182fd5b60006020828403121562000c17578081fd5b5051919050565b6000825162000c3281846020870162000e43565b9190910192915050565b6001600160a01b0391909116815260200190565b6001600160a01b0392831681529116602082015260400190565b6001600160a01b03929092168252602082015260400190565b90815260200190565b9182526001600160a01b0316602082015260400190565b600060208252825180602084015262000cc481604085016020870162000e43565b601f01601f19169190910160400192915050565b60208082526026908201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6040820152651c8818d85b1b60d21b606082015260800190565b6020808252601d908201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604082015260600190565b6020808252602a908201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6040820152691bdd081cdd58d8d9595960b21b606082015260800190565b60208082526036908201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60408201527f20746f206e6f6e2d7a65726f20616c6c6f77616e636500000000000000000000606082015260800190565b6040518181016001600160401b038111828210171562000e1b57600080fd5b604052919050565b60006001600160401b0382111562000e39578081fd5b5060209081020190565b60005b8381101562000e6057818101518382015260200162000e46565b8381111562000e70576000848401525b50505050565b6133408062000e866000396000f3fe608060405234801561001057600080fd5b50600436106103d05760003560e01c80638912cb8b116101ff578063d0e30db01161011a578063e7a7250a116100ad578063f2fde38b1161007c578063f2fde38b14610693578063fb617787146106a6578063fbfa77cf146106ae578063febb0f7e146106b6576103d0565b8063e7a7250a14610673578063eaed3f4f1461067b578063f1a392da14610683578063f20eaeb81461068b576103d0565b8063d83d9ef4116100e9578063d83d9ef41461063d578063d92f3d7314610650578063de39da5f14610663578063dfbdc4371461066b576103d0565b8063d0e30db014610612578063d31025891461061a578063d72f520114610622578063d801d94614610635576103d0565b8063ac1e502511610192578063bc063e1a11610161578063bc063e1a146105d7578063c1a3d44c146105df578063c7b9d530146105e7578063c89f2ce4146105fa576103d0565b8063ac1e5025146105ac578063aced1661146105bf578063af640d0f146105c7578063b9efdda3146105cf576103d0565b806390321e1a116101ce57806390321e1a1461058157806397fd323d14610589578063a07cb27e14610591578063a68833e514610599576103d0565b80638912cb8b146105615780638bc7e8c4146105695780638da5cb5b146105715780638e14545914610579576103d0565b80633e2d57cc116102ef5780635d1eb24411610282578063722713f711610251578063722713f714610536578063748747e61461053e5780637d38ca65146105515780638456cb5914610559576103d0565b80635d1eb244146104fe578063671f6a26146105065780636817031b1461051b578063715018a61461052e576103d0565b80634d651e4b116102be5780634d651e4b146104d157806354518b1a146104d9578063573fef0a146104e15780635c975abb146104e9576103d0565b80633e2d57cc146104b15780633f4ba83a146104b95780634641257d146104c15780634700d305146104c9576103d0565b80631fe4a686116103675780632e1a7d4d116103365780632e1a7d4d14610486578063363b048514610499578063388e9104146104a15780633d2f8c87146104a9576103d0565b80631fe4a6861461045b578063257ae0de14610463578063264658261461046b5780632ad5a53f1461047e576103d0565b80631bb5e2dc116103a35780631bb5e2dc146104305780631cc8aa42146104435780631f1fcd511461044b5780631fc8bc5d14610453576103d0565b80630e5c011e146103d55780630e8fbb5a146103ea57806311588086146103fd57806311b0b42d1461041b575b600080fd5b6103e86103e3366004612b1d565b6106be565b005b6103e86103f8366004612b55565b6106ca565b610405610751565b6040516104129190612d49565b60405180910390f35b6104236107ed565b6040516104129190612ccd565b61042361043e366004612bb8565b6107fc565b6103e8610823565b6104236108d5565b6104236108e4565b6104236108f3565b610423610902565b6103e8610479366004612bb8565b610911565b61040561098d565b6103e8610494366004612bb8565b610992565b610405610c7e565b610423610c84565b610405610c93565b610405610c99565b6103e8610c9f565b6103e8610d06565b6103e8610d0f565b610405610e00565b610405610e06565b6103e8610e0c565b6104f1610e41565b6040516104129190612d3e565b610405610e51565b61050e610e57565b6040516104129190612e31565b6103e8610529366004612b1d565b610e60565b6103e8610ec1565b610405610f4a565b6103e861054c366004612b1d565b610f6a565b610405610fd9565b6103e8610fde565b6104f161103b565b610405611044565b61042361104a565b610423611059565b610405611068565b61040561106e565b6104056111b2565b6103e86105a7366004612b1d565b6111b8565b6103e86105ba366004612bb8565b611219565b61042361128c565b61040561129b565b6104236112a1565b610405611325565b61040561132b565b6103e86105f5366004612b1d565b6113ac565b6106026113f8565b6040516104129493929190612cfb565b6103e8611424565b6104056115e6565b6103e8610630366004612b8d565b6115ec565b6103e8611698565b6103e861064b366004612b1d565b6116e5565b6103e861065e366004612b1d565b61173b565b61040561179c565b6104056117cd565b6104056117d2565b610423611806565b610405611815565b61042361181b565b6103e86106a1366004612b1d565b61182a565b6103e86118ea565b610423611af3565b610423611b02565b6106c781611c29565b50565b6106d261104a565b6001600160a01b0316336001600160a01b031614806106fb57506001546001600160a01b031633145b6107205760405162461bcd60e51b815260040161071790613121565b60405180910390fd5b6017805460ff1916821515179081905560ff1615610747576107426000611219565b6106c7565b6106c7600a611219565b600f546010546040516393f1a40b60e01b815260009283926001600160a01b03909116916393f1a40b91610789913090600401612d52565b604080518083038186803b1580156107a057600080fd5b505afa1580156107b4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107d89190612be8565b50905060006107e682611dad565b9250505090565b600b546001600160a01b031681565b600e818154811061080957fe5b6000918252602090912001546001600160a01b0316905081565b61082b61104a565b6001600160a01b0316336001600160a01b0316148061085457506001546001600160a01b031633145b6108705760405162461bcd60e51b815260040161071790613121565b601954601a5460405163785f6df160e11b81526001600160a01b039092169163f0bedbe2916108a191600401612d49565b600060405180830381600087803b1580156108bb57600080fd5b505af11580156108cf573d6000803e3d6000fd5b50505050565b6009546001600160a01b031681565b600f546001600160a01b031681565b6002546001600160a01b031681565b6003546001600160a01b031681565b61091961104a565b6001600160a01b0316336001600160a01b0316148061094257506001546001600160a01b031633145b61095e5760405162461bcd60e51b815260040161071790613121565b606f81111561097f5760405162461bcd60e51b815260040161071790613036565b600781905561037803600855565b606f81565b6004546001600160a01b031633146109bc5760405162461bcd60e51b815260040161071790613095565b6009546040516370a0823160e01b81526000916001600160a01b0316906370a08231906109ed903090600401612ccd565b60206040518083038186803b158015610a0557600080fd5b505afa158015610a19573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a3d9190612bd0565b905081811015610bae57600f546010546001600160a01b039091169063d1abb90790610a71610a6c8686611dd5565b611e02565b306040518463ffffffff1660e01b8152600401610a909392919061327b565b600060405180830381600087803b158015610aaa57600080fd5b505af1158015610abe573d6000803e3d6000fd5b5050600c546001600160a01b031691506367dfd4c99050610add61179c565b6040518263ffffffff1660e01b8152600401610af99190612d49565b600060405180830381600087803b158015610b1357600080fd5b505af1158015610b27573d6000803e3d6000fd5b50506009546040516370a0823160e01b81526001600160a01b0390911692506370a082319150610b5b903090600401612ccd565b60206040518083038186803b158015610b7357600080fd5b505afa158015610b87573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bab9190612bd0565b90505b81811115610bb95750805b610bc161104a565b6001600160a01b0316326001600160a01b031614158015610be75750610be5610e41565b155b15610c1f576000610c0f612710610c0960065485611e1d90919063ffffffff16565b90611e57565b9050610c1b8282611dd5565b9150505b600454600954610c3c916001600160a01b03918216911683611e89565b7f5b6b431d4476a211bb7d41c20d1aab9ae2321deee0d20be3d9fc9b1093fa6e3d610c65610f4a565b604051610c729190612d49565b60405180910390a15050565b60105481565b6019546001600160a01b031681565b60125481565b60115481565b610ca761104a565b6001600160a01b0316336001600160a01b03161480610cd057506001546001600160a01b031633145b610cec5760405162461bcd60e51b815260040161071790613121565b610cf4611ea8565b610cfc611f19565b610d04611424565b565b610d0432611c29565b610d1761104a565b6001600160a01b0316336001600160a01b03161480610d4057506001546001600160a01b031633145b610d5c5760405162461bcd60e51b815260040161071790613121565b610d64610fde565b600f546010546040516302f940c760e41b81526001600160a01b0390921691632f940c7091610d97913090600401612d52565b600060405180830381600087803b158015610db157600080fd5b505af1158015610dc5573d6000803e3d6000fd5b5050600c546001600160a01b031691506367dfd4c99050610de461179c565b6040518263ffffffff1660e01b81526004016108a19190612d49565b60135481565b61271081565b60175460ff1615610d04576004546001600160a01b03163314610d065760405162461bcd60e51b815260040161071790613095565b600054600160a01b900460ff1690565b60125490565b60145460ff1681565b610e68611fb3565b6001600160a01b0316610e7961104a565b6001600160a01b031614610e9f5760405162461bcd60e51b8152600401610717906130b5565b600480546001600160a01b0319166001600160a01b0392909216919091179055565b610ec9611fb3565b6001600160a01b0316610eda61104a565b6001600160a01b031614610f005760405162461bcd60e51b8152600401610717906130b5565b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b6000610f65610f57610751565b610f5f61132b565b90611fb7565b905090565b610f7261104a565b6001600160a01b0316336001600160a01b03161480610f9b57506001546001600160a01b031633145b610fb75760405162461bcd60e51b815260040161071790613121565b600180546001600160a01b0319166001600160a01b0392909216919091179055565b607081565b610fe661104a565b6001600160a01b0316336001600160a01b0316148061100f57506001546001600160a01b031633145b61102b5760405162461bcd60e51b815260040161071790613121565b611033611fdc565b610d0461203d565b60175460ff1681565b60065481565b6000546001600160a01b031690565b6005546001600160a01b031681565b60075481565b600f54601054604051630c7e663b60e11b81526000926001600160a01b0316916318fccc76916110a391903090600401612d52565b600060405180830381600087803b1580156110bd57600080fd5b505af11580156110d1573d6000803e3d6000fd5b5050600a546040516370a0823160e01b8152600093506001600160a01b0390911691506370a0823190611108903090600401612ccd565b60206040518083038186803b15801561112057600080fd5b505afa158015611134573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111589190612bd0565b90506000811561118657601254600a54600b5461118392916001600160a01b039081169116856120b5565b90505b6107e66103e8610c096007546111ac6103e8610c09602d88611e1d90919063ffffffff16565b90611e1d565b60135490565b6111c0611fb3565b6001600160a01b03166111d161104a565b6001600160a01b0316146111f75760405162461bcd60e51b8152600401610717906130b5565b600580546001600160a01b0319166001600160a01b0392909216919091179055565b61122161104a565b6001600160a01b0316336001600160a01b0316148061124a57506001546001600160a01b031633145b6112665760405162461bcd60e51b815260040161071790613121565b60328111156112875760405162461bcd60e51b815260040161071790613036565b600655565b6001546001600160a01b031681565b601a5481565b601954601a54604051631d31b11560e21b81526000926001600160a01b0316916374c6c454916112d5913091600401612d25565b60206040518083038186803b1580156112ed57600080fd5b505afa158015611301573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f659190612b39565b6103e881565b6009546040516370a0823160e01b81526000916001600160a01b0316906370a082319061135c903090600401612ccd565b60206040518083038186803b15801561137457600080fd5b505afa158015611388573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f659190612bd0565b6002546001600160a01b031633146113d65760405162461bcd60e51b815260040161071790612eb6565b600280546001600160a01b0319166001600160a01b0392909216919091179055565b6015546016546001600160a01b038083169260ff600160a01b9182900481169392831692919091041684565b61142c610e41565b156114495760405162461bcd60e51b81526004016107179061300c565b6009546040516370a0823160e01b81526000916001600160a01b0316906370a082319061147a903090600401612ccd565b60206040518083038186803b15801561149257600080fd5b505afa1580156114a6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114ca9190612bd0565b905080156106c757600c54604051632967cf8360e21b81526001600160a01b039091169063a59f3e0c90611502908490600401612d49565b600060405180830381600087803b15801561151c57600080fd5b505af1158015611530573d6000803e3d6000fd5b5050600f546010546001600160a01b039091169250638dbdbe6d915061155461179c565b306040518463ffffffff1660e01b81526004016115739392919061327b565b600060405180830381600087803b15801561158d57600080fd5b505af11580156115a1573d6000803e3d6000fd5b505050507f4d6ce1e535dbade1c23defba91e23b8f791ce5edc0cc320257a2b364e4e384266115ce610f4a565b6040516115db9190612d49565b60405180910390a150565b60085481565b6115f461104a565b6001600160a01b0316336001600160a01b0316148061161d57506001546001600160a01b031633145b6116395760405162461bcd60e51b815260040161071790613121565b7fea40013391db6e98971e639274161d609adf4ffd882f6e274f23e2d523bae3d4828260405161166a929190612d25565b60405180910390a1601980546001600160a01b0319166001600160a01b039390931692909217909155601a55565b6116a061104a565b6001600160a01b0316336001600160a01b031614806116c957506001546001600160a01b031633145b610d065760405162461bcd60e51b815260040161071790613121565b6116ed61104a565b6001600160a01b0316336001600160a01b0316148061171657506001546001600160a01b031633145b6117325760405162461bcd60e51b815260040161071790613121565b6106c7816121a9565b611743611fb3565b6001600160a01b031661175461104a565b6001600160a01b03161461177a5760405162461bcd60e51b8152600401610717906130b5565b600380546001600160a01b0319166001600160a01b0392909216919091179055565b600c546040516370a0823160e01b81526000916001600160a01b0316906370a082319061135c903090600401612ccd565b603281565b600f5460105460405162269db960e81b81526000926001600160a01b03169163269db9009161135c91903090600401612d52565b600d546001600160a01b031681565b60185481565b600a546001600160a01b031681565b611832611fb3565b6001600160a01b031661184361104a565b6001600160a01b0316146118695760405162461bcd60e51b8152600401610717906130b5565b6001600160a01b03811661188f5760405162461bcd60e51b815260040161071790612edb565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b6004546001600160a01b031633146119145760405162461bcd60e51b815260040161071790613095565b600f546010546040516302f940c760e41b81526001600160a01b0390921691632f940c7091611947913090600401612d52565b600060405180830381600087803b15801561196157600080fd5b505af1158015611975573d6000803e3d6000fd5b5050600c546001600160a01b031691506367dfd4c9905061199461179c565b6040518263ffffffff1660e01b81526004016119b09190612d49565b600060405180830381600087803b1580156119ca57600080fd5b505af11580156119de573d6000803e3d6000fd5b50506009546040516370a0823160e01b8152600093506001600160a01b0390911691506370a0823190611a15903090600401612ccd565b60206040518083038186803b158015611a2d57600080fd5b505afa158015611a41573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a659190612bd0565b6009546004805460405163a9059cbb60e01b81529394506001600160a01b039283169363a9059cbb93611a9d93921691869101612d25565b602060405180830381600087803b158015611ab757600080fd5b505af1158015611acb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611aef9190612b71565b5050565b6004546001600160a01b031681565b600c546001600160a01b031681565b801580611b995750604051636eb1769f60e11b81526001600160a01b0384169063dd62ed3e90611b479030908690600401612ce1565b60206040518083038186803b158015611b5f57600080fd5b505afa158015611b73573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b979190612bd0565b155b611bb55760405162461bcd60e51b81526004016107179061318d565b611c0b8363095ea7b360e01b8484604051602401611bd4929190612d25565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152612248565b505050565b6060611c1f84846000856122d7565b90505b9392505050565b611c31610e41565b15611c4e5760405162461bcd60e51b81526004016107179061300c565b600f54601054604051630c7e663b60e11b81526001600160a01b03909216916318fccc7691611c81913090600401612d52565b600060405180830381600087803b158015611c9b57600080fd5b505af1158015611caf573d6000803e3d6000fd5b5050600a546040516370a0823160e01b8152600093506001600160a01b0390911691506370a0823190611ce6903090600401612ccd565b60206040518083038186803b158015611cfe57600080fd5b505afa158015611d12573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d369190612bd0565b90508015611aef57611d4782612398565b611d4f612605565b6000611d5961132b565b9050611d63611424565b42601855337f9bc239f1724cacfb88cb1d66a2dc437467699b68a8c90d7b63110cf4b6f9241082611d92610f4a565b604051611da092919061326d565b60405180910390a2505050565b6000611dcd670de0b6b3a7640000610c09611dc6612780565b8590611e1d565b90505b919050565b600082821115611df75760405162461bcd60e51b815260040161071790612f58565b508082035b92915050565b6000611dcd611e0f612780565b610c0984670de0b6b3a76400005b600082611e2c57506000611dfc565b82820282848281611e3957fe5b0414611c225760405162461bcd60e51b815260040161071790613054565b6000808211611e785760405162461bcd60e51b815260040161071790612fd5565b818381611e8157fe5b049392505050565b611c0b8363a9059cbb60e01b8484604051602401611bd4929190612d25565b611eb0610e41565b611ecc5760405162461bcd60e51b815260040161071790612e88565b6000805460ff60a01b191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa611f02611fb3565b604051611f0f9190612ccd565b60405180910390a1565b600c54600954611f38916001600160a01b039182169116600019611b11565b600f54600c54611f57916001600160a01b039182169116600019611b11565b600354600a54611f76916001600160a01b039182169116600019611b11565b600354600d54611f94916001600160a01b0391821691166000611b11565b600354600d54610d04916001600160a01b039182169116600019611b11565b3390565b600082820183811015611c225760405162461bcd60e51b815260040161071790612f21565b611fe4610e41565b156120015760405162461bcd60e51b81526004016107179061300c565b6000805460ff60a01b1916600160a01b1790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258611f02611fb3565b600c5460095461205b916001600160a01b0391821691166000611b11565b600f54600c54612079916001600160a01b0391821691166000611b11565b600354600a54612097916001600160a01b0391821691166000611b11565b600354600d54610d04916001600160a01b0391821691166000611b11565b60006120bf612aaa565b6040805160c08101909152868152601454602082019060ff1660018111156120e357fe5b81526001600160a01b0380881660208084019190915287821660408085019190915260608401889052805191820181526000825260809093015260035491516352bbbe2960e01b815292935016906352bbbe299061214d90849060159060019042906004016131e3565b602060405180830381600087803b15801561216757600080fd5b505af115801561217b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061219f9190612bd0565b9695505050505050565b7f668b14b635e60c984edc522ab57ecf4f7df5f95e912da87692905dc5aa111487816040516121d89190612ccd565b60405180910390a1601954601a546040516317b0dca160e31b81526001600160a01b039092169163bd86e50891612213918590600401612d52565b600060405180830381600087803b15801561222d57600080fd5b505af1158015612241573d6000803e3d6000fd5b5050505050565b606061229d826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316611c109092919063ffffffff16565b805190915015611c0b57808060200190518101906122bb9190612b71565b611c0b5760405162461bcd60e51b815260040161071790613143565b6060824710156122f95760405162461bcd60e51b815260040161071790612f8f565b6123028561289c565b61231e5760405162461bcd60e51b8152600401610717906130ea565b60006060866001600160a01b0316858760405161233b9190612cb1565b60006040518083038185875af1925050503d8060008114612378576040519150601f19603f3d011682016040523d82523d6000602084013e61237d565b606091505b509150915061238d8282866128a2565b979650505050505050565b600a546040516370a0823160e01b81526000916001600160a01b0316906370a08231906123c9903090600401612ccd565b60206040518083038186803b1580156123e157600080fd5b505afa1580156123f5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124199190612bd0565b600b54600d549192506001600160a01b03918216911614612448576124456103e8610c0983602d611e1d565b90505b601254600a54600b5461246992916001600160a01b039081169116846120b5565b50600b546040516370a0823160e01b81526000916001600160a01b0316906370a082319061249b903090600401612ccd565b60206040518083038186803b1580156124b357600080fd5b505afa1580156124c7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124eb9190612bd0565b600b54600d549192506001600160a01b039182169116141561251b576125186103e8610c0983602d611e1d565b90505b60006125386103e8610c0960075485611e1d90919063ffffffff16565b600b54909150612552906001600160a01b03168583611e89565b600061256f6103e8610c0960085486611e1d90919063ffffffff16565b600554600b5491925061258f916001600160a01b03908116911683611e89565b60006125a26103e8610c09866070611e1d565b600254600b549192506125c2916001600160a01b03908116911683611e89565b7fd255b592c7f268a73e534da5219a60ff911b4cf6daae21c7d20527dd657bd99a8383836040516125f59392919061329a565b60405180910390a1505050505050565b600a54600d546001600160a01b039081169116148015906126375750600b54600d546001600160a01b03908116911614155b156126e357600a546040516370a0823160e01b81526000916001600160a01b0316906370a082319061266d903090600401612ccd565b60206040518083038186803b15801561268557600080fd5b505afa158015612699573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126bd9190612bd0565b601354600a54600d549293506126e0926001600160a01b039182169116846120b5565b50505b600d546040516370a0823160e01b81526000916001600160a01b0316906370a0823190612714903090600401612ccd565b60206040518083038186803b15801561272c57600080fd5b505afa158015612740573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127649190612bd0565b601154600d549192506106c7916001600160a01b0316836128db565b6000610f65600c60009054906101000a90046001600160a01b03166001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b1580156127d357600080fd5b505afa1580156127e7573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061280b9190612bd0565b600954600c546040516370a0823160e01b8152610c0992670de0b6b3a7640000926001600160a01b03918216926370a082319261284c921690600401612ccd565b60206040518083038186803b15801561286457600080fd5b505afa158015612878573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111ac9190612bd0565b3b151590565b606083156128b1575081611c22565b8251156128c15782518084602001fd5b8160405162461bcd60e51b81526004016107179190612e75565b600e5460609067ffffffffffffffff811180156128f757600080fd5b50604051908082528060200260200182016040528015612921578160200160208202803683370190505b50905060005b815181101561298957836001600160a01b0316600e828154811061294757fe5b6000918252602090912001546001600160a01b03161461296857600061296a565b825b82828151811061297657fe5b6020908102919091010152600101612927565b50606060018260016040516020016129a393929190612e46565b60405160208183030381529060405290506129bc612af3565b60408051600e805460a060208202840181019094526080830181815292938493929190840182828015612a1857602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116129fa575b50505091835250506020810185905260408082018590526000606090920191909152600354905163172b958560e31b81529192506001600160a01b03169063b95cac2890612a70908990309081908790600401612d69565b600060405180830381600087803b158015612a8a57600080fd5b505af1158015612a9e573d6000803e3d6000fd5b50505050505050505050565b6040805160c0810190915260008082526020820190815260200160006001600160a01b0316815260200160006001600160a01b0316815260200160008152602001606081525090565b60405180608001604052806060815260200160608152602001606081526020016000151581525090565b600060208284031215612b2e578081fd5b8135611c22816132e7565b600060208284031215612b4a578081fd5b8151611c22816132e7565b600060208284031215612b66578081fd5b8135611c22816132fc565b600060208284031215612b82578081fd5b8151611c22816132fc565b60008060408385031215612b9f578081fd5b8235612baa816132e7565b946020939093013593505050565b600060208284031215612bc9578081fd5b5035919050565b600060208284031215612be1578081fd5b5051919050565b60008060408385031215612bfa578182fd5b505080516020909101519092909150565b6000815180845260208085019450808401835b83811015612c3a57815187529582019590820190600101612c1e565b509495945050505050565b15159052565b60008151808452612c638160208601602086016132bb565b601f01601f19169290920160200192915050565b80546001600160a01b03808216845260ff60a092831c8116151560208601526001909301549081166040850152901c161515606090910152565b60008251612cc38184602087016132bb565b9190910192915050565b6001600160a01b0391909116815260200190565b6001600160a01b0392831681529116602082015260400190565b6001600160a01b039485168152921515602084015292166040820152901515606082015260800190565b6001600160a01b03929092168252602082015260400190565b901515815260200190565b90815260200190565b9182526001600160a01b0316602082015260400190565b6000858252602060018060a01b0380871682850152808616604085015260806060850152610100840185516080808701528181518084526101208801915085830193508692505b80831015612dd257835185168252928501926001929092019190850190612db0565b50848801519450607f199350838782030160a0880152612df28186612c0b565b94505050506040850151818584030160c0860152612e108382612c4b565b925050506060840151612e2660e0850182612c45565b509695505050505050565b60208101612e3e836132b0565b825292915050565b600060ff8516825260606020830152612e626060830185612c0b565b905060ff83166040830152949350505050565b600060208252611c226020830184612c4b565b60208082526014908201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b604082015260600190565b6020808252600b908201526a085cdd1c985d1959da5cdd60aa1b604082015260600190565b60208082526026908201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160408201526564647265737360d01b606082015260800190565b6020808252601b908201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604082015260600190565b6020808252601e908201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604082015260600190565b60208082526026908201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6040820152651c8818d85b1b60d21b606082015260800190565b6020808252601a908201527f536166654d6174683a206469766973696f6e206279207a65726f000000000000604082015260600190565b60208082526010908201526f14185d5cd8589b194e881c185d5cd95960821b604082015260600190565b6020808252600490820152630216361760e41b604082015260600190565b60208082526021908201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6040820152607760f81b606082015260800190565b602080825260069082015265085d985d5b1d60d21b604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252601d908201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604082015260600190565b60208082526008908201526710b6b0b730b3b2b960c11b604082015260600190565b6020808252602a908201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6040820152691bdd081cdd58d8d9595960b21b606082015260800190565b60208082526036908201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60408201527520746f206e6f6e2d7a65726f20616c6c6f77616e636560501b606082015260800190565b600060e08252855160e08301526131fd60208701516132b0565b61010083015260408601516001600160a01b03908116610120840152606087015116610140830152608086015161016083015260a086015160c061018084015261324b6101a0840182612c4b565b91505061325b6020830186612c77565b60a082019390935260c0015292915050565b918252602082015260400190565b92835260208301919091526001600160a01b0316604082015260600190565b9283526020830191909152604082015260600190565b8060028110611dd057fe5b60005b838110156132d65781810151838201526020016132be565b838111156108cf5750506000910152565b6001600160a01b03811681146106c757600080fd5b80151581146106c757600080fdfea2646970667358221220e08f1b7e883529a7dda97333d3a91030158f7aa1efd0dd2a605881f02fe059d864736f6c634300060c0033000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000000160000000000000000000000008166994d9ebbe5829ec86bd81258149b87facfd3000000000000000000000000f24bcf4d1e507740041c9cfd2dddb29585adce1e00000000000000000000000095b0c46b74e6120cc9357d907a854f527a5e2bc200000000000000000000000020dd72ed959b6147912c2e529f0a0c651c33c9ce000000000000000000000000340465d9d2ebde78f15a3870884757584f97abb40000000000000000000000004cc72219fc8aef162fc0c255d9b9c3ff93b10882000000000000000000000000502c107ae28d300fdaede1cbd7ee8096c1ab4a3c0000000000000000000000000000000000000000000000000000000000000003cde5a11a4acb4ee4c805352cec57e236bdbc3837000200000000000000000019cde5a11a4acb4ee4c805352cec57e236bdbc3837000200000000000000000019cde5a11a4acb4ee4c805352cec57e236bdbc3837000200000000000000000019
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106103d05760003560e01c80638912cb8b116101ff578063d0e30db01161011a578063e7a7250a116100ad578063f2fde38b1161007c578063f2fde38b14610693578063fb617787146106a6578063fbfa77cf146106ae578063febb0f7e146106b6576103d0565b8063e7a7250a14610673578063eaed3f4f1461067b578063f1a392da14610683578063f20eaeb81461068b576103d0565b8063d83d9ef4116100e9578063d83d9ef41461063d578063d92f3d7314610650578063de39da5f14610663578063dfbdc4371461066b576103d0565b8063d0e30db014610612578063d31025891461061a578063d72f520114610622578063d801d94614610635576103d0565b8063ac1e502511610192578063bc063e1a11610161578063bc063e1a146105d7578063c1a3d44c146105df578063c7b9d530146105e7578063c89f2ce4146105fa576103d0565b8063ac1e5025146105ac578063aced1661146105bf578063af640d0f146105c7578063b9efdda3146105cf576103d0565b806390321e1a116101ce57806390321e1a1461058157806397fd323d14610589578063a07cb27e14610591578063a68833e514610599576103d0565b80638912cb8b146105615780638bc7e8c4146105695780638da5cb5b146105715780638e14545914610579576103d0565b80633e2d57cc116102ef5780635d1eb24411610282578063722713f711610251578063722713f714610536578063748747e61461053e5780637d38ca65146105515780638456cb5914610559576103d0565b80635d1eb244146104fe578063671f6a26146105065780636817031b1461051b578063715018a61461052e576103d0565b80634d651e4b116102be5780634d651e4b146104d157806354518b1a146104d9578063573fef0a146104e15780635c975abb146104e9576103d0565b80633e2d57cc146104b15780633f4ba83a146104b95780634641257d146104c15780634700d305146104c9576103d0565b80631fe4a686116103675780632e1a7d4d116103365780632e1a7d4d14610486578063363b048514610499578063388e9104146104a15780633d2f8c87146104a9576103d0565b80631fe4a6861461045b578063257ae0de14610463578063264658261461046b5780632ad5a53f1461047e576103d0565b80631bb5e2dc116103a35780631bb5e2dc146104305780631cc8aa42146104435780631f1fcd511461044b5780631fc8bc5d14610453576103d0565b80630e5c011e146103d55780630e8fbb5a146103ea57806311588086146103fd57806311b0b42d1461041b575b600080fd5b6103e86103e3366004612b1d565b6106be565b005b6103e86103f8366004612b55565b6106ca565b610405610751565b6040516104129190612d49565b60405180910390f35b6104236107ed565b6040516104129190612ccd565b61042361043e366004612bb8565b6107fc565b6103e8610823565b6104236108d5565b6104236108e4565b6104236108f3565b610423610902565b6103e8610479366004612bb8565b610911565b61040561098d565b6103e8610494366004612bb8565b610992565b610405610c7e565b610423610c84565b610405610c93565b610405610c99565b6103e8610c9f565b6103e8610d06565b6103e8610d0f565b610405610e00565b610405610e06565b6103e8610e0c565b6104f1610e41565b6040516104129190612d3e565b610405610e51565b61050e610e57565b6040516104129190612e31565b6103e8610529366004612b1d565b610e60565b6103e8610ec1565b610405610f4a565b6103e861054c366004612b1d565b610f6a565b610405610fd9565b6103e8610fde565b6104f161103b565b610405611044565b61042361104a565b610423611059565b610405611068565b61040561106e565b6104056111b2565b6103e86105a7366004612b1d565b6111b8565b6103e86105ba366004612bb8565b611219565b61042361128c565b61040561129b565b6104236112a1565b610405611325565b61040561132b565b6103e86105f5366004612b1d565b6113ac565b6106026113f8565b6040516104129493929190612cfb565b6103e8611424565b6104056115e6565b6103e8610630366004612b8d565b6115ec565b6103e8611698565b6103e861064b366004612b1d565b6116e5565b6103e861065e366004612b1d565b61173b565b61040561179c565b6104056117cd565b6104056117d2565b610423611806565b610405611815565b61042361181b565b6103e86106a1366004612b1d565b61182a565b6103e86118ea565b610423611af3565b610423611b02565b6106c781611c29565b50565b6106d261104a565b6001600160a01b0316336001600160a01b031614806106fb57506001546001600160a01b031633145b6107205760405162461bcd60e51b815260040161071790613121565b60405180910390fd5b6017805460ff1916821515179081905560ff1615610747576107426000611219565b6106c7565b6106c7600a611219565b600f546010546040516393f1a40b60e01b815260009283926001600160a01b03909116916393f1a40b91610789913090600401612d52565b604080518083038186803b1580156107a057600080fd5b505afa1580156107b4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107d89190612be8565b50905060006107e682611dad565b9250505090565b600b546001600160a01b031681565b600e818154811061080957fe5b6000918252602090912001546001600160a01b0316905081565b61082b61104a565b6001600160a01b0316336001600160a01b0316148061085457506001546001600160a01b031633145b6108705760405162461bcd60e51b815260040161071790613121565b601954601a5460405163785f6df160e11b81526001600160a01b039092169163f0bedbe2916108a191600401612d49565b600060405180830381600087803b1580156108bb57600080fd5b505af11580156108cf573d6000803e3d6000fd5b50505050565b6009546001600160a01b031681565b600f546001600160a01b031681565b6002546001600160a01b031681565b6003546001600160a01b031681565b61091961104a565b6001600160a01b0316336001600160a01b0316148061094257506001546001600160a01b031633145b61095e5760405162461bcd60e51b815260040161071790613121565b606f81111561097f5760405162461bcd60e51b815260040161071790613036565b600781905561037803600855565b606f81565b6004546001600160a01b031633146109bc5760405162461bcd60e51b815260040161071790613095565b6009546040516370a0823160e01b81526000916001600160a01b0316906370a08231906109ed903090600401612ccd565b60206040518083038186803b158015610a0557600080fd5b505afa158015610a19573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a3d9190612bd0565b905081811015610bae57600f546010546001600160a01b039091169063d1abb90790610a71610a6c8686611dd5565b611e02565b306040518463ffffffff1660e01b8152600401610a909392919061327b565b600060405180830381600087803b158015610aaa57600080fd5b505af1158015610abe573d6000803e3d6000fd5b5050600c546001600160a01b031691506367dfd4c99050610add61179c565b6040518263ffffffff1660e01b8152600401610af99190612d49565b600060405180830381600087803b158015610b1357600080fd5b505af1158015610b27573d6000803e3d6000fd5b50506009546040516370a0823160e01b81526001600160a01b0390911692506370a082319150610b5b903090600401612ccd565b60206040518083038186803b158015610b7357600080fd5b505afa158015610b87573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bab9190612bd0565b90505b81811115610bb95750805b610bc161104a565b6001600160a01b0316326001600160a01b031614158015610be75750610be5610e41565b155b15610c1f576000610c0f612710610c0960065485611e1d90919063ffffffff16565b90611e57565b9050610c1b8282611dd5565b9150505b600454600954610c3c916001600160a01b03918216911683611e89565b7f5b6b431d4476a211bb7d41c20d1aab9ae2321deee0d20be3d9fc9b1093fa6e3d610c65610f4a565b604051610c729190612d49565b60405180910390a15050565b60105481565b6019546001600160a01b031681565b60125481565b60115481565b610ca761104a565b6001600160a01b0316336001600160a01b03161480610cd057506001546001600160a01b031633145b610cec5760405162461bcd60e51b815260040161071790613121565b610cf4611ea8565b610cfc611f19565b610d04611424565b565b610d0432611c29565b610d1761104a565b6001600160a01b0316336001600160a01b03161480610d4057506001546001600160a01b031633145b610d5c5760405162461bcd60e51b815260040161071790613121565b610d64610fde565b600f546010546040516302f940c760e41b81526001600160a01b0390921691632f940c7091610d97913090600401612d52565b600060405180830381600087803b158015610db157600080fd5b505af1158015610dc5573d6000803e3d6000fd5b5050600c546001600160a01b031691506367dfd4c99050610de461179c565b6040518263ffffffff1660e01b81526004016108a19190612d49565b60135481565b61271081565b60175460ff1615610d04576004546001600160a01b03163314610d065760405162461bcd60e51b815260040161071790613095565b600054600160a01b900460ff1690565b60125490565b60145460ff1681565b610e68611fb3565b6001600160a01b0316610e7961104a565b6001600160a01b031614610e9f5760405162461bcd60e51b8152600401610717906130b5565b600480546001600160a01b0319166001600160a01b0392909216919091179055565b610ec9611fb3565b6001600160a01b0316610eda61104a565b6001600160a01b031614610f005760405162461bcd60e51b8152600401610717906130b5565b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b6000610f65610f57610751565b610f5f61132b565b90611fb7565b905090565b610f7261104a565b6001600160a01b0316336001600160a01b03161480610f9b57506001546001600160a01b031633145b610fb75760405162461bcd60e51b815260040161071790613121565b600180546001600160a01b0319166001600160a01b0392909216919091179055565b607081565b610fe661104a565b6001600160a01b0316336001600160a01b0316148061100f57506001546001600160a01b031633145b61102b5760405162461bcd60e51b815260040161071790613121565b611033611fdc565b610d0461203d565b60175460ff1681565b60065481565b6000546001600160a01b031690565b6005546001600160a01b031681565b60075481565b600f54601054604051630c7e663b60e11b81526000926001600160a01b0316916318fccc76916110a391903090600401612d52565b600060405180830381600087803b1580156110bd57600080fd5b505af11580156110d1573d6000803e3d6000fd5b5050600a546040516370a0823160e01b8152600093506001600160a01b0390911691506370a0823190611108903090600401612ccd565b60206040518083038186803b15801561112057600080fd5b505afa158015611134573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111589190612bd0565b90506000811561118657601254600a54600b5461118392916001600160a01b039081169116856120b5565b90505b6107e66103e8610c096007546111ac6103e8610c09602d88611e1d90919063ffffffff16565b90611e1d565b60135490565b6111c0611fb3565b6001600160a01b03166111d161104a565b6001600160a01b0316146111f75760405162461bcd60e51b8152600401610717906130b5565b600580546001600160a01b0319166001600160a01b0392909216919091179055565b61122161104a565b6001600160a01b0316336001600160a01b0316148061124a57506001546001600160a01b031633145b6112665760405162461bcd60e51b815260040161071790613121565b60328111156112875760405162461bcd60e51b815260040161071790613036565b600655565b6001546001600160a01b031681565b601a5481565b601954601a54604051631d31b11560e21b81526000926001600160a01b0316916374c6c454916112d5913091600401612d25565b60206040518083038186803b1580156112ed57600080fd5b505afa158015611301573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f659190612b39565b6103e881565b6009546040516370a0823160e01b81526000916001600160a01b0316906370a082319061135c903090600401612ccd565b60206040518083038186803b15801561137457600080fd5b505afa158015611388573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f659190612bd0565b6002546001600160a01b031633146113d65760405162461bcd60e51b815260040161071790612eb6565b600280546001600160a01b0319166001600160a01b0392909216919091179055565b6015546016546001600160a01b038083169260ff600160a01b9182900481169392831692919091041684565b61142c610e41565b156114495760405162461bcd60e51b81526004016107179061300c565b6009546040516370a0823160e01b81526000916001600160a01b0316906370a082319061147a903090600401612ccd565b60206040518083038186803b15801561149257600080fd5b505afa1580156114a6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114ca9190612bd0565b905080156106c757600c54604051632967cf8360e21b81526001600160a01b039091169063a59f3e0c90611502908490600401612d49565b600060405180830381600087803b15801561151c57600080fd5b505af1158015611530573d6000803e3d6000fd5b5050600f546010546001600160a01b039091169250638dbdbe6d915061155461179c565b306040518463ffffffff1660e01b81526004016115739392919061327b565b600060405180830381600087803b15801561158d57600080fd5b505af11580156115a1573d6000803e3d6000fd5b505050507f4d6ce1e535dbade1c23defba91e23b8f791ce5edc0cc320257a2b364e4e384266115ce610f4a565b6040516115db9190612d49565b60405180910390a150565b60085481565b6115f461104a565b6001600160a01b0316336001600160a01b0316148061161d57506001546001600160a01b031633145b6116395760405162461bcd60e51b815260040161071790613121565b7fea40013391db6e98971e639274161d609adf4ffd882f6e274f23e2d523bae3d4828260405161166a929190612d25565b60405180910390a1601980546001600160a01b0319166001600160a01b039390931692909217909155601a55565b6116a061104a565b6001600160a01b0316336001600160a01b031614806116c957506001546001600160a01b031633145b610d065760405162461bcd60e51b815260040161071790613121565b6116ed61104a565b6001600160a01b0316336001600160a01b0316148061171657506001546001600160a01b031633145b6117325760405162461bcd60e51b815260040161071790613121565b6106c7816121a9565b611743611fb3565b6001600160a01b031661175461104a565b6001600160a01b03161461177a5760405162461bcd60e51b8152600401610717906130b5565b600380546001600160a01b0319166001600160a01b0392909216919091179055565b600c546040516370a0823160e01b81526000916001600160a01b0316906370a082319061135c903090600401612ccd565b603281565b600f5460105460405162269db960e81b81526000926001600160a01b03169163269db9009161135c91903090600401612d52565b600d546001600160a01b031681565b60185481565b600a546001600160a01b031681565b611832611fb3565b6001600160a01b031661184361104a565b6001600160a01b0316146118695760405162461bcd60e51b8152600401610717906130b5565b6001600160a01b03811661188f5760405162461bcd60e51b815260040161071790612edb565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b6004546001600160a01b031633146119145760405162461bcd60e51b815260040161071790613095565b600f546010546040516302f940c760e41b81526001600160a01b0390921691632f940c7091611947913090600401612d52565b600060405180830381600087803b15801561196157600080fd5b505af1158015611975573d6000803e3d6000fd5b5050600c546001600160a01b031691506367dfd4c9905061199461179c565b6040518263ffffffff1660e01b81526004016119b09190612d49565b600060405180830381600087803b1580156119ca57600080fd5b505af11580156119de573d6000803e3d6000fd5b50506009546040516370a0823160e01b8152600093506001600160a01b0390911691506370a0823190611a15903090600401612ccd565b60206040518083038186803b158015611a2d57600080fd5b505afa158015611a41573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a659190612bd0565b6009546004805460405163a9059cbb60e01b81529394506001600160a01b039283169363a9059cbb93611a9d93921691869101612d25565b602060405180830381600087803b158015611ab757600080fd5b505af1158015611acb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611aef9190612b71565b5050565b6004546001600160a01b031681565b600c546001600160a01b031681565b801580611b995750604051636eb1769f60e11b81526001600160a01b0384169063dd62ed3e90611b479030908690600401612ce1565b60206040518083038186803b158015611b5f57600080fd5b505afa158015611b73573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b979190612bd0565b155b611bb55760405162461bcd60e51b81526004016107179061318d565b611c0b8363095ea7b360e01b8484604051602401611bd4929190612d25565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152612248565b505050565b6060611c1f84846000856122d7565b90505b9392505050565b611c31610e41565b15611c4e5760405162461bcd60e51b81526004016107179061300c565b600f54601054604051630c7e663b60e11b81526001600160a01b03909216916318fccc7691611c81913090600401612d52565b600060405180830381600087803b158015611c9b57600080fd5b505af1158015611caf573d6000803e3d6000fd5b5050600a546040516370a0823160e01b8152600093506001600160a01b0390911691506370a0823190611ce6903090600401612ccd565b60206040518083038186803b158015611cfe57600080fd5b505afa158015611d12573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d369190612bd0565b90508015611aef57611d4782612398565b611d4f612605565b6000611d5961132b565b9050611d63611424565b42601855337f9bc239f1724cacfb88cb1d66a2dc437467699b68a8c90d7b63110cf4b6f9241082611d92610f4a565b604051611da092919061326d565b60405180910390a2505050565b6000611dcd670de0b6b3a7640000610c09611dc6612780565b8590611e1d565b90505b919050565b600082821115611df75760405162461bcd60e51b815260040161071790612f58565b508082035b92915050565b6000611dcd611e0f612780565b610c0984670de0b6b3a76400005b600082611e2c57506000611dfc565b82820282848281611e3957fe5b0414611c225760405162461bcd60e51b815260040161071790613054565b6000808211611e785760405162461bcd60e51b815260040161071790612fd5565b818381611e8157fe5b049392505050565b611c0b8363a9059cbb60e01b8484604051602401611bd4929190612d25565b611eb0610e41565b611ecc5760405162461bcd60e51b815260040161071790612e88565b6000805460ff60a01b191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa611f02611fb3565b604051611f0f9190612ccd565b60405180910390a1565b600c54600954611f38916001600160a01b039182169116600019611b11565b600f54600c54611f57916001600160a01b039182169116600019611b11565b600354600a54611f76916001600160a01b039182169116600019611b11565b600354600d54611f94916001600160a01b0391821691166000611b11565b600354600d54610d04916001600160a01b039182169116600019611b11565b3390565b600082820183811015611c225760405162461bcd60e51b815260040161071790612f21565b611fe4610e41565b156120015760405162461bcd60e51b81526004016107179061300c565b6000805460ff60a01b1916600160a01b1790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258611f02611fb3565b600c5460095461205b916001600160a01b0391821691166000611b11565b600f54600c54612079916001600160a01b0391821691166000611b11565b600354600a54612097916001600160a01b0391821691166000611b11565b600354600d54610d04916001600160a01b0391821691166000611b11565b60006120bf612aaa565b6040805160c08101909152868152601454602082019060ff1660018111156120e357fe5b81526001600160a01b0380881660208084019190915287821660408085019190915260608401889052805191820181526000825260809093015260035491516352bbbe2960e01b815292935016906352bbbe299061214d90849060159060019042906004016131e3565b602060405180830381600087803b15801561216757600080fd5b505af115801561217b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061219f9190612bd0565b9695505050505050565b7f668b14b635e60c984edc522ab57ecf4f7df5f95e912da87692905dc5aa111487816040516121d89190612ccd565b60405180910390a1601954601a546040516317b0dca160e31b81526001600160a01b039092169163bd86e50891612213918590600401612d52565b600060405180830381600087803b15801561222d57600080fd5b505af1158015612241573d6000803e3d6000fd5b5050505050565b606061229d826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316611c109092919063ffffffff16565b805190915015611c0b57808060200190518101906122bb9190612b71565b611c0b5760405162461bcd60e51b815260040161071790613143565b6060824710156122f95760405162461bcd60e51b815260040161071790612f8f565b6123028561289c565b61231e5760405162461bcd60e51b8152600401610717906130ea565b60006060866001600160a01b0316858760405161233b9190612cb1565b60006040518083038185875af1925050503d8060008114612378576040519150601f19603f3d011682016040523d82523d6000602084013e61237d565b606091505b509150915061238d8282866128a2565b979650505050505050565b600a546040516370a0823160e01b81526000916001600160a01b0316906370a08231906123c9903090600401612ccd565b60206040518083038186803b1580156123e157600080fd5b505afa1580156123f5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124199190612bd0565b600b54600d549192506001600160a01b03918216911614612448576124456103e8610c0983602d611e1d565b90505b601254600a54600b5461246992916001600160a01b039081169116846120b5565b50600b546040516370a0823160e01b81526000916001600160a01b0316906370a082319061249b903090600401612ccd565b60206040518083038186803b1580156124b357600080fd5b505afa1580156124c7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124eb9190612bd0565b600b54600d549192506001600160a01b039182169116141561251b576125186103e8610c0983602d611e1d565b90505b60006125386103e8610c0960075485611e1d90919063ffffffff16565b600b54909150612552906001600160a01b03168583611e89565b600061256f6103e8610c0960085486611e1d90919063ffffffff16565b600554600b5491925061258f916001600160a01b03908116911683611e89565b60006125a26103e8610c09866070611e1d565b600254600b549192506125c2916001600160a01b03908116911683611e89565b7fd255b592c7f268a73e534da5219a60ff911b4cf6daae21c7d20527dd657bd99a8383836040516125f59392919061329a565b60405180910390a1505050505050565b600a54600d546001600160a01b039081169116148015906126375750600b54600d546001600160a01b03908116911614155b156126e357600a546040516370a0823160e01b81526000916001600160a01b0316906370a082319061266d903090600401612ccd565b60206040518083038186803b15801561268557600080fd5b505afa158015612699573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126bd9190612bd0565b601354600a54600d549293506126e0926001600160a01b039182169116846120b5565b50505b600d546040516370a0823160e01b81526000916001600160a01b0316906370a0823190612714903090600401612ccd565b60206040518083038186803b15801561272c57600080fd5b505afa158015612740573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127649190612bd0565b601154600d549192506106c7916001600160a01b0316836128db565b6000610f65600c60009054906101000a90046001600160a01b03166001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b1580156127d357600080fd5b505afa1580156127e7573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061280b9190612bd0565b600954600c546040516370a0823160e01b8152610c0992670de0b6b3a7640000926001600160a01b03918216926370a082319261284c921690600401612ccd565b60206040518083038186803b15801561286457600080fd5b505afa158015612878573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111ac9190612bd0565b3b151590565b606083156128b1575081611c22565b8251156128c15782518084602001fd5b8160405162461bcd60e51b81526004016107179190612e75565b600e5460609067ffffffffffffffff811180156128f757600080fd5b50604051908082528060200260200182016040528015612921578160200160208202803683370190505b50905060005b815181101561298957836001600160a01b0316600e828154811061294757fe5b6000918252602090912001546001600160a01b03161461296857600061296a565b825b82828151811061297657fe5b6020908102919091010152600101612927565b50606060018260016040516020016129a393929190612e46565b60405160208183030381529060405290506129bc612af3565b60408051600e805460a060208202840181019094526080830181815292938493929190840182828015612a1857602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116129fa575b50505091835250506020810185905260408082018590526000606090920191909152600354905163172b958560e31b81529192506001600160a01b03169063b95cac2890612a70908990309081908790600401612d69565b600060405180830381600087803b158015612a8a57600080fd5b505af1158015612a9e573d6000803e3d6000fd5b50505050505050505050565b6040805160c0810190915260008082526020820190815260200160006001600160a01b0316815260200160006001600160a01b0316815260200160008152602001606081525090565b60405180608001604052806060815260200160608152602001606081526020016000151581525090565b600060208284031215612b2e578081fd5b8135611c22816132e7565b600060208284031215612b4a578081fd5b8151611c22816132e7565b600060208284031215612b66578081fd5b8135611c22816132fc565b600060208284031215612b82578081fd5b8151611c22816132fc565b60008060408385031215612b9f578081fd5b8235612baa816132e7565b946020939093013593505050565b600060208284031215612bc9578081fd5b5035919050565b600060208284031215612be1578081fd5b5051919050565b60008060408385031215612bfa578182fd5b505080516020909101519092909150565b6000815180845260208085019450808401835b83811015612c3a57815187529582019590820190600101612c1e565b509495945050505050565b15159052565b60008151808452612c638160208601602086016132bb565b601f01601f19169290920160200192915050565b80546001600160a01b03808216845260ff60a092831c8116151560208601526001909301549081166040850152901c161515606090910152565b60008251612cc38184602087016132bb565b9190910192915050565b6001600160a01b0391909116815260200190565b6001600160a01b0392831681529116602082015260400190565b6001600160a01b039485168152921515602084015292166040820152901515606082015260800190565b6001600160a01b03929092168252602082015260400190565b901515815260200190565b90815260200190565b9182526001600160a01b0316602082015260400190565b6000858252602060018060a01b0380871682850152808616604085015260806060850152610100840185516080808701528181518084526101208801915085830193508692505b80831015612dd257835185168252928501926001929092019190850190612db0565b50848801519450607f199350838782030160a0880152612df28186612c0b565b94505050506040850151818584030160c0860152612e108382612c4b565b925050506060840151612e2660e0850182612c45565b509695505050505050565b60208101612e3e836132b0565b825292915050565b600060ff8516825260606020830152612e626060830185612c0b565b905060ff83166040830152949350505050565b600060208252611c226020830184612c4b565b60208082526014908201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b604082015260600190565b6020808252600b908201526a085cdd1c985d1959da5cdd60aa1b604082015260600190565b60208082526026908201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160408201526564647265737360d01b606082015260800190565b6020808252601b908201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604082015260600190565b6020808252601e908201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604082015260600190565b60208082526026908201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6040820152651c8818d85b1b60d21b606082015260800190565b6020808252601a908201527f536166654d6174683a206469766973696f6e206279207a65726f000000000000604082015260600190565b60208082526010908201526f14185d5cd8589b194e881c185d5cd95960821b604082015260600190565b6020808252600490820152630216361760e41b604082015260600190565b60208082526021908201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6040820152607760f81b606082015260800190565b602080825260069082015265085d985d5b1d60d21b604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252601d908201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604082015260600190565b60208082526008908201526710b6b0b730b3b2b960c11b604082015260600190565b6020808252602a908201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6040820152691bdd081cdd58d8d9595960b21b606082015260800190565b60208082526036908201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60408201527520746f206e6f6e2d7a65726f20616c6c6f77616e636560501b606082015260800190565b600060e08252855160e08301526131fd60208701516132b0565b61010083015260408601516001600160a01b03908116610120840152606087015116610140830152608086015161016083015260a086015160c061018084015261324b6101a0840182612c4b565b91505061325b6020830186612c77565b60a082019390935260c0015292915050565b918252602082015260400190565b92835260208301919091526001600160a01b0316604082015260600190565b9283526020830191909152604082015260600190565b8060028110611dd057fe5b60005b838110156132d65781810151838201526020016132be565b838111156108cf5750506000910152565b6001600160a01b03811681146106c757600080fd5b80151581146106c757600080fdfea2646970667358221220e08f1b7e883529a7dda97333d3a91030158f7aa1efd0dd2a605881f02fe059d864736f6c634300060c0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000000160000000000000000000000008166994d9ebbe5829ec86bd81258149b87facfd3000000000000000000000000f24bcf4d1e507740041c9cfd2dddb29585adce1e00000000000000000000000095b0c46b74e6120cc9357d907a854f527a5e2bc200000000000000000000000020dd72ed959b6147912c2e529f0a0c651c33c9ce000000000000000000000000340465d9d2ebde78f15a3870884757584f97abb40000000000000000000000004cc72219fc8aef162fc0c255d9b9c3ff93b10882000000000000000000000000502c107ae28d300fdaede1cbd7ee8096c1ab4a3c0000000000000000000000000000000000000000000000000000000000000003cde5a11a4acb4ee4c805352cec57e236bdbc3837000200000000000000000019cde5a11a4acb4ee4c805352cec57e236bdbc3837000200000000000000000019cde5a11a4acb4ee4c805352cec57e236bdbc3837000200000000000000000019
-----Decoded View---------------
Arg [0] : _balancerPoolIds (bytes32[]): System.Byte[],System.Byte[],System.Byte[]
Arg [1] : _chefPoolId (uint256): 22
Arg [2] : _chef (address): 0x8166994d9ebBe5829EC86Bd81258149B87faCfd3
Arg [3] : _input (address): 0xF24Bcf4d1e507740041C9cFd2DddB29585aDCe1e
Arg [4] : _vault (address): 0x95B0C46b74E6120CC9357D907a854F527A5E2BC2
Arg [5] : _unirouter (address): 0x20dd72Ed959b6147912C2e529F0a0C651c33c9ce
Arg [6] : _keeper (address): 0x340465d9D2EbDE78F15a3870884757584F97aBB4
Arg [7] : _strategist (address): 0x4cC72219fc8aEF162FC0c255D9B9C3Ff93B10882
Arg [8] : _beefyFeeRecipient (address): 0x502C107ae28d300fDAedE1CBd7ee8096C1ab4a3C
-----Encoded View---------------
13 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000120
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000016
Arg [2] : 0000000000000000000000008166994d9ebbe5829ec86bd81258149b87facfd3
Arg [3] : 000000000000000000000000f24bcf4d1e507740041c9cfd2dddb29585adce1e
Arg [4] : 00000000000000000000000095b0c46b74e6120cc9357d907a854f527a5e2bc2
Arg [5] : 00000000000000000000000020dd72ed959b6147912c2e529f0a0c651c33c9ce
Arg [6] : 000000000000000000000000340465d9d2ebde78f15a3870884757584f97abb4
Arg [7] : 0000000000000000000000004cc72219fc8aef162fc0c255d9b9c3ff93b10882
Arg [8] : 000000000000000000000000502c107ae28d300fdaede1cbd7ee8096c1ab4a3c
Arg [9] : 0000000000000000000000000000000000000000000000000000000000000003
Arg [10] : cde5a11a4acb4ee4c805352cec57e236bdbc3837000200000000000000000019
Arg [11] : cde5a11a4acb4ee4c805352cec57e236bdbc3837000200000000000000000019
Arg [12] : cde5a11a4acb4ee4c805352cec57e236bdbc3837000200000000000000000019
Deployed Bytecode Sourcemap
57703:952:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48478:105;;;;;;:::i;:::-;;:::i;:::-;;53195:262;;;;;;:::i;:::-;;:::i;52106:235::-;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45231:75;;;:::i;:::-;;;;;;;:::i;45419:25::-;;;;;;:::i;:::-;;:::i;57348:104::-;;;:::i;45123:19::-;;;:::i;45483:::-;;;:::i;41560:25::-;;;:::i;41592:24::-;;;:::i;44487:200::-;;;;;;:::i;:::-;;:::i;44199:39::-;;;:::i;47361:829::-;;;;;;:::i;:::-;;:::i;45509:25::-;;;:::i;56261:114::-;;;:::i;45573:31::-;;;:::i;45541:25::-;;;:::i;54257:121::-;;;:::i;48396:74::-;;;:::i;53965:181::-;;;:::i;45611:30::-;;;:::i;44298:43::-;;;:::i;58422:230::-;;;:::i;39851:86::-;;;:::i;:::-;;;;;;;:::i;54958:100::-;;;:::i;45650:39::-;;;:::i;:::-;;;;;;;:::i;43420:86::-;;;;;;:::i;:::-;;:::i;38202:148::-;;;:::i;51724:113::-;;;:::i;42692:92::-;;;;;;:::i;:::-;;:::i;44109:41::-;;;:::i;54154:95::-;;;:::i;45747:28::-;;;:::i;44350:30::-;;;:::i;37551:87::-;;;:::i;41650:32::-;;;:::i;44389:25::-;;;:::i;52769:418::-;;;:::i;55066:98::-;;;:::i;43641:134::-;;;;;;:::i;:::-;;:::i;44695:154::-;;;;;;:::i;:::-;;:::i;41532:21::-;;;:::i;56382:17::-;;;:::i;57460:127::-;;;:::i;44157:35::-;;;:::i;51904:118::-;;;:::i;42929:155::-;;;;;;:::i;:::-;;:::i;45696:42::-;;;:::i;:::-;;;;;;;;;;:::i;47032:321::-;;;:::i;44421:57::-;;;:::i;56771:239::-;;;;;;:::i;:::-;;:::i;48591:85::-;;;:::i;57048:110::-;;;;;;:::i;:::-;;:::i;43216:102::-;;;;;;:::i;:::-;;:::i;52407:116::-;;;:::i;44247:44::-;;;:::i;52567:145::-;;;:::i;45392:20::-;;;:::i;45782:26::-;;;:::i;45149:75::-;;;:::i;38505:244::-;;;;;;:::i;:::-;;:::i;53557:326::-;;;:::i;41623:20::-;;;:::i;45313:72::-;;;:::i;48478:105::-;48549:26;48558:16;48549:8;:26::i;:::-;48478:105;:::o;53195:262::-;42509:7;:5;:7::i;:::-;-1:-1:-1;;;;;42495:21:0;:10;-1:-1:-1;;;;;42495:21:0;;:45;;;-1:-1:-1;42534:6:0;;-1:-1:-1;;;;;42534:6:0;42520:10;:20;42495:45;42487:66;;;;-1:-1:-1;;;42487:66:0;;;;;;;:::i;:::-;;;;;;;;;53280:16:::1;:36:::0;;-1:-1:-1;;53280:36:0::1;::::0;::::1;;;::::0;;;;::::1;53333:16;53329:121;;;53366:19;53383:1;53366:16;:19::i;:::-;53329:121;;;53418:20;53435:2;53418:16;:20::i;52106:235::-:0;52211:4;;52226:10;;52195:57;;-1:-1:-1;;;52195:57:0;;52152:7;;;;-1:-1:-1;;;;;52211:4:0;;;;52195:30;;:57;;52246:4;;52195:57;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;52172:80;;;52263:15;52281:27;52298:9;52281:16;:27::i;:::-;52263:45;-1:-1:-1;;;52106:235:0;:::o;45231:75::-;;;-1:-1:-1;;;;;45231:75:0;;:::o;45419:25::-;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;45419:25:0;;-1:-1:-1;45419:25:0;:::o;57348:104::-;42509:7;:5;:7::i;:::-;-1:-1:-1;;;;;42495:21:0;:10;-1:-1:-1;;;;;42495:21:0;;:45;;;-1:-1:-1;42534:6:0;;-1:-1:-1;;;;;42534:6:0;42520:10;:20;42495:45;42487:66;;;;-1:-1:-1;;;42487:66:0;;;;;;;:::i;:::-;57411:15:::1;::::0;57441:2:::1;::::0;57411:33:::1;::::0;-1:-1:-1;;;57411:33:0;;-1:-1:-1;;;;;57411:15:0;;::::1;::::0;:29:::1;::::0;:33:::1;::::0;::::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;57348:104::o:0;45123:19::-;;;-1:-1:-1;;;;;45123:19:0;;:::o;45483:::-;;;-1:-1:-1;;;;;45483:19:0;;:::o;41560:25::-;;;-1:-1:-1;;;;;41560:25:0;;:::o;41592:24::-;;;-1:-1:-1;;;;;41592:24:0;;:::o;44487:200::-;42509:7;:5;:7::i;:::-;-1:-1:-1;;;;;42495:21:0;:10;-1:-1:-1;;;;;42495:21:0;;:45;;;-1:-1:-1;42534:6:0;;-1:-1:-1;;;;;42534:6:0;42520:10;:20;42495:45;42487:66;;;;-1:-1:-1;;;42487:66:0;;;;;;;:::i;:::-;44235:3:::1;44559:4;:20;;44551:37;;;;-1:-1:-1::0;;;44551:37:0::1;;;;;;;:::i;:::-;44609:7;:14:::0;;;44645:24;:34:::1;44634:8;:45:::0;44487:200::o;44199:39::-;44235:3;44199:39;:::o;47361:829::-;47438:5;;-1:-1:-1;;;;;47438:5:0;47424:10;:19;47416:38;;;;-1:-1:-1;;;47416:38:0;;;;;;;:::i;:::-;47492:4;;47485:37;;-1:-1:-1;;;47485:37:0;;47467:15;;-1:-1:-1;;;;;47492:4:0;;47485:22;;:37;;47516:4;;47485:37;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;47467:55;;47549:7;47539;:17;47535:265;;;47589:4;;47614:10;;-1:-1:-1;;;;;47589:4:0;;;;47573:40;;47626:38;47643:20;:7;47655;47643:11;:20::i;:::-;47626:16;:38::i;:::-;47674:4;47573:107;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;47700:3:0;;-1:-1:-1;;;;;47700:3:0;;-1:-1:-1;47695:15:0;;-1:-1:-1;47711:14:0;:12;:14::i;:::-;47695:31;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;47758:4:0;;47751:37;;-1:-1:-1;;;47751:37:0;;-1:-1:-1;;;;;47758:4:0;;;;-1:-1:-1;47751:22:0;;-1:-1:-1;47751:37:0;;47782:4;;47751:37;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;47741:47;;47535:265;47826:7;47816;:17;47812:67;;;-1:-1:-1;47860:7:0;47812:67;47908:7;:5;:7::i;:::-;-1:-1:-1;;;;;47895:20:0;:9;-1:-1:-1;;;;;47895:20:0;;;:33;;;;;47920:8;:6;:8::i;:::-;47919:9;47895:33;47891:199;;;47945:27;47975:46;44336:5;47975:26;47987:13;;47975:7;:11;;:26;;;;:::i;:::-;:30;;:46::i;:::-;47945:76;-1:-1:-1;48046:32:0;:7;47945:76;48046:11;:32::i;:::-;48036:42;;47891:199;;48128:5;;48109:4;;48102:41;;-1:-1:-1;;;;;48109:4:0;;;;48128:5;48135:7;48102:25;:41::i;:::-;48161:21;48170:11;:9;:11::i;:::-;48161:21;;;;;;:::i;:::-;;;;;;;;47361:829;;:::o;45509:25::-;;;;:::o;56261:114::-;;;-1:-1:-1;;;;;56261:114:0;;:::o;45573:31::-;;;;:::o;45541:25::-;;;;:::o;54257:121::-;42509:7;:5;:7::i;:::-;-1:-1:-1;;;;;42495:21:0;:10;-1:-1:-1;;;;;42495:21:0;;:45;;;-1:-1:-1;42534:6:0;;-1:-1:-1;;;;;42534:6:0;42520:10;:20;42495:45;42487:66;;;;-1:-1:-1;;;42487:66:0;;;;;;;:::i;:::-;54308:10:::1;:8;:10::i;:::-;54331:17;:15;:17::i;:::-;54361:9;:7;:9::i;:::-;54257:121::o:0;48396:74::-;48443:19;48452:9;48443:8;:19::i;53965:181::-;42509:7;:5;:7::i;:::-;-1:-1:-1;;;;;42495:21:0;:10;-1:-1:-1;;;;;42495:21:0;;:45;;;-1:-1:-1;42534:6:0;;-1:-1:-1;;;;;42534:6:0;42520:10;:20;42495:45;42487:66;;;;-1:-1:-1;;;42487:66:0;;;;;;;:::i;:::-;54012:7:::1;:5;:7::i;:::-;54046:4;::::0;54070:10:::1;::::0;54030:66:::1;::::0;-1:-1:-1;;;54030:66:0;;-1:-1:-1;;;;;54046:4:0;;::::1;::::0;54030:39:::1;::::0;:66:::1;::::0;54090:4:::1;::::0;54030:66:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;54112:3:0::1;::::0;-1:-1:-1;;;;;54112:3:0::1;::::0;-1:-1:-1;54107:15:0::1;::::0;-1:-1:-1;54123:14:0::1;:12;:14::i;:::-;54107:31;;;;;;;;;;;;;;;:::i;45611:30::-:0;;;;:::o;44298:43::-;44336:5;44298:43;:::o;58422:230::-;58528:16;;;;58524:121;;;58583:5;;-1:-1:-1;;;;;58583:5:0;58569:10;:19;58561:38;;;;-1:-1:-1;;;58561:38:0;;;;;;;:::i;39851:86::-;39898:4;39922:7;-1:-1:-1;;;39922:7:0;;;;;39851:86::o;54958:100::-;55034:16;;54958:100;:::o;45650:39::-;;;;;;:::o;43420:86::-;37782:12;:10;:12::i;:::-;-1:-1:-1;;;;;37771:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;37771:23:0;;37763:68;;;;-1:-1:-1;;;37763:68:0;;;;;;;:::i;:::-;43484:5:::1;:14:::0;;-1:-1:-1;;;;;;43484:14:0::1;-1:-1:-1::0;;;;;43484:14:0;;;::::1;::::0;;;::::1;::::0;;43420:86::o;38202:148::-;37782:12;:10;:12::i;:::-;-1:-1:-1;;;;;37771:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;37771:23:0;;37763:68;;;;-1:-1:-1;;;37763:68:0;;;;;;;:::i;:::-;38309:1:::1;38293:6:::0;;38272:40:::1;::::0;-1:-1:-1;;;;;38293:6:0;;::::1;::::0;38272:40:::1;::::0;38309:1;;38272:40:::1;38340:1;38323:19:::0;;-1:-1:-1;;;;;;38323:19:0::1;::::0;;38202:148::o;51724:113::-;51766:7;51793:36;51813:15;:13;:15::i;:::-;51793;:13;:15::i;:::-;:19;;:36::i;:::-;51786:43;;51724:113;:::o;42692:92::-;42509:7;:5;:7::i;:::-;-1:-1:-1;;;;;42495:21:0;:10;-1:-1:-1;;;;;42495:21:0;;:45;;;-1:-1:-1;42534:6:0;;-1:-1:-1;;;;;42534:6:0;42520:10;:20;42495:45;42487:66;;;;-1:-1:-1;;;42487:66:0;;;;;;;:::i;:::-;42760:6:::1;:16:::0;;-1:-1:-1;;;;;;42760:16:0::1;-1:-1:-1::0;;;;;42760:16:0;;;::::1;::::0;;;::::1;::::0;;42692:92::o;44109:41::-;44147:3;44109:41;:::o;54154:95::-;42509:7;:5;:7::i;:::-;-1:-1:-1;;;;;42495:21:0;:10;-1:-1:-1;;;;;42495:21:0;;:45;;;-1:-1:-1;42534:6:0;;-1:-1:-1;;;;;42534:6:0;42520:10;:20;42495:45;42487:66;;;;-1:-1:-1;;;42487:66:0;;;;;;;:::i;:::-;54201:8:::1;:6;:8::i;:::-;54222:19;:17;:19::i;45747:28::-:0;;;;;;:::o;44350:30::-;;;;:::o;37551:87::-;37597:7;37624:6;-1:-1:-1;;;;;37624:6:0;37551:87;:::o;41650:32::-;;;-1:-1:-1;;;;;41650:32:0;;:::o;44389:25::-;;;;:::o;52769:418::-;52843:4;;52857:10;;52827:56;;-1:-1:-1;;;52827:56:0;;52807:7;;-1:-1:-1;;;;;52843:4:0;;52827:29;;:56;;52857:10;52877:4;;52827:56;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;52921:6:0;;52914:39;;-1:-1:-1;;;52914:39:0;;52894:17;;-1:-1:-1;;;;;;52921:6:0;;;;-1:-1:-1;52914:24:0;;:39;;52947:4;;52914:39;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;52894:59;-1:-1:-1;52964:17:0;52996:13;;52992:115;;53051:16;;53069:6;;53077;;53038:57;;53051:16;-1:-1:-1;;;;;53069:6:0;;;;53077;53085:9;53038:12;:57::i;:::-;53026:69;;52992:115;53126:53;44188:4;53126:40;53158:7;;53126:27;53148:4;53126:17;53140:2;53126:9;:13;;:17;;;;:::i;:27::-;:31;;:40::i;55066:98::-;55141:15;;55066:98;:::o;43641:134::-;37782:12;:10;:12::i;:::-;-1:-1:-1;;;;;37771:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;37771:23:0;;37763:68;;;;-1:-1:-1;;;37763:68:0;;;;;;;:::i;:::-;43729:17:::1;:38:::0;;-1:-1:-1;;;;;;43729:38:0::1;-1:-1:-1::0;;;;;43729:38:0;;;::::1;::::0;;;::::1;::::0;;43641:134::o;44695:154::-;42509:7;:5;:7::i;:::-;-1:-1:-1;;;;;42495:21:0;:10;-1:-1:-1;;;;;42495:21:0;;:45;;;-1:-1:-1;42534:6:0;;-1:-1:-1;;;;;42534:6:0;42520:10;:20;42495:45;42487:66;;;;-1:-1:-1;;;42487:66:0;;;;;;;:::i;:::-;44289:2:::1;44773:4;:26;;44765:43;;;;-1:-1:-1::0;;;44765:43:0::1;;;;;;;:::i;:::-;44821:13;:20:::0;44695:154::o;41532:21::-;;;-1:-1:-1;;;;;41532:21:0;;:::o;56382:17::-;;;;:::o;57460:127::-;57534:15;;57576:2;;57534:45;;-1:-1:-1;;;57534:45:0;;57507:7;;-1:-1:-1;;;;;57534:15:0;;:26;;:45;;57569:4;;57534:45;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;44157:35::-;44188:4;44157:35;:::o;51904:118::-;51984:4;;51977:37;;-1:-1:-1;;;51977:37:0;;51950:7;;-1:-1:-1;;;;;51984:4:0;;51977:22;;:37;;52008:4;;51977:37;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;42929:155::-;43015:10;;-1:-1:-1;;;;;43015:10:0;43001;:24;42993:48;;;;-1:-1:-1;;;42993:48:0;;;;;;;:::i;:::-;43052:10;:24;;-1:-1:-1;;;;;;43052:24:0;-1:-1:-1;;;;;43052:24:0;;;;;;;;;;42929:155::o;45696:42::-;;;;;-1:-1:-1;;;;;45696:42:0;;;;;-1:-1:-1;;;45696:42:0;;;;;;;;;;;;;;;;;:::o;47032:321::-;40177:8;:6;:8::i;:::-;40176:9;40168:38;;;;-1:-1:-1;;;40168:38:0;;;;;;;:::i;:::-;47108:4:::1;::::0;47101:37:::1;::::0;-1:-1:-1;;;47101:37:0;;47083:15:::1;::::0;-1:-1:-1;;;;;47108:4:0::1;::::0;47101:22:::1;::::0;:37:::1;::::0;47132:4:::1;::::0;47101:37:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;47083:55:::0;-1:-1:-1;47155:11:0;;47151:195:::1;;47188:3;::::0;47183:24:::1;::::0;-1:-1:-1;;;47183:24:0;;-1:-1:-1;;;;;47188:3:0;;::::1;::::0;47183:15:::1;::::0;:24:::1;::::0;47199:7;;47183:24:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;47238:4:0::1;::::0;47252:10:::1;::::0;-1:-1:-1;;;;;47238:4:0;;::::1;::::0;-1:-1:-1;47222:29:0::1;::::0;-1:-1:-1;47264:14:0::1;:12;:14::i;:::-;47288:4;47222:72;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;47314:20;47322:11;:9;:11::i;:::-;47314:20;;;;;;:::i;:::-;;;;;;;;40217:1;47032:321::o:0;44421:57::-;;;;:::o;56771:239::-;42509:7;:5;:7::i;:::-;-1:-1:-1;;;;;42495:21:0;:10;-1:-1:-1;;;;;42495:21:0;;:45;;;-1:-1:-1;42534:6:0;;-1:-1:-1;;;;;42534:6:0;42520:10;:20;42495:45;42487:66;;;;-1:-1:-1;;;42487:66:0;;;;;;;:::i;:::-;56891:42:::1;56906:18;56926:6;56891:42;;;;;;;:::i;:::-;;;;;;;;56944:15;:36:::0;;-1:-1:-1;;;;;;56944:36:0::1;-1:-1:-1::0;;;;;56944:36:0;;;::::1;::::0;;;::::1;::::0;;;56991:2:::1;:11:::0;56771:239::o;48591:85::-;42509:7;:5;:7::i;:::-;-1:-1:-1;;;;;42495:21:0;:10;-1:-1:-1;;;;;42495:21:0;;:45;;;-1:-1:-1;42534:6:0;;-1:-1:-1;;;;;42534:6:0;42520:10;:20;42495:45;42487:66;;;;-1:-1:-1;;;42487:66:0;;;;;;;:::i;57048:110::-;42509:7;:5;:7::i;:::-;-1:-1:-1;;;;;42495:21:0;:10;-1:-1:-1;;;;;42495:21:0;;:45;;;-1:-1:-1;42534:6:0;;-1:-1:-1;;;;;42534:6:0;42520:10;:20;42495:45;42487:66;;;;-1:-1:-1;;;42487:66:0;;;;;;;:::i;:::-;57124:26:::1;57143:6;57124:18;:26::i;43216:102::-:0;37782:12;:10;:12::i;:::-;-1:-1:-1;;;;;37771:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;37771:23:0;;37763:68;;;;-1:-1:-1;;;37763:68:0;;;;;;;:::i;:::-;43288:9:::1;:22:::0;;-1:-1:-1;;;;;;43288:22:0::1;-1:-1:-1::0;;;;;43288:22:0;;;::::1;::::0;;;::::1;::::0;;43216:102::o;52407:116::-;52486:3;;52479:36;;-1:-1:-1;;;52479:36:0;;52452:7;;-1:-1:-1;;;;;52486:3:0;;52479:21;;:36;;52509:4;;52479:36;;;:::i;44247:44::-;44289:2;44247:44;:::o;52567:145::-;52659:4;;52678:10;;52643:61;;-1:-1:-1;;;52643:61:0;;52616:7;;-1:-1:-1;;;;;52659:4:0;;52643:34;;:61;;52678:10;52698:4;;52643:61;;;:::i;45392:20::-;;;-1:-1:-1;;;;;45392:20:0;;:::o;45782:26::-;;;;:::o;45149:75::-;;;-1:-1:-1;;;;;45149:75:0;;:::o;38505:244::-;37782:12;:10;:12::i;:::-;-1:-1:-1;;;;;37771:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;37771:23:0;;37763:68;;;;-1:-1:-1;;;37763:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;38594:22:0;::::1;38586:73;;;;-1:-1:-1::0;;;38586:73:0::1;;;;;;;:::i;:::-;38696:6;::::0;;38675:38:::1;::::0;-1:-1:-1;;;;;38675:38:0;;::::1;::::0;38696:6;::::1;::::0;38675:38:::1;::::0;::::1;38724:6;:17:::0;;-1:-1:-1;;;;;;38724:17:0::1;-1:-1:-1::0;;;;;38724:17:0;;;::::1;::::0;;;::::1;::::0;;38505:244::o;53557:326::-;53622:5;;-1:-1:-1;;;;;53622:5:0;53608:10;:19;53600:38;;;;-1:-1:-1;;;53600:38:0;;;;;;;:::i;:::-;53667:4;;53691:10;;53651:66;;-1:-1:-1;;;53651:66:0;;-1:-1:-1;;;;;53667:4:0;;;;53651:39;;:66;;53711:4;;53651:66;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;53733:3:0;;-1:-1:-1;;;;;53733:3:0;;-1:-1:-1;53728:15:0;;-1:-1:-1;53744:14:0;:12;:14::i;:::-;53728:31;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;53797:4:0;;53790:37;;-1:-1:-1;;;53790:37:0;;53772:15;;-1:-1:-1;;;;;;53797:4:0;;;;-1:-1:-1;53790:22:0;;:37;;53821:4;;53790:37;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;53845:4;;53860:5;;;53838:37;;-1:-1:-1;;;53838:37:0;;53772:55;;-1:-1:-1;;;;;;53845:4:0;;;;53838:21;;:37;;53860:5;;;53772:55;;53838:37;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;53557:326;:::o;41623:20::-;;;-1:-1:-1;;;;;41623:20:0;;:::o;45313:72::-;;;-1:-1:-1;;;;;45313:72:0;;:::o;31737:622::-;32107:10;;;32106:62;;-1:-1:-1;32123:39:0;;-1:-1:-1;;;32123:39:0;;-1:-1:-1;;;;;32123:15:0;;;;;:39;;32147:4;;32154:7;;32123:39;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:44;32106:62;32098:152;;;;-1:-1:-1;;;32098:152:0;;;;;;;:::i;:::-;32261:90;32281:5;32311:22;;;32335:7;32344:5;32288:62;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;32288:62:0;;;;;;;;;;;;;;-1:-1:-1;;;;;32288:62:0;-1:-1:-1;;;;;;32288:62:0;;;;;;;;;;32261:19;:90::i;:::-;31737:622;;;:::o;26065:195::-;26168:12;26200:52;26222:6;26230:4;26236:1;26239:12;26200:21;:52::i;:::-;26193:59;;26065:195;;;;;;:::o;48739:521::-;40177:8;:6;:8::i;:::-;40176:9;40168:38;;;;-1:-1:-1;;;40168:38:0;;;;;;;:::i;:::-;48833:4:::1;::::0;48847:10:::1;::::0;48817:56:::1;::::0;-1:-1:-1;;;48817:56:0;;-1:-1:-1;;;;;48833:4:0;;::::1;::::0;48817:29:::1;::::0;:56:::1;::::0;48867:4:::1;::::0;48817:56:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;48911:6:0::1;::::0;48904:39:::1;::::0;-1:-1:-1;;;48904:39:0;;48884:17:::1;::::0;-1:-1:-1;;;;;;48911:6:0;;::::1;::::0;-1:-1:-1;48904:24:0::1;::::0;:39:::1;::::0;48937:4:::1;::::0;48904:39:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;48884:59:::0;-1:-1:-1;48958:13:0;;48954:299:::1;;48988:28;48999:16;48988:10;:28::i;:::-;49031:14;:12;:14::i;:::-;49060:21;49084:15;:13;:15::i;:::-;49060:39;;49114:9;:7;:9::i;:::-;49154:15;49140:11;:29:::0;49202:10:::1;49189:52;49214:13:::0;49229:11:::1;:9;:11::i;:::-;49189:52;;;;;;;:::i;:::-;;;;;;;;48954:299;40217:1;48739:521:::0;:::o;55339:138::-;55405:7;55432:37;55464:4;55432:27;55444:14;:12;:14::i;:::-;55432:7;;:11;:27::i;:37::-;55425:44;;55339:138;;;;:::o;7113:158::-;7171:7;7204:1;7199;:6;;7191:49;;;;-1:-1:-1;;;7191:49:0;;;;;;;:::i;:::-;-1:-1:-1;7258:5:0;;;7113:158;;;;;:::o;55485:138::-;55551:7;55578:37;55600:14;:12;:14::i;:::-;55578:17;:7;55590:4;7530:220;7588:7;7612:6;7608:20;;-1:-1:-1;7627:1:0;7620:8;;7608:20;7651:5;;;7655:1;7651;:5;:1;7675:5;;;;;:10;7667:56;;;;-1:-1:-1;;;7667:56:0;;;;;;;:::i;8228:153::-;8286:7;8318:1;8314;:5;8306:44;;;;-1:-1:-1;;;8306:44:0;;;;;;;:::i;:::-;8372:1;8368;:5;;;;;;;8228:153;-1:-1:-1;;;8228:153:0:o;31078:177::-;31161:86;31181:5;31211:23;;;31236:2;31240:5;31188:58;;;;;;;;;:::i;40910:120::-;40454:8;:6;:8::i;:::-;40446:41;;;;-1:-1:-1;;;40446:41:0;;;;;;;:::i;:::-;40979:5:::1;40969:15:::0;;-1:-1:-1;;;;40969:15:0::1;::::0;;41000:22:::1;41009:12;:10;:12::i;:::-;41000:22;;;;;;:::i;:::-;;;;;;;;40910:120::o:0;54386:323::-;54458:3;;54440:4;;54433:42;;-1:-1:-1;;;;;54440:4:0;;;;54458:3;-1:-1:-1;;54433:24:0;:42::i;:::-;54510:4;;54493:3;;54486:42;;-1:-1:-1;;;;;54493:3:0;;;;54510:4;-1:-1:-1;;54486:23:0;:42::i;:::-;54566:9;;54546:6;;54539:50;;-1:-1:-1;;;;;54546:6:0;;;;54566:9;-1:-1:-1;;54539:26:0;:50::i;:::-;54628:9;;54609:5;;54602:39;;-1:-1:-1;;;;;54609:5:0;;;;54628:9;;54602:25;:39::i;:::-;54678:9;;54659:5;;54652:49;;-1:-1:-1;;;;;54659:5:0;;;;54678:9;-1:-1:-1;;54652:25:0;:49::i;673:106::-;761:10;673:106;:::o;6651:179::-;6709:7;6741:5;;;6765:6;;;;6757:46;;;;-1:-1:-1;;;6757:46:0;;;;;;;:::i;40651:118::-;40177:8;:6;:8::i;:::-;40176:9;40168:38;;;;-1:-1:-1;;;40168:38:0;;;;;;;:::i;:::-;40711:7:::1;:14:::0;;-1:-1:-1;;;;40711:14:0::1;-1:-1:-1::0;;;40711:14:0::1;::::0;;40741:20:::1;40748:12;:10;:12::i;54717:233::-:0;54791:3;;54773:4;;54766:32;;-1:-1:-1;;;;;54773:4:0;;;;54791:3;;54766:24;:32::i;:::-;54833:4;;54816:3;;54809:32;;-1:-1:-1;;;;;54816:3:0;;;;54833:4;;54809:23;:32::i;:::-;54879:9;;54859:6;;54852:40;;-1:-1:-1;;;;;54859:6:0;;;;54879:9;;54852:26;:40::i;:::-;54929:9;;54910:5;;54903:39;;-1:-1:-1;;;;;54910:5:0;;;;54929:9;;54903:25;:39::i;50725:342::-;50838:7;50858:43;;:::i;:::-;50904:80;;;;;;;;;;;;50939:8;;50904:80;;;;50939:8;;;50904:80;;;;;;;;;-1:-1:-1;;;;;50904:80:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;50904:80:0;;;;;;;51017:9;;51002:57;;-1:-1:-1;;;51002:57:0;;50858:126;;-1:-1:-1;51017:9:0;;51002:30;;:57;;50858:126;;51045:5;;51017:9;;51055:3;;51002:57;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;50995:64;50725:342;-1:-1:-1;;;;;;50725:342:0:o;57166:143::-;57235:16;57244:6;57235:16;;;;;;:::i;:::-;;;;;;;;57262:15;;57290:2;;57262:39;;-1:-1:-1;;;57262:39:0;;-1:-1:-1;;;;;57262:15:0;;;;:27;;:39;;57294:6;;57262:39;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57166:143;:::o;33383:761::-;33807:23;33833:69;33861:4;33833:69;;;;;;;;;;;;;;;;;33841:5;-1:-1:-1;;;;;33833:27:0;;;:69;;;;;:::i;:::-;33917:17;;33807:95;;-1:-1:-1;33917:21:0;33913:224;;34059:10;34048:30;;;;;;;;;;;;:::i;:::-;34040:85;;;;-1:-1:-1;;;34040:85:0;;;;;;;:::i;27117:530::-;27244:12;27302:5;27277:21;:30;;27269:81;;;;-1:-1:-1;;;27269:81:0;;;;;;;:::i;:::-;27369:18;27380:6;27369:10;:18::i;:::-;27361:60;;;;-1:-1:-1;;;27361:60:0;;;;;;;:::i;:::-;27495:12;27509:23;27536:6;-1:-1:-1;;;;;27536:11:0;27556:5;27564:4;27536:33;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27494:75;;;;27587:52;27605:7;27614:10;27626:12;27587:17;:52::i;:::-;27580:59;27117:530;-1:-1:-1;;;;;;;27117:530:0:o;49293:992::-;49385:6;;49378:39;;-1:-1:-1;;;49378:39:0;;49359:16;;-1:-1:-1;;;;;49385:6:0;;49378:24;;:39;;49411:4;;49378:39;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;49441:6;;49432:5;;49359:58;;-1:-1:-1;;;;;;49432:5:0;;;49441:6;;49432:15;49428:85;;49475:26;49496:4;49475:16;:8;49488:2;49475:12;:16::i;:26::-;49464:37;;49428:85;49538:16;;49556:6;;49564;;49525:56;;49538:16;-1:-1:-1;;;;;49556:6:0;;;;49564;49572:8;49525:12;:56::i;:::-;-1:-1:-1;49621:6:0;;49614:39;;-1:-1:-1;;;49614:39:0;;49594:17;;-1:-1:-1;;;;;49621:6:0;;49614:24;;:39;;49647:4;;49614:39;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;49677:6;;49668:5;;49594:59;;-1:-1:-1;;;;;;49668:5:0;;;49677:6;;49668:15;49664:87;;;49712:27;49734:4;49712:17;:9;49726:2;49712:13;:17::i;:27::-;49700:39;;49664:87;49763:21;49787:35;44188:4;49787:22;49801:7;;49787:9;:13;;:22;;;;:::i;:35::-;49840:6;;49763:59;;-1:-1:-1;49833:60:0;;-1:-1:-1;;;;;49840:6:0;49861:16;49763:59;49833:27;:60::i;:::-;49906:22;49931:36;44188:4;49931:23;49945:8;;49931:9;:13;;:23;;;;:::i;:36::-;50006:17;;49985:6;;49906:61;;-1:-1:-1;49978:62:0;;-1:-1:-1;;;;;49985:6:0;;;;50006:17;49906:61;49978:27;:62::i;:::-;50053:27;50083:42;44188:4;50083:29;:9;44147:3;50083:13;:29::i;:42::-;50164:10;;50143:6;;50053:72;;-1:-1:-1;50136:60:0;;-1:-1:-1;;;;;50143:6:0;;;;50164:10;50053:72;50136:27;:60::i;:::-;50214:63;50226:13;50241:14;50257:19;50214:63;;;;;;;;:::i;:::-;;;;;;;;49293:992;;;;;;:::o;50348:369::-;50405:6;;50396:5;;-1:-1:-1;;;;;50396:5:0;;;50405:6;;50396:15;;;;:34;;-1:-1:-1;50424:6:0;;50415:5;;-1:-1:-1;;;;;50415:5:0;;;50424:6;;50415:15;;50396:34;50392:196;;;50474:6;;50467:39;;-1:-1:-1;;;50467:39:0;;50447:17;;-1:-1:-1;;;;;50474:6:0;;50467:24;;:39;;50500:4;;50467:39;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;50534:15;;50551:6;;50559:5;;50447:59;;-1:-1:-1;50521:55:0;;-1:-1:-1;;;;;50551:6:0;;;;50559:5;50447:59;50521:12;:55::i;:::-;;50392:196;;50626:5;;50619:38;;-1:-1:-1;;;50619:38:0;;50600:16;;-1:-1:-1;;;;;50626:5:0;;50619:23;;:38;;50651:4;;50619:38;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;50681:10;;50693:5;;50600:57;;-1:-1:-1;50668:41:0;;-1:-1:-1;;;;;50693:5:0;50600:57;50668:12;:41::i;55172:159::-;55219:7;55246:77;55304:3;;;;;;;;;-1:-1:-1;;;;;55304:3:0;-1:-1:-1;;;;;55297:23:0;;:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;55253:4;;55277:3;;55246:36;;-1:-1:-1;;;55246:36:0;;:46;;55287:4;;-1:-1:-1;;;;;55253:4:0;;;;55246:22;;:36;;55277:3;;55246:36;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;23147:422::-;23514:20;23553:8;;;23147:422::o;29657:742::-;29772:12;29801:7;29797:595;;;-1:-1:-1;29832:10:0;29825:17;;29797:595;29946:17;;:21;29942:439;;30209:10;30203:17;30270:15;30257:10;30253:2;30249:19;30242:44;30157:148;30352:12;30345:20;;-1:-1:-1;;;30345:20:0;;;;;;;;:::i;51075:575::-;51212:8;:15;51171:24;;51198:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;51198:30:0;;51171:57;;51244:9;51239:124;51263:7;:14;51259:1;:18;51239:124;;;51327:8;-1:-1:-1;;;;;51312:23:0;:8;51321:1;51312:11;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;51312:11:0;:23;:39;;51350:1;51312:39;;;51338:9;51312:39;51299:7;51307:1;51299:10;;;;;;;;;;;;;;;;;:52;51279:3;;51239:124;;;;51373:21;51408:1;51411:7;51420:1;51397:25;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;51373:49;;51435:45;;:::i;:::-;51483:66;;;51514:8;51483:66;;;;;;;;;;;;;;;;;;;;;;;;51514:8;51483:66;;;51514:8;51483:66;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;51483:66:0;;;;;;;;;;;;;;;;-1:-1:-1;;;51483:66:0;;;-1:-1:-1;;51483:66:0;;;;;;;;;;;;;-1:-1:-1;51483:66:0;;;;;;;;51575:9;;51560:82;;-1:-1:-1;;;51560:82:0;;51435:114;;-1:-1:-1;;;;;;51575:9:0;;51560:34;;:82;;51595:7;;51612:4;;;;51435:114;;51560:82;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51075:575;;;;;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;1163:241::-;;1267:2;1255:9;1246:7;1242:23;1238:32;1235:2;;;-1:-1;;1273:12;1235:2;85:6;72:20;97:33;124:5;97:33;:::i;1411:263::-;;1526:2;1514:9;1505:7;1501:23;1497:32;1494:2;;;-1:-1;;1532:12;1494:2;226:6;220:13;238:33;265:5;238:33;:::i;1681:235::-;;1782:2;1770:9;1761:7;1757:23;1753:32;1750:2;;;-1:-1;;1788:12;1750:2;360:6;347:20;372:30;396:5;372:30;:::i;1923:257::-;;2035:2;2023:9;2014:7;2010:23;2006:32;2003:2;;;-1:-1;;2041:12;2003:2;495:6;489:13;507:30;531:5;507:30;:::i;2187:428::-;;;2339:2;2327:9;2318:7;2314:23;2310:32;2307:2;;;-1:-1;;2345:12;2307:2;797:6;784:20;809:64;867:5;809:64;:::i;:::-;2397:94;2528:2;2567:22;;;;616:20;;-1:-1;;;2301:314::o;2622:241::-;;2726:2;2714:9;2705:7;2701:23;2697:32;2694:2;;;-1:-1;;2732:12;2694:2;-1:-1;952:20;;2688:175;-1:-1;2688:175::o;2870:263::-;;2985:2;2973:9;2964:7;2960:23;2956:32;2953:2;;;-1:-1;;2991:12;2953:2;-1:-1;1100:13;;2947:186;-1:-1;2947:186::o;3140:399::-;;;3272:2;3260:9;3251:7;3247:23;3243:32;3240:2;;;-1:-1;;3278:12;3240:2;-1:-1;;1100:13;;3441:2;3491:22;;;1100:13;;;;;-1:-1;3234:305::o;5307:670::-;;5490:5;34044:12;34837:6;34832:3;34825:19;34874:4;;34869:3;34865:14;5502:83;;34874:4;5656:5;33740:14;-1:-1;5695:260;5720:6;5717:1;5714:13;5695:260;;;5781:13;;6987:37;;3882:14;;;;34575;;;;5742:1;5735:9;5695:260;;;-1:-1;5961:10;;5421:556;-1:-1;;;;;5421:556::o;6714:94::-;36403:13;36396:21;6769:34;;6763:45::o;7156:323::-;;7288:5;34044:12;34837:6;34832:3;34825:19;7371:52;7416:6;34874:4;34869:3;34865:14;34874:4;7397:5;7393:16;7371:52;:::i;:::-;39045:7;39029:14;-1:-1;;39025:28;7435:39;;;;34874:4;7435:39;;7236:243;-1:-1;;7236:243::o;14615:1056::-;14842:23;;-1:-1;;;;;35818:54;;;4136:45;;36116:4;35829:42;39257:15;;;36105:16;;36403:13;36396:21;15202:4;15193:14;;6769:34;35829:42;15268:16;;;15262:23;35818:54;;;15453:4;15444:14;;4136:45;39257:15;;36105:16;36403:13;36396:21;15644:4;15635:14;;;6769:34;14742:929::o;18427:271::-;;7646:5;34044:12;7757:52;7802:6;7797:3;7790:4;7783:5;7779:16;7757:52;:::i;:::-;7821:16;;;;;18561:137;-1:-1;;18561:137::o;18705:222::-;-1:-1;;;;;35818:54;;;;4136:45;;18832:2;18817:18;;18803:124::o;19179:333::-;-1:-1;;;;;35818:54;;;4136:45;;35818:54;;19498:2;19483:18;;4136:45;19334:2;19319:18;;19305:207::o;19519:564::-;-1:-1;;;;;35818:54;;;4136:45;;36403:13;;36396:21;19893:2;19878:18;;6769:34;35818:54;;19992:2;19977:18;;4136:45;36403:13;;36396:21;20069:2;20054:18;;6769:34;19734:3;19719:19;;19705:378::o;20090:333::-;-1:-1;;;;;35818:54;;;;4136:45;;20409:2;20394:18;;6987:37;20245:2;20230:18;;20216:207::o;20770:210::-;36403:13;;36396:21;6769:34;;20891:2;20876:18;;20862:118::o;20987:222::-;6987:37;;;21114:2;21099:18;;21085:124::o;21216:333::-;6987:37;;;-1:-1;;;;;35818:54;21535:2;21520:18;;4136:45;21371:2;21356:18;;21342:207::o;21556:736::-;;7017:5;6994:3;6987:37;21998:2;35829:42;;;;;;4174:5;35818:54;21998:2;21987:9;21983:18;4136:45;35829:42;4174:5;35818:54;22081:2;22070:9;22066:18;4136:45;21833:3;22118:2;22107:9;22103:18;22096:48;15921:14;21822:9;15921:14;16004:16;15998:23;21833:3;;21822:9;21818:19;16034:38;16087:103;4781:5;34044:12;34837:6;34832:3;34825:19;34865:14;21822:9;34865:14;4793:83;;21998:2;4947:5;33740:14;4959:21;;-1:-1;4992:10;;4986:260;5011:6;5008:1;5005:13;4986:260;;;5072:13;;35818:54;;4136:45;;34575:14;;;;5033:1;5026:9;;;;;3700:14;;;;4986:260;;;4990:14;21998:2;16276:5;16272:16;16266:23;16246:43;;16325:14;;;;;21822:9;16329:4;16325:14;;16309;21822:9;16309:14;16302:38;16355:103;16453:4;16439:12;16355:103;:::i;:::-;16347:111;;;;;22081:2;16540:5;16536:16;16530:23;16325:14;21822:9;16593:4;16589:14;;16573;21822:9;16573:14;16566:38;16619:71;16685:4;16671:12;16619:71;:::i;:::-;16611:79;;;;22118:2;16783:5;16779:16;16773:23;16802:57;16844:14;21822:9;16844:14;16830:12;16802:57;:::i;:::-;-1:-1;22150:132;21804:488;-1:-1;;;;;;21804:488::o;22992:244::-;23130:2;23115:18;;37633:37;8170:5;37633:37;:::i;:::-;8123:3;8116:61;23101:135;;;;:::o;23243:616::-;;36116:4;8619:5;36105:16;8577:3;8570:56;23488:2;23612;23601:9;23597:18;23590:48;23652:108;23488:2;23477:9;23473:18;23746:6;23652:108;:::i;:::-;23644:116;;36116:4;8619:5;36105:16;23845:2;23834:9;23830:18;8570:56;23459:400;;;;;;:::o;23866:310::-;;24013:2;24034:17;24027:47;24088:78;24013:2;24002:9;23998:18;24152:6;24088:78;:::i;24183:416::-;24383:2;24397:47;;;9217:2;24368:18;;;34825:19;-1:-1;;;34865:14;;;9233:43;9295:12;;;24354:245::o;24606:416::-;24806:2;24820:47;;;9546:2;24791:18;;;34825:19;-1:-1;;;34865:14;;;9562:34;9615:12;;;24777:245::o;25029:416::-;25229:2;25243:47;;;9866:2;25214:18;;;34825:19;9902:34;34865:14;;;9882:55;-1:-1;;;9957:12;;;9950:30;9999:12;;;25200:245::o;25452:416::-;25652:2;25666:47;;;10250:2;25637:18;;;34825:19;10286:29;34865:14;;;10266:50;10335:12;;;25623:245::o;25875:416::-;26075:2;26089:47;;;10586:2;26060:18;;;34825:19;10622:32;34865:14;;;10602:53;10674:12;;;26046:245::o;26298:416::-;26498:2;26512:47;;;10925:2;26483:18;;;34825:19;10961:34;34865:14;;;10941:55;-1:-1;;;11016:12;;;11009:30;11058:12;;;26469:245::o;26721:416::-;26921:2;26935:47;;;11309:2;26906:18;;;34825:19;11345:28;34865:14;;;11325:49;11393:12;;;26892:245::o;27144:416::-;27344:2;27358:47;;;11644:2;27329:18;;;34825:19;-1:-1;;;34865:14;;;11660:39;11718:12;;;27315:245::o;27567:416::-;27767:2;27781:47;;;11969:1;27752:18;;;34825:19;-1:-1;;;34865:14;;;11984:27;12030:12;;;27738:245::o;27990:416::-;28190:2;28204:47;;;12281:2;28175:18;;;34825:19;12317:34;34865:14;;;12297:55;-1:-1;;;12372:12;;;12365:25;12409:12;;;28161:245::o;28413:416::-;28613:2;28627:47;;;12660:1;28598:18;;;34825:19;-1:-1;;;34865:14;;;12675:29;12723:12;;;28584:245::o;28836:416::-;29036:2;29050:47;;;29021:18;;;34825:19;13010:34;34865:14;;;12990:55;13064:12;;;29007:245::o;29259:416::-;29459:2;29473:47;;;13315:2;29444:18;;;34825:19;13351:31;34865:14;;;13331:52;13402:12;;;29430:245::o;29682:416::-;29882:2;29896:47;;;13653:1;29867:18;;;34825:19;-1:-1;;;34865:14;;;13668:31;13718:12;;;29853:245::o;30105:416::-;30305:2;30319:47;;;13969:2;30290:18;;;34825:19;14005:34;34865:14;;;13985:55;-1:-1;;;14060:12;;;14053:34;14106:12;;;30276:245::o;30528:416::-;30728:2;30742:47;;;14357:2;30713:18;;;34825:19;14393:34;34865:14;;;14373:55;-1:-1;;;14448:12;;;14441:46;14506:12;;;30699:245::o;30951:856::-;;31287:3;31309:17;31302:47;17204:16;17198:23;31287:3;31276:9;31272:19;6987:37;37633;17369:4;17362:5;17358:16;17352:23;37633:37;:::i;:::-;17440:14;;;8116:61;17537:4;17526:16;;17520:23;-1:-1;;;;;35818:54;;;17597:14;;;4136:45;17695:4;17684:16;;17678:23;35818:54;17755:14;;;4136:45;17851:4;17840:16;;17834:23;17911:14;;;6987:37;35829:42;17998:16;;17992:23;17130:4;18035:14;;;18028:38;18081:71;17121:14;;;17992:23;18081:71;:::i;:::-;31355:122;;;31488:133;17369:4;31606:9;31602:18;31593:6;31488:133;:::i;:::-;18009:4;31693:19;;8423:58;;;;17130:4;31777:19;6987:37;31258:549;;-1:-1;;31258:549::o;32383:333::-;6987:37;;;32702:2;32687:18;;6987:37;32538:2;32523:18;;32509:207::o;32723:444::-;6987:37;;;33070:2;33055:18;;6987:37;;;;-1:-1;;;;;35818:54;33153:2;33138:18;;4136:45;32906:2;32891:18;;32877:290::o;33174:444::-;6987:37;;;33521:2;33506:18;;6987:37;;;;33604:2;33589:18;;6987:37;33357:2;33342:18;;33328:290::o;36637:132::-;36701:16;39372:1;39362:12;;39352:2;;39378:9;38168:268;38233:1;38240:101;38254:6;38251:1;38248:13;38240:101;;;38321:11;;;38315:18;38302:11;;;38295:39;38276:2;38269:10;38240:101;;;38356:6;38353:1;38350:13;38347:2;;;-1:-1;;38233:1;38403:16;;38396:27;38217:219::o;39401:117::-;-1:-1;;;;;35818:54;;39460:35;;39450:2;;39509:1;;39499:12;39525:111;39606:5;36403:13;36396:21;39584:5;39581:32;39571:2;;39627:1;;39617:12
Swarm Source
ipfs://e08f1b7e883529a7dda97333d3a91030158f7aa1efd0dd2a605881f02fe059d8
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 24 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|---|---|---|---|---|
FTM | 100.00% | $0.054281 | 25.2624 | $1.37 |
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.