Feature Tip: Add private address tag to any address under My Name Tag !
ERC-721
Overview
Max Total Supply
50 Geeks Beaver
Holders
32
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
1 Geeks BeaverLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Source Code Verified (Exact Match)
Contract Name:
Beavers
Compiler Version
v0.8.23+commit.f704f362
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2024-01-24 */ // SPDX-License-Identifier: UNLICENSED // File: @openzeppelin/contracts/security/ReentrancyGuard.sol // OpenZeppelin Contracts (last updated v4.9.0) (security/ReentrancyGuard.sol) pragma solidity ^0.8.0; /** * @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; } } // File: @openzeppelin/contracts/utils/math/SafeMath.sol // OpenZeppelin Contracts (last updated v4.9.0) (utils/math/SafeMath.sol) pragma solidity ^0.8.0; // 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; } } } // File: @openzeppelin/contracts/token/ERC20/IERC20.sol // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol) pragma solidity ^0.8.0; /** * @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); } // File: @openzeppelin/contracts/utils/math/Math.sol // OpenZeppelin Contracts (last updated v4.8.0) (utils/math/Math.sol) pragma solidity ^0.8.0; /** * @dev Standard math utilities missing in the Solidity language. */ library Math { enum Rounding { Down, // Toward negative infinity Up, // Toward infinity Zero // Toward zero } /** * @dev Returns the largest of two numbers. */ function max(uint256 a, uint256 b) internal pure returns (uint256) { return a > b ? a : b; } /** * @dev Returns the smallest of two numbers. */ function min(uint256 a, uint256 b) internal pure returns (uint256) { return a < b ? a : b; } /** * @dev Returns the average of two numbers. The result is rounded towards * zero. */ function average(uint256 a, uint256 b) internal pure returns (uint256) { // (a + b) / 2 can overflow. return (a & b) + (a ^ b) / 2; } /** * @dev Returns the ceiling of the division of two numbers. * * This differs from standard division with `/` in that it rounds up instead * of rounding down. */ function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) { // (a + b - 1) / b can overflow on addition, so we distribute. return a == 0 ? 0 : (a - 1) / b + 1; } /** * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0 * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv) * with further edits by Uniswap Labs also under MIT license. */ function mulDiv( uint256 x, uint256 y, uint256 denominator ) internal pure returns (uint256 result) { unchecked { // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256 // variables such that product = prod1 * 2^256 + prod0. uint256 prod0; // Least significant 256 bits of the product uint256 prod1; // Most significant 256 bits of the product assembly { let mm := mulmod(x, y, not(0)) prod0 := mul(x, y) prod1 := sub(sub(mm, prod0), lt(mm, prod0)) } // Handle non-overflow cases, 256 by 256 division. if (prod1 == 0) { return prod0 / denominator; } // Make sure the result is less than 2^256. Also prevents denominator == 0. require(denominator > prod1); /////////////////////////////////////////////// // 512 by 256 division. /////////////////////////////////////////////// // Make division exact by subtracting the remainder from [prod1 prod0]. uint256 remainder; assembly { // Compute remainder using mulmod. remainder := mulmod(x, y, denominator) // Subtract 256 bit number from 512 bit number. prod1 := sub(prod1, gt(remainder, prod0)) prod0 := sub(prod0, remainder) } // Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1. // See https://cs.stackexchange.com/q/138556/92363. // Does not overflow because the denominator cannot be zero at this stage in the function. uint256 twos = denominator & (~denominator + 1); assembly { // Divide denominator by twos. denominator := div(denominator, twos) // Divide [prod1 prod0] by twos. prod0 := div(prod0, twos) // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one. twos := add(div(sub(0, twos), twos), 1) } // Shift in bits from prod1 into prod0. prod0 |= prod1 * twos; // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for // four bits. That is, denominator * inv = 1 mod 2^4. uint256 inverse = (3 * denominator) ^ 2; // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works // in modular arithmetic, doubling the correct bits in each step. inverse *= 2 - denominator * inverse; // inverse mod 2^8 inverse *= 2 - denominator * inverse; // inverse mod 2^16 inverse *= 2 - denominator * inverse; // inverse mod 2^32 inverse *= 2 - denominator * inverse; // inverse mod 2^64 inverse *= 2 - denominator * inverse; // inverse mod 2^128 inverse *= 2 - denominator * inverse; // inverse mod 2^256 // Because the division is now exact we can divide by multiplying with the modular inverse of denominator. // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1 // is no longer required. result = prod0 * inverse; return result; } } /** * @notice Calculates x * y / denominator with full precision, following the selected rounding direction. */ function mulDiv( uint256 x, uint256 y, uint256 denominator, Rounding rounding ) internal pure returns (uint256) { uint256 result = mulDiv(x, y, denominator); if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) { result += 1; } return result; } /** * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded down. * * Inspired by Henry S. Warren, Jr.'s "Hacker's Delight" (Chapter 11). */ function sqrt(uint256 a) internal pure returns (uint256) { if (a == 0) { return 0; } // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target. // // We know that the "msb" (most significant bit) of our target number `a` is a power of 2 such that we have // `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`. // // This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)` // → `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))` // → `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)` // // Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit. uint256 result = 1 << (log2(a) >> 1); // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128, // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision // into the expected uint128 result. unchecked { result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; return min(result, a / result); } } /** * @notice Calculates sqrt(a), following the selected rounding direction. */ function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = sqrt(a); return result + (rounding == Rounding.Up && result * result < a ? 1 : 0); } } /** * @dev Return the log in base 2, rounded down, of a positive value. * Returns 0 if given 0. */ function log2(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >> 128 > 0) { value >>= 128; result += 128; } if (value >> 64 > 0) { value >>= 64; result += 64; } if (value >> 32 > 0) { value >>= 32; result += 32; } if (value >> 16 > 0) { value >>= 16; result += 16; } if (value >> 8 > 0) { value >>= 8; result += 8; } if (value >> 4 > 0) { value >>= 4; result += 4; } if (value >> 2 > 0) { value >>= 2; result += 2; } if (value >> 1 > 0) { result += 1; } } return result; } /** * @dev Return the log in base 2, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log2(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log2(value); return result + (rounding == Rounding.Up && 1 << result < value ? 1 : 0); } } /** * @dev Return the log in base 10, rounded down, of a positive value. * Returns 0 if given 0. */ function log10(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >= 10**64) { value /= 10**64; result += 64; } if (value >= 10**32) { value /= 10**32; result += 32; } if (value >= 10**16) { value /= 10**16; result += 16; } if (value >= 10**8) { value /= 10**8; result += 8; } if (value >= 10**4) { value /= 10**4; result += 4; } if (value >= 10**2) { value /= 10**2; result += 2; } if (value >= 10**1) { result += 1; } } return result; } /** * @dev Return the log in base 10, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log10(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log10(value); return result + (rounding == Rounding.Up && 10**result < value ? 1 : 0); } } /** * @dev Return the log in base 256, rounded down, of a positive value. * Returns 0 if given 0. * * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string. */ function log256(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >> 128 > 0) { value >>= 128; result += 16; } if (value >> 64 > 0) { value >>= 64; result += 8; } if (value >> 32 > 0) { value >>= 32; result += 4; } if (value >> 16 > 0) { value >>= 16; result += 2; } if (value >> 8 > 0) { result += 1; } } return result; } /** * @dev Return the log in base 10, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log256(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log256(value); return result + (rounding == Rounding.Up && 1 << (result * 8) < value ? 1 : 0); } } } // File: @openzeppelin/contracts/utils/Strings.sol // OpenZeppelin Contracts (last updated v4.8.0) (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _SYMBOLS = "0123456789abcdef"; uint8 private constant _ADDRESS_LENGTH = 20; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { unchecked { uint256 length = Math.log10(value) + 1; string memory buffer = new string(length); uint256 ptr; /// @solidity memory-safe-assembly assembly { ptr := add(buffer, add(32, length)) } while (true) { ptr--; /// @solidity memory-safe-assembly assembly { mstore8(ptr, byte(mod(value, 10), _SYMBOLS)) } value /= 10; if (value == 0) break; } return buffer; } } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { unchecked { return toHexString(value, Math.log256(value) + 1); } } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } /** * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation. */ function toHexString(address addr) internal pure returns (string memory) { return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH); } } // File: @openzeppelin/contracts/utils/Context.sol // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // File: @openzeppelin/contracts/access/Ownable.sol // OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol) pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract 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 anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _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); } } // File: @openzeppelin/contracts/utils/Address.sol // OpenZeppelin Contracts (last updated v4.8.0) (utils/Address.sol) pragma solidity ^0.8.1; /** * @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 * ==== * * [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://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract. * * _Available since v4.8._ */ function verifyCallResultFromTarget( address target, bool success, bytes memory returndata, string memory errorMessage ) internal view returns (bytes memory) { if (success) { if (returndata.length == 0) { // only check isContract if the call was successful and the return data is empty // otherwise we already know that it was a contract require(isContract(target), "Address: call to non-contract"); } return returndata; } else { _revert(returndata, errorMessage); } } /** * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason or using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { _revert(returndata, errorMessage); } } function _revert(bytes memory returndata, string memory errorMessage) private pure { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly /// @solidity memory-safe-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } // File: @openzeppelin/contracts/token/ERC721/IERC721Receiver.sol // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721Receiver.sol) pragma solidity ^0.8.0; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721Receiver.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } // File: @openzeppelin/contracts/utils/introspection/IERC165.sol // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } // File: @openzeppelin/contracts/utils/introspection/ERC165.sol // OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol) pragma solidity ^0.8.0; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } } // File: @openzeppelin/contracts/token/ERC721/IERC721.sol // OpenZeppelin Contracts (last updated v4.8.0) (token/ERC721/IERC721.sol) pragma solidity ^0.8.0; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Note that the caller is responsible to confirm that the recipient is capable of receiving ERC721 * or else they may be permanently lost. Usage of {safeTransferFrom} prevents loss, though the caller must * understand this adds an external call which potentially creates a reentrancy vulnerability. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); } // File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Enumerable.sol // OpenZeppelin Contracts (last updated v4.5.0) (token/ERC721/extensions/IERC721Enumerable.sol) pragma solidity ^0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Enumerable is IERC721 { /** * @dev Returns the total amount of tokens stored by the contract. */ function totalSupply() external view returns (uint256); /** * @dev Returns a token ID owned by `owner` at a given `index` of its token list. * Use along with {balanceOf} to enumerate all of ``owner``'s tokens. */ function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256); /** * @dev Returns a token ID at a given `index` of all the tokens stored by the contract. * Use along with {totalSupply} to enumerate all tokens. */ function tokenByIndex(uint256 index) external view returns (uint256); } // File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol) pragma solidity ^0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Metadata is IERC721 { /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); } // File: @openzeppelin/contracts/token/ERC721/ERC721.sol // OpenZeppelin Contracts (last updated v4.8.2) (token/ERC721/ERC721.sol) pragma solidity ^0.8.0; /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata extension, but not including the Enumerable extension, which is available separately as * {ERC721Enumerable}. */ contract ERC721 is Context, ERC165, IERC721, IERC721Metadata { using Address for address; using Strings for uint256; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to owner address mapping(uint256 => address) private _owners; // Mapping owner address to token count mapping(address => uint256) private _balances; // Mapping from token ID to approved address mapping(uint256 => address) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; /** * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection. */ constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC721).interfaceId || interfaceId == type(IERC721Metadata).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view virtual override returns (uint256) { require(owner != address(0), "ERC721: address zero is not a valid owner"); return _balances[owner]; } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view virtual override returns (address) { address owner = _ownerOf(tokenId); require(owner != address(0), "ERC721: invalid token ID"); return owner; } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { _requireMinted(tokenId); string memory baseURI = _baseURI(); return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : ""; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, can be overridden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ""; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public virtual override { address owner = ERC721.ownerOf(tokenId); require(to != owner, "ERC721: approval to current owner"); require( _msgSender() == owner || isApprovedForAll(owner, _msgSender()), "ERC721: approve caller is not token owner or approved for all" ); _approve(to, tokenId); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { _requireMinted(tokenId); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { _setApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom( address from, address to, uint256 tokenId ) public virtual override { //solhint-disable-next-line max-line-length require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: caller is not token owner or approved"); _transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public virtual override { safeTransferFrom(from, to, tokenId, ""); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory data ) public virtual override { require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: caller is not token owner or approved"); _safeTransfer(from, to, tokenId, data); } /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * `data` is additional data, it has no specified format and it is sent in call to `to`. * * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g. * implement alternative mechanisms to perform token transfer, such as signature-based. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeTransfer( address from, address to, uint256 tokenId, bytes memory data ) internal virtual { _transfer(from, to, tokenId); require(_checkOnERC721Received(from, to, tokenId, data), "ERC721: transfer to non ERC721Receiver implementer"); } /** * @dev Returns the owner of the `tokenId`. Does NOT revert if token doesn't exist */ function _ownerOf(uint256 tokenId) internal view virtual returns (address) { return _owners[tokenId]; } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted (`_mint`), * and stop existing when they are burned (`_burn`). */ function _exists(uint256 tokenId) internal view virtual returns (bool) { return _ownerOf(tokenId) != address(0); } /** * @dev Returns whether `spender` is allowed to manage `tokenId`. * * Requirements: * * - `tokenId` must exist. */ function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) { address owner = ERC721.ownerOf(tokenId); return (spender == owner || isApprovedForAll(owner, spender) || getApproved(tokenId) == spender); } /** * @dev Safely mints `tokenId` and transfers it to `to`. * * Requirements: * * - `tokenId` must not exist. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeMint(address to, uint256 tokenId) internal virtual { _safeMint(to, tokenId, ""); } /** * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is * forwarded in {IERC721Receiver-onERC721Received} to contract recipients. */ function _safeMint( address to, uint256 tokenId, bytes memory data ) internal virtual { _mint(to, tokenId); require( _checkOnERC721Received(address(0), to, tokenId, data), "ERC721: transfer to non ERC721Receiver implementer" ); } /** * @dev Mints `tokenId` and transfers it to `to`. * * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible * * Requirements: * * - `tokenId` must not exist. * - `to` cannot be the zero address. * * Emits a {Transfer} event. */ function _mint(address to, uint256 tokenId) internal virtual { require(to != address(0), "ERC721: mint to the zero address"); require(!_exists(tokenId), "ERC721: token already minted"); _beforeTokenTransfer(address(0), to, tokenId, 1); // Check that tokenId was not minted by `_beforeTokenTransfer` hook require(!_exists(tokenId), "ERC721: token already minted"); unchecked { // Will not overflow unless all 2**256 token ids are minted to the same owner. // Given that tokens are minted one by one, it is impossible in practice that // this ever happens. Might change if we allow batch minting. // The ERC fails to describe this case. _balances[to] += 1; } _owners[tokenId] = to; emit Transfer(address(0), to, tokenId); _afterTokenTransfer(address(0), to, tokenId, 1); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * This is an internal function that does not check if the sender is authorized to operate on the token. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId) internal virtual { address owner = ERC721.ownerOf(tokenId); _beforeTokenTransfer(owner, address(0), tokenId, 1); // Update ownership in case tokenId was transferred by `_beforeTokenTransfer` hook owner = ERC721.ownerOf(tokenId); // Clear approvals delete _tokenApprovals[tokenId]; unchecked { // Cannot overflow, as that would require more tokens to be burned/transferred // out than the owner initially received through minting and transferring in. _balances[owner] -= 1; } delete _owners[tokenId]; emit Transfer(owner, address(0), tokenId); _afterTokenTransfer(owner, address(0), tokenId, 1); } /** * @dev Transfers `tokenId` from `from` to `to`. * As opposed to {transferFrom}, this imposes no restrictions on msg.sender. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function _transfer( address from, address to, uint256 tokenId ) internal virtual { require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer from incorrect owner"); require(to != address(0), "ERC721: transfer to the zero address"); _beforeTokenTransfer(from, to, tokenId, 1); // Check that tokenId was not transferred by `_beforeTokenTransfer` hook require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer from incorrect owner"); // Clear approvals from the previous owner delete _tokenApprovals[tokenId]; unchecked { // `_balances[from]` cannot overflow for the same reason as described in `_burn`: // `from`'s balance is the number of token held, which is at least one before the current // transfer. // `_balances[to]` could overflow in the conditions described in `_mint`. That would require // all 2**256 token ids to be minted, which in practice is impossible. _balances[from] -= 1; _balances[to] += 1; } _owners[tokenId] = to; emit Transfer(from, to, tokenId); _afterTokenTransfer(from, to, tokenId, 1); } /** * @dev Approve `to` to operate on `tokenId` * * Emits an {Approval} event. */ function _approve(address to, uint256 tokenId) internal virtual { _tokenApprovals[tokenId] = to; emit Approval(ERC721.ownerOf(tokenId), to, tokenId); } /** * @dev Approve `operator` to operate on all of `owner` tokens * * Emits an {ApprovalForAll} event. */ function _setApprovalForAll( address owner, address operator, bool approved ) internal virtual { require(owner != operator, "ERC721: approve to caller"); _operatorApprovals[owner][operator] = approved; emit ApprovalForAll(owner, operator, approved); } /** * @dev Reverts if the `tokenId` has not been minted yet. */ function _requireMinted(uint256 tokenId) internal view virtual { require(_exists(tokenId), "ERC721: invalid token ID"); } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address. * The call is not executed if the target address is not a contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkOnERC721Received( address from, address to, uint256 tokenId, bytes memory data ) private returns (bool) { if (to.isContract()) { try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, data) returns (bytes4 retval) { return retval == IERC721Receiver.onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert("ERC721: transfer to non ERC721Receiver implementer"); } else { /// @solidity memory-safe-assembly assembly { revert(add(32, reason), mload(reason)) } } } } else { return true; } } /** * @dev Hook that is called before any token transfer. This includes minting and burning. If {ERC721Consecutive} is * used, the hook may be called as part of a consecutive (batch) mint, as indicated by `batchSize` greater than 1. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s tokens will be transferred to `to`. * - When `from` is zero, the tokens will be minted for `to`. * - When `to` is zero, ``from``'s tokens will be burned. * - `from` and `to` are never both zero. * - `batchSize` is non-zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 firstTokenId, uint256 batchSize ) internal virtual {} /** * @dev Hook that is called after any token transfer. This includes minting and burning. If {ERC721Consecutive} is * used, the hook may be called as part of a consecutive (batch) mint, as indicated by `batchSize` greater than 1. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s tokens were transferred to `to`. * - When `from` is zero, the tokens were minted for `to`. * - When `to` is zero, ``from``'s tokens were burned. * - `from` and `to` are never both zero. * - `batchSize` is non-zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _afterTokenTransfer( address from, address to, uint256 firstTokenId, uint256 batchSize ) internal virtual {} /** * @dev Unsafe write access to the balances, used by extensions that "mint" tokens using an {ownerOf} override. * * WARNING: Anyone calling this MUST ensure that the balances remain consistent with the ownership. The invariant * being that for any address `a` the value returned by `balanceOf(a)` must be equal to the number of tokens such * that `ownerOf(tokenId)` is `a`. */ // solhint-disable-next-line func-name-mixedcase function __unsafe_increaseBalance(address account, uint256 amount) internal { _balances[account] += amount; } } // File: @openzeppelin/contracts/token/ERC721/extensions/ERC721Enumerable.sol // OpenZeppelin Contracts (last updated v4.8.0) (token/ERC721/extensions/ERC721Enumerable.sol) pragma solidity ^0.8.0; /** * @dev This implements an optional extension of {ERC721} defined in the EIP that adds * enumerability of all the token ids in the contract as well as all token ids owned by each * account. */ abstract contract ERC721Enumerable is ERC721, IERC721Enumerable { // Mapping from owner to list of owned token IDs mapping(address => mapping(uint256 => uint256)) private _ownedTokens; // Mapping from token ID to index of the owner tokens list mapping(uint256 => uint256) private _ownedTokensIndex; // Array with all token ids, used for enumeration uint256[] private _allTokens; // Mapping from token id to position in the allTokens array mapping(uint256 => uint256) private _allTokensIndex; /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC721) returns (bool) { return interfaceId == type(IERC721Enumerable).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}. */ function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) { require(index < ERC721.balanceOf(owner), "ERC721Enumerable: owner index out of bounds"); return _ownedTokens[owner][index]; } /** * @dev See {IERC721Enumerable-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { return _allTokens.length; } /** * @dev See {IERC721Enumerable-tokenByIndex}. */ function tokenByIndex(uint256 index) public view virtual override returns (uint256) { require(index < ERC721Enumerable.totalSupply(), "ERC721Enumerable: global index out of bounds"); return _allTokens[index]; } /** * @dev See {ERC721-_beforeTokenTransfer}. */ function _beforeTokenTransfer( address from, address to, uint256 firstTokenId, uint256 batchSize ) internal virtual override { super._beforeTokenTransfer(from, to, firstTokenId, batchSize); if (batchSize > 1) { // Will only trigger during construction. Batch transferring (minting) is not available afterwards. revert("ERC721Enumerable: consecutive transfers not supported"); } uint256 tokenId = firstTokenId; if (from == address(0)) { _addTokenToAllTokensEnumeration(tokenId); } else if (from != to) { _removeTokenFromOwnerEnumeration(from, tokenId); } if (to == address(0)) { _removeTokenFromAllTokensEnumeration(tokenId); } else if (to != from) { _addTokenToOwnerEnumeration(to, tokenId); } } /** * @dev Private function to add a token to this extension's ownership-tracking data structures. * @param to address representing the new owner of the given token ID * @param tokenId uint256 ID of the token to be added to the tokens list of the given address */ function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private { uint256 length = ERC721.balanceOf(to); _ownedTokens[to][length] = tokenId; _ownedTokensIndex[tokenId] = length; } /** * @dev Private function to add a token to this extension's token tracking data structures. * @param tokenId uint256 ID of the token to be added to the tokens list */ function _addTokenToAllTokensEnumeration(uint256 tokenId) private { _allTokensIndex[tokenId] = _allTokens.length; _allTokens.push(tokenId); } /** * @dev Private function to remove a token from this extension's ownership-tracking data structures. Note that * while the token is not assigned a new owner, the `_ownedTokensIndex` mapping is _not_ updated: this allows for * gas optimizations e.g. when performing a transfer operation (avoiding double writes). * This has O(1) time complexity, but alters the order of the _ownedTokens array. * @param from address representing the previous owner of the given token ID * @param tokenId uint256 ID of the token to be removed from the tokens list of the given address */ function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private { // To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = ERC721.balanceOf(from) - 1; uint256 tokenIndex = _ownedTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary if (tokenIndex != lastTokenIndex) { uint256 lastTokenId = _ownedTokens[from][lastTokenIndex]; _ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index } // This also deletes the contents at the last position of the array delete _ownedTokensIndex[tokenId]; delete _ownedTokens[from][lastTokenIndex]; } /** * @dev Private function to remove a token from this extension's token tracking data structures. * This has O(1) time complexity, but alters the order of the _allTokens array. * @param tokenId uint256 ID of the token to be removed from the tokens list */ function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private { // To prevent a gap in the tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = _allTokens.length - 1; uint256 tokenIndex = _allTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary. However, since this occurs so // rarely (when the last minted token is burnt) that we still do the swap here to avoid the gas cost of adding // an 'if' statement (like in _removeTokenFromOwnerEnumeration) uint256 lastTokenId = _allTokens[lastTokenIndex]; _allTokens[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _allTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index // This also deletes the contents at the last position of the array delete _allTokensIndex[tokenId]; _allTokens.pop(); } } pragma solidity ^0.8.0; //-------------------------Imports------------------------------------------------- //--------------------------------------------------------------------------------- //--------------------------------------------------------------------------------- //--------------------------End Imports-------------------------------------------- contract Beavers is ERC721Enumerable, Ownable, ReentrancyGuard { using Strings for uint256; using SafeMath for uint256; //-------------------------Structs------------------------------------------------- //--------------------------------------------------------------------------------- struct NFT { uint256 iD; string URI; address ownerOf; uint256 totalClaimed; uint256 lifetimeClaimed; uint256 timeLastClaimed; } struct DepositEntry { uint256 value1; uint256 value2; uint256 value3; } //--------------------------------------------------------------------------------- //--------------------------------END STRUCTS-------------------------------------- //----------------------------MAPPING & VARS--------------------------------------- //--------------------------------------------------------------------------------- address public receiverOfFunds; bool public inAirdropMode = true; uint256 public currentDepositNumber = 1; string public baseExtension = ".png"; uint256 public maxSupply = 50; bool public mintEnded = false; bool public activeClaim = false; uint256 public totalNftSupply; uint256 public lastDeposit; uint256 public unclaimedAmt; mapping(uint256 => NFT) public nft; mapping(uint256 => DepositEntry) public depositLog; mapping(uint256 => address) public nftOwners; //--------------------------------------------------------------------------------- //-----------------------------END OF MAPPING & VARS------------------------------- //--------------------------------CONSTRUCTOR-------------------------------------- //--------------------------------------------------------------------------------- constructor( address _recieverOfFunds) ERC721("Geeks Beavers", "Geeks Beaver"){ receiverOfFunds = _recieverOfFunds; } function setFundsWallet(address _newAddress) public onlyOwner { receiverOfFunds = _newAddress; } function setActiveClaim(bool _state) public onlyOwner { activeClaim = _state; } //--------------------------------------------------------------------------------- //--------------------------------END OF COnstuctor-------------------------------- //--------------------------------------------------------------------------------- //--------------------------------StartOfUri-------------------------------- function setURI(string memory _newURI, uint256 ID) external { require(nft[ID].ownerOf == msg.sender,"not owner of token"); nft[ID].URI = _newURI; } function setBaseExtension(string memory _newBaseExtension) public onlyOwner { baseExtension = _newBaseExtension; } function tokenURI(uint256 _tokenId) public view virtual override returns (string memory){//DO NOT TRY TO FIX THIS ERROR/WARNING ΩΩΩΩΩΩ≈≈≈≈çççççççç√√√√√√√√√√√√√√√√√√ require(_exists(_tokenId), "NFT_DOES_NOT_EXIST"); string memory currentBaseURI = nft[_tokenId].URI; return bytes(currentBaseURI).length > 0 ? string(abi.encodePacked(currentBaseURI,baseExtension)): ""; } //--------------------------------------------------------------------------------- //--------------------------------END OF URI-------------------------------- //---------------------------------------MINT-------------------------------------- //--------------------------------------------------------------------------------- function mint(uint256 amount) external payable onlyOwner{ uint256 supply = totalSupply(); require((totalNftSupply + amount) <= maxSupply ,"Max Mint"); if(msg.sender == owner()){ for (uint256 i = 1; i <= amount; i++) { uint256 ID = supply + i; _safeMint(msg.sender, supply + i); nft[ID].iD = ID; nft[ID].ownerOf = msg.sender; nft[ID].URI = ""; nft[ID].totalClaimed = 0; nft[ID].lifetimeClaimed = 0; nft[ID].timeLastClaimed = currentDepositNumber - 1; totalNftSupply++; } } if(msg.sender != owner()){ require(!inAirdropMode, "in Airdrop Mode"); for (uint256 i = 1; i <= amount; i++) { uint256 ID = supply + i; _safeMint(msg.sender, supply + i); nft[ID].iD = ID; nft[ID].ownerOf = msg.sender; nft[ID].URI = ""; nft[ID].totalClaimed = 0; nft[ID].lifetimeClaimed = 0; nft[ID].timeLastClaimed = currentDepositNumber - 1; totalNftSupply++; } } } //--------------------------------------------------------------------------------- //----------------------------=---------END OF MINT-------------------------------- //--------------------------------PAYOUT FUNCTION---------------------------------- //--------------------------------------------------------------------------------- function depositRewards(uint256 rewardAmount) external payable onlyOwner { require(rewardAmount > 10000000, "Reward in WEI"); payable(address(this)).transfer(rewardAmount); uint256 perNom = (rewardAmount) / totalSupply(); uint256 time = block.timestamp; depositLog[currentDepositNumber] = DepositEntry(rewardAmount, perNom, time); currentDepositNumber++; } function viewDepositEntry(uint256 position) external view returns (uint256, uint256, uint256){ DepositEntry memory depositEntry = depositLog[position]; return (depositEntry.value1, depositEntry.value2, depositEntry.value3); } //--------------------------------------------------------------------------------- //---------------------------END OF PAYOUT FUNCTION-------------------------------- //------------------------------------------CLAIM---------------------------------- //--------------------------------------------------------------------------------- receive() external payable {} function walletOfOwner(address _owner) public view returns (uint256[] memory) { uint256 ownerTokenCount = balanceOf(_owner); uint256[] memory tokenIds = new uint256[](ownerTokenCount); for (uint256 i; i < ownerTokenCount; i++) { tokenIds[i] = tokenOfOwnerByIndex(_owner, i); } return tokenIds; } function claimRewards() external { require(activeClaim == true, "No Tokens Deposited By Team Yet"); uint256 ownerAmtToClaim = 0; uint256[] memory ownedNfts = walletOfOwner(msg.sender); for (uint256 i = 0; i < ownedNfts.length; i++) { uint256 tokenId = ownedNfts[i]; NFT storage nftItem = nft[tokenId]; for (uint256 j = nftItem.timeLastClaimed + 1; j < currentDepositNumber; j++) { DepositEntry storage deposit = depositLog[j]; uint256 perNft = deposit.value2; if (j < currentDepositNumber){ uint256 beforeClaim = perNft; ownerAmtToClaim += beforeClaim; nftItem.totalClaimed += beforeClaim; nftItem.lifetimeClaimed += beforeClaim; nftItem.timeLastClaimed++; } else { break; } } } require(ownerAmtToClaim > 0, "No rewards to claim"); payable(msg.sender).transfer(ownerAmtToClaim); } function viewPendingRewards(address _user) public view returns (uint256) { uint256 pendingRewards = 0; uint256[] memory ownedNfts = walletOfOwner(_user); for (uint256 i = 0; i < ownedNfts.length; i++) { uint256 tokenId = ownedNfts[i]; NFT storage nftItem = nft[tokenId]; for (uint256 j = nftItem.timeLastClaimed + 1; j < currentDepositNumber; j++) { DepositEntry storage deposit = depositLog[j]; uint256 perNft = deposit.value2; if (j < currentDepositNumber){ uint256 rewardForThisDeposit = perNft; pendingRewards += rewardForThisDeposit; } else { break; } } } return pendingRewards; } function totalEarned(address owner) public view returns (uint256){ uint256 ownerAmtEarned = 0; uint256[] memory ownedNFTs = walletOfOwner(owner); for (uint256 i = 0; i < ownedNFTs.length; i++) { uint256 iD = ownedNFTs[i]; uint256 beforeClaim = nft[iD].totalClaimed; ownerAmtEarned += beforeClaim; } return ownerAmtEarned; } //--------------------------------------------------------------------------------- //-------------------------------------END OF CLAIM-------------------------------- function _beforeTokenTransfer( address _from, address _to, uint256 _tokenId, uint256 _batchsize ) internal override(ERC721Enumerable) { if(inAirdropMode == true){ nft[_tokenId].ownerOf = _to; super._beforeTokenTransfer(_from, _to, _tokenId, _batchsize); } else{ nft[_tokenId].ownerOf = _to; nft[_tokenId].totalClaimed = 0; super._beforeTokenTransfer(_from, _to, _tokenId, _batchsize); }} function toggleAirdropMode(bool trueFalse) external onlyOwner { inAirdropMode = trueFalse; } function withdrawETH(uint256 _amount) public onlyOwner { payable(owner()).transfer(_amount); } function withdrawERC20(address _tokenAddress, uint256 _tokenAmount) public virtual onlyOwner { IERC20(_tokenAddress).transfer(msg.sender, _tokenAmount); } function ownerMultiNftAirdrop(uint256[] calldata tokenAmounts, address[] calldata recipients) external onlyOwner { require(inAirdropMode, "Not in Airdrop Mode"); uint256 supply = totalSupply(); uint256 uniqueIdCounter = supply + 1; for (uint256 i = 0; i < recipients.length; i++) { address recipient = recipients[i]; uint256 tokenAmount = tokenAmounts[i]; for (uint256 j = 0; j < tokenAmount; j++) { uint256 ID = uniqueIdCounter; _safeMint(recipient, ID); nft[ID].iD = ID; nft[ID].ownerOf = recipient; nft[ID].URI = ""; nft[ID].totalClaimed = 0; nft[ID].lifetimeClaimed = 0; nft[ID].timeLastClaimed = currentDepositNumber - 1; uniqueIdCounter++; } } } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"_recieverOfFunds","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","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":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"activeClaim","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseExtension","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"claimRewards","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"currentDepositNumber","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"depositLog","outputs":[{"internalType":"uint256","name":"value1","type":"uint256"},{"internalType":"uint256","name":"value2","type":"uint256"},{"internalType":"uint256","name":"value3","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"rewardAmount","type":"uint256"}],"name":"depositRewards","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"inAirdropMode","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastDeposit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"mintEnded","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"nft","outputs":[{"internalType":"uint256","name":"iD","type":"uint256"},{"internalType":"string","name":"URI","type":"string"},{"internalType":"address","name":"ownerOf","type":"address"},{"internalType":"uint256","name":"totalClaimed","type":"uint256"},{"internalType":"uint256","name":"lifetimeClaimed","type":"uint256"},{"internalType":"uint256","name":"timeLastClaimed","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"nftOwners","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenAmounts","type":"uint256[]"},{"internalType":"address[]","name":"recipients","type":"address[]"}],"name":"ownerMultiNftAirdrop","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"receiverOfFunds","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"setActiveClaim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newBaseExtension","type":"string"}],"name":"setBaseExtension","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newAddress","type":"address"}],"name":"setFundsWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newURI","type":"string"},{"internalType":"uint256","name":"ID","type":"uint256"}],"name":"setURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"trueFalse","type":"bool"}],"name":"toggleAirdropMode","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"totalEarned","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalNftSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unclaimedAmt","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"position","type":"uint256"}],"name":"viewDepositEntry","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"}],"name":"viewPendingRewards","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"walletOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_tokenAddress","type":"address"},{"internalType":"uint256","name":"_tokenAmount","type":"uint256"}],"name":"withdrawERC20","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"withdrawETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
600c805460ff60a01b1916600160a01b1790556001600d5560c060405260046080908152632e706e6760e01b60a052600e906200003d908262000222565b506032600f556010805461ffff191690553480156200005a575f80fd5b50604051620030fb380380620030fb8339810160408190526200007d91620002ee565b6040518060400160405280600d81526020016c4765656b73204265617665727360981b8152506040518060400160405280600c81526020016b23b2b2b5b9902132b0bb32b960a11b815250815f9081620000d8919062000222565b506001620000e7828262000222565b50505062000104620000fe6200012f60201b60201c565b62000133565b6001600b55600c80546001600160a01b0319166001600160a01b03929092169190911790556200031d565b3390565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b634e487b7160e01b5f52604160045260245ffd5b600181811c90821680620001ad57607f821691505b602082108103620001cc57634e487b7160e01b5f52602260045260245ffd5b50919050565b601f8211156200021d57805f5260205f20601f840160051c81016020851015620001f95750805b601f840160051c820191505b818110156200021a575f815560010162000205565b50505b505050565b81516001600160401b038111156200023e576200023e62000184565b62000256816200024f845462000198565b84620001d2565b602080601f8311600181146200028c575f8415620002745750858301515b5f19600386901b1c1916600185901b178555620002e6565b5f85815260208120601f198616915b82811015620002bc578886015182559484019460019091019084016200029b565b5085821015620002da57878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f60208284031215620002ff575f80fd5b81516001600160a01b038116811462000316575f80fd5b9392505050565b612dd0806200032b5f395ff3fe608060405260043610610283575f3560e01c80636d7fd78011610155578063c411cd3f116100be578063da6d1be911610078578063da6d1be9146107eb578063e82d9d1e14610809578063e985e9c51461081e578063ef9e676214610865578063f14210a61461087a578063f2fde38b14610899575f80fd5b8063c411cd3f14610746578063c668286214610765578063c87b56dd14610779578063ca6b0cc514610798578063d5abeb01146107b7578063da3ef23f146107cc575f80fd5b80639d0214cb1161010f5780639d0214cb14610671578063a0712d68146106a2578063a1db9782146106b5578063a22cb465146106d4578063b88d4fde146106f3578063bbd94c2f14610712575f80fd5b80636d7fd780146105da57806370a08231146105fa578063715018a6146106195780638bdf67f21461062d5780638da5cb5b1461064057806395d89b411461065d575f80fd5b80633299fcc7116101f75780634f63d92e116101b15780634f63d92e1461052a5780634f6ccce71461053f5780636352211e1461055e578063649aca4a1461057d57806364e39b871461059c57806367db3b8f146105bb575f80fd5b80633299fcc71461045d57806336b771071461047c578063372500ab146104915780633f00cbde146104a557806342842e0e146104df578063438b6300146104fe575f80fd5b8063095ea7b311610248578063095ea7b3146103a257806318160ddd146103c35780631e516ea4146103e15780631f94e1371461040057806323b872dd1461041f5780632f745c591461043e575f80fd5b80630126b5201461028e57806301ffc9a714610302578063021313cf1461033157806306fdde031461034a578063081812fc1461036b575f80fd5b3661028a57005b5f80fd5b348015610299575f80fd5b506102e26102a8366004612554565b5f81815260156020908152604091829020825160608101845281548082526001830154938201849052600290920154930183905293909250565b604080519384526020840192909252908201526060015b60405180910390f35b34801561030d575f80fd5b5061032161031c366004612580565b6108b8565b60405190151581526020016102f9565b34801561033c575f80fd5b506010546103219060ff1681565b348015610355575f80fd5b5061035e6108e2565b6040516102f991906125e8565b348015610376575f80fd5b5061038a610385366004612554565b610971565b6040516001600160a01b0390911681526020016102f9565b3480156103ad575f80fd5b506103c16103bc366004612615565b610996565b005b3480156103ce575f80fd5b506008545b6040519081526020016102f9565b3480156103ec575f80fd5b506103c16103fb366004612685565b610aaf565b34801561040b575f80fd5b50600c5461038a906001600160a01b031681565b34801561042a575f80fd5b506103c16104393660046126ec565b610c3a565b348015610449575f80fd5b506103d3610458366004612615565b610c6b565b348015610468575f80fd5b506103d3610477366004612725565b610cff565b348015610487575f80fd5b506103d360125481565b34801561049c575f80fd5b506103c1610dbc565b3480156104b0575f80fd5b506102e26104bf366004612554565b60156020525f908152604090208054600182015460029092015490919083565b3480156104ea575f80fd5b506103c16104f93660046126ec565b610f84565b348015610509575f80fd5b5061051d610518366004612725565b610f9e565b6040516102f9919061273e565b348015610535575f80fd5b506103d360135481565b34801561054a575f80fd5b506103d3610559366004612554565b611033565b348015610569575f80fd5b5061038a610578366004612554565b6110c3565b348015610588575f80fd5b506103d3610597366004612725565b611122565b3480156105a7575f80fd5b506103c16105b6366004612725565b611185565b3480156105c6575f80fd5b506103c16105d5366004612826565b6111af565b3480156105e5575f80fd5b50600c5461032190600160a01b900460ff1681565b348015610605575f80fd5b506103d3610614366004612725565b611226565b348015610624575f80fd5b506103c16112aa565b6103c161063b366004612554565b6112bd565b34801561064b575f80fd5b50600a546001600160a01b031661038a565b348015610668575f80fd5b5061035e6113a4565b34801561067c575f80fd5b5061069061068b366004612554565b6113b3565b6040516102f996959493929190612868565b6103c16106b0366004612554565b611478565b3480156106c0575f80fd5b506103c16106cf366004612615565b6116f3565b3480156106df575f80fd5b506103c16106ee3660046128bb565b611769565b3480156106fe575f80fd5b506103c161070d3660046128f0565b611774565b34801561071d575f80fd5b5061038a61072c366004612554565b60166020525f90815260409020546001600160a01b031681565b348015610751575f80fd5b506103c1610760366004612967565b6117ac565b348015610770575f80fd5b5061035e6117ce565b348015610784575f80fd5b5061035e610793366004612554565b61185a565b3480156107a3575f80fd5b506103c16107b2366004612967565b611995565b3480156107c2575f80fd5b506103d3600f5481565b3480156107d7575f80fd5b506103c16107e6366004612982565b6119bb565b3480156107f6575f80fd5b5060105461032190610100900460ff1681565b348015610814575f80fd5b506103d3600d5481565b348015610829575f80fd5b506103216108383660046129b4565b6001600160a01b039182165f90815260056020908152604080832093909416825291909152205460ff1690565b348015610870575f80fd5b506103d360115481565b348015610885575f80fd5b506103c1610894366004612554565b6119cf565b3480156108a4575f80fd5b506103c16108b3366004612725565b611a0e565b5f6001600160e01b0319821663780e9d6360e01b14806108dc57506108dc82611a87565b92915050565b60605f80546108f0906129e5565b80601f016020809104026020016040519081016040528092919081815260200182805461091c906129e5565b80156109675780601f1061093e57610100808354040283529160200191610967565b820191905f5260205f20905b81548152906001019060200180831161094a57829003601f168201915b5050505050905090565b5f61097b82611ad6565b505f908152600460205260409020546001600160a01b031690565b5f6109a0826110c3565b9050806001600160a01b0316836001600160a01b031603610a125760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b60648201526084015b60405180910390fd5b336001600160a01b0382161480610a2e5750610a2e8133610838565b610aa05760405162461bcd60e51b815260206004820152603d60248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60448201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c0000006064820152608401610a09565b610aaa8383611b34565b505050565b610ab7611ba1565b600c54600160a01b900460ff16610b065760405162461bcd60e51b81526020600482015260136024820152724e6f7420696e2041697264726f70204d6f646560681b6044820152606401610a09565b5f610b1060085490565b90505f610b1e826001612a31565b90505f5b83811015610c31575f858583818110610b3d57610b3d612a44565b9050602002016020810190610b529190612725565b90505f888884818110610b6757610b67612a44565b9050602002013590505f5b81811015610c265784610b858482611bfb565b5f8181526014602081815260408084208581556002810180546001600160a01b0319166001600160a01b038b16179055815180840190925284825293859052919052600190910190610bd79082612a9c565b505f8181526014602052604081206003810182905560040155600d54610bff90600190612b5c565b5f8281526014602052604090206005015585610c1a81612b6f565b96505050600101610b72565b505050600101610b22565b50505050505050565b610c443382611c14565b610c605760405162461bcd60e51b8152600401610a0990612b87565b610aaa838383611c91565b5f610c7583611226565b8210610cd75760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b6064820152608401610a09565b506001600160a01b03919091165f908152600660209081526040808320938352929052205490565b5f8080610d0b84610f9e565b90505f5b8151811015610db3575f828281518110610d2b57610d2b612a44565b602002602001015190505f60145f8381526020019081526020015f2090505f81600501546001610d5b9190612a31565b90505b600d54811015610da8575f8181526015602052604090206001810154600d54831015610d975780610d8f818a612a31565b985050610d9e565b5050610da8565b5050600101610d5e565b505050600101610d0f565b50909392505050565b60105460ff610100909104161515600114610e195760405162461bcd60e51b815260206004820152601f60248201527f4e6f20546f6b656e73204465706f7369746564204279205465616d20596574006044820152606401610a09565b5f80610e2433610f9e565b90505f5b8151811015610f14575f828281518110610e4457610e44612a44565b602002602001015190505f60145f8381526020019081526020015f2090505f81600501546001610e749190612a31565b90505b600d54811015610f09575f8181526015602052604090206001810154600d54831015610ef85780610ea8818a612a31565b985080856003015f828254610ebd9190612a31565b9250508190555080856004015f828254610ed79190612a31565b9091555050600585018054905f610eed83612b6f565b919050555050610eff565b5050610f09565b5050600101610e77565b505050600101610e28565b505f8211610f5a5760405162461bcd60e51b81526020600482015260136024820152724e6f207265776172647320746f20636c61696d60681b6044820152606401610a09565b604051339083156108fc029084905f818181858888f19350505050158015610aaa573d5f803e3d5ffd5b610aaa83838360405180602001604052805f815250611774565b60605f610faa83611226565b90505f8167ffffffffffffffff811115610fc657610fc6612781565b604051908082528060200260200182016040528015610fef578160200160208202803683370190505b5090505f5b8281101561102b576110068582610c6b565b82828151811061101857611018612a44565b6020908102919091010152600101610ff4565b509392505050565b5f61103d60085490565b82106110a05760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b6064820152608401610a09565b600882815481106110b3576110b3612a44565b905f5260205f2001549050919050565b5f818152600260205260408120546001600160a01b0316806108dc5760405162461bcd60e51b8152602060048201526018602482015277115490cdcc8c4e881a5b9d985b1a59081d1bdad95b88125160421b6044820152606401610a09565b5f808061112e84610f9e565b90505f5b8151811015610db3575f82828151811061114e5761114e612a44565b6020908102919091018101515f81815260149092526040909120600301549091506111798186612a31565b94505050600101611132565b61118d611ba1565b600c80546001600160a01b0319166001600160a01b0392909216919091179055565b5f818152601460205260409020600201546001600160a01b0316331461120c5760405162461bcd60e51b81526020600482015260126024820152713737ba1037bbb732b91037b3103a37b5b2b760711b6044820152606401610a09565b5f818152601460205260409020600101610aaa8382612a9c565b5f6001600160a01b03821661128f5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a2061646472657373207a65726f206973206e6f7420612076616044820152683634b21037bbb732b960b91b6064820152608401610a09565b506001600160a01b03165f9081526003602052604090205490565b6112b2611ba1565b6112bb5f611e00565b565b6112c5611ba1565b6298968081116113075760405162461bcd60e51b815260206004820152600d60248201526c52657761726420696e2057454960981b6044820152606401610a09565b604051309082156108fc029083905f818181858888f19350505050158015611331573d5f803e3d5ffd5b505f61133c60085490565b6113469083612bd4565b60408051606081018252848152602080820184815242838501818152600d80545f90815260159095529584209451855591516001850155905160029093019290925582549394509092919061139a83612b6f565b9190505550505050565b6060600180546108f0906129e5565b60146020525f9081526040902080546001820180549192916113d4906129e5565b80601f0160208091040260200160405190810160405280929190818152602001828054611400906129e5565b801561144b5780601f106114225761010080835404028352916020019161144b565b820191905f5260205f20905b81548152906001019060200180831161142e57829003601f168201915b5050505060028301546003840154600485015460059095015493946001600160a01b039092169390925086565b611480611ba1565b5f61148a60085490565b9050600f548260115461149d9190612a31565b11156114d65760405162461bcd60e51b815260206004820152600860248201526713585e08135a5b9d60c21b6044820152606401610a09565b600a546001600160a01b031633036115c05760015b8281116115be575f6114fd8284612a31565b90506115123361150d8486612a31565b611bfb565b5f8181526014602081815260408084208581556002810180546001600160a01b0319163317905581518084019092528482529385905291905260019091019061155b9082612a9c565b505f8181526014602052604081206003810182905560040155600d5461158390600190612b5c565b5f8281526014602052604081206005019190915560118054916115a583612b6f565b91905055505080806115b690612b6f565b9150506114eb565b505b600a546001600160a01b031633146116ef57600c54600160a01b900460ff161561161e5760405162461bcd60e51b815260206004820152600f60248201526e696e2041697264726f70204d6f646560881b6044820152606401610a09565b60015b828111610aaa575f6116338284612a31565b90506116433361150d8486612a31565b5f8181526014602081815260408084208581556002810180546001600160a01b0319163317905581518084019092528482529385905291905260019091019061168c9082612a9c565b505f8181526014602052604081206003810182905560040155600d546116b490600190612b5c565b5f8281526014602052604081206005019190915560118054916116d683612b6f565b91905055505080806116e790612b6f565b915050611621565b5050565b6116fb611ba1565b60405163a9059cbb60e01b8152336004820152602481018290526001600160a01b0383169063a9059cbb906044016020604051808303815f875af1158015611745573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610aaa9190612bf3565b6116ef338383611e51565b61177e3383611c14565b61179a5760405162461bcd60e51b8152600401610a0990612b87565b6117a684848484611f1e565b50505050565b6117b4611ba1565b601080549115156101000261ff0019909216919091179055565b600e80546117db906129e5565b80601f0160208091040260200160405190810160405280929190818152602001828054611807906129e5565b80156118525780601f1061182957610100808354040283529160200191611852565b820191905f5260205f20905b81548152906001019060200180831161183557829003601f168201915b505050505081565b5f818152600260205260409020546060906001600160a01b03166118b55760405162461bcd60e51b815260206004820152601260248201527113919517d113d154d7d393d517d1561254d560721b6044820152606401610a09565b5f82815260146020526040812060010180546118d0906129e5565b80601f01602080910402602001604051908101604052809291908181526020018280546118fc906129e5565b80156119475780601f1061191e57610100808354040283529160200191611947565b820191905f5260205f20905b81548152906001019060200180831161192a57829003601f168201915b505050505090505f81511161196a5760405180602001604052805f81525061198e565b80600e60405160200161197e929190612c0e565b6040516020818303038152906040525b9392505050565b61199d611ba1565b600c8054911515600160a01b0260ff60a01b19909216919091179055565b6119c3611ba1565b600e6116ef8282612a9c565b6119d7611ba1565b600a546040516001600160a01b039091169082156108fc029083905f818181858888f193505050501580156116ef573d5f803e3d5ffd5b611a16611ba1565b6001600160a01b038116611a7b5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610a09565b611a8481611e00565b50565b5f6001600160e01b031982166380ac58cd60e01b1480611ab757506001600160e01b03198216635b5e139f60e01b145b806108dc57506301ffc9a760e01b6001600160e01b03198316146108dc565b5f818152600260205260409020546001600160a01b0316611a845760405162461bcd60e51b8152602060048201526018602482015277115490cdcc8c4e881a5b9d985b1a59081d1bdad95b88125160421b6044820152606401610a09565b5f81815260046020526040902080546001600160a01b0319166001600160a01b0384169081179091558190611b68826110c3565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600a546001600160a01b031633146112bb5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610a09565b6116ef828260405180602001604052805f815250611f51565b5f80611c1f836110c3565b9050806001600160a01b0316846001600160a01b03161480611c6557506001600160a01b038082165f9081526005602090815260408083209388168352929052205460ff165b80611c895750836001600160a01b0316611c7e84610971565b6001600160a01b0316145b949350505050565b826001600160a01b0316611ca4826110c3565b6001600160a01b031614611cca5760405162461bcd60e51b8152600401610a0990612c98565b6001600160a01b038216611d2c5760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610a09565b611d398383836001611f83565b826001600160a01b0316611d4c826110c3565b6001600160a01b031614611d725760405162461bcd60e51b8152600401610a0990612c98565b5f81815260046020908152604080832080546001600160a01b03199081169091556001600160a01b038781168086526003855283862080545f1901905590871680865283862080546001019055868652600290945282852080549092168417909155905184937fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b816001600160a01b0316836001600160a01b031603611eb25760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610a09565b6001600160a01b038381165f81815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b611f29848484611c91565b611f358484848461200d565b6117a65760405162461bcd60e51b8152600401610a0990612cdd565b611f5b838361210a565b611f675f84848461200d565b610aaa5760405162461bcd60e51b8152600401610a0990612cdd565b600c54600160a01b900460ff161515600103611fd3575f82815260146020526040902060020180546001600160a01b0319166001600160a01b038516179055611fce8484848461229f565b6117a6565b5f8281526014602052604081206002810180546001600160a01b0319166001600160a01b038716179055600301556117a68484848461229f565b5f6001600160a01b0384163b156120ff57604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290612050903390899088908890600401612d2f565b6020604051808303815f875af192505050801561208a575060408051601f3d908101601f1916820190925261208791810190612d6b565b60015b6120e5573d8080156120b7576040519150601f19603f3d011682016040523d82523d5f602084013e6120bc565b606091505b5080515f036120dd5760405162461bcd60e51b8152600401610a0990612cdd565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611c89565b506001949350505050565b6001600160a01b0382166121605760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610a09565b5f818152600260205260409020546001600160a01b0316156121c45760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610a09565b6121d15f83836001611f83565b5f818152600260205260409020546001600160a01b0316156122355760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610a09565b6001600160a01b0382165f81815260036020908152604080832080546001019055848352600290915280822080546001600160a01b0319168417905551839291907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b600181111561230e5760405162461bcd60e51b815260206004820152603560248201527f455243373231456e756d657261626c653a20636f6e7365637574697665207472604482015274185b9cd9995c9cc81b9bdd081cdd5c1c1bdc9d1959605a1b6064820152608401610a09565b816001600160a01b0385166123695761236481600880545f838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b61238c565b836001600160a01b0316856001600160a01b03161461238c5761238c85826123d2565b6001600160a01b0384166123a8576123a38161246b565b6123cb565b846001600160a01b0316846001600160a01b0316146123cb576123cb8482612512565b5050505050565b5f60016123de84611226565b6123e89190612b5c565b5f83815260076020526040902054909150808214612439576001600160a01b0384165f9081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b505f9182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b6008545f9061247c90600190612b5c565b5f83815260096020526040812054600880549394509092849081106124a3576124a3612a44565b905f5260205f200154905080600883815481106124c2576124c2612a44565b5f9182526020808320909101929092558281526009909152604080822084905585825281205560088054806124f9576124f9612d86565b600190038181905f5260205f20015f9055905550505050565b5f61251c83611226565b6001600160a01b039093165f908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b5f60208284031215612564575f80fd5b5035919050565b6001600160e01b031981168114611a84575f80fd5b5f60208284031215612590575f80fd5b813561198e8161256b565b5f5b838110156125b557818101518382015260200161259d565b50505f910152565b5f81518084526125d481602086016020860161259b565b601f01601f19169290920160200192915050565b602081525f61198e60208301846125bd565b80356001600160a01b0381168114612610575f80fd5b919050565b5f8060408385031215612626575f80fd5b61262f836125fa565b946020939093013593505050565b5f8083601f84011261264d575f80fd5b50813567ffffffffffffffff811115612664575f80fd5b6020830191508360208260051b850101111561267e575f80fd5b9250929050565b5f805f8060408587031215612698575f80fd5b843567ffffffffffffffff808211156126af575f80fd5b6126bb8883890161263d565b909650945060208701359150808211156126d3575f80fd5b506126e08782880161263d565b95989497509550505050565b5f805f606084860312156126fe575f80fd5b612707846125fa565b9250612715602085016125fa565b9150604084013590509250925092565b5f60208284031215612735575f80fd5b61198e826125fa565b602080825282518282018190525f9190848201906040850190845b8181101561277557835183529284019291840191600101612759565b50909695505050505050565b634e487b7160e01b5f52604160045260245ffd5b5f67ffffffffffffffff808411156127af576127af612781565b604051601f8501601f19908116603f011681019082821181831017156127d7576127d7612781565b816040528093508581528686860111156127ef575f80fd5b858560208301375f602087830101525050509392505050565b5f82601f830112612817575f80fd5b61198e83833560208501612795565b5f8060408385031215612837575f80fd5b823567ffffffffffffffff81111561284d575f80fd5b61285985828601612808565b95602094909401359450505050565b86815260c060208201525f61288060c08301886125bd565b6001600160a01b03969096166040830152506060810193909352608083019190915260a09091015292915050565b8015158114611a84575f80fd5b5f80604083850312156128cc575f80fd5b6128d5836125fa565b915060208301356128e5816128ae565b809150509250929050565b5f805f8060808587031215612903575f80fd5b61290c856125fa565b935061291a602086016125fa565b925060408501359150606085013567ffffffffffffffff81111561293c575f80fd5b8501601f8101871361294c575f80fd5b61295b87823560208401612795565b91505092959194509250565b5f60208284031215612977575f80fd5b813561198e816128ae565b5f60208284031215612992575f80fd5b813567ffffffffffffffff8111156129a8575f80fd5b611c8984828501612808565b5f80604083850312156129c5575f80fd5b6129ce836125fa565b91506129dc602084016125fa565b90509250929050565b600181811c908216806129f957607f821691505b602082108103612a1757634e487b7160e01b5f52602260045260245ffd5b50919050565b634e487b7160e01b5f52601160045260245ffd5b808201808211156108dc576108dc612a1d565b634e487b7160e01b5f52603260045260245ffd5b601f821115610aaa57805f5260205f20601f840160051c81016020851015612a7d5750805b601f840160051c820191505b818110156123cb575f8155600101612a89565b815167ffffffffffffffff811115612ab657612ab6612781565b612aca81612ac484546129e5565b84612a58565b602080601f831160018114612afd575f8415612ae65750858301515b5f19600386901b1c1916600185901b178555612b54565b5f85815260208120601f198616915b82811015612b2b57888601518255948401946001909101908401612b0c565b5085821015612b4857878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b818103818111156108dc576108dc612a1d565b5f60018201612b8057612b80612a1d565b5060010190565b6020808252602d908201527f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560408201526c1c881bdc88185c1c1c9bdd9959609a1b606082015260800190565b5f82612bee57634e487b7160e01b5f52601260045260245ffd5b500490565b5f60208284031215612c03575f80fd5b815161198e816128ae565b5f83516020612c2182856020890161259b565b81840191505f8554612c32816129e5565b60018281168015612c4a5760018114612c5f57612c89565b60ff1984168752821515830287019450612c89565b895f5260205f205f5b84811015612c8157815489820152908301908701612c68565b505082870194505b50929998505050505050505050565b60208082526025908201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060408201526437bbb732b960d91b606082015260800190565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6001600160a01b03858116825284166020820152604081018390526080606082018190525f90612d61908301846125bd565b9695505050505050565b5f60208284031215612d7b575f80fd5b815161198e8161256b565b634e487b7160e01b5f52603160045260245ffdfea264697066735822122034e5549710235c70f50e89085f932669087f755050031421806fd3e6224abbd564736f6c634300081700330000000000000000000000005c35e73a435359277ebdc97209f2bfe89852b13e
Deployed Bytecode
0x608060405260043610610283575f3560e01c80636d7fd78011610155578063c411cd3f116100be578063da6d1be911610078578063da6d1be9146107eb578063e82d9d1e14610809578063e985e9c51461081e578063ef9e676214610865578063f14210a61461087a578063f2fde38b14610899575f80fd5b8063c411cd3f14610746578063c668286214610765578063c87b56dd14610779578063ca6b0cc514610798578063d5abeb01146107b7578063da3ef23f146107cc575f80fd5b80639d0214cb1161010f5780639d0214cb14610671578063a0712d68146106a2578063a1db9782146106b5578063a22cb465146106d4578063b88d4fde146106f3578063bbd94c2f14610712575f80fd5b80636d7fd780146105da57806370a08231146105fa578063715018a6146106195780638bdf67f21461062d5780638da5cb5b1461064057806395d89b411461065d575f80fd5b80633299fcc7116101f75780634f63d92e116101b15780634f63d92e1461052a5780634f6ccce71461053f5780636352211e1461055e578063649aca4a1461057d57806364e39b871461059c57806367db3b8f146105bb575f80fd5b80633299fcc71461045d57806336b771071461047c578063372500ab146104915780633f00cbde146104a557806342842e0e146104df578063438b6300146104fe575f80fd5b8063095ea7b311610248578063095ea7b3146103a257806318160ddd146103c35780631e516ea4146103e15780631f94e1371461040057806323b872dd1461041f5780632f745c591461043e575f80fd5b80630126b5201461028e57806301ffc9a714610302578063021313cf1461033157806306fdde031461034a578063081812fc1461036b575f80fd5b3661028a57005b5f80fd5b348015610299575f80fd5b506102e26102a8366004612554565b5f81815260156020908152604091829020825160608101845281548082526001830154938201849052600290920154930183905293909250565b604080519384526020840192909252908201526060015b60405180910390f35b34801561030d575f80fd5b5061032161031c366004612580565b6108b8565b60405190151581526020016102f9565b34801561033c575f80fd5b506010546103219060ff1681565b348015610355575f80fd5b5061035e6108e2565b6040516102f991906125e8565b348015610376575f80fd5b5061038a610385366004612554565b610971565b6040516001600160a01b0390911681526020016102f9565b3480156103ad575f80fd5b506103c16103bc366004612615565b610996565b005b3480156103ce575f80fd5b506008545b6040519081526020016102f9565b3480156103ec575f80fd5b506103c16103fb366004612685565b610aaf565b34801561040b575f80fd5b50600c5461038a906001600160a01b031681565b34801561042a575f80fd5b506103c16104393660046126ec565b610c3a565b348015610449575f80fd5b506103d3610458366004612615565b610c6b565b348015610468575f80fd5b506103d3610477366004612725565b610cff565b348015610487575f80fd5b506103d360125481565b34801561049c575f80fd5b506103c1610dbc565b3480156104b0575f80fd5b506102e26104bf366004612554565b60156020525f908152604090208054600182015460029092015490919083565b3480156104ea575f80fd5b506103c16104f93660046126ec565b610f84565b348015610509575f80fd5b5061051d610518366004612725565b610f9e565b6040516102f9919061273e565b348015610535575f80fd5b506103d360135481565b34801561054a575f80fd5b506103d3610559366004612554565b611033565b348015610569575f80fd5b5061038a610578366004612554565b6110c3565b348015610588575f80fd5b506103d3610597366004612725565b611122565b3480156105a7575f80fd5b506103c16105b6366004612725565b611185565b3480156105c6575f80fd5b506103c16105d5366004612826565b6111af565b3480156105e5575f80fd5b50600c5461032190600160a01b900460ff1681565b348015610605575f80fd5b506103d3610614366004612725565b611226565b348015610624575f80fd5b506103c16112aa565b6103c161063b366004612554565b6112bd565b34801561064b575f80fd5b50600a546001600160a01b031661038a565b348015610668575f80fd5b5061035e6113a4565b34801561067c575f80fd5b5061069061068b366004612554565b6113b3565b6040516102f996959493929190612868565b6103c16106b0366004612554565b611478565b3480156106c0575f80fd5b506103c16106cf366004612615565b6116f3565b3480156106df575f80fd5b506103c16106ee3660046128bb565b611769565b3480156106fe575f80fd5b506103c161070d3660046128f0565b611774565b34801561071d575f80fd5b5061038a61072c366004612554565b60166020525f90815260409020546001600160a01b031681565b348015610751575f80fd5b506103c1610760366004612967565b6117ac565b348015610770575f80fd5b5061035e6117ce565b348015610784575f80fd5b5061035e610793366004612554565b61185a565b3480156107a3575f80fd5b506103c16107b2366004612967565b611995565b3480156107c2575f80fd5b506103d3600f5481565b3480156107d7575f80fd5b506103c16107e6366004612982565b6119bb565b3480156107f6575f80fd5b5060105461032190610100900460ff1681565b348015610814575f80fd5b506103d3600d5481565b348015610829575f80fd5b506103216108383660046129b4565b6001600160a01b039182165f90815260056020908152604080832093909416825291909152205460ff1690565b348015610870575f80fd5b506103d360115481565b348015610885575f80fd5b506103c1610894366004612554565b6119cf565b3480156108a4575f80fd5b506103c16108b3366004612725565b611a0e565b5f6001600160e01b0319821663780e9d6360e01b14806108dc57506108dc82611a87565b92915050565b60605f80546108f0906129e5565b80601f016020809104026020016040519081016040528092919081815260200182805461091c906129e5565b80156109675780601f1061093e57610100808354040283529160200191610967565b820191905f5260205f20905b81548152906001019060200180831161094a57829003601f168201915b5050505050905090565b5f61097b82611ad6565b505f908152600460205260409020546001600160a01b031690565b5f6109a0826110c3565b9050806001600160a01b0316836001600160a01b031603610a125760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b60648201526084015b60405180910390fd5b336001600160a01b0382161480610a2e5750610a2e8133610838565b610aa05760405162461bcd60e51b815260206004820152603d60248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60448201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c0000006064820152608401610a09565b610aaa8383611b34565b505050565b610ab7611ba1565b600c54600160a01b900460ff16610b065760405162461bcd60e51b81526020600482015260136024820152724e6f7420696e2041697264726f70204d6f646560681b6044820152606401610a09565b5f610b1060085490565b90505f610b1e826001612a31565b90505f5b83811015610c31575f858583818110610b3d57610b3d612a44565b9050602002016020810190610b529190612725565b90505f888884818110610b6757610b67612a44565b9050602002013590505f5b81811015610c265784610b858482611bfb565b5f8181526014602081815260408084208581556002810180546001600160a01b0319166001600160a01b038b16179055815180840190925284825293859052919052600190910190610bd79082612a9c565b505f8181526014602052604081206003810182905560040155600d54610bff90600190612b5c565b5f8281526014602052604090206005015585610c1a81612b6f565b96505050600101610b72565b505050600101610b22565b50505050505050565b610c443382611c14565b610c605760405162461bcd60e51b8152600401610a0990612b87565b610aaa838383611c91565b5f610c7583611226565b8210610cd75760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b6064820152608401610a09565b506001600160a01b03919091165f908152600660209081526040808320938352929052205490565b5f8080610d0b84610f9e565b90505f5b8151811015610db3575f828281518110610d2b57610d2b612a44565b602002602001015190505f60145f8381526020019081526020015f2090505f81600501546001610d5b9190612a31565b90505b600d54811015610da8575f8181526015602052604090206001810154600d54831015610d975780610d8f818a612a31565b985050610d9e565b5050610da8565b5050600101610d5e565b505050600101610d0f565b50909392505050565b60105460ff610100909104161515600114610e195760405162461bcd60e51b815260206004820152601f60248201527f4e6f20546f6b656e73204465706f7369746564204279205465616d20596574006044820152606401610a09565b5f80610e2433610f9e565b90505f5b8151811015610f14575f828281518110610e4457610e44612a44565b602002602001015190505f60145f8381526020019081526020015f2090505f81600501546001610e749190612a31565b90505b600d54811015610f09575f8181526015602052604090206001810154600d54831015610ef85780610ea8818a612a31565b985080856003015f828254610ebd9190612a31565b9250508190555080856004015f828254610ed79190612a31565b9091555050600585018054905f610eed83612b6f565b919050555050610eff565b5050610f09565b5050600101610e77565b505050600101610e28565b505f8211610f5a5760405162461bcd60e51b81526020600482015260136024820152724e6f207265776172647320746f20636c61696d60681b6044820152606401610a09565b604051339083156108fc029084905f818181858888f19350505050158015610aaa573d5f803e3d5ffd5b610aaa83838360405180602001604052805f815250611774565b60605f610faa83611226565b90505f8167ffffffffffffffff811115610fc657610fc6612781565b604051908082528060200260200182016040528015610fef578160200160208202803683370190505b5090505f5b8281101561102b576110068582610c6b565b82828151811061101857611018612a44565b6020908102919091010152600101610ff4565b509392505050565b5f61103d60085490565b82106110a05760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b6064820152608401610a09565b600882815481106110b3576110b3612a44565b905f5260205f2001549050919050565b5f818152600260205260408120546001600160a01b0316806108dc5760405162461bcd60e51b8152602060048201526018602482015277115490cdcc8c4e881a5b9d985b1a59081d1bdad95b88125160421b6044820152606401610a09565b5f808061112e84610f9e565b90505f5b8151811015610db3575f82828151811061114e5761114e612a44565b6020908102919091018101515f81815260149092526040909120600301549091506111798186612a31565b94505050600101611132565b61118d611ba1565b600c80546001600160a01b0319166001600160a01b0392909216919091179055565b5f818152601460205260409020600201546001600160a01b0316331461120c5760405162461bcd60e51b81526020600482015260126024820152713737ba1037bbb732b91037b3103a37b5b2b760711b6044820152606401610a09565b5f818152601460205260409020600101610aaa8382612a9c565b5f6001600160a01b03821661128f5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a2061646472657373207a65726f206973206e6f7420612076616044820152683634b21037bbb732b960b91b6064820152608401610a09565b506001600160a01b03165f9081526003602052604090205490565b6112b2611ba1565b6112bb5f611e00565b565b6112c5611ba1565b6298968081116113075760405162461bcd60e51b815260206004820152600d60248201526c52657761726420696e2057454960981b6044820152606401610a09565b604051309082156108fc029083905f818181858888f19350505050158015611331573d5f803e3d5ffd5b505f61133c60085490565b6113469083612bd4565b60408051606081018252848152602080820184815242838501818152600d80545f90815260159095529584209451855591516001850155905160029093019290925582549394509092919061139a83612b6f565b9190505550505050565b6060600180546108f0906129e5565b60146020525f9081526040902080546001820180549192916113d4906129e5565b80601f0160208091040260200160405190810160405280929190818152602001828054611400906129e5565b801561144b5780601f106114225761010080835404028352916020019161144b565b820191905f5260205f20905b81548152906001019060200180831161142e57829003601f168201915b5050505060028301546003840154600485015460059095015493946001600160a01b039092169390925086565b611480611ba1565b5f61148a60085490565b9050600f548260115461149d9190612a31565b11156114d65760405162461bcd60e51b815260206004820152600860248201526713585e08135a5b9d60c21b6044820152606401610a09565b600a546001600160a01b031633036115c05760015b8281116115be575f6114fd8284612a31565b90506115123361150d8486612a31565b611bfb565b5f8181526014602081815260408084208581556002810180546001600160a01b0319163317905581518084019092528482529385905291905260019091019061155b9082612a9c565b505f8181526014602052604081206003810182905560040155600d5461158390600190612b5c565b5f8281526014602052604081206005019190915560118054916115a583612b6f565b91905055505080806115b690612b6f565b9150506114eb565b505b600a546001600160a01b031633146116ef57600c54600160a01b900460ff161561161e5760405162461bcd60e51b815260206004820152600f60248201526e696e2041697264726f70204d6f646560881b6044820152606401610a09565b60015b828111610aaa575f6116338284612a31565b90506116433361150d8486612a31565b5f8181526014602081815260408084208581556002810180546001600160a01b0319163317905581518084019092528482529385905291905260019091019061168c9082612a9c565b505f8181526014602052604081206003810182905560040155600d546116b490600190612b5c565b5f8281526014602052604081206005019190915560118054916116d683612b6f565b91905055505080806116e790612b6f565b915050611621565b5050565b6116fb611ba1565b60405163a9059cbb60e01b8152336004820152602481018290526001600160a01b0383169063a9059cbb906044016020604051808303815f875af1158015611745573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610aaa9190612bf3565b6116ef338383611e51565b61177e3383611c14565b61179a5760405162461bcd60e51b8152600401610a0990612b87565b6117a684848484611f1e565b50505050565b6117b4611ba1565b601080549115156101000261ff0019909216919091179055565b600e80546117db906129e5565b80601f0160208091040260200160405190810160405280929190818152602001828054611807906129e5565b80156118525780601f1061182957610100808354040283529160200191611852565b820191905f5260205f20905b81548152906001019060200180831161183557829003601f168201915b505050505081565b5f818152600260205260409020546060906001600160a01b03166118b55760405162461bcd60e51b815260206004820152601260248201527113919517d113d154d7d393d517d1561254d560721b6044820152606401610a09565b5f82815260146020526040812060010180546118d0906129e5565b80601f01602080910402602001604051908101604052809291908181526020018280546118fc906129e5565b80156119475780601f1061191e57610100808354040283529160200191611947565b820191905f5260205f20905b81548152906001019060200180831161192a57829003601f168201915b505050505090505f81511161196a5760405180602001604052805f81525061198e565b80600e60405160200161197e929190612c0e565b6040516020818303038152906040525b9392505050565b61199d611ba1565b600c8054911515600160a01b0260ff60a01b19909216919091179055565b6119c3611ba1565b600e6116ef8282612a9c565b6119d7611ba1565b600a546040516001600160a01b039091169082156108fc029083905f818181858888f193505050501580156116ef573d5f803e3d5ffd5b611a16611ba1565b6001600160a01b038116611a7b5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610a09565b611a8481611e00565b50565b5f6001600160e01b031982166380ac58cd60e01b1480611ab757506001600160e01b03198216635b5e139f60e01b145b806108dc57506301ffc9a760e01b6001600160e01b03198316146108dc565b5f818152600260205260409020546001600160a01b0316611a845760405162461bcd60e51b8152602060048201526018602482015277115490cdcc8c4e881a5b9d985b1a59081d1bdad95b88125160421b6044820152606401610a09565b5f81815260046020526040902080546001600160a01b0319166001600160a01b0384169081179091558190611b68826110c3565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600a546001600160a01b031633146112bb5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610a09565b6116ef828260405180602001604052805f815250611f51565b5f80611c1f836110c3565b9050806001600160a01b0316846001600160a01b03161480611c6557506001600160a01b038082165f9081526005602090815260408083209388168352929052205460ff165b80611c895750836001600160a01b0316611c7e84610971565b6001600160a01b0316145b949350505050565b826001600160a01b0316611ca4826110c3565b6001600160a01b031614611cca5760405162461bcd60e51b8152600401610a0990612c98565b6001600160a01b038216611d2c5760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610a09565b611d398383836001611f83565b826001600160a01b0316611d4c826110c3565b6001600160a01b031614611d725760405162461bcd60e51b8152600401610a0990612c98565b5f81815260046020908152604080832080546001600160a01b03199081169091556001600160a01b038781168086526003855283862080545f1901905590871680865283862080546001019055868652600290945282852080549092168417909155905184937fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b816001600160a01b0316836001600160a01b031603611eb25760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610a09565b6001600160a01b038381165f81815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b611f29848484611c91565b611f358484848461200d565b6117a65760405162461bcd60e51b8152600401610a0990612cdd565b611f5b838361210a565b611f675f84848461200d565b610aaa5760405162461bcd60e51b8152600401610a0990612cdd565b600c54600160a01b900460ff161515600103611fd3575f82815260146020526040902060020180546001600160a01b0319166001600160a01b038516179055611fce8484848461229f565b6117a6565b5f8281526014602052604081206002810180546001600160a01b0319166001600160a01b038716179055600301556117a68484848461229f565b5f6001600160a01b0384163b156120ff57604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290612050903390899088908890600401612d2f565b6020604051808303815f875af192505050801561208a575060408051601f3d908101601f1916820190925261208791810190612d6b565b60015b6120e5573d8080156120b7576040519150601f19603f3d011682016040523d82523d5f602084013e6120bc565b606091505b5080515f036120dd5760405162461bcd60e51b8152600401610a0990612cdd565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611c89565b506001949350505050565b6001600160a01b0382166121605760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610a09565b5f818152600260205260409020546001600160a01b0316156121c45760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610a09565b6121d15f83836001611f83565b5f818152600260205260409020546001600160a01b0316156122355760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610a09565b6001600160a01b0382165f81815260036020908152604080832080546001019055848352600290915280822080546001600160a01b0319168417905551839291907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b600181111561230e5760405162461bcd60e51b815260206004820152603560248201527f455243373231456e756d657261626c653a20636f6e7365637574697665207472604482015274185b9cd9995c9cc81b9bdd081cdd5c1c1bdc9d1959605a1b6064820152608401610a09565b816001600160a01b0385166123695761236481600880545f838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b61238c565b836001600160a01b0316856001600160a01b03161461238c5761238c85826123d2565b6001600160a01b0384166123a8576123a38161246b565b6123cb565b846001600160a01b0316846001600160a01b0316146123cb576123cb8482612512565b5050505050565b5f60016123de84611226565b6123e89190612b5c565b5f83815260076020526040902054909150808214612439576001600160a01b0384165f9081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b505f9182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b6008545f9061247c90600190612b5c565b5f83815260096020526040812054600880549394509092849081106124a3576124a3612a44565b905f5260205f200154905080600883815481106124c2576124c2612a44565b5f9182526020808320909101929092558281526009909152604080822084905585825281205560088054806124f9576124f9612d86565b600190038181905f5260205f20015f9055905550505050565b5f61251c83611226565b6001600160a01b039093165f908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b5f60208284031215612564575f80fd5b5035919050565b6001600160e01b031981168114611a84575f80fd5b5f60208284031215612590575f80fd5b813561198e8161256b565b5f5b838110156125b557818101518382015260200161259d565b50505f910152565b5f81518084526125d481602086016020860161259b565b601f01601f19169290920160200192915050565b602081525f61198e60208301846125bd565b80356001600160a01b0381168114612610575f80fd5b919050565b5f8060408385031215612626575f80fd5b61262f836125fa565b946020939093013593505050565b5f8083601f84011261264d575f80fd5b50813567ffffffffffffffff811115612664575f80fd5b6020830191508360208260051b850101111561267e575f80fd5b9250929050565b5f805f8060408587031215612698575f80fd5b843567ffffffffffffffff808211156126af575f80fd5b6126bb8883890161263d565b909650945060208701359150808211156126d3575f80fd5b506126e08782880161263d565b95989497509550505050565b5f805f606084860312156126fe575f80fd5b612707846125fa565b9250612715602085016125fa565b9150604084013590509250925092565b5f60208284031215612735575f80fd5b61198e826125fa565b602080825282518282018190525f9190848201906040850190845b8181101561277557835183529284019291840191600101612759565b50909695505050505050565b634e487b7160e01b5f52604160045260245ffd5b5f67ffffffffffffffff808411156127af576127af612781565b604051601f8501601f19908116603f011681019082821181831017156127d7576127d7612781565b816040528093508581528686860111156127ef575f80fd5b858560208301375f602087830101525050509392505050565b5f82601f830112612817575f80fd5b61198e83833560208501612795565b5f8060408385031215612837575f80fd5b823567ffffffffffffffff81111561284d575f80fd5b61285985828601612808565b95602094909401359450505050565b86815260c060208201525f61288060c08301886125bd565b6001600160a01b03969096166040830152506060810193909352608083019190915260a09091015292915050565b8015158114611a84575f80fd5b5f80604083850312156128cc575f80fd5b6128d5836125fa565b915060208301356128e5816128ae565b809150509250929050565b5f805f8060808587031215612903575f80fd5b61290c856125fa565b935061291a602086016125fa565b925060408501359150606085013567ffffffffffffffff81111561293c575f80fd5b8501601f8101871361294c575f80fd5b61295b87823560208401612795565b91505092959194509250565b5f60208284031215612977575f80fd5b813561198e816128ae565b5f60208284031215612992575f80fd5b813567ffffffffffffffff8111156129a8575f80fd5b611c8984828501612808565b5f80604083850312156129c5575f80fd5b6129ce836125fa565b91506129dc602084016125fa565b90509250929050565b600181811c908216806129f957607f821691505b602082108103612a1757634e487b7160e01b5f52602260045260245ffd5b50919050565b634e487b7160e01b5f52601160045260245ffd5b808201808211156108dc576108dc612a1d565b634e487b7160e01b5f52603260045260245ffd5b601f821115610aaa57805f5260205f20601f840160051c81016020851015612a7d5750805b601f840160051c820191505b818110156123cb575f8155600101612a89565b815167ffffffffffffffff811115612ab657612ab6612781565b612aca81612ac484546129e5565b84612a58565b602080601f831160018114612afd575f8415612ae65750858301515b5f19600386901b1c1916600185901b178555612b54565b5f85815260208120601f198616915b82811015612b2b57888601518255948401946001909101908401612b0c565b5085821015612b4857878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b818103818111156108dc576108dc612a1d565b5f60018201612b8057612b80612a1d565b5060010190565b6020808252602d908201527f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560408201526c1c881bdc88185c1c1c9bdd9959609a1b606082015260800190565b5f82612bee57634e487b7160e01b5f52601260045260245ffd5b500490565b5f60208284031215612c03575f80fd5b815161198e816128ae565b5f83516020612c2182856020890161259b565b81840191505f8554612c32816129e5565b60018281168015612c4a5760018114612c5f57612c89565b60ff1984168752821515830287019450612c89565b895f5260205f205f5b84811015612c8157815489820152908301908701612c68565b505082870194505b50929998505050505050505050565b60208082526025908201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060408201526437bbb732b960d91b606082015260800190565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6001600160a01b03858116825284166020820152604081018390526080606082018190525f90612d61908301846125bd565b9695505050505050565b5f60208284031215612d7b575f80fd5b815161198e8161256b565b634e487b7160e01b5f52603160045260245ffdfea264697066735822122034e5549710235c70f50e89085f932669087f755050031421806fd3e6224abbd564736f6c63430008170033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000005c35e73a435359277ebdc97209f2bfe89852b13e
-----Decoded View---------------
Arg [0] : _recieverOfFunds (address): 0x5C35e73A435359277eBDC97209f2BFe89852b13E
-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 0000000000000000000000005c35e73a435359277ebdc97209f2bfe89852b13e
Deployed Bytecode Sourcemap
76257:11244:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;81986:260;;;;;;;;;;-1:-1:-1;81986:260:0;;;;;:::i;:::-;82053:7;82129:20;;;:10;:20;;;;;;;;;82094:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;81986:260;;;;;;;;;401:25:1;;;457:2;442:18;;435:34;;;;485:18;;;478:34;389:2;374:18;81986:260:0;;;;;;;;69945:224;;;;;;;;;;-1:-1:-1;69945:224:0;;;;;:::i;:::-;;:::i;:::-;;;1074:14:1;;1067:22;1049:41;;1037:2;1022:18;69945:224:0;909:187:1;77437:29:0;;;;;;;;;;-1:-1:-1;77437:29:0;;;;;;;;53652:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;55164:171::-;;;;;;;;;;-1:-1:-1;55164:171:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;2021:32:1;;;2003:51;;1991:2;1976:18;55164:171:0;1857:203:1;54682:416:0;;;;;;;;;;-1:-1:-1;54682:416:0;;;;;:::i;:::-;;:::i;:::-;;70585:113;;;;;;;;;;-1:-1:-1;70673:10:0;:17;70585:113;;;2648:25:1;;;2636:2;2621:18;70585:113:0;2502:177:1;86598:900:0;;;;;;;;;;-1:-1:-1;86598:900:0;;;;;:::i;:::-;;:::i;77225:30::-;;;;;;;;;;-1:-1:-1;77225:30:0;;;;-1:-1:-1;;;;;77225:30:0;;;55864:335;;;;;;;;;;-1:-1:-1;55864:335:0;;;;;:::i;:::-;;:::i;70253:256::-;;;;;;;;;;-1:-1:-1;70253:256:0;;;;;:::i;:::-;;:::i;84185:790::-;;;;;;;;;;-1:-1:-1;84185:790:0;;;;;:::i;:::-;;:::i;77547:26::-;;;;;;;;;;;;;;;;83089:1088;;;;;;;;;;;;;:::i;77661:50::-;;;;;;;;;;-1:-1:-1;77661:50:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;56270:185;;;;;;;;;;-1:-1:-1;56270:185:0;;;;;:::i;:::-;;:::i;82641:434::-;;;;;;;;;;-1:-1:-1;82641:434:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;77581:27::-;;;;;;;;;;;;;;;;70775:233;;;;;;;;;;-1:-1:-1;70775:233:0;;;;;:::i;:::-;;:::i;53362:223::-;;;;;;;;;;-1:-1:-1;53362:223:0;;;;;:::i;:::-;;:::i;84983:441::-;;;;;;;;;;-1:-1:-1;84983:441:0;;;;;:::i;:::-;;:::i;78265:110::-;;;;;;;;;;-1:-1:-1;78265:110:0;;;;;:::i;:::-;;:::i;78825:170::-;;;;;;;;;;-1:-1:-1;78825:170:0;;;;;:::i;:::-;;:::i;77262:32::-;;;;;;;;;;-1:-1:-1;77262:32:0;;;;-1:-1:-1;;;77262:32:0;;;;;;53093:207;;;;;;;;;;-1:-1:-1;53093:207:0;;;;;:::i;:::-;;:::i;31075:103::-;;;;;;;;;;;;;:::i;81546:432::-;;;;;;:::i;:::-;;:::i;30427:87::-;;;;;;;;;;-1:-1:-1;30500:6:0;;-1:-1:-1;;;;;30500:6:0;30427:87;;53821:104;;;;;;;;;;;;;:::i;77620:34::-;;;;;;;;;;-1:-1:-1;77620:34:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;;:::i;80001:1191::-;;;;;;:::i;:::-;;:::i;86424:168::-;;;;;;;;;;-1:-1:-1;86424:168:0;;;;;:::i;:::-;;:::i;55407:155::-;;;;;;;;;;-1:-1:-1;55407:155:0;;;;;:::i;:::-;;:::i;56526:322::-;;;;;;;;;;-1:-1:-1;56526:322:0;;;;;:::i;:::-;;:::i;77718:44::-;;;;;;;;;;-1:-1:-1;77718:44:0;;;;;:::i;:::-;;;;;;;;;;;;-1:-1:-1;;;;;77718:44:0;;;78383:93;;;;;;;;;;-1:-1:-1;78383:93:0;;;;;:::i;:::-;;:::i;77358:36::-;;;;;;;;;;;;;:::i;79150:495::-;;;;;;;;;;-1:-1:-1;79150:495:0;;;;;:::i;:::-;;:::i;86174:114::-;;;;;;;;;;-1:-1:-1;86174:114:0;;;;;:::i;:::-;;:::i;77401:29::-;;;;;;;;;;;;;;;;79009:133;;;;;;;;;;-1:-1:-1;79009:133:0;;;;;:::i;:::-;;:::i;77473:31::-;;;;;;;;;;-1:-1:-1;77473:31:0;;;;;;;;;;;77312:39;;;;;;;;;;;;;;;;55633:164;;;;;;;;;;-1:-1:-1;55633:164:0;;;;;:::i;:::-;-1:-1:-1;;;;;55754:25:0;;;55730:4;55754:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;55633:164;77511:29;;;;;;;;;;;;;;;;86300:116;;;;;;;;;;-1:-1:-1;86300:116:0;;;;;:::i;:::-;;:::i;31333:201::-;;;;;;;;;;-1:-1:-1;31333:201:0;;;;;:::i;:::-;;:::i;69945:224::-;70047:4;-1:-1:-1;;;;;;70071:50:0;;-1:-1:-1;;;70071:50:0;;:90;;;70125:36;70149:11;70125:23;:36::i;:::-;70064:97;69945:224;-1:-1:-1;;69945:224:0:o;53652:100::-;53706:13;53739:5;53732:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53652:100;:::o;55164:171::-;55240:7;55260:23;55275:7;55260:14;:23::i;:::-;-1:-1:-1;55303:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;55303:24:0;;55164:171::o;54682:416::-;54763:13;54779:23;54794:7;54779:14;:23::i;:::-;54763:39;;54827:5;-1:-1:-1;;;;;54821:11:0;:2;-1:-1:-1;;;;;54821:11:0;;54813:57;;;;-1:-1:-1;;;54813:57:0;;9536:2:1;54813:57:0;;;9518:21:1;9575:2;9555:18;;;9548:30;9614:34;9594:18;;;9587:62;-1:-1:-1;;;9665:18:1;;;9658:31;9706:19;;54813:57:0;;;;;;;;;29058:10;-1:-1:-1;;;;;54905:21:0;;;;:62;;-1:-1:-1;54930:37:0;54947:5;29058:10;55633:164;:::i;54930:37::-;54883:173;;;;-1:-1:-1;;;54883:173:0;;9938:2:1;54883:173:0;;;9920:21:1;9977:2;9957:18;;;9950:30;10016:34;9996:18;;;9989:62;10087:31;10067:18;;;10060:59;10136:19;;54883:173:0;9736:425:1;54883:173:0;55069:21;55078:2;55082:7;55069:8;:21::i;:::-;54752:346;54682:416;;:::o;86598:900::-;30313:13;:11;:13::i;:::-;86726::::1;::::0;-1:-1:-1;;;86726:13:0;::::1;;;86718:45;;;::::0;-1:-1:-1;;;86718:45:0;;10368:2:1;86718:45:0::1;::::0;::::1;10350:21:1::0;10407:2;10387:18;;;10380:30;-1:-1:-1;;;10426:18:1;;;10419:49;10485:18;;86718:45:0::1;10166:343:1::0;86718:45:0::1;86772:14;86789:13;70673:10:::0;:17;;70585:113;86789:13:::1;86772:30:::0;-1:-1:-1;86809:23:0::1;86835:10;86772:30:::0;86844:1:::1;86835:10;:::i;:::-;86809:36;;86859:9;86854:637;86874:21:::0;;::::1;86854:637;;;86913:17;86933:10;;86944:1;86933:13;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;86913:33;;86957:19;86979:12;;86992:1;86979:15;;;;;;;:::i;:::-;;;;;;;86957:37;;87012:9;87007:473;87031:11;87027:1;:15;87007:473;;;87077:15:::0;87113:24:::1;87123:9:::0;87077:15;87113:9:::1;:24::i;:::-;87156:7;::::0;;;:3:::1;:7;::::0;;;;;;;:15;;;87190::::1;::::0;::::1;:27:::0;;-1:-1:-1;;;;;;87190:27:0::1;-1:-1:-1::0;;;;;87190:27:0;::::1;;::::0;;87236:16;;;;::::1;::::0;;;;;;:7;;;;;;;-1:-1:-1;87236:11:0;;::::1;::::0;:16:::1;::::0;:11;:16:::1;:::i;:::-;-1:-1:-1::0;87295:1:0::1;87272:7:::0;;;:3:::1;:7;::::0;;;;:20:::1;::::0;::::1;:24:::0;;;87315:23:::1;;:27:::0;87387:20:::1;::::0;:24:::1;::::0;87410:1:::1;::::0;87387:24:::1;:::i;:::-;87361:7;::::0;;;:3:::1;:7;::::0;;;;:23:::1;;:50:::0;87447:17;::::1;::::0;::::1;:::i;:::-;::::0;-1:-1:-1;;;87044:3:0::1;;87007:473;;;-1:-1:-1::0;;;86897:3:0::1;;86854:637;;;;86711:787;;86598:900:::0;;;;:::o;55864:335::-;56059:41;29058:10;56092:7;56059:18;:41::i;:::-;56051:99;;;;-1:-1:-1;;;56051:99:0;;;;;;;:::i;:::-;56163:28;56173:4;56179:2;56183:7;56163:9;:28::i;70253:256::-;70350:7;70386:23;70403:5;70386:16;:23::i;:::-;70378:5;:31;70370:87;;;;-1:-1:-1;;;70370:87:0;;13967:2:1;70370:87:0;;;13949:21:1;14006:2;13986:18;;;13979:30;14045:34;14025:18;;;14018:62;-1:-1:-1;;;14096:18:1;;;14089:41;14147:19;;70370:87:0;13765:407:1;70370:87:0;-1:-1:-1;;;;;;70475:19:0;;;;;;;;:12;:19;;;;;;;;:26;;;;;;;;;70253:256::o;84185:790::-;84249:7;;;84332:20;84346:5;84332:13;:20::i;:::-;84303:49;;84366:9;84361:581;84385:9;:16;84381:1;:20;84361:581;;;84419:15;84437:9;84447:1;84437:12;;;;;;;;:::i;:::-;;;;;;;84419:30;;84460:19;84482:3;:12;84486:7;84482:12;;;;;;;;;;;84460:34;;84512:9;84524:7;:23;;;84550:1;84524:27;;;;:::i;:::-;84512:39;;84507:428;84557:20;;84553:1;:24;84507:428;;;84599:28;84630:13;;;:10;:13;;;;;84675:14;;;;84715:20;;84711:24;;84707:217;;;84786:6;84811:38;84786:6;84811:38;;:::i;:::-;;;84736:129;84707:217;;;84903:5;;;;84707:217;-1:-1:-1;;84579:3:0;;84507:428;;;-1:-1:-1;;;84403:3:0;;84361:581;;;-1:-1:-1;84957:14:0;;84185:790;-1:-1:-1;;;84185:790:0:o;83089:1088::-;83137:11;;;;;;;;:19;;:11;:19;83129:63;;;;-1:-1:-1;;;83129:63:0;;14379:2:1;83129:63:0;;;14361:21:1;14418:2;14398:18;;;14391:30;14457:33;14437:18;;;14430:61;14508:18;;83129:63:0;14177:355:1;83129:63:0;83199:23;83233:26;83262:25;83276:10;83262:13;:25::i;:::-;83233:54;;83301:9;83296:760;83320:9;:16;83316:1;:20;83296:760;;;83354:15;83372:9;83382:1;83372:12;;;;;;;;:::i;:::-;;;;;;;83354:30;;83395:19;83417:3;:12;83421:7;83417:12;;;;;;;;;;;83395:34;;83448:9;83460:7;:23;;;83486:1;83460:27;;;;:::i;:::-;83448:39;;83443:606;83493:20;;83489:1;:24;83443:606;;;83535:28;83566:13;;;:10;:13;;;;;83614:14;;;;83668:20;;83664:24;;83660:378;;;83734:6;83759:30;83734:6;83759:30;;:::i;:::-;;;83832:11;83808:7;:20;;;:35;;;;;;;:::i;:::-;;;;;;;;83889:11;83862:7;:23;;;:38;;;;;;;:::i;:::-;;;;-1:-1:-1;;83919:23:0;;;:25;;;:23;:25;;;:::i;:::-;;;;;;83689:289;83660:378;;;84017:5;;;;83660:378;-1:-1:-1;;83515:3:0;;83443:606;;;-1:-1:-1;;;83338:3:0;;83296:760;;;;84090:1;84072:15;:19;84064:51;;;;-1:-1:-1;;;84064:51:0;;14739:2:1;84064:51:0;;;14721:21:1;14778:2;14758:18;;;14751:30;-1:-1:-1;;;14797:18:1;;;14790:49;14856:18;;84064:51:0;14537:343:1;84064:51:0;84126:45;;84134:10;;84126:45;;;;;84155:15;;84126:45;;;;84155:15;84134:10;84126:45;;;;;;;;;;;;;;;;;;;56270:185;56408:39;56425:4;56431:2;56435:7;56408:39;;;;;;;;;;;;:16;:39::i;82641:434::-;82740:16;82782:23;82808:17;82818:6;82808:9;:17::i;:::-;82782:43;;82840:25;82882:15;82868:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;82868:30:0;;82840:58;;82918:9;82913:121;82933:15;82929:1;:19;82913:121;;;82988:30;83008:6;83016:1;82988:19;:30::i;:::-;82974:8;82983:1;82974:11;;;;;;;;:::i;:::-;;;;;;;;;;:44;82950:3;;82913:121;;;-1:-1:-1;83055:8:0;82641:434;-1:-1:-1;;;82641:434:0:o;70775:233::-;70850:7;70886:30;70673:10;:17;;70585:113;70886:30;70878:5;:38;70870:95;;;;-1:-1:-1;;;70870:95:0;;15087:2:1;70870:95:0;;;15069:21:1;15126:2;15106:18;;;15099:30;15165:34;15145:18;;;15138:62;-1:-1:-1;;;15216:18:1;;;15209:42;15268:19;;70870:95:0;14885:408:1;70870:95:0;70983:10;70994:5;70983:17;;;;;;;;:::i;:::-;;;;;;;;;70976:24;;70775:233;;;:::o;53362:223::-;53434:7;58249:16;;;:7;:16;;;;;;-1:-1:-1;;;;;58249:16:0;;53498:56;;;;-1:-1:-1;;;53498:56:0;;15500:2:1;53498:56:0;;;15482:21:1;15539:2;15519:18;;;15512:30;-1:-1:-1;;;15558:18:1;;;15551:54;15622:18;;53498:56:0;15298:348:1;84983:441:0;85040:7;;;85125:20;85139:5;85125:13;:20::i;:::-;85096:49;;85165:9;85160:216;85184:9;:16;85180:1;:20;85160:216;;;85226:10;85239:9;85249:1;85239:12;;;;;;;;:::i;:::-;;;;;;;;;;;;85270:19;85292:7;;;:3;:7;;;;;;;:20;;;85239:12;;-1:-1:-1;85331:29:0;85292:20;85331:29;;:::i;:::-;;-1:-1:-1;;;85202:3:0;;85160:216;;78265:110;30313:13;:11;:13::i;:::-;78338:15:::1;:29:::0;;-1:-1:-1;;;;;;78338:29:0::1;-1:-1:-1::0;;;;;78338:29:0;;;::::1;::::0;;;::::1;::::0;;78265:110::o;78825:170::-;78904:7;;;;:3;:7;;;;;:15;;;-1:-1:-1;;;;;78904:15:0;78923:10;78904:29;78896:59;;;;-1:-1:-1;;;78896:59:0;;15853:2:1;78896:59:0;;;15835:21:1;15892:2;15872:18;;;15865:30;-1:-1:-1;;;15911:18:1;;;15904:48;15969:18;;78896:59:0;15651:342:1;78896:59:0;78966:7;;;;:3;:7;;;;;:11;;:21;78980:7;78966:11;:21;:::i;53093:207::-;53165:7;-1:-1:-1;;;;;53193:19:0;;53185:73;;;;-1:-1:-1;;;53185:73:0;;16200:2:1;53185:73:0;;;16182:21:1;16239:2;16219:18;;;16212:30;16278:34;16258:18;;;16251:62;-1:-1:-1;;;16329:18:1;;;16322:39;16378:19;;53185:73:0;15998:405:1;53185:73:0;-1:-1:-1;;;;;;53276:16:0;;;;;:9;:16;;;;;;;53093:207::o;31075:103::-;30313:13;:11;:13::i;:::-;31140:30:::1;31167:1;31140:18;:30::i;:::-;31075:103::o:0;81546:432::-;30313:13;:11;:13::i;:::-;81655:8:::1;81640:12;:23;81632:49;;;::::0;-1:-1:-1;;;81632:49:0;;16610:2:1;81632:49:0::1;::::0;::::1;16592:21:1::0;16649:2;16629:18;;;16622:30;-1:-1:-1;;;16668:18:1;;;16661:43;16721:18;;81632:49:0::1;16408:337:1::0;81632:49:0::1;81692:45;::::0;81708:4:::1;::::0;81692:45;::::1;;;::::0;81724:12;;81692:45:::1;::::0;;;81724:12;81708:4;81692:45;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;81749:14;81783:13;70673:10:::0;:17;;70585:113;81783:13:::1;81766:30;::::0;81767:12;81766:30:::1;:::i;:::-;81893:40;::::0;;::::1;::::0;::::1;::::0;;;;;::::1;::::0;;::::1;::::0;;;81822:15:::1;81893:40:::0;;;;;;81869:20:::1;::::0;;81807:12:::1;81858:32:::0;;;:10:::1;:32:::0;;;;;;:75;;;;;;::::1;::::0;::::1;::::0;;;::::1;::::0;;::::1;::::0;;;;81948:22;;81749:47;;-1:-1:-1;81822:15:0;;81948:22;81869:20;81948:22:::1;::::0;::::1;:::i;:::-;;;;;;81619:359;;81546:432:::0;:::o;53821:104::-;53877:13;53910:7;53903:14;;;;;:::i;77620:34::-;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;77620:34:0;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;77620:34:0;;;;;;-1:-1:-1;77620:34:0;:::o;80001:1191::-;30313:13;:11;:13::i;:::-;80064:14:::1;80081:13;70673:10:::0;:17;;70585:113;80081:13:::1;80064:30;;80138:9;;80127:6;80110:14;;:23;;;;:::i;:::-;80109:38;;80101:59;;;::::0;-1:-1:-1;;;80101:59:0;;17174:2:1;80101:59:0::1;::::0;::::1;17156:21:1::0;17213:1;17193:18;;;17186:29;-1:-1:-1;;;17231:18:1;;;17224:38;17279:18;;80101:59:0::1;16972:331:1::0;80101:59:0::1;30500:6:::0;;-1:-1:-1;;;;;30500:6:0;80172:10:::1;:21:::0;80169:444:::1;;80223:1;80206:398;80231:6;80226:1;:11;80206:398;;80258:10;80271;80280:1:::0;80271:6;:10:::1;:::i;:::-;80258:23:::0;-1:-1:-1;80301:33:0::1;80311:10;80323;80332:1:::0;80323:6;:10:::1;:::i;:::-;80301:9;:33::i;:::-;80346:7;::::0;;;:3:::1;:7;::::0;;;;;;;:15;;;80373::::1;::::0;::::1;:28:::0;;-1:-1:-1;;;;;;80373:28:0::1;80391:10;80373:28;::::0;;80413:16;;;;::::1;::::0;;;;;;:7;;;;;;;80373:28;80413:11;;::::1;::::0;:16:::1;::::0;:11;:16:::1;:::i;:::-;-1:-1:-1::0;80464:1:0::1;80441:7:::0;;;:3:::1;:7;::::0;;;;:20:::1;::::0;::::1;:24:::0;;;80477:23:::1;;:27:::0;80542:20:::1;::::0;:24:::1;::::0;80565:1:::1;::::0;80542:24:::1;:::i;:::-;80516:7;::::0;;;:3:::1;:7;::::0;;;;:23:::1;;:50:::0;;;;80580:14:::1;:16:::0;;;::::1;::::0;::::1;:::i;:::-;;;;;;80244:360;80239:3;;;;;:::i;:::-;;;;80206:398;;;;80169:444;30500:6:::0;;-1:-1:-1;;;;;30500:6:0;80626:10:::1;:21;80623:564;;80711:13;::::0;-1:-1:-1;;;80711:13:0;::::1;;;80710:14;80702:42;;;::::0;-1:-1:-1;;;80702:42:0;;17510:2:1;80702:42:0::1;::::0;::::1;17492:21:1::0;17549:2;17529:18;;;17522:30;-1:-1:-1;;;17568:18:1;;;17561:45;17623:18;;80702:42:0::1;17308:339:1::0;80702:42:0::1;80776:1;80759:421;80784:6;80779:1;:11;80759:421;;80811:10;80824;80833:1:::0;80824:6;:10:::1;:::i;:::-;80811:23:::0;-1:-1:-1;80854:33:0::1;80864:10;80876;80885:1:::0;80876:6;:10:::1;:::i;80854:33::-;80899:7;::::0;;;:3:::1;:7;::::0;;;;;;;:15;;;80926::::1;::::0;::::1;:28:::0;;-1:-1:-1;;;;;;80926:28:0::1;80944:10;80926:28;::::0;;80966:16;;;;::::1;::::0;;;;;;:7;;;;;;;80926:28;80966:11;;::::1;::::0;:16:::1;::::0;:11;:16:::1;:::i;:::-;-1:-1:-1::0;81017:1:0::1;80994:7:::0;;;:3:::1;:7;::::0;;;;:20:::1;::::0;::::1;:24:::0;;;81030:23:::1;;:27:::0;81095:20:::1;::::0;:24:::1;::::0;81118:1:::1;::::0;81095:24:::1;:::i;:::-;81069:7;::::0;;;:3:::1;:7;::::0;;;;:23:::1;;:50:::0;;;;81133:14:::1;:16:::0;;;::::1;::::0;::::1;:::i;:::-;;;;;;80797:383;80792:3;;;;;:::i;:::-;;;;80759:421;;80623:564;80057:1135;80001:1191:::0;:::o;86424:168::-;30313:13;:11;:13::i;:::-;86528:56:::1;::::0;-1:-1:-1;;;86528:56:0;;86559:10:::1;86528:56;::::0;::::1;17826:51:1::0;17893:18;;;17886:34;;;-1:-1:-1;;;;;86528:30:0;::::1;::::0;::::1;::::0;17799:18:1;;86528:56:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;55407:155::-:0;55502:52;29058:10;55535:8;55545;55502:18;:52::i;56526:322::-;56700:41;29058:10;56733:7;56700:18;:41::i;:::-;56692:99;;;;-1:-1:-1;;;56692:99:0;;;;;;;:::i;:::-;56802:38;56816:4;56822:2;56826:7;56835:4;56802:13;:38::i;:::-;56526:322;;;;:::o;78383:93::-;30313:13;:11;:13::i;:::-;78448:11:::1;:20:::0;;;::::1;;;;-1:-1:-1::0;;78448:20:0;;::::1;::::0;;;::::1;::::0;;78383:93::o;77358:36::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;79150:495::-;58651:4;58249:16;;;:7;:16;;;;;;79224:13;;-1:-1:-1;;;;;58249:16:0;79379:48;;;;-1:-1:-1;;;79379:48:0;;18383:2:1;79379:48:0;;;18365:21:1;18422:2;18402:18;;;18395:30;-1:-1:-1;;;18441:18:1;;;18434:48;18499:18;;79379:48:0;18181:342:1;79379:48:0;79450:28;79481:13;;;:3;:13;;;;;:17;;79450:48;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;79568:1;79543:14;79537:28;:32;:93;;;;;;;;;;;;;;;;;79596:14;79611:13;79579:46;;;;;;;;;:::i;:::-;;;;;;;;;;;;;79537:93;79513:117;79150:495;-1:-1:-1;;;79150:495:0:o;86174:114::-;30313:13;:11;:13::i;:::-;86251::::1;:25:::0;;;::::1;;-1:-1:-1::0;;;86251:25:0::1;-1:-1:-1::0;;;;86251:25:0;;::::1;::::0;;;::::1;::::0;;86174:114::o;79009:133::-;30313:13;:11;:13::i;:::-;79101::::1;:33;79117:17:::0;79101:13;:33:::1;:::i;86300:116::-:0;30313:13;:11;:13::i;:::-;30500:6;;86370:34:::1;::::0;-1:-1:-1;;;;;30500:6:0;;;;86370:34;::::1;;;::::0;86396:7;;86370:34:::1;::::0;;;86396:7;30500:6;86370:34;::::1;;;;;;;;;;;;;::::0;::::1;;;;31333:201:::0;30313:13;:11;:13::i;:::-;-1:-1:-1;;;;;31422:22:0;::::1;31414:73;;;::::0;-1:-1:-1;;;31414:73:0;;19789:2:1;31414:73:0::1;::::0;::::1;19771:21:1::0;19828:2;19808:18;;;19801:30;19867:34;19847:18;;;19840:62;-1:-1:-1;;;19918:18:1;;;19911:36;19964:19;;31414:73:0::1;19587:402:1::0;31414:73:0::1;31498:28;31517:8;31498:18;:28::i;:::-;31333:201:::0;:::o;52724:305::-;52826:4;-1:-1:-1;;;;;;52863:40:0;;-1:-1:-1;;;52863:40:0;;:105;;-1:-1:-1;;;;;;;52920:48:0;;-1:-1:-1;;;52920:48:0;52863:105;:158;;;-1:-1:-1;;;;;;;;;;44265:40:0;;;52985:36;44156:157;64983:135;58651:4;58249:16;;;:7;:16;;;;;;-1:-1:-1;;;;;58249:16:0;65057:53;;;;-1:-1:-1;;;65057:53:0;;15500:2:1;65057:53:0;;;15482:21:1;15539:2;15519:18;;;15512:30;-1:-1:-1;;;15558:18:1;;;15551:54;15622:18;;65057:53:0;15298:348:1;64262:174:0;64337:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;64337:29:0;-1:-1:-1;;;;;64337:29:0;;;;;;;;:24;;64391:23;64337:24;64391:14;:23::i;:::-;-1:-1:-1;;;;;64382:46:0;;;;;;;;;;;64262:174;;:::o;30592:132::-;30500:6;;-1:-1:-1;;;;;30500:6:0;29058:10;30656:23;30648:68;;;;-1:-1:-1;;;30648:68:0;;20196:2:1;30648:68:0;;;20178:21:1;;;20215:18;;;20208:30;20274:34;20254:18;;;20247:62;20326:18;;30648:68:0;19994:356:1;59487:110:0;59563:26;59573:2;59577:7;59563:26;;;;;;;;;;;;:9;:26::i;58881:264::-;58974:4;58991:13;59007:23;59022:7;59007:14;:23::i;:::-;58991:39;;59060:5;-1:-1:-1;;;;;59049:16:0;:7;-1:-1:-1;;;;;59049:16:0;;:52;;;-1:-1:-1;;;;;;55754:25:0;;;55730:4;55754:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;59069:32;59049:87;;;;59129:7;-1:-1:-1;;;;;59105:31:0;:20;59117:7;59105:11;:20::i;:::-;-1:-1:-1;;;;;59105:31:0;;59049:87;59041:96;58881:264;-1:-1:-1;;;;58881:264:0:o;62880:1263::-;63039:4;-1:-1:-1;;;;;63012:31:0;:23;63027:7;63012:14;:23::i;:::-;-1:-1:-1;;;;;63012:31:0;;63004:81;;;;-1:-1:-1;;;63004:81:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;63104:16:0;;63096:65;;;;-1:-1:-1;;;63096:65:0;;20963:2:1;63096:65:0;;;20945:21:1;21002:2;20982:18;;;20975:30;21041:34;21021:18;;;21014:62;-1:-1:-1;;;21092:18:1;;;21085:34;21136:19;;63096:65:0;20761:400:1;63096:65:0;63174:42;63195:4;63201:2;63205:7;63214:1;63174:20;:42::i;:::-;63346:4;-1:-1:-1;;;;;63319:31:0;:23;63334:7;63319:14;:23::i;:::-;-1:-1:-1;;;;;63319:31:0;;63311:81;;;;-1:-1:-1;;;63311:81:0;;;;;;;:::i;:::-;63464:24;;;;:15;:24;;;;;;;;63457:31;;-1:-1:-1;;;;;;63457:31:0;;;;;;-1:-1:-1;;;;;63940:15:0;;;;;;:9;:15;;;;;:20;;-1:-1:-1;;63940:20:0;;;63975:13;;;;;;;;;:18;;63457:31;63975:18;;;64015:16;;;:7;:16;;;;;;:21;;;;;;;;;;64054:27;;63480:7;;64054:27;;;54752:346;54682:416;;:::o;31694:191::-;31787:6;;;-1:-1:-1;;;;;31804:17:0;;;-1:-1:-1;;;;;;31804:17:0;;;;;;;31837:40;;31787:6;;;31804:17;31787:6;;31837:40;;31768:16;;31837:40;31757:128;31694:191;:::o;64579:315::-;64734:8;-1:-1:-1;;;;;64725:17:0;:5;-1:-1:-1;;;;;64725:17:0;;64717:55;;;;-1:-1:-1;;;64717:55:0;;21368:2:1;64717:55:0;;;21350:21:1;21407:2;21387:18;;;21380:30;21446:27;21426:18;;;21419:55;21491:18;;64717:55:0;21166:349:1;64717:55:0;-1:-1:-1;;;;;64783:25:0;;;;;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;:46;;-1:-1:-1;;64783:46:0;;;;;;;;;;64845:41;;1049::1;;;64845::0;;1022:18:1;64845:41:0;;;;;;;64579:315;;;:::o;57729:313::-;57885:28;57895:4;57901:2;57905:7;57885:9;:28::i;:::-;57932:47;57955:4;57961:2;57965:7;57974:4;57932:22;:47::i;:::-;57924:110;;;;-1:-1:-1;;;57924:110:0;;;;;;;:::i;59824:319::-;59953:18;59959:2;59963:7;59953:5;:18::i;:::-;60004:53;60035:1;60039:2;60043:7;60052:4;60004:22;:53::i;:::-;59982:153;;;;-1:-1:-1;;;59982:153:0;;;;;;;:::i;85604:554::-;85795:13;;-1:-1:-1;;;85795:13:0;;;;:21;;85812:4;85795:21;85792:365;;85833:13;;;;:3;:13;;;;;:21;;:27;;-1:-1:-1;;;;;;85833:27:0;-1:-1:-1;;;;;85833:27:0;;;;;85875:61;85902:5;85833:27;:13;85925:10;85875:26;:61::i;:::-;85792:365;;;85991:13;;;;:3;:13;;;;;:21;;;:27;;-1:-1:-1;;;;;;85991:27:0;-1:-1:-1;;;;;85991:27:0;;;;;86037:26;;:30;86084:61;86111:5;85991:27;:13;86134:10;86084:26;:61::i;65682:853::-;65836:4;-1:-1:-1;;;;;65857:13:0;;33420:19;:23;65853:675;;65893:71;;-1:-1:-1;;;65893:71:0;;-1:-1:-1;;;;;65893:36:0;;;;;:71;;29058:10;;65944:4;;65950:7;;65959:4;;65893:71;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;65893:71:0;;;;;;;;-1:-1:-1;;65893:71:0;;;;;;;;;;;;:::i;:::-;;;65889:584;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;66134:6;:13;66151:1;66134:18;66130:328;;66177:60;;-1:-1:-1;;;66177:60:0;;;;;;;:::i;66130:328::-;66408:6;66402:13;66393:6;66389:2;66385:15;66378:38;65889:584;-1:-1:-1;;;;;;66015:51:0;-1:-1:-1;;;66015:51:0;;-1:-1:-1;66008:58:0;;65853:675;-1:-1:-1;66512:4:0;65682:853;;;;;;:::o;60479:942::-;-1:-1:-1;;;;;60559:16:0;;60551:61;;;;-1:-1:-1;;;60551:61:0;;22889:2:1;60551:61:0;;;22871:21:1;;;22908:18;;;22901:30;22967:34;22947:18;;;22940:62;23019:18;;60551:61:0;22687:356:1;60551:61:0;58651:4;58249:16;;;:7;:16;;;;;;-1:-1:-1;;;;;58249:16:0;58675:31;60623:58;;;;-1:-1:-1;;;60623:58:0;;23250:2:1;60623:58:0;;;23232:21:1;23289:2;23269:18;;;23262:30;23328;23308:18;;;23301:58;23376:18;;60623:58:0;23048:352:1;60623:58:0;60694:48;60723:1;60727:2;60731:7;60740:1;60694:20;:48::i;:::-;58651:4;58249:16;;;:7;:16;;;;;;-1:-1:-1;;;;;58249:16:0;58675:31;60832:58;;;;-1:-1:-1;;;60832:58:0;;23250:2:1;60832:58:0;;;23232:21:1;23289:2;23269:18;;;23262:30;23328;23308:18;;;23301:58;23376:18;;60832:58:0;23048:352:1;60832:58:0;-1:-1:-1;;;;;61239:13:0;;;;;;:9;:13;;;;;;;;:18;;61256:1;61239:18;;;61281:16;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;61281:21:0;;;;;61320:33;61289:7;;61239:13;;61320:33;;61239:13;;61320:33;80057:1135:::1;80001:1191:::0;:::o;71082:915::-;71349:1;71337:9;:13;71333:222;;;71480:63;;-1:-1:-1;;;71480:63:0;;23607:2:1;71480:63:0;;;23589:21:1;23646:2;23626:18;;;23619:30;23685:34;23665:18;;;23658:62;-1:-1:-1;;;23736:18:1;;;23729:51;23797:19;;71480:63:0;23405:417:1;71333:222:0;71585:12;-1:-1:-1;;;;;71614:18:0;;71610:187;;71649:40;71681:7;72824:10;:17;;72797:24;;;;:15;:24;;;;;:44;;;72852:24;;;;;;;;;;;;72720:164;71649:40;71610:187;;;71719:2;-1:-1:-1;;;;;71711:10:0;:4;-1:-1:-1;;;;;71711:10:0;;71707:90;;71738:47;71771:4;71777:7;71738:32;:47::i;:::-;-1:-1:-1;;;;;71811:16:0;;71807:183;;71844:45;71881:7;71844:36;:45::i;:::-;71807:183;;;71917:4;-1:-1:-1;;;;;71911:10:0;:2;-1:-1:-1;;;;;71911:10:0;;71907:83;;71938:40;71966:2;71970:7;71938:27;:40::i;:::-;71248:749;71082:915;;;;:::o;73511:988::-;73777:22;73827:1;73802:22;73819:4;73802:16;:22::i;:::-;:26;;;;:::i;:::-;73839:18;73860:26;;;:17;:26;;;;;;73777:51;;-1:-1:-1;73993:28:0;;;73989:328;;-1:-1:-1;;;;;74060:18:0;;74038:19;74060:18;;;:12;:18;;;;;;;;:34;;;;;;;;;74111:30;;;;;;:44;;;74228:30;;:17;:30;;;;;:43;;;73989:328;-1:-1:-1;74413:26:0;;;;:17;:26;;;;;;;;74406:33;;;-1:-1:-1;;;;;74457:18:0;;;;;:12;:18;;;;;:34;;;;;;;74450:41;73511:988::o;74794:1079::-;75072:10;:17;75047:22;;75072:21;;75092:1;;75072:21;:::i;:::-;75104:18;75125:24;;;:15;:24;;;;;;75498:10;:26;;75047:46;;-1:-1:-1;75125:24:0;;75047:46;;75498:26;;;;;;:::i;:::-;;;;;;;;;75476:48;;75562:11;75537:10;75548;75537:22;;;;;;;;:::i;:::-;;;;;;;;;;;;:36;;;;75642:28;;;:15;:28;;;;;;;:41;;;75814:24;;;;;75807:31;75849:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;74865:1008;;;74794:1079;:::o;72298:221::-;72383:14;72400:20;72417:2;72400:16;:20::i;:::-;-1:-1:-1;;;;;72431:16:0;;;;;;;:12;:16;;;;;;;;:24;;;;;;;;:34;;;72476:26;;;:17;:26;;;;;;:35;;;;-1:-1:-1;72298:221:0:o;14:180:1:-;73:6;126:2;114:9;105:7;101:23;97:32;94:52;;;142:1;139;132:12;94:52;-1:-1:-1;165:23:1;;14:180;-1:-1:-1;14:180:1:o;523:131::-;-1:-1:-1;;;;;;597:32:1;;587:43;;577:71;;644:1;641;634:12;659:245;717:6;770:2;758:9;749:7;745:23;741:32;738:52;;;786:1;783;776:12;738:52;825:9;812:23;844:30;868:5;844:30;:::i;1101:250::-;1186:1;1196:113;1210:6;1207:1;1204:13;1196:113;;;1286:11;;;1280:18;1267:11;;;1260:39;1232:2;1225:10;1196:113;;;-1:-1:-1;;1343:1:1;1325:16;;1318:27;1101:250::o;1356:271::-;1398:3;1436:5;1430:12;1463:6;1458:3;1451:19;1479:76;1548:6;1541:4;1536:3;1532:14;1525:4;1518:5;1514:16;1479:76;:::i;:::-;1609:2;1588:15;-1:-1:-1;;1584:29:1;1575:39;;;;1616:4;1571:50;;1356:271;-1:-1:-1;;1356:271:1:o;1632:220::-;1781:2;1770:9;1763:21;1744:4;1801:45;1842:2;1831:9;1827:18;1819:6;1801:45;:::i;2065:173::-;2133:20;;-1:-1:-1;;;;;2182:31:1;;2172:42;;2162:70;;2228:1;2225;2218:12;2162:70;2065:173;;;:::o;2243:254::-;2311:6;2319;2372:2;2360:9;2351:7;2347:23;2343:32;2340:52;;;2388:1;2385;2378:12;2340:52;2411:29;2430:9;2411:29;:::i;:::-;2401:39;2487:2;2472:18;;;;2459:32;;-1:-1:-1;;;2243:254:1:o;2684:367::-;2747:8;2757:6;2811:3;2804:4;2796:6;2792:17;2788:27;2778:55;;2829:1;2826;2819:12;2778:55;-1:-1:-1;2852:20:1;;2895:18;2884:30;;2881:50;;;2927:1;2924;2917:12;2881:50;2964:4;2956:6;2952:17;2940:29;;3024:3;3017:4;3007:6;3004:1;3000:14;2992:6;2988:27;2984:38;2981:47;2978:67;;;3041:1;3038;3031:12;2978:67;2684:367;;;;;:::o;3056:773::-;3178:6;3186;3194;3202;3255:2;3243:9;3234:7;3230:23;3226:32;3223:52;;;3271:1;3268;3261:12;3223:52;3311:9;3298:23;3340:18;3381:2;3373:6;3370:14;3367:34;;;3397:1;3394;3387:12;3367:34;3436:70;3498:7;3489:6;3478:9;3474:22;3436:70;:::i;:::-;3525:8;;-1:-1:-1;3410:96:1;-1:-1:-1;3613:2:1;3598:18;;3585:32;;-1:-1:-1;3629:16:1;;;3626:36;;;3658:1;3655;3648:12;3626:36;;3697:72;3761:7;3750:8;3739:9;3735:24;3697:72;:::i;:::-;3056:773;;;;-1:-1:-1;3788:8:1;-1:-1:-1;;;;3056:773:1:o;3834:328::-;3911:6;3919;3927;3980:2;3968:9;3959:7;3955:23;3951:32;3948:52;;;3996:1;3993;3986:12;3948:52;4019:29;4038:9;4019:29;:::i;:::-;4009:39;;4067:38;4101:2;4090:9;4086:18;4067:38;:::i;:::-;4057:48;;4152:2;4141:9;4137:18;4124:32;4114:42;;3834:328;;;;;:::o;4167:186::-;4226:6;4279:2;4267:9;4258:7;4254:23;4250:32;4247:52;;;4295:1;4292;4285:12;4247:52;4318:29;4337:9;4318:29;:::i;4358:632::-;4529:2;4581:21;;;4651:13;;4554:18;;;4673:22;;;4500:4;;4529:2;4752:15;;;;4726:2;4711:18;;;4500:4;4795:169;4809:6;4806:1;4803:13;4795:169;;;4870:13;;4858:26;;4939:15;;;;4904:12;;;;4831:1;4824:9;4795:169;;;-1:-1:-1;4981:3:1;;4358:632;-1:-1:-1;;;;;;4358:632:1:o;4995:127::-;5056:10;5051:3;5047:20;5044:1;5037:31;5087:4;5084:1;5077:15;5111:4;5108:1;5101:15;5127:632;5192:5;5222:18;5263:2;5255:6;5252:14;5249:40;;;5269:18;;:::i;:::-;5344:2;5338:9;5312:2;5398:15;;-1:-1:-1;;5394:24:1;;;5420:2;5390:33;5386:42;5374:55;;;5444:18;;;5464:22;;;5441:46;5438:72;;;5490:18;;:::i;:::-;5530:10;5526:2;5519:22;5559:6;5550:15;;5589:6;5581;5574:22;5629:3;5620:6;5615:3;5611:16;5608:25;5605:45;;;5646:1;5643;5636:12;5605:45;5696:6;5691:3;5684:4;5676:6;5672:17;5659:44;5751:1;5744:4;5735:6;5727;5723:19;5719:30;5712:41;;;;5127:632;;;;;:::o;5764:222::-;5807:5;5860:3;5853:4;5845:6;5841:17;5837:27;5827:55;;5878:1;5875;5868:12;5827:55;5900:80;5976:3;5967:6;5954:20;5947:4;5939:6;5935:17;5900:80;:::i;5991:390::-;6069:6;6077;6130:2;6118:9;6109:7;6105:23;6101:32;6098:52;;;6146:1;6143;6136:12;6098:52;6186:9;6173:23;6219:18;6211:6;6208:30;6205:50;;;6251:1;6248;6241:12;6205:50;6274;6316:7;6307:6;6296:9;6292:22;6274:50;:::i;:::-;6264:60;6371:2;6356:18;;;;6343:32;;-1:-1:-1;;;;5991:390:1:o;6386:605::-;6675:6;6664:9;6657:25;6718:3;6713:2;6702:9;6698:18;6691:31;6638:4;6739:46;6780:3;6769:9;6765:19;6757:6;6739:46;:::i;:::-;-1:-1:-1;;;;;6821:32:1;;;;6816:2;6801:18;;6794:60;-1:-1:-1;6885:2:1;6870:18;;6863:34;;;;6928:3;6913:19;;6906:35;;;;6841:3;6957:19;;;6950:35;6821:32;6731:54;-1:-1:-1;;6386:605:1:o;6996:118::-;7082:5;7075:13;7068:21;7061:5;7058:32;7048:60;;7104:1;7101;7094:12;7119:315;7184:6;7192;7245:2;7233:9;7224:7;7220:23;7216:32;7213:52;;;7261:1;7258;7251:12;7213:52;7284:29;7303:9;7284:29;:::i;:::-;7274:39;;7363:2;7352:9;7348:18;7335:32;7376:28;7398:5;7376:28;:::i;:::-;7423:5;7413:15;;;7119:315;;;;;:::o;7439:667::-;7534:6;7542;7550;7558;7611:3;7599:9;7590:7;7586:23;7582:33;7579:53;;;7628:1;7625;7618:12;7579:53;7651:29;7670:9;7651:29;:::i;:::-;7641:39;;7699:38;7733:2;7722:9;7718:18;7699:38;:::i;:::-;7689:48;;7784:2;7773:9;7769:18;7756:32;7746:42;;7839:2;7828:9;7824:18;7811:32;7866:18;7858:6;7855:30;7852:50;;;7898:1;7895;7888:12;7852:50;7921:22;;7974:4;7966:13;;7962:27;-1:-1:-1;7952:55:1;;8003:1;8000;7993:12;7952:55;8026:74;8092:7;8087:2;8074:16;8069:2;8065;8061:11;8026:74;:::i;:::-;8016:84;;;7439:667;;;;;;;:::o;8111:241::-;8167:6;8220:2;8208:9;8199:7;8195:23;8191:32;8188:52;;;8236:1;8233;8226:12;8188:52;8275:9;8262:23;8294:28;8316:5;8294:28;:::i;8357:322::-;8426:6;8479:2;8467:9;8458:7;8454:23;8450:32;8447:52;;;8495:1;8492;8485:12;8447:52;8535:9;8522:23;8568:18;8560:6;8557:30;8554:50;;;8600:1;8597;8590:12;8554:50;8623;8665:7;8656:6;8645:9;8641:22;8623:50;:::i;8684:260::-;8752:6;8760;8813:2;8801:9;8792:7;8788:23;8784:32;8781:52;;;8829:1;8826;8819:12;8781:52;8852:29;8871:9;8852:29;:::i;:::-;8842:39;;8900:38;8934:2;8923:9;8919:18;8900:38;:::i;:::-;8890:48;;8684:260;;;;;:::o;8949:380::-;9028:1;9024:12;;;;9071;;;9092:61;;9146:4;9138:6;9134:17;9124:27;;9092:61;9199:2;9191:6;9188:14;9168:18;9165:38;9162:161;;9245:10;9240:3;9236:20;9233:1;9226:31;9280:4;9277:1;9270:15;9308:4;9305:1;9298:15;9162:161;;8949:380;;;:::o;10514:127::-;10575:10;10570:3;10566:20;10563:1;10556:31;10606:4;10603:1;10596:15;10630:4;10627:1;10620:15;10646:125;10711:9;;;10732:10;;;10729:36;;;10745:18;;:::i;10776:127::-;10837:10;10832:3;10828:20;10825:1;10818:31;10868:4;10865:1;10858:15;10892:4;10889:1;10882:15;11034:518;11136:2;11131:3;11128:11;11125:421;;;11172:5;11169:1;11162:16;11216:4;11213:1;11203:18;11286:2;11274:10;11270:19;11267:1;11263:27;11257:4;11253:38;11322:4;11310:10;11307:20;11304:47;;;-1:-1:-1;11345:4:1;11304:47;11400:2;11395:3;11391:12;11388:1;11384:20;11378:4;11374:31;11364:41;;11455:81;11473:2;11466:5;11463:13;11455:81;;;11532:1;11518:16;;11499:1;11488:13;11455:81;;11728:1345;11854:3;11848:10;11881:18;11873:6;11870:30;11867:56;;;11903:18;;:::i;:::-;11932:97;12022:6;11982:38;12014:4;12008:11;11982:38;:::i;:::-;11976:4;11932:97;:::i;:::-;12084:4;;12141:2;12130:14;;12158:1;12153:663;;;;12860:1;12877:6;12874:89;;;-1:-1:-1;12929:19:1;;;12923:26;12874:89;-1:-1:-1;;11685:1:1;11681:11;;;11677:24;11673:29;11663:40;11709:1;11705:11;;;11660:57;12976:81;;12123:944;;12153:663;10981:1;10974:14;;;11018:4;11005:18;;-1:-1:-1;;12189:20:1;;;12307:236;12321:7;12318:1;12315:14;12307:236;;;12410:19;;;12404:26;12389:42;;12502:27;;;;12470:1;12458:14;;;;12337:19;;12307:236;;;12311:3;12571:6;12562:7;12559:19;12556:201;;;12632:19;;;12626:26;-1:-1:-1;;12715:1:1;12711:14;;;12727:3;12707:24;12703:37;12699:42;12684:58;12669:74;;12556:201;;;12803:1;12794:6;12791:1;12787:14;12783:22;12777:4;12770:36;12123:944;;;;;11728:1345;;:::o;13078:128::-;13145:9;;;13166:11;;;13163:37;;;13180:18;;:::i;13211:135::-;13250:3;13271:17;;;13268:43;;13291:18;;:::i;:::-;-1:-1:-1;13338:1:1;13327:13;;13211:135::o;13351:409::-;13553:2;13535:21;;;13592:2;13572:18;;;13565:30;13631:34;13626:2;13611:18;;13604:62;-1:-1:-1;;;13697:2:1;13682:18;;13675:43;13750:3;13735:19;;13351:409::o;16750:217::-;16790:1;16816;16806:132;;16860:10;16855:3;16851:20;16848:1;16841:31;16895:4;16892:1;16885:15;16923:4;16920:1;16913:15;16806:132;-1:-1:-1;16952:9:1;;16750:217::o;17931:245::-;17998:6;18051:2;18039:9;18030:7;18026:23;18022:32;18019:52;;;18067:1;18064;18057:12;18019:52;18099:9;18093:16;18118:28;18140:5;18118:28;:::i;18528:1054::-;18704:3;18742:6;18736:13;18768:4;18781:66;18840:6;18835:3;18828:4;18820:6;18816:17;18781:66;:::i;:::-;18878:6;18873:3;18869:16;18856:29;;18905:1;18938:6;18932:13;18970:36;18996:9;18970:36;:::i;:::-;19025:1;19042:17;;;19068:141;;;;19223:1;19218:339;;;;19035:522;;19068:141;-1:-1:-1;;19103:24:1;;19089:39;;19180:16;;19173:24;19159:39;;19148:51;;;-1:-1:-1;19068:141:1;;19218:339;19249:6;19246:1;19239:17;19297:4;19294:1;19284:18;19324:1;19338:169;19352:8;19349:1;19346:15;19338:169;;;19434:14;;19419:13;;;19412:37;19477:16;;;;19369:10;;19338:169;;;19342:3;;19538:8;19531:5;19527:20;19520:27;;19035:522;-1:-1:-1;19573:3:1;;18528:1054;-1:-1:-1;;;;;;;;;18528:1054:1:o;20355:401::-;20557:2;20539:21;;;20596:2;20576:18;;;20569:30;20635:34;20630:2;20615:18;;20608:62;-1:-1:-1;;;20701:2:1;20686:18;;20679:35;20746:3;20731:19;;20355:401::o;21520:414::-;21722:2;21704:21;;;21761:2;21741:18;;;21734:30;21800:34;21795:2;21780:18;;21773:62;-1:-1:-1;;;21866:2:1;21851:18;;21844:48;21924:3;21909:19;;21520:414::o;21939:489::-;-1:-1:-1;;;;;22208:15:1;;;22190:34;;22260:15;;22255:2;22240:18;;22233:43;22307:2;22292:18;;22285:34;;;22355:3;22350:2;22335:18;;22328:31;;;22133:4;;22376:46;;22402:19;;22394:6;22376:46;:::i;:::-;22368:54;21939:489;-1:-1:-1;;;;;;21939:489:1:o;22433:249::-;22502:6;22555:2;22543:9;22534:7;22530:23;22526:32;22523:52;;;22571:1;22568;22561:12;22523:52;22603:9;22597:16;22622:30;22646:5;22622:30;:::i;23827:127::-;23888:10;23883:3;23879:20;23876:1;23869:31;23919:4;23916:1;23909:15;23943:4;23940:1;23933:15
Swarm Source
ipfs://34e5549710235c70f50e89085f932669087f755050031421806fd3e6224abbd5
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.