Source Code
| Transaction Hash |
|
Block
|
From
|
To
|
|||||
|---|---|---|---|---|---|---|---|---|---|
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Cross-Chain Transactions
Loading...
Loading
Contract Name:
StrategyCurveConvexFraxtalFactory
Compiler Version
v0.8.23+commit.f704f362
Contract Source Code (Solidity)
/**
*Submitted for verification at fraxscan.com on 2025-05-06
*/
// SPDX-License-Identifier: MIT
// File: contracts/BIFI/interfaces/common/IWrappedNative.sol
pragma solidity >=0.6.0 <0.9.0;
interface IWrappedNative {
function deposit() external payable;
function withdraw(uint256 wad) external;
}
// File: contracts/BIFI/interfaces/convex/IConvex.sol
pragma solidity >=0.6.0 <0.9.0;
interface IConvexBooster {
function deposit(uint256 pid, uint256 amount, bool stake) external returns (bool);
function earmarkRewards(uint256 _pid) external;
function poolInfo(uint256 pid) external view returns (
address lptoken,
address token,
address gauge,
address crvRewards,
address stash,
bool shutdown
);
}
interface IConvexBoosterL2 {
function deposit(uint256 _pid, uint256 _amount) external returns (bool);
function poolInfo(uint256 pid) external view returns (
address lptoken, //the curve lp token
address gauge, //the curve gauge
address rewards, //the main reward/staking contract
bool shutdown, //is this pool shutdown?
address factory //a reference to the curve factory used to create this pool (needed for minting crv)
);
}
interface IConvexRewardPool {
function balanceOf(address account) external view returns (uint256);
function earned(address account) external view returns (uint256);
function periodFinish() external view returns (uint256);
function getReward() external;
function getReward(address _account, bool _claimExtras) external;
function getReward(address _account) external;
function withdrawAndUnwrap(uint256 _amount, bool claim) external;
function withdrawAllAndUnwrap(bool claim) external;
// L2 interface
function withdraw(uint256 _amount, bool _claim) external;
function emergencyWithdraw(uint256 _amount) external;
}
// File: contracts/BIFI/interfaces/curve/ICrvMinter.sol
pragma solidity >=0.6.0;
interface ICrvMinter {
function mint(address _gauge) external;
}
// File: contracts/BIFI/interfaces/curve/IRewardsGauge.sol
pragma solidity >=0.6.0 <0.9.0;
interface IRewardsGauge {
function balanceOf(address account) external view returns (uint256);
function claimable_reward(address _addr, address _token) external view returns (uint256);
function claim_rewards(address _addr) external;
function deposit(uint256 _value) external;
function withdraw(uint256 _value) external;
function reward_contract() external view returns (address);
function bal_pseudo_minter() external view returns (address);
}
// File: @openzeppelin/contracts-upgradeable/utils/AddressUpgradeable.sol
// OpenZeppelin Contracts (last updated v4.9.0) (utils/Address.sol)
pragma solidity ^0.8.1;
/**
* @dev Collection of functions related to the address type
*/
library AddressUpgradeable {
/**
* @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
*
* Furthermore, `isContract` will also return true if the target contract within
* the same transaction is already scheduled for destruction by `SELFDESTRUCT`,
* which only has an effect at the end of a transaction.
* ====
*
* [IMPORTANT]
* ====
* You shouldn't rely on `isContract` to protect against flash loan attacks!
*
* Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets
* like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract
* constructor.
* ====
*/
function isContract(address account) internal view returns (bool) {
// This method relies on extcodesize/address.code.length, which returns 0
// for contracts in construction, since the code is only stored at the end
// of the constructor execution.
return account.code.length > 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://consensys.net/diligence/blog/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.8.0/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");
(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 functionCallWithValue(target, data, 0, "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");
(bool success, bytes memory returndata) = target.call{value: value}(data);
return verifyCallResultFromTarget(target, 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) {
(bool success, bytes memory returndata) = target.staticcall(data);
return verifyCallResultFromTarget(target, 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) {
(bool success, bytes memory returndata) = target.delegatecall(data);
return verifyCallResultFromTarget(target, success, returndata, errorMessage);
}
/**
* @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling
* the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract.
*
* _Available since v4.8._
*/
function verifyCallResultFromTarget(
address target,
bool success,
bytes memory returndata,
string memory errorMessage
) internal view returns (bytes memory) {
if (success) {
if (returndata.length == 0) {
// only check isContract if the call was successful and the return data is empty
// otherwise we already know that it was a contract
require(isContract(target), "Address: call to non-contract");
}
return returndata;
} else {
_revert(returndata, errorMessage);
}
}
/**
* @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the
* revert reason or using the provided one.
*
* _Available since v4.3._
*/
function verifyCallResult(
bool success,
bytes memory returndata,
string memory errorMessage
) internal pure returns (bytes memory) {
if (success) {
return returndata;
} else {
_revert(returndata, errorMessage);
}
}
function _revert(bytes memory returndata, string memory errorMessage) private pure {
// 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
/// @solidity memory-safe-assembly
assembly {
let returndata_size := mload(returndata)
revert(add(32, returndata), returndata_size)
}
} else {
revert(errorMessage);
}
}
}
// File: @openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol
// OpenZeppelin Contracts (last updated v4.9.0) (proxy/utils/Initializable.sol)
pragma solidity ^0.8.2;
/**
* @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed
* behind a proxy. Since proxied contracts do not make use of a constructor, it's common to move constructor logic to an
* external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer
* function so it can only be called once. The {initializer} modifier provided by this contract will have this effect.
*
* The initialization functions use a version number. Once a version number is used, it is consumed and cannot be
* reused. This mechanism prevents re-execution of each "step" but allows the creation of new initialization steps in
* case an upgrade adds a module that needs to be initialized.
*
* For example:
*
* [.hljs-theme-light.nopadding]
* ```solidity
* contract MyToken is ERC20Upgradeable {
* function initialize() initializer public {
* __ERC20_init("MyToken", "MTK");
* }
* }
*
* contract MyTokenV2 is MyToken, ERC20PermitUpgradeable {
* function initializeV2() reinitializer(2) public {
* __ERC20Permit_init("MyToken");
* }
* }
* ```
*
* TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as
* possible by providing the encoded function call as the `_data` argument to {ERC1967Proxy-constructor}.
*
* CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure
* that all initializers are idempotent. This is not verified automatically as constructors are by Solidity.
*
* [CAUTION]
* ====
* Avoid leaving a contract uninitialized.
*
* An uninitialized contract can be taken over by an attacker. This applies to both a proxy and its implementation
* contract, which may impact the proxy. To prevent the implementation contract from being used, you should invoke
* the {_disableInitializers} function in the constructor to automatically lock it when it is deployed:
*
* [.hljs-theme-light.nopadding]
* ```
* /// @custom:oz-upgrades-unsafe-allow constructor
* constructor() {
* _disableInitializers();
* }
* ```
* ====
*/
abstract contract Initializable {
/**
* @dev Indicates that the contract has been initialized.
* @custom:oz-retyped-from bool
*/
uint8 private _initialized;
/**
* @dev Indicates that the contract is in the process of being initialized.
*/
bool private _initializing;
/**
* @dev Triggered when the contract has been initialized or reinitialized.
*/
event Initialized(uint8 version);
/**
* @dev A modifier that defines a protected initializer function that can be invoked at most once. In its scope,
* `onlyInitializing` functions can be used to initialize parent contracts.
*
* Similar to `reinitializer(1)`, except that functions marked with `initializer` can be nested in the context of a
* constructor.
*
* Emits an {Initialized} event.
*/
modifier initializer() {
bool isTopLevelCall = !_initializing;
require(
(isTopLevelCall && _initialized < 1) || (!AddressUpgradeable.isContract(address(this)) && _initialized == 1),
"Initializable: contract is already initialized"
);
_initialized = 1;
if (isTopLevelCall) {
_initializing = true;
}
_;
if (isTopLevelCall) {
_initializing = false;
emit Initialized(1);
}
}
/**
* @dev A modifier that defines a protected reinitializer function that can be invoked at most once, and only if the
* contract hasn't been initialized to a greater version before. In its scope, `onlyInitializing` functions can be
* used to initialize parent contracts.
*
* A reinitializer may be used after the original initialization step. This is essential to configure modules that
* are added through upgrades and that require initialization.
*
* When `version` is 1, this modifier is similar to `initializer`, except that functions marked with `reinitializer`
* cannot be nested. If one is invoked in the context of another, execution will revert.
*
* Note that versions can jump in increments greater than 1; this implies that if multiple reinitializers coexist in
* a contract, executing them in the right order is up to the developer or operator.
*
* WARNING: setting the version to 255 will prevent any future reinitialization.
*
* Emits an {Initialized} event.
*/
modifier reinitializer(uint8 version) {
require(!_initializing && _initialized < version, "Initializable: contract is already initialized");
_initialized = version;
_initializing = true;
_;
_initializing = false;
emit Initialized(version);
}
/**
* @dev Modifier to protect an initialization function so that it can only be invoked by functions with the
* {initializer} and {reinitializer} modifiers, directly or indirectly.
*/
modifier onlyInitializing() {
require(_initializing, "Initializable: contract is not initializing");
_;
}
/**
* @dev Locks the contract, preventing any future reinitialization. This cannot be part of an initializer call.
* Calling this in the constructor of a contract will prevent that contract from being initialized or reinitialized
* to any version. It is recommended to use this to lock implementation contracts that are designed to be called
* through proxies.
*
* Emits an {Initialized} event the first time it is successfully executed.
*/
function _disableInitializers() internal virtual {
require(!_initializing, "Initializable: contract is initializing");
if (_initialized != type(uint8).max) {
_initialized = type(uint8).max;
emit Initialized(type(uint8).max);
}
}
/**
* @dev Returns the highest version that has been initialized. See {reinitializer}.
*/
function _getInitializedVersion() internal view returns (uint8) {
return _initialized;
}
/**
* @dev Returns `true` if the contract is currently initializing. See {onlyInitializing}.
*/
function _isInitializing() internal view returns (bool) {
return _initializing;
}
}
// File: @openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol
// OpenZeppelin Contracts (last updated v4.9.4) (utils/Context.sol)
pragma solidity ^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 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 ContextUpgradeable is Initializable {
function __Context_init() internal onlyInitializing {
}
function __Context_init_unchained() internal onlyInitializing {
}
function _msgSender() internal view virtual returns (address) {
return msg.sender;
}
function _msgData() internal view virtual returns (bytes calldata) {
return msg.data;
}
function _contextSuffixLength() internal view virtual returns (uint256) {
return 0;
}
/**
* @dev This empty reserved space is put in place to allow future versions to add new
* variables without shifting down storage in the inheritance chain.
* See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps
*/
uint256[50] private __gap;
}
// File: @openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol
// OpenZeppelin Contracts (last updated v4.9.0) (access/Ownable.sol)
pragma solidity ^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 OwnableUpgradeable is Initializable, ContextUpgradeable {
address private _owner;
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
/**
* @dev Initializes the contract setting the deployer as the initial owner.
*/
function __Ownable_init() internal onlyInitializing {
__Ownable_init_unchained();
}
function __Ownable_init_unchained() internal onlyInitializing {
_transferOwnership(_msgSender());
}
/**
* @dev Throws if called by any account other than the owner.
*/
modifier onlyOwner() {
_checkOwner();
_;
}
/**
* @dev Returns the address of the current owner.
*/
function owner() public view virtual returns (address) {
return _owner;
}
/**
* @dev Throws if the sender is not the owner.
*/
function _checkOwner() internal view virtual {
require(owner() == _msgSender(), "Ownable: caller is not the owner");
}
/**
* @dev Leaves the contract without owner. It will not be possible to call
* `onlyOwner` functions. Can only be called by the current owner.
*
* NOTE: Renouncing ownership will leave the contract without an owner,
* thereby disabling any functionality that is only available to the owner.
*/
function renounceOwnership() public virtual onlyOwner {
_transferOwnership(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");
_transferOwnership(newOwner);
}
/**
* @dev Transfers ownership of the contract to a new account (`newOwner`).
* Internal function without access restriction.
*/
function _transferOwnership(address newOwner) internal virtual {
address oldOwner = _owner;
_owner = newOwner;
emit OwnershipTransferred(oldOwner, newOwner);
}
/**
* @dev This empty reserved space is put in place to allow future versions to add new
* variables without shifting down storage in the inheritance chain.
* See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps
*/
uint256[49] private __gap;
}
// File: @openzeppelin/contracts-upgradeable/security/PausableUpgradeable.sol
// OpenZeppelin Contracts (last updated v4.7.0) (security/Pausable.sol)
pragma solidity ^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 PausableUpgradeable is Initializable, ContextUpgradeable {
/**
* @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.
*/
function __Pausable_init() internal onlyInitializing {
__Pausable_init_unchained();
}
function __Pausable_init_unchained() internal onlyInitializing {
_paused = false;
}
/**
* @dev Modifier to make a function callable only when the contract is not paused.
*
* Requirements:
*
* - The contract must not be paused.
*/
modifier whenNotPaused() {
_requireNotPaused();
_;
}
/**
* @dev Modifier to make a function callable only when the contract is paused.
*
* Requirements:
*
* - The contract must be paused.
*/
modifier whenPaused() {
_requirePaused();
_;
}
/**
* @dev Returns true if the contract is paused, and false otherwise.
*/
function paused() public view virtual returns (bool) {
return _paused;
}
/**
* @dev Throws if the contract is paused.
*/
function _requireNotPaused() internal view virtual {
require(!paused(), "Pausable: paused");
}
/**
* @dev Throws if the contract is not paused.
*/
function _requirePaused() internal view virtual {
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());
}
/**
* @dev This empty reserved space is put in place to allow future versions to add new
* variables without shifting down storage in the inheritance chain.
* See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps
*/
uint256[49] private __gap;
}
// File: @openzeppelin-5/contracts/token/ERC20/IERC20.sol
// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/IERC20.sol)
pragma solidity ^0.8.20;
/**
* @dev Interface of the ERC20 standard as defined in the EIP.
*/
interface IERC20 {
/**
* @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);
/**
* @dev Returns the value of tokens in existence.
*/
function totalSupply() external view returns (uint256);
/**
* @dev Returns the value of tokens owned by `account`.
*/
function balanceOf(address account) external view returns (uint256);
/**
* @dev Moves a `value` amount of tokens from the caller's account to `to`.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* Emits a {Transfer} event.
*/
function transfer(address to, uint256 value) 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 a `value` amount of tokens 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 value) external returns (bool);
/**
* @dev Moves a `value` amount of tokens from `from` to `to` using the
* allowance mechanism. `value` is then deducted from the caller's
* allowance.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* Emits a {Transfer} event.
*/
function transferFrom(address from, address to, uint256 value) external returns (bool);
}
// File: @openzeppelin-5/contracts/token/ERC20/extensions/IERC20Permit.sol
// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/extensions/IERC20Permit.sol)
pragma solidity ^0.8.20;
/**
* @dev Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in
* https://eips.ethereum.org/EIPS/eip-2612[EIP-2612].
*
* Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by
* presenting a message signed by the account. By not relying on {IERC20-approve}, the token holder account doesn't
* need to send a transaction, and thus is not required to hold Ether at all.
*
* ==== Security Considerations
*
* There are two important considerations concerning the use of `permit`. The first is that a valid permit signature
* expresses an allowance, and it should not be assumed to convey additional meaning. In particular, it should not be
* considered as an intention to spend the allowance in any specific way. The second is that because permits have
* built-in replay protection and can be submitted by anyone, they can be frontrun. A protocol that uses permits should
* take this into consideration and allow a `permit` call to fail. Combining these two aspects, a pattern that may be
* generally recommended is:
*
* ```solidity
* function doThingWithPermit(..., uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s) public {
* try token.permit(msg.sender, address(this), value, deadline, v, r, s) {} catch {}
* doThing(..., value);
* }
*
* function doThing(..., uint256 value) public {
* token.safeTransferFrom(msg.sender, address(this), value);
* ...
* }
* ```
*
* Observe that: 1) `msg.sender` is used as the owner, leaving no ambiguity as to the signer intent, and 2) the use of
* `try/catch` allows the permit to fail and makes the code tolerant to frontrunning. (See also
* {SafeERC20-safeTransferFrom}).
*
* Additionally, note that smart contract wallets (such as Argent or Safe) are not able to produce permit signatures, so
* contracts should have entry points that don't rely on permit.
*/
interface IERC20Permit {
/**
* @dev Sets `value` as the allowance of `spender` over ``owner``'s tokens,
* given ``owner``'s signed approval.
*
* IMPORTANT: The same issues {IERC20-approve} has related to transaction
* ordering also apply here.
*
* Emits an {Approval} event.
*
* Requirements:
*
* - `spender` cannot be the zero address.
* - `deadline` must be a timestamp in the future.
* - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner`
* over the EIP712-formatted function arguments.
* - the signature must use ``owner``'s current nonce (see {nonces}).
*
* For more information on the signature format, see the
* https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP
* section].
*
* CAUTION: See Security Considerations above.
*/
function permit(
address owner,
address spender,
uint256 value,
uint256 deadline,
uint8 v,
bytes32 r,
bytes32 s
) external;
/**
* @dev Returns the current nonce for `owner`. This value must be
* included whenever a signature is generated for {permit}.
*
* Every successful call to {permit} increases ``owner``'s nonce by one. This
* prevents a signature from being used multiple times.
*/
function nonces(address owner) external view returns (uint256);
/**
* @dev Returns the domain separator used in the encoding of the signature for {permit}, as defined by {EIP712}.
*/
// solhint-disable-next-line func-name-mixedcase
function DOMAIN_SEPARATOR() external view returns (bytes32);
}
// File: @openzeppelin-5/contracts/utils/Address.sol
// OpenZeppelin Contracts (last updated v5.0.0) (utils/Address.sol)
pragma solidity ^0.8.20;
/**
* @dev Collection of functions related to the address type
*/
library Address {
/**
* @dev The ETH balance of the account is not enough to perform the operation.
*/
error AddressInsufficientBalance(address account);
/**
* @dev There's no code at `target` (it is not a contract).
*/
error AddressEmptyCode(address target);
/**
* @dev A call to an address target failed. The target may have reverted.
*/
error FailedInnerCall();
/**
* @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://consensys.net/diligence/blog/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.8.20/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
*/
function sendValue(address payable recipient, uint256 amount) internal {
if (address(this).balance < amount) {
revert AddressInsufficientBalance(address(this));
}
(bool success, ) = recipient.call{value: amount}("");
if (!success) {
revert FailedInnerCall();
}
}
/**
* @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 or custom error, it is bubbled
* up by this function (like regular Solidity function calls). However, if
* the call reverted with no returned reason, this function reverts with a
* {FailedInnerCall} error.
*
* 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.
*/
function functionCall(address target, bytes memory data) internal returns (bytes memory) {
return functionCallWithValue(target, data, 0);
}
/**
* @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`.
*/
function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {
if (address(this).balance < value) {
revert AddressInsufficientBalance(address(this));
}
(bool success, bytes memory returndata) = target.call{value: value}(data);
return verifyCallResultFromTarget(target, success, returndata);
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
* but performing a static call.
*/
function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
(bool success, bytes memory returndata) = target.staticcall(data);
return verifyCallResultFromTarget(target, success, returndata);
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
* but performing a delegate call.
*/
function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
(bool success, bytes memory returndata) = target.delegatecall(data);
return verifyCallResultFromTarget(target, success, returndata);
}
/**
* @dev Tool to verify that a low level call to smart-contract was successful, and reverts if the target
* was not a contract or bubbling up the revert reason (falling back to {FailedInnerCall}) in case of an
* unsuccessful call.
*/
function verifyCallResultFromTarget(
address target,
bool success,
bytes memory returndata
) internal view returns (bytes memory) {
if (!success) {
_revert(returndata);
} else {
// only check if target is a contract if the call was successful and the return data is empty
// otherwise we already know that it was a contract
if (returndata.length == 0 && target.code.length == 0) {
revert AddressEmptyCode(target);
}
return returndata;
}
}
/**
* @dev Tool to verify that a low level call was successful, and reverts if it wasn't, either by bubbling the
* revert reason or with a default {FailedInnerCall} error.
*/
function verifyCallResult(bool success, bytes memory returndata) internal pure returns (bytes memory) {
if (!success) {
_revert(returndata);
} else {
return returndata;
}
}
/**
* @dev Reverts with returndata if present. Otherwise reverts with {FailedInnerCall}.
*/
function _revert(bytes memory returndata) private pure {
// 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
/// @solidity memory-safe-assembly
assembly {
let returndata_size := mload(returndata)
revert(add(32, returndata), returndata_size)
}
} else {
revert FailedInnerCall();
}
}
}
// File: @openzeppelin-5/contracts/token/ERC20/utils/SafeERC20.sol
// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/utils/SafeERC20.sol)
pragma solidity ^0.8.20;
/**
* @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 Address for address;
/**
* @dev An operation with an ERC20 token failed.
*/
error SafeERC20FailedOperation(address token);
/**
* @dev Indicates a failed `decreaseAllowance` request.
*/
error SafeERC20FailedDecreaseAllowance(address spender, uint256 currentAllowance, uint256 requestedDecrease);
/**
* @dev Transfer `value` amount of `token` from the calling contract to `to`. If `token` returns no value,
* non-reverting calls are assumed to be successful.
*/
function safeTransfer(IERC20 token, address to, uint256 value) internal {
_callOptionalReturn(token, abi.encodeCall(token.transfer, (to, value)));
}
/**
* @dev Transfer `value` amount of `token` from `from` to `to`, spending the approval given by `from` to the
* calling contract. If `token` returns no value, non-reverting calls are assumed to be successful.
*/
function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal {
_callOptionalReturn(token, abi.encodeCall(token.transferFrom, (from, to, value)));
}
/**
* @dev Increase the calling contract's allowance toward `spender` by `value`. If `token` returns no value,
* non-reverting calls are assumed to be successful.
*/
function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal {
uint256 oldAllowance = token.allowance(address(this), spender);
forceApprove(token, spender, oldAllowance + value);
}
/**
* @dev Decrease the calling contract's allowance toward `spender` by `requestedDecrease`. If `token` returns no
* value, non-reverting calls are assumed to be successful.
*/
function safeDecreaseAllowance(IERC20 token, address spender, uint256 requestedDecrease) internal {
unchecked {
uint256 currentAllowance = token.allowance(address(this), spender);
if (currentAllowance < requestedDecrease) {
revert SafeERC20FailedDecreaseAllowance(spender, currentAllowance, requestedDecrease);
}
forceApprove(token, spender, currentAllowance - requestedDecrease);
}
}
/**
* @dev Set the calling contract's allowance toward `spender` to `value`. If `token` returns no value,
* non-reverting calls are assumed to be successful. Meant to be used with tokens that require the approval
* to be set to zero before setting it to a non-zero value, such as USDT.
*/
function forceApprove(IERC20 token, address spender, uint256 value) internal {
bytes memory approvalCall = abi.encodeCall(token.approve, (spender, value));
if (!_callOptionalReturnBool(token, approvalCall)) {
_callOptionalReturn(token, abi.encodeCall(token.approve, (spender, 0)));
_callOptionalReturn(token, approvalCall);
}
}
/**
* @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);
if (returndata.length != 0 && !abi.decode(returndata, (bool))) {
revert SafeERC20FailedOperation(address(token));
}
}
/**
* @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).
*
* This is a variant of {_callOptionalReturn} that silents catches all reverts and returns a bool instead.
*/
function _callOptionalReturnBool(IERC20 token, bytes memory data) private returns (bool) {
// 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 cannot use {Address-functionCall} here since this should return false
// and not revert is the subcall reverts.
(bool success, bytes memory returndata) = address(token).call(data);
return success && (returndata.length == 0 || abi.decode(returndata, (bool))) && address(token).code.length > 0;
}
}
// File: contracts/BIFI/interfaces/beefy/IBeefySwapper.sol
pragma solidity ^0.8.0;
interface IBeefySwapper {
function swap(
address fromToken,
address toToken,
uint256 amountIn
) external returns (uint256 amountOut);
function swap(
address fromToken,
address toToken,
uint256 amountIn,
uint256 minAmountOut
) external returns (uint256 amountOut);
function getAmountOut(
address _fromToken,
address _toToken,
uint256 _amountIn
) external view returns (uint256 amountOut);
function swapInfo(
address _fromToken,
address _toToken
) external view returns (
address router,
bytes calldata data,
uint256 amountIndex,
uint256 minIndex,
int8 minAmountSign
);
struct SwapInfo {
address router;
bytes data;
uint256 amountIndex;
uint256 minIndex;
int8 minAmountSign;
}
}
interface ISimplifiedSwapInfo {
function swapInfo(address _fromToken, address _toToken) external view returns (address router, bytes calldata data);
}
// File: contracts/BIFI/interfaces/beefy/IStrategyFactory.sol
pragma solidity ^0.8.0;
interface IStrategyFactory {
function createStrategy(string calldata _strategyName) external returns (address);
function native() external view returns (address);
function keeper() external view returns (address);
function beefyFeeRecipient() external view returns (address);
function beefyFeeConfig() external view returns (address);
function globalPause() external view returns (bool);
function strategyPause(string calldata stratName) external view returns (bool);
}
// File: contracts/BIFI/interfaces/common/IFeeConfig.sol
pragma solidity ^0.8.0;
interface IFeeConfig {
struct FeeCategory {
uint256 total;
uint256 beefy;
uint256 call;
uint256 strategist;
string label;
bool active;
}
struct AllFees {
FeeCategory performance;
uint256 deposit;
uint256 withdraw;
}
function getFees(address strategy) external view returns (FeeCategory memory);
function stratFeeId(address strategy) external view returns (uint256);
function setStratFeeId(uint256 feeId) external;
}
// File: contracts/BIFI/strategies/Common/BaseAllToNativeFactoryStrat.sol
pragma solidity ^0.8.20;
abstract contract BaseAllToNativeFactoryStrat is OwnableUpgradeable, PausableUpgradeable {
using SafeERC20 for IERC20;
struct Addresses {
address want;
address depositToken;
address factory;
address vault;
address swapper;
address strategist;
}
address[] public rewards;
mapping(address => uint) public minAmounts; // tokens minimum amount to be swapped
IStrategyFactory public factory;
address public vault;
address public swapper;
address public strategist;
address public want;
address public native;
address public depositToken;
uint256 public lastHarvest;
uint256 public totalLocked;
uint256 public lockDuration;
bool public harvestOnDeposit;
uint256 constant DIVISOR = 1 ether;
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);
event SetVault(address vault);
event SetSwapper(address swapper);
event SetStrategist(address strategist);
error StrategyPaused();
error NotManager();
modifier ifNotPaused() {
if (paused() || factory.globalPause() || factory.strategyPause(stratName())) revert StrategyPaused();
_;
}
modifier onlyManager() {
_checkManager();
_;
}
function _checkManager() internal view {
if (msg.sender != owner() && msg.sender != keeper()) revert NotManager();
}
function __BaseStrategy_init(Addresses memory _addresses, address[] memory _rewards) internal onlyInitializing {
__Ownable_init();
__Pausable_init();
want = _addresses.want;
factory = IStrategyFactory(_addresses.factory);
vault = _addresses.vault;
swapper = _addresses.swapper;
strategist = _addresses.strategist;
native = factory.native();
for (uint i; i < _rewards.length; i++) {
addReward(_rewards[i]);
}
setDepositToken(_addresses.depositToken);
lockDuration = 1 days;
}
function stratName() public view virtual returns (string memory);
function balanceOfPool() public view virtual returns (uint);
function _deposit(uint amount) internal virtual;
function _withdraw(uint amount) internal virtual;
function _emergencyWithdraw() internal virtual;
function _claim() internal virtual;
function _verifyRewardToken(address token) internal view virtual;
// puts the funds to work
function deposit() public ifNotPaused {
uint256 wantBal = balanceOfWant();
if (wantBal > 0) {
_deposit(wantBal);
emit Deposit(balanceOf());
}
}
function withdraw(uint256 _amount) external {
require(msg.sender == vault, "!vault");
uint256 wantBal = balanceOfWant();
if (wantBal < _amount) {
_withdraw(_amount - wantBal);
wantBal = balanceOfWant();
}
if (wantBal > _amount) {
wantBal = _amount;
}
IERC20(want).safeTransfer(vault, wantBal);
emit Withdraw(balanceOf());
}
function beforeDeposit() external virtual {
if (harvestOnDeposit) {
require(msg.sender == vault, "!vault");
_harvest(tx.origin, true);
}
}
function claim() external virtual {
_claim();
}
function harvest() external virtual {
_harvest(tx.origin, false);
}
function harvest(address callFeeRecipient) external virtual {
_harvest(callFeeRecipient, false);
}
// compounds earnings and charges performance fee
function _harvest(address callFeeRecipient, bool onDeposit) internal ifNotPaused {
_claim();
_swapRewardsToNative();
uint256 nativeBal = IERC20(native).balanceOf(address(this));
if (nativeBal > minAmounts[native]) {
_chargeFees(callFeeRecipient);
_swapNativeToWant();
uint256 wantHarvested = balanceOfWant();
totalLocked = wantHarvested + lockedProfit();
lastHarvest = block.timestamp;
if (!onDeposit) {
deposit();
}
emit StratHarvest(msg.sender, wantHarvested, balanceOf());
}
}
function _swapRewardsToNative() internal virtual {
for (uint i; i < rewards.length; ++i) {
address token = rewards[i];
if (token == address(0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE)) {
IWrappedNative(native).deposit{value: address(this).balance}();
} else {
uint amount = IERC20(token).balanceOf(address(this));
if (amount > minAmounts[token]) {
_swap(token, native, amount);
}
}
}
}
// performance fees
function _chargeFees(address callFeeRecipient) internal {
IFeeConfig.FeeCategory memory fees = beefyFeeConfig().getFees(address(this));
uint256 nativeBal = IERC20(native).balanceOf(address(this)) * fees.total / DIVISOR;
uint256 callFeeAmount = nativeBal * fees.call / DIVISOR;
IERC20(native).safeTransfer(callFeeRecipient, callFeeAmount);
uint256 beefyFeeAmount = nativeBal * fees.beefy / DIVISOR;
IERC20(native).safeTransfer(beefyFeeRecipient(), beefyFeeAmount);
uint256 strategistFeeAmount = nativeBal * fees.strategist / DIVISOR;
IERC20(native).safeTransfer(strategist, strategistFeeAmount);
emit ChargedFees(callFeeAmount, beefyFeeAmount, strategistFeeAmount);
}
function _swapNativeToWant() internal virtual {
if (depositToken == address(0)) {
_swap(native, want);
} else {
if (depositToken != native) {
_swap(native, depositToken);
}
_swap(depositToken, want);
}
}
function _swap(address tokenFrom, address tokenTo) internal {
uint bal = IERC20(tokenFrom).balanceOf(address(this));
_swap(tokenFrom, tokenTo, bal);
}
function _swap(address tokenFrom, address tokenTo, uint amount) internal {
if (tokenFrom != tokenTo) {
IERC20(tokenFrom).forceApprove(swapper, amount);
IBeefySwapper(swapper).swap(tokenFrom, tokenTo, amount);
}
}
function rewardsLength() external view returns (uint) {
return rewards.length;
}
function addReward(address _token) public onlyManager {
require(_token != want, "!want");
require(_token != native, "!native");
_verifyRewardToken(_token);
rewards.push(_token);
}
function removeReward(uint i) external onlyManager {
rewards[i] = rewards[rewards.length - 1];
rewards.pop();
}
function resetRewards() external onlyManager {
delete rewards;
}
function setRewardMinAmount(address token, uint minAmount) external onlyManager {
minAmounts[token] = minAmount;
}
function setDepositToken(address token) public onlyManager {
if (token == address(0)) {
depositToken = address(0);
return;
}
require(token != want, "!want");
_verifyRewardToken(token);
depositToken = token;
}
function lockedProfit() public view returns (uint256) {
if (lockDuration == 0) return 0;
uint256 elapsed = block.timestamp - lastHarvest;
uint256 remaining = elapsed < lockDuration ? lockDuration - elapsed : 0;
return totalLocked * remaining / lockDuration;
}
// calculate the total underlaying 'want' held by the strat.
function balanceOf() public view returns (uint256) {
return balanceOfWant() + balanceOfPool() - lockedProfit();
}
// it calculates how much 'want' this contract holds.
function balanceOfWant() public view returns (uint256) {
return IERC20(want).balanceOf(address(this));
}
function setHarvestOnDeposit(bool _harvestOnDeposit) public onlyManager {
harvestOnDeposit = _harvestOnDeposit;
if (harvestOnDeposit) {
lockDuration = 0;
} else {
lockDuration = 1 days;
}
}
function setLockDuration(uint _duration) external onlyManager {
lockDuration = _duration;
}
function rewardsAvailable() external view virtual returns (uint) {
return 0;
}
function callReward() external view virtual returns (uint) {
return 0;
}
function depositFee() public view virtual returns (uint) {
return 0;
}
function withdrawFee() public view virtual returns (uint) {
return 0;
}
// called as part of strat migration. Sends all the available funds back to the vault.
function retireStrat() external {
require(msg.sender == vault, "!vault");
_emergencyWithdraw();
IERC20(want).transfer(vault, balanceOfWant());
}
// pauses deposits and withdraws all funds from third party systems.
function panic() public virtual onlyManager {
pause();
_emergencyWithdraw();
}
function pause() public virtual onlyManager {
_pause();
}
function unpause() external virtual onlyManager {
_unpause();
deposit();
}
function keeper() public view returns (address) {
return factory.keeper();
}
function beefyFeeConfig() public view returns (IFeeConfig) {
return IFeeConfig(factory.beefyFeeConfig());
}
function beefyFeeRecipient() public view returns (address) {
return factory.beefyFeeRecipient();
}
function getAllFees() external view returns (IFeeConfig.AllFees memory) {
return IFeeConfig.AllFees(beefyFeeConfig().getFees(address(this)), depositFee(), withdrawFee());
}
function setVault(address _vault) external onlyOwner {
vault = _vault;
emit SetVault(_vault);
}
function setSwapper(address _swapper) external onlyOwner {
swapper = _swapper;
emit SetSwapper(_swapper);
}
function setStrategist(address _strategist) external {
require(msg.sender == strategist, "!strategist");
strategist = _strategist;
emit SetStrategist(_strategist);
}
receive () payable external {}
uint256[49] private __gap;
}
// File: contracts/BIFI/strategies/Curve/StrategyCurveConvexFraxtalFactory.sol
pragma solidity ^0.8.0;
// Curve L2 strategy switchable between Curve and Convex
contract StrategyCurveConvexFraxtalFactory is BaseAllToNativeFactoryStrat {
using SafeERC20 for IERC20;
// this `pid` means we using Curve gauge and not Convex rewardPool
uint constant public NO_PID = 42069;
IConvexBoosterL2 public constant booster = IConvexBoosterL2(0xd3327cb05a8E0095A543D582b5B3Ce3e19270389);
ICrvMinter public constant minter = ICrvMinter(0xeF672bD94913CB6f1d2812a6e18c1fFdEd8eFf5c);
address public gauge; // curve gauge
address public rewardPool; // convex base reward pool
uint public pid; // convex booster poolId
bool public isCrvMintable; // if CRV can be minted via Minter (gauge is added to Controller)
bool public isCurveRewardsClaimable; // if extra rewards in curve gauge should be claimed
function initialize(
address _gauge,
uint _pid,
address[] calldata _rewards,
address delegationRegistry,
address initialDelegate,
Addresses calldata _addresses
) public initializer {
gauge = _gauge;
pid = _pid;
if (_rewards.length > 1) {
isCurveRewardsClaimable = true;
}
if (_pid != NO_PID) {
(,,rewardPool,,) = booster.poolInfo(_pid);
} else {
isCrvMintable = true;
}
__BaseStrategy_init(_addresses, _rewards);
setHarvestOnDeposit(true);
if (delegationRegistry != address(0)) {
bool res;
(res,) = delegationRegistry.call(abi.encodeWithSignature("setDelegationForSelf(address)", initialDelegate));
(res,) = delegationRegistry.call(abi.encodeWithSignature("disableSelfManagingDelegations()"));
}
}
function stratName() public pure override returns (string memory) {
return "CurveConvexL2_v1";
}
function balanceOfPool() public view override returns (uint) {
if (rewardPool != address(0)) {
return IConvexRewardPool(rewardPool).balanceOf(address(this));
} else {
return IRewardsGauge(gauge).balanceOf(address(this));
}
}
function _deposit(uint amount) internal override {
if (rewardPool != address(0)) {
IERC20(want).forceApprove(address(booster), amount);
booster.deposit(pid, amount);
} else {
IERC20(want).forceApprove(gauge, amount);
IRewardsGauge(gauge).deposit(amount);
}
}
function _withdraw(uint amount) internal override {
if (amount > 0) {
if (rewardPool != address(0)) {
IConvexRewardPool(rewardPool).withdraw(amount, false);
} else {
IRewardsGauge(gauge).withdraw(amount);
}
}
}
function _emergencyWithdraw() internal override {
uint amount = balanceOfPool();
if (amount > 0) {
if (rewardPool != address(0)) {
IConvexRewardPool(rewardPool).emergencyWithdraw(amount);
} else {
IRewardsGauge(gauge).withdraw(amount);
}
}
}
function _claim() internal override {
if (rewardPool != address(0)) {
IConvexRewardPool(rewardPool).getReward(address(this));
} else {
if (isCrvMintable) minter.mint(gauge);
if (isCurveRewardsClaimable) IRewardsGauge(gauge).claim_rewards(address(this));
}
}
function _verifyRewardToken(address token) internal view override {
require(token != gauge, "!gauge");
require(token != rewardPool, "!rewardPool");
}
function setConvexPid(uint _pid) external onlyManager {
setConvexPid(_pid, false);
}
function setConvexPid(uint _pid, bool claim) public onlyManager {
if (pid == _pid) return;
_withdraw(balanceOfPool());
if (claim) _claim();
if (_pid != NO_PID) {
(address _lp, address _gauge, address _rewardPool,,) = booster.poolInfo(_pid);
require(want == _lp, "!lp");
require(gauge == _gauge, "!gauge");
rewardPool = _rewardPool;
} else {
rewardPool = address(0);
}
pid = _pid;
deposit();
}
function setCrvMintable(bool _isCrvMintable) external onlyManager {
isCrvMintable = _isCrvMintable;
}
function setCurveRewardsClaimable(bool _isCurveRewardsClaimable) external onlyManager {
isCurveRewardsClaimable = _isCurveRewardsClaimable;
}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"address","name":"target","type":"address"}],"name":"AddressEmptyCode","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"AddressInsufficientBalance","type":"error"},{"inputs":[],"name":"FailedInnerCall","type":"error"},{"inputs":[],"name":"NotManager","type":"error"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"SafeERC20FailedOperation","type":"error"},{"inputs":[],"name":"StrategyPaused","type":"error"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"callFees","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"beefyFees","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"strategistFees","type":"uint256"}],"name":"ChargedFees","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tvl","type":"uint256"}],"name":"Deposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint8","name":"version","type":"uint8"}],"name":"Initialized","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":false,"internalType":"address","name":"strategist","type":"address"}],"name":"SetStrategist","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"swapper","type":"address"}],"name":"SetSwapper","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"vault","type":"address"}],"name":"SetVault","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":"NO_PID","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"}],"name":"addReward","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":"beefyFeeConfig","outputs":[{"internalType":"contract IFeeConfig","name":"","type":"address"}],"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":"booster","outputs":[{"internalType":"contract IConvexBoosterL2","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"callReward","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"claim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"deposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"depositFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"depositToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"factory","outputs":[{"internalType":"contract IStrategyFactory","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"gauge","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getAllFees","outputs":[{"components":[{"components":[{"internalType":"uint256","name":"total","type":"uint256"},{"internalType":"uint256","name":"beefy","type":"uint256"},{"internalType":"uint256","name":"call","type":"uint256"},{"internalType":"uint256","name":"strategist","type":"uint256"},{"internalType":"string","name":"label","type":"string"},{"internalType":"bool","name":"active","type":"bool"}],"internalType":"struct IFeeConfig.FeeCategory","name":"performance","type":"tuple"},{"internalType":"uint256","name":"deposit","type":"uint256"},{"internalType":"uint256","name":"withdraw","type":"uint256"}],"internalType":"struct IFeeConfig.AllFees","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"callFeeRecipient","type":"address"}],"name":"harvest","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"harvest","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"harvestOnDeposit","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_gauge","type":"address"},{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"address[]","name":"_rewards","type":"address[]"},{"internalType":"address","name":"delegationRegistry","type":"address"},{"internalType":"address","name":"initialDelegate","type":"address"},{"components":[{"internalType":"address","name":"want","type":"address"},{"internalType":"address","name":"depositToken","type":"address"},{"internalType":"address","name":"factory","type":"address"},{"internalType":"address","name":"vault","type":"address"},{"internalType":"address","name":"swapper","type":"address"},{"internalType":"address","name":"strategist","type":"address"}],"internalType":"struct BaseAllToNativeFactoryStrat.Addresses","name":"_addresses","type":"tuple"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"isCrvMintable","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isCurveRewardsClaimable","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":"lockDuration","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lockedProfit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"minAmounts","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minter","outputs":[{"internalType":"contract ICrvMinter","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"native","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":"pid","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"i","type":"uint256"}],"name":"removeReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"resetRewards","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"retireStrat","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"rewardPool","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"rewards","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rewardsAvailable","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rewardsLength","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"bool","name":"claim","type":"bool"}],"name":"setConvexPid","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"}],"name":"setConvexPid","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_isCrvMintable","type":"bool"}],"name":"setCrvMintable","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_isCurveRewardsClaimable","type":"bool"}],"name":"setCurveRewardsClaimable","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"setDepositToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_harvestOnDeposit","type":"bool"}],"name":"setHarvestOnDeposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_duration","type":"uint256"}],"name":"setLockDuration","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"minAmount","type":"uint256"}],"name":"setRewardMinAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_strategist","type":"address"}],"name":"setStrategist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_swapper","type":"address"}],"name":"setSwapper","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_vault","type":"address"}],"name":"setVault","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"stratName","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"strategist","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"swapper","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalLocked","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"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":"withdrawFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]Contract Creation Code
608060405234801561001057600080fd5b506135d3806100206000396000f3fe6080604052600436106103c75760003560e01c80638da5cb5b116101f2578063c45a01551161010d578063e941fa78116100a0578063f301af421161006f578063f301af4214610a41578063fac0239d14610a61578063fb61778714610a81578063fbfa77cf14610a9657600080fd5b8063e941fa78146106c0578063f1068454146109f5578063f1a392da14610a0b578063f2fde38b14610a2157600080fd5b8063c89039c5116100dc578063c89039c5146109a0578063d0e30db0146109c0578063e2e91c46146109d5578063e7a7250a146106c057600080fd5b8063c45a015514610918578063c553173f14610938578063c6def07614610958578063c7b9d5301461098057600080fd5b8063aced166111610185578063b407984a11610154578063b407984a146108b8578063bbb356d5146108d8578063c1a3d44c146108ed578063c379c9ae1461090257600080fd5b8063aced16611461084c578063ad29f5da14610861578063af4b41b014610876578063b20feaaf1461089657600080fd5b80639c82f2a4116101c15780639c82f2a4146107cc5780639c9b2e21146107ec578063a6f19c841461080c578063a7e9ca821461082c57600080fd5b80638da5cb5b1461076c5780638e1454591461078a57806397fd323d146106c05780639c5e52d51461079f57600080fd5b80634746fb55116102e257806366666aa911610275578063715018a611610244578063715018a614610713578063722713f7146107285780638456cb591461073d5780638912cb8b1461075257600080fd5b806366666aa9146106a057806367a52793146106c05780636817031b146106d45780636dce8229146106f457600080fd5b80635064010a116102b15780635064010a1461063b578063568914121461065d578063573fef0a146106735780635c975abb1461068857600080fd5b80634746fb55146105d15780634e2966da146105e65780634e71d92d146106065780634eb665af1461061b57600080fd5b80631fe4a6861161035a5780633f4ba83a116103295780633f4ba83a1461057d57806344b81396146105925780634641257d146105a75780634700d305146105bc57600080fd5b80631fe4a686146104f35780632b3297f9146105135780632e1a7d4d146105335780633b1d802e1461055357600080fd5b80630e8fbb5a116103965780630e8fbb5a1461047e578063115880861461049e57806311b0b42d146104b35780631f1fcd51146104d357600080fd5b806304554443146103d357806307546172146103fc5780630c4ed7991461043c5780630e5c011e1461045e57600080fd5b366103ce57005b600080fd5b3480156103df57600080fd5b506103e960a25481565b6040519081526020015b60405180910390f35b34801561040857600080fd5b5061042473ef672bd94913cb6f1d2812a6e18c1ffded8eff5c81565b6040516001600160a01b0390911681526020016103f3565b34801561044857600080fd5b5061045c610457366004612f34565b610ab6565b005b34801561046a57600080fd5b5061045c610479366004612f34565b610b52565b34801561048a57600080fd5b5061045c610499366004612f5f565b610b5d565b3480156104aa57600080fd5b506103e9610b90565b3480156104bf57600080fd5b50609e54610424906001600160a01b031681565b3480156104df57600080fd5b50609d54610424906001600160a01b031681565b3480156104ff57600080fd5b50609c54610424906001600160a01b031681565b34801561051f57600080fd5b50609b54610424906001600160a01b031681565b34801561053f57600080fd5b5061045c61054e366004612f7c565b610c46565b34801561055f57600080fd5b5060d85461056d9060ff1681565b60405190151581526020016103f3565b34801561058957600080fd5b5061045c610d07565b34801561059e57600080fd5b506103e9610d21565b3480156105b357600080fd5b5061045c610d89565b3480156105c857600080fd5b5061045c610d94565b3480156105dd57600080fd5b50610424610dac565b3480156105f257600080fd5b5061045c610601366004612fad565b610e1a565b34801561061257600080fd5b5061045c61119b565b34801561062757600080fd5b5061045c610636366004612f7c565b6111a3565b34801561064757600080fd5b506106506111b0565b6040516103f391906130c3565b34801561066957600080fd5b506103e960a15481565b34801561067f57600080fd5b5061045c6111da565b34801561069457600080fd5b5060655460ff1661056d565b3480156106ac57600080fd5b5060d654610424906001600160a01b031681565b3480156106cc57600080fd5b5060006103e9565b3480156106e057600080fd5b5061045c6106ef366004612f34565b61121a565b34801561070057600080fd5b5060d85461056d90610100900460ff1681565b34801561071f57600080fd5b5061045c611277565b34801561073457600080fd5b506103e9611289565b34801561074957600080fd5b5061045c6112b7565b34801561075e57600080fd5b5060a35461056d9060ff1681565b34801561077857600080fd5b506033546001600160a01b0316610424565b34801561079657600080fd5b506104246112c7565b3480156107ab57600080fd5b506103e96107ba366004612f34565b60986020526000908152604090205481565b3480156107d857600080fd5b5061045c6107e7366004612f34565b611311565b3480156107f857600080fd5b5061045c610807366004612f34565b611367565b34801561081857600080fd5b5060d554610424906001600160a01b031681565b34801561083857600080fd5b5061045c6108473660046130d6565b611458565b34801561085857600080fd5b5061042461147c565b34801561086d57600080fd5b5061045c6114c6565b34801561088257600080fd5b5061045c610891366004613102565b6114da565b3480156108a257600080fd5b506108ab611665565b6040516103f39190613132565b3480156108c457600080fd5b5061045c6108d3366004612f5f565b611703565b3480156108e457600080fd5b506097546103e9565b3480156108f957600080fd5b506103e9611725565b34801561090e57600080fd5b506103e961a45581565b34801561092457600080fd5b50609954610424906001600160a01b031681565b34801561094457600080fd5b5061045c610953366004612f7c565b611756565b34801561096457600080fd5b5061042473d3327cb05a8e0095a543d582b5b3ce3e1927038981565b34801561098c57600080fd5b5061045c61099b366004612f34565b61180e565b3480156109ac57600080fd5b50609f54610424906001600160a01b031681565b3480156109cc57600080fd5b5061045c6118a4565b3480156109e157600080fd5b5061045c6109f0366004612f5f565b611a13565b348015610a0157600080fd5b506103e960d75481565b348015610a1757600080fd5b506103e960a05481565b348015610a2d57600080fd5b5061045c610a3c366004612f34565b611a2e565b348015610a4d57600080fd5b50610424610a5c366004612f7c565b611aa4565b348015610a6d57600080fd5b5061045c610a7c366004612f7c565b611ace565b348015610a8d57600080fd5b5061045c611ae1565b348015610aa257600080fd5b50609a54610424906001600160a01b031681565b610abe611ba3565b6001600160a01b038116610adf57609f80546001600160a01b031916905550565b609d546001600160a01b0390811690821603610b2a5760405162461bcd60e51b8152602060048201526005602482015264085dd85b9d60da1b60448201526064015b60405180910390fd5b610b3381611bf5565b609f80546001600160a01b0319166001600160a01b0383161790555b50565b610b4f816000611c88565b610b65611ba3565b60a3805460ff191682151590811790915560ff1615610b8657600060a25550565b6201518060a25550565b60d6546000906001600160a01b031615610c165760d6546040516370a0823160e01b81523060048201526001600160a01b03909116906370a08231906024015b602060405180830381865afa158015610bed573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c1191906131af565b905090565b60d5546040516370a0823160e01b81523060048201526001600160a01b03909116906370a0823190602401610bd0565b609a546001600160a01b03163314610c705760405162461bcd60e51b8152600401610b21906131c8565b6000610c7a611725565b905081811015610ca157610c96610c9182846131fe565b611ed4565b610c9e611725565b90505b81811115610cac5750805b609a54609d54610cc9916001600160a01b03918216911683611f85565b7f5b6b431d4476a211bb7d41c20d1aab9ae2321deee0d20be3d9fc9b1093fa6e3d610cf2611289565b60405190815260200160405180910390a15050565b610d0f611ba3565b610d17611fe4565b610d1f6118a4565b565b600060a254600003610d335750600090565b600060a05442610d4391906131fe565b9050600060a2548210610d57576000610d65565b8160a254610d6591906131fe565b905060a2548160a154610d789190613211565b610d829190613228565b9250505090565b610d1f326000611c88565b610d9c611ba3565b610da46112b7565b610d1f612036565b60995460408051634746fb5560e01b815290516000926001600160a01b031691634746fb559160048083019260209291908290030181865afa158015610df6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c11919061324a565b600054610100900460ff1615808015610e3a5750600054600160ff909116105b80610e545750303b158015610e54575060005460ff166001145b610eb75760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610b21565b6000805460ff191660011790558015610eda576000805461ff0019166101001790555b60d580546001600160a01b0319166001600160a01b038a1617905560d78790556001851115610f135760d8805461ff0019166101001790555b61a4558714610fba57604051631526fe2760e01b81526004810188905273d3327cb05a8e0095a543d582b5b3ce3e1927038990631526fe279060240160a060405180830381865afa158015610f6c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f909190613272565b505060d680546001600160a01b0319166001600160a01b039290921691909117905550610fc89050565b60d8805460ff191660011790555b611013610fda36849003840184613357565b87878080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061208a92505050565b61101d6001610b5d565b6001600160a01b0384161561114b576040516001600160a01b0384811660248301526000919086169060440160408051601f198184030181529181526020820180516001600160e01b03166302b8a21d60e01b1790525161107e91906133e4565b6000604051808303816000865af19150503d80600081146110bb576040519150601f19603f3d011682016040523d82523d6000602084013e6110c0565b606091505b505060408051600481526024810182526020810180516001600160e01b03166325ce9a3760e01b17905290519192506001600160a01b0387169161110491906133e4565b6000604051808303816000865af19150503d8060008114611141576040519150601f19603f3d011682016040523d82523d6000602084013e611146565b606091505b505050505b8015611191576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050505050505050565b610d1f6121ff565b6111ab611ba3565b60a255565b60408051808201909152601081526f4375727665436f6e7665784c325f763160801b602082015290565b60a35460ff1615610d1f57609a546001600160a01b0316331461120f5760405162461bcd60e51b8152600401610b21906131c8565b610d1f326001611c88565b61122261232d565b609a80546001600160a01b0319166001600160a01b0383169081179091556040519081527fd459c7242e23d490831b5676a611c4342d899d28f342d89ae80793e56a930f30906020015b60405180910390a150565b61127f61232d565b610d1f6000612387565b6000611293610d21565b61129b610b90565b6112a3611725565b6112ad9190613400565b610c1191906131fe565b6112bf611ba3565b610d1f6123d9565b60995460408051638e14545960e01b815290516000926001600160a01b031691638e1454599160048083019260209291908290030181865afa158015610df6573d6000803e3d6000fd5b61131961232d565b609b80546001600160a01b0319166001600160a01b0383169081179091556040519081527f211f06c051495b535b79192c1a4531d819d569657ff4bd16daa8e9e5e6ed2bfd9060200161126c565b61136f611ba3565b609d546001600160a01b03908116908216036113b55760405162461bcd60e51b8152602060048201526005602482015264085dd85b9d60da1b6044820152606401610b21565b609e546001600160a01b03908116908216036113fd5760405162461bcd60e51b8152602060048201526007602482015266216e617469766560c81b6044820152606401610b21565b61140681611bf5565b609780546001810182556000919091527f354a83ed9988f79f6038d4c7a7dadbad8af32f4ad6df893e0e5807a1b1944ff90180546001600160a01b0319166001600160a01b0392909216919091179055565b611460611ba3565b6001600160a01b03909116600090815260986020526040902055565b6099546040805163aced166160e01b815290516000926001600160a01b03169163aced16619160048083019260209291908290030181865afa158015610df6573d6000803e3d6000fd5b6114ce611ba3565b610d1f60976000612e7e565b6114e2611ba3565b60d7548214611661576114f6610c91610b90565b8015611504576115046121ff565b61a455821461164357604051631526fe2760e01b8152600481018390526000908190819073d3327cb05a8e0095a543d582b5b3ce3e1927038990631526fe279060240160a060405180830381865afa158015611564573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115889190613272565b5050609d5492955090935091506001600160a01b038085169116146115d55760405162461bcd60e51b81526020600482015260036024820152620216c760ec1b6044820152606401610b21565b60d5546001600160a01b0383811691161461161b5760405162461bcd60e51b815260206004820152600660248201526521676175676560d01b6044820152606401610b21565b60d680546001600160a01b0319166001600160a01b0392909216919091179055506116549050565b60d680546001600160a01b03191690555b60d78290556116616118a4565b5050565b61166d612e9c565b6040518060600160405280611680610dac565b604051639af608c960e01b81523060048201526001600160a01b039190911690639af608c990602401600060405180830381865afa1580156116c6573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526116ee9190810190613413565b81526020016000815260200160009052919050565b61170b611ba3565b60d880549115156101000261ff0019909216919091179055565b609d546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a0823190602401610bd0565b61175e611ba3565b6097805461176e906001906131fe565b8154811061177e5761177e613509565b600091825260209091200154609780546001600160a01b0390921691839081106117aa576117aa613509565b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060978054806117e9576117e961351f565b600082815260209020810160001990810180546001600160a01b031916905501905550565b609c546001600160a01b031633146118565760405162461bcd60e51b815260206004820152600b60248201526a085cdd1c985d1959da5cdd60aa1b6044820152606401610b21565b609c80546001600160a01b0319166001600160a01b0383169081179091556040519081527f46d58e3fa07bf19b1d27240f0e286b27e9f7c1b0d88933333fe833b60eec54129060200161126c565b60655460ff16806119275750609960009054906101000a90046001600160a01b03166001600160a01b031663f12d54d86040518163ffffffff1660e01b8152600401602060405180830381865afa158015611903573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119279190613535565b806119a357506099546001600160a01b031663de73a5946119466111b0565b6040518263ffffffff1660e01b815260040161196291906130c3565b602060405180830381865afa15801561197f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119a39190613535565b156119c15760405163e628b94960e01b815260040160405180910390fd5b60006119cb611725565b90508015610b4f576119dc81612416565b7f4d6ce1e535dbade1c23defba91e23b8f791ce5edc0cc320257a2b364e4e38426611a05611289565b60405190815260200161126c565b611a1b611ba3565b60d8805460ff1916911515919091179055565b611a3661232d565b6001600160a01b038116611a9b5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610b21565b610b4f81612387565b60978181548110611ab457600080fd5b6000918252602090912001546001600160a01b0316905081565b611ad6611ba3565b610b4f8160006114da565b609a546001600160a01b03163314611b0b5760405162461bcd60e51b8152600401610b21906131c8565b611b13612036565b609d54609a546001600160a01b039182169163a9059cbb9116611b34611725565b6040516001600160e01b031960e085901b1681526001600160a01b03909216600483015260248201526044016020604051808303816000875af1158015611b7f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b4f9190613535565b6033546001600160a01b03163314801590611bd75750611bc161147c565b6001600160a01b0316336001600160a01b031614155b15610d1f5760405163607e454560e11b815260040160405180910390fd5b60d5546001600160a01b0390811690821603611c3c5760405162461bcd60e51b815260206004820152600660248201526521676175676560d01b6044820152606401610b21565b60d6546001600160a01b0390811690821603610b4f5760405162461bcd60e51b815260206004820152600b60248201526a085c995dd85c99141bdbdb60aa1b6044820152606401610b21565b60655460ff1680611d0b5750609960009054906101000a90046001600160a01b03166001600160a01b031663f12d54d86040518163ffffffff1660e01b8152600401602060405180830381865afa158015611ce7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d0b9190613535565b80611d8757506099546001600160a01b031663de73a594611d2a6111b0565b6040518263ffffffff1660e01b8152600401611d4691906130c3565b602060405180830381865afa158015611d63573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d879190613535565b15611da55760405163e628b94960e01b815260040160405180910390fd5b611dad6121ff565b611db5612521565b609e546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa158015611dfe573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e2291906131af565b609e546001600160a01b0316600090815260986020526040902054909150811115611ecf57611e5083612695565b611e586128b2565b6000611e62611725565b9050611e6c610d21565b611e769082613400565b60a1554260a05582611e8a57611e8a6118a4565b337f9bc239f1724cacfb88cb1d66a2dc437467699b68a8c90d7b63110cf4b6f9241082611eb5611289565b6040805192835260208301919091520160405180910390a2505b505050565b8015610b4f5760d6546001600160a01b031615611f545760d654604051631c683a1b60e11b815260048101839052600060248201526001600160a01b03909116906338d07436906044015b600060405180830381600087803b158015611f3957600080fd5b505af1158015611f4d573d6000803e3d6000fd5b5050505050565b60d554604051632e1a7d4d60e01b8152600481018390526001600160a01b0390911690632e1a7d4d90602401611f1f565b6040516001600160a01b03838116602483015260448201839052611ecf91859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180516001600160e01b03838183161783525050505061292e565b611fec612991565b6065805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b6000612040610b90565b90508015610b4f5760d6546001600160a01b031615611f545760d654604051632989754760e11b8152600481018390526001600160a01b0390911690635312ea8e90602401611f1f565b600054610100900460ff166120b15760405162461bcd60e51b8152600401610b2190613552565b6120b96129da565b6120c1612a09565b8151609d80546001600160a01b03199081166001600160a01b039384161790915560408085015160998054841691851691821790556060860151609a805485169186169190911790556080860151609b8054851691861691909117905560a0860151609c805490941694169390931790915580516311b0b42d60e01b815290516311b0b42d916004818101926020929091908290030181865afa15801561216c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612190919061324a565b609e80546001600160a01b0319166001600160a01b039290921691909117905560005b81518110156121e6576121de8282815181106121d1576121d1613509565b6020026020010151611367565b6001016121b3565b506121f48260200151610ab6565b50506201518060a255565b60d6546001600160a01b0316156122705760d654604051630c00007b60e41b81523060048201526001600160a01b039091169063c00007b0906024015b600060405180830381600087803b15801561225657600080fd5b505af115801561226a573d6000803e3d6000fd5b50505050565b60d85460ff16156122ed5760d5546040516335313c2160e11b81526001600160a01b03909116600482015273ef672bd94913cb6f1d2812a6e18c1ffded8eff5c90636a62784290602401600060405180830381600087803b1580156122d457600080fd5b505af11580156122e8573d6000803e3d6000fd5b505050505b60d854610100900460ff1615610d1f5760d554604051634274debf60e11b81523060048201526001600160a01b03909116906384e9bd7e9060240161223c565b6033546001600160a01b03163314610d1f5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610b21565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6123e1612a38565b6065805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586120193390565b60d6546001600160a01b0316156124d357609d54612452906001600160a01b031673d3327cb05a8e0095a543d582b5b3ce3e1927038983612a7e565b60d754604051631c57762b60e31b815260048101919091526024810182905273d3327cb05a8e0095a543d582b5b3ce3e192703899063e2bbb158906044016020604051808303816000875af11580156124af573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116619190613535565b60d554609d546124f0916001600160a01b03918216911683612a7e565b60d55460405163b6b55f2560e01b8152600481018390526001600160a01b039091169063b6b55f2590602401611f1f565b60005b609754811015610b4f5760006097828154811061254357612543613509565b6000918252602090912001546001600160a01b0316905073eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeed1981016125e457609e60009054906101000a90046001600160a01b03166001600160a01b031663d0e30db0476040518263ffffffff1660e01b81526004016000604051808303818588803b1580156125c657600080fd5b505af11580156125da573d6000803e3d6000fd5b505050505061268c565b6040516370a0823160e01b81523060048201526000906001600160a01b038316906370a0823190602401602060405180830381865afa15801561262b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061264f91906131af565b6001600160a01b03831660009081526098602052604090205490915081111561268a57609e5461268a9083906001600160a01b031683612b0e565b505b50600101612524565b600061269f610dac565b604051639af608c960e01b81523060048201526001600160a01b039190911690639af608c990602401600060405180830381865afa1580156126e5573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261270d9190810190613413565b8051609e546040516370a0823160e01b8152306004820152929350600092670de0b6b3a764000092916001600160a01b0316906370a0823190602401602060405180830381865afa158015612766573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061278a91906131af565b6127949190613211565b61279e9190613228565b90506000670de0b6b3a76400008360400151836127bb9190613211565b6127c59190613228565b609e549091506127df906001600160a01b03168583611f85565b6000670de0b6b3a76400008460200151846127fa9190613211565b6128049190613228565b90506128246128116112c7565b609e546001600160a01b03169083611f85565b6000670de0b6b3a764000085606001518561283f9190613211565b6128499190613228565b609c54609e54919250612869916001600160a01b03908116911683611f85565b60408051848152602081018490529081018290527fd255b592c7f268a73e534da5219a60ff911b4cf6daae21c7d20527dd657bd99a9060600160405180910390a1505050505050565b609f546001600160a01b03166128de57609e54609d54610d1f916001600160a01b039081169116612bc0565b609e54609f546001600160a01b0390811691161461291257609e54609f54612912916001600160a01b039081169116612bc0565b609f54609d54610d1f916001600160a01b039081169116612bc0565b60006129436001600160a01b03841683612c38565b905080516000141580156129685750808060200190518101906129669190613535565b155b15611ecf57604051635274afe760e01b81526001600160a01b0384166004820152602401610b21565b60655460ff16610d1f5760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b6044820152606401610b21565b600054610100900460ff16612a015760405162461bcd60e51b8152600401610b2190613552565b610d1f612c4f565b600054610100900460ff16612a305760405162461bcd60e51b8152600401610b2190613552565b610d1f612c7f565b60655460ff1615610d1f5760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610b21565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663095ea7b360e01b179052612acf8482612cb2565b61226a576040516001600160a01b03848116602483015260006044830152612b0491869182169063095ea7b390606401611fb2565b61226a848261292e565b816001600160a01b0316836001600160a01b031614611ecf57609b54612b41906001600160a01b03858116911683612a7e565b609b54604051630df791e560e41b81526001600160a01b0385811660048301528481166024830152604482018490529091169063df791e50906064016020604051808303816000875af1158015612b9c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061226a91906131af565b6040516370a0823160e01b81523060048201526000906001600160a01b038416906370a0823190602401602060405180830381865afa158015612c07573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c2b91906131af565b9050611ecf838383612b0e565b6060612c4683836000612d5a565b90505b92915050565b600054610100900460ff16612c765760405162461bcd60e51b8152600401610b2190613552565b610d1f33612387565b600054610100900460ff16612ca65760405162461bcd60e51b8152600401610b2190613552565b6065805460ff19169055565b6000806000846001600160a01b031684604051612ccf91906133e4565b6000604051808303816000865af19150503d8060008114612d0c576040519150601f19603f3d011682016040523d82523d6000602084013e612d11565b606091505b5091509150818015612d3b575080511580612d3b575080806020019051810190612d3b9190613535565b8015612d5157506000856001600160a01b03163b115b95945050505050565b606081471015612d7f5760405163cd78605960e01b8152306004820152602401610b21565b600080856001600160a01b03168486604051612d9b91906133e4565b60006040518083038185875af1925050503d8060008114612dd8576040519150601f19603f3d011682016040523d82523d6000602084013e612ddd565b606091505b5091509150612ded868383612df9565b925050505b9392505050565b606082612e0e57612e0982612e55565b612df2565b8151158015612e2557506001600160a01b0384163b155b15612e4e57604051639996b31560e01b81526001600160a01b0385166004820152602401610b21565b5080612df2565b805115612e655780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b5080546000825590600052602060002090810190610b4f9190612ef6565b6040518060600160405280612ee26040518060c0016040528060008152602001600081526020016000815260200160008152602001606081526020016000151581525090565b815260200160008152602001600081525090565b5b80821115612f0b5760008155600101612ef7565b5090565b6001600160a01b0381168114610b4f57600080fd5b8035612f2f81612f0f565b919050565b600060208284031215612f4657600080fd5b8135612df281612f0f565b8015158114610b4f57600080fd5b600060208284031215612f7157600080fd5b8135612df281612f51565b600060208284031215612f8e57600080fd5b5035919050565b600060c08284031215612fa757600080fd5b50919050565b6000806000806000806000610160888a031215612fc957600080fd5b8735612fd481612f0f565b965060208801359550604088013567ffffffffffffffff80821115612ff857600080fd5b818a0191508a601f83011261300c57600080fd5b81358181111561301b57600080fd5b8b60208260051b850101111561303057600080fd5b60208301975080965050505061304860608901612f24565b925061305660808901612f24565b91506130658960a08a01612f95565b905092959891949750929550565b60005b8381101561308e578181015183820152602001613076565b50506000910152565b600081518084526130af816020860160208601613073565b601f01601f19169290920160200192915050565b602081526000612c466020830184613097565b600080604083850312156130e957600080fd5b82356130f481612f0f565b946020939093013593505050565b6000806040838503121561311557600080fd5b82359150602083013561312781612f51565b809150509250929050565b60208152600082516060602084015280516080840152602081015160a0840152604081015160c0840152606081015160e0840152608081015160c0610100850152613181610140850182613097565b905060a082015115156101208501526020850151604085015260408501516060850152809250505092915050565b6000602082840312156131c157600080fd5b5051919050565b602080825260069082015265085d985d5b1d60d21b604082015260600190565b634e487b7160e01b600052601160045260246000fd5b81810381811115612c4957612c496131e8565b8082028115828204841417612c4957612c496131e8565b60008261324557634e487b7160e01b600052601260045260246000fd5b500490565b60006020828403121561325c57600080fd5b8151612df281612f0f565b8051612f2f81612f51565b600080600080600060a0868803121561328a57600080fd5b855161329581612f0f565b60208701519095506132a681612f0f565b60408701519094506132b781612f0f565b60608701519093506132c881612f51565b60808701519092506132d981612f0f565b809150509295509295909350565b634e487b7160e01b600052604160045260246000fd5b60405160c0810167ffffffffffffffff81118282101715613320576133206132e7565b60405290565b604051601f8201601f1916810167ffffffffffffffff8111828210171561334f5761334f6132e7565b604052919050565b600060c0828403121561336957600080fd5b6133716132fd565b823561337c81612f0f565b8152602083013561338c81612f0f565b6020820152604083013561339f81612f0f565b604082015260608301356133b281612f0f565b606082015260808301356133c581612f0f565b608082015260a08301356133d881612f0f565b60a08201529392505050565b600082516133f6818460208701613073565b9190910192915050565b80820180821115612c4957612c496131e8565b6000602080838503121561342657600080fd5b825167ffffffffffffffff8082111561343e57600080fd5b9084019060c0828703121561345257600080fd5b61345a6132fd565b825181528383015184820152604083015160408201526060830151606082015260808301518281111561348c57600080fd5b8301601f8101881361349d57600080fd5b8051838111156134af576134af6132e7565b6134c1601f8201601f19168701613326565b935080845288868284010111156134d757600080fd5b6134e681878601888501613073565b50508160808201526134fa60a08401613267565b60a08201529695505050505050565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052603160045260246000fd5b60006020828403121561354757600080fd5b8151612df281612f51565b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b60608201526080019056fea264697066735822122085449221196aa275482b4a71aafc2bf81b7c1bad7bcc71e81350916a4f0a7cf264736f6c63430008170033
Deployed Bytecode
0x6080604052600436106103c75760003560e01c80638da5cb5b116101f2578063c45a01551161010d578063e941fa78116100a0578063f301af421161006f578063f301af4214610a41578063fac0239d14610a61578063fb61778714610a81578063fbfa77cf14610a9657600080fd5b8063e941fa78146106c0578063f1068454146109f5578063f1a392da14610a0b578063f2fde38b14610a2157600080fd5b8063c89039c5116100dc578063c89039c5146109a0578063d0e30db0146109c0578063e2e91c46146109d5578063e7a7250a146106c057600080fd5b8063c45a015514610918578063c553173f14610938578063c6def07614610958578063c7b9d5301461098057600080fd5b8063aced166111610185578063b407984a11610154578063b407984a146108b8578063bbb356d5146108d8578063c1a3d44c146108ed578063c379c9ae1461090257600080fd5b8063aced16611461084c578063ad29f5da14610861578063af4b41b014610876578063b20feaaf1461089657600080fd5b80639c82f2a4116101c15780639c82f2a4146107cc5780639c9b2e21146107ec578063a6f19c841461080c578063a7e9ca821461082c57600080fd5b80638da5cb5b1461076c5780638e1454591461078a57806397fd323d146106c05780639c5e52d51461079f57600080fd5b80634746fb55116102e257806366666aa911610275578063715018a611610244578063715018a614610713578063722713f7146107285780638456cb591461073d5780638912cb8b1461075257600080fd5b806366666aa9146106a057806367a52793146106c05780636817031b146106d45780636dce8229146106f457600080fd5b80635064010a116102b15780635064010a1461063b578063568914121461065d578063573fef0a146106735780635c975abb1461068857600080fd5b80634746fb55146105d15780634e2966da146105e65780634e71d92d146106065780634eb665af1461061b57600080fd5b80631fe4a6861161035a5780633f4ba83a116103295780633f4ba83a1461057d57806344b81396146105925780634641257d146105a75780634700d305146105bc57600080fd5b80631fe4a686146104f35780632b3297f9146105135780632e1a7d4d146105335780633b1d802e1461055357600080fd5b80630e8fbb5a116103965780630e8fbb5a1461047e578063115880861461049e57806311b0b42d146104b35780631f1fcd51146104d357600080fd5b806304554443146103d357806307546172146103fc5780630c4ed7991461043c5780630e5c011e1461045e57600080fd5b366103ce57005b600080fd5b3480156103df57600080fd5b506103e960a25481565b6040519081526020015b60405180910390f35b34801561040857600080fd5b5061042473ef672bd94913cb6f1d2812a6e18c1ffded8eff5c81565b6040516001600160a01b0390911681526020016103f3565b34801561044857600080fd5b5061045c610457366004612f34565b610ab6565b005b34801561046a57600080fd5b5061045c610479366004612f34565b610b52565b34801561048a57600080fd5b5061045c610499366004612f5f565b610b5d565b3480156104aa57600080fd5b506103e9610b90565b3480156104bf57600080fd5b50609e54610424906001600160a01b031681565b3480156104df57600080fd5b50609d54610424906001600160a01b031681565b3480156104ff57600080fd5b50609c54610424906001600160a01b031681565b34801561051f57600080fd5b50609b54610424906001600160a01b031681565b34801561053f57600080fd5b5061045c61054e366004612f7c565b610c46565b34801561055f57600080fd5b5060d85461056d9060ff1681565b60405190151581526020016103f3565b34801561058957600080fd5b5061045c610d07565b34801561059e57600080fd5b506103e9610d21565b3480156105b357600080fd5b5061045c610d89565b3480156105c857600080fd5b5061045c610d94565b3480156105dd57600080fd5b50610424610dac565b3480156105f257600080fd5b5061045c610601366004612fad565b610e1a565b34801561061257600080fd5b5061045c61119b565b34801561062757600080fd5b5061045c610636366004612f7c565b6111a3565b34801561064757600080fd5b506106506111b0565b6040516103f391906130c3565b34801561066957600080fd5b506103e960a15481565b34801561067f57600080fd5b5061045c6111da565b34801561069457600080fd5b5060655460ff1661056d565b3480156106ac57600080fd5b5060d654610424906001600160a01b031681565b3480156106cc57600080fd5b5060006103e9565b3480156106e057600080fd5b5061045c6106ef366004612f34565b61121a565b34801561070057600080fd5b5060d85461056d90610100900460ff1681565b34801561071f57600080fd5b5061045c611277565b34801561073457600080fd5b506103e9611289565b34801561074957600080fd5b5061045c6112b7565b34801561075e57600080fd5b5060a35461056d9060ff1681565b34801561077857600080fd5b506033546001600160a01b0316610424565b34801561079657600080fd5b506104246112c7565b3480156107ab57600080fd5b506103e96107ba366004612f34565b60986020526000908152604090205481565b3480156107d857600080fd5b5061045c6107e7366004612f34565b611311565b3480156107f857600080fd5b5061045c610807366004612f34565b611367565b34801561081857600080fd5b5060d554610424906001600160a01b031681565b34801561083857600080fd5b5061045c6108473660046130d6565b611458565b34801561085857600080fd5b5061042461147c565b34801561086d57600080fd5b5061045c6114c6565b34801561088257600080fd5b5061045c610891366004613102565b6114da565b3480156108a257600080fd5b506108ab611665565b6040516103f39190613132565b3480156108c457600080fd5b5061045c6108d3366004612f5f565b611703565b3480156108e457600080fd5b506097546103e9565b3480156108f957600080fd5b506103e9611725565b34801561090e57600080fd5b506103e961a45581565b34801561092457600080fd5b50609954610424906001600160a01b031681565b34801561094457600080fd5b5061045c610953366004612f7c565b611756565b34801561096457600080fd5b5061042473d3327cb05a8e0095a543d582b5b3ce3e1927038981565b34801561098c57600080fd5b5061045c61099b366004612f34565b61180e565b3480156109ac57600080fd5b50609f54610424906001600160a01b031681565b3480156109cc57600080fd5b5061045c6118a4565b3480156109e157600080fd5b5061045c6109f0366004612f5f565b611a13565b348015610a0157600080fd5b506103e960d75481565b348015610a1757600080fd5b506103e960a05481565b348015610a2d57600080fd5b5061045c610a3c366004612f34565b611a2e565b348015610a4d57600080fd5b50610424610a5c366004612f7c565b611aa4565b348015610a6d57600080fd5b5061045c610a7c366004612f7c565b611ace565b348015610a8d57600080fd5b5061045c611ae1565b348015610aa257600080fd5b50609a54610424906001600160a01b031681565b610abe611ba3565b6001600160a01b038116610adf57609f80546001600160a01b031916905550565b609d546001600160a01b0390811690821603610b2a5760405162461bcd60e51b8152602060048201526005602482015264085dd85b9d60da1b60448201526064015b60405180910390fd5b610b3381611bf5565b609f80546001600160a01b0319166001600160a01b0383161790555b50565b610b4f816000611c88565b610b65611ba3565b60a3805460ff191682151590811790915560ff1615610b8657600060a25550565b6201518060a25550565b60d6546000906001600160a01b031615610c165760d6546040516370a0823160e01b81523060048201526001600160a01b03909116906370a08231906024015b602060405180830381865afa158015610bed573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c1191906131af565b905090565b60d5546040516370a0823160e01b81523060048201526001600160a01b03909116906370a0823190602401610bd0565b609a546001600160a01b03163314610c705760405162461bcd60e51b8152600401610b21906131c8565b6000610c7a611725565b905081811015610ca157610c96610c9182846131fe565b611ed4565b610c9e611725565b90505b81811115610cac5750805b609a54609d54610cc9916001600160a01b03918216911683611f85565b7f5b6b431d4476a211bb7d41c20d1aab9ae2321deee0d20be3d9fc9b1093fa6e3d610cf2611289565b60405190815260200160405180910390a15050565b610d0f611ba3565b610d17611fe4565b610d1f6118a4565b565b600060a254600003610d335750600090565b600060a05442610d4391906131fe565b9050600060a2548210610d57576000610d65565b8160a254610d6591906131fe565b905060a2548160a154610d789190613211565b610d829190613228565b9250505090565b610d1f326000611c88565b610d9c611ba3565b610da46112b7565b610d1f612036565b60995460408051634746fb5560e01b815290516000926001600160a01b031691634746fb559160048083019260209291908290030181865afa158015610df6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c11919061324a565b600054610100900460ff1615808015610e3a5750600054600160ff909116105b80610e545750303b158015610e54575060005460ff166001145b610eb75760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610b21565b6000805460ff191660011790558015610eda576000805461ff0019166101001790555b60d580546001600160a01b0319166001600160a01b038a1617905560d78790556001851115610f135760d8805461ff0019166101001790555b61a4558714610fba57604051631526fe2760e01b81526004810188905273d3327cb05a8e0095a543d582b5b3ce3e1927038990631526fe279060240160a060405180830381865afa158015610f6c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f909190613272565b505060d680546001600160a01b0319166001600160a01b039290921691909117905550610fc89050565b60d8805460ff191660011790555b611013610fda36849003840184613357565b87878080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061208a92505050565b61101d6001610b5d565b6001600160a01b0384161561114b576040516001600160a01b0384811660248301526000919086169060440160408051601f198184030181529181526020820180516001600160e01b03166302b8a21d60e01b1790525161107e91906133e4565b6000604051808303816000865af19150503d80600081146110bb576040519150601f19603f3d011682016040523d82523d6000602084013e6110c0565b606091505b505060408051600481526024810182526020810180516001600160e01b03166325ce9a3760e01b17905290519192506001600160a01b0387169161110491906133e4565b6000604051808303816000865af19150503d8060008114611141576040519150601f19603f3d011682016040523d82523d6000602084013e611146565b606091505b505050505b8015611191576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050505050505050565b610d1f6121ff565b6111ab611ba3565b60a255565b60408051808201909152601081526f4375727665436f6e7665784c325f763160801b602082015290565b60a35460ff1615610d1f57609a546001600160a01b0316331461120f5760405162461bcd60e51b8152600401610b21906131c8565b610d1f326001611c88565b61122261232d565b609a80546001600160a01b0319166001600160a01b0383169081179091556040519081527fd459c7242e23d490831b5676a611c4342d899d28f342d89ae80793e56a930f30906020015b60405180910390a150565b61127f61232d565b610d1f6000612387565b6000611293610d21565b61129b610b90565b6112a3611725565b6112ad9190613400565b610c1191906131fe565b6112bf611ba3565b610d1f6123d9565b60995460408051638e14545960e01b815290516000926001600160a01b031691638e1454599160048083019260209291908290030181865afa158015610df6573d6000803e3d6000fd5b61131961232d565b609b80546001600160a01b0319166001600160a01b0383169081179091556040519081527f211f06c051495b535b79192c1a4531d819d569657ff4bd16daa8e9e5e6ed2bfd9060200161126c565b61136f611ba3565b609d546001600160a01b03908116908216036113b55760405162461bcd60e51b8152602060048201526005602482015264085dd85b9d60da1b6044820152606401610b21565b609e546001600160a01b03908116908216036113fd5760405162461bcd60e51b8152602060048201526007602482015266216e617469766560c81b6044820152606401610b21565b61140681611bf5565b609780546001810182556000919091527f354a83ed9988f79f6038d4c7a7dadbad8af32f4ad6df893e0e5807a1b1944ff90180546001600160a01b0319166001600160a01b0392909216919091179055565b611460611ba3565b6001600160a01b03909116600090815260986020526040902055565b6099546040805163aced166160e01b815290516000926001600160a01b03169163aced16619160048083019260209291908290030181865afa158015610df6573d6000803e3d6000fd5b6114ce611ba3565b610d1f60976000612e7e565b6114e2611ba3565b60d7548214611661576114f6610c91610b90565b8015611504576115046121ff565b61a455821461164357604051631526fe2760e01b8152600481018390526000908190819073d3327cb05a8e0095a543d582b5b3ce3e1927038990631526fe279060240160a060405180830381865afa158015611564573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115889190613272565b5050609d5492955090935091506001600160a01b038085169116146115d55760405162461bcd60e51b81526020600482015260036024820152620216c760ec1b6044820152606401610b21565b60d5546001600160a01b0383811691161461161b5760405162461bcd60e51b815260206004820152600660248201526521676175676560d01b6044820152606401610b21565b60d680546001600160a01b0319166001600160a01b0392909216919091179055506116549050565b60d680546001600160a01b03191690555b60d78290556116616118a4565b5050565b61166d612e9c565b6040518060600160405280611680610dac565b604051639af608c960e01b81523060048201526001600160a01b039190911690639af608c990602401600060405180830381865afa1580156116c6573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526116ee9190810190613413565b81526020016000815260200160009052919050565b61170b611ba3565b60d880549115156101000261ff0019909216919091179055565b609d546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a0823190602401610bd0565b61175e611ba3565b6097805461176e906001906131fe565b8154811061177e5761177e613509565b600091825260209091200154609780546001600160a01b0390921691839081106117aa576117aa613509565b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060978054806117e9576117e961351f565b600082815260209020810160001990810180546001600160a01b031916905501905550565b609c546001600160a01b031633146118565760405162461bcd60e51b815260206004820152600b60248201526a085cdd1c985d1959da5cdd60aa1b6044820152606401610b21565b609c80546001600160a01b0319166001600160a01b0383169081179091556040519081527f46d58e3fa07bf19b1d27240f0e286b27e9f7c1b0d88933333fe833b60eec54129060200161126c565b60655460ff16806119275750609960009054906101000a90046001600160a01b03166001600160a01b031663f12d54d86040518163ffffffff1660e01b8152600401602060405180830381865afa158015611903573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119279190613535565b806119a357506099546001600160a01b031663de73a5946119466111b0565b6040518263ffffffff1660e01b815260040161196291906130c3565b602060405180830381865afa15801561197f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119a39190613535565b156119c15760405163e628b94960e01b815260040160405180910390fd5b60006119cb611725565b90508015610b4f576119dc81612416565b7f4d6ce1e535dbade1c23defba91e23b8f791ce5edc0cc320257a2b364e4e38426611a05611289565b60405190815260200161126c565b611a1b611ba3565b60d8805460ff1916911515919091179055565b611a3661232d565b6001600160a01b038116611a9b5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610b21565b610b4f81612387565b60978181548110611ab457600080fd5b6000918252602090912001546001600160a01b0316905081565b611ad6611ba3565b610b4f8160006114da565b609a546001600160a01b03163314611b0b5760405162461bcd60e51b8152600401610b21906131c8565b611b13612036565b609d54609a546001600160a01b039182169163a9059cbb9116611b34611725565b6040516001600160e01b031960e085901b1681526001600160a01b03909216600483015260248201526044016020604051808303816000875af1158015611b7f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b4f9190613535565b6033546001600160a01b03163314801590611bd75750611bc161147c565b6001600160a01b0316336001600160a01b031614155b15610d1f5760405163607e454560e11b815260040160405180910390fd5b60d5546001600160a01b0390811690821603611c3c5760405162461bcd60e51b815260206004820152600660248201526521676175676560d01b6044820152606401610b21565b60d6546001600160a01b0390811690821603610b4f5760405162461bcd60e51b815260206004820152600b60248201526a085c995dd85c99141bdbdb60aa1b6044820152606401610b21565b60655460ff1680611d0b5750609960009054906101000a90046001600160a01b03166001600160a01b031663f12d54d86040518163ffffffff1660e01b8152600401602060405180830381865afa158015611ce7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d0b9190613535565b80611d8757506099546001600160a01b031663de73a594611d2a6111b0565b6040518263ffffffff1660e01b8152600401611d4691906130c3565b602060405180830381865afa158015611d63573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d879190613535565b15611da55760405163e628b94960e01b815260040160405180910390fd5b611dad6121ff565b611db5612521565b609e546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa158015611dfe573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e2291906131af565b609e546001600160a01b0316600090815260986020526040902054909150811115611ecf57611e5083612695565b611e586128b2565b6000611e62611725565b9050611e6c610d21565b611e769082613400565b60a1554260a05582611e8a57611e8a6118a4565b337f9bc239f1724cacfb88cb1d66a2dc437467699b68a8c90d7b63110cf4b6f9241082611eb5611289565b6040805192835260208301919091520160405180910390a2505b505050565b8015610b4f5760d6546001600160a01b031615611f545760d654604051631c683a1b60e11b815260048101839052600060248201526001600160a01b03909116906338d07436906044015b600060405180830381600087803b158015611f3957600080fd5b505af1158015611f4d573d6000803e3d6000fd5b5050505050565b60d554604051632e1a7d4d60e01b8152600481018390526001600160a01b0390911690632e1a7d4d90602401611f1f565b6040516001600160a01b03838116602483015260448201839052611ecf91859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180516001600160e01b03838183161783525050505061292e565b611fec612991565b6065805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b6000612040610b90565b90508015610b4f5760d6546001600160a01b031615611f545760d654604051632989754760e11b8152600481018390526001600160a01b0390911690635312ea8e90602401611f1f565b600054610100900460ff166120b15760405162461bcd60e51b8152600401610b2190613552565b6120b96129da565b6120c1612a09565b8151609d80546001600160a01b03199081166001600160a01b039384161790915560408085015160998054841691851691821790556060860151609a805485169186169190911790556080860151609b8054851691861691909117905560a0860151609c805490941694169390931790915580516311b0b42d60e01b815290516311b0b42d916004818101926020929091908290030181865afa15801561216c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612190919061324a565b609e80546001600160a01b0319166001600160a01b039290921691909117905560005b81518110156121e6576121de8282815181106121d1576121d1613509565b6020026020010151611367565b6001016121b3565b506121f48260200151610ab6565b50506201518060a255565b60d6546001600160a01b0316156122705760d654604051630c00007b60e41b81523060048201526001600160a01b039091169063c00007b0906024015b600060405180830381600087803b15801561225657600080fd5b505af115801561226a573d6000803e3d6000fd5b50505050565b60d85460ff16156122ed5760d5546040516335313c2160e11b81526001600160a01b03909116600482015273ef672bd94913cb6f1d2812a6e18c1ffded8eff5c90636a62784290602401600060405180830381600087803b1580156122d457600080fd5b505af11580156122e8573d6000803e3d6000fd5b505050505b60d854610100900460ff1615610d1f5760d554604051634274debf60e11b81523060048201526001600160a01b03909116906384e9bd7e9060240161223c565b6033546001600160a01b03163314610d1f5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610b21565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6123e1612a38565b6065805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586120193390565b60d6546001600160a01b0316156124d357609d54612452906001600160a01b031673d3327cb05a8e0095a543d582b5b3ce3e1927038983612a7e565b60d754604051631c57762b60e31b815260048101919091526024810182905273d3327cb05a8e0095a543d582b5b3ce3e192703899063e2bbb158906044016020604051808303816000875af11580156124af573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116619190613535565b60d554609d546124f0916001600160a01b03918216911683612a7e565b60d55460405163b6b55f2560e01b8152600481018390526001600160a01b039091169063b6b55f2590602401611f1f565b60005b609754811015610b4f5760006097828154811061254357612543613509565b6000918252602090912001546001600160a01b0316905073eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeed1981016125e457609e60009054906101000a90046001600160a01b03166001600160a01b031663d0e30db0476040518263ffffffff1660e01b81526004016000604051808303818588803b1580156125c657600080fd5b505af11580156125da573d6000803e3d6000fd5b505050505061268c565b6040516370a0823160e01b81523060048201526000906001600160a01b038316906370a0823190602401602060405180830381865afa15801561262b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061264f91906131af565b6001600160a01b03831660009081526098602052604090205490915081111561268a57609e5461268a9083906001600160a01b031683612b0e565b505b50600101612524565b600061269f610dac565b604051639af608c960e01b81523060048201526001600160a01b039190911690639af608c990602401600060405180830381865afa1580156126e5573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261270d9190810190613413565b8051609e546040516370a0823160e01b8152306004820152929350600092670de0b6b3a764000092916001600160a01b0316906370a0823190602401602060405180830381865afa158015612766573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061278a91906131af565b6127949190613211565b61279e9190613228565b90506000670de0b6b3a76400008360400151836127bb9190613211565b6127c59190613228565b609e549091506127df906001600160a01b03168583611f85565b6000670de0b6b3a76400008460200151846127fa9190613211565b6128049190613228565b90506128246128116112c7565b609e546001600160a01b03169083611f85565b6000670de0b6b3a764000085606001518561283f9190613211565b6128499190613228565b609c54609e54919250612869916001600160a01b03908116911683611f85565b60408051848152602081018490529081018290527fd255b592c7f268a73e534da5219a60ff911b4cf6daae21c7d20527dd657bd99a9060600160405180910390a1505050505050565b609f546001600160a01b03166128de57609e54609d54610d1f916001600160a01b039081169116612bc0565b609e54609f546001600160a01b0390811691161461291257609e54609f54612912916001600160a01b039081169116612bc0565b609f54609d54610d1f916001600160a01b039081169116612bc0565b60006129436001600160a01b03841683612c38565b905080516000141580156129685750808060200190518101906129669190613535565b155b15611ecf57604051635274afe760e01b81526001600160a01b0384166004820152602401610b21565b60655460ff16610d1f5760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b6044820152606401610b21565b600054610100900460ff16612a015760405162461bcd60e51b8152600401610b2190613552565b610d1f612c4f565b600054610100900460ff16612a305760405162461bcd60e51b8152600401610b2190613552565b610d1f612c7f565b60655460ff1615610d1f5760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610b21565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663095ea7b360e01b179052612acf8482612cb2565b61226a576040516001600160a01b03848116602483015260006044830152612b0491869182169063095ea7b390606401611fb2565b61226a848261292e565b816001600160a01b0316836001600160a01b031614611ecf57609b54612b41906001600160a01b03858116911683612a7e565b609b54604051630df791e560e41b81526001600160a01b0385811660048301528481166024830152604482018490529091169063df791e50906064016020604051808303816000875af1158015612b9c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061226a91906131af565b6040516370a0823160e01b81523060048201526000906001600160a01b038416906370a0823190602401602060405180830381865afa158015612c07573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c2b91906131af565b9050611ecf838383612b0e565b6060612c4683836000612d5a565b90505b92915050565b600054610100900460ff16612c765760405162461bcd60e51b8152600401610b2190613552565b610d1f33612387565b600054610100900460ff16612ca65760405162461bcd60e51b8152600401610b2190613552565b6065805460ff19169055565b6000806000846001600160a01b031684604051612ccf91906133e4565b6000604051808303816000865af19150503d8060008114612d0c576040519150601f19603f3d011682016040523d82523d6000602084013e612d11565b606091505b5091509150818015612d3b575080511580612d3b575080806020019051810190612d3b9190613535565b8015612d5157506000856001600160a01b03163b115b95945050505050565b606081471015612d7f5760405163cd78605960e01b8152306004820152602401610b21565b600080856001600160a01b03168486604051612d9b91906133e4565b60006040518083038185875af1925050503d8060008114612dd8576040519150601f19603f3d011682016040523d82523d6000602084013e612ddd565b606091505b5091509150612ded868383612df9565b925050505b9392505050565b606082612e0e57612e0982612e55565b612df2565b8151158015612e2557506001600160a01b0384163b155b15612e4e57604051639996b31560e01b81526001600160a01b0385166004820152602401610b21565b5080612df2565b805115612e655780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b5080546000825590600052602060002090810190610b4f9190612ef6565b6040518060600160405280612ee26040518060c0016040528060008152602001600081526020016000815260200160008152602001606081526020016000151581525090565b815260200160008152602001600081525090565b5b80821115612f0b5760008155600101612ef7565b5090565b6001600160a01b0381168114610b4f57600080fd5b8035612f2f81612f0f565b919050565b600060208284031215612f4657600080fd5b8135612df281612f0f565b8015158114610b4f57600080fd5b600060208284031215612f7157600080fd5b8135612df281612f51565b600060208284031215612f8e57600080fd5b5035919050565b600060c08284031215612fa757600080fd5b50919050565b6000806000806000806000610160888a031215612fc957600080fd5b8735612fd481612f0f565b965060208801359550604088013567ffffffffffffffff80821115612ff857600080fd5b818a0191508a601f83011261300c57600080fd5b81358181111561301b57600080fd5b8b60208260051b850101111561303057600080fd5b60208301975080965050505061304860608901612f24565b925061305660808901612f24565b91506130658960a08a01612f95565b905092959891949750929550565b60005b8381101561308e578181015183820152602001613076565b50506000910152565b600081518084526130af816020860160208601613073565b601f01601f19169290920160200192915050565b602081526000612c466020830184613097565b600080604083850312156130e957600080fd5b82356130f481612f0f565b946020939093013593505050565b6000806040838503121561311557600080fd5b82359150602083013561312781612f51565b809150509250929050565b60208152600082516060602084015280516080840152602081015160a0840152604081015160c0840152606081015160e0840152608081015160c0610100850152613181610140850182613097565b905060a082015115156101208501526020850151604085015260408501516060850152809250505092915050565b6000602082840312156131c157600080fd5b5051919050565b602080825260069082015265085d985d5b1d60d21b604082015260600190565b634e487b7160e01b600052601160045260246000fd5b81810381811115612c4957612c496131e8565b8082028115828204841417612c4957612c496131e8565b60008261324557634e487b7160e01b600052601260045260246000fd5b500490565b60006020828403121561325c57600080fd5b8151612df281612f0f565b8051612f2f81612f51565b600080600080600060a0868803121561328a57600080fd5b855161329581612f0f565b60208701519095506132a681612f0f565b60408701519094506132b781612f0f565b60608701519093506132c881612f51565b60808701519092506132d981612f0f565b809150509295509295909350565b634e487b7160e01b600052604160045260246000fd5b60405160c0810167ffffffffffffffff81118282101715613320576133206132e7565b60405290565b604051601f8201601f1916810167ffffffffffffffff8111828210171561334f5761334f6132e7565b604052919050565b600060c0828403121561336957600080fd5b6133716132fd565b823561337c81612f0f565b8152602083013561338c81612f0f565b6020820152604083013561339f81612f0f565b604082015260608301356133b281612f0f565b606082015260808301356133c581612f0f565b608082015260a08301356133d881612f0f565b60a08201529392505050565b600082516133f6818460208701613073565b9190910192915050565b80820180821115612c4957612c496131e8565b6000602080838503121561342657600080fd5b825167ffffffffffffffff8082111561343e57600080fd5b9084019060c0828703121561345257600080fd5b61345a6132fd565b825181528383015184820152604083015160408201526060830151606082015260808301518281111561348c57600080fd5b8301601f8101881361349d57600080fd5b8051838111156134af576134af6132e7565b6134c1601f8201601f19168701613326565b935080845288868284010111156134d757600080fd5b6134e681878601888501613073565b50508160808201526134fa60a08401613267565b60a08201529695505050505050565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052603160045260246000fd5b60006020828403121561354757600080fd5b8151612df281612f51565b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b60608201526080019056fea264697066735822122085449221196aa275482b4a71aafc2bf81b7c1bad7bcc71e81350916a4f0a7cf264736f6c63430008170033
Deployed Bytecode Sourcemap
59596:4613:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49310:27;;;;;;;;;;;;;;;;;;;160:25:1;;;148:2;133:18;49310:27:0;;;;;;;;59938:90;;;;;;;;;;;;59985:42;59938:90;;;;;-1:-1:-1;;;;;378:32:1;;;360:51;;348:2;333:18;59938:90:0;196:221:1;55953:284:0;;;;;;;;;;-1:-1:-1;55953:284:0;;;;;:::i;:::-;;:::i;:::-;;52308:112;;;;;;;;;;-1:-1:-1;52308:112:0;;;;;:::i;:::-;;:::i;56939:256::-;;;;;;;;;;-1:-1:-1;56939:256:0;;;;;:::i;:::-;;:::i;61450:282::-;;;;;;;;;;;;;:::i;49182:21::-;;;;;;;;;;-1:-1:-1;49182:21:0;;;;-1:-1:-1;;;;;49182:21:0;;;49156:19;;;;;;;;;;-1:-1:-1;49156:19:0;;;;-1:-1:-1;;;;;49156:19:0;;;49122:25;;;;;;;;;;-1:-1:-1;49122:25:0;;;;-1:-1:-1;;;;;49122:25:0;;;49093:22;;;;;;;;;;-1:-1:-1;49093:22:0;;;;-1:-1:-1;;;;;49093:22:0;;;51498:449;;;;;;;;;;-1:-1:-1;51498:449:0;;;;;:::i;:::-;;:::i;60187:25::-;;;;;;;;;;-1:-1:-1;60187:25:0;;;;;;;;;;;1876:14:1;;1869:22;1851:41;;1839:2;1824:18;60187:25:0;1711:187:1;58233:97:0;;;;;;;;;;;;;:::i;56245:300::-;;;;;;;;;;;;;:::i;52219:81::-;;;;;;;;;;;;;:::i;58045:101::-;;;;;;;;;;;;;:::i;58436:121::-;;;;;;;;;;;;;:::i;60382:942::-;;;;;;;;;;-1:-1:-1;60382:942:0;;;;;:::i;:::-;;:::i;52150:61::-;;;;;;;;;;;;;:::i;57203:105::-;;;;;;;;;;-1:-1:-1;57203:105:0;;;;;:::i;:::-;;:::i;61332:110::-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;49277:26::-;;;;;;;;;;;;;;;;51955:187;;;;;;;;;;;;;:::i;25717:86::-;;;;;;;;;;-1:-1:-1;25788:7:0;;;;25717:86;;60079:25;;;;;;;;;;-1:-1:-1;60079:25:0;;;;-1:-1:-1;;;;;60079:25:0;;;57510:84;;;;;;;;;;-1:-1:-1;57561:4:0;57510:84;;58879:118;;;;;;;;;;-1:-1:-1;58879:118:0;;;;;:::i;:::-;;:::i;60285:35::-;;;;;;;;;;-1:-1:-1;60285:35:0;;;;;;;;;;;22715:103;;;;;;;;;;;;;:::i;56619:127::-;;;;;;;;;;;;;:::i;58154:71::-;;;;;;;;;;;;;:::i;49344:28::-;;;;;;;;;;-1:-1:-1;49344:28:0;;;;;;;;22074:87;;;;;;;;;;-1:-1:-1;22147:6:0;;-1:-1:-1;;;;;22147:6:0;22074:87;;58565:112;;;;;;;;;;;;;:::i;48938:42::-;;;;;;;;;;-1:-1:-1;48938:42:0;;;;;:::i;:::-;;;;;;;;;;;;;;59005:130;;;;;;;;;;-1:-1:-1;59005:130:0;;;;;:::i;:::-;;:::i;55361:220::-;;;;;;;;;;-1:-1:-1;55361:220:0;;;;;:::i;:::-;;:::i;60037:20::-;;;;;;;;;;-1:-1:-1;60037:20:0;;;;-1:-1:-1;;;;;60037:20:0;;;55817:128;;;;;;;;;;-1:-1:-1;55817:128:0;;;;;:::i;:::-;;:::i;58338:90::-;;;;;;;;;;;;;:::i;55731:78::-;;;;;;;;;;;;;:::i;63380:538::-;;;;;;;;;;-1:-1:-1;63380:538:0;;;;;:::i;:::-;;:::i;58685:186::-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;64049:155::-;;;;;;;;;;-1:-1:-1;64049:155:0;;;;;:::i;:::-;;:::i;55259:94::-;;;;;;;;;;-1:-1:-1;55331:7:0;:14;55259:94;;56813:118;;;;;;;;;;;;;:::i;59784:35::-;;;;;;;;;;;;59814:5;59784:35;;49028:31;;;;;;;;;;-1:-1:-1;49028:31:0;;;;-1:-1:-1;;;;;49028:31:0;;;55589:134;;;;;;;;;;-1:-1:-1;55589:134:0;;;;;:::i;:::-;;:::i;59828:103::-;;;;;;;;;;;;59888:42;59828:103;;59143:197;;;;;;;;;;-1:-1:-1;59143:197:0;;;;;:::i;:::-;;:::i;49210:27::-;;;;;;;;;;-1:-1:-1;49210:27:0;;;;-1:-1:-1;;;;;49210:27:0;;;51289:201;;;;;;;;;;;;;:::i;63926:115::-;;;;;;;;;;-1:-1:-1;63926:115:0;;;;;:::i;:::-;;:::i;60138:15::-;;;;;;;;;;;;;;;;49244:26;;;;;;;;;;;;;;;;22973:201;;;;;;;;;;-1:-1:-1;22973:201:0;;;;;:::i;:::-;;:::i;48907:24::-;;;;;;;;;;-1:-1:-1;48907:24:0;;;;;:::i;:::-;;:::i;63274:98::-;;;;;;;;;;-1:-1:-1;63274:98:0;;;;;:::i;:::-;;:::i;57787:176::-;;;;;;;;;;;;;:::i;49066:20::-;;;;;;;;;;-1:-1:-1;49066:20:0;;;;-1:-1:-1;;;;;49066:20:0;;;55953:284;50040:15;:13;:15::i;:::-;-1:-1:-1;;;;;56027:19:0;::::1;56023:98;;56063:12;:25:::0;;-1:-1:-1;;;;;;56063:25:0::1;::::0;;55953:284;:::o;56023:98::-:1;56148:4;::::0;-1:-1:-1;;;;;56148:4:0;;::::1;56139:13:::0;;::::1;::::0;56131:31:::1;;;::::0;-1:-1:-1;;;56131:31:0;;6398:2:1;56131:31:0::1;::::0;::::1;6380:21:1::0;6437:1;6417:18;;;6410:29;-1:-1:-1;;;6455:18:1;;;6448:35;6500:18;;56131:31:0::1;;;;;;;;;56173:25;56192:5;56173:18;:25::i;:::-;56209:12;:20:::0;;-1:-1:-1;;;;;;56209:20:0::1;-1:-1:-1::0;;;;;56209:20:0;::::1;;::::0;;50066:1:::1;55953:284:::0;:::o;52308:112::-;52379:33;52388:16;52406:5;52379:8;:33::i;56939:256::-;50040:15;:13;:15::i;:::-;57022:16:::1;:36:::0;;-1:-1:-1;;57022:36:0::1;::::0;::::1;;::::0;;::::1;::::0;;;::::1;57073:16:::0;57069:119:::1;;;57121:1;57106:12;:16:::0;55953:284;:::o;57069:119::-:1;57170:6;57155:12;:21:::0;56939:256;:::o;61450:282::-;61526:10;;61505:4;;-1:-1:-1;;;;;61526:10:0;:24;61522:203;;61592:10;;61574:54;;-1:-1:-1;;;61574:54:0;;61622:4;61574:54;;;360:51:1;-1:-1:-1;;;;;61592:10:0;;;;61574:39;;333:18:1;;61574:54:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;61567:61;;61450:282;:::o;61522:203::-;61682:5;;61668:45;;-1:-1:-1;;;61668:45:0;;61707:4;61668:45;;;360:51:1;-1:-1:-1;;;;;61682:5:0;;;;61668:30;;333:18:1;;61668:45:0;196:221:1;51498:449:0;51575:5;;-1:-1:-1;;;;;51575:5:0;51561:10;:19;51553:38;;;;-1:-1:-1;;;51553:38:0;;;;;;;:::i;:::-;51604:15;51622;:13;:15::i;:::-;51604:33;;51664:7;51654;:17;51650:118;;;51688:28;51698:17;51708:7;51698;:17;:::i;:::-;51688:9;:28::i;:::-;51741:15;:13;:15::i;:::-;51731:25;;51650:118;51794:7;51784;:17;51780:67;;;-1:-1:-1;51828:7:0;51780:67;51885:5;;51866:4;;51859:41;;-1:-1:-1;;;;;51866:4:0;;;;51885:5;51892:7;51859:25;:41::i;:::-;51918:21;51927:11;:9;:11::i;:::-;51918:21;;160:25:1;;;148:2;133:18;51918:21:0;;;;;;;51542:405;51498:449;:::o;58233:97::-;50040:15;:13;:15::i;:::-;58292:10:::1;:8;:10::i;:::-;58313:9;:7;:9::i;:::-;58233:97::o:0;56245:300::-;56290:7;56314:12;;56330:1;56314:17;56310:31;;-1:-1:-1;56340:1:0;;56245:300::o;56310:31::-;56352:15;56388:11;;56370:15;:29;;;;:::i;:::-;56352:47;;56410:17;56440:12;;56430:7;:22;:51;;56480:1;56430:51;;;56470:7;56455:12;;:22;;;;:::i;:::-;56410:71;;56525:12;;56513:9;56499:11;;:23;;;;:::i;:::-;:38;;;;:::i;:::-;56492:45;;;;56245:300;:::o;52219:81::-;52266:26;52275:9;52286:5;52266:8;:26::i;58045:101::-;50040:15;:13;:15::i;:::-;58100:7:::1;:5;:7::i;:::-;58118:20;:18;:20::i;58436:121::-:0;58524:7;;:24;;;-1:-1:-1;;;58524:24:0;;;;58483:10;;-1:-1:-1;;;;;58524:7:0;;:22;;:24;;;;;;;;;;;;;;:7;:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;60382:942::-;15676:19;15699:13;;;;;;15698:14;;15746:34;;;;-1:-1:-1;15764:12:0;;15779:1;15764:12;;;;:16;15746:34;15745:108;;;-1:-1:-1;15825:4:0;4452:19;:23;;;15786:66;;-1:-1:-1;15835:12:0;;;;;:17;15786:66;15723:204;;;;-1:-1:-1;;;15723:204:0;;8170:2:1;15723:204:0;;;8152:21:1;8209:2;8189:18;;;8182:30;8248:34;8228:18;;;8221:62;-1:-1:-1;;;8299:18:1;;;8292:44;8353:19;;15723:204:0;7968:410:1;15723:204:0;15938:12;:16;;-1:-1:-1;;15938:16:0;15953:1;15938:16;;;15965:67;;;;16000:13;:20;;-1:-1:-1;;16000:20:0;;;;;15965:67;60633:5:::1;:14:::0;;-1:-1:-1;;;;;;60633:14:0::1;-1:-1:-1::0;;;;;60633:14:0;::::1;;::::0;;60658:3:::1;:10:::0;;;-1:-1:-1;60685:19:0;::::1;60681:82;;;60721:23;:30:::0;;-1:-1:-1;;60721:30:0::1;;;::::0;;60681:82:::1;59814:5;60777:4;:14;60773:141;;60827:22;::::0;-1:-1:-1;;;60827:22:0;;::::1;::::0;::::1;160:25:1::0;;;59888:42:0::1;::::0;60827:16:::1;::::0;133:18:1;;60827:22:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;60811:10:0::1;60808:41:::0;;-1:-1:-1;;;;;;60808:41:0::1;-1:-1:-1::0;;;;;60808:41:0;;;::::1;::::0;;;::::1;::::0;;-1:-1:-1;60773:141:0::1;::::0;-1:-1:-1;60773:141:0::1;;60882:13;:20:::0;;-1:-1:-1;;60882:20:0::1;60898:4;60882:20;::::0;;60773:141:::1;60924:41;;;::::0;;::::1;::::0;::::1;60944:10:::0;60924:41:::1;:::i;:::-;60956:8;;60924:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;60924:19:0::1;::::0;-1:-1:-1;;;60924:41:0:i:1;:::-;60976:25;60996:4;60976:19;:25::i;:::-;-1:-1:-1::0;;;;;61018:32:0;::::1;::::0;61014:303:::1;;61123:73;::::0;-1:-1:-1;;;;;378:32:1;;;61123:73:0::1;::::0;::::1;360:51:1::0;61067:8:0::1;::::0;61099:23;;::::1;::::0;333:18:1;;61123:73:0::1;::::0;;-1:-1:-1;;61123:73:0;;::::1;::::0;;;;;;::::1;::::0;::::1;::::0;;-1:-1:-1;;;;;61123:73:0::1;-1:-1:-1::0;;;61123:73:0::1;::::0;;61099:98;::::1;::::0;61123:73;61099:98:::1;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;61245:59:0::1;::::0;;;;;::::1;::::0;::::1;::::0;;::::1;::::0;::::1;::::0;;-1:-1:-1;;;;;61245:59:0::1;-1:-1:-1::0;;;61245:59:0::1;::::0;;61221:84;;61090:107;;-1:-1:-1;;;;;;61221:23:0;::::1;::::0;:84:::1;::::0;61245:59;61221:84:::1;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;;;61014:303:0::1;16058:14:::0;16054:102;;;16105:5;16089:21;;-1:-1:-1;;16089:21:0;;;16130:14;;-1:-1:-1;11474:36:1;;16130:14:0;;11462:2:1;11447:18;16130:14:0;;;;;;;16054:102;15665:498;60382:942;;;;;;;:::o;52150:61::-;52195:8;:6;:8::i;57203:105::-;50040:15;:13;:15::i;:::-;57276:12:::1;:24:::0;57203:105::o;61332:110::-;61409:25;;;;;;;;;;;;-1:-1:-1;;;61409:25:0;;;;;61332:110::o;51955:187::-;52012:16;;;;52008:127;;;52067:5;;-1:-1:-1;;;;;52067:5:0;52053:10;:19;52045:38;;;;-1:-1:-1;;;52045:38:0;;;;;;;:::i;:::-;52098:25;52107:9;52118:4;52098:8;:25::i;58879:118::-;21960:13;:11;:13::i;:::-;58943:5:::1;:14:::0;;-1:-1:-1;;;;;;58943:14:0::1;-1:-1:-1::0;;;;;58943:14:0;::::1;::::0;;::::1;::::0;;;58973:16:::1;::::0;360:51:1;;;58973:16:0::1;::::0;348:2:1;333:18;58973:16:0::1;;;;;;;;58879:118:::0;:::o;22715:103::-;21960:13;:11;:13::i;:::-;22780:30:::1;22807:1;22780:18;:30::i;56619:127::-:0;56661:7;56724:14;:12;:14::i;:::-;56706:15;:13;:15::i;:::-;56688;:13;:15::i;:::-;:33;;;;:::i;:::-;:50;;;;:::i;58154:71::-;50040:15;:13;:15::i;:::-;58209:8:::1;:6;:8::i;58565:112::-:0;58642:7;;:27;;;-1:-1:-1;;;58642:27:0;;;;58615:7;;-1:-1:-1;;;;;58642:7:0;;:25;;:27;;;;;;;;;;;;;;:7;:27;;;;;;;;;;;;;;59005:130;21960:13;:11;:13::i;:::-;59073:7:::1;:18:::0;;-1:-1:-1;;;;;;59073:18:0::1;-1:-1:-1::0;;;;;59073:18:0;::::1;::::0;;::::1;::::0;;;59107:20:::1;::::0;360:51:1;;;59107:20:0::1;::::0;348:2:1;333:18;59107:20:0::1;196:221:1::0;55361:220:0;50040:15;:13;:15::i;:::-;55444:4:::1;::::0;-1:-1:-1;;;;;55444:4:0;;::::1;55434:14:::0;;::::1;::::0;55426:32:::1;;;::::0;-1:-1:-1;;;55426:32:0;;6398:2:1;55426:32:0::1;::::0;::::1;6380:21:1::0;6437:1;6417:18;;;6410:29;-1:-1:-1;;;6455:18:1;;;6448:35;6500:18;;55426:32:0::1;6196:328:1::0;55426:32:0::1;55487:6;::::0;-1:-1:-1;;;;;55487:6:0;;::::1;55477:16:::0;;::::1;::::0;55469:36:::1;;;::::0;-1:-1:-1;;;55469:36:0;;11853:2:1;55469:36:0::1;::::0;::::1;11835:21:1::0;11892:1;11872:18;;;11865:29;-1:-1:-1;;;11910:18:1;;;11903:37;11957:18;;55469:36:0::1;11651:330:1::0;55469:36:0::1;55516:26;55535:6;55516:18;:26::i;:::-;55553:7;:20:::0;;::::1;::::0;::::1;::::0;;-1:-1:-1;55553:20:0;;;;;::::1;::::0;;-1:-1:-1;;;;;;55553:20:0::1;-1:-1:-1::0;;;;;55553:20:0;;;::::1;::::0;;;::::1;::::0;;55361:220::o;55817:128::-;50040:15;:13;:15::i;:::-;-1:-1:-1;;;;;55908:17:0;;::::1;;::::0;;;:10:::1;:17;::::0;;;;:29;55817:128::o;58338:90::-;58404:7;;:16;;;-1:-1:-1;;;58404:16:0;;;;58377:7;;-1:-1:-1;;;;;58404:7:0;;:14;;:16;;;;;;;;;;;;;;:7;:16;;;;;;;;;;;;;;55731:78;50040:15;:13;:15::i;:::-;55787:14:::1;55794:7;;55787:14;:::i;63380:538::-:0;50040:15;:13;:15::i;:::-;63459:3:::1;::::0;63455:24;;63472:7:::1;63455:24;63491:26;63501:15;:13;:15::i;63491:26::-;63532:5;63528:19;;;63539:8;:6;:8::i;:::-;59814:5;63564:4;:14;63560:310;;63650:22;::::0;-1:-1:-1;;;63650:22:0;;::::1;::::0;::::1;160:25:1::0;;;63596:11:0::1;::::0;;;;;59888:42:::1;::::0;63650:16:::1;::::0;133:18:1;;63650:22:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;63695:4:0::1;::::0;63595:77;;-1:-1:-1;63595:77:0;;-1:-1:-1;63595:77:0;-1:-1:-1;;;;;;63695:11:0;;::::1;:4:::0;::::1;:11;63687:27;;;::::0;-1:-1:-1;;;63687:27:0;;12188:2:1;63687:27:0::1;::::0;::::1;12170:21:1::0;12227:1;12207:18;;;12200:29;-1:-1:-1;;;12245:18:1;;;12238:33;12288:18;;63687:27:0::1;11986:326:1::0;63687:27:0::1;63737:5;::::0;-1:-1:-1;;;;;63737:15:0;;::::1;:5:::0;::::1;:15;63729:34;;;::::0;-1:-1:-1;;;63729:34:0;;12519:2:1;63729:34:0::1;::::0;::::1;12501:21:1::0;12558:1;12538:18;;;12531:29;-1:-1:-1;;;12576:18:1;;;12569:36;12622:18;;63729:34:0::1;12317:329:1::0;63729:34:0::1;63778:10;:24:::0;;-1:-1:-1;;;;;;63778:24:0::1;-1:-1:-1::0;;;;;63778:24:0;;;::::1;::::0;;;::::1;::::0;;-1:-1:-1;63560:310:0::1;::::0;-1:-1:-1;63560:310:0::1;;63835:10;:23:::0;;-1:-1:-1;;;;;;63835:23:0::1;::::0;;63560:310:::1;63880:3;:10:::0;;;63901:9:::1;:7;:9::i;:::-;63380:538:::0;;:::o;58685:186::-;58730:25;;:::i;:::-;58775:88;;;;;;;;58794:16;:14;:16::i;:::-;:39;;-1:-1:-1;;;58794:39:0;;58827:4;58794:39;;;360:51:1;-1:-1:-1;;;;;58794:24:0;;;;;;;333:18:1;;58794:39:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;58794:39:0;;;;;;;;;;;;:::i;:::-;58775:88;;;;57561:4;58775:88;;;;57561:4;58775:88;;58768:95;58685:186;-1:-1:-1;58685:186:0:o;64049:155::-;50040:15;:13;:15::i;:::-;64146:23:::1;:50:::0;;;::::1;;;;-1:-1:-1::0;;64146:50:0;;::::1;::::0;;;::::1;::::0;;64049:155::o;56813:118::-;56893:4;;56886:37;;-1:-1:-1;;;56886:37:0;;56917:4;56886:37;;;360:51:1;56859:7:0;;-1:-1:-1;;;;;56893:4:0;;56886:22;;333:18:1;;56886:37:0;196:221:1;55589:134:0;50040:15;:13;:15::i;:::-;55664:7:::1;55672:14:::0;;:18:::1;::::0;55689:1:::1;::::0;55672:18:::1;:::i;:::-;55664:27;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;55651:7:::1;:10:::0;;-1:-1:-1;;;;;55664:27:0;;::::1;::::0;55659:1;;55651:10;::::1;;;;;:::i;:::-;;;;;;;;;:40;;;;;-1:-1:-1::0;;;;;55651:40:0::1;;;;;-1:-1:-1::0;;;;;55651:40:0::1;;;;;;55702:7;:13;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;;-1:-1:-1;;55702:13:0;;;;;-1:-1:-1;;;;;;55702:13:0::1;::::0;;;;;-1:-1:-1;55589:134:0:o;59143:197::-;59229:10;;-1:-1:-1;;;;;59229:10:0;59215;:24;59207:48;;;;-1:-1:-1;;;59207:48:0;;14405:2:1;59207:48:0;;;14387:21:1;14444:2;14424:18;;;14417:30;-1:-1:-1;;;14463:18:1;;;14456:41;14514:18;;59207:48:0;14203:335:1;59207:48:0;59266:10;:24;;-1:-1:-1;;;;;;59266:24:0;-1:-1:-1;;;;;59266:24:0;;;;;;;;59306:26;;360:51:1;;;59306:26:0;;348:2:1;333:18;59306:26:0;196:221:1;51289:201:0;25788:7;;;;49882:33;;;;49894:7;;;;;;;;;-1:-1:-1;;;;;49894:7:0;-1:-1:-1;;;;;49894:19:0;;:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;49882:71;;;-1:-1:-1;49919:7:0;;-1:-1:-1;;;;;49919:7:0;:21;49941:11;:9;:11::i;:::-;49919:34;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;49878:100;;;49962:16;;-1:-1:-1;;;49962:16:0;;;;;;;;;;;49878:100;51338:15:::1;51356;:13;:15::i;:::-;51338:33:::0;-1:-1:-1;51386:11:0;;51382:101:::1;;51414:17;51423:7;51414:8;:17::i;:::-;51451:20;51459:11;:9;:11::i;:::-;51451:20;::::0;160:25:1;;;148:2;133:18;51451:20:0::1;14:177:1::0;63926:115:0;50040:15;:13;:15::i;:::-;64003:13:::1;:30:::0;;-1:-1:-1;;64003:30:0::1;::::0;::::1;;::::0;;;::::1;::::0;;63926:115::o;22973:201::-;21960:13;:11;:13::i;:::-;-1:-1:-1;;;;;23062:22:0;::::1;23054:73;;;::::0;-1:-1:-1;;;23054:73:0;;14995:2:1;23054:73:0::1;::::0;::::1;14977:21:1::0;15034:2;15014:18;;;15007:30;15073:34;15053:18;;;15046:62;-1:-1:-1;;;15124:18:1;;;15117:36;15170:19;;23054:73:0::1;14793:402:1::0;23054:73:0::1;23138:28;23157:8;23138:18;:28::i;48907:24::-:0;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;48907:24:0;;-1:-1:-1;48907:24:0;:::o;63274:98::-;50040:15;:13;:15::i;:::-;63339:25:::1;63352:4;63358:5;63339:12;:25::i;57787:176::-:0;57852:5;;-1:-1:-1;;;;;57852:5:0;57838:10;:19;57830:38;;;;-1:-1:-1;;;57830:38:0;;;;;;;:::i;:::-;57879:20;:18;:20::i;:::-;57917:4;;57932:5;;-1:-1:-1;;;;;57917:4:0;;;;57910:21;;57932:5;57939:15;:13;:15::i;:::-;57910:45;;-1:-1:-1;;;;;;57910:45:0;;;;;;;-1:-1:-1;;;;;15392:32:1;;;57910:45:0;;;15374:51:1;15441:18;;;15434:34;15347:18;;57910:45:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;50083:130::-;22147:6;;-1:-1:-1;;;;;22147:6:0;50137:10;:21;;;;:47;;;50176:8;:6;:8::i;:::-;-1:-1:-1;;;;;50162:22:0;:10;-1:-1:-1;;;;;50162:22:0;;;50137:47;50133:72;;;50193:12;;-1:-1:-1;;;50193:12:0;;;;;;;;;;;63094:172;63188:5;;-1:-1:-1;;;;;63188:5:0;;;63179:14;;;;63171:33;;;;-1:-1:-1;;;63171:33:0;;12519:2:1;63171:33:0;;;12501:21:1;12558:1;12538:18;;;12531:29;-1:-1:-1;;;12576:18:1;;;12569:36;12622:18;;63171:33:0;12317:329:1;63171:33:0;63232:10;;-1:-1:-1;;;;;63232:10:0;;;63223:19;;;;63215:43;;;;-1:-1:-1;;;63215:43:0;;15681:2:1;63215:43:0;;;15663:21:1;15720:2;15700:18;;;15693:30;-1:-1:-1;;;15739:18:1;;;15732:41;15790:18;;63215:43:0;15479:335:1;52483:656:0;25788:7;;;;49882:33;;;;49894:7;;;;;;;;;-1:-1:-1;;;;;49894:7:0;-1:-1:-1;;;;;49894:19:0;;:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;49882:71;;;-1:-1:-1;49919:7:0;;-1:-1:-1;;;;;49919:7:0;:21;49941:11;:9;:11::i;:::-;49919:34;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;49878:100;;;49962:16;;-1:-1:-1;;;49962:16:0;;;;;;;;;;;49878:100;52575:8:::1;:6;:8::i;:::-;52594:22;:20;:22::i;:::-;52654:6;::::0;52647:39:::1;::::0;-1:-1:-1;;;52647:39:0;;52680:4:::1;52647:39;::::0;::::1;360:51:1::0;52627:17:0::1;::::0;-1:-1:-1;;;;;52654:6:0::1;::::0;52647:24:::1;::::0;333:18:1;;52647:39:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;52724:6;::::0;-1:-1:-1;;;;;52724:6:0::1;52713:18;::::0;;;:10:::1;:18;::::0;;;;;52627:59;;-1:-1:-1;52701:30:0;::::1;52697:435;;;52748:29;52760:16;52748:11;:29::i;:::-;52794:19;:17;:19::i;:::-;52828:21;52852:15;:13;:15::i;:::-;52828:39;;52912:14;:12;:14::i;:::-;52896:30;::::0;:13;:30:::1;:::i;:::-;52882:11;:44:::0;52955:15:::1;52941:11;:29:::0;52992:9;52987:60:::1;;53022:9;:7;:9::i;:::-;53081:10;53068:52;53093:13:::0;53108:11:::1;:9;:11::i;:::-;53068:52;::::0;;15993:25:1;;;16049:2;16034:18;;16027:34;;;;15966:18;53068:52:0::1;;;;;;;52733:399;52697:435;52564:575;52483:656:::0;;:::o;62090:306::-;62155:10;;62151:238;;62186:10;;-1:-1:-1;;;;;62186:10:0;:24;62182:196;;62249:10;;62231:53;;-1:-1:-1;;;62231:53:0;;;;;16240:25:1;;;62249:10:0;16281:18:1;;;16274:50;-1:-1:-1;;;;;62249:10:0;;;;62231:38;;16213:18:1;;62231:53:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55953:284;:::o;62182:196::-;62339:5;;62325:37;;-1:-1:-1;;;62325:37:0;;;;;160:25:1;;;-1:-1:-1;;;;;62339:5:0;;;;62325:29;;133:18:1;;62325:37:0;14:177:1;41494:162:0;41604:43;;-1:-1:-1;;;;;15392:32:1;;;41604:43:0;;;15374:51:1;15441:18;;;15434:34;;;41577:71:0;;41597:5;;41619:14;;;;;15347:18:1;;41604:43:0;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;41604:43:0;;;;;;;;;;;41577:19;:71::i;26572:120::-;25581:16;:14;:16::i;:::-;26631:7:::1;:15:::0;;-1:-1:-1;;26631:15:0::1;::::0;;26662:22:::1;20089:10:::0;26671:12:::1;26662:22;::::0;-1:-1:-1;;;;;378:32:1;;;360:51;;348:2;333:18;26662:22:0::1;;;;;;;26572:120::o:0;62404:346::-;62463:11;62477:15;:13;:15::i;:::-;62463:29;-1:-1:-1;62507:10:0;;62503:240;;62538:10;;-1:-1:-1;;;;;62538:10:0;:24;62534:198;;62601:10;;62583:55;;-1:-1:-1;;;62583:55:0;;;;;160:25:1;;;-1:-1:-1;;;;;62601:10:0;;;;62583:47;;133:18:1;;62583:55:0;14:177:1;50221:604:0;17819:13;;;;;;;17811:69;;;;-1:-1:-1;;;17811:69:0;;;;;;;:::i;:::-;50343:16:::1;:14;:16::i;:::-;50370:17;:15;:17::i;:::-;50405:15:::0;;50398:4:::1;:22:::0;;-1:-1:-1;;;;;;50398:22:0;;::::1;-1:-1:-1::0;;;;;50398:22:0;;::::1;;::::0;;;50458:18:::1;::::0;;::::1;::::0;50431:7:::1;:46:::0;;;::::1;::::0;;::::1;::::0;;::::1;::::0;;50496:16:::1;::::0;::::1;::::0;50488:5:::1;:24:::0;;;::::1;::::0;;::::1;::::0;;;::::1;::::0;;50533:18:::1;::::0;::::1;::::0;50523:7:::1;:28:::0;;;::::1;::::0;;::::1;::::0;;;::::1;::::0;;50575:21:::1;::::0;::::1;::::0;50562:10:::1;:34:::0;;;;::::1;::::0;::::1;::::0;;;::::1;::::0;;;50616:16;;-1:-1:-1;;;50616:16:0;;;;:14:::1;::::0;-1:-1:-1;50616:16:0;;::::1;::::0;::::1;::::0;;;;;;;;;50431:46;50616:16:::1;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;50607:6;:25:::0;;-1:-1:-1;;;;;;50607:25:0::1;-1:-1:-1::0;;;;;50607:25:0;;;::::1;::::0;;;::::1;::::0;;-1:-1:-1;50645:88:0::1;50662:8;:15;50658:1;:19;50645:88;;;50699:22;50709:8;50718:1;50709:11;;;;;;;;:::i;:::-;;;;;;;50699:9;:22::i;:::-;50679:3;;50645:88;;;;50743:40;50759:10;:23;;;50743:15;:40::i;:::-;-1:-1:-1::0;;50811:6:0::1;50796:12;:21:::0;50221:604::o;62758:328::-;62809:10;;-1:-1:-1;;;;;62809:10:0;:24;62805:274;;62868:10;;62850:54;;-1:-1:-1;;;62850:54:0;;62898:4;62850:54;;;360:51:1;-1:-1:-1;;;;;62868:10:0;;;;62850:39;;333:18:1;;62850:54:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58233:97::o;62805:274::-;62941:13;;;;62937:37;;;62968:5;;62956:18;;-1:-1:-1;;;62956:18:0;;-1:-1:-1;;;;;62968:5:0;;;62956:18;;;360:51:1;59985:42:0;;62956:11;;333:18:1;;62956::0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;62937:37;62993:23;;;;;;;62989:78;;;63032:5;;63018:49;;-1:-1:-1;;;63018:49:0;;63061:4;63018:49;;;360:51:1;-1:-1:-1;;;;;63032:5:0;;;;63018:34;;333:18:1;;63018:49:0;196:221:1;22239:132:0;22147:6;;-1:-1:-1;;;;;22147:6:0;20089:10;22303:23;22295:68;;;;-1:-1:-1;;;22295:68:0;;16949:2:1;22295:68:0;;;16931:21:1;;;16968:18;;;16961:30;17027:34;17007:18;;;17000:62;17079:18;;22295:68:0;16747:356:1;23334:191:0;23427:6;;;-1:-1:-1;;;;;23444:17:0;;;-1:-1:-1;;;;;;23444:17:0;;;;;;;23477:40;;23427:6;;;23444:17;23427:6;;23477:40;;23408:16;;23477:40;23397:128;23334:191;:::o;26313:118::-;25322:19;:17;:19::i;:::-;26373:7:::1;:14:::0;;-1:-1:-1;;26373:14:0::1;26383:4;26373:14;::::0;;26403:20:::1;26410:12;20089:10:::0;;20009:98;61740:342;61804:10;;-1:-1:-1;;;;;61804:10:0;:24;61800:275;;61852:4;;61845:51;;-1:-1:-1;;;;;61852:4:0;59888:42;61889:6;61845:25;:51::i;:::-;61927:3;;61911:28;;-1:-1:-1;;;61911:28:0;;;;;15993:25:1;;;;16034:18;;;16027:34;;;59888:42:0;;61911:15;;15966:18:1;;61911:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;61800:275::-;61998:5;;61979:4;;61972:40;;-1:-1:-1;;;;;61979:4:0;;;;61998:5;62005:6;61972:25;:40::i;:::-;62041:5;;62027:36;;-1:-1:-1;;;62027:36:0;;;;;160:25:1;;;-1:-1:-1;;;;;62041:5:0;;;;62027:28;;133:18:1;;62027:36:0;14:177:1;53147:549:0;53212:6;53207:482;53224:7;:14;53220:18;;53207:482;;;53260:13;53276:7;53284:1;53276:10;;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;53276:10:0;;-1:-1:-1;;;53305:60:0;;53301:377;;53401:6;;;;;;;;;-1:-1:-1;;;;;53401:6:0;-1:-1:-1;;;;;53386:30:0;;53424:21;53386:62;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53301:377;;;53503:38;;-1:-1:-1;;;53503:38:0;;53535:4;53503:38;;;360:51:1;53489:11:0;;-1:-1:-1;;;;;53503:23:0;;;;;333:18:1;;53503:38:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;53573:17:0;;;;;;:10;:17;;;;;;53489:52;;-1:-1:-1;53564:26:0;;53560:103;;;53628:6;;53615:28;;53621:5;;-1:-1:-1;;;;;53628:6:0;53636;53615:5;:28::i;:::-;53470:208;53301:377;-1:-1:-1;53240:3:0;;53207:482;;53729:760;53796:34;53833:16;:14;:16::i;:::-;:39;;-1:-1:-1;;;53833:39:0;;53866:4;53833:39;;;360:51:1;-1:-1:-1;;;;;53833:24:0;;;;;;;333:18:1;;53833:39:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;53833:39:0;;;;;;;;;;;;:::i;:::-;53945:10;;53910:6;;53903:39;;-1:-1:-1;;;53903:39:0;;53936:4;53903:39;;;360:51:1;53945:10:0;;-1:-1:-1;53883:17:0;;49408:7;;53945:10;-1:-1:-1;;;;;53910:6:0;;53903:24;;333:18:1;;53903:39:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:52;;;;:::i;:::-;:62;;;;:::i;:::-;53883:82;;53978:21;49408:7;54014:4;:9;;;54002;:21;;;;:::i;:::-;:31;;;;:::i;:::-;54051:6;;53978:55;;-1:-1:-1;54044:60:0;;-1:-1:-1;;;;;54051:6:0;54072:16;53978:55;54044:27;:60::i;:::-;54117:22;49408:7;54154:4;:10;;;54142:9;:22;;;;:::i;:::-;:32;;;;:::i;:::-;54117:57;;54185:64;54213:19;:17;:19::i;:::-;54192:6;;-1:-1:-1;;;;;54192:6:0;;54234:14;54185:27;:64::i;:::-;54262:27;49408:7;54304:4;:15;;;54292:9;:27;;;;:::i;:::-;:37;;;;:::i;:::-;54368:10;;54347:6;;54262:67;;-1:-1:-1;54340:60:0;;-1:-1:-1;;;;;54347:6:0;;;;54368:10;54262:67;54340:27;:60::i;:::-;54418:63;;;17310:25:1;;;17366:2;17351:18;;17344:34;;;17394:18;;;17387:34;;;54418:63:0;;17298:2:1;17283:18;54418:63:0;;;;;;;53785:704;;;;;53729:760;:::o;54497:304::-;54558:12;;-1:-1:-1;;;;;54558:12:0;54554:240;;54607:6;;54615:4;;54601:19;;-1:-1:-1;;;;;54607:6:0;;;;54615:4;54601:5;:19::i;54554:240::-;54673:6;;54657:12;;-1:-1:-1;;;;;54657:12:0;;;54673:6;;54657:22;54653:90;;54706:6;;54714:12;;54700:27;;-1:-1:-1;;;;;54706:6:0;;;;54714:12;54700:5;:27::i;:::-;54763:12;;54777:4;;54757:25;;-1:-1:-1;;;;;54763:12:0;;;;54777:4;54757:5;:25::i;44305:638::-;44729:23;44755:33;-1:-1:-1;;;;;44755:27:0;;44783:4;44755:27;:33::i;:::-;44729:59;;44803:10;:17;44824:1;44803:22;;:57;;;;;44841:10;44830:30;;;;;;;;;;;;:::i;:::-;44829:31;44803:57;44799:137;;;44884:40;;-1:-1:-1;;;44884:40:0;;-1:-1:-1;;;;;378:32:1;;44884:40:0;;;360:51:1;333:18;;44884:40:0;196:221:1;26061:108:0;25788:7;;;;26120:41;;;;-1:-1:-1;;;26120:41:0;;17634:2:1;26120:41:0;;;17616:21:1;17673:2;17653:18;;;17646:30;-1:-1:-1;;;17692:18:1;;;17685:50;17752:18;;26120:41:0;17432:344:1;21617:97:0;17819:13;;;;;;;17811:69;;;;-1:-1:-1;;;17811:69:0;;;;;;;:::i;:::-;21680:26:::1;:24;:26::i;24887:99::-:0;17819:13;;;;;;;17811:69;;;;-1:-1:-1;;;17811:69:0;;;;;;;:::i;:::-;24951:27:::1;:25;:27::i;25876:108::-:0;25788:7;;;;25946:9;25938:38;;;;-1:-1:-1;;;25938:38:0;;17983:2:1;25938:38:0;;;17965:21:1;18022:2;18002:18;;;17995:30;-1:-1:-1;;;18041:18:1;;;18034:46;18097:18;;25938:38:0;17781:340:1;43527:387:0;43643:47;;;-1:-1:-1;;;;;15392:32:1;;43643:47:0;;;15374:51:1;15441:18;;;;15434:34;;;43643:47:0;;;;;;;;;;15347:18:1;;;;43643:47:0;;;;;;;;-1:-1:-1;;;;;43643:47:0;-1:-1:-1;;;43643:47:0;;;43708:44;43658:13;43643:47;43708:23;:44::i;:::-;43703:204;;43796:43;;-1:-1:-1;;;;;15392:32:1;;;43796:43:0;;;15374:51:1;43836:1:0;15441:18:1;;;15434:34;43769:71:0;;43789:5;;43811:13;;;;;15347:18:1;;43796:43:0;15200:274:1;43769:71:0;43855:40;43875:5;43882:12;43855:19;:40::i;54990:261::-;55091:7;-1:-1:-1;;;;;55078:20:0;:9;-1:-1:-1;;;;;55078:20:0;;55074:170;;55146:7;;55115:47;;-1:-1:-1;;;;;55115:30:0;;;;55146:7;55155:6;55115:30;:47::i;:::-;55191:7;;55177:55;;-1:-1:-1;;;55177:55:0;;-1:-1:-1;;;;;18671:15:1;;;55177:55:0;;;18653:34:1;18723:15;;;18703:18;;;18696:43;18755:18;;;18748:34;;;55191:7:0;;;;55177:27;;18588:18:1;;55177:55:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;54809:173::-;54891:42;;-1:-1:-1;;;54891:42:0;;54927:4;54891:42;;;360:51:1;54880:8:0;;-1:-1:-1;;;;;54891:27:0;;;;;333:18:1;;54891:42:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;54880:53;;54944:30;54950:9;54961:7;54970:3;54944:5;:30::i;36622:153::-;36697:12;36729:38;36751:6;36759:4;36765:1;36729:21;:38::i;:::-;36722:45;;36622:153;;;;;:::o;21722:113::-;17819:13;;;;;;;17811:69;;;;-1:-1:-1;;;17811:69:0;;;;;;;:::i;:::-;21795:32:::1;20089:10:::0;21795:18:::1;:32::i;24994:97::-:0;17819:13;;;;;;;17811:69;;;;-1:-1:-1;;;17811:69:0;;;;;;;:::i;:::-;25068:7:::1;:15:::0;;-1:-1:-1;;25068:15:0::1;::::0;;24994:97::o;45454:585::-;45537:4;45844:12;45858:23;45893:5;-1:-1:-1;;;;;45885:19:0;45905:4;45885:25;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45843:67;;;;45928:7;:69;;;;-1:-1:-1;45940:17:0;;:22;;:56;;;45977:10;45966:30;;;;;;;;;;;;:::i;:::-;45928:103;;;;;46030:1;46009:5;-1:-1:-1;;;;;46001:26:0;;:30;45928:103;45921:110;45454:585;-1:-1:-1;;;;;45454:585:0:o;37110:398::-;37209:12;37262:5;37238:21;:29;37234:110;;;37291:41;;-1:-1:-1;;;37291:41:0;;37326:4;37291:41;;;360:51:1;333:18;;37291:41:0;196:221:1;37234:110:0;37355:12;37369:23;37396:6;-1:-1:-1;;;;;37396:11:0;37415:5;37422:4;37396:31;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37354:73;;;;37445:55;37472:6;37480:7;37489:10;37445:26;:55::i;:::-;37438:62;;;;37110:398;;;;;;:::o;38586:597::-;38734:12;38764:7;38759:417;;38788:19;38796:10;38788:7;:19::i;:::-;38759:417;;;39016:17;;:22;:49;;;;-1:-1:-1;;;;;;39042:18:0;;;:23;39016:49;39012:121;;;39093:24;;-1:-1:-1;;;39093:24:0;;-1:-1:-1;;;;;378:32:1;;39093:24:0;;;360:51:1;333:18;;39093:24:0;196:221:1;39012:121:0;-1:-1:-1;39154:10:0;39147:17;;39736:528;39869:17;;:21;39865:392;;40101:10;40095:17;40158:15;40145:10;40141:2;40137:19;40130:44;39865:392;40228:17;;-1:-1:-1;;;40228:17:0;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;:::o;422:131:1:-;-1:-1:-1;;;;;497:31:1;;487:42;;477:70;;543:1;540;533:12;558:134;626:20;;655:31;626:20;655:31;:::i;:::-;558:134;;;:::o;697:247::-;756:6;809:2;797:9;788:7;784:23;780:32;777:52;;;825:1;822;815:12;777:52;864:9;851:23;883:31;908:5;883:31;:::i;949:118::-;1035:5;1028:13;1021:21;1014:5;1011:32;1001:60;;1057:1;1054;1047:12;1072:241;1128:6;1181:2;1169:9;1160:7;1156:23;1152:32;1149:52;;;1197:1;1194;1187:12;1149:52;1236:9;1223:23;1255:28;1277:5;1255:28;:::i;1526:180::-;1585:6;1638:2;1626:9;1617:7;1613:23;1609:32;1606:52;;;1654:1;1651;1644:12;1606:52;-1:-1:-1;1677:23:1;;1526:180;-1:-1:-1;1526:180:1:o;2130:158::-;2192:5;2237:3;2228:6;2223:3;2219:16;2215:26;2212:46;;;2254:1;2251;2244:12;2212:46;-1:-1:-1;2276:6:1;2130:158;-1:-1:-1;2130:158:1:o;2293:1099::-;2453:6;2461;2469;2477;2485;2493;2501;2554:3;2542:9;2533:7;2529:23;2525:33;2522:53;;;2571:1;2568;2561:12;2522:53;2610:9;2597:23;2629:31;2654:5;2629:31;:::i;:::-;2679:5;-1:-1:-1;2731:2:1;2716:18;;2703:32;;-1:-1:-1;2786:2:1;2771:18;;2758:32;2809:18;2839:14;;;2836:34;;;2866:1;2863;2856:12;2836:34;2904:6;2893:9;2889:22;2879:32;;2949:7;2942:4;2938:2;2934:13;2930:27;2920:55;;2971:1;2968;2961:12;2920:55;3011:2;2998:16;3037:2;3029:6;3026:14;3023:34;;;3053:1;3050;3043:12;3023:34;3106:7;3101:2;3091:6;3088:1;3084:14;3080:2;3076:23;3072:32;3069:45;3066:65;;;3127:1;3124;3117:12;3066:65;3158:2;3154;3150:11;3140:21;;3180:6;3170:16;;;;;3205:38;3239:2;3228:9;3224:18;3205:38;:::i;:::-;3195:48;;3262:39;3296:3;3285:9;3281:19;3262:39;:::i;:::-;3252:49;;3320:66;3378:7;3372:3;3361:9;3357:19;3320:66;:::i;:::-;3310:76;;2293:1099;;;;;;;;;;:::o;3397:250::-;3482:1;3492:113;3506:6;3503:1;3500:13;3492:113;;;3582:11;;;3576:18;3563:11;;;3556:39;3528:2;3521:10;3492:113;;;-1:-1:-1;;3639:1:1;3621:16;;3614:27;3397:250::o;3652:271::-;3694:3;3732:5;3726:12;3759:6;3754:3;3747:19;3775:76;3844:6;3837:4;3832:3;3828:14;3821:4;3814:5;3810:16;3775:76;:::i;:::-;3905:2;3884:15;-1:-1:-1;;3880:29:1;3871:39;;;;3912:4;3867:50;;3652:271;-1:-1:-1;;3652:271:1:o;3928:220::-;4077:2;4066:9;4059:21;4040:4;4097:45;4138:2;4127:9;4123:18;4115:6;4097:45;:::i;4153:315::-;4221:6;4229;4282:2;4270:9;4261:7;4257:23;4253:32;4250:52;;;4298:1;4295;4288:12;4250:52;4337:9;4324:23;4356:31;4381:5;4356:31;:::i;:::-;4406:5;4458:2;4443:18;;;;4430:32;;-1:-1:-1;;;4153:315:1:o;4473:309::-;4538:6;4546;4599:2;4587:9;4578:7;4574:23;4570:32;4567:52;;;4615:1;4612;4605:12;4567:52;4651:9;4638:23;4628:33;;4711:2;4700:9;4696:18;4683:32;4724:28;4746:5;4724:28;:::i;:::-;4771:5;4761:15;;;4473:309;;;;;:::o;4787:940::-;4966:2;4955:9;4948:21;4929:4;5004:6;4998:13;5047:4;5042:2;5031:9;5027:18;5020:32;5095:12;5089:19;5083:3;5072:9;5068:19;5061:48;5170:2;5156:12;5152:21;5146:28;5140:3;5129:9;5125:19;5118:57;5237:4;5223:12;5219:23;5213:30;5206:4;5195:9;5191:20;5184:60;5305:4;5291:12;5287:23;5281:30;5275:3;5264:9;5260:19;5253:59;5367:3;5353:12;5349:22;5343:29;5409:4;5403:3;5392:9;5388:19;5381:33;5437:54;5486:3;5475:9;5471:19;5455:14;5437:54;:::i;:::-;5423:68;;5566:3;5552:12;5548:22;5542:29;5535:37;5528:45;5522:3;5511:9;5507:19;5500:74;5630:2;5622:6;5618:15;5612:22;5605:4;5594:9;5590:20;5583:52;5691:4;5683:6;5679:17;5673:24;5666:4;5655:9;5651:20;5644:54;5715:6;5707:14;;;;4787:940;;;;:::o;6529:184::-;6599:6;6652:2;6640:9;6631:7;6627:23;6623:32;6620:52;;;6668:1;6665;6658:12;6620:52;-1:-1:-1;6691:16:1;;6529:184;-1:-1:-1;6529:184:1:o;6718:329::-;6920:2;6902:21;;;6959:1;6939:18;;;6932:29;-1:-1:-1;;;6992:2:1;6977:18;;6970:36;7038:2;7023:18;;6718:329::o;7052:127::-;7113:10;7108:3;7104:20;7101:1;7094:31;7144:4;7141:1;7134:15;7168:4;7165:1;7158:15;7184:128;7251:9;;;7272:11;;;7269:37;;;7286:18;;:::i;7317:168::-;7390:9;;;7421;;7438:15;;;7432:22;;7418:37;7408:71;;7459:18;;:::i;7490:217::-;7530:1;7556;7546:132;;7600:10;7595:3;7591:20;7588:1;7581:31;7635:4;7632:1;7625:15;7663:4;7660:1;7653:15;7546:132;-1:-1:-1;7692:9:1;;7490:217::o;7712:251::-;7782:6;7835:2;7823:9;7814:7;7810:23;7806:32;7803:52;;;7851:1;7848;7841:12;7803:52;7883:9;7877:16;7902:31;7927:5;7902:31;:::i;8383:132::-;8459:13;;8481:28;8459:13;8481:28;:::i;8520:783::-;8623:6;8631;8639;8647;8655;8708:3;8696:9;8687:7;8683:23;8679:33;8676:53;;;8725:1;8722;8715:12;8676:53;8757:9;8751:16;8776:31;8801:5;8776:31;:::i;:::-;8876:2;8861:18;;8855:25;8826:5;;-1:-1:-1;8889:33:1;8855:25;8889:33;:::i;:::-;8993:2;8978:18;;8972:25;8941:7;;-1:-1:-1;9006:33:1;8972:25;9006:33;:::i;:::-;9110:2;9095:18;;9089:25;9058:7;;-1:-1:-1;9123:30:1;9089:25;9123:30;:::i;:::-;9224:3;9209:19;;9203:26;9172:7;;-1:-1:-1;9238:33:1;9203:26;9238:33;:::i;:::-;9290:7;9280:17;;;8520:783;;;;;;;;:::o;9308:127::-;9369:10;9364:3;9360:20;9357:1;9350:31;9400:4;9397:1;9390:15;9424:4;9421:1;9414:15;9440:252;9512:2;9506:9;9554:3;9542:16;;9588:18;9573:34;;9609:22;;;9570:62;9567:88;;;9635:18;;:::i;:::-;9671:2;9664:22;9440:252;:::o;9697:275::-;9768:2;9762:9;9833:2;9814:13;;-1:-1:-1;;9810:27:1;9798:40;;9868:18;9853:34;;9889:22;;;9850:62;9847:88;;;9915:18;;:::i;:::-;9951:2;9944:22;9697:275;;-1:-1:-1;9697:275:1:o;9977:1048::-;10063:6;10116:3;10104:9;10095:7;10091:23;10087:33;10084:53;;;10133:1;10130;10123:12;10084:53;10159:22;;:::i;:::-;10218:9;10205:23;10237:33;10262:7;10237:33;:::i;:::-;10279:22;;10353:2;10338:18;;10325:32;10366:33;10325:32;10366:33;:::i;:::-;10426:2;10415:14;;10408:31;10491:2;10476:18;;10463:32;10504:33;10463:32;10504:33;:::i;:::-;10564:2;10553:14;;10546:31;10629:2;10614:18;;10601:32;10642:33;10601:32;10642:33;:::i;:::-;10702:2;10691:14;;10684:31;10767:3;10752:19;;10739:33;10781;10739;10781;:::i;:::-;10841:3;10830:15;;10823:32;10907:3;10892:19;;10879:33;10921;10879;10921;:::i;:::-;10981:3;10970:15;;10963:32;10974:5;9977:1048;-1:-1:-1;;;9977:1048:1:o;11030:287::-;11159:3;11197:6;11191:13;11213:66;11272:6;11267:3;11260:4;11252:6;11248:17;11213:66;:::i;:::-;11295:16;;;;;11030:287;-1:-1:-1;;11030:287:1:o;11521:125::-;11586:9;;;11607:10;;;11604:36;;;11620:18;;:::i;12651:1283::-;12750:6;12781:2;12824;12812:9;12803:7;12799:23;12795:32;12792:52;;;12840:1;12837;12830:12;12792:52;12873:9;12867:16;12902:18;12943:2;12935:6;12932:14;12929:34;;;12959:1;12956;12949:12;12929:34;12982:22;;;;13038:4;13020:16;;;13016:27;13013:47;;;13056:1;13053;13046:12;13013:47;13082:22;;:::i;:::-;13133:2;13127:9;13120:5;13113:24;13183:2;13179;13175:11;13169:18;13164:2;13157:5;13153:14;13146:42;13234:2;13230;13226:11;13220:18;13215:2;13208:5;13204:14;13197:42;13285:2;13281;13277:11;13271:18;13266:2;13259:5;13255:14;13248:42;13329:3;13325:2;13321:12;13315:19;13359:2;13349:8;13346:16;13343:36;;;13375:1;13372;13365:12;13343:36;13398:17;;13446:4;13438:13;;13434:27;-1:-1:-1;13424:55:1;;13475:1;13472;13465:12;13424:55;13504:2;13498:9;13526:2;13522;13519:10;13516:36;;;13532:18;;:::i;:::-;13574:53;13617:2;13598:13;;-1:-1:-1;;13594:27:1;13590:36;;13574:53;:::i;:::-;13561:66;;13650:2;13643:5;13636:17;13690:7;13685:2;13680;13676;13672:11;13668:20;13665:33;13662:53;;;13711:1;13708;13701:12;13662:53;13724:67;13788:2;13783;13776:5;13772:14;13767:2;13763;13759:11;13724:67;:::i;:::-;;;13824:5;13818:3;13811:5;13807:15;13800:30;13863:40;13898:3;13894:2;13890:12;13863:40;:::i;:::-;13857:3;13846:15;;13839:65;13850:5;12651:1283;-1:-1:-1;;;;;;12651:1283:1:o;13939:127::-;14000:10;13995:3;13991:20;13988:1;13981:31;14031:4;14028:1;14021:15;14055:4;14052:1;14045:15;14071:127;14132:10;14127:3;14123:20;14120:1;14113:31;14163:4;14160:1;14153:15;14187:4;14184:1;14177:15;14543:245;14610:6;14663:2;14651:9;14642:7;14638:23;14634:32;14631:52;;;14679:1;14676;14669:12;14631:52;14711:9;14705:16;14730:28;14752:5;14730:28;:::i;16335:407::-;16537:2;16519:21;;;16576:2;16556:18;;;16549:30;16615:34;16610:2;16595:18;;16588:62;-1:-1:-1;;;16681:2:1;16666:18;;16659:41;16732:3;16717:19;;16335:407::o
Swarm Source
ipfs://85449221196aa275482b4a71aafc2bf81b7c1bad7bcc71e81350916a4f0a7cf2
Loading...
Loading
Loading...
Loading
Loading...
Loading
Net Worth in USD
$0.00
Net Worth in FRAX
0
Multichain Portfolio | 35 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|
Loading...
Loading
Loading...
Loading
Loading...
Loading
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.