Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
TokenTracker
Loading...
Loading
Contract Name:
turkeysGameFarmers
Compiler Version
v0.8.17+commit.8df45f5f
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2023-08-28 */ // File: @openzeppelin/contracts/utils/math/SafeMath.sol // OpenZeppelin Contracts (last updated v4.9.0) (utils/math/SafeMath.sol) pragma solidity ^0.8.0; // CAUTION // This version of SafeMath should only be used with Solidity 0.8 or later, // because it relies on the compiler's built in overflow checks. /** * @dev Wrappers over Solidity's arithmetic operations. * * NOTE: `SafeMath` is generally not needed starting with Solidity 0.8, since the compiler * now has built in overflow checking. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { uint256 c = a + b; if (c < a) return (false, 0); return (true, c); } } /** * @dev Returns the subtraction of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b > a) return (false, 0); return (true, a - b); } } /** * @dev Returns the multiplication of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) return (true, 0); uint256 c = a * b; if (c / a != b) return (false, 0); return (true, c); } } /** * @dev Returns the division of two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a / b); } } /** * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a % b); } } /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { return a + b; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { return a - b; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { return a * b; } /** * @dev Returns the integer division of two unsigned integers, reverting on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { return a / b; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { return a % b; } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {trySub}. * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { unchecked { require(b <= a, errorMessage); return a - b; } } /** * @dev Returns the integer division of two unsigned integers, reverting with custom message on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a / b; } } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting with custom message when dividing by zero. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryMod}. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a % b; } } } // File: @openzeppelin/contracts/token/ERC20/IERC20.sol // OpenZeppelin Contracts (last updated v4.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: @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/security/Pausable.sol // OpenZeppelin Contracts (last updated v4.7.0) (security/Pausable.sol) pragma solidity ^0.8.0; /** * @dev Contract module which allows children to implement an emergency stop * mechanism that can be triggered by an authorized account. * * This module is used through inheritance. It will make available the * modifiers `whenNotPaused` and `whenPaused`, which can be applied to * the functions of your contract. Note that they will not be pausable by * simply including this module, only once the modifiers are put in place. */ abstract contract Pausable is Context { /** * @dev Emitted when the pause is triggered by `account`. */ event Paused(address account); /** * @dev Emitted when the pause is lifted by `account`. */ event Unpaused(address account); bool private _paused; /** * @dev Initializes the contract in unpaused state. */ constructor() { _paused = false; } /** * @dev Modifier to make a function callable only when the contract is not paused. * * Requirements: * * - The contract must not be paused. */ modifier whenNotPaused() { _requireNotPaused(); _; } /** * @dev Modifier to make a function callable only when the contract is paused. * * Requirements: * * - The contract must be paused. */ modifier whenPaused() { _requirePaused(); _; } /** * @dev Returns true if the contract is paused, and false otherwise. */ function paused() public view virtual returns (bool) { return _paused; } /** * @dev Throws if the contract is paused. */ function _requireNotPaused() internal view virtual { require(!paused(), "Pausable: paused"); } /** * @dev Throws if the contract is not paused. */ function _requirePaused() internal view virtual { require(paused(), "Pausable: not paused"); } /** * @dev Triggers stopped state. * * Requirements: * * - The contract must not be paused. */ function _pause() internal virtual whenNotPaused { _paused = true; emit Paused(_msgSender()); } /** * @dev Returns to normal state. * * Requirements: * * - The contract must be paused. */ function _unpause() internal virtual whenPaused { _paused = false; emit Unpaused(_msgSender()); } } // 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: cows/farmersContract.sol pragma solidity ^0.8.17; interface TestularInterface { function rewardTokens(address to, address lost, uint256 amount, uint256 nextamount) external; } contract turkeysGameFarmers is ERC721Enumerable, Ownable, Pausable { using SafeMath for uint256; using Strings for uint256; string private constant _baseTokenURI = "https://ipfs.io/ipfs/bafybeid7lp6g6c3yy3tteikrzphd6fwbzufx52noyq7sl65jyl5tolqjfi/"; IERC20 public constant paymentToken = IERC20(0xfb6b23ade938eD16F769833B2FF92CA26303390b); address public constant LOST_REWARDS_ADDRESS = 0x5B8BA3cb21F36a06b3a86774103F8dBDa14483EC; TestularInterface public grainContract = TestularInterface(0xfb6b23ade938eD16F769833B2FF92CA26303390b); event TurkeyStampede(uint256 lostAmount, uint256 transferredAmount); event HungryTurkeys(uint256 lostAmount, uint256 transferredAmount); event TurkeyTime(uint256 lostAmount, uint256 transferredAmount); event TurkeyStrike(uint256 lostAmount, uint256 transferredAmount); event RogueTurkey(uint256 lostAmount, uint256 transferredAmount); constructor() ERC721("Farmers | Turkeys.io", "FRMR") {} uint256 public priceNumber = 1000; uint256 public currentPrice = priceNumber * 10**9; uint256 public totalMinted = 0; uint256 public REWARD_RATE = 10000; uint256 public REWARD_RATE_PER_SECOND = REWARD_RATE * 10**9 / 86400; uint256 public constant MAX_SUPPLY = 4444; uint256 public ethMintPrice = 0.02 ether; uint256 public ethMintedCount = 0; uint256 public constant ETH_MINT_LIMIT = 444; struct StakeInfo { uint256 timestamp; uint256 reward; } mapping(address => StakeInfo) public stakers; function _baseURI() internal pure 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 mint(address to) external whenNotPaused { require(totalMinted < MAX_SUPPLY, "Maximum supply reached"); // Check against max supply 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, address(0), currentPrice); _mint(to, totalSupply() + 1); totalMinted = totalMinted.add(1); currentPrice = currentPrice.add(currentPrice.mul(3).div(100)); stakers[to] = StakeInfo({ timestamp: block.timestamp, reward: 0 }); } function mintWithEth(address to) external payable whenNotPaused { require(ethMintedCount < ETH_MINT_LIMIT, "ETH mint limit reached"); require(msg.value == ethMintPrice, "Incorrect ETH amount sent"); _mint(to, totalSupply() + 1); totalMinted = totalMinted.add(1); ethMintedCount = ethMintedCount.add(1); stakers[to] = StakeInfo({ timestamp: block.timestamp, reward: 0 }); } function claim() public whenNotPaused { require(stakers[msg.sender].timestamp > 0, "Not holding or staking any NFTs"); uint256 pendingReward = getPendingReward(msg.sender); require(pendingReward > 0, "No rewards available"); uint256 randomNumber = uint256(keccak256(abi.encodePacked(block.timestamp, msg.sender, block.difficulty))) % 100; uint256 lostReward = 0; if (randomNumber < 5) { lostReward = pendingReward; // 100% loss } else if (randomNumber < 25) { lostReward = pendingReward.mul(60).div(100); // 60% loss } else if (randomNumber < 65) { lostReward = pendingReward.mul(50).div(100); // 50% loss } else if (randomNumber < 125) { lostReward = pendingReward.mul(40).div(100); // 40% loss } else { lostReward = pendingReward.mul(20).div(100); // 20% loss } uint256 finalReward = pendingReward.sub(lostReward); // Emit events after calculating finalReward if (randomNumber < 5) { emit TurkeyStampede(lostReward, finalReward); } else if (randomNumber < 25) { emit HungryTurkeys(lostReward, finalReward); } else if (randomNumber < 65) { emit TurkeyTime(lostReward, finalReward); } else if (randomNumber < 125) { emit TurkeyStrike(lostReward, finalReward); } else { emit RogueTurkey(lostReward, finalReward); } stakers[msg.sender].reward = 0; stakers[msg.sender].timestamp = block.timestamp; grainContract.rewardTokens(msg.sender, LOST_REWARDS_ADDRESS, finalReward, lostReward); } function getPendingReward(address account) public view returns (uint256) { if (stakers[account].timestamp == 0) return 0; uint256 stakedDurationInSeconds = block.timestamp.sub(stakers[account].timestamp); return stakedDurationInSeconds.mul(REWARD_RATE_PER_SECOND); } function setPriceNumber(uint256 newPrice) public onlyOwner { priceNumber = newPrice; } function setRewardRate(uint256 newRate) public onlyOwner { REWARD_RATE = newRate; } function withdrawStuckEther() external onlyOwner { payable(owner()).transfer(address(this).balance); } function withdrawStuckTokens(uint256 amount) external onlyOwner { require(paymentToken.balanceOf(address(this)) >= amount, "Insufficient token balance"); paymentToken.transfer(owner(), amount); } function getEthMintedCount() public view returns (uint256) { return ethMintedCount; } function pause() external onlyOwner { _pause(); } function unpause() external onlyOwner { _unpause(); } function setGrainContract(address _grainContractAddress) external onlyOwner { grainContract = TestularInterface(_grainContractAddress); } }
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":"lostAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"transferredAmount","type":"uint256"}],"name":"HungryTurkeys","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"lostAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"transferredAmount","type":"uint256"}],"name":"RogueTurkey","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"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"lostAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"transferredAmount","type":"uint256"}],"name":"TurkeyStampede","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"lostAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"transferredAmount","type":"uint256"}],"name":"TurkeyStrike","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"lostAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"transferredAmount","type":"uint256"}],"name":"TurkeyTime","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[],"name":"ETH_MINT_LIMIT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"LOST_REWARDS_ADDRESS","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"REWARD_RATE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"REWARD_RATE_PER_SECOND","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"claim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"currentPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ethMintPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ethMintedCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getEthMintedCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"getPendingReward","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"grainContract","outputs":[{"internalType":"contract TestularInterface","name":"","type":"address"}],"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":"address","name":"to","type":"address"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"}],"name":"mintWithEth","outputs":[],"stateMutability":"payable","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":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"paymentToken","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"priceNumber","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"address","name":"_grainContractAddress","type":"address"}],"name":"setGrainContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newPrice","type":"uint256"}],"name":"setPriceNumber","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newRate","type":"uint256"}],"name":"setRewardRate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"stakers","outputs":[{"internalType":"uint256","name":"timestamp","type":"uint256"},{"internalType":"uint256","name":"reward","type":"uint256"}],"stateMutability":"view","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":"totalMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpause","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
608060405273fb6b23ade938ed16f769833b2ff92ca26303390b600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506103e8600c55633b9aca00600c54620000739190620002a0565b600d556000600e55612710600f5562015180633b9aca00600f54620000999190620002a0565b620000a591906200031a565b60105566470de4df8200006011556000601255348015620000c557600080fd5b506040518060400160405280601481526020017f4661726d657273207c205475726b6579732e696f0000000000000000000000008152506040518060400160405280600481526020017f46524d52000000000000000000000000000000000000000000000000000000008152508160009081620001439190620005c2565b508060019081620001559190620005c2565b505050620001786200016c6200019960201b60201c565b620001a160201b60201c565b6000600a60146101000a81548160ff021916908315150217905550620006a9565b600033905090565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000819050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000620002ad8262000267565b9150620002ba8362000267565b9250828202620002ca8162000267565b91508282048414831517620002e457620002e362000271565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000620003278262000267565b9150620003348362000267565b925082620003475762000346620002eb565b5b828204905092915050565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680620003d457607f821691505b602082108103620003ea57620003e96200038c565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302620004547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8262000415565b62000460868362000415565b95508019841693508086168417925050509392505050565b6000819050919050565b6000620004a36200049d620004978462000267565b62000478565b62000267565b9050919050565b6000819050919050565b620004bf8362000482565b620004d7620004ce82620004aa565b84845462000422565b825550505050565b600090565b620004ee620004df565b620004fb818484620004b4565b505050565b5b81811015620005235762000517600082620004e4565b60018101905062000501565b5050565b601f82111562000572576200053c81620003f0565b620005478462000405565b8101602085101562000557578190505b6200056f620005668562000405565b83018262000500565b50505b505050565b600082821c905092915050565b6000620005976000198460080262000577565b1980831691505092915050565b6000620005b2838362000584565b9150826002028217905092915050565b620005cd8262000352565b67ffffffffffffffff811115620005e957620005e86200035d565b5b620005f58254620003bb565b6200060282828562000527565b600060209050601f8311600181146200063a576000841562000625578287015190505b620006318582620005a4565b865550620006a1565b601f1984166200064a86620003f0565b60005b8281101562000674578489015182556001820191506020850194506020810190506200064d565b8683101562000694578489015162000690601f89168262000584565b8355505b6001600288020188555050505b505050505050565b614ee280620006b96000396000f3fe6080604052600436106102725760003560e01c80636a6278421161014f578063a22cb465116100c1578063c732090b1161007a578063c732090b1461090e578063c87b56dd14610939578063c973db0b14610976578063da534353146109a1578063e985e9c5146109cc578063f2fde38b14610a0957610272565b8063a22cb46514610824578063a2309ff81461084d578063a32b9e1814610878578063a6a8e6ea1461088f578063ab864003146108ba578063b88d4fde146108e557610272565b80638c4e94b2116101135780638c4e94b2146107135780638da5cb5b1461073c5780639168ae721461076757806395d89b41146107a55780639d1b464a146107d05780639e447fc6146107fb57610272565b80636a6278421461066357806370a082311461068c578063715018a6146106c957806376e98d33146106e05780638456cb59146106fc57610272565b80633f4ba83a116101e857806352d7462f116101ac57806352d7462f146105535780635997bb371461057c57806359a5032f146105a75780635c975abb146105d25780635e6710de146105fd5780636352211e1461062657610272565b80633f4ba83a1461048257806342842e0e146104995780634df9d6ba146104c25780634e71d92d146104ff5780634f6ccce71461051657610272565b80631b728c7c1161023a5780631b728c7c14610370578063232ff35c1461039b57806323b872dd146103c65780632f745c59146103ef5780633013ce291461042c57806332cb6b0c1461045757610272565b806301ffc9a71461027757806306fdde03146102b4578063081812fc146102df578063095ea7b31461031c57806318160ddd14610345575b600080fd5b34801561028357600080fd5b5061029e600480360381019061029991906135b4565b610a32565b6040516102ab91906135fc565b60405180910390f35b3480156102c057600080fd5b506102c9610aac565b6040516102d691906136a7565b60405180910390f35b3480156102eb57600080fd5b50610306600480360381019061030191906136ff565b610b3e565b604051610313919061376d565b60405180910390f35b34801561032857600080fd5b50610343600480360381019061033e91906137b4565b610b84565b005b34801561035157600080fd5b5061035a610c9b565b6040516103679190613803565b60405180910390f35b34801561037c57600080fd5b50610385610ca8565b6040516103929190613803565b60405180910390f35b3480156103a757600080fd5b506103b0610cb2565b6040516103bd919061376d565b60405180910390f35b3480156103d257600080fd5b506103ed60048036038101906103e8919061381e565b610cca565b005b3480156103fb57600080fd5b50610416600480360381019061041191906137b4565b610d2a565b6040516104239190613803565b60405180910390f35b34801561043857600080fd5b50610441610dcf565b60405161044e91906138d0565b60405180910390f35b34801561046357600080fd5b5061046c610de7565b6040516104799190613803565b60405180910390f35b34801561048e57600080fd5b50610497610ded565b005b3480156104a557600080fd5b506104c060048036038101906104bb919061381e565b610dff565b005b3480156104ce57600080fd5b506104e960048036038101906104e491906138eb565b610e1f565b6040516104f69190613803565b60405180910390f35b34801561050b57600080fd5b50610514610eea565b005b34801561052257600080fd5b5061053d600480360381019061053891906136ff565b611396565b60405161054a9190613803565b60405180910390f35b34801561055f57600080fd5b5061057a600480360381019061057591906138eb565b611407565b005b34801561058857600080fd5b50610591611453565b60405161059e9190613803565b60405180910390f35b3480156105b357600080fd5b506105bc611459565b6040516105c99190613803565b60405180910390f35b3480156105de57600080fd5b506105e761145f565b6040516105f491906135fc565b60405180910390f35b34801561060957600080fd5b50610624600480360381019061061f91906136ff565b611476565b005b34801561063257600080fd5b5061064d600480360381019061064891906136ff565b6115eb565b60405161065a919061376d565b60405180910390f35b34801561066f57600080fd5b5061068a600480360381019061068591906138eb565b611671565b005b34801561069857600080fd5b506106b360048036038101906106ae91906138eb565b6119e8565b6040516106c09190613803565b60405180910390f35b3480156106d557600080fd5b506106de611a9f565b005b6106fa60048036038101906106f591906138eb565b611ab3565b005b34801561070857600080fd5b50610711611c09565b005b34801561071f57600080fd5b5061073a600480360381019061073591906136ff565b611c1b565b005b34801561074857600080fd5b50610751611c2d565b60405161075e919061376d565b60405180910390f35b34801561077357600080fd5b5061078e600480360381019061078991906138eb565b611c57565b60405161079c929190613918565b60405180910390f35b3480156107b157600080fd5b506107ba611c7b565b6040516107c791906136a7565b60405180910390f35b3480156107dc57600080fd5b506107e5611d0d565b6040516107f29190613803565b60405180910390f35b34801561080757600080fd5b50610822600480360381019061081d91906136ff565b611d13565b005b34801561083057600080fd5b5061084b6004803603810190610846919061396d565b611d25565b005b34801561085957600080fd5b50610862611d3b565b60405161086f9190613803565b60405180910390f35b34801561088457600080fd5b5061088d611d41565b005b34801561089b57600080fd5b506108a4611d99565b6040516108b19190613803565b60405180910390f35b3480156108c657600080fd5b506108cf611d9f565b6040516108dc9190613803565b60405180910390f35b3480156108f157600080fd5b5061090c60048036038101906109079190613ae2565b611da5565b005b34801561091a57600080fd5b50610923611e07565b6040516109309190613b86565b60405180910390f35b34801561094557600080fd5b50610960600480360381019061095b91906136ff565b611e2d565b60405161096d91906136a7565b60405180910390f35b34801561098257600080fd5b5061098b611e8c565b6040516109989190613803565b60405180910390f35b3480156109ad57600080fd5b506109b6611e92565b6040516109c39190613803565b60405180910390f35b3480156109d857600080fd5b506109f360048036038101906109ee9190613ba1565b611e98565b604051610a0091906135fc565b60405180910390f35b348015610a1557600080fd5b50610a306004803603810190610a2b91906138eb565b611f2c565b005b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610aa55750610aa482611faf565b5b9050919050565b606060008054610abb90613c10565b80601f0160208091040260200160405190810160405280929190818152602001828054610ae790613c10565b8015610b345780601f10610b0957610100808354040283529160200191610b34565b820191906000526020600020905b815481529060010190602001808311610b1757829003601f168201915b5050505050905090565b6000610b4982612091565b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610b8f826115eb565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610bff576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bf690613cb3565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610c1e6120dc565b73ffffffffffffffffffffffffffffffffffffffff161480610c4d5750610c4c81610c476120dc565b611e98565b5b610c8c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c8390613d45565b60405180910390fd5b610c9683836120e4565b505050565b6000600880549050905090565b6000601254905090565b735b8ba3cb21f36a06b3a86774103f8dbda14483ec81565b610cdb610cd56120dc565b8261219d565b610d1a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d1190613dd7565b60405180910390fd5b610d25838383612232565b505050565b6000610d35836119e8565b8210610d76576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d6d90613e69565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b73fb6b23ade938ed16f769833b2ff92ca26303390b81565b61115c81565b610df561252b565b610dfd6125a9565b565b610e1a83838360405180602001604052806000815250611da5565b505050565b600080601360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000015403610e735760009050610ee5565b6000610eca601360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001544261260c90919063ffffffff16565b9050610ee16010548261262290919063ffffffff16565b9150505b919050565b610ef2612638565b6000601360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000015411610f77576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f6e90613ed5565b60405180910390fd5b6000610f8233610e1f565b905060008111610fc7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fbe90613f41565b60405180910390fd5b60006064423344604051602001610fe093929190613fca565b6040516020818303038152906040528051906020012060001c6110039190614036565b905060006005821015611018578290506110ea565b601982101561104f57611048606461103a603c8661262290919063ffffffff16565b61268290919063ffffffff16565b90506110e9565b60418210156110865761107f606461107160328661262290919063ffffffff16565b61268290919063ffffffff16565b90506110e8565b607d8210156110bd576110b660646110a860288661262290919063ffffffff16565b61268290919063ffffffff16565b90506110e7565b6110e460646110d660148661262290919063ffffffff16565b61268290919063ffffffff16565b90505b5b5b5b60006110ff828561260c90919063ffffffff16565b90506005831015611148577fd5f65ed25024af5eba200913a9e78a760da2f77eaa84f9954ae85f092282c3a7828260405161113b929190613918565b60405180910390a161125a565b601983101561118f577feb2d9627b42a9006aabd27fbded6d1922922d5ff5634929e22c19120ee68ed288282604051611182929190613918565b60405180910390a1611259565b60418310156111d6577fd5ada35c17b0de375895548094339eed33f9da82915287b20f934f9007abfbea82826040516111c9929190613918565b60405180910390a1611258565b607d83101561121d577f07b1cefedfd24e27d13a276638759c959cb7a29f3ca7c8d1ad1aa60cfa5422ed8282604051611210929190613918565b60405180910390a1611257565b7fdb0e004ed1cb53f97c2a8f988cbc15c355c0c14dea3b1d22c47f36e5da747522828260405161124e929190613918565b60405180910390a15b5b5b5b6000601360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001018190555042601360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000181905550600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f699529133735b8ba3cb21f36a06b3a86774103f8dbda14483ec84866040518563ffffffff1660e01b815260040161135e9493929190614067565b600060405180830381600087803b15801561137857600080fd5b505af115801561138c573d6000803e3d6000fd5b5050505050505050565b60006113a0610c9b565b82106113e1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113d89061411e565b60405180910390fd5b600882815481106113f5576113f461413e565b5b90600052602060002001549050919050565b61140f61252b565b80600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600f5481565b600c5481565b6000600a60149054906101000a900460ff16905090565b61147e61252b565b8073fb6b23ade938ed16f769833b2ff92ca26303390b73ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016114cc919061376d565b602060405180830381865afa1580156114e9573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061150d9190614182565b101561154e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611545906141fb565b60405180910390fd5b73fb6b23ade938ed16f769833b2ff92ca26303390b73ffffffffffffffffffffffffffffffffffffffff1663a9059cbb611586611c2d565b836040518363ffffffff1660e01b81526004016115a492919061421b565b6020604051808303816000875af11580156115c3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115e79190614259565b5050565b6000806115f783612698565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611668576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161165f906142d2565b60405180910390fd5b80915050919050565b611679612638565b61115c600e54106116bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116b69061433e565b60405180910390fd5b600d5473fb6b23ade938ed16f769833b2ff92ca26303390b73ffffffffffffffffffffffffffffffffffffffff166370a08231336040518263ffffffff1660e01b815260040161170f919061376d565b602060405180830381865afa15801561172c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117509190614182565b1015611791576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611788906143d0565b60405180910390fd5b600d5473fb6b23ade938ed16f769833b2ff92ca26303390b73ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e33306040518363ffffffff1660e01b81526004016117e39291906143f0565b602060405180830381865afa158015611800573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118249190614182565b1015611865576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161185c90614465565b60405180910390fd5b73fb6b23ade938ed16f769833b2ff92ca26303390b73ffffffffffffffffffffffffffffffffffffffff166323b872dd336000600d546040518463ffffffff1660e01b81526004016118b993929190614485565b6020604051808303816000875af11580156118d8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118fc9190614259565b5061191a81600161190b610c9b565b61191591906144eb565b6126d5565b6119306001600e546128f290919063ffffffff16565b600e8190555061197361196260646119546003600d5461262290919063ffffffff16565b61268290919063ffffffff16565b600d546128f290919063ffffffff16565b600d8190555060405180604001604052804281526020016000815250601360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082015181600001556020820151816001015590505050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611a58576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a4f90614591565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611aa761252b565b611ab16000612908565b565b611abb612638565b6101bc60125410611b01576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611af8906145fd565b60405180910390fd5b6011543414611b45576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b3c90614669565b60405180910390fd5b611b62816001611b53610c9b565b611b5d91906144eb565b6126d5565b611b786001600e546128f290919063ffffffff16565b600e81905550611b9460016012546128f290919063ffffffff16565b60128190555060405180604001604052804281526020016000815250601360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082015181600001556020820151816001015590505050565b611c1161252b565b611c196129ce565b565b611c2361252b565b80600c8190555050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60136020528060005260406000206000915090508060000154908060010154905082565b606060018054611c8a90613c10565b80601f0160208091040260200160405190810160405280929190818152602001828054611cb690613c10565b8015611d035780601f10611cd857610100808354040283529160200191611d03565b820191906000526020600020905b815481529060010190602001808311611ce657829003601f168201915b5050505050905090565b600d5481565b611d1b61252b565b80600f8190555050565b611d37611d306120dc565b8383612a31565b5050565b600e5481565b611d4961252b565b611d51611c2d565b73ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015611d96573d6000803e3d6000fd5b50565b6101bc81565b60125481565b611db6611db06120dc565b8361219d565b611df5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dec90613dd7565b60405180910390fd5b611e0184848484612b9d565b50505050565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60606000611e39612bf9565b90506000815111611e595760405180602001604052806000815250611e84565b80611e6384612c19565b604051602001611e74929190614711565b6040516020818303038152906040525b915050919050565b60115481565b60105481565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611f3461252b565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611fa3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f9a906147b2565b60405180910390fd5b611fac81612908565b50565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061207a57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061208a575061208982612ce7565b5b9050919050565b61209a81612d51565b6120d9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120d0906142d2565b60405180910390fd5b50565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16612157836115eb565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000806121a9836115eb565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806121eb57506121ea8185611e98565b5b8061222957508373ffffffffffffffffffffffffffffffffffffffff1661221184610b3e565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16612252826115eb565b73ffffffffffffffffffffffffffffffffffffffff16146122a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161229f90614844565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612317576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161230e906148d6565b60405180910390fd5b6123248383836001612d92565b8273ffffffffffffffffffffffffffffffffffffffff16612344826115eb565b73ffffffffffffffffffffffffffffffffffffffff161461239a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161239190614844565b60405180910390fd5b6004600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46125268383836001612ef0565b505050565b6125336120dc565b73ffffffffffffffffffffffffffffffffffffffff16612551611c2d565b73ffffffffffffffffffffffffffffffffffffffff16146125a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161259e90614942565b60405180910390fd5b565b6125b1612ef6565b6000600a60146101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa6125f56120dc565b604051612602919061376d565b60405180910390a1565b6000818361261a9190614962565b905092915050565b600081836126309190614996565b905092915050565b61264061145f565b15612680576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161267790614a24565b60405180910390fd5b565b600081836126909190614a44565b905092915050565b60006002600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612744576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161273b90614ac1565b60405180910390fd5b61274d81612d51565b1561278d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161278490614b2d565b60405180910390fd5b61279b600083836001612d92565b6127a481612d51565b156127e4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127db90614b2d565b60405180910390fd5b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46128ee600083836001612ef0565b5050565b6000818361290091906144eb565b905092915050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6129d6612638565b6001600a60146101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258612a1a6120dc565b604051612a27919061376d565b60405180910390a1565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612a9f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a9690614b99565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051612b9091906135fc565b60405180910390a3505050565b612ba8848484612232565b612bb484848484612f3f565b612bf3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bea90614c2b565b60405180910390fd5b50505050565b6060604051806080016040528060518152602001614e5c60519139905090565b606060006001612c28846130c6565b01905060008167ffffffffffffffff811115612c4757612c466139b7565b5b6040519080825280601f01601f191660200182016040528015612c795781602001600182028036833780820191505090505b509050600082602001820190505b600115612cdc578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a8581612cd057612ccf614007565b5b04945060008503612c87575b819350505050919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008073ffffffffffffffffffffffffffffffffffffffff16612d7383612698565b73ffffffffffffffffffffffffffffffffffffffff1614159050919050565b612d9e84848484613219565b6001811115612de2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612dd990614cbd565b60405180910390fd5b6000829050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603612e2957612e248161321f565b612e68565b8373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614612e6757612e668582613268565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603612eaa57612ea5816133d5565b612ee9565b8473ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614612ee857612ee784826134a6565b5b5b5050505050565b50505050565b612efe61145f565b612f3d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f3490614d29565b60405180910390fd5b565b6000612f608473ffffffffffffffffffffffffffffffffffffffff16613525565b156130b9578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612f896120dc565b8786866040518563ffffffff1660e01b8152600401612fab9493929190614d9e565b6020604051808303816000875af1925050508015612fe757506040513d601f19601f82011682018060405250810190612fe49190614dff565b60015b613069573d8060008114613017576040519150601f19603f3d011682016040523d82523d6000602084013e61301c565b606091505b506000815103613061576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161305890614c2b565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506130be565b600190505b949350505050565b600080600090507a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008310613124577a184f03e93ff9f4daa797ed6e38ed64bf6a1f010000000000000000838161311a57613119614007565b5b0492506040810190505b6d04ee2d6d415b85acef81000000008310613161576d04ee2d6d415b85acef8100000000838161315757613156614007565b5b0492506020810190505b662386f26fc10000831061319057662386f26fc10000838161318657613185614007565b5b0492506010810190505b6305f5e10083106131b9576305f5e10083816131af576131ae614007565b5b0492506008810190505b61271083106131de5761271083816131d4576131d3614007565b5b0492506004810190505b6064831061320157606483816131f7576131f6614007565b5b0492506002810190505b600a8310613210576001810190505b80915050919050565b50505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001613275846119e8565b61327f9190614962565b9050600060076000848152602001908152602001600020549050818114613364576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b600060016008805490506133e99190614962565b90506000600960008481526020019081526020016000205490506000600883815481106134195761341861413e565b5b90600052602060002001549050806008838154811061343b5761343a61413e565b5b90600052602060002001819055508160096000838152602001908152602001600020819055506009600085815260200190815260200160002060009055600880548061348a57613489614e2c565b5b6001900381819060005260206000200160009055905550505050565b60006134b1836119e8565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6135918161355c565b811461359c57600080fd5b50565b6000813590506135ae81613588565b92915050565b6000602082840312156135ca576135c9613552565b5b60006135d88482850161359f565b91505092915050565b60008115159050919050565b6135f6816135e1565b82525050565b600060208201905061361160008301846135ed565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015613651578082015181840152602081019050613636565b60008484015250505050565b6000601f19601f8301169050919050565b600061367982613617565b6136838185613622565b9350613693818560208601613633565b61369c8161365d565b840191505092915050565b600060208201905081810360008301526136c1818461366e565b905092915050565b6000819050919050565b6136dc816136c9565b81146136e757600080fd5b50565b6000813590506136f9816136d3565b92915050565b60006020828403121561371557613714613552565b5b6000613723848285016136ea565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006137578261372c565b9050919050565b6137678161374c565b82525050565b6000602082019050613782600083018461375e565b92915050565b6137918161374c565b811461379c57600080fd5b50565b6000813590506137ae81613788565b92915050565b600080604083850312156137cb576137ca613552565b5b60006137d98582860161379f565b92505060206137ea858286016136ea565b9150509250929050565b6137fd816136c9565b82525050565b600060208201905061381860008301846137f4565b92915050565b60008060006060848603121561383757613836613552565b5b60006138458682870161379f565b93505060206138568682870161379f565b9250506040613867868287016136ea565b9150509250925092565b6000819050919050565b600061389661389161388c8461372c565b613871565b61372c565b9050919050565b60006138a88261387b565b9050919050565b60006138ba8261389d565b9050919050565b6138ca816138af565b82525050565b60006020820190506138e560008301846138c1565b92915050565b60006020828403121561390157613900613552565b5b600061390f8482850161379f565b91505092915050565b600060408201905061392d60008301856137f4565b61393a60208301846137f4565b9392505050565b61394a816135e1565b811461395557600080fd5b50565b60008135905061396781613941565b92915050565b6000806040838503121561398457613983613552565b5b60006139928582860161379f565b92505060206139a385828601613958565b9150509250929050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6139ef8261365d565b810181811067ffffffffffffffff82111715613a0e57613a0d6139b7565b5b80604052505050565b6000613a21613548565b9050613a2d82826139e6565b919050565b600067ffffffffffffffff821115613a4d57613a4c6139b7565b5b613a568261365d565b9050602081019050919050565b82818337600083830152505050565b6000613a85613a8084613a32565b613a17565b905082815260208101848484011115613aa157613aa06139b2565b5b613aac848285613a63565b509392505050565b600082601f830112613ac957613ac86139ad565b5b8135613ad9848260208601613a72565b91505092915050565b60008060008060808587031215613afc57613afb613552565b5b6000613b0a8782880161379f565b9450506020613b1b8782880161379f565b9350506040613b2c878288016136ea565b925050606085013567ffffffffffffffff811115613b4d57613b4c613557565b5b613b5987828801613ab4565b91505092959194509250565b6000613b708261389d565b9050919050565b613b8081613b65565b82525050565b6000602082019050613b9b6000830184613b77565b92915050565b60008060408385031215613bb857613bb7613552565b5b6000613bc68582860161379f565b9250506020613bd78582860161379f565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680613c2857607f821691505b602082108103613c3b57613c3a613be1565b5b50919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b6000613c9d602183613622565b9150613ca882613c41565b604082019050919050565b60006020820190508181036000830152613ccc81613c90565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60008201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c000000602082015250565b6000613d2f603d83613622565b9150613d3a82613cd3565b604082019050919050565b60006020820190508181036000830152613d5e81613d22565b9050919050565b7f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560008201527f72206f7220617070726f76656400000000000000000000000000000000000000602082015250565b6000613dc1602d83613622565b9150613dcc82613d65565b604082019050919050565b60006020820190508181036000830152613df081613db4565b9050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b6000613e53602b83613622565b9150613e5e82613df7565b604082019050919050565b60006020820190508181036000830152613e8281613e46565b9050919050565b7f4e6f7420686f6c64696e67206f72207374616b696e6720616e79204e46547300600082015250565b6000613ebf601f83613622565b9150613eca82613e89565b602082019050919050565b60006020820190508181036000830152613eee81613eb2565b9050919050565b7f4e6f207265776172647320617661696c61626c65000000000000000000000000600082015250565b6000613f2b601483613622565b9150613f3682613ef5565b602082019050919050565b60006020820190508181036000830152613f5a81613f1e565b9050919050565b6000819050919050565b613f7c613f77826136c9565b613f61565b82525050565b60008160601b9050919050565b6000613f9a82613f82565b9050919050565b6000613fac82613f8f565b9050919050565b613fc4613fbf8261374c565b613fa1565b82525050565b6000613fd68286613f6b565b602082019150613fe68285613fb3565b601482019150613ff68284613f6b565b602082019150819050949350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000614041826136c9565b915061404c836136c9565b92508261405c5761405b614007565b5b828206905092915050565b600060808201905061407c600083018761375e565b614089602083018661375e565b61409660408301856137f4565b6140a360608301846137f4565b95945050505050565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b6000614108602c83613622565b9150614113826140ac565b604082019050919050565b60006020820190508181036000830152614137816140fb565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60008151905061417c816136d3565b92915050565b60006020828403121561419857614197613552565b5b60006141a68482850161416d565b91505092915050565b7f496e73756666696369656e7420746f6b656e2062616c616e6365000000000000600082015250565b60006141e5601a83613622565b91506141f0826141af565b602082019050919050565b60006020820190508181036000830152614214816141d8565b9050919050565b6000604082019050614230600083018561375e565b61423d60208301846137f4565b9392505050565b60008151905061425381613941565b92915050565b60006020828403121561426f5761426e613552565b5b600061427d84828501614244565b91505092915050565b7f4552433732313a20696e76616c696420746f6b656e2049440000000000000000600082015250565b60006142bc601883613622565b91506142c782614286565b602082019050919050565b600060208201905081810360008301526142eb816142af565b9050919050565b7f4d6178696d756d20737570706c79207265616368656400000000000000000000600082015250565b6000614328601683613622565b9150614333826142f2565b602082019050919050565b600060208201905081810360008301526143578161431b565b9050919050565b7f496e73756666696369656e74207061796d656e7420746f6b656e2062616c616e60008201527f6365000000000000000000000000000000000000000000000000000000000000602082015250565b60006143ba602283613622565b91506143c58261435e565b604082019050919050565b600060208201905081810360008301526143e9816143ad565b9050919050565b6000604082019050614405600083018561375e565b614412602083018461375e565b9392505050565b7f546f6b656e20616c6c6f77616e6365206e6f742070726f766964656400000000600082015250565b600061444f601c83613622565b915061445a82614419565b602082019050919050565b6000602082019050818103600083015261447e81614442565b9050919050565b600060608201905061449a600083018661375e565b6144a7602083018561375e565b6144b460408301846137f4565b949350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006144f6826136c9565b9150614501836136c9565b9250828201905080821115614519576145186144bc565b5b92915050565b7f4552433732313a2061646472657373207a65726f206973206e6f74206120766160008201527f6c6964206f776e65720000000000000000000000000000000000000000000000602082015250565b600061457b602983613622565b91506145868261451f565b604082019050919050565b600060208201905081810360008301526145aa8161456e565b9050919050565b7f455448206d696e74206c696d6974207265616368656400000000000000000000600082015250565b60006145e7601683613622565b91506145f2826145b1565b602082019050919050565b60006020820190508181036000830152614616816145da565b9050919050565b7f496e636f72726563742045544820616d6f756e742073656e7400000000000000600082015250565b6000614653601983613622565b915061465e8261461d565b602082019050919050565b6000602082019050818103600083015261468281614646565b9050919050565b600081905092915050565b600061469f82613617565b6146a98185614689565b93506146b9818560208601613633565b80840191505092915050565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b60006146fb600583614689565b9150614706826146c5565b600582019050919050565b600061471d8285614694565b91506147298284614694565b9150614734826146ee565b91508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b600061479c602683613622565b91506147a782614740565b604082019050919050565b600060208201905081810360008301526147cb8161478f565b9050919050565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b600061482e602583613622565b9150614839826147d2565b604082019050919050565b6000602082019050818103600083015261485d81614821565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b60006148c0602483613622565b91506148cb82614864565b604082019050919050565b600060208201905081810360008301526148ef816148b3565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b600061492c602083613622565b9150614937826148f6565b602082019050919050565b6000602082019050818103600083015261495b8161491f565b9050919050565b600061496d826136c9565b9150614978836136c9565b92508282039050818111156149905761498f6144bc565b5b92915050565b60006149a1826136c9565b91506149ac836136c9565b92508282026149ba816136c9565b915082820484148315176149d1576149d06144bc565b5b5092915050565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b6000614a0e601083613622565b9150614a19826149d8565b602082019050919050565b60006020820190508181036000830152614a3d81614a01565b9050919050565b6000614a4f826136c9565b9150614a5a836136c9565b925082614a6a57614a69614007565b5b828204905092915050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b6000614aab602083613622565b9150614ab682614a75565b602082019050919050565b60006020820190508181036000830152614ada81614a9e565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b6000614b17601c83613622565b9150614b2282614ae1565b602082019050919050565b60006020820190508181036000830152614b4681614b0a565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b6000614b83601983613622565b9150614b8e82614b4d565b602082019050919050565b60006020820190508181036000830152614bb281614b76565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b6000614c15603283613622565b9150614c2082614bb9565b604082019050919050565b60006020820190508181036000830152614c4481614c08565b9050919050565b7f455243373231456e756d657261626c653a20636f6e736563757469766520747260008201527f616e7366657273206e6f7420737570706f727465640000000000000000000000602082015250565b6000614ca7603583613622565b9150614cb282614c4b565b604082019050919050565b60006020820190508181036000830152614cd681614c9a565b9050919050565b7f5061757361626c653a206e6f7420706175736564000000000000000000000000600082015250565b6000614d13601483613622565b9150614d1e82614cdd565b602082019050919050565b60006020820190508181036000830152614d4281614d06565b9050919050565b600081519050919050565b600082825260208201905092915050565b6000614d7082614d49565b614d7a8185614d54565b9350614d8a818560208601613633565b614d938161365d565b840191505092915050565b6000608082019050614db3600083018761375e565b614dc0602083018661375e565b614dcd60408301856137f4565b8181036060830152614ddf8184614d65565b905095945050505050565b600081519050614df981613588565b92915050565b600060208284031215614e1557614e14613552565b5b6000614e2384828501614dea565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fdfe68747470733a2f2f697066732e696f2f697066732f6261667962656964376c703667366333797933747465696b727a706864366677627a75667835326e6f797137736c36356a796c35746f6c716a66692fa26469706673582212208ffa0a136a1285d31aee21ed5dc443d7ac9ebccc065fe9e7c287341eec4ca4d164736f6c63430008110033
Deployed Bytecode
0x6080604052600436106102725760003560e01c80636a6278421161014f578063a22cb465116100c1578063c732090b1161007a578063c732090b1461090e578063c87b56dd14610939578063c973db0b14610976578063da534353146109a1578063e985e9c5146109cc578063f2fde38b14610a0957610272565b8063a22cb46514610824578063a2309ff81461084d578063a32b9e1814610878578063a6a8e6ea1461088f578063ab864003146108ba578063b88d4fde146108e557610272565b80638c4e94b2116101135780638c4e94b2146107135780638da5cb5b1461073c5780639168ae721461076757806395d89b41146107a55780639d1b464a146107d05780639e447fc6146107fb57610272565b80636a6278421461066357806370a082311461068c578063715018a6146106c957806376e98d33146106e05780638456cb59146106fc57610272565b80633f4ba83a116101e857806352d7462f116101ac57806352d7462f146105535780635997bb371461057c57806359a5032f146105a75780635c975abb146105d25780635e6710de146105fd5780636352211e1461062657610272565b80633f4ba83a1461048257806342842e0e146104995780634df9d6ba146104c25780634e71d92d146104ff5780634f6ccce71461051657610272565b80631b728c7c1161023a5780631b728c7c14610370578063232ff35c1461039b57806323b872dd146103c65780632f745c59146103ef5780633013ce291461042c57806332cb6b0c1461045757610272565b806301ffc9a71461027757806306fdde03146102b4578063081812fc146102df578063095ea7b31461031c57806318160ddd14610345575b600080fd5b34801561028357600080fd5b5061029e600480360381019061029991906135b4565b610a32565b6040516102ab91906135fc565b60405180910390f35b3480156102c057600080fd5b506102c9610aac565b6040516102d691906136a7565b60405180910390f35b3480156102eb57600080fd5b50610306600480360381019061030191906136ff565b610b3e565b604051610313919061376d565b60405180910390f35b34801561032857600080fd5b50610343600480360381019061033e91906137b4565b610b84565b005b34801561035157600080fd5b5061035a610c9b565b6040516103679190613803565b60405180910390f35b34801561037c57600080fd5b50610385610ca8565b6040516103929190613803565b60405180910390f35b3480156103a757600080fd5b506103b0610cb2565b6040516103bd919061376d565b60405180910390f35b3480156103d257600080fd5b506103ed60048036038101906103e8919061381e565b610cca565b005b3480156103fb57600080fd5b50610416600480360381019061041191906137b4565b610d2a565b6040516104239190613803565b60405180910390f35b34801561043857600080fd5b50610441610dcf565b60405161044e91906138d0565b60405180910390f35b34801561046357600080fd5b5061046c610de7565b6040516104799190613803565b60405180910390f35b34801561048e57600080fd5b50610497610ded565b005b3480156104a557600080fd5b506104c060048036038101906104bb919061381e565b610dff565b005b3480156104ce57600080fd5b506104e960048036038101906104e491906138eb565b610e1f565b6040516104f69190613803565b60405180910390f35b34801561050b57600080fd5b50610514610eea565b005b34801561052257600080fd5b5061053d600480360381019061053891906136ff565b611396565b60405161054a9190613803565b60405180910390f35b34801561055f57600080fd5b5061057a600480360381019061057591906138eb565b611407565b005b34801561058857600080fd5b50610591611453565b60405161059e9190613803565b60405180910390f35b3480156105b357600080fd5b506105bc611459565b6040516105c99190613803565b60405180910390f35b3480156105de57600080fd5b506105e761145f565b6040516105f491906135fc565b60405180910390f35b34801561060957600080fd5b50610624600480360381019061061f91906136ff565b611476565b005b34801561063257600080fd5b5061064d600480360381019061064891906136ff565b6115eb565b60405161065a919061376d565b60405180910390f35b34801561066f57600080fd5b5061068a600480360381019061068591906138eb565b611671565b005b34801561069857600080fd5b506106b360048036038101906106ae91906138eb565b6119e8565b6040516106c09190613803565b60405180910390f35b3480156106d557600080fd5b506106de611a9f565b005b6106fa60048036038101906106f591906138eb565b611ab3565b005b34801561070857600080fd5b50610711611c09565b005b34801561071f57600080fd5b5061073a600480360381019061073591906136ff565b611c1b565b005b34801561074857600080fd5b50610751611c2d565b60405161075e919061376d565b60405180910390f35b34801561077357600080fd5b5061078e600480360381019061078991906138eb565b611c57565b60405161079c929190613918565b60405180910390f35b3480156107b157600080fd5b506107ba611c7b565b6040516107c791906136a7565b60405180910390f35b3480156107dc57600080fd5b506107e5611d0d565b6040516107f29190613803565b60405180910390f35b34801561080757600080fd5b50610822600480360381019061081d91906136ff565b611d13565b005b34801561083057600080fd5b5061084b6004803603810190610846919061396d565b611d25565b005b34801561085957600080fd5b50610862611d3b565b60405161086f9190613803565b60405180910390f35b34801561088457600080fd5b5061088d611d41565b005b34801561089b57600080fd5b506108a4611d99565b6040516108b19190613803565b60405180910390f35b3480156108c657600080fd5b506108cf611d9f565b6040516108dc9190613803565b60405180910390f35b3480156108f157600080fd5b5061090c60048036038101906109079190613ae2565b611da5565b005b34801561091a57600080fd5b50610923611e07565b6040516109309190613b86565b60405180910390f35b34801561094557600080fd5b50610960600480360381019061095b91906136ff565b611e2d565b60405161096d91906136a7565b60405180910390f35b34801561098257600080fd5b5061098b611e8c565b6040516109989190613803565b60405180910390f35b3480156109ad57600080fd5b506109b6611e92565b6040516109c39190613803565b60405180910390f35b3480156109d857600080fd5b506109f360048036038101906109ee9190613ba1565b611e98565b604051610a0091906135fc565b60405180910390f35b348015610a1557600080fd5b50610a306004803603810190610a2b91906138eb565b611f2c565b005b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610aa55750610aa482611faf565b5b9050919050565b606060008054610abb90613c10565b80601f0160208091040260200160405190810160405280929190818152602001828054610ae790613c10565b8015610b345780601f10610b0957610100808354040283529160200191610b34565b820191906000526020600020905b815481529060010190602001808311610b1757829003601f168201915b5050505050905090565b6000610b4982612091565b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610b8f826115eb565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610bff576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bf690613cb3565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610c1e6120dc565b73ffffffffffffffffffffffffffffffffffffffff161480610c4d5750610c4c81610c476120dc565b611e98565b5b610c8c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c8390613d45565b60405180910390fd5b610c9683836120e4565b505050565b6000600880549050905090565b6000601254905090565b735b8ba3cb21f36a06b3a86774103f8dbda14483ec81565b610cdb610cd56120dc565b8261219d565b610d1a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d1190613dd7565b60405180910390fd5b610d25838383612232565b505050565b6000610d35836119e8565b8210610d76576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d6d90613e69565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b73fb6b23ade938ed16f769833b2ff92ca26303390b81565b61115c81565b610df561252b565b610dfd6125a9565b565b610e1a83838360405180602001604052806000815250611da5565b505050565b600080601360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000015403610e735760009050610ee5565b6000610eca601360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001544261260c90919063ffffffff16565b9050610ee16010548261262290919063ffffffff16565b9150505b919050565b610ef2612638565b6000601360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000015411610f77576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f6e90613ed5565b60405180910390fd5b6000610f8233610e1f565b905060008111610fc7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fbe90613f41565b60405180910390fd5b60006064423344604051602001610fe093929190613fca565b6040516020818303038152906040528051906020012060001c6110039190614036565b905060006005821015611018578290506110ea565b601982101561104f57611048606461103a603c8661262290919063ffffffff16565b61268290919063ffffffff16565b90506110e9565b60418210156110865761107f606461107160328661262290919063ffffffff16565b61268290919063ffffffff16565b90506110e8565b607d8210156110bd576110b660646110a860288661262290919063ffffffff16565b61268290919063ffffffff16565b90506110e7565b6110e460646110d660148661262290919063ffffffff16565b61268290919063ffffffff16565b90505b5b5b5b60006110ff828561260c90919063ffffffff16565b90506005831015611148577fd5f65ed25024af5eba200913a9e78a760da2f77eaa84f9954ae85f092282c3a7828260405161113b929190613918565b60405180910390a161125a565b601983101561118f577feb2d9627b42a9006aabd27fbded6d1922922d5ff5634929e22c19120ee68ed288282604051611182929190613918565b60405180910390a1611259565b60418310156111d6577fd5ada35c17b0de375895548094339eed33f9da82915287b20f934f9007abfbea82826040516111c9929190613918565b60405180910390a1611258565b607d83101561121d577f07b1cefedfd24e27d13a276638759c959cb7a29f3ca7c8d1ad1aa60cfa5422ed8282604051611210929190613918565b60405180910390a1611257565b7fdb0e004ed1cb53f97c2a8f988cbc15c355c0c14dea3b1d22c47f36e5da747522828260405161124e929190613918565b60405180910390a15b5b5b5b6000601360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001018190555042601360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000181905550600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f699529133735b8ba3cb21f36a06b3a86774103f8dbda14483ec84866040518563ffffffff1660e01b815260040161135e9493929190614067565b600060405180830381600087803b15801561137857600080fd5b505af115801561138c573d6000803e3d6000fd5b5050505050505050565b60006113a0610c9b565b82106113e1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113d89061411e565b60405180910390fd5b600882815481106113f5576113f461413e565b5b90600052602060002001549050919050565b61140f61252b565b80600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600f5481565b600c5481565b6000600a60149054906101000a900460ff16905090565b61147e61252b565b8073fb6b23ade938ed16f769833b2ff92ca26303390b73ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016114cc919061376d565b602060405180830381865afa1580156114e9573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061150d9190614182565b101561154e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611545906141fb565b60405180910390fd5b73fb6b23ade938ed16f769833b2ff92ca26303390b73ffffffffffffffffffffffffffffffffffffffff1663a9059cbb611586611c2d565b836040518363ffffffff1660e01b81526004016115a492919061421b565b6020604051808303816000875af11580156115c3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115e79190614259565b5050565b6000806115f783612698565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611668576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161165f906142d2565b60405180910390fd5b80915050919050565b611679612638565b61115c600e54106116bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116b69061433e565b60405180910390fd5b600d5473fb6b23ade938ed16f769833b2ff92ca26303390b73ffffffffffffffffffffffffffffffffffffffff166370a08231336040518263ffffffff1660e01b815260040161170f919061376d565b602060405180830381865afa15801561172c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117509190614182565b1015611791576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611788906143d0565b60405180910390fd5b600d5473fb6b23ade938ed16f769833b2ff92ca26303390b73ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e33306040518363ffffffff1660e01b81526004016117e39291906143f0565b602060405180830381865afa158015611800573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118249190614182565b1015611865576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161185c90614465565b60405180910390fd5b73fb6b23ade938ed16f769833b2ff92ca26303390b73ffffffffffffffffffffffffffffffffffffffff166323b872dd336000600d546040518463ffffffff1660e01b81526004016118b993929190614485565b6020604051808303816000875af11580156118d8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118fc9190614259565b5061191a81600161190b610c9b565b61191591906144eb565b6126d5565b6119306001600e546128f290919063ffffffff16565b600e8190555061197361196260646119546003600d5461262290919063ffffffff16565b61268290919063ffffffff16565b600d546128f290919063ffffffff16565b600d8190555060405180604001604052804281526020016000815250601360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082015181600001556020820151816001015590505050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611a58576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a4f90614591565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611aa761252b565b611ab16000612908565b565b611abb612638565b6101bc60125410611b01576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611af8906145fd565b60405180910390fd5b6011543414611b45576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b3c90614669565b60405180910390fd5b611b62816001611b53610c9b565b611b5d91906144eb565b6126d5565b611b786001600e546128f290919063ffffffff16565b600e81905550611b9460016012546128f290919063ffffffff16565b60128190555060405180604001604052804281526020016000815250601360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082015181600001556020820151816001015590505050565b611c1161252b565b611c196129ce565b565b611c2361252b565b80600c8190555050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60136020528060005260406000206000915090508060000154908060010154905082565b606060018054611c8a90613c10565b80601f0160208091040260200160405190810160405280929190818152602001828054611cb690613c10565b8015611d035780601f10611cd857610100808354040283529160200191611d03565b820191906000526020600020905b815481529060010190602001808311611ce657829003601f168201915b5050505050905090565b600d5481565b611d1b61252b565b80600f8190555050565b611d37611d306120dc565b8383612a31565b5050565b600e5481565b611d4961252b565b611d51611c2d565b73ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015611d96573d6000803e3d6000fd5b50565b6101bc81565b60125481565b611db6611db06120dc565b8361219d565b611df5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dec90613dd7565b60405180910390fd5b611e0184848484612b9d565b50505050565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60606000611e39612bf9565b90506000815111611e595760405180602001604052806000815250611e84565b80611e6384612c19565b604051602001611e74929190614711565b6040516020818303038152906040525b915050919050565b60115481565b60105481565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611f3461252b565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611fa3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f9a906147b2565b60405180910390fd5b611fac81612908565b50565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061207a57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061208a575061208982612ce7565b5b9050919050565b61209a81612d51565b6120d9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120d0906142d2565b60405180910390fd5b50565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16612157836115eb565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000806121a9836115eb565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806121eb57506121ea8185611e98565b5b8061222957508373ffffffffffffffffffffffffffffffffffffffff1661221184610b3e565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16612252826115eb565b73ffffffffffffffffffffffffffffffffffffffff16146122a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161229f90614844565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612317576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161230e906148d6565b60405180910390fd5b6123248383836001612d92565b8273ffffffffffffffffffffffffffffffffffffffff16612344826115eb565b73ffffffffffffffffffffffffffffffffffffffff161461239a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161239190614844565b60405180910390fd5b6004600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46125268383836001612ef0565b505050565b6125336120dc565b73ffffffffffffffffffffffffffffffffffffffff16612551611c2d565b73ffffffffffffffffffffffffffffffffffffffff16146125a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161259e90614942565b60405180910390fd5b565b6125b1612ef6565b6000600a60146101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa6125f56120dc565b604051612602919061376d565b60405180910390a1565b6000818361261a9190614962565b905092915050565b600081836126309190614996565b905092915050565b61264061145f565b15612680576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161267790614a24565b60405180910390fd5b565b600081836126909190614a44565b905092915050565b60006002600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612744576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161273b90614ac1565b60405180910390fd5b61274d81612d51565b1561278d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161278490614b2d565b60405180910390fd5b61279b600083836001612d92565b6127a481612d51565b156127e4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127db90614b2d565b60405180910390fd5b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46128ee600083836001612ef0565b5050565b6000818361290091906144eb565b905092915050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6129d6612638565b6001600a60146101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258612a1a6120dc565b604051612a27919061376d565b60405180910390a1565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612a9f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a9690614b99565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051612b9091906135fc565b60405180910390a3505050565b612ba8848484612232565b612bb484848484612f3f565b612bf3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bea90614c2b565b60405180910390fd5b50505050565b6060604051806080016040528060518152602001614e5c60519139905090565b606060006001612c28846130c6565b01905060008167ffffffffffffffff811115612c4757612c466139b7565b5b6040519080825280601f01601f191660200182016040528015612c795781602001600182028036833780820191505090505b509050600082602001820190505b600115612cdc578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a8581612cd057612ccf614007565b5b04945060008503612c87575b819350505050919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008073ffffffffffffffffffffffffffffffffffffffff16612d7383612698565b73ffffffffffffffffffffffffffffffffffffffff1614159050919050565b612d9e84848484613219565b6001811115612de2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612dd990614cbd565b60405180910390fd5b6000829050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603612e2957612e248161321f565b612e68565b8373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614612e6757612e668582613268565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603612eaa57612ea5816133d5565b612ee9565b8473ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614612ee857612ee784826134a6565b5b5b5050505050565b50505050565b612efe61145f565b612f3d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f3490614d29565b60405180910390fd5b565b6000612f608473ffffffffffffffffffffffffffffffffffffffff16613525565b156130b9578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612f896120dc565b8786866040518563ffffffff1660e01b8152600401612fab9493929190614d9e565b6020604051808303816000875af1925050508015612fe757506040513d601f19601f82011682018060405250810190612fe49190614dff565b60015b613069573d8060008114613017576040519150601f19603f3d011682016040523d82523d6000602084013e61301c565b606091505b506000815103613061576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161305890614c2b565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506130be565b600190505b949350505050565b600080600090507a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008310613124577a184f03e93ff9f4daa797ed6e38ed64bf6a1f010000000000000000838161311a57613119614007565b5b0492506040810190505b6d04ee2d6d415b85acef81000000008310613161576d04ee2d6d415b85acef8100000000838161315757613156614007565b5b0492506020810190505b662386f26fc10000831061319057662386f26fc10000838161318657613185614007565b5b0492506010810190505b6305f5e10083106131b9576305f5e10083816131af576131ae614007565b5b0492506008810190505b61271083106131de5761271083816131d4576131d3614007565b5b0492506004810190505b6064831061320157606483816131f7576131f6614007565b5b0492506002810190505b600a8310613210576001810190505b80915050919050565b50505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001613275846119e8565b61327f9190614962565b9050600060076000848152602001908152602001600020549050818114613364576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b600060016008805490506133e99190614962565b90506000600960008481526020019081526020016000205490506000600883815481106134195761341861413e565b5b90600052602060002001549050806008838154811061343b5761343a61413e565b5b90600052602060002001819055508160096000838152602001908152602001600020819055506009600085815260200190815260200160002060009055600880548061348a57613489614e2c565b5b6001900381819060005260206000200160009055905550505050565b60006134b1836119e8565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6135918161355c565b811461359c57600080fd5b50565b6000813590506135ae81613588565b92915050565b6000602082840312156135ca576135c9613552565b5b60006135d88482850161359f565b91505092915050565b60008115159050919050565b6135f6816135e1565b82525050565b600060208201905061361160008301846135ed565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015613651578082015181840152602081019050613636565b60008484015250505050565b6000601f19601f8301169050919050565b600061367982613617565b6136838185613622565b9350613693818560208601613633565b61369c8161365d565b840191505092915050565b600060208201905081810360008301526136c1818461366e565b905092915050565b6000819050919050565b6136dc816136c9565b81146136e757600080fd5b50565b6000813590506136f9816136d3565b92915050565b60006020828403121561371557613714613552565b5b6000613723848285016136ea565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006137578261372c565b9050919050565b6137678161374c565b82525050565b6000602082019050613782600083018461375e565b92915050565b6137918161374c565b811461379c57600080fd5b50565b6000813590506137ae81613788565b92915050565b600080604083850312156137cb576137ca613552565b5b60006137d98582860161379f565b92505060206137ea858286016136ea565b9150509250929050565b6137fd816136c9565b82525050565b600060208201905061381860008301846137f4565b92915050565b60008060006060848603121561383757613836613552565b5b60006138458682870161379f565b93505060206138568682870161379f565b9250506040613867868287016136ea565b9150509250925092565b6000819050919050565b600061389661389161388c8461372c565b613871565b61372c565b9050919050565b60006138a88261387b565b9050919050565b60006138ba8261389d565b9050919050565b6138ca816138af565b82525050565b60006020820190506138e560008301846138c1565b92915050565b60006020828403121561390157613900613552565b5b600061390f8482850161379f565b91505092915050565b600060408201905061392d60008301856137f4565b61393a60208301846137f4565b9392505050565b61394a816135e1565b811461395557600080fd5b50565b60008135905061396781613941565b92915050565b6000806040838503121561398457613983613552565b5b60006139928582860161379f565b92505060206139a385828601613958565b9150509250929050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6139ef8261365d565b810181811067ffffffffffffffff82111715613a0e57613a0d6139b7565b5b80604052505050565b6000613a21613548565b9050613a2d82826139e6565b919050565b600067ffffffffffffffff821115613a4d57613a4c6139b7565b5b613a568261365d565b9050602081019050919050565b82818337600083830152505050565b6000613a85613a8084613a32565b613a17565b905082815260208101848484011115613aa157613aa06139b2565b5b613aac848285613a63565b509392505050565b600082601f830112613ac957613ac86139ad565b5b8135613ad9848260208601613a72565b91505092915050565b60008060008060808587031215613afc57613afb613552565b5b6000613b0a8782880161379f565b9450506020613b1b8782880161379f565b9350506040613b2c878288016136ea565b925050606085013567ffffffffffffffff811115613b4d57613b4c613557565b5b613b5987828801613ab4565b91505092959194509250565b6000613b708261389d565b9050919050565b613b8081613b65565b82525050565b6000602082019050613b9b6000830184613b77565b92915050565b60008060408385031215613bb857613bb7613552565b5b6000613bc68582860161379f565b9250506020613bd78582860161379f565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680613c2857607f821691505b602082108103613c3b57613c3a613be1565b5b50919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b6000613c9d602183613622565b9150613ca882613c41565b604082019050919050565b60006020820190508181036000830152613ccc81613c90565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60008201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c000000602082015250565b6000613d2f603d83613622565b9150613d3a82613cd3565b604082019050919050565b60006020820190508181036000830152613d5e81613d22565b9050919050565b7f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560008201527f72206f7220617070726f76656400000000000000000000000000000000000000602082015250565b6000613dc1602d83613622565b9150613dcc82613d65565b604082019050919050565b60006020820190508181036000830152613df081613db4565b9050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b6000613e53602b83613622565b9150613e5e82613df7565b604082019050919050565b60006020820190508181036000830152613e8281613e46565b9050919050565b7f4e6f7420686f6c64696e67206f72207374616b696e6720616e79204e46547300600082015250565b6000613ebf601f83613622565b9150613eca82613e89565b602082019050919050565b60006020820190508181036000830152613eee81613eb2565b9050919050565b7f4e6f207265776172647320617661696c61626c65000000000000000000000000600082015250565b6000613f2b601483613622565b9150613f3682613ef5565b602082019050919050565b60006020820190508181036000830152613f5a81613f1e565b9050919050565b6000819050919050565b613f7c613f77826136c9565b613f61565b82525050565b60008160601b9050919050565b6000613f9a82613f82565b9050919050565b6000613fac82613f8f565b9050919050565b613fc4613fbf8261374c565b613fa1565b82525050565b6000613fd68286613f6b565b602082019150613fe68285613fb3565b601482019150613ff68284613f6b565b602082019150819050949350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000614041826136c9565b915061404c836136c9565b92508261405c5761405b614007565b5b828206905092915050565b600060808201905061407c600083018761375e565b614089602083018661375e565b61409660408301856137f4565b6140a360608301846137f4565b95945050505050565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b6000614108602c83613622565b9150614113826140ac565b604082019050919050565b60006020820190508181036000830152614137816140fb565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60008151905061417c816136d3565b92915050565b60006020828403121561419857614197613552565b5b60006141a68482850161416d565b91505092915050565b7f496e73756666696369656e7420746f6b656e2062616c616e6365000000000000600082015250565b60006141e5601a83613622565b91506141f0826141af565b602082019050919050565b60006020820190508181036000830152614214816141d8565b9050919050565b6000604082019050614230600083018561375e565b61423d60208301846137f4565b9392505050565b60008151905061425381613941565b92915050565b60006020828403121561426f5761426e613552565b5b600061427d84828501614244565b91505092915050565b7f4552433732313a20696e76616c696420746f6b656e2049440000000000000000600082015250565b60006142bc601883613622565b91506142c782614286565b602082019050919050565b600060208201905081810360008301526142eb816142af565b9050919050565b7f4d6178696d756d20737570706c79207265616368656400000000000000000000600082015250565b6000614328601683613622565b9150614333826142f2565b602082019050919050565b600060208201905081810360008301526143578161431b565b9050919050565b7f496e73756666696369656e74207061796d656e7420746f6b656e2062616c616e60008201527f6365000000000000000000000000000000000000000000000000000000000000602082015250565b60006143ba602283613622565b91506143c58261435e565b604082019050919050565b600060208201905081810360008301526143e9816143ad565b9050919050565b6000604082019050614405600083018561375e565b614412602083018461375e565b9392505050565b7f546f6b656e20616c6c6f77616e6365206e6f742070726f766964656400000000600082015250565b600061444f601c83613622565b915061445a82614419565b602082019050919050565b6000602082019050818103600083015261447e81614442565b9050919050565b600060608201905061449a600083018661375e565b6144a7602083018561375e565b6144b460408301846137f4565b949350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006144f6826136c9565b9150614501836136c9565b9250828201905080821115614519576145186144bc565b5b92915050565b7f4552433732313a2061646472657373207a65726f206973206e6f74206120766160008201527f6c6964206f776e65720000000000000000000000000000000000000000000000602082015250565b600061457b602983613622565b91506145868261451f565b604082019050919050565b600060208201905081810360008301526145aa8161456e565b9050919050565b7f455448206d696e74206c696d6974207265616368656400000000000000000000600082015250565b60006145e7601683613622565b91506145f2826145b1565b602082019050919050565b60006020820190508181036000830152614616816145da565b9050919050565b7f496e636f72726563742045544820616d6f756e742073656e7400000000000000600082015250565b6000614653601983613622565b915061465e8261461d565b602082019050919050565b6000602082019050818103600083015261468281614646565b9050919050565b600081905092915050565b600061469f82613617565b6146a98185614689565b93506146b9818560208601613633565b80840191505092915050565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b60006146fb600583614689565b9150614706826146c5565b600582019050919050565b600061471d8285614694565b91506147298284614694565b9150614734826146ee565b91508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b600061479c602683613622565b91506147a782614740565b604082019050919050565b600060208201905081810360008301526147cb8161478f565b9050919050565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b600061482e602583613622565b9150614839826147d2565b604082019050919050565b6000602082019050818103600083015261485d81614821565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b60006148c0602483613622565b91506148cb82614864565b604082019050919050565b600060208201905081810360008301526148ef816148b3565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b600061492c602083613622565b9150614937826148f6565b602082019050919050565b6000602082019050818103600083015261495b8161491f565b9050919050565b600061496d826136c9565b9150614978836136c9565b92508282039050818111156149905761498f6144bc565b5b92915050565b60006149a1826136c9565b91506149ac836136c9565b92508282026149ba816136c9565b915082820484148315176149d1576149d06144bc565b5b5092915050565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b6000614a0e601083613622565b9150614a19826149d8565b602082019050919050565b60006020820190508181036000830152614a3d81614a01565b9050919050565b6000614a4f826136c9565b9150614a5a836136c9565b925082614a6a57614a69614007565b5b828204905092915050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b6000614aab602083613622565b9150614ab682614a75565b602082019050919050565b60006020820190508181036000830152614ada81614a9e565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b6000614b17601c83613622565b9150614b2282614ae1565b602082019050919050565b60006020820190508181036000830152614b4681614b0a565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b6000614b83601983613622565b9150614b8e82614b4d565b602082019050919050565b60006020820190508181036000830152614bb281614b76565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b6000614c15603283613622565b9150614c2082614bb9565b604082019050919050565b60006020820190508181036000830152614c4481614c08565b9050919050565b7f455243373231456e756d657261626c653a20636f6e736563757469766520747260008201527f616e7366657273206e6f7420737570706f727465640000000000000000000000602082015250565b6000614ca7603583613622565b9150614cb282614c4b565b604082019050919050565b60006020820190508181036000830152614cd681614c9a565b9050919050565b7f5061757361626c653a206e6f7420706175736564000000000000000000000000600082015250565b6000614d13601483613622565b9150614d1e82614cdd565b602082019050919050565b60006020820190508181036000830152614d4281614d06565b9050919050565b600081519050919050565b600082825260208201905092915050565b6000614d7082614d49565b614d7a8185614d54565b9350614d8a818560208601613633565b614d938161365d565b840191505092915050565b6000608082019050614db3600083018761375e565b614dc0602083018661375e565b614dcd60408301856137f4565b8181036060830152614ddf8184614d65565b905095945050505050565b600081519050614df981613588565b92915050565b600060208284031215614e1557614e14613552565b5b6000614e2384828501614dea565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fdfe68747470733a2f2f697066732e696f2f697066732f6261667962656964376c703667366333797933747465696b727a706864366677627a75667835326e6f797137736c36356a796c35746f6c716a66692fa26469706673582212208ffa0a136a1285d31aee21ed5dc443d7ac9ebccc065fe9e7c287341eec4ca4d164736f6c63430008110033
Deployed Bytecode Sourcemap
77300:6205:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;71151:224;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55200:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56712:171;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56230:416;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;71791:113;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;83098:99;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;77667:89;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57412:301;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;71459:256;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;77572:88;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;78549:41;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;83276:67;;;;;;;;;;;;;:::i;:::-;;57784:151;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;82225:302;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;80487:1730;;;;;;;;;;;;;:::i;:::-;;71981:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;83351:151;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;78434:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;78299:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29672:86;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;82872:218;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54910:223;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;79269:730;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54641:207;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32530:103;;;;;;;;;;;;;:::i;:::-;;80007:472;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;83205:63;;;;;;;;;;;;;:::i;:::-;;82535:100;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;31889:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;78823:44;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;55369:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;78339:49;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;82643:97;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56955:155;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;78395:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;82748:116;;;;;;;;;;;;;:::i;:::-;;78684:44;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;78644:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58006:279;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;77763:102;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;78990:271;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;78597:40;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;78475:67;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57181:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32788:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;71151:224;71253:4;71292:35;71277:50;;;:11;:50;;;;:90;;;;71331:36;71355:11;71331:23;:36::i;:::-;71277:90;71270:97;;71151:224;;;:::o;55200:100::-;55254:13;55287:5;55280:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55200:100;:::o;56712:171::-;56788:7;56808:23;56823:7;56808:14;:23::i;:::-;56851:15;:24;56867:7;56851:24;;;;;;;;;;;;;;;;;;;;;56844:31;;56712:171;;;:::o;56230:416::-;56311:13;56327:23;56342:7;56327:14;:23::i;:::-;56311:39;;56375:5;56369:11;;:2;:11;;;56361:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;56469:5;56453:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;56478:37;56495:5;56502:12;:10;:12::i;:::-;56478:16;:37::i;:::-;56453:62;56431:173;;;;;;;;;;;;:::i;:::-;;;;;;;;;56617:21;56626:2;56630:7;56617:8;:21::i;:::-;56300:346;56230:416;;:::o;71791:113::-;71852:7;71879:10;:17;;;;71872:24;;71791:113;:::o;83098:99::-;83148:7;83175:14;;83168:21;;83098:99;:::o;77667:89::-;77714:42;77667:89;:::o;57412:301::-;57573:41;57592:12;:10;:12::i;:::-;57606:7;57573:18;:41::i;:::-;57565:99;;;;;;;;;;;;:::i;:::-;;;;;;;;;57677:28;57687:4;57693:2;57697:7;57677:9;:28::i;:::-;57412:301;;;:::o;71459:256::-;71556:7;71592:23;71609:5;71592:16;:23::i;:::-;71584:5;:31;71576:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;71681:12;:19;71694:5;71681:19;;;;;;;;;;;;;;;:26;71701:5;71681:26;;;;;;;;;;;;71674:33;;71459:256;;;;:::o;77572:88::-;77617:42;77572:88;:::o;78549:41::-;78586:4;78549:41;:::o;83276:67::-;31775:13;:11;:13::i;:::-;83325:10:::1;:8;:10::i;:::-;83276:67::o:0;57784:151::-;57888:39;57905:4;57911:2;57915:7;57888:39;;;;;;;;;;;;:16;:39::i;:::-;57784:151;;;:::o;82225:302::-;82289:7;82343:1;82313:7;:16;82321:7;82313:16;;;;;;;;;;;;;;;:26;;;:31;82309:45;;82353:1;82346:8;;;;82309:45;82367:31;82401:47;82421:7;:16;82429:7;82421:16;;;;;;;;;;;;;;;:26;;;82401:15;:19;;:47;;;;:::i;:::-;82367:81;;82468:51;82496:22;;82468:23;:27;;:51;;;;:::i;:::-;82461:58;;;82225:302;;;;:::o;80487:1730::-;29277:19;:17;:19::i;:::-;80576:1:::1;80544:7;:19;80552:10;80544:19;;;;;;;;;;;;;;;:29;;;:33;80536:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;80626:21;80650:28;80667:10;80650:16;:28::i;:::-;80626:52;;80713:1;80697:13;:17;80689:50;;;;;;;;;;;;:::i;:::-;;;;;;;;;80752:20;80861:3;80810:15;80827:10;80839:16;80793:63;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;80783:74;;;;;;80775:83;;:89;;;;:::i;:::-;80752:112;;80875:18;80929:1;80914:12;:16;80910:510;;;80960:13;80947:26;;80910:510;;;81023:2;81008:12;:17;81004:416;;;81055:30;81081:3;81055:21;81073:2;81055:13;:17;;:21;;;;:::i;:::-;:25;;:30;;;;:::i;:::-;81042:43;;81004:416;;;81134:2;81119:12;:17;81115:305;;;81166:30;81192:3;81166:21;81184:2;81166:13;:17;;:21;;;;:::i;:::-;:25;;:30;;;;:::i;:::-;81153:43;;81115:305;;;81245:3;81230:12;:18;81226:194;;;81278:30;81304:3;81278:21;81296:2;81278:13;:17;;:21;;;;:::i;:::-;:25;;:30;;;;:::i;:::-;81265:43;;81226:194;;;81366:30;81392:3;81366:21;81384:2;81366:13;:17;;:21;;;;:::i;:::-;:25;;:30;;;;:::i;:::-;81353:43;;81226:194;81115:305;81004:416;80910:510;81432:19;81454:29;81472:10;81454:13;:17;;:29;;;;:::i;:::-;81432:51;;81569:1;81554:12;:16;81550:461;;;81592:39;81607:10;81619:11;81592:39;;;;;;;:::i;:::-;;;;;;;;81550:461;;;81668:2;81653:12;:17;81649:362;;;81692:38;81706:10;81718:11;81692:38;;;;;;;:::i;:::-;;;;;;;;81649:362;;;81767:2;81752:12;:17;81748:263;;;81791:35;81802:10;81814:11;81791:35;;;;;;;:::i;:::-;;;;;;;;81748:263;;;81863:3;81848:12;:18;81844:167;;;81888:37;81901:10;81913:11;81888:37;;;;;;;:::i;:::-;;;;;;;;81844:167;;;81963:36;81975:10;81987:11;81963:36;;;;;;;:::i;:::-;;;;;;;;81844:167;81748:263;81649:362;81550:461;82052:1;82023:7;:19;82031:10;82023:19;;;;;;;;;;;;;;;:26;;:30;;;;82096:15;82064:7;:19;82072:10;82064:19;;;;;;;;;;;;;;;:29;;:47;;;;82124:13;;;;;;;;;;;:26;;;82151:10;77714:42;82185:11;82198:10;82124:85;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;80525:1692;;;;80487:1730::o:0;71981:233::-;72056:7;72092:30;:28;:30::i;:::-;72084:5;:38;72076:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;72189:10;72200:5;72189:17;;;;;;;;:::i;:::-;;;;;;;;;;72182:24;;71981:233;;;:::o;83351:151::-;31775:13;:11;:13::i;:::-;83472:21:::1;83438:13;;:56;;;;;;;;;;;;;;;;;;83351:151:::0;:::o;78434:34::-;;;;:::o;78299:33::-;;;;:::o;29672:86::-;29719:4;29743:7;;;;;;;;;;;29736:14;;29672:86;:::o;82872:218::-;31775:13;:11;:13::i;:::-;82996:6:::1;77617:42;82955:22;;;82986:4;82955:37;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:47;;82947:86;;;;;;;;;;;;:::i;:::-;;;;;;;;;77617:42;83044:21;;;83066:7;:5;:7::i;:::-;83075:6;83044:38;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;82872:218:::0;:::o;54910:223::-;54982:7;55002:13;55018:17;55027:7;55018:8;:17::i;:::-;55002:33;;55071:1;55054:19;;:5;:19;;;55046:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;55120:5;55113:12;;;54910:223;;;:::o;79269:730::-;29277:19;:17;:19::i;:::-;78586:4:::1;79337:11;;:24;79329:59;;;;;;;;;;;;:::i;:::-;;;;;;;;;79473:12;;77617:42;79435:22;;;79458:10;79435:34;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:50;;79427:97;;;;;;;;;;;;:::i;:::-;;;;;;;;;79596:12;;77617:42;79543:22;;;79566:10;79586:4;79543:49;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:65;;79535:106;;;;;;;;;;;;:::i;:::-;;;;;;;;;77617:42;79654:25;;;79680:10;79700:1;79704:12;;79654:63;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;79730:28;79736:2;79756:1;79740:13;:11;:13::i;:::-;:17;;;;:::i;:::-;79730:5;:28::i;:::-;79785:18;79801:1;79785:11;;:15;;:18;;;;:::i;:::-;79771:11;:32;;;;79829:46;79846:28;79870:3;79846:19;79863:1;79846:12;;:16;;:19;;;;:::i;:::-;:23;;:28;;;;:::i;:::-;79829:12;;:16;;:46;;;;:::i;:::-;79814:12;:61;;;;79902:87;;;;;;;;79938:15;79902:87;;;;79976:1;79902:87;;::::0;79888:7:::1;:11;79896:2;79888:11;;;;;;;;;;;;;;;:101;;;;;;;;;;;;;;;;;;;79269:730:::0;:::o;54641:207::-;54713:7;54758:1;54741:19;;:5;:19;;;54733:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;54824:9;:16;54834:5;54824:16;;;;;;;;;;;;;;;;54817:23;;54641:207;;;:::o;32530:103::-;31775:13;:11;:13::i;:::-;32595:30:::1;32622:1;32595:18;:30::i;:::-;32530:103::o:0;80007:472::-;29277:19;:17;:19::i;:::-;78725:3:::1;80090:14;;:31;80082:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;80180:12;;80167:9;:25;80159:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;80235:28;80241:2;80261:1;80245:13;:11;:13::i;:::-;:17;;;;:::i;:::-;80235:5;:28::i;:::-;80290:18;80306:1;80290:11;;:15;;:18;;;;:::i;:::-;80276:11;:32;;;;80336:21;80355:1;80336:14;;:18;;:21;;;;:::i;:::-;80319:14;:38;;;;80384:87;;;;;;;;80420:15;80384:87;;;;80458:1;80384:87;;::::0;80370:7:::1;:11;80378:2;80370:11;;;;;;;;;;;;;;;:101;;;;;;;;;;;;;;;;;;;80007:472:::0;:::o;83205:63::-;31775:13;:11;:13::i;:::-;83252:8:::1;:6;:8::i;:::-;83205:63::o:0;82535:100::-;31775:13;:11;:13::i;:::-;82619:8:::1;82605:11;:22;;;;82535:100:::0;:::o;31889:87::-;31935:7;31962:6;;;;;;;;;;;31955:13;;31889:87;:::o;78823:44::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;55369:104::-;55425:13;55458:7;55451:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55369:104;:::o;78339:49::-;;;;:::o;82643:97::-;31775:13;:11;:13::i;:::-;82725:7:::1;82711:11;:21;;;;82643:97:::0;:::o;56955:155::-;57050:52;57069:12;:10;:12::i;:::-;57083:8;57093;57050:18;:52::i;:::-;56955:155;;:::o;78395:30::-;;;;:::o;82748:116::-;31775:13;:11;:13::i;:::-;82816:7:::1;:5;:7::i;:::-;82808:25;;:48;82834:21;82808:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;82748:116::o:0;78684:44::-;78725:3;78684:44;:::o;78644:33::-;;;;:::o;58006:279::-;58137:41;58156:12;:10;:12::i;:::-;58170:7;58137:18;:41::i;:::-;58129:99;;;;;;;;;;;;:::i;:::-;;;;;;;;;58239:38;58253:4;58259:2;58263:7;58272:4;58239:13;:38::i;:::-;58006:279;;;;:::o;77763:102::-;;;;;;;;;;;;;:::o;78990:271::-;79063:13;79089:18;79110:10;:8;:10::i;:::-;79089:31;;79159:1;79144:4;79138:18;:22;:115;;;;;;;;;;;;;;;;;79200:4;79206:18;:7;:16;:18::i;:::-;79183:51;;;;;;;;;:::i;:::-;;;;;;;;;;;;;79138:115;79131:122;;;78990:271;;;:::o;78597:40::-;;;;:::o;78475:67::-;;;;:::o;57181:164::-;57278:4;57302:18;:25;57321:5;57302:25;;;;;;;;;;;;;;;:35;57328:8;57302:35;;;;;;;;;;;;;;;;;;;;;;;;;57295:42;;57181:164;;;;:::o;32788:201::-;31775:13;:11;:13::i;:::-;32897:1:::1;32877:22;;:8;:22;;::::0;32869:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;32953:28;32972:8;32953:18;:28::i;:::-;32788:201:::0;:::o;54272:305::-;54374:4;54426:25;54411:40;;;:11;:40;;;;:105;;;;54483:33;54468:48;;;:11;:48;;;;54411:105;:158;;;;54533:36;54557:11;54533:23;:36::i;:::-;54411:158;54391:178;;54272:305;;;:::o;66275:135::-;66357:16;66365:7;66357;:16::i;:::-;66349:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;66275:135;:::o;27785:98::-;27838:7;27865:10;27858:17;;27785:98;:::o;65588:174::-;65690:2;65663:15;:24;65679:7;65663:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;65746:7;65742:2;65708:46;;65717:23;65732:7;65717:14;:23::i;:::-;65708:46;;;;;;;;;;;;65588:174;;:::o;60275:264::-;60368:4;60385:13;60401:23;60416:7;60401:14;:23::i;:::-;60385:39;;60454:5;60443:16;;:7;:16;;;:52;;;;60463:32;60480:5;60487:7;60463:16;:32::i;:::-;60443:52;:87;;;;60523:7;60499:31;;:20;60511:7;60499:11;:20::i;:::-;:31;;;60443:87;60435:96;;;60275:264;;;;:::o;64240:1229::-;64365:4;64338:31;;:23;64353:7;64338:14;:23::i;:::-;:31;;;64330:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;64444:1;64430:16;;:2;:16;;;64422:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;64500:42;64521:4;64527:2;64531:7;64540:1;64500:20;:42::i;:::-;64672:4;64645:31;;:23;64660:7;64645:14;:23::i;:::-;:31;;;64637:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;64790:15;:24;64806:7;64790:24;;;;;;;;;;;;64783:31;;;;;;;;;;;65285:1;65266:9;:15;65276:4;65266:15;;;;;;;;;;;;;;;;:20;;;;;;;;;;;65318:1;65301:9;:13;65311:2;65301:13;;;;;;;;;;;;;;;;:18;;;;;;;;;;;65360:2;65341:7;:16;65349:7;65341:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;65399:7;65395:2;65380:27;;65389:4;65380:27;;;;;;;;;;;;65420:41;65440:4;65446:2;65450:7;65459:1;65420:19;:41::i;:::-;64240:1229;;;:::o;32054:132::-;32129:12;:10;:12::i;:::-;32118:23;;:7;:5;:7::i;:::-;:23;;;32110:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;32054:132::o;30527:120::-;29536:16;:14;:16::i;:::-;30596:5:::1;30586:7;;:15;;;;;;;;;;;;;;;;;;30617:22;30626:12;:10;:12::i;:::-;30617:22;;;;;;:::i;:::-;;;;;;;;30527:120::o:0;3257:98::-;3315:7;3346:1;3342;:5;;;;:::i;:::-;3335:12;;3257:98;;;;:::o;3614:::-;3672:7;3703:1;3699;:5;;;;:::i;:::-;3692:12;;3614:98;;;;:::o;29831:108::-;29902:8;:6;:8::i;:::-;29901:9;29893:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;29831:108::o;4013:98::-;4071:7;4102:1;4098;:5;;;;:::i;:::-;4091:12;;4013:98;;;;:::o;59550:117::-;59616:7;59643;:16;59651:7;59643:16;;;;;;;;;;;;;;;;;;;;;59636:23;;59550:117;;;:::o;61839:942::-;61933:1;61919:16;;:2;:16;;;61911:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;61992:16;62000:7;61992;:16::i;:::-;61991:17;61983:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;62054:48;62083:1;62087:2;62091:7;62100:1;62054:20;:48::i;:::-;62201:16;62209:7;62201;:16::i;:::-;62200:17;62192:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;62616:1;62599:9;:13;62609:2;62599:13;;;;;;;;;;;;;;;;:18;;;;;;;;;;;62660:2;62641:7;:16;62649:7;62641:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;62705:7;62701:2;62680:33;;62697:1;62680:33;;;;;;;;;;;;62726:47;62754:1;62758:2;62762:7;62771:1;62726:19;:47::i;:::-;61839:942;;:::o;2876:98::-;2934:7;2965:1;2961;:5;;;;:::i;:::-;2954:12;;2876:98;;;;:::o;33149:191::-;33223:16;33242:6;;;;;;;;;;;33223:25;;33268:8;33259:6;;:17;;;;;;;;;;;;;;;;;;33323:8;33292:40;;33313:8;33292:40;;;;;;;;;;;;33212:128;33149:191;:::o;30268:118::-;29277:19;:17;:19::i;:::-;30338:4:::1;30328:7;;:14;;;;;;;;;;;;;;;;;;30358:20;30365:12;:10;:12::i;:::-;30358:20;;;;;;:::i;:::-;;;;;;;;30268:118::o:0;65905:281::-;66026:8;66017:17;;:5;:17;;;66009:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;66113:8;66075:18;:25;66094:5;66075:25;;;;;;;;;;;;;;;:35;66101:8;66075:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;66159:8;66137:41;;66152:5;66137:41;;;66169:8;66137:41;;;;;;:::i;:::-;;;;;;;;65905:281;;;:::o;59166:270::-;59279:28;59289:4;59295:2;59299:7;59279:9;:28::i;:::-;59326:47;59349:4;59355:2;59359:7;59368:4;59326:22;:47::i;:::-;59318:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;59166:270;;;;:::o;78876:106::-;78928:13;78961;;;;;;;;;;;;;;;;;78954:20;;78876:106;:::o;24704:716::-;24760:13;24811:14;24848:1;24828:17;24839:5;24828:10;:17::i;:::-;:21;24811:38;;24864:20;24898:6;24887:18;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24864:41;;24920:11;25049:6;25045:2;25041:15;25033:6;25029:28;25022:35;;25086:288;25093:4;25086:288;;;25118:5;;;;;;;;25260:8;25255:2;25248:5;25244:14;25239:30;25234:3;25226:44;25316:2;25307:11;;;;;;:::i;:::-;;;;;25350:1;25341:5;:10;25086:288;25337:21;25086:288;25395:6;25388:13;;;;;24704:716;;;:::o;45816:157::-;45901:4;45940:25;45925:40;;;:11;:40;;;;45918:47;;45816:157;;;:::o;59980:128::-;60045:4;60098:1;60069:31;;:17;60078:7;60069:8;:17::i;:::-;:31;;;;60062:38;;59980:128;;;:::o;72288:915::-;72465:61;72492:4;72498:2;72502:12;72516:9;72465:26;:61::i;:::-;72555:1;72543:9;:13;72539:222;;;72686:63;;;;;;;;;;:::i;:::-;;;;;;;;72539:222;72773:15;72791:12;72773:30;;72836:1;72820:18;;:4;:18;;;72816:187;;72855:40;72887:7;72855:31;:40::i;:::-;72816:187;;;72925:2;72917:10;;:4;:10;;;72913:90;;72944:47;72977:4;72983:7;72944:32;:47::i;:::-;72913:90;72816:187;73031:1;73017:16;;:2;:16;;;73013:183;;73050:45;73087:7;73050:36;:45::i;:::-;73013:183;;;73123:4;73117:10;;:2;:10;;;73113:83;;73144:40;73172:2;73176:7;73144:27;:40::i;:::-;73113:83;73013:183;72454:749;72288:915;;;;:::o;69397:115::-;;;;;:::o;30016:108::-;30083:8;:6;:8::i;:::-;30075:41;;;;;;;;;;;;:::i;:::-;;;;;;;;;30016:108::o;66974:853::-;67128:4;67149:15;:2;:13;;;:15::i;:::-;67145:675;;;67201:2;67185:36;;;67222:12;:10;:12::i;:::-;67236:4;67242:7;67251:4;67185:71;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;67181:584;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;67443:1;67426:6;:13;:18;67422:328;;67469:60;;;;;;;;;;:::i;:::-;;;;;;;;67422:328;67700:6;67694:13;67685:6;67681:2;67677:15;67670:38;67181:584;67317:41;;;67307:51;;;:6;:51;;;;67300:58;;;;;67145:675;67804:4;67797:11;;66974:853;;;;;;;:::o;21538:948::-;21591:7;21611:14;21628:1;21611:18;;21678:8;21669:5;:17;21665:106;;21716:8;21707:17;;;;;;:::i;:::-;;;;;21753:2;21743:12;;;;21665:106;21798:8;21789:5;:17;21785:106;;21836:8;21827:17;;;;;;:::i;:::-;;;;;21873:2;21863:12;;;;21785:106;21918:8;21909:5;:17;21905:106;;21956:8;21947:17;;;;;;:::i;:::-;;;;;21993:2;21983:12;;;;21905:106;22038:7;22029:5;:16;22025:103;;22075:7;22066:16;;;;;;:::i;:::-;;;;;22111:1;22101:11;;;;22025:103;22155:7;22146:5;:16;22142:103;;22192:7;22183:16;;;;;;:::i;:::-;;;;;22228:1;22218:11;;;;22142:103;22272:7;22263:5;:16;22259:103;;22309:7;22300:16;;;;;;:::i;:::-;;;;;22345:1;22335:11;;;;22259:103;22389:7;22380:5;:16;22376:68;;22427:1;22417:11;;;;22376:68;22472:6;22465:13;;;21538:948;;;:::o;68559:116::-;;;;;:::o;73926:164::-;74030:10;:17;;;;74003:15;:24;74019:7;74003:24;;;;;;;;;;;:44;;;;74058:10;74074:7;74058:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;73926:164;:::o;74717:988::-;74983:22;75033:1;75008:22;75025:4;75008:16;:22::i;:::-;:26;;;;:::i;:::-;74983:51;;75045:18;75066:17;:26;75084:7;75066:26;;;;;;;;;;;;75045:47;;75213:14;75199:10;:28;75195:328;;75244:19;75266:12;:18;75279:4;75266:18;;;;;;;;;;;;;;;:34;75285:14;75266:34;;;;;;;;;;;;75244:56;;75350:11;75317:12;:18;75330:4;75317:18;;;;;;;;;;;;;;;:30;75336:10;75317:30;;;;;;;;;;;:44;;;;75467:10;75434:17;:30;75452:11;75434:30;;;;;;;;;;;:43;;;;75229:294;75195:328;75619:17;:26;75637:7;75619:26;;;;;;;;;;;75612:33;;;75663:12;:18;75676:4;75663:18;;;;;;;;;;;;;;;:34;75682:14;75663:34;;;;;;;;;;;75656:41;;;74798:907;;74717:988;;:::o;76000:1079::-;76253:22;76298:1;76278:10;:17;;;;:21;;;;:::i;:::-;76253:46;;76310:18;76331:15;:24;76347:7;76331:24;;;;;;;;;;;;76310:45;;76682:19;76704:10;76715:14;76704:26;;;;;;;;:::i;:::-;;;;;;;;;;76682:48;;76768:11;76743:10;76754;76743:22;;;;;;;;:::i;:::-;;;;;;;;;:36;;;;76879:10;76848:15;:28;76864:11;76848:28;;;;;;;;;;;:41;;;;77020:15;:24;77036:7;77020:24;;;;;;;;;;;77013:31;;;77055:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;76071:1008;;;76000:1079;:::o;73504:221::-;73589:14;73606:20;73623:2;73606:16;:20::i;:::-;73589:37;;73664:7;73637:12;:16;73650:2;73637:16;;;;;;;;;;;;;;;:24;73654:6;73637:24;;;;;;;;;;;:34;;;;73711:6;73682:17;:26;73700:7;73682:26;;;;;;;;;;;:35;;;;73578:147;73504:221;;:::o;34821:326::-;34881:4;35138:1;35116:7;:19;;;:23;35109:30;;34821:326;;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:99::-;1570:6;1604:5;1598:12;1588:22;;1518:99;;;:::o;1623:169::-;1707:11;1741:6;1736:3;1729:19;1781:4;1776:3;1772:14;1757:29;;1623:169;;;;:::o;1798:246::-;1879:1;1889:113;1903:6;1900:1;1897:13;1889:113;;;1988:1;1983:3;1979:11;1973:18;1969:1;1964:3;1960:11;1953:39;1925:2;1922:1;1918:10;1913:15;;1889:113;;;2036:1;2027:6;2022:3;2018:16;2011:27;1860:184;1798:246;;;:::o;2050:102::-;2091:6;2142:2;2138:7;2133:2;2126:5;2122:14;2118:28;2108:38;;2050:102;;;:::o;2158:377::-;2246:3;2274:39;2307:5;2274:39;:::i;:::-;2329:71;2393:6;2388:3;2329:71;:::i;:::-;2322:78;;2409:65;2467:6;2462:3;2455:4;2448:5;2444:16;2409:65;:::i;:::-;2499:29;2521:6;2499:29;:::i;:::-;2494:3;2490:39;2483:46;;2250:285;2158:377;;;;:::o;2541:313::-;2654:4;2692:2;2681:9;2677:18;2669:26;;2741:9;2735:4;2731:20;2727:1;2716:9;2712:17;2705:47;2769:78;2842:4;2833:6;2769:78;:::i;:::-;2761:86;;2541:313;;;;:::o;2860:77::-;2897:7;2926:5;2915:16;;2860:77;;;:::o;2943:122::-;3016:24;3034:5;3016:24;:::i;:::-;3009:5;3006:35;2996:63;;3055:1;3052;3045:12;2996:63;2943:122;:::o;3071:139::-;3117:5;3155:6;3142:20;3133:29;;3171:33;3198:5;3171:33;:::i;:::-;3071:139;;;;:::o;3216:329::-;3275:6;3324:2;3312:9;3303:7;3299:23;3295:32;3292:119;;;3330:79;;:::i;:::-;3292:119;3450:1;3475:53;3520:7;3511:6;3500:9;3496:22;3475:53;:::i;:::-;3465:63;;3421:117;3216:329;;;;:::o;3551:126::-;3588:7;3628:42;3621:5;3617:54;3606:65;;3551:126;;;:::o;3683:96::-;3720:7;3749:24;3767:5;3749:24;:::i;:::-;3738:35;;3683:96;;;:::o;3785:118::-;3872:24;3890:5;3872:24;:::i;:::-;3867:3;3860:37;3785:118;;:::o;3909:222::-;4002:4;4040:2;4029:9;4025:18;4017:26;;4053:71;4121:1;4110:9;4106:17;4097:6;4053:71;:::i;:::-;3909:222;;;;:::o;4137:122::-;4210:24;4228:5;4210:24;:::i;:::-;4203:5;4200:35;4190:63;;4249:1;4246;4239:12;4190:63;4137:122;:::o;4265:139::-;4311:5;4349:6;4336:20;4327:29;;4365:33;4392:5;4365:33;:::i;:::-;4265:139;;;;:::o;4410:474::-;4478:6;4486;4535:2;4523:9;4514:7;4510:23;4506:32;4503:119;;;4541:79;;:::i;:::-;4503:119;4661:1;4686:53;4731:7;4722:6;4711:9;4707:22;4686:53;:::i;:::-;4676:63;;4632:117;4788:2;4814:53;4859:7;4850:6;4839:9;4835:22;4814:53;:::i;:::-;4804:63;;4759:118;4410:474;;;;;:::o;4890:118::-;4977:24;4995:5;4977:24;:::i;:::-;4972:3;4965:37;4890:118;;:::o;5014:222::-;5107:4;5145:2;5134:9;5130:18;5122:26;;5158:71;5226:1;5215:9;5211:17;5202:6;5158:71;:::i;:::-;5014:222;;;;:::o;5242:619::-;5319:6;5327;5335;5384:2;5372:9;5363:7;5359:23;5355:32;5352:119;;;5390:79;;:::i;:::-;5352:119;5510:1;5535:53;5580:7;5571:6;5560:9;5556:22;5535:53;:::i;:::-;5525:63;;5481:117;5637:2;5663:53;5708:7;5699:6;5688:9;5684:22;5663:53;:::i;:::-;5653:63;;5608:118;5765:2;5791:53;5836:7;5827:6;5816:9;5812:22;5791:53;:::i;:::-;5781:63;;5736:118;5242:619;;;;;:::o;5867:60::-;5895:3;5916:5;5909:12;;5867:60;;;:::o;5933:142::-;5983:9;6016:53;6034:34;6043:24;6061:5;6043:24;:::i;:::-;6034:34;:::i;:::-;6016:53;:::i;:::-;6003:66;;5933:142;;;:::o;6081:126::-;6131:9;6164:37;6195:5;6164:37;:::i;:::-;6151:50;;6081:126;;;:::o;6213:140::-;6277:9;6310:37;6341:5;6310:37;:::i;:::-;6297:50;;6213:140;;;:::o;6359:159::-;6460:51;6505:5;6460:51;:::i;:::-;6455:3;6448:64;6359:159;;:::o;6524:250::-;6631:4;6669:2;6658:9;6654:18;6646:26;;6682:85;6764:1;6753:9;6749:17;6740:6;6682:85;:::i;:::-;6524:250;;;;:::o;6780:329::-;6839:6;6888:2;6876:9;6867:7;6863:23;6859:32;6856:119;;;6894:79;;:::i;:::-;6856:119;7014:1;7039:53;7084:7;7075:6;7064:9;7060:22;7039:53;:::i;:::-;7029:63;;6985:117;6780:329;;;;:::o;7115:332::-;7236:4;7274:2;7263:9;7259:18;7251:26;;7287:71;7355:1;7344:9;7340:17;7331:6;7287:71;:::i;:::-;7368:72;7436:2;7425:9;7421:18;7412:6;7368:72;:::i;:::-;7115:332;;;;;:::o;7453:116::-;7523:21;7538:5;7523:21;:::i;:::-;7516:5;7513:32;7503:60;;7559:1;7556;7549:12;7503:60;7453:116;:::o;7575:133::-;7618:5;7656:6;7643:20;7634:29;;7672:30;7696:5;7672:30;:::i;:::-;7575:133;;;;:::o;7714:468::-;7779:6;7787;7836:2;7824:9;7815:7;7811:23;7807:32;7804:119;;;7842:79;;:::i;:::-;7804:119;7962:1;7987:53;8032:7;8023:6;8012:9;8008:22;7987:53;:::i;:::-;7977:63;;7933:117;8089:2;8115:50;8157:7;8148:6;8137:9;8133:22;8115:50;:::i;:::-;8105:60;;8060:115;7714:468;;;;;:::o;8188:117::-;8297:1;8294;8287:12;8311:117;8420:1;8417;8410:12;8434:180;8482:77;8479:1;8472:88;8579:4;8576:1;8569:15;8603:4;8600:1;8593:15;8620:281;8703:27;8725:4;8703:27;:::i;:::-;8695:6;8691:40;8833:6;8821:10;8818:22;8797:18;8785:10;8782:34;8779:62;8776:88;;;8844:18;;:::i;:::-;8776:88;8884:10;8880:2;8873:22;8663:238;8620:281;;:::o;8907:129::-;8941:6;8968:20;;:::i;:::-;8958:30;;8997:33;9025:4;9017:6;8997:33;:::i;:::-;8907:129;;;:::o;9042:307::-;9103:4;9193:18;9185:6;9182:30;9179:56;;;9215:18;;:::i;:::-;9179:56;9253:29;9275:6;9253:29;:::i;:::-;9245:37;;9337:4;9331;9327:15;9319:23;;9042:307;;;:::o;9355:146::-;9452:6;9447:3;9442;9429:30;9493:1;9484:6;9479:3;9475:16;9468:27;9355:146;;;:::o;9507:423::-;9584:5;9609:65;9625:48;9666:6;9625:48;:::i;:::-;9609:65;:::i;:::-;9600:74;;9697:6;9690:5;9683:21;9735:4;9728:5;9724:16;9773:3;9764:6;9759:3;9755:16;9752:25;9749:112;;;9780:79;;:::i;:::-;9749:112;9870:54;9917:6;9912:3;9907;9870:54;:::i;:::-;9590:340;9507:423;;;;;:::o;9949:338::-;10004:5;10053:3;10046:4;10038:6;10034:17;10030:27;10020:122;;10061:79;;:::i;:::-;10020:122;10178:6;10165:20;10203:78;10277:3;10269:6;10262:4;10254:6;10250:17;10203:78;:::i;:::-;10194:87;;10010:277;9949:338;;;;:::o;10293:943::-;10388:6;10396;10404;10412;10461:3;10449:9;10440:7;10436:23;10432:33;10429:120;;;10468:79;;:::i;:::-;10429:120;10588:1;10613:53;10658:7;10649:6;10638:9;10634:22;10613:53;:::i;:::-;10603:63;;10559:117;10715:2;10741:53;10786:7;10777:6;10766:9;10762:22;10741:53;:::i;:::-;10731:63;;10686:118;10843:2;10869:53;10914:7;10905:6;10894:9;10890:22;10869:53;:::i;:::-;10859:63;;10814:118;10999:2;10988:9;10984:18;10971:32;11030:18;11022:6;11019:30;11016:117;;;11052:79;;:::i;:::-;11016:117;11157:62;11211:7;11202:6;11191:9;11187:22;11157:62;:::i;:::-;11147:72;;10942:287;10293:943;;;;;;;:::o;11242:152::-;11318:9;11351:37;11382:5;11351:37;:::i;:::-;11338:50;;11242:152;;;:::o;11400:183::-;11513:63;11570:5;11513:63;:::i;:::-;11508:3;11501:76;11400:183;;:::o;11589:274::-;11708:4;11746:2;11735:9;11731:18;11723:26;;11759:97;11853:1;11842:9;11838:17;11829:6;11759:97;:::i;:::-;11589:274;;;;:::o;11869:474::-;11937:6;11945;11994:2;11982:9;11973:7;11969:23;11965:32;11962:119;;;12000:79;;:::i;:::-;11962:119;12120:1;12145:53;12190:7;12181:6;12170:9;12166:22;12145:53;:::i;:::-;12135:63;;12091:117;12247:2;12273:53;12318:7;12309:6;12298:9;12294:22;12273:53;:::i;:::-;12263:63;;12218:118;11869:474;;;;;:::o;12349:180::-;12397:77;12394:1;12387:88;12494:4;12491:1;12484:15;12518:4;12515:1;12508:15;12535:320;12579:6;12616:1;12610:4;12606:12;12596:22;;12663:1;12657:4;12653:12;12684:18;12674:81;;12740:4;12732:6;12728:17;12718:27;;12674:81;12802:2;12794:6;12791:14;12771:18;12768:38;12765:84;;12821:18;;:::i;:::-;12765:84;12586:269;12535:320;;;:::o;12861:220::-;13001:34;12997:1;12989:6;12985:14;12978:58;13070:3;13065:2;13057:6;13053:15;13046:28;12861:220;:::o;13087:366::-;13229:3;13250:67;13314:2;13309:3;13250:67;:::i;:::-;13243:74;;13326:93;13415:3;13326:93;:::i;:::-;13444:2;13439:3;13435:12;13428:19;;13087:366;;;:::o;13459:419::-;13625:4;13663:2;13652:9;13648:18;13640:26;;13712:9;13706:4;13702:20;13698:1;13687:9;13683:17;13676:47;13740:131;13866:4;13740:131;:::i;:::-;13732:139;;13459:419;;;:::o;13884:248::-;14024:34;14020:1;14012:6;14008:14;14001:58;14093:31;14088:2;14080:6;14076:15;14069:56;13884:248;:::o;14138:366::-;14280:3;14301:67;14365:2;14360:3;14301:67;:::i;:::-;14294:74;;14377:93;14466:3;14377:93;:::i;:::-;14495:2;14490:3;14486:12;14479:19;;14138:366;;;:::o;14510:419::-;14676:4;14714:2;14703:9;14699:18;14691:26;;14763:9;14757:4;14753:20;14749:1;14738:9;14734:17;14727:47;14791:131;14917:4;14791:131;:::i;:::-;14783:139;;14510:419;;;:::o;14935:232::-;15075:34;15071:1;15063:6;15059:14;15052:58;15144:15;15139:2;15131:6;15127:15;15120:40;14935:232;:::o;15173:366::-;15315:3;15336:67;15400:2;15395:3;15336:67;:::i;:::-;15329:74;;15412:93;15501:3;15412:93;:::i;:::-;15530:2;15525:3;15521:12;15514:19;;15173:366;;;:::o;15545:419::-;15711:4;15749:2;15738:9;15734:18;15726:26;;15798:9;15792:4;15788:20;15784:1;15773:9;15769:17;15762:47;15826:131;15952:4;15826:131;:::i;:::-;15818:139;;15545:419;;;:::o;15970:230::-;16110:34;16106:1;16098:6;16094:14;16087:58;16179:13;16174:2;16166:6;16162:15;16155:38;15970:230;:::o;16206:366::-;16348:3;16369:67;16433:2;16428:3;16369:67;:::i;:::-;16362:74;;16445:93;16534:3;16445:93;:::i;:::-;16563:2;16558:3;16554:12;16547:19;;16206:366;;;:::o;16578:419::-;16744:4;16782:2;16771:9;16767:18;16759:26;;16831:9;16825:4;16821:20;16817:1;16806:9;16802:17;16795:47;16859:131;16985:4;16859:131;:::i;:::-;16851:139;;16578:419;;;:::o;17003:181::-;17143:33;17139:1;17131:6;17127:14;17120:57;17003:181;:::o;17190:366::-;17332:3;17353:67;17417:2;17412:3;17353:67;:::i;:::-;17346:74;;17429:93;17518:3;17429:93;:::i;:::-;17547:2;17542:3;17538:12;17531:19;;17190:366;;;:::o;17562:419::-;17728:4;17766:2;17755:9;17751:18;17743:26;;17815:9;17809:4;17805:20;17801:1;17790:9;17786:17;17779:47;17843:131;17969:4;17843:131;:::i;:::-;17835:139;;17562:419;;;:::o;17987:170::-;18127:22;18123:1;18115:6;18111:14;18104:46;17987:170;:::o;18163:366::-;18305:3;18326:67;18390:2;18385:3;18326:67;:::i;:::-;18319:74;;18402:93;18491:3;18402:93;:::i;:::-;18520:2;18515:3;18511:12;18504:19;;18163:366;;;:::o;18535:419::-;18701:4;18739:2;18728:9;18724:18;18716:26;;18788:9;18782:4;18778:20;18774:1;18763:9;18759:17;18752:47;18816:131;18942:4;18816:131;:::i;:::-;18808:139;;18535:419;;;:::o;18960:79::-;18999:7;19028:5;19017:16;;18960:79;;;:::o;19045:157::-;19150:45;19170:24;19188:5;19170:24;:::i;:::-;19150:45;:::i;:::-;19145:3;19138:58;19045:157;;:::o;19208:94::-;19241:8;19289:5;19285:2;19281:14;19260:35;;19208:94;;;:::o;19308:::-;19347:7;19376:20;19390:5;19376:20;:::i;:::-;19365:31;;19308:94;;;:::o;19408:100::-;19447:7;19476:26;19496:5;19476:26;:::i;:::-;19465:37;;19408:100;;;:::o;19514:157::-;19619:45;19639:24;19657:5;19639:24;:::i;:::-;19619:45;:::i;:::-;19614:3;19607:58;19514:157;;:::o;19677:538::-;19845:3;19860:75;19931:3;19922:6;19860:75;:::i;:::-;19960:2;19955:3;19951:12;19944:19;;19973:75;20044:3;20035:6;19973:75;:::i;:::-;20073:2;20068:3;20064:12;20057:19;;20086:75;20157:3;20148:6;20086:75;:::i;:::-;20186:2;20181:3;20177:12;20170:19;;20206:3;20199:10;;19677:538;;;;;;:::o;20221:180::-;20269:77;20266:1;20259:88;20366:4;20363:1;20356:15;20390:4;20387:1;20380:15;20407:176;20439:1;20456:20;20474:1;20456:20;:::i;:::-;20451:25;;20490:20;20508:1;20490:20;:::i;:::-;20485:25;;20529:1;20519:35;;20534:18;;:::i;:::-;20519:35;20575:1;20572;20568:9;20563:14;;20407:176;;;;:::o;20589:553::-;20766:4;20804:3;20793:9;20789:19;20781:27;;20818:71;20886:1;20875:9;20871:17;20862:6;20818:71;:::i;:::-;20899:72;20967:2;20956:9;20952:18;20943:6;20899:72;:::i;:::-;20981;21049:2;21038:9;21034:18;21025:6;20981:72;:::i;:::-;21063;21131:2;21120:9;21116:18;21107:6;21063:72;:::i;:::-;20589:553;;;;;;;:::o;21148:231::-;21288:34;21284:1;21276:6;21272:14;21265:58;21357:14;21352:2;21344:6;21340:15;21333:39;21148:231;:::o;21385:366::-;21527:3;21548:67;21612:2;21607:3;21548:67;:::i;:::-;21541:74;;21624:93;21713:3;21624:93;:::i;:::-;21742:2;21737:3;21733:12;21726:19;;21385:366;;;:::o;21757:419::-;21923:4;21961:2;21950:9;21946:18;21938:26;;22010:9;22004:4;22000:20;21996:1;21985:9;21981:17;21974:47;22038:131;22164:4;22038:131;:::i;:::-;22030:139;;21757:419;;;:::o;22182:180::-;22230:77;22227:1;22220:88;22327:4;22324:1;22317:15;22351:4;22348:1;22341:15;22368:143;22425:5;22456:6;22450:13;22441:22;;22472:33;22499:5;22472:33;:::i;:::-;22368:143;;;;:::o;22517:351::-;22587:6;22636:2;22624:9;22615:7;22611:23;22607:32;22604:119;;;22642:79;;:::i;:::-;22604:119;22762:1;22787:64;22843:7;22834:6;22823:9;22819:22;22787:64;:::i;:::-;22777:74;;22733:128;22517:351;;;;:::o;22874:176::-;23014:28;23010:1;23002:6;22998:14;22991:52;22874:176;:::o;23056:366::-;23198:3;23219:67;23283:2;23278:3;23219:67;:::i;:::-;23212:74;;23295:93;23384:3;23295:93;:::i;:::-;23413:2;23408:3;23404:12;23397:19;;23056:366;;;:::o;23428:419::-;23594:4;23632:2;23621:9;23617:18;23609:26;;23681:9;23675:4;23671:20;23667:1;23656:9;23652:17;23645:47;23709:131;23835:4;23709:131;:::i;:::-;23701:139;;23428:419;;;:::o;23853:332::-;23974:4;24012:2;24001:9;23997:18;23989:26;;24025:71;24093:1;24082:9;24078:17;24069:6;24025:71;:::i;:::-;24106:72;24174:2;24163:9;24159:18;24150:6;24106:72;:::i;:::-;23853:332;;;;;:::o;24191:137::-;24245:5;24276:6;24270:13;24261:22;;24292:30;24316:5;24292:30;:::i;:::-;24191:137;;;;:::o;24334:345::-;24401:6;24450:2;24438:9;24429:7;24425:23;24421:32;24418:119;;;24456:79;;:::i;:::-;24418:119;24576:1;24601:61;24654:7;24645:6;24634:9;24630:22;24601:61;:::i;:::-;24591:71;;24547:125;24334:345;;;;:::o;24685:174::-;24825:26;24821:1;24813:6;24809:14;24802:50;24685:174;:::o;24865:366::-;25007:3;25028:67;25092:2;25087:3;25028:67;:::i;:::-;25021:74;;25104:93;25193:3;25104:93;:::i;:::-;25222:2;25217:3;25213:12;25206:19;;24865:366;;;:::o;25237:419::-;25403:4;25441:2;25430:9;25426:18;25418:26;;25490:9;25484:4;25480:20;25476:1;25465:9;25461:17;25454:47;25518:131;25644:4;25518:131;:::i;:::-;25510:139;;25237:419;;;:::o;25662:172::-;25802:24;25798:1;25790:6;25786:14;25779:48;25662:172;:::o;25840:366::-;25982:3;26003:67;26067:2;26062:3;26003:67;:::i;:::-;25996:74;;26079:93;26168:3;26079:93;:::i;:::-;26197:2;26192:3;26188:12;26181:19;;25840:366;;;:::o;26212:419::-;26378:4;26416:2;26405:9;26401:18;26393:26;;26465:9;26459:4;26455:20;26451:1;26440:9;26436:17;26429:47;26493:131;26619:4;26493:131;:::i;:::-;26485:139;;26212:419;;;:::o;26637:221::-;26777:34;26773:1;26765:6;26761:14;26754:58;26846:4;26841:2;26833:6;26829:15;26822:29;26637:221;:::o;26864:366::-;27006:3;27027:67;27091:2;27086:3;27027:67;:::i;:::-;27020:74;;27103:93;27192:3;27103:93;:::i;:::-;27221:2;27216:3;27212:12;27205:19;;26864:366;;;:::o;27236:419::-;27402:4;27440:2;27429:9;27425:18;27417:26;;27489:9;27483:4;27479:20;27475:1;27464:9;27460:17;27453:47;27517:131;27643:4;27517:131;:::i;:::-;27509:139;;27236:419;;;:::o;27661:332::-;27782:4;27820:2;27809:9;27805:18;27797:26;;27833:71;27901:1;27890:9;27886:17;27877:6;27833:71;:::i;:::-;27914:72;27982:2;27971:9;27967:18;27958:6;27914:72;:::i;:::-;27661:332;;;;;:::o;27999:178::-;28139:30;28135:1;28127:6;28123:14;28116:54;27999:178;:::o;28183:366::-;28325:3;28346:67;28410:2;28405:3;28346:67;:::i;:::-;28339:74;;28422:93;28511:3;28422:93;:::i;:::-;28540:2;28535:3;28531:12;28524:19;;28183:366;;;:::o;28555:419::-;28721:4;28759:2;28748:9;28744:18;28736:26;;28808:9;28802:4;28798:20;28794:1;28783:9;28779:17;28772:47;28836:131;28962:4;28836:131;:::i;:::-;28828:139;;28555:419;;;:::o;28980:442::-;29129:4;29167:2;29156:9;29152:18;29144:26;;29180:71;29248:1;29237:9;29233:17;29224:6;29180:71;:::i;:::-;29261:72;29329:2;29318:9;29314:18;29305:6;29261:72;:::i;:::-;29343;29411:2;29400:9;29396:18;29387:6;29343:72;:::i;:::-;28980:442;;;;;;:::o;29428:180::-;29476:77;29473:1;29466:88;29573:4;29570:1;29563:15;29597:4;29594:1;29587:15;29614:191;29654:3;29673:20;29691:1;29673:20;:::i;:::-;29668:25;;29707:20;29725:1;29707:20;:::i;:::-;29702:25;;29750:1;29747;29743:9;29736:16;;29771:3;29768:1;29765:10;29762:36;;;29778:18;;:::i;:::-;29762:36;29614:191;;;;:::o;29811:228::-;29951:34;29947:1;29939:6;29935:14;29928:58;30020:11;30015:2;30007:6;30003:15;29996:36;29811:228;:::o;30045:366::-;30187:3;30208:67;30272:2;30267:3;30208:67;:::i;:::-;30201:74;;30284:93;30373:3;30284:93;:::i;:::-;30402:2;30397:3;30393:12;30386:19;;30045:366;;;:::o;30417:419::-;30583:4;30621:2;30610:9;30606:18;30598:26;;30670:9;30664:4;30660:20;30656:1;30645:9;30641:17;30634:47;30698:131;30824:4;30698:131;:::i;:::-;30690:139;;30417:419;;;:::o;30842:172::-;30982:24;30978:1;30970:6;30966:14;30959:48;30842:172;:::o;31020:366::-;31162:3;31183:67;31247:2;31242:3;31183:67;:::i;:::-;31176:74;;31259:93;31348:3;31259:93;:::i;:::-;31377:2;31372:3;31368:12;31361:19;;31020:366;;;:::o;31392:419::-;31558:4;31596:2;31585:9;31581:18;31573:26;;31645:9;31639:4;31635:20;31631:1;31620:9;31616:17;31609:47;31673:131;31799:4;31673:131;:::i;:::-;31665:139;;31392:419;;;:::o;31817:175::-;31957:27;31953:1;31945:6;31941:14;31934:51;31817:175;:::o;31998:366::-;32140:3;32161:67;32225:2;32220:3;32161:67;:::i;:::-;32154:74;;32237:93;32326:3;32237:93;:::i;:::-;32355:2;32350:3;32346:12;32339:19;;31998:366;;;:::o;32370:419::-;32536:4;32574:2;32563:9;32559:18;32551:26;;32623:9;32617:4;32613:20;32609:1;32598:9;32594:17;32587:47;32651:131;32777:4;32651:131;:::i;:::-;32643:139;;32370:419;;;:::o;32795:148::-;32897:11;32934:3;32919:18;;32795:148;;;;:::o;32949:390::-;33055:3;33083:39;33116:5;33083:39;:::i;:::-;33138:89;33220:6;33215:3;33138:89;:::i;:::-;33131:96;;33236:65;33294:6;33289:3;33282:4;33275:5;33271:16;33236:65;:::i;:::-;33326:6;33321:3;33317:16;33310:23;;33059:280;32949:390;;;;:::o;33345:155::-;33485:7;33481:1;33473:6;33469:14;33462:31;33345:155;:::o;33506:400::-;33666:3;33687:84;33769:1;33764:3;33687:84;:::i;:::-;33680:91;;33780:93;33869:3;33780:93;:::i;:::-;33898:1;33893:3;33889:11;33882:18;;33506:400;;;:::o;33912:701::-;34193:3;34215:95;34306:3;34297:6;34215:95;:::i;:::-;34208:102;;34327:95;34418:3;34409:6;34327:95;:::i;:::-;34320:102;;34439:148;34583:3;34439:148;:::i;:::-;34432:155;;34604:3;34597:10;;33912:701;;;;;:::o;34619:225::-;34759:34;34755:1;34747:6;34743:14;34736:58;34828:8;34823:2;34815:6;34811:15;34804:33;34619:225;:::o;34850:366::-;34992:3;35013:67;35077:2;35072:3;35013:67;:::i;:::-;35006:74;;35089:93;35178:3;35089:93;:::i;:::-;35207:2;35202:3;35198:12;35191:19;;34850:366;;;:::o;35222:419::-;35388:4;35426:2;35415:9;35411:18;35403:26;;35475:9;35469:4;35465:20;35461:1;35450:9;35446:17;35439:47;35503:131;35629:4;35503:131;:::i;:::-;35495:139;;35222:419;;;:::o;35647:224::-;35787:34;35783:1;35775:6;35771:14;35764:58;35856:7;35851:2;35843:6;35839:15;35832:32;35647:224;:::o;35877:366::-;36019:3;36040:67;36104:2;36099:3;36040:67;:::i;:::-;36033:74;;36116:93;36205:3;36116:93;:::i;:::-;36234:2;36229:3;36225:12;36218:19;;35877:366;;;:::o;36249:419::-;36415:4;36453:2;36442:9;36438:18;36430:26;;36502:9;36496:4;36492:20;36488:1;36477:9;36473:17;36466:47;36530:131;36656:4;36530:131;:::i;:::-;36522:139;;36249:419;;;:::o;36674:223::-;36814:34;36810:1;36802:6;36798:14;36791:58;36883:6;36878:2;36870:6;36866:15;36859:31;36674:223;:::o;36903:366::-;37045:3;37066:67;37130:2;37125:3;37066:67;:::i;:::-;37059:74;;37142:93;37231:3;37142:93;:::i;:::-;37260:2;37255:3;37251:12;37244:19;;36903:366;;;:::o;37275:419::-;37441:4;37479:2;37468:9;37464:18;37456:26;;37528:9;37522:4;37518:20;37514:1;37503:9;37499:17;37492:47;37556:131;37682:4;37556:131;:::i;:::-;37548:139;;37275:419;;;:::o;37700:182::-;37840:34;37836:1;37828:6;37824:14;37817:58;37700:182;:::o;37888:366::-;38030:3;38051:67;38115:2;38110:3;38051:67;:::i;:::-;38044:74;;38127:93;38216:3;38127:93;:::i;:::-;38245:2;38240:3;38236:12;38229:19;;37888:366;;;:::o;38260:419::-;38426:4;38464:2;38453:9;38449:18;38441:26;;38513:9;38507:4;38503:20;38499:1;38488:9;38484:17;38477:47;38541:131;38667:4;38541:131;:::i;:::-;38533:139;;38260:419;;;:::o;38685:194::-;38725:4;38745:20;38763:1;38745:20;:::i;:::-;38740:25;;38779:20;38797:1;38779:20;:::i;:::-;38774:25;;38823:1;38820;38816:9;38808:17;;38847:1;38841:4;38838:11;38835:37;;;38852:18;;:::i;:::-;38835:37;38685:194;;;;:::o;38885:410::-;38925:7;38948:20;38966:1;38948:20;:::i;:::-;38943:25;;38982:20;39000:1;38982:20;:::i;:::-;38977:25;;39037:1;39034;39030:9;39059:30;39077:11;39059:30;:::i;:::-;39048:41;;39238:1;39229:7;39225:15;39222:1;39219:22;39199:1;39192:9;39172:83;39149:139;;39268:18;;:::i;:::-;39149:139;38933:362;38885:410;;;;:::o;39301:166::-;39441:18;39437:1;39429:6;39425:14;39418:42;39301:166;:::o;39473:366::-;39615:3;39636:67;39700:2;39695:3;39636:67;:::i;:::-;39629:74;;39712:93;39801:3;39712:93;:::i;:::-;39830:2;39825:3;39821:12;39814:19;;39473:366;;;:::o;39845:419::-;40011:4;40049:2;40038:9;40034:18;40026:26;;40098:9;40092:4;40088:20;40084:1;40073:9;40069:17;40062:47;40126:131;40252:4;40126:131;:::i;:::-;40118:139;;39845:419;;;:::o;40270:185::-;40310:1;40327:20;40345:1;40327:20;:::i;:::-;40322:25;;40361:20;40379:1;40361:20;:::i;:::-;40356:25;;40400:1;40390:35;;40405:18;;:::i;:::-;40390:35;40447:1;40444;40440:9;40435:14;;40270:185;;;;:::o;40461:182::-;40601:34;40597:1;40589:6;40585:14;40578:58;40461:182;:::o;40649:366::-;40791:3;40812:67;40876:2;40871:3;40812:67;:::i;:::-;40805:74;;40888:93;40977:3;40888:93;:::i;:::-;41006:2;41001:3;40997:12;40990:19;;40649:366;;;:::o;41021:419::-;41187:4;41225:2;41214:9;41210:18;41202:26;;41274:9;41268:4;41264:20;41260:1;41249:9;41245:17;41238:47;41302:131;41428:4;41302:131;:::i;:::-;41294:139;;41021:419;;;:::o;41446:178::-;41586:30;41582:1;41574:6;41570:14;41563:54;41446:178;:::o;41630:366::-;41772:3;41793:67;41857:2;41852:3;41793:67;:::i;:::-;41786:74;;41869:93;41958:3;41869:93;:::i;:::-;41987:2;41982:3;41978:12;41971:19;;41630:366;;;:::o;42002:419::-;42168:4;42206:2;42195:9;42191:18;42183:26;;42255:9;42249:4;42245:20;42241:1;42230:9;42226:17;42219:47;42283:131;42409:4;42283:131;:::i;:::-;42275:139;;42002:419;;;:::o;42427:175::-;42567:27;42563:1;42555:6;42551:14;42544:51;42427:175;:::o;42608:366::-;42750:3;42771:67;42835:2;42830:3;42771:67;:::i;:::-;42764:74;;42847:93;42936:3;42847:93;:::i;:::-;42965:2;42960:3;42956:12;42949:19;;42608:366;;;:::o;42980:419::-;43146:4;43184:2;43173:9;43169:18;43161:26;;43233:9;43227:4;43223:20;43219:1;43208:9;43204:17;43197:47;43261:131;43387:4;43261:131;:::i;:::-;43253:139;;42980:419;;;:::o;43405:237::-;43545:34;43541:1;43533:6;43529:14;43522:58;43614:20;43609:2;43601:6;43597:15;43590:45;43405:237;:::o;43648:366::-;43790:3;43811:67;43875:2;43870:3;43811:67;:::i;:::-;43804:74;;43887:93;43976:3;43887:93;:::i;:::-;44005:2;44000:3;43996:12;43989:19;;43648:366;;;:::o;44020:419::-;44186:4;44224:2;44213:9;44209:18;44201:26;;44273:9;44267:4;44263:20;44259:1;44248:9;44244:17;44237:47;44301:131;44427:4;44301:131;:::i;:::-;44293:139;;44020:419;;;:::o;44445:240::-;44585:34;44581:1;44573:6;44569:14;44562:58;44654:23;44649:2;44641:6;44637:15;44630:48;44445:240;:::o;44691:366::-;44833:3;44854:67;44918:2;44913:3;44854:67;:::i;:::-;44847:74;;44930:93;45019:3;44930:93;:::i;:::-;45048:2;45043:3;45039:12;45032:19;;44691:366;;;:::o;45063:419::-;45229:4;45267:2;45256:9;45252:18;45244:26;;45316:9;45310:4;45306:20;45302:1;45291:9;45287:17;45280:47;45344:131;45470:4;45344:131;:::i;:::-;45336:139;;45063:419;;;:::o;45488:170::-;45628:22;45624:1;45616:6;45612:14;45605:46;45488:170;:::o;45664:366::-;45806:3;45827:67;45891:2;45886:3;45827:67;:::i;:::-;45820:74;;45903:93;45992:3;45903:93;:::i;:::-;46021:2;46016:3;46012:12;46005:19;;45664:366;;;:::o;46036:419::-;46202:4;46240:2;46229:9;46225:18;46217:26;;46289:9;46283:4;46279:20;46275:1;46264:9;46260:17;46253:47;46317:131;46443:4;46317:131;:::i;:::-;46309:139;;46036:419;;;:::o;46461:98::-;46512:6;46546:5;46540:12;46530:22;;46461:98;;;:::o;46565:168::-;46648:11;46682:6;46677:3;46670:19;46722:4;46717:3;46713:14;46698:29;;46565:168;;;;:::o;46739:373::-;46825:3;46853:38;46885:5;46853:38;:::i;:::-;46907:70;46970:6;46965:3;46907:70;:::i;:::-;46900:77;;46986:65;47044:6;47039:3;47032:4;47025:5;47021:16;46986:65;:::i;:::-;47076:29;47098:6;47076:29;:::i;:::-;47071:3;47067:39;47060:46;;46829:283;46739:373;;;;:::o;47118:640::-;47313:4;47351:3;47340:9;47336:19;47328:27;;47365:71;47433:1;47422:9;47418:17;47409:6;47365:71;:::i;:::-;47446:72;47514:2;47503:9;47499:18;47490:6;47446:72;:::i;:::-;47528;47596:2;47585:9;47581:18;47572:6;47528:72;:::i;:::-;47647:9;47641:4;47637:20;47632:2;47621:9;47617:18;47610:48;47675:76;47746:4;47737:6;47675:76;:::i;:::-;47667:84;;47118:640;;;;;;;:::o;47764:141::-;47820:5;47851:6;47845:13;47836:22;;47867:32;47893:5;47867:32;:::i;:::-;47764:141;;;;:::o;47911:349::-;47980:6;48029:2;48017:9;48008:7;48004:23;48000:32;47997:119;;;48035:79;;:::i;:::-;47997:119;48155:1;48180:63;48235:7;48226:6;48215:9;48211:22;48180:63;:::i;:::-;48170:73;;48126:127;47911:349;;;;:::o;48266:180::-;48314:77;48311:1;48304:88;48411:4;48408:1;48401:15;48435:4;48432:1;48425:15
Swarm Source
ipfs://8ffa0a136a1285d31aee21ed5dc443d7ac9ebccc065fe9e7c287341eec4ca4d1
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.