Overview
S Balance
S Value
$0.00More Info
Private Name Tags
ContractCreator
Loading...
Loading
Contract Name:
StrategySnake
Compiler Version
v0.8.12+commit.f00d7308
Contract Source Code (Solidity)
/** *Submitted for verification at SonicScan.org on 2025-02-26 */ // SPDX-License-Identifier: MIT pragma solidity 0.8.12; // OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/IERC20.sol) /** * @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 amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `to`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address to, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `from` to `to` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom(address from, address to, uint256 amount) external returns (bool); } // OpenZeppelin Contracts (last updated v4.9.4) (token/ERC20/extensions/IERC20Permit.sol) /** * @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); } // OpenZeppelin Contracts (last updated v4.9.0) (utils/Address.sol) /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * * 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); } } } // OpenZeppelin Contracts (last updated v4.9.3) (token/ERC20/utils/SafeERC20.sol) /** * @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 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.encodeWithSelector(token.transfer.selector, 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.encodeWithSelector(token.transferFrom.selector, from, to, value)); } /** * @dev Deprecated. This function has issues similar to the ones found in * {IERC20-approve}, and its usage is discouraged. * * Whenever possible, use {safeIncreaseAllowance} and * {safeDecreaseAllowance} instead. */ function safeApprove(IERC20 token, address spender, uint256 value) internal { // safeApprove should only be called when setting an initial allowance, // or when resetting it to zero. To increase and decrease it, use // 'safeIncreaseAllowance' and 'safeDecreaseAllowance' require( (value == 0) || (token.allowance(address(this), spender) == 0), "SafeERC20: approve from non-zero to non-zero allowance" ); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value)); } /** * @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); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, oldAllowance + value)); } /** * @dev Decrease the calling contract's allowance toward `spender` by `value`. If `token` returns no value, * non-reverting calls are assumed to be successful. */ function safeDecreaseAllowance(IERC20 token, address spender, uint256 value) internal { unchecked { uint256 oldAllowance = token.allowance(address(this), spender); require(oldAllowance >= value, "SafeERC20: decreased allowance below zero"); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, oldAllowance - value)); } } /** * @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.encodeWithSelector(token.approve.selector, spender, value); if (!_callOptionalReturnBool(token, approvalCall)) { _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, 0)); _callOptionalReturn(token, approvalCall); } } /** * @dev Use a ERC-2612 signature to set the `owner` approval toward `spender` on `token`. * Revert on invalid signature. */ function safePermit( IERC20Permit token, address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) internal { uint256 nonceBefore = token.nonces(owner); token.permit(owner, spender, value, deadline, v, r, s); uint256 nonceAfter = token.nonces(owner); require(nonceAfter == nonceBefore + 1, "SafeERC20: permit did not succeed"); } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). */ function _callOptionalReturn(IERC20 token, bytes memory data) private { // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since // we're implementing it ourselves. We use {Address-functionCall} to perform this call, which verifies that // the target address contains contract code and also asserts for success in the low-level call. bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed"); require(returndata.length == 0 || abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed"); } /** * @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.isContract(address(token)); } } // OpenZeppelin Contracts (last updated v4.9.0) (utils/math/SafeMath.sol) // CAUTION // This version of SafeMath should only be used with Solidity 0.8 or later, // because it relies on the compiler's built in overflow checks. /** * @dev Wrappers over Solidity's arithmetic operations. * * NOTE: `SafeMath` is generally not needed starting with Solidity 0.8, since the compiler * now has built in overflow checking. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { uint256 c = a + b; if (c < a) return (false, 0); return (true, c); } } /** * @dev Returns the subtraction of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b > a) return (false, 0); return (true, a - b); } } /** * @dev Returns the multiplication of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) return (true, 0); uint256 c = a * b; if (c / a != b) return (false, 0); return (true, c); } } /** * @dev Returns the division of two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a / b); } } /** * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a % b); } } /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { return a + b; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { return a - b; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { return a * b; } /** * @dev Returns the integer division of two unsigned integers, reverting on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { return a / b; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { return a % b; } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {trySub}. * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { unchecked { require(b <= a, errorMessage); return a - b; } } /** * @dev Returns the integer division of two unsigned integers, reverting with custom message on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a / b; } } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting with custom message when dividing by zero. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryMod}. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a % b; } } } // OpenZeppelin Contracts (last updated v4.9.4) (utils/Context.sol) /** * @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 Context { 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; } } // OpenZeppelin Contracts (last updated v4.9.0) (access/Ownable.sol) /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _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); } } // OpenZeppelin Contracts (last updated v4.9.0) (security/ReentrancyGuard.sol) /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ abstract contract ReentrancyGuard { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; constructor() { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and making it call a * `private` function that does the actual work. */ modifier nonReentrant() { _nonReentrantBefore(); _; _nonReentrantAfter(); } function _nonReentrantBefore() private { // On the first call to nonReentrant, _status will be _NOT_ENTERED require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; } function _nonReentrantAfter() private { // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } /** * @dev Returns true if the reentrancy guard is currently set to "entered", which indicates there is a * `nonReentrant` function in the call stack. */ function _reentrancyGuardEntered() internal view returns (bool) { return _status == _ENTERED; } } // OpenZeppelin Contracts (last updated v4.7.0) (security/Pausable.sol) /** * @dev Contract module which allows children to implement an emergency stop * mechanism that can be triggered by an authorized account. * * This module is used through inheritance. It will make available the * modifiers `whenNotPaused` and `whenPaused`, which can be applied to * the functions of your contract. Note that they will not be pausable by * simply including this module, only once the modifiers are put in place. */ abstract contract Pausable is Context { /** * @dev Emitted when the pause is triggered by `account`. */ event Paused(address account); /** * @dev Emitted when the pause is lifted by `account`. */ event Unpaused(address account); bool private _paused; /** * @dev Initializes the contract in unpaused state. */ constructor() { _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()); } } interface IStrategy { // Total want tokens managed by strategy function wantLockedTotal() external view returns (uint256); // Sum of all shares of users to wantLockedTotal function sharesTotal() external view returns (uint256); function wantAddress() external view returns (address); function token0Address() external view returns (address); function token1Address() external view returns (address); function earnedAddress() external view returns (address); function getPricePerFullShare() external view returns (uint256); // Main want token compounding function function earn() external; // Transfer want tokens autoFarm -> strategy function deposit(address _userAddress, uint256 _wantAmt) external returns (uint256); // Transfer want tokens strategy -> autoFarm function withdraw(address _userAddress, uint256 _wantAmt) external returns (uint256); function migrateFrom(address _oldStrategy, uint256 _oldWantLockedTotal, uint256 _oldSharesTotal) external; function inCaseTokensGetStuck(address _token, uint256 _amount) external; function inFarmBalance() external view returns (uint256); function totalBalance() external view returns (uint256); } interface IOracle { function update() external; function consult(address _token, uint256 _amountIn) external view returns (uint256 amountOut); function twap(address _token, uint256 _amountIn) external view returns (uint256 _amountOut); } interface IFarmChef { function deposit(uint256 _pid, uint256 _amount) external; function withdraw(uint256 _pid, uint256 _amount) external; function pendingShare(uint256 _pid, address _user) external view returns (uint256); function pendingShareAndPendingRewards(uint256 _pid, address _user) external view returns (uint256); function userInfo(uint256 _pid, address _user) external view returns (uint256 amount, uint256 rewardDebt); function harvest(uint256 _pid) external payable; function gsnakeOracle() external view returns (address); function pegStabilityModuleFee() external view returns (uint256); } interface IRouter { struct Route { address from; address to; bool stable; } function getAmountsOut(uint256 amountIn, Route[] memory routes) external view returns (uint256[] memory amounts); function addLiquidity( address tokenA, address tokenB, bool stable, uint256 amountADesired, uint256 amountBDesired, uint256 amountAMin, uint256 amountBMin, address to, uint256 deadline ) external returns ( uint256 amountA, uint256 amountB, uint256 liquidity ); function swapExactTokensForTokens( uint256 amountIn, uint256 amountOutMin, Route[] calldata routes, address to, uint256 deadline ) external; function swapExactTokensForETH( uint256 amountIn, uint256 amountOutMin, Route[] calldata routes, address to, uint256 deadline ) external; } contract StrategySnake is IStrategy, Ownable, ReentrancyGuard, Pausable { using SafeMath for uint256; using SafeERC20 for IERC20; address public farmContractAddress; uint256 public pid; address public override wantAddress; address public override token0Address; address public override token1Address; address public override earnedAddress; address public dexRouterAddress; // bool public stable; mapping(address => mapping(address => IRouter.Route[])) public tokenRoutes; address public constant WS = address(0x039e2fB66102314Ce7b64Ce5Ce3E5183bc94aD38); address public controller; address public strategist; address public timelock; uint256 public lastEarnTime = 0; uint256 public autoEarnLimit = 10 * 1e18; // 10 S uint256 public override wantLockedTotal = 0; uint256 public override sharesTotal = 0; uint256 public totalEarned = 0; uint256 public minSCollateralAmount = 100 * 1e18; // 100 S uint256 public adjustSlippageFee = 10; //1% uint256 public adjustSlippageFeeMax = 100; //10% uint256 public controllerFee = 50; //5% uint256 public constant controllerFeeMax = 100; // 10 = 1% address public treasuryAddress; event Deposit(uint256 amount); event Withdraw(uint256 amount); event Farm(uint256 amount); event Compound(address token0Address, uint256 token0Amt, address token1Address, uint256 token1Amt); event Earned(address earnedAddress, uint256 earnedAmt); event DistributeFee(address earnedAddress, uint256 fee, address receiver); event InCaseTokensGetStuck(address tokenAddress, uint256 tokenAmt, address receiver); event ExecuteTransaction(address indexed target, uint256 value, string signature, bytes data); event DepositS(address indexed user, uint256 amount); event WithdrawS(address indexed user, uint256 amount); event Fees(uint256 pegStabilityModuleFee, uint256 adjustSlippageFee, uint256 controllerFee); constructor( address _controller, address _timelock, address _treasuryAddress, address _farmContractAddress, address _dexRouterAddress, uint256 _pid, address _wantAddress, address _earnedAddress, address _token0, address _token1, bool _stable ) { controller = _controller; strategist = msg.sender; timelock = _timelock; treasuryAddress = _treasuryAddress; // to call earn if public not allowed farmContractAddress = _farmContractAddress; dexRouterAddress = _dexRouterAddress; wantAddress = _wantAddress; token0Address = _token0; token1Address = _token1; pid = _pid; earnedAddress = _earnedAddress; stable = _stable; } modifier onlyController() { require(controller == msg.sender, "caller is not the controller"); _; } modifier onlyStrategist() { require(strategist == msg.sender || owner() == msg.sender, "Strategy: caller is not the strategist"); _; } modifier onlyTimelock() { require(timelock == msg.sender, "Strategy: caller is not timelock"); _; } function isAuthorised(address _account) public view returns (bool) { return (_account == owner()) || (_account == strategist) || (_account == timelock); } function requiredSToHarvest() public view returns (uint256) { uint256 _pending = pendingHarvest(); IOracle oracle = IOracle(IFarmChef(farmContractAddress).gsnakeOracle()); // Calculate the required Sonic (S) amount to cover PSM fee (15% of pending reward value) uint256 currentGSNAKEPriceInSonic = oracle.twap(earnedAddress, 1e18); uint256 _pendingHarvestSValue = _pending.mul(currentGSNAKEPriceInSonic).div(1e18); uint256 pegStabilityModuleFee = IFarmChef(farmContractAddress).pegStabilityModuleFee(); return _pendingHarvestSValue.mul(pegStabilityModuleFee + adjustSlippageFee).div(1000); } function autoEarn() public onlyStrategist { uint256 _pendingHarvestSValue = pendingHarvestSValue(); require(_pendingHarvestSValue >= autoEarnLimit, "too small"); uint256 requiredS = requiredSToHarvest(); require(address(this).balance >= requiredS, "not enough S collateral"); earn(); } function inFarmBalance() public override view returns (uint256) { (uint256 amount,) = IFarmChef(farmContractAddress).userInfo(pid, address(this)); return amount; } function totalBalance() external override view returns (uint256) { return IERC20(wantAddress).balanceOf(address(this)) + inFarmBalance(); } function getPricePerFullShare() external override view returns (uint256) { return (sharesTotal == 0) ? 1e18 : wantLockedTotal.mul(1e18).div(sharesTotal); } function increaseAllowance(address token, address spender, uint256 addedValue) internal { // increase allowance IERC20(token).safeIncreaseAllowance(spender, addedValue); } // Receives new deposits from user function deposit(address, uint256 _wantAmt) external override onlyController nonReentrant whenNotPaused returns (uint256) { IERC20(wantAddress).safeTransferFrom(address(msg.sender), address(this), _wantAmt); uint256 sharesAdded = _wantAmt; if (wantLockedTotal > 0 && sharesTotal > 0) { sharesAdded = _wantAmt.mul(sharesTotal).div(wantLockedTotal); } sharesTotal = sharesTotal.add(sharesAdded); _farm(); emit Deposit(_wantAmt); return sharesAdded; } function farm() public onlyOwner { _farm(); } function harvestReward() public onlyOwner { _harvest(); } function compound() public onlyOwner { _compound(); } function payFees() public onlyOwner { _payFees(); } function _farm() internal { IERC20 _want = IERC20(wantAddress); uint256 wantAmt = _want.balanceOf(address(this)); wantLockedTotal = wantLockedTotal.add(wantAmt); if (wantAmt > 0) { increaseAllowance(wantAddress, farmContractAddress, wantAmt); IFarmChef(farmContractAddress).deposit(pid, wantAmt); emit Farm(wantAmt); } } function withdraw(address, uint256 _wantAmt) external override onlyController nonReentrant returns (uint256) { require(_wantAmt > 0, "Strategy: !_wantAmt"); IFarmChef(farmContractAddress).withdraw(pid, _wantAmt); uint256 wantAmt = IERC20(wantAddress).balanceOf(address(this)); if (_wantAmt > wantAmt) { _wantAmt = wantAmt; } if (wantLockedTotal < _wantAmt) { _wantAmt = wantLockedTotal; } uint256 sharesRemoved = _wantAmt.mul(sharesTotal).div(wantLockedTotal); if (sharesRemoved > sharesTotal) { sharesRemoved = sharesTotal; } sharesTotal = sharesTotal.sub(sharesRemoved); wantLockedTotal = wantLockedTotal.sub(_wantAmt); IERC20(wantAddress).safeTransfer(address(msg.sender), _wantAmt); emit Withdraw(_wantAmt); return sharesRemoved; } function _harvest() internal { // Harvest farm tokens // Get pending rewards from farm contract uint256 pendingReward = IFarmChef(farmContractAddress).pendingShareAndPendingRewards(pid, address(this)); uint256 pegStabilityModuleFee = IFarmChef(farmContractAddress).pegStabilityModuleFee(); IOracle oracle = IOracle(IFarmChef(farmContractAddress).gsnakeOracle()); // Calculate the required Sonic (S) amount to cover PSM fee (15% of pending reward value) uint256 currentGSNAKEPriceInSonic = oracle.twap(earnedAddress, 1e18); //add 1% to make sure enough Sonic to cover fee uint256 amountSonicToPay = (currentGSNAKEPriceInSonic.mul(pendingReward).div(1e18)).mul(pegStabilityModuleFee + adjustSlippageFee).div(1000); // Harvest farm rewards before compounding, sending required Sonic (S) IFarmChef(farmContractAddress).harvest{value: amountSonicToPay}(pid); } function _payFees() internal { uint256 earnedAmount = IERC20(earnedAddress).balanceOf(address(this)); if (earnedAmount <= 0) { return; } emit Earned(earnedAddress, earnedAmount); //1. Swap token to repay S collateral (add adjustSlippageFee) and fees uint256 pegStabilityModuleFee = IFarmChef(farmContractAddress).pegStabilityModuleFee(); _swapTokenToS(earnedAddress, earnedAmount.mul(pegStabilityModuleFee + adjustSlippageFee + controllerFee).div(1000), address(this)); if (address(this).balance >= minSCollateralAmount.mul(120).div(100)) { (bool success, ) = payable(treasuryAddress).call{value: address(this).balance - minSCollateralAmount}(""); require(success, "transfer fee failed!"); } } function _compound() internal { //1. Convert earned token into want token uint256 earnedAmount = IERC20(earnedAddress).balanceOf(address(this)); // track totalEarned in S totalEarned = totalEarned.add(exchangeRate(earnedAddress, WS, earnedAmount)); if (earnedAddress != token0Address) { _swapTokenToToken(earnedAddress, token0Address, earnedAmount.div(2), address(this)); } if (earnedAddress != token1Address) { _swapTokenToToken(earnedAddress, token1Address, earnedAmount.div(2), address(this)); } // Get want tokens, ie. add liquidity uint256 token0Amt = IERC20(token0Address).balanceOf(address(this)); uint256 token1Amt = IERC20(token1Address).balanceOf(address(this)); if (token0Amt > 0 && token1Amt > 0) { _addLiquidity(token0Address, token1Address, stable, token0Amt, token1Amt); emit Compound(token0Address, token0Amt, token1Address, token1Amt); } } // 1. Harvest farm tokens // 2. Converts farm tokens into want tokens // 3. Deposits want tokens function earn() public override whenNotPaused onlyStrategist { _harvest(); _payFees(); _compound(); _farm(); lastEarnTime = block.timestamp; } function exchangeRate(address _inputToken, address _outputToken, uint256 _tokenAmount) public view returns (uint256) { uint256[] memory amounts = IRouter(dexRouterAddress).getAmountsOut(_tokenAmount, tokenRoutes[_inputToken][_outputToken]); return amounts[amounts.length - 1]; } function pendingHarvest() public view returns (uint256) { uint256 _earnedBal = IERC20(earnedAddress).balanceOf(address(this)); return IFarmChef(farmContractAddress).pendingShareAndPendingRewards(pid, address(this)).add(_earnedBal); } function pendingHarvestSValue() public view returns (uint256) { uint256 _pending = pendingHarvest(); return (_pending == 0) ? 0 : exchangeRate(earnedAddress, WS, _pending); } function pause() external onlyOwner { _pause(); } function unpause() external onlyOwner { _unpause(); } function setStrategist(address _strategist) external onlyOwner { strategist = _strategist; } function setFees(uint256 _controllerFee, uint256 _adjustSlippageFee) external onlyOwner { require(_controllerFee <= controllerFeeMax, "Strategy: value too high"); controllerFee = _controllerFee; require(adjustSlippageFee <= adjustSlippageFeeMax, "Strategy: value too high"); adjustSlippageFee = _adjustSlippageFee; } function setTreasuryAddress(address _treasuryAddress) external onlyOwner { require(_treasuryAddress != address(0), "zero"); treasuryAddress = _treasuryAddress; } function setDexRouterAddress(address _routerAddress) external onlyOwner { require(_routerAddress != address(0), "zero"); dexRouterAddress = _routerAddress; } function setAutoEarnLimit(uint256 _autoEarnLimit) external onlyOwner { autoEarnLimit = _autoEarnLimit; } function setMinSCollateralAmount(uint256 _minSCollateralAmount) external onlyOwner { minSCollateralAmount = _minSCollateralAmount; } function setMainPaths( IRouter.Route[] memory _earnedToToken0Path, IRouter.Route[] memory _earnedToToken1Path, IRouter.Route[] memory _earnedToWSPath ) external onlyOwner { setTokenRoute(earnedAddress, token0Address, _earnedToToken0Path); setTokenRoute(earnedAddress, token1Address, _earnedToToken1Path); setTokenRoute(earnedAddress, WS, _earnedToWSPath); } function setTokenRoute( address from, address to, IRouter.Route[] memory routes ) public onlyOwner { delete tokenRoutes[from][to]; for (uint256 i = 0; i < routes.length; i++) { tokenRoutes[from][to].push(routes[i]); } } function _swapTokenToS(address _inputToken, uint256 _amount, address to) internal { increaseAllowance(_inputToken, dexRouterAddress, _amount); if (_inputToken != WS) { IRouter(dexRouterAddress).swapExactTokensForETH(_amount, 0, tokenRoutes[_inputToken][WS], to, block.timestamp.add(1800)); } } function _swapTokenToToken(address _inputToken, address _outputToken, uint256 _amount, address to) internal { increaseAllowance(_inputToken, dexRouterAddress, _amount); if (_inputToken != _outputToken) { IRouter(dexRouterAddress).swapExactTokensForTokens(_amount, 0, tokenRoutes[_inputToken][_outputToken], to, block.timestamp.add(1800)); } } function _addLiquidity(address _tokenA, address _tokenB, bool _stable, uint256 _amountADesired, uint256 _amountBDesired) internal { increaseAllowance(_tokenA, dexRouterAddress, _amountADesired); increaseAllowance(_tokenB, dexRouterAddress, _amountBDesired); IRouter(dexRouterAddress).addLiquidity(_tokenA, _tokenB, _stable, _amountADesired, _amountBDesired, 0, 0, address(this), block.timestamp.add(1800)); } receive() external payable { } fallback() external payable { } function depositS() external payable { _depositS(); } function _depositS() internal { require(msg.value > 0, "Must send S"); emit DepositS(msg.sender, msg.value); } function withdrawS(uint256 amount) external onlyOwner { require(amount > 0, "Amount must be greater than zero"); require(address(this).balance >= amount, "Insufficient S balance in contract"); (bool success, ) = payable(treasuryAddress).call{value: amount}(""); require(success, "Withdraw failed"); emit WithdrawS(msg.sender, amount); } function inCaseTokensGetStuck(address _token, uint256 _amount) external override onlyOwner { require(_token != earnedAddress, "!safe"); require(_token != wantAddress, "!safe"); address _controller = controller; IERC20(_token).safeTransfer(_controller, _amount); emit InCaseTokensGetStuck(_token, _amount, _controller); } function togglePause() external onlyOwner { if (paused()) _unpause(); else _pause(); } function migrateFrom(address, uint256, uint256) external override onlyController { } /* ========== EMERGENCY ========== */ function setController(address _controller) external { require(_controller != address(0), "invalidAddress"); require(controller == msg.sender || timelock == msg.sender, "caller is not the controller nor timelock"); controller = _controller; } function setTimelock(address _timelock) external { require(timelock == msg.sender || (timelock == address(0) && owner() == msg.sender), "!timelock"); timelock = _timelock; } /** * @dev This is from Timelock contract. */ function executeTransaction(address target, uint256 value, string memory signature, bytes memory data) external onlyTimelock returns (bytes memory) { bytes memory callData; if (bytes(signature).length == 0) { callData = data; } else { callData = abi.encodePacked(bytes4(keccak256(bytes(signature))), data); } // solium-disable-next-line security/no-call-value (bool success, bytes memory returnData) = target.call{value : value}(callData); require(success, "Strategy::executeTransaction: Transaction execution reverted."); emit ExecuteTransaction(target, value, signature, data); return returnData; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"_controller","type":"address"},{"internalType":"address","name":"_timelock","type":"address"},{"internalType":"address","name":"_treasuryAddress","type":"address"},{"internalType":"address","name":"_farmContractAddress","type":"address"},{"internalType":"address","name":"_dexRouterAddress","type":"address"},{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"address","name":"_wantAddress","type":"address"},{"internalType":"address","name":"_earnedAddress","type":"address"},{"internalType":"address","name":"_token0","type":"address"},{"internalType":"address","name":"_token1","type":"address"},{"internalType":"bool","name":"_stable","type":"bool"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"token0Address","type":"address"},{"indexed":false,"internalType":"uint256","name":"token0Amt","type":"uint256"},{"indexed":false,"internalType":"address","name":"token1Address","type":"address"},{"indexed":false,"internalType":"uint256","name":"token1Amt","type":"uint256"}],"name":"Compound","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Deposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"DepositS","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"earnedAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"fee","type":"uint256"},{"indexed":false,"internalType":"address","name":"receiver","type":"address"}],"name":"DistributeFee","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"earnedAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"earnedAmt","type":"uint256"}],"name":"Earned","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"target","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"},{"indexed":false,"internalType":"string","name":"signature","type":"string"},{"indexed":false,"internalType":"bytes","name":"data","type":"bytes"}],"name":"ExecuteTransaction","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Farm","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"pegStabilityModuleFee","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"adjustSlippageFee","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"controllerFee","type":"uint256"}],"name":"Fees","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"tokenAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenAmt","type":"uint256"},{"indexed":false,"internalType":"address","name":"receiver","type":"address"}],"name":"InCaseTokensGetStuck","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":"account","type":"address"}],"name":"Unpaused","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Withdraw","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"WithdrawS","type":"event"},{"stateMutability":"payable","type":"fallback"},{"inputs":[],"name":"WS","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"adjustSlippageFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"adjustSlippageFeeMax","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"autoEarn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"autoEarnLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"compound","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"controller","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"controllerFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"controllerFeeMax","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"_wantAmt","type":"uint256"}],"name":"deposit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"depositS","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"dexRouterAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"earn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"earnedAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_inputToken","type":"address"},{"internalType":"address","name":"_outputToken","type":"address"},{"internalType":"uint256","name":"_tokenAmount","type":"uint256"}],"name":"exchangeRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"target","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"string","name":"signature","type":"string"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"executeTransaction","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"farm","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"farmContractAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getPricePerFullShare","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"harvestReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"inCaseTokensGetStuck","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"inFarmBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"isAuthorised","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastEarnTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"migrateFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"minSCollateralAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","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":"payFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"pendingHarvest","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pendingHarvestSValue","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pid","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"requiredSToHarvest","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_autoEarnLimit","type":"uint256"}],"name":"setAutoEarnLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_controller","type":"address"}],"name":"setController","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_routerAddress","type":"address"}],"name":"setDexRouterAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_controllerFee","type":"uint256"},{"internalType":"uint256","name":"_adjustSlippageFee","type":"uint256"}],"name":"setFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"bool","name":"stable","type":"bool"}],"internalType":"struct IRouter.Route[]","name":"_earnedToToken0Path","type":"tuple[]"},{"components":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"bool","name":"stable","type":"bool"}],"internalType":"struct IRouter.Route[]","name":"_earnedToToken1Path","type":"tuple[]"},{"components":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"bool","name":"stable","type":"bool"}],"internalType":"struct IRouter.Route[]","name":"_earnedToWSPath","type":"tuple[]"}],"name":"setMainPaths","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_minSCollateralAmount","type":"uint256"}],"name":"setMinSCollateralAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_strategist","type":"address"}],"name":"setStrategist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_timelock","type":"address"}],"name":"setTimelock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"components":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"bool","name":"stable","type":"bool"}],"internalType":"struct IRouter.Route[]","name":"routes","type":"tuple[]"}],"name":"setTokenRoute","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_treasuryAddress","type":"address"}],"name":"setTreasuryAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sharesTotal","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"stable","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"strategist","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"timelock","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"togglePause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"token0Address","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"token1Address","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"tokenRoutes","outputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"bool","name":"stable","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalEarned","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":"treasuryAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"wantAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"wantLockedTotal","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"_wantAmt","type":"uint256"}],"name":"withdraw","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdrawS","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
60806040526000600d55678ac7230489e80000600e556000600f556000601055600060115568056bc75e2d63100000601255600a601355606460145560326015553480156200004d57600080fd5b5060405162003c5038038062003c508339810160408190526200007091620001b8565b6200007b336200014b565b6001805560028054600a80546001600160a01b039e8f166001600160a01b031991821617909155600b8054821633179055600c80549d8f169d82169d909d17909c55601680549b8e169b8d169b909b17909a55978b16610100026001600160a81b0319998a16179097556008805460048054968d16968c169690961790955560058054938c16938b169390931790925560068054918b16918a16919091179055600393909355600780549189169190971617909555911515600160a01b029390921691909316171790556200029a565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b80516001600160a01b0381168114620001b357600080fd5b919050565b60008060008060008060008060008060006101608c8e031215620001db57600080fd5b620001e68c6200019b565b9a50620001f660208d016200019b565b99506200020660408d016200019b565b98506200021660608d016200019b565b97506200022660808d016200019b565b965060a08c015195506200023d60c08d016200019b565b94506200024d60e08d016200019b565b93506200025e6101008d016200019b565b92506200026f6101208d016200019b565b91506101408c015180151581146200028657600080fd5b809150509295989b509295989b9093969950565b6139a680620002aa6000396000f3fe6080604052600436106103815760003560e01c80638da5cb5b116101cf578063c7b9d53011610101578063e7a036791161009a578063f2fde38b1161006c578063f2fde38b14610a12578063f3fef3a314610a32578063f69e204614610a52578063f77c479114610a6757005b8063e7a03679146109a6578063e7f67fb1146109c6578063e96c8bcf146109e6578063f1068454146109fc57005b8063d7cb416f116100d3578063d7cb416f1461093c578063db7a3c0f1461095c578063e68b536414610971578063e71984741461098657005b8063c7b9d5301461089f578063cfc2b550146108bf578063d33219b414610907578063d389800f1461092757005b8063aeaad0dc11610173578063c0762e5e11610145578063c0762e5e1461082a578063c4ae31681461084a578063c5f956af1461085f578063c6d758cb1461087f57005b8063aeaad0dc146107d7578063ba0c108f146107df578063bb97517e146107f5578063bdacb3031461080a57005b8063a0fab119116101ac578063a0fab11914610781578063a84fd93f14610797578063ad7a672f146107ad578063ae335695146107c257005b80638da5cb5b1461071e57806392eefe9b1461073c5780639fc33a9f1461075c57005b80635a34928e116102b3578063701f66041161024c5780637ff36fbe1161021e5780637ff36fbe146106b35780638456cb59146106d3578063856b6dc1146106e857806385f02dd61461070857005b8063701f66041461064957806370a3cb1114610669578063715018a61461068957806377c7b8fc1461069e57005b806362779e151161028557806362779e15146105e95780636605bfda146105fe57806367d03db81461061e5780636dfa8d991461063357005b80635a34928e1461057e5780635afbbaab146105935780635c975abb146105a95780635d409359146105c157005b806325d5f7331161032557806342da4eb3116102f757806342da4eb31461051257806344a3955e1461052857806347e7ef241461053e57806351b699cd1461055e57005b806325d5f733146104a55780632717eff3146104c557806336e9332d146104e85780633f4ba83a146104fd57005b8063202a034c1161035e578063202a034c146104075780632224fa251461042757806322be3de11461045457806325baef531461048557005b80630b78f9c01461038a5780631a2315b8146103aa5780631fe4a686146103ca57005b3661038857005b005b34801561039657600080fd5b506103886103a536600461311d565b610a87565b3480156103b657600080fd5b506103886103c536600461313f565b610b3a565b3480156103d657600080fd5b50600b546103ea906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b34801561041357600080fd5b506103886104223660046132c3565b610cbb565b34801561043357600080fd5b5061044761044236600461337d565b610dc0565b6040516103fe9190613480565b34801561046057600080fd5b5060085461047590600160a01b900460ff1681565b60405190151581526020016103fe565b34801561049157600080fd5b506103886104a0366004613493565b610f84565b3480156104b157600080fd5b506103886104c03660046134c8565b610fb3565b3480156104d157600080fd5b506104da606481565b6040519081526020016103fe565b3480156104f457600080fd5b50610388611020565b34801561050957600080fd5b50610388611032565b34801561051e57600080fd5b506104da600f5481565b34801561053457600080fd5b506104da60105481565b34801561054a57600080fd5b506104da610559366004613546565b611042565b34801561056a57600080fd5b50610475610579366004613572565b611131565b34801561058a57600080fd5b50610388611176565b34801561059f57600080fd5b506104da60135481565b3480156105b557600080fd5b5060025460ff16610475565b3480156105cd57600080fd5b506103ea73039e2fb66102314ce7b64ce5ce3e5183bc94ad3881565b3480156105f557600080fd5b50610388611186565b34801561060a57600080fd5b50610388610619366004613572565b611196565b34801561062a57600080fd5b506104da6111ff565b34801561063f57600080fd5b506104da60115481565b34801561065557600080fd5b506104da61066436600461358f565b61124b565b34801561067557600080fd5b5061038861068436600461313f565b611314565b34801561069557600080fd5b50610388611321565b3480156106aa57600080fd5b506104da611333565b3480156106bf57600080fd5b506005546103ea906001600160a01b031681565b3480156106df57600080fd5b50610388611374565b3480156106f457600080fd5b5061038861070336600461313f565b611384565b34801561071457600080fd5b506104da60155481565b34801561072a57600080fd5b506000546001600160a01b03166103ea565b34801561074857600080fd5b50610388610757366004613572565b611391565b34801561076857600080fd5b506002546103ea9061010090046001600160a01b031681565b34801561078d57600080fd5b506104da600e5481565b3480156107a357600080fd5b506104da60145481565b3480156107b957600080fd5b506104da61147b565b3480156107ce57600080fd5b506103886114fc565b6103886115fc565b3480156107eb57600080fd5b506104da600d5481565b34801561080157600080fd5b506104da611604565b34801561081657600080fd5b50610388610825366004613572565b61168a565b34801561083657600080fd5b50610388610845366004613572565b61172a565b34801561085657600080fd5b50610388611793565b34801561086b57600080fd5b506016546103ea906001600160a01b031681565b34801561088b57600080fd5b5061038861089a366004613546565b6117ae565b3480156108ab57600080fd5b506103886108ba366004613572565b6118b2565b3480156108cb57600080fd5b506108df6108da36600461358f565b6118dc565b604080516001600160a01b0394851681529390921660208401521515908201526060016103fe565b34801561091357600080fd5b50600c546103ea906001600160a01b031681565b34801561093357600080fd5b5061038861193d565b34801561094857600080fd5b506006546103ea906001600160a01b031681565b34801561096857600080fd5b506104da6119b9565b34801561097d57600080fd5b506104da611ab3565b34801561099257600080fd5b506007546103ea906001600160a01b031681565b3480156109b257600080fd5b506004546103ea906001600160a01b031681565b3480156109d257600080fd5b506008546103ea906001600160a01b031681565b3480156109f257600080fd5b506104da60125481565b348015610a0857600080fd5b506104da60035481565b348015610a1e57600080fd5b50610388610a2d366004613572565b611c7a565b348015610a3e57600080fd5b506104da610a4d366004613546565b611cf3565b348015610a5e57600080fd5b50610388611f0d565b348015610a7357600080fd5b50600a546103ea906001600160a01b031681565b610a8f611f1d565b6064821115610ae05760405162461bcd60e51b81526020600482015260186024820152770a6e8e4c2e8cacef27440ecc2d8eaca40e8dede40d0d2ced60431b60448201526064015b60405180910390fd5b60158290556014546013541115610b345760405162461bcd60e51b81526020600482015260186024820152770a6e8e4c2e8cacef27440ecc2d8eaca40e8dede40d0d2ced60431b6044820152606401610ad7565b60135550565b610b42611f1d565b60008111610b925760405162461bcd60e51b815260206004820181905260248201527f416d6f756e74206d7573742062652067726561746572207468616e207a65726f6044820152606401610ad7565b80471015610bed5760405162461bcd60e51b815260206004820152602260248201527f496e73756666696369656e7420532062616c616e636520696e20636f6e74726160448201526118dd60f21b6064820152608401610ad7565b6016546040516000916001600160a01b03169083908381818185875af1925050503d8060008114610c3a576040519150601f19603f3d011682016040523d82523d6000602084013e610c3f565b606091505b5050905080610c825760405162461bcd60e51b815260206004820152600f60248201526e15da5d1a191c985dc819985a5b1959608a1b6044820152606401610ad7565b60405182815233907f3ab94c2d450999c961d10ed65cef0fc04929ce8a38e411793ca2cb0fef9036279060200160405180910390a25050565b610cc3611f1d565b6001600160a01b0380841660009081526009602090815260408083209386168352929052908120610cf3916130cc565b60005b8151811015610dba576001600160a01b0380851660009081526009602090815260408083209387168352929052208251839083908110610d3857610d386135d0565b602090810291909101810151825460018082018555600094855293839020825160029092020180546001600160a01b0319166001600160a01b0392831617815592820151929093018054604090920151929093166001600160a81b031990911617600160a01b9115159190910217905580610db2816135fc565b915050610cf6565b50505050565b600c546060906001600160a01b03163314610e1d5760405162461bcd60e51b815260206004820181905260248201527f53747261746567793a2063616c6c6572206973206e6f742074696d656c6f636b6044820152606401610ad7565b6060835160001415610e30575081610e5c565b838051906020012083604051602001610e4a929190613617565b60405160208183030381529060405290505b600080876001600160a01b03168784604051610e789190613648565b60006040518083038185875af1925050503d8060008114610eb5576040519150601f19603f3d011682016040523d82523d6000602084013e610eba565b606091505b509150915081610f325760405162461bcd60e51b815260206004820152603d60248201527f53747261746567793a3a657865637574655472616e73616374696f6e3a20547260448201527f616e73616374696f6e20657865637574696f6e2072657665727465642e0000006064820152608401610ad7565b876001600160a01b03167f88405ca50016c636e025868e263efe5a9f63bf11cc45404f7616394c7dc389d0888888604051610f6f93929190613664565b60405180910390a2925050505b949350505050565b600a546001600160a01b03163314610fae5760405162461bcd60e51b8152600401610ad790613699565b505050565b610fbb611f1d565b600754600554610fd8916001600160a01b03908116911685610cbb565b600754600654610ff5916001600160a01b03908116911684610cbb565b600754610fae906001600160a01b031673039e2fb66102314ce7b64ce5ce3e5183bc94ad3883610cbb565b611028611f1d565b611030611f77565b565b61103a611f1d565b6110306120ce565b600a546000906001600160a01b0316331461106f5760405162461bcd60e51b8152600401610ad790613699565b611077612120565b61107f61217a565b600454611097906001600160a01b03163330856121c0565b600f548290158015906110ac57506000601054115b156110d5576110d2600f546110cc6010548661222b90919063ffffffff16565b9061223e565b90505b6010546110e2908261224a565b6010556110ed611f77565b6040518381527f4d6ce1e535dbade1c23defba91e23b8f791ce5edc0cc320257a2b364e4e384269060200160405180910390a1905061112b60018055565b92915050565b600080546001600160a01b038381169116148061115b5750600b546001600160a01b038381169116145b8061112b575050600c546001600160a01b0390811691161490565b61117e611f1d565b611030612256565b61118e611f1d565b6110306124f3565b61119e611f1d565b6001600160a01b0381166111dd5760405162461bcd60e51b8152600401610ad7906020808252600490820152637a65726f60e01b604082015260600190565b601680546001600160a01b0319166001600160a01b0392909216919091179055565b60008061120a6119b9565b905080156112425760075461123d906001600160a01b031673039e2fb66102314ce7b64ce5ce3e5183bc94ad388361124b565b611245565b60005b91505090565b6008546001600160a01b038481166000908152600960209081526040808320878516845290915280822090516326207f2d60e21b8152919384931691639881fcb49161129c9187919060040161373a565b600060405180830381865afa1580156112b9573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526112e19190810190613753565b905080600182516112f291906137d9565b81518110611302576113026135d0565b60200260200101519150509392505050565b61131c611f1d565b600e55565b611329611f1d565b611030600061273f565b6000601054600014611367576113626010546110cc670de0b6b3a7640000600f5461222b90919063ffffffff16565b905090565b50670de0b6b3a764000090565b61137c611f1d565b61103061278f565b61138c611f1d565b601255565b6001600160a01b0381166113d85760405162461bcd60e51b815260206004820152600e60248201526d696e76616c69644164647265737360901b6044820152606401610ad7565b600a546001600160a01b03163314806113fb5750600c546001600160a01b031633145b6114595760405162461bcd60e51b815260206004820152602960248201527f63616c6c6572206973206e6f742074686520636f6e74726f6c6c6572206e6f726044820152682074696d656c6f636b60b81b6064820152608401610ad7565b600a80546001600160a01b0319166001600160a01b0392909216919091179055565b6000611485611604565b600480546040516370a0823160e01b815230928101929092526001600160a01b0316906370a0823190602401602060405180830381865afa1580156114ce573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114f291906137f0565b6113629190613809565b600b546001600160a01b031633148061152e5750336115236000546001600160a01b031690565b6001600160a01b0316145b61154a5760405162461bcd60e51b8152600401610ad790613821565b60006115546111ff565b9050600e548110156115945760405162461bcd60e51b81526020600482015260096024820152681d1bdbc81cdb585b1b60ba1b6044820152606401610ad7565b600061159e611ab3565b9050804710156115f05760405162461bcd60e51b815260206004820152601760248201527f6e6f7420656e6f756768205320636f6c6c61746572616c0000000000000000006044820152606401610ad7565b6115f861193d565b5050565b6110306127cc565b6002546003546040516393f1a40b60e01b8152600481019190915230602482015260009182916101009091046001600160a01b0316906393f1a40b906044016040805180830381865afa15801561165f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116839190613867565b5092915050565b600c546001600160a01b03163314806116d05750600c546001600160a01b03161580156116d05750336116c56000546001600160a01b031690565b6001600160a01b0316145b6117085760405162461bcd60e51b81526020600482015260096024820152682174696d656c6f636b60b81b6044820152606401610ad7565b600c80546001600160a01b0319166001600160a01b0392909216919091179055565b611732611f1d565b6001600160a01b0381166117715760405162461bcd60e51b8152600401610ad7906020808252600490820152637a65726f60e01b604082015260600190565b600880546001600160a01b0319166001600160a01b0392909216919091179055565b61179b611f1d565b60025460ff161561137c576110306120ce565b6117b6611f1d565b6007546001600160a01b03838116911614156117fc5760405162461bcd60e51b8152602060048201526005602482015264217361666560d81b6044820152606401610ad7565b6004546001600160a01b03838116911614156118425760405162461bcd60e51b8152602060048201526005602482015264217361666560d81b6044820152606401610ad7565b600a546001600160a01b039081169061185e9084168284612841565b604080516001600160a01b038086168252602082018590528316918101919091527f22f92dfb4f608ea5db1e9bb08c0b4f5518af93b1259d335fe05900056096ab2c906060015b60405180910390a1505050565b6118ba611f1d565b600b80546001600160a01b0319166001600160a01b0392909216919091179055565b6009602052826000526040600020602052816000526040600020818154811061190457600080fd5b6000918252602090912060029091020180546001909101546001600160a01b0391821694509081169250600160a01b900460ff16905083565b61194561217a565b600b546001600160a01b031633148061197757503361196c6000546001600160a01b031690565b6001600160a01b0316145b6119935760405162461bcd60e51b8152600401610ad790613821565b61199b612256565b6119a36124f3565b6119ab612871565b6119b3611f77565b42600d55565b6007546040516370a0823160e01b815230600482015260009182916001600160a01b03909116906370a0823190602401602060405180830381865afa158015611a06573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a2a91906137f0565b600254600354604051636b2681c560e01b8152600481019190915230602482015291925061124591839161010090046001600160a01b031690636b2681c590604401602060405180830381865afa158015611a89573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611aad91906137f0565b9061224a565b600080611abe6119b9565b90506000600260019054906101000a90046001600160a01b03166001600160a01b0316632760f89b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611b15573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b39919061388b565b600754604051630d01142560e31b81526001600160a01b039182166004820152670de0b6b3a7640000602482015291925060009190831690636808a12890604401602060405180830381865afa158015611b97573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bbb91906137f0565b90506000611bd5670de0b6b3a76400006110cc868561222b565b90506000600260019054906101000a90046001600160a01b03166001600160a01b031663ba44a45a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611c2c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c5091906137f0565b9050611c706103e86110cc60135484611c699190613809565b859061222b565b9550505050505090565b611c82611f1d565b6001600160a01b038116611ce75760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610ad7565b611cf08161273f565b50565b600a546000906001600160a01b03163314611d205760405162461bcd60e51b8152600401610ad790613699565b611d28612120565b60008211611d6e5760405162461bcd60e51b815260206004820152601360248201527214dd1c985d1959de4e880857ddd85b9d105b5d606a1b6044820152606401610ad7565b600254600354604051630441a3e760e41b81526004810191909152602481018490526101009091046001600160a01b03169063441a3e7090604401600060405180830381600087803b158015611dc357600080fd5b505af1158015611dd7573d6000803e3d6000fd5b5050600480546040516370a0823160e01b81523092810192909252600093506001600160a01b031691506370a0823190602401602060405180830381865afa158015611e27573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e4b91906137f0565b905080831115611e59578092505b82600f541015611e6957600f5492505b6000611e86600f546110cc6010548761222b90919063ffffffff16565b9050601054811115611e9757506010545b601054611ea49082612b0f565b601055600f54611eb49085612b0f565b600f55600454611ece906001600160a01b03163386612841565b6040518481527f5b6b431d4476a211bb7d41c20d1aab9ae2321deee0d20be3d9fc9b1093fa6e3d9060200160405180910390a191505061112b60018055565b611f15611f1d565b611030612871565b6000546001600160a01b031633146110305760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610ad7565b600480546040516370a0823160e01b815230928101929092526001600160a01b03169060009082906370a0823190602401602060405180830381865afa158015611fc5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611fe991906137f0565b600f54909150611ff9908261224a565b600f5580156115f857600454600254612024916001600160a01b039081169161010090041683612b1b565b600254600354604051631c57762b60e31b81526004810191909152602481018390526101009091046001600160a01b03169063e2bbb15890604401600060405180830381600087803b15801561207957600080fd5b505af115801561208d573d6000803e3d6000fd5b505050507fc217459869eed80bfbe5c11e78ab58912eedfd106342671821b6e96d1615dc7f816040516120c291815260200190565b60405180910390a15050565b6120d6612b2f565b6002805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b600260015414156121735760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610ad7565b6002600155565b60025460ff16156110305760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610ad7565b6040516001600160a01b0380851660248301528316604482015260648101829052610dba9085906323b872dd60e01b906084015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152612b78565b600061223782846138a8565b9392505050565b600061223782846138c7565b60006122378284613809565b600254600354604051636b2681c560e01b8152600481019190915230602482015260009161010090046001600160a01b031690636b2681c590604401602060405180830381865afa1580156122af573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122d391906137f0565b90506000600260019054906101000a90046001600160a01b03166001600160a01b031663ba44a45a6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561232a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061234e91906137f0565b90506000600260019054906101000a90046001600160a01b03166001600160a01b0316632760f89b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156123a5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123c9919061388b565b600754604051630d01142560e31b81526001600160a01b039182166004820152670de0b6b3a7640000602482015291925060009190831690636808a12890604401602060405180830381865afa158015612427573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061244b91906137f0565b905060006124826103e86110cc601354876124669190613809565b61247c670de0b6b3a76400006110cc888c61222b565b9061222b565b600254600354604051636ee3193160e11b8152600481019190915291925061010090046001600160a01b03169063ddc632629083906024016000604051808303818588803b1580156124d357600080fd5b505af11580156124e7573d6000803e3d6000fd5b50505050505050505050565b6007546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa15801561253c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061256091906137f0565b90506000811161256d5750565b600754604080516001600160a01b039092168252602082018390527f053fa1fc52294a40b4ff1a988765bd298c00caa24d685cc3f767dcfde254ef9a910160405180910390a16000600260019054906101000a90046001600160a01b03166001600160a01b031663ba44a45a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612608573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061262c91906137f0565b9050612678600760009054906101000a90046001600160a01b03166126726103e86110cc601554601354876126619190613809565b61266b9190613809565b879061222b565b30612c4d565b61269360646110cc607860125461222b90919063ffffffff16565b47106115f8576016546012546000916001600160a01b0316906126b690476137d9565b604051600081818185875af1925050503d80600081146126f2576040519150601f19603f3d011682016040523d82523d6000602084013e6126f7565b606091505b5050905080610fae5760405162461bcd60e51b81526020600482015260146024820152737472616e7366657220666565206661696c65642160601b6044820152606401610ad7565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b61279761217a565b6002805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586121033390565b6000341161280a5760405162461bcd60e51b815260206004820152600b60248201526a4d7573742073656e64205360a81b6044820152606401610ad7565b60405134815233907ff44da3c8956831d752012b0342d6776727f73af732575ff65ace4dc45068e3719060200160405180910390a2565b6040516001600160a01b038316602482015260448101829052610fae90849063a9059cbb60e01b906064016121f4565b6007546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa1580156128ba573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128de91906137f0565b60075490915061291990612910906001600160a01b031673039e2fb66102314ce7b64ce5ce3e5183bc94ad388461124b565b6011549061224a565b6011556005546007546001600160a01b0390811691161461295c5760075460055461295c916001600160a01b03908116911661295684600261223e565b30612d36565b6006546007546001600160a01b0390811691161461299657600754600654612996916001600160a01b03908116911661295684600261223e565b6005546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa1580156129df573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a0391906137f0565b6006546040516370a0823160e01b81523060048201529192506000916001600160a01b03909116906370a0823190602401602060405180830381865afa158015612a51573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a7591906137f0565b9050600082118015612a875750600081115b15610fae57600554600654600854612ab8926001600160a01b03908116921690600160a01b900460ff168585612e03565b600554600654604080516001600160a01b039384168152602081018690529290911690820152606081018290527f44552da03f807ace3e5f27e98e694712dfe668c743514b28d4d9f5ab70574b0f906080016118a5565b600061223782846137d9565b610fae6001600160a01b0384168383612eff565b60025460ff166110305760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b6044820152606401610ad7565b6000612bcd826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316612fac9092919063ffffffff16565b9050805160001480612bee575080806020019051810190612bee91906138e9565b610fae5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610ad7565b600854612c659084906001600160a01b031684612b1b565b6001600160a01b03831673039e2fb66102314ce7b64ce5ce3e5183bc94ad3814610fae576008546001600160a01b03848116600090815260096020908152604080832073039e2fb66102314ce7b64ce5ce3e5183bc94ad388452909152812091909216916318a130869185919085612cdf4261070861224a565b6040518663ffffffff1660e01b8152600401612cff959493929190613906565b600060405180830381600087803b158015612d1957600080fd5b505af1158015612d2d573d6000803e3d6000fd5b50505050505050565b600854612d4e9085906001600160a01b031684612b1b565b826001600160a01b0316846001600160a01b031614610dba576008546001600160a01b03858116600090815260096020908152604080832088851684529091528120919092169163f41766d89185919085612dab4261070861224a565b6040518663ffffffff1660e01b8152600401612dcb959493929190613906565b600060405180830381600087803b158015612de557600080fd5b505af1158015612df9573d6000803e3d6000fd5b5050505050505050565b600854612e1b9086906001600160a01b031684612b1b565b600854612e339085906001600160a01b031683612b1b565b6008546001600160a01b0316635a47ddc3868686868660008030612e594261070861224a565b60405160e08b901b6001600160e01b03191681526001600160a01b03998a166004820152978916602489015295151560448801526064870194909452608486019290925260a485015260c484015290921660e4820152610104810191909152610124016060604051808303816000875af1158015612edb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612df99190613942565b604051636eb1769f60e11b81523060048201526001600160a01b0383811660248301526000919085169063dd62ed3e90604401602060405180830381865afa158015612f4f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612f7391906137f0565b9050610dba8463095ea7b360e01b85612f8c8686613809565b6040516001600160a01b03909216602483015260448201526064016121f4565b6060610f7c848460008585600080866001600160a01b03168587604051612fd39190613648565b60006040518083038185875af1925050503d8060008114613010576040519150601f19603f3d011682016040523d82523d6000602084013e613015565b606091505b509150915061302687838387613031565b979650505050505050565b6060831561309d578251613096576001600160a01b0385163b6130965760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610ad7565b5081610f7c565b610f7c83838151156130b25781518083602001fd5b8060405162461bcd60e51b8152600401610ad79190613480565b5080546000825560020290600052602060002090810190611cf091905b808211156131195780546001600160a01b03191681556001810180546001600160a81b03191690556002016130e9565b5090565b6000806040838503121561313057600080fd5b50508035926020909101359150565b60006020828403121561315157600080fd5b5035919050565b6001600160a01b0381168114611cf057600080fd5b634e487b7160e01b600052604160045260246000fd5b6040516060810167ffffffffffffffff811182821017156131a6576131a661316d565b60405290565b604051601f8201601f1916810167ffffffffffffffff811182821017156131d5576131d561316d565b604052919050565b600067ffffffffffffffff8211156131f7576131f761316d565b5060051b60200190565b8015158114611cf057600080fd5b600082601f83011261322057600080fd5b81356020613235613230836131dd565b6131ac565b8281526060928302850182019282820191908785111561325457600080fd5b8387015b858110156132b65781818a0312156132705760008081fd5b613278613183565b813561328381613158565b81528186013561329281613158565b818701526040828101356132a581613201565b908201528452928401928101613258565b5090979650505050505050565b6000806000606084860312156132d857600080fd5b83356132e381613158565b925060208401356132f381613158565b9150604084013567ffffffffffffffff81111561330f57600080fd5b61331b8682870161320f565b9150509250925092565b600067ffffffffffffffff83111561333f5761333f61316d565b613352601f8401601f19166020016131ac565b905082815283838301111561336657600080fd5b828260208301376000602084830101529392505050565b6000806000806080858703121561339357600080fd5b843561339e81613158565b935060208501359250604085013567ffffffffffffffff808211156133c257600080fd5b818701915087601f8301126133d657600080fd5b6133e588833560208501613325565b935060608701359150808211156133fb57600080fd5b508501601f8101871361340d57600080fd5b61341c87823560208401613325565b91505092959194509250565b60005b8381101561344357818101518382015260200161342b565b83811115610dba5750506000910152565b6000815180845261346c816020860160208601613428565b601f01601f19169290920160200192915050565b6020815260006122376020830184613454565b6000806000606084860312156134a857600080fd5b83356134b381613158565b95602085013595506040909401359392505050565b6000806000606084860312156134dd57600080fd5b833567ffffffffffffffff808211156134f557600080fd5b6135018783880161320f565b9450602086013591508082111561351757600080fd5b6135238783880161320f565b9350604086013591508082111561353957600080fd5b5061331b8682870161320f565b6000806040838503121561355957600080fd5b823561356481613158565b946020939093013593505050565b60006020828403121561358457600080fd5b813561223781613158565b6000806000606084860312156135a457600080fd5b83356135af81613158565b925060208401356135bf81613158565b929592945050506040919091013590565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b6000600019821415613610576136106135e6565b5060010190565b6001600160e01b031983168152815160009061363a816004850160208701613428565b919091016004019392505050565b6000825161365a818460208701613428565b9190910192915050565b83815260606020820152600061367d6060830185613454565b828103604084015261368f8185613454565b9695505050505050565b6020808252601c908201527f63616c6c6572206973206e6f742074686520636f6e74726f6c6c657200000000604082015260600190565b6000815480845260208085019450836000528060002060005b8381101561372f5781546001600160a01b039081168852600183810154918216858a015260a09190911c60ff1615156040890152606090970196600290920191016136e9565b509495945050505050565b828152604060208201526000610f7c60408301846136d0565b6000602080838503121561376657600080fd5b825167ffffffffffffffff81111561377d57600080fd5b8301601f8101851361378e57600080fd5b805161379c613230826131dd565b81815260059190911b820183019083810190878311156137bb57600080fd5b928401925b82841015613026578351825292840192908401906137c0565b6000828210156137eb576137eb6135e6565b500390565b60006020828403121561380257600080fd5b5051919050565b6000821982111561381c5761381c6135e6565b500190565b60208082526026908201527f53747261746567793a2063616c6c6572206973206e6f742074686520737472616040820152651d1959da5cdd60d21b606082015260800190565b6000806040838503121561387a57600080fd5b505080516020909101519092909150565b60006020828403121561389d57600080fd5b815161223781613158565b60008160001904831182151516156138c2576138c26135e6565b500290565b6000826138e457634e487b7160e01b600052601260045260246000fd5b500490565b6000602082840312156138fb57600080fd5b815161223781613201565b85815284602082015260a06040820152600061392560a08301866136d0565b6001600160a01b0394909416606083015250608001529392505050565b60008060006060848603121561395757600080fd5b835192506020840151915060408401519050925092509256fea264697066735822122054e42377cbf28353b4843db8c44369698f64026d7a05f071b713c7f4816f13ce64736f6c634300080c00330000000000000000000000008ae21a4f5b99f18de502fceb3174c74229ab326c00000000000000000000000071fd21a764ef295fb7bfbdf4d2ebffe862e76fbf000000000000000000000000c547e8dd3844fb5bc178120a121b365ea790774e000000000000000000000000fe6915a0983a304f4d131da635664030da06bcd20000000000000000000000001d368773735ee1e678950b7a97bca2cafb330cdc0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000287c6882de298665977787e268f3dba052a6e251000000000000000000000000674a430f531847a6f8976a900f8ace765f896a1b0000000000000000000000003a516e01f82c1e18916ed69a81dd498ef64bb157000000000000000000000000039e2fb66102314ce7b64ce5ce3e5183bc94ad380000000000000000000000000000000000000000000000000000000000000001
Deployed Bytecode
0x6080604052600436106103815760003560e01c80638da5cb5b116101cf578063c7b9d53011610101578063e7a036791161009a578063f2fde38b1161006c578063f2fde38b14610a12578063f3fef3a314610a32578063f69e204614610a52578063f77c479114610a6757005b8063e7a03679146109a6578063e7f67fb1146109c6578063e96c8bcf146109e6578063f1068454146109fc57005b8063d7cb416f116100d3578063d7cb416f1461093c578063db7a3c0f1461095c578063e68b536414610971578063e71984741461098657005b8063c7b9d5301461089f578063cfc2b550146108bf578063d33219b414610907578063d389800f1461092757005b8063aeaad0dc11610173578063c0762e5e11610145578063c0762e5e1461082a578063c4ae31681461084a578063c5f956af1461085f578063c6d758cb1461087f57005b8063aeaad0dc146107d7578063ba0c108f146107df578063bb97517e146107f5578063bdacb3031461080a57005b8063a0fab119116101ac578063a0fab11914610781578063a84fd93f14610797578063ad7a672f146107ad578063ae335695146107c257005b80638da5cb5b1461071e57806392eefe9b1461073c5780639fc33a9f1461075c57005b80635a34928e116102b3578063701f66041161024c5780637ff36fbe1161021e5780637ff36fbe146106b35780638456cb59146106d3578063856b6dc1146106e857806385f02dd61461070857005b8063701f66041461064957806370a3cb1114610669578063715018a61461068957806377c7b8fc1461069e57005b806362779e151161028557806362779e15146105e95780636605bfda146105fe57806367d03db81461061e5780636dfa8d991461063357005b80635a34928e1461057e5780635afbbaab146105935780635c975abb146105a95780635d409359146105c157005b806325d5f7331161032557806342da4eb3116102f757806342da4eb31461051257806344a3955e1461052857806347e7ef241461053e57806351b699cd1461055e57005b806325d5f733146104a55780632717eff3146104c557806336e9332d146104e85780633f4ba83a146104fd57005b8063202a034c1161035e578063202a034c146104075780632224fa251461042757806322be3de11461045457806325baef531461048557005b80630b78f9c01461038a5780631a2315b8146103aa5780631fe4a686146103ca57005b3661038857005b005b34801561039657600080fd5b506103886103a536600461311d565b610a87565b3480156103b657600080fd5b506103886103c536600461313f565b610b3a565b3480156103d657600080fd5b50600b546103ea906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b34801561041357600080fd5b506103886104223660046132c3565b610cbb565b34801561043357600080fd5b5061044761044236600461337d565b610dc0565b6040516103fe9190613480565b34801561046057600080fd5b5060085461047590600160a01b900460ff1681565b60405190151581526020016103fe565b34801561049157600080fd5b506103886104a0366004613493565b610f84565b3480156104b157600080fd5b506103886104c03660046134c8565b610fb3565b3480156104d157600080fd5b506104da606481565b6040519081526020016103fe565b3480156104f457600080fd5b50610388611020565b34801561050957600080fd5b50610388611032565b34801561051e57600080fd5b506104da600f5481565b34801561053457600080fd5b506104da60105481565b34801561054a57600080fd5b506104da610559366004613546565b611042565b34801561056a57600080fd5b50610475610579366004613572565b611131565b34801561058a57600080fd5b50610388611176565b34801561059f57600080fd5b506104da60135481565b3480156105b557600080fd5b5060025460ff16610475565b3480156105cd57600080fd5b506103ea73039e2fb66102314ce7b64ce5ce3e5183bc94ad3881565b3480156105f557600080fd5b50610388611186565b34801561060a57600080fd5b50610388610619366004613572565b611196565b34801561062a57600080fd5b506104da6111ff565b34801561063f57600080fd5b506104da60115481565b34801561065557600080fd5b506104da61066436600461358f565b61124b565b34801561067557600080fd5b5061038861068436600461313f565b611314565b34801561069557600080fd5b50610388611321565b3480156106aa57600080fd5b506104da611333565b3480156106bf57600080fd5b506005546103ea906001600160a01b031681565b3480156106df57600080fd5b50610388611374565b3480156106f457600080fd5b5061038861070336600461313f565b611384565b34801561071457600080fd5b506104da60155481565b34801561072a57600080fd5b506000546001600160a01b03166103ea565b34801561074857600080fd5b50610388610757366004613572565b611391565b34801561076857600080fd5b506002546103ea9061010090046001600160a01b031681565b34801561078d57600080fd5b506104da600e5481565b3480156107a357600080fd5b506104da60145481565b3480156107b957600080fd5b506104da61147b565b3480156107ce57600080fd5b506103886114fc565b6103886115fc565b3480156107eb57600080fd5b506104da600d5481565b34801561080157600080fd5b506104da611604565b34801561081657600080fd5b50610388610825366004613572565b61168a565b34801561083657600080fd5b50610388610845366004613572565b61172a565b34801561085657600080fd5b50610388611793565b34801561086b57600080fd5b506016546103ea906001600160a01b031681565b34801561088b57600080fd5b5061038861089a366004613546565b6117ae565b3480156108ab57600080fd5b506103886108ba366004613572565b6118b2565b3480156108cb57600080fd5b506108df6108da36600461358f565b6118dc565b604080516001600160a01b0394851681529390921660208401521515908201526060016103fe565b34801561091357600080fd5b50600c546103ea906001600160a01b031681565b34801561093357600080fd5b5061038861193d565b34801561094857600080fd5b506006546103ea906001600160a01b031681565b34801561096857600080fd5b506104da6119b9565b34801561097d57600080fd5b506104da611ab3565b34801561099257600080fd5b506007546103ea906001600160a01b031681565b3480156109b257600080fd5b506004546103ea906001600160a01b031681565b3480156109d257600080fd5b506008546103ea906001600160a01b031681565b3480156109f257600080fd5b506104da60125481565b348015610a0857600080fd5b506104da60035481565b348015610a1e57600080fd5b50610388610a2d366004613572565b611c7a565b348015610a3e57600080fd5b506104da610a4d366004613546565b611cf3565b348015610a5e57600080fd5b50610388611f0d565b348015610a7357600080fd5b50600a546103ea906001600160a01b031681565b610a8f611f1d565b6064821115610ae05760405162461bcd60e51b81526020600482015260186024820152770a6e8e4c2e8cacef27440ecc2d8eaca40e8dede40d0d2ced60431b60448201526064015b60405180910390fd5b60158290556014546013541115610b345760405162461bcd60e51b81526020600482015260186024820152770a6e8e4c2e8cacef27440ecc2d8eaca40e8dede40d0d2ced60431b6044820152606401610ad7565b60135550565b610b42611f1d565b60008111610b925760405162461bcd60e51b815260206004820181905260248201527f416d6f756e74206d7573742062652067726561746572207468616e207a65726f6044820152606401610ad7565b80471015610bed5760405162461bcd60e51b815260206004820152602260248201527f496e73756666696369656e7420532062616c616e636520696e20636f6e74726160448201526118dd60f21b6064820152608401610ad7565b6016546040516000916001600160a01b03169083908381818185875af1925050503d8060008114610c3a576040519150601f19603f3d011682016040523d82523d6000602084013e610c3f565b606091505b5050905080610c825760405162461bcd60e51b815260206004820152600f60248201526e15da5d1a191c985dc819985a5b1959608a1b6044820152606401610ad7565b60405182815233907f3ab94c2d450999c961d10ed65cef0fc04929ce8a38e411793ca2cb0fef9036279060200160405180910390a25050565b610cc3611f1d565b6001600160a01b0380841660009081526009602090815260408083209386168352929052908120610cf3916130cc565b60005b8151811015610dba576001600160a01b0380851660009081526009602090815260408083209387168352929052208251839083908110610d3857610d386135d0565b602090810291909101810151825460018082018555600094855293839020825160029092020180546001600160a01b0319166001600160a01b0392831617815592820151929093018054604090920151929093166001600160a81b031990911617600160a01b9115159190910217905580610db2816135fc565b915050610cf6565b50505050565b600c546060906001600160a01b03163314610e1d5760405162461bcd60e51b815260206004820181905260248201527f53747261746567793a2063616c6c6572206973206e6f742074696d656c6f636b6044820152606401610ad7565b6060835160001415610e30575081610e5c565b838051906020012083604051602001610e4a929190613617565b60405160208183030381529060405290505b600080876001600160a01b03168784604051610e789190613648565b60006040518083038185875af1925050503d8060008114610eb5576040519150601f19603f3d011682016040523d82523d6000602084013e610eba565b606091505b509150915081610f325760405162461bcd60e51b815260206004820152603d60248201527f53747261746567793a3a657865637574655472616e73616374696f6e3a20547260448201527f616e73616374696f6e20657865637574696f6e2072657665727465642e0000006064820152608401610ad7565b876001600160a01b03167f88405ca50016c636e025868e263efe5a9f63bf11cc45404f7616394c7dc389d0888888604051610f6f93929190613664565b60405180910390a2925050505b949350505050565b600a546001600160a01b03163314610fae5760405162461bcd60e51b8152600401610ad790613699565b505050565b610fbb611f1d565b600754600554610fd8916001600160a01b03908116911685610cbb565b600754600654610ff5916001600160a01b03908116911684610cbb565b600754610fae906001600160a01b031673039e2fb66102314ce7b64ce5ce3e5183bc94ad3883610cbb565b611028611f1d565b611030611f77565b565b61103a611f1d565b6110306120ce565b600a546000906001600160a01b0316331461106f5760405162461bcd60e51b8152600401610ad790613699565b611077612120565b61107f61217a565b600454611097906001600160a01b03163330856121c0565b600f548290158015906110ac57506000601054115b156110d5576110d2600f546110cc6010548661222b90919063ffffffff16565b9061223e565b90505b6010546110e2908261224a565b6010556110ed611f77565b6040518381527f4d6ce1e535dbade1c23defba91e23b8f791ce5edc0cc320257a2b364e4e384269060200160405180910390a1905061112b60018055565b92915050565b600080546001600160a01b038381169116148061115b5750600b546001600160a01b038381169116145b8061112b575050600c546001600160a01b0390811691161490565b61117e611f1d565b611030612256565b61118e611f1d565b6110306124f3565b61119e611f1d565b6001600160a01b0381166111dd5760405162461bcd60e51b8152600401610ad7906020808252600490820152637a65726f60e01b604082015260600190565b601680546001600160a01b0319166001600160a01b0392909216919091179055565b60008061120a6119b9565b905080156112425760075461123d906001600160a01b031673039e2fb66102314ce7b64ce5ce3e5183bc94ad388361124b565b611245565b60005b91505090565b6008546001600160a01b038481166000908152600960209081526040808320878516845290915280822090516326207f2d60e21b8152919384931691639881fcb49161129c9187919060040161373a565b600060405180830381865afa1580156112b9573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526112e19190810190613753565b905080600182516112f291906137d9565b81518110611302576113026135d0565b60200260200101519150509392505050565b61131c611f1d565b600e55565b611329611f1d565b611030600061273f565b6000601054600014611367576113626010546110cc670de0b6b3a7640000600f5461222b90919063ffffffff16565b905090565b50670de0b6b3a764000090565b61137c611f1d565b61103061278f565b61138c611f1d565b601255565b6001600160a01b0381166113d85760405162461bcd60e51b815260206004820152600e60248201526d696e76616c69644164647265737360901b6044820152606401610ad7565b600a546001600160a01b03163314806113fb5750600c546001600160a01b031633145b6114595760405162461bcd60e51b815260206004820152602960248201527f63616c6c6572206973206e6f742074686520636f6e74726f6c6c6572206e6f726044820152682074696d656c6f636b60b81b6064820152608401610ad7565b600a80546001600160a01b0319166001600160a01b0392909216919091179055565b6000611485611604565b600480546040516370a0823160e01b815230928101929092526001600160a01b0316906370a0823190602401602060405180830381865afa1580156114ce573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114f291906137f0565b6113629190613809565b600b546001600160a01b031633148061152e5750336115236000546001600160a01b031690565b6001600160a01b0316145b61154a5760405162461bcd60e51b8152600401610ad790613821565b60006115546111ff565b9050600e548110156115945760405162461bcd60e51b81526020600482015260096024820152681d1bdbc81cdb585b1b60ba1b6044820152606401610ad7565b600061159e611ab3565b9050804710156115f05760405162461bcd60e51b815260206004820152601760248201527f6e6f7420656e6f756768205320636f6c6c61746572616c0000000000000000006044820152606401610ad7565b6115f861193d565b5050565b6110306127cc565b6002546003546040516393f1a40b60e01b8152600481019190915230602482015260009182916101009091046001600160a01b0316906393f1a40b906044016040805180830381865afa15801561165f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116839190613867565b5092915050565b600c546001600160a01b03163314806116d05750600c546001600160a01b03161580156116d05750336116c56000546001600160a01b031690565b6001600160a01b0316145b6117085760405162461bcd60e51b81526020600482015260096024820152682174696d656c6f636b60b81b6044820152606401610ad7565b600c80546001600160a01b0319166001600160a01b0392909216919091179055565b611732611f1d565b6001600160a01b0381166117715760405162461bcd60e51b8152600401610ad7906020808252600490820152637a65726f60e01b604082015260600190565b600880546001600160a01b0319166001600160a01b0392909216919091179055565b61179b611f1d565b60025460ff161561137c576110306120ce565b6117b6611f1d565b6007546001600160a01b03838116911614156117fc5760405162461bcd60e51b8152602060048201526005602482015264217361666560d81b6044820152606401610ad7565b6004546001600160a01b03838116911614156118425760405162461bcd60e51b8152602060048201526005602482015264217361666560d81b6044820152606401610ad7565b600a546001600160a01b039081169061185e9084168284612841565b604080516001600160a01b038086168252602082018590528316918101919091527f22f92dfb4f608ea5db1e9bb08c0b4f5518af93b1259d335fe05900056096ab2c906060015b60405180910390a1505050565b6118ba611f1d565b600b80546001600160a01b0319166001600160a01b0392909216919091179055565b6009602052826000526040600020602052816000526040600020818154811061190457600080fd5b6000918252602090912060029091020180546001909101546001600160a01b0391821694509081169250600160a01b900460ff16905083565b61194561217a565b600b546001600160a01b031633148061197757503361196c6000546001600160a01b031690565b6001600160a01b0316145b6119935760405162461bcd60e51b8152600401610ad790613821565b61199b612256565b6119a36124f3565b6119ab612871565b6119b3611f77565b42600d55565b6007546040516370a0823160e01b815230600482015260009182916001600160a01b03909116906370a0823190602401602060405180830381865afa158015611a06573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a2a91906137f0565b600254600354604051636b2681c560e01b8152600481019190915230602482015291925061124591839161010090046001600160a01b031690636b2681c590604401602060405180830381865afa158015611a89573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611aad91906137f0565b9061224a565b600080611abe6119b9565b90506000600260019054906101000a90046001600160a01b03166001600160a01b0316632760f89b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611b15573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b39919061388b565b600754604051630d01142560e31b81526001600160a01b039182166004820152670de0b6b3a7640000602482015291925060009190831690636808a12890604401602060405180830381865afa158015611b97573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bbb91906137f0565b90506000611bd5670de0b6b3a76400006110cc868561222b565b90506000600260019054906101000a90046001600160a01b03166001600160a01b031663ba44a45a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611c2c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c5091906137f0565b9050611c706103e86110cc60135484611c699190613809565b859061222b565b9550505050505090565b611c82611f1d565b6001600160a01b038116611ce75760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610ad7565b611cf08161273f565b50565b600a546000906001600160a01b03163314611d205760405162461bcd60e51b8152600401610ad790613699565b611d28612120565b60008211611d6e5760405162461bcd60e51b815260206004820152601360248201527214dd1c985d1959de4e880857ddd85b9d105b5d606a1b6044820152606401610ad7565b600254600354604051630441a3e760e41b81526004810191909152602481018490526101009091046001600160a01b03169063441a3e7090604401600060405180830381600087803b158015611dc357600080fd5b505af1158015611dd7573d6000803e3d6000fd5b5050600480546040516370a0823160e01b81523092810192909252600093506001600160a01b031691506370a0823190602401602060405180830381865afa158015611e27573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e4b91906137f0565b905080831115611e59578092505b82600f541015611e6957600f5492505b6000611e86600f546110cc6010548761222b90919063ffffffff16565b9050601054811115611e9757506010545b601054611ea49082612b0f565b601055600f54611eb49085612b0f565b600f55600454611ece906001600160a01b03163386612841565b6040518481527f5b6b431d4476a211bb7d41c20d1aab9ae2321deee0d20be3d9fc9b1093fa6e3d9060200160405180910390a191505061112b60018055565b611f15611f1d565b611030612871565b6000546001600160a01b031633146110305760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610ad7565b600480546040516370a0823160e01b815230928101929092526001600160a01b03169060009082906370a0823190602401602060405180830381865afa158015611fc5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611fe991906137f0565b600f54909150611ff9908261224a565b600f5580156115f857600454600254612024916001600160a01b039081169161010090041683612b1b565b600254600354604051631c57762b60e31b81526004810191909152602481018390526101009091046001600160a01b03169063e2bbb15890604401600060405180830381600087803b15801561207957600080fd5b505af115801561208d573d6000803e3d6000fd5b505050507fc217459869eed80bfbe5c11e78ab58912eedfd106342671821b6e96d1615dc7f816040516120c291815260200190565b60405180910390a15050565b6120d6612b2f565b6002805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b600260015414156121735760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610ad7565b6002600155565b60025460ff16156110305760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610ad7565b6040516001600160a01b0380851660248301528316604482015260648101829052610dba9085906323b872dd60e01b906084015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152612b78565b600061223782846138a8565b9392505050565b600061223782846138c7565b60006122378284613809565b600254600354604051636b2681c560e01b8152600481019190915230602482015260009161010090046001600160a01b031690636b2681c590604401602060405180830381865afa1580156122af573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122d391906137f0565b90506000600260019054906101000a90046001600160a01b03166001600160a01b031663ba44a45a6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561232a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061234e91906137f0565b90506000600260019054906101000a90046001600160a01b03166001600160a01b0316632760f89b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156123a5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123c9919061388b565b600754604051630d01142560e31b81526001600160a01b039182166004820152670de0b6b3a7640000602482015291925060009190831690636808a12890604401602060405180830381865afa158015612427573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061244b91906137f0565b905060006124826103e86110cc601354876124669190613809565b61247c670de0b6b3a76400006110cc888c61222b565b9061222b565b600254600354604051636ee3193160e11b8152600481019190915291925061010090046001600160a01b03169063ddc632629083906024016000604051808303818588803b1580156124d357600080fd5b505af11580156124e7573d6000803e3d6000fd5b50505050505050505050565b6007546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa15801561253c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061256091906137f0565b90506000811161256d5750565b600754604080516001600160a01b039092168252602082018390527f053fa1fc52294a40b4ff1a988765bd298c00caa24d685cc3f767dcfde254ef9a910160405180910390a16000600260019054906101000a90046001600160a01b03166001600160a01b031663ba44a45a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612608573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061262c91906137f0565b9050612678600760009054906101000a90046001600160a01b03166126726103e86110cc601554601354876126619190613809565b61266b9190613809565b879061222b565b30612c4d565b61269360646110cc607860125461222b90919063ffffffff16565b47106115f8576016546012546000916001600160a01b0316906126b690476137d9565b604051600081818185875af1925050503d80600081146126f2576040519150601f19603f3d011682016040523d82523d6000602084013e6126f7565b606091505b5050905080610fae5760405162461bcd60e51b81526020600482015260146024820152737472616e7366657220666565206661696c65642160601b6044820152606401610ad7565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b61279761217a565b6002805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586121033390565b6000341161280a5760405162461bcd60e51b815260206004820152600b60248201526a4d7573742073656e64205360a81b6044820152606401610ad7565b60405134815233907ff44da3c8956831d752012b0342d6776727f73af732575ff65ace4dc45068e3719060200160405180910390a2565b6040516001600160a01b038316602482015260448101829052610fae90849063a9059cbb60e01b906064016121f4565b6007546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa1580156128ba573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128de91906137f0565b60075490915061291990612910906001600160a01b031673039e2fb66102314ce7b64ce5ce3e5183bc94ad388461124b565b6011549061224a565b6011556005546007546001600160a01b0390811691161461295c5760075460055461295c916001600160a01b03908116911661295684600261223e565b30612d36565b6006546007546001600160a01b0390811691161461299657600754600654612996916001600160a01b03908116911661295684600261223e565b6005546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa1580156129df573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a0391906137f0565b6006546040516370a0823160e01b81523060048201529192506000916001600160a01b03909116906370a0823190602401602060405180830381865afa158015612a51573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a7591906137f0565b9050600082118015612a875750600081115b15610fae57600554600654600854612ab8926001600160a01b03908116921690600160a01b900460ff168585612e03565b600554600654604080516001600160a01b039384168152602081018690529290911690820152606081018290527f44552da03f807ace3e5f27e98e694712dfe668c743514b28d4d9f5ab70574b0f906080016118a5565b600061223782846137d9565b610fae6001600160a01b0384168383612eff565b60025460ff166110305760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b6044820152606401610ad7565b6000612bcd826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316612fac9092919063ffffffff16565b9050805160001480612bee575080806020019051810190612bee91906138e9565b610fae5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610ad7565b600854612c659084906001600160a01b031684612b1b565b6001600160a01b03831673039e2fb66102314ce7b64ce5ce3e5183bc94ad3814610fae576008546001600160a01b03848116600090815260096020908152604080832073039e2fb66102314ce7b64ce5ce3e5183bc94ad388452909152812091909216916318a130869185919085612cdf4261070861224a565b6040518663ffffffff1660e01b8152600401612cff959493929190613906565b600060405180830381600087803b158015612d1957600080fd5b505af1158015612d2d573d6000803e3d6000fd5b50505050505050565b600854612d4e9085906001600160a01b031684612b1b565b826001600160a01b0316846001600160a01b031614610dba576008546001600160a01b03858116600090815260096020908152604080832088851684529091528120919092169163f41766d89185919085612dab4261070861224a565b6040518663ffffffff1660e01b8152600401612dcb959493929190613906565b600060405180830381600087803b158015612de557600080fd5b505af1158015612df9573d6000803e3d6000fd5b5050505050505050565b600854612e1b9086906001600160a01b031684612b1b565b600854612e339085906001600160a01b031683612b1b565b6008546001600160a01b0316635a47ddc3868686868660008030612e594261070861224a565b60405160e08b901b6001600160e01b03191681526001600160a01b03998a166004820152978916602489015295151560448801526064870194909452608486019290925260a485015260c484015290921660e4820152610104810191909152610124016060604051808303816000875af1158015612edb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612df99190613942565b604051636eb1769f60e11b81523060048201526001600160a01b0383811660248301526000919085169063dd62ed3e90604401602060405180830381865afa158015612f4f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612f7391906137f0565b9050610dba8463095ea7b360e01b85612f8c8686613809565b6040516001600160a01b03909216602483015260448201526064016121f4565b6060610f7c848460008585600080866001600160a01b03168587604051612fd39190613648565b60006040518083038185875af1925050503d8060008114613010576040519150601f19603f3d011682016040523d82523d6000602084013e613015565b606091505b509150915061302687838387613031565b979650505050505050565b6060831561309d578251613096576001600160a01b0385163b6130965760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610ad7565b5081610f7c565b610f7c83838151156130b25781518083602001fd5b8060405162461bcd60e51b8152600401610ad79190613480565b5080546000825560020290600052602060002090810190611cf091905b808211156131195780546001600160a01b03191681556001810180546001600160a81b03191690556002016130e9565b5090565b6000806040838503121561313057600080fd5b50508035926020909101359150565b60006020828403121561315157600080fd5b5035919050565b6001600160a01b0381168114611cf057600080fd5b634e487b7160e01b600052604160045260246000fd5b6040516060810167ffffffffffffffff811182821017156131a6576131a661316d565b60405290565b604051601f8201601f1916810167ffffffffffffffff811182821017156131d5576131d561316d565b604052919050565b600067ffffffffffffffff8211156131f7576131f761316d565b5060051b60200190565b8015158114611cf057600080fd5b600082601f83011261322057600080fd5b81356020613235613230836131dd565b6131ac565b8281526060928302850182019282820191908785111561325457600080fd5b8387015b858110156132b65781818a0312156132705760008081fd5b613278613183565b813561328381613158565b81528186013561329281613158565b818701526040828101356132a581613201565b908201528452928401928101613258565b5090979650505050505050565b6000806000606084860312156132d857600080fd5b83356132e381613158565b925060208401356132f381613158565b9150604084013567ffffffffffffffff81111561330f57600080fd5b61331b8682870161320f565b9150509250925092565b600067ffffffffffffffff83111561333f5761333f61316d565b613352601f8401601f19166020016131ac565b905082815283838301111561336657600080fd5b828260208301376000602084830101529392505050565b6000806000806080858703121561339357600080fd5b843561339e81613158565b935060208501359250604085013567ffffffffffffffff808211156133c257600080fd5b818701915087601f8301126133d657600080fd5b6133e588833560208501613325565b935060608701359150808211156133fb57600080fd5b508501601f8101871361340d57600080fd5b61341c87823560208401613325565b91505092959194509250565b60005b8381101561344357818101518382015260200161342b565b83811115610dba5750506000910152565b6000815180845261346c816020860160208601613428565b601f01601f19169290920160200192915050565b6020815260006122376020830184613454565b6000806000606084860312156134a857600080fd5b83356134b381613158565b95602085013595506040909401359392505050565b6000806000606084860312156134dd57600080fd5b833567ffffffffffffffff808211156134f557600080fd5b6135018783880161320f565b9450602086013591508082111561351757600080fd5b6135238783880161320f565b9350604086013591508082111561353957600080fd5b5061331b8682870161320f565b6000806040838503121561355957600080fd5b823561356481613158565b946020939093013593505050565b60006020828403121561358457600080fd5b813561223781613158565b6000806000606084860312156135a457600080fd5b83356135af81613158565b925060208401356135bf81613158565b929592945050506040919091013590565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b6000600019821415613610576136106135e6565b5060010190565b6001600160e01b031983168152815160009061363a816004850160208701613428565b919091016004019392505050565b6000825161365a818460208701613428565b9190910192915050565b83815260606020820152600061367d6060830185613454565b828103604084015261368f8185613454565b9695505050505050565b6020808252601c908201527f63616c6c6572206973206e6f742074686520636f6e74726f6c6c657200000000604082015260600190565b6000815480845260208085019450836000528060002060005b8381101561372f5781546001600160a01b039081168852600183810154918216858a015260a09190911c60ff1615156040890152606090970196600290920191016136e9565b509495945050505050565b828152604060208201526000610f7c60408301846136d0565b6000602080838503121561376657600080fd5b825167ffffffffffffffff81111561377d57600080fd5b8301601f8101851361378e57600080fd5b805161379c613230826131dd565b81815260059190911b820183019083810190878311156137bb57600080fd5b928401925b82841015613026578351825292840192908401906137c0565b6000828210156137eb576137eb6135e6565b500390565b60006020828403121561380257600080fd5b5051919050565b6000821982111561381c5761381c6135e6565b500190565b60208082526026908201527f53747261746567793a2063616c6c6572206973206e6f742074686520737472616040820152651d1959da5cdd60d21b606082015260800190565b6000806040838503121561387a57600080fd5b505080516020909101519092909150565b60006020828403121561389d57600080fd5b815161223781613158565b60008160001904831182151516156138c2576138c26135e6565b500290565b6000826138e457634e487b7160e01b600052601260045260246000fd5b500490565b6000602082840312156138fb57600080fd5b815161223781613201565b85815284602082015260a06040820152600061392560a08301866136d0565b6001600160a01b0394909416606083015250608001529392505050565b60008060006060848603121561395757600080fd5b835192506020840151915060408401519050925092509256fea264697066735822122054e42377cbf28353b4843db8c44369698f64026d7a05f071b713c7f4816f13ce64736f6c634300080c0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000008ae21a4f5b99f18de502fceb3174c74229ab326c00000000000000000000000071fd21a764ef295fb7bfbdf4d2ebffe862e76fbf000000000000000000000000c547e8dd3844fb5bc178120a121b365ea790774e000000000000000000000000fe6915a0983a304f4d131da635664030da06bcd20000000000000000000000001d368773735ee1e678950b7a97bca2cafb330cdc0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000287c6882de298665977787e268f3dba052a6e251000000000000000000000000674a430f531847a6f8976a900f8ace765f896a1b0000000000000000000000003a516e01f82c1e18916ed69a81dd498ef64bb157000000000000000000000000039e2fb66102314ce7b64ce5ce3e5183bc94ad380000000000000000000000000000000000000000000000000000000000000001
-----Decoded View---------------
Arg [0] : _controller (address): 0x8Ae21A4f5b99f18De502FCeb3174C74229ab326C
Arg [1] : _timelock (address): 0x71FD21a764eF295fB7BFBdf4D2EBfFE862e76fBf
Arg [2] : _treasuryAddress (address): 0xc547E8dD3844fb5BC178120a121b365Ea790774E
Arg [3] : _farmContractAddress (address): 0xFE6915a0983a304F4D131DA635664030dA06Bcd2
Arg [4] : _dexRouterAddress (address): 0x1D368773735ee1E678950B7A97bcA2CafB330CDc
Arg [5] : _pid (uint256): 0
Arg [6] : _wantAddress (address): 0x287c6882dE298665977787e268f3dba052A6e251
Arg [7] : _earnedAddress (address): 0x674a430f531847a6f8976A900f8ace765f896a1b
Arg [8] : _token0 (address): 0x3a516e01f82c1e18916ED69a81Dd498eF64bB157
Arg [9] : _token1 (address): 0x039e2fB66102314Ce7b64Ce5Ce3E5183bc94aD38
Arg [10] : _stable (bool): True
-----Encoded View---------------
11 Constructor Arguments found :
Arg [0] : 0000000000000000000000008ae21a4f5b99f18de502fceb3174c74229ab326c
Arg [1] : 00000000000000000000000071fd21a764ef295fb7bfbdf4d2ebffe862e76fbf
Arg [2] : 000000000000000000000000c547e8dd3844fb5bc178120a121b365ea790774e
Arg [3] : 000000000000000000000000fe6915a0983a304f4d131da635664030da06bcd2
Arg [4] : 0000000000000000000000001d368773735ee1e678950b7a97bca2cafb330cdc
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [6] : 000000000000000000000000287c6882de298665977787e268f3dba052a6e251
Arg [7] : 000000000000000000000000674a430f531847a6f8976a900f8ace765f896a1b
Arg [8] : 0000000000000000000000003a516e01f82c1e18916ed69a81dd498ef64bb157
Arg [9] : 000000000000000000000000039e2fb66102314ce7b64ce5ce3e5183bc94ad38
Arg [10] : 0000000000000000000000000000000000000000000000000000000000000001
Deployed Bytecode Sourcemap
42449:17234:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54128:357;;;;;;;;;;-1:-1:-1;54128:357:0;;;;;:::i;:::-;;:::i;57378:388::-;;;;;;;;;;-1:-1:-1;57378:388:0;;;;;:::i;:::-;;:::i;43106:25::-;;;;;;;;;;-1:-1:-1;43106:25:0;;;;-1:-1:-1;;;;;43106:25:0;;;;;;-1:-1:-1;;;;;616:32:1;;;598:51;;586:2;571:18;43106:25:0;;;;;;;;55582:296;;;;;;;;;;-1:-1:-1;55582:296:0;;;;;:::i;:::-;;:::i;58960:720::-;;;;;;;;;;-1:-1:-1;58960:720:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;42877:18::-;;;;;;;;;;-1:-1:-1;42877:18:0;;;;-1:-1:-1;;;42877:18:0;;;;;;;;;6070:14:1;;6063:22;6045:41;;6033:2;6018:18;42877::0;5905:187:1;58269:89:0;;;;;;;;;;-1:-1:-1;58269:89:0;;;;;:::i;:::-;;:::i;55153:421::-;;;;;;;;;;-1:-1:-1;55153:421:0;;;;;:::i;:::-;;:::i;43614:46::-;;;;;;;;;;;;43657:3;43614:46;;;;;7541:25:1;;;7529:2;7514:18;43614:46:0;7395:177:1;48282:59:0;;;;;;;;;;;;;:::i;53939:67::-;;;;;;;;;;;;;:::i;43265:43::-;;;;;;;;;;;;;;;;43315:39;;;;;;;;;;;;;;;;47728:546;;;;;;;;;;-1:-1:-1;47728:546:0;;;;;:::i;:::-;;:::i;45765:168::-;;;;;;;;;;-1:-1:-1;45765:168:0;;;;;:::i;:::-;;:::i;48349:71::-;;;;;;;;;;;;;:::i;43466:37::-;;;;;;;;;;;;;;;;38230:86;;;;;;;;;;-1:-1:-1;38301:7:0;;;;38230:86;;42985:80;;;;;;;;;;;;43022:42;42985:80;;48503:65;;;;;;;;;;;;;:::i;54493:184::-;;;;;;;;;;-1:-1:-1;54493:184:0;;;;;:::i;:::-;;:::i;53663:197::-;;;;;;;;;;;;;:::i;43361:30::-;;;;;;;;;;;;;;;;53090:301;;;;;;;;;;-1:-1:-1;53090:301:0;;;;;:::i;:::-;;:::i;54873:118::-;;;;;;;;;;-1:-1:-1;54873:118:0;;;;;:::i;:::-;;:::i;32683:103::-;;;;;;;;;;;;;:::i;47309:169::-;;;;;;;;;;;;;:::i;42704:37::-;;;;;;;;;;-1:-1:-1;42704:37:0;;;;-1:-1:-1;;;;;42704:37:0;;;53868:63;;;;;;;;;;;;;:::i;54999:146::-;;;;;;;;;;-1:-1:-1;54999:146:0;;;;;:::i;:::-;;:::i;43569:33::-;;;;;;;;;;;;;;;;32042:87;;;;;;;;;;-1:-1:-1;32088:7:0;32115:6;-1:-1:-1;;;;;32115:6:0;32042:87;;58411:274;;;;;;;;;;-1:-1:-1;58411:274:0;;;;;:::i;:::-;;:::i;42596:34::-;;;;;;;;;;-1:-1:-1;42596:34:0;;;;;;;-1:-1:-1;;;;;42596:34:0;;;43208:40;;;;;;;;;;;;;;;;43515:41;;;;;;;;;;;;;;;;47148:153;;;;;;;;;;;;;:::i;46608:338::-;;;;;;;;;;;;;:::i;57162:67::-;;;:::i;43170:31::-;;;;;;;;;;;;;;;;46954:186;;;;;;;;;;;;;:::i;58693:196::-;;;;;;;;;;-1:-1:-1;58693:196:0;;;;;:::i;:::-;;:::i;54685:180::-;;;;;;;;;;-1:-1:-1;54685:180:0;;;;;:::i;:::-;;:::i;58152:109::-;;;;;;;;;;;;;:::i;43680:30::-;;;;;;;;;;-1:-1:-1;43680:30:0;;;;-1:-1:-1;;;;;43680:30:0;;;57774:370;;;;;;;;;;-1:-1:-1;57774:370:0;;;;;:::i;:::-;;:::i;54014:106::-;;;;;;;;;;-1:-1:-1;54014:106:0;;;;;:::i;:::-;;:::i;42902:74::-;;;;;;;;;;-1:-1:-1;42902:74:0;;;;;:::i;:::-;;:::i;:::-;;;;-1:-1:-1;;;;;8862:15:1;;;8844:34;;8914:15;;;;8909:2;8894:18;;8887:43;8973:14;8966:22;8946:18;;;8939:50;8794:2;8779:18;42902:74:0;8610:385:1;43138:23:0;;;;;;;;;;-1:-1:-1;43138:23:0;;;;-1:-1:-1;;;;;43138:23:0;;;52882:200;;;;;;;;;;;;;:::i;42748:37::-;;;;;;;;;;-1:-1:-1;42748:37:0;;;;-1:-1:-1;;;;;42748:37:0;;;53399:256;;;;;;;;;;;;;:::i;45941:659::-;;;;;;;;;;;;;:::i;42792:37::-;;;;;;;;;;-1:-1:-1;42792:37:0;;;;-1:-1:-1;;;;;42792:37:0;;;42662:35;;;;;;;;;;-1:-1:-1;42662:35:0;;;;-1:-1:-1;;;;;42662:35:0;;;42836:31;;;;;;;;;;-1:-1:-1;42836:31:0;;;;-1:-1:-1;;;;;42836:31:0;;;43400:48;;;;;;;;;;;;;;;;42637:18;;;;;;;;;;;;;;;;32941:201;;;;;;;;;;-1:-1:-1;32941:201:0;;;;;:::i;:::-;;:::i;48993:928::-;;;;;;;;;;-1:-1:-1;48993:928:0;;;;;:::i;:::-;;:::i;48428:67::-;;;;;;;;;;;;;:::i;43074:25::-;;;;;;;;;;-1:-1:-1;43074:25:0;;;;-1:-1:-1;;;;;43074:25:0;;;54128:357;31928:13;:11;:13::i;:::-;43657:3:::1;54235:14;:34;;54227:71;;;::::0;-1:-1:-1;;;54227:71:0;;9202:2:1;54227:71:0::1;::::0;::::1;9184:21:1::0;9241:2;9221:18;;;9214:30;-1:-1:-1;;;9260:18:1;;;9253:54;9324:18;;54227:71:0::1;;;;;;;;;54309:13;:30:::0;;;54379:20:::1;::::0;54358:17:::1;::::0;:41:::1;;54350:78;;;::::0;-1:-1:-1;;;54350:78:0;;9202:2:1;54350:78:0::1;::::0;::::1;9184:21:1::0;9241:2;9221:18;;;9214:30;-1:-1:-1;;;9260:18:1;;;9253:54;9324:18;;54350:78:0::1;9000:348:1::0;54350:78:0::1;54439:17;:38:::0;-1:-1:-1;54128:357:0:o;57378:388::-;31928:13;:11;:13::i;:::-;57460:1:::1;57451:6;:10;57443:55;;;::::0;-1:-1:-1;;;57443:55:0;;9555:2:1;57443:55:0::1;::::0;::::1;9537:21:1::0;;;9574:18;;;9567:30;9633:34;9613:18;;;9606:62;9685:18;;57443:55:0::1;9353:356:1::0;57443:55:0::1;57542:6;57517:21;:31;;57509:78;;;::::0;-1:-1:-1;;;57509:78:0;;9916:2:1;57509:78:0::1;::::0;::::1;9898:21:1::0;9955:2;9935:18;;;9928:30;9994:34;9974:18;;;9967:62;-1:-1:-1;;;10045:18:1;;;10038:32;10087:19;;57509:78:0::1;9714:398:1::0;57509:78:0::1;57627:15;::::0;57619:48:::1;::::0;57601:12:::1;::::0;-1:-1:-1;;;;;57627:15:0::1;::::0;57656:6;;57601:12;57619:48;57601:12;57619:48;57656:6;57627:15;57619:48:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57600:67;;;57686:7;57678:35;;;::::0;-1:-1:-1;;;57678:35:0;;10529:2:1;57678:35:0::1;::::0;::::1;10511:21:1::0;10568:2;10548:18;;;10541:30;-1:-1:-1;;;10587:18:1;;;10580:45;10642:18;;57678:35:0::1;10327:339:1::0;57678:35:0::1;57729:29;::::0;7541:25:1;;;57739:10:0::1;::::0;57729:29:::1;::::0;7529:2:1;7514:18;57729:29:0::1;;;;;;;57432:334;57378:388:::0;:::o;55582:296::-;31928:13;:11;:13::i;:::-;-1:-1:-1;;;;;55731:17:0;;::::1;;::::0;;;:11:::1;:17;::::0;;;;;;;:21;;::::1;::::0;;;;;;;;55724:28:::1;::::0;::::1;:::i;:::-;55768:9;55763:108;55787:6;:13;55783:1;:17;55763:108;;;-1:-1:-1::0;;;;;55822:17:0;;::::1;;::::0;;;:11:::1;:17;::::0;;;;;;;:21;;::::1;::::0;;;;;;55849:9;;:6;;55856:1;;55849:9;::::1;;;;;:::i;:::-;;::::0;;::::1;::::0;;;;;;;55822:37;;::::1;::::0;;::::1;::::0;;-1:-1:-1;55822:37:0;;;;;;;;;::::1;::::0;;::::1;;::::0;;-1:-1:-1;;;;;;55822:37:0::1;-1:-1:-1::0;;;;;55822:37:0;;::::1;;::::0;;;;::::1;::::0;;;;::::1;::::0;;::::1;::::0;;::::1;::::0;;;;::::1;-1:-1:-1::0;;;;;;55822:37:0;;;;-1:-1:-1;;;55822:37:0;::::1;;::::0;;;::::1;;::::0;;55802:3;::::1;::::0;::::1;:::i;:::-;;;;55763:108;;;;55582:296:::0;;;:::o;58960:720::-;45678:8;;59094:12;;-1:-1:-1;;;;;45678:8:0;45690:10;45678:22;45670:67;;;;-1:-1:-1;;;45670:67:0;;11277:2:1;45670:67:0;;;11259:21:1;;;11296:18;;;11289:30;11355:34;11335:18;;;11328:62;11407:18;;45670:67:0;11075:356:1;45670:67:0;59119:21:::1;59163:9;59157:23;59184:1;59157:28;59153:179;;;-1:-1:-1::0;59213:4:0;59153:179:::1;;;59301:9;59285:27;;;;;;59315:4;59261:59;;;;;;;;;:::i;:::-;;;;;;;;;;;;;59250:70;;59153:179;59405:12;59419:23:::0;59446:6:::1;-1:-1:-1::0;;;;;59446:11:0::1;59466:5;59473:8;59446:36;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;59404:78;;;;59501:7;59493:81;;;::::0;-1:-1:-1;;;59493:81:0;;12293:2:1;59493:81:0::1;::::0;::::1;12275:21:1::0;12332:2;12312:18;;;12305:30;12371:34;12351:18;;;12344:62;12442:31;12422:18;;;12415:59;12491:19;;59493:81:0::1;12091:425:1::0;59493:81:0::1;59611:6;-1:-1:-1::0;;;;;59592:50:0::1;;59619:5;59626:9;59637:4;59592:50;;;;;;;;:::i;:::-;;;;;;;;59662:10:::0;-1:-1:-1;;;45748:1:0::1;58960:720:::0;;;;;;:::o;58269:89::-;45385:10;;-1:-1:-1;;;;;45385:10:0;45399;45385:24;45377:65;;;;-1:-1:-1;;;45377:65:0;;;;;;;:::i;:::-;58269:89;;;:::o;55153:421::-;31928:13;:11;:13::i;:::-;55381::::1;::::0;55396::::1;::::0;55367:64:::1;::::0;-1:-1:-1;;;;;55381:13:0;;::::1;::::0;55396::::1;55411:19:::0;55367:13:::1;:64::i;:::-;55456:13;::::0;55471::::1;::::0;55442:64:::1;::::0;-1:-1:-1;;;;;55456:13:0;;::::1;::::0;55471::::1;55486:19:::0;55442:13:::1;:64::i;:::-;55531:13;::::0;55517:49:::1;::::0;-1:-1:-1;;;;;55531:13:0::1;43022:42;55550:15:::0;55517:13:::1;:49::i;48282:59::-:0;31928:13;:11;:13::i;:::-;48326:7:::1;:5;:7::i;:::-;48282:59::o:0;53939:67::-;31928:13;:11;:13::i;:::-;53988:10:::1;:8;:10::i;47728:546::-:0;45385:10;;47841:7;;-1:-1:-1;;;;;45385:10:0;45399;45385:24;45377:65;;;;-1:-1:-1;;;45377:65:0;;;;;;;:::i;:::-;35751:21:::1;:19;:21::i;:::-;37835:19:::2;:17;:19::i;:::-;47868:11:::3;::::0;47861:82:::3;::::0;-1:-1:-1;;;;;47868:11:0::3;47906:10;47927:4;47934:8:::0;47861:36:::3;:82::i;:::-;48001:15;::::0;47978:8;;48001:19;;;;:38:::3;;;48038:1;48024:11;;:15;48001:38;47997:131;;;48070:46;48100:15;;48070:25;48083:11;;48070:8;:12;;:25;;;;:::i;:::-;:29:::0;::::3;:46::i;:::-;48056:60;;47997:131;48152:11;::::0;:28:::3;::::0;48168:11;48152:15:::3;:28::i;:::-;48138:11;:42:::0;48193:7:::3;:5;:7::i;:::-;48218:17;::::0;7541:25:1;;;48218:17:0::3;::::0;7529:2:1;7514:18;48218:17:0::3;;;;;;;48255:11:::0;-1:-1:-1;35795:20:0::1;35189:1:::0;36315:22;;36132:213;35795:20:::1;47728:546:::0;;;;:::o;45765:168::-;45826:4;32115:6;;-1:-1:-1;;;;;45851:19:0;;;32115:6;;45851:19;;45850:49;;-1:-1:-1;45888:10:0;;-1:-1:-1;;;;;45876:22:0;;;45888:10;;45876:22;45850:49;:75;;;-1:-1:-1;;45916:8:0;;-1:-1:-1;;;;;45916:8:0;;;45904:20;;;;45765:168::o;48349:71::-;31928:13;:11;:13::i;:::-;48402:10:::1;:8;:10::i;48503:65::-:0;31928:13;:11;:13::i;:::-;48550:10:::1;:8;:10::i;54493:184::-:0;31928:13;:11;:13::i;:::-;-1:-1:-1;;;;;54585:30:0;::::1;54577:47;;;;-1:-1:-1::0;;;54577:47:0::1;;;;;;13535:2:1::0;13517:21;;;13574:1;13554:18;;;13547:29;-1:-1:-1;;;13607:2:1;13592:18;;13585:34;13651:2;13636:18;;13333:327;54577:47:0::1;54635:15;:34:::0;;-1:-1:-1;;;;;;54635:34:0::1;-1:-1:-1::0;;;;;54635:34:0;;;::::1;::::0;;;::::1;::::0;;54493:184::o;53663:197::-;53716:7;53736:16;53755;:14;:16::i;:::-;53736:35;-1:-1:-1;53790:13:0;;53789:63;;53824:13;;53811:41;;-1:-1:-1;;;;;53824:13:0;43022:42;53843:8;53811:12;:41::i;:::-;53789:63;;;53807:1;53789:63;53782:70;;;53663:197;:::o;53090:301::-;53253:16;;-1:-1:-1;;;;;53299:24:0;;;53198:7;53299:24;;;:11;:24;;;;;;;;:38;;;;;;;;;;;53245:93;;-1:-1:-1;;;53245:93:0;;53198:7;;;;53253:16;;53245:39;;:93;;53285:12;;53299:38;53245:93;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;53245:93:0;;;;;;;;;;;;:::i;:::-;53218:120;;53356:7;53381:1;53364:7;:14;:18;;;;:::i;:::-;53356:27;;;;;;;;:::i;:::-;;;;;;;53349:34;;;53090:301;;;;;:::o;54873:118::-;31928:13;:11;:13::i;:::-;54953::::1;:30:::0;54873:118::o;32683:103::-;31928:13;:11;:13::i;:::-;32748:30:::1;32775:1;32748:18;:30::i;47309:169::-:0;47373:7;47401:11;;47416:1;47401:16;47400:70;;47428:42;47458:11;;47428:25;47448:4;47428:15;;:19;;:25;;;;:::i;:42::-;47393:77;;47309:169;:::o;47400:70::-;-1:-1:-1;47421:4:0;;47309:169::o;53868:63::-;31928:13;:11;:13::i;:::-;53915:8:::1;:6;:8::i;54999:146::-:0;31928:13;:11;:13::i;:::-;55093:20:::1;:44:::0;54999:146::o;58411:274::-;-1:-1:-1;;;;;58483:25:0;;58475:52;;;;-1:-1:-1;;;58475:52:0;;16000:2:1;58475:52:0;;;15982:21:1;16039:2;16019:18;;;16012:30;-1:-1:-1;;;16058:18:1;;;16051:44;16112:18;;58475:52:0;15798:338:1;58475:52:0;58546:10;;-1:-1:-1;;;;;58546:10:0;58560;58546:24;;:50;;-1:-1:-1;58574:8:0;;-1:-1:-1;;;;;58574:8:0;58586:10;58574:22;58546:50;58538:104;;;;-1:-1:-1;;;58538:104:0;;16343:2:1;58538:104:0;;;16325:21:1;16382:2;16362:18;;;16355:30;16421:34;16401:18;;;16394:62;-1:-1:-1;;;16472:18:1;;;16465:39;16521:19;;58538:104:0;16141:405:1;58538:104:0;58653:10;:24;;-1:-1:-1;;;;;;58653:24:0;-1:-1:-1;;;;;58653:24:0;;;;;;;;;;58411:274::o;47148:153::-;47204:7;47278:15;:13;:15::i;:::-;47238:11;;;47231:44;;-1:-1:-1;;;47231:44:0;;47269:4;47231:44;;;598:51:1;;;;-1:-1:-1;;;;;47238:11:0;;47231:29;;571:18:1;;47231:44:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:62;;;;:::i;46608:338::-;45515:10;;-1:-1:-1;;;;;45515:10:0;45529;45515:24;;:49;;-1:-1:-1;45554:10:0;45543:7;32088;32115:6;-1:-1:-1;;;;;32115:6:0;;32042:87;45543:7;-1:-1:-1;;;;;45543:21:0;;45515:49;45507:100;;;;-1:-1:-1;;;45507:100:0;;;;;;;:::i;:::-;46661:29:::1;46693:22;:20;:22::i;:::-;46661:54;;46759:13;;46734:21;:38;;46726:60;;;::::0;-1:-1:-1;;;46726:60:0;;17482:2:1;46726:60:0::1;::::0;::::1;17464:21:1::0;17521:1;17501:18;;;17494:29;-1:-1:-1;;;17539:18:1;;;17532:39;17588:18;;46726:60:0::1;17280:332:1::0;46726:60:0::1;46797:17;46818:20;:18;:20::i;:::-;46797:41;;46884:9;46859:21;:34;;46851:70;;;::::0;-1:-1:-1;;;46851:70:0;;17819:2:1;46851:70:0::1;::::0;::::1;17801:21:1::0;17858:2;17838:18;;;17831:30;17897:25;17877:18;;;17870:53;17940:18;;46851:70:0::1;17617:347:1::0;46851:70:0::1;46932:6;:4;:6::i;:::-;46650:296;;46608:338::o:0;57162:67::-;57210:11;:9;:11::i;46954:186::-;47059:19;;47089:3;;47049:59;;-1:-1:-1;;;47049:59:0;;;;;18143:25:1;;;;47102:4:0;18184:18:1;;;18177:60;47009:7:0;;;;47059:19;;;;-1:-1:-1;;;;;47059:19:0;;47049:39;;18116:18:1;;47049:59:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;47029:79:0;46954:186;-1:-1:-1;;46954:186:0:o;58693:196::-;58761:8;;-1:-1:-1;;;;;58761:8:0;58773:10;58761:22;;:75;;-1:-1:-1;58788:8:0;;-1:-1:-1;;;;;58788:8:0;:22;:47;;;;-1:-1:-1;58825:10:0;58814:7;32088;32115:6;-1:-1:-1;;;;;32115:6:0;;32042:87;58814:7;-1:-1:-1;;;;;58814:21:0;;58788:47;58753:97;;;;-1:-1:-1;;;58753:97:0;;18700:2:1;58753:97:0;;;18682:21:1;18739:1;18719:18;;;18712:29;-1:-1:-1;;;18757:18:1;;;18750:39;18806:18;;58753:97:0;18498:332:1;58753:97:0;58861:8;:20;;-1:-1:-1;;;;;;58861:20:0;-1:-1:-1;;;;;58861:20:0;;;;;;;;;;58693:196::o;54685:180::-;31928:13;:11;:13::i;:::-;-1:-1:-1;;;;;54776:28:0;::::1;54768:45;;;;-1:-1:-1::0;;;54768:45:0::1;;;;;;13535:2:1::0;13517:21;;;13574:1;13554:18;;;13547:29;-1:-1:-1;;;13607:2:1;13592:18;;13585:34;13651:2;13636:18;;13333:327;54768:45:0::1;54824:16;:33:::0;;-1:-1:-1;;;;;;54824:33:0::1;-1:-1:-1::0;;;;;54824:33:0;;;::::1;::::0;;;::::1;::::0;;54685:180::o;58152:109::-;31928:13;:11;:13::i;:::-;38301:7;;;;58205:48:::1;;;58219:10;:8;:10::i;57774:370::-:0;31928:13;:11;:13::i;:::-;57894::::1;::::0;-1:-1:-1;;;;;57884:23:0;;::::1;57894:13:::0;::::1;57884:23;;57876:41;;;::::0;-1:-1:-1;;;57876:41:0;;19037:2:1;57876:41:0::1;::::0;::::1;19019:21:1::0;19076:1;19056:18;;;19049:29;-1:-1:-1;;;19094:18:1;;;19087:35;19139:18;;57876:41:0::1;18835:328:1::0;57876:41:0::1;57946:11;::::0;-1:-1:-1;;;;;57936:21:0;;::::1;57946:11:::0;::::1;57936:21;;57928:39;;;::::0;-1:-1:-1;;;57928:39:0;;19037:2:1;57928:39:0::1;::::0;::::1;19019:21:1::0;19076:1;19056:18;;;19049:29;-1:-1:-1;;;19094:18:1;;;19087:35;19139:18;;57928:39:0::1;18835:328:1::0;57928:39:0::1;58000:10;::::0;-1:-1:-1;;;;;58000:10:0;;::::1;::::0;58021:49:::1;::::0;:27;::::1;58000:10:::0;58062:7;58021:27:::1;:49::i;:::-;58086:50;::::0;;-1:-1:-1;;;;;19426:15:1;;;19408:34;;19473:2;19458:18;;19451:34;;;19521:15;;19501:18;;;19494:43;;;;58086:50:0::1;::::0;19358:2:1;19343:18;58086:50:0::1;;;;;;;;57865:279;57774:370:::0;;:::o;54014:106::-;31928:13;:11;:13::i;:::-;54088:10:::1;:24:::0;;-1:-1:-1;;;;;;54088:24:0::1;-1:-1:-1::0;;;;;54088:24:0;;;::::1;::::0;;;::::1;::::0;;54014:106::o;42902:74::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;42902:74:0;;;;-1:-1:-1;42902:74:0;;;;-1:-1:-1;;;;42902:74:0;;;;;-1:-1:-1;42902:74:0;:::o;52882:200::-;37835:19;:17;:19::i;:::-;45515:10:::1;::::0;-1:-1:-1;;;;;45515:10:0::1;45529;45515:24;::::0;:49:::1;;-1:-1:-1::0;45554:10:0::1;45543:7;32088::::0;32115:6;-1:-1:-1;;;;;32115:6:0;;32042:87;45543:7:::1;-1:-1:-1::0;;;;;45543:21:0::1;;45515:49;45507:100;;;;-1:-1:-1::0;;;45507:100:0::1;;;;;;;:::i;:::-;52954:10:::2;:8;:10::i;:::-;52977;:8;:10::i;:::-;53000:11;:9;:11::i;:::-;53024:7;:5;:7::i;:::-;53059:15;53044:12;:30:::0;52882:200::o;53399:256::-;53494:13;;53487:46;;-1:-1:-1;;;53487:46:0;;53527:4;53487:46;;;598:51:1;53446:7:0;;;;-1:-1:-1;;;;;53494:13:0;;;;53487:31;;571:18:1;;53487:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;53561:19;;53612:3;;53551:80;;-1:-1:-1;;;53551:80:0;;;;;18143:25:1;;;;53625:4:0;18184:18:1;;;18177:60;53466:67:0;;-1:-1:-1;53551:96:0;;53466:67;;53561:19;;;-1:-1:-1;;;;;53561:19:0;;53551:60;;18116:18:1;;53551:80:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:84;;:96::i;45941:659::-;45992:7;46012:16;46031;:14;:16::i;:::-;46012:35;;46058:14;46093:19;;;;;;;;;-1:-1:-1;;;;;46093:19:0;-1:-1:-1;;;;;46083:43:0;;:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;46287:13;;46275:32;;-1:-1:-1;;;46275:32:0;;-1:-1:-1;;;;;46287:13:0;;;46275:32;;;20004:51:1;46302:4:0;20071:18:1;;;20064:34;46058:71:0;;-1:-1:-1;46239:33:0;;46275:11;;;;;;19977:18:1;;46275:32:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;46239:68;-1:-1:-1;46318:29:0;46350:49;46394:4;46350:39;:8;46239:68;46350:12;:39::i;:49::-;46318:81;;46410:29;46452:19;;;;;;;;;-1:-1:-1;;;;;46452:19:0;-1:-1:-1;;;;;46442:52:0;;:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;46410:86;;46514:78;46587:4;46514:68;46564:17;;46540:21;:41;;;;:::i;:::-;46514:21;;:25;:68::i;:78::-;46507:85;;;;;;;45941:659;:::o;32941:201::-;31928:13;:11;:13::i;:::-;-1:-1:-1;;;;;33030:22:0;::::1;33022:73;;;::::0;-1:-1:-1;;;33022:73:0;;20311:2:1;33022:73:0::1;::::0;::::1;20293:21:1::0;20350:2;20330:18;;;20323:30;20389:34;20369:18;;;20362:62;-1:-1:-1;;;20440:18:1;;;20433:36;20486:19;;33022:73:0::1;20109:402:1::0;33022:73:0::1;33106:28;33125:8;33106:18;:28::i;:::-;32941:201:::0;:::o;48993:928::-;45385:10;;49093:7;;-1:-1:-1;;;;;45385:10:0;45399;45385:24;45377:65;;;;-1:-1:-1;;;45377:65:0;;;;;;;:::i;:::-;35751:21:::1;:19;:21::i;:::-;49132:1:::2;49121:8;:12;49113:44;;;::::0;-1:-1:-1;;;49113:44:0;;20718:2:1;49113:44:0::2;::::0;::::2;20700:21:1::0;20757:2;20737:18;;;20730:30;-1:-1:-1;;;20776:18:1;;;20769:49;20835:18;;49113:44:0::2;20516:343:1::0;49113:44:0::2;49180:19;::::0;49210:3:::2;::::0;49170:54:::2;::::0;-1:-1:-1;;;49170:54:0;;::::2;::::0;::::2;21038:25:1::0;;;;21079:18;;;21072:34;;;49180:19:0::2;::::0;;::::2;-1:-1:-1::0;;;;;49180:19:0::2;::::0;49170:39:::2;::::0;21011:18:1;;49170:54:0::2;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;-1:-1:-1::0;;49262:11:0::2;::::0;;49255:44:::2;::::0;-1:-1:-1;;;49255:44:0;;49293:4:::2;49255:44:::0;;::::2;598:51:1::0;;;;49237:15:0::2;::::0;-1:-1:-1;;;;;;49262:11:0::2;::::0;-1:-1:-1;49255:29:0::2;::::0;571:18:1;;49255:44:0::2;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;49237:62;;49325:7;49314:8;:18;49310:69;;;49360:7;49349:18;;49310:69;49413:8;49395:15;;:26;49391:85;;;49449:15;;49438:26;;49391:85;49488:21;49512:46;49542:15;;49512:25;49525:11;;49512:8;:12;;:25;;;;:::i;:46::-;49488:70;;49589:11;;49573:13;:27;49569:87;;;-1:-1:-1::0;49633:11:0::2;::::0;49569:87:::2;49680:11;::::0;:30:::2;::::0;49696:13;49680:15:::2;:30::i;:::-;49666:11;:44:::0;49739:15:::2;::::0;:29:::2;::::0;49759:8;49739:19:::2;:29::i;:::-;49721:15;:47:::0;49788:11:::2;::::0;49781:63:::2;::::0;-1:-1:-1;;;;;49788:11:0::2;49822:10;49835:8:::0;49781:32:::2;:63::i;:::-;49862:18;::::0;7541:25:1;;;49862:18:0::2;::::0;7529:2:1;7514:18;49862::0::2;;;;;;;49900:13:::0;-1:-1:-1;;35795:20:0::1;35189:1:::0;36315:22;;36132:213;48428:67;31928:13;:11;:13::i;:::-;48476:11:::1;:9;:11::i;32207:132::-:0;32088:7;32115:6;-1:-1:-1;;;;;32115:6:0;30652:10;32271:23;32263:68;;;;-1:-1:-1;;;32263:68:0;;21319:2:1;32263:68:0;;;21301:21:1;;;21338:18;;;21331:30;21397:34;21377:18;;;21370:62;21449:18;;32263:68:0;21117:356:1;48576:409:0;48635:11;;;48676:30;;-1:-1:-1;;;48676:30:0;;48700:4;48676:30;;;598:51:1;;;;-1:-1:-1;;;;;48635:11:0;;48613:12;;48635:11;;48676:15;;571:18:1;;48676:30:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;48735:15;;48658:48;;-1:-1:-1;48735:28:0;;48658:48;48735:19;:28::i;:::-;48717:15;:46;48778:11;;48774:204;;48824:11;;48837:19;;48806:60;;-1:-1:-1;;;;;48824:11:0;;;;;48837:19;;;48858:7;48806:17;:60::i;:::-;48891:19;;48920:3;;48881:52;;-1:-1:-1;;;48881:52:0;;;;;21038:25:1;;;;21079:18;;;21072:34;;;48891:19:0;;;;-1:-1:-1;;;;;48891:19:0;;48881:38;;21011:18:1;;48881:52:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48953:13;48958:7;48953:13;;;;7541:25:1;;7529:2;7514:18;;7395:177;48953:13:0;;;;;;;;48602:383;;48576:409::o;39085:120::-;38094:16;:14;:16::i;:::-;39144:7:::1;:15:::0;;-1:-1:-1;;39144:15:0::1;::::0;;39175:22:::1;30652:10:::0;39184:12:::1;39175:22;::::0;-1:-1:-1;;;;;616:32:1;;;598:51;;586:2;571:18;39175:22:0::1;;;;;;;39085:120::o:0;35831:293::-;35233:1;35965:7;;:19;;35957:63;;;;-1:-1:-1;;;35957:63:0;;21680:2:1;35957:63:0;;;21662:21:1;21719:2;21699:18;;;21692:30;21758:33;21738:18;;;21731:61;21809:18;;35957:63:0;21478:355:1;35957:63:0;35233:1;36098:7;:18;35831:293::o;38389:108::-;38301:7;;;;38459:9;38451:38;;;;-1:-1:-1;;;38451:38:0;;22040:2:1;38451:38:0;;;22022:21:1;22079:2;22059:18;;;22052:30;-1:-1:-1;;;22098:18:1;;;22091:46;22154:18;;38451:38:0;21838:340:1;17420:205:0;17548:68;;-1:-1:-1;;;;;22441:15:1;;;17548:68:0;;;22423:34:1;22493:15;;22473:18;;;22466:43;22525:18;;;22518:34;;;17521:96:0;;17541:5;;-1:-1:-1;;;17571:27:0;22358:18:1;;17548:68:0;;;;-1:-1:-1;;17548:68:0;;;;;;;;;;;;;;-1:-1:-1;;;;;17548:68:0;-1:-1:-1;;;;;;17548:68:0;;;;;;;;;;17521:19;:96::i;26636:98::-;26694:7;26721:5;26725:1;26721;:5;:::i;:::-;26714:12;26636:98;-1:-1:-1;;;26636:98:0:o;27035:::-;27093:7;27120:5;27124:1;27120;:5;:::i;25898:98::-;25956:7;25983:5;25987:1;25983;:5;:::i;49927:961::-;50084:19;;50135:3;;50074:80;;-1:-1:-1;;;50074:80:0;;;;;18143:25:1;;;;50148:4:0;18184:18:1;;;18177:60;50050:21:0;;50084:19;;;-1:-1:-1;;;;;50084:19:0;;50074:60;;18116:18:1;;50074:80:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;50050:104;;50165:29;50207:19;;;;;;;;;-1:-1:-1;;;;;50207:19:0;-1:-1:-1;;;;;50197:52:0;;:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;50165:86;;50262:14;50297:19;;;;;;;;;-1:-1:-1;;;;;50297:19:0;-1:-1:-1;;;;;50287:43:0;;:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;50491:13;;50479:32;;-1:-1:-1;;;50479:32:0;;-1:-1:-1;;;;;50491:13:0;;;50479:32;;;20004:51:1;50506:4:0;20071:18:1;;;20064:34;50262:71:0;;-1:-1:-1;50443:33:0;;50479:11;;;;;;19977:18:1;;50479:32:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;50443:68;;50579:24;50606:113;50714:4;50606:103;50691:17;;50667:21;:41;;;;:::i;:::-;50607:54;50656:4;50607:44;:25;50637:13;50607:29;:44::i;:54::-;50606:60;;:103::i;:113::-;50822:19;;50876:3;;50812:68;;-1:-1:-1;;;50812:68:0;;;;;7541:25:1;;;;50579:140:0;;-1:-1:-1;50822:19:0;;;-1:-1:-1;;;;;50822:19:0;;50812:38;;50579:140;;7514:18:1;;50812:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49956:932;;;;;49927:961::o;50896:822::-;50966:13;;50959:46;;-1:-1:-1;;;50959:46:0;;50999:4;50959:46;;;598:51:1;50936:20:0;;-1:-1:-1;;;;;50966:13:0;;50959:31;;571:18:1;;50959:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;50936:69;;51036:1;51020:12;:17;51016:56;;51054:7;50896:822::o;51016:56::-;51094:13;;51087:35;;;-1:-1:-1;;;;;51094:13:0;;;20004:51:1;;20086:2;20071:18;;20064:34;;;51087:35:0;;19977:18:1;51087:35:0;;;;;;;51215:29;51257:19;;;;;;;;;-1:-1:-1;;;;;51257:19:0;-1:-1:-1;;;;;51247:52:0;;:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;51215:86;;51312:130;51326:13;;;;;;;;;-1:-1:-1;;;;;51326:13:0;51341:85;51421:4;51341:75;51402:13;;51382:17;;51358:21;:41;;;;:::i;:::-;:57;;;;:::i;:::-;51341:12;;:16;:75::i;:85::-;51436:4;51312:13;:130::i;:::-;51484:38;51518:3;51484:29;51509:3;51484:20;;:24;;:29;;;;:::i;:38::-;51459:21;:63;51455:256;;51566:15;;51619:20;;51540:12;;-1:-1:-1;;;;;51566:15:0;;51595:44;;:21;:44;:::i;:::-;51558:86;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51539:105;;;51667:7;51659:40;;;;-1:-1:-1;;;51659:40:0;;23439:2:1;51659:40:0;;;23421:21:1;23478:2;23458:18;;;23451:30;-1:-1:-1;;;23497:18:1;;;23490:50;23557:18;;51659:40:0;23237:344:1;33302:191:0;33376:16;33395:6;;-1:-1:-1;;;;;33412:17:0;;;-1:-1:-1;;;;;;33412:17:0;;;;;;33445:40;;33395:6;;;;;;;33445:40;;33376:16;33445:40;33365:128;33302:191;:::o;38826:118::-;37835:19;:17;:19::i;:::-;38886:7:::1;:14:::0;;-1:-1:-1;;38886:14:0::1;38896:4;38886:14;::::0;;38916:20:::1;38923:12;30652:10:::0;;30572:98;57237:133;57298:1;57286:9;:13;57278:37;;;;-1:-1:-1;;;57278:37:0;;23788:2:1;57278:37:0;;;23770:21:1;23827:2;23807:18;;;23800:30;-1:-1:-1;;;23846:18:1;;;23839:41;23897:18;;57278:37:0;23586:335:1;57278:37:0;57331:31;;57352:9;7541:25:1;;57340:10:0;;57331:31;;7529:2:1;7514:18;57331:31:0;;;;;;;57237:133::o;16998:177::-;17108:58;;-1:-1:-1;;;;;20022:32:1;;17108:58:0;;;20004:51:1;20071:18;;;20064:34;;;17081:86:0;;17101:5;;-1:-1:-1;;;17131:23:0;19977:18:1;;17108:58:0;19804:300:1;51726:1038:0;51848:13;;51841:46;;-1:-1:-1;;;51841:46:0;;51881:4;51841:46;;;598:51:1;51818:20:0;;-1:-1:-1;;;;;51848:13:0;;51841:31;;571:18:1;;51841:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;51978:13;;51818:69;;-1:-1:-1;51949:62:0;;51965:45;;-1:-1:-1;;;;;51978:13:0;43022:42;51818:69;51965:12;:45::i;:::-;51949:11;;;:15;:62::i;:::-;51935:11;:76;52045:13;;52028;;-1:-1:-1;;;;;52028:13:0;;;52045;;52028:30;52024:146;;52093:13;;52108;;52075:83;;-1:-1:-1;;;;;52093:13:0;;;;52108;52123:19;:12;52140:1;52123:16;:19::i;:::-;52152:4;52075:17;:83::i;:::-;52203:13;;52186;;-1:-1:-1;;;;;52186:13:0;;;52203;;52186:30;52182:146;;52251:13;;52266;;52233:83;;-1:-1:-1;;;;;52251:13:0;;;;52266;52281:19;:12;52298:1;52281:16;:19::i;52233:83::-;52414:13;;52407:46;;-1:-1:-1;;;52407:46:0;;52447:4;52407:46;;;598:51:1;52387:17:0;;-1:-1:-1;;;;;52414:13:0;;52407:31;;571:18:1;;52407:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;52491:13;;52484:46;;-1:-1:-1;;;52484:46:0;;52524:4;52484:46;;;598:51:1;52387:66:0;;-1:-1:-1;52464:17:0;;-1:-1:-1;;;;;52491:13:0;;;;52484:31;;571:18:1;;52484:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;52464:66;;52557:1;52545:9;:13;:30;;;;;52574:1;52562:9;:13;52545:30;52541:216;;;52606:13;;52621;;52636:6;;52592:73;;-1:-1:-1;;;;;52606:13:0;;;;52621;;-1:-1:-1;;;52636:6:0;;;;52644:9;52655;52592:13;:73::i;:::-;52694:13;;52720;;52685:60;;;-1:-1:-1;;;;;52694:13:0;;;24195:34:1;;24260:2;24245:18;;24238:34;;;52720:13:0;;;;24288:18:1;;;24281:43;24355:2;24340:18;;24333:34;;;52685:60:0;;24144:3:1;24129:19;52685:60:0;23926:447:1;26279:98:0;26337:7;26364:5;26368:1;26364;:5;:::i;47486:194::-;47616:56;-1:-1:-1;;;;;47616:35:0;;47652:7;47661:10;47616:35;:56::i;38574:108::-;38301:7;;;;38633:41;;;;-1:-1:-1;;;38633:41:0;;24580:2:1;38633:41:0;;;24562:21:1;24619:2;24599:18;;;24592:30;-1:-1:-1;;;24638:18:1;;;24631:50;24698:18;;38633:41:0;24378:344:1;21344:649:0;21768:23;21794:69;21822:4;21794:69;;;;;;;;;;;;;;;;;21802:5;-1:-1:-1;;;;;21794:27:0;;;:69;;;;;:::i;:::-;21768:95;;21882:10;:17;21903:1;21882:22;:56;;;;21919:10;21908:30;;;;;;;;;;;;:::i;:::-;21874:111;;;;-1:-1:-1;;;21874:111:0;;25179:2:1;21874:111:0;;;25161:21:1;25218:2;25198:18;;;25191:30;25257:34;25237:18;;;25230:62;-1:-1:-1;;;25308:18:1;;;25301:40;25358:19;;21874:111:0;24977:406:1;55886:338:0;56010:16;;55979:57;;55997:11;;-1:-1:-1;;;;;56010:16:0;56028:7;55979:17;:57::i;:::-;-1:-1:-1;;;;;56051:17:0;;43022:42;56051:17;56047:170;;56093:16;;-1:-1:-1;;;;;56145:24:0;;;56093:16;56145:24;;;:11;:24;;;;;;;;43022:42;56145:28;;;;;;;56093:16;;;;;56085:47;;56133:7;;56093:16;56175:2;56179:25;:15;56199:4;56179:19;:25::i;:::-;56085:120;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55886:338;;;:::o;56232:387::-;56382:16;;56351:57;;56369:11;;-1:-1:-1;;;;;56382:16:0;56400:7;56351:17;:57::i;:::-;56438:12;-1:-1:-1;;;;;56423:27:0;:11;-1:-1:-1;;;;;56423:27:0;;56419:193;;56475:16;;-1:-1:-1;;;;;56530:24:0;;;56475:16;56530:24;;;:11;:24;;;;;;;;:38;;;;;;;;;;56475:16;;;;;56467:50;;56518:7;;56475:16;56570:2;56574:25;:15;56594:4;56574:19;:25::i;:::-;56467:133;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56232:387;;;;:::o;56627:440::-;56795:16;;56768:61;;56786:7;;-1:-1:-1;;;;;56795:16:0;56813:15;56768:17;:61::i;:::-;56867:16;;56840:61;;56858:7;;-1:-1:-1;;;;;56867:16:0;56885:15;56840:17;:61::i;:::-;56920:16;;-1:-1:-1;;;;;56920:16:0;56912:38;56951:7;56960;56969;56978:15;56995;56920:16;;57026:4;57033:25;:15;57053:4;57033:19;:25::i;:::-;56912:147;;;;;;-1:-1:-1;;;;;;56912:147:0;;;-1:-1:-1;;;;;26465:15:1;;;56912:147:0;;;26447:34:1;26517:15;;;26497:18;;;26490:43;26576:14;;26569:22;26549:18;;;26542:50;26608:18;;;26601:34;;;;26651:19;;;26644:35;;;;26695:19;;;26688:35;26739:19;;;26732:35;26804:15;;;26783:19;;;26776:44;26836:19;;;26829:35;;;;26381:19;;56912:147:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;18673:283::-;18793:39;;-1:-1:-1;;;18793:39:0;;18817:4;18793:39;;;27398:34:1;-1:-1:-1;;;;;27468:15:1;;;27448:18;;;27441:43;18770:20:0;;18793:15;;;;;;27333:18:1;;18793:39:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;18770:62;-1:-1:-1;18843:105:0;18863:5;-1:-1:-1;;;18917:7:0;18926:20;18941:5;18770:62;18926:20;:::i;:::-;18870:77;;-1:-1:-1;;;;;20022:32:1;;;18870:77:0;;;20004:51:1;20071:18;;;20064:34;19977:18;;18870:77:0;19804:300:1;10795:229:0;10932:12;10964:52;10986:6;10994:4;11000:1;11003:12;10932;12169;12183:23;12210:6;-1:-1:-1;;;;;12210:11:0;12229:5;12236:4;12210:31;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12168:73;;;;12259:69;12286:6;12294:7;12303:10;12315:12;12259:26;:69::i;:::-;12252:76;11881:455;-1:-1:-1;;;;;;;11881:455:0:o;14454:644::-;14639:12;14668:7;14664:427;;;14696:17;;14692:290;;-1:-1:-1;;;;;8335:19:0;;;14906:60;;;;-1:-1:-1;;;14906:60:0;;28104:2:1;14906:60:0;;;28086:21:1;28143:2;28123:18;;;28116:30;28182:31;28162:18;;;28155:59;28231:18;;14906:60:0;27902:353:1;14906:60:0;-1:-1:-1;15003:10:0;14996:17;;14664:427;15046:33;15054:10;15066:12;15801:17;;:21;15797:388;;16033:10;16027:17;16090:15;16077:10;16073:2;16069:19;16062:44;15797:388;16160:12;16153:20;;-1:-1:-1;;;16153:20:0;;;;;;;;:::i;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;14:248:1:-;82:6;90;143:2;131:9;122:7;118:23;114:32;111:52;;;159:1;156;149:12;111:52;-1:-1:-1;;182:23:1;;;252:2;237:18;;;224:32;;-1:-1:-1;14:248:1:o;267:180::-;326:6;379:2;367:9;358:7;354:23;350:32;347:52;;;395:1;392;385:12;347:52;-1:-1:-1;418:23:1;;267:180;-1:-1:-1;267:180:1:o;660:131::-;-1:-1:-1;;;;;735:31:1;;725:42;;715:70;;781:1;778;771:12;796:127;857:10;852:3;848:20;845:1;838:31;888:4;885:1;878:15;912:4;909:1;902:15;928:253;1000:2;994:9;1042:4;1030:17;;1077:18;1062:34;;1098:22;;;1059:62;1056:88;;;1124:18;;:::i;:::-;1160:2;1153:22;928:253;:::o;1186:275::-;1257:2;1251:9;1322:2;1303:13;;-1:-1:-1;;1299:27:1;1287:40;;1357:18;1342:34;;1378:22;;;1339:62;1336:88;;;1404:18;;:::i;:::-;1440:2;1433:22;1186:275;;-1:-1:-1;1186:275:1:o;1466:188::-;1531:4;1564:18;1556:6;1553:30;1550:56;;;1586:18;;:::i;:::-;-1:-1:-1;1631:1:1;1627:14;1643:4;1623:25;;1466:188::o;1659:118::-;1745:5;1738:13;1731:21;1724:5;1721:32;1711:60;;1767:1;1764;1757:12;1782:1293;1841:5;1894:3;1887:4;1879:6;1875:17;1871:27;1861:55;;1912:1;1909;1902:12;1861:55;1948:6;1935:20;1974:4;1998:65;2014:48;2059:2;2014:48;:::i;:::-;1998:65;:::i;:::-;2097:15;;;2159:4;2202:11;;;2190:24;;2186:33;;;2128:12;;;;2085:3;2231:15;;;2228:35;;;2259:1;2256;2249:12;2228:35;2295:2;2287:6;2283:15;2307:739;2323:6;2318:3;2315:15;2307:739;;;2399:2;2393:3;2388;2384:13;2380:22;2377:112;;;2443:1;2472:2;2468;2461:14;2377:112;2515:22;;:::i;:::-;2578:3;2565:17;2595:33;2620:7;2595:33;:::i;:::-;2641:22;;2704:12;;;2691:26;2730:33;2691:26;2730:33;:::i;:::-;2783:14;;;2776:31;2830:2;2873:12;;;2860:26;2899:30;2860:26;2899:30;:::i;:::-;2949:14;;;2942:31;2986:18;;3024:12;;;;2340;;2307:739;;;-1:-1:-1;3064:5:1;;1782:1293;-1:-1:-1;;;;;;;1782:1293:1:o;3080:652::-;3205:6;3213;3221;3274:2;3262:9;3253:7;3249:23;3245:32;3242:52;;;3290:1;3287;3280:12;3242:52;3329:9;3316:23;3348:31;3373:5;3348:31;:::i;:::-;3398:5;-1:-1:-1;3455:2:1;3440:18;;3427:32;3468:33;3427:32;3468:33;:::i;:::-;3520:7;-1:-1:-1;3578:2:1;3563:18;;3550:32;3605:18;3594:30;;3591:50;;;3637:1;3634;3627:12;3591:50;3660:66;3718:7;3709:6;3698:9;3694:22;3660:66;:::i;:::-;3650:76;;;3080:652;;;;;:::o;3737:407::-;3802:5;3836:18;3828:6;3825:30;3822:56;;;3858:18;;:::i;:::-;3896:57;3941:2;3920:15;;-1:-1:-1;;3916:29:1;3947:4;3912:40;3896:57;:::i;:::-;3887:66;;3976:6;3969:5;3962:21;4016:3;4007:6;4002:3;3998:16;3995:25;3992:45;;;4033:1;4030;4023:12;3992:45;4082:6;4077:3;4070:4;4063:5;4059:16;4046:43;4136:1;4129:4;4120:6;4113:5;4109:18;4105:29;4098:40;3737:407;;;;;:::o;4149:1004::-;4254:6;4262;4270;4278;4331:3;4319:9;4310:7;4306:23;4302:33;4299:53;;;4348:1;4345;4338:12;4299:53;4387:9;4374:23;4406:31;4431:5;4406:31;:::i;:::-;4456:5;-1:-1:-1;4508:2:1;4493:18;;4480:32;;-1:-1:-1;4563:2:1;4548:18;;4535:32;4586:18;4616:14;;;4613:34;;;4643:1;4640;4633:12;4613:34;4681:6;4670:9;4666:22;4656:32;;4726:7;4719:4;4715:2;4711:13;4707:27;4697:55;;4748:1;4745;4738:12;4697:55;4771:74;4837:7;4832:2;4819:16;4814:2;4810;4806:11;4771:74;:::i;:::-;4761:84;;4898:2;4887:9;4883:18;4870:32;4854:48;;4927:2;4917:8;4914:16;4911:36;;;4943:1;4940;4933:12;4911:36;-1:-1:-1;4966:24:1;;5021:4;5013:13;;5009:27;-1:-1:-1;4999:55:1;;5050:1;5047;5040:12;4999:55;5073:74;5139:7;5134:2;5121:16;5116:2;5112;5108:11;5073:74;:::i;:::-;5063:84;;;4149:1004;;;;;;;:::o;5158:258::-;5230:1;5240:113;5254:6;5251:1;5248:13;5240:113;;;5330:11;;;5324:18;5311:11;;;5304:39;5276:2;5269:10;5240:113;;;5371:6;5368:1;5365:13;5362:48;;;-1:-1:-1;;5406:1:1;5388:16;;5381:27;5158:258::o;5421:257::-;5462:3;5500:5;5494:12;5527:6;5522:3;5515:19;5543:63;5599:6;5592:4;5587:3;5583:14;5576:4;5569:5;5565:16;5543:63;:::i;:::-;5660:2;5639:15;-1:-1:-1;;5635:29:1;5626:39;;;;5667:4;5622:50;;5421:257;-1:-1:-1;;5421:257:1:o;5683:217::-;5830:2;5819:9;5812:21;5793:4;5850:44;5890:2;5879:9;5875:18;5867:6;5850:44;:::i;6097:383::-;6174:6;6182;6190;6243:2;6231:9;6222:7;6218:23;6214:32;6211:52;;;6259:1;6256;6249:12;6211:52;6298:9;6285:23;6317:31;6342:5;6317:31;:::i;:::-;6367:5;6419:2;6404:18;;6391:32;;-1:-1:-1;6470:2:1;6455:18;;;6442:32;;6097:383;-1:-1:-1;;;6097:383:1:o;6485:905::-;6706:6;6714;6722;6775:2;6763:9;6754:7;6750:23;6746:32;6743:52;;;6791:1;6788;6781:12;6743:52;6831:9;6818:23;6860:18;6901:2;6893:6;6890:14;6887:34;;;6917:1;6914;6907:12;6887:34;6940:66;6998:7;6989:6;6978:9;6974:22;6940:66;:::i;:::-;6930:76;;7059:2;7048:9;7044:18;7031:32;7015:48;;7088:2;7078:8;7075:16;7072:36;;;7104:1;7101;7094:12;7072:36;7127:68;7187:7;7176:8;7165:9;7161:24;7127:68;:::i;:::-;7117:78;;7248:2;7237:9;7233:18;7220:32;7204:48;;7277:2;7267:8;7264:16;7261:36;;;7293:1;7290;7283:12;7261:36;;7316:68;7376:7;7365:8;7354:9;7350:24;7316:68;:::i;7577:315::-;7645:6;7653;7706:2;7694:9;7685:7;7681:23;7677:32;7674:52;;;7722:1;7719;7712:12;7674:52;7761:9;7748:23;7780:31;7805:5;7780:31;:::i;:::-;7830:5;7882:2;7867:18;;;;7854:32;;-1:-1:-1;;;7577:315:1:o;7897:247::-;7956:6;8009:2;7997:9;7988:7;7984:23;7980:32;7977:52;;;8025:1;8022;8015:12;7977:52;8064:9;8051:23;8083:31;8108:5;8083:31;:::i;8149:456::-;8226:6;8234;8242;8295:2;8283:9;8274:7;8270:23;8266:32;8263:52;;;8311:1;8308;8301:12;8263:52;8350:9;8337:23;8369:31;8394:5;8369:31;:::i;:::-;8419:5;-1:-1:-1;8476:2:1;8461:18;;8448:32;8489:33;8448:32;8489:33;:::i;:::-;8149:456;;8541:7;;-1:-1:-1;;;8595:2:1;8580:18;;;;8567:32;;8149:456::o;10671:127::-;10732:10;10727:3;10723:20;10720:1;10713:31;10763:4;10760:1;10753:15;10787:4;10784:1;10777:15;10803:127;10864:10;10859:3;10855:20;10852:1;10845:31;10895:4;10892:1;10885:15;10919:4;10916:1;10909:15;10935:135;10974:3;-1:-1:-1;;10995:17:1;;10992:43;;;11015:18;;:::i;:::-;-1:-1:-1;11062:1:1;11051:13;;10935:135::o;11436:371::-;-1:-1:-1;;;;;;11621:33:1;;11609:46;;11678:13;;11591:3;;11700:61;11678:13;11750:1;11741:11;;11734:4;11722:17;;11700:61;:::i;:::-;11781:16;;;;11799:1;11777:24;;11436:371;-1:-1:-1;;;11436:371:1:o;11812:274::-;11941:3;11979:6;11973:13;11995:53;12041:6;12036:3;12029:4;12021:6;12017:17;11995:53;:::i;:::-;12064:16;;;;;11812:274;-1:-1:-1;;11812:274:1:o;12521:450::-;12744:6;12733:9;12726:25;12787:2;12782;12771:9;12767:18;12760:30;12707:4;12813:44;12853:2;12842:9;12838:18;12830:6;12813:44;:::i;:::-;12905:9;12897:6;12893:22;12888:2;12877:9;12873:18;12866:50;12933:32;12958:6;12950;12933:32;:::i;:::-;12925:40;12521:450;-1:-1:-1;;;;;;12521:450:1:o;12976:352::-;13178:2;13160:21;;;13217:2;13197:18;;;13190:30;13256;13251:2;13236:18;;13229:58;13319:2;13304:18;;12976:352::o;13665:717::-;13731:3;13769:5;13763:12;13796:6;13791:3;13784:19;13822:4;13851:2;13846:3;13842:12;13835:19;;13873:5;13870:1;13863:16;13915:2;13912:1;13902:16;13936:1;13946:411;13960:6;13957:1;13954:13;13946:411;;;14067:13;;-1:-1:-1;;;;;14063:22:1;;;14051:35;;14036:1;14122:14;;;14116:21;14171:18;;;14157:12;;;14150:40;14027:3;14244:19;;;;14265:4;14240:30;14233:38;14226:46;14219:4;14210:14;;14203:70;14302:4;14293:14;;;;14342:4;14330:17;;;;13975:9;13946:411;;;-1:-1:-1;14373:3:1;;13665:717;-1:-1:-1;;;;;13665:717:1:o;14387:385::-;14634:6;14623:9;14616:25;14677:2;14672;14661:9;14657:18;14650:30;14597:4;14697:69;14762:2;14751:9;14747:18;14739:6;14697:69;:::i;14777:886::-;14872:6;14903:2;14946;14934:9;14925:7;14921:23;14917:32;14914:52;;;14962:1;14959;14952:12;14914:52;14995:9;14989:16;15028:18;15020:6;15017:30;15014:50;;;15060:1;15057;15050:12;15014:50;15083:22;;15136:4;15128:13;;15124:27;-1:-1:-1;15114:55:1;;15165:1;15162;15155:12;15114:55;15194:2;15188:9;15217:65;15233:48;15278:2;15233:48;:::i;15217:65::-;15316:15;;;15398:1;15394:10;;;;15386:19;;15382:28;;;15347:12;;;;15422:19;;;15419:39;;;15454:1;15451;15444:12;15419:39;15478:11;;;;15498:135;15514:6;15509:3;15506:15;15498:135;;;15580:10;;15568:23;;15531:12;;;;15611;;;;15498:135;;15668:125;15708:4;15736:1;15733;15730:8;15727:34;;;15741:18;;:::i;:::-;-1:-1:-1;15778:9:1;;15668:125::o;16551:184::-;16621:6;16674:2;16662:9;16653:7;16649:23;16645:32;16642:52;;;16690:1;16687;16680:12;16642:52;-1:-1:-1;16713:16:1;;16551:184;-1:-1:-1;16551:184:1:o;16740:128::-;16780:3;16811:1;16807:6;16804:1;16801:13;16798:39;;;16817:18;;:::i;:::-;-1:-1:-1;16853:9:1;;16740:128::o;16873:402::-;17075:2;17057:21;;;17114:2;17094:18;;;17087:30;17153:34;17148:2;17133:18;;17126:62;-1:-1:-1;;;17219:2:1;17204:18;;17197:36;17265:3;17250:19;;16873:402::o;18248:245::-;18327:6;18335;18388:2;18376:9;18367:7;18363:23;18359:32;18356:52;;;18404:1;18401;18394:12;18356:52;-1:-1:-1;;18427:16:1;;18483:2;18468:18;;;18462:25;18427:16;;18462:25;;-1:-1:-1;18248:245:1:o;19548:251::-;19618:6;19671:2;19659:9;19650:7;19646:23;19642:32;19639:52;;;19687:1;19684;19677:12;19639:52;19719:9;19713:16;19738:31;19763:5;19738:31;:::i;22563:168::-;22603:7;22669:1;22665;22661:6;22657:14;22654:1;22651:21;22646:1;22639:9;22632:17;22628:45;22625:71;;;22676:18;;:::i;:::-;-1:-1:-1;22716:9:1;;22563:168::o;22736:217::-;22776:1;22802;22792:132;;22846:10;22841:3;22837:20;22834:1;22827:31;22881:4;22878:1;22871:15;22909:4;22906:1;22899:15;22792:132;-1:-1:-1;22938:9:1;;22736:217::o;24727:245::-;24794:6;24847:2;24835:9;24826:7;24822:23;24818:32;24815:52;;;24863:1;24860;24853:12;24815:52;24895:9;24889:16;24914:28;24936:5;24914:28;:::i;25388:635::-;25727:6;25716:9;25709:25;25770:6;25765:2;25754:9;25750:18;25743:34;25813:3;25808:2;25797:9;25793:18;25786:31;25690:4;25834:70;25899:3;25888:9;25884:19;25876:6;25834:70;:::i;:::-;-1:-1:-1;;;;;25940:32:1;;;;25935:2;25920:18;;25913:60;-1:-1:-1;26004:3:1;25989:19;25982:35;25826:78;25388:635;-1:-1:-1;;;25388:635:1:o;26875:306::-;26963:6;26971;26979;27032:2;27020:9;27011:7;27007:23;27003:32;27000:52;;;27048:1;27045;27038:12;27000:52;27077:9;27071:16;27061:26;;27127:2;27116:9;27112:18;27106:25;27096:35;;27171:2;27160:9;27156:18;27150:25;27140:35;;26875:306;;;;;:::o
Swarm Source
ipfs://54e42377cbf28353b4843db8c44369698f64026d7a05f071b713c7f4816f13ce
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 31 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.