Feature Tip: Add private address tag to any address under My Name Tag !
ERC-721
Overview
Max Total Supply
75 FUDA
Holders
28
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
1 FUDALoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
FudApes
Compiler Version
v0.8.20+commit.a1b79de6
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2023-11-06 */ // SPDX-License-Identifier: MIT // File: @openzeppelin/contracts/interfaces/draft-IERC6093.sol // OpenZeppelin Contracts (last updated v5.0.0) (interfaces/draft-IERC6093.sol) pragma solidity ^0.8.20; /** * @dev Standard ERC20 Errors * Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC20 tokens. */ interface IERC20Errors { /** * @dev Indicates an error related to the current `balance` of a `sender`. Used in transfers. * @param sender Address whose tokens are being transferred. * @param balance Current balance for the interacting account. * @param needed Minimum amount required to perform a transfer. */ error ERC20InsufficientBalance(address sender, uint256 balance, uint256 needed); /** * @dev Indicates a failure with the token `sender`. Used in transfers. * @param sender Address whose tokens are being transferred. */ error ERC20InvalidSender(address sender); /** * @dev Indicates a failure with the token `receiver`. Used in transfers. * @param receiver Address to which tokens are being transferred. */ error ERC20InvalidReceiver(address receiver); /** * @dev Indicates a failure with the `spender`’s `allowance`. Used in transfers. * @param spender Address that may be allowed to operate on tokens without being their owner. * @param allowance Amount of tokens a `spender` is allowed to operate with. * @param needed Minimum amount required to perform a transfer. */ error ERC20InsufficientAllowance(address spender, uint256 allowance, uint256 needed); /** * @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals. * @param approver Address initiating an approval operation. */ error ERC20InvalidApprover(address approver); /** * @dev Indicates a failure with the `spender` to be approved. Used in approvals. * @param spender Address that may be allowed to operate on tokens without being their owner. */ error ERC20InvalidSpender(address spender); } /** * @dev Standard ERC721 Errors * Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC721 tokens. */ interface IERC721Errors { /** * @dev Indicates that an address can't be an owner. For example, `address(0)` is a forbidden owner in EIP-20. * Used in balance queries. * @param owner Address of the current owner of a token. */ error ERC721InvalidOwner(address owner); /** * @dev Indicates a `tokenId` whose `owner` is the zero address. * @param tokenId Identifier number of a token. */ error ERC721NonexistentToken(uint256 tokenId); /** * @dev Indicates an error related to the ownership over a particular token. Used in transfers. * @param sender Address whose tokens are being transferred. * @param tokenId Identifier number of a token. * @param owner Address of the current owner of a token. */ error ERC721IncorrectOwner(address sender, uint256 tokenId, address owner); /** * @dev Indicates a failure with the token `sender`. Used in transfers. * @param sender Address whose tokens are being transferred. */ error ERC721InvalidSender(address sender); /** * @dev Indicates a failure with the token `receiver`. Used in transfers. * @param receiver Address to which tokens are being transferred. */ error ERC721InvalidReceiver(address receiver); /** * @dev Indicates a failure with the `operator`’s approval. Used in transfers. * @param operator Address that may be allowed to operate on tokens without being their owner. * @param tokenId Identifier number of a token. */ error ERC721InsufficientApproval(address operator, uint256 tokenId); /** * @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals. * @param approver Address initiating an approval operation. */ error ERC721InvalidApprover(address approver); /** * @dev Indicates a failure with the `operator` to be approved. Used in approvals. * @param operator Address that may be allowed to operate on tokens without being their owner. */ error ERC721InvalidOperator(address operator); } /** * @dev Standard ERC1155 Errors * Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC1155 tokens. */ interface IERC1155Errors { /** * @dev Indicates an error related to the current `balance` of a `sender`. Used in transfers. * @param sender Address whose tokens are being transferred. * @param balance Current balance for the interacting account. * @param needed Minimum amount required to perform a transfer. * @param tokenId Identifier number of a token. */ error ERC1155InsufficientBalance(address sender, uint256 balance, uint256 needed, uint256 tokenId); /** * @dev Indicates a failure with the token `sender`. Used in transfers. * @param sender Address whose tokens are being transferred. */ error ERC1155InvalidSender(address sender); /** * @dev Indicates a failure with the token `receiver`. Used in transfers. * @param receiver Address to which tokens are being transferred. */ error ERC1155InvalidReceiver(address receiver); /** * @dev Indicates a failure with the `operator`’s approval. Used in transfers. * @param operator Address that may be allowed to operate on tokens without being their owner. * @param owner Address of the current owner of a token. */ error ERC1155MissingApprovalForAll(address operator, address owner); /** * @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals. * @param approver Address initiating an approval operation. */ error ERC1155InvalidApprover(address approver); /** * @dev Indicates a failure with the `operator` to be approved. Used in approvals. * @param operator Address that may be allowed to operate on tokens without being their owner. */ error ERC1155InvalidOperator(address operator); /** * @dev Indicates an array length mismatch between ids and values in a safeBatchTransferFrom operation. * Used in batch transfers. * @param idsLength Length of the array of token identifiers * @param valuesLength Length of the array of token amounts */ error ERC1155InvalidArrayLength(uint256 idsLength, uint256 valuesLength); } // File: @openzeppelin/contracts/utils/math/SignedMath.sol // OpenZeppelin Contracts (last updated v5.0.0) (utils/math/SignedMath.sol) pragma solidity ^0.8.20; /** * @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 v5.0.0) (utils/math/Math.sol) pragma solidity ^0.8.20; /** * @dev Standard math utilities missing in the Solidity language. */ library Math { /** * @dev Muldiv operation overflow. */ error MathOverflowedMulDiv(); enum Rounding { Floor, // Toward negative infinity Ceil, // Toward positive infinity Trunc, // Toward zero Expand // Away from zero } /** * @dev Returns the addition of two unsigned integers, with an overflow flag. */ 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. */ 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. */ 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. */ 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. */ 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 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 towards infinity instead * of rounding towards zero. */ function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) { if (b == 0) { // Guarantee the same behavior as in a regular Solidity division. return a / b; } // (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 = x * y; // Least significant 256 bits of the product uint256 prod1; // Most significant 256 bits of the product assembly { let mm := mulmod(x, y, not(0)) 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. if (denominator <= prod1) { revert MathOverflowedMulDiv(); } /////////////////////////////////////////////// // 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. uint256 twos = denominator & (0 - denominator); 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 (unsignedRoundsUp(rounding) && 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 * towards zero. * * 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 + (unsignedRoundsUp(rounding) && result * result < a ? 1 : 0); } } /** * @dev Return the log in base 2 of a positive value rounded towards zero. * 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 + (unsignedRoundsUp(rounding) && 1 << result < value ? 1 : 0); } } /** * @dev Return the log in base 10 of a positive value rounded towards zero. * 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 + (unsignedRoundsUp(rounding) && 10 ** result < value ? 1 : 0); } } /** * @dev Return the log in base 256 of a positive value rounded towards zero. * 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 + (unsignedRoundsUp(rounding) && 1 << (result << 3) < value ? 1 : 0); } } /** * @dev Returns whether a provided rounding mode is considered rounding up for unsigned integers. */ function unsignedRoundsUp(Rounding rounding) internal pure returns (bool) { return uint8(rounding) % 2 == 1; } } // File: @openzeppelin/contracts/utils/Strings.sol // OpenZeppelin Contracts (last updated v5.0.0) (utils/Strings.sol) pragma solidity ^0.8.20; /** * @dev String operations. */ library Strings { bytes16 private constant HEX_DIGITS = "0123456789abcdef"; uint8 private constant ADDRESS_LENGTH = 20; /** * @dev The `value` string doesn't fit in the specified `length`. */ error StringsInsufficientHexLength(uint256 value, uint256 length); /** * @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), HEX_DIGITS)) } value /= 10; if (value == 0) break; } return buffer; } } /** * @dev Converts a `int256` to its ASCII `string` decimal representation. */ function toStringSigned(int256 value) internal pure returns (string memory) { return string.concat(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) { uint256 localValue = value; 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] = HEX_DIGITS[localValue & 0xf]; localValue >>= 4; } if (localValue != 0) { revert StringsInsufficientHexLength(value, length); } 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 bytes(a).length == bytes(b).length && keccak256(bytes(a)) == keccak256(bytes(b)); } } // File: @openzeppelin/contracts/utils/Context.sol // OpenZeppelin Contracts (last updated v5.0.0) (utils/Context.sol) pragma solidity ^0.8.20; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // File: @openzeppelin/contracts/access/Ownable.sol // OpenZeppelin Contracts (last updated v5.0.0) (access/Ownable.sol) pragma solidity ^0.8.20; /** * @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. * * The initial owner is set to the address provided by the deployer. 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; /** * @dev The caller account is not authorized to perform an operation. */ error OwnableUnauthorizedAccount(address account); /** * @dev The owner is not a valid owner account. (eg. `address(0)`) */ error OwnableInvalidOwner(address owner); event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the address provided by the deployer as the initial owner. */ constructor(address initialOwner) { if (initialOwner == address(0)) { revert OwnableInvalidOwner(address(0)); } _transferOwnership(initialOwner); } /** * @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 { if (owner() != _msgSender()) { revert OwnableUnauthorizedAccount(_msgSender()); } } /** * @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 { if (newOwner == address(0)) { revert OwnableInvalidOwner(address(0)); } _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/token/ERC721/IERC721Receiver.sol // OpenZeppelin Contracts (last updated v5.0.0) (token/ERC721/IERC721Receiver.sol) pragma solidity ^0.8.20; /** * @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 (last updated v5.0.0) (utils/introspection/IERC165.sol) pragma solidity ^0.8.20; /** * @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 (last updated v5.0.0) (utils/introspection/ERC165.sol) pragma solidity ^0.8.20; /** * @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); * } * ``` */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual returns (bool) { return interfaceId == type(IERC165).interfaceId; } } // File: @openzeppelin/contracts/token/ERC721/IERC721.sol // OpenZeppelin Contracts (last updated v5.0.0) (token/ERC721/IERC721.sol) pragma solidity ^0.8.20; /** * @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 address zero. * * 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/IERC721Metadata.sol // OpenZeppelin Contracts (last updated v5.0.0) (token/ERC721/extensions/IERC721Metadata.sol) pragma solidity ^0.8.20; /** * @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 v5.0.0) (token/ERC721/ERC721.sol) pragma solidity ^0.8.20; /** * @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}. */ abstract contract ERC721 is Context, ERC165, IERC721, IERC721Metadata, IERC721Errors { using Strings for uint256; // Token name string private _name; // Token symbol string private _symbol; mapping(uint256 tokenId => address) private _owners; mapping(address owner => uint256) private _balances; mapping(uint256 tokenId => address) private _tokenApprovals; mapping(address owner => mapping(address operator => 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 returns (uint256) { if (owner == address(0)) { revert ERC721InvalidOwner(address(0)); } return _balances[owner]; } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view virtual returns (address) { return _requireOwned(tokenId); } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual returns (string memory) { _requireOwned(tokenId); string memory baseURI = _baseURI(); return bytes(baseURI).length > 0 ? string.concat(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 { _approve(to, tokenId, _msgSender()); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view virtual returns (address) { _requireOwned(tokenId); return _getApproved(tokenId); } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual { _setApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom(address from, address to, uint256 tokenId) public virtual { if (to == address(0)) { revert ERC721InvalidReceiver(address(0)); } // Setting an "auth" arguments enables the `_isAuthorized` check which verifies that the token exists // (from != 0). Therefore, it is not needed to verify that the return value is not 0 here. address previousOwner = _update(to, tokenId, _msgSender()); if (previousOwner != from) { revert ERC721IncorrectOwner(from, tokenId, previousOwner); } } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom(address from, address to, uint256 tokenId) public { safeTransferFrom(from, to, tokenId, ""); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom(address from, address to, uint256 tokenId, bytes memory data) public virtual { transferFrom(from, to, tokenId); _checkOnERC721Received(from, to, tokenId, data); } /** * @dev Returns the owner of the `tokenId`. Does NOT revert if token doesn't exist * * IMPORTANT: Any overrides to this function that add ownership of tokens not tracked by the * core ERC721 logic MUST be matched with the use of {_increaseBalance} to keep balances * consistent with ownership. The invariant to preserve is 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`. */ function _ownerOf(uint256 tokenId) internal view virtual returns (address) { return _owners[tokenId]; } /** * @dev Returns the approved address for `tokenId`. Returns 0 if `tokenId` is not minted. */ function _getApproved(uint256 tokenId) internal view virtual returns (address) { return _tokenApprovals[tokenId]; } /** * @dev Returns whether `spender` is allowed to manage `owner`'s tokens, or `tokenId` in * particular (ignoring whether it is owned by `owner`). * * WARNING: This function assumes that `owner` is the actual owner of `tokenId` and does not verify this * assumption. */ function _isAuthorized(address owner, address spender, uint256 tokenId) internal view virtual returns (bool) { return spender != address(0) && (owner == spender || isApprovedForAll(owner, spender) || _getApproved(tokenId) == spender); } /** * @dev Checks if `spender` can operate on `tokenId`, assuming the provided `owner` is the actual owner. * Reverts if `spender` does not have approval from the provided `owner` for the given token or for all its assets * the `spender` for the specific `tokenId`. * * WARNING: This function assumes that `owner` is the actual owner of `tokenId` and does not verify this * assumption. */ function _checkAuthorized(address owner, address spender, uint256 tokenId) internal view virtual { if (!_isAuthorized(owner, spender, tokenId)) { if (owner == address(0)) { revert ERC721NonexistentToken(tokenId); } else { revert ERC721InsufficientApproval(spender, tokenId); } } } /** * @dev Unsafe write access to the balances, used by extensions that "mint" tokens using an {ownerOf} override. * * NOTE: the value is limited to type(uint128).max. This protect against _balance overflow. It is unrealistic that * a uint256 would ever overflow from increments when these increments are bounded to uint128 values. * * WARNING: Increasing an account's balance using this function tends to be paired with an override of the * {_ownerOf} function to resolve the ownership of the corresponding tokens so that balances and ownership * remain consistent with one another. */ function _increaseBalance(address account, uint128 value) internal virtual { unchecked { _balances[account] += value; } } /** * @dev Transfers `tokenId` from its current owner to `to`, or alternatively mints (or burns) if the current owner * (or `to`) is the zero address. Returns the owner of the `tokenId` before the update. * * The `auth` argument is optional. If the value passed is non 0, then this function will check that * `auth` is either the owner of the token, or approved to operate on the token (by the owner). * * Emits a {Transfer} event. * * NOTE: If overriding this function in a way that tracks balances, see also {_increaseBalance}. */ function _update(address to, uint256 tokenId, address auth) internal virtual returns (address) { address from = _ownerOf(tokenId); // Perform (optional) operator check if (auth != address(0)) { _checkAuthorized(from, auth, tokenId); } // Execute the update if (from != address(0)) { // Clear approval. No need to re-authorize or emit the Approval event _approve(address(0), tokenId, address(0), false); unchecked { _balances[from] -= 1; } } if (to != address(0)) { unchecked { _balances[to] += 1; } } _owners[tokenId] = to; emit Transfer(from, to, tokenId); return from; } /** * @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 { if (to == address(0)) { revert ERC721InvalidReceiver(address(0)); } address previousOwner = _update(to, tokenId, address(0)); if (previousOwner != address(0)) { revert ERC721InvalidSender(address(0)); } } /** * @dev Mints `tokenId`, transfers it to `to` and checks for `to` acceptance. * * 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 { _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); _checkOnERC721Received(address(0), to, tokenId, data); } /** * @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 { address previousOwner = _update(address(0), tokenId, address(0)); if (previousOwner == address(0)) { revert ERC721NonexistentToken(tokenId); } } /** * @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 { if (to == address(0)) { revert ERC721InvalidReceiver(address(0)); } address previousOwner = _update(to, tokenId, address(0)); if (previousOwner == address(0)) { revert ERC721NonexistentToken(tokenId); } else if (previousOwner != from) { revert ERC721IncorrectOwner(from, tokenId, previousOwner); } } /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking that contract recipients * are aware of the ERC721 standard 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 like {safeTransferFrom} in the sense that it invokes * {IERC721Receiver-onERC721Received} on the receiver, and can be used to e.g. * implement alternative mechanisms to perform token transfer, such as signature-based. * * Requirements: * * - `tokenId` token must exist and be owned by `from`. * - `to` cannot be the zero address. * - `from` cannot be the zero address. * - 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) internal { _safeTransfer(from, to, tokenId, ""); } /** * @dev Same as {xref-ERC721-_safeTransfer-address-address-uint256-}[`_safeTransfer`], with an additional `data` parameter which is * forwarded in {IERC721Receiver-onERC721Received} to contract recipients. */ function _safeTransfer(address from, address to, uint256 tokenId, bytes memory data) internal virtual { _transfer(from, to, tokenId); _checkOnERC721Received(from, to, tokenId, data); } /** * @dev Approve `to` to operate on `tokenId` * * The `auth` argument is optional. If the value passed is non 0, then this function will check that `auth` is * either the owner of the token, or approved to operate on all tokens held by this owner. * * Emits an {Approval} event. * * Overrides to this logic should be done to the variant with an additional `bool emitEvent` argument. */ function _approve(address to, uint256 tokenId, address auth) internal { _approve(to, tokenId, auth, true); } /** * @dev Variant of `_approve` with an optional flag to enable or disable the {Approval} event. The event is not * emitted in the context of transfers. */ function _approve(address to, uint256 tokenId, address auth, bool emitEvent) internal virtual { // Avoid reading the owner unless necessary if (emitEvent || auth != address(0)) { address owner = _requireOwned(tokenId); // We do not use _isAuthorized because single-token approvals should not be able to call approve if (auth != address(0) && owner != auth && !isApprovedForAll(owner, auth)) { revert ERC721InvalidApprover(auth); } if (emitEvent) { emit Approval(owner, to, tokenId); } } _tokenApprovals[tokenId] = to; } /** * @dev Approve `operator` to operate on all of `owner` tokens * * Requirements: * - operator can't be the address zero. * * Emits an {ApprovalForAll} event. */ function _setApprovalForAll(address owner, address operator, bool approved) internal virtual { if (operator == address(0)) { revert ERC721InvalidOperator(operator); } _operatorApprovals[owner][operator] = approved; emit ApprovalForAll(owner, operator, approved); } /** * @dev Reverts if the `tokenId` doesn't have a current owner (it hasn't been minted, or it has been burned). * Returns the owner. * * Overrides to ownership logic should be done to {_ownerOf}. */ function _requireOwned(uint256 tokenId) internal view returns (address) { address owner = _ownerOf(tokenId); if (owner == address(0)) { revert ERC721NonexistentToken(tokenId); } return owner; } /** * @dev Private function to invoke {IERC721Receiver-onERC721Received} on a target address. This will revert if the * recipient doesn't accept the token transfer. 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 */ function _checkOnERC721Received(address from, address to, uint256 tokenId, bytes memory data) private { if (to.code.length > 0) { try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, data) returns (bytes4 retval) { if (retval != IERC721Receiver.onERC721Received.selector) { revert ERC721InvalidReceiver(to); } } catch (bytes memory reason) { if (reason.length == 0) { revert ERC721InvalidReceiver(to); } else { /// @solidity memory-safe-assembly assembly { revert(add(32, reason), mload(reason)) } } } } } } // File: @openzeppelin/contracts/security/ReentrancyGuard.sol // OpenZeppelin Contracts (last updated v4.9.0) (security/ReentrancyGuard.sol) pragma solidity ^0.8.0; /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ abstract contract ReentrancyGuard { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; constructor() { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and making it call a * `private` function that does the actual work. */ modifier nonReentrant() { _nonReentrantBefore(); _; _nonReentrantAfter(); } function _nonReentrantBefore() private { // On the first call to nonReentrant, _status will be _NOT_ENTERED require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; } function _nonReentrantAfter() private { // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } /** * @dev Returns true if the reentrancy guard is currently set to "entered", which indicates there is a * `nonReentrant` function in the call stack. */ function _reentrancyGuardEntered() internal view returns (bool) { return _status == _ENTERED; } } // File: contracts/FudApes.sol pragma solidity ^0.8.4; interface IGrandpaApes { function ownerOf(uint256 tokenId) external view returns (address); function safeTransferFrom(address from, address to, uint256 tokenId) external; function isApprovedForAll(address owner, address operator) external view returns (bool); } interface IXesPass { function ownerOf(uint256 tokenId) external view returns (address); } contract FudApes is ERC721, Ownable, ReentrancyGuard { uint256 public mintPrice; uint256 public totalSupply; uint256 public maxSupply; bool public isMintEnabled; bool public isBurnToMintEnabled; bool public isXesPassClaimEnabled; string public baseURI; mapping(address => uint256) public mintedWallets; uint256[] public claimedXesPass; mapping(uint256 => bool) public hasXesPassBeenClaimed; address public grandpaApesAddress = 0x581e4FD879EFF9D2F36012c4dad563f64a2f250d; address public xesPassAddress = 0xa1EcaA37bFf06254AEB327B4e656Ccc7dB57661E; address constant BURN_ADDRESS = 0x000000000000000000000000000000000000dEaD; event Minted(address indexed to, uint256 indexed tokenId); event GrandpaApesBurned(address indexed burner, uint256 tokenId1, uint256 tokenId2, uint256 tokenId3); event XesPassClaimed(address indexed claimer, uint256 xesPassTokenId); constructor(address initialOwner) payable ERC721("FudApes", "FUDA") Ownable(initialOwner) { mintPrice = 0.0169 ether; totalSupply = 0; maxSupply = 5000; } function toggleIsMintEnabled(bool isMintEnabled_) external onlyOwner { isMintEnabled = isMintEnabled_; } function toggleIsBurnToMintEnabled(bool isBurnToMintEnabled_) external onlyOwner { isBurnToMintEnabled = isBurnToMintEnabled_; } function toggleIsXesPassClaimEnabled(bool isXesPassClaimEnabled_) external onlyOwner { isXesPassClaimEnabled = isXesPassClaimEnabled_; } function setMaxSupply(uint256 maxSupply_) external onlyOwner { maxSupply = maxSupply_; } function setMintPrice(uint256 mintPrice_) external onlyOwner { mintPrice = mintPrice_; } function setBaseURI(string memory baseURI_) external onlyOwner { baseURI = baseURI_; } function mint(uint256 _quantity) external payable nonReentrant { require(isMintEnabled, "minting not enabled"); require(msg.value == _quantity * mintPrice, "wrong value"); require(totalSupply + _quantity <= maxSupply - 250, "sold out"); require(mintedWallets[msg.sender] + _quantity <= 20, "exceeds max per wallet"); for (uint256 i = 0; i < _quantity; i++) { mintedWallets[msg.sender]++; totalSupply++; uint256 newTokenId = totalSupply; _safeMint(msg.sender, newTokenId); // should use newTokenId instead of tokenId emit Minted(msg.sender, newTokenId); } } function developerMint(uint256 _quantity) external onlyOwner nonReentrant{ require(totalSupply + _quantity <= maxSupply, "Exceeds max supply"); for (uint256 i = 0; i < _quantity; i++) { totalSupply++; uint256 newTokenId = totalSupply; _safeMint(owner(), newTokenId); // tokens are minted to the owner emit Minted(owner(), newTokenId); } } function burnGrandpaApesForFudApe(uint256 tokenId1, uint256 tokenId2, uint256 tokenId3) external nonReentrant { IGrandpaApes grandpaApes = IGrandpaApes(grandpaApesAddress); require(isBurnToMintEnabled, "burn to mint not enabled"); require(totalSupply < maxSupply - 250, "sold out"); // Ensure the sender owns these tokens require(grandpaApes.ownerOf(tokenId1) == msg.sender, "Not owner of tokenId1"); require(grandpaApes.ownerOf(tokenId2) == msg.sender, "Not owner of tokenId2"); require(grandpaApes.ownerOf(tokenId3) == msg.sender, "Not owner of tokenId3"); // Ensure the sender has given approval for this contract to manage all their Grandpa Apes tokens require(grandpaApes.isApprovedForAll(msg.sender, address(this)), "Approval required for FudApes to manage Grandpa Apes tokens"); // Transfer the Grandpa Apes tokens to the burn address grandpaApes.safeTransferFrom(msg.sender, BURN_ADDRESS, tokenId1); grandpaApes.safeTransferFrom(msg.sender, BURN_ADDRESS, tokenId2); grandpaApes.safeTransferFrom(msg.sender, BURN_ADDRESS, tokenId3); emit GrandpaApesBurned(msg.sender, tokenId1, tokenId2, tokenId3); // Mint a new Fud Ape token for the sender totalSupply++; uint256 newTokenId = totalSupply; _safeMint(msg.sender, newTokenId); emit Minted(msg.sender, newTokenId); } function claimWithXesPass(uint256 xesPassTokenId) external nonReentrant { IXesPass xesPass = IXesPass(xesPassAddress); require(isXesPassClaimEnabled, "XesPass claim not enabled"); require(totalSupply < maxSupply - 250, "sold out"); // Ensure caller is the owner of the XesPass token require(xesPass.ownerOf(xesPassTokenId) == msg.sender, "Not owner of the provided XesPass token"); // Ensure this XesPass token hasn't been used to claim before using the mapping for quick lookup require(!hasXesPassBeenClaimed[xesPassTokenId], "XesPass token already used to claim"); // Record the XesPass token as claimed hasXesPassBeenClaimed[xesPassTokenId] = true; claimedXesPass.push(xesPassTokenId); emit XesPassClaimed(msg.sender, xesPassTokenId); // Mint the FudApe totalSupply++; uint256 newTokenId = totalSupply; _safeMint(msg.sender, newTokenId); emit Minted(msg.sender, newTokenId); } function _isTokenOwner(uint256 tokenId) internal view returns (bool) { return ownerOf(tokenId) != address(0); } function tokenURI(uint256 tokenId_) public view override returns (string memory) { require(_isTokenOwner(tokenId_), "Token does not exist!"); return string(abi.encodePacked(baseURI, Strings.toString(tokenId_), ".json")); } function allClaimedXesPass() public view returns (uint256[] memory) { return claimedXesPass; } function withdraw() external onlyOwner nonReentrant { payable(owner()).transfer(address(this).balance); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"initialOwner","type":"address"}],"stateMutability":"payable","type":"constructor"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"address","name":"owner","type":"address"}],"name":"ERC721IncorrectOwner","type":"error"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ERC721InsufficientApproval","type":"error"},{"inputs":[{"internalType":"address","name":"approver","type":"address"}],"name":"ERC721InvalidApprover","type":"error"},{"inputs":[{"internalType":"address","name":"operator","type":"address"}],"name":"ERC721InvalidOperator","type":"error"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"ERC721InvalidOwner","type":"error"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"}],"name":"ERC721InvalidReceiver","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"}],"name":"ERC721InvalidSender","type":"error"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ERC721NonexistentToken","type":"error"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"OwnableInvalidOwner","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"OwnableUnauthorizedAccount","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"burner","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenId1","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"tokenId2","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"tokenId3","type":"uint256"}],"name":"GrandpaApesBurned","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Minted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"claimer","type":"address"},{"indexed":false,"internalType":"uint256","name":"xesPassTokenId","type":"uint256"}],"name":"XesPassClaimed","type":"event"},{"inputs":[],"name":"allClaimedXesPass","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":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId1","type":"uint256"},{"internalType":"uint256","name":"tokenId2","type":"uint256"},{"internalType":"uint256","name":"tokenId3","type":"uint256"}],"name":"burnGrandpaApesForFudApe","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"xesPassTokenId","type":"uint256"}],"name":"claimWithXesPass","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"claimedXesPass","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_quantity","type":"uint256"}],"name":"developerMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"grandpaApesAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"hasXesPassBeenClaimed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isBurnToMintEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isMintEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isXesPassClaimEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_quantity","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"mintPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"mintedWallets","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","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":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI_","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"maxSupply_","type":"uint256"}],"name":"setMaxSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"mintPrice_","type":"uint256"}],"name":"setMintPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"isBurnToMintEnabled_","type":"bool"}],"name":"toggleIsBurnToMintEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"isMintEnabled_","type":"bool"}],"name":"toggleIsMintEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"isXesPassClaimEnabled_","type":"bool"}],"name":"toggleIsXesPassClaimEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId_","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"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":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"xesPassAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
608060405273581e4fd879eff9d2f36012c4dad563f64a2f250d60105f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555073a1ecaa37bff06254aeb327b4e656ccc7db57661e60115f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060405162004aea38038062004aea8339818101604052810190620000d191906200033d565b806040518060400160405280600781526020017f46756441706573000000000000000000000000000000000000000000000000008152506040518060400160405280600481526020017f4655444100000000000000000000000000000000000000000000000000000000815250815f90816200014e9190620005d1565b508060019081620001609190620005d1565b5050505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603620001d6575f6040517f1e4fbdf7000000000000000000000000000000000000000000000000000000008152600401620001cd9190620006c6565b60405180910390fd5b620001e7816200021560201b60201c565b506001600781905550663c0a75e0b440006008819055505f600981905550611388600a8190555050620006e1565b5f60065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508160065f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6200030782620002dc565b9050919050565b6200031981620002fb565b811462000324575f80fd5b50565b5f8151905062000337816200030e565b92915050565b5f60208284031215620003555762000354620002d8565b5b5f620003648482850162000327565b91505092915050565b5f81519050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f6002820490506001821680620003e957607f821691505b602082108103620003ff57620003fe620003a4565b5b50919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f60088302620004637fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8262000426565b6200046f868362000426565b95508019841693508086168417925050509392505050565b5f819050919050565b5f819050919050565b5f620004b9620004b3620004ad8462000487565b62000490565b62000487565b9050919050565b5f819050919050565b620004d48362000499565b620004ec620004e382620004c0565b84845462000432565b825550505050565b5f90565b62000502620004f4565b6200050f818484620004c9565b505050565b5b8181101562000536576200052a5f82620004f8565b60018101905062000515565b5050565b601f82111562000585576200054f8162000405565b6200055a8462000417565b810160208510156200056a578190505b62000582620005798562000417565b83018262000514565b50505b505050565b5f82821c905092915050565b5f620005a75f19846008026200058a565b1980831691505092915050565b5f620005c1838362000596565b9150826002028217905092915050565b620005dc826200036d565b67ffffffffffffffff811115620005f857620005f762000377565b5b620006048254620003d1565b620006118282856200053a565b5f60209050601f83116001811462000647575f841562000632578287015190505b6200063e8582620005b4565b865550620006ad565b601f198416620006578662000405565b5f5b82811015620006805784890151825560018201915060208501945060208101905062000659565b86831015620006a057848901516200069c601f89168262000596565b8355505b6001600288020188555050505b505050505050565b620006c081620002fb565b82525050565b5f602082019050620006db5f830184620006b5565b92915050565b6143fb80620006ef5f395ff3fe60806040526004361061023a575f3560e01c80636c0360eb1161012d578063b02e1e98116100aa578063e985e9c51161006e578063e985e9c514610840578063f2991e6d1461087c578063f2fde38b146108a4578063f4a0a528146108cc578063f76fa7c1146108f45761023a565b8063b02e1e9814610760578063b88d4fde1461078a578063c87b56dd146107b2578063d5abeb01146107ee578063e0720cef146108185761023a565b80638da5cb5b116100f15780638da5cb5b1461068c57806395d89b41146106b6578063a0712d68146106e0578063a22cb465146106fc578063ada7c4ed146107245761023a565b80636c0360eb146105be5780636f8b44b0146105e857806370a0823114610610578063715018a61461064c5780638c0fae63146106625761023a565b80633ccfd60b116101bb57806355f804b31161017f57806355f804b3146104ca5780635d25c2fc146104f2578063615f4c8a1461052e5780636352211e146105585780636817c76c146105945761023a565b80633ccfd60b146103fe57806342842e0e1461041457806345d8beb41461043c578063506532ba14610478578063529eb6a8146104a25761023a565b80631615aa04116102025780631615aa041461033257806318160ddd1461035a5780631d4dfee11461038457806323b872dd146103ac578063346de50a146103d45761023a565b806301ffc9a71461023e57806306fdde031461027a578063081812fc146102a4578063095ea7b3146102e0578063125c897714610308575b5f80fd5b348015610249575f80fd5b50610264600480360381019061025f9190612e60565b61091c565b6040516102719190612ea5565b60405180910390f35b348015610285575f80fd5b5061028e6109fd565b60405161029b9190612f48565b60405180910390f35b3480156102af575f80fd5b506102ca60048036038101906102c59190612f9b565b610a8c565b6040516102d79190613005565b60405180910390f35b3480156102eb575f80fd5b5061030660048036038101906103019190613048565b610aa7565b005b348015610313575f80fd5b5061031c610abd565b6040516103299190613005565b60405180910390f35b34801561033d575f80fd5b5061035860048036038101906103539190613086565b610ae2565b005b348015610365575f80fd5b5061036e611128565b60405161037b91906130e5565b60405180910390f35b34801561038f575f80fd5b506103aa60048036038101906103a59190612f9b565b61112e565b005b3480156103b7575f80fd5b506103d260048036038101906103cd91906130fe565b611454565b005b3480156103df575f80fd5b506103e8611553565b6040516103f59190612ea5565b60405180910390f35b348015610409575f80fd5b50610412611565565b005b34801561041f575f80fd5b5061043a600480360381019061043591906130fe565b6115ca565b005b348015610447575f80fd5b50610462600480360381019061045d9190612f9b565b6115e9565b60405161046f91906130e5565b60405180910390f35b348015610483575f80fd5b5061048c611609565b6040516104999190613205565b60405180910390f35b3480156104ad575f80fd5b506104c860048036038101906104c3919061324f565b61165f565b005b3480156104d5575f80fd5b506104f060048036038101906104eb91906133a6565b611683565b005b3480156104fd575f80fd5b5061051860048036038101906105139190612f9b565b61169e565b6040516105259190612ea5565b60405180910390f35b348015610539575f80fd5b506105426116bb565b60405161054f9190613005565b60405180910390f35b348015610563575f80fd5b5061057e60048036038101906105799190612f9b565b6116e0565b60405161058b9190613005565b60405180910390f35b34801561059f575f80fd5b506105a86116f1565b6040516105b591906130e5565b60405180910390f35b3480156105c9575f80fd5b506105d26116f7565b6040516105df9190612f48565b60405180910390f35b3480156105f3575f80fd5b5061060e60048036038101906106099190612f9b565b611783565b005b34801561061b575f80fd5b50610636600480360381019061063191906133ed565b611795565b60405161064391906130e5565b60405180910390f35b348015610657575f80fd5b5061066061184b565b005b34801561066d575f80fd5b5061067661185e565b6040516106839190612ea5565b60405180910390f35b348015610697575f80fd5b506106a0611871565b6040516106ad9190613005565b60405180910390f35b3480156106c1575f80fd5b506106ca611899565b6040516106d79190612f48565b60405180910390f35b6106fa60048036038101906106f59190612f9b565b611929565b005b348015610707575f80fd5b50610722600480360381019061071d9190613418565b611b9f565b005b34801561072f575f80fd5b5061074a600480360381019061074591906133ed565b611bb5565b60405161075791906130e5565b60405180910390f35b34801561076b575f80fd5b50610774611bca565b6040516107819190612ea5565b60405180910390f35b348015610795575f80fd5b506107b060048036038101906107ab91906134f4565b611bdd565b005b3480156107bd575f80fd5b506107d860048036038101906107d39190612f9b565b611bfa565b6040516107e59190612f48565b60405180910390f35b3480156107f9575f80fd5b50610802611c76565b60405161080f91906130e5565b60405180910390f35b348015610823575f80fd5b5061083e6004803603810190610839919061324f565b611c7c565b005b34801561084b575f80fd5b5061086660048036038101906108619190613574565b611ca1565b6040516108739190612ea5565b60405180910390f35b348015610887575f80fd5b506108a2600480360381019061089d919061324f565b611d2f565b005b3480156108af575f80fd5b506108ca60048036038101906108c591906133ed565b611d54565b005b3480156108d7575f80fd5b506108f260048036038101906108ed9190612f9b565b611dd8565b005b3480156108ff575f80fd5b5061091a60048036038101906109159190612f9b565b611dea565b005b5f7f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806109e657507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806109f657506109f582611eef565b5b9050919050565b60605f8054610a0b906135df565b80601f0160208091040260200160405190810160405280929190818152602001828054610a37906135df565b8015610a825780601f10610a5957610100808354040283529160200191610a82565b820191905f5260205f20905b815481529060010190602001808311610a6557829003601f168201915b5050505050905090565b5f610a9682611f58565b50610aa082611fde565b9050919050565b610ab98282610ab4612017565b61201e565b5050565b60115f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b610aea612030565b5f60105f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600b60019054906101000a900460ff16610b5e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b5590613659565b60405180910390fd5b60fa600a54610b6d91906136a4565b60095410610bb0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ba790613721565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16636352211e866040518263ffffffff1660e01b8152600401610c0091906130e5565b602060405180830381865afa158015610c1b573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610c3f9190613753565b73ffffffffffffffffffffffffffffffffffffffff1614610c95576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c8c906137c8565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16636352211e856040518263ffffffff1660e01b8152600401610ce591906130e5565b602060405180830381865afa158015610d00573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d249190613753565b73ffffffffffffffffffffffffffffffffffffffff1614610d7a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d7190613830565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16636352211e846040518263ffffffff1660e01b8152600401610dca91906130e5565b602060405180830381865afa158015610de5573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e099190613753565b73ffffffffffffffffffffffffffffffffffffffff1614610e5f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e5690613898565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1663e985e9c533306040518363ffffffff1660e01b8152600401610e9a9291906138b6565b602060405180830381865afa158015610eb5573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ed991906138f1565b610f18576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f0f9061398c565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166342842e0e3361dead876040518463ffffffff1660e01b8152600401610f57939291906139aa565b5f604051808303815f87803b158015610f6e575f80fd5b505af1158015610f80573d5f803e3d5ffd5b505050508073ffffffffffffffffffffffffffffffffffffffff166342842e0e3361dead866040518463ffffffff1660e01b8152600401610fc3939291906139aa565b5f604051808303815f87803b158015610fda575f80fd5b505af1158015610fec573d5f803e3d5ffd5b505050508073ffffffffffffffffffffffffffffffffffffffff166342842e0e3361dead856040518463ffffffff1660e01b815260040161102f939291906139aa565b5f604051808303815f87803b158015611046575f80fd5b505af1158015611058573d5f803e3d5ffd5b505050503373ffffffffffffffffffffffffffffffffffffffff167ff5e9b8b95a27900dcfc8f0a2116417e2f6a8b29482dee15a9aa23157ad471b7d8585856040516110a6939291906139df565b60405180910390a260095f8154809291906110c090613a14565b91905055505f60095490506110d5338261207f565b803373ffffffffffffffffffffffffffffffffffffffff167f30385c845b448a36257a6a1716e6ad2e1bc2cbe333cde1e69fe849ad6511adfe60405160405180910390a3505061112361209c565b505050565b60095481565b611136612030565b5f60115f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600b60029054906101000a900460ff166111aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111a190613aa5565b60405180910390fd5b60fa600a546111b991906136a4565b600954106111fc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111f390613721565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16636352211e846040518263ffffffff1660e01b815260040161124c91906130e5565b602060405180830381865afa158015611267573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061128b9190613753565b73ffffffffffffffffffffffffffffffffffffffff16146112e1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112d890613b33565b60405180910390fd5b600f5f8381526020019081526020015f205f9054906101000a900460ff161561133f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161133690613bc1565b60405180910390fd5b6001600f5f8481526020019081526020015f205f6101000a81548160ff021916908315150217905550600e82908060018154018082558091505060019003905f5260205f20015f90919091909150553373ffffffffffffffffffffffffffffffffffffffff167fc9d263b2ced4d1bfd61e0ed5239e62ef9a27ec16969da8c31f780d59827229fe836040516113d491906130e5565b60405180910390a260095f8154809291906113ee90613a14565b91905055505f6009549050611403338261207f565b803373ffffffffffffffffffffffffffffffffffffffff167f30385c845b448a36257a6a1716e6ad2e1bc2cbe333cde1e69fe849ad6511adfe60405160405180910390a3505061145161209c565b50565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036114c4575f6040517f64a0ae920000000000000000000000000000000000000000000000000000000081526004016114bb9190613005565b60405180910390fd5b5f6114d783836114d2612017565b6120a6565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161461154d578382826040517f64283d7b00000000000000000000000000000000000000000000000000000000815260040161154493929190613bdf565b60405180910390fd5b50505050565b600b5f9054906101000a900460ff1681565b61156d6122b1565b611575612030565b61157d611871565b73ffffffffffffffffffffffffffffffffffffffff166108fc4790811502906040515f60405180830381858888f193505050501580156115bf573d5f803e3d5ffd5b506115c861209c565b565b6115e483838360405180602001604052805f815250611bdd565b505050565b600e81815481106115f8575f80fd5b905f5260205f20015f915090505481565b6060600e80548060200260200160405190810160405280929190818152602001828054801561165557602002820191905f5260205f20905b815481526020019060010190808311611641575b5050505050905090565b6116676122b1565b80600b5f6101000a81548160ff02191690831515021790555050565b61168b6122b1565b80600c908161169a9190613db1565b5050565b600f602052805f5260405f205f915054906101000a900460ff1681565b60105f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b5f6116ea82611f58565b9050919050565b60085481565b600c8054611704906135df565b80601f0160208091040260200160405190810160405280929190818152602001828054611730906135df565b801561177b5780601f106117525761010080835404028352916020019161177b565b820191905f5260205f20905b81548152906001019060200180831161175e57829003601f168201915b505050505081565b61178b6122b1565b80600a8190555050565b5f8073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611806575f6040517f89c62b640000000000000000000000000000000000000000000000000000000081526004016117fd9190613005565b60405180910390fd5b60035f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050919050565b6118536122b1565b61185c5f612338565b565b600b60019054906101000a900460ff1681565b5f60065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600180546118a8906135df565b80601f01602080910402602001604051908101604052809291908181526020018280546118d4906135df565b801561191f5780601f106118f65761010080835404028352916020019161191f565b820191905f5260205f20905b81548152906001019060200180831161190257829003601f168201915b5050505050905090565b611931612030565b600b5f9054906101000a900460ff1661197f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161197690613eca565b60405180910390fd5b6008548161198d9190613ee8565b34146119ce576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119c590613f73565b60405180910390fd5b60fa600a546119dd91906136a4565b816009546119eb9190613f91565b1115611a2c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a2390613721565b60405180910390fd5b601481600d5f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054611a779190613f91565b1115611ab8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611aaf9061400e565b60405180910390fd5b5f5b81811015611b9357600d5f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f815480929190611b0f90613a14565b919050555060095f815480929190611b2690613a14565b91905055505f6009549050611b3b338261207f565b803373ffffffffffffffffffffffffffffffffffffffff167f30385c845b448a36257a6a1716e6ad2e1bc2cbe333cde1e69fe849ad6511adfe60405160405180910390a3508080611b8b90613a14565b915050611aba565b50611b9c61209c565b50565b611bb1611baa612017565b83836123fb565b5050565b600d602052805f5260405f205f915090505481565b600b60029054906101000a900460ff1681565b611be8848484611454565b611bf484848484612564565b50505050565b6060611c0582612716565b611c44576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c3b90614076565b60405180910390fd5b600c611c4f83612756565b604051602001611c60929190614198565b6040516020818303038152906040529050919050565b600a5481565b611c846122b1565b80600b60026101000a81548160ff02191690831515021790555050565b5f60055f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16905092915050565b611d376122b1565b80600b60016101000a81548160ff02191690831515021790555050565b611d5c6122b1565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611dcc575f6040517f1e4fbdf7000000000000000000000000000000000000000000000000000000008152600401611dc39190613005565b60405180910390fd5b611dd581612338565b50565b611de06122b1565b8060088190555050565b611df26122b1565b611dfa612030565b600a5481600954611e0b9190613f91565b1115611e4c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e4390614210565b60405180910390fd5b5f5b81811015611ee35760095f815480929190611e6890613a14565b91905055505f6009549050611e84611e7e611871565b8261207f565b80611e8d611871565b73ffffffffffffffffffffffffffffffffffffffff167f30385c845b448a36257a6a1716e6ad2e1bc2cbe333cde1e69fe849ad6511adfe60405160405180910390a3508080611edb90613a14565b915050611e4e565b50611eec61209c565b50565b5f7f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b5f80611f6383612820565b90505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611fd557826040517f7e273289000000000000000000000000000000000000000000000000000000008152600401611fcc91906130e5565b60405180910390fd5b80915050919050565b5f60045f8381526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b5f33905090565b61202b8383836001612859565b505050565b600260075403612075576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161206c90614278565b60405180910390fd5b6002600781905550565b612098828260405180602001604052805f815250612a18565b5050565b6001600781905550565b5f806120b184612820565b90505f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146120f2576120f1818486612a33565b5b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161461217d576121315f855f80612859565b600160035f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825403925050819055505b5f73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16146121fc57600160035f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055505b8460025f8681526020019081526020015f205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550838573ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4809150509392505050565b6122b9612017565b73ffffffffffffffffffffffffffffffffffffffff166122d7611871565b73ffffffffffffffffffffffffffffffffffffffff1614612336576122fa612017565b6040517f118cdaa700000000000000000000000000000000000000000000000000000000815260040161232d9190613005565b60405180910390fd5b565b5f60065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508160065f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361246b57816040517f5b08ba180000000000000000000000000000000000000000000000000000000081526004016124629190613005565b60405180910390fd5b8060055f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516125579190612ea5565b60405180910390a3505050565b5f8373ffffffffffffffffffffffffffffffffffffffff163b1115612710578273ffffffffffffffffffffffffffffffffffffffff1663150b7a026125a7612017565b8685856040518563ffffffff1660e01b81526004016125c994939291906142e8565b6020604051808303815f875af192505050801561260457506040513d601f19601f820116820180604052508101906126019190614346565b60015b612685573d805f8114612632576040519150601f19603f3d011682016040523d82523d5f602084013e612637565b606091505b505f81510361267d57836040517f64a0ae920000000000000000000000000000000000000000000000000000000081526004016126749190613005565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161461270e57836040517f64a0ae920000000000000000000000000000000000000000000000000000000081526004016127059190613005565b60405180910390fd5b505b50505050565b5f8073ffffffffffffffffffffffffffffffffffffffff16612737836116e0565b73ffffffffffffffffffffffffffffffffffffffff1614159050919050565b60605f600161276484612af6565b0190505f8167ffffffffffffffff81111561278257612781613282565b5b6040519080825280601f01601f1916602001820160405280156127b45781602001600182028036833780820191505090505b5090505f82602001820190505b600115612815578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a858161280a57612809614371565b5b0494505f85036127c1575b819350505050919050565b5f60025f8381526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b808061289157505f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b156129c3575f6128a084611f58565b90505f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415801561290a57508273ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614155b801561291d575061291b8184611ca1565b155b1561295f57826040517fa9fbf51f0000000000000000000000000000000000000000000000000000000081526004016129569190613005565b60405180910390fd5b81156129c157838573ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45b505b8360045f8581526020019081526020015f205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050505050565b612a228383612c47565b612a2e5f848484612564565b505050565b612a3e838383612d3a565b612af1575f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612ab257806040517f7e273289000000000000000000000000000000000000000000000000000000008152600401612aa991906130e5565b60405180910390fd5b81816040517f177e802f000000000000000000000000000000000000000000000000000000008152600401612ae892919061439e565b60405180910390fd5b505050565b5f805f90507a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008310612b52577a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008381612b4857612b47614371565b5b0492506040810190505b6d04ee2d6d415b85acef81000000008310612b8f576d04ee2d6d415b85acef81000000008381612b8557612b84614371565b5b0492506020810190505b662386f26fc100008310612bbe57662386f26fc100008381612bb457612bb3614371565b5b0492506010810190505b6305f5e1008310612be7576305f5e1008381612bdd57612bdc614371565b5b0492506008810190505b6127108310612c0c576127108381612c0257612c01614371565b5b0492506004810190505b60648310612c2f5760648381612c2557612c24614371565b5b0492506002810190505b600a8310612c3e576001810190505b80915050919050565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612cb7575f6040517f64a0ae92000000000000000000000000000000000000000000000000000000008152600401612cae9190613005565b60405180910390fd5b5f612cc383835f6120a6565b90505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614612d35575f6040517f73c6ac6e000000000000000000000000000000000000000000000000000000008152600401612d2c9190613005565b60405180910390fd5b505050565b5f8073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614158015612df157508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480612db25750612db18484611ca1565b5b80612df057508273ffffffffffffffffffffffffffffffffffffffff16612dd883611fde565b73ffffffffffffffffffffffffffffffffffffffff16145b5b90509392505050565b5f604051905090565b5f80fd5b5f80fd5b5f7fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b612e3f81612e0b565b8114612e49575f80fd5b50565b5f81359050612e5a81612e36565b92915050565b5f60208284031215612e7557612e74612e03565b5b5f612e8284828501612e4c565b91505092915050565b5f8115159050919050565b612e9f81612e8b565b82525050565b5f602082019050612eb85f830184612e96565b92915050565b5f81519050919050565b5f82825260208201905092915050565b5f5b83811015612ef5578082015181840152602081019050612eda565b5f8484015250505050565b5f601f19601f8301169050919050565b5f612f1a82612ebe565b612f248185612ec8565b9350612f34818560208601612ed8565b612f3d81612f00565b840191505092915050565b5f6020820190508181035f830152612f608184612f10565b905092915050565b5f819050919050565b612f7a81612f68565b8114612f84575f80fd5b50565b5f81359050612f9581612f71565b92915050565b5f60208284031215612fb057612faf612e03565b5b5f612fbd84828501612f87565b91505092915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f612fef82612fc6565b9050919050565b612fff81612fe5565b82525050565b5f6020820190506130185f830184612ff6565b92915050565b61302781612fe5565b8114613031575f80fd5b50565b5f813590506130428161301e565b92915050565b5f806040838503121561305e5761305d612e03565b5b5f61306b85828601613034565b925050602061307c85828601612f87565b9150509250929050565b5f805f6060848603121561309d5761309c612e03565b5b5f6130aa86828701612f87565b93505060206130bb86828701612f87565b92505060406130cc86828701612f87565b9150509250925092565b6130df81612f68565b82525050565b5f6020820190506130f85f8301846130d6565b92915050565b5f805f6060848603121561311557613114612e03565b5b5f61312286828701613034565b935050602061313386828701613034565b925050604061314486828701612f87565b9150509250925092565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b61318081612f68565b82525050565b5f6131918383613177565b60208301905092915050565b5f602082019050919050565b5f6131b38261314e565b6131bd8185613158565b93506131c883613168565b805f5b838110156131f85781516131df8882613186565b97506131ea8361319d565b9250506001810190506131cb565b5085935050505092915050565b5f6020820190508181035f83015261321d81846131a9565b905092915050565b61322e81612e8b565b8114613238575f80fd5b50565b5f8135905061324981613225565b92915050565b5f6020828403121561326457613263612e03565b5b5f6132718482850161323b565b91505092915050565b5f80fd5b5f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b6132b882612f00565b810181811067ffffffffffffffff821117156132d7576132d6613282565b5b80604052505050565b5f6132e9612dfa565b90506132f582826132af565b919050565b5f67ffffffffffffffff82111561331457613313613282565b5b61331d82612f00565b9050602081019050919050565b828183375f83830152505050565b5f61334a613345846132fa565b6132e0565b9050828152602081018484840111156133665761336561327e565b5b61337184828561332a565b509392505050565b5f82601f83011261338d5761338c61327a565b5b813561339d848260208601613338565b91505092915050565b5f602082840312156133bb576133ba612e03565b5b5f82013567ffffffffffffffff8111156133d8576133d7612e07565b5b6133e484828501613379565b91505092915050565b5f6020828403121561340257613401612e03565b5b5f61340f84828501613034565b91505092915050565b5f806040838503121561342e5761342d612e03565b5b5f61343b85828601613034565b925050602061344c8582860161323b565b9150509250929050565b5f67ffffffffffffffff8211156134705761346f613282565b5b61347982612f00565b9050602081019050919050565b5f61349861349384613456565b6132e0565b9050828152602081018484840111156134b4576134b361327e565b5b6134bf84828561332a565b509392505050565b5f82601f8301126134db576134da61327a565b5b81356134eb848260208601613486565b91505092915050565b5f805f806080858703121561350c5761350b612e03565b5b5f61351987828801613034565b945050602061352a87828801613034565b935050604061353b87828801612f87565b925050606085013567ffffffffffffffff81111561355c5761355b612e07565b5b613568878288016134c7565b91505092959194509250565b5f806040838503121561358a57613589612e03565b5b5f61359785828601613034565b92505060206135a885828601613034565b9150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f60028204905060018216806135f657607f821691505b602082108103613609576136086135b2565b5b50919050565b7f6275726e20746f206d696e74206e6f7420656e61626c656400000000000000005f82015250565b5f613643601883612ec8565b915061364e8261360f565b602082019050919050565b5f6020820190508181035f83015261367081613637565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f6136ae82612f68565b91506136b983612f68565b92508282039050818111156136d1576136d0613677565b5b92915050565b7f736f6c64206f75740000000000000000000000000000000000000000000000005f82015250565b5f61370b600883612ec8565b9150613716826136d7565b602082019050919050565b5f6020820190508181035f830152613738816136ff565b9050919050565b5f8151905061374d8161301e565b92915050565b5f6020828403121561376857613767612e03565b5b5f6137758482850161373f565b91505092915050565b7f4e6f74206f776e6572206f6620746f6b656e49643100000000000000000000005f82015250565b5f6137b2601583612ec8565b91506137bd8261377e565b602082019050919050565b5f6020820190508181035f8301526137df816137a6565b9050919050565b7f4e6f74206f776e6572206f6620746f6b656e49643200000000000000000000005f82015250565b5f61381a601583612ec8565b9150613825826137e6565b602082019050919050565b5f6020820190508181035f8301526138478161380e565b9050919050565b7f4e6f74206f776e6572206f6620746f6b656e49643300000000000000000000005f82015250565b5f613882601583612ec8565b915061388d8261384e565b602082019050919050565b5f6020820190508181035f8301526138af81613876565b9050919050565b5f6040820190506138c95f830185612ff6565b6138d66020830184612ff6565b9392505050565b5f815190506138eb81613225565b92915050565b5f6020828403121561390657613905612e03565b5b5f613913848285016138dd565b91505092915050565b7f417070726f76616c20726571756972656420666f72204675644170657320746f5f8201527f206d616e616765204772616e647061204170657320746f6b656e730000000000602082015250565b5f613976603b83612ec8565b91506139818261391c565b604082019050919050565b5f6020820190508181035f8301526139a38161396a565b9050919050565b5f6060820190506139bd5f830186612ff6565b6139ca6020830185612ff6565b6139d760408301846130d6565b949350505050565b5f6060820190506139f25f8301866130d6565b6139ff60208301856130d6565b613a0c60408301846130d6565b949350505050565b5f613a1e82612f68565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203613a5057613a4f613677565b5b600182019050919050565b7f5865735061737320636c61696d206e6f7420656e61626c6564000000000000005f82015250565b5f613a8f601983612ec8565b9150613a9a82613a5b565b602082019050919050565b5f6020820190508181035f830152613abc81613a83565b9050919050565b7f4e6f74206f776e6572206f66207468652070726f7669646564205865735061735f8201527f7320746f6b656e00000000000000000000000000000000000000000000000000602082015250565b5f613b1d602783612ec8565b9150613b2882613ac3565b604082019050919050565b5f6020820190508181035f830152613b4a81613b11565b9050919050565b7f5865735061737320746f6b656e20616c7265616479207573656420746f20636c5f8201527f61696d0000000000000000000000000000000000000000000000000000000000602082015250565b5f613bab602383612ec8565b9150613bb682613b51565b604082019050919050565b5f6020820190508181035f830152613bd881613b9f565b9050919050565b5f606082019050613bf25f830186612ff6565b613bff60208301856130d6565b613c0c6040830184612ff6565b949350505050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f60088302613c707fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82613c35565b613c7a8683613c35565b95508019841693508086168417925050509392505050565b5f819050919050565b5f613cb5613cb0613cab84612f68565b613c92565b612f68565b9050919050565b5f819050919050565b613cce83613c9b565b613ce2613cda82613cbc565b848454613c41565b825550505050565b5f90565b613cf6613cea565b613d01818484613cc5565b505050565b5b81811015613d2457613d195f82613cee565b600181019050613d07565b5050565b601f821115613d6957613d3a81613c14565b613d4384613c26565b81016020851015613d52578190505b613d66613d5e85613c26565b830182613d06565b50505b505050565b5f82821c905092915050565b5f613d895f1984600802613d6e565b1980831691505092915050565b5f613da18383613d7a565b9150826002028217905092915050565b613dba82612ebe565b67ffffffffffffffff811115613dd357613dd2613282565b5b613ddd82546135df565b613de8828285613d28565b5f60209050601f831160018114613e19575f8415613e07578287015190505b613e118582613d96565b865550613e78565b601f198416613e2786613c14565b5f5b82811015613e4e57848901518255600182019150602085019450602081019050613e29565b86831015613e6b5784890151613e67601f891682613d7a565b8355505b6001600288020188555050505b505050505050565b7f6d696e74696e67206e6f7420656e61626c6564000000000000000000000000005f82015250565b5f613eb4601383612ec8565b9150613ebf82613e80565b602082019050919050565b5f6020820190508181035f830152613ee181613ea8565b9050919050565b5f613ef282612f68565b9150613efd83612f68565b9250828202613f0b81612f68565b91508282048414831517613f2257613f21613677565b5b5092915050565b7f77726f6e672076616c75650000000000000000000000000000000000000000005f82015250565b5f613f5d600b83612ec8565b9150613f6882613f29565b602082019050919050565b5f6020820190508181035f830152613f8a81613f51565b9050919050565b5f613f9b82612f68565b9150613fa683612f68565b9250828201905080821115613fbe57613fbd613677565b5b92915050565b7f65786365656473206d6178207065722077616c6c6574000000000000000000005f82015250565b5f613ff8601683612ec8565b915061400382613fc4565b602082019050919050565b5f6020820190508181035f83015261402581613fec565b9050919050565b7f546f6b656e20646f6573206e6f742065786973742100000000000000000000005f82015250565b5f614060601583612ec8565b915061406b8261402c565b602082019050919050565b5f6020820190508181035f83015261408d81614054565b9050919050565b5f81905092915050565b5f81546140aa816135df565b6140b48186614094565b9450600182165f81146140ce57600181146140e357614115565b60ff1983168652811515820286019350614115565b6140ec85613c14565b5f5b8381101561410d578154818901526001820191506020810190506140ee565b838801955050505b50505092915050565b5f61412882612ebe565b6141328185614094565b9350614142818560208601612ed8565b80840191505092915050565b7f2e6a736f6e0000000000000000000000000000000000000000000000000000005f82015250565b5f614182600583614094565b915061418d8261414e565b600582019050919050565b5f6141a3828561409e565b91506141af828461411e565b91506141ba82614176565b91508190509392505050565b7f45786365656473206d617820737570706c7900000000000000000000000000005f82015250565b5f6141fa601283612ec8565b9150614205826141c6565b602082019050919050565b5f6020820190508181035f830152614227816141ee565b9050919050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c005f82015250565b5f614262601f83612ec8565b915061426d8261422e565b602082019050919050565b5f6020820190508181035f83015261428f81614256565b9050919050565b5f81519050919050565b5f82825260208201905092915050565b5f6142ba82614296565b6142c481856142a0565b93506142d4818560208601612ed8565b6142dd81612f00565b840191505092915050565b5f6080820190506142fb5f830187612ff6565b6143086020830186612ff6565b61431560408301856130d6565b818103606083015261432781846142b0565b905095945050505050565b5f8151905061434081612e36565b92915050565b5f6020828403121561435b5761435a612e03565b5b5f61436884828501614332565b91505092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f6040820190506143b15f830185612ff6565b6143be60208301846130d6565b939250505056fea26469706673582212207eb4dadaa3d05029e243c8651e714d4e5b25ee4a93bc53442da990d815760e3164736f6c63430008140033000000000000000000000000f6e92ec9525e6292e6ee00673c45bb5e9f5cc29f
Deployed Bytecode
0x60806040526004361061023a575f3560e01c80636c0360eb1161012d578063b02e1e98116100aa578063e985e9c51161006e578063e985e9c514610840578063f2991e6d1461087c578063f2fde38b146108a4578063f4a0a528146108cc578063f76fa7c1146108f45761023a565b8063b02e1e9814610760578063b88d4fde1461078a578063c87b56dd146107b2578063d5abeb01146107ee578063e0720cef146108185761023a565b80638da5cb5b116100f15780638da5cb5b1461068c57806395d89b41146106b6578063a0712d68146106e0578063a22cb465146106fc578063ada7c4ed146107245761023a565b80636c0360eb146105be5780636f8b44b0146105e857806370a0823114610610578063715018a61461064c5780638c0fae63146106625761023a565b80633ccfd60b116101bb57806355f804b31161017f57806355f804b3146104ca5780635d25c2fc146104f2578063615f4c8a1461052e5780636352211e146105585780636817c76c146105945761023a565b80633ccfd60b146103fe57806342842e0e1461041457806345d8beb41461043c578063506532ba14610478578063529eb6a8146104a25761023a565b80631615aa04116102025780631615aa041461033257806318160ddd1461035a5780631d4dfee11461038457806323b872dd146103ac578063346de50a146103d45761023a565b806301ffc9a71461023e57806306fdde031461027a578063081812fc146102a4578063095ea7b3146102e0578063125c897714610308575b5f80fd5b348015610249575f80fd5b50610264600480360381019061025f9190612e60565b61091c565b6040516102719190612ea5565b60405180910390f35b348015610285575f80fd5b5061028e6109fd565b60405161029b9190612f48565b60405180910390f35b3480156102af575f80fd5b506102ca60048036038101906102c59190612f9b565b610a8c565b6040516102d79190613005565b60405180910390f35b3480156102eb575f80fd5b5061030660048036038101906103019190613048565b610aa7565b005b348015610313575f80fd5b5061031c610abd565b6040516103299190613005565b60405180910390f35b34801561033d575f80fd5b5061035860048036038101906103539190613086565b610ae2565b005b348015610365575f80fd5b5061036e611128565b60405161037b91906130e5565b60405180910390f35b34801561038f575f80fd5b506103aa60048036038101906103a59190612f9b565b61112e565b005b3480156103b7575f80fd5b506103d260048036038101906103cd91906130fe565b611454565b005b3480156103df575f80fd5b506103e8611553565b6040516103f59190612ea5565b60405180910390f35b348015610409575f80fd5b50610412611565565b005b34801561041f575f80fd5b5061043a600480360381019061043591906130fe565b6115ca565b005b348015610447575f80fd5b50610462600480360381019061045d9190612f9b565b6115e9565b60405161046f91906130e5565b60405180910390f35b348015610483575f80fd5b5061048c611609565b6040516104999190613205565b60405180910390f35b3480156104ad575f80fd5b506104c860048036038101906104c3919061324f565b61165f565b005b3480156104d5575f80fd5b506104f060048036038101906104eb91906133a6565b611683565b005b3480156104fd575f80fd5b5061051860048036038101906105139190612f9b565b61169e565b6040516105259190612ea5565b60405180910390f35b348015610539575f80fd5b506105426116bb565b60405161054f9190613005565b60405180910390f35b348015610563575f80fd5b5061057e60048036038101906105799190612f9b565b6116e0565b60405161058b9190613005565b60405180910390f35b34801561059f575f80fd5b506105a86116f1565b6040516105b591906130e5565b60405180910390f35b3480156105c9575f80fd5b506105d26116f7565b6040516105df9190612f48565b60405180910390f35b3480156105f3575f80fd5b5061060e60048036038101906106099190612f9b565b611783565b005b34801561061b575f80fd5b50610636600480360381019061063191906133ed565b611795565b60405161064391906130e5565b60405180910390f35b348015610657575f80fd5b5061066061184b565b005b34801561066d575f80fd5b5061067661185e565b6040516106839190612ea5565b60405180910390f35b348015610697575f80fd5b506106a0611871565b6040516106ad9190613005565b60405180910390f35b3480156106c1575f80fd5b506106ca611899565b6040516106d79190612f48565b60405180910390f35b6106fa60048036038101906106f59190612f9b565b611929565b005b348015610707575f80fd5b50610722600480360381019061071d9190613418565b611b9f565b005b34801561072f575f80fd5b5061074a600480360381019061074591906133ed565b611bb5565b60405161075791906130e5565b60405180910390f35b34801561076b575f80fd5b50610774611bca565b6040516107819190612ea5565b60405180910390f35b348015610795575f80fd5b506107b060048036038101906107ab91906134f4565b611bdd565b005b3480156107bd575f80fd5b506107d860048036038101906107d39190612f9b565b611bfa565b6040516107e59190612f48565b60405180910390f35b3480156107f9575f80fd5b50610802611c76565b60405161080f91906130e5565b60405180910390f35b348015610823575f80fd5b5061083e6004803603810190610839919061324f565b611c7c565b005b34801561084b575f80fd5b5061086660048036038101906108619190613574565b611ca1565b6040516108739190612ea5565b60405180910390f35b348015610887575f80fd5b506108a2600480360381019061089d919061324f565b611d2f565b005b3480156108af575f80fd5b506108ca60048036038101906108c591906133ed565b611d54565b005b3480156108d7575f80fd5b506108f260048036038101906108ed9190612f9b565b611dd8565b005b3480156108ff575f80fd5b5061091a60048036038101906109159190612f9b565b611dea565b005b5f7f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806109e657507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806109f657506109f582611eef565b5b9050919050565b60605f8054610a0b906135df565b80601f0160208091040260200160405190810160405280929190818152602001828054610a37906135df565b8015610a825780601f10610a5957610100808354040283529160200191610a82565b820191905f5260205f20905b815481529060010190602001808311610a6557829003601f168201915b5050505050905090565b5f610a9682611f58565b50610aa082611fde565b9050919050565b610ab98282610ab4612017565b61201e565b5050565b60115f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b610aea612030565b5f60105f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600b60019054906101000a900460ff16610b5e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b5590613659565b60405180910390fd5b60fa600a54610b6d91906136a4565b60095410610bb0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ba790613721565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16636352211e866040518263ffffffff1660e01b8152600401610c0091906130e5565b602060405180830381865afa158015610c1b573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610c3f9190613753565b73ffffffffffffffffffffffffffffffffffffffff1614610c95576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c8c906137c8565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16636352211e856040518263ffffffff1660e01b8152600401610ce591906130e5565b602060405180830381865afa158015610d00573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d249190613753565b73ffffffffffffffffffffffffffffffffffffffff1614610d7a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d7190613830565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16636352211e846040518263ffffffff1660e01b8152600401610dca91906130e5565b602060405180830381865afa158015610de5573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e099190613753565b73ffffffffffffffffffffffffffffffffffffffff1614610e5f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e5690613898565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1663e985e9c533306040518363ffffffff1660e01b8152600401610e9a9291906138b6565b602060405180830381865afa158015610eb5573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ed991906138f1565b610f18576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f0f9061398c565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166342842e0e3361dead876040518463ffffffff1660e01b8152600401610f57939291906139aa565b5f604051808303815f87803b158015610f6e575f80fd5b505af1158015610f80573d5f803e3d5ffd5b505050508073ffffffffffffffffffffffffffffffffffffffff166342842e0e3361dead866040518463ffffffff1660e01b8152600401610fc3939291906139aa565b5f604051808303815f87803b158015610fda575f80fd5b505af1158015610fec573d5f803e3d5ffd5b505050508073ffffffffffffffffffffffffffffffffffffffff166342842e0e3361dead856040518463ffffffff1660e01b815260040161102f939291906139aa565b5f604051808303815f87803b158015611046575f80fd5b505af1158015611058573d5f803e3d5ffd5b505050503373ffffffffffffffffffffffffffffffffffffffff167ff5e9b8b95a27900dcfc8f0a2116417e2f6a8b29482dee15a9aa23157ad471b7d8585856040516110a6939291906139df565b60405180910390a260095f8154809291906110c090613a14565b91905055505f60095490506110d5338261207f565b803373ffffffffffffffffffffffffffffffffffffffff167f30385c845b448a36257a6a1716e6ad2e1bc2cbe333cde1e69fe849ad6511adfe60405160405180910390a3505061112361209c565b505050565b60095481565b611136612030565b5f60115f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600b60029054906101000a900460ff166111aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111a190613aa5565b60405180910390fd5b60fa600a546111b991906136a4565b600954106111fc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111f390613721565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16636352211e846040518263ffffffff1660e01b815260040161124c91906130e5565b602060405180830381865afa158015611267573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061128b9190613753565b73ffffffffffffffffffffffffffffffffffffffff16146112e1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112d890613b33565b60405180910390fd5b600f5f8381526020019081526020015f205f9054906101000a900460ff161561133f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161133690613bc1565b60405180910390fd5b6001600f5f8481526020019081526020015f205f6101000a81548160ff021916908315150217905550600e82908060018154018082558091505060019003905f5260205f20015f90919091909150553373ffffffffffffffffffffffffffffffffffffffff167fc9d263b2ced4d1bfd61e0ed5239e62ef9a27ec16969da8c31f780d59827229fe836040516113d491906130e5565b60405180910390a260095f8154809291906113ee90613a14565b91905055505f6009549050611403338261207f565b803373ffffffffffffffffffffffffffffffffffffffff167f30385c845b448a36257a6a1716e6ad2e1bc2cbe333cde1e69fe849ad6511adfe60405160405180910390a3505061145161209c565b50565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036114c4575f6040517f64a0ae920000000000000000000000000000000000000000000000000000000081526004016114bb9190613005565b60405180910390fd5b5f6114d783836114d2612017565b6120a6565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161461154d578382826040517f64283d7b00000000000000000000000000000000000000000000000000000000815260040161154493929190613bdf565b60405180910390fd5b50505050565b600b5f9054906101000a900460ff1681565b61156d6122b1565b611575612030565b61157d611871565b73ffffffffffffffffffffffffffffffffffffffff166108fc4790811502906040515f60405180830381858888f193505050501580156115bf573d5f803e3d5ffd5b506115c861209c565b565b6115e483838360405180602001604052805f815250611bdd565b505050565b600e81815481106115f8575f80fd5b905f5260205f20015f915090505481565b6060600e80548060200260200160405190810160405280929190818152602001828054801561165557602002820191905f5260205f20905b815481526020019060010190808311611641575b5050505050905090565b6116676122b1565b80600b5f6101000a81548160ff02191690831515021790555050565b61168b6122b1565b80600c908161169a9190613db1565b5050565b600f602052805f5260405f205f915054906101000a900460ff1681565b60105f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b5f6116ea82611f58565b9050919050565b60085481565b600c8054611704906135df565b80601f0160208091040260200160405190810160405280929190818152602001828054611730906135df565b801561177b5780601f106117525761010080835404028352916020019161177b565b820191905f5260205f20905b81548152906001019060200180831161175e57829003601f168201915b505050505081565b61178b6122b1565b80600a8190555050565b5f8073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611806575f6040517f89c62b640000000000000000000000000000000000000000000000000000000081526004016117fd9190613005565b60405180910390fd5b60035f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050919050565b6118536122b1565b61185c5f612338565b565b600b60019054906101000a900460ff1681565b5f60065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600180546118a8906135df565b80601f01602080910402602001604051908101604052809291908181526020018280546118d4906135df565b801561191f5780601f106118f65761010080835404028352916020019161191f565b820191905f5260205f20905b81548152906001019060200180831161190257829003601f168201915b5050505050905090565b611931612030565b600b5f9054906101000a900460ff1661197f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161197690613eca565b60405180910390fd5b6008548161198d9190613ee8565b34146119ce576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119c590613f73565b60405180910390fd5b60fa600a546119dd91906136a4565b816009546119eb9190613f91565b1115611a2c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a2390613721565b60405180910390fd5b601481600d5f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054611a779190613f91565b1115611ab8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611aaf9061400e565b60405180910390fd5b5f5b81811015611b9357600d5f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f815480929190611b0f90613a14565b919050555060095f815480929190611b2690613a14565b91905055505f6009549050611b3b338261207f565b803373ffffffffffffffffffffffffffffffffffffffff167f30385c845b448a36257a6a1716e6ad2e1bc2cbe333cde1e69fe849ad6511adfe60405160405180910390a3508080611b8b90613a14565b915050611aba565b50611b9c61209c565b50565b611bb1611baa612017565b83836123fb565b5050565b600d602052805f5260405f205f915090505481565b600b60029054906101000a900460ff1681565b611be8848484611454565b611bf484848484612564565b50505050565b6060611c0582612716565b611c44576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c3b90614076565b60405180910390fd5b600c611c4f83612756565b604051602001611c60929190614198565b6040516020818303038152906040529050919050565b600a5481565b611c846122b1565b80600b60026101000a81548160ff02191690831515021790555050565b5f60055f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16905092915050565b611d376122b1565b80600b60016101000a81548160ff02191690831515021790555050565b611d5c6122b1565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611dcc575f6040517f1e4fbdf7000000000000000000000000000000000000000000000000000000008152600401611dc39190613005565b60405180910390fd5b611dd581612338565b50565b611de06122b1565b8060088190555050565b611df26122b1565b611dfa612030565b600a5481600954611e0b9190613f91565b1115611e4c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e4390614210565b60405180910390fd5b5f5b81811015611ee35760095f815480929190611e6890613a14565b91905055505f6009549050611e84611e7e611871565b8261207f565b80611e8d611871565b73ffffffffffffffffffffffffffffffffffffffff167f30385c845b448a36257a6a1716e6ad2e1bc2cbe333cde1e69fe849ad6511adfe60405160405180910390a3508080611edb90613a14565b915050611e4e565b50611eec61209c565b50565b5f7f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b5f80611f6383612820565b90505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611fd557826040517f7e273289000000000000000000000000000000000000000000000000000000008152600401611fcc91906130e5565b60405180910390fd5b80915050919050565b5f60045f8381526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b5f33905090565b61202b8383836001612859565b505050565b600260075403612075576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161206c90614278565b60405180910390fd5b6002600781905550565b612098828260405180602001604052805f815250612a18565b5050565b6001600781905550565b5f806120b184612820565b90505f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146120f2576120f1818486612a33565b5b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161461217d576121315f855f80612859565b600160035f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825403925050819055505b5f73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16146121fc57600160035f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055505b8460025f8681526020019081526020015f205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550838573ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4809150509392505050565b6122b9612017565b73ffffffffffffffffffffffffffffffffffffffff166122d7611871565b73ffffffffffffffffffffffffffffffffffffffff1614612336576122fa612017565b6040517f118cdaa700000000000000000000000000000000000000000000000000000000815260040161232d9190613005565b60405180910390fd5b565b5f60065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508160065f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361246b57816040517f5b08ba180000000000000000000000000000000000000000000000000000000081526004016124629190613005565b60405180910390fd5b8060055f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516125579190612ea5565b60405180910390a3505050565b5f8373ffffffffffffffffffffffffffffffffffffffff163b1115612710578273ffffffffffffffffffffffffffffffffffffffff1663150b7a026125a7612017565b8685856040518563ffffffff1660e01b81526004016125c994939291906142e8565b6020604051808303815f875af192505050801561260457506040513d601f19601f820116820180604052508101906126019190614346565b60015b612685573d805f8114612632576040519150601f19603f3d011682016040523d82523d5f602084013e612637565b606091505b505f81510361267d57836040517f64a0ae920000000000000000000000000000000000000000000000000000000081526004016126749190613005565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161461270e57836040517f64a0ae920000000000000000000000000000000000000000000000000000000081526004016127059190613005565b60405180910390fd5b505b50505050565b5f8073ffffffffffffffffffffffffffffffffffffffff16612737836116e0565b73ffffffffffffffffffffffffffffffffffffffff1614159050919050565b60605f600161276484612af6565b0190505f8167ffffffffffffffff81111561278257612781613282565b5b6040519080825280601f01601f1916602001820160405280156127b45781602001600182028036833780820191505090505b5090505f82602001820190505b600115612815578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a858161280a57612809614371565b5b0494505f85036127c1575b819350505050919050565b5f60025f8381526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b808061289157505f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b156129c3575f6128a084611f58565b90505f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415801561290a57508273ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614155b801561291d575061291b8184611ca1565b155b1561295f57826040517fa9fbf51f0000000000000000000000000000000000000000000000000000000081526004016129569190613005565b60405180910390fd5b81156129c157838573ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45b505b8360045f8581526020019081526020015f205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050505050565b612a228383612c47565b612a2e5f848484612564565b505050565b612a3e838383612d3a565b612af1575f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612ab257806040517f7e273289000000000000000000000000000000000000000000000000000000008152600401612aa991906130e5565b60405180910390fd5b81816040517f177e802f000000000000000000000000000000000000000000000000000000008152600401612ae892919061439e565b60405180910390fd5b505050565b5f805f90507a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008310612b52577a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008381612b4857612b47614371565b5b0492506040810190505b6d04ee2d6d415b85acef81000000008310612b8f576d04ee2d6d415b85acef81000000008381612b8557612b84614371565b5b0492506020810190505b662386f26fc100008310612bbe57662386f26fc100008381612bb457612bb3614371565b5b0492506010810190505b6305f5e1008310612be7576305f5e1008381612bdd57612bdc614371565b5b0492506008810190505b6127108310612c0c576127108381612c0257612c01614371565b5b0492506004810190505b60648310612c2f5760648381612c2557612c24614371565b5b0492506002810190505b600a8310612c3e576001810190505b80915050919050565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612cb7575f6040517f64a0ae92000000000000000000000000000000000000000000000000000000008152600401612cae9190613005565b60405180910390fd5b5f612cc383835f6120a6565b90505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614612d35575f6040517f73c6ac6e000000000000000000000000000000000000000000000000000000008152600401612d2c9190613005565b60405180910390fd5b505050565b5f8073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614158015612df157508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480612db25750612db18484611ca1565b5b80612df057508273ffffffffffffffffffffffffffffffffffffffff16612dd883611fde565b73ffffffffffffffffffffffffffffffffffffffff16145b5b90509392505050565b5f604051905090565b5f80fd5b5f80fd5b5f7fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b612e3f81612e0b565b8114612e49575f80fd5b50565b5f81359050612e5a81612e36565b92915050565b5f60208284031215612e7557612e74612e03565b5b5f612e8284828501612e4c565b91505092915050565b5f8115159050919050565b612e9f81612e8b565b82525050565b5f602082019050612eb85f830184612e96565b92915050565b5f81519050919050565b5f82825260208201905092915050565b5f5b83811015612ef5578082015181840152602081019050612eda565b5f8484015250505050565b5f601f19601f8301169050919050565b5f612f1a82612ebe565b612f248185612ec8565b9350612f34818560208601612ed8565b612f3d81612f00565b840191505092915050565b5f6020820190508181035f830152612f608184612f10565b905092915050565b5f819050919050565b612f7a81612f68565b8114612f84575f80fd5b50565b5f81359050612f9581612f71565b92915050565b5f60208284031215612fb057612faf612e03565b5b5f612fbd84828501612f87565b91505092915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f612fef82612fc6565b9050919050565b612fff81612fe5565b82525050565b5f6020820190506130185f830184612ff6565b92915050565b61302781612fe5565b8114613031575f80fd5b50565b5f813590506130428161301e565b92915050565b5f806040838503121561305e5761305d612e03565b5b5f61306b85828601613034565b925050602061307c85828601612f87565b9150509250929050565b5f805f6060848603121561309d5761309c612e03565b5b5f6130aa86828701612f87565b93505060206130bb86828701612f87565b92505060406130cc86828701612f87565b9150509250925092565b6130df81612f68565b82525050565b5f6020820190506130f85f8301846130d6565b92915050565b5f805f6060848603121561311557613114612e03565b5b5f61312286828701613034565b935050602061313386828701613034565b925050604061314486828701612f87565b9150509250925092565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b61318081612f68565b82525050565b5f6131918383613177565b60208301905092915050565b5f602082019050919050565b5f6131b38261314e565b6131bd8185613158565b93506131c883613168565b805f5b838110156131f85781516131df8882613186565b97506131ea8361319d565b9250506001810190506131cb565b5085935050505092915050565b5f6020820190508181035f83015261321d81846131a9565b905092915050565b61322e81612e8b565b8114613238575f80fd5b50565b5f8135905061324981613225565b92915050565b5f6020828403121561326457613263612e03565b5b5f6132718482850161323b565b91505092915050565b5f80fd5b5f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b6132b882612f00565b810181811067ffffffffffffffff821117156132d7576132d6613282565b5b80604052505050565b5f6132e9612dfa565b90506132f582826132af565b919050565b5f67ffffffffffffffff82111561331457613313613282565b5b61331d82612f00565b9050602081019050919050565b828183375f83830152505050565b5f61334a613345846132fa565b6132e0565b9050828152602081018484840111156133665761336561327e565b5b61337184828561332a565b509392505050565b5f82601f83011261338d5761338c61327a565b5b813561339d848260208601613338565b91505092915050565b5f602082840312156133bb576133ba612e03565b5b5f82013567ffffffffffffffff8111156133d8576133d7612e07565b5b6133e484828501613379565b91505092915050565b5f6020828403121561340257613401612e03565b5b5f61340f84828501613034565b91505092915050565b5f806040838503121561342e5761342d612e03565b5b5f61343b85828601613034565b925050602061344c8582860161323b565b9150509250929050565b5f67ffffffffffffffff8211156134705761346f613282565b5b61347982612f00565b9050602081019050919050565b5f61349861349384613456565b6132e0565b9050828152602081018484840111156134b4576134b361327e565b5b6134bf84828561332a565b509392505050565b5f82601f8301126134db576134da61327a565b5b81356134eb848260208601613486565b91505092915050565b5f805f806080858703121561350c5761350b612e03565b5b5f61351987828801613034565b945050602061352a87828801613034565b935050604061353b87828801612f87565b925050606085013567ffffffffffffffff81111561355c5761355b612e07565b5b613568878288016134c7565b91505092959194509250565b5f806040838503121561358a57613589612e03565b5b5f61359785828601613034565b92505060206135a885828601613034565b9150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f60028204905060018216806135f657607f821691505b602082108103613609576136086135b2565b5b50919050565b7f6275726e20746f206d696e74206e6f7420656e61626c656400000000000000005f82015250565b5f613643601883612ec8565b915061364e8261360f565b602082019050919050565b5f6020820190508181035f83015261367081613637565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f6136ae82612f68565b91506136b983612f68565b92508282039050818111156136d1576136d0613677565b5b92915050565b7f736f6c64206f75740000000000000000000000000000000000000000000000005f82015250565b5f61370b600883612ec8565b9150613716826136d7565b602082019050919050565b5f6020820190508181035f830152613738816136ff565b9050919050565b5f8151905061374d8161301e565b92915050565b5f6020828403121561376857613767612e03565b5b5f6137758482850161373f565b91505092915050565b7f4e6f74206f776e6572206f6620746f6b656e49643100000000000000000000005f82015250565b5f6137b2601583612ec8565b91506137bd8261377e565b602082019050919050565b5f6020820190508181035f8301526137df816137a6565b9050919050565b7f4e6f74206f776e6572206f6620746f6b656e49643200000000000000000000005f82015250565b5f61381a601583612ec8565b9150613825826137e6565b602082019050919050565b5f6020820190508181035f8301526138478161380e565b9050919050565b7f4e6f74206f776e6572206f6620746f6b656e49643300000000000000000000005f82015250565b5f613882601583612ec8565b915061388d8261384e565b602082019050919050565b5f6020820190508181035f8301526138af81613876565b9050919050565b5f6040820190506138c95f830185612ff6565b6138d66020830184612ff6565b9392505050565b5f815190506138eb81613225565b92915050565b5f6020828403121561390657613905612e03565b5b5f613913848285016138dd565b91505092915050565b7f417070726f76616c20726571756972656420666f72204675644170657320746f5f8201527f206d616e616765204772616e647061204170657320746f6b656e730000000000602082015250565b5f613976603b83612ec8565b91506139818261391c565b604082019050919050565b5f6020820190508181035f8301526139a38161396a565b9050919050565b5f6060820190506139bd5f830186612ff6565b6139ca6020830185612ff6565b6139d760408301846130d6565b949350505050565b5f6060820190506139f25f8301866130d6565b6139ff60208301856130d6565b613a0c60408301846130d6565b949350505050565b5f613a1e82612f68565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203613a5057613a4f613677565b5b600182019050919050565b7f5865735061737320636c61696d206e6f7420656e61626c6564000000000000005f82015250565b5f613a8f601983612ec8565b9150613a9a82613a5b565b602082019050919050565b5f6020820190508181035f830152613abc81613a83565b9050919050565b7f4e6f74206f776e6572206f66207468652070726f7669646564205865735061735f8201527f7320746f6b656e00000000000000000000000000000000000000000000000000602082015250565b5f613b1d602783612ec8565b9150613b2882613ac3565b604082019050919050565b5f6020820190508181035f830152613b4a81613b11565b9050919050565b7f5865735061737320746f6b656e20616c7265616479207573656420746f20636c5f8201527f61696d0000000000000000000000000000000000000000000000000000000000602082015250565b5f613bab602383612ec8565b9150613bb682613b51565b604082019050919050565b5f6020820190508181035f830152613bd881613b9f565b9050919050565b5f606082019050613bf25f830186612ff6565b613bff60208301856130d6565b613c0c6040830184612ff6565b949350505050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f60088302613c707fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82613c35565b613c7a8683613c35565b95508019841693508086168417925050509392505050565b5f819050919050565b5f613cb5613cb0613cab84612f68565b613c92565b612f68565b9050919050565b5f819050919050565b613cce83613c9b565b613ce2613cda82613cbc565b848454613c41565b825550505050565b5f90565b613cf6613cea565b613d01818484613cc5565b505050565b5b81811015613d2457613d195f82613cee565b600181019050613d07565b5050565b601f821115613d6957613d3a81613c14565b613d4384613c26565b81016020851015613d52578190505b613d66613d5e85613c26565b830182613d06565b50505b505050565b5f82821c905092915050565b5f613d895f1984600802613d6e565b1980831691505092915050565b5f613da18383613d7a565b9150826002028217905092915050565b613dba82612ebe565b67ffffffffffffffff811115613dd357613dd2613282565b5b613ddd82546135df565b613de8828285613d28565b5f60209050601f831160018114613e19575f8415613e07578287015190505b613e118582613d96565b865550613e78565b601f198416613e2786613c14565b5f5b82811015613e4e57848901518255600182019150602085019450602081019050613e29565b86831015613e6b5784890151613e67601f891682613d7a565b8355505b6001600288020188555050505b505050505050565b7f6d696e74696e67206e6f7420656e61626c6564000000000000000000000000005f82015250565b5f613eb4601383612ec8565b9150613ebf82613e80565b602082019050919050565b5f6020820190508181035f830152613ee181613ea8565b9050919050565b5f613ef282612f68565b9150613efd83612f68565b9250828202613f0b81612f68565b91508282048414831517613f2257613f21613677565b5b5092915050565b7f77726f6e672076616c75650000000000000000000000000000000000000000005f82015250565b5f613f5d600b83612ec8565b9150613f6882613f29565b602082019050919050565b5f6020820190508181035f830152613f8a81613f51565b9050919050565b5f613f9b82612f68565b9150613fa683612f68565b9250828201905080821115613fbe57613fbd613677565b5b92915050565b7f65786365656473206d6178207065722077616c6c6574000000000000000000005f82015250565b5f613ff8601683612ec8565b915061400382613fc4565b602082019050919050565b5f6020820190508181035f83015261402581613fec565b9050919050565b7f546f6b656e20646f6573206e6f742065786973742100000000000000000000005f82015250565b5f614060601583612ec8565b915061406b8261402c565b602082019050919050565b5f6020820190508181035f83015261408d81614054565b9050919050565b5f81905092915050565b5f81546140aa816135df565b6140b48186614094565b9450600182165f81146140ce57600181146140e357614115565b60ff1983168652811515820286019350614115565b6140ec85613c14565b5f5b8381101561410d578154818901526001820191506020810190506140ee565b838801955050505b50505092915050565b5f61412882612ebe565b6141328185614094565b9350614142818560208601612ed8565b80840191505092915050565b7f2e6a736f6e0000000000000000000000000000000000000000000000000000005f82015250565b5f614182600583614094565b915061418d8261414e565b600582019050919050565b5f6141a3828561409e565b91506141af828461411e565b91506141ba82614176565b91508190509392505050565b7f45786365656473206d617820737570706c7900000000000000000000000000005f82015250565b5f6141fa601283612ec8565b9150614205826141c6565b602082019050919050565b5f6020820190508181035f830152614227816141ee565b9050919050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c005f82015250565b5f614262601f83612ec8565b915061426d8261422e565b602082019050919050565b5f6020820190508181035f83015261428f81614256565b9050919050565b5f81519050919050565b5f82825260208201905092915050565b5f6142ba82614296565b6142c481856142a0565b93506142d4818560208601612ed8565b6142dd81612f00565b840191505092915050565b5f6080820190506142fb5f830187612ff6565b6143086020830186612ff6565b61431560408301856130d6565b818103606083015261432781846142b0565b905095945050505050565b5f8151905061434081612e36565b92915050565b5f6020828403121561435b5761435a612e03565b5b5f61436884828501614332565b91505092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f6040820190506143b15f830185612ff6565b6143be60208301846130d6565b939250505056fea26469706673582212207eb4dadaa3d05029e243c8651e714d4e5b25ee4a93bc53442da990d815760e3164736f6c63430008140033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000f6e92ec9525e6292e6ee00673c45bb5e9f5cc29f
-----Decoded View---------------
Arg [0] : initialOwner (address): 0xf6E92ec9525e6292E6ee00673C45BB5e9F5CC29f
-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 000000000000000000000000f6e92ec9525e6292e6ee00673c45bb5e9f5cc29f
Deployed Bytecode Sourcemap
61191:6167:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40919:305;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41750:91;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42922:158;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42741:115;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;61724:74;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;64227:1467;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;61282:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;65702:1040;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43591:588;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;61346:25;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;67238:115;;;;;;;;;;;;;:::i;:::-;;44250:134;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;61539:31;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;67127:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;62334:118;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;62988:100;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;61577:53;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;61639:78;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41563:120;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;61251:24;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;61456:21;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;62768:102;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;41288:213;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30047:103;;;;;;;;;;;;;:::i;:::-;;61378:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29372:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41910:95;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;63096:691;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43152:146;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;61484:48;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;61416:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44455:211;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;66879:237;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;61315:24;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;62610:150;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43369:155;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;62460:142;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;30305:220;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;62878:102;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;63795:424;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40919:305;41021:4;41073:25;41058:40;;;:11;:40;;;;:105;;;;41130:33;41115:48;;;:11;:48;;;;41058:105;:158;;;;41180:36;41204:11;41180:23;:36::i;:::-;41058:158;41038:178;;40919:305;;;:::o;41750:91::-;41795:13;41828:5;41821:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41750:91;:::o;42922:158::-;42989:7;43009:22;43023:7;43009:13;:22::i;:::-;;43051:21;43064:7;43051:12;:21::i;:::-;43044:28;;42922:158;;;:::o;42741:115::-;42813:35;42822:2;42826:7;42835:12;:10;:12::i;:::-;42813:8;:35::i;:::-;42741:115;;:::o;61724:74::-;;;;;;;;;;;;;:::o;64227:1467::-;59845:21;:19;:21::i;:::-;64348:24:::1;64388:18;;;;;;;;;;;64348:59;;64428:19;;;;;;;;;;;64420:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;64521:3;64509:9;;:15;;;;:::i;:::-;64495:11;;:29;64487:50;;;;;;;;;;;;:::i;:::-;;;;;;;;;64639:10;64606:43;;:11;:19;;;64626:8;64606:29;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:43;;;64598:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;64727:10;64694:43;;:11;:19;;;64714:8;64694:29;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:43;;;64686:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;64815:10;64782:43;;:11;:19;;;64802:8;64782:29;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:43;;;64774:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;64987:11;:28;;;65016:10;65036:4;64987:55;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;64979:127;;;;;;;;;;;;:::i;:::-;;;;;;;;;65184:11;:28;;;65213:10;61837:42;65239:8;65184:64;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;65259:11;:28;;;65288:10;61837:42;65314:8;65259:64;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;65334:11;:28;;;65363:10;61837:42;65389:8;65334:64;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;65434:10;65416:59;;;65446:8;65456;65466;65416:59;;;;;;;;:::i;:::-;;;;;;;;65540:11;;:13;;;;;;;;;:::i;:::-;;;;;;65564:18;65585:11;;65564:32;;65607:33;65617:10;65629;65607:9;:33::i;:::-;65675:10;65663;65656:30;;;;;;;;;;;;64337:1357;;59889:20:::0;:18;:20::i;:::-;64227:1467;;;:::o;61282:26::-;;;;:::o;65702:1040::-;59845:21;:19;:21::i;:::-;65785:16:::1;65813:14;;;;;;;;;;;65785:43;;65849:21;;;;;;;;;;;65841:59;;;;;;;;;;;;:::i;:::-;;;;;;;;;65945:3;65933:9;;:15;;;;:::i;:::-;65919:11;;:29;65911:50;;;;;;;;;;;;:::i;:::-;;;;;;;;;66077:10;66042:45;;:7;:15;;;66058:14;66042:31;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:45;;;66034:97;;;;;;;;;;;;:::i;:::-;;;;;;;;;66259:21;:37;66281:14;66259:37;;;;;;;;;;;;;;;;;;;;;66258:38;66250:86;;;;;;;;;;;;:::i;:::-;;;;;;;;;66437:4;66397:21;:37;66419:14;66397:37;;;;;;;;;;;;:44;;;;;;;;;;;;;;;;;;66452:14;66472;66452:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;66520:10;66505:42;;;66532:14;66505:42;;;;;;:::i;:::-;;;;;;;;66588:11;;:13;;;;;;;;;:::i;:::-;;;;;;66612:18;66633:11;;66612:32;;66655:33;66665:10;66677;66655:9;:33::i;:::-;66723:10;66711;66704:30;;;;;;;;;;;;65774:968;;59889:20:::0;:18;:20::i;:::-;65702:1040;:::o;43591:588::-;43700:1;43686:16;;:2;:16;;;43682:89;;43756:1;43726:33;;;;;;;;;;;:::i;:::-;;;;;;;;43682:89;43992:21;44016:34;44024:2;44028:7;44037:12;:10;:12::i;:::-;44016:7;:34::i;:::-;43992:58;;44082:4;44065:21;;:13;:21;;;44061:111;;44131:4;44137:7;44146:13;44110:50;;;;;;;;;;;;;:::i;:::-;;;;;;;;44061:111;43671:508;43591:588;;;:::o;61346:25::-;;;;;;;;;;;;;:::o;67238:115::-;29258:13;:11;:13::i;:::-;59845:21:::1;:19;:21::i;:::-;67305:7:::2;:5;:7::i;:::-;67297:25;;:48;67323:21;67297:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;59889:20:::1;:18;:20::i;:::-;67238:115::o:0;44250:134::-;44337:39;44354:4;44360:2;44364:7;44337:39;;;;;;;;;;;;:16;:39::i;:::-;44250:134;;;:::o;61539:31::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;67127:104::-;67177:16;67209:14;67202:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;67127:104;:::o;62334:118::-;29258:13;:11;:13::i;:::-;62430:14:::1;62414:13;;:30;;;;;;;;;;;;;;;;;;62334:118:::0;:::o;62988:100::-;29258:13;:11;:13::i;:::-;63072:8:::1;63062:7;:18;;;;;;:::i;:::-;;62988:100:::0;:::o;61577:53::-;;;;;;;;;;;;;;;;;;;;;;:::o;61639:78::-;;;;;;;;;;;;;:::o;41563:120::-;41626:7;41653:22;41667:7;41653:13;:22::i;:::-;41646:29;;41563:120;;;:::o;61251:24::-;;;;:::o;61456:21::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;62768:102::-;29258:13;:11;:13::i;:::-;62852:10:::1;62840:9;:22;;;;62768:102:::0;:::o;41288:213::-;41351:7;41392:1;41375:19;;:5;:19;;;41371:89;;41445:1;41418:30;;;;;;;;;;;:::i;:::-;;;;;;;;41371:89;41477:9;:16;41487:5;41477:16;;;;;;;;;;;;;;;;41470:23;;41288:213;;;:::o;30047:103::-;29258:13;:11;:13::i;:::-;30112:30:::1;30139:1;30112:18;:30::i;:::-;30047:103::o:0;61378:31::-;;;;;;;;;;;;;:::o;29372:87::-;29418:7;29445:6;;;;;;;;;;;29438:13;;29372:87;:::o;41910:95::-;41957:13;41990:7;41983:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41910:95;:::o;63096:691::-;59845:21;:19;:21::i;:::-;63178:13:::1;;;;;;;;;;;63170:45;;;;;;;;;;;;:::i;:::-;;;;;;;;;63259:9;;63247;:21;;;;:::i;:::-;63234:9;:34;63226:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;63342:3;63330:9;;:15;;;;:::i;:::-;63317:9;63303:11;;:23;;;;:::i;:::-;:42;;63295:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;63418:2;63405:9;63377:13;:25;63391:10;63377:25;;;;;;;;;;;;;;;;:37;;;;:::i;:::-;:43;;63369:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;63473:9;63468:312;63492:9;63488:1;:13;63468:312;;;63523:13;:25;63537:10;63523:25;;;;;;;;;;;;;;;;:27;;;;;;;;;:::i;:::-;;;;;;63565:11;;:13;;;;;;;;;:::i;:::-;;;;;;63593:18;63614:11;;63593:32;;63640:33;63650:10;63662;63640:9;:33::i;:::-;63757:10;63745;63738:30;;;;;;;;;;;;63508:272;63503:3;;;;;:::i;:::-;;;;63468:312;;;;59889:20:::0;:18;:20::i;:::-;63096:691;:::o;43152:146::-;43238:52;43257:12;:10;:12::i;:::-;43271:8;43281;43238:18;:52::i;:::-;43152:146;;:::o;61484:48::-;;;;;;;;;;;;;;;;;:::o;61416:33::-;;;;;;;;;;;;;:::o;44455:211::-;44569:31;44582:4;44588:2;44592:7;44569:12;:31::i;:::-;44611:47;44634:4;44640:2;44644:7;44653:4;44611:22;:47::i;:::-;44455:211;;;;:::o;66879:237::-;66945:13;66975:23;66989:8;66975:13;:23::i;:::-;66967:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;67062:7;67071:26;67088:8;67071:16;:26::i;:::-;67045:62;;;;;;;;;:::i;:::-;;;;;;;;;;;;;67031:77;;66879:237;;;:::o;61315:24::-;;;;:::o;62610:150::-;29258:13;:11;:13::i;:::-;62730:22:::1;62706:21;;:46;;;;;;;;;;;;;;;;;;62610:150:::0;:::o;43369:155::-;43457:4;43481:18;:25;43500:5;43481:25;;;;;;;;;;;;;;;:35;43507:8;43481:35;;;;;;;;;;;;;;;;;;;;;;;;;43474:42;;43369:155;;;;:::o;62460:142::-;29258:13;:11;:13::i;:::-;62574:20:::1;62552:19;;:42;;;;;;;;;;;;;;;;;;62460:142:::0;:::o;30305:220::-;29258:13;:11;:13::i;:::-;30410:1:::1;30390:22;;:8;:22;;::::0;30386:93:::1;;30464:1;30436:31;;;;;;;;;;;:::i;:::-;;;;;;;;30386:93;30489:28;30508:8;30489:18;:28::i;:::-;30305:220:::0;:::o;62878:102::-;29258:13;:11;:13::i;:::-;62962:10:::1;62950:9;:22;;;;62878:102:::0;:::o;63795:424::-;29258:13;:11;:13::i;:::-;59845:21:::1;:19;:21::i;:::-;63914:9:::2;;63901;63887:11;;:23;;;;:::i;:::-;:36;;63879:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;63964:9;63959:253;63983:9;63979:1;:13;63959:253;;;64014:11;;:13;;;;;;;;;:::i;:::-;;;;;;64042:18;64063:11;;64042:32;;64089:30;64099:7;:5;:7::i;:::-;64108:10;64089:9;:30::i;:::-;64189:10;64180:7;:5;:7::i;:::-;64173:27;;;;;;;;;;;;63999:213;63994:3;;;;;:::i;:::-;;;;63959:253;;;;59889:20:::1;:18;:20::i;:::-;63795:424:::0;:::o;33660:148::-;33736:4;33775:25;33760:40;;;:11;:40;;;;33753:47;;33660:148;;;:::o;55897:247::-;55960:7;55980:13;55996:17;56005:7;55996:8;:17::i;:::-;55980:33;;56045:1;56028:19;;:5;:19;;;56024:90;;56094:7;56071:31;;;;;;;;;;;:::i;:::-;;;;;;;;56024:90;56131:5;56124:12;;;55897:247;;;:::o;45428:129::-;45498:7;45525:15;:24;45541:7;45525:24;;;;;;;;;;;;;;;;;;;;;45518:31;;45428:129;;;:::o;27488:98::-;27541:7;27568:10;27561:17;;27488:98;:::o;54129:122::-;54210:33;54219:2;54223:7;54232:4;54238;54210:8;:33::i;:::-;54129:122;;;:::o;59925:293::-;59327:1;60059:7;;:19;60051:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;59327:1;60192:7;:18;;;;59925:293::o;50248:102::-;50316:26;50326:2;50330:7;50316:26;;;;;;;;;;;;:9;:26::i;:::-;50248:102;;:::o;60226:213::-;59283:1;60409:7;:22;;;;60226:213::o;48390:824::-;48476:7;48496:12;48511:17;48520:7;48511:8;:17::i;:::-;48496:32;;48607:1;48591:18;;:4;:18;;;48587:88;;48626:37;48643:4;48649;48655:7;48626:16;:37::i;:::-;48587:88;48738:1;48722:18;;:4;:18;;;48718:263;;48840:48;48857:1;48861:7;48878:1;48882:5;48840:8;:48::i;:::-;48953:1;48934:9;:15;48944:4;48934:15;;;;;;;;;;;;;;;;:20;;;;;;;;;;;48718:263;49011:1;48997:16;;:2;:16;;;48993:111;;49076:1;49059:9;:13;49069:2;49059:13;;;;;;;;;;;;;;;;:18;;;;;;;;;;;48993:111;49135:2;49116:7;:16;49124:7;49116:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;49174:7;49170:2;49155:27;;49164:4;49155:27;;;;;;;;;;;;49202:4;49195:11;;;48390:824;;;;;:::o;29537:166::-;29608:12;:10;:12::i;:::-;29597:23;;:7;:5;:7::i;:::-;:23;;;29593:103;;29671:12;:10;:12::i;:::-;29644:40;;;;;;;;;;;:::i;:::-;;;;;;;;29593:103;29537:166::o;30685:191::-;30759:16;30778:6;;;;;;;;;;;30759:25;;30804:8;30795:6;;:17;;;;;;;;;;;;;;;;;;30859:8;30828:40;;30849:8;30828:40;;;;;;;;;;;;30748:128;30685:191;:::o;55336:318::-;55464:1;55444:22;;:8;:22;;;55440:93;;55512:8;55490:31;;;;;;;;;;;:::i;:::-;;;;;;;;55440:93;55581:8;55543:18;:25;55562:5;55543:25;;;;;;;;;;;;;;;:35;55569:8;55543:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;55627:8;55605:41;;55620:5;55605:41;;;55637:8;55605:41;;;;;;:::i;:::-;;;;;;;;55336:318;;;:::o;56694:799::-;56828:1;56811:2;:14;;;:18;56807:679;;;56866:2;56850:36;;;56887:12;:10;:12::i;:::-;56901:4;56907:7;56916:4;56850:71;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;56846:629;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57181:1;57164:6;:13;:18;57160:300;;57236:2;57214:25;;;;;;;;;;;:::i;:::-;;;;;;;;57160:300;57410:6;57404:13;57395:6;57391:2;57387:15;57380:38;56846:629;56979:41;;;56969:51;;;:6;:51;;;;56965:132;;57074:2;57052:25;;;;;;;;;;;:::i;:::-;;;;;;;;56965:132;56922:190;56807:679;56694:799;;;;:::o;66750:121::-;66813:4;66861:1;66833:30;;:16;66841:7;66833;:16::i;:::-;:30;;;;66826:37;;66750:121;;;:::o;24258:718::-;24314:13;24365:14;24402:1;24382:17;24393:5;24382:10;:17::i;:::-;:21;24365:38;;24418:20;24452:6;24441:18;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24418:41;;24474:11;24603:6;24599:2;24595:15;24587:6;24583:28;24576:35;;24640:290;24647:4;24640:290;;;24672:5;;;;;;;;24814:10;24809:2;24802:5;24798:14;24793:32;24788:3;24780:46;24872:2;24863:11;;;;;;:::i;:::-;;;;;24906:1;24897:5;:10;24640:290;24893:21;24640:290;24951:6;24944:13;;;;;24258:718;;;:::o;45190:117::-;45256:7;45283;:16;45291:7;45283:16;;;;;;;;;;;;;;;;;;;;;45276:23;;45190:117;;;:::o;54439:678::-;54601:9;:31;;;;54630:1;54614:18;;:4;:18;;;;54601:31;54597:471;;;54649:13;54665:22;54679:7;54665:13;:22::i;:::-;54649:38;;54834:1;54818:18;;:4;:18;;;;:35;;;;;54849:4;54840:13;;:5;:13;;;;54818:35;:69;;;;;54858:29;54875:5;54882:4;54858:16;:29::i;:::-;54857:30;54818:69;54814:144;;;54937:4;54915:27;;;;;;;;;;;:::i;:::-;;;;;;;;54814:144;54978:9;54974:83;;;55033:7;55029:2;55013:28;;55022:5;55013:28;;;;;;;;;;;;54974:83;54634:434;54597:471;55107:2;55080:15;:24;55096:7;55080:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;54439:678;;;;:::o;50577:185::-;50672:18;50678:2;50682:7;50672:5;:18::i;:::-;50701:53;50732:1;50736:2;50740:7;50749:4;50701:22;:53::i;:::-;50577:185;;;:::o;46597:376::-;46710:38;46724:5;46731:7;46740;46710:13;:38::i;:::-;46705:261;;46786:1;46769:19;;:5;:19;;;46765:190;;46839:7;46816:31;;;;;;;;;;;:::i;:::-;;;;;;;;46765:190;46922:7;46931;46895:44;;;;;;;;;;;;:::i;:::-;;;;;;;;46705:261;46597:376;;;:::o;20662:948::-;20715:7;20735:14;20752:1;20735:18;;20802:8;20793:5;:17;20789:106;;20840:8;20831:17;;;;;;:::i;:::-;;;;;20877:2;20867:12;;;;20789:106;20922:8;20913:5;:17;20909:106;;20960:8;20951:17;;;;;;:::i;:::-;;;;;20997:2;20987:12;;;;20909:106;21042:8;21033:5;:17;21029:106;;21080:8;21071:17;;;;;;:::i;:::-;;;;;21117:2;21107:12;;;;21029:106;21162:7;21153:5;:16;21149:103;;21199:7;21190:16;;;;;;:::i;:::-;;;;;21235:1;21225:11;;;;21149:103;21279:7;21270:5;:16;21266:103;;21316:7;21307:16;;;;;;:::i;:::-;;;;;21352:1;21342:11;;;;21266:103;21396:7;21387:5;:16;21383:103;;21433:7;21424:16;;;;;;:::i;:::-;;;;;21469:1;21459:11;;;;21383:103;21513:7;21504:5;:16;21500:68;;21551:1;21541:11;;;;21500:68;21596:6;21589:13;;;20662:948;;;:::o;49550:335::-;49632:1;49618:16;;:2;:16;;;49614:89;;49688:1;49658:33;;;;;;;;;;;:::i;:::-;;;;;;;;49614:89;49713:21;49737:32;49745:2;49749:7;49766:1;49737:7;:32::i;:::-;49713:56;;49809:1;49784:27;;:13;:27;;;49780:98;;49863:1;49835:31;;;;;;;;;;;:::i;:::-;;;;;;;;49780:98;49603:282;49550:335;;:::o;45877:276::-;45980:4;46036:1;46017:21;;:7;:21;;;;:128;;;;;46065:7;46056:16;;:5;:16;;;:52;;;;46076:32;46093:5;46100:7;46076:16;:32::i;:::-;46056:52;:88;;;;46137:7;46112:32;;:21;46125:7;46112:12;:21::i;:::-;:32;;;46056:88;46017:128;45997:148;;45877:276;;;;;:::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:619::-;4967:6;4975;4983;5032:2;5020:9;5011:7;5007:23;5003:32;5000:119;;;5038:79;;:::i;:::-;5000:119;5158:1;5183:53;5228:7;5219:6;5208:9;5204:22;5183:53;:::i;:::-;5173:63;;5129:117;5285:2;5311:53;5356:7;5347:6;5336:9;5332:22;5311:53;:::i;:::-;5301:63;;5256:118;5413:2;5439:53;5484:7;5475:6;5464:9;5460:22;5439:53;:::i;:::-;5429:63;;5384:118;4890:619;;;;;:::o;5515:118::-;5602:24;5620:5;5602:24;:::i;:::-;5597:3;5590:37;5515:118;;:::o;5639:222::-;5732:4;5770:2;5759:9;5755:18;5747:26;;5783:71;5851:1;5840:9;5836:17;5827:6;5783:71;:::i;:::-;5639:222;;;;:::o;5867:619::-;5944:6;5952;5960;6009:2;5997:9;5988:7;5984:23;5980:32;5977:119;;;6015:79;;:::i;:::-;5977:119;6135:1;6160:53;6205:7;6196:6;6185:9;6181:22;6160:53;:::i;:::-;6150:63;;6106:117;6262:2;6288:53;6333:7;6324:6;6313:9;6309:22;6288:53;:::i;:::-;6278:63;;6233:118;6390:2;6416:53;6461:7;6452:6;6441:9;6437:22;6416:53;:::i;:::-;6406:63;;6361:118;5867:619;;;;;:::o;6492:114::-;6559:6;6593:5;6587:12;6577:22;;6492:114;;;:::o;6612:184::-;6711:11;6745:6;6740:3;6733:19;6785:4;6780:3;6776:14;6761:29;;6612:184;;;;:::o;6802:132::-;6869:4;6892:3;6884:11;;6922:4;6917:3;6913:14;6905:22;;6802:132;;;:::o;6940:108::-;7017:24;7035:5;7017:24;:::i;:::-;7012:3;7005:37;6940:108;;:::o;7054:179::-;7123:10;7144:46;7186:3;7178:6;7144:46;:::i;:::-;7222:4;7217:3;7213:14;7199:28;;7054:179;;;;:::o;7239:113::-;7309:4;7341;7336:3;7332:14;7324:22;;7239:113;;;:::o;7388:732::-;7507:3;7536:54;7584:5;7536:54;:::i;:::-;7606:86;7685:6;7680:3;7606:86;:::i;:::-;7599:93;;7716:56;7766:5;7716:56;:::i;:::-;7795:7;7826:1;7811:284;7836:6;7833:1;7830:13;7811:284;;;7912:6;7906:13;7939:63;7998:3;7983:13;7939:63;:::i;:::-;7932:70;;8025:60;8078:6;8025:60;:::i;:::-;8015:70;;7871:224;7858:1;7855;7851:9;7846:14;;7811:284;;;7815:14;8111:3;8104:10;;7512:608;;;7388:732;;;;:::o;8126:373::-;8269:4;8307:2;8296:9;8292:18;8284:26;;8356:9;8350:4;8346:20;8342:1;8331:9;8327:17;8320:47;8384:108;8487:4;8478:6;8384:108;:::i;:::-;8376:116;;8126:373;;;;:::o;8505:116::-;8575:21;8590:5;8575:21;:::i;:::-;8568:5;8565:32;8555:60;;8611:1;8608;8601:12;8555:60;8505:116;:::o;8627:133::-;8670:5;8708:6;8695:20;8686:29;;8724:30;8748:5;8724:30;:::i;:::-;8627:133;;;;:::o;8766:323::-;8822:6;8871:2;8859:9;8850:7;8846:23;8842:32;8839:119;;;8877:79;;:::i;:::-;8839:119;8997:1;9022:50;9064:7;9055:6;9044:9;9040:22;9022:50;:::i;:::-;9012:60;;8968:114;8766:323;;;;:::o;9095:117::-;9204:1;9201;9194:12;9218:117;9327:1;9324;9317:12;9341:180;9389:77;9386:1;9379:88;9486:4;9483:1;9476:15;9510:4;9507:1;9500:15;9527:281;9610:27;9632:4;9610:27;:::i;:::-;9602:6;9598:40;9740:6;9728:10;9725:22;9704:18;9692:10;9689:34;9686:62;9683:88;;;9751:18;;:::i;:::-;9683:88;9791:10;9787:2;9780:22;9570:238;9527:281;;:::o;9814:129::-;9848:6;9875:20;;:::i;:::-;9865:30;;9904:33;9932:4;9924:6;9904:33;:::i;:::-;9814:129;;;:::o;9949:308::-;10011:4;10101:18;10093:6;10090:30;10087:56;;;10123:18;;:::i;:::-;10087:56;10161:29;10183:6;10161:29;:::i;:::-;10153:37;;10245:4;10239;10235:15;10227:23;;9949:308;;;:::o;10263:146::-;10360:6;10355:3;10350;10337:30;10401:1;10392:6;10387:3;10383:16;10376:27;10263:146;;;:::o;10415:425::-;10493:5;10518:66;10534:49;10576:6;10534:49;:::i;:::-;10518:66;:::i;:::-;10509:75;;10607:6;10600:5;10593:21;10645:4;10638:5;10634:16;10683:3;10674:6;10669:3;10665:16;10662:25;10659:112;;;10690:79;;:::i;:::-;10659:112;10780:54;10827:6;10822:3;10817;10780:54;:::i;:::-;10499:341;10415:425;;;;;:::o;10860:340::-;10916:5;10965:3;10958:4;10950:6;10946:17;10942:27;10932:122;;10973:79;;:::i;:::-;10932:122;11090:6;11077:20;11115:79;11190:3;11182:6;11175:4;11167:6;11163:17;11115:79;:::i;:::-;11106:88;;10922:278;10860:340;;;;:::o;11206:509::-;11275:6;11324:2;11312:9;11303:7;11299:23;11295:32;11292:119;;;11330:79;;:::i;:::-;11292:119;11478:1;11467:9;11463:17;11450:31;11508:18;11500:6;11497:30;11494:117;;;11530:79;;:::i;:::-;11494:117;11635:63;11690:7;11681:6;11670:9;11666:22;11635:63;:::i;:::-;11625:73;;11421:287;11206:509;;;;:::o;11721:329::-;11780:6;11829:2;11817:9;11808:7;11804:23;11800:32;11797:119;;;11835:79;;:::i;:::-;11797:119;11955:1;11980:53;12025:7;12016:6;12005:9;12001:22;11980:53;:::i;:::-;11970:63;;11926:117;11721:329;;;;:::o;12056:468::-;12121:6;12129;12178:2;12166:9;12157:7;12153:23;12149:32;12146:119;;;12184:79;;:::i;:::-;12146:119;12304:1;12329:53;12374:7;12365:6;12354:9;12350:22;12329:53;:::i;:::-;12319:63;;12275:117;12431:2;12457:50;12499:7;12490:6;12479:9;12475:22;12457:50;:::i;:::-;12447:60;;12402:115;12056:468;;;;;:::o;12530:307::-;12591:4;12681:18;12673:6;12670:30;12667:56;;;12703:18;;:::i;:::-;12667:56;12741:29;12763:6;12741:29;:::i;:::-;12733:37;;12825:4;12819;12815:15;12807:23;;12530:307;;;:::o;12843:423::-;12920:5;12945:65;12961:48;13002:6;12961:48;:::i;:::-;12945:65;:::i;:::-;12936:74;;13033:6;13026:5;13019:21;13071:4;13064:5;13060:16;13109:3;13100:6;13095:3;13091:16;13088:25;13085:112;;;13116:79;;:::i;:::-;13085:112;13206:54;13253:6;13248:3;13243;13206:54;:::i;:::-;12926:340;12843:423;;;;;:::o;13285:338::-;13340:5;13389:3;13382:4;13374:6;13370:17;13366:27;13356:122;;13397:79;;:::i;:::-;13356:122;13514:6;13501:20;13539:78;13613:3;13605:6;13598:4;13590:6;13586:17;13539:78;:::i;:::-;13530:87;;13346:277;13285:338;;;;:::o;13629:943::-;13724:6;13732;13740;13748;13797:3;13785:9;13776:7;13772:23;13768:33;13765:120;;;13804:79;;:::i;:::-;13765:120;13924:1;13949:53;13994:7;13985:6;13974:9;13970:22;13949:53;:::i;:::-;13939:63;;13895:117;14051:2;14077:53;14122:7;14113:6;14102:9;14098:22;14077:53;:::i;:::-;14067:63;;14022:118;14179:2;14205:53;14250:7;14241:6;14230:9;14226:22;14205:53;:::i;:::-;14195:63;;14150:118;14335:2;14324:9;14320:18;14307:32;14366:18;14358:6;14355:30;14352:117;;;14388:79;;:::i;:::-;14352:117;14493:62;14547:7;14538:6;14527:9;14523:22;14493:62;:::i;:::-;14483:72;;14278:287;13629:943;;;;;;;:::o;14578:474::-;14646:6;14654;14703:2;14691:9;14682:7;14678:23;14674:32;14671:119;;;14709:79;;:::i;:::-;14671:119;14829:1;14854:53;14899:7;14890:6;14879:9;14875:22;14854:53;:::i;:::-;14844:63;;14800:117;14956:2;14982:53;15027:7;15018:6;15007:9;15003:22;14982:53;:::i;:::-;14972:63;;14927:118;14578:474;;;;;:::o;15058:180::-;15106:77;15103:1;15096:88;15203:4;15200:1;15193:15;15227:4;15224:1;15217:15;15244:320;15288:6;15325:1;15319:4;15315:12;15305:22;;15372:1;15366:4;15362:12;15393:18;15383:81;;15449:4;15441:6;15437:17;15427:27;;15383:81;15511:2;15503:6;15500:14;15480:18;15477:38;15474:84;;15530:18;;:::i;:::-;15474:84;15295:269;15244:320;;;:::o;15570:174::-;15710:26;15706:1;15698:6;15694:14;15687:50;15570:174;:::o;15750:366::-;15892:3;15913:67;15977:2;15972:3;15913:67;:::i;:::-;15906:74;;15989:93;16078:3;15989:93;:::i;:::-;16107:2;16102:3;16098:12;16091:19;;15750:366;;;:::o;16122:419::-;16288:4;16326:2;16315:9;16311:18;16303:26;;16375:9;16369:4;16365:20;16361:1;16350:9;16346:17;16339:47;16403:131;16529:4;16403:131;:::i;:::-;16395:139;;16122:419;;;:::o;16547:180::-;16595:77;16592:1;16585:88;16692:4;16689:1;16682:15;16716:4;16713:1;16706:15;16733:194;16773:4;16793:20;16811:1;16793:20;:::i;:::-;16788:25;;16827:20;16845:1;16827:20;:::i;:::-;16822:25;;16871:1;16868;16864:9;16856:17;;16895:1;16889:4;16886:11;16883:37;;;16900:18;;:::i;:::-;16883:37;16733:194;;;;:::o;16933:158::-;17073:10;17069:1;17061:6;17057:14;17050:34;16933:158;:::o;17097:365::-;17239:3;17260:66;17324:1;17319:3;17260:66;:::i;:::-;17253:73;;17335:93;17424:3;17335:93;:::i;:::-;17453:2;17448:3;17444:12;17437:19;;17097:365;;;:::o;17468:419::-;17634:4;17672:2;17661:9;17657:18;17649:26;;17721:9;17715:4;17711:20;17707:1;17696:9;17692:17;17685:47;17749:131;17875:4;17749:131;:::i;:::-;17741:139;;17468:419;;;:::o;17893:143::-;17950:5;17981:6;17975:13;17966:22;;17997:33;18024:5;17997:33;:::i;:::-;17893:143;;;;:::o;18042:351::-;18112:6;18161:2;18149:9;18140:7;18136:23;18132:32;18129:119;;;18167:79;;:::i;:::-;18129:119;18287:1;18312:64;18368:7;18359:6;18348:9;18344:22;18312:64;:::i;:::-;18302:74;;18258:128;18042:351;;;;:::o;18399:171::-;18539:23;18535:1;18527:6;18523:14;18516:47;18399:171;:::o;18576:366::-;18718:3;18739:67;18803:2;18798:3;18739:67;:::i;:::-;18732:74;;18815:93;18904:3;18815:93;:::i;:::-;18933:2;18928:3;18924:12;18917:19;;18576:366;;;:::o;18948:419::-;19114:4;19152:2;19141:9;19137:18;19129:26;;19201:9;19195:4;19191:20;19187:1;19176:9;19172:17;19165:47;19229:131;19355:4;19229:131;:::i;:::-;19221:139;;18948:419;;;:::o;19373:171::-;19513:23;19509:1;19501:6;19497:14;19490:47;19373:171;:::o;19550:366::-;19692:3;19713:67;19777:2;19772:3;19713:67;:::i;:::-;19706:74;;19789:93;19878:3;19789:93;:::i;:::-;19907:2;19902:3;19898:12;19891:19;;19550:366;;;:::o;19922:419::-;20088:4;20126:2;20115:9;20111:18;20103:26;;20175:9;20169:4;20165:20;20161:1;20150:9;20146:17;20139:47;20203:131;20329:4;20203:131;:::i;:::-;20195:139;;19922:419;;;:::o;20347:171::-;20487:23;20483:1;20475:6;20471:14;20464:47;20347:171;:::o;20524:366::-;20666:3;20687:67;20751:2;20746:3;20687:67;:::i;:::-;20680:74;;20763:93;20852:3;20763:93;:::i;:::-;20881:2;20876:3;20872:12;20865:19;;20524:366;;;:::o;20896:419::-;21062:4;21100:2;21089:9;21085:18;21077:26;;21149:9;21143:4;21139:20;21135:1;21124:9;21120:17;21113:47;21177:131;21303:4;21177:131;:::i;:::-;21169:139;;20896:419;;;:::o;21321:332::-;21442:4;21480:2;21469:9;21465:18;21457:26;;21493:71;21561:1;21550:9;21546:17;21537:6;21493:71;:::i;:::-;21574:72;21642:2;21631:9;21627:18;21618:6;21574:72;:::i;:::-;21321:332;;;;;:::o;21659:137::-;21713:5;21744:6;21738:13;21729:22;;21760:30;21784:5;21760:30;:::i;:::-;21659:137;;;;:::o;21802:345::-;21869:6;21918:2;21906:9;21897:7;21893:23;21889:32;21886:119;;;21924:79;;:::i;:::-;21886:119;22044:1;22069:61;22122:7;22113:6;22102:9;22098:22;22069:61;:::i;:::-;22059:71;;22015:125;21802:345;;;;:::o;22153:246::-;22293:34;22289:1;22281:6;22277:14;22270:58;22362:29;22357:2;22349:6;22345:15;22338:54;22153:246;:::o;22405:366::-;22547:3;22568:67;22632:2;22627:3;22568:67;:::i;:::-;22561:74;;22644:93;22733:3;22644:93;:::i;:::-;22762:2;22757:3;22753:12;22746:19;;22405:366;;;:::o;22777:419::-;22943:4;22981:2;22970:9;22966:18;22958:26;;23030:9;23024:4;23020:20;23016:1;23005:9;23001:17;22994:47;23058:131;23184:4;23058:131;:::i;:::-;23050:139;;22777:419;;;:::o;23202:442::-;23351:4;23389:2;23378:9;23374:18;23366:26;;23402:71;23470:1;23459:9;23455:17;23446:6;23402:71;:::i;:::-;23483:72;23551:2;23540:9;23536:18;23527:6;23483:72;:::i;:::-;23565;23633:2;23622:9;23618:18;23609:6;23565:72;:::i;:::-;23202:442;;;;;;:::o;23650:::-;23799:4;23837:2;23826:9;23822:18;23814:26;;23850:71;23918:1;23907:9;23903:17;23894:6;23850:71;:::i;:::-;23931:72;23999:2;23988:9;23984:18;23975:6;23931:72;:::i;:::-;24013;24081:2;24070:9;24066:18;24057:6;24013:72;:::i;:::-;23650:442;;;;;;:::o;24098:233::-;24137:3;24160:24;24178:5;24160:24;:::i;:::-;24151:33;;24206:66;24199:5;24196:77;24193:103;;24276:18;;:::i;:::-;24193:103;24323:1;24316:5;24312:13;24305:20;;24098:233;;;:::o;24337:175::-;24477:27;24473:1;24465:6;24461:14;24454:51;24337:175;:::o;24518:366::-;24660:3;24681:67;24745:2;24740:3;24681:67;:::i;:::-;24674:74;;24757:93;24846:3;24757:93;:::i;:::-;24875:2;24870:3;24866:12;24859:19;;24518:366;;;:::o;24890:419::-;25056:4;25094:2;25083:9;25079:18;25071:26;;25143:9;25137:4;25133:20;25129:1;25118:9;25114:17;25107:47;25171:131;25297:4;25171:131;:::i;:::-;25163:139;;24890:419;;;:::o;25315:226::-;25455:34;25451:1;25443:6;25439:14;25432:58;25524:9;25519:2;25511:6;25507:15;25500:34;25315:226;:::o;25547:366::-;25689:3;25710:67;25774:2;25769:3;25710:67;:::i;:::-;25703:74;;25786:93;25875:3;25786:93;:::i;:::-;25904:2;25899:3;25895:12;25888:19;;25547:366;;;:::o;25919:419::-;26085:4;26123:2;26112:9;26108:18;26100:26;;26172:9;26166:4;26162:20;26158:1;26147:9;26143:17;26136:47;26200:131;26326:4;26200:131;:::i;:::-;26192:139;;25919:419;;;:::o;26344:222::-;26484:34;26480:1;26472:6;26468:14;26461:58;26553:5;26548:2;26540:6;26536:15;26529:30;26344:222;:::o;26572:366::-;26714:3;26735:67;26799:2;26794:3;26735:67;:::i;:::-;26728:74;;26811:93;26900:3;26811:93;:::i;:::-;26929:2;26924:3;26920:12;26913:19;;26572:366;;;:::o;26944:419::-;27110:4;27148:2;27137:9;27133:18;27125:26;;27197:9;27191:4;27187:20;27183:1;27172:9;27168:17;27161:47;27225:131;27351:4;27225:131;:::i;:::-;27217:139;;26944:419;;;:::o;27369:442::-;27518:4;27556:2;27545:9;27541:18;27533:26;;27569:71;27637:1;27626:9;27622:17;27613:6;27569:71;:::i;:::-;27650:72;27718:2;27707:9;27703:18;27694:6;27650:72;:::i;:::-;27732;27800:2;27789:9;27785:18;27776:6;27732:72;:::i;:::-;27369:442;;;;;;:::o;27817:141::-;27866:4;27889:3;27881:11;;27912:3;27909:1;27902:14;27946:4;27943:1;27933:18;27925:26;;27817:141;;;:::o;27964:93::-;28001:6;28048:2;28043;28036:5;28032:14;28028:23;28018:33;;27964:93;;;:::o;28063:107::-;28107:8;28157:5;28151:4;28147:16;28126:37;;28063:107;;;;:::o;28176:393::-;28245:6;28295:1;28283:10;28279:18;28318:97;28348:66;28337:9;28318:97;:::i;:::-;28436:39;28466:8;28455:9;28436:39;:::i;:::-;28424:51;;28508:4;28504:9;28497:5;28493:21;28484:30;;28557:4;28547:8;28543:19;28536:5;28533:30;28523:40;;28252:317;;28176:393;;;;;:::o;28575:60::-;28603:3;28624:5;28617:12;;28575:60;;;:::o;28641:142::-;28691:9;28724:53;28742:34;28751:24;28769:5;28751:24;:::i;:::-;28742:34;:::i;:::-;28724:53;:::i;:::-;28711:66;;28641:142;;;:::o;28789:75::-;28832:3;28853:5;28846:12;;28789:75;;;:::o;28870:269::-;28980:39;29011:7;28980:39;:::i;:::-;29041:91;29090:41;29114:16;29090:41;:::i;:::-;29082:6;29075:4;29069:11;29041:91;:::i;:::-;29035:4;29028:105;28946:193;28870:269;;;:::o;29145:73::-;29190:3;29145:73;:::o;29224:189::-;29301:32;;:::i;:::-;29342:65;29400:6;29392;29386:4;29342:65;:::i;:::-;29277:136;29224:189;;:::o;29419:186::-;29479:120;29496:3;29489:5;29486:14;29479:120;;;29550:39;29587:1;29580:5;29550:39;:::i;:::-;29523:1;29516:5;29512:13;29503:22;;29479:120;;;29419:186;;:::o;29611:543::-;29712:2;29707:3;29704:11;29701:446;;;29746:38;29778:5;29746:38;:::i;:::-;29830:29;29848:10;29830:29;:::i;:::-;29820:8;29816:44;30013:2;30001:10;29998:18;29995:49;;;30034:8;30019:23;;29995:49;30057:80;30113:22;30131:3;30113:22;:::i;:::-;30103:8;30099:37;30086:11;30057:80;:::i;:::-;29716:431;;29701:446;29611:543;;;:::o;30160:117::-;30214:8;30264:5;30258:4;30254:16;30233:37;;30160:117;;;;:::o;30283:169::-;30327:6;30360:51;30408:1;30404:6;30396:5;30393:1;30389:13;30360:51;:::i;:::-;30356:56;30441:4;30435;30431:15;30421:25;;30334:118;30283:169;;;;:::o;30457:295::-;30533:4;30679:29;30704:3;30698:4;30679:29;:::i;:::-;30671:37;;30741:3;30738:1;30734:11;30728:4;30725:21;30717:29;;30457:295;;;;:::o;30757:1395::-;30874:37;30907:3;30874:37;:::i;:::-;30976:18;30968:6;30965:30;30962:56;;;30998:18;;:::i;:::-;30962:56;31042:38;31074:4;31068:11;31042:38;:::i;:::-;31127:67;31187:6;31179;31173:4;31127:67;:::i;:::-;31221:1;31245:4;31232:17;;31277:2;31269:6;31266:14;31294:1;31289:618;;;;31951:1;31968:6;31965:77;;;32017:9;32012:3;32008:19;32002:26;31993:35;;31965:77;32068:67;32128:6;32121:5;32068:67;:::i;:::-;32062:4;32055:81;31924:222;31259:887;;31289:618;31341:4;31337:9;31329:6;31325:22;31375:37;31407:4;31375:37;:::i;:::-;31434:1;31448:208;31462:7;31459:1;31456:14;31448:208;;;31541:9;31536:3;31532:19;31526:26;31518:6;31511:42;31592:1;31584:6;31580:14;31570:24;;31639:2;31628:9;31624:18;31611:31;;31485:4;31482:1;31478:12;31473:17;;31448:208;;;31684:6;31675:7;31672:19;31669:179;;;31742:9;31737:3;31733:19;31727:26;31785:48;31827:4;31819:6;31815:17;31804:9;31785:48;:::i;:::-;31777:6;31770:64;31692:156;31669:179;31894:1;31890;31882:6;31878:14;31874:22;31868:4;31861:36;31296:611;;;31259:887;;30849:1303;;;30757:1395;;:::o;32158:169::-;32298:21;32294:1;32286:6;32282:14;32275:45;32158:169;:::o;32333:366::-;32475:3;32496:67;32560:2;32555:3;32496:67;:::i;:::-;32489:74;;32572:93;32661:3;32572:93;:::i;:::-;32690:2;32685:3;32681:12;32674:19;;32333:366;;;:::o;32705:419::-;32871:4;32909:2;32898:9;32894:18;32886:26;;32958:9;32952:4;32948:20;32944:1;32933:9;32929:17;32922:47;32986:131;33112:4;32986:131;:::i;:::-;32978:139;;32705:419;;;:::o;33130:410::-;33170:7;33193:20;33211:1;33193:20;:::i;:::-;33188:25;;33227:20;33245:1;33227:20;:::i;:::-;33222:25;;33282:1;33279;33275:9;33304:30;33322:11;33304:30;:::i;:::-;33293:41;;33483:1;33474:7;33470:15;33467:1;33464:22;33444:1;33437:9;33417:83;33394:139;;33513:18;;:::i;:::-;33394:139;33178:362;33130:410;;;;:::o;33546:161::-;33686:13;33682:1;33674:6;33670:14;33663:37;33546:161;:::o;33713:366::-;33855:3;33876:67;33940:2;33935:3;33876:67;:::i;:::-;33869:74;;33952:93;34041:3;33952:93;:::i;:::-;34070:2;34065:3;34061:12;34054:19;;33713:366;;;:::o;34085:419::-;34251:4;34289:2;34278:9;34274:18;34266:26;;34338:9;34332:4;34328:20;34324:1;34313:9;34309:17;34302:47;34366:131;34492:4;34366:131;:::i;:::-;34358:139;;34085:419;;;:::o;34510:191::-;34550:3;34569:20;34587:1;34569:20;:::i;:::-;34564:25;;34603:20;34621:1;34603:20;:::i;:::-;34598:25;;34646:1;34643;34639:9;34632:16;;34667:3;34664:1;34661:10;34658:36;;;34674:18;;:::i;:::-;34658:36;34510:191;;;;:::o;34707:172::-;34847:24;34843:1;34835:6;34831:14;34824:48;34707:172;:::o;34885:366::-;35027:3;35048:67;35112:2;35107:3;35048:67;:::i;:::-;35041:74;;35124:93;35213:3;35124:93;:::i;:::-;35242:2;35237:3;35233:12;35226:19;;34885:366;;;:::o;35257:419::-;35423:4;35461:2;35450:9;35446:18;35438:26;;35510:9;35504:4;35500:20;35496:1;35485:9;35481:17;35474:47;35538:131;35664:4;35538:131;:::i;:::-;35530:139;;35257:419;;;:::o;35682:171::-;35822:23;35818:1;35810:6;35806:14;35799:47;35682:171;:::o;35859:366::-;36001:3;36022:67;36086:2;36081:3;36022:67;:::i;:::-;36015:74;;36098:93;36187:3;36098:93;:::i;:::-;36216:2;36211:3;36207:12;36200:19;;35859:366;;;:::o;36231:419::-;36397:4;36435:2;36424:9;36420:18;36412:26;;36484:9;36478:4;36474:20;36470:1;36459:9;36455:17;36448:47;36512:131;36638:4;36512:131;:::i;:::-;36504:139;;36231:419;;;:::o;36656:148::-;36758:11;36795:3;36780:18;;36656:148;;;;:::o;36834:874::-;36937:3;36974:5;36968:12;37003:36;37029:9;37003:36;:::i;:::-;37055:89;37137:6;37132:3;37055:89;:::i;:::-;37048:96;;37175:1;37164:9;37160:17;37191:1;37186:166;;;;37366:1;37361:341;;;;37153:549;;37186:166;37270:4;37266:9;37255;37251:25;37246:3;37239:38;37332:6;37325:14;37318:22;37310:6;37306:35;37301:3;37297:45;37290:52;;37186:166;;37361:341;37428:38;37460:5;37428:38;:::i;:::-;37488:1;37502:154;37516:6;37513:1;37510:13;37502:154;;;37590:7;37584:14;37580:1;37575:3;37571:11;37564:35;37640:1;37631:7;37627:15;37616:26;;37538:4;37535:1;37531:12;37526:17;;37502:154;;;37685:6;37680:3;37676:16;37669:23;;37368:334;;37153:549;;36941:767;;36834:874;;;;:::o;37714:390::-;37820:3;37848:39;37881:5;37848:39;:::i;:::-;37903:89;37985:6;37980:3;37903:89;:::i;:::-;37896:96;;38001:65;38059:6;38054:3;38047:4;38040:5;38036:16;38001:65;:::i;:::-;38091:6;38086:3;38082:16;38075:23;;37824:280;37714:390;;;;:::o;38110:155::-;38250:7;38246:1;38238:6;38234:14;38227:31;38110:155;:::o;38271:400::-;38431:3;38452:84;38534:1;38529:3;38452:84;:::i;:::-;38445:91;;38545:93;38634:3;38545:93;:::i;:::-;38663:1;38658:3;38654:11;38647:18;;38271:400;;;:::o;38677:695::-;38955:3;38977:92;39065:3;39056:6;38977:92;:::i;:::-;38970:99;;39086:95;39177:3;39168:6;39086:95;:::i;:::-;39079:102;;39198:148;39342:3;39198:148;:::i;:::-;39191:155;;39363:3;39356:10;;38677:695;;;;;:::o;39378:168::-;39518:20;39514:1;39506:6;39502:14;39495:44;39378:168;:::o;39552:366::-;39694:3;39715:67;39779:2;39774:3;39715:67;:::i;:::-;39708:74;;39791:93;39880:3;39791:93;:::i;:::-;39909:2;39904:3;39900:12;39893:19;;39552:366;;;:::o;39924:419::-;40090:4;40128:2;40117:9;40113:18;40105:26;;40177:9;40171:4;40167:20;40163:1;40152:9;40148:17;40141:47;40205:131;40331:4;40205:131;:::i;:::-;40197:139;;39924:419;;;:::o;40349:181::-;40489:33;40485:1;40477:6;40473:14;40466:57;40349:181;:::o;40536:366::-;40678:3;40699:67;40763:2;40758:3;40699:67;:::i;:::-;40692:74;;40775:93;40864:3;40775:93;:::i;:::-;40893:2;40888:3;40884:12;40877:19;;40536:366;;;:::o;40908:419::-;41074:4;41112:2;41101:9;41097:18;41089:26;;41161:9;41155:4;41151:20;41147:1;41136:9;41132:17;41125:47;41189:131;41315:4;41189:131;:::i;:::-;41181:139;;40908:419;;;:::o;41333:98::-;41384:6;41418:5;41412:12;41402:22;;41333:98;;;:::o;41437:168::-;41520:11;41554:6;41549:3;41542:19;41594:4;41589:3;41585:14;41570:29;;41437:168;;;;:::o;41611:373::-;41697:3;41725:38;41757:5;41725:38;:::i;:::-;41779:70;41842:6;41837:3;41779:70;:::i;:::-;41772:77;;41858:65;41916:6;41911:3;41904:4;41897:5;41893:16;41858:65;:::i;:::-;41948:29;41970:6;41948:29;:::i;:::-;41943:3;41939:39;41932:46;;41701:283;41611:373;;;;:::o;41990:640::-;42185:4;42223:3;42212:9;42208:19;42200:27;;42237:71;42305:1;42294:9;42290:17;42281:6;42237:71;:::i;:::-;42318:72;42386:2;42375:9;42371:18;42362:6;42318:72;:::i;:::-;42400;42468:2;42457:9;42453:18;42444:6;42400:72;:::i;:::-;42519:9;42513:4;42509:20;42504:2;42493:9;42489:18;42482:48;42547:76;42618:4;42609:6;42547:76;:::i;:::-;42539:84;;41990:640;;;;;;;:::o;42636:141::-;42692:5;42723:6;42717:13;42708:22;;42739:32;42765:5;42739:32;:::i;:::-;42636:141;;;;:::o;42783:349::-;42852:6;42901:2;42889:9;42880:7;42876:23;42872:32;42869:119;;;42907:79;;:::i;:::-;42869:119;43027:1;43052:63;43107:7;43098:6;43087:9;43083:22;43052:63;:::i;:::-;43042:73;;42998:127;42783:349;;;;:::o;43138:180::-;43186:77;43183:1;43176:88;43283:4;43280:1;43273:15;43307:4;43304:1;43297:15;43324:332;43445:4;43483:2;43472:9;43468:18;43460:26;;43496:71;43564:1;43553:9;43549:17;43540:6;43496:71;:::i;:::-;43577:72;43645:2;43634:9;43630:18;43621:6;43577:72;:::i;:::-;43324:332;;;;;:::o
Swarm Source
ipfs://7eb4dadaa3d05029e243c8651e714d4e5b25ee4a93bc53442da990d815760e31
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.