Feature Tip: Add private address tag to any address under My Name Tag !
More Info
Private Name Tags
ContractCreator
TokenTracker
Latest 25 from a total of 301 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Withdraw Stuck T... | 18261428 | 422 days ago | IN | 0 ETH | 0.00068948 | ||||
Claim | 18191048 | 432 days ago | IN | 0 ETH | 0.00057718 | ||||
Claim | 18180873 | 433 days ago | IN | 0 ETH | 0.00079739 | ||||
Claim | 18176624 | 434 days ago | IN | 0 ETH | 0.00268522 | ||||
Claim | 18169675 | 435 days ago | IN | 0 ETH | 0.00123644 | ||||
Claim | 18168659 | 435 days ago | IN | 0 ETH | 0.0007884 | ||||
Claim | 18168553 | 435 days ago | IN | 0 ETH | 0.00082369 | ||||
Breed | 18168298 | 435 days ago | IN | 0 ETH | 0.00189792 | ||||
Claim | 18161684 | 436 days ago | IN | 0 ETH | 0.00071064 | ||||
Claim | 18161427 | 436 days ago | IN | 0 ETH | 0.00032904 | ||||
Claim | 18161426 | 436 days ago | IN | 0 ETH | 0.00095393 | ||||
Breed | 18161085 | 436 days ago | IN | 0 ETH | 0.00186155 | ||||
Claim | 18161078 | 436 days ago | IN | 0 ETH | 0.00092136 | ||||
Claim | 18155895 | 437 days ago | IN | 0 ETH | 0.00121237 | ||||
Mint | 18154046 | 437 days ago | IN | 0 ETH | 0.00182615 | ||||
Claim | 18154043 | 437 days ago | IN | 0 ETH | 0.00092396 | ||||
Breed | 18152610 | 437 days ago | IN | 0 ETH | 0.00222921 | ||||
Mint | 18152606 | 437 days ago | IN | 0 ETH | 0.00211545 | ||||
Claim | 18152601 | 437 days ago | IN | 0 ETH | 0.00150698 | ||||
Claim | 18152141 | 437 days ago | IN | 0 ETH | 0.0007201 | ||||
Claim | 18152121 | 437 days ago | IN | 0 ETH | 0.00066459 | ||||
Claim | 18152023 | 437 days ago | IN | 0 ETH | 0.00071726 | ||||
Claim | 18151618 | 437 days ago | IN | 0 ETH | 0.00080034 | ||||
Claim | 18151423 | 437 days ago | IN | 0 ETH | 0.00142472 | ||||
Claim | 18151029 | 437 days ago | IN | 0 ETH | 0.00071592 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
turkeysGameTurkeys
Compiler Version
v0.8.17+commit.8df45f5f
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2023-09-08 */ // File: @openzeppelin/contracts/token/ERC20/IERC20.sol // OpenZeppelin Contracts (last updated v4.9.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: @thirdweb-dev/contracts/eip/interface/IERC721Supply.sol pragma solidity ^0.8.0; /// @title ERC-721 Non-Fungible Token Standard, optional supplu extension /// @dev See https://eips.ethereum.org/EIPS/eip-721 /// Note: the ERC-165 identifier for this interface is 0x780e9d63. /* is ERC721 */ interface IERC721Supply { /// @notice Count NFTs tracked by this contract /// @return A count of valid NFTs tracked by this contract, where each one of /// them has an assigned and queryable owner not equal to the zero address function totalSupply() external view returns (uint256); } // File: @openzeppelin/contracts/utils/Counters.sol // OpenZeppelin Contracts v4.4.1 (utils/Counters.sol) pragma solidity ^0.8.0; /** * @title Counters * @author Matt Condon (@shrugs) * @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number * of elements in a mapping, issuing ERC721 ids, or counting request ids. * * Include with `using Counters for Counters.Counter;` */ library Counters { struct Counter { // This variable should never be directly accessed by users of the library: interactions must be restricted to // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add // this feature: see https://github.com/ethereum/solidity/issues/4637 uint256 _value; // default: 0 } function current(Counter storage counter) internal view returns (uint256) { return counter._value; } function increment(Counter storage counter) internal { unchecked { counter._value += 1; } } function decrement(Counter storage counter) internal { uint256 value = counter._value; require(value > 0, "Counter: decrement overflow"); unchecked { counter._value = value - 1; } } function reset(Counter storage counter) internal { counter._value = 0; } } // File: @openzeppelin/contracts/utils/math/SignedMath.sol // OpenZeppelin Contracts (last updated v4.8.0) (utils/math/SignedMath.sol) pragma solidity ^0.8.0; /** * @dev Standard signed math utilities missing in the Solidity language. */ library SignedMath { /** * @dev Returns the largest of two signed numbers. */ function max(int256 a, int256 b) internal pure returns (int256) { return a > b ? a : b; } /** * @dev Returns the smallest of two signed numbers. */ function min(int256 a, int256 b) internal pure returns (int256) { return a < b ? a : b; } /** * @dev Returns the average of two signed numbers without overflow. * The result is rounded towards zero. */ function average(int256 a, int256 b) internal pure returns (int256) { // Formula from the book "Hacker's Delight" int256 x = (a & b) + ((a ^ b) >> 1); return x + (int256(uint256(x) >> 255) & (a ^ b)); } /** * @dev Returns the absolute unsigned value of a signed value. */ function abs(int256 n) internal pure returns (uint256) { unchecked { // must be unchecked in order to support `n = type(int256).min` return uint256(n >= 0 ? n : -n); } } } // File: @openzeppelin/contracts/utils/math/Math.sol // OpenZeppelin Contracts (last updated v4.9.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) { // Solidity will revert if denominator == 0, unlike the div opcode on its own. // The surrounding unchecked block does not change this fact. // See https://docs.soliditylang.org/en/latest/control-structures.html#checked-or-unchecked-arithmetic. return prod0 / denominator; } // Make sure the result is less than 2^256. Also prevents denominator == 0. require(denominator > prod1, "Math: mulDiv overflow"); /////////////////////////////////////////////// // 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 256, 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 << 3) < value ? 1 : 0); } } } // File: @openzeppelin/contracts/utils/Strings.sol // OpenZeppelin Contracts (last updated v4.9.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 `int256` to its ASCII `string` decimal representation. */ function toString(int256 value) internal pure returns (string memory) { return string(abi.encodePacked(value < 0 ? "-" : "", toString(SignedMath.abs(value)))); } /** * @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); } /** * @dev Returns true if the two strings are equal. */ function equal(string memory a, string memory b) internal pure returns (bool) { return keccak256(bytes(a)) == keccak256(bytes(b)); } } // 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.9.0) (access/Ownable.sol) pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { _checkOwner(); _; } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if the sender is not the owner. */ function _checkOwner() internal view virtual { require(owner() == _msgSender(), "Ownable: caller is not the owner"); } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby disabling any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // File: @openzeppelin/contracts/utils/Address.sol // OpenZeppelin Contracts (last updated v4.9.0) (utils/Address.sol) pragma solidity ^0.8.1; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * * Furthermore, `isContract` will also return true if the target contract within * the same transaction is already scheduled for destruction by `SELFDESTRUCT`, * which only has an effect at the end of a transaction. * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://consensys.net/diligence/blog/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.8.0/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract. * * _Available since v4.8._ */ function verifyCallResultFromTarget( address target, bool success, bytes memory returndata, string memory errorMessage ) internal view returns (bytes memory) { if (success) { if (returndata.length == 0) { // only check isContract if the call was successful and the return data is empty // otherwise we already know that it was a contract require(isContract(target), "Address: call to non-contract"); } return returndata; } else { _revert(returndata, errorMessage); } } /** * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason or using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { _revert(returndata, errorMessage); } } function _revert(bytes memory returndata, string memory errorMessage) private pure { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly /// @solidity memory-safe-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } // 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.9.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.9.0) (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(); } } // File: turkeys/turkeysGameV4.sol pragma solidity ^0.8.17; contract turkeysGameTurkeys is ERC721Enumerable, Ownable, IERC721Supply { using Counters for Counters.Counter; using Strings for uint256; Counters.Counter private _tokenIdCounter; struct Stats { uint8 strength; uint8 intelligence; uint8 speed; uint8 bravery; } string private _baseTokenURI = "https://ipfs.io/ipfs/bafybeiae5rkulgwiwdor2ynnwgsmtvntmdfc7qfnrdmpssay2pmuhdamxy/"; IERC20 public paymentToken = IERC20(0xA8b28269376a854Ce52B7238733cb257Dd3934e8); address public feeRecipient = 0xA8b28269376a854Ce52B7238733cb257Dd3934e8; uint256 public constant MAX_SUPPLY = 444; uint256 public currentPrice = 2000 * 10**9; uint256 public breedingFee = 1500 * 10**9; uint256 public totalRevenue; uint256 public breedingCooldown = 3 days; uint256 public contractStartTime = block.timestamp; mapping(uint256 => Stats) private _tokenStats; mapping(uint256 => uint256) public claimedTokenAmount; mapping(uint256 => uint256) public lastBreedingTime; address private _statsModifierAddress; address private _revenueAdder; event StatUpdated(uint256 indexed tokenId, string statName, uint8 newStatValue); event NewBreeding(uint256 indexed tokenId1, uint256 indexed tokenId2, uint256 newTokenId); event Minted(uint256 strength, uint256 intelligence, uint256 speed, uint256 bravery); event TokensClaimed(address indexed claimer, uint256 amount, uint256 nftCount); modifier onlyStatsModifier() { require(msg.sender == _statsModifierAddress, "Not authorized to modify stats"); _; } modifier onlyRevenueAdder() { require(msg.sender == _revenueAdder, "Not authorized to add revenue"); _; } constructor() ERC721("Turkeys.io | Turkeys", "TRKYS") {} function totalSupply() public view override(ERC721Enumerable, IERC721Supply) returns (uint256) { return super.totalSupply(); } function _baseURI() internal view override returns (string memory) { return _baseTokenURI; } function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { string memory base = _baseURI(); return bytes(base).length > 0 ? string(abi.encodePacked(base, tokenId.toString(), ".json")) : ''; } function setPriceNumber(uint256 newPrice) public onlyOwner { currentPrice = newPrice; } function setBreedingCooldown(uint256 _newCooldown) public onlyOwner { breedingCooldown = _newCooldown; } function mint() external { require(_tokenIdCounter.current() < MAX_SUPPLY, "Maximum supply reached"); require(paymentToken.balanceOf(msg.sender) >= currentPrice, "Insufficient payment token balance"); require(paymentToken.allowance(msg.sender, address(this)) >= currentPrice, "Token allowance not provided"); paymentToken.transferFrom(msg.sender, feeRecipient, currentPrice); _tokenIdCounter.increment(); uint256 newTokenId = _tokenIdCounter.current(); Stats memory newStats = Stats({ strength: _generateRandomStat(11, 30), intelligence: _generateRandomStat(3, 7), speed: _generateRandomStat(14, 35), bravery: 0 }); _tokenStats[newTokenId] = newStats; _safeMint(msg.sender, newTokenId); emit Minted(newStats.strength, newStats.intelligence, newStats.speed, newStats.bravery); } function adminBulkMint(address to, uint256 amount) external onlyOwner { require(amount > 0, "Amount must be greater than 0"); require(_tokenIdCounter.current() + amount <= MAX_SUPPLY, "Exceeds maximum supply"); for (uint256 i = 0; i < amount; i++) { _tokenIdCounter.increment(); uint256 newTokenId = _tokenIdCounter.current(); // Assign stats to the token Stats memory newStats = Stats({ strength: _generateRandomStat(11, 30), intelligence: _generateRandomStat(3, 7), speed: _generateRandomStat(14, 35), bravery: 0 }); _tokenStats[newTokenId] = newStats; _safeMint(to, newTokenId); } } function adminBulkMintMultiple(address[] calldata toAddresses, uint256[] calldata amounts) external onlyOwner { require(toAddresses.length == amounts.length, "Addresses and amounts array length must be the same"); uint256 totalMint = 0; // Calculate total number of NFTs to be minted for (uint i = 0; i < amounts.length; i++) { totalMint += amounts[i]; } // Check for maximum supply constraint require(_tokenIdCounter.current() + totalMint <= MAX_SUPPLY, "Exceeds maximum supply"); // Iterate over the array of addresses and mint NFTs for (uint i = 0; i < toAddresses.length; i++) { address to = toAddresses[i]; uint256 amount = amounts[i]; for (uint256 j = 0; j < amount; j++) { _tokenIdCounter.increment(); uint256 newTokenId = _tokenIdCounter.current(); // Assign stats to the token Stats memory newStats = Stats({ strength: _generateRandomStat(11, 30), intelligence: _generateRandomStat(3, 7), speed: _generateRandomStat(14, 35), bravery: 0 }); _tokenStats[newTokenId] = newStats; _safeMint(to, newTokenId); } } } function breed(uint256 tokenId1, uint256 tokenId2) external { require(ownerOf(tokenId1) == msg.sender && ownerOf(tokenId2) == msg.sender, "You must own both tokens"); require(block.timestamp > lastBreedingTime[tokenId1] + breedingCooldown, "Token 1 is cooling down"); require(block.timestamp > lastBreedingTime[tokenId2] + breedingCooldown, "Token 2 is cooling down"); require(paymentToken.balanceOf(msg.sender) >= breedingFee, "Insufficient payment token balance"); require(paymentToken.allowance(msg.sender, address(this)) >= breedingFee, "Token allowance not provided"); // Transfer the breeding fee paymentToken.transferFrom(msg.sender, feeRecipient, breedingFee); // Create new stats by averaging parent stats and adding a random number Stats memory stats1 = _tokenStats[tokenId1]; Stats memory stats2 = _tokenStats[tokenId2]; uint8 newStrength = uint8((uint16(stats1.strength) + uint16(stats2.strength)) / 2 + (uint16(block.number) % 5)); uint8 newIntelligence = uint8((uint16(stats1.intelligence) + uint16(stats2.intelligence)) / 2 + (uint16(block.timestamp) % 2)); uint8 newSpeed = uint8((uint16(stats1.speed) + uint16(stats2.speed)) / 2 + (uint16(block.number + block.timestamp) % 5)); // Introducing a new stat, Bravery, that only bred NFTs will have uint8 newBravery = uint8(11 + (uint16(block.number + block.timestamp) % 24)); Stats memory newStats = Stats(newStrength, newIntelligence, newSpeed, newBravery); // Mint the new token _mint(msg.sender, totalSupply() + 1); uint256 newTokenId = _tokenIdCounter.current(); _tokenIdCounter.increment(); _tokenStats[newTokenId] = newStats; // Emit an event emit NewBreeding(tokenId1, tokenId2, newTokenId); // Update last breeding time lastBreedingTime[tokenId1] = block.timestamp; lastBreedingTime[tokenId2] = block.timestamp; } function _generateRandomStat(uint8 min, uint8 max) private view returns (uint8) { return uint8((uint256(keccak256(abi.encodePacked(block.timestamp, block.difficulty, msg.sender))) % (max - min + 1)) + min); } function addRevenue(uint256 amount) external onlyRevenueAdder { require(amount > 0, "Amount must be greater than 0"); require(paymentToken.transferFrom(msg.sender, address(this), amount), "Transfer failed"); // Update total revenue totalRevenue += amount; // Calculate claimable amount per NFT uint256 totalNFTs = _tokenIdCounter.current(); if (totalNFTs > 0) { uint256 claimablePerNFT = amount / totalNFTs; // Update claimable amounts for all NFT holders for (uint256 i = 0; i < totalNFTs; i++) { uint256 tokenId = tokenByIndex(i); claimedTokenAmount[tokenId] += claimablePerNFT; } } } function claim() external { require(balanceOf(msg.sender) > 0, "You don't own any NFTs"); uint256 totalClaimableAmount = 0; uint256 userNFTCount = balanceOf(msg.sender); for (uint256 i = 0; i < userNFTCount; i++) { uint256 tokenId = tokenOfOwnerByIndex(msg.sender, i); uint256 claimableAmount = claimedTokenAmount[tokenId]; if (claimableAmount > 0) { require(paymentToken.transfer(msg.sender, claimableAmount), "Transfer failed"); claimedTokenAmount[tokenId] = 0; // Reset claimed amount for the NFT totalClaimableAmount += claimableAmount; } } require(totalClaimableAmount > 0, "No tokens to claim"); emit TokensClaimed(msg.sender, totalClaimableAmount, userNFTCount); } function getClaimableAmount(address user) external view returns (uint256) { require(balanceOf(user) > 0, "User doesn't own any NFTs"); uint256 totalClaimableAmount = 0; uint256 userNFTCount = balanceOf(user); for (uint256 i = 0; i < userNFTCount; i++) { uint256 tokenId = tokenOfOwnerByIndex(user, i); uint256 claimableAmount = claimedTokenAmount[tokenId]; totalClaimableAmount += claimableAmount; } return totalClaimableAmount; } function setBreedingFee(uint256 newFee) external onlyOwner { breedingFee = newFee; } function setStrength(uint256 tokenId, uint8 strengthToAdd) external onlyStatsModifier { _tokenStats[tokenId].strength += strengthToAdd; emit StatUpdated(tokenId, "Strength", _tokenStats[tokenId].strength); } function setIntelligence(uint256 tokenId, uint8 intelligenceToAdd) external onlyStatsModifier { _tokenStats[tokenId].intelligence += intelligenceToAdd; emit StatUpdated(tokenId, "Intelligence", _tokenStats[tokenId].intelligence); } function setSpeed(uint256 tokenId, uint8 speedToAdd) external onlyStatsModifier { _tokenStats[tokenId].speed += speedToAdd; emit StatUpdated(tokenId, "Speed", _tokenStats[tokenId].speed); } function getTokenStats(uint256 tokenId) external view returns (Stats memory) { require(_exists(tokenId), "Token does not exist"); return _tokenStats[tokenId]; } function setBaseURI(string calldata newBaseURI) external onlyOwner { _baseTokenURI = newBaseURI; } function withdrawStuckEther() external onlyOwner { payable(owner()).transfer(address(this).balance); } function setStatsModifierAddress(address newAddress) external onlyOwner { _statsModifierAddress = newAddress; } function setRevenueAdderAddress(address newAddress) external onlyOwner { _revenueAdder = newAddress; } function withdrawStuckTokens(uint256 amount) external onlyOwner { require(paymentToken.balanceOf(address(this)) >= amount, "Insufficient token balance"); paymentToken.transfer(owner(), amount); } function updatePaymentToken(address _newPaymentToken) external onlyOwner { paymentToken = IERC20(_newPaymentToken); } function updateFeeReceiver(address _newFeeReceiver) external onlyOwner { feeRecipient = _newFeeReceiver; } function updateCurrentPrice(uint256 _newCurrentPrice) external onlyOwner { currentPrice = _newCurrentPrice; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"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":false,"internalType":"uint256","name":"strength","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"intelligence","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"speed","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"bravery","type":"uint256"}],"name":"Minted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"tokenId1","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"tokenId2","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newTokenId","type":"uint256"}],"name":"NewBreeding","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":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"string","name":"statName","type":"string"},{"indexed":false,"internalType":"uint8","name":"newStatValue","type":"uint8"}],"name":"StatUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"claimer","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"nftCount","type":"uint256"}],"name":"TokensClaimed","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":"MAX_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"addRevenue","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"adminBulkMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"toAddresses","type":"address[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"adminBulkMintMultiple","outputs":[],"stateMutability":"nonpayable","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":[{"internalType":"uint256","name":"tokenId1","type":"uint256"},{"internalType":"uint256","name":"tokenId2","type":"uint256"}],"name":"breed","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"breedingCooldown","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"breedingFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"claim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"claimedTokenAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"contractStartTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"currentPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"feeRecipient","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"getClaimableAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getTokenStats","outputs":[{"components":[{"internalType":"uint8","name":"strength","type":"uint8"},{"internalType":"uint8","name":"intelligence","type":"uint8"},{"internalType":"uint8","name":"speed","type":"uint8"},{"internalType":"uint8","name":"bravery","type":"uint8"}],"internalType":"struct turkeysGameTurkeys.Stats","name":"","type":"tuple"}],"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":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"lastBreedingTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"paymentToken","outputs":[{"internalType":"contract IERC20","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":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"newBaseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newCooldown","type":"uint256"}],"name":"setBreedingCooldown","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newFee","type":"uint256"}],"name":"setBreedingFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint8","name":"intelligenceToAdd","type":"uint8"}],"name":"setIntelligence","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newPrice","type":"uint256"}],"name":"setPriceNumber","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newAddress","type":"address"}],"name":"setRevenueAdderAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint8","name":"speedToAdd","type":"uint8"}],"name":"setSpeed","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newAddress","type":"address"}],"name":"setStatsModifierAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint8","name":"strengthToAdd","type":"uint8"}],"name":"setStrength","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":"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":[],"name":"totalRevenue","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":[{"internalType":"uint256","name":"_newCurrentPrice","type":"uint256"}],"name":"updateCurrentPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newFeeReceiver","type":"address"}],"name":"updateFeeReceiver","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newPaymentToken","type":"address"}],"name":"updatePaymentToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawStuckEther","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdrawStuckTokens","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
610100604052605160808181529062003cf960a039600c9062000023908262000219565b50600d805473a8b28269376a854ce52b7238733cb257dd3934e86001600160a01b03199182168117909255600e805490911690911790556501d1a94a2000600f5565015d3ef798006010556203f480601255426013553480156200008657600080fd5b506040518060400160405280601481526020017f5475726b6579732e696f207c205475726b6579730000000000000000000000008152506040518060400160405280600581526020016454524b595360d81b8152508160009081620000ec919062000219565b506001620000fb828262000219565b50505062000118620001126200011e60201b60201c565b62000122565b620002e5565b3390565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b634e487b7160e01b600052604160045260246000fd5b600181811c908216806200019f57607f821691505b602082108103620001c057634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200021457600081815260208120601f850160051c81016020861015620001ef5750805b601f850160051c820191505b818110156200021057828155600101620001fb565b5050505b505050565b81516001600160401b0381111562000235576200023562000174565b6200024d816200024684546200018a565b84620001c6565b602080601f8311600181146200028557600084156200026c5750858301515b600019600386901b1c1916600185901b17855562000210565b600085815260208120601f198616915b82811015620002b65788860151825594840194600190910190840162000295565b5085821015620002d55787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b613a0480620002f56000396000f3fe608060405234801561001057600080fd5b50600436106102f15760003560e01c80635e6710de1161019d578063b88d4fde116100e9578063c69cd09d116100a2578063dfa7dcc31161007c578063dfa7dcc31461067d578063e12f3a6114610690578063e985e9c5146106a3578063f2fde38b146106df57600080fd5b8063c69cd09d1461064e578063c87b56dd14610657578063d9ecad7b1461066a57600080fd5b8063b88d4fde14610595578063bf2d9e0b146105a8578063c2568bbb146105b1578063c31ea8c2146105c4578063c5829514146105e4578063c69bebe41461063b57600080fd5b80638c4e94b2116101565780639d1b464a116101305780639d1b464a14610551578063a22cb4651461055a578063a32b9e181461056d578063ac27c8401461057557600080fd5b80638c4e94b2146105255780638da5cb5b1461053857806395d89b411461054957600080fd5b80635e6710de146104d15780636352211e146104e457806363ec512d146104f757806370a082311461050a578063715018a61461051d5780637fc6686e1461052557600080fd5b806332cb6b0c1161025c578063487b8d4f116102155780634f6ccce7116101ef5780634f6ccce7146104855780635004882414610498578063535fcc4d146104ab57806355f804b3146104be57600080fd5b8063487b8d4f146104575780634ccf1b341461046a5780634e71d92d1461047d57600080fd5b806332cb6b0c146103ef57806335744529146103f857806340fa2e301461040b57806342842e0e1461041e5780634574dea514610431578063469048401461044457600080fd5b80631249c58b116102ae5780631249c58b1461039d57806318160ddd146103a557806323b872dd146103ad578063240df5e6146103c05780632f745c59146103c95780633013ce29146103dc57600080fd5b806301ffc9a7146102f657806306fdde031461031e578063081812fc14610333578063095ea7b31461035e5780630c3d5157146103735780630fa766cd1461038a575b600080fd5b6103096103043660046130f6565b6106f2565b60405190151581526020015b60405180910390f35b61032661071d565b6040516103159190613163565b610346610341366004613176565b6107af565b6040516001600160a01b039091168152602001610315565b61037161036c3660046131ab565b6107d6565b005b61037c60135481565b604051908152602001610315565b6103716103983660046131d5565b6108f0565b6103716109e0565b61037c610d54565b6103716103bb36600461320b565b610d64565b61037c60125481565b61037c6103d73660046131ab565b610d95565b600d54610346906001600160a01b031681565b61037c6101bc81565b610371610406366004613293565b610e2b565b6103716104193660046132ff565b6110af565b61037161042c36600461320b565b6110d9565b61037161043f366004613176565b6110f4565b600e54610346906001600160a01b031681565b6103716104653660046131d5565b611101565b6103716104783660046132ff565b6111dd565b610371611207565b61037c610493366004613176565b6113f7565b6103716104a63660046132ff565b61148a565b6103716104b9366004613176565b6114b4565b6103716104cc36600461331a565b6114c1565b6103716104df366004613176565b6114d6565b6103466104f2366004613176565b611630565b610371610505366004613176565b611690565b61037c6105183660046132ff565b61187c565b610371611902565b610371610533366004613176565b611916565b600a546001600160a01b0316610346565b610326611923565b61037c600f5481565b61037161056836600461339a565b611932565b61037161193d565b61037c610583366004613176565b60156020526000908152604090205481565b6103716105a33660046133dc565b611981565b61037c60115481565b6103716105bf3660046131ab565b6119b3565b61037c6105d2366004613176565b60166020526000908152604090205481565b6105f76105f2366004613176565b611b66565b6040516103159190600060808201905060ff835116825260ff602084015116602083015260ff604084015116604083015260ff606084015116606083015292915050565b6103716106493660046132ff565b611c34565b61037c60105481565b610326610665366004613176565b611c5e565b6103716106783660046134b8565b611cbc565b61037161068b3660046131d5565b612280565b61037c61069e3660046132ff565b61234e565b6103096106b13660046134da565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b6103716106ed3660046132ff565b612408565b60006001600160e01b0319821663780e9d6360e01b148061071757506107178261247e565b92915050565b60606000805461072c9061350d565b80601f01602080910402602001604051908101604052809291908181526020018280546107589061350d565b80156107a55780601f1061077a576101008083540402835291602001916107a5565b820191906000526020600020905b81548152906001019060200180831161078857829003601f168201915b5050505050905090565b60006107ba826124ce565b506000908152600460205260409020546001600160a01b031690565b60006107e182611630565b9050806001600160a01b0316836001600160a01b0316036108535760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b60648201526084015b60405180910390fd5b336001600160a01b038216148061086f575061086f81336106b1565b6108e15760405162461bcd60e51b815260206004820152603d60248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60448201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c000000606482015260840161084a565b6108eb838361252d565b505050565b6017546001600160a01b0316331461091a5760405162461bcd60e51b815260040161084a90613547565b6000828152601460205260409020805482919060029061094490849062010000900460ff16613594565b92506101000a81548160ff021916908360ff160217905550817f75be883731d85564056b35faad71df8364ae8e6c33307193b2c1c2911c95e0f56014600085815260200190815260200160002060000160029054906101000a900460ff166040516109d4919060408082526005908201526414dc19595960da1b606082015260ff91909116602082015260800190565b60405180910390a25050565b6101bc6109ec600b5490565b10610a325760405162461bcd60e51b815260206004820152601660248201527513585e1a5b5d5b481cdd5c1c1b1e481c995858da195960521b604482015260640161084a565b600f54600d546040516370a0823160e01b81523360048201526001600160a01b03909116906370a0823190602401602060405180830381865afa158015610a7d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610aa191906135ad565b1015610abf5760405162461bcd60e51b815260040161084a906135c6565b600f54600d54604051636eb1769f60e11b81523360048201523060248201526001600160a01b039091169063dd62ed3e90604401602060405180830381865afa158015610b10573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b3491906135ad565b1015610b825760405162461bcd60e51b815260206004820152601c60248201527f546f6b656e20616c6c6f77616e6365206e6f742070726f766964656400000000604482015260640161084a565b600d54600e54600f546040516323b872dd60e01b81523360048201526001600160a01b03928316602482015260448101919091529116906323b872dd906064016020604051808303816000875af1158015610be1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c059190613608565b50610c14600b80546001019055565b6000610c1f600b5490565b905060006040518060800160405280610c3a600b601e61259b565b60ff168152602001610c4e6003600761259b565b60ff168152602001610c62600e602361259b565b60ff90811682526000602092830181905285815260148352604090819020845181549486015192860151606087015191851661ffff1990961695909517610100938516939093029290921763ffff00001916620100009484169490940263ff000000191693909317630100000091909216021790559050610ce3338361261e565b7fffcef012c57aebe5ac5892b7a52a23e54435ab8349cfbaa6620d7f3b0da0a0018160000151826020015183604001518460600151604051610d48949392919060ff948516815292841660208401529083166040830152909116606082015260800190565b60405180910390a15050565b6000610d5f60085490565b905090565b610d6e3382612638565b610d8a5760405162461bcd60e51b815260040161084a90613625565b6108eb8383836126b7565b6000610da08361187c565b8210610e025760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b606482015260840161084a565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b610e33612828565b828114610e9e5760405162461bcd60e51b815260206004820152603360248201527f41646472657373657320616e6420616d6f756e7473206172726179206c656e676044820152727468206d757374206265207468652073616d6560681b606482015260840161084a565b6000805b82811015610ee257838382818110610ebc57610ebc613672565b9050602002013582610ece9190613688565b915080610eda8161369b565b915050610ea2565b506101bc81610ef0600b5490565b610efa9190613688565b1115610f415760405162461bcd60e51b815260206004820152601660248201527545786365656473206d6178696d756d20737570706c7960501b604482015260640161084a565b60005b848110156110a7576000868683818110610f6057610f60613672565b9050602002016020810190610f7591906132ff565b90506000858584818110610f8b57610f8b613672565b90506020020135905060005b8181101561109157610fad600b80546001019055565b6000610fb8600b5490565b905060006040518060800160405280610fd3600b601e61259b565b60ff168152602001610fe76003600761259b565b60ff168152602001610ffb600e602361259b565b60ff90811682526000602092830181905285815260148352604090819020845181549486015192860151606087015191851661ffff1990961695909517610100938516939093029290921763ffff00001916620100009484169490940263ff00000019169390931763010000009190921602179055905061107c858361261e565b505080806110899061369b565b915050610f97565b505050808061109f9061369b565b915050610f44565b505050505050565b6110b7612828565b601780546001600160a01b0319166001600160a01b0392909216919091179055565b6108eb83838360405180602001604052806000815250611981565b6110fc612828565b601055565b6017546001600160a01b0316331461112b5760405162461bcd60e51b815260040161084a90613547565b60008281526014602052604090208054829190600190611154908490610100900460ff16613594565b825460ff91821661010093840a9081029083021990911617909255600085815260146020908152604091829020548251838152600c938101939093526b496e74656c6c6967656e636560a01b606084015292909204909216908201528391507f75be883731d85564056b35faad71df8364ae8e6c33307193b2c1c2911c95e0f5906080016109d4565b6111e5612828565b600d80546001600160a01b0319166001600160a01b0392909216919091179055565b60006112123361187c565b116112585760405162461bcd60e51b8152602060048201526016602482015275596f7520646f6e2774206f776e20616e79204e46547360501b604482015260640161084a565b6000806112643361187c565b905060005b8181101561137957600061127d3383610d95565b600081815260156020526040902054909150801561136457600d5460405163a9059cbb60e01b8152336004820152602481018390526001600160a01b039091169063a9059cbb906044016020604051808303816000875af11580156112e6573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061130a9190613608565b6113485760405162461bcd60e51b815260206004820152600f60248201526e151c985b9cd9995c8819985a5b1959608a1b604482015260640161084a565b6000828152601560205260408120556113618186613688565b94505b505080806113719061369b565b915050611269565b50600082116113bf5760405162461bcd60e51b81526020600482015260126024820152714e6f20746f6b656e7320746f20636c61696d60701b604482015260640161084a565b604080518381526020810183905233917f9923b4306c6c030f2bdfbf156517d5983b87e15b96176da122cd4f2effa4ba7b91016109d4565b600061140260085490565b82106114655760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b606482015260840161084a565b6008828154811061147857611478613672565b90600052602060002001549050919050565b611492612828565b601880546001600160a01b0319166001600160a01b0392909216919091179055565b6114bc612828565b601255565b6114c9612828565b600c6108eb8284836136fa565b6114de612828565b600d546040516370a0823160e01b815230600482015282916001600160a01b0316906370a0823190602401602060405180830381865afa158015611526573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061154a91906135ad565b10156115985760405162461bcd60e51b815260206004820152601a60248201527f496e73756666696369656e7420746f6b656e2062616c616e6365000000000000604482015260640161084a565b600d546001600160a01b031663a9059cbb6115bb600a546001600160a01b031690565b6040516001600160e01b031960e084901b1681526001600160a01b039091166004820152602481018490526044016020604051808303816000875af1158015611608573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061162c9190613608565b5050565b6000818152600260205260408120546001600160a01b0316806107175760405162461bcd60e51b8152602060048201526018602482015277115490cdcc8c4e881a5b9d985b1a59081d1bdad95b88125160421b604482015260640161084a565b6018546001600160a01b031633146116ea5760405162461bcd60e51b815260206004820152601d60248201527f4e6f7420617574686f72697a656420746f2061646420726576656e7565000000604482015260640161084a565b6000811161173a5760405162461bcd60e51b815260206004820152601d60248201527f416d6f756e74206d7573742062652067726561746572207468616e2030000000604482015260640161084a565b600d546040516323b872dd60e01b8152336004820152306024820152604481018390526001600160a01b03909116906323b872dd906064016020604051808303816000875af1158015611791573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117b59190613608565b6117f35760405162461bcd60e51b815260206004820152600f60248201526e151c985b9cd9995c8819985a5b1959608a1b604482015260640161084a565b80601160008282546118059190613688565b9091555050600b54801561162c57600061181f82846137d0565b905060005b82811015611876576000611837826113f7565b90508260156000838152602001908152602001600020600082825461185c9190613688565b9091555082915061186e90508161369b565b915050611824565b50505050565b60006001600160a01b0382166118e65760405162461bcd60e51b815260206004820152602960248201527f4552433732313a2061646472657373207a65726f206973206e6f7420612076616044820152683634b21037bbb732b960b91b606482015260840161084a565b506001600160a01b031660009081526003602052604090205490565b61190a612828565b6119146000612882565b565b61191e612828565b600f55565b60606001805461072c9061350d565b61162c3383836128d4565b611945612828565b600a546040516001600160a01b03909116904780156108fc02916000818181858888f1935050505015801561197e573d6000803e3d6000fd5b50565b61198b3383612638565b6119a75760405162461bcd60e51b815260040161084a90613625565b611876848484846129a2565b6119bb612828565b60008111611a0b5760405162461bcd60e51b815260206004820152601d60248201527f416d6f756e74206d7573742062652067726561746572207468616e2030000000604482015260640161084a565b6101bc81611a18600b5490565b611a229190613688565b1115611a695760405162461bcd60e51b815260206004820152601660248201527545786365656473206d6178696d756d20737570706c7960501b604482015260640161084a565b60005b818110156108eb57611a82600b80546001019055565b6000611a8d600b5490565b905060006040518060800160405280611aa8600b601e61259b565b60ff168152602001611abc6003600761259b565b60ff168152602001611ad0600e602361259b565b60ff90811682526000602092830181905285815260148352604090819020845181549486015192860151606087015191851661ffff1990961695909517610100938516939093029290921763ffff00001916620100009484169490940263ff000000191693909317630100000091909216021790559050611b51858361261e565b50508080611b5e9061369b565b915050611a6c565b6040805160808101825260008082526020808301829052828401829052606083018290528482526002905291909120546001600160a01b0316611be25760405162461bcd60e51b8152602060048201526014602482015273151bdad95b88191bd95cc81b9bdd08195e1a5cdd60621b604482015260640161084a565b506000908152601460209081526040918290208251608081018452905460ff80821683526101008204811693830193909352620100008104831693820193909352630100000090920416606082015290565b611c3c612828565b600e80546001600160a01b0319166001600160a01b0392909216919091179055565b60606000611c6a6129d5565b90506000815111611c8a5760405180602001604052806000815250611cb5565b80611c94846129e4565b604051602001611ca59291906137e4565b6040516020818303038152906040525b9392505050565b33611cc683611630565b6001600160a01b0316148015611cec575033611ce182611630565b6001600160a01b0316145b611d385760405162461bcd60e51b815260206004820152601860248201527f596f75206d757374206f776e20626f746820746f6b656e730000000000000000604482015260640161084a565b601254600083815260166020526040902054611d549190613688565b4211611da25760405162461bcd60e51b815260206004820152601760248201527f546f6b656e203120697320636f6f6c696e6720646f776e000000000000000000604482015260640161084a565b601254600082815260166020526040902054611dbe9190613688565b4211611e0c5760405162461bcd60e51b815260206004820152601760248201527f546f6b656e203220697320636f6f6c696e6720646f776e000000000000000000604482015260640161084a565b601054600d546040516370a0823160e01b81523360048201526001600160a01b03909116906370a0823190602401602060405180830381865afa158015611e57573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e7b91906135ad565b1015611e995760405162461bcd60e51b815260040161084a906135c6565b601054600d54604051636eb1769f60e11b81523360048201523060248201526001600160a01b039091169063dd62ed3e90604401602060405180830381865afa158015611eea573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f0e91906135ad565b1015611f5c5760405162461bcd60e51b815260206004820152601c60248201527f546f6b656e20616c6c6f77616e6365206e6f742070726f766964656400000000604482015260640161084a565b600d54600e546010546040516323b872dd60e01b81523360048201526001600160a01b03928316602482015260448101919091529116906323b872dd906064016020604051808303816000875af1158015611fbb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611fdf9190613608565b506000828152601460208181526040808420815160808082018452915460ff80821683526101008083048216848801526201000080840483168588015263010000009384900483166060808701919091528b8b52988852868a20875196870188525480841687529182048316978601979097529586048116948401949094529093049091169281019290925291612077600543613823565b8251845160029161208e9160ff9182169116613844565b6120989190613866565b6120a29190613844565b905060006120b1600242613823565b6002846020015160ff16866020015160ff166120cd9190613844565b6120d79190613866565b6120e19190613844565b9050600060056120f14243613688565b6120fb9190613823565b6002856040015160ff16876040015160ff166121179190613844565b6121219190613866565b61212b9190613844565b90506000601861213b4243613688565b6121459190613823565b61215090600b613844565b9050600060405180608001604052808660ff1681526020018560ff1681526020018460ff1681526020018360ff16815250905061219f3361218f610d54565b61219a906001613688565b612a77565b60006121aa600b5490565b90506121ba600b80546001019055565b600081815260146020908152604091829020845181549286015184870151606088015160ff90811663010000000263ff0000001992821662010000029290921663ffff0000199382166101000261ffff1990971691909416179490941716179190911790555189908b907fab1231843677f6361dfe40afeef0d1f08712b7ea003cccf9f7d672d36ba0dc20906122539085815260200190565b60405180910390a35050506000968752505060166020525050604080842042908190559284529092205550565b6017546001600160a01b031633146122aa5760405162461bcd60e51b815260040161084a90613547565b600082815260146020526040812080548392906122cb90849060ff16613594565b82546101009290920a60ff818102199093169183160217909155600084815260146020908152604091829020548251838152600893810193909352670a6e8e4cadccee8d60c31b6060840152909216918101919091528391507f75be883731d85564056b35faad71df8364ae8e6c33307193b2c1c2911c95e0f5906080016109d4565b60008061235a8361187c565b116123a75760405162461bcd60e51b815260206004820152601960248201527f5573657220646f65736e2774206f776e20616e79204e46547300000000000000604482015260640161084a565b6000806123b38461187c565b905060005b818110156123ff5760006123cc8683610d95565b6000818152601560205260409020549091506123e88186613688565b9450505080806123f79061369b565b9150506123b8565b50909392505050565b612410612828565b6001600160a01b0381166124755760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161084a565b61197e81612882565b60006001600160e01b031982166380ac58cd60e01b14806124af57506001600160e01b03198216635b5e139f60e01b145b8061071757506301ffc9a760e01b6001600160e01b0319831614610717565b6000818152600260205260409020546001600160a01b031661197e5760405162461bcd60e51b8152602060048201526018602482015277115490cdcc8c4e881a5b9d985b1a59081d1bdad95b88125160421b604482015260640161084a565b600081815260046020526040902080546001600160a01b0319166001600160a01b038416908117909155819061256282611630565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600060ff83166125ab8484613887565b6125b6906001613594565b60ff164244336040516020016125f193929190928352602083019190915260601b6bffffffffffffffffffffffff1916604082015260540190565b6040516020818303038152906040528051906020012060001c61261491906138a0565b611cb59190613688565b61162c828260405180602001604052806000815250612c10565b60008061264483611630565b9050806001600160a01b0316846001600160a01b0316148061268b57506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b806126af5750836001600160a01b03166126a4846107af565b6001600160a01b0316145b949350505050565b826001600160a01b03166126ca82611630565b6001600160a01b0316146126f05760405162461bcd60e51b815260040161084a906138b4565b6001600160a01b0382166127525760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b606482015260840161084a565b61275f8383836001612c43565b826001600160a01b031661277282611630565b6001600160a01b0316146127985760405162461bcd60e51b815260040161084a906138b4565b600081815260046020908152604080832080546001600160a01b03199081169091556001600160a01b0387811680865260038552838620805460001901905590871680865283862080546001019055868652600290945282852080549092168417909155905184937fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b600a546001600160a01b031633146119145760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161084a565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b816001600160a01b0316836001600160a01b0316036129355760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c657200000000000000604482015260640161084a565b6001600160a01b03838116600081815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6129ad8484846126b7565b6129b984848484612d77565b6118765760405162461bcd60e51b815260040161084a906138f9565b6060600c805461072c9061350d565b606060006129f183612e78565b600101905060008167ffffffffffffffff811115612a1157612a116133c6565b6040519080825280601f01601f191660200182016040528015612a3b576020820181803683370190505b5090508181016020015b600019016f181899199a1a9b1b9c1cb0b131b232b360811b600a86061a8153600a8504945084612a4557509392505050565b6001600160a01b038216612acd5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f2061646472657373604482015260640161084a565b6000818152600260205260409020546001600160a01b031615612b325760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000604482015260640161084a565b612b40600083836001612c43565b6000818152600260205260409020546001600160a01b031615612ba55760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000604482015260640161084a565b6001600160a01b038216600081815260036020908152604080832080546001019055848352600290915280822080546001600160a01b0319168417905551839291907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b612c1a8383612a77565b612c276000848484612d77565b6108eb5760405162461bcd60e51b815260040161084a906138f9565b6001811115612cb25760405162461bcd60e51b815260206004820152603560248201527f455243373231456e756d657261626c653a20636f6e7365637574697665207472604482015274185b9cd9995c9cc81b9bdd081cdd5c1c1bdc9d1959605a1b606482015260840161084a565b816001600160a01b038516612d0e57612d0981600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b612d31565b836001600160a01b0316856001600160a01b031614612d3157612d318582612f50565b6001600160a01b038416612d4d57612d4881612fed565b612d70565b846001600160a01b0316846001600160a01b031614612d7057612d70848261309c565b5050505050565b60006001600160a01b0384163b15612e6d57604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290612dbb90339089908890889060040161394b565b6020604051808303816000875af1925050508015612df6575060408051601f3d908101601f19168201909252612df391810190613988565b60015b612e53573d808015612e24576040519150601f19603f3d011682016040523d82523d6000602084013e612e29565b606091505b508051600003612e4b5760405162461bcd60e51b815260040161084a906138f9565b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490506126af565b506001949350505050565b60008072184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b8310612eb75772184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b830492506040015b6d04ee2d6d415b85acef81000000008310612ee3576d04ee2d6d415b85acef8100000000830492506020015b662386f26fc100008310612f0157662386f26fc10000830492506010015b6305f5e1008310612f19576305f5e100830492506008015b6127108310612f2d57612710830492506004015b60648310612f3f576064830492506002015b600a83106107175760010192915050565b60006001612f5d8461187c565b612f6791906139a5565b600083815260076020526040902054909150808214612fba576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b600854600090612fff906001906139a5565b6000838152600960205260408120546008805493945090928490811061302757613027613672565b90600052602060002001549050806008838154811061304857613048613672565b6000918252602080832090910192909255828152600990915260408082208490558582528120556008805480613080576130806139b8565b6001900381819060005260206000200160009055905550505050565b60006130a78361187c565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b6001600160e01b03198116811461197e57600080fd5b60006020828403121561310857600080fd5b8135611cb5816130e0565b60005b8381101561312e578181015183820152602001613116565b50506000910152565b6000815180845261314f816020860160208601613113565b601f01601f19169290920160200192915050565b602081526000611cb56020830184613137565b60006020828403121561318857600080fd5b5035919050565b80356001600160a01b03811681146131a657600080fd5b919050565b600080604083850312156131be57600080fd5b6131c78361318f565b946020939093013593505050565b600080604083850312156131e857600080fd5b82359150602083013560ff8116811461320057600080fd5b809150509250929050565b60008060006060848603121561322057600080fd5b6132298461318f565b92506132376020850161318f565b9150604084013590509250925092565b60008083601f84011261325957600080fd5b50813567ffffffffffffffff81111561327157600080fd5b6020830191508360208260051b850101111561328c57600080fd5b9250929050565b600080600080604085870312156132a957600080fd5b843567ffffffffffffffff808211156132c157600080fd5b6132cd88838901613247565b909650945060208701359150808211156132e657600080fd5b506132f387828801613247565b95989497509550505050565b60006020828403121561331157600080fd5b611cb58261318f565b6000806020838503121561332d57600080fd5b823567ffffffffffffffff8082111561334557600080fd5b818501915085601f83011261335957600080fd5b81358181111561336857600080fd5b86602082850101111561337a57600080fd5b60209290920196919550909350505050565b801515811461197e57600080fd5b600080604083850312156133ad57600080fd5b6133b68361318f565b915060208301356132008161338c565b634e487b7160e01b600052604160045260246000fd5b600080600080608085870312156133f257600080fd5b6133fb8561318f565b93506134096020860161318f565b925060408501359150606085013567ffffffffffffffff8082111561342d57600080fd5b818701915087601f83011261344157600080fd5b813581811115613453576134536133c6565b604051601f8201601f19908116603f0116810190838211818310171561347b5761347b6133c6565b816040528281528a602084870101111561349457600080fd5b82602086016020830137600060208483010152809550505050505092959194509250565b600080604083850312156134cb57600080fd5b50508035926020909101359150565b600080604083850312156134ed57600080fd5b6134f68361318f565b91506135046020840161318f565b90509250929050565b600181811c9082168061352157607f821691505b60208210810361354157634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252601e908201527f4e6f7420617574686f72697a656420746f206d6f646966792073746174730000604082015260600190565b634e487b7160e01b600052601160045260246000fd5b60ff81811683821601908111156107175761071761357e565b6000602082840312156135bf57600080fd5b5051919050565b60208082526022908201527f496e73756666696369656e74207061796d656e7420746f6b656e2062616c616e604082015261636560f01b606082015260800190565b60006020828403121561361a57600080fd5b8151611cb58161338c565b6020808252602d908201527f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560408201526c1c881bdc88185c1c1c9bdd9959609a1b606082015260800190565b634e487b7160e01b600052603260045260246000fd5b808201808211156107175761071761357e565b6000600182016136ad576136ad61357e565b5060010190565b601f8211156108eb57600081815260208120601f850160051c810160208610156136db5750805b601f850160051c820191505b818110156110a7578281556001016136e7565b67ffffffffffffffff831115613712576137126133c6565b61372683613720835461350d565b836136b4565b6000601f84116001811461375a57600085156137425750838201355b600019600387901b1c1916600186901b178355612d70565b600083815260209020601f19861690835b8281101561378b578685013582556020948501946001909201910161376b565b50868210156137a85760001960f88860031b161c19848701351681555b505060018560011b0183555050505050565b634e487b7160e01b600052601260045260246000fd5b6000826137df576137df6137ba565b500490565b600083516137f6818460208801613113565b83519083019061380a818360208801613113565b64173539b7b760d91b9101908152600501949350505050565b600061ffff80841680613838576138386137ba565b92169190910692915050565b61ffff81811683821601908082111561385f5761385f61357e565b5092915050565b600061ffff8084168061387b5761387b6137ba565b92169190910492915050565b60ff82811682821603908111156107175761071761357e565b6000826138af576138af6137ba565b500690565b60208082526025908201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060408201526437bbb732b960d91b606082015260800190565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061397e90830184613137565b9695505050505050565b60006020828403121561399a57600080fd5b8151611cb5816130e0565b818103818111156107175761071761357e565b634e487b7160e01b600052603160045260246000fdfea2646970667358221220e236cc359156e6e36bfcbcb22e555963f99a0b952773c88b1dc429256df369b864736f6c6343000811003368747470733a2f2f697066732e696f2f697066732f62616679626569616535726b756c67776977646f7232796e6e7767736d74766e746d6466633771666e72646d707373617932706d756864616d78792f
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106102f15760003560e01c80635e6710de1161019d578063b88d4fde116100e9578063c69cd09d116100a2578063dfa7dcc31161007c578063dfa7dcc31461067d578063e12f3a6114610690578063e985e9c5146106a3578063f2fde38b146106df57600080fd5b8063c69cd09d1461064e578063c87b56dd14610657578063d9ecad7b1461066a57600080fd5b8063b88d4fde14610595578063bf2d9e0b146105a8578063c2568bbb146105b1578063c31ea8c2146105c4578063c5829514146105e4578063c69bebe41461063b57600080fd5b80638c4e94b2116101565780639d1b464a116101305780639d1b464a14610551578063a22cb4651461055a578063a32b9e181461056d578063ac27c8401461057557600080fd5b80638c4e94b2146105255780638da5cb5b1461053857806395d89b411461054957600080fd5b80635e6710de146104d15780636352211e146104e457806363ec512d146104f757806370a082311461050a578063715018a61461051d5780637fc6686e1461052557600080fd5b806332cb6b0c1161025c578063487b8d4f116102155780634f6ccce7116101ef5780634f6ccce7146104855780635004882414610498578063535fcc4d146104ab57806355f804b3146104be57600080fd5b8063487b8d4f146104575780634ccf1b341461046a5780634e71d92d1461047d57600080fd5b806332cb6b0c146103ef57806335744529146103f857806340fa2e301461040b57806342842e0e1461041e5780634574dea514610431578063469048401461044457600080fd5b80631249c58b116102ae5780631249c58b1461039d57806318160ddd146103a557806323b872dd146103ad578063240df5e6146103c05780632f745c59146103c95780633013ce29146103dc57600080fd5b806301ffc9a7146102f657806306fdde031461031e578063081812fc14610333578063095ea7b31461035e5780630c3d5157146103735780630fa766cd1461038a575b600080fd5b6103096103043660046130f6565b6106f2565b60405190151581526020015b60405180910390f35b61032661071d565b6040516103159190613163565b610346610341366004613176565b6107af565b6040516001600160a01b039091168152602001610315565b61037161036c3660046131ab565b6107d6565b005b61037c60135481565b604051908152602001610315565b6103716103983660046131d5565b6108f0565b6103716109e0565b61037c610d54565b6103716103bb36600461320b565b610d64565b61037c60125481565b61037c6103d73660046131ab565b610d95565b600d54610346906001600160a01b031681565b61037c6101bc81565b610371610406366004613293565b610e2b565b6103716104193660046132ff565b6110af565b61037161042c36600461320b565b6110d9565b61037161043f366004613176565b6110f4565b600e54610346906001600160a01b031681565b6103716104653660046131d5565b611101565b6103716104783660046132ff565b6111dd565b610371611207565b61037c610493366004613176565b6113f7565b6103716104a63660046132ff565b61148a565b6103716104b9366004613176565b6114b4565b6103716104cc36600461331a565b6114c1565b6103716104df366004613176565b6114d6565b6103466104f2366004613176565b611630565b610371610505366004613176565b611690565b61037c6105183660046132ff565b61187c565b610371611902565b610371610533366004613176565b611916565b600a546001600160a01b0316610346565b610326611923565b61037c600f5481565b61037161056836600461339a565b611932565b61037161193d565b61037c610583366004613176565b60156020526000908152604090205481565b6103716105a33660046133dc565b611981565b61037c60115481565b6103716105bf3660046131ab565b6119b3565b61037c6105d2366004613176565b60166020526000908152604090205481565b6105f76105f2366004613176565b611b66565b6040516103159190600060808201905060ff835116825260ff602084015116602083015260ff604084015116604083015260ff606084015116606083015292915050565b6103716106493660046132ff565b611c34565b61037c60105481565b610326610665366004613176565b611c5e565b6103716106783660046134b8565b611cbc565b61037161068b3660046131d5565b612280565b61037c61069e3660046132ff565b61234e565b6103096106b13660046134da565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b6103716106ed3660046132ff565b612408565b60006001600160e01b0319821663780e9d6360e01b148061071757506107178261247e565b92915050565b60606000805461072c9061350d565b80601f01602080910402602001604051908101604052809291908181526020018280546107589061350d565b80156107a55780601f1061077a576101008083540402835291602001916107a5565b820191906000526020600020905b81548152906001019060200180831161078857829003601f168201915b5050505050905090565b60006107ba826124ce565b506000908152600460205260409020546001600160a01b031690565b60006107e182611630565b9050806001600160a01b0316836001600160a01b0316036108535760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b60648201526084015b60405180910390fd5b336001600160a01b038216148061086f575061086f81336106b1565b6108e15760405162461bcd60e51b815260206004820152603d60248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60448201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c000000606482015260840161084a565b6108eb838361252d565b505050565b6017546001600160a01b0316331461091a5760405162461bcd60e51b815260040161084a90613547565b6000828152601460205260409020805482919060029061094490849062010000900460ff16613594565b92506101000a81548160ff021916908360ff160217905550817f75be883731d85564056b35faad71df8364ae8e6c33307193b2c1c2911c95e0f56014600085815260200190815260200160002060000160029054906101000a900460ff166040516109d4919060408082526005908201526414dc19595960da1b606082015260ff91909116602082015260800190565b60405180910390a25050565b6101bc6109ec600b5490565b10610a325760405162461bcd60e51b815260206004820152601660248201527513585e1a5b5d5b481cdd5c1c1b1e481c995858da195960521b604482015260640161084a565b600f54600d546040516370a0823160e01b81523360048201526001600160a01b03909116906370a0823190602401602060405180830381865afa158015610a7d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610aa191906135ad565b1015610abf5760405162461bcd60e51b815260040161084a906135c6565b600f54600d54604051636eb1769f60e11b81523360048201523060248201526001600160a01b039091169063dd62ed3e90604401602060405180830381865afa158015610b10573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b3491906135ad565b1015610b825760405162461bcd60e51b815260206004820152601c60248201527f546f6b656e20616c6c6f77616e6365206e6f742070726f766964656400000000604482015260640161084a565b600d54600e54600f546040516323b872dd60e01b81523360048201526001600160a01b03928316602482015260448101919091529116906323b872dd906064016020604051808303816000875af1158015610be1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c059190613608565b50610c14600b80546001019055565b6000610c1f600b5490565b905060006040518060800160405280610c3a600b601e61259b565b60ff168152602001610c4e6003600761259b565b60ff168152602001610c62600e602361259b565b60ff90811682526000602092830181905285815260148352604090819020845181549486015192860151606087015191851661ffff1990961695909517610100938516939093029290921763ffff00001916620100009484169490940263ff000000191693909317630100000091909216021790559050610ce3338361261e565b7fffcef012c57aebe5ac5892b7a52a23e54435ab8349cfbaa6620d7f3b0da0a0018160000151826020015183604001518460600151604051610d48949392919060ff948516815292841660208401529083166040830152909116606082015260800190565b60405180910390a15050565b6000610d5f60085490565b905090565b610d6e3382612638565b610d8a5760405162461bcd60e51b815260040161084a90613625565b6108eb8383836126b7565b6000610da08361187c565b8210610e025760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b606482015260840161084a565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b610e33612828565b828114610e9e5760405162461bcd60e51b815260206004820152603360248201527f41646472657373657320616e6420616d6f756e7473206172726179206c656e676044820152727468206d757374206265207468652073616d6560681b606482015260840161084a565b6000805b82811015610ee257838382818110610ebc57610ebc613672565b9050602002013582610ece9190613688565b915080610eda8161369b565b915050610ea2565b506101bc81610ef0600b5490565b610efa9190613688565b1115610f415760405162461bcd60e51b815260206004820152601660248201527545786365656473206d6178696d756d20737570706c7960501b604482015260640161084a565b60005b848110156110a7576000868683818110610f6057610f60613672565b9050602002016020810190610f7591906132ff565b90506000858584818110610f8b57610f8b613672565b90506020020135905060005b8181101561109157610fad600b80546001019055565b6000610fb8600b5490565b905060006040518060800160405280610fd3600b601e61259b565b60ff168152602001610fe76003600761259b565b60ff168152602001610ffb600e602361259b565b60ff90811682526000602092830181905285815260148352604090819020845181549486015192860151606087015191851661ffff1990961695909517610100938516939093029290921763ffff00001916620100009484169490940263ff00000019169390931763010000009190921602179055905061107c858361261e565b505080806110899061369b565b915050610f97565b505050808061109f9061369b565b915050610f44565b505050505050565b6110b7612828565b601780546001600160a01b0319166001600160a01b0392909216919091179055565b6108eb83838360405180602001604052806000815250611981565b6110fc612828565b601055565b6017546001600160a01b0316331461112b5760405162461bcd60e51b815260040161084a90613547565b60008281526014602052604090208054829190600190611154908490610100900460ff16613594565b825460ff91821661010093840a9081029083021990911617909255600085815260146020908152604091829020548251838152600c938101939093526b496e74656c6c6967656e636560a01b606084015292909204909216908201528391507f75be883731d85564056b35faad71df8364ae8e6c33307193b2c1c2911c95e0f5906080016109d4565b6111e5612828565b600d80546001600160a01b0319166001600160a01b0392909216919091179055565b60006112123361187c565b116112585760405162461bcd60e51b8152602060048201526016602482015275596f7520646f6e2774206f776e20616e79204e46547360501b604482015260640161084a565b6000806112643361187c565b905060005b8181101561137957600061127d3383610d95565b600081815260156020526040902054909150801561136457600d5460405163a9059cbb60e01b8152336004820152602481018390526001600160a01b039091169063a9059cbb906044016020604051808303816000875af11580156112e6573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061130a9190613608565b6113485760405162461bcd60e51b815260206004820152600f60248201526e151c985b9cd9995c8819985a5b1959608a1b604482015260640161084a565b6000828152601560205260408120556113618186613688565b94505b505080806113719061369b565b915050611269565b50600082116113bf5760405162461bcd60e51b81526020600482015260126024820152714e6f20746f6b656e7320746f20636c61696d60701b604482015260640161084a565b604080518381526020810183905233917f9923b4306c6c030f2bdfbf156517d5983b87e15b96176da122cd4f2effa4ba7b91016109d4565b600061140260085490565b82106114655760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b606482015260840161084a565b6008828154811061147857611478613672565b90600052602060002001549050919050565b611492612828565b601880546001600160a01b0319166001600160a01b0392909216919091179055565b6114bc612828565b601255565b6114c9612828565b600c6108eb8284836136fa565b6114de612828565b600d546040516370a0823160e01b815230600482015282916001600160a01b0316906370a0823190602401602060405180830381865afa158015611526573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061154a91906135ad565b10156115985760405162461bcd60e51b815260206004820152601a60248201527f496e73756666696369656e7420746f6b656e2062616c616e6365000000000000604482015260640161084a565b600d546001600160a01b031663a9059cbb6115bb600a546001600160a01b031690565b6040516001600160e01b031960e084901b1681526001600160a01b039091166004820152602481018490526044016020604051808303816000875af1158015611608573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061162c9190613608565b5050565b6000818152600260205260408120546001600160a01b0316806107175760405162461bcd60e51b8152602060048201526018602482015277115490cdcc8c4e881a5b9d985b1a59081d1bdad95b88125160421b604482015260640161084a565b6018546001600160a01b031633146116ea5760405162461bcd60e51b815260206004820152601d60248201527f4e6f7420617574686f72697a656420746f2061646420726576656e7565000000604482015260640161084a565b6000811161173a5760405162461bcd60e51b815260206004820152601d60248201527f416d6f756e74206d7573742062652067726561746572207468616e2030000000604482015260640161084a565b600d546040516323b872dd60e01b8152336004820152306024820152604481018390526001600160a01b03909116906323b872dd906064016020604051808303816000875af1158015611791573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117b59190613608565b6117f35760405162461bcd60e51b815260206004820152600f60248201526e151c985b9cd9995c8819985a5b1959608a1b604482015260640161084a565b80601160008282546118059190613688565b9091555050600b54801561162c57600061181f82846137d0565b905060005b82811015611876576000611837826113f7565b90508260156000838152602001908152602001600020600082825461185c9190613688565b9091555082915061186e90508161369b565b915050611824565b50505050565b60006001600160a01b0382166118e65760405162461bcd60e51b815260206004820152602960248201527f4552433732313a2061646472657373207a65726f206973206e6f7420612076616044820152683634b21037bbb732b960b91b606482015260840161084a565b506001600160a01b031660009081526003602052604090205490565b61190a612828565b6119146000612882565b565b61191e612828565b600f55565b60606001805461072c9061350d565b61162c3383836128d4565b611945612828565b600a546040516001600160a01b03909116904780156108fc02916000818181858888f1935050505015801561197e573d6000803e3d6000fd5b50565b61198b3383612638565b6119a75760405162461bcd60e51b815260040161084a90613625565b611876848484846129a2565b6119bb612828565b60008111611a0b5760405162461bcd60e51b815260206004820152601d60248201527f416d6f756e74206d7573742062652067726561746572207468616e2030000000604482015260640161084a565b6101bc81611a18600b5490565b611a229190613688565b1115611a695760405162461bcd60e51b815260206004820152601660248201527545786365656473206d6178696d756d20737570706c7960501b604482015260640161084a565b60005b818110156108eb57611a82600b80546001019055565b6000611a8d600b5490565b905060006040518060800160405280611aa8600b601e61259b565b60ff168152602001611abc6003600761259b565b60ff168152602001611ad0600e602361259b565b60ff90811682526000602092830181905285815260148352604090819020845181549486015192860151606087015191851661ffff1990961695909517610100938516939093029290921763ffff00001916620100009484169490940263ff000000191693909317630100000091909216021790559050611b51858361261e565b50508080611b5e9061369b565b915050611a6c565b6040805160808101825260008082526020808301829052828401829052606083018290528482526002905291909120546001600160a01b0316611be25760405162461bcd60e51b8152602060048201526014602482015273151bdad95b88191bd95cc81b9bdd08195e1a5cdd60621b604482015260640161084a565b506000908152601460209081526040918290208251608081018452905460ff80821683526101008204811693830193909352620100008104831693820193909352630100000090920416606082015290565b611c3c612828565b600e80546001600160a01b0319166001600160a01b0392909216919091179055565b60606000611c6a6129d5565b90506000815111611c8a5760405180602001604052806000815250611cb5565b80611c94846129e4565b604051602001611ca59291906137e4565b6040516020818303038152906040525b9392505050565b33611cc683611630565b6001600160a01b0316148015611cec575033611ce182611630565b6001600160a01b0316145b611d385760405162461bcd60e51b815260206004820152601860248201527f596f75206d757374206f776e20626f746820746f6b656e730000000000000000604482015260640161084a565b601254600083815260166020526040902054611d549190613688565b4211611da25760405162461bcd60e51b815260206004820152601760248201527f546f6b656e203120697320636f6f6c696e6720646f776e000000000000000000604482015260640161084a565b601254600082815260166020526040902054611dbe9190613688565b4211611e0c5760405162461bcd60e51b815260206004820152601760248201527f546f6b656e203220697320636f6f6c696e6720646f776e000000000000000000604482015260640161084a565b601054600d546040516370a0823160e01b81523360048201526001600160a01b03909116906370a0823190602401602060405180830381865afa158015611e57573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e7b91906135ad565b1015611e995760405162461bcd60e51b815260040161084a906135c6565b601054600d54604051636eb1769f60e11b81523360048201523060248201526001600160a01b039091169063dd62ed3e90604401602060405180830381865afa158015611eea573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f0e91906135ad565b1015611f5c5760405162461bcd60e51b815260206004820152601c60248201527f546f6b656e20616c6c6f77616e6365206e6f742070726f766964656400000000604482015260640161084a565b600d54600e546010546040516323b872dd60e01b81523360048201526001600160a01b03928316602482015260448101919091529116906323b872dd906064016020604051808303816000875af1158015611fbb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611fdf9190613608565b506000828152601460208181526040808420815160808082018452915460ff80821683526101008083048216848801526201000080840483168588015263010000009384900483166060808701919091528b8b52988852868a20875196870188525480841687529182048316978601979097529586048116948401949094529093049091169281019290925291612077600543613823565b8251845160029161208e9160ff9182169116613844565b6120989190613866565b6120a29190613844565b905060006120b1600242613823565b6002846020015160ff16866020015160ff166120cd9190613844565b6120d79190613866565b6120e19190613844565b9050600060056120f14243613688565b6120fb9190613823565b6002856040015160ff16876040015160ff166121179190613844565b6121219190613866565b61212b9190613844565b90506000601861213b4243613688565b6121459190613823565b61215090600b613844565b9050600060405180608001604052808660ff1681526020018560ff1681526020018460ff1681526020018360ff16815250905061219f3361218f610d54565b61219a906001613688565b612a77565b60006121aa600b5490565b90506121ba600b80546001019055565b600081815260146020908152604091829020845181549286015184870151606088015160ff90811663010000000263ff0000001992821662010000029290921663ffff0000199382166101000261ffff1990971691909416179490941716179190911790555189908b907fab1231843677f6361dfe40afeef0d1f08712b7ea003cccf9f7d672d36ba0dc20906122539085815260200190565b60405180910390a35050506000968752505060166020525050604080842042908190559284529092205550565b6017546001600160a01b031633146122aa5760405162461bcd60e51b815260040161084a90613547565b600082815260146020526040812080548392906122cb90849060ff16613594565b82546101009290920a60ff818102199093169183160217909155600084815260146020908152604091829020548251838152600893810193909352670a6e8e4cadccee8d60c31b6060840152909216918101919091528391507f75be883731d85564056b35faad71df8364ae8e6c33307193b2c1c2911c95e0f5906080016109d4565b60008061235a8361187c565b116123a75760405162461bcd60e51b815260206004820152601960248201527f5573657220646f65736e2774206f776e20616e79204e46547300000000000000604482015260640161084a565b6000806123b38461187c565b905060005b818110156123ff5760006123cc8683610d95565b6000818152601560205260409020549091506123e88186613688565b9450505080806123f79061369b565b9150506123b8565b50909392505050565b612410612828565b6001600160a01b0381166124755760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161084a565b61197e81612882565b60006001600160e01b031982166380ac58cd60e01b14806124af57506001600160e01b03198216635b5e139f60e01b145b8061071757506301ffc9a760e01b6001600160e01b0319831614610717565b6000818152600260205260409020546001600160a01b031661197e5760405162461bcd60e51b8152602060048201526018602482015277115490cdcc8c4e881a5b9d985b1a59081d1bdad95b88125160421b604482015260640161084a565b600081815260046020526040902080546001600160a01b0319166001600160a01b038416908117909155819061256282611630565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600060ff83166125ab8484613887565b6125b6906001613594565b60ff164244336040516020016125f193929190928352602083019190915260601b6bffffffffffffffffffffffff1916604082015260540190565b6040516020818303038152906040528051906020012060001c61261491906138a0565b611cb59190613688565b61162c828260405180602001604052806000815250612c10565b60008061264483611630565b9050806001600160a01b0316846001600160a01b0316148061268b57506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b806126af5750836001600160a01b03166126a4846107af565b6001600160a01b0316145b949350505050565b826001600160a01b03166126ca82611630565b6001600160a01b0316146126f05760405162461bcd60e51b815260040161084a906138b4565b6001600160a01b0382166127525760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b606482015260840161084a565b61275f8383836001612c43565b826001600160a01b031661277282611630565b6001600160a01b0316146127985760405162461bcd60e51b815260040161084a906138b4565b600081815260046020908152604080832080546001600160a01b03199081169091556001600160a01b0387811680865260038552838620805460001901905590871680865283862080546001019055868652600290945282852080549092168417909155905184937fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b600a546001600160a01b031633146119145760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161084a565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b816001600160a01b0316836001600160a01b0316036129355760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c657200000000000000604482015260640161084a565b6001600160a01b03838116600081815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6129ad8484846126b7565b6129b984848484612d77565b6118765760405162461bcd60e51b815260040161084a906138f9565b6060600c805461072c9061350d565b606060006129f183612e78565b600101905060008167ffffffffffffffff811115612a1157612a116133c6565b6040519080825280601f01601f191660200182016040528015612a3b576020820181803683370190505b5090508181016020015b600019016f181899199a1a9b1b9c1cb0b131b232b360811b600a86061a8153600a8504945084612a4557509392505050565b6001600160a01b038216612acd5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f2061646472657373604482015260640161084a565b6000818152600260205260409020546001600160a01b031615612b325760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000604482015260640161084a565b612b40600083836001612c43565b6000818152600260205260409020546001600160a01b031615612ba55760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000604482015260640161084a565b6001600160a01b038216600081815260036020908152604080832080546001019055848352600290915280822080546001600160a01b0319168417905551839291907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b612c1a8383612a77565b612c276000848484612d77565b6108eb5760405162461bcd60e51b815260040161084a906138f9565b6001811115612cb25760405162461bcd60e51b815260206004820152603560248201527f455243373231456e756d657261626c653a20636f6e7365637574697665207472604482015274185b9cd9995c9cc81b9bdd081cdd5c1c1bdc9d1959605a1b606482015260840161084a565b816001600160a01b038516612d0e57612d0981600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b612d31565b836001600160a01b0316856001600160a01b031614612d3157612d318582612f50565b6001600160a01b038416612d4d57612d4881612fed565b612d70565b846001600160a01b0316846001600160a01b031614612d7057612d70848261309c565b5050505050565b60006001600160a01b0384163b15612e6d57604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290612dbb90339089908890889060040161394b565b6020604051808303816000875af1925050508015612df6575060408051601f3d908101601f19168201909252612df391810190613988565b60015b612e53573d808015612e24576040519150601f19603f3d011682016040523d82523d6000602084013e612e29565b606091505b508051600003612e4b5760405162461bcd60e51b815260040161084a906138f9565b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490506126af565b506001949350505050565b60008072184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b8310612eb75772184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b830492506040015b6d04ee2d6d415b85acef81000000008310612ee3576d04ee2d6d415b85acef8100000000830492506020015b662386f26fc100008310612f0157662386f26fc10000830492506010015b6305f5e1008310612f19576305f5e100830492506008015b6127108310612f2d57612710830492506004015b60648310612f3f576064830492506002015b600a83106107175760010192915050565b60006001612f5d8461187c565b612f6791906139a5565b600083815260076020526040902054909150808214612fba576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b600854600090612fff906001906139a5565b6000838152600960205260408120546008805493945090928490811061302757613027613672565b90600052602060002001549050806008838154811061304857613048613672565b6000918252602080832090910192909255828152600990915260408082208490558582528120556008805480613080576130806139b8565b6001900381819060005260206000200160009055905550505050565b60006130a78361187c565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b6001600160e01b03198116811461197e57600080fd5b60006020828403121561310857600080fd5b8135611cb5816130e0565b60005b8381101561312e578181015183820152602001613116565b50506000910152565b6000815180845261314f816020860160208601613113565b601f01601f19169290920160200192915050565b602081526000611cb56020830184613137565b60006020828403121561318857600080fd5b5035919050565b80356001600160a01b03811681146131a657600080fd5b919050565b600080604083850312156131be57600080fd5b6131c78361318f565b946020939093013593505050565b600080604083850312156131e857600080fd5b82359150602083013560ff8116811461320057600080fd5b809150509250929050565b60008060006060848603121561322057600080fd5b6132298461318f565b92506132376020850161318f565b9150604084013590509250925092565b60008083601f84011261325957600080fd5b50813567ffffffffffffffff81111561327157600080fd5b6020830191508360208260051b850101111561328c57600080fd5b9250929050565b600080600080604085870312156132a957600080fd5b843567ffffffffffffffff808211156132c157600080fd5b6132cd88838901613247565b909650945060208701359150808211156132e657600080fd5b506132f387828801613247565b95989497509550505050565b60006020828403121561331157600080fd5b611cb58261318f565b6000806020838503121561332d57600080fd5b823567ffffffffffffffff8082111561334557600080fd5b818501915085601f83011261335957600080fd5b81358181111561336857600080fd5b86602082850101111561337a57600080fd5b60209290920196919550909350505050565b801515811461197e57600080fd5b600080604083850312156133ad57600080fd5b6133b68361318f565b915060208301356132008161338c565b634e487b7160e01b600052604160045260246000fd5b600080600080608085870312156133f257600080fd5b6133fb8561318f565b93506134096020860161318f565b925060408501359150606085013567ffffffffffffffff8082111561342d57600080fd5b818701915087601f83011261344157600080fd5b813581811115613453576134536133c6565b604051601f8201601f19908116603f0116810190838211818310171561347b5761347b6133c6565b816040528281528a602084870101111561349457600080fd5b82602086016020830137600060208483010152809550505050505092959194509250565b600080604083850312156134cb57600080fd5b50508035926020909101359150565b600080604083850312156134ed57600080fd5b6134f68361318f565b91506135046020840161318f565b90509250929050565b600181811c9082168061352157607f821691505b60208210810361354157634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252601e908201527f4e6f7420617574686f72697a656420746f206d6f646966792073746174730000604082015260600190565b634e487b7160e01b600052601160045260246000fd5b60ff81811683821601908111156107175761071761357e565b6000602082840312156135bf57600080fd5b5051919050565b60208082526022908201527f496e73756666696369656e74207061796d656e7420746f6b656e2062616c616e604082015261636560f01b606082015260800190565b60006020828403121561361a57600080fd5b8151611cb58161338c565b6020808252602d908201527f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560408201526c1c881bdc88185c1c1c9bdd9959609a1b606082015260800190565b634e487b7160e01b600052603260045260246000fd5b808201808211156107175761071761357e565b6000600182016136ad576136ad61357e565b5060010190565b601f8211156108eb57600081815260208120601f850160051c810160208610156136db5750805b601f850160051c820191505b818110156110a7578281556001016136e7565b67ffffffffffffffff831115613712576137126133c6565b61372683613720835461350d565b836136b4565b6000601f84116001811461375a57600085156137425750838201355b600019600387901b1c1916600186901b178355612d70565b600083815260209020601f19861690835b8281101561378b578685013582556020948501946001909201910161376b565b50868210156137a85760001960f88860031b161c19848701351681555b505060018560011b0183555050505050565b634e487b7160e01b600052601260045260246000fd5b6000826137df576137df6137ba565b500490565b600083516137f6818460208801613113565b83519083019061380a818360208801613113565b64173539b7b760d91b9101908152600501949350505050565b600061ffff80841680613838576138386137ba565b92169190910692915050565b61ffff81811683821601908082111561385f5761385f61357e565b5092915050565b600061ffff8084168061387b5761387b6137ba565b92169190910492915050565b60ff82811682821603908111156107175761071761357e565b6000826138af576138af6137ba565b500690565b60208082526025908201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060408201526437bbb732b960d91b606082015260800190565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061397e90830184613137565b9695505050505050565b60006020828403121561399a57600080fd5b8151611cb5816130e0565b818103818111156107175761071761357e565b634e487b7160e01b600052603160045260246000fdfea2646970667358221220e236cc359156e6e36bfcbcb22e555963f99a0b952773c88b1dc429256df369b864736f6c63430008110033
Deployed Bytecode Sourcemap
69658:12462:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;63643:224;;;;;;:::i;:::-;;:::i;:::-;;;565:14:1;;558:22;540:41;;528:2;513:18;63643:224:0;;;;;;;;47692:100;;;:::i;:::-;;;;;;;:::i;49204:171::-;;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;1697:32:1;;;1679:51;;1667:2;1652:18;49204:171:0;1533:203:1;48722:416:0;;;;;;:::i;:::-;;:::i;:::-;;70506:50;;;;;;;;;2324:25:1;;;2312:2;2297:18;70506:50:0;2178:177:1;80589:212:0;;;;;;:::i;:::-;;:::i;72309:943::-;;;:::i;71529:140::-;;;:::i;49904:301::-;;;;;;:::i;:::-;;:::i;70459:40::-;;;;;;63951:256;;;;;;:::i;:::-;;:::i;70110:79::-;;;;;-1:-1:-1;;;;;70110:79:0;;;70281:40;;70318:3;70281:40;;74071:1416;;;;;;:::i;:::-;;:::i;81244:125::-;;;;;;:::i;:::-;;:::i;50276:151::-;;;;;;:::i;:::-;;:::i;79983:98::-;;;;;;:::i;:::-;;:::i;70196:72::-;;;;;-1:-1:-1;;;;;70196:72:0;;;80327:254;;;;;;:::i;:::-;;:::i;81727:131::-;;;;;;:::i;:::-;;:::i;78573:860::-;;;:::i;64473:233::-;;;;;;:::i;:::-;;:::i;81377:116::-;;;;;;:::i;:::-;;:::i;72183:118::-;;;;;;:::i;:::-;;:::i;81000:112::-;;;;;;:::i;:::-;;:::i;81501:218::-;;;;;;:::i;:::-;;:::i;47402:223::-;;;;;;:::i;:::-;;:::i;77796:769::-;;;;;;:::i;:::-;;:::i;47133:207::-;;;;;;:::i;:::-;;:::i;25022:103::-;;;:::i;81994:123::-;;;;;;:::i;:::-;;:::i;24381:87::-;24454:6;;-1:-1:-1;;;;;24454:6:0;24381:87;;47861:104;;;:::i;70328:42::-;;;;;;49447:155;;;;;;:::i;:::-;;:::i;81120:116::-;;;:::i;70621:53::-;;;;;;:::i;:::-;;;;;;;;;;;;;;50498:279;;;;;;:::i;:::-;;:::i;70425:27::-;;;;;;73260:803;;;;;;:::i;:::-;;:::i;70681:51::-;;;;;;:::i;:::-;;;;;;;;;;;;;;80809:183;;;;;;:::i;:::-;;:::i;:::-;;;;;;7050:4:1;7092:3;7081:9;7077:19;7069:27;;7142:4;7133:6;7127:13;7123:24;7112:9;7105:43;7216:4;7208;7200:6;7196:17;7190:24;7186:35;7179:4;7168:9;7164:20;7157:65;7290:4;7282;7274:6;7270:17;7264:24;7260:35;7253:4;7242:9;7238:20;7231:65;7364:4;7356;7348:6;7344:17;7338:24;7334:35;7327:4;7316:9;7312:20;7305:65;6912:464;;;;;81866:120:0;;;;;;:::i;:::-;;:::i;70377:41::-;;;;;;71795:271;;;;;;:::i;:::-;;:::i;75495:2063::-;;;;;;:::i;:::-;;:::i;80089:230::-;;;;;;:::i;:::-;;:::i;79441:534::-;;;;;;:::i;:::-;;:::i;49673:164::-;;;;;;:::i;:::-;-1:-1:-1;;;;;49794:25:0;;;49770:4;49794:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;49673:164;25280:201;;;;;;:::i;:::-;;:::i;63643:224::-;63745:4;-1:-1:-1;;;;;;63769:50:0;;-1:-1:-1;;;63769:50:0;;:90;;;63823:36;63847:11;63823:23;:36::i;:::-;63762:97;63643:224;-1:-1:-1;;63643:224:0:o;47692:100::-;47746:13;47779:5;47772:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47692:100;:::o;49204:171::-;49280:7;49300:23;49315:7;49300:14;:23::i;:::-;-1:-1:-1;49343:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;49343:24:0;;49204:171::o;48722:416::-;48803:13;48819:23;48834:7;48819:14;:23::i;:::-;48803:39;;48867:5;-1:-1:-1;;;;;48861:11:0;:2;-1:-1:-1;;;;;48861:11:0;;48853:57;;;;-1:-1:-1;;;48853:57:0;;8486:2:1;48853:57:0;;;8468:21:1;8525:2;8505:18;;;8498:30;8564:34;8544:18;;;8537:62;-1:-1:-1;;;8615:18:1;;;8608:31;8656:19;;48853:57:0;;;;;;;;;23012:10;-1:-1:-1;;;;;48945:21:0;;;;:62;;-1:-1:-1;48970:37:0;48987:5;23012:10;49673:164;:::i;48970:37::-;48923:173;;;;-1:-1:-1;;;48923:173:0;;8888:2:1;48923:173:0;;;8870:21:1;8927:2;8907:18;;;8900:30;8966:34;8946:18;;;8939:62;9037:31;9017:18;;;9010:59;9086:19;;48923:173:0;8686:425:1;48923:173:0;49109:21;49118:2;49122:7;49109:8;:21::i;:::-;48792:346;48722:416;;:::o;80589:212::-;71245:21;;-1:-1:-1;;;;;71245:21:0;71231:10;:35;71223:78;;;;-1:-1:-1;;;71223:78:0;;;;;;;:::i;:::-;80680:20:::1;::::0;;;:11:::1;:20;::::0;;;;:40;;80710:10;;80680:20;:26:::1;::::0;:40:::1;::::0;80710:10;;80680:40;;::::1;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;80748:7;80736:57;80766:11;:20;80778:7;80766:20;;;;;;;;;;;:26;;;;;;;;;;;;80736:57;;;;;9986:2:1::0;9968:21;;;10025:1;10005:18;;;9998:29;-1:-1:-1;;;10058:2:1;10043:18;;10036:35;10157:4;10145:17;;;;10138:4;10123:20;;10116:47;10103:3;10088:19;;9760:409;80736:57:0::1;;;;;;;;80589:212:::0;;:::o;72309:943::-;70318:3;72353:25;:15;4430:14;;4338:114;72353:25;:38;72345:73;;;;-1:-1:-1;;;72345:73:0;;10376:2:1;72345:73:0;;;10358:21:1;10415:2;10395:18;;;10388:30;-1:-1:-1;;;10434:18:1;;;10427:52;10496:18;;72345:73:0;10174:346:1;72345:73:0;72475:12;;72437;;:34;;-1:-1:-1;;;72437:34:0;;72460:10;72437:34;;;1679:51:1;-1:-1:-1;;;;;72437:12:0;;;;:22;;1652:18:1;;72437:34:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:50;;72429:97;;;;-1:-1:-1;;;72429:97:0;;;;;;;:::i;:::-;72598:12;;72545;;:49;;-1:-1:-1;;;72545:49:0;;72568:10;72545:49;;;11329:34:1;72588:4:0;11379:18:1;;;11372:43;-1:-1:-1;;;;;72545:12:0;;;;:22;;11264:18:1;;72545:49:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:65;;72537:106;;;;-1:-1:-1;;;72537:106:0;;11628:2:1;72537:106:0;;;11610:21:1;11667:2;11647:18;;;11640:30;11706;11686:18;;;11679:58;11754:18;;72537:106:0;11426:352:1;72537:106:0;72656:12;;72694;;72708;;72656:65;;-1:-1:-1;;;72656:65:0;;72682:10;72656:65;;;12023:34:1;-1:-1:-1;;;;;72694:12:0;;;12073:18:1;;;12066:43;12125:18;;;12118:34;;;;72656:12:0;;;:25;;11958:18:1;;72656:65:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;72734:27;:15;4549:19;;4567:1;4549:19;;;4460:127;72734:27;72772:18;72793:25;:15;4430:14;;4338:114;72793:25;72772:46;;72831:21;72855:198;;;;;;;;72886:27;72906:2;72910;72886:19;:27::i;:::-;72855:198;;;;;;72942:25;72962:1;72965;72942:19;:25::i;:::-;72855:198;;;;;;72989:27;73009:2;73013;72989:19;:27::i;:::-;72855:198;;;;;;73040:1;72855:198;;;;;;;73064:23;;;:11;:23;;;;;;;:34;;;;;;;;;;;;;;;;;;;-1:-1:-1;;73064:34:0;;;;;;;;;;;;;;;;;;;-1:-1:-1;;73064:34:0;;;;;;;;;-1:-1:-1;;73064:34:0;;;;;;;;;;;;;;;-1:-1:-1;73111:33:0;73121:10;73064:23;73111:9;:33::i;:::-;73162:82;73169:8;:17;;;73188:8;:21;;;73211:8;:14;;;73227:8;:16;;;73162:82;;;;;;;;12666:4:1;12654:17;;;12636:36;;12708:17;;;12703:2;12688:18;;12681:45;12762:17;;;12757:2;12742:18;;12735:45;12816:17;;;12811:2;12796:18;;12789:45;12623:3;12608:19;;12413:427;73162:82:0;;;;;;;;72334:918;;72309:943::o;71529:140::-;71615:7;71642:19;64371:10;:17;;64283:113;71642:19;71635:26;;71529:140;:::o;49904:301::-;50065:41;23012:10;50098:7;50065:18;:41::i;:::-;50057:99;;;;-1:-1:-1;;;50057:99:0;;;;;;;:::i;:::-;50169:28;50179:4;50185:2;50189:7;50169:9;:28::i;63951:256::-;64048:7;64084:23;64101:5;64084:16;:23::i;:::-;64076:5;:31;64068:87;;;;-1:-1:-1;;;64068:87:0;;13461:2:1;64068:87:0;;;13443:21:1;13500:2;13480:18;;;13473:30;13539:34;13519:18;;;13512:62;-1:-1:-1;;;13590:18:1;;;13583:41;13641:19;;64068:87:0;13259:407:1;64068:87:0;-1:-1:-1;;;;;;64173:19:0;;;;;;;;:12;:19;;;;;;;;:26;;;;;;;;;63951:256::o;74071:1416::-;24267:13;:11;:13::i;:::-;74200:36;;::::1;74192:100;;;::::0;-1:-1:-1;;;74192:100:0;;13873:2:1;74192:100:0::1;::::0;::::1;13855:21:1::0;13912:2;13892:18;;;13885:30;13951:34;13931:18;;;13924:62;-1:-1:-1;;;14002:18:1;;;13995:49;14061:19;;74192:100:0::1;13671:415:1::0;74192:100:0::1;74303:17;74406:6:::0;74401:92:::1;74418:18:::0;;::::1;74401:92;;;74471:7;;74479:1;74471:10;;;;;;;:::i;:::-;;;;;;;74458:23;;;;;:::i;:::-;::::0;-1:-1:-1;74438:3:0;::::1;::::0;::::1;:::i;:::-;;;;74401:92;;;;70318:3;74589:9;74561:25;:15;4430:14:::0;;4338:114;74561:25:::1;:37;;;;:::i;:::-;:51;;74553:86;;;::::0;-1:-1:-1;;;74553:86:0;;14695:2:1;74553:86:0::1;::::0;::::1;14677:21:1::0;14734:2;14714:18;;;14707:30;-1:-1:-1;;;14753:18:1;;;14746:52;14815:18;;74553:86:0::1;14493:346:1::0;74553:86:0::1;74719:6;74714:766;74731:22:::0;;::::1;74714:766;;;74775:10;74788:11;;74800:1;74788:14;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;74775:27;;74817:14;74834:7;;74842:1;74834:10;;;;;;;:::i;:::-;;;;;;;74817:27;;74866:9;74861:608;74885:6;74881:1;:10;74861:608;;;74917:27;:15;4549:19:::0;;4567:1;4549:19;;;4460:127;74917:27:::1;74963:18;74984:25;:15;4430:14:::0;;4338:114;74984:25:::1;74963:46;;75092:21;75116:238;;;;;;;;75155:27;75175:2;75179;75155:19;:27::i;:::-;75116:238;;;;;;75219:25;75239:1;75242;75219:19;:25::i;:::-;75116:238;;;;;;75274:27;75294:2;75298;75274:19;:27::i;:::-;75116:238;::::0;;::::1;::::0;;75333:1:::1;75116:238;::::0;;::::1;::::0;;;75373:23;;;:11:::1;:23:::0;;;;;;;:34;;;;;;::::1;::::0;;;::::1;::::0;::::1;::::0;::::1;::::0;;;::::1;-1:-1:-1::0;;75373:34:0;;;;;;;::::1;::::0;;::::1;::::0;;;::::1;::::0;;;::::1;-1:-1:-1::0;;75373:34:0;;;;::::1;::::0;;;::::1;-1:-1:-1::0;;75373:34:0;;;;;;;;;::::1;;;::::0;;;-1:-1:-1;75428:25:0::1;75438:2:::0;75373:23;75428:9:::1;:25::i;:::-;74898:571;;74893:3;;;;;:::i;:::-;;;;74861:608;;;;74760:720;;74755:3;;;;;:::i;:::-;;;;74714:766;;;;74181:1306;74071:1416:::0;;;;:::o;81244:125::-;24267:13;:11;:13::i;:::-;81327:21:::1;:34:::0;;-1:-1:-1;;;;;;81327:34:0::1;-1:-1:-1::0;;;;;81327:34:0;;;::::1;::::0;;;::::1;::::0;;81244:125::o;50276:151::-;50380:39;50397:4;50403:2;50407:7;50380:39;;;;;;;;;;;;:16;:39::i;79983:98::-;24267:13;:11;:13::i;:::-;80053:11:::1;:20:::0;79983:98::o;80327:254::-;71245:21;;-1:-1:-1;;;;;71245:21:0;71231:10;:35;71223:78;;;;-1:-1:-1;;;71223:78:0;;;;;;;:::i;:::-;80432:20:::1;::::0;;;:11:::1;:20;::::0;;;;:54;;80469:17;;80432:20;:33:::1;::::0;:54:::1;::::0;80469:17;;80432:54:::1;::::0;::::1;;;;:::i;:::-;::::0;;::::1;::::0;;::::1;;::::0;;::::1;::::0;;::::1;::::0;;::::1;;::::0;;::::1;;::::0;;;-1:-1:-1;80539:20:0;;;:11:::1;:20;::::0;;;;;;;;:33;80502:71;;15052:21:1;;;15109:2;15089:18;;;15082:30;;;;-1:-1:-1;;;15143:2:1;15128:18;;15121:42;80539:33:0;;;::::1;::::0;;::::1;15215:20:1::0;;;15208:47;80514:7:0;;-1:-1:-1;80502:71:0::1;::::0;15195:3:1;15180:19;80502:71:0::1;14844:417:1::0;81727:131:0;24267:13;:11;:13::i;:::-;81811:12:::1;:39:::0;;-1:-1:-1;;;;;;81811:39:0::1;-1:-1:-1::0;;;;;81811:39:0;;;::::1;::::0;;;::::1;::::0;;81727:131::o;78573:860::-;78642:1;78618:21;78628:10;78618:9;:21::i;:::-;:25;78610:60;;;;-1:-1:-1;;;78610:60:0;;15468:2:1;78610:60:0;;;15450:21:1;15507:2;15487:18;;;15480:30;-1:-1:-1;;;15526:18:1;;;15519:52;15588:18;;78610:60:0;15266:346:1;78610:60:0;78683:28;78726:20;78749:21;78759:10;78749:9;:21::i;:::-;78726:44;;78788:9;78783:488;78807:12;78803:1;:16;78783:488;;;78841:15;78859:34;78879:10;78891:1;78859:19;:34::i;:::-;78908:23;78934:27;;;:18;:27;;;;;;78841:52;;-1:-1:-1;78982:19:0;;78978:282;;79030:12;;:50;;-1:-1:-1;;;79030:50:0;;79052:10;79030:50;;;15791:51:1;15858:18;;;15851:34;;;-1:-1:-1;;;;;79030:12:0;;;;:21;;15764:18:1;;79030:50:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;79022:78;;;;-1:-1:-1;;;79022:78:0;;16098:2:1;79022:78:0;;;16080:21:1;16137:2;16117:18;;;16110:30;-1:-1:-1;;;16156:18:1;;;16149:45;16211:18;;79022:78:0;15896:339:1;79022:78:0;79149:1;79119:27;;;:18;:27;;;;;:31;79205:39;79229:15;79205:39;;:::i;:::-;;;78978:282;78826:445;;78821:3;;;;;:::i;:::-;;;;78783:488;;;;79314:1;79291:20;:24;79283:55;;;;-1:-1:-1;;;79283:55:0;;16442:2:1;79283:55:0;;;16424:21:1;16481:2;16461:18;;;16454:30;-1:-1:-1;;;16500:18:1;;;16493:48;16558:18;;79283:55:0;16240:342:1;79283:55:0;79364:61;;;16761:25:1;;;16817:2;16802:18;;16795:34;;;79378:10:0;;79364:61;;16734:18:1;79364:61:0;16587:248:1;64473:233:0;64548:7;64584:30;64371:10;:17;;64283:113;64584:30;64576:5;:38;64568:95;;;;-1:-1:-1;;;64568:95:0;;17042:2:1;64568:95:0;;;17024:21:1;17081:2;17061:18;;;17054:30;17120:34;17100:18;;;17093:62;-1:-1:-1;;;17171:18:1;;;17164:42;17223:19;;64568:95:0;16840:408:1;64568:95:0;64681:10;64692:5;64681:17;;;;;;;;:::i;:::-;;;;;;;;;64674:24;;64473:233;;;:::o;81377:116::-;24267:13;:11;:13::i;:::-;81459::::1;:26:::0;;-1:-1:-1;;;;;;81459:26:0::1;-1:-1:-1::0;;;;;81459:26:0;;;::::1;::::0;;;::::1;::::0;;81377:116::o;72183:118::-;24267:13;:11;:13::i;:::-;72262:16:::1;:31:::0;72183:118::o;81000:112::-;24267:13;:11;:13::i;:::-;81078::::1;:26;81094:10:::0;;81078:13;:26:::1;:::i;81501:218::-:0;24267:13;:11;:13::i;:::-;81584:12:::1;::::0;:37:::1;::::0;-1:-1:-1;;;81584:37:0;;81615:4:::1;81584:37;::::0;::::1;1679:51:1::0;81625:6:0;;-1:-1:-1;;;;;81584:12:0::1;::::0;:22:::1;::::0;1652:18:1;;81584:37:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:47;;81576:86;;;::::0;-1:-1:-1;;;81576:86:0;;19513:2:1;81576:86:0::1;::::0;::::1;19495:21:1::0;19552:2;19532:18;;;19525:30;19591:28;19571:18;;;19564:56;19637:18;;81576:86:0::1;19311:350:1::0;81576:86:0::1;81673:12;::::0;-1:-1:-1;;;;;81673:12:0::1;:21;81695:7;24454:6:::0;;-1:-1:-1;;;;;24454:6:0;;24381:87;81695:7:::1;81673:38;::::0;-1:-1:-1;;;;;;81673:38:0::1;::::0;;;;;;-1:-1:-1;;;;;15809:32:1;;;81673:38:0::1;::::0;::::1;15791:51:1::0;15858:18;;;15851:34;;;15764:18;;81673:38:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;81501:218:::0;:::o;47402:223::-;47474:7;52135:16;;;:7;:16;;;;;;-1:-1:-1;;;;;52135:16:0;;47538:56;;;;-1:-1:-1;;;47538:56:0;;19868:2:1;47538:56:0;;;19850:21:1;19907:2;19887:18;;;19880:30;-1:-1:-1;;;19926:18:1;;;19919:54;19990:18;;47538:56:0;19666:348:1;77796:769:0;71390:13;;-1:-1:-1;;;;;71390:13:0;71376:10;:27;71368:69;;;;-1:-1:-1;;;71368:69:0;;20221:2:1;71368:69:0;;;20203:21:1;20260:2;20240:18;;;20233:30;20299:31;20279:18;;;20272:59;20348:18;;71368:69:0;20019:353:1;71368:69:0;77886:1:::1;77877:6;:10;77869:52;;;::::0;-1:-1:-1;;;77869:52:0;;20579:2:1;77869:52:0::1;::::0;::::1;20561:21:1::0;20618:2;20598:18;;;20591:30;20657:31;20637:18;;;20630:59;20706:18;;77869:52:0::1;20377:353:1::0;77869:52:0::1;77940:12;::::0;:60:::1;::::0;-1:-1:-1;;;77940:60:0;;77966:10:::1;77940:60;::::0;::::1;12023:34:1::0;77986:4:0::1;12073:18:1::0;;;12066:43;12125:18;;;12118:34;;;-1:-1:-1;;;;;77940:12:0;;::::1;::::0;:25:::1;::::0;11958:18:1;;77940:60:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;77932:88;;;::::0;-1:-1:-1;;;77932:88:0;;16098:2:1;77932:88:0::1;::::0;::::1;16080:21:1::0;16137:2;16117:18;;;16110:30;-1:-1:-1;;;16156:18:1;;;16149:45;16211:18;;77932:88:0::1;15896:339:1::0;77932:88:0::1;78090:6;78074:12;;:22;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;78184:15:0::1;4430:14:::0;78224:13;;78220:338:::1;;78254:23;78280:18;78289:9:::0;78280:6;:18:::1;:::i;:::-;78254:44;;78379:9;78374:173;78398:9;78394:1;:13;78374:173;;;78433:15;78451;78464:1;78451:12;:15::i;:::-;78433:33;;78516:15;78485:18;:27;78504:7;78485:27;;;;;;;;;;;;:46;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;78409:3:0;;-1:-1:-1;78409:3:0::1;::::0;-1:-1:-1;78409:3:0;::::1;:::i;:::-;;;;78374:173;;;;78239:319;77858:707;77796:769:::0;:::o;47133:207::-;47205:7;-1:-1:-1;;;;;47233:19:0;;47225:73;;;;-1:-1:-1;;;47225:73:0;;21194:2:1;47225:73:0;;;21176:21:1;21233:2;21213:18;;;21206:30;21272:34;21252:18;;;21245:62;-1:-1:-1;;;21323:18:1;;;21316:39;21372:19;;47225:73:0;20992:405:1;47225:73:0;-1:-1:-1;;;;;;47316:16:0;;;;;:9;:16;;;;;;;47133:207::o;25022:103::-;24267:13;:11;:13::i;:::-;25087:30:::1;25114:1;25087:18;:30::i;:::-;25022:103::o:0;81994:123::-;24267:13;:11;:13::i;:::-;82078:12:::1;:31:::0;81994:123::o;47861:104::-;47917:13;47950:7;47943:14;;;;;:::i;49447:155::-;49542:52;23012:10;49575:8;49585;49542:18;:52::i;81120:116::-;24267:13;:11;:13::i;:::-;24454:6;;81180:48:::1;::::0;-1:-1:-1;;;;;24454:6:0;;;;81206:21:::1;81180:48:::0;::::1;;;::::0;::::1;::::0;;;81206:21;24454:6;81180:48;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;81120:116::o:0;50498:279::-;50629:41;23012:10;50662:7;50629:18;:41::i;:::-;50621:99;;;;-1:-1:-1;;;50621:99:0;;;;;;;:::i;:::-;50731:38;50745:4;50751:2;50755:7;50764:4;50731:13;:38::i;73260:803::-;24267:13;:11;:13::i;:::-;73358:1:::1;73349:6;:10;73341:52;;;::::0;-1:-1:-1;;;73341:52:0;;20579:2:1;73341:52:0::1;::::0;::::1;20561:21:1::0;20618:2;20598:18;;;20591:30;20657:31;20637:18;;;20630:59;20706:18;;73341:52:0::1;20377:353:1::0;73341:52:0::1;70318:3;73440:6;73412:25;:15;4430:14:::0;;4338:114;73412:25:::1;:34;;;;:::i;:::-;:48;;73404:83;;;::::0;-1:-1:-1;;;73404:83:0;;14695:2:1;73404:83:0::1;::::0;::::1;14677:21:1::0;14734:2;14714:18;;;14707:30;-1:-1:-1;;;14753:18:1;;;14746:52;14815:18;;73404:83:0::1;14493:346:1::0;73404:83:0::1;73505:9;73500:556;73524:6;73520:1;:10;73500:556;;;73552:27;:15;4549:19:::0;;4567:1;4549:19;;;4460:127;73552:27:::1;73594:18;73615:25;:15;4430:14:::0;;4338:114;73615:25:::1;73594:46;;73711:21;73735:218;;;;;;;;73770:27;73790:2;73794;73770:19;:27::i;:::-;73735:218;;;;;;73830:25;73850:1;73853;73830:19;:25::i;:::-;73735:218;;;;;;73881:27;73901:2;73905;73881:19;:27::i;:::-;73735:218;::::0;;::::1;::::0;;73936:1:::1;73735:218;::::0;;::::1;::::0;;;73968:23;;;:11:::1;:23:::0;;;;;;;:34;;;;;;::::1;::::0;;;::::1;::::0;::::1;::::0;::::1;::::0;;;::::1;-1:-1:-1::0;;73968:34:0;;;;;;;::::1;::::0;;::::1;::::0;;;::::1;::::0;;;::::1;-1:-1:-1::0;;73968:34:0;;;;::::1;::::0;;;::::1;-1:-1:-1::0;;73968:34:0;;;;;;;;;::::1;;;::::0;;;-1:-1:-1;74019:25:0::1;74029:2:::0;73968:23;74019:9:::1;:25::i;:::-;73537:519;;73532:3;;;;;:::i;:::-;;;;73500:556;;80809:183:::0;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52135:16:0;;;:7;:16;;;;;;;-1:-1:-1;;;;;52135:16:0;80897:49;;;;-1:-1:-1;;;80897:49:0;;21604:2:1;80897:49:0;;;21586:21:1;21643:2;21623:18;;;21616:30;-1:-1:-1;;;21662:18:1;;;21655:50;21722:18;;80897:49:0;21402:344:1;80897:49:0;-1:-1:-1;80964:20:0;;;;:11;:20;;;;;;;;;80957:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;80809:183::o;81866:120::-;24267:13;:11;:13::i;:::-;81948:12:::1;:30:::0;;-1:-1:-1;;;;;;81948:30:0::1;-1:-1:-1::0;;;;;81948:30:0;;;::::1;::::0;;;::::1;::::0;;81866:120::o;71795:271::-;71868:13;71894:18;71915:10;:8;:10::i;:::-;71894:31;;71964:1;71949:4;71943:18;:22;:115;;;;;;;;;;;;;;;;;72005:4;72011:18;:7;:16;:18::i;:::-;71988:51;;;;;;;;;:::i;:::-;;;;;;;;;;;;;71943:115;71936:122;71795:271;-1:-1:-1;;;71795:271:0:o;75495:2063::-;75595:10;75574:17;75582:8;75574:7;:17::i;:::-;-1:-1:-1;;;;;75574:31:0;;:66;;;;-1:-1:-1;75630:10:0;75609:17;75617:8;75609:7;:17::i;:::-;-1:-1:-1;;;;;75609:31:0;;75574:66;75566:103;;;;-1:-1:-1;;;75566:103:0;;22621:2:1;75566:103:0;;;22603:21:1;22660:2;22640:18;;;22633:30;22699:26;22679:18;;;22672:54;22743:18;;75566:103:0;22419:348:1;75566:103:0;75735:16;;75706:26;;;;:16;:26;;;;;;:45;;75735:16;75706:45;:::i;:::-;75688:15;:63;75680:99;;;;-1:-1:-1;;;75680:99:0;;22974:2:1;75680:99:0;;;22956:21:1;23013:2;22993:18;;;22986:30;23052:25;23032:18;;;23025:53;23095:18;;75680:99:0;22772:347:1;75680:99:0;75845:16;;75816:26;;;;:16;:26;;;;;;:45;;75845:16;75816:45;:::i;:::-;75798:15;:63;75790:99;;;;-1:-1:-1;;;75790:99:0;;23326:2:1;75790:99:0;;;23308:21:1;23365:2;23345:18;;;23338:30;23404:25;23384:18;;;23377:53;23447:18;;75790:99:0;23124:347:1;75790:99:0;75946:11;;75908:12;;:34;;-1:-1:-1;;;75908:34:0;;75931:10;75908:34;;;1679:51:1;-1:-1:-1;;;;;75908:12:0;;;;:22;;1652:18:1;;75908:34:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:49;;75900:96;;;;-1:-1:-1;;;75900:96:0;;;;;;;:::i;:::-;76068:11;;76015:12;;:49;;-1:-1:-1;;;76015:49:0;;76038:10;76015:49;;;11329:34:1;76058:4:0;11379:18:1;;;11372:43;-1:-1:-1;;;;;76015:12:0;;;;:22;;11264:18:1;;76015:49:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:64;;76007:105;;;;-1:-1:-1;;;76007:105:0;;11628:2:1;76007:105:0;;;11610:21:1;11667:2;11647:18;;;11640:30;11706;11686:18;;;11679:58;11754:18;;76007:105:0;11426:352:1;76007:105:0;76171:12;;76209;;76223:11;;76171:64;;-1:-1:-1;;;76171:64:0;;76197:10;76171:64;;;12023:34:1;-1:-1:-1;;;;;76209:12:0;;;12073:18:1;;;12066:43;12125:18;;;12118:34;;;;76171:12:0;;;:25;;11958:18:1;;76171:64:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;76338:19:0;76360:21;;;:11;:21;;;;;;;;76338:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;76414:21;;;;;;;;;76392:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;76338;76533:24;76556:1;76540:12;76533:24;:::i;:::-;76508:15;;76482;;76528:1;;76475:49;;76501:23;;;;;76475;:49;:::i;:::-;76474:55;;;;:::i;:::-;:84;;;;:::i;:::-;76448:111;-1:-1:-1;76570:21:0;76667:27;76693:1;76674:15;76667:27;:::i;:::-;76662:1;76638:6;:19;;;76631:27;;76608:6;:19;;;76601:27;;:57;;;;:::i;:::-;76600:63;;;;:::i;:::-;:95;;;;:::i;:::-;76570:126;-1:-1:-1;76707:14:0;76824:1;76790:30;76805:15;76790:12;:30;:::i;:::-;76783:42;;;;:::i;:::-;76778:1;76761:6;:12;;;76754:20;;76738:6;:12;;;76731:20;;:43;;;;:::i;:::-;76730:49;;;;:::i;:::-;:96;;;;:::i;:::-;76707:120;-1:-1:-1;76923:16:0;76995:2;76961:30;76976:15;76961:12;:30;:::i;:::-;76954:43;;;;:::i;:::-;76948:50;;:2;:50;:::i;:::-;76923:76;;77012:21;77036:57;;;;;;;;77042:11;77036:57;;;;;;77055:15;77036:57;;;;;;77072:8;77036:57;;;;;;77082:10;77036:57;;;;;77012:81;;77137:36;77143:10;77155:13;:11;:13::i;:::-;:17;;77171:1;77155:17;:::i;:::-;77137:5;:36::i;:::-;77184:18;77205:25;:15;4430:14;;4338:114;77205:25;77184:46;;77241:27;:15;4549:19;;4567:1;4549:19;;;4460:127;77241:27;77279:23;;;;:11;:23;;;;;;;;;:34;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;77279:34:0;;;;;;;;;-1:-1:-1;;77279:34:0;;;;;-1:-1:-1;;77279:34:0;;;;;;;;;;;;;;;;;;;;77357:43;77379:8;;77369;;77357:43;;;;77291:10;2324:25:1;;2312:2;2297:18;;2178:177;77357:43:0;;;;;;;;-1:-1:-1;;;77451:26:0;;;;-1:-1:-1;;77451:16:0;:26;;-1:-1:-1;;77451:26:0;;;;77480:15;77451:44;;;;77506:26;;;;;;:44;-1:-1:-1;75495:2063:0:o;80089:230::-;71245:21;;-1:-1:-1;;;;;71245:21:0;71231:10;:35;71223:78;;;;-1:-1:-1;;;71223:78:0;;;;;;;:::i;:::-;80186:20:::1;::::0;;;:11:::1;:20;::::0;;;;:46;;80219:13;;80186:20;:46:::1;::::0;80219:13;;80186:46:::1;;;:::i;:::-;::::0;;::::1;::::0;;;::::1;;::::0;;::::1;;::::0;;::::1;::::0;;::::1;;;::::0;;;-1:-1:-1;80281:20:0;;;:11:::1;:20;::::0;;;;;;;;:29;80248:63;;24233:21:1;;;24290:1;24270:18;;;24263:29;;;;-1:-1:-1;;;24323:2:1;24308:18;;24301:38;80281:29:0;;::::1;24391:20:1::0;;;24384:47;;;;80281:20:0;;-1:-1:-1;80248:63:0::1;::::0;24371:3:1;24356:19;80248:63:0::1;24025:412:1::0;79441:534:0;79506:7;79552:1;79534:15;79544:4;79534:9;:15::i;:::-;:19;79526:57;;;;-1:-1:-1;;;79526:57:0;;24644:2:1;79526:57:0;;;24626:21:1;24683:2;24663:18;;;24656:30;24722:27;24702:18;;;24695:55;24767:18;;79526:57:0;24442:349:1;79526:57:0;79596:28;79639:20;79662:15;79672:4;79662:9;:15::i;:::-;79639:38;;79695:9;79690:238;79714:12;79710:1;:16;79690:238;;;79748:15;79766:28;79786:4;79792:1;79766:19;:28::i;:::-;79809:23;79835:27;;;:18;:27;;;;;;79748:46;;-1:-1:-1;79877:39:0;79835:27;79877:39;;:::i;:::-;;;79733:195;;79728:3;;;;;:::i;:::-;;;;79690:238;;;-1:-1:-1;79947:20:0;;79441:534;-1:-1:-1;;;79441:534:0:o;25280:201::-;24267:13;:11;:13::i;:::-;-1:-1:-1;;;;;25369:22:0;::::1;25361:73;;;::::0;-1:-1:-1;;;25361:73:0;;24998:2:1;25361:73:0::1;::::0;::::1;24980:21:1::0;25037:2;25017:18;;;25010:30;25076:34;25056:18;;;25049:62;-1:-1:-1;;;25127:18:1;;;25120:36;25173:19;;25361:73:0::1;24796:402:1::0;25361:73:0::1;25445:28;25464:8;25445:18;:28::i;46764:305::-:0;46866:4;-1:-1:-1;;;;;;46903:40:0;;-1:-1:-1;;;46903:40:0;;:105;;-1:-1:-1;;;;;;;46960:48:0;;-1:-1:-1;;;46960:48:0;46903:105;:158;;;-1:-1:-1;;;;;;;;;;38417:40:0;;;47025:36;38308:157;58767:135;52537:4;52135:16;;;:7;:16;;;;;;-1:-1:-1;;;;;52135:16:0;58841:53;;;;-1:-1:-1;;;58841:53:0;;19868:2:1;58841:53:0;;;19850:21:1;19907:2;19887:18;;;19880:30;-1:-1:-1;;;19926:18:1;;;19919:54;19990:18;;58841:53:0;19666:348:1;58080:174:0;58155:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;58155:29:0;-1:-1:-1;;;;;58155:29:0;;;;;;;;:24;;58209:23;58155:24;58209:14;:23::i;:::-;-1:-1:-1;;;;;58200:46:0;;;;;;;;;;;58080:174;;:::o;77566:222::-;77639:5;77670:109;;;77758:9;77776:3;77758;:9;:::i;:::-;:13;;77770:1;77758:13;:::i;:::-;77671:101;;77706:15;77723:16;77741:10;77689:63;;;;;;;;;25544:19:1;;;25588:2;25579:12;;25572:28;;;;25638:2;25634:15;-1:-1:-1;;25630:53:1;25625:2;25616:12;;25609:75;25709:2;25700:12;;25359:359;77689:63:0;;;;;;;;;;;;;77679:74;;;;;;77671:83;;:101;;;;:::i;:::-;77670:109;;;;:::i;53373:110::-;53449:26;53459:2;53463:7;53449:26;;;;;;;;;;;;:9;:26::i;52767:264::-;52860:4;52877:13;52893:23;52908:7;52893:14;:23::i;:::-;52877:39;;52946:5;-1:-1:-1;;;;;52935:16:0;:7;-1:-1:-1;;;;;52935:16:0;;:52;;;-1:-1:-1;;;;;;49794:25:0;;;49770:4;49794:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;52955:32;52935:87;;;;53015:7;-1:-1:-1;;;;;52991:31:0;:20;53003:7;52991:11;:20::i;:::-;-1:-1:-1;;;;;52991:31:0;;52935:87;52927:96;52767:264;-1:-1:-1;;;;52767:264:0:o;56732:1229::-;56857:4;-1:-1:-1;;;;;56830:31:0;:23;56845:7;56830:14;:23::i;:::-;-1:-1:-1;;;;;56830:31:0;;56822:81;;;;-1:-1:-1;;;56822:81:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;56922:16:0;;56914:65;;;;-1:-1:-1;;;56914:65:0;;26448:2:1;56914:65:0;;;26430:21:1;26487:2;26467:18;;;26460:30;26526:34;26506:18;;;26499:62;-1:-1:-1;;;26577:18:1;;;26570:34;26621:19;;56914:65:0;26246:400:1;56914:65:0;56992:42;57013:4;57019:2;57023:7;57032:1;56992:20;:42::i;:::-;57164:4;-1:-1:-1;;;;;57137:31:0;:23;57152:7;57137:14;:23::i;:::-;-1:-1:-1;;;;;57137:31:0;;57129:81;;;;-1:-1:-1;;;57129:81:0;;;;;;;:::i;:::-;57282:24;;;;:15;:24;;;;;;;;57275:31;;-1:-1:-1;;;;;;57275:31:0;;;;;;-1:-1:-1;;;;;57758:15:0;;;;;;:9;:15;;;;;:20;;-1:-1:-1;;57758:20:0;;;57793:13;;;;;;;;;:18;;57275:31;57793:18;;;57833:16;;;:7;:16;;;;;;:21;;;;;;;;;;57872:27;;57298:7;;57872:27;;;48792:346;48722:416;;:::o;24546:132::-;24454:6;;-1:-1:-1;;;;;24454:6:0;23012:10;24610:23;24602:68;;;;-1:-1:-1;;;24602:68:0;;26853:2:1;24602:68:0;;;26835:21:1;;;26872:18;;;26865:30;26931:34;26911:18;;;26904:62;26983:18;;24602:68:0;26651:356:1;25641:191:0;25734:6;;;-1:-1:-1;;;;;25751:17:0;;;-1:-1:-1;;;;;;25751:17:0;;;;;;;25784:40;;25734:6;;;25751:17;25734:6;;25784:40;;25715:16;;25784:40;25704:128;25641:191;:::o;58397:281::-;58518:8;-1:-1:-1;;;;;58509:17:0;:5;-1:-1:-1;;;;;58509:17:0;;58501:55;;;;-1:-1:-1;;;58501:55:0;;27214:2:1;58501:55:0;;;27196:21:1;27253:2;27233:18;;;27226:30;27292:27;27272:18;;;27265:55;27337:18;;58501:55:0;27012:349:1;58501:55:0;-1:-1:-1;;;;;58567:25:0;;;;;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;:46;;-1:-1:-1;;58567:46:0;;;;;;;;;;58629:41;;540::1;;;58629::0;;513:18:1;58629:41:0;;;;;;;58397:281;;;:::o;51658:270::-;51771:28;51781:4;51787:2;51791:7;51771:9;:28::i;:::-;51818:47;51841:4;51847:2;51851:7;51860:4;51818:22;:47::i;:::-;51810:110;;;;-1:-1:-1;;;51810:110:0;;;;;;;:::i;71681:106::-;71733:13;71766;71759:20;;;;;:::i;19851:716::-;19907:13;19958:14;19975:17;19986:5;19975:10;:17::i;:::-;19995:1;19975:21;19958:38;;20011:20;20045:6;20034:18;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;20034:18:0;-1:-1:-1;20011:41:0;-1:-1:-1;20176:28:0;;;20192:2;20176:28;20233:288;-1:-1:-1;;20265:5:0;-1:-1:-1;;;20402:2:0;20391:14;;20386:30;20265:5;20373:44;20463:2;20454:11;;;-1:-1:-1;20484:21:0;20233:288;20484:21;-1:-1:-1;20542:6:0;19851:716;-1:-1:-1;;;19851:716:0:o;54331:942::-;-1:-1:-1;;;;;54411:16:0;;54403:61;;;;-1:-1:-1;;;54403:61:0;;27987:2:1;54403:61:0;;;27969:21:1;;;28006:18;;;27999:30;28065:34;28045:18;;;28038:62;28117:18;;54403:61:0;27785:356:1;54403:61:0;52537:4;52135:16;;;:7;:16;;;;;;-1:-1:-1;;;;;52135:16:0;52561:31;54475:58;;;;-1:-1:-1;;;54475:58:0;;28348:2:1;54475:58:0;;;28330:21:1;28387:2;28367:18;;;28360:30;28426;28406:18;;;28399:58;28474:18;;54475:58:0;28146:352:1;54475:58:0;54546:48;54575:1;54579:2;54583:7;54592:1;54546:20;:48::i;:::-;52537:4;52135:16;;;:7;:16;;;;;;-1:-1:-1;;;;;52135:16:0;52561:31;54684:58;;;;-1:-1:-1;;;54684:58:0;;28348:2:1;54684:58:0;;;28330:21:1;28387:2;28367:18;;;28360:30;28426;28406:18;;;28399:58;28474:18;;54684:58:0;28146:352:1;54684:58:0;-1:-1:-1;;;;;55091:13:0;;;;;;:9;:13;;;;;;;;:18;;55108:1;55091:18;;;55133:16;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;55133:21:0;;;;;55172:33;55141:7;;55091:13;;55172:33;;55091:13;;55172:33;81673:38:::1;81501:218:::0;:::o;53710:285::-;53805:18;53811:2;53815:7;53805:5;:18::i;:::-;53856:53;53887:1;53891:2;53895:7;53904:4;53856:22;:53::i;:::-;53834:153;;;;-1:-1:-1;;;53834:153:0;;;;;;;:::i;64780:915::-;65047:1;65035:9;:13;65031:222;;;65178:63;;-1:-1:-1;;;65178:63:0;;28705:2:1;65178:63:0;;;28687:21:1;28744:2;28724:18;;;28717:30;28783:34;28763:18;;;28756:62;-1:-1:-1;;;28834:18:1;;;28827:51;28895:19;;65178:63:0;28503:417:1;65031:222:0;65283:12;-1:-1:-1;;;;;65312:18:0;;65308:187;;65347:40;65379:7;66522:10;:17;;66495:24;;;;:15;:24;;;;;:44;;;66550:24;;;;;;;;;;;;66418:164;65347:40;65308:187;;;65417:2;-1:-1:-1;;;;;65409:10:0;:4;-1:-1:-1;;;;;65409:10:0;;65405:90;;65436:47;65469:4;65475:7;65436:32;:47::i;:::-;-1:-1:-1;;;;;65509:16:0;;65505:183;;65542:45;65579:7;65542:36;:45::i;:::-;65505:183;;;65615:4;-1:-1:-1;;;;;65609:10:0;:2;-1:-1:-1;;;;;65609:10:0;;65605:83;;65636:40;65664:2;65668:7;65636:27;:40::i;:::-;64946:749;64780:915;;;;:::o;59466:853::-;59620:4;-1:-1:-1;;;;;59641:13:0;;27608:19;:23;59637:675;;59677:71;;-1:-1:-1;;;59677:71:0;;-1:-1:-1;;;;;59677:36:0;;;;;:71;;23012:10;;59728:4;;59734:7;;59743:4;;59677:71;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;59677:71:0;;;;;;;;-1:-1:-1;;59677:71:0;;;;;;;;;;;;:::i;:::-;;;59673:584;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;59918:6;:13;59935:1;59918:18;59914:328;;59961:60;;-1:-1:-1;;;59961:60:0;;;;;;;:::i;59914:328::-;60192:6;60186:13;60177:6;60173:2;60169:15;60162:38;59673:584;-1:-1:-1;;;;;;59799:51:0;-1:-1:-1;;;59799:51:0;;-1:-1:-1;59792:58:0;;59637:675;-1:-1:-1;60296:4:0;59466:853;;;;;;:::o;16685:948::-;16738:7;;-1:-1:-1;;;16816:17:0;;16812:106;;-1:-1:-1;;;16854:17:0;;;-1:-1:-1;16900:2:0;16890:12;16812:106;16945:8;16936:5;:17;16932:106;;16983:8;16974:17;;;-1:-1:-1;17020:2:0;17010:12;16932:106;17065:8;17056:5;:17;17052:106;;17103:8;17094:17;;;-1:-1:-1;17140:2:0;17130:12;17052:106;17185:7;17176:5;:16;17172:103;;17222:7;17213:16;;;-1:-1:-1;17258:1:0;17248:11;17172:103;17302:7;17293:5;:16;17289:103;;17339:7;17330:16;;;-1:-1:-1;17375:1:0;17365:11;17289:103;17419:7;17410:5;:16;17406:103;;17456:7;17447:16;;;-1:-1:-1;17492:1:0;17482:11;17406:103;17536:7;17527:5;:16;17523:68;;17574:1;17564:11;17619:6;16685:948;-1:-1:-1;;16685:948:0:o;67209:988::-;67475:22;67525:1;67500:22;67517:4;67500:16;:22::i;:::-;:26;;;;:::i;:::-;67537:18;67558:26;;;:17;:26;;;;;;67475:51;;-1:-1:-1;67691:28:0;;;67687:328;;-1:-1:-1;;;;;67758:18:0;;67736:19;67758:18;;;:12;:18;;;;;;;;:34;;;;;;;;;67809:30;;;;;;:44;;;67926:30;;:17;:30;;;;;:43;;;67687:328;-1:-1:-1;68111:26:0;;;;:17;:26;;;;;;;;68104:33;;;-1:-1:-1;;;;;68155:18:0;;;;;:12;:18;;;;;:34;;;;;;;68148:41;67209:988::o;68492:1079::-;68770:10;:17;68745:22;;68770:21;;68790:1;;68770:21;:::i;:::-;68802:18;68823:24;;;:15;:24;;;;;;69196:10;:26;;68745:46;;-1:-1:-1;68823:24:0;;68745:46;;69196:26;;;;;;:::i;:::-;;;;;;;;;69174:48;;69260:11;69235:10;69246;69235:22;;;;;;;;:::i;:::-;;;;;;;;;;;;:36;;;;69340:28;;;:15;:28;;;;;;;:41;;;69512:24;;;;;69505:31;69547:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;68563:1008;;;68492:1079;:::o;65996:221::-;66081:14;66098:20;66115:2;66098:16;:20::i;:::-;-1:-1:-1;;;;;66129:16:0;;;;;;;:12;:16;;;;;;;;:24;;;;;;;;:34;;;66174:26;;;:17;:26;;;;;;:35;;;;-1:-1:-1;65996:221:0:o;14:131:1:-;-1:-1:-1;;;;;;88:32:1;;78:43;;68:71;;135:1;132;125:12;150:245;208:6;261:2;249:9;240:7;236:23;232:32;229:52;;;277:1;274;267:12;229:52;316:9;303:23;335:30;359:5;335:30;:::i;592:250::-;677:1;687:113;701:6;698:1;695:13;687:113;;;777:11;;;771:18;758:11;;;751:39;723:2;716:10;687:113;;;-1:-1:-1;;834:1:1;816:16;;809:27;592:250::o;847:271::-;889:3;927:5;921:12;954:6;949:3;942:19;970:76;1039:6;1032:4;1027:3;1023:14;1016:4;1009:5;1005:16;970:76;:::i;:::-;1100:2;1079:15;-1:-1:-1;;1075:29:1;1066:39;;;;1107:4;1062:50;;847:271;-1:-1:-1;;847:271:1:o;1123:220::-;1272:2;1261:9;1254:21;1235:4;1292:45;1333:2;1322:9;1318:18;1310:6;1292:45;:::i;1348:180::-;1407:6;1460:2;1448:9;1439:7;1435:23;1431:32;1428:52;;;1476:1;1473;1466:12;1428:52;-1:-1:-1;1499:23:1;;1348:180;-1:-1:-1;1348:180:1:o;1741:173::-;1809:20;;-1:-1:-1;;;;;1858:31:1;;1848:42;;1838:70;;1904:1;1901;1894:12;1838:70;1741:173;;;:::o;1919:254::-;1987:6;1995;2048:2;2036:9;2027:7;2023:23;2019:32;2016:52;;;2064:1;2061;2054:12;2016:52;2087:29;2106:9;2087:29;:::i;:::-;2077:39;2163:2;2148:18;;;;2135:32;;-1:-1:-1;;;1919:254:1:o;2360:337::-;2426:6;2434;2487:2;2475:9;2466:7;2462:23;2458:32;2455:52;;;2503:1;2500;2493:12;2455:52;2539:9;2526:23;2516:33;;2599:2;2588:9;2584:18;2571:32;2643:4;2636:5;2632:16;2625:5;2622:27;2612:55;;2663:1;2660;2653:12;2612:55;2686:5;2676:15;;;2360:337;;;;;:::o;2702:328::-;2779:6;2787;2795;2848:2;2836:9;2827:7;2823:23;2819:32;2816:52;;;2864:1;2861;2854:12;2816:52;2887:29;2906:9;2887:29;:::i;:::-;2877:39;;2935:38;2969:2;2958:9;2954:18;2935:38;:::i;:::-;2925:48;;3020:2;3009:9;3005:18;2992:32;2982:42;;2702:328;;;;;:::o;3256:367::-;3319:8;3329:6;3383:3;3376:4;3368:6;3364:17;3360:27;3350:55;;3401:1;3398;3391:12;3350:55;-1:-1:-1;3424:20:1;;3467:18;3456:30;;3453:50;;;3499:1;3496;3489:12;3453:50;3536:4;3528:6;3524:17;3512:29;;3596:3;3589:4;3579:6;3576:1;3572:14;3564:6;3560:27;3556:38;3553:47;3550:67;;;3613:1;3610;3603:12;3550:67;3256:367;;;;;:::o;3628:773::-;3750:6;3758;3766;3774;3827:2;3815:9;3806:7;3802:23;3798:32;3795:52;;;3843:1;3840;3833:12;3795:52;3883:9;3870:23;3912:18;3953:2;3945:6;3942:14;3939:34;;;3969:1;3966;3959:12;3939:34;4008:70;4070:7;4061:6;4050:9;4046:22;4008:70;:::i;:::-;4097:8;;-1:-1:-1;3982:96:1;-1:-1:-1;4185:2:1;4170:18;;4157:32;;-1:-1:-1;4201:16:1;;;4198:36;;;4230:1;4227;4220:12;4198:36;;4269:72;4333:7;4322:8;4311:9;4307:24;4269:72;:::i;:::-;3628:773;;;;-1:-1:-1;4360:8:1;-1:-1:-1;;;;3628:773:1:o;4406:186::-;4465:6;4518:2;4506:9;4497:7;4493:23;4489:32;4486:52;;;4534:1;4531;4524:12;4486:52;4557:29;4576:9;4557:29;:::i;4597:592::-;4668:6;4676;4729:2;4717:9;4708:7;4704:23;4700:32;4697:52;;;4745:1;4742;4735:12;4697:52;4785:9;4772:23;4814:18;4855:2;4847:6;4844:14;4841:34;;;4871:1;4868;4861:12;4841:34;4909:6;4898:9;4894:22;4884:32;;4954:7;4947:4;4943:2;4939:13;4935:27;4925:55;;4976:1;4973;4966:12;4925:55;5016:2;5003:16;5042:2;5034:6;5031:14;5028:34;;;5058:1;5055;5048:12;5028:34;5103:7;5098:2;5089:6;5085:2;5081:15;5077:24;5074:37;5071:57;;;5124:1;5121;5114:12;5071:57;5155:2;5147:11;;;;;5177:6;;-1:-1:-1;4597:592:1;;-1:-1:-1;;;;4597:592:1:o;5194:118::-;5280:5;5273:13;5266:21;5259:5;5256:32;5246:60;;5302:1;5299;5292:12;5317:315;5382:6;5390;5443:2;5431:9;5422:7;5418:23;5414:32;5411:52;;;5459:1;5456;5449:12;5411:52;5482:29;5501:9;5482:29;:::i;:::-;5472:39;;5561:2;5550:9;5546:18;5533:32;5574:28;5596:5;5574:28;:::i;5637:127::-;5698:10;5693:3;5689:20;5686:1;5679:31;5729:4;5726:1;5719:15;5753:4;5750:1;5743:15;5769:1138;5864:6;5872;5880;5888;5941:3;5929:9;5920:7;5916:23;5912:33;5909:53;;;5958:1;5955;5948:12;5909:53;5981:29;6000:9;5981:29;:::i;:::-;5971:39;;6029:38;6063:2;6052:9;6048:18;6029:38;:::i;:::-;6019:48;;6114:2;6103:9;6099:18;6086:32;6076:42;;6169:2;6158:9;6154:18;6141:32;6192:18;6233:2;6225:6;6222:14;6219:34;;;6249:1;6246;6239:12;6219:34;6287:6;6276:9;6272:22;6262:32;;6332:7;6325:4;6321:2;6317:13;6313:27;6303:55;;6354:1;6351;6344:12;6303:55;6390:2;6377:16;6412:2;6408;6405:10;6402:36;;;6418:18;;:::i;:::-;6493:2;6487:9;6461:2;6547:13;;-1:-1:-1;;6543:22:1;;;6567:2;6539:31;6535:40;6523:53;;;6591:18;;;6611:22;;;6588:46;6585:72;;;6637:18;;:::i;:::-;6677:10;6673:2;6666:22;6712:2;6704:6;6697:18;6752:7;6747:2;6742;6738;6734:11;6730:20;6727:33;6724:53;;;6773:1;6770;6763:12;6724:53;6829:2;6824;6820;6816:11;6811:2;6803:6;6799:15;6786:46;6874:1;6869:2;6864;6856:6;6852:15;6848:24;6841:35;6895:6;6885:16;;;;;;;5769:1138;;;;;;;:::o;7381:248::-;7449:6;7457;7510:2;7498:9;7489:7;7485:23;7481:32;7478:52;;;7526:1;7523;7516:12;7478:52;-1:-1:-1;;7549:23:1;;;7619:2;7604:18;;;7591:32;;-1:-1:-1;7381:248:1:o;7634:260::-;7702:6;7710;7763:2;7751:9;7742:7;7738:23;7734:32;7731:52;;;7779:1;7776;7769:12;7731:52;7802:29;7821:9;7802:29;:::i;:::-;7792:39;;7850:38;7884:2;7873:9;7869:18;7850:38;:::i;:::-;7840:48;;7634:260;;;;;:::o;7899:380::-;7978:1;7974:12;;;;8021;;;8042:61;;8096:4;8088:6;8084:17;8074:27;;8042:61;8149:2;8141:6;8138:14;8118:18;8115:38;8112:161;;8195:10;8190:3;8186:20;8183:1;8176:31;8230:4;8227:1;8220:15;8258:4;8255:1;8248:15;8112:161;;7899:380;;;:::o;9116:354::-;9318:2;9300:21;;;9357:2;9337:18;;;9330:30;9396:32;9391:2;9376:18;;9369:60;9461:2;9446:18;;9116:354::o;9475:127::-;9536:10;9531:3;9527:20;9524:1;9517:31;9567:4;9564:1;9557:15;9591:4;9588:1;9581:15;9607:148;9695:4;9674:12;;;9688;;;9670:31;;9713:13;;9710:39;;;9729:18;;:::i;10525:184::-;10595:6;10648:2;10636:9;10627:7;10623:23;10619:32;10616:52;;;10664:1;10661;10654:12;10616:52;-1:-1:-1;10687:16:1;;10525:184;-1:-1:-1;10525:184:1:o;10714:398::-;10916:2;10898:21;;;10955:2;10935:18;;;10928:30;10994:34;10989:2;10974:18;;10967:62;-1:-1:-1;;;11060:2:1;11045:18;;11038:32;11102:3;11087:19;;10714:398::o;12163:245::-;12230:6;12283:2;12271:9;12262:7;12258:23;12254:32;12251:52;;;12299:1;12296;12289:12;12251:52;12331:9;12325:16;12350:28;12372:5;12350:28;:::i;12845:409::-;13047:2;13029:21;;;13086:2;13066:18;;;13059:30;13125:34;13120:2;13105:18;;13098:62;-1:-1:-1;;;13191:2:1;13176:18;;13169:43;13244:3;13229:19;;12845:409::o;14091:127::-;14152:10;14147:3;14143:20;14140:1;14133:31;14183:4;14180:1;14173:15;14207:4;14204:1;14197:15;14223:125;14288:9;;;14309:10;;;14306:36;;;14322:18;;:::i;14353:135::-;14392:3;14413:17;;;14410:43;;14433:18;;:::i;:::-;-1:-1:-1;14480:1:1;14469:13;;14353:135::o;17379:545::-;17481:2;17476:3;17473:11;17470:448;;;17517:1;17542:5;17538:2;17531:17;17587:4;17583:2;17573:19;17657:2;17645:10;17641:19;17638:1;17634:27;17628:4;17624:38;17693:4;17681:10;17678:20;17675:47;;;-1:-1:-1;17716:4:1;17675:47;17771:2;17766:3;17762:12;17759:1;17755:20;17749:4;17745:31;17735:41;;17826:82;17844:2;17837:5;17834:13;17826:82;;;17889:17;;;17870:1;17859:13;17826:82;;18100:1206;18224:18;18219:3;18216:27;18213:53;;;18246:18;;:::i;:::-;18275:94;18365:3;18325:38;18357:4;18351:11;18325:38;:::i;:::-;18319:4;18275:94;:::i;:::-;18395:1;18420:2;18415:3;18412:11;18437:1;18432:616;;;;19092:1;19109:3;19106:93;;;-1:-1:-1;19165:19:1;;;19152:33;19106:93;-1:-1:-1;;18057:1:1;18053:11;;;18049:24;18045:29;18035:40;18081:1;18077:11;;;18032:57;19212:78;;18405:895;;18432:616;17326:1;17319:14;;;17363:4;17350:18;;-1:-1:-1;;18468:17:1;;;18569:9;18591:229;18605:7;18602:1;18599:14;18591:229;;;18694:19;;;18681:33;18666:49;;18801:4;18786:20;;;;18754:1;18742:14;;;;18621:12;18591:229;;;18595:3;18848;18839:7;18836:16;18833:159;;;18972:1;18968:6;18962:3;18956;18953:1;18949:11;18945:21;18941:34;18937:39;18924:9;18919:3;18915:19;18902:33;18898:79;18890:6;18883:95;18833:159;;;19035:1;19029:3;19026:1;19022:11;19018:19;19012:4;19005:33;18405:895;;18100:1206;;;:::o;20735:127::-;20796:10;20791:3;20787:20;20784:1;20777:31;20827:4;20824:1;20817:15;20851:4;20848:1;20841:15;20867:120;20907:1;20933;20923:35;;20938:18;;:::i;:::-;-1:-1:-1;20972:9:1;;20867:120::o;21751:663::-;22031:3;22069:6;22063:13;22085:66;22144:6;22139:3;22132:4;22124:6;22120:17;22085:66;:::i;:::-;22214:13;;22173:16;;;;22236:70;22214:13;22173:16;22283:4;22271:17;;22236:70;:::i;:::-;-1:-1:-1;;;22328:20:1;;22357:22;;;22406:1;22395:13;;21751:663;-1:-1:-1;;;;21751:663:1:o;23476:179::-;23507:1;23533:6;23566:2;23563:1;23559:10;23588:3;23578:37;;23595:18;;:::i;:::-;23633:10;;23629:20;;;;;23476:179;-1:-1:-1;;23476:179:1:o;23660:168::-;23727:6;23753:10;;;23765;;;23749:27;;23788:11;;;23785:37;;;23802:18;;:::i;:::-;23785:37;23660:168;;;;:::o;23833:187::-;23872:1;23898:6;23931:2;23928:1;23924:10;23953:3;23943:37;;23960:18;;:::i;:::-;23998:10;;23994:20;;;;;23833:187;-1:-1:-1;;23833:187:1:o;25203:151::-;25293:4;25286:12;;;25272;;;25268:31;;25311:14;;25308:40;;;25328:18;;:::i;25723:112::-;25755:1;25781;25771:35;;25786:18;;:::i;:::-;-1:-1:-1;25820:9:1;;25723:112::o;25840:401::-;26042:2;26024:21;;;26081:2;26061:18;;;26054:30;26120:34;26115:2;26100:18;;26093:62;-1:-1:-1;;;26186:2:1;26171:18;;26164:35;26231:3;26216:19;;25840:401::o;27366:414::-;27568:2;27550:21;;;27607:2;27587:18;;;27580:30;27646:34;27641:2;27626:18;;27619:62;-1:-1:-1;;;27712:2:1;27697:18;;27690:48;27770:3;27755:19;;27366:414::o;28925:489::-;-1:-1:-1;;;;;29194:15:1;;;29176:34;;29246:15;;29241:2;29226:18;;29219:43;29293:2;29278:18;;29271:34;;;29341:3;29336:2;29321:18;;29314:31;;;29119:4;;29362:46;;29388:19;;29380:6;29362:46;:::i;:::-;29354:54;28925:489;-1:-1:-1;;;;;;28925:489:1:o;29419:249::-;29488:6;29541:2;29529:9;29520:7;29516:23;29512:32;29509:52;;;29557:1;29554;29547:12;29509:52;29589:9;29583:16;29608:30;29632:5;29608:30;:::i;29673:128::-;29740:9;;;29761:11;;;29758:37;;;29775:18;;:::i;29806:127::-;29867:10;29862:3;29858:20;29855:1;29848:31;29898:4;29895:1;29888:15;29922:4;29919:1;29912:15
Swarm Source
ipfs://e236cc359156e6e36bfcbcb22e555963f99a0b952773c88b1dc429256df369b8
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.