Overview
ETH Balance
ETH Value
$0.00Latest 1 from a total of 1 transactions
| Transaction Hash |
|
Block
|
From
|
To
|
|||||
|---|---|---|---|---|---|---|---|---|---|
| Harvest | 259267058 | 489 days ago | IN | 0 ETH | 0.0000078 |
Latest 1 internal transaction
| Parent Transaction Hash | Block | From | To | |||
|---|---|---|---|---|---|---|
| 70871994 | 1053 days ago | 0 ETH |
Cross-Chain Transactions
Contract Source Code (Solidity)
/**
*Submitted for verification at Arbiscan.io on 2023-03-17
*/
// Sources flattened with hardhat v2.10.1-gzeon-c8fe47dd4 https://hardhat.org
// File contracts/lib/safe-math.sol
// SPDX-License-Identifier: MIT
pragma solidity 0.8.4;
/**
* @dev Wrappers over Solidity's arithmetic operations with added overflow
* checks.
*
* Arithmetic operations in Solidity wrap on overflow. This can easily result
* in bugs, because programmers usually assume that an overflow raises an
* error, which is the standard behavior in high level programming languages.
* `SafeMath` restores this intuition by reverting the transaction when an
* operation overflows.
*
* Using this library instead of the unchecked operations eliminates an entire
* class of bugs, so it's recommended to use it always.
*/
library SafeMath {
/**
* @dev Returns the addition of two unsigned integers, reverting on
* overflow.
*
* Counterpart to Solidity's `+` operator.
*
* Requirements:
*
* - Addition cannot overflow.
*/
function add(uint256 a, uint256 b) internal pure returns (uint256) {
uint256 c = a + b;
require(c >= a, "SafeMath: addition overflow");
return c;
}
/**
* @dev Returns the subtraction of two unsigned integers, reverting on
* overflow (when the result is negative).
*
* Counterpart to Solidity's `-` operator.
*
* Requirements:
*
* - Subtraction cannot overflow.
*/
function sub(uint256 a, uint256 b) internal pure returns (uint256) {
return sub(a, b, "SafeMath: subtraction overflow");
}
/**
* @dev Returns the subtraction of two unsigned integers, reverting with custom message on
* overflow (when the result is negative).
*
* Counterpart to Solidity's `-` operator.
*
* Requirements:
*
* - Subtraction cannot overflow.
*/
function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
require(b <= a, errorMessage);
uint256 c = a - b;
return c;
}
/**
* @dev Returns the multiplication of two unsigned integers, reverting on
* overflow.
*
* Counterpart to Solidity's `*` operator.
*
* Requirements:
*
* - Multiplication cannot overflow.
*/
function mul(uint256 a, uint256 b) internal pure returns (uint256) {
// Gas optimization: this is cheaper than requiring 'a' not being zero, but the
// benefit is lost if 'b' is also tested.
// See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
if (a == 0) {
return 0;
}
uint256 c = a * b;
require(c / a == b, "SafeMath: multiplication overflow");
return c;
}
/**
* @dev Returns the integer division of two unsigned integers. Reverts on
* division by zero. The result is rounded towards zero.
*
* Counterpart to Solidity's `/` operator. Note: this function uses a
* `revert` opcode (which leaves remaining gas untouched) while Solidity
* uses an invalid opcode to revert (consuming all remaining gas).
*
* Requirements:
*
* - The divisor cannot be zero.
*/
function div(uint256 a, uint256 b) internal pure returns (uint256) {
return div(a, b, "SafeMath: division by zero");
}
/**
* @dev Returns the integer division of two unsigned integers. Reverts with custom message on
* division by zero. The result is rounded towards zero.
*
* Counterpart to Solidity's `/` operator. Note: this function uses a
* `revert` opcode (which leaves remaining gas untouched) while Solidity
* uses an invalid opcode to revert (consuming all remaining gas).
*
* Requirements:
*
* - The divisor cannot be zero.
*/
function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
require(b > 0, errorMessage);
uint256 c = a / b;
// assert(a == b * c + a % b); // There is no case in which this doesn't hold
return c;
}
/**
* @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
* Reverts when dividing by zero.
*
* Counterpart to Solidity's `%` operator. This function uses a `revert`
* opcode (which leaves remaining gas untouched) while Solidity uses an
* invalid opcode to revert (consuming all remaining gas).
*
* Requirements:
*
* - The divisor cannot be zero.
*/
function mod(uint256 a, uint256 b) internal pure returns (uint256) {
return mod(a, b, "SafeMath: modulo by zero");
}
/**
* @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
* Reverts with custom message when dividing by zero.
*
* Counterpart to Solidity's `%` operator. This function uses a `revert`
* opcode (which leaves remaining gas untouched) while Solidity uses an
* invalid opcode to revert (consuming all remaining gas).
*
* Requirements:
*
* - The divisor cannot be zero.
*/
function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
require(b != 0, errorMessage);
return a % b;
}
}
// File contracts/lib/context.sol
pragma solidity 0.8.4;
/*
* @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 payable(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 contracts/lib/erc20.sol
// File: contracts/GSN/Context.sol
pragma solidity 0.8.4;
// File: contracts/token/ERC20/IERC20.sol
/**
* @dev Interface of the ERC20 standard as defined in the EIP.
*/
interface IERC20 {
/**
* @dev Returns the amount of tokens in existence.
*/
function totalSupply() external view returns (uint256);
/**
* @dev Returns the amount of tokens owned by `account`.
*/
function balanceOf(address account) external view returns (uint256);
/**
* @dev Moves `amount` tokens from the caller's account to `recipient`.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* Emits a {Transfer} event.
*/
function transfer(address recipient, uint256 amount) external returns (bool);
/**
* @dev Returns the remaining number of tokens that `spender` will be
* allowed to spend on behalf of `owner` through {transferFrom}. This is
* zero by default.
*
* This value changes when {approve} or {transferFrom} are called.
*/
function allowance(address owner, address spender) external view returns (uint256);
/**
* @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* IMPORTANT: Beware that changing an allowance with this method brings the risk
* that someone may use both the old and the new allowance by unfortunate
* transaction ordering. One possible solution to mitigate this race
* condition is to first reduce the spender's allowance to 0 and set the
* desired value afterwards:
* https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
*
* Emits an {Approval} event.
*/
function approve(address spender, uint256 amount) external returns (bool);
/**
* @dev Moves `amount` tokens from `sender` to `recipient` using the
* allowance mechanism. `amount` is then deducted from the caller's
* allowance.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* Emits a {Transfer} event.
*/
function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);
/**
* @dev Emitted when `value` tokens are moved from one account (`from`) to
* another (`to`).
*
* Note that `value` may be zero.
*/
event Transfer(address indexed from, address indexed to, uint256 value);
/**
* @dev Emitted when the allowance of a `spender` for an `owner` is set by
* a call to {approve}. `value` is the new allowance.
*/
event Approval(address indexed owner, address indexed spender, uint256 value);
}
// File: contracts/utils/Address.sol
/**
* @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");
return _functionCallWithValue(target, data, value, errorMessage);
}
function _functionCallWithValue(address target, bytes memory data, uint256 weiValue, string memory errorMessage) private returns (bytes memory) {
require(isContract(target), "Address: call to non-contract");
// solhint-disable-next-line avoid-low-level-calls
(bool success, bytes memory returndata) = target.call{ value: weiValue }(data);
if (success) {
return returndata;
} else {
// Look for revert reason and bubble it up if present
if (returndata.length > 0) {
// The easiest way to bubble the revert reason is using memory via assembly
// solhint-disable-next-line no-inline-assembly
assembly {
let returndata_size := mload(returndata)
revert(add(32, returndata), returndata_size)
}
} else {
revert(errorMessage);
}
}
}
}
// File: contracts/token/ERC20/ERC20.sol
/**
* @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;
using Address for address;
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_) {
_name = name_;
_symbol = symbol_;
_decimals = 18;
}
/**
* @dev Returns the name of the token.
*/
function name() public view returns (string memory) {
return _name;
}
/**
* @dev Returns the symbol of the token, usually a shorter version of the
* name.
*/
function symbol() public view returns (string memory) {
return _symbol;
}
/**
* @dev Returns the number of decimals used to get its user representation.
* For example, if `decimals` equals `2`, a balance of `505` tokens should
* be displayed to a user as `5,05` (`505 / 10 ** 2`).
*
* Tokens usually opt for a value of 18, imitating the relationship between
* Ether and Wei. This is the value {ERC20} uses, unless {_setupDecimals} is
* called.
*
* NOTE: This information is only used for _display_ purposes: it in
* no way affects any of the arithmetic of the contract, including
* {IERC20-balanceOf} and {IERC20-transfer}.
*/
function decimals() public view returns (uint8) {
return _decimals;
}
/**
* @dev See {IERC20-totalSupply}.
*/
function totalSupply() public view override returns (uint256) {
return _totalSupply;
}
/**
* @dev See {IERC20-balanceOf}.
*/
function balanceOf(address account) public view override returns (uint256) {
return _balances[account];
}
/**
* @dev See {IERC20-transfer}.
*
* Requirements:
*
* - `recipient` cannot be the zero address.
* - the caller must have a balance of at least `amount`.
*/
function transfer(address recipient, uint256 amount) public virtual override returns (bool) {
_transfer(_msgSender(), recipient, amount);
return true;
}
/**
* @dev See {IERC20-allowance}.
*/
function allowance(address owner, address spender) public view virtual override returns (uint256) {
return _allowances[owner][spender];
}
/**
* @dev See {IERC20-approve}.
*
* Requirements:
*
* - `spender` cannot be the zero address.
*/
function approve(address spender, uint256 amount) public virtual override returns (bool) {
_approve(_msgSender(), spender, amount);
return true;
}
/**
* @dev See {IERC20-transferFrom}.
*
* Emits an {Approval} event indicating the updated allowance. This is not
* required by the EIP. See the note at the beginning of {ERC20};
*
* Requirements:
* - `sender` and `recipient` cannot be the zero address.
* - `sender` must have a balance of at least `amount`.
* - the caller must have allowance for ``sender``'s tokens of at least
* `amount`.
*/
function transferFrom(address sender, address recipient, uint256 amount) public virtual override returns (bool) {
_transfer(sender, recipient, amount);
_approve(sender, _msgSender(), _allowances[sender][_msgSender()].sub(amount, "ERC20: transfer amount exceeds allowance"));
return true;
}
/**
* @dev Atomically increases the allowance granted to `spender` by the caller.
*
* This is an alternative to {approve} that can be used as a mitigation for
* problems described in {IERC20-approve}.
*
* Emits an {Approval} event indicating the updated allowance.
*
* Requirements:
*
* - `spender` cannot be the zero address.
*/
function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {
_approve(_msgSender(), spender, _allowances[_msgSender()][spender].add(addedValue));
return true;
}
/**
* @dev Atomically decreases the allowance granted to `spender` by the caller.
*
* This is an alternative to {approve} that can be used as a mitigation for
* problems described in {IERC20-approve}.
*
* Emits an {Approval} event indicating the updated allowance.
*
* Requirements:
*
* - `spender` cannot be the zero address.
* - `spender` must have allowance for the caller of at least
* `subtractedValue`.
*/
function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {
_approve(_msgSender(), spender, _allowances[_msgSender()][spender].sub(subtractedValue, "ERC20: decreased allowance below zero"));
return true;
}
/**
* @dev Moves tokens `amount` from `sender` to `recipient`.
*
* This is internal function is equivalent to {transfer}, and can be used to
* e.g. implement automatic token fees, slashing mechanisms, etc.
*
* Emits a {Transfer} event.
*
* Requirements:
*
* - `sender` cannot be the zero address.
* - `recipient` cannot be the zero address.
* - `sender` must have a balance of at least `amount`.
*/
function _transfer(address sender, address recipient, uint256 amount) internal virtual {
require(sender != address(0), "ERC20: transfer from the zero address");
require(recipient != address(0), "ERC20: transfer to the zero address");
_beforeTokenTransfer(sender, recipient, amount);
_balances[sender] = _balances[sender].sub(amount, "ERC20: transfer amount exceeds balance");
_balances[recipient] = _balances[recipient].add(amount);
emit Transfer(sender, recipient, amount);
}
/** @dev Creates `amount` tokens and assigns them to `account`, increasing
* the total supply.
*
* Emits a {Transfer} event with `from` set to the zero address.
*
* Requirements
*
* - `to` cannot be the zero address.
*/
function _mint(address account, uint256 amount) internal virtual {
require(account != address(0), "ERC20: mint to the zero address");
_beforeTokenTransfer(address(0), account, amount);
_totalSupply = _totalSupply.add(amount);
_balances[account] = _balances[account].add(amount);
emit Transfer(address(0), account, amount);
}
/**
* @dev Destroys `amount` tokens from `account`, reducing the
* total supply.
*
* Emits a {Transfer} event with `to` set to the zero address.
*
* Requirements
*
* - `account` cannot be the zero address.
* - `account` must have at least `amount` tokens.
*/
function _burn(address account, uint256 amount) internal virtual {
require(account != address(0), "ERC20: burn from the zero address");
_beforeTokenTransfer(account, address(0), amount);
_balances[account] = _balances[account].sub(amount, "ERC20: burn amount exceeds balance");
_totalSupply = _totalSupply.sub(amount);
emit Transfer(account, address(0), amount);
}
/**
* @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens.
*
* This internal function is equivalent to `approve`, and can be used to
* e.g. set automatic allowances for certain subsystems, etc.
*
* Emits an {Approval} event.
*
* Requirements:
*
* - `owner` cannot be the zero address.
* - `spender` cannot be the zero address.
*/
function _approve(address owner, address spender, uint256 amount) internal virtual {
require(owner != address(0), "ERC20: approve from the zero address");
require(spender != address(0), "ERC20: approve to the zero address");
_allowances[owner][spender] = amount;
emit Approval(owner, spender, amount);
}
/**
* @dev Sets {decimals} to a value other than the default one of 18.
*
* WARNING: This function should only be called from the constructor. Most
* applications that interact with token contracts will not expect
* {decimals} to ever change, and may work incorrectly if it does.
*/
function _setupDecimals(uint8 decimals_) internal {
_decimals = decimals_;
}
/**
* @dev Hook that is called before any transfer of tokens. This includes
* minting and burning.
*
* Calling conditions:
*
* - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens
* will be to transferred to `to`.
* - when `from` is zero, `amount` tokens will be minted for `to`.
* - when `to` is zero, `amount` of ``from``'s tokens will be burned.
* - `from` and `to` are never both zero.
*
* To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
*/
function _beforeTokenTransfer(address from, address to, uint256 amount) internal virtual { }
}
/**
* @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/interfaces/staking-rewards.sol
pragma solidity 0.8.4;
interface IStakingRewards {
function balanceOf(address account) external view returns (uint256);
function balances(address account) external view returns (uint256);
function earned(address account) external view returns (uint256);
function exit() external;
function getReward() external;
function getRewardForDuration() external view returns (uint256);
function lastTimeRewardApplicable() external view returns (uint256);
function lastUpdateTime() external view returns (uint256);
function notifyRewardAmount(uint256 reward) external;
function periodFinish() external view returns (uint256);
function rewardPerToken() external view returns (uint256);
function rewardPerTokenStored() external view returns (uint256);
function rewardRate() external view returns (uint256);
function rewards(address) external view returns (uint256);
function rewardsDistribution() external view returns (address);
function rewardsDuration() external view returns (uint256);
function rewardsToken() external view returns (address);
function stake(uint256 amount) external;
function deposit(uint256 amount) external;
function stakeWithPermit(
uint256 amount,
uint256 deadline,
uint8 v,
bytes32 r,
bytes32 s
) external;
function stakingToken() external view returns (address);
function totalSupply() external view returns (uint256);
function userRewardPerTokenPaid(address) external view returns (uint256);
function withdraw(uint256 amount) external;
}
interface IStakingRewardsFactory {
function deploy(address stakingToken, uint256 rewardAmount) external;
function isOwner() external view returns (bool);
function notifyRewardAmount(address stakingToken) external;
function notifyRewardAmounts() external;
function owner() external view returns (address);
function renounceOwnership() external;
function rewardsToken() external view returns (address);
function stakingRewardsGenesis() external view returns (uint256);
function stakingRewardsInfoByStakingToken(address)
external
view
returns (address stakingRewards, uint256 rewardAmount);
function stakingTokens(uint256) external view returns (address);
function transferOwnership(address newOwner) external;
}
// File contracts/interfaces/vault.sol
pragma solidity 0.8.4;
interface IVault is IERC20 {
function token() external view returns (address);
function reward() external view returns (address);
function claimInsurance() external; // NOTE: Only yDelegatedVault implements this
function getRatio() external view returns (uint256);
function depositAll() external;
function balance() external view returns (uint256);
function deposit(uint256) external;
function withdrawAll() external;
function withdraw(uint256) external;
function earn() external;
function decimals() external view returns (uint8);
}
// File contracts/interfaces/controller.sol
pragma solidity 0.8.4;
interface IController {
function vaults(address) external view returns (address);
function rewards() external view returns (address);
function devfund() external view returns (address);
function treasury() external view returns (address);
function balanceOf(address) external view returns (uint256);
function withdraw(address, uint256) external;
function earn(address, uint256) external;
// For Big Green Button:
function setVault(address _token, address _vault) external;
function approveStrategy(address _token, address _strategy) external;
function revokeStrategy(address _token, address _strategy) external;
function setStrategy(address _token, address _strategy) external;
function setStrategist(address _strategist) external;
function setGovernance(address _governance) external;
function setTimelock(address _timelock) external;
}
// File contracts/interfaces/uniswapv2.sol
pragma solidity 0.8.4;
interface UniswapRouterV2 {
function swapExactTokensForTokens(
uint256 amountIn,
uint256 amountOutMin,
address[] calldata path,
address to,
uint256 deadline
) external returns (uint256[] memory amounts);
function addLiquidity(
address tokenA,
address tokenB,
uint256 amountADesired,
uint256 amountBDesired,
uint256 amountAMin,
uint256 amountBMin,
address to,
uint256 deadline
)
external
returns (
uint256 amountA,
uint256 amountB,
uint256 liquidity
);
function addLiquidityETH(
address token,
uint256 amountTokenDesired,
uint256 amountTokenMin,
uint256 amountETHMin,
address to,
uint256 deadline
)
external
payable
returns (
uint256 amountToken,
uint256 amountETH,
uint256 liquidity
);
function removeLiquidity(
address tokenA,
address tokenB,
uint liquidity,
uint amountAMin,
uint amountBMin,
address to,
uint deadline
) external returns (uint amountA, uint amountB);
function removeLiquidityETH(
address token,
uint liquidity,
uint amountTokenMin,
uint amountETHMin,
address to,
uint deadline
) external returns (uint amountToken, uint amountETH);
function quote(
uint256 amountA,
uint256 reserveA,
uint256 reserveB
) external pure returns (uint256 amountB);
function getAmountOut(
uint256 amountIn,
uint256 reserveIn,
uint256 reserveOut
) external pure returns (uint256 amountOut);
function getAmountsOut(uint256 amountIn, address[] calldata path)
external
view
returns (uint256[] memory amounts);
function getAmountsIn(uint256 amountOut, address[] calldata path)
external
view
returns (uint256[] memory amounts);
function swapETHForExactTokens(
uint256 amountOut,
address[] calldata path,
address to,
uint256 deadline
) external payable returns (uint256[] memory amounts);
function swapExactETHForTokens(
uint amountOutMin,
address[] calldata path,
address to,
uint deadline
) external payable returns (uint256[] memory amounts);
}
interface IUniswapV2Pair {
event Approval(
address indexed owner,
address indexed spender,
uint256 value
);
event Transfer(address indexed from, address indexed to, uint256 value);
function name() external pure returns (string memory);
function symbol() external pure returns (string memory);
function decimals() external pure returns (uint8);
function totalSupply() external view returns (uint256);
function balanceOf(address owner) external view returns (uint256);
function allowance(address owner, address spender)
external
view
returns (uint256);
function approve(address spender, uint256 value) external returns (bool);
function transfer(address to, uint256 value) external returns (bool);
function transferFrom(
address from,
address to,
uint256 value
) external returns (bool);
function DOMAIN_SEPARATOR() external view returns (bytes32);
function PERMIT_TYPEHASH() external pure returns (bytes32);
function nonces(address owner) external view returns (uint256);
function permit(
address owner,
address spender,
uint256 value,
uint256 deadline,
uint8 v,
bytes32 r,
bytes32 s
) external;
event Mint(address indexed sender, uint256 amount0, uint256 amount1);
event Burn(
address indexed sender,
uint256 amount0,
uint256 amount1,
address indexed to
);
event Swap(
address indexed sender,
uint256 amount0In,
uint256 amount1In,
uint256 amount0Out,
uint256 amount1Out,
address indexed to
);
event Sync(uint112 reserve0, uint112 reserve1);
function MINIMUM_LIQUIDITY() external pure returns (uint256);
function factory() external view returns (address);
function token0() external view returns (address);
function token1() external view returns (address);
function getReserves()
external
view
returns (
uint112 reserve0,
uint112 reserve1,
uint32 blockTimestampLast
);
function price0CumulativeLast() external view returns (uint256);
function price1CumulativeLast() external view returns (uint256);
function kLast() external view returns (uint256);
function mint(address to) external returns (uint256 liquidity);
function burn(address to)
external
returns (uint256 amount0, uint256 amount1);
function swap(
uint256 amount0Out,
uint256 amount1Out,
address to,
bytes calldata data
) external;
function skim(address to) external;
function sync() external;
}
interface IUniswapV2Factory {
event PairCreated(
address indexed token0,
address indexed token1,
address pair,
uint256
);
function getPair(address tokenA, address tokenB)
external
view
returns (address pair);
function allPairs(uint256) external view returns (address pair);
function allPairsLength() external view returns (uint256);
function feeTo() external view returns (address);
function feeToSetter() external view returns (address);
function createPair(address tokenA, address tokenB)
external
returns (address pair);
}
// File contracts/interfaces/uniswapv3.sol
pragma solidity 0.8.4;
interface ISwapRouter{
struct ExactInputSingleParams {
address tokenIn;
address tokenOut;
uint24 fee;
address recipient;
uint256 deadline;
uint256 amountIn;
uint256 amountOutMinimum;
uint160 sqrtPriceLimitX96;
}
/// @notice Swaps `amountIn` of one token for as much as possible of another token
/// @param params The parameters necessary for the swap, encoded as `ExactInputSingleParams` in calldata
/// @return amountOut The amount of the received token
function exactInputSingle(ExactInputSingleParams calldata params) external payable returns (uint256 amountOut);
struct ExactInputParams {
bytes path;
address recipient;
uint256 deadline;
uint256 amountIn;
uint256 amountOutMinimum;
}
/// @notice Swaps `amountIn` of one token for as much as possible of another along the specified path
/// @param params The parameters necessary for the multi-hop swap, encoded as `ExactInputParams` in calldata
/// @return amountOut The amount of the received token
function exactInput(ExactInputParams calldata params) external payable returns (uint256 amountOut);
struct ExactOutputSingleParams {
address tokenIn;
address tokenOut;
uint24 fee;
address recipient;
uint256 deadline;
uint256 amountOut;
uint256 amountInMaximum;
uint160 sqrtPriceLimitX96;
}
/// @notice Swaps as little as possible of one token for `amountOut` of another token
/// @param params The parameters necessary for the swap, encoded as `ExactOutputSingleParams` in calldata
/// @return amountIn The amount of the input token
function exactOutputSingle(ExactOutputSingleParams calldata params) external payable returns (uint256 amountIn);
struct ExactOutputParams {
bytes path;
address recipient;
uint256 deadline;
uint256 amountOut;
uint256 amountInMaximum;
}
/// @notice Swaps as little as possible of one token for `amountOut` of another along the specified path (reversed)
/// @param params The parameters necessary for the multi-hop swap, encoded as `ExactOutputParams` in calldata
/// @return amountIn The amount of the input token
function exactOutput(ExactOutputParams calldata params) external payable returns (uint256 amountIn);
}
// File contracts/strategies/strategy-base-v3.sol
pragma solidity 0.8.4;
pragma abicoder v2;
/**
* The is the Strategy Base that most LPs will inherit
*/
abstract contract StrategyBaseV3 {
using SafeERC20 for IERC20;
using Address for address;
using SafeMath for uint256;
// Tokens
address public want;
address public constant weth = 0x82aF49447D8a07e3bd95BD0d56f35241523fBab1;
// Dex
address public uniswapRouterV3 = 0xE592427A0AEce92De3Edee1F18E0157C05861564;
address public sushiRouter = 0x1b02dA8Cb0d097eB8D57A175b88c7D8b47997506;
address public feeDistributor = 0xAd86ef5fD2eBc25bb9Db41A1FE8d0f2a322c7839;
// For this example, we will set the pool fee to 0.3%.
uint24 public constant poolFee = 3000;
// Perfomance fees - start with 10%
uint256 public performanceTreasuryFee = 1000;
uint256 public constant performanceTreasuryMax = 10000;
uint256 public performanceDevFee = 0;
uint256 public constant performanceDevMax = 10000;
// Withdrawal fee 0%
// - 0% to treasury
// - 0% to dev fund
uint256 public withdrawalTreasuryFee = 0;
uint256 public constant withdrawalTreasuryMax = 100000;
uint256 public withdrawalDevFundFee = 0;
uint256 public constant withdrawalDevFundMax = 100000;
// User accounts
address public governance;
address public controller;
address public strategist;
address public timelock;
mapping(address => bool) public harvesters;
constructor(
address _want,
address _governance,
address _strategist,
address _controller,
address _timelock
) {
require(_want != address(0));
require(_governance != address(0));
require(_strategist != address(0));
require(_controller != address(0));
require(_timelock != address(0));
want = _want;
governance = _governance;
strategist = _strategist;
controller = _controller;
timelock = _timelock;
}
// **** Modifiers **** //
modifier onlyBenevolent {
require(
harvesters[msg.sender] ||
msg.sender == governance ||
msg.sender == strategist
);
_;
}
// **** Views **** //
function balanceOfWant() public view returns (uint256) {
return IERC20(want).balanceOf(address(this));
}
function balanceOfPool() public virtual view returns (uint256);
function balanceOf() public view returns (uint256) {
return balanceOfWant().add(balanceOfPool());
}
function getName() external virtual pure returns (string memory);
// **** Setters **** //
function whitelistHarvester(address _harvester) external {
require(msg.sender == governance ||
msg.sender == strategist || harvesters[msg.sender], "not authorized");
harvesters[_harvester] = true;
}
function revokeHarvester(address _harvester) external {
require(msg.sender == governance ||
msg.sender == strategist, "not authorized");
harvesters[_harvester] = false;
}
function setFeeDistributor(address _feeDistributor) external {
require(msg.sender == governance, "not authorized");
feeDistributor = _feeDistributor;
}
function setWithdrawalDevFundFee(uint256 _withdrawalDevFundFee) external {
require(msg.sender == timelock, "!timelock");
withdrawalDevFundFee = _withdrawalDevFundFee;
}
function setWithdrawalTreasuryFee(uint256 _withdrawalTreasuryFee) external {
require(msg.sender == timelock, "!timelock");
withdrawalTreasuryFee = _withdrawalTreasuryFee;
}
function setPerformanceDevFee(uint256 _performanceDevFee) external {
require(msg.sender == timelock, "!timelock");
performanceDevFee = _performanceDevFee;
}
function setPerformanceTreasuryFee(uint256 _performanceTreasuryFee)
external
{
require(msg.sender == timelock, "!timelock");
performanceTreasuryFee = _performanceTreasuryFee;
}
function setStrategist(address _strategist) external {
require(msg.sender == governance, "!governance");
strategist = _strategist;
}
function setGovernance(address _governance) external {
require(msg.sender == governance, "!governance");
governance = _governance;
}
function setTimelock(address _timelock) external {
require(msg.sender == timelock, "!timelock");
timelock = _timelock;
}
function setController(address _controller) external {
require(msg.sender == timelock, "!timelock");
controller = _controller;
}
// **** State mutations **** //
function deposit() public virtual;
// Controller only function for creating additional rewards from dust
function withdraw(IERC20 _asset) external returns (uint256 balance) {
require(msg.sender == controller, "!controller");
require(want != address(_asset), "want");
balance = _asset.balanceOf(address(this));
_asset.safeTransfer(controller, balance);
}
// Withdraw partial funds, normally used with a vault withdrawal
function withdraw(uint256 _amount) external {
require(msg.sender == controller, "!controller");
uint256 _balance = IERC20(want).balanceOf(address(this));
if (_balance < _amount) {
_amount = _withdrawSome(_amount.sub(_balance));
_amount = _amount.add(_balance);
}
uint256 _feeDev = _amount.mul(withdrawalDevFundFee).div(
withdrawalDevFundMax
);
IERC20(want).safeTransfer(IController(controller).devfund(), _feeDev);
uint256 _feeTreasury = _amount.mul(withdrawalTreasuryFee).div(
withdrawalTreasuryMax
);
IERC20(want).safeTransfer(
IController(controller).treasury(),
_feeTreasury
);
address _vault = IController(controller).vaults(address(want));
require(_vault != address(0), "!vault"); // additional protection so we don't burn the funds
IERC20(want).safeTransfer(_vault, _amount.sub(_feeDev).sub(_feeTreasury));
}
// Withdraw funds, used to swap between strategies
function withdrawForSwap(uint256 _amount)
external
returns (uint256 balance)
{
require(msg.sender == controller, "!controller");
_withdrawSome(_amount);
balance = IERC20(want).balanceOf(address(this));
address _vault = IController(controller).vaults(address(want));
require(_vault != address(0), "!vault");
IERC20(want).safeTransfer(_vault, balance);
}
// Withdraw all funds, normally used when migrating strategies
function withdrawAll() external returns (uint256 balance) {
require(msg.sender == controller, "!controller");
_withdrawAll();
balance = IERC20(want).balanceOf(address(this));
address _vault = IController(controller).vaults(address(want));
require(_vault != address(0), "!vault"); // additional protection so we don't burn the funds
IERC20(want).safeTransfer(_vault, balance);
}
function _withdrawAll() internal {
_withdrawSome(balanceOfPool());
}
function _withdrawSome(uint256 _amount) internal virtual returns (uint256);
function harvest() public virtual;
// **** Emergency functions ****
function execute(address _target, bytes memory _data)
public
payable
returns (bytes memory response)
{
require(msg.sender == timelock, "!timelock");
require(_target != address(0), "!target");
// call contract in current context
assembly {
let succeeded := delegatecall(
sub(gas(), 5000),
_target,
add(_data, 0x20),
mload(_data),
0,
0
)
let size := returndatasize()
response := mload(0x40)
mstore(
0x40,
add(response, and(add(add(size, 0x20), 0x1f), not(0x1f)))
)
mstore(response, size)
returndatacopy(add(response, 0x20), 0, size)
switch iszero(succeeded)
case 1 {
// throw if delegatecall failed
revert(add(response, 0x20), size)
}
}
}
// **** Internal functions ****
function _swapSushiswap(
address _from,
address _to,
uint256 _amount
) internal {
require(_to != address(0));
address[] memory path;
if (_from == weth || _to == weth) {
path = new address[](2);
path[0] = _from;
path[1] = _to;
} else {
path = new address[](3);
path[0] = _from;
path[1] = weth;
path[2] = _to;
}
IERC20(_from).safeApprove(sushiRouter, 0);
IERC20(_from).safeApprove(sushiRouter, _amount);
UniswapRouterV2(sushiRouter).swapExactTokensForTokens(
_amount,
0,
path,
address(this),
block.timestamp.add(60)
);
}
function _swapSushiswapWithPath(
address[] memory path,
uint256 _amount
) internal {
require(path[1] != address(0));
IERC20(path[0]).safeApprove(sushiRouter, 0);
IERC20(path[0]).safeApprove(sushiRouter, _amount);
UniswapRouterV2(sushiRouter).swapExactTokensForTokens(
_amount,
0,
path,
address(this),
block.timestamp.add(60)
);
}
/// @notice swapExactInputSingle swaps a fixed amount of one token for a maximum possible amount of another
/// using the _from/_to 0.3% pool by calling `exactInputSingle` in the swap router.
/// @dev The calling address must approve this contract to spend at least `amountIn` worth of its _from token for this function to succeed.
/// @param _amount The exact amount of _from that will be swapped for _to.
/// @return amountOut The amount of _to received.
function _swapUniswap(
address _from,
address _to,
uint256 _amount
) internal returns (uint256 amountOut){
IERC20(_from).safeApprove(uniswapRouterV3, 0);
IERC20(_from).safeApprove(uniswapRouterV3, _amount);
ISwapRouter.ExactInputSingleParams memory params =
ISwapRouter.ExactInputSingleParams({
tokenIn: _from,
tokenOut: _to,
fee: poolFee,
recipient: address(this),
deadline: block.timestamp,
amountIn: _amount,
amountOutMinimum: 0,
sqrtPriceLimitX96: 0
});
// The call to `exactInputSingle` executes the swap.
amountOut = ISwapRouter(uniswapRouterV3).exactInputSingle(params);
}
function _swapUniswapWithPath(
address[] memory path,
uint256 _amount
) internal returns (uint256 amountOut){
IERC20(path[0]).safeApprove(uniswapRouterV3, 0);
IERC20(path[0]).safeApprove(uniswapRouterV3, _amount);
ISwapRouter.ExactInputParams memory params =
ISwapRouter.ExactInputParams({
path: abi.encodePacked(path[0], poolFee, path[1], poolFee, path[2]),
recipient: address(this),
deadline: block.timestamp,
amountIn: _amount,
amountOutMinimum: 0
});
// Executes the swap
amountOut = ISwapRouter(uniswapRouterV3).exactInput(params);
}
function _distributePerformanceFeesAndDeposit() internal {
uint256 _want = IERC20(want).balanceOf(address(this));
if (_want > 0) {
// Treasury fees
IERC20(want).safeTransfer(
IController(controller).treasury(),
_want.mul(performanceTreasuryFee).div(performanceTreasuryMax)
);
// Performance fee
IERC20(want).safeTransfer(
IController(controller).devfund(),
_want.mul(performanceDevFee).div(performanceDevMax)
);
deposit();
}
}
function _distributePerformanceFeesBasedAmountAndDeposit(uint256 _amount) internal {
uint256 _want = IERC20(want).balanceOf(address(this));
if (_amount > _want) {
_amount = _want;
}
if (_amount > 0) {
// Treasury fees
IERC20(want).safeTransfer(
IController(controller).treasury(),
_amount.mul(performanceTreasuryFee).div(performanceTreasuryMax)
);
// Performance fee
IERC20(want).safeTransfer(
IController(controller).devfund(),
_amount.mul(performanceDevFee).div(performanceDevMax)
);
deposit();
}
}
}
// File contracts/interfaces/hop.sol
pragma solidity 0.8.4;
interface IHopStakingRewards {
function balanceOf(address account) external view returns (uint256);
function earned(address account) external view returns (uint256);
function stake(uint256 amount) external;
function getReward() external;
function withdraw(uint256 amount) external;
}
interface IHopSwap {
function swap(uint8 tokenIndexFrom, uint8 tokenIndexTo, uint256 dx, uint256 minDy, uint256 deadline) external returns (uint256);
function addLiquidity(uint256[] calldata amounts, uint256 minToMint, uint256 deadline) external returns (uint256);
function getTokenBalance(uint8 index) external view returns (uint256);
}
// File contracts/strategies/hop/hop-farm-bases/strategy-hop-farm-base.sol
pragma solidity 0.8.4;
abstract contract StrategyHopFarmBase is StrategyBaseV3 {
using SafeERC20 for IERC20;
using Address for address;
using SafeMath for uint256;
// Token addresses
address public hop = 0xc5102fE9359FD9a28f877a67E36B0F050d81a3CC;
// Staking addresses and pools
address public stakingRewards;
address public liquidityPool;
// <token0>/<token1> pair
address public token0;
address public token1;
address rewardToken;
// How much tokens to keep?
uint256 public keep = 1000;
uint256 public keepReward = 1000;
uint256 public constant keepMax = 10000;
constructor(
address _stakingRewards,
address _liquidityPool,
address _token0,
address _token1,
address _lp,
address _governance,
address _strategist,
address _controller,
address _timelock
)
StrategyBaseV3(_lp, _governance, _strategist, _controller, _timelock)
{
token0 = _token0;
token1 = _token1;
liquidityPool = _liquidityPool;
stakingRewards = _stakingRewards;
}
function balanceOfPool() public view override returns (uint256) {
uint256 amount = IHopStakingRewards(stakingRewards).balanceOf(address(this));
return amount;
}
function getHarvestable() external view returns (uint256) {
uint256 _pendingHop = IHopStakingRewards(stakingRewards).earned(address(this));
return _pendingHop;
}
// **** Setters ****
function deposit() public override {
uint256 _want = IERC20(want).balanceOf(address(this));
if (_want > 0) {
IERC20(want).safeApprove(stakingRewards, 0);
IERC20(want).safeApprove(stakingRewards, _want);
IHopStakingRewards(stakingRewards).stake(_want);
}
}
function _withdrawSome(uint256 _amount)
internal
override
returns (uint256)
{
IHopStakingRewards(stakingRewards).withdraw(_amount);
return _amount;
}
// **** Setters ****
function setKeep(uint256 _keep) external {
require(msg.sender == timelock, "!timelock");
keep = _keep;
}
function setKeepReward(uint256 _keepReward) external {
require(msg.sender == timelock, "!timelock");
keepReward = _keepReward;
}
function setRewardToken(address _rewardToken) external {
require(
msg.sender == timelock || msg.sender == strategist,
"!timelock"
);
rewardToken = _rewardToken;
}
// **** State Mutations ****
// Declare a Harvest Event
event Harvest(uint _timestamp, uint _value);
function harvest() public override onlyBenevolent {
// Collects REWARD token(s)
IHopStakingRewards(stakingRewards).getReward();
uint256 _hop = IERC20(hop).balanceOf(address(this));
if (_hop > 0) {
// 10% is locked up for future gov
uint256 _keepHOP = _hop.mul(keep).div(keepMax);
IERC20(hop).safeTransfer(
IController(controller).treasury(),
_keepHOP
);
_hop = IERC20(hop).balanceOf(address(this));
_swapUniswap(hop, weth, _hop);
}
// Collect reward tokens
if (rewardToken != address(0)) {
uint256 _reward = IERC20(rewardToken).balanceOf(address(this));
if (_reward > 0) {
uint256 _keepReward = _reward.mul(keepReward).div(keepMax);
IERC20(rewardToken).safeTransfer(
IController(controller).treasury(),
_keepReward
);
_reward = IERC20(rewardToken).balanceOf(address(this));
_swapUniswap(rewardToken, weth, _reward);
}
}
// Checks token0 vs token1 and swap if necessary
if(token0 != weth){
uint256 _weth = IERC20(weth).balanceOf(address(this));
_swapUniswap(weth, token0, _weth);
}
uint256 _token0 = IERC20(token0).balanceOf(address(this));
uint256 _tokenBalance0 = IHopSwap(liquidityPool).getTokenBalance(0);
uint256 _tokenBalance1 = IHopSwap(liquidityPool).getTokenBalance(1);
if(_tokenBalance0 >= _tokenBalance1){
IERC20(token0).safeApprove(liquidityPool, 0);
IERC20(token0).safeApprove(liquidityPool, _token0);
IHopSwap(liquidityPool).swap(
0,
1,
_token0,
0,
block.timestamp
);
}
// Adds in liquidity for token0/token1
_token0 = IERC20(token0).balanceOf(address(this));
uint256 _token1 = IERC20(token1).balanceOf(address(this));
uint256[] memory amounts;
amounts = new uint256[](2);
amounts[0] = _token0;
amounts[1] = _token1;
if (_token0 > 0 || _token1 > 0) {
IERC20(token0).safeApprove(liquidityPool, 0);
IERC20(token0).safeApprove(liquidityPool, _token0);
IERC20(token1).safeApprove(liquidityPool, 0);
IERC20(token1).safeApprove(liquidityPool, _token1);
IHopSwap(liquidityPool).addLiquidity(
amounts,
0,
block.timestamp
);
// Donates DUST
IERC20(token0).transfer(
IController(controller).treasury(),
IERC20(token0).balanceOf(address(this))
);
IERC20(token1).safeTransfer(
IController(controller).treasury(),
IERC20(token1).balanceOf(address(this))
);
}
uint256 _want = IERC20(want).balanceOf(address(this));
emit Harvest(block.timestamp, _want);
// We want to get back SUSHI LP tokens
_distributePerformanceFeesAndDeposit();
}
}
// File contracts/strategies/hop/strategy-hop-dai.sol
pragma solidity 0.8.4;
contract StrategyHopDai is StrategyHopFarmBase {
// Token addresses
address public hop_dai_lp = 0x68f5d998F00bB2460511021741D098c05721d8fF;
address public dai = 0xDA10009cBd5D07dd0CeCc66161FC93D7c9000da1;
address public hdai = 0x46ae9BaB8CEA96610807a275EBD36f8e916b5C61;
// Pool and staking addresses
address public dai_pool = 0xa5A33aB9063395A90CCbEa2D86a62EcCf27B5742;
address public dai_rewards = 0xd4D28588ac1D9EF272aa29d4424e3E2A03789D1E;
constructor(
address _governance,
address _strategist,
address _controller,
address _timelock
)
StrategyHopFarmBase(
dai_rewards,
dai_pool,
dai,
hdai,
hop_dai_lp,
_governance,
_strategist,
_controller,
_timelock
)
{}
// **** Views ****
function getName() external override pure returns (string memory) {
return "StrategyHopDai";
}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"address","name":"_governance","type":"address"},{"internalType":"address","name":"_strategist","type":"address"},{"internalType":"address","name":"_controller","type":"address"},{"internalType":"address","name":"_timelock","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_timestamp","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"Harvest","type":"event"},{"inputs":[],"name":"balanceOf","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":"controller","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"dai","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"dai_pool","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"dai_rewards","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"deposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_target","type":"address"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"execute","outputs":[{"internalType":"bytes","name":"response","type":"bytes"}],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"feeDistributor","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getHarvestable","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getName","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"governance","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"harvest","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"harvesters","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"hdai","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"hop","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"hop_dai_lp","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"keep","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"keepMax","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"keepReward","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"liquidityPool","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"performanceDevFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"performanceDevMax","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"performanceTreasuryFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"performanceTreasuryMax","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"poolFee","outputs":[{"internalType":"uint24","name":"","type":"uint24"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_harvester","type":"address"}],"name":"revokeHarvester","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_controller","type":"address"}],"name":"setController","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_feeDistributor","type":"address"}],"name":"setFeeDistributor","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_governance","type":"address"}],"name":"setGovernance","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_keep","type":"uint256"}],"name":"setKeep","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_keepReward","type":"uint256"}],"name":"setKeepReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_performanceDevFee","type":"uint256"}],"name":"setPerformanceDevFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_performanceTreasuryFee","type":"uint256"}],"name":"setPerformanceTreasuryFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_rewardToken","type":"address"}],"name":"setRewardToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_strategist","type":"address"}],"name":"setStrategist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_timelock","type":"address"}],"name":"setTimelock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_withdrawalDevFundFee","type":"uint256"}],"name":"setWithdrawalDevFundFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_withdrawalTreasuryFee","type":"uint256"}],"name":"setWithdrawalTreasuryFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"stakingRewards","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"strategist","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sushiRouter","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"timelock","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"token0","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"token1","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uniswapRouterV3","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":"weth","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_harvester","type":"address"}],"name":"whitelistHarvester","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"_asset","type":"address"}],"name":"withdraw","outputs":[{"internalType":"uint256","name":"balance","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawAll","outputs":[{"internalType":"uint256","name":"balance","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"withdrawForSwap","outputs":[{"internalType":"uint256","name":"balance","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawalDevFundFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdrawalDevFundMax","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdrawalTreasuryFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdrawalTreasuryMax","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"}]Contract Creation Code
6080604052600180546001600160a01b031990811673e592427a0aece92de3edee1f18e0157c0586156417909155600280548216731b02da8cb0d097eb8d57a175b88c7d8b4799750617905560038054821673ad86ef5fd2ebc25bb9db41a1fe8d0f2a322c78391790556103e86004819055600060058190556006819055600755600d8054831673c5102fe9359fd9a28f877a67e36b0f050d81a3cc17905560138190556014556015805482167368f5d998f00bb2460511021741d098c05721d8ff17905560168054821673da10009cbd5d07dd0cecc66161fc93d7c9000da11790556017805482167346ae9bab8cea96610807a275ebd36f8e916b5c6117905560188054821673a5a33ab9063395a90ccbea2d86a62eccf27b57421790556019805490911673d4d28588ac1d9ef272aa29d4424e3e2a03789d1e1790553480156200014a57600080fd5b506040516200357b3803806200357b8339810160408190526200016d91620002c3565b6019546018546016546017546015546001600160a01b03948516949384169392831692918216911688888888848484848484620001a957600080fd5b6001600160a01b038416620001bd57600080fd5b6001600160a01b038316620001d157600080fd5b6001600160a01b038216620001e557600080fd5b6001600160a01b038116620001f957600080fd5b600080546001600160a01b03199081166001600160a01b039788161790915560088054821695871695909517909455600a8054851693861693909317909255600980548416918516919091179055600b8054831691841691909117905560108054821699831699909917909855601180548916978216979097179096555050600f80548616968516969096179095555050600e8054909216931692909217909155506200031f9350505050565b80516001600160a01b0381168114620002be57600080fd5b919050565b60008060008060808587031215620002d9578384fd5b620002e485620002a6565b9350620002f460208601620002a6565b92506200030460408601620002a6565b91506200031460608601620002a6565b905092959194509250565b61324c806200032f6000396000f3fe6080604052600436106103815760003560e01c8063722713f7116101d1578063bdacb30311610102578063d0e30db0116100a0578063f4b9fa751161006f578063f4b9fa75146109dc578063f77c4791146109fc578063fb84ba6314610a1c578063fe1f8f7a146105cd57600080fd5b8063d0e30db014610971578063d21220a714610986578063d33219b4146109a6578063e4d06d82146109c657600080fd5b8063c6223e26116100dc578063c6223e26146108f1578063c65e324214610911578063c7b9d53014610931578063ccfc2e8d1461095157600080fd5b8063bdacb303146108a6578063c1a3d44c146108c6578063c39d4334146108db57600080fd5b8063916a7a781161016f578063ab73e43311610149578063ab73e43314610826578063b0b8579b14610846578063b5b86a1214610866578063ba40273d1461088657600080fd5b8063916a7a78146107c657806392eefe9b146107e6578063ab033ea91461080657600080fd5b806387976583116101ab578063879765831461073a57806388993f221461077a5780638aee8127146107905780638ccdbb70146107b057600080fd5b8063722713f7146106f05780638237859414610705578063853828b61461072557600080fd5b806326e886c6116102b657806351cff8d9116102545780635aa6e675116102235780635aa6e6751461067057806364b87a7014610690578063665a11ca146106b05780636d13582c146106d057600080fd5b806351cff8d91461060457806351f3d0b81461062457806354df7b631461063a57806359739ec41461065a57600080fd5b80634641257d116102905780634641257d146105b8578063479119be146105cd5780634c2798ad146105e45780634fe809cc1461041057600080fd5b806326e886c6146104105780632e1a7d4d146105705780633fc8cef31461059057600080fd5b806311588086116103235780631cff79cd116102fd5780631cff79cd146104fd5780631f1fcd51146105105780631fe4a68614610530578063249fb9b41461055057600080fd5b8063115880861461048657806317d7de7c1461049b57806318eb0e0b146104db57600080fd5b80630975d8d81161035f5780630975d8d8146104105780630d43e8ad146104265780630dfe16811461044657806310f91b0b1461046657600080fd5b80630431f144146103865780630547104d146103c3578063089fe6aa146103e6575b600080fd5b34801561039257600080fd5b506017546103a6906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b3480156103cf57600080fd5b506103d8610a3c565b6040519081526020016103ba565b3480156103f257600080fd5b506103fc610bb881565b60405162ffffff90911681526020016103ba565b34801561041c57600080fd5b506103d861271081565b34801561043257600080fd5b506003546103a6906001600160a01b031681565b34801561045257600080fd5b506010546103a6906001600160a01b031681565b34801561047257600080fd5b506001546103a6906001600160a01b031681565b34801561049257600080fd5b506103d8610ac1565b3480156104a757600080fd5b5060408051808201909152600e81526d5374726174656779486f7044616960901b60208201525b6040516103ba9190613094565b3480156104e757600080fd5b506104fb6104f6366004612eb8565b610af6565b005b6104ce61050b366004612ef0565b610b5f565b34801561051c57600080fd5b506000546103a6906001600160a01b031681565b34801561053c57600080fd5b50600a546103a6906001600160a01b031681565b34801561055c57600080fd5b506104fb61056b366004612fcf565b610c1c565b34801561057c57600080fd5b506104fb61058b366004612fcf565b610c4b565b34801561059c57600080fd5b506103a67382af49447d8a07e3bd95bd0d56f35241523fbab181565b3480156105c457600080fd5b506104fb610f2a565b3480156105d957600080fd5b506103d8620186a081565b3480156105f057600080fd5b506104fb6105ff366004612fcf565b611ce2565b34801561061057600080fd5b506103d861061f366004612eb8565b611d11565b34801561063057600080fd5b506103d860075481565b34801561064657600080fd5b506104fb610655366004612eb8565b611e1e565b34801561066657600080fd5b506103d860045481565b34801561067c57600080fd5b506008546103a6906001600160a01b031681565b34801561069c57600080fd5b50600e546103a6906001600160a01b031681565b3480156106bc57600080fd5b50600f546103a6906001600160a01b031681565b3480156106dc57600080fd5b506002546103a6906001600160a01b031681565b3480156106fc57600080fd5b506103d8611e9b565b34801561071157600080fd5b506104fb610720366004612fcf565b611ebb565b34801561073157600080fd5b506103d8611eea565b34801561074657600080fd5b5061076a610755366004612eb8565b600c6020526000908152604090205460ff1681565b60405190151581526020016103ba565b34801561078657600080fd5b506103d860055481565b34801561079c57600080fd5b506104fb6107ab366004612eb8565b612062565b3480156107bc57600080fd5b506103d860065481565b3480156107d257600080fd5b506019546103a6906001600160a01b031681565b3480156107f257600080fd5b506104fb610801366004612eb8565b6120c3565b34801561081257600080fd5b506104fb610821366004612eb8565b61210f565b34801561083257600080fd5b506104fb610841366004612fcf565b612179565b34801561085257600080fd5b50600d546103a6906001600160a01b031681565b34801561087257600080fd5b506018546103a6906001600160a01b031681565b34801561089257600080fd5b506104fb6108a1366004612fcf565b6121a8565b3480156108b257600080fd5b506104fb6108c1366004612eb8565b6121d7565b3480156108d257600080fd5b506103d8612223565b3480156108e757600080fd5b506103d860145481565b3480156108fd57600080fd5b506103d861090c366004612fcf565b61229f565b34801561091d57600080fd5b506104fb61092c366004612fcf565b61241b565b34801561093d57600080fd5b506104fb61094c366004612eb8565b61244a565b34801561095d57600080fd5b506104fb61096c366004612eb8565b6124b4565b34801561097d57600080fd5b506104fb612500565b34801561099257600080fd5b506011546103a6906001600160a01b031681565b3480156109b257600080fd5b50600b546103a6906001600160a01b031681565b3480156109d257600080fd5b506103d860135481565b3480156109e857600080fd5b506016546103a6906001600160a01b031681565b348015610a0857600080fd5b506009546103a6906001600160a01b031681565b348015610a2857600080fd5b506015546103a6906001600160a01b031681565b600e546040516246613160e11b815230600482015260009182916001600160a01b0390911690628cc262906024015b60206040518083038186803b158015610a8357600080fd5b505afa158015610a97573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610abb9190612fe7565b92915050565b600e546040516370a0823160e01b815230600482015260009182916001600160a01b03909116906370a0823190602401610a6b565b6008546001600160a01b0316331480610b195750600a546001600160a01b031633145b610b3e5760405162461bcd60e51b8152600401610b35906130cc565b60405180910390fd5b6001600160a01b03166000908152600c60205260409020805460ff19169055565b600b546060906001600160a01b03163314610b8c5760405162461bcd60e51b8152600401610b3590613114565b6001600160a01b038316610bcc5760405162461bcd60e51b8152602060048201526007602482015266085d185c99d95d60ca1b6044820152606401610b35565b600080835160208501866113885a03f43d6040519250601f19601f6020830101168301604052808352806000602085013e811560018114610c0c57610c13565b8160208501fd5b50505092915050565b600b546001600160a01b03163314610c465760405162461bcd60e51b8152600401610b3590613114565b600455565b6009546001600160a01b03163314610c755760405162461bcd60e51b8152600401610b35906130a7565b600080546040516370a0823160e01b81523060048201526001600160a01b03909116906370a082319060240160206040518083038186803b158015610cb957600080fd5b505afa158015610ccd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cf19190612fe7565b905081811015610d1c57610d0d610d08838361261d565b612666565b9150610d1982826126cb565b91505b6000610d40620186a0610d3a6007548661272a90919063ffffffff16565b906127a9565b9050610dde600960009054906101000a90046001600160a01b03166001600160a01b0316638d8f1e676040518163ffffffff1660e01b815260040160206040518083038186803b158015610d9357600080fd5b505afa158015610da7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610dcb9190612ed4565b6000546001600160a01b031690836127eb565b6000610dfc620186a0610d3a6006548761272a90919063ffffffff16565b9050610e4f600960009054906101000a90046001600160a01b03166001600160a01b03166361d027b36040518163ffffffff1660e01b815260040160206040518083038186803b158015610d9357600080fd5b60095460008054604051632988bb9f60e21b81526001600160a01b0391821660048201529192169063a622ee7c9060240160206040518083038186803b158015610e9857600080fd5b505afa158015610eac573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ed09190612ed4565b90506001600160a01b038116610ef85760405162461bcd60e51b8152600401610b35906130f4565b610f2381610f1084610f0a898861261d565b9061261d565b6000546001600160a01b031691906127eb565b5050505050565b336000908152600c602052604090205460ff1680610f5257506008546001600160a01b031633145b80610f675750600a546001600160a01b031633145b610f7057600080fd5b600e60009054906101000a90046001600160a01b03166001600160a01b0316633d18b9126040518163ffffffff1660e01b8152600401600060405180830381600087803b158015610fc057600080fd5b505af1158015610fd4573d6000803e3d6000fd5b5050600d546040516370a0823160e01b8152306004820152600093506001600160a01b0390911691506370a082319060240160206040518083038186803b15801561101e57600080fd5b505afa158015611032573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110569190612fe7565b905080156111c557600061107b612710610d3a6013548561272a90919063ffffffff16565b9050611119600960009054906101000a90046001600160a01b03166001600160a01b03166361d027b36040518163ffffffff1660e01b815260040160206040518083038186803b1580156110ce57600080fd5b505afa1580156110e2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111069190612ed4565b600d546001600160a01b031690836127eb565b600d546040516370a0823160e01b81523060048201526001600160a01b03909116906370a082319060240160206040518083038186803b15801561115c57600080fd5b505afa158015611170573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111949190612fe7565b600d549092506111c2906001600160a01b03167382af49447d8a07e3bd95bd0d56f35241523fbab184612853565b50505b6012546001600160a01b0316156113c3576012546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a082319060240160206040518083038186803b15801561121a57600080fd5b505afa15801561122e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112529190612fe7565b905080156113c1576000611277612710610d3a6014548561272a90919063ffffffff16565b9050611315600960009054906101000a90046001600160a01b03166001600160a01b03166361d027b36040518163ffffffff1660e01b815260040160206040518083038186803b1580156112ca57600080fd5b505afa1580156112de573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113029190612ed4565b6012546001600160a01b031690836127eb565b6012546040516370a0823160e01b81523060048201526001600160a01b03909116906370a082319060240160206040518083038186803b15801561135857600080fd5b505afa15801561136c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113909190612fe7565b6012549092506113be906001600160a01b03167382af49447d8a07e3bd95bd0d56f35241523fbab184612853565b50505b505b6010546001600160a01b03167382af49447d8a07e3bd95bd0d56f35241523fbab1146114a0576040516370a0823160e01b81523060048201526000907382af49447d8a07e3bd95bd0d56f35241523fbab1906370a082319060240160206040518083038186803b15801561143657600080fd5b505afa15801561144a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061146e9190612fe7565b60105490915061149d907382af49447d8a07e3bd95bd0d56f35241523fbab1906001600160a01b031683612853565b50505b6010546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a082319060240160206040518083038186803b1580156114e457600080fd5b505afa1580156114f8573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061151c9190612fe7565b600f546040516391ceb3eb60e01b81526000600482018190529293506001600160a01b03909116906391ceb3eb9060240160206040518083038186803b15801561156557600080fd5b505afa158015611579573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061159d9190612fe7565b600f546040516391ceb3eb60e01b8152600160048201529192506000916001600160a01b03909116906391ceb3eb9060240160206040518083038186803b1580156115e757600080fd5b505afa1580156115fb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061161f9190612fe7565b90508082106116fe57600f54601054611646916001600160a01b0391821691166000612997565b600f54601054611663916001600160a01b03918216911685612997565b600f546040516348b4aac360e11b8152600060048201819052600160248301526044820186905260648201524260848201526001600160a01b039091169063916955869060a401602060405180830381600087803b1580156116c457600080fd5b505af11580156116d8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116fc9190612fe7565b505b6010546040516370a0823160e01b81523060048201526001600160a01b03909116906370a082319060240160206040518083038186803b15801561174157600080fd5b505afa158015611755573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117799190612fe7565b6011546040516370a0823160e01b81523060048201529194506000916001600160a01b03909116906370a082319060240160206040518083038186803b1580156117c257600080fd5b505afa1580156117d6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117fa9190612fe7565b604080516002808252606080830184529394509091602083019080368337019050509050848160008151811061184057634e487b7160e01b600052603260045260246000fd5b602002602001018181525050818160018151811061186e57634e487b7160e01b600052603260045260246000fd5b60200260200101818152505060008511806118895750600082115b15611c1957600f546010546118ac916001600160a01b0391821691166000612997565b600f546010546118c9916001600160a01b03918216911687612997565b600f546011546118e7916001600160a01b0391821691166000612997565b600f54601154611904916001600160a01b03918216911684612997565b600f54604051634d49e87d60e01b81526001600160a01b0390911690634d49e87d906119399084906000904290600401613047565b602060405180830381600087803b15801561195357600080fd5b505af1158015611967573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061198b9190612fe7565b50601054600954604080516361d027b360e01b815290516001600160a01b039384169363a9059cbb9316916361d027b3916004808301926020929190829003018186803b1580156119db57600080fd5b505afa1580156119ef573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a139190612ed4565b6010546040516370a0823160e01b81523060048201526001600160a01b03909116906370a082319060240160206040518083038186803b158015611a5657600080fd5b505afa158015611a6a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a8e9190612fe7565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401602060405180830381600087803b158015611ad457600080fd5b505af1158015611ae8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b0c9190612faf565b50600954604080516361d027b360e01b81529051611c19926001600160a01b0316916361d027b3916004808301926020929190829003018186803b158015611b5357600080fd5b505afa158015611b67573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b8b9190612ed4565b6011546040516370a0823160e01b81523060048201526001600160a01b03909116906370a082319060240160206040518083038186803b158015611bce57600080fd5b505afa158015611be2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c069190612fe7565b6011546001600160a01b031691906127eb565b600080546040516370a0823160e01b81523060048201526001600160a01b03909116906370a082319060240160206040518083038186803b158015611c5d57600080fd5b505afa158015611c71573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c959190612fe7565b60408051428152602081018390529192507f6c8433a8e155f0af04dba058d4e4695f7da554578963d876bdf4a6d8d6399d9c910160405180910390a1611cd9612abb565b50505050505050565b600b546001600160a01b03163314611d0c5760405162461bcd60e51b8152600401610b3590613114565b601455565b6009546000906001600160a01b03163314611d3e5760405162461bcd60e51b8152600401610b35906130a7565b6000546001600160a01b0383811691161415611d855760405162461bcd60e51b8152600401610b35906020808252600490820152631dd85b9d60e21b604082015260600190565b6040516370a0823160e01b81523060048201526001600160a01b038316906370a082319060240160206040518083038186803b158015611dc457600080fd5b505afa158015611dd8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611dfc9190612fe7565b600954909150611e19906001600160a01b038481169116836127eb565b919050565b6008546001600160a01b0316331480611e415750600a546001600160a01b031633145b80611e5b5750336000908152600c602052604090205460ff165b611e775760405162461bcd60e51b8152600401610b35906130cc565b6001600160a01b03166000908152600c60205260409020805460ff19166001179055565b6000611eb6611ea8610ac1565b611eb0612223565b906126cb565b905090565b600b546001600160a01b03163314611ee55760405162461bcd60e51b8152600401610b3590613114565b600655565b6009546000906001600160a01b03163314611f175760405162461bcd60e51b8152600401610b35906130a7565b611f1f612c79565b6000546040516370a0823160e01b81523060048201526001600160a01b03909116906370a082319060240160206040518083038186803b158015611f6257600080fd5b505afa158015611f76573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f9a9190612fe7565b60095460008054604051632988bb9f60e21b81526001600160a01b039182166004820152939450909291169063a622ee7c9060240160206040518083038186803b158015611fe757600080fd5b505afa158015611ffb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061201f9190612ed4565b90506001600160a01b0381166120475760405162461bcd60e51b8152600401610b35906130f4565b60005461205e906001600160a01b031682846127eb565b5090565b600b546001600160a01b03163314806120855750600a546001600160a01b031633145b6120a15760405162461bcd60e51b8152600401610b3590613114565b601280546001600160a01b0319166001600160a01b0392909216919091179055565b600b546001600160a01b031633146120ed5760405162461bcd60e51b8152600401610b3590613114565b600980546001600160a01b0319166001600160a01b0392909216919091179055565b6008546001600160a01b031633146121575760405162461bcd60e51b815260206004820152600b60248201526a21676f7665726e616e636560a81b6044820152606401610b35565b600880546001600160a01b0319166001600160a01b0392909216919091179055565b600b546001600160a01b031633146121a35760405162461bcd60e51b8152600401610b3590613114565b600755565b600b546001600160a01b031633146121d25760405162461bcd60e51b8152600401610b3590613114565b601355565b600b546001600160a01b031633146122015760405162461bcd60e51b8152600401610b3590613114565b600b80546001600160a01b0319166001600160a01b0392909216919091179055565b600080546040516370a0823160e01b81523060048201526001600160a01b03909116906370a082319060240160206040518083038186803b15801561226757600080fd5b505afa15801561227b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611eb69190612fe7565b6009546000906001600160a01b031633146122cc5760405162461bcd60e51b8152600401610b35906130a7565b6122d582612666565b506000546040516370a0823160e01b81523060048201526001600160a01b03909116906370a082319060240160206040518083038186803b15801561231957600080fd5b505afa15801561232d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123519190612fe7565b60095460008054604051632988bb9f60e21b81526001600160a01b039182166004820152939450909291169063a622ee7c9060240160206040518083038186803b15801561239e57600080fd5b505afa1580156123b2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123d69190612ed4565b90506001600160a01b0381166123fe5760405162461bcd60e51b8152600401610b35906130f4565b600054612415906001600160a01b031682846127eb565b50919050565b600b546001600160a01b031633146124455760405162461bcd60e51b8152600401610b3590613114565b600555565b6008546001600160a01b031633146124925760405162461bcd60e51b815260206004820152600b60248201526a21676f7665726e616e636560a81b6044820152606401610b35565b600a80546001600160a01b0319166001600160a01b0392909216919091179055565b6008546001600160a01b031633146124de5760405162461bcd60e51b8152600401610b35906130cc565b600380546001600160a01b0319166001600160a01b0392909216919091179055565b600080546040516370a0823160e01b81523060048201526001600160a01b03909116906370a082319060240160206040518083038186803b15801561254457600080fd5b505afa158015612558573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061257c9190612fe7565b9050801561261a57600e54600080546125a3926001600160a01b0391821692911690612997565b600e546000546125c0916001600160a01b03918216911683612997565b600e5460405163534a7e1d60e11b8152600481018390526001600160a01b039091169063a694fc3a90602401600060405180830381600087803b15801561260657600080fd5b505af1158015610f23573d6000803e3d6000fd5b50565b600061265f83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250612c84565b9392505050565b600e54604051632e1a7d4d60e01b8152600481018390526000916001600160a01b031690632e1a7d4d90602401600060405180830381600087803b1580156126ad57600080fd5b505af11580156126c1573d6000803e3d6000fd5b5093949350505050565b6000806126d88385613137565b90508381101561265f5760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006044820152606401610b35565b60008261273957506000610abb565b6000612745838561316f565b905082612752858361314f565b1461265f5760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6044820152607760f81b6064820152608401610b35565b600061265f83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250612cb5565b6040516001600160a01b03831660248201526044810182905261284e90849063a9059cbb60e01b906064015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152612ce3565b505050565b600154600090612870906001600160a01b03868116911683612997565b60015461288a906001600160a01b03868116911684612997565b60408051610100810182526001600160a01b03868116825285811660208301908152610bb88385019081523060608501908152426080860190815260a08601898152600060c0880181815260e08901918252600154995163414bf38960e01b8152895189166004820152965188166024880152945162ffffff166044870152925186166064860152905160848501525160a4840152905160c483015251821660e48201529192169063414bf3899061010401602060405180830381600087803b15801561295657600080fd5b505af115801561296a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061298e9190612fe7565b95945050505050565b801580612a205750604051636eb1769f60e11b81523060048201526001600160a01b03838116602483015284169063dd62ed3e9060440160206040518083038186803b1580156129e657600080fd5b505afa1580156129fa573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a1e9190612fe7565b155b612a8b5760405162461bcd60e51b815260206004820152603660248201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60448201527520746f206e6f6e2d7a65726f20616c6c6f77616e636560501b6064820152608401610b35565b6040516001600160a01b03831660248201526044810182905261284e90849063095ea7b360e01b90606401612817565b600080546040516370a0823160e01b81523060048201526001600160a01b03909116906370a082319060240160206040518083038186803b158015612aff57600080fd5b505afa158015612b13573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b379190612fe7565b9050801561261a57600954604080516361d027b360e01b81529051612bd8926001600160a01b0316916361d027b3916004808301926020929190829003018186803b158015612b8557600080fd5b505afa158015612b99573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612bbd9190612ed4565b610f10612710610d3a6004548661272a90919063ffffffff16565b60095460408051638d8f1e6760e01b81529051612c71926001600160a01b031691638d8f1e67916004808301926020929190829003018186803b158015612c1e57600080fd5b505afa158015612c32573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c569190612ed4565b610f10612710610d3a6005548661272a90919063ffffffff16565b61261a612500565b61261a610d08610ac1565b60008184841115612ca85760405162461bcd60e51b8152600401610b359190613094565b50600061298e848661318e565b60008183612cd65760405162461bcd60e51b8152600401610b359190613094565b50600061298e848661314f565b6000612d38826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316612db59092919063ffffffff16565b80519091501561284e5780806020019051810190612d569190612faf565b61284e5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610b35565b6060612dc48484600085612dcc565b949350505050565b6060843b612e1c5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610b35565b600080866001600160a01b03168587604051612e38919061302b565b60006040518083038185875af1925050503d8060008114612e75576040519150601f19603f3d011682016040523d82523d6000602084013e612e7a565b606091505b50915091508115612e8e579150612dc49050565b805115612e9e5780518082602001fd5b8360405162461bcd60e51b8152600401610b359190613094565b600060208284031215612ec9578081fd5b813561265f81613201565b600060208284031215612ee5578081fd5b815161265f81613201565b60008060408385031215612f02578081fd5b8235612f0d81613201565b9150602083013567ffffffffffffffff80821115612f29578283fd5b818501915085601f830112612f3c578283fd5b813581811115612f4e57612f4e6131eb565b604051601f8201601f19908116603f01168101908382118183101715612f7657612f766131eb565b81604052828152886020848701011115612f8e578586fd5b82602086016020830137856020848301015280955050505050509250929050565b600060208284031215612fc0578081fd5b8151801515811461265f578182fd5b600060208284031215612fe0578081fd5b5035919050565b600060208284031215612ff8578081fd5b5051919050565b600081518084526130178160208601602086016131a5565b601f01601f19169290920160200192915050565b6000825161303d8184602087016131a5565b9190910192915050565b606080825284519082018190526000906020906080840190828801845b8281101561308057815184529284019290840190600101613064565b505050908301949094525060400152919050565b60208152600061265f6020830184612fff565b6020808252600b908201526a10b1b7b73a3937b63632b960a91b604082015260600190565b6020808252600e908201526d1b9bdd08185d5d1a1bdc9a5e995960921b604082015260600190565b602080825260069082015265085d985d5b1d60d21b604082015260600190565b6020808252600990820152682174696d656c6f636b60b81b604082015260600190565b6000821982111561314a5761314a6131d5565b500190565b60008261316a57634e487b7160e01b81526012600452602481fd5b500490565b6000816000190483118215151615613189576131896131d5565b500290565b6000828210156131a0576131a06131d5565b500390565b60005b838110156131c05781810151838201526020016131a8565b838111156131cf576000848401525b50505050565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b038116811461261a57600080fdfea2646970667358221220b6f1ff13e6618ef0bc04d511d30884f4276aac6a53e48c36bafcd355d26ab67764736f6c63430008040033000000000000000000000000cb410a689a03e06de0a6247b13c13d14237decc8000000000000000000000000cb410a689a03e06de0a6247b13c13d14237decc80000000000000000000000008121fa4e27051dc3b86e4e7d6fb2a02d62fe6f68000000000000000000000000cb410a689a03e06de0a6247b13c13d14237decc8
Deployed Bytecode
0x6080604052600436106103815760003560e01c8063722713f7116101d1578063bdacb30311610102578063d0e30db0116100a0578063f4b9fa751161006f578063f4b9fa75146109dc578063f77c4791146109fc578063fb84ba6314610a1c578063fe1f8f7a146105cd57600080fd5b8063d0e30db014610971578063d21220a714610986578063d33219b4146109a6578063e4d06d82146109c657600080fd5b8063c6223e26116100dc578063c6223e26146108f1578063c65e324214610911578063c7b9d53014610931578063ccfc2e8d1461095157600080fd5b8063bdacb303146108a6578063c1a3d44c146108c6578063c39d4334146108db57600080fd5b8063916a7a781161016f578063ab73e43311610149578063ab73e43314610826578063b0b8579b14610846578063b5b86a1214610866578063ba40273d1461088657600080fd5b8063916a7a78146107c657806392eefe9b146107e6578063ab033ea91461080657600080fd5b806387976583116101ab578063879765831461073a57806388993f221461077a5780638aee8127146107905780638ccdbb70146107b057600080fd5b8063722713f7146106f05780638237859414610705578063853828b61461072557600080fd5b806326e886c6116102b657806351cff8d9116102545780635aa6e675116102235780635aa6e6751461067057806364b87a7014610690578063665a11ca146106b05780636d13582c146106d057600080fd5b806351cff8d91461060457806351f3d0b81461062457806354df7b631461063a57806359739ec41461065a57600080fd5b80634641257d116102905780634641257d146105b8578063479119be146105cd5780634c2798ad146105e45780634fe809cc1461041057600080fd5b806326e886c6146104105780632e1a7d4d146105705780633fc8cef31461059057600080fd5b806311588086116103235780631cff79cd116102fd5780631cff79cd146104fd5780631f1fcd51146105105780631fe4a68614610530578063249fb9b41461055057600080fd5b8063115880861461048657806317d7de7c1461049b57806318eb0e0b146104db57600080fd5b80630975d8d81161035f5780630975d8d8146104105780630d43e8ad146104265780630dfe16811461044657806310f91b0b1461046657600080fd5b80630431f144146103865780630547104d146103c3578063089fe6aa146103e6575b600080fd5b34801561039257600080fd5b506017546103a6906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b3480156103cf57600080fd5b506103d8610a3c565b6040519081526020016103ba565b3480156103f257600080fd5b506103fc610bb881565b60405162ffffff90911681526020016103ba565b34801561041c57600080fd5b506103d861271081565b34801561043257600080fd5b506003546103a6906001600160a01b031681565b34801561045257600080fd5b506010546103a6906001600160a01b031681565b34801561047257600080fd5b506001546103a6906001600160a01b031681565b34801561049257600080fd5b506103d8610ac1565b3480156104a757600080fd5b5060408051808201909152600e81526d5374726174656779486f7044616960901b60208201525b6040516103ba9190613094565b3480156104e757600080fd5b506104fb6104f6366004612eb8565b610af6565b005b6104ce61050b366004612ef0565b610b5f565b34801561051c57600080fd5b506000546103a6906001600160a01b031681565b34801561053c57600080fd5b50600a546103a6906001600160a01b031681565b34801561055c57600080fd5b506104fb61056b366004612fcf565b610c1c565b34801561057c57600080fd5b506104fb61058b366004612fcf565b610c4b565b34801561059c57600080fd5b506103a67382af49447d8a07e3bd95bd0d56f35241523fbab181565b3480156105c457600080fd5b506104fb610f2a565b3480156105d957600080fd5b506103d8620186a081565b3480156105f057600080fd5b506104fb6105ff366004612fcf565b611ce2565b34801561061057600080fd5b506103d861061f366004612eb8565b611d11565b34801561063057600080fd5b506103d860075481565b34801561064657600080fd5b506104fb610655366004612eb8565b611e1e565b34801561066657600080fd5b506103d860045481565b34801561067c57600080fd5b506008546103a6906001600160a01b031681565b34801561069c57600080fd5b50600e546103a6906001600160a01b031681565b3480156106bc57600080fd5b50600f546103a6906001600160a01b031681565b3480156106dc57600080fd5b506002546103a6906001600160a01b031681565b3480156106fc57600080fd5b506103d8611e9b565b34801561071157600080fd5b506104fb610720366004612fcf565b611ebb565b34801561073157600080fd5b506103d8611eea565b34801561074657600080fd5b5061076a610755366004612eb8565b600c6020526000908152604090205460ff1681565b60405190151581526020016103ba565b34801561078657600080fd5b506103d860055481565b34801561079c57600080fd5b506104fb6107ab366004612eb8565b612062565b3480156107bc57600080fd5b506103d860065481565b3480156107d257600080fd5b506019546103a6906001600160a01b031681565b3480156107f257600080fd5b506104fb610801366004612eb8565b6120c3565b34801561081257600080fd5b506104fb610821366004612eb8565b61210f565b34801561083257600080fd5b506104fb610841366004612fcf565b612179565b34801561085257600080fd5b50600d546103a6906001600160a01b031681565b34801561087257600080fd5b506018546103a6906001600160a01b031681565b34801561089257600080fd5b506104fb6108a1366004612fcf565b6121a8565b3480156108b257600080fd5b506104fb6108c1366004612eb8565b6121d7565b3480156108d257600080fd5b506103d8612223565b3480156108e757600080fd5b506103d860145481565b3480156108fd57600080fd5b506103d861090c366004612fcf565b61229f565b34801561091d57600080fd5b506104fb61092c366004612fcf565b61241b565b34801561093d57600080fd5b506104fb61094c366004612eb8565b61244a565b34801561095d57600080fd5b506104fb61096c366004612eb8565b6124b4565b34801561097d57600080fd5b506104fb612500565b34801561099257600080fd5b506011546103a6906001600160a01b031681565b3480156109b257600080fd5b50600b546103a6906001600160a01b031681565b3480156109d257600080fd5b506103d860135481565b3480156109e857600080fd5b506016546103a6906001600160a01b031681565b348015610a0857600080fd5b506009546103a6906001600160a01b031681565b348015610a2857600080fd5b506015546103a6906001600160a01b031681565b600e546040516246613160e11b815230600482015260009182916001600160a01b0390911690628cc262906024015b60206040518083038186803b158015610a8357600080fd5b505afa158015610a97573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610abb9190612fe7565b92915050565b600e546040516370a0823160e01b815230600482015260009182916001600160a01b03909116906370a0823190602401610a6b565b6008546001600160a01b0316331480610b195750600a546001600160a01b031633145b610b3e5760405162461bcd60e51b8152600401610b35906130cc565b60405180910390fd5b6001600160a01b03166000908152600c60205260409020805460ff19169055565b600b546060906001600160a01b03163314610b8c5760405162461bcd60e51b8152600401610b3590613114565b6001600160a01b038316610bcc5760405162461bcd60e51b8152602060048201526007602482015266085d185c99d95d60ca1b6044820152606401610b35565b600080835160208501866113885a03f43d6040519250601f19601f6020830101168301604052808352806000602085013e811560018114610c0c57610c13565b8160208501fd5b50505092915050565b600b546001600160a01b03163314610c465760405162461bcd60e51b8152600401610b3590613114565b600455565b6009546001600160a01b03163314610c755760405162461bcd60e51b8152600401610b35906130a7565b600080546040516370a0823160e01b81523060048201526001600160a01b03909116906370a082319060240160206040518083038186803b158015610cb957600080fd5b505afa158015610ccd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cf19190612fe7565b905081811015610d1c57610d0d610d08838361261d565b612666565b9150610d1982826126cb565b91505b6000610d40620186a0610d3a6007548661272a90919063ffffffff16565b906127a9565b9050610dde600960009054906101000a90046001600160a01b03166001600160a01b0316638d8f1e676040518163ffffffff1660e01b815260040160206040518083038186803b158015610d9357600080fd5b505afa158015610da7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610dcb9190612ed4565b6000546001600160a01b031690836127eb565b6000610dfc620186a0610d3a6006548761272a90919063ffffffff16565b9050610e4f600960009054906101000a90046001600160a01b03166001600160a01b03166361d027b36040518163ffffffff1660e01b815260040160206040518083038186803b158015610d9357600080fd5b60095460008054604051632988bb9f60e21b81526001600160a01b0391821660048201529192169063a622ee7c9060240160206040518083038186803b158015610e9857600080fd5b505afa158015610eac573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ed09190612ed4565b90506001600160a01b038116610ef85760405162461bcd60e51b8152600401610b35906130f4565b610f2381610f1084610f0a898861261d565b9061261d565b6000546001600160a01b031691906127eb565b5050505050565b336000908152600c602052604090205460ff1680610f5257506008546001600160a01b031633145b80610f675750600a546001600160a01b031633145b610f7057600080fd5b600e60009054906101000a90046001600160a01b03166001600160a01b0316633d18b9126040518163ffffffff1660e01b8152600401600060405180830381600087803b158015610fc057600080fd5b505af1158015610fd4573d6000803e3d6000fd5b5050600d546040516370a0823160e01b8152306004820152600093506001600160a01b0390911691506370a082319060240160206040518083038186803b15801561101e57600080fd5b505afa158015611032573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110569190612fe7565b905080156111c557600061107b612710610d3a6013548561272a90919063ffffffff16565b9050611119600960009054906101000a90046001600160a01b03166001600160a01b03166361d027b36040518163ffffffff1660e01b815260040160206040518083038186803b1580156110ce57600080fd5b505afa1580156110e2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111069190612ed4565b600d546001600160a01b031690836127eb565b600d546040516370a0823160e01b81523060048201526001600160a01b03909116906370a082319060240160206040518083038186803b15801561115c57600080fd5b505afa158015611170573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111949190612fe7565b600d549092506111c2906001600160a01b03167382af49447d8a07e3bd95bd0d56f35241523fbab184612853565b50505b6012546001600160a01b0316156113c3576012546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a082319060240160206040518083038186803b15801561121a57600080fd5b505afa15801561122e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112529190612fe7565b905080156113c1576000611277612710610d3a6014548561272a90919063ffffffff16565b9050611315600960009054906101000a90046001600160a01b03166001600160a01b03166361d027b36040518163ffffffff1660e01b815260040160206040518083038186803b1580156112ca57600080fd5b505afa1580156112de573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113029190612ed4565b6012546001600160a01b031690836127eb565b6012546040516370a0823160e01b81523060048201526001600160a01b03909116906370a082319060240160206040518083038186803b15801561135857600080fd5b505afa15801561136c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113909190612fe7565b6012549092506113be906001600160a01b03167382af49447d8a07e3bd95bd0d56f35241523fbab184612853565b50505b505b6010546001600160a01b03167382af49447d8a07e3bd95bd0d56f35241523fbab1146114a0576040516370a0823160e01b81523060048201526000907382af49447d8a07e3bd95bd0d56f35241523fbab1906370a082319060240160206040518083038186803b15801561143657600080fd5b505afa15801561144a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061146e9190612fe7565b60105490915061149d907382af49447d8a07e3bd95bd0d56f35241523fbab1906001600160a01b031683612853565b50505b6010546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a082319060240160206040518083038186803b1580156114e457600080fd5b505afa1580156114f8573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061151c9190612fe7565b600f546040516391ceb3eb60e01b81526000600482018190529293506001600160a01b03909116906391ceb3eb9060240160206040518083038186803b15801561156557600080fd5b505afa158015611579573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061159d9190612fe7565b600f546040516391ceb3eb60e01b8152600160048201529192506000916001600160a01b03909116906391ceb3eb9060240160206040518083038186803b1580156115e757600080fd5b505afa1580156115fb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061161f9190612fe7565b90508082106116fe57600f54601054611646916001600160a01b0391821691166000612997565b600f54601054611663916001600160a01b03918216911685612997565b600f546040516348b4aac360e11b8152600060048201819052600160248301526044820186905260648201524260848201526001600160a01b039091169063916955869060a401602060405180830381600087803b1580156116c457600080fd5b505af11580156116d8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116fc9190612fe7565b505b6010546040516370a0823160e01b81523060048201526001600160a01b03909116906370a082319060240160206040518083038186803b15801561174157600080fd5b505afa158015611755573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117799190612fe7565b6011546040516370a0823160e01b81523060048201529194506000916001600160a01b03909116906370a082319060240160206040518083038186803b1580156117c257600080fd5b505afa1580156117d6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117fa9190612fe7565b604080516002808252606080830184529394509091602083019080368337019050509050848160008151811061184057634e487b7160e01b600052603260045260246000fd5b602002602001018181525050818160018151811061186e57634e487b7160e01b600052603260045260246000fd5b60200260200101818152505060008511806118895750600082115b15611c1957600f546010546118ac916001600160a01b0391821691166000612997565b600f546010546118c9916001600160a01b03918216911687612997565b600f546011546118e7916001600160a01b0391821691166000612997565b600f54601154611904916001600160a01b03918216911684612997565b600f54604051634d49e87d60e01b81526001600160a01b0390911690634d49e87d906119399084906000904290600401613047565b602060405180830381600087803b15801561195357600080fd5b505af1158015611967573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061198b9190612fe7565b50601054600954604080516361d027b360e01b815290516001600160a01b039384169363a9059cbb9316916361d027b3916004808301926020929190829003018186803b1580156119db57600080fd5b505afa1580156119ef573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a139190612ed4565b6010546040516370a0823160e01b81523060048201526001600160a01b03909116906370a082319060240160206040518083038186803b158015611a5657600080fd5b505afa158015611a6a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a8e9190612fe7565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401602060405180830381600087803b158015611ad457600080fd5b505af1158015611ae8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b0c9190612faf565b50600954604080516361d027b360e01b81529051611c19926001600160a01b0316916361d027b3916004808301926020929190829003018186803b158015611b5357600080fd5b505afa158015611b67573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b8b9190612ed4565b6011546040516370a0823160e01b81523060048201526001600160a01b03909116906370a082319060240160206040518083038186803b158015611bce57600080fd5b505afa158015611be2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c069190612fe7565b6011546001600160a01b031691906127eb565b600080546040516370a0823160e01b81523060048201526001600160a01b03909116906370a082319060240160206040518083038186803b158015611c5d57600080fd5b505afa158015611c71573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c959190612fe7565b60408051428152602081018390529192507f6c8433a8e155f0af04dba058d4e4695f7da554578963d876bdf4a6d8d6399d9c910160405180910390a1611cd9612abb565b50505050505050565b600b546001600160a01b03163314611d0c5760405162461bcd60e51b8152600401610b3590613114565b601455565b6009546000906001600160a01b03163314611d3e5760405162461bcd60e51b8152600401610b35906130a7565b6000546001600160a01b0383811691161415611d855760405162461bcd60e51b8152600401610b35906020808252600490820152631dd85b9d60e21b604082015260600190565b6040516370a0823160e01b81523060048201526001600160a01b038316906370a082319060240160206040518083038186803b158015611dc457600080fd5b505afa158015611dd8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611dfc9190612fe7565b600954909150611e19906001600160a01b038481169116836127eb565b919050565b6008546001600160a01b0316331480611e415750600a546001600160a01b031633145b80611e5b5750336000908152600c602052604090205460ff165b611e775760405162461bcd60e51b8152600401610b35906130cc565b6001600160a01b03166000908152600c60205260409020805460ff19166001179055565b6000611eb6611ea8610ac1565b611eb0612223565b906126cb565b905090565b600b546001600160a01b03163314611ee55760405162461bcd60e51b8152600401610b3590613114565b600655565b6009546000906001600160a01b03163314611f175760405162461bcd60e51b8152600401610b35906130a7565b611f1f612c79565b6000546040516370a0823160e01b81523060048201526001600160a01b03909116906370a082319060240160206040518083038186803b158015611f6257600080fd5b505afa158015611f76573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f9a9190612fe7565b60095460008054604051632988bb9f60e21b81526001600160a01b039182166004820152939450909291169063a622ee7c9060240160206040518083038186803b158015611fe757600080fd5b505afa158015611ffb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061201f9190612ed4565b90506001600160a01b0381166120475760405162461bcd60e51b8152600401610b35906130f4565b60005461205e906001600160a01b031682846127eb565b5090565b600b546001600160a01b03163314806120855750600a546001600160a01b031633145b6120a15760405162461bcd60e51b8152600401610b3590613114565b601280546001600160a01b0319166001600160a01b0392909216919091179055565b600b546001600160a01b031633146120ed5760405162461bcd60e51b8152600401610b3590613114565b600980546001600160a01b0319166001600160a01b0392909216919091179055565b6008546001600160a01b031633146121575760405162461bcd60e51b815260206004820152600b60248201526a21676f7665726e616e636560a81b6044820152606401610b35565b600880546001600160a01b0319166001600160a01b0392909216919091179055565b600b546001600160a01b031633146121a35760405162461bcd60e51b8152600401610b3590613114565b600755565b600b546001600160a01b031633146121d25760405162461bcd60e51b8152600401610b3590613114565b601355565b600b546001600160a01b031633146122015760405162461bcd60e51b8152600401610b3590613114565b600b80546001600160a01b0319166001600160a01b0392909216919091179055565b600080546040516370a0823160e01b81523060048201526001600160a01b03909116906370a082319060240160206040518083038186803b15801561226757600080fd5b505afa15801561227b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611eb69190612fe7565b6009546000906001600160a01b031633146122cc5760405162461bcd60e51b8152600401610b35906130a7565b6122d582612666565b506000546040516370a0823160e01b81523060048201526001600160a01b03909116906370a082319060240160206040518083038186803b15801561231957600080fd5b505afa15801561232d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123519190612fe7565b60095460008054604051632988bb9f60e21b81526001600160a01b039182166004820152939450909291169063a622ee7c9060240160206040518083038186803b15801561239e57600080fd5b505afa1580156123b2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123d69190612ed4565b90506001600160a01b0381166123fe5760405162461bcd60e51b8152600401610b35906130f4565b600054612415906001600160a01b031682846127eb565b50919050565b600b546001600160a01b031633146124455760405162461bcd60e51b8152600401610b3590613114565b600555565b6008546001600160a01b031633146124925760405162461bcd60e51b815260206004820152600b60248201526a21676f7665726e616e636560a81b6044820152606401610b35565b600a80546001600160a01b0319166001600160a01b0392909216919091179055565b6008546001600160a01b031633146124de5760405162461bcd60e51b8152600401610b35906130cc565b600380546001600160a01b0319166001600160a01b0392909216919091179055565b600080546040516370a0823160e01b81523060048201526001600160a01b03909116906370a082319060240160206040518083038186803b15801561254457600080fd5b505afa158015612558573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061257c9190612fe7565b9050801561261a57600e54600080546125a3926001600160a01b0391821692911690612997565b600e546000546125c0916001600160a01b03918216911683612997565b600e5460405163534a7e1d60e11b8152600481018390526001600160a01b039091169063a694fc3a90602401600060405180830381600087803b15801561260657600080fd5b505af1158015610f23573d6000803e3d6000fd5b50565b600061265f83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250612c84565b9392505050565b600e54604051632e1a7d4d60e01b8152600481018390526000916001600160a01b031690632e1a7d4d90602401600060405180830381600087803b1580156126ad57600080fd5b505af11580156126c1573d6000803e3d6000fd5b5093949350505050565b6000806126d88385613137565b90508381101561265f5760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006044820152606401610b35565b60008261273957506000610abb565b6000612745838561316f565b905082612752858361314f565b1461265f5760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6044820152607760f81b6064820152608401610b35565b600061265f83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250612cb5565b6040516001600160a01b03831660248201526044810182905261284e90849063a9059cbb60e01b906064015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152612ce3565b505050565b600154600090612870906001600160a01b03868116911683612997565b60015461288a906001600160a01b03868116911684612997565b60408051610100810182526001600160a01b03868116825285811660208301908152610bb88385019081523060608501908152426080860190815260a08601898152600060c0880181815260e08901918252600154995163414bf38960e01b8152895189166004820152965188166024880152945162ffffff166044870152925186166064860152905160848501525160a4840152905160c483015251821660e48201529192169063414bf3899061010401602060405180830381600087803b15801561295657600080fd5b505af115801561296a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061298e9190612fe7565b95945050505050565b801580612a205750604051636eb1769f60e11b81523060048201526001600160a01b03838116602483015284169063dd62ed3e9060440160206040518083038186803b1580156129e657600080fd5b505afa1580156129fa573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a1e9190612fe7565b155b612a8b5760405162461bcd60e51b815260206004820152603660248201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60448201527520746f206e6f6e2d7a65726f20616c6c6f77616e636560501b6064820152608401610b35565b6040516001600160a01b03831660248201526044810182905261284e90849063095ea7b360e01b90606401612817565b600080546040516370a0823160e01b81523060048201526001600160a01b03909116906370a082319060240160206040518083038186803b158015612aff57600080fd5b505afa158015612b13573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b379190612fe7565b9050801561261a57600954604080516361d027b360e01b81529051612bd8926001600160a01b0316916361d027b3916004808301926020929190829003018186803b158015612b8557600080fd5b505afa158015612b99573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612bbd9190612ed4565b610f10612710610d3a6004548661272a90919063ffffffff16565b60095460408051638d8f1e6760e01b81529051612c71926001600160a01b031691638d8f1e67916004808301926020929190829003018186803b158015612c1e57600080fd5b505afa158015612c32573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c569190612ed4565b610f10612710610d3a6005548661272a90919063ffffffff16565b61261a612500565b61261a610d08610ac1565b60008184841115612ca85760405162461bcd60e51b8152600401610b359190613094565b50600061298e848661318e565b60008183612cd65760405162461bcd60e51b8152600401610b359190613094565b50600061298e848661314f565b6000612d38826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316612db59092919063ffffffff16565b80519091501561284e5780806020019051810190612d569190612faf565b61284e5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610b35565b6060612dc48484600085612dcc565b949350505050565b6060843b612e1c5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610b35565b600080866001600160a01b03168587604051612e38919061302b565b60006040518083038185875af1925050503d8060008114612e75576040519150601f19603f3d011682016040523d82523d6000602084013e612e7a565b606091505b50915091508115612e8e579150612dc49050565b805115612e9e5780518082602001fd5b8360405162461bcd60e51b8152600401610b359190613094565b600060208284031215612ec9578081fd5b813561265f81613201565b600060208284031215612ee5578081fd5b815161265f81613201565b60008060408385031215612f02578081fd5b8235612f0d81613201565b9150602083013567ffffffffffffffff80821115612f29578283fd5b818501915085601f830112612f3c578283fd5b813581811115612f4e57612f4e6131eb565b604051601f8201601f19908116603f01168101908382118183101715612f7657612f766131eb565b81604052828152886020848701011115612f8e578586fd5b82602086016020830137856020848301015280955050505050509250929050565b600060208284031215612fc0578081fd5b8151801515811461265f578182fd5b600060208284031215612fe0578081fd5b5035919050565b600060208284031215612ff8578081fd5b5051919050565b600081518084526130178160208601602086016131a5565b601f01601f19169290920160200192915050565b6000825161303d8184602087016131a5565b9190910192915050565b606080825284519082018190526000906020906080840190828801845b8281101561308057815184529284019290840190600101613064565b505050908301949094525060400152919050565b60208152600061265f6020830184612fff565b6020808252600b908201526a10b1b7b73a3937b63632b960a91b604082015260600190565b6020808252600e908201526d1b9bdd08185d5d1a1bdc9a5e995960921b604082015260600190565b602080825260069082015265085d985d5b1d60d21b604082015260600190565b6020808252600990820152682174696d656c6f636b60b81b604082015260600190565b6000821982111561314a5761314a6131d5565b500190565b60008261316a57634e487b7160e01b81526012600452602481fd5b500490565b6000816000190483118215151615613189576131896131d5565b500290565b6000828210156131a0576131a06131d5565b500390565b60005b838110156131c05781810151838201526020016131a8565b838111156131cf576000848401525b50505050565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b038116811461261a57600080fdfea2646970667358221220b6f1ff13e6618ef0bc04d511d30884f4276aac6a53e48c36bafcd355d26ab67764736f6c63430008040033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000cb410a689a03e06de0a6247b13c13d14237decc8000000000000000000000000cb410a689a03e06de0a6247b13c13d14237decc80000000000000000000000008121fa4e27051dc3b86e4e7d6fb2a02d62fe6f68000000000000000000000000cb410a689a03e06de0a6247b13c13d14237decc8
-----Decoded View---------------
Arg [0] : _governance (address): 0xCb410A689A03E06de0a6247b13C13D14237DecC8
Arg [1] : _strategist (address): 0xCb410A689A03E06de0a6247b13C13D14237DecC8
Arg [2] : _controller (address): 0x8121Fa4e27051DC3b86E4e7d6Fb2a02d62fe6F68
Arg [3] : _timelock (address): 0xCb410A689A03E06de0a6247b13C13D14237DecC8
-----Encoded View---------------
4 Constructor Arguments found :
Arg [0] : 000000000000000000000000cb410a689a03e06de0a6247b13c13d14237decc8
Arg [1] : 000000000000000000000000cb410a689a03e06de0a6247b13c13d14237decc8
Arg [2] : 0000000000000000000000008121fa4e27051dc3b86e4e7d6fb2a02d62fe6f68
Arg [3] : 000000000000000000000000cb410a689a03e06de0a6247b13c13d14237decc8
Deployed Bytecode Sourcemap
63479:1030:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;63704:64;;;;;;;;;;-1:-1:-1;63704:64:0;;;;-1:-1:-1;;;;;63704:64:0;;;;;;-1:-1:-1;;;;;3325:32:1;;;3307:51;;3295:2;3280:18;63704:64:0;;;;;;;;58594:184;;;;;;;;;;;;;:::i;:::-;;;11748:25:1;;;11736:2;11721:18;58594:184:0;11703:76:1;43656:37:0;;;;;;;;;;;;43689:4;43656:37;;;;;11581:8:1;11569:21;;;11551:40;;11539:2;11524:18;43656:37:0;11506:91:1;57832:39:0;;;;;;;;;;;;57866:5;57832:39;;43513:74;;;;;;;;;;-1:-1:-1;43513:74:0;;;;-1:-1:-1;;;;;43513:74:0;;;57643:21;;;;;;;;;;-1:-1:-1;57643:21:0;;;;-1:-1:-1;;;;;57643:21:0;;;43353:75;;;;;;;;;;-1:-1:-1;43353:75:0;;;;-1:-1:-1;;;;;43353:75:0;;;58397:189;;;;;;;;;;;;;:::i;64398:108::-;;;;;;;;;;-1:-1:-1;64475:23:0;;;;;;;;;;;;-1:-1:-1;;;64475:23:0;;;;64398:108;;;;;;;:::i;45943:207::-;;;;;;;;;;-1:-1:-1;45943:207:0;;;;;:::i;:::-;;:::i;:::-;;50620:1053;;;;;;:::i;:::-;;:::i;43233:19::-;;;;;;;;;;-1:-1:-1;43233:19:0;;;;-1:-1:-1;;;;;43233:19:0;;;44338:25;;;;;;;;;;-1:-1:-1;44338:25:0;;;;-1:-1:-1;;;;;44338:25:0;;;46929:213;;;;;;;;;;-1:-1:-1;46929:213:0;;;;;:::i;:::-;;:::i;48307:1032::-;;;;;;;;;;-1:-1:-1;48307:1032:0;;;;;:::i;:::-;;:::i;43259:73::-;;;;;;;;;;;;43290:42;43259:73;;60033:3352;;;;;;;;;;;;;:::i;44190:53::-;;;;;;;;;;;;44237:6;44190:53;;59523:151;;;;;;;;;;-1:-1:-1;59523:151:0;;;;;:::i;:::-;;:::i;47940:289::-;;;;;;;;;;-1:-1:-1;47940:289:0;;;;;:::i;:::-;;:::i;44144:39::-;;;;;;;;;;;;;;;;45700:235;;;;;;;;;;-1:-1:-1;45700:235:0;;;;;:::i;:::-;;:::i;43743:44::-;;;;;;;;;;;;;;;;44274:25;;;;;;;;;;-1:-1:-1;44274:25:0;;;;-1:-1:-1;;;;;44274:25:0;;;57538:29;;;;;;;;;;-1:-1:-1;57538:29:0;;;;-1:-1:-1;;;;;57538:29:0;;;57574:28;;;;;;;;;;-1:-1:-1;57574:28:0;;;;-1:-1:-1;;;;;57574:28:0;;;43435:71;;;;;;;;;;-1:-1:-1;43435:71:0;;;;-1:-1:-1;;;;;43435:71:0;;;45475:113;;;;;;;;;;;;;:::i;46539:195::-;;;;;;;;;;-1:-1:-1;46539:195:0;;;;;:::i;:::-;;:::i;49917:440::-;;;;;;;;;;;;;:::i;44402:42::-;;;;;;;;;;-1:-1:-1;44402:42:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;4915:14:1;;4908:22;4890:41;;4878:2;4863:18;44402:42:0;4845:92:1;43857:36:0;;;;;;;;;;;;;;;;59682:220;;;;;;;;;;-1:-1:-1;59682:220:0;;;;;:::i;:::-;;:::i;44034:40::-;;;;;;;;;;;;;;;;63887:71;;;;;;;;;;-1:-1:-1;63887:71:0;;;;-1:-1:-1;;;;;63887:71:0;;;47627:151;;;;;;;;;;-1:-1:-1;47627:151:0;;;;;:::i;:::-;;:::i;47313:155::-;;;;;;;;;;-1:-1:-1;47313:155:0;;;;;:::i;:::-;;:::i;46340:191::-;;;;;;;;;;-1:-1:-1;46340:191:0;;;;;:::i;:::-;;:::i;57430:63::-;;;;;;;;;;-1:-1:-1;57430:63:0;;;;-1:-1:-1;;;;;57430:63:0;;;63812:68;;;;;;;;;;-1:-1:-1;63812:68:0;;;;-1:-1:-1;;;;;63812:68:0;;;59388:127;;;;;;;;;;-1:-1:-1;59388:127:0;;;;;:::i;:::-;;:::i;47476:143::-;;;;;;;;;;-1:-1:-1;47476:143:0;;;;;:::i;:::-;;:::i;45278:118::-;;;;;;;;;;;;;:::i;57793:32::-;;;;;;;;;;;;;;;;49403:438;;;;;;;;;;-1:-1:-1;49403:438:0;;;;;:::i;:::-;;:::i;46742:179::-;;;;;;;;;;-1:-1:-1;46742:179:0;;;;;:::i;:::-;;:::i;47150:155::-;;;;;;;;;;-1:-1:-1;47150:155:0;;;;;:::i;:::-;;:::i;46158:174::-;;;;;;;;;;-1:-1:-1;46158:174:0;;;;;:::i;:::-;;:::i;58812:326::-;;;;;;;;;;;;;:::i;57671:21::-;;;;;;;;;;-1:-1:-1;57671:21:0;;;;-1:-1:-1;;;;;57671:21:0;;;44370:23;;;;;;;;;;-1:-1:-1;44370:23:0;;;;-1:-1:-1;;;;;44370:23:0;;;57760:26;;;;;;;;;;;;;;;;63634:63;;;;;;;;;;-1:-1:-1;63634:63:0;;;;-1:-1:-1;;;;;63634:63:0;;;44306:25;;;;;;;;;;-1:-1:-1;44306:25:0;;;;-1:-1:-1;;;;;44306:25:0;;;63557:70;;;;;;;;;;-1:-1:-1;63557:70:0;;;;-1:-1:-1;;;;;63557:70:0;;;58594:184;58704:14;;58685:56;;-1:-1:-1;;;58685:56:0;;58735:4;58685:56;;;3307:51:1;58643:7:0;;;;-1:-1:-1;;;;;58704:14:0;;;;58685:41;;3280:18:1;;58685:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;58663:78;58594:184;-1:-1:-1;;58594:184:0:o;58397:189::-;58508:14;;58489:59;;-1:-1:-1;;;58489:59:0;;58542:4;58489:59;;;3307:51:1;58452:7:0;;;;-1:-1:-1;;;;;58508:14:0;;;;58489:44;;3280:18:1;;58489:59:0;3262:102:1;45943:207:0;46030:10;;-1:-1:-1;;;;;46030:10:0;46016;:24;;:66;;-1:-1:-1;46072:10:0;;-1:-1:-1;;;;;46072:10:0;46058;:24;46016:66;46008:93;;;;-1:-1:-1;;;46008:93:0;;;;;;;:::i;:::-;;;;;;;;;-1:-1:-1;;;;;46112:22:0;46137:5;46112:22;;;:10;:22;;;;;:30;;-1:-1:-1;;46112:30:0;;;45943:207::o;50620:1053::-;50786:8;;50725:21;;-1:-1:-1;;;;;50786:8:0;50772:10;:22;50764:44;;;;-1:-1:-1;;;50764:44:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;50827:21:0;;50819:41;;;;-1:-1:-1;;;50819:41:0;;6838:2:1;50819:41:0;;;6820:21:1;6877:1;6857:18;;;6850:29;-1:-1:-1;;;6895:18:1;;;6888:37;6942:18;;50819:41:0;6810:156:1;50819:41:0;51137:1;51117;51092:5;51086:12;51062:4;51055:5;51051:16;51025:7;51001:4;50994:5;50990:16;50959:194;51179:16;51229:4;51223:11;51211:23;;51346:4;51342:9;51335:4;51328;51322;51318:15;51314:26;51310:42;51300:8;51296:57;51273:4;51248:120;51399:4;51389:8;51382:22;51457:4;51454:1;51447:4;51437:8;51433:19;51418:44;51492:9;51485:17;51525:1;51520:135;;;;51478:177;;51520:135;51631:4;51624;51614:8;51610:19;51603:33;51478:177;;;;50927:739;;;;:::o;46929:213::-;47053:8;;-1:-1:-1;;;;;47053:8:0;47039:10;:22;47031:44;;;;-1:-1:-1;;;47031:44:0;;;;;;;:::i;:::-;47086:22;:48;46929:213::o;48307:1032::-;48384:10;;-1:-1:-1;;;;;48384:10:0;48370;:24;48362:48;;;;-1:-1:-1;;;48362:48:0;;;;;;;:::i;:::-;48421:16;48447:4;;48440:37;;-1:-1:-1;;;48440:37:0;;48471:4;48440:37;;;3307:51:1;-1:-1:-1;;;;;48447:4:0;;;;48440:22;;3280:18:1;;48440:37:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;48421:56;;48503:7;48492:8;:18;48488:143;;;48537:36;48551:21;:7;48563:8;48551:11;:21::i;:::-;48537:13;:36::i;:::-;48527:46;-1:-1:-1;48598:21:0;48527:46;48610:8;48598:11;:21::i;:::-;48588:31;;48488:143;48643:15;48661:83;44237:6;48661:33;48673:20;;48661:7;:11;;:33;;;;:::i;:::-;:37;;:83::i;:::-;48643:101;;48755:69;48793:10;;;;;;;;;-1:-1:-1;;;;;48793:10:0;-1:-1:-1;;;;;48781:31:0;;:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;48762:4;;-1:-1:-1;;;;;48762:4:0;;48816:7;48755:25;:69::i;:::-;48837:20;48860:85;44129:6;48860:34;48872:21;;48860:7;:11;;:34;;;;:::i;:85::-;48837:108;;48956:112;49008:10;;;;;;;;;-1:-1:-1;;;;;49008:10:0;-1:-1:-1;;;;;48996:32:0;;:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48956:112;49110:10;;49081:14;49137:4;;49098:45;;-1:-1:-1;;;49098:45:0;;-1:-1:-1;;;;;49137:4:0;;;49098:45;;;3307:51:1;49081:14:0;;49110:10;;49098:30;;3280:18:1;;49098:45:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;49081:62;-1:-1:-1;;;;;;49162:20:0;;49154:39;;;;-1:-1:-1;;;49154:39:0;;;;;;;:::i;:::-;49258:73;49284:6;49292:38;49317:12;49292:20;:7;49304;49292:11;:20::i;:::-;:24;;:38::i;:::-;49265:4;;-1:-1:-1;;;;;49265:4:0;;49258:73;:25;:73::i;:::-;48307:1032;;;;;:::o;60033:3352::-;45109:10;45098:22;;;;:10;:22;;;;;;;;;:67;;-1:-1:-1;45155:10:0;;-1:-1:-1;;;;;45155:10:0;45141;:24;45098:67;:112;;;-1:-1:-1;45200:10:0;;-1:-1:-1;;;;;45200:10:0;45186;:24;45098:112;45076:145;;;;;;60150:14:::1;;;;;;;;;-1:-1:-1::0;;;;;60150:14:0::1;-1:-1:-1::0;;;;;60131:44:0::1;;:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;60212:3:0::1;::::0;60205:36:::1;::::0;-1:-1:-1;;;60205:36:0;;60235:4:::1;60205:36;::::0;::::1;3307:51:1::0;60190:12:0::1;::::0;-1:-1:-1;;;;;;60212:3:0;;::::1;::::0;-1:-1:-1;60205:21:0::1;::::0;3280:18:1;;60205:36:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;60190:51:::0;-1:-1:-1;60256:8:0;;60252:373:::1;;60329:16;60348:27;57866:5;60348:14;60357:4;;60348;:8;;:14;;;;:::i;:27::-;60329:46;;60390:119;60445:10;;;;;;;;;-1:-1:-1::0;;;;;60445:10:0::1;-1:-1:-1::0;;;;;60433:32:0::1;;:34;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;60397:3;::::0;-1:-1:-1;;;;;60397:3:0::1;::::0;60486:8;60390:24:::1;:119::i;:::-;60540:3;::::0;60533:36:::1;::::0;-1:-1:-1;;;60533:36:0;;60563:4:::1;60533:36;::::0;::::1;3307:51:1::0;-1:-1:-1;;;;;60540:3:0;;::::1;::::0;60533:21:::1;::::0;3280:18:1;;60533:36:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;60597:3;::::0;60526:43;;-1:-1:-1;60584:29:0::1;::::0;-1:-1:-1;;;;;60597:3:0::1;43290:42;60526:43:::0;60584:12:::1;:29::i;:::-;;60252:373;;60675:11;::::0;-1:-1:-1;;;;;60675:11:0::1;:25:::0;60671:540:::1;;60742:11;::::0;60735:44:::1;::::0;-1:-1:-1;;;60735:44:0;;60773:4:::1;60735:44;::::0;::::1;3307:51:1::0;60717:15:0::1;::::0;-1:-1:-1;;;;;60742:11:0::1;::::0;60735:29:::1;::::0;3280:18:1;;60735:44:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;60717:62:::0;-1:-1:-1;60798:11:0;;60794:406:::1;;60830:19;60852:36;57866:5;60852:23;60864:10;;60852:7;:11;;:23;;;;:::i;:36::-;60830:58;;60907:142;60974:10;;;;;;;;;-1:-1:-1::0;;;;;60974:10:0::1;-1:-1:-1::0;;;;;60962:32:0::1;;:34;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;60914:11;::::0;-1:-1:-1;;;;;60914:11:0::1;::::0;61019;60907:32:::1;:142::i;:::-;61088:11;::::0;61081:44:::1;::::0;-1:-1:-1;;;61081:44:0;;61119:4:::1;61081:44;::::0;::::1;3307:51:1::0;-1:-1:-1;;;;;61088:11:0;;::::1;::::0;61081:29:::1;::::0;3280:18:1;;61081:44:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;61157:11;::::0;61071:54;;-1:-1:-1;61144:40:0::1;::::0;-1:-1:-1;;;;;61157:11:0::1;43290:42;61071:54:::0;61144:12:::1;:40::i;:::-;;60794:406;;60671:540;;61284:6;::::0;-1:-1:-1;;;;;61284:6:0::1;43290:42;61284:14;61281:146;;61330:37;::::0;-1:-1:-1;;;61330:37:0;;61361:4:::1;61330:37;::::0;::::1;3307:51:1::0;61314:13:0::1;::::0;43290:42:::1;::::0;61330:22:::1;::::0;3280:18:1;;61330:37:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;61401:6;::::0;61314:53;;-1:-1:-1;61382:33:0::1;::::0;43290:42:::1;::::0;-1:-1:-1;;;;;61401:6:0::1;61314:53:::0;61382:12:::1;:33::i;:::-;;61281:146;;61464:6;::::0;61457:39:::1;::::0;-1:-1:-1;;;61457:39:0;;61490:4:::1;61457:39;::::0;::::1;3307:51:1::0;61439:15:0::1;::::0;-1:-1:-1;;;;;61464:6:0::1;::::0;61457:24:::1;::::0;3280:18:1;;61457:39:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;61543:13;::::0;61534:42:::1;::::0;-1:-1:-1;;;61534:42:0;;61509:22:::1;61534:42;::::0;::::1;5316:36:1::0;;;61439:57:0;;-1:-1:-1;;;;;;61543:13:0;;::::1;::::0;61534:39:::1;::::0;5289:18:1;;61534:42:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;61621:13;::::0;61612:42:::1;::::0;-1:-1:-1;;;61612:42:0;;61621:13;61612:42:::1;::::0;::::1;5316:36:1::0;61509:67:0;;-1:-1:-1;61587:22:0::1;::::0;-1:-1:-1;;;;;61621:13:0;;::::1;::::0;61612:39:::1;::::0;5289:18:1;;61612:42:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;61587:67;;61686:14;61668;:32;61665:355;;61743:13;::::0;61723:6:::1;::::0;61716:44:::1;::::0;-1:-1:-1;;;;;61723:6:0;;::::1;::::0;61743:13:::1;;61716:26;:44::i;:::-;61802:13;::::0;61782:6:::1;::::0;61775:50:::1;::::0;-1:-1:-1;;;;;61782:6:0;;::::1;::::0;61802:13:::1;61817:7:::0;61775:26:::1;:50::i;:::-;61849:13;::::0;61840:167:::1;::::0;-1:-1:-1;;;61840:167:0;;61849:13:::1;61840:167;::::0;::::1;5642:36:1::0;;;61849:13:0;5694:18:1;;;5687:45;5748:18;;;5741:34;;;5791:18;;;5784:34;61977:15:0::1;5834:19:1::0;;;5827:35;-1:-1:-1;;;;;61849:13:0;;::::1;::::0;61840:28:::1;::::0;5614:19:1;;61840:167:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;61665:355;62105:6;::::0;62098:39:::1;::::0;-1:-1:-1;;;62098:39:0;;62131:4:::1;62098:39;::::0;::::1;3307:51:1::0;-1:-1:-1;;;;;62105:6:0;;::::1;::::0;62098:24:::1;::::0;3280:18:1;;62098:39:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;62173:6;::::0;62166:39:::1;::::0;-1:-1:-1;;;62166:39:0;;62199:4:::1;62166:39;::::0;::::1;3307:51:1::0;62088:49:0;;-1:-1:-1;62148:15:0::1;::::0;-1:-1:-1;;;;;62173:6:0;;::::1;::::0;62166:24:::1;::::0;3280:18:1;;62166:39:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;62263:16;::::0;;62277:1:::1;62263:16:::0;;;62218:24:::1;62263:16:::0;;::::1;::::0;;62148:57;;-1:-1:-1;62263:16:0;;::::1;::::0;::::1;::::0;;::::1;::::0;::::1;;::::0;-1:-1:-1;62263:16:0::1;62253:26;;62303:7;62290;62298:1;62290:10;;;;;;-1:-1:-1::0;;;62290:10:0::1;;;;;;;;;;;;;;:20;;;::::0;::::1;62334:7;62321;62329:1;62321:10;;;;;;-1:-1:-1::0;;;62321:10:0::1;;;;;;;;;;;;;;:20;;;::::0;::::1;62368:1;62358:7;:11;:26;;;;62383:1;62373:7;:11;62358:26;62354:806;;;62428:13;::::0;62408:6:::1;::::0;62401:44:::1;::::0;-1:-1:-1;;;;;62408:6:0;;::::1;::::0;62428:13:::1;;62401:26;:44::i;:::-;62487:13;::::0;62467:6:::1;::::0;62460:50:::1;::::0;-1:-1:-1;;;;;62467:6:0;;::::1;::::0;62487:13:::1;62502:7:::0;62460:26:::1;:50::i;:::-;62552:13;::::0;62532:6:::1;::::0;62525:44:::1;::::0;-1:-1:-1;;;;;62532:6:0;;::::1;::::0;62552:13:::1;;62525:26;:44::i;:::-;62611:13;::::0;62591:6:::1;::::0;62584:50:::1;::::0;-1:-1:-1;;;;;62591:6:0;;::::1;::::0;62611:13:::1;62626:7:::0;62584:26:::1;:50::i;:::-;62660:13;::::0;62651:133:::1;::::0;-1:-1:-1;;;62651:133:0;;-1:-1:-1;;;;;62660:13:0;;::::1;::::0;62651:36:::1;::::0;:133:::1;::::0;62706:7;;62660:13:::1;::::0;62754:15:::1;::::0;62651:133:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;62838:6:0::1;::::0;62885:10:::1;::::0;62873:34:::1;::::0;;-1:-1:-1;;;62873:34:0;;;;-1:-1:-1;;;;;62838:6:0;;::::1;::::0;62831:23:::1;::::0;62885:10:::1;::::0;62873:32:::1;::::0;:34:::1;::::0;;::::1;::::0;::::1;::::0;;;;;;;;62885:10;62873:34;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;62933:6;::::0;62926:39:::1;::::0;-1:-1:-1;;;62926:39:0;;62959:4:::1;62926:39;::::0;::::1;3307:51:1::0;-1:-1:-1;;;;;62933:6:0;;::::1;::::0;62926:24:::1;::::0;3280:18:1;;62926:39:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;62831:149;::::0;-1:-1:-1;;;;;;62831:149:0::1;::::0;;;;;;-1:-1:-1;;;;;3870:32:1;;;62831:149:0::1;::::0;::::1;3852:51:1::0;3919:18;;;3912:34;3825:18;;62831:149:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;63053:10:0::1;::::0;63041:34:::1;::::0;;-1:-1:-1;;;63041:34:0;;;;62995:153:::1;::::0;-1:-1:-1;;;;;63053:10:0::1;::::0;63041:32:::1;::::0;:34:::1;::::0;;::::1;::::0;::::1;::::0;;;;;;;;63053:10;63041:34;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;63101:6;::::0;63094:39:::1;::::0;-1:-1:-1;;;63094:39:0;;63127:4:::1;63094:39;::::0;::::1;3307:51:1::0;-1:-1:-1;;;;;63101:6:0;;::::1;::::0;63094:24:::1;::::0;3280:18:1;;63094:39:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;63002:6;::::0;-1:-1:-1;;;;;63002:6:0::1;::::0;62995:153;:27:::1;:153::i;:::-;63172:13;63195:4:::0;;63188:37:::1;::::0;-1:-1:-1;;;63188:37:0;;63219:4:::1;63188:37;::::0;::::1;3307:51:1::0;-1:-1:-1;;;;;63195:4:0;;::::1;::::0;63188:22:::1;::::0;3280:18:1;;63188:37:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;63247:31;::::0;;63255:15:::1;11958:25:1::0;;12014:2;11999:18;;11992:34;;;63172:53:0;;-1:-1:-1;63247:31:0::1;::::0;11931:18:1;63247:31:0::1;;;;;;;63339:38;:36;:38::i;:::-;45232:1;;;;;;;60033:3352::o:0;59523:151::-;59609:8;;-1:-1:-1;;;;;59609:8:0;59595:10;:22;59587:44;;;;-1:-1:-1;;;59587:44:0;;;;;;;:::i;:::-;59642:10;:24;59523:151::o;47940:289::-;48041:10;;47991:15;;-1:-1:-1;;;;;48041:10:0;48027;:24;48019:48;;;;-1:-1:-1;;;48019:48:0;;;;;;;:::i;:::-;48086:4;;-1:-1:-1;;;;;48086:23:0;;;:4;;:23;;48078:40;;;;-1:-1:-1;;;48078:40:0;;;;;;7869:2:1;7851:21;;;7908:1;7888:18;;;7881:29;-1:-1:-1;;;7941:2:1;7926:18;;7919:34;7985:2;7970:18;;7841:153;48078:40:0;48139:31;;-1:-1:-1;;;48139:31:0;;48164:4;48139:31;;;3307:51:1;-1:-1:-1;;;;;48139:16:0;;;;;3280:18:1;;48139:31:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;48201:10;;48129:41;;-1:-1:-1;48181:40:0;;-1:-1:-1;;;;;48181:19:0;;;;48201:10;48129:41;48181:19;:40::i;:::-;47940:289;;;:::o;45700:235::-;45790:10;;-1:-1:-1;;;;;45790:10:0;45776;:24;;:66;;-1:-1:-1;45832:10:0;;-1:-1:-1;;;;;45832:10:0;45818;:24;45776:66;:92;;;-1:-1:-1;45857:10:0;45846:22;;;;:10;:22;;;;;;;;45776:92;45768:119;;;;-1:-1:-1;;;45768:119:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;45898:22:0;;;;;:10;:22;;;;;:29;;-1:-1:-1;;45898:29:0;45923:4;45898:29;;;45700:235::o;45475:113::-;45517:7;45544:36;45564:15;:13;:15::i;:::-;45544;:13;:15::i;:::-;:19;;:36::i;:::-;45537:43;;45475:113;:::o;46539:195::-;46647:8;;-1:-1:-1;;;;;46647:8:0;46633:10;:22;46625:44;;;;-1:-1:-1;;;46625:44:0;;;;;;;:::i;:::-;46680:21;:46;46539:195::o;49917:440::-;50008:10;;49958:15;;-1:-1:-1;;;;;50008:10:0;49994;:24;49986:48;;;;-1:-1:-1;;;49986:48:0;;;;;;;:::i;:::-;50045:14;:12;:14::i;:::-;50089:4;;50082:37;;-1:-1:-1;;;50082:37:0;;50113:4;50082:37;;;3307:51:1;-1:-1:-1;;;;;50089:4:0;;;;50082:22;;3280:18:1;;50082:37:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;50161:10;;50132:14;50188:4;;50149:45;;-1:-1:-1;;;50149:45:0;;-1:-1:-1;;;;;50188:4:0;;;50149:45;;;3307:51:1;50072:47:0;;-1:-1:-1;50132:14:0;;50161:10;;;50149:30;;3280:18:1;;50149:45:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;50132:62;-1:-1:-1;;;;;;50213:20:0;;50205:39;;;;-1:-1:-1;;;50205:39:0;;;;;;;:::i;:::-;50314:4;;50307:42;;-1:-1:-1;;;;;50314:4:0;50333:6;50341:7;50307:25;:42::i;:::-;49917:440;;:::o;59682:220::-;59784:8;;-1:-1:-1;;;;;59784:8:0;59770:10;:22;;:50;;-1:-1:-1;59810:10:0;;-1:-1:-1;;;;;59810:10:0;59796;:24;59770:50;59748:109;;;;-1:-1:-1;;;59748:109:0;;;;;;;:::i;:::-;59868:11;:26;;-1:-1:-1;;;;;;59868:26:0;-1:-1:-1;;;;;59868:26:0;;;;;;;;;;59682:220::o;47627:151::-;47713:8;;-1:-1:-1;;;;;47713:8:0;47699:10;:22;47691:44;;;;-1:-1:-1;;;47691:44:0;;;;;;;:::i;:::-;47746:10;:24;;-1:-1:-1;;;;;;47746:24:0;-1:-1:-1;;;;;47746:24:0;;;;;;;;;;47627:151::o;47313:155::-;47399:10;;-1:-1:-1;;;;;47399:10:0;47385;:24;47377:48;;;;-1:-1:-1;;;47377:48:0;;6498:2:1;47377:48:0;;;6480:21:1;6537:2;6517:18;;;6510:30;-1:-1:-1;;;6556:18:1;;;6549:41;6607:18;;47377:48:0;6470:161:1;47377:48:0;47436:10;:24;;-1:-1:-1;;;;;;47436:24:0;-1:-1:-1;;;;;47436:24:0;;;;;;;;;;47313:155::o;46340:191::-;46446:8;;-1:-1:-1;;;;;46446:8:0;46432:10;:22;46424:44;;;;-1:-1:-1;;;46424:44:0;;;;;;;:::i;:::-;46479:20;:44;46340:191::o;59388:127::-;59462:8;;-1:-1:-1;;;;;59462:8:0;59448:10;:22;59440:44;;;;-1:-1:-1;;;59440:44:0;;;;;;;:::i;:::-;59495:4;:12;59388:127::o;47476:143::-;47558:8;;-1:-1:-1;;;;;47558:8:0;47544:10;:22;47536:44;;;;-1:-1:-1;;;47536:44:0;;;;;;;:::i;:::-;47591:8;:20;;-1:-1:-1;;;;;;47591:20:0;-1:-1:-1;;;;;47591:20:0;;;;;;;;;;47476:143::o;45278:118::-;45324:7;45358:4;;45351:37;;-1:-1:-1;;;45351:37:0;;45382:4;45351:37;;;3307:51:1;-1:-1:-1;;;;;45358:4:0;;;;45351:22;;3280:18:1;;45351:37:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;49403:438::-;49536:10;;49481:15;;-1:-1:-1;;;;;49536:10:0;49522;:24;49514:48;;;;-1:-1:-1;;;49514:48:0;;;;;;;:::i;:::-;49573:22;49587:7;49573:13;:22::i;:::-;-1:-1:-1;49625:4:0;;49618:37;;-1:-1:-1;;;49618:37:0;;49649:4;49618:37;;;3307:51:1;-1:-1:-1;;;;;49625:4:0;;;;49618:22;;3280:18:1;;49618:37:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;49697:10;;49668:14;49724:4;;49685:45;;-1:-1:-1;;;49685:45:0;;-1:-1:-1;;;;;49724:4:0;;;49685:45;;;3307:51:1;49608:47:0;;-1:-1:-1;49668:14:0;;49697:10;;;49685:30;;3280:18:1;;49685:45:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;49668:62;-1:-1:-1;;;;;;49749:20:0;;49741:39;;;;-1:-1:-1;;;49741:39:0;;;;;;;:::i;:::-;49798:4;;49791:42;;-1:-1:-1;;;;;49798:4:0;49817:6;49825:7;49791:25;:42::i;:::-;49403:438;;;;:::o;46742:179::-;46842:8;;-1:-1:-1;;;;;46842:8:0;46828:10;:22;46820:44;;;;-1:-1:-1;;;46820:44:0;;;;;;;:::i;:::-;46875:17;:38;46742:179::o;47150:155::-;47236:10;;-1:-1:-1;;;;;47236:10:0;47222;:24;47214:48;;;;-1:-1:-1;;;47214:48:0;;6498:2:1;47214:48:0;;;6480:21:1;6537:2;6517:18;;;6510:30;-1:-1:-1;;;6556:18:1;;;6549:41;6607:18;;47214:48:0;6470:161:1;47214:48:0;47273:10;:24;;-1:-1:-1;;;;;;47273:24:0;-1:-1:-1;;;;;47273:24:0;;;;;;;;;;47150:155::o;46158:174::-;46252:10;;-1:-1:-1;;;;;46252:10:0;46238;:24;46230:51;;;;-1:-1:-1;;;46230:51:0;;;;;;;:::i;:::-;46292:14;:32;;-1:-1:-1;;;;;;46292:32:0;-1:-1:-1;;;;;46292:32:0;;;;;;;;;;46158:174::o;58812:326::-;58858:13;58881:4;;58874:37;;-1:-1:-1;;;58874:37:0;;58905:4;58874:37;;;3307:51:1;-1:-1:-1;;;;;58881:4:0;;;;58874:22;;3280:18:1;;58874:37:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;58858:53;-1:-1:-1;58926:9:0;;58922:209;;58977:14;;;58959:4;;58952:43;;-1:-1:-1;;;;;58959:4:0;;;;58977:14;;;58952:24;:43::i;:::-;59035:14;;;59017:4;59010:47;;-1:-1:-1;;;;;59017:4:0;;;;59035:14;59051:5;59010:24;:47::i;:::-;59091:14;;59072:47;;-1:-1:-1;;;59072:47:0;;;;;11748:25:1;;;-1:-1:-1;;;;;59091:14:0;;;;59072:40;;11721:18:1;;59072:47:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58922:209;58812:326;:::o;1485:136::-;1543:7;1570:43;1574:1;1577;1570:43;;;;;;;;;;;;;;;;;:3;:43::i;:::-;1563:50;1485:136;-1:-1:-1;;;1485:136:0:o;59146:206::-;59284:14;;59265:52;;-1:-1:-1;;;59265:52:0;;;;;11748:25:1;;;59240:7:0;;-1:-1:-1;;;;;59284:14:0;;59265:43;;11721:18:1;;59265:52:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;59337:7:0;;59146:206;-1:-1:-1;;;;59146:206:0:o;1021:181::-;1079:7;;1111:5;1115:1;1111;:5;:::i;:::-;1099:17;;1140:1;1135;:6;;1127:46;;;;-1:-1:-1;;;1127:46:0;;7513:2:1;1127:46:0;;;7495:21:1;7552:2;7532:18;;;7525:30;7591:29;7571:18;;;7564:57;7638:18;;1127:46:0;7485:177:1;2375:471:0;2433:7;2678:6;2674:47;;-1:-1:-1;2708:1:0;2701:8;;2674:47;2733:9;2745:5;2749:1;2745;:5;:::i;:::-;2733:17;-1:-1:-1;2778:1:0;2769:5;2773:1;2733:17;2769:5;:::i;:::-;:10;2761:56;;;;-1:-1:-1;;;2761:56:0;;8544:2:1;2761:56:0;;;8526:21:1;8583:2;8563:18;;;8556:30;8622:34;8602:18;;;8595:62;-1:-1:-1;;;8673:18:1;;;8666:31;8714:19;;2761:56:0;8516:223:1;3322:132:0;3380:7;3407:39;3411:1;3414;3407:39;;;;;;;;;;;;;;;;;:3;:39::i;26835:177::-;26945:58;;-1:-1:-1;;;;;3870:32:1;;26945:58:0;;;3852:51:1;3919:18;;;3912:34;;;26918:86:0;;26938:5;;-1:-1:-1;;;26968:23:0;3825:18:1;;26945:58:0;;;;-1:-1:-1;;26945:58:0;;;;;;;;;;;;;;-1:-1:-1;;;;;26945:58:0;-1:-1:-1;;;;;;26945:58:0;;;;;;;;;;26918:19;:86::i;:::-;26835:177;;;:::o;53489:789::-;53665:15;;53608:17;;53639:45;;-1:-1:-1;;;;;53639:25:0;;;;53665:15;53608:17;53639:25;:45::i;:::-;53721:15;;53695:51;;-1:-1:-1;;;;;53695:25:0;;;;53721:15;53738:7;53695:25;:51::i;:::-;53819:311;;;;;;;;-1:-1:-1;;;;;53819:311:0;;;;;;;;;;;;;;43689:4;53819:311;;;;;;53972:4;53819:311;;;;;;54002:15;53819:311;;;;;;;;;;;;-1:-1:-1;53819:311:0;;;;;;;;;;;;54229:15;;54217:53;;-1:-1:-1;;;54217:53:0;;10894:13:1;;10890:22;;54217:53:0;;;10872:41:1;10955:24;;10951:33;;10929:20;;;10922:63;11027:24;;11053:8;11023:39;11001:20;;;10994:69;11105:24;;11101:33;;11079:20;;;11072:63;11173:24;;11151:20;;;11144:54;11236:24;11214:20;;;11207:54;11299:24;;11277:20;;;11270:54;11366:24;11362:33;;11340:20;;;11333:63;53819:311:0;;54229:15;;54217:45;;10806:19:1;;54217:53:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;54205:65;53489:789;-1:-1:-1;;;;;53489:789:0:o;27494:622::-;27864:10;;;27863:62;;-1:-1:-1;27880:39:0;;-1:-1:-1;;;27880:39:0;;27904:4;27880:39;;;3581:34:1;-1:-1:-1;;;;;3651:15:1;;;3631:18;;;3624:43;27880:15:0;;;;;3516:18:1;;27880:39:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:44;27863:62;27855:152;;;;-1:-1:-1;;;27855:152:0;;10386:2:1;27855:152:0;;;10368:21:1;10425:2;10405:18;;;10398:30;10464:34;10444:18;;;10437:62;-1:-1:-1;;;10515:18:1;;;10508:52;10577:19;;27855:152:0;10358:244:1;27855:152:0;28045:62;;-1:-1:-1;;;;;3870:32:1;;28045:62:0;;;3852:51:1;3919:18;;;3912:34;;;28018:90:0;;28038:5;;-1:-1:-1;;;28068:22:0;3825:18:1;;28045:62:0;3807:145:1;55022:623:0;55090:13;55113:4;;55106:37;;-1:-1:-1;;;55106:37:0;;55137:4;55106:37;;;3307:51:1;-1:-1:-1;;;;;55113:4:0;;;;55106:22;;3280:18:1;;55106:37:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;55090:53;-1:-1:-1;55160:9:0;;55156:482;;55272:10;;55260:34;;;-1:-1:-1;;;55260:34:0;;;;55216:173;;-1:-1:-1;;;;;55272:10:0;;55260:32;;:34;;;;;;;;;;;;;;55272:10;55260:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;55313:61;43843:5;55313:33;55323:22;;55313:5;:9;;:33;;;;:::i;55216:173::-;55494:10;;55482:33;;;-1:-1:-1;;;55482:33:0;;;;55438:162;;-1:-1:-1;;;;;55494:10:0;;55482:31;;:33;;;;;;;;;;;;;;55494:10;55482:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;55534:51;43944:5;55534:28;55544:17;;55534:5;:9;;:28;;;;:::i;55438:162::-;55617:9;:7;:9::i;50365:82::-;50409:30;50423:15;:13;:15::i;1924:192::-;2010:7;2046:12;2038:6;;;;2030:29;;;;-1:-1:-1;;;2030:29:0;;;;;;;;:::i;:::-;-1:-1:-1;2070:9:0;2082:5;2086:1;2082;:5;:::i;3950:278::-;4036:7;4071:12;4064:5;4056:28;;;;-1:-1:-1;;;4056:28:0;;;;;;;;:::i;:::-;-1:-1:-1;4095:9:0;4107:5;4111:1;4107;:5;:::i;29140:761::-;29564:23;29590:69;29618:4;29590:69;;;;;;;;;;;;;;;;;29598:5;-1:-1:-1;;;;;29590:27:0;;;:69;;;;;:::i;:::-;29674:17;;29564:95;;-1:-1:-1;29674:21:0;29670:224;;29816:10;29805:30;;;;;;;;;;;;:::i;:::-;29797:85;;;;-1:-1:-1;;;29797:85:0;;9638:2:1;29797:85:0;;;9620:21:1;9677:2;9657:18;;;9650:30;9716:34;9696:18;;;9689:62;-1:-1:-1;;;9767:18:1;;;9760:40;9817:19;;29797:85:0;9610:232:1;12964:196:0;13067:12;13099:53;13122:6;13130:4;13136:1;13139:12;13099:22;:53::i;:::-;13092:60;12964:196;-1:-1:-1;;;;12964:196:0:o;14341:979::-;14471:12;10413:20;;14496:60;;;;-1:-1:-1;;;14496:60:0;;9280:2:1;14496:60:0;;;9262:21:1;9319:2;9299:18;;;9292:30;9358:31;9338:18;;;9331:59;9407:18;;14496:60:0;9252:179:1;14496:60:0;14630:12;14644:23;14671:6;-1:-1:-1;;;;;14671:11:0;14691:8;14702:4;14671:36;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14629:78;;;;14722:7;14718:595;;;14753:10;-1:-1:-1;14746:17:0;;-1:-1:-1;14746:17:0;14718:595;14867:17;;:21;14863:439;;15130:10;15124:17;15191:15;15178:10;15174:2;15170:19;15163:44;15078:148;15273:12;15266:20;;-1:-1:-1;;;15266:20:0;;;;;;;;:::i;14:257:1:-;73:6;126:2;114:9;105:7;101:23;97:32;94:2;;;147:6;139;132:22;94:2;191:9;178:23;210:31;235:5;210:31;:::i;276:261::-;346:6;399:2;387:9;378:7;374:23;370:32;367:2;;;420:6;412;405:22;367:2;457:9;451:16;476:31;501:5;476:31;:::i;542:1101::-;619:6;627;680:2;668:9;659:7;655:23;651:32;648:2;;;701:6;693;686:22;648:2;745:9;732:23;764:31;789:5;764:31;:::i;:::-;814:5;-1:-1:-1;870:2:1;855:18;;842:32;893:18;923:14;;;920:2;;;955:6;947;940:22;920:2;998:6;987:9;983:22;973:32;;1043:7;1036:4;1032:2;1028:13;1024:27;1014:2;;1070:6;1062;1055:22;1014:2;1111;1098:16;1133:2;1129;1126:10;1123:2;;;1139:18;;:::i;:::-;1214:2;1208:9;1182:2;1268:13;;-1:-1:-1;;1264:22:1;;;1288:2;1260:31;1256:40;1244:53;;;1312:18;;;1332:22;;;1309:46;1306:2;;;1358:18;;:::i;:::-;1398:10;1394:2;1387:22;1433:2;1425:6;1418:18;1473:7;1468:2;1463;1459;1455:11;1451:20;1448:33;1445:2;;;1499:6;1491;1484:22;1445:2;1560;1555;1551;1547:11;1542:2;1534:6;1530:15;1517:46;1605:6;1600:2;1595;1587:6;1583:15;1579:24;1572:40;1631:6;1621:16;;;;;;;638:1005;;;;;:::o;1648:297::-;1715:6;1768:2;1756:9;1747:7;1743:23;1739:32;1736:2;;;1789:6;1781;1774:22;1736:2;1826:9;1820:16;1879:5;1872:13;1865:21;1858:5;1855:32;1845:2;;1906:6;1898;1891:22;2226:190;2285:6;2338:2;2326:9;2317:7;2313:23;2309:32;2306:2;;;2359:6;2351;2344:22;2306:2;-1:-1:-1;2387:23:1;;2296:120;-1:-1:-1;2296:120:1:o;2421:194::-;2491:6;2544:2;2532:9;2523:7;2519:23;2515:32;2512:2;;;2565:6;2557;2550:22;2512:2;-1:-1:-1;2593:16:1;;2502:113;-1:-1:-1;2502:113:1:o;2620:257::-;2661:3;2699:5;2693:12;2726:6;2721:3;2714:19;2742:63;2798:6;2791:4;2786:3;2782:14;2775:4;2768:5;2764:16;2742:63;:::i;:::-;2859:2;2838:15;-1:-1:-1;;2834:29:1;2825:39;;;;2866:4;2821:50;;2669:208;-1:-1:-1;;2669:208:1:o;2882:274::-;3011:3;3049:6;3043:13;3065:53;3111:6;3106:3;3099:4;3091:6;3087:17;3065:53;:::i;:::-;3134:16;;;;;3019:137;-1:-1:-1;;3019:137:1:o;3957:788::-;4211:2;4223:21;;;4293:13;;4196:18;;;4315:22;;;4163:4;;4391;;4368:3;4353:19;;;4418:15;;;4163:4;4464:169;4478:6;4475:1;4472:13;4464:169;;;4539:13;;4527:26;;4573:12;;;;4608:15;;;;4500:1;4493:9;4464:169;;;-1:-1:-1;;;4669:18:1;;;4662:34;;;;-1:-1:-1;4727:2:1;4712:18;4705:34;4650:3;4172:573;-1:-1:-1;4172:573:1:o;4942:217::-;5089:2;5078:9;5071:21;5052:4;5109:44;5149:2;5138:9;5134:18;5126:6;5109:44;:::i;6971:335::-;7173:2;7155:21;;;7212:2;7192:18;;;7185:30;-1:-1:-1;;;7246:2:1;7231:18;;7224:41;7297:2;7282:18;;7145:161::o;7999:338::-;8201:2;8183:21;;;8240:2;8220:18;;;8213:30;-1:-1:-1;;;8274:2:1;8259:18;;8252:44;8328:2;8313:18;;8173:164::o;8744:329::-;8946:2;8928:21;;;8985:1;8965:18;;;8958:29;-1:-1:-1;;;9018:2:1;9003:18;;8996:36;9064:2;9049:18;;8918:155::o;9847:332::-;10049:2;10031:21;;;10088:1;10068:18;;;10061:29;-1:-1:-1;;;10121:2:1;10106:18;;10099:39;10170:2;10155:18;;10021:158::o;12037:128::-;12077:3;12108:1;12104:6;12101:1;12098:13;12095:2;;;12114:18;;:::i;:::-;-1:-1:-1;12150:9:1;;12085:80::o;12170:217::-;12210:1;12236;12226:2;;-1:-1:-1;;;12261:31:1;;12315:4;12312:1;12305:15;12343:4;12268:1;12333:15;12226:2;-1:-1:-1;12372:9:1;;12216:171::o;12392:168::-;12432:7;12498:1;12494;12490:6;12486:14;12483:1;12480:21;12475:1;12468:9;12461:17;12457:45;12454:2;;;12505:18;;:::i;:::-;-1:-1:-1;12545:9:1;;12444:116::o;12565:125::-;12605:4;12633:1;12630;12627:8;12624:2;;;12638:18;;:::i;:::-;-1:-1:-1;12675:9:1;;12614:76::o;12695:258::-;12767:1;12777:113;12791:6;12788:1;12785:13;12777:113;;;12867:11;;;12861:18;12848:11;;;12841:39;12813:2;12806:10;12777:113;;;12908:6;12905:1;12902:13;12899:2;;;12943:1;12934:6;12929:3;12925:16;12918:27;12899:2;;12748:205;;;:::o;12958:127::-;13019:10;13014:3;13010:20;13007:1;13000:31;13050:4;13047:1;13040:15;13074:4;13071:1;13064:15;13090:127;13151:10;13146:3;13142:20;13139:1;13132:31;13182:4;13179:1;13172:15;13206:4;13203:1;13196:15;13222:131;-1:-1:-1;;;;;13297:31:1;;13287:42;;13277:2;;13343:1;13340;13333:12
Swarm Source
ipfs://b6f1ff13e6618ef0bc04d511d30884f4276aac6a53e48c36bafcd355d26ab677
Net Worth in USD
Net Worth in ETH
Multichain Portfolio | 35 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|
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.