Latest 25 from a total of 1,020 transactions
| Transaction Hash |
|
Block
|
From
|
To
|
|||||
|---|---|---|---|---|---|---|---|---|---|
| Approve | 11080524 | 240 days ago | OUT | 0 GLMR | 0 | ||||
| Panic | 8620663 | 415 days ago | IN | 0 GLMR | 0.35669712 | ||||
| Harvest | 3423465 | 1006 days ago | IN | 0 GLMR | 0.10907368 | ||||
| Harvest | 3416737 | 1007 days ago | IN | 0 GLMR | 0.11691865 | ||||
| Harvest | 3407647 | 1008 days ago | IN | 0 GLMR | 0.11721265 | ||||
| Harvest | 3400853 | 1009 days ago | IN | 0 GLMR | 0.11670865 | ||||
| Harvest | 3394080 | 1010 days ago | IN | 0 GLMR | 0.11670865 | ||||
| Harvest | 3387211 | 1011 days ago | IN | 0 GLMR | 0.11721265 | ||||
| Harvest | 3380394 | 1012 days ago | IN | 0 GLMR | 0.11670865 | ||||
| Harvest | 3362079 | 1015 days ago | IN | 0 GLMR | 0.11670865 | ||||
| Harvest | 3355146 | 1016 days ago | IN | 0 GLMR | 0.11670865 | ||||
| Harvest | 3348220 | 1017 days ago | IN | 0 GLMR | 0.11721265 | ||||
| Harvest | 3341229 | 1018 days ago | IN | 0 GLMR | 0.11670865 | ||||
| Harvest | 3334246 | 1019 days ago | IN | 0 GLMR | 0.11670865 | ||||
| Harvest | 3327270 | 1020 days ago | IN | 0 GLMR | 0.11721265 | ||||
| Harvest | 3320279 | 1021 days ago | IN | 0 GLMR | 0.11721265 | ||||
| Harvest | 3313304 | 1022 days ago | IN | 0 GLMR | 0.11721265 | ||||
| Harvest | 3305236 | 1023 days ago | IN | 0 GLMR | 0.11670865 | ||||
| Harvest | 3295984 | 1024 days ago | IN | 0 GLMR | 0.11670865 | ||||
| Harvest | 3288411 | 1026 days ago | IN | 0 GLMR | 0.1190091 | ||||
| Harvest | 3281483 | 1027 days ago | IN | 0 GLMR | 0.1190091 | ||||
| Harvest | 3274551 | 1028 days ago | IN | 0 GLMR | 0.11723649 | ||||
| Harvest | 3267602 | 1029 days ago | IN | 0 GLMR | 0.1172136 | ||||
| Harvest | 3260653 | 1030 days ago | IN | 0 GLMR | 0.11723649 | ||||
| Harvest | 3253824 | 1031 days ago | IN | 0 GLMR | 0.11723649 |
Latest 25 internal transactions (View All)
| Parent Transaction Hash | Block | From | To | |||
|---|---|---|---|---|---|---|
| 3174352 | 1042 days ago | 86.56702112 GLMR | ||||
| 3173730 | 1042 days ago | 86.56702112 GLMR | ||||
| 3172625 | 1042 days ago | 192.23326952 GLMR | ||||
| 3172625 | 1042 days ago | 192.23326952 GLMR | ||||
| 3171221 | 1043 days ago | 14.21923188 GLMR | ||||
| 3171221 | 1043 days ago | 14.21923188 GLMR | ||||
| 3171119 | 1043 days ago | 0.39497531 GLMR | ||||
| 3171119 | 1043 days ago | 0.39497531 GLMR | ||||
| 3171116 | 1043 days ago | 35.81115965 GLMR | ||||
| 3171116 | 1043 days ago | 32.5846736 GLMR | ||||
| 3170876 | 1043 days ago | 3.22648605 GLMR | ||||
| 3170852 | 1043 days ago | 115.19308209 GLMR | ||||
| 3170852 | 1043 days ago | 115.19308209 GLMR | ||||
| 3170000 | 1043 days ago | 108.16858904 GLMR | ||||
| 3170000 | 1043 days ago | 108.16858904 GLMR | ||||
| 3169199 | 1043 days ago | 169.9366558 GLMR | ||||
| 3169199 | 1043 days ago | 169.9366558 GLMR | ||||
| 3167937 | 1043 days ago | 180.72767543 GLMR | ||||
| 3167937 | 1043 days ago | 118.15054797 GLMR | ||||
| 3167071 | 1043 days ago | 62.57712745 GLMR | ||||
| 3166607 | 1043 days ago | 194.20688935 GLMR | ||||
| 3166607 | 1043 days ago | 194.20688935 GLMR | ||||
| 3165185 | 1043 days ago | 228.45463398 GLMR | ||||
| 3165185 | 1043 days ago | 83.56740515 GLMR | ||||
| 3164569 | 1043 days ago | 144.88722882 GLMR |
Cross-Chain Transactions
Loading...
Loading
Contract Name:
StrategyStellaMultiRewardsLP
Compiler Version
v0.6.12+commit.27d51765
Contract Source Code (Solidity)
/**
*Submitted for verification at moonbeam.moonscan.io on 2022-05-04
*/
// SPDX-License-Identifier: MIT
// File: @openzeppelin/contracts/utils/Context.sol
pragma solidity >=0.6.0 <0.8.0;
/*
* @dev Provides information about the current execution context, including the
* sender of the transaction and its data. While these are generally available
* via msg.sender and msg.data, they should not be accessed in such a direct
* manner, since when dealing with GSN meta-transactions the account sending and
* paying for execution may not be the actual sender (as far as an application
* is concerned).
*
* This contract is only required for intermediate, library-like contracts.
*/
abstract contract Context {
function _msgSender() internal view virtual returns (address payable) {
return msg.sender;
}
function _msgData() internal view virtual returns (bytes memory) {
this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
return msg.data;
}
}
// File: @openzeppelin/contracts/token/ERC20/IERC20.sol
pragma solidity >=0.6.0 <0.8.0;
/**
* @dev Interface of the ERC20 standard as defined in the EIP.
*/
interface IERC20 {
/**
* @dev Returns the amount of tokens in existence.
*/
function totalSupply() external view returns (uint256);
/**
* @dev Returns the amount of tokens owned by `account`.
*/
function balanceOf(address account) external view returns (uint256);
/**
* @dev Moves `amount` tokens from the caller's account to `recipient`.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* Emits a {Transfer} event.
*/
function transfer(address recipient, uint256 amount) external returns (bool);
/**
* @dev Returns the remaining number of tokens that `spender` will be
* allowed to spend on behalf of `owner` through {transferFrom}. This is
* zero by default.
*
* This value changes when {approve} or {transferFrom} are called.
*/
function allowance(address owner, address spender) external view returns (uint256);
/**
* @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* IMPORTANT: Beware that changing an allowance with this method brings the risk
* that someone may use both the old and the new allowance by unfortunate
* transaction ordering. One possible solution to mitigate this race
* condition is to first reduce the spender's allowance to 0 and set the
* desired value afterwards:
* https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
*
* Emits an {Approval} event.
*/
function approve(address spender, uint256 amount) external returns (bool);
/**
* @dev Moves `amount` tokens from `sender` to `recipient` using the
* allowance mechanism. `amount` is then deducted from the caller's
* allowance.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* Emits a {Transfer} event.
*/
function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);
/**
* @dev Emitted when `value` tokens are moved from one account (`from`) to
* another (`to`).
*
* Note that `value` may be zero.
*/
event Transfer(address indexed from, address indexed to, uint256 value);
/**
* @dev Emitted when the allowance of a `spender` for an `owner` is set by
* a call to {approve}. `value` is the new allowance.
*/
event Approval(address indexed owner, address indexed spender, uint256 value);
}
// File: @openzeppelin/contracts/math/SafeMath.sol
pragma solidity >=0.6.0 <0.8.0;
/**
* @dev Wrappers over Solidity's arithmetic operations with added overflow
* checks.
*
* Arithmetic operations in Solidity wrap on overflow. This can easily result
* in bugs, because programmers usually assume that an overflow raises an
* error, which is the standard behavior in high level programming languages.
* `SafeMath` restores this intuition by reverting the transaction when an
* operation overflows.
*
* Using this library instead of the unchecked operations eliminates an entire
* class of bugs, so it's recommended to use it always.
*/
library SafeMath {
/**
* @dev Returns the addition of two unsigned integers, with an overflow flag.
*
* _Available since v3.4._
*/
function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
uint256 c = a + b;
if (c < a) return (false, 0);
return (true, c);
}
/**
* @dev Returns the substraction of two unsigned integers, with an overflow flag.
*
* _Available since v3.4._
*/
function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {
if (b > a) return (false, 0);
return (true, a - b);
}
/**
* @dev Returns the multiplication of two unsigned integers, with an overflow flag.
*
* _Available since v3.4._
*/
function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {
// Gas optimization: this is cheaper than requiring 'a' not being zero, but the
// benefit is lost if 'b' is also tested.
// See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
if (a == 0) return (true, 0);
uint256 c = a * b;
if (c / a != b) return (false, 0);
return (true, c);
}
/**
* @dev Returns the division of two unsigned integers, with a division by zero flag.
*
* _Available since v3.4._
*/
function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {
if (b == 0) return (false, 0);
return (true, a / b);
}
/**
* @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.
*
* _Available since v3.4._
*/
function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {
if (b == 0) return (false, 0);
return (true, a % b);
}
/**
* @dev Returns the addition of two unsigned integers, reverting on
* overflow.
*
* Counterpart to Solidity's `+` operator.
*
* Requirements:
*
* - Addition cannot overflow.
*/
function add(uint256 a, uint256 b) internal pure returns (uint256) {
uint256 c = a + b;
require(c >= a, "SafeMath: addition overflow");
return c;
}
/**
* @dev Returns the subtraction of two unsigned integers, reverting on
* overflow (when the result is negative).
*
* Counterpart to Solidity's `-` operator.
*
* Requirements:
*
* - Subtraction cannot overflow.
*/
function sub(uint256 a, uint256 b) internal pure returns (uint256) {
require(b <= a, "SafeMath: subtraction overflow");
return a - b;
}
/**
* @dev Returns the multiplication of two unsigned integers, reverting on
* overflow.
*
* Counterpart to Solidity's `*` operator.
*
* Requirements:
*
* - Multiplication cannot overflow.
*/
function mul(uint256 a, uint256 b) internal pure returns (uint256) {
if (a == 0) return 0;
uint256 c = a * b;
require(c / a == b, "SafeMath: multiplication overflow");
return c;
}
/**
* @dev Returns the integer division of two unsigned integers, reverting on
* division by zero. The result is rounded towards zero.
*
* Counterpart to Solidity's `/` operator. Note: this function uses a
* `revert` opcode (which leaves remaining gas untouched) while Solidity
* uses an invalid opcode to revert (consuming all remaining gas).
*
* Requirements:
*
* - The divisor cannot be zero.
*/
function div(uint256 a, uint256 b) internal pure returns (uint256) {
require(b > 0, "SafeMath: division by zero");
return a / b;
}
/**
* @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
* reverting when dividing by zero.
*
* Counterpart to Solidity's `%` operator. This function uses a `revert`
* opcode (which leaves remaining gas untouched) while Solidity uses an
* invalid opcode to revert (consuming all remaining gas).
*
* Requirements:
*
* - The divisor cannot be zero.
*/
function mod(uint256 a, uint256 b) internal pure returns (uint256) {
require(b > 0, "SafeMath: modulo by zero");
return a % b;
}
/**
* @dev Returns the subtraction of two unsigned integers, reverting with custom message on
* overflow (when the result is negative).
*
* CAUTION: This function is deprecated because it requires allocating memory for the error
* message unnecessarily. For custom revert reasons use {trySub}.
*
* Counterpart to Solidity's `-` operator.
*
* Requirements:
*
* - Subtraction cannot overflow.
*/
function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
require(b <= a, errorMessage);
return a - b;
}
/**
* @dev Returns the integer division of two unsigned integers, reverting with custom message on
* division by zero. The result is rounded towards zero.
*
* CAUTION: This function is deprecated because it requires allocating memory for the error
* message unnecessarily. For custom revert reasons use {tryDiv}.
*
* Counterpart to Solidity's `/` operator. Note: this function uses a
* `revert` opcode (which leaves remaining gas untouched) while Solidity
* uses an invalid opcode to revert (consuming all remaining gas).
*
* Requirements:
*
* - The divisor cannot be zero.
*/
function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
require(b > 0, errorMessage);
return a / b;
}
/**
* @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
* reverting with custom message when dividing by zero.
*
* CAUTION: This function is deprecated because it requires allocating memory for the error
* message unnecessarily. For custom revert reasons use {tryMod}.
*
* Counterpart to Solidity's `%` operator. This function uses a `revert`
* opcode (which leaves remaining gas untouched) while Solidity uses an
* invalid opcode to revert (consuming all remaining gas).
*
* Requirements:
*
* - The divisor cannot be zero.
*/
function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
require(b > 0, errorMessage);
return a % b;
}
}
// File: @openzeppelin/contracts/token/ERC20/ERC20.sol
pragma solidity >=0.6.0 <0.8.0;
/**
* @dev Implementation of the {IERC20} interface.
*
* This implementation is agnostic to the way tokens are created. This means
* that a supply mechanism has to be added in a derived contract using {_mint}.
* For a generic mechanism see {ERC20PresetMinterPauser}.
*
* TIP: For a detailed writeup see our guide
* https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How
* to implement supply mechanisms].
*
* We have followed general OpenZeppelin guidelines: functions revert instead
* of returning `false` on failure. This behavior is nonetheless conventional
* and does not conflict with the expectations of ERC20 applications.
*
* Additionally, an {Approval} event is emitted on calls to {transferFrom}.
* This allows applications to reconstruct the allowance for all accounts just
* by listening to said events. Other implementations of the EIP may not emit
* these events, as it isn't required by the specification.
*
* Finally, the non-standard {decreaseAllowance} and {increaseAllowance}
* functions have been added to mitigate the well-known issues around setting
* allowances. See {IERC20-approve}.
*/
contract ERC20 is Context, IERC20 {
using SafeMath for uint256;
mapping (address => uint256) private _balances;
mapping (address => mapping (address => uint256)) private _allowances;
uint256 private _totalSupply;
string private _name;
string private _symbol;
uint8 private _decimals;
/**
* @dev Sets the values for {name} and {symbol}, initializes {decimals} with
* a default value of 18.
*
* To select a different value for {decimals}, use {_setupDecimals}.
*
* All three of these values are immutable: they can only be set once during
* construction.
*/
constructor (string memory name_, string memory symbol_) public {
_name = name_;
_symbol = symbol_;
_decimals = 18;
}
/**
* @dev Returns the name of the token.
*/
function name() public view virtual returns (string memory) {
return _name;
}
/**
* @dev Returns the symbol of the token, usually a shorter version of the
* name.
*/
function symbol() public view virtual returns (string memory) {
return _symbol;
}
/**
* @dev Returns the number of decimals used to get its user representation.
* For example, if `decimals` equals `2`, a balance of `505` tokens should
* be displayed to a user as `5,05` (`505 / 10 ** 2`).
*
* Tokens usually opt for a value of 18, imitating the relationship between
* Ether and Wei. This is the value {ERC20} uses, unless {_setupDecimals} is
* called.
*
* NOTE: This information is only used for _display_ purposes: it in
* no way affects any of the arithmetic of the contract, including
* {IERC20-balanceOf} and {IERC20-transfer}.
*/
function decimals() public view virtual returns (uint8) {
return _decimals;
}
/**
* @dev See {IERC20-totalSupply}.
*/
function totalSupply() public view virtual override returns (uint256) {
return _totalSupply;
}
/**
* @dev See {IERC20-balanceOf}.
*/
function balanceOf(address account) public view virtual override returns (uint256) {
return _balances[account];
}
/**
* @dev See {IERC20-transfer}.
*
* Requirements:
*
* - `recipient` cannot be the zero address.
* - the caller must have a balance of at least `amount`.
*/
function transfer(address recipient, uint256 amount) public virtual override returns (bool) {
_transfer(_msgSender(), recipient, amount);
return true;
}
/**
* @dev See {IERC20-allowance}.
*/
function allowance(address owner, address spender) public view virtual override returns (uint256) {
return _allowances[owner][spender];
}
/**
* @dev See {IERC20-approve}.
*
* Requirements:
*
* - `spender` cannot be the zero address.
*/
function approve(address spender, uint256 amount) public virtual override returns (bool) {
_approve(_msgSender(), spender, amount);
return true;
}
/**
* @dev See {IERC20-transferFrom}.
*
* Emits an {Approval} event indicating the updated allowance. This is not
* required by the EIP. See the note at the beginning of {ERC20}.
*
* Requirements:
*
* - `sender` and `recipient` cannot be the zero address.
* - `sender` must have a balance of at least `amount`.
* - the caller must have allowance for ``sender``'s tokens of at least
* `amount`.
*/
function transferFrom(address sender, address recipient, uint256 amount) public virtual override returns (bool) {
_transfer(sender, recipient, amount);
_approve(sender, _msgSender(), _allowances[sender][_msgSender()].sub(amount, "ERC20: transfer amount exceeds allowance"));
return true;
}
/**
* @dev Atomically increases the allowance granted to `spender` by the caller.
*
* This is an alternative to {approve} that can be used as a mitigation for
* problems described in {IERC20-approve}.
*
* Emits an {Approval} event indicating the updated allowance.
*
* Requirements:
*
* - `spender` cannot be the zero address.
*/
function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {
_approve(_msgSender(), spender, _allowances[_msgSender()][spender].add(addedValue));
return true;
}
/**
* @dev Atomically decreases the allowance granted to `spender` by the caller.
*
* This is an alternative to {approve} that can be used as a mitigation for
* problems described in {IERC20-approve}.
*
* Emits an {Approval} event indicating the updated allowance.
*
* Requirements:
*
* - `spender` cannot be the zero address.
* - `spender` must have allowance for the caller of at least
* `subtractedValue`.
*/
function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {
_approve(_msgSender(), spender, _allowances[_msgSender()][spender].sub(subtractedValue, "ERC20: decreased allowance below zero"));
return true;
}
/**
* @dev Moves tokens `amount` from `sender` to `recipient`.
*
* This is internal function is equivalent to {transfer}, and can be used to
* e.g. implement automatic token fees, slashing mechanisms, etc.
*
* Emits a {Transfer} event.
*
* Requirements:
*
* - `sender` cannot be the zero address.
* - `recipient` cannot be the zero address.
* - `sender` must have a balance of at least `amount`.
*/
function _transfer(address sender, address recipient, uint256 amount) internal virtual {
require(sender != address(0), "ERC20: transfer from the zero address");
require(recipient != address(0), "ERC20: transfer to the zero address");
_beforeTokenTransfer(sender, recipient, amount);
_balances[sender] = _balances[sender].sub(amount, "ERC20: transfer amount exceeds balance");
_balances[recipient] = _balances[recipient].add(amount);
emit Transfer(sender, recipient, amount);
}
/** @dev Creates `amount` tokens and assigns them to `account`, increasing
* the total supply.
*
* Emits a {Transfer} event with `from` set to the zero address.
*
* Requirements:
*
* - `to` cannot be the zero address.
*/
function _mint(address account, uint256 amount) internal virtual {
require(account != address(0), "ERC20: mint to the zero address");
_beforeTokenTransfer(address(0), account, amount);
_totalSupply = _totalSupply.add(amount);
_balances[account] = _balances[account].add(amount);
emit Transfer(address(0), account, amount);
}
/**
* @dev Destroys `amount` tokens from `account`, reducing the
* total supply.
*
* Emits a {Transfer} event with `to` set to the zero address.
*
* Requirements:
*
* - `account` cannot be the zero address.
* - `account` must have at least `amount` tokens.
*/
function _burn(address account, uint256 amount) internal virtual {
require(account != address(0), "ERC20: burn from the zero address");
_beforeTokenTransfer(account, address(0), amount);
_balances[account] = _balances[account].sub(amount, "ERC20: burn amount exceeds balance");
_totalSupply = _totalSupply.sub(amount);
emit Transfer(account, address(0), amount);
}
/**
* @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens.
*
* This internal function is equivalent to `approve`, and can be used to
* e.g. set automatic allowances for certain subsystems, etc.
*
* Emits an {Approval} event.
*
* Requirements:
*
* - `owner` cannot be the zero address.
* - `spender` cannot be the zero address.
*/
function _approve(address owner, address spender, uint256 amount) internal virtual {
require(owner != address(0), "ERC20: approve from the zero address");
require(spender != address(0), "ERC20: approve to the zero address");
_allowances[owner][spender] = amount;
emit Approval(owner, spender, amount);
}
/**
* @dev Sets {decimals} to a value other than the default one of 18.
*
* WARNING: This function should only be called from the constructor. Most
* applications that interact with token contracts will not expect
* {decimals} to ever change, and may work incorrectly if it does.
*/
function _setupDecimals(uint8 decimals_) internal virtual {
_decimals = decimals_;
}
/**
* @dev Hook that is called before any transfer of tokens. This includes
* minting and burning.
*
* Calling conditions:
*
* - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens
* will be to transferred to `to`.
* - when `from` is zero, `amount` tokens will be minted for `to`.
* - when `to` is zero, `amount` of ``from``'s tokens will be burned.
* - `from` and `to` are never both zero.
*
* To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
*/
function _beforeTokenTransfer(address from, address to, uint256 amount) internal virtual { }
}
// File: @openzeppelin/contracts/utils/Address.sol
pragma solidity >=0.6.2 <0.8.0;
/**
* @dev Collection of functions related to the address type
*/
library Address {
/**
* @dev Returns true if `account` is a contract.
*
* [IMPORTANT]
* ====
* It is unsafe to assume that an address for which this function returns
* false is an externally-owned account (EOA) and not a contract.
*
* Among others, `isContract` will return false for the following
* types of addresses:
*
* - an externally-owned account
* - a contract in construction
* - an address where a contract will be created
* - an address where a contract lived, but was destroyed
* ====
*/
function isContract(address account) internal view returns (bool) {
// This method relies on extcodesize, which returns 0 for contracts in
// construction, since the code is only stored at the end of the
// constructor execution.
uint256 size;
// solhint-disable-next-line no-inline-assembly
assembly { size := extcodesize(account) }
return size > 0;
}
/**
* @dev Replacement for Solidity's `transfer`: sends `amount` wei to
* `recipient`, forwarding all available gas and reverting on errors.
*
* https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
* of certain opcodes, possibly making contracts go over the 2300 gas limit
* imposed by `transfer`, making them unable to receive funds via
* `transfer`. {sendValue} removes this limitation.
*
* https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].
*
* IMPORTANT: because control is transferred to `recipient`, care must be
* taken to not create reentrancy vulnerabilities. Consider using
* {ReentrancyGuard} or the
* https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
*/
function sendValue(address payable recipient, uint256 amount) internal {
require(address(this).balance >= amount, "Address: insufficient balance");
// solhint-disable-next-line avoid-low-level-calls, avoid-call-value
(bool success, ) = recipient.call{ value: amount }("");
require(success, "Address: unable to send value, recipient may have reverted");
}
/**
* @dev Performs a Solidity function call using a low level `call`. A
* plain`call` is an unsafe replacement for a function call: use this
* function instead.
*
* If `target` reverts with a revert reason, it is bubbled up by this
* function (like regular Solidity function calls).
*
* Returns the raw returned data. To convert to the expected return value,
* use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
*
* Requirements:
*
* - `target` must be a contract.
* - calling `target` with `data` must not revert.
*
* _Available since v3.1._
*/
function functionCall(address target, bytes memory data) internal returns (bytes memory) {
return functionCall(target, data, "Address: low-level call failed");
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
* `errorMessage` as a fallback revert reason when `target` reverts.
*
* _Available since v3.1._
*/
function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {
return functionCallWithValue(target, data, 0, errorMessage);
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
* but also transferring `value` wei to `target`.
*
* Requirements:
*
* - the calling contract must have an ETH balance of at least `value`.
* - the called Solidity function must be `payable`.
*
* _Available since v3.1._
*/
function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {
return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
}
/**
* @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
* with `errorMessage` as a fallback revert reason when `target` reverts.
*
* _Available since v3.1._
*/
function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) {
require(address(this).balance >= value, "Address: insufficient balance for call");
require(isContract(target), "Address: call to non-contract");
// solhint-disable-next-line avoid-low-level-calls
(bool success, bytes memory returndata) = target.call{ value: value }(data);
return _verifyCallResult(success, returndata, errorMessage);
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
* but performing a static call.
*
* _Available since v3.3._
*/
function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
return functionStaticCall(target, data, "Address: low-level static call failed");
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
* but performing a static call.
*
* _Available since v3.3._
*/
function functionStaticCall(address target, bytes memory data, string memory errorMessage) internal view returns (bytes memory) {
require(isContract(target), "Address: static call to non-contract");
// solhint-disable-next-line avoid-low-level-calls
(bool success, bytes memory returndata) = target.staticcall(data);
return _verifyCallResult(success, returndata, errorMessage);
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
* but performing a delegate call.
*
* _Available since v3.4._
*/
function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
return functionDelegateCall(target, data, "Address: low-level delegate call failed");
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
* but performing a delegate call.
*
* _Available since v3.4._
*/
function functionDelegateCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {
require(isContract(target), "Address: delegate call to non-contract");
// solhint-disable-next-line avoid-low-level-calls
(bool success, bytes memory returndata) = target.delegatecall(data);
return _verifyCallResult(success, returndata, errorMessage);
}
function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private pure returns(bytes memory) {
if (success) {
return returndata;
} else {
// Look for revert reason and bubble it up if present
if (returndata.length > 0) {
// The easiest way to bubble the revert reason is using memory via assembly
// solhint-disable-next-line no-inline-assembly
assembly {
let returndata_size := mload(returndata)
revert(add(32, returndata), returndata_size)
}
} else {
revert(errorMessage);
}
}
}
}
// File: @openzeppelin/contracts/token/ERC20/SafeERC20.sol
pragma solidity >=0.6.0 <0.8.0;
/**
* @title SafeERC20
* @dev Wrappers around ERC20 operations that throw on failure (when the token
* contract returns false). Tokens that return no value (and instead revert or
* throw on failure) are also supported, non-reverting calls are assumed to be
* successful.
* To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,
* which allows you to call the safe operations as `token.safeTransfer(...)`, etc.
*/
library SafeERC20 {
using SafeMath for uint256;
using Address for address;
function safeTransfer(IERC20 token, address to, uint256 value) internal {
_callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));
}
function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal {
_callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));
}
/**
* @dev Deprecated. This function has issues similar to the ones found in
* {IERC20-approve}, and its usage is discouraged.
*
* Whenever possible, use {safeIncreaseAllowance} and
* {safeDecreaseAllowance} instead.
*/
function safeApprove(IERC20 token, address spender, uint256 value) internal {
// safeApprove should only be called when setting an initial allowance,
// or when resetting it to zero. To increase and decrease it, use
// 'safeIncreaseAllowance' and 'safeDecreaseAllowance'
// solhint-disable-next-line max-line-length
require((value == 0) || (token.allowance(address(this), spender) == 0),
"SafeERC20: approve from non-zero to non-zero allowance"
);
_callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));
}
function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal {
uint256 newAllowance = token.allowance(address(this), spender).add(value);
_callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
}
function safeDecreaseAllowance(IERC20 token, address spender, uint256 value) internal {
uint256 newAllowance = token.allowance(address(this), spender).sub(value, "SafeERC20: decreased allowance below zero");
_callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
}
/**
* @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement
* on the return value: the return value is optional (but if data is returned, it must not be false).
* @param token The token targeted by the call.
* @param data The call data (encoded using abi.encode or one of its variants).
*/
function _callOptionalReturn(IERC20 token, bytes memory data) private {
// We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since
// we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that
// the target address contains contract code and also asserts for success in the low-level call.
bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed");
if (returndata.length > 0) { // Return data is optional
// solhint-disable-next-line max-line-length
require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed");
}
}
}
// File: contracts/BIFI/interfaces/common/IUniswapRouterETH.sol
pragma solidity >=0.6.0 <0.9.0;
interface IUniswapRouterETH {
function addLiquidity(
address tokenA,
address tokenB,
uint amountADesired,
uint amountBDesired,
uint amountAMin,
uint amountBMin,
address to,
uint deadline
) external returns (uint amountA, uint amountB, uint liquidity);
function addLiquidityETH(
address token,
uint amountTokenDesired,
uint amountTokenMin,
uint amountETHMin,
address to,
uint deadline
) external payable returns (uint amountToken, uint amountETH, uint 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 swapExactTokensForTokens(
uint amountIn,
uint amountOutMin,
address[] calldata path,
address to,
uint deadline
) external returns (uint[] memory amounts);
function swapExactETHForTokens(uint amountOutMin, address[] calldata path, address to, uint deadline)
external
payable
returns (uint[] memory amounts);
function swapExactTokensForETH(uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline)
external
returns (uint[] memory amounts);
function getAmountsOut(uint amountIn, address[] calldata path) external view returns (uint[] memory amounts);
}
// File: contracts/BIFI/interfaces/common/IUniswapV2Pair.sol
pragma solidity ^0.6.0;
interface IUniswapV2Pair {
function factory() external view returns (address);
function token0() external view returns (address);
function token1() external view returns (address);
function burn(address to) external returns (uint amount0, uint amount1);
function getReserves() external view returns (uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast);
}
// File: contracts/BIFI/interfaces/common/IWrappedNative.sol
pragma solidity ^0.6.0;
interface IWrappedNative is IERC20 {
function deposit() external payable;
function withdraw(uint wad) external;
}
// File: contracts/BIFI/interfaces/solar/ISolarChef.sol
pragma solidity ^0.6.0;
pragma experimental ABIEncoderV2;
interface ISolarChef {
function deposit(uint256 _pid, uint256 _amount) external;
function withdraw(uint256 _pid, uint256 _amount) external;
function userInfo(uint256 _pid, address _user) external view returns (uint256, uint256, uint256, uint256);
function emergencyWithdraw(uint256 _pid) external;
function pendingTokens(uint256 _pid, address _user)
external
view
returns (address[] calldata addresses, string[] calldata symbols, uint256[] calldata decimals, uint256[] calldata amounts);
}
// File: @openzeppelin/contracts/access/Ownable.sol
pragma solidity >=0.6.0 <0.8.0;
/**
* @dev Contract module which provides a basic access control mechanism, where
* there is an account (an owner) that can be granted exclusive access to
* specific functions.
*
* By default, the owner account will be the one that deploys the contract. This
* can later be changed with {transferOwnership}.
*
* This module is used through inheritance. It will make available the modifier
* `onlyOwner`, which can be applied to your functions to restrict their use to
* the owner.
*/
abstract contract Ownable is Context {
address private _owner;
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
/**
* @dev Initializes the contract setting the deployer as the initial owner.
*/
constructor () internal {
address msgSender = _msgSender();
_owner = msgSender;
emit OwnershipTransferred(address(0), msgSender);
}
/**
* @dev Returns the address of the current owner.
*/
function owner() public view virtual returns (address) {
return _owner;
}
/**
* @dev Throws if called by any account other than the owner.
*/
modifier onlyOwner() {
require(owner() == _msgSender(), "Ownable: caller is not the owner");
_;
}
/**
* @dev Leaves the contract without owner. It will not be possible to call
* `onlyOwner` functions anymore. Can only be called by the current owner.
*
* NOTE: Renouncing ownership will leave the contract without an owner,
* thereby removing any functionality that is only available to the owner.
*/
function renounceOwnership() public virtual onlyOwner {
emit OwnershipTransferred(_owner, address(0));
_owner = address(0);
}
/**
* @dev Transfers ownership of the contract to a new account (`newOwner`).
* Can only be called by the current owner.
*/
function transferOwnership(address newOwner) public virtual onlyOwner {
require(newOwner != address(0), "Ownable: new owner is the zero address");
emit OwnershipTransferred(_owner, newOwner);
_owner = newOwner;
}
}
// File: @openzeppelin/contracts/utils/Pausable.sol
pragma solidity >=0.6.0 <0.8.0;
/**
* @dev Contract module which allows children to implement an emergency stop
* mechanism that can be triggered by an authorized account.
*
* This module is used through inheritance. It will make available the
* modifiers `whenNotPaused` and `whenPaused`, which can be applied to
* the functions of your contract. Note that they will not be pausable by
* simply including this module, only once the modifiers are put in place.
*/
abstract contract Pausable is Context {
/**
* @dev Emitted when the pause is triggered by `account`.
*/
event Paused(address account);
/**
* @dev Emitted when the pause is lifted by `account`.
*/
event Unpaused(address account);
bool private _paused;
/**
* @dev Initializes the contract in unpaused state.
*/
constructor () internal {
_paused = false;
}
/**
* @dev Returns true if the contract is paused, and false otherwise.
*/
function paused() public view virtual returns (bool) {
return _paused;
}
/**
* @dev Modifier to make a function callable only when the contract is not paused.
*
* Requirements:
*
* - The contract must not be paused.
*/
modifier whenNotPaused() {
require(!paused(), "Pausable: paused");
_;
}
/**
* @dev Modifier to make a function callable only when the contract is paused.
*
* Requirements:
*
* - The contract must be paused.
*/
modifier whenPaused() {
require(paused(), "Pausable: not paused");
_;
}
/**
* @dev Triggers stopped state.
*
* Requirements:
*
* - The contract must not be paused.
*/
function _pause() internal virtual whenNotPaused {
_paused = true;
emit Paused(_msgSender());
}
/**
* @dev Returns to normal state.
*
* Requirements:
*
* - The contract must be paused.
*/
function _unpause() internal virtual whenPaused {
_paused = false;
emit Unpaused(_msgSender());
}
}
// File: contracts/BIFI/strategies/Common/StratManager.sol
pragma solidity ^0.6.12;
contract StratManager is Ownable, Pausable {
/**
* @dev Beefy Contracts:
* {keeper} - Address to manage a few lower risk features of the strat
* {strategist} - Address of the strategy author/deployer where strategist fee will go.
* {vault} - Address of the vault that controls the strategy's funds.
* {unirouter} - Address of exchange to execute swaps.
*/
address public keeper;
address public strategist;
address public unirouter;
address public vault;
address public beefyFeeRecipient;
/**
* @dev Initializes the base strategy.
* @param _keeper address to use as alternative owner.
* @param _strategist address where strategist fees go.
* @param _unirouter router to use for swaps
* @param _vault address of parent vault.
* @param _beefyFeeRecipient address where to send Beefy's fees.
*/
constructor(
address _keeper,
address _strategist,
address _unirouter,
address _vault,
address _beefyFeeRecipient
) public {
keeper = _keeper;
strategist = _strategist;
unirouter = _unirouter;
vault = _vault;
beefyFeeRecipient = _beefyFeeRecipient;
}
// checks that caller is either owner or keeper.
modifier onlyManager() {
require(msg.sender == owner() || msg.sender == keeper, "!manager");
_;
}
/**
* @dev Updates address of the strat keeper.
* @param _keeper new keeper address.
*/
function setKeeper(address _keeper) external onlyManager {
keeper = _keeper;
}
/**
* @dev Updates address where strategist fee earnings will go.
* @param _strategist new strategist address.
*/
function setStrategist(address _strategist) external {
require(msg.sender == strategist, "!strategist");
strategist = _strategist;
}
/**
* @dev Updates router that will be used for swaps.
* @param _unirouter new unirouter address.
*/
function setUnirouter(address _unirouter) external onlyOwner {
unirouter = _unirouter;
}
/**
* @dev Updates parent vault.
* @param _vault new vault address.
*/
function setVault(address _vault) external onlyOwner {
vault = _vault;
}
/**
* @dev Updates beefy fee recipient.
* @param _beefyFeeRecipient new beefy fee recipient address.
*/
function setBeefyFeeRecipient(address _beefyFeeRecipient) external onlyOwner {
beefyFeeRecipient = _beefyFeeRecipient;
}
/**
* @dev Function to synchronize balances before new user deposit.
* Can be overridden in the strategy.
*/
function beforeDeposit() external virtual {}
}
// File: contracts/BIFI/strategies/Common/FeeManager.sol
pragma solidity ^0.6.12;
abstract contract FeeManager is StratManager {
uint constant public STRATEGIST_FEE = 112;
uint constant public MAX_FEE = 1000;
uint constant public MAX_CALL_FEE = 111;
uint constant public WITHDRAWAL_FEE_CAP = 50;
uint constant public WITHDRAWAL_MAX = 10000;
uint public withdrawalFee = 10;
uint public callFee = 111;
uint public beefyFee = MAX_FEE - STRATEGIST_FEE - callFee;
function setCallFee(uint256 _fee) public onlyManager {
require(_fee <= MAX_CALL_FEE, "!cap");
callFee = _fee;
beefyFee = MAX_FEE - STRATEGIST_FEE - callFee;
}
function setWithdrawalFee(uint256 _fee) public onlyManager {
require(_fee <= WITHDRAWAL_FEE_CAP, "!cap");
withdrawalFee = _fee;
}
}
// File: contracts/BIFI/strategies/Moonbeam/StrategyStellaMultiRewardsLP.sol
pragma solidity ^0.6.0;
contract StrategyStellaMultiRewardsLP is StratManager, FeeManager {
using SafeERC20 for IERC20;
using SafeMath for uint256;
// Tokens used
address public native;
address public output;
address public want;
address public lpToken0;
address public lpToken1;
// Third party contracts
address public chef;
uint256 public poolId;
bool public harvestOnDeposit;
uint256 public lastHarvest;
// Routes
address[] public outputToNativeRoute;
address[] public outputToLp0Route;
address[] public outputToLp1Route;
address[][] public rewardToOutputRoute;
event StratHarvest(address indexed harvester, uint256 wantHarvested, uint256 tvl);
event Deposit(uint256 tvl);
event Withdraw(uint256 tvl);
event ChargedFees(uint256 callFees, uint256 beefyFees, uint256 strategistFees);
constructor(
address _want,
uint256 _poolId,
address _chef,
address _vault,
address _unirouter,
address _keeper,
address _strategist,
address _beefyFeeRecipient,
address[] memory _outputToNativeRoute,
address[] memory _outputToLp0Route,
address[] memory _outputToLp1Route
) StratManager(_keeper, _strategist, _unirouter, _vault, _beefyFeeRecipient) public {
want = _want;
poolId = _poolId;
chef = _chef;
output = _outputToNativeRoute[0];
native = _outputToNativeRoute[_outputToNativeRoute.length - 1];
outputToNativeRoute = _outputToNativeRoute;
// setup lp routing
lpToken0 = IUniswapV2Pair(want).token0();
require(_outputToLp0Route[0] == output, "outputToLp0Route[0] != output");
require(_outputToLp0Route[_outputToLp0Route.length - 1] == lpToken0, "outputToLp0Route[last] != lpToken0");
outputToLp0Route = _outputToLp0Route;
lpToken1 = IUniswapV2Pair(want).token1();
require(_outputToLp1Route[0] == output, "outputToLp1Route[0] != output");
require(_outputToLp1Route[_outputToLp1Route.length - 1] == lpToken1, "outputToLp1Route[last] != lpToken1");
outputToLp1Route = _outputToLp1Route;
_giveAllowances();
}
// puts the funds to work
function deposit() public whenNotPaused {
uint256 wantBal = IERC20(want).balanceOf(address(this));
if (wantBal > 0) {
ISolarChef(chef).deposit(poolId, wantBal);
emit Deposit(balanceOf());
}
}
function withdraw(uint256 _amount) external {
require(msg.sender == vault, "!vault");
uint256 wantBal = IERC20(want).balanceOf(address(this));
if (wantBal < _amount) {
ISolarChef(chef).withdraw(poolId, _amount.sub(wantBal));
wantBal = IERC20(want).balanceOf(address(this));
}
if (wantBal > _amount) {
wantBal = _amount;
}
if (tx.origin != owner() && !paused()) {
uint256 withdrawalFeeAmount = wantBal.mul(withdrawalFee).div(WITHDRAWAL_MAX);
wantBal = wantBal.sub(withdrawalFeeAmount);
}
IERC20(want).safeTransfer(vault, wantBal);
emit Withdraw(balanceOf());
}
function beforeDeposit() external override {
if (harvestOnDeposit) {
require(msg.sender == vault, "!vault");
_harvest(tx.origin);
}
}
function harvest() external virtual {
_harvest(tx.origin);
}
function harvest(address callFeeRecipient) external virtual {
_harvest(callFeeRecipient);
}
function managerHarvest() external onlyManager {
_harvest(tx.origin);
}
// compounds earnings and charges performance fee
function _harvest(address callFeeRecipient) internal {
ISolarChef(chef).deposit(poolId, 0);
uint256 outputBal = IERC20(output).balanceOf(address(this));
if (outputBal > 0) {
chargeFees(callFeeRecipient);
addLiquidity();
uint256 wantHarvested = balanceOfWant();
deposit();
lastHarvest = block.timestamp;
emit StratHarvest(msg.sender, wantHarvested, balanceOf());
}
}
// performance fees
function chargeFees(address callFeeRecipient) internal {
if (rewardToOutputRoute.length != 0) {
for (uint i; i < rewardToOutputRoute.length; i++) {
if (rewardToOutputRoute[i][0] == native) {
uint256 nativeBal = address(this).balance;
if (nativeBal > 0) {
IWrappedNative(native).deposit{value: nativeBal}();
}
}
uint256 rewardBal = IERC20(rewardToOutputRoute[i][0]).balanceOf(address(this));
if (rewardBal > 0) {
IUniswapRouterETH(unirouter).swapExactTokensForTokens(rewardBal, 0, rewardToOutputRoute[i], address(this), now);
}
}
}
uint256 toNative = IERC20(output).balanceOf(address(this)).mul(45).div(1000);
IUniswapRouterETH(unirouter).swapExactTokensForTokens(toNative, 0, outputToNativeRoute, address(this), now);
uint256 nativeBal = IERC20(native).balanceOf(address(this));
uint256 callFeeAmount = nativeBal.mul(callFee).div(MAX_FEE);
IERC20(native).safeTransfer(callFeeRecipient, callFeeAmount);
uint256 beefyFeeAmount = nativeBal.mul(beefyFee).div(MAX_FEE);
IERC20(native).safeTransfer(beefyFeeRecipient, beefyFeeAmount);
uint256 strategistFeeAmount = nativeBal.mul(STRATEGIST_FEE).div(MAX_FEE);
IERC20(native).safeTransfer(strategist, strategistFeeAmount);
emit ChargedFees(callFeeAmount, beefyFeeAmount, strategistFeeAmount);
}
// Adds liquidity to AMM and gets more LP tokens.
function addLiquidity() internal {
uint256 outputHalf = IERC20(output).balanceOf(address(this)).div(2);
if (lpToken0 != output) {
IUniswapRouterETH(unirouter).swapExactTokensForTokens(outputHalf, 0, outputToLp0Route, address(this), now);
}
if (lpToken1 != output) {
IUniswapRouterETH(unirouter).swapExactTokensForTokens(outputHalf, 0, outputToLp1Route, address(this), now);
}
uint256 lp0Bal = IERC20(lpToken0).balanceOf(address(this));
uint256 lp1Bal = IERC20(lpToken1).balanceOf(address(this));
IUniswapRouterETH(unirouter).addLiquidity(lpToken0, lpToken1, lp0Bal, lp1Bal, 1, 1, address(this), now);
}
// calculate the total underlaying 'want' held by the strat.
function balanceOf() public view returns (uint256) {
return balanceOfWant().add(balanceOfPool());
}
// it calculates how much 'want' this contract holds.
function balanceOfWant() public view returns (uint256) {
return IERC20(want).balanceOf(address(this));
}
// it calculates how much 'want' the strategy has working in the farm.
function balanceOfPool() public view returns (uint256) {
(uint256 _amount,,,) = ISolarChef(chef).userInfo(poolId, address(this));
return _amount;
}
function rewardsAvailable() public view returns (address[] memory, uint256[] memory) {
(address[] memory addresses,,,uint256[] memory amounts) = ISolarChef(chef).pendingTokens(poolId, address(this));
return (addresses, amounts);
}
function callReward() public view returns (uint256) {
(address[] memory rewardAdd, uint256[] memory rewardBal) = rewardsAvailable();
uint256 nativeBal;
try IUniswapRouterETH(unirouter).getAmountsOut(rewardBal[0], outputToNativeRoute)
returns (uint256[] memory amountOut) {
nativeBal = amountOut[amountOut.length - 1];
} catch {}
if (rewardToOutputRoute.length != 0) {
for (uint i; i < rewardToOutputRoute.length; i++) {
for (uint j = 1; j < rewardAdd.length; j++) {
if (rewardAdd[j] == rewardToOutputRoute[i][0]) {
try IUniswapRouterETH(unirouter).getAmountsOut(rewardBal[j], rewardToOutputRoute[i])
returns (uint256[] memory initialAmountOut) {
uint256 outputBal = initialAmountOut[initialAmountOut.length - 1];
try IUniswapRouterETH(unirouter).getAmountsOut(outputBal, outputToNativeRoute)
returns (uint256[] memory finalAmountOut) {
nativeBal = nativeBal.add(finalAmountOut[finalAmountOut.length - 1]);
} catch {}
} catch {}
}
}
}
}
return nativeBal.mul(45).div(1000).mul(callFee).div(MAX_FEE);
}
function setHarvestOnDeposit(bool _harvestOnDeposit) external onlyManager {
harvestOnDeposit = _harvestOnDeposit;
if (harvestOnDeposit) {
setWithdrawalFee(0);
} else {
setWithdrawalFee(10);
}
}
// called as part of strat migration. Sends all the available funds back to the vault.
function retireStrat() external {
require(msg.sender == vault, "!vault");
ISolarChef(chef).emergencyWithdraw(poolId);
uint256 wantBal = IERC20(want).balanceOf(address(this));
IERC20(want).transfer(vault, wantBal);
}
// pauses deposits and withdraws all funds from third party systems.
function panic() public onlyManager {
pause();
ISolarChef(chef).emergencyWithdraw(poolId);
}
function pause() public onlyManager {
_pause();
_removeAllowances();
}
function unpause() external onlyManager {
_unpause();
_giveAllowances();
deposit();
}
function _giveAllowances() internal {
IERC20(want).safeApprove(chef, uint256(-1));
IERC20(output).safeApprove(unirouter, uint256(-1));
IERC20(lpToken0).safeApprove(unirouter, 0);
IERC20(lpToken0).safeApprove(unirouter, uint256(-1));
IERC20(lpToken1).safeApprove(unirouter, 0);
IERC20(lpToken1).safeApprove(unirouter, uint256(-1));
if (rewardToOutputRoute.length != 0) {
for (uint i; i < rewardToOutputRoute.length; i++) {
IERC20(rewardToOutputRoute[i][0]).safeApprove(unirouter, 0);
IERC20(rewardToOutputRoute[i][0]).safeApprove(unirouter, uint256(-1));
}
}
}
function _removeAllowances() internal {
IERC20(want).safeApprove(chef, 0);
IERC20(output).safeApprove(unirouter, 0);
IERC20(lpToken0).safeApprove(unirouter, 0);
IERC20(lpToken1).safeApprove(unirouter, 0);
if (rewardToOutputRoute.length != 0) {
for (uint i; i < rewardToOutputRoute.length; i++) {
IERC20(rewardToOutputRoute[i][0]).safeApprove(unirouter, 0);
}
}
}
function addRewardRoute(address[] memory _rewardToOutputRoute) external onlyOwner {
IERC20(_rewardToOutputRoute[0]).safeApprove(unirouter, 0);
IERC20(_rewardToOutputRoute[0]).safeApprove(unirouter, uint256(-1));
rewardToOutputRoute.push(_rewardToOutputRoute);
}
function removeLastRewardRoute() external onlyManager {
address reward = rewardToOutputRoute[rewardToOutputRoute.length - 1][0];
if (reward != lpToken0 && reward != lpToken1) {
IERC20(reward).safeApprove(unirouter, 0);
}
rewardToOutputRoute.pop();
}
function outputToNative() external view returns (address[] memory) {
return outputToNativeRoute;
}
function outputToLp0() external view returns (address[] memory) {
return outputToLp0Route;
}
function outputToLp1() external view returns (address[] memory) {
return outputToLp1Route;
}
function rewardToOutput() external view returns (address[][] memory) {
return rewardToOutputRoute;
}
receive () external payable {}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"address","name":"_want","type":"address"},{"internalType":"uint256","name":"_poolId","type":"uint256"},{"internalType":"address","name":"_chef","type":"address"},{"internalType":"address","name":"_vault","type":"address"},{"internalType":"address","name":"_unirouter","type":"address"},{"internalType":"address","name":"_keeper","type":"address"},{"internalType":"address","name":"_strategist","type":"address"},{"internalType":"address","name":"_beefyFeeRecipient","type":"address"},{"internalType":"address[]","name":"_outputToNativeRoute","type":"address[]"},{"internalType":"address[]","name":"_outputToLp0Route","type":"address[]"},{"internalType":"address[]","name":"_outputToLp1Route","type":"address[]"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"callFees","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"beefyFees","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"strategistFees","type":"uint256"}],"name":"ChargedFees","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tvl","type":"uint256"}],"name":"Deposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"harvester","type":"address"},{"indexed":false,"internalType":"uint256","name":"wantHarvested","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"tvl","type":"uint256"}],"name":"StratHarvest","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tvl","type":"uint256"}],"name":"Withdraw","type":"event"},{"inputs":[],"name":"MAX_CALL_FEE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_FEE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"STRATEGIST_FEE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"WITHDRAWAL_FEE_CAP","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"WITHDRAWAL_MAX","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"_rewardToOutputRoute","type":"address[]"}],"name":"addRewardRoute","outputs":[],"stateMutability":"nonpayable","type":"function"},{"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":"beefyFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"beefyFeeRecipient","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"beforeDeposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"callFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"callReward","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"chef","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"deposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"callFeeRecipient","type":"address"}],"name":"harvest","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"harvest","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"harvestOnDeposit","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"keeper","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastHarvest","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lpToken0","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lpToken1","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"managerHarvest","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"native","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"output","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"outputToLp0","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"outputToLp0Route","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"outputToLp1","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"outputToLp1Route","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"outputToNative","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"outputToNativeRoute","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"panic","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"poolId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"removeLastRewardRoute","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"retireStrat","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"rewardToOutput","outputs":[{"internalType":"address[][]","name":"","type":"address[][]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"rewardToOutputRoute","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rewardsAvailable","outputs":[{"internalType":"address[]","name":"","type":"address[]"},{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_beefyFeeRecipient","type":"address"}],"name":"setBeefyFeeRecipient","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_fee","type":"uint256"}],"name":"setCallFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_harvestOnDeposit","type":"bool"}],"name":"setHarvestOnDeposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_keeper","type":"address"}],"name":"setKeeper","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_strategist","type":"address"}],"name":"setStrategist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_unirouter","type":"address"}],"name":"setUnirouter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_vault","type":"address"}],"name":"setVault","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_fee","type":"uint256"}],"name":"setWithdrawalFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"strategist","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unirouter","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"vault","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"want","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawalFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]Contract Creation Code
6080604052600a600655606f6007556103096008553480156200002157600080fd5b5060405162004a6e38038062004a6e833981016040819052620000449162000a80565b8585888a8760006200005562000482565b600080546001600160a01b0319166001600160a01b0383169081178255604051929350917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a3506000805460ff60a01b19168155600180546001600160a01b03199081166001600160a01b0398891617909155600280548216968816969096179095556003805486169487169490941790935560048054851692861692909217909155600580548416918516919091179055600b805483168f8516179055600f8d9055600e8054909216928c1692909217905583518491906200013757fe5b6020026020010151600a60006101000a8154816001600160a01b0302191690836001600160a01b03160217905550826001845103815181106200017657fe5b602090810291909101810151600980546001600160a01b0319166001600160a01b039092169190911790558351620001b5916012919086019062000917565b50600b60009054906101000a90046001600160a01b03166001600160a01b0316630dfe16816040518163ffffffff1660e01b815260040160206040518083038186803b1580156200020557600080fd5b505afa1580156200021a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000240919062000a62565b600c80546001600160a01b0319166001600160a01b03928316179055600a54835191169083906000906200027057fe5b60200260200101516001600160a01b031614620002aa5760405162461bcd60e51b8152600401620002a19062000d75565b60405180910390fd5b600c5482516001600160a01b039091169083906000198101908110620002cc57fe5b60200260200101516001600160a01b031614620002fd5760405162461bcd60e51b8152600401620002a19062000cfc565b81516200031290601390602085019062000917565b50600b60009054906101000a90046001600160a01b03166001600160a01b031663d21220a76040518163ffffffff1660e01b815260040160206040518083038186803b1580156200036257600080fd5b505afa15801562000377573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200039d919062000a62565b600d80546001600160a01b0319166001600160a01b03928316179055600a5482519116908290600090620003cd57fe5b60200260200101516001600160a01b031614620003fe5760405162461bcd60e51b8152600401620002a19062000d3e565b600d5481516001600160a01b0390911690829060001981019081106200042057fe5b60200260200101516001600160a01b031614620004515760405162461bcd60e51b8152600401620002a19062000c74565b80516200046690601490602084019062000917565b506200047162000486565b505050505050505050505062000ebd565b3390565b600e54600b54620004b3916001600160a01b0391821691166000196200063e602090811b62001fcc17901c565b600354600a54620004e0916001600160a01b0391821691166000196200063e602090811b62001fcc17901c565b600354600c546200050c916001600160a01b03918216911660006200063e602090811b62001fcc17901c565b600354600c5462000539916001600160a01b0391821691166000196200063e602090811b62001fcc17901c565b600354600d5462000565916001600160a01b03918216911660006200063e602090811b62001fcc17901c565b600354600d5462000592916001600160a01b0391821691166000196200063e602090811b62001fcc17901c565b601554156200063c5760005b6015548110156200063a57600354601580546200060c926001600160a01b03169160009185908110620005cd57fe5b90600052602060002001600081548110620005e457fe5b600091825260209182902001546001600160a01b031692919062001fcc6200063e821b17901c565b6003546015805462000631926001600160a01b0316916000199185908110620005cd57fe5b6001016200059e565b505b565b801580620006cd5750604051636eb1769f60e11b81526001600160a01b0384169063dd62ed3e9062000677903090869060040162000c0c565b60206040518083038186803b1580156200069057600080fd5b505afa158015620006a5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620006cb919062000bd5565b155b620006ec5760405162461bcd60e51b8152600401620002a19062000e2d565b620007478363095ea7b360e01b84846040516024016200070e92919062000c26565b60408051808303601f190181529190526020810180516001600160e01b0319939093166001600160e01b03938416179052906200074c16565b505050565b6060620007a8826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316620007e860201b620020cb179092919060201c565b805190915015620007475780806020019051810190620007c9919062000bb3565b620007475760405162461bcd60e51b8152600401620002a19062000de3565b6060620007f9848460008562000803565b90505b9392505050565b606082471015620008285760405162461bcd60e51b8152600401620002a19062000cb6565b6200083385620008d3565b620008525760405162461bcd60e51b8152600401620002a19062000dac565b60006060866001600160a01b0316858760405162000871919062000bee565b60006040518083038185875af1925050503d8060008114620008b0576040519150601f19603f3d011682016040523d82523d6000602084013e620008b5565b606091505b509092509050620008c8828286620008d9565b979650505050505050565b3b151590565b60608315620008ea575081620007fc565b825115620008fb5782518084602001fd5b8160405162461bcd60e51b8152600401620002a1919062000c3f565b8280548282559060005260206000209081019282156200096f579160200282015b828111156200096f57825182546001600160a01b0319166001600160a01b0390911617825560209092019160019091019062000938565b506200097d92915062000981565b5090565b5b808211156200097d5780546001600160a01b031916815560010162000982565b80516001600160a01b0381168114620009ba57600080fd5b92915050565b600082601f830112620009d1578081fd5b81516001600160401b0380821115620009e8578283fd5b60208083026040518282820101818110858211171562000a06578687fd5b60405284815294508185019250858201818701830188101562000a2857600080fd5b600091505b8482101562000a575762000a428882620009a2565b84529282019260019190910190820162000a2d565b505050505092915050565b60006020828403121562000a74578081fd5b620007fc8383620009a2565b60008060008060008060008060008060006101608c8e03121562000aa2578687fd5b62000aae8d8d620009a2565b9a5060208c0151995062000ac68d60408e01620009a2565b985062000ad78d60608e01620009a2565b975062000ae88d60808e01620009a2565b965062000af98d60a08e01620009a2565b955062000b0a8d60c08e01620009a2565b945062000b1b8d60e08e01620009a2565b6101008d01519094506001600160401b0381111562000b38578384fd5b62000b468e828f01620009c0565b6101208e015190945090506001600160401b0381111562000b65578283fd5b62000b738e828f01620009c0565b6101408e015190935090506001600160401b0381111562000b92578182fd5b62000ba08e828f01620009c0565b9150509295989b509295989b9093969950565b60006020828403121562000bc5578081fd5b81518015158114620007fc578182fd5b60006020828403121562000be7578081fd5b5051919050565b6000825162000c0281846020870162000e8a565b9190910192915050565b6001600160a01b0392831681529116602082015260400190565b6001600160a01b03929092168252602082015260400190565b600060208252825180602084015262000c6081604085016020870162000e8a565b601f01601f19169190910160400192915050565b60208082526022908201527f6f7574707574546f4c7031526f7574655b6c6173745d20213d206c70546f6b656040820152616e3160f01b606082015260800190565b60208082526026908201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6040820152651c8818d85b1b60d21b606082015260800190565b60208082526022908201527f6f7574707574546f4c7030526f7574655b6c6173745d20213d206c70546f6b6560408201526106e360f41b606082015260800190565b6020808252601d908201527f6f7574707574546f4c7031526f7574655b305d20213d206f7574707574000000604082015260600190565b6020808252601d908201527f6f7574707574546f4c7030526f7574655b305d20213d206f7574707574000000604082015260600190565b6020808252601d908201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604082015260600190565b6020808252602a908201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6040820152691bdd081cdd58d8d9595960b21b606082015260800190565b60208082526036908201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60408201527f20746f206e6f6e2d7a65726f20616c6c6f77616e636500000000000000000000606082015260800190565b60005b8381101562000ea757818101518382015260200162000e8d565b8381111562000eb7576000848401525b50505050565b613ba18062000ecd6000396000f3fe6080604052600436106103905760003560e01c80638912cb8b116101dc578063c7b9d53011610102578063e7a7250a116100a0578063fa5c9edd1161006f578063fa5c9edd14610911578063fb61778714610933578063fbfa77cf14610948578063fd63a8871461095d57610397565b8063e7a7250a146108a4578063f1a392da146108c7578063f20eaeb8146108dc578063f2fde38b146108f157610397565b8063d3102589116100dc578063d310258914610845578063d801d9461461085a578063d92f3d731461086f578063dfbdc4371461088f57610397565b8063c7b9d530146107f0578063cc28948014610810578063d0e30db01461083057610397565b8063989ef4e31161017a578063aced166111610149578063aced166114610791578063bc063e1a146107a6578063be12a978146107bb578063c1a3d44c146107db57610397565b8063989ef4e314610727578063a39219f91461073c578063a68833e514610751578063ac1e50251461077157610397565b80638e145459116101b65780638e145459146106c857806390321e1a146106dd57806396813fca146106f257806397fd323d1461071257610397565b80638912cb8b146106895780638bc7e8c41461069e5780638da5cb5b146106b357610397565b80633e0dc34e116102c15780635ee167c01161025f578063748747e61161022e578063748747e61461062a5780637d38ca651461064a5780638456cb591461065f578063877562b61461067457610397565b80635ee167c0146105cb5780636817031b146105e0578063715018a614610600578063722713f71461061557610397565b80634700d3051161029b5780634700d3051461056a57806354518b1a1461057f578063573fef0a146105945780635c975abb146105a957610397565b80633e0dc34e1461052b5780633f4ba83a146105405780634641257d1461055557610397565b80631fc8bc5d1161032e578063264658261161030857806326465826146104b65780632ad5a53f146104d65780632e1a7d4d146104eb57806336c6cf211461050b57610397565b80631fc8bc5d146104775780631fe4a6861461048c578063257ae0de146104a157610397565b8063115880861161036a578063115880861461040957806311b0b42d1461042b57806313e120b11461044d5780631f1fcd511461046257610397565b80630587f7851461039c5780630e5c011e146103c75780630e8fbb5a146103e957610397565b3661039757005b600080fd5b3480156103a857600080fd5b506103b161097d565b6040516103be91906135b6565b60405180910390f35b3480156103d357600080fd5b506103e76103e23660046131a8565b6109df565b005b3480156103f557600080fd5b506103e76104043660046133a1565b6109eb565b34801561041557600080fd5b5061041e610a72565b6040516103be9190613a18565b34801561043757600080fd5b50610440610b04565b6040516103be9190613526565b34801561045957600080fd5b506103b1610b13565b34801561046e57600080fd5b50610440610b73565b34801561048357600080fd5b50610440610b82565b34801561049857600080fd5b50610440610b91565b3480156104ad57600080fd5b50610440610ba0565b3480156104c257600080fd5b506103e76104d13660046133d9565b610baf565b3480156104e257600080fd5b5061041e610c2b565b3480156104f757600080fd5b506103e76105063660046133d9565b610c30565b34801561051757600080fd5b506104406105263660046133d9565b610ea9565b34801561053757600080fd5b5061041e610ed0565b34801561054c57600080fd5b506103e7610ed6565b34801561056157600080fd5b506103e7610f3d565b34801561057657600080fd5b506103e7610f46565b34801561058b57600080fd5b5061041e611000565b3480156105a057600080fd5b506103e7611006565b3480156105b557600080fd5b506105be61103b565b6040516103be919061367f565b3480156105d757600080fd5b5061044061104b565b3480156105ec57600080fd5b506103e76105fb3660046131a8565b61105a565b34801561060c57600080fd5b506103e76110bb565b34801561062157600080fd5b5061041e611144565b34801561063657600080fd5b506103e76106453660046131a8565b611164565b34801561065657600080fd5b5061041e6111d3565b34801561066b57600080fd5b506103e76111d8565b34801561068057600080fd5b50610440611235565b34801561069557600080fd5b506105be611244565b3480156106aa57600080fd5b5061041e61124d565b3480156106bf57600080fd5b50610440611253565b3480156106d457600080fd5b50610440611262565b3480156106e957600080fd5b5061041e611271565b3480156106fe57600080fd5b5061044061070d366004613409565b611277565b34801561071e57600080fd5b5061041e6112b5565b34801561073357600080fd5b506103b16115e7565b34801561074857600080fd5b506103e7611647565b34801561075d57600080fd5b506103e761076c3660046131a8565b611746565b34801561077d57600080fd5b506103e761078c3660046133d9565b6117a7565b34801561079d57600080fd5b5061044061181a565b3480156107b257600080fd5b5061041e611829565b3480156107c757600080fd5b506104406107d63660046133d9565b61182f565b3480156107e757600080fd5b5061041e61183c565b3480156107fc57600080fd5b506103e761080b3660046131a8565b6118bd565b34801561081c57600080fd5b506103e761082b3660046131c4565b611909565b34801561083c57600080fd5b506103e76119f1565b34801561085157600080fd5b5061041e611b45565b34801561086657600080fd5b506103e7611b4b565b34801561087b57600080fd5b506103e761088a3660046131a8565b611b98565b34801561089b57600080fd5b5061041e611bf9565b3480156108b057600080fd5b506108b9611bfe565b6040516103be9291906135c9565b3480156108d357600080fd5b5061041e611c9e565b3480156108e857600080fd5b50610440611ca4565b3480156108fd57600080fd5b506103e761090c3660046131a8565b611cb3565b34801561091d57600080fd5b50610926611d73565b6040516103be919061361f565b34801561093f57600080fd5b506103e7611e16565b34801561095457600080fd5b50610440611fb0565b34801561096957600080fd5b506104406109783660046133d9565b611fbf565b606060148054806020026020016040519081016040528092919081815260200182805480156109d557602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116109b7575b5050505050905090565b6109e8816120e4565b50565b6109f3611253565b6001600160a01b0316336001600160a01b03161480610a1c57506001546001600160a01b031633145b610a415760405162461bcd60e51b8152600401610a3890613956565b60405180910390fd5b6010805460ff1916821515179081905560ff1615610a6857610a6360006117a7565b6109e8565b6109e8600a6117a7565b600e54600f546040516393f1a40b60e01b815260009283926001600160a01b03909116916393f1a40b91610aaa913090600401613a21565b60806040518083038186803b158015610ac257600080fd5b505afa158015610ad6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610afa9190613457565b5091935050505090565b6009546001600160a01b031681565b606060128054806020026020016040519081016040528092919081815260200182805480156109d5576020028201919060005260206000209081546001600160a01b031681526001909101906020018083116109b7575050505050905090565b600b546001600160a01b031681565b600e546001600160a01b031681565b6002546001600160a01b031681565b6003546001600160a01b031681565b610bb7611253565b6001600160a01b0316336001600160a01b03161480610be057506001546001600160a01b031633145b610bfc5760405162461bcd60e51b8152600401610a3890613956565b606f811115610c1d5760405162461bcd60e51b8152600401610a389061386b565b600781905561037803600855565b606f81565b6004546001600160a01b03163314610c5a5760405162461bcd60e51b8152600401610a38906138ca565b600b546040516370a0823160e01b81526000916001600160a01b0316906370a0823190610c8b903090600401613526565b60206040518083038186803b158015610ca357600080fd5b505afa158015610cb7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cdb91906133f1565b905081811015610dd957600e54600f546001600160a01b039091169063441a3e7090610d078585612244565b6040518363ffffffff1660e01b8152600401610d24929190613a51565b600060405180830381600087803b158015610d3e57600080fd5b505af1158015610d52573d6000803e3d6000fd5b5050600b546040516370a0823160e01b81526001600160a01b0390911692506370a082319150610d86903090600401613526565b60206040518083038186803b158015610d9e57600080fd5b505afa158015610db2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610dd691906133f1565b90505b81811115610de45750805b610dec611253565b6001600160a01b0316326001600160a01b031614158015610e125750610e1061103b565b155b15610e4a576000610e3a612710610e346006548561227190919063ffffffff16565b906122ab565b9050610e468282612244565b9150505b600454600b54610e67916001600160a01b039182169116836122dd565b7f5b6b431d4476a211bb7d41c20d1aab9ae2321deee0d20be3d9fc9b1093fa6e3d610e90611144565b604051610e9d9190613a18565b60405180910390a15050565b60138181548110610eb657fe5b6000918252602090912001546001600160a01b0316905081565b600f5481565b610ede611253565b6001600160a01b0316336001600160a01b03161480610f0757506001546001600160a01b031633145b610f235760405162461bcd60e51b8152600401610a3890613956565b610f2b6122fc565b610f3361236d565b610f3b6119f1565b565b610f3b326120e4565b610f4e611253565b6001600160a01b0316336001600160a01b03161480610f7757506001546001600160a01b031633145b610f935760405162461bcd60e51b8152600401610a3890613956565b610f9b6111d8565b600e54600f54604051632989754760e11b81526001600160a01b0390921691635312ea8e91610fcc91600401613a18565b600060405180830381600087803b158015610fe657600080fd5b505af1158015610ffa573d6000803e3d6000fd5b50505050565b61271081565b60105460ff1615610f3b576004546001600160a01b03163314610f3d5760405162461bcd60e51b8152600401610a38906138ca565b600054600160a01b900460ff1690565b600c546001600160a01b031681565b6110626124b9565b6001600160a01b0316611073611253565b6001600160a01b0316146110995760405162461bcd60e51b8152600401610a38906138ea565b600480546001600160a01b0319166001600160a01b0392909216919091179055565b6110c36124b9565b6001600160a01b03166110d4611253565b6001600160a01b0316146110fa5760405162461bcd60e51b8152600401610a38906138ea565b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b600061115f611151610a72565b61115961183c565b906124bd565b905090565b61116c611253565b6001600160a01b0316336001600160a01b0316148061119557506001546001600160a01b031633145b6111b15760405162461bcd60e51b8152600401610a3890613956565b600180546001600160a01b0319166001600160a01b0392909216919091179055565b607081565b6111e0611253565b6001600160a01b0316336001600160a01b0316148061120957506001546001600160a01b031633145b6112255760405162461bcd60e51b8152600401610a3890613956565b61122d6124e2565b610f3b612543565b600d546001600160a01b031681565b60105460ff1681565b60065481565b6000546001600160a01b031690565b6005546001600160a01b031681565b60075481565b6015828154811061128457fe5b90600052602060002001818154811061129957fe5b6000918252602090912001546001600160a01b03169150829050565b60006060806112c2611bfe565b915091506000600360009054906101000a90046001600160a01b03166001600160a01b031663d06ca61f836000815181106112f957fe5b602002602001015160126040518363ffffffff1660e01b8152600401611320929190613a38565b60006040518083038186803b15801561133857600080fd5b505afa92505050801561136d57506040513d6000823e601f3d908101601f1916820160405261136a9190810190613366565b60015b61137657611392565b8060018251038151811061138657fe5b60200260200101519150505b601554156115b35760005b6015548110156115b15760015b84518110156115a857601582815481106113c057fe5b906000526020600020016000815481106113d657fe5b60009182526020909120015485516001600160a01b03909116908690839081106113fc57fe5b60200260200101516001600160a01b031614156115a05760035484516001600160a01b039091169063d06ca61f9086908490811061143657fe5b60200260200101516015858154811061144b57fe5b906000526020600020016040518363ffffffff1660e01b8152600401611472929190613a38565b60006040518083038186803b15801561148a57600080fd5b505afa9250505080156114bf57506040513d6000823e601f3d908101601f191682016040526114bc9190810190613366565b60015b6114c8576115a0565b6000816001835103815181106114da57fe5b602090810291909101015160035460405163d06ca61f60e01b81529192506001600160a01b03169063d06ca61f90611519908490601290600401613a38565b60006040518083038186803b15801561153157600080fd5b505afa92505050801561156657506040513d6000823e601f3d908101601f191682016040526115639190810190613366565b60015b61156f5761159d565b6115998160018351038151811061158257fe5b6020026020010151876124bd90919063ffffffff16565b9550505b50505b6001016113aa565b5060010161139d565b505b6115df6103e8610e346007546115d96103e8610e34602d8861227190919063ffffffff16565b90612271565b935050505090565b606060138054806020026020016040519081016040528092919081815260200182805480156109d5576020028201919060005260206000209081546001600160a01b031681526001909101906020018083116109b7575050505050905090565b61164f611253565b6001600160a01b0316336001600160a01b0316148061167857506001546001600160a01b031633145b6116945760405162461bcd60e51b8152600401610a3890613956565b601580546000919060001981019081106116aa57fe5b906000526020600020016000815481106116c057fe5b600091825260209091200154600c546001600160a01b0391821692501681148015906116fa5750600d546001600160a01b03828116911614155b1561171a5760035461171a906001600160a01b0383811691166000611fcc565b601580548061172557fe5b6001900381819060005260206000200160006117419190612fe4565b905550565b61174e6124b9565b6001600160a01b031661175f611253565b6001600160a01b0316146117855760405162461bcd60e51b8152600401610a38906138ea565b600580546001600160a01b0319166001600160a01b0392909216919091179055565b6117af611253565b6001600160a01b0316336001600160a01b031614806117d857506001546001600160a01b031633145b6117f45760405162461bcd60e51b8152600401610a3890613956565b60328111156118155760405162461bcd60e51b8152600401610a389061386b565b600655565b6001546001600160a01b031681565b6103e881565b60128181548110610eb657fe5b600b546040516370a0823160e01b81526000916001600160a01b0316906370a082319061186d903090600401613526565b60206040518083038186803b15801561188557600080fd5b505afa158015611899573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061115f91906133f1565b6002546001600160a01b031633146118e75760405162461bcd60e51b8152600401610a38906136eb565b600280546001600160a01b0319166001600160a01b0392909216919091179055565b6119116124b9565b6001600160a01b0316611922611253565b6001600160a01b0316146119485760405162461bcd60e51b8152600401610a38906138ea565b6003548151611988916001600160a01b0316906000908490829061196857fe5b60200260200101516001600160a01b0316611fcc9092919063ffffffff16565b60035481516119aa916001600160a01b03169060001990849060009061196857fe5b6015805460018101825560009190915281516119ed917f55f448fdea98c4d29eb340757ef0a66cd03dbb9538908a6a81d96026b71ec47501906020840190613002565b5050565b6119f961103b565b15611a165760405162461bcd60e51b8152600401610a3890613841565b600b546040516370a0823160e01b81526000916001600160a01b0316906370a0823190611a47903090600401613526565b60206040518083038186803b158015611a5f57600080fd5b505afa158015611a73573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a9791906133f1565b905080156109e857600e54600f54604051631c57762b60e31b81526001600160a01b039092169163e2bbb15891611ad2918590600401613a51565b600060405180830381600087803b158015611aec57600080fd5b505af1158015611b00573d6000803e3d6000fd5b505050507f4d6ce1e535dbade1c23defba91e23b8f791ce5edc0cc320257a2b364e4e38426611b2d611144565b604051611b3a9190613a18565b60405180910390a150565b60085481565b611b53611253565b6001600160a01b0316336001600160a01b03161480611b7c57506001546001600160a01b031633145b610f3d5760405162461bcd60e51b8152600401610a3890613956565b611ba06124b9565b6001600160a01b0316611bb1611253565b6001600160a01b031614611bd75760405162461bcd60e51b8152600401610a38906138ea565b600380546001600160a01b0319166001600160a01b0392909216919091179055565b603281565b600e54600f5460405160016232bd9d60e01b031981526060928392839283926001600160a01b03169163ffcd426391611c3c91903090600401613a21565b60006040518083038186803b158015611c5457600080fd5b505afa158015611c68573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611c90919081019061325c565b929650919450505050509091565b60115481565b600a546001600160a01b031681565b611cbb6124b9565b6001600160a01b0316611ccc611253565b6001600160a01b031614611cf25760405162461bcd60e51b8152600401610a38906138ea565b6001600160a01b038116611d185760405162461bcd60e51b8152600401610a3890613710565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b60606015805480602002602001604051908101604052809291908181526020016000905b82821015611e0d57600084815260209081902083018054604080518285028101850190915281815292830182828015611df957602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311611ddb575b505050505081526020019060010190611d97565b50505050905090565b6004546001600160a01b03163314611e405760405162461bcd60e51b8152600401610a38906138ca565b600e54600f54604051632989754760e11b81526001600160a01b0390921691635312ea8e91611e7191600401613a18565b600060405180830381600087803b158015611e8b57600080fd5b505af1158015611e9f573d6000803e3d6000fd5b5050600b546040516370a0823160e01b8152600093506001600160a01b0390911691506370a0823190611ed6903090600401613526565b60206040518083038186803b158015611eee57600080fd5b505afa158015611f02573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f2691906133f1565b600b546004805460405163a9059cbb60e01b81529394506001600160a01b039283169363a9059cbb93611f5e9392169186910161359d565b602060405180830381600087803b158015611f7857600080fd5b505af1158015611f8c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119ed91906133bd565b6004546001600160a01b031681565b60148181548110610eb657fe5b8015806120545750604051636eb1769f60e11b81526001600160a01b0384169063dd62ed3e90612002903090869060040161353a565b60206040518083038186803b15801561201a57600080fd5b505afa15801561202e573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061205291906133f1565b155b6120705760405162461bcd60e51b8152600401610a38906139c2565b6120c68363095ea7b360e01b848460405160240161208f92919061359d565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b0319909316929092179091526125fa565b505050565b60606120da8484600085612689565b90505b9392505050565b600e54600f54604051631c57762b60e31b81526001600160a01b039092169163e2bbb1589161211891600090600401613a51565b600060405180830381600087803b15801561213257600080fd5b505af1158015612146573d6000803e3d6000fd5b5050600a546040516370a0823160e01b8152600093506001600160a01b0390911691506370a082319061217d903090600401613526565b60206040518083038186803b15801561219557600080fd5b505afa1580156121a9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121cd91906133f1565b905080156119ed576121de8261274a565b6121e6612c1d565b60006121f061183c565b90506121fa6119f1565b42601155337f9bc239f1724cacfb88cb1d66a2dc437467699b68a8c90d7b63110cf4b6f9241082612229611144565b604051612237929190613a51565b60405180910390a2505050565b6000828211156122665760405162461bcd60e51b8152600401610a389061378d565b508082035b92915050565b6000826122805750600061226b565b8282028284828161228d57fe5b04146120dd5760405162461bcd60e51b8152600401610a3890613889565b60008082116122cc5760405162461bcd60e51b8152600401610a389061380a565b8183816122d557fe5b049392505050565b6120c68363a9059cbb60e01b848460405160240161208f92919061359d565b61230461103b565b6123205760405162461bcd60e51b8152600401610a38906136bd565b6000805460ff60a01b191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa6123566124b9565b6040516123639190613526565b60405180910390a1565b600e54600b5461238c916001600160a01b039182169116600019611fcc565b600354600a546123ab916001600160a01b039182169116600019611fcc565b600354600c546123c9916001600160a01b0391821691166000611fcc565b600354600c546123e8916001600160a01b039182169116600019611fcc565b600354600d54612406916001600160a01b0391821691166000611fcc565b600354600d54612425916001600160a01b039182169116600019611fcc565b60155415610f3b5760005b6015548110156109e8576003546015805461248e926001600160a01b0316916000918590811061245c57fe5b9060005260206000200160008154811061247257fe5b6000918252602090912001546001600160a01b03169190611fcc565b600354601580546124b1926001600160a01b031691600019918590811061245c57fe5b600101612430565b3390565b6000828201838110156120dd5760405162461bcd60e51b8152600401610a3890613756565b6124ea61103b565b156125075760405162461bcd60e51b8152600401610a3890613841565b6000805460ff60a01b1916600160a01b1790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586123566124b9565b600e54600b54612561916001600160a01b0391821691166000611fcc565b600354600a5461257f916001600160a01b0391821691166000611fcc565b600354600c5461259d916001600160a01b0391821691166000611fcc565b600354600d546125bb916001600160a01b0391821691166000611fcc565b60155415610f3b5760005b6015548110156109e857600354601580546125f2926001600160a01b0316916000918590811061245c57fe5b6001016125c6565b606061264f826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166120cb9092919063ffffffff16565b8051909150156120c6578080602001905181019061266d91906133bd565b6120c65760405162461bcd60e51b8152600401610a3890613978565b6060824710156126ab5760405162461bcd60e51b8152600401610a38906137c4565b6126b485612fa5565b6126d05760405162461bcd60e51b8152600401610a389061391f565b60006060866001600160a01b031685876040516126ed919061350a565b60006040518083038185875af1925050503d806000811461272a576040519150601f19603f3d011682016040523d82523d6000602084013e61272f565b606091505b509150915061273f828286612fab565b979650505050505050565b6015541561298e5760005b60155481101561298c57600954601580546001600160a01b03909216918390811061277c57fe5b9060005260206000200160008154811061279257fe5b6000918252602090912001546001600160a01b031614156128205747801561281e57600960009054906101000a90046001600160a01b03166001600160a01b031663d0e30db0826040518263ffffffff1660e01b81526004016000604051808303818588803b15801561280457600080fd5b505af1158015612818573d6000803e3d6000fd5b50505050505b505b60006015828154811061282f57fe5b9060005260206000200160008154811061284557fe5b6000918252602090912001546040516370a0823160e01b81526001600160a01b03909116906370a082319061287e903090600401613526565b60206040518083038186803b15801561289657600080fd5b505afa1580156128aa573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128ce91906133f1565b9050801561298357600354601580546001600160a01b03909216916338ed173991849160009190879081106128ff57fe5b9060005260206000200130426040518663ffffffff1660e01b815260040161292b959493929190613a5f565b600060405180830381600087803b15801561294557600080fd5b505af1158015612959573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526129819190810190613366565b505b50600101612755565b505b600a546040516370a0823160e01b8152600091612a1e916103e891610e3491602d916001600160a01b0316906370a08231906129ce903090600401613526565b60206040518083038186803b1580156129e657600080fd5b505afa1580156129fa573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115d991906133f1565b6003546040516338ed173960e01b81529192506001600160a01b0316906338ed173990612a5990849060009060129030904290600401613a5f565b600060405180830381600087803b158015612a7357600080fd5b505af1158015612a87573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052612aaf9190810190613366565b506009546040516370a0823160e01b81526000916001600160a01b0316906370a0823190612ae1903090600401613526565b60206040518083038186803b158015612af957600080fd5b505afa158015612b0d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b3191906133f1565b90506000612b506103e8610e346007548561227190919063ffffffff16565b600954909150612b6a906001600160a01b031685836122dd565b6000612b876103e8610e346008548661227190919063ffffffff16565b600554600954919250612ba7916001600160a01b039081169116836122dd565b6000612bba6103e8610e34866070612271565b600254600954919250612bda916001600160a01b039081169116836122dd565b7fd255b592c7f268a73e534da5219a60ff911b4cf6daae21c7d20527dd657bd99a838383604051612c0d93929190613a9b565b60405180910390a1505050505050565b600a546040516370a0823160e01b8152600091612ca5916002916001600160a01b0316906370a0823190612c55903090600401613526565b60206040518083038186803b158015612c6d57600080fd5b505afa158015612c81573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e3491906133f1565b600a54600c549192506001600160a01b03918216911614612d52576003546040516338ed173960e01b81526001600160a01b03909116906338ed173990612cfa90849060009060139030904290600401613a5f565b600060405180830381600087803b158015612d1457600080fd5b505af1158015612d28573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052612d509190810190613366565b505b600a54600d546001600160a01b03908116911614612dfc576003546040516338ed173960e01b81526001600160a01b03909116906338ed173990612da490849060009060149030904290600401613a5f565b600060405180830381600087803b158015612dbe57600080fd5b505af1158015612dd2573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052612dfa9190810190613366565b505b600c546040516370a0823160e01b81526000916001600160a01b0316906370a0823190612e2d903090600401613526565b60206040518083038186803b158015612e4557600080fd5b505afa158015612e59573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612e7d91906133f1565b600d546040516370a0823160e01b81529192506000916001600160a01b03909116906370a0823190612eb3903090600401613526565b60206040518083038186803b158015612ecb57600080fd5b505afa158015612edf573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612f0391906133f1565b600354600c54600d5460405162e8e33760e81b81529394506001600160a01b039283169363e8e3370093612f4b93811692169087908790600190819030904290600401613554565b606060405180830381600087803b158015612f6557600080fd5b505af1158015612f79573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612f9d919061342a565b505050505050565b3b151590565b60608315612fba5750816120dd565b825115612fca5782518084602001fd5b8160405162461bcd60e51b8152600401610a38919061368a565b50805460008255906000526020600020908101906109e89190613067565b828054828255906000526020600020908101928215613057579160200282015b8281111561305757825182546001600160a01b0319166001600160a01b03909116178255602090920191600190910190613022565b5061306392915061307c565b5090565b5b808211156130635760008155600101613068565b5b808211156130635780546001600160a01b031916815560010161307d565b803561226b81613b48565b600082601f8301126130b6578081fd5b81516130c96130c482613ad8565b613ab1565b818152915060208083019084810160005b8481101561313f578151870188603f8201126130f557600080fd5b838101516131056130c482613af8565b81815260408b8184860101111561311b57600080fd5b61312a83888401838701613b1c565b508652505092820192908201906001016130da565b505050505092915050565b600082601f83011261315a578081fd5b81516131686130c482613ad8565b81815291506020808301908481018184028601820187101561318957600080fd5b60005b8481101561313f5781518452928201929082019060010161318c565b6000602082840312156131b9578081fd5b81356120dd81613b48565b600060208083850312156131d6578182fd5b823567ffffffffffffffff8111156131ec578283fd5b8301601f810185136131fc578283fd5b803561320a6130c482613ad8565b8181528381019083850185840285018601891015613226578687fd5b8694505b838510156132505761323c898261309b565b83526001949094019391850191850161322a565b50979650505050505050565b60008060008060808587031215613271578283fd5b845167ffffffffffffffff80821115613288578485fd5b818701915087601f83011261329b578485fd5b81516132a96130c482613ad8565b80828252602080830192508086018c8283870289010111156132c957898afd5b8996505b848710156132f45780516132e081613b48565b8452600196909601959281019281016132cd565b508a0151909850935050508082111561330b578485fd5b613317888389016130a6565b9450604087015191508082111561332c578384fd5b6133388883890161314a565b9350606087015191508082111561334d578283fd5b5061335a8782880161314a565b91505092959194509250565b600060208284031215613377578081fd5b815167ffffffffffffffff81111561338d578182fd5b6133998482850161314a565b949350505050565b6000602082840312156133b2578081fd5b81356120dd81613b5d565b6000602082840312156133ce578081fd5b81516120dd81613b5d565b6000602082840312156133ea578081fd5b5035919050565b600060208284031215613402578081fd5b5051919050565b6000806040838503121561341b578182fd5b50508035926020909101359150565b60008060006060848603121561343e578283fd5b8351925060208401519150604084015190509250925092565b6000806000806080858703121561346c578384fd5b505082516020840151604085015160609095015191969095509092509050565b6000815180845260208085019450808401835b838110156134c45781516001600160a01b03168752958201959082019060010161349f565b509495945050505050565b6000815480845260208085019450838352808320835b838110156134c45781546001600160a01b0316875295820195600191820191016134e5565b6000825161351c818460208701613b1c565b9190910192915050565b6001600160a01b0391909116815260200190565b6001600160a01b0392831681529116602082015260400190565b6001600160a01b039889168152968816602088015260408701959095526060860193909352608085019190915260a084015290921660c082015260e08101919091526101000190565b6001600160a01b03929092168252602082015260400190565b6000602082526120dd602083018461348c565b6000604082526135dc604083018561348c565b828103602084810191909152845180835285820192820190845b81811015613612578451835293830193918301916001016135f6565b5090979650505050505050565b6000602080830181845280855180835260408601915060408482028701019250838701855b8281101561367257603f1988860301845261366085835161348c565b94509285019290850190600101613644565b5092979650505050505050565b901515815260200190565b60006020825282518060208401526136a9816040850160208701613b1c565b601f01601f19169190910160400192915050565b60208082526014908201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b604082015260600190565b6020808252600b908201526a085cdd1c985d1959da5cdd60aa1b604082015260600190565b60208082526026908201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160408201526564647265737360d01b606082015260800190565b6020808252601b908201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604082015260600190565b6020808252601e908201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604082015260600190565b60208082526026908201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6040820152651c8818d85b1b60d21b606082015260800190565b6020808252601a908201527f536166654d6174683a206469766973696f6e206279207a65726f000000000000604082015260600190565b60208082526010908201526f14185d5cd8589b194e881c185d5cd95960821b604082015260600190565b6020808252600490820152630216361760e41b604082015260600190565b60208082526021908201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6040820152607760f81b606082015260800190565b602080825260069082015265085d985d5b1d60d21b604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252601d908201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604082015260600190565b60208082526008908201526710b6b0b730b3b2b960c11b604082015260600190565b6020808252602a908201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6040820152691bdd081cdd58d8d9595960b21b606082015260800190565b60208082526036908201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60408201527520746f206e6f6e2d7a65726f20616c6c6f77616e636560501b606082015260800190565b90815260200190565b9182526001600160a01b0316602082015260400190565b6000838252604060208301526120da60408301846134cf565b918252602082015260400190565b600086825285602083015260a06040830152613a7e60a08301866134cf565b6001600160a01b0394909416606083015250608001529392505050565b9283526020830191909152604082015260600190565b60405181810167ffffffffffffffff81118282101715613ad057600080fd5b604052919050565b600067ffffffffffffffff821115613aee578081fd5b5060209081020190565b600067ffffffffffffffff821115613b0e578081fd5b50601f01601f191660200190565b60005b83811015613b37578181015183820152602001613b1f565b83811115610ffa5750506000910152565b6001600160a01b03811681146109e857600080fd5b80151581146109e857600080fdfea264697066735822122038112e5965fdbaa9a4e75d9eb8a13453cccbd62e2b7bbb10d9f695a9b6d5188464736f6c634300060c0033000000000000000000000000a927e1e1e044ca1d9fe1854585003477331fe2af000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000f3a5454496e26ac57da879bf3285fa85debf0388000000000000000000000000aecd33b7b048960a78cacf59f8da658e1ff0ed64000000000000000000000000d0a01ec574d1fc6652edf79cb2f880fd47d34ab1000000000000000000000000340465d9d2ebde78f15a3870884757584f97abb4000000000000000000000000b2e4a61d99ca58fb8aac58bb2f8a59d63f552fc0000000000000000000000000adb9ddfa24e326dc9d337561f6c7ba2a6ecec697000000000000000000000000000000000000000000000000000000000000016000000000000000000000000000000000000000000000000000000000000001c0000000000000000000000000000000000000000000000000000000000000022000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000e358838ce72d5e61e0018a2ffac4bec5f4c88d2000000000000000000000000acc15dc74880c9944775448304b263d191c6077f00000000000000000000000000000000000000000000000000000000000000020000000000000000000000000e358838ce72d5e61e0018a2ffac4bec5f4c88d2000000000000000000000000acc15dc74880c9944775448304b263d191c6077f00000000000000000000000000000000000000000000000000000000000000030000000000000000000000000e358838ce72d5e61e0018a2ffac4bec5f4c88d2000000000000000000000000acc15dc74880c9944775448304b263d191c6077f000000000000000000000000ffffffff1fcacbd218edc0eba20fc2308c778080
Deployed Bytecode
0x6080604052600436106103905760003560e01c80638912cb8b116101dc578063c7b9d53011610102578063e7a7250a116100a0578063fa5c9edd1161006f578063fa5c9edd14610911578063fb61778714610933578063fbfa77cf14610948578063fd63a8871461095d57610397565b8063e7a7250a146108a4578063f1a392da146108c7578063f20eaeb8146108dc578063f2fde38b146108f157610397565b8063d3102589116100dc578063d310258914610845578063d801d9461461085a578063d92f3d731461086f578063dfbdc4371461088f57610397565b8063c7b9d530146107f0578063cc28948014610810578063d0e30db01461083057610397565b8063989ef4e31161017a578063aced166111610149578063aced166114610791578063bc063e1a146107a6578063be12a978146107bb578063c1a3d44c146107db57610397565b8063989ef4e314610727578063a39219f91461073c578063a68833e514610751578063ac1e50251461077157610397565b80638e145459116101b65780638e145459146106c857806390321e1a146106dd57806396813fca146106f257806397fd323d1461071257610397565b80638912cb8b146106895780638bc7e8c41461069e5780638da5cb5b146106b357610397565b80633e0dc34e116102c15780635ee167c01161025f578063748747e61161022e578063748747e61461062a5780637d38ca651461064a5780638456cb591461065f578063877562b61461067457610397565b80635ee167c0146105cb5780636817031b146105e0578063715018a614610600578063722713f71461061557610397565b80634700d3051161029b5780634700d3051461056a57806354518b1a1461057f578063573fef0a146105945780635c975abb146105a957610397565b80633e0dc34e1461052b5780633f4ba83a146105405780634641257d1461055557610397565b80631fc8bc5d1161032e578063264658261161030857806326465826146104b65780632ad5a53f146104d65780632e1a7d4d146104eb57806336c6cf211461050b57610397565b80631fc8bc5d146104775780631fe4a6861461048c578063257ae0de146104a157610397565b8063115880861161036a578063115880861461040957806311b0b42d1461042b57806313e120b11461044d5780631f1fcd511461046257610397565b80630587f7851461039c5780630e5c011e146103c75780630e8fbb5a146103e957610397565b3661039757005b600080fd5b3480156103a857600080fd5b506103b161097d565b6040516103be91906135b6565b60405180910390f35b3480156103d357600080fd5b506103e76103e23660046131a8565b6109df565b005b3480156103f557600080fd5b506103e76104043660046133a1565b6109eb565b34801561041557600080fd5b5061041e610a72565b6040516103be9190613a18565b34801561043757600080fd5b50610440610b04565b6040516103be9190613526565b34801561045957600080fd5b506103b1610b13565b34801561046e57600080fd5b50610440610b73565b34801561048357600080fd5b50610440610b82565b34801561049857600080fd5b50610440610b91565b3480156104ad57600080fd5b50610440610ba0565b3480156104c257600080fd5b506103e76104d13660046133d9565b610baf565b3480156104e257600080fd5b5061041e610c2b565b3480156104f757600080fd5b506103e76105063660046133d9565b610c30565b34801561051757600080fd5b506104406105263660046133d9565b610ea9565b34801561053757600080fd5b5061041e610ed0565b34801561054c57600080fd5b506103e7610ed6565b34801561056157600080fd5b506103e7610f3d565b34801561057657600080fd5b506103e7610f46565b34801561058b57600080fd5b5061041e611000565b3480156105a057600080fd5b506103e7611006565b3480156105b557600080fd5b506105be61103b565b6040516103be919061367f565b3480156105d757600080fd5b5061044061104b565b3480156105ec57600080fd5b506103e76105fb3660046131a8565b61105a565b34801561060c57600080fd5b506103e76110bb565b34801561062157600080fd5b5061041e611144565b34801561063657600080fd5b506103e76106453660046131a8565b611164565b34801561065657600080fd5b5061041e6111d3565b34801561066b57600080fd5b506103e76111d8565b34801561068057600080fd5b50610440611235565b34801561069557600080fd5b506105be611244565b3480156106aa57600080fd5b5061041e61124d565b3480156106bf57600080fd5b50610440611253565b3480156106d457600080fd5b50610440611262565b3480156106e957600080fd5b5061041e611271565b3480156106fe57600080fd5b5061044061070d366004613409565b611277565b34801561071e57600080fd5b5061041e6112b5565b34801561073357600080fd5b506103b16115e7565b34801561074857600080fd5b506103e7611647565b34801561075d57600080fd5b506103e761076c3660046131a8565b611746565b34801561077d57600080fd5b506103e761078c3660046133d9565b6117a7565b34801561079d57600080fd5b5061044061181a565b3480156107b257600080fd5b5061041e611829565b3480156107c757600080fd5b506104406107d63660046133d9565b61182f565b3480156107e757600080fd5b5061041e61183c565b3480156107fc57600080fd5b506103e761080b3660046131a8565b6118bd565b34801561081c57600080fd5b506103e761082b3660046131c4565b611909565b34801561083c57600080fd5b506103e76119f1565b34801561085157600080fd5b5061041e611b45565b34801561086657600080fd5b506103e7611b4b565b34801561087b57600080fd5b506103e761088a3660046131a8565b611b98565b34801561089b57600080fd5b5061041e611bf9565b3480156108b057600080fd5b506108b9611bfe565b6040516103be9291906135c9565b3480156108d357600080fd5b5061041e611c9e565b3480156108e857600080fd5b50610440611ca4565b3480156108fd57600080fd5b506103e761090c3660046131a8565b611cb3565b34801561091d57600080fd5b50610926611d73565b6040516103be919061361f565b34801561093f57600080fd5b506103e7611e16565b34801561095457600080fd5b50610440611fb0565b34801561096957600080fd5b506104406109783660046133d9565b611fbf565b606060148054806020026020016040519081016040528092919081815260200182805480156109d557602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116109b7575b5050505050905090565b6109e8816120e4565b50565b6109f3611253565b6001600160a01b0316336001600160a01b03161480610a1c57506001546001600160a01b031633145b610a415760405162461bcd60e51b8152600401610a3890613956565b60405180910390fd5b6010805460ff1916821515179081905560ff1615610a6857610a6360006117a7565b6109e8565b6109e8600a6117a7565b600e54600f546040516393f1a40b60e01b815260009283926001600160a01b03909116916393f1a40b91610aaa913090600401613a21565b60806040518083038186803b158015610ac257600080fd5b505afa158015610ad6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610afa9190613457565b5091935050505090565b6009546001600160a01b031681565b606060128054806020026020016040519081016040528092919081815260200182805480156109d5576020028201919060005260206000209081546001600160a01b031681526001909101906020018083116109b7575050505050905090565b600b546001600160a01b031681565b600e546001600160a01b031681565b6002546001600160a01b031681565b6003546001600160a01b031681565b610bb7611253565b6001600160a01b0316336001600160a01b03161480610be057506001546001600160a01b031633145b610bfc5760405162461bcd60e51b8152600401610a3890613956565b606f811115610c1d5760405162461bcd60e51b8152600401610a389061386b565b600781905561037803600855565b606f81565b6004546001600160a01b03163314610c5a5760405162461bcd60e51b8152600401610a38906138ca565b600b546040516370a0823160e01b81526000916001600160a01b0316906370a0823190610c8b903090600401613526565b60206040518083038186803b158015610ca357600080fd5b505afa158015610cb7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cdb91906133f1565b905081811015610dd957600e54600f546001600160a01b039091169063441a3e7090610d078585612244565b6040518363ffffffff1660e01b8152600401610d24929190613a51565b600060405180830381600087803b158015610d3e57600080fd5b505af1158015610d52573d6000803e3d6000fd5b5050600b546040516370a0823160e01b81526001600160a01b0390911692506370a082319150610d86903090600401613526565b60206040518083038186803b158015610d9e57600080fd5b505afa158015610db2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610dd691906133f1565b90505b81811115610de45750805b610dec611253565b6001600160a01b0316326001600160a01b031614158015610e125750610e1061103b565b155b15610e4a576000610e3a612710610e346006548561227190919063ffffffff16565b906122ab565b9050610e468282612244565b9150505b600454600b54610e67916001600160a01b039182169116836122dd565b7f5b6b431d4476a211bb7d41c20d1aab9ae2321deee0d20be3d9fc9b1093fa6e3d610e90611144565b604051610e9d9190613a18565b60405180910390a15050565b60138181548110610eb657fe5b6000918252602090912001546001600160a01b0316905081565b600f5481565b610ede611253565b6001600160a01b0316336001600160a01b03161480610f0757506001546001600160a01b031633145b610f235760405162461bcd60e51b8152600401610a3890613956565b610f2b6122fc565b610f3361236d565b610f3b6119f1565b565b610f3b326120e4565b610f4e611253565b6001600160a01b0316336001600160a01b03161480610f7757506001546001600160a01b031633145b610f935760405162461bcd60e51b8152600401610a3890613956565b610f9b6111d8565b600e54600f54604051632989754760e11b81526001600160a01b0390921691635312ea8e91610fcc91600401613a18565b600060405180830381600087803b158015610fe657600080fd5b505af1158015610ffa573d6000803e3d6000fd5b50505050565b61271081565b60105460ff1615610f3b576004546001600160a01b03163314610f3d5760405162461bcd60e51b8152600401610a38906138ca565b600054600160a01b900460ff1690565b600c546001600160a01b031681565b6110626124b9565b6001600160a01b0316611073611253565b6001600160a01b0316146110995760405162461bcd60e51b8152600401610a38906138ea565b600480546001600160a01b0319166001600160a01b0392909216919091179055565b6110c36124b9565b6001600160a01b03166110d4611253565b6001600160a01b0316146110fa5760405162461bcd60e51b8152600401610a38906138ea565b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b600061115f611151610a72565b61115961183c565b906124bd565b905090565b61116c611253565b6001600160a01b0316336001600160a01b0316148061119557506001546001600160a01b031633145b6111b15760405162461bcd60e51b8152600401610a3890613956565b600180546001600160a01b0319166001600160a01b0392909216919091179055565b607081565b6111e0611253565b6001600160a01b0316336001600160a01b0316148061120957506001546001600160a01b031633145b6112255760405162461bcd60e51b8152600401610a3890613956565b61122d6124e2565b610f3b612543565b600d546001600160a01b031681565b60105460ff1681565b60065481565b6000546001600160a01b031690565b6005546001600160a01b031681565b60075481565b6015828154811061128457fe5b90600052602060002001818154811061129957fe5b6000918252602090912001546001600160a01b03169150829050565b60006060806112c2611bfe565b915091506000600360009054906101000a90046001600160a01b03166001600160a01b031663d06ca61f836000815181106112f957fe5b602002602001015160126040518363ffffffff1660e01b8152600401611320929190613a38565b60006040518083038186803b15801561133857600080fd5b505afa92505050801561136d57506040513d6000823e601f3d908101601f1916820160405261136a9190810190613366565b60015b61137657611392565b8060018251038151811061138657fe5b60200260200101519150505b601554156115b35760005b6015548110156115b15760015b84518110156115a857601582815481106113c057fe5b906000526020600020016000815481106113d657fe5b60009182526020909120015485516001600160a01b03909116908690839081106113fc57fe5b60200260200101516001600160a01b031614156115a05760035484516001600160a01b039091169063d06ca61f9086908490811061143657fe5b60200260200101516015858154811061144b57fe5b906000526020600020016040518363ffffffff1660e01b8152600401611472929190613a38565b60006040518083038186803b15801561148a57600080fd5b505afa9250505080156114bf57506040513d6000823e601f3d908101601f191682016040526114bc9190810190613366565b60015b6114c8576115a0565b6000816001835103815181106114da57fe5b602090810291909101015160035460405163d06ca61f60e01b81529192506001600160a01b03169063d06ca61f90611519908490601290600401613a38565b60006040518083038186803b15801561153157600080fd5b505afa92505050801561156657506040513d6000823e601f3d908101601f191682016040526115639190810190613366565b60015b61156f5761159d565b6115998160018351038151811061158257fe5b6020026020010151876124bd90919063ffffffff16565b9550505b50505b6001016113aa565b5060010161139d565b505b6115df6103e8610e346007546115d96103e8610e34602d8861227190919063ffffffff16565b90612271565b935050505090565b606060138054806020026020016040519081016040528092919081815260200182805480156109d5576020028201919060005260206000209081546001600160a01b031681526001909101906020018083116109b7575050505050905090565b61164f611253565b6001600160a01b0316336001600160a01b0316148061167857506001546001600160a01b031633145b6116945760405162461bcd60e51b8152600401610a3890613956565b601580546000919060001981019081106116aa57fe5b906000526020600020016000815481106116c057fe5b600091825260209091200154600c546001600160a01b0391821692501681148015906116fa5750600d546001600160a01b03828116911614155b1561171a5760035461171a906001600160a01b0383811691166000611fcc565b601580548061172557fe5b6001900381819060005260206000200160006117419190612fe4565b905550565b61174e6124b9565b6001600160a01b031661175f611253565b6001600160a01b0316146117855760405162461bcd60e51b8152600401610a38906138ea565b600580546001600160a01b0319166001600160a01b0392909216919091179055565b6117af611253565b6001600160a01b0316336001600160a01b031614806117d857506001546001600160a01b031633145b6117f45760405162461bcd60e51b8152600401610a3890613956565b60328111156118155760405162461bcd60e51b8152600401610a389061386b565b600655565b6001546001600160a01b031681565b6103e881565b60128181548110610eb657fe5b600b546040516370a0823160e01b81526000916001600160a01b0316906370a082319061186d903090600401613526565b60206040518083038186803b15801561188557600080fd5b505afa158015611899573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061115f91906133f1565b6002546001600160a01b031633146118e75760405162461bcd60e51b8152600401610a38906136eb565b600280546001600160a01b0319166001600160a01b0392909216919091179055565b6119116124b9565b6001600160a01b0316611922611253565b6001600160a01b0316146119485760405162461bcd60e51b8152600401610a38906138ea565b6003548151611988916001600160a01b0316906000908490829061196857fe5b60200260200101516001600160a01b0316611fcc9092919063ffffffff16565b60035481516119aa916001600160a01b03169060001990849060009061196857fe5b6015805460018101825560009190915281516119ed917f55f448fdea98c4d29eb340757ef0a66cd03dbb9538908a6a81d96026b71ec47501906020840190613002565b5050565b6119f961103b565b15611a165760405162461bcd60e51b8152600401610a3890613841565b600b546040516370a0823160e01b81526000916001600160a01b0316906370a0823190611a47903090600401613526565b60206040518083038186803b158015611a5f57600080fd5b505afa158015611a73573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a9791906133f1565b905080156109e857600e54600f54604051631c57762b60e31b81526001600160a01b039092169163e2bbb15891611ad2918590600401613a51565b600060405180830381600087803b158015611aec57600080fd5b505af1158015611b00573d6000803e3d6000fd5b505050507f4d6ce1e535dbade1c23defba91e23b8f791ce5edc0cc320257a2b364e4e38426611b2d611144565b604051611b3a9190613a18565b60405180910390a150565b60085481565b611b53611253565b6001600160a01b0316336001600160a01b03161480611b7c57506001546001600160a01b031633145b610f3d5760405162461bcd60e51b8152600401610a3890613956565b611ba06124b9565b6001600160a01b0316611bb1611253565b6001600160a01b031614611bd75760405162461bcd60e51b8152600401610a38906138ea565b600380546001600160a01b0319166001600160a01b0392909216919091179055565b603281565b600e54600f5460405160016232bd9d60e01b031981526060928392839283926001600160a01b03169163ffcd426391611c3c91903090600401613a21565b60006040518083038186803b158015611c5457600080fd5b505afa158015611c68573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611c90919081019061325c565b929650919450505050509091565b60115481565b600a546001600160a01b031681565b611cbb6124b9565b6001600160a01b0316611ccc611253565b6001600160a01b031614611cf25760405162461bcd60e51b8152600401610a38906138ea565b6001600160a01b038116611d185760405162461bcd60e51b8152600401610a3890613710565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b60606015805480602002602001604051908101604052809291908181526020016000905b82821015611e0d57600084815260209081902083018054604080518285028101850190915281815292830182828015611df957602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311611ddb575b505050505081526020019060010190611d97565b50505050905090565b6004546001600160a01b03163314611e405760405162461bcd60e51b8152600401610a38906138ca565b600e54600f54604051632989754760e11b81526001600160a01b0390921691635312ea8e91611e7191600401613a18565b600060405180830381600087803b158015611e8b57600080fd5b505af1158015611e9f573d6000803e3d6000fd5b5050600b546040516370a0823160e01b8152600093506001600160a01b0390911691506370a0823190611ed6903090600401613526565b60206040518083038186803b158015611eee57600080fd5b505afa158015611f02573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f2691906133f1565b600b546004805460405163a9059cbb60e01b81529394506001600160a01b039283169363a9059cbb93611f5e9392169186910161359d565b602060405180830381600087803b158015611f7857600080fd5b505af1158015611f8c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119ed91906133bd565b6004546001600160a01b031681565b60148181548110610eb657fe5b8015806120545750604051636eb1769f60e11b81526001600160a01b0384169063dd62ed3e90612002903090869060040161353a565b60206040518083038186803b15801561201a57600080fd5b505afa15801561202e573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061205291906133f1565b155b6120705760405162461bcd60e51b8152600401610a38906139c2565b6120c68363095ea7b360e01b848460405160240161208f92919061359d565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b0319909316929092179091526125fa565b505050565b60606120da8484600085612689565b90505b9392505050565b600e54600f54604051631c57762b60e31b81526001600160a01b039092169163e2bbb1589161211891600090600401613a51565b600060405180830381600087803b15801561213257600080fd5b505af1158015612146573d6000803e3d6000fd5b5050600a546040516370a0823160e01b8152600093506001600160a01b0390911691506370a082319061217d903090600401613526565b60206040518083038186803b15801561219557600080fd5b505afa1580156121a9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121cd91906133f1565b905080156119ed576121de8261274a565b6121e6612c1d565b60006121f061183c565b90506121fa6119f1565b42601155337f9bc239f1724cacfb88cb1d66a2dc437467699b68a8c90d7b63110cf4b6f9241082612229611144565b604051612237929190613a51565b60405180910390a2505050565b6000828211156122665760405162461bcd60e51b8152600401610a389061378d565b508082035b92915050565b6000826122805750600061226b565b8282028284828161228d57fe5b04146120dd5760405162461bcd60e51b8152600401610a3890613889565b60008082116122cc5760405162461bcd60e51b8152600401610a389061380a565b8183816122d557fe5b049392505050565b6120c68363a9059cbb60e01b848460405160240161208f92919061359d565b61230461103b565b6123205760405162461bcd60e51b8152600401610a38906136bd565b6000805460ff60a01b191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa6123566124b9565b6040516123639190613526565b60405180910390a1565b600e54600b5461238c916001600160a01b039182169116600019611fcc565b600354600a546123ab916001600160a01b039182169116600019611fcc565b600354600c546123c9916001600160a01b0391821691166000611fcc565b600354600c546123e8916001600160a01b039182169116600019611fcc565b600354600d54612406916001600160a01b0391821691166000611fcc565b600354600d54612425916001600160a01b039182169116600019611fcc565b60155415610f3b5760005b6015548110156109e8576003546015805461248e926001600160a01b0316916000918590811061245c57fe5b9060005260206000200160008154811061247257fe5b6000918252602090912001546001600160a01b03169190611fcc565b600354601580546124b1926001600160a01b031691600019918590811061245c57fe5b600101612430565b3390565b6000828201838110156120dd5760405162461bcd60e51b8152600401610a3890613756565b6124ea61103b565b156125075760405162461bcd60e51b8152600401610a3890613841565b6000805460ff60a01b1916600160a01b1790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586123566124b9565b600e54600b54612561916001600160a01b0391821691166000611fcc565b600354600a5461257f916001600160a01b0391821691166000611fcc565b600354600c5461259d916001600160a01b0391821691166000611fcc565b600354600d546125bb916001600160a01b0391821691166000611fcc565b60155415610f3b5760005b6015548110156109e857600354601580546125f2926001600160a01b0316916000918590811061245c57fe5b6001016125c6565b606061264f826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166120cb9092919063ffffffff16565b8051909150156120c6578080602001905181019061266d91906133bd565b6120c65760405162461bcd60e51b8152600401610a3890613978565b6060824710156126ab5760405162461bcd60e51b8152600401610a38906137c4565b6126b485612fa5565b6126d05760405162461bcd60e51b8152600401610a389061391f565b60006060866001600160a01b031685876040516126ed919061350a565b60006040518083038185875af1925050503d806000811461272a576040519150601f19603f3d011682016040523d82523d6000602084013e61272f565b606091505b509150915061273f828286612fab565b979650505050505050565b6015541561298e5760005b60155481101561298c57600954601580546001600160a01b03909216918390811061277c57fe5b9060005260206000200160008154811061279257fe5b6000918252602090912001546001600160a01b031614156128205747801561281e57600960009054906101000a90046001600160a01b03166001600160a01b031663d0e30db0826040518263ffffffff1660e01b81526004016000604051808303818588803b15801561280457600080fd5b505af1158015612818573d6000803e3d6000fd5b50505050505b505b60006015828154811061282f57fe5b9060005260206000200160008154811061284557fe5b6000918252602090912001546040516370a0823160e01b81526001600160a01b03909116906370a082319061287e903090600401613526565b60206040518083038186803b15801561289657600080fd5b505afa1580156128aa573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128ce91906133f1565b9050801561298357600354601580546001600160a01b03909216916338ed173991849160009190879081106128ff57fe5b9060005260206000200130426040518663ffffffff1660e01b815260040161292b959493929190613a5f565b600060405180830381600087803b15801561294557600080fd5b505af1158015612959573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526129819190810190613366565b505b50600101612755565b505b600a546040516370a0823160e01b8152600091612a1e916103e891610e3491602d916001600160a01b0316906370a08231906129ce903090600401613526565b60206040518083038186803b1580156129e657600080fd5b505afa1580156129fa573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115d991906133f1565b6003546040516338ed173960e01b81529192506001600160a01b0316906338ed173990612a5990849060009060129030904290600401613a5f565b600060405180830381600087803b158015612a7357600080fd5b505af1158015612a87573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052612aaf9190810190613366565b506009546040516370a0823160e01b81526000916001600160a01b0316906370a0823190612ae1903090600401613526565b60206040518083038186803b158015612af957600080fd5b505afa158015612b0d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b3191906133f1565b90506000612b506103e8610e346007548561227190919063ffffffff16565b600954909150612b6a906001600160a01b031685836122dd565b6000612b876103e8610e346008548661227190919063ffffffff16565b600554600954919250612ba7916001600160a01b039081169116836122dd565b6000612bba6103e8610e34866070612271565b600254600954919250612bda916001600160a01b039081169116836122dd565b7fd255b592c7f268a73e534da5219a60ff911b4cf6daae21c7d20527dd657bd99a838383604051612c0d93929190613a9b565b60405180910390a1505050505050565b600a546040516370a0823160e01b8152600091612ca5916002916001600160a01b0316906370a0823190612c55903090600401613526565b60206040518083038186803b158015612c6d57600080fd5b505afa158015612c81573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e3491906133f1565b600a54600c549192506001600160a01b03918216911614612d52576003546040516338ed173960e01b81526001600160a01b03909116906338ed173990612cfa90849060009060139030904290600401613a5f565b600060405180830381600087803b158015612d1457600080fd5b505af1158015612d28573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052612d509190810190613366565b505b600a54600d546001600160a01b03908116911614612dfc576003546040516338ed173960e01b81526001600160a01b03909116906338ed173990612da490849060009060149030904290600401613a5f565b600060405180830381600087803b158015612dbe57600080fd5b505af1158015612dd2573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052612dfa9190810190613366565b505b600c546040516370a0823160e01b81526000916001600160a01b0316906370a0823190612e2d903090600401613526565b60206040518083038186803b158015612e4557600080fd5b505afa158015612e59573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612e7d91906133f1565b600d546040516370a0823160e01b81529192506000916001600160a01b03909116906370a0823190612eb3903090600401613526565b60206040518083038186803b158015612ecb57600080fd5b505afa158015612edf573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612f0391906133f1565b600354600c54600d5460405162e8e33760e81b81529394506001600160a01b039283169363e8e3370093612f4b93811692169087908790600190819030904290600401613554565b606060405180830381600087803b158015612f6557600080fd5b505af1158015612f79573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612f9d919061342a565b505050505050565b3b151590565b60608315612fba5750816120dd565b825115612fca5782518084602001fd5b8160405162461bcd60e51b8152600401610a38919061368a565b50805460008255906000526020600020908101906109e89190613067565b828054828255906000526020600020908101928215613057579160200282015b8281111561305757825182546001600160a01b0319166001600160a01b03909116178255602090920191600190910190613022565b5061306392915061307c565b5090565b5b808211156130635760008155600101613068565b5b808211156130635780546001600160a01b031916815560010161307d565b803561226b81613b48565b600082601f8301126130b6578081fd5b81516130c96130c482613ad8565b613ab1565b818152915060208083019084810160005b8481101561313f578151870188603f8201126130f557600080fd5b838101516131056130c482613af8565b81815260408b8184860101111561311b57600080fd5b61312a83888401838701613b1c565b508652505092820192908201906001016130da565b505050505092915050565b600082601f83011261315a578081fd5b81516131686130c482613ad8565b81815291506020808301908481018184028601820187101561318957600080fd5b60005b8481101561313f5781518452928201929082019060010161318c565b6000602082840312156131b9578081fd5b81356120dd81613b48565b600060208083850312156131d6578182fd5b823567ffffffffffffffff8111156131ec578283fd5b8301601f810185136131fc578283fd5b803561320a6130c482613ad8565b8181528381019083850185840285018601891015613226578687fd5b8694505b838510156132505761323c898261309b565b83526001949094019391850191850161322a565b50979650505050505050565b60008060008060808587031215613271578283fd5b845167ffffffffffffffff80821115613288578485fd5b818701915087601f83011261329b578485fd5b81516132a96130c482613ad8565b80828252602080830192508086018c8283870289010111156132c957898afd5b8996505b848710156132f45780516132e081613b48565b8452600196909601959281019281016132cd565b508a0151909850935050508082111561330b578485fd5b613317888389016130a6565b9450604087015191508082111561332c578384fd5b6133388883890161314a565b9350606087015191508082111561334d578283fd5b5061335a8782880161314a565b91505092959194509250565b600060208284031215613377578081fd5b815167ffffffffffffffff81111561338d578182fd5b6133998482850161314a565b949350505050565b6000602082840312156133b2578081fd5b81356120dd81613b5d565b6000602082840312156133ce578081fd5b81516120dd81613b5d565b6000602082840312156133ea578081fd5b5035919050565b600060208284031215613402578081fd5b5051919050565b6000806040838503121561341b578182fd5b50508035926020909101359150565b60008060006060848603121561343e578283fd5b8351925060208401519150604084015190509250925092565b6000806000806080858703121561346c578384fd5b505082516020840151604085015160609095015191969095509092509050565b6000815180845260208085019450808401835b838110156134c45781516001600160a01b03168752958201959082019060010161349f565b509495945050505050565b6000815480845260208085019450838352808320835b838110156134c45781546001600160a01b0316875295820195600191820191016134e5565b6000825161351c818460208701613b1c565b9190910192915050565b6001600160a01b0391909116815260200190565b6001600160a01b0392831681529116602082015260400190565b6001600160a01b039889168152968816602088015260408701959095526060860193909352608085019190915260a084015290921660c082015260e08101919091526101000190565b6001600160a01b03929092168252602082015260400190565b6000602082526120dd602083018461348c565b6000604082526135dc604083018561348c565b828103602084810191909152845180835285820192820190845b81811015613612578451835293830193918301916001016135f6565b5090979650505050505050565b6000602080830181845280855180835260408601915060408482028701019250838701855b8281101561367257603f1988860301845261366085835161348c565b94509285019290850190600101613644565b5092979650505050505050565b901515815260200190565b60006020825282518060208401526136a9816040850160208701613b1c565b601f01601f19169190910160400192915050565b60208082526014908201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b604082015260600190565b6020808252600b908201526a085cdd1c985d1959da5cdd60aa1b604082015260600190565b60208082526026908201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160408201526564647265737360d01b606082015260800190565b6020808252601b908201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604082015260600190565b6020808252601e908201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604082015260600190565b60208082526026908201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6040820152651c8818d85b1b60d21b606082015260800190565b6020808252601a908201527f536166654d6174683a206469766973696f6e206279207a65726f000000000000604082015260600190565b60208082526010908201526f14185d5cd8589b194e881c185d5cd95960821b604082015260600190565b6020808252600490820152630216361760e41b604082015260600190565b60208082526021908201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6040820152607760f81b606082015260800190565b602080825260069082015265085d985d5b1d60d21b604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252601d908201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604082015260600190565b60208082526008908201526710b6b0b730b3b2b960c11b604082015260600190565b6020808252602a908201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6040820152691bdd081cdd58d8d9595960b21b606082015260800190565b60208082526036908201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60408201527520746f206e6f6e2d7a65726f20616c6c6f77616e636560501b606082015260800190565b90815260200190565b9182526001600160a01b0316602082015260400190565b6000838252604060208301526120da60408301846134cf565b918252602082015260400190565b600086825285602083015260a06040830152613a7e60a08301866134cf565b6001600160a01b0394909416606083015250608001529392505050565b9283526020830191909152604082015260600190565b60405181810167ffffffffffffffff81118282101715613ad057600080fd5b604052919050565b600067ffffffffffffffff821115613aee578081fd5b5060209081020190565b600067ffffffffffffffff821115613b0e578081fd5b50601f01601f191660200190565b60005b83811015613b37578181015183820152602001613b1f565b83811115610ffa5750506000910152565b6001600160a01b03811681146109e857600080fd5b80151581146109e857600080fdfea264697066735822122038112e5965fdbaa9a4e75d9eb8a13453cccbd62e2b7bbb10d9f695a9b6d5188464736f6c634300060c0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000a927e1e1e044ca1d9fe1854585003477331fe2af000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000f3a5454496e26ac57da879bf3285fa85debf0388000000000000000000000000aecd33b7b048960a78cacf59f8da658e1ff0ed64000000000000000000000000d0a01ec574d1fc6652edf79cb2f880fd47d34ab1000000000000000000000000340465d9d2ebde78f15a3870884757584f97abb4000000000000000000000000b2e4a61d99ca58fb8aac58bb2f8a59d63f552fc0000000000000000000000000adb9ddfa24e326dc9d337561f6c7ba2a6ecec697000000000000000000000000000000000000000000000000000000000000016000000000000000000000000000000000000000000000000000000000000001c0000000000000000000000000000000000000000000000000000000000000022000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000e358838ce72d5e61e0018a2ffac4bec5f4c88d2000000000000000000000000acc15dc74880c9944775448304b263d191c6077f00000000000000000000000000000000000000000000000000000000000000020000000000000000000000000e358838ce72d5e61e0018a2ffac4bec5f4c88d2000000000000000000000000acc15dc74880c9944775448304b263d191c6077f00000000000000000000000000000000000000000000000000000000000000030000000000000000000000000e358838ce72d5e61e0018a2ffac4bec5f4c88d2000000000000000000000000acc15dc74880c9944775448304b263d191c6077f000000000000000000000000ffffffff1fcacbd218edc0eba20fc2308c778080
-----Decoded View---------------
Arg [0] : _want (address): 0xa927E1e1E044CA1D9fe1854585003477331fE2Af
Arg [1] : _poolId (uint256): 10
Arg [2] : _chef (address): 0xF3a5454496E26ac57da879bf3285Fa85DEBF0388
Arg [3] : _vault (address): 0xAECd33b7b048960A78CacF59F8da658E1FF0eD64
Arg [4] : _unirouter (address): 0xd0A01ec574D1fC6652eDF79cb2F880fd47D34Ab1
Arg [5] : _keeper (address): 0x340465d9D2EbDE78F15a3870884757584F97aBB4
Arg [6] : _strategist (address): 0xb2e4A61D99cA58fB8aaC58Bb2F8A59d63f552fC0
Arg [7] : _beefyFeeRecipient (address): 0xaDB9DDFA24E326dC9d337561f6c7ba2a6Ecec697
Arg [8] : _outputToNativeRoute (address[]): 0x0E358838ce72d5e61E0018a2ffaC4bEC5F4c88d2,0xAcc15dC74880C9944775448304B263D191c6077F
Arg [9] : _outputToLp0Route (address[]): 0x0E358838ce72d5e61E0018a2ffaC4bEC5F4c88d2,0xAcc15dC74880C9944775448304B263D191c6077F
Arg [10] : _outputToLp1Route (address[]): 0x0E358838ce72d5e61E0018a2ffaC4bEC5F4c88d2,0xAcc15dC74880C9944775448304B263D191c6077F,0xFfFFfFff1FcaCBd218EDc0EbA20Fc2308C778080
-----Encoded View---------------
21 Constructor Arguments found :
Arg [0] : 000000000000000000000000a927e1e1e044ca1d9fe1854585003477331fe2af
Arg [1] : 000000000000000000000000000000000000000000000000000000000000000a
Arg [2] : 000000000000000000000000f3a5454496e26ac57da879bf3285fa85debf0388
Arg [3] : 000000000000000000000000aecd33b7b048960a78cacf59f8da658e1ff0ed64
Arg [4] : 000000000000000000000000d0a01ec574d1fc6652edf79cb2f880fd47d34ab1
Arg [5] : 000000000000000000000000340465d9d2ebde78f15a3870884757584f97abb4
Arg [6] : 000000000000000000000000b2e4a61d99ca58fb8aac58bb2f8a59d63f552fc0
Arg [7] : 000000000000000000000000adb9ddfa24e326dc9d337561f6c7ba2a6ecec697
Arg [8] : 0000000000000000000000000000000000000000000000000000000000000160
Arg [9] : 00000000000000000000000000000000000000000000000000000000000001c0
Arg [10] : 0000000000000000000000000000000000000000000000000000000000000220
Arg [11] : 0000000000000000000000000000000000000000000000000000000000000002
Arg [12] : 0000000000000000000000000e358838ce72d5e61e0018a2ffac4bec5f4c88d2
Arg [13] : 000000000000000000000000acc15dc74880c9944775448304b263d191c6077f
Arg [14] : 0000000000000000000000000000000000000000000000000000000000000002
Arg [15] : 0000000000000000000000000e358838ce72d5e61e0018a2ffac4bec5f4c88d2
Arg [16] : 000000000000000000000000acc15dc74880c9944775448304b263d191c6077f
Arg [17] : 0000000000000000000000000000000000000000000000000000000000000003
Arg [18] : 0000000000000000000000000e358838ce72d5e61e0018a2ffac4bec5f4c88d2
Arg [19] : 000000000000000000000000acc15dc74880c9944775448304b263d191c6077f
Arg [20] : 000000000000000000000000ffffffff1fcacbd218edc0eba20fc2308c778080
Deployed Bytecode Sourcemap
45960:12390:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58076:106;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49528:105;;;;;;;;;;-1:-1:-1;49528:105:0;;;;;:::i;:::-;;:::i;:::-;;54985:262;;;;;;;;;;-1:-1:-1;54985:262:0;;;;;:::i;:::-;;:::i;53119:170::-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;46121:21::-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;57842:112::-;;;;;;;;;;;;;:::i;46177:19::-;;;;;;;;;;;;;:::i;46295:::-;;;;;;;;;;;;;:::i;42534:25::-;;;;;;;;;;;;;:::i;42566:24::-;;;;;;;;;;;;;:::i;45462:200::-;;;;;;;;;;-1:-1:-1;45462:200:0;;;;;:::i;:::-;;:::i;45174:39::-;;;;;;;;;;;;;:::i;48517:731::-;;;;;;;;;;-1:-1:-1;48517:731:0;;;;;:::i;:::-;;:::i;46479:33::-;;;;;;;;;;-1:-1:-1;46479:33:0;;;;;:::i;:::-;;:::i;46321:21::-;;;;;;;;;;;;;:::i;55915:121::-;;;;;;;;;;;;;:::i;49446:74::-;;;;;;;;;;;;;:::i;55689:115::-;;;;;;;;;;;;;:::i;45273:43::-;;;;;;;;;;;;;:::i;49256:182::-;;;;;;;;;;;;;:::i;40822:86::-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;46203:23::-;;;;;;;;;;;;;:::i;44394:86::-;;;;;;;;;;-1:-1:-1;44394:86:0;;;;;:::i;:::-;;:::i;39181:148::-;;;;;;;;;;;;;:::i;52737:113::-;;;;;;;;;;;;;:::i;43666:92::-;;;;;;;;;;-1:-1:-1;43666:92:0;;;;;:::i;:::-;;:::i;45084:41::-;;;;;;;;;;;;;:::i;55812:95::-;;;;;;;;;;;;;:::i;46233:23::-;;;;;;;;;;;;;:::i;46351:28::-;;;;;;;;;;;;;:::i;45325:30::-;;;;;;;;;;;;;:::i;38530:87::-;;;;;;;;;;;;;:::i;42624:32::-;;;;;;;;;;;;;:::i;45364:25::-;;;;;;;;;;;;;:::i;46559:38::-;;;;;;;;;;-1:-1:-1;46559:38:0;;;;;:::i;:::-;;:::i;53558:1419::-;;;;;;;;;;;;;:::i;57962:106::-;;;;;;;;;;;;;:::i;57531:303::-;;;;;;;;;;;;;:::i;44615:134::-;;;;;;;;;;-1:-1:-1;44615:134:0;;;;;:::i;:::-;;:::i;45670:154::-;;;;;;;;;;-1:-1:-1;45670:154:0;;;;;:::i;:::-;;:::i;42506:21::-;;;;;;;;;;;;;:::i;45132:35::-;;;;;;;;;;;;;:::i;46436:36::-;;;;;;;;;;-1:-1:-1;46436:36:0;;;;;:::i;:::-;;:::i;52917:118::-;;;;;;;;;;;;;:::i;43903:155::-;;;;;;;;;;-1:-1:-1;43903:155:0;;;;;:::i;:::-;;:::i;57230:293::-;;;;;;;;;;-1:-1:-1;57230:293:0;;;;;:::i;:::-;;:::i;48258:251::-;;;;;;;;;;;;;:::i;45396:57::-;;;;;;;;;;;;;:::i;49641:85::-;;;;;;;;;;;;;:::i;44190:102::-;;;;;;;;;;-1:-1:-1;44190:102:0;;;;;:::i;:::-;;:::i;45222:44::-;;;;;;;;;;;;;:::i;53297:253::-;;;;;;;;;;;;;:::i;:::-;;;;;;;;:::i;46386:26::-;;;;;;;;;;;;;:::i;46149:21::-;;;;;;;;;;;;;:::i;39484:244::-;;;;;;;;;;-1:-1:-1;39484:244:0;;;;;:::i;:::-;;:::i;58190:114::-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;55347:260::-;;;;;;;;;;;;;:::i;42597:20::-;;;;;;;;;;;;;:::i;46519:33::-;;;;;;;;;;-1:-1:-1;46519:33:0;;;;;:::i;:::-;;:::i;58076:106::-;58122:16;58158;58151:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;58151:23:0;;;;;;;;;;;;;;;;;;;;;;;58076:106;:::o;49528:105::-;49599:26;49608:16;49599:8;:26::i;:::-;49528:105;:::o;54985:262::-;43483:7;:5;:7::i;:::-;-1:-1:-1;;;;;43469:21:0;:10;-1:-1:-1;;;;;43469:21:0;;:45;;;-1:-1:-1;43508:6:0;;-1:-1:-1;;;;;43508:6:0;43494:10;:20;43469:45;43461:66;;;;-1:-1:-1;;;43461:66:0;;;;;;;:::i;:::-;;;;;;;;;55070:16:::1;:36:::0;;-1:-1:-1;;55070:36:0::1;::::0;::::1;;;::::0;;;;::::1;55123:16;55119:121;;;55156:19;55173:1;55156:16;:19::i;:::-;55119:121;;;55208:20;55225:2;55208:16;:20::i;53119:170::-:0;53219:4;;53234:6;;53208:48;;-1:-1:-1;;;53208:48:0;;53165:7;;;;-1:-1:-1;;;;;53219:4:0;;;;53208:25;;:48;;53250:4;;53208:48;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;53185:71:0;;-1:-1:-1;;;;53119:170:0;:::o;46121:21::-;;;-1:-1:-1;;;;;46121:21:0;;:::o;57842:112::-;57891:16;57927:19;57920:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;57920:26:0;;;;;;;;;;;;;;;;;;;;;;57842:112;:::o;46177:19::-;;;-1:-1:-1;;;;;46177:19:0;;:::o;46295:::-;;;-1:-1:-1;;;;;46295:19:0;;:::o;42534:25::-;;;-1:-1:-1;;;;;42534:25:0;;:::o;42566:24::-;;;-1:-1:-1;;;;;42566:24:0;;:::o;45462:200::-;43483:7;:5;:7::i;:::-;-1:-1:-1;;;;;43469:21:0;:10;-1:-1:-1;;;;;43469:21:0;;:45;;;-1:-1:-1;43508:6:0;;-1:-1:-1;;;;;43508:6:0;43494:10;:20;43469:45;43461:66;;;;-1:-1:-1;;;43461:66:0;;;;;;;:::i;:::-;45210:3:::1;45534:4;:20;;45526:37;;;;-1:-1:-1::0;;;45526:37:0::1;;;;;;;:::i;:::-;45584:7;:14:::0;;;45620:24;:34:::1;45609:8;:45:::0;45462:200::o;45174:39::-;45210:3;45174:39;:::o;48517:731::-;48594:5;;-1:-1:-1;;;;;48594:5:0;48580:10;:19;48572:38;;;;-1:-1:-1;;;48572:38:0;;;;;;;:::i;:::-;48648:4;;48641:37;;-1:-1:-1;;;48641:37:0;;48623:15;;-1:-1:-1;;;;;48648:4:0;;48641:22;;:37;;48672:4;;48641:37;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;48623:55;;48705:7;48695;:17;48691:167;;;48740:4;;48755:6;;-1:-1:-1;;;;;48740:4:0;;;;48729:25;;48763:20;:7;48775;48763:11;:20::i;:::-;48729:55;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;48816:4:0;;48809:37;;-1:-1:-1;;;48809:37:0;;-1:-1:-1;;;;;48816:4:0;;;;-1:-1:-1;48809:22:0;;-1:-1:-1;48809:37:0;;48840:4;;48809:37;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;48799:47;;48691:167;48884:7;48874;:17;48870:67;;;-1:-1:-1;48918:7:0;48870:67;48966:7;:5;:7::i;:::-;-1:-1:-1;;;;;48953:20:0;:9;-1:-1:-1;;;;;48953:20:0;;;:33;;;;;48978:8;:6;:8::i;:::-;48977:9;48953:33;48949:199;;;49003:27;49033:46;45311:5;49033:26;49045:13;;49033:7;:11;;:26;;;;:::i;:::-;:30;;:46::i;:::-;49003:76;-1:-1:-1;49104:32:0;:7;49003:76;49104:11;:32::i;:::-;49094:42;;48949:199;;49186:5;;49167:4;;49160:41;;-1:-1:-1;;;;;49167:4:0;;;;49186:5;49193:7;49160:25;:41::i;:::-;49219:21;49228:11;:9;:11::i;:::-;49219:21;;;;;;:::i;:::-;;;;;;;;48517:731;;:::o;46479:33::-;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;46479:33:0;;-1:-1:-1;46479:33:0;:::o;46321:21::-;;;;:::o;55915:121::-;43483:7;:5;:7::i;:::-;-1:-1:-1;;;;;43469:21:0;:10;-1:-1:-1;;;;;43469:21:0;;:45;;;-1:-1:-1;43508:6:0;;-1:-1:-1;;;;;43508:6:0;43494:10;:20;43469:45;43461:66;;;;-1:-1:-1;;;43461:66:0;;;;;;;:::i;:::-;55966:10:::1;:8;:10::i;:::-;55989:17;:15;:17::i;:::-;56019:9;:7;:9::i;:::-;55915:121::o:0;49446:74::-;49493:19;49502:9;49493:8;:19::i;55689:115::-;43483:7;:5;:7::i;:::-;-1:-1:-1;;;;;43469:21:0;:10;-1:-1:-1;;;;;43469:21:0;;:45;;;-1:-1:-1;43508:6:0;;-1:-1:-1;;;;;43508:6:0;43494:10;:20;43469:45;43461:66;;;;-1:-1:-1;;;43461:66:0;;;;;;;:::i;:::-;55736:7:::1;:5;:7::i;:::-;55765:4;::::0;55789:6:::1;::::0;55754:42:::1;::::0;-1:-1:-1;;;55754:42:0;;-1:-1:-1;;;;;55765:4:0;;::::1;::::0;55754:34:::1;::::0;:42:::1;::::0;::::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;55689:115::o:0;45273:43::-;45311:5;45273:43;:::o;49256:182::-;49314:16;;;;49310:121;;;49369:5;;-1:-1:-1;;;;;49369:5:0;49355:10;:19;49347:38;;;;-1:-1:-1;;;49347:38:0;;;;;;;:::i;40822:86::-;40869:4;40893:7;-1:-1:-1;;;40893:7:0;;;;;40822:86::o;46203:23::-;;;-1:-1:-1;;;;;46203:23:0;;:::o;44394:86::-;38761:12;:10;:12::i;:::-;-1:-1:-1;;;;;38750:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;38750:23:0;;38742:68;;;;-1:-1:-1;;;38742:68:0;;;;;;;:::i;:::-;44458:5:::1;:14:::0;;-1:-1:-1;;;;;;44458:14:0::1;-1:-1:-1::0;;;;;44458:14:0;;;::::1;::::0;;;::::1;::::0;;44394:86::o;39181:148::-;38761:12;:10;:12::i;:::-;-1:-1:-1;;;;;38750:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;38750:23:0;;38742:68;;;;-1:-1:-1;;;38742:68:0;;;;;;;:::i;:::-;39288:1:::1;39272:6:::0;;39251:40:::1;::::0;-1:-1:-1;;;;;39272:6:0;;::::1;::::0;39251:40:::1;::::0;39288:1;;39251:40:::1;39319:1;39302:19:::0;;-1:-1:-1;;;;;;39302:19:0::1;::::0;;39181:148::o;52737:113::-;52779:7;52806:36;52826:15;:13;:15::i;:::-;52806;:13;:15::i;:::-;:19;;:36::i;:::-;52799:43;;52737:113;:::o;43666:92::-;43483:7;:5;:7::i;:::-;-1:-1:-1;;;;;43469:21:0;:10;-1:-1:-1;;;;;43469:21:0;;:45;;;-1:-1:-1;43508:6:0;;-1:-1:-1;;;;;43508:6:0;43494:10;:20;43469:45;43461:66;;;;-1:-1:-1;;;43461:66:0;;;;;;;:::i;:::-;43734:6:::1;:16:::0;;-1:-1:-1;;;;;;43734:16:0::1;-1:-1:-1::0;;;;;43734:16:0;;;::::1;::::0;;;::::1;::::0;;43666:92::o;45084:41::-;45122:3;45084:41;:::o;55812:95::-;43483:7;:5;:7::i;:::-;-1:-1:-1;;;;;43469:21:0;:10;-1:-1:-1;;;;;43469:21:0;;:45;;;-1:-1:-1;43508:6:0;;-1:-1:-1;;;;;43508:6:0;43494:10;:20;43469:45;43461:66;;;;-1:-1:-1;;;43461:66:0;;;;;;;:::i;:::-;55859:8:::1;:6;:8::i;:::-;55880:19;:17;:19::i;46233:23::-:0;;;-1:-1:-1;;;;;46233:23:0;;:::o;46351:28::-;;;;;;:::o;45325:30::-;;;;:::o;38530:87::-;38576:7;38603:6;-1:-1:-1;;;;;38603:6:0;38530:87;:::o;42624:32::-;;;-1:-1:-1;;;;;42624:32:0;;:::o;45364:25::-;;;;:::o;46559:38::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;46559:38:0;;-1:-1:-1;46559:38:0;;-1:-1:-1;46559:38:0:o;53558:1419::-;53601:7;53622:26;53650;53680:18;:16;:18::i;:::-;53621:77;;;;53709:17;53759:9;;;;;;;;;-1:-1:-1;;;;;53759:9:0;-1:-1:-1;;;;;53741:42:0;;53784:9;53794:1;53784:12;;;;;;;;;;;;;;53798:19;53741:77;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;53741:77:0;;;;;;;;;;;;:::i;:::-;;;53737:207;;;;;53892:9;53921:1;53902:9;:16;:20;53892:31;;;;;;;;;;;;;;53880:43;;53828:107;53737:207;53960:19;:26;:31;53956:941;;54013:6;54008:878;54025:19;:26;54021:30;;54008:878;;;54091:1;54077:794;54098:9;:16;54094:1;:20;54077:794;;;54164:19;54184:1;54164:22;;;;;;;;;;;;;;;54187:1;54164:25;;;;;;;;;;;;;;;;;;54148:12;;-1:-1:-1;;;;;54164:25:0;;;;54148:9;;54158:1;;54148:12;;;;;;;;;;;;-1:-1:-1;;;;;54148:41:0;;54144:708;;;54240:9;;54265:12;;-1:-1:-1;;;;;54240:9:0;;;;54222:42;;54265:9;;54275:1;;54265:12;;;;;;;;;;;;54279:19;54299:1;54279:22;;;;;;;;;;;;;;;54222:80;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;54222:80:0;;;;;;;;;;;;:::i;:::-;;;54218:611;;;;;54403:17;54423:16;54466:1;54440:16;:23;:27;54423:45;;;;;;;;;;;;;;;;;;54521:9;;54503:74;;-1:-1:-1;;;54503:74:0;;54423:45;;-1:-1:-1;;;;;;54521:9:0;;54503:42;;:74;;54423:45;;54557:19;;54503:74;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;54503:74:0;;;;;;;;;;;;:::i;:::-;;;54499:294;;;;;54696:56;54710:14;54749:1;54725:14;:21;:25;54710:41;;;;;;;;;;;;;;54696:9;:13;;:56;;;;:::i;:::-;54684:68;;54607:177;54499:294;54328:492;;54218:611;54116:3;;54077:794;;;-1:-1:-1;54053:3:0;;54008:878;;;;53956:941;54916:53;45163:4;54916:40;54948:7;;54916:27;54938:4;54916:17;54930:2;54916:9;:13;;:17;;;;:::i;:27::-;:31;;:40::i;:53::-;54909:60;;;;;53558:1419;:::o;57962:106::-;58008:16;58044;58037:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;58037:23:0;;;;;;;;;;;;;;;;;;;;;;57962:106;:::o;57531:303::-;43483:7;:5;:7::i;:::-;-1:-1:-1;;;;;43469:21:0;:10;-1:-1:-1;;;;;43469:21:0;;:45;;;-1:-1:-1;43508:6:0;;-1:-1:-1;;;;;43508:6:0;43494:10;:20;43469:45;43461:66;;;;-1:-1:-1;;;43461:66:0;;;;;;;:::i;:::-;57613:19:::1;57633:26:::0;;57596:14:::1;::::0;57613:19;-1:-1:-1;;57633:30:0;;;57613:51;::::1;;;;;;;;;;;;57665:1;57613:54;;;;;;;;;::::0;;;::::1;::::0;;;::::1;::::0;57692:8:::1;::::0;-1:-1:-1;;;;;57613:54:0;;::::1;::::0;-1:-1:-1;57692:8:0::1;57682:18:::0;::::1;::::0;::::1;::::0;:40:::1;;-1:-1:-1::0;57714:8:0::1;::::0;-1:-1:-1;;;;;57704:18:0;;::::1;57714:8:::0;::::1;57704:18;;57682:40;57678:113;;;57766:9;::::0;57739:40:::1;::::0;-1:-1:-1;;;;;57739:26:0;;::::1;::::0;57766:9:::1;;57739:26;:40::i;:::-;57801:19;:25;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;43538:1;57531:303::o:0;44615:134::-;38761:12;:10;:12::i;:::-;-1:-1:-1;;;;;38750:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;38750:23:0;;38742:68;;;;-1:-1:-1;;;38742:68:0;;;;;;;:::i;:::-;44703:17:::1;:38:::0;;-1:-1:-1;;;;;;44703:38:0::1;-1:-1:-1::0;;;;;44703:38:0;;;::::1;::::0;;;::::1;::::0;;44615:134::o;45670:154::-;43483:7;:5;:7::i;:::-;-1:-1:-1;;;;;43469:21:0;:10;-1:-1:-1;;;;;43469:21:0;;:45;;;-1:-1:-1;43508:6:0;;-1:-1:-1;;;;;43508:6:0;43494:10;:20;43469:45;43461:66;;;;-1:-1:-1;;;43461:66:0;;;;;;;:::i;:::-;45264:2:::1;45748:4;:26;;45740:43;;;;-1:-1:-1::0;;;45740:43:0::1;;;;;;;:::i;:::-;45796:13;:20:::0;45670:154::o;42506:21::-;;;-1:-1:-1;;;;;42506:21:0;;:::o;45132:35::-;45163:4;45132:35;:::o;46436:36::-;;;;;;;;;;52917:118;52997:4;;52990:37;;-1:-1:-1;;;52990:37:0;;52963:7;;-1:-1:-1;;;;;52997:4:0;;52990:22;;:37;;53021:4;;52990:37;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;43903:155::-;43989:10;;-1:-1:-1;;;;;43989:10:0;43975;:24;43967:48;;;;-1:-1:-1;;;43967:48:0;;;;;;;:::i;:::-;44026:10;:24;;-1:-1:-1;;;;;;44026:24:0;-1:-1:-1;;;;;44026:24:0;;;;;;;;;;43903:155::o;57230:293::-;38761:12;:10;:12::i;:::-;-1:-1:-1;;;;;38750:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;38750:23:0;;38742:68;;;;-1:-1:-1;;;38742:68:0;;;;;;;:::i;:::-;57367:9:::1;::::0;57330:23;;57323:57:::1;::::0;-1:-1:-1;;;;;57367:9:0::1;::::0;::::1;::::0;57330:20;;57367:9;;57330:23:::1;;;;;;;;;;-1:-1:-1::0;;;;;57323:43:0::1;;;:57;;;;;:::i;:::-;57435:9;::::0;57398:23;;57391:67:::1;::::0;-1:-1:-1;;;;;57435:9:0::1;::::0;-1:-1:-1;;57454:2:0;57398:20;;57435:9:::1;::::0;57398:23:::1;;;57391:67;57469:19;:46:::0;;::::1;::::0;::::1;::::0;;-1:-1:-1;57469:46:0;;;;;;::::1;::::0;;::::1;::::0;::::1;::::0;::::1;::::0;::::1;:::i;:::-;;57230:293:::0;:::o;48258:251::-;41148:8;:6;:8::i;:::-;41147:9;41139:38;;;;-1:-1:-1;;;41139:38:0;;;;;;;:::i;:::-;48334:4:::1;::::0;48327:37:::1;::::0;-1:-1:-1;;;48327:37:0;;48309:15:::1;::::0;-1:-1:-1;;;;;48334:4:0::1;::::0;48327:22:::1;::::0;:37:::1;::::0;48358:4:::1;::::0;48327:37:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;48309:55:::0;-1:-1:-1;48381:11:0;;48377:125:::1;;48420:4;::::0;48434:6:::1;::::0;48409:41:::1;::::0;-1:-1:-1;;;48409:41:0;;-1:-1:-1;;;;;48420:4:0;;::::1;::::0;48409:24:::1;::::0;:41:::1;::::0;48442:7;;48409:41:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;48470:20;48478:11;:9;:11::i;:::-;48470:20;;;;;;:::i;:::-;;;;;;;;41188:1;48258:251::o:0;45396:57::-;;;;:::o;49641:85::-;43483:7;:5;:7::i;:::-;-1:-1:-1;;;;;43469:21:0;:10;-1:-1:-1;;;;;43469:21:0;;:45;;;-1:-1:-1;43508:6:0;;-1:-1:-1;;;;;43508:6:0;43494:10;:20;43469:45;43461:66;;;;-1:-1:-1;;;43461:66:0;;;;;;;:::i;44190:102::-;38761:12;:10;:12::i;:::-;-1:-1:-1;;;;;38750:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;38750:23:0;;38742:68;;;;-1:-1:-1;;;38742:68:0;;;;;;;:::i;:::-;44262:9:::1;:22:::0;;-1:-1:-1;;;;;;44262:22:0::1;-1:-1:-1::0;;;;;44262:22:0;;;::::1;::::0;;;::::1;::::0;;44190:102::o;45222:44::-;45264:2;45222:44;:::o;53297:253::-;53462:4;;53482:6;;53451:53;;-1:-1:-1;;;;;;53451:53:0;;53346:16;;;;;;;;-1:-1:-1;;;;;53462:4:0;;53451:30;;:53;;53482:6;53498:4;;53451:53;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;53451:53:0;;;;;;;;;;;;:::i;:::-;53393:111;;-1:-1:-1;53393:111:0;;-1:-1:-1;;;;;53297:253:0;;:::o;46386:26::-;;;;:::o;46149:21::-;;;-1:-1:-1;;;;;46149:21:0;;:::o;39484:244::-;38761:12;:10;:12::i;:::-;-1:-1:-1;;;;;38750:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;38750:23:0;;38742:68;;;;-1:-1:-1;;;38742:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;39573:22:0;::::1;39565:73;;;;-1:-1:-1::0;;;39565:73:0::1;;;;;;;:::i;:::-;39675:6;::::0;;39654:38:::1;::::0;-1:-1:-1;;;;;39654:38:0;;::::1;::::0;39675:6;::::1;::::0;39654:38:::1;::::0;::::1;39703:6;:17:::0;;-1:-1:-1;;;;;;39703:17:0::1;-1:-1:-1::0;;;;;39703:17:0;;;::::1;::::0;;;::::1;::::0;;39484:244::o;58190:114::-;58239:18;58277:19;58270:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;58270:26:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58190:114;:::o;55347:260::-;55412:5;;-1:-1:-1;;;;;55412:5:0;55398:10;:19;55390:38;;;;-1:-1:-1;;;55390:38:0;;;;;;;:::i;:::-;55452:4;;55476:6;;55441:42;;-1:-1:-1;;;55441:42:0;;-1:-1:-1;;;;;55452:4:0;;;;55441:34;;:42;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;55521:4:0;;55514:37;;-1:-1:-1;;;55514:37:0;;55496:15;;-1:-1:-1;;;;;;55521:4:0;;;;-1:-1:-1;55514:22:0;;:37;;55545:4;;55514:37;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;55569:4;;55584:5;;;55562:37;;-1:-1:-1;;;55562:37:0;;55496:55;;-1:-1:-1;;;;;;55569:4:0;;;;55562:21;;:37;;55584:5;;;55496:55;;55562:37;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;42597:20::-;;;-1:-1:-1;;;;;42597:20:0;;:::o;46519:33::-;;;;;;;;;;31685:622;32055:10;;;32054:62;;-1:-1:-1;32071:39:0;;-1:-1:-1;;;32071:39:0;;-1:-1:-1;;;;;32071:15:0;;;;;:39;;32095:4;;32102:7;;32071:39;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:44;32054:62;32046:152;;;;-1:-1:-1;;;32046:152:0;;;;;;;:::i;:::-;32209:90;32229:5;32259:22;;;32283:7;32292:5;32236:62;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;32236:62:0;;;;;;;;;;;;;;-1:-1:-1;;;;;32236:62:0;-1:-1:-1;;;;;;32236:62:0;;;;;;;;;;32209:19;:90::i;:::-;31685:622;;;:::o;26021:195::-;26124:12;26156:52;26178:6;26186:4;26192:1;26195:12;26156:21;:52::i;:::-;26149:59;;26021:195;;;;;;:::o;49789:486::-;49864:4;;49878:6;;49853:35;;-1:-1:-1;;;49853:35:0;;-1:-1:-1;;;;;49864:4:0;;;;49853:24;;:35;;49864:4;;49853:35;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;49926:6:0;;49919:39;;-1:-1:-1;;;49919:39:0;;49899:17;;-1:-1:-1;;;;;;49926:6:0;;;;-1:-1:-1;49919:24:0;;:39;;49952:4;;49919:39;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;49899:59;-1:-1:-1;49973:13:0;;49969:299;;50003:28;50014:16;50003:10;:28::i;:::-;50046:14;:12;:14::i;:::-;50075:21;50099:15;:13;:15::i;:::-;50075:39;;50129:9;:7;:9::i;:::-;50169:15;50155:11;:29;50217:10;50204:52;50229:13;50244:11;:9;:11::i;:::-;50204:52;;;;;;;:::i;:::-;;;;;;;;49969:299;49789:486;;:::o;7087:158::-;7145:7;7178:1;7173;:6;;7165:49;;;;-1:-1:-1;;;7165:49:0;;;;;;;:::i;:::-;-1:-1:-1;7232:5:0;;;7087:158;;;;;:::o;7504:220::-;7562:7;7586:6;7582:20;;-1:-1:-1;7601:1:0;7594:8;;7582:20;7625:5;;;7629:1;7625;:5;:1;7649:5;;;;;:10;7641:56;;;;-1:-1:-1;;;7641:56:0;;;;;;;:::i;8202:153::-;8260:7;8292:1;8288;:5;8280:44;;;;-1:-1:-1;;;8280:44:0;;;;;;;:::i;:::-;8346:1;8342;:5;;;;;;;8202:153;-1:-1:-1;;;8202:153:0:o;31026:177::-;31109:86;31129:5;31159:23;;;31184:2;31188:5;31136:58;;;;;;;;;:::i;41881:120::-;41425:8;:6;:8::i;:::-;41417:41;;;;-1:-1:-1;;;41417:41:0;;;;;;;:::i;:::-;41950:5:::1;41940:15:::0;;-1:-1:-1;;;;41940:15:0::1;::::0;;41971:22:::1;41980:12;:10;:12::i;:::-;41971:22;;;;;;:::i;:::-;;;;;;;;41881:120::o:0;56044:702::-;56116:4;;56098;;56091:43;;-1:-1:-1;;;;;56098:4:0;;;;56116;-1:-1:-1;;56091:24:0;:43::i;:::-;56172:9;;56152:6;;56145:50;;-1:-1:-1;;;;;56152:6:0;;;;56172:9;-1:-1:-1;;56145:26:0;:50::i;:::-;56237:9;;56215:8;;56208:42;;-1:-1:-1;;;;;56215:8:0;;;;56237:9;;56208:28;:42::i;:::-;56290:9;;56268:8;;56261:52;;-1:-1:-1;;;;;56268:8:0;;;;56290:9;-1:-1:-1;;56261:28:0;:52::i;:::-;56355:9;;56333:8;;56326:42;;-1:-1:-1;;;;;56333:8:0;;;;56355:9;;56326:28;:42::i;:::-;56408:9;;56386:8;;56379:52;;-1:-1:-1;;;;;56386:8:0;;;;56408:9;-1:-1:-1;;56379:28:0;:52::i;:::-;56448:19;:26;:31;56444:295;;56501:6;56496:232;56513:19;:26;56509:30;;56496:232;;;56611:9;;56572:19;:22;;56565:59;;-1:-1:-1;;;;;56611:9:0;;;;56592:1;;56572:22;;;;;;;;;;;;;56595:1;56572:25;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;56572:25:0;;56565:59;:45;:59::i;:::-;56689:9;;56650:19;:22;;56643:69;;-1:-1:-1;;;;;56689:9:0;;-1:-1:-1;;56708:2:0;56670:1;;56650:22;;;;;56643:69;56541:3;;56496:232;;667:106;755:10;667:106;:::o;6625:179::-;6683:7;6715:5;;;6739:6;;;;6731:46;;;;-1:-1:-1;;;6731:46:0;;;;;;;:::i;41622:118::-;41148:8;:6;:8::i;:::-;41147:9;41139:38;;;;-1:-1:-1;;;41139:38:0;;;;;;;:::i;:::-;41682:7:::1;:14:::0;;-1:-1:-1;;;;41682:14:0::1;-1:-1:-1::0;;;41682:14:0::1;::::0;;41712:20:::1;41719:12;:10;:12::i;56754:468::-:0;56828:4;;56810;;56803:33;;-1:-1:-1;;;;;56810:4:0;;;;56828;;56803:24;:33::i;:::-;56874:9;;56854:6;;56847:40;;-1:-1:-1;;;;;56854:6:0;;;;56874:9;;56847:26;:40::i;:::-;56929:9;;56907:8;;56900:42;;-1:-1:-1;;;;;56907:8:0;;;;56929:9;;56900:28;:42::i;:::-;56982:9;;56960:8;;56953:42;;-1:-1:-1;;;;;56960:8:0;;;;56982:9;;56953:28;:42::i;:::-;57012:19;:26;:31;57008:207;;57065:6;57060:144;57077:19;:26;57073:30;;57060:144;;;57175:9;;57136:19;:22;;57129:59;;-1:-1:-1;;;;;57175:9:0;;;;57156:1;;57136:22;;;;;57129:59;57105:3;;57060:144;;33331:761;33755:23;33781:69;33809:4;33781:69;;;;;;;;;;;;;;;;;33789:5;-1:-1:-1;;;;;33781:27:0;;;:69;;;;;:::i;:::-;33865:17;;33755:95;;-1:-1:-1;33865:21:0;33861:224;;34007:10;33996:30;;;;;;;;;;;;:::i;:::-;33988:85;;;;-1:-1:-1;;;33988:85:0;;;;;;;:::i;27073:530::-;27200:12;27258:5;27233:21;:30;;27225:81;;;;-1:-1:-1;;;27225:81:0;;;;;;;:::i;:::-;27325:18;27336:6;27325:10;:18::i;:::-;27317:60;;;;-1:-1:-1;;;27317:60:0;;;;;;;:::i;:::-;27451:12;27465:23;27492:6;-1:-1:-1;;;;;27492:11:0;27512:5;27520:4;27492:33;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27450:75;;;;27543:52;27561:7;27570:10;27582:12;27543:17;:52::i;:::-;27536:59;27073:530;-1:-1:-1;;;;;;;27073:530:0:o;50308:1581::-;50378:19;:26;:31;50374:702;;50431:6;50426:639;50443:19;:26;50439:30;;50426:639;;;50528:6;;50499:19;:22;;-1:-1:-1;;;;;50528:6:0;;;;50519:1;;50499:22;;;;;;;;;;;;;50522:1;50499:25;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;50499:25:0;:35;50495:267;;;50579:21;50627:13;;50623:120;;50684:6;;;;;;;;;-1:-1:-1;;;;;50684:6:0;-1:-1:-1;;;;;50669:30:0;;50707:9;50669:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50623:120;50495:267;;50780:17;50807:19;50827:1;50807:22;;;;;;;;;;;;;;;50830:1;50807:25;;;;;;;;;;;;;;;;;;50800:58;;-1:-1:-1;;;50800:58:0;;-1:-1:-1;;;;;50807:25:0;;;;50800:43;;:58;;50852:4;;50800:58;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;50780:78;-1:-1:-1;50881:13:0;;50877:173;;50937:9;;50987:19;:22;;-1:-1:-1;;;;;50937:9:0;;;;50919:53;;50973:9;;50937;;50987:19;51007:1;;50987:22;;;;;;;;;;;;;51019:4;51026:3;50919:111;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;50919:111:0;;;;;;;;;;;;:::i;:::-;;50877:173;-1:-1:-1;50471:3:0;;50426:639;;;;50374:702;51114:6;;51107:39;;-1:-1:-1;;;51107:39:0;;51088:16;;51107:57;;51159:4;;51107:47;;51151:2;;-1:-1:-1;;;;;51114:6:0;;51107:24;;:39;;51140:4;;51107:39;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:57::-;51193:9;;51175:107;;-1:-1:-1;;;51175:107:0;;51088:76;;-1:-1:-1;;;;;;51193:9:0;;51175:53;;:107;;51088:76;;51193:9;;51242:19;;51271:4;;51278:3;;51175:107;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;51175:107:0;;;;;;;;;;;;:::i;:::-;-1:-1:-1;51322:6:0;;51315:39;;-1:-1:-1;;;51315:39:0;;51295:17;;-1:-1:-1;;;;;51322:6:0;;51315:24;;:39;;51348:4;;51315:39;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;51295:59;;51367:21;51391:35;45163:4;51391:22;51405:7;;51391:9;:13;;:22;;;;:::i;:35::-;51444:6;;51367:59;;-1:-1:-1;51437:60:0;;-1:-1:-1;;;;;51444:6:0;51465:16;51367:59;51437:27;:60::i;:::-;51510:22;51535:36;45163:4;51535:23;51549:8;;51535:9;:13;;:23;;;;:::i;:36::-;51610:17;;51589:6;;51510:61;;-1:-1:-1;51582:62:0;;-1:-1:-1;;;;;51589:6:0;;;;51610:17;51510:61;51582:27;:62::i;:::-;51657:27;51687:42;45163:4;51687:29;:9;45122:3;51687:13;:29::i;:42::-;51768:10;;51747:6;;51657:72;;-1:-1:-1;51740:60:0;;-1:-1:-1;;;;;51747:6:0;;;;51768:10;51657:72;51740:27;:60::i;:::-;51818:63;51830:13;51845:14;51861:19;51818:63;;;;;;;;:::i;:::-;;;;;;;;50308:1581;;;;;;:::o;51952:711::-;52024:6;;52017:39;;-1:-1:-1;;;52017:39:0;;51996:18;;52017:46;;52061:1;;-1:-1:-1;;;;;52024:6:0;;52017:24;;:39;;52050:4;;52017:39;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:46::-;52092:6;;52080:8;;51996:67;;-1:-1:-1;;;;;;52080:8:0;;;52092:6;;52080:18;52076:157;;52133:9;;52115:106;;-1:-1:-1;;;52115:106:0;;-1:-1:-1;;;;;52133:9:0;;;;52115:53;;:106;;52169:10;;52133:9;;52184:16;;52210:4;;52217:3;;52115:106;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;52115:106:0;;;;;;;;;;;;:::i;:::-;;52076:157;52261:6;;52249:8;;-1:-1:-1;;;;;52249:8:0;;;52261:6;;52249:18;52245:157;;52302:9;;52284:106;;-1:-1:-1;;;52284:106:0;;-1:-1:-1;;;;;52302:9:0;;;;52284:53;;:106;;52338:10;;52302:9;;52353:16;;52379:4;;52386:3;;52284:106;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;52284:106:0;;;;;;;;;;;;:::i;:::-;;52245:157;52438:8;;52431:41;;-1:-1:-1;;;52431:41:0;;52414:14;;-1:-1:-1;;;;;52438:8:0;;52431:26;;:41;;52466:4;;52431:41;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;52507:8;;52500:41;;-1:-1:-1;;;52500:41:0;;52414:58;;-1:-1:-1;52483:14:0;;-1:-1:-1;;;;;52507:8:0;;;;52500:26;;:41;;52535:4;;52500:41;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;52570:9;;52594:8;;52604;;52552:103;;-1:-1:-1;;;52552:103:0;;52483:58;;-1:-1:-1;;;;;;52570:9:0;;;;52552:41;;:103;;52594:8;;;52604;;52614:6;;52483:58;;52570:9;;;;52644:4;;52651:3;;52552:103;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;51952:711;;;:::o;23103:422::-;23470:20;23509:8;;;23103:422::o;29613:742::-;29728:12;29757:7;29753:595;;;-1:-1:-1;29788:10:0;29781:17;;29753:595;29902:17;;:21;29898:439;;30165:10;30159:17;30226:15;30213:10;30209:2;30205:19;30198:44;30113:148;30308:12;30301:20;;-1:-1:-1;;;30301:20:0;;;;;;;;:::i;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:130;72:20;;97:33;72:20;97:33;:::i;1781:716::-;;1919:3;1912:4;1904:6;1900:17;1896:27;1886:2;;-1:-1;;1927:12;1886:2;1967:6;1961:13;1989:90;2004:74;2071:6;2004:74;:::i;:::-;1989:90;:::i;:::-;2107:21;;;1980:99;-1:-1;2151:4;2164:14;;;;2139:17;;;2259:1;2244:247;2269:6;2266:1;2263:13;2244:247;;;2345:3;2339:10;2143:6;2327:23;3633:3;3614:17;2327:23;3614:17;3610:27;3600:2;;2259:1;;3641:12;3600:2;2151:4;2327:23;;3675:13;3703:65;3718:49;3760:6;3718:49;:::i;3703:65::-;3788:6;3781:5;3774:21;3812:17;3892:3;3812:17;3883:6;2327:23;3874:16;;3871:25;3868:2;;;2259:1;;3899:12;3868:2;3919:39;3951:6;2151:4;3850:5;3846:16;3812:17;2327:23;3812:17;3919:39;:::i;:::-;-1:-1;2357:71;;-1:-1;;2442:14;;;;2470;;;;2291:1;2284:9;2244:247;;;2248:14;;;;;1879:618;;;;:::o;2523:722::-;;2651:3;2644:4;2636:6;2632:17;2628:27;2618:2;;-1:-1;;2659:12;2618:2;2699:6;2693:13;2721:80;2736:64;2793:6;2736:64;:::i;2721:80::-;2829:21;;;2712:89;-1:-1;2873:4;2886:14;;;;2861:17;;;2975;;;2966:27;;;;2963:36;-1:-1;2960:2;;;3012:1;;3002:12;2960:2;3037:1;3022:217;3047:6;3044:1;3041:13;3022:217;;;4187:13;;3115:61;;3190:14;;;;3218;;;;3069:1;3062:9;3022:217;;4250:241;;4354:2;4342:9;4333:7;4329:23;4325:32;4322:2;;;-1:-1;;4360:12;4322:2;85:6;72:20;97:33;124:5;97:33;:::i;4498:377::-;;4627:2;;4615:9;4606:7;4602:23;4598:32;4595:2;;;-1:-1;;4633:12;4595:2;4691:17;4678:31;4729:18;4721:6;4718:30;4715:2;;;-1:-1;;4751:12;4715:2;4827:22;;411:4;399:17;;395:27;-1:-1;385:2;;-1:-1;;426:12;385:2;473:6;460:20;495:80;510:64;567:6;510:64;:::i;495:80::-;603:21;;;660:14;;;;635:17;;;749;;;740:27;;;;737:36;-1:-1;734:2;;;-1:-1;;776:12;734:2;-1:-1;802:10;;796:206;821:6;818:1;815:13;796:206;;;901:37;934:3;922:10;901:37;:::i;:::-;889:50;;843:1;836:9;;;;;953:14;;;;981;;796:206;;;-1:-1;4771:88;4589:286;-1:-1;;;;;;;4589:286::o;4882:1208::-;;;;;5158:3;5146:9;5137:7;5133:23;5129:33;5126:2;;;-1:-1;;5165:12;5126:2;5216:17;5210:24;5254:18;;5246:6;5243:30;5240:2;;;-1:-1;;5276:12;5240:2;5378:6;5367:9;5363:22;;;1162:3;1155:4;1147:6;1143:17;1139:27;1129:2;;-1:-1;;1170:12;1129:2;1210:6;1204:13;1232:80;1247:64;1304:6;1247:64;:::i;1232:80::-;1318:16;1354:6;1347:5;1340:21;1384:4;;1401:3;1397:14;1390:21;;1384:4;1376:6;1372:17;1506:3;1384:4;;1490:6;1486:17;1376:6;1477:27;;1474:36;1471:2;;;-1:-1;;1513:12;1471:2;-1:-1;1539:10;;1533:217;1558:6;1555:1;1552:13;1533:217;;;226:6;220:13;238:33;265:5;238:33;:::i;:::-;1626:61;;1580:1;1573:9;;;;;1701:14;;;;1729;;1533:217;;;-1:-1;5438:18;;5432:25;5296:99;;-1:-1;5432:25;-1:-1;;;5466:30;;;5463:2;;;-1:-1;;5499:12;5463:2;5529:99;5620:7;5611:6;5600:9;5596:22;5529:99;:::i;:::-;5519:109;;5686:2;5675:9;5671:18;5665:25;5651:39;;5254:18;5702:6;5699:30;5696:2;;;-1:-1;;5732:12;5696:2;5762:89;5843:7;5834:6;5823:9;5819:22;5762:89;:::i;:::-;5752:99;;5909:2;5898:9;5894:18;5888:25;5874:39;;5254:18;5925:6;5922:30;5919:2;;;-1:-1;;5955:12;5919:2;;5985:89;6066:7;6057:6;6046:9;6042:22;5985:89;:::i;:::-;5975:99;;;5120:970;;;;;;;:::o;6097:392::-;;6237:2;6225:9;6216:7;6212:23;6208:32;6205:2;;;-1:-1;;6243:12;6205:2;6294:17;6288:24;6332:18;6324:6;6321:30;6318:2;;;-1:-1;;6354:12;6318:2;6384:89;6465:7;6456:6;6445:9;6441:22;6384:89;:::i;:::-;6374:99;6199:290;-1:-1;;;;6199:290::o;6496:235::-;;6597:2;6585:9;6576:7;6572:23;6568:32;6565:2;;;-1:-1;;6603:12;6565:2;3330:6;3317:20;3342:30;3366:5;3342:30;:::i;6738:257::-;;6850:2;6838:9;6829:7;6825:23;6821:32;6818:2;;;-1:-1;;6856:12;6818:2;3465:6;3459:13;3477:30;3501:5;3477:30;:::i;7002:241::-;;7106:2;7094:9;7085:7;7081:23;7077:32;7074:2;;;-1:-1;;7112:12;7074:2;-1:-1;4039:20;;7068:175;-1:-1;7068:175::o;7250:263::-;;7365:2;7353:9;7344:7;7340:23;7336:32;7333:2;;;-1:-1;;7371:12;7333:2;-1:-1;4187:13;;7327:186;-1:-1;7327:186::o;7520:366::-;;;7641:2;7629:9;7620:7;7616:23;7612:32;7609:2;;;-1:-1;;7647:12;7609:2;-1:-1;;4039:20;;;7799:2;7838:22;;;4039:20;;-1:-1;7603:283::o;7893:535::-;;;;8042:2;8030:9;8021:7;8017:23;8013:32;8010:2;;;-1:-1;;8048:12;8010:2;4193:6;4187:13;8100:74;;8211:2;8265:9;8261:22;4187:13;8219:74;;8330:2;8384:9;8380:22;4187:13;8338:74;;8004:424;;;;;:::o;8435:672::-;;;;;8601:3;8589:9;8580:7;8576:23;8572:33;8569:2;;;-1:-1;;8608:12;8569:2;-1:-1;;4187:13;;8771:2;8821:22;;4187:13;8890:2;8940:22;;4187:13;9009:2;9059:22;;;4187:13;;;;;-1:-1;4187:13;;-1:-1;8563:544;-1:-1;8563:544::o;10150:670::-;;10333:5;37684:12;39046:6;39041:3;39034:19;39083:4;;39078:3;39074:14;10345:83;;39083:4;10499:5;37017:14;-1:-1;10538:260;10563:6;10560:1;10557:13;10538:260;;;10624:13;;-1:-1;;;;;40088:54;9950:37;;9268:14;;;;38532;;;;4729:18;10578:9;10538:260;;;-1:-1;10804:10;;10264:556;-1:-1;;;;;10264:556::o;11588:709::-;;11775:5;37831:12;39046:6;39041:3;39034:19;39083:4;;39078:3;39074:14;11787:93;;37180:3;-1:-1;37170:14;39083:4;-1:-1;37199:18;-1:-1;11987:288;12012:6;12009:1;12006:13;11987:288;;;41742:11;;-1:-1;;;;;40088:54;9950:37;;9268:14;;;;4729:18;38644:14;;;;12027:9;11987:288;;21021:271;;14396:5;37684:12;14507:52;14552:6;14547:3;14540:4;14533:5;14529:16;14507:52;:::i;:::-;14571:16;;;;;21155:137;-1:-1;;21155:137::o;21299:222::-;-1:-1;;;;;40088:54;;;;9950:37;;21426:2;21411:18;;21397:124::o;21773:333::-;-1:-1;;;;;40088:54;;;9950:37;;40088:54;;22092:2;22077:18;;9950:37;21928:2;21913:18;;21899:207::o;22113:1052::-;-1:-1;;;;;40088:54;;;9950:37;;40088:54;;;22625:2;22610:18;;9950:37;22708:2;22693:18;;20852:37;;;;22791:2;22776:18;;20852:37;;;;22882:3;22867:19;;14678:58;;;;40099:42;22959:19;;14678:58;40088:54;;;23066:3;23051:19;;9819:58;23150:3;23135:19;;20852:37;;;;22460:3;22445:19;;22431:734::o;23172:333::-;-1:-1;;;;;40088:54;;;;9950:37;;23491:2;23476:18;;20852:37;23327:2;23312:18;;23298:207::o;23512:370::-;;23689:2;23710:17;23703:47;23764:108;23689:2;23678:9;23674:18;23858:6;23764:108;:::i;23889:629::-;;24144:2;24165:17;24158:47;24219:108;24144:2;24133:9;24129:18;24313:6;24219:108;:::i;:::-;24365:20;;;24360:2;24345:18;;;24338:48;;;;37684:12;;39034:19;;;37017:14;;;;39074;;;-1:-1;13835:260;13860:6;13857:1;13854:13;13835:260;;;13921:13;;20852:37;;38532:14;;;;9712;;;;13882:1;13875:9;13835:260;;;-1:-1;24392:116;;24115:403;-1:-1;;;;;;;24115:403::o;24525:470::-;;24752:2;;24741:9;24737:18;24752:2;24773:17;24766:47;24827:158;12608:5;37684:12;39046:6;39041:3;39034:19;39074:14;24741:9;39074:14;12620:118;;39074:14;24752:2;12795:6;12791:17;24741:9;12782:27;;12770:39;;24752:2;12905:5;37017:14;-1:-1;12944:405;12969:6;12966:1;12963:13;12944:405;;;13021:20;;24741:9;13025:4;13021:20;;13016:3;13009:33;9448:96;9540:3;13076:6;13070:13;9448:96;:::i;:::-;13090:122;-1:-1;13328:14;;;;38532;;;;12991:1;12984:9;12944:405;;;-1:-1;24819:166;;24723:272;-1:-1;;;;;;;24723:272::o;25002:210::-;40318:13;;40311:21;14190:34;;25123:2;25108:18;;25094:118::o;25219:310::-;;25366:2;25387:17;25380:47;15042:5;37684:12;39046:6;25366:2;25355:9;25351:18;39034:19;15136:52;15181:6;39074:14;25355:9;39074:14;25366:2;15162:5;15158:16;15136:52;:::i;:::-;41850:7;41834:14;-1:-1;;41830:28;15200:39;;;;39074:14;15200:39;;25337:192;-1:-1;;25337:192::o;25536:416::-;25736:2;25750:47;;;15476:2;25721:18;;;39034:19;-1:-1;;;39074:14;;;15492:43;15554:12;;;25707:245::o;25959:416::-;26159:2;26173:47;;;15805:2;26144:18;;;39034:19;-1:-1;;;39074:14;;;15821:34;15874:12;;;26130:245::o;26382:416::-;26582:2;26596:47;;;16125:2;26567:18;;;39034:19;16161:34;39074:14;;;16141:55;-1:-1;;;16216:12;;;16209:30;16258:12;;;26553:245::o;26805:416::-;27005:2;27019:47;;;16509:2;26990:18;;;39034:19;16545:29;39074:14;;;16525:50;16594:12;;;26976:245::o;27228:416::-;27428:2;27442:47;;;16845:2;27413:18;;;39034:19;16881:32;39074:14;;;16861:53;16933:12;;;27399:245::o;27651:416::-;27851:2;27865:47;;;17184:2;27836:18;;;39034:19;17220:34;39074:14;;;17200:55;-1:-1;;;17275:12;;;17268:30;17317:12;;;27822:245::o;28074:416::-;28274:2;28288:47;;;17568:2;28259:18;;;39034:19;17604:28;39074:14;;;17584:49;17652:12;;;28245:245::o;28497:416::-;28697:2;28711:47;;;17903:2;28682:18;;;39034:19;-1:-1;;;39074:14;;;17919:39;17977:12;;;28668:245::o;28920:416::-;29120:2;29134:47;;;18228:1;29105:18;;;39034:19;-1:-1;;;39074:14;;;18243:27;18289:12;;;29091:245::o;29343:416::-;29543:2;29557:47;;;18540:2;29528:18;;;39034:19;18576:34;39074:14;;;18556:55;-1:-1;;;18631:12;;;18624:25;18668:12;;;29514:245::o;29766:416::-;29966:2;29980:47;;;18919:1;29951:18;;;39034:19;-1:-1;;;39074:14;;;18934:29;18982:12;;;29937:245::o;30189:416::-;30389:2;30403:47;;;30374:18;;;39034:19;19269:34;39074:14;;;19249:55;19323:12;;;30360:245::o;30612:416::-;30812:2;30826:47;;;19574:2;30797:18;;;39034:19;19610:31;39074:14;;;19590:52;19661:12;;;30783:245::o;31035:416::-;31235:2;31249:47;;;19912:1;31220:18;;;39034:19;-1:-1;;;39074:14;;;19927:31;19977:12;;;31206:245::o;31458:416::-;31658:2;31672:47;;;20228:2;31643:18;;;39034:19;20264:34;39074:14;;;20244:55;-1:-1;;;20319:12;;;20312:34;20365:12;;;31629:245::o;31881:416::-;32081:2;32095:47;;;20616:2;32066:18;;;39034:19;20652:34;39074:14;;;20632:55;-1:-1;;;20707:12;;;20700:46;20765:12;;;32052:245::o;32304:222::-;20852:37;;;32431:2;32416:18;;32402:124::o;32533:349::-;20852:37;;;-1:-1;;;;;40088:54;32868:2;32853:18;;9819:58;32696:2;32681:18;;32667:215::o;32889:475::-;;20882:5;20859:3;20852:37;33091:2;33209;33198:9;33194:18;33187:48;33249:105;33091:2;33080:9;33076:18;33340:6;33249:105;:::i;33371:349::-;20852:37;;;33706:2;33691:18;;14678:58;33534:2;33519:18;;33505:215::o;33727:842::-;;20882:5;20859:3;20852:37;40774:24;34202:2;34191:9;34187:18;14678:58;34029:3;34239:2;34228:9;34224:18;34217:48;34279:105;34029:3;34018:9;34014:19;34370:6;34279:105;:::i;:::-;-1:-1;;;;;40088:54;;;;34471:2;34456:18;;9819:58;-1:-1;34554:3;34539:19;20852:37;34271:113;34000:569;-1:-1;;;34000:569::o;34916:444::-;20852:37;;;35263:2;35248:18;;20852:37;;;;35346:2;35331:18;;20852:37;35099:2;35084:18;;35070:290::o;35367:256::-;35429:2;35423:9;35455:17;;;35530:18;35515:34;;35551:22;;;35512:62;35509:2;;;35587:1;;35577:12;35509:2;35429;35596:22;35407:216;;-1:-1;35407:216::o;35630:304::-;;35789:18;35781:6;35778:30;35775:2;;;-1:-1;;35811:12;35775:2;-1:-1;35856:4;35844:17;;;35909:15;;35712:222::o;36573:322::-;;36717:18;36709:6;36706:30;36703:2;;;-1:-1;;36739:12;36703:2;-1:-1;41850:7;36793:17;-1:-1;;36789:33;36880:4;36870:15;;36640:255::o;41177:268::-;41242:1;41249:101;41263:6;41260:1;41257:13;41249:101;;;41330:11;;;41324:18;41311:11;;;41304:39;41285:2;41278:10;41249:101;;;41365:6;41362:1;41359:13;41356:2;;;-1:-1;;41242:1;41412:16;;41405:27;41226:219::o;41981:117::-;-1:-1;;;;;40088:54;;42040:35;;42030:2;;42089:1;;42079:12;42105:111;42186:5;40318:13;40311:21;42164:5;42161:32;42151:2;;42207:1;;42197:12
Swarm Source
ipfs://38112e5965fdbaa9a4e75d9eb8a13453cccbd62e2b7bbb10d9f695a9b6d51884
Loading...
Loading
Loading...
Loading
Loading...
Loading
Net Worth in USD
$750.07
Net Worth in GLMR
Token Allocations
WETH
100.00%
Multichain Portfolio | 35 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|---|---|---|---|---|
| ETH | 100.00% | $2,928.45 | 0.2561 | $750.07 |
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.