Feature Tip: Add private address tag to any address under My Name Tag !
Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
This contract may be a proxy contract. Click on More Options and select Is this a proxy? to confirm and enable the "Read as Proxy" & "Write as Proxy" tabs.
Contract Name:
YouAreTheChampion
Compiler Version
v0.8.13+commit.abaa5c0e
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2023-12-28 */ // SPDX-License-Identifier: MIT // File: operator-filter-registry/src/lib/Constants.sol pragma solidity ^0.8.13; address constant CANONICAL_OPERATOR_FILTER_REGISTRY_ADDRESS = 0x000000000000AAeB6D7670E522A718067333cd4E; address constant CANONICAL_CORI_SUBSCRIPTION = 0x3cc6CddA760b79bAfa08dF41ECFA224f810dCeB6; // File: operator-filter-registry/src/IOperatorFilterRegistry.sol pragma solidity ^0.8.13; interface IOperatorFilterRegistry { /** * @notice Returns true if operator is not filtered for a given token, either by address or codeHash. Also returns * true if supplied registrant address is not registered. */ function isOperatorAllowed(address registrant, address operator) external view returns (bool); /** * @notice Registers an address with the registry. May be called by address itself or by EIP-173 owner. */ function register(address registrant) external; /** * @notice Registers an address with the registry and "subscribes" to another address's filtered operators and codeHashes. */ function registerAndSubscribe(address registrant, address subscription) external; /** * @notice Registers an address with the registry and copies the filtered operators and codeHashes from another * address without subscribing. */ function registerAndCopyEntries(address registrant, address registrantToCopy) external; /** * @notice Unregisters an address with the registry and removes its subscription. May be called by address itself or by EIP-173 owner. * Note that this does not remove any filtered addresses or codeHashes. * Also note that any subscriptions to this registrant will still be active and follow the existing filtered addresses and codehashes. */ function unregister(address addr) external; /** * @notice Update an operator address for a registered address - when filtered is true, the operator is filtered. */ function updateOperator(address registrant, address operator, bool filtered) external; /** * @notice Update multiple operators for a registered address - when filtered is true, the operators will be filtered. Reverts on duplicates. */ function updateOperators(address registrant, address[] calldata operators, bool filtered) external; /** * @notice Update a codeHash for a registered address - when filtered is true, the codeHash is filtered. */ function updateCodeHash(address registrant, bytes32 codehash, bool filtered) external; /** * @notice Update multiple codeHashes for a registered address - when filtered is true, the codeHashes will be filtered. Reverts on duplicates. */ function updateCodeHashes(address registrant, bytes32[] calldata codeHashes, bool filtered) external; /** * @notice Subscribe an address to another registrant's filtered operators and codeHashes. Will remove previous * subscription if present. * Note that accounts with subscriptions may go on to subscribe to other accounts - in this case, * subscriptions will not be forwarded. Instead the former subscription's existing entries will still be * used. */ function subscribe(address registrant, address registrantToSubscribe) external; /** * @notice Unsubscribe an address from its current subscribed registrant, and optionally copy its filtered operators and codeHashes. */ function unsubscribe(address registrant, bool copyExistingEntries) external; /** * @notice Get the subscription address of a given registrant, if any. */ function subscriptionOf(address addr) external returns (address registrant); /** * @notice Get the set of addresses subscribed to a given registrant. * Note that order is not guaranteed as updates are made. */ function subscribers(address registrant) external returns (address[] memory); /** * @notice Get the subscriber at a given index in the set of addresses subscribed to a given registrant. * Note that order is not guaranteed as updates are made. */ function subscriberAt(address registrant, uint256 index) external returns (address); /** * @notice Copy filtered operators and codeHashes from a different registrantToCopy to addr. */ function copyEntriesOf(address registrant, address registrantToCopy) external; /** * @notice Returns true if operator is filtered by a given address or its subscription. */ function isOperatorFiltered(address registrant, address operator) external returns (bool); /** * @notice Returns true if the hash of an address's code is filtered by a given address or its subscription. */ function isCodeHashOfFiltered(address registrant, address operatorWithCode) external returns (bool); /** * @notice Returns true if a codeHash is filtered by a given address or its subscription. */ function isCodeHashFiltered(address registrant, bytes32 codeHash) external returns (bool); /** * @notice Returns a list of filtered operators for a given address or its subscription. */ function filteredOperators(address addr) external returns (address[] memory); /** * @notice Returns the set of filtered codeHashes for a given address or its subscription. * Note that order is not guaranteed as updates are made. */ function filteredCodeHashes(address addr) external returns (bytes32[] memory); /** * @notice Returns the filtered operator at the given index of the set of filtered operators for a given address or * its subscription. * Note that order is not guaranteed as updates are made. */ function filteredOperatorAt(address registrant, uint256 index) external returns (address); /** * @notice Returns the filtered codeHash at the given index of the list of filtered codeHashes for a given address or * its subscription. * Note that order is not guaranteed as updates are made. */ function filteredCodeHashAt(address registrant, uint256 index) external returns (bytes32); /** * @notice Returns true if an address has registered */ function isRegistered(address addr) external returns (bool); /** * @dev Convenience method to compute the code hash of an arbitrary contract */ function codeHashOf(address addr) external returns (bytes32); } // File: @openzeppelin/contracts-upgradeable/utils/StorageSlotUpgradeable.sol // OpenZeppelin Contracts (last updated v4.7.0) (utils/StorageSlot.sol) pragma solidity ^0.8.0; /** * @dev Library for reading and writing primitive types to specific storage slots. * * Storage slots are often used to avoid storage conflict when dealing with upgradeable contracts. * This library helps with reading and writing to such slots without the need for inline assembly. * * The functions in this library return Slot structs that contain a `value` member that can be used to read or write. * * Example usage to set ERC1967 implementation slot: * ``` * contract ERC1967 { * bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc; * * function _getImplementation() internal view returns (address) { * return StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value; * } * * function _setImplementation(address newImplementation) internal { * require(Address.isContract(newImplementation), "ERC1967: new implementation is not a contract"); * StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation; * } * } * ``` * * _Available since v4.1 for `address`, `bool`, `bytes32`, and `uint256`._ */ library StorageSlotUpgradeable { struct AddressSlot { address value; } struct BooleanSlot { bool value; } struct Bytes32Slot { bytes32 value; } struct Uint256Slot { uint256 value; } /** * @dev Returns an `AddressSlot` with member `value` located at `slot`. */ function getAddressSlot(bytes32 slot) internal pure returns (AddressSlot storage r) { /// @solidity memory-safe-assembly assembly { r.slot := slot } } /** * @dev Returns an `BooleanSlot` with member `value` located at `slot`. */ function getBooleanSlot(bytes32 slot) internal pure returns (BooleanSlot storage r) { /// @solidity memory-safe-assembly assembly { r.slot := slot } } /** * @dev Returns an `Bytes32Slot` with member `value` located at `slot`. */ function getBytes32Slot(bytes32 slot) internal pure returns (Bytes32Slot storage r) { /// @solidity memory-safe-assembly assembly { r.slot := slot } } /** * @dev Returns an `Uint256Slot` with member `value` located at `slot`. */ function getUint256Slot(bytes32 slot) internal pure returns (Uint256Slot storage r) { /// @solidity memory-safe-assembly assembly { r.slot := slot } } } // File: @openzeppelin/contracts-upgradeable/proxy/beacon/IBeaconUpgradeable.sol // OpenZeppelin Contracts v4.4.1 (proxy/beacon/IBeacon.sol) pragma solidity ^0.8.0; /** * @dev This is the interface that {BeaconProxy} expects of its beacon. */ interface IBeaconUpgradeable { /** * @dev Must return an address that can be used as a delegate call target. * * {BeaconProxy} will check that this address is a contract. */ function implementation() external view returns (address); } // File: @openzeppelin/contracts-upgradeable/interfaces/draft-IERC1822Upgradeable.sol // OpenZeppelin Contracts (last updated v4.5.0) (interfaces/draft-IERC1822.sol) pragma solidity ^0.8.0; /** * @dev ERC1822: Universal Upgradeable Proxy Standard (UUPS) documents a method for upgradeability through a simplified * proxy whose upgrades are fully controlled by the current implementation. */ interface IERC1822ProxiableUpgradeable { /** * @dev Returns the storage slot that the proxiable contract assumes is being used to store the implementation * address. * * IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks * bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this * function revert if invoked through a proxy. */ function proxiableUUID() external view returns (bytes32); } // File: @openzeppelin/contracts-upgradeable/access/IAccessControlUpgradeable.sol // OpenZeppelin Contracts v4.4.1 (access/IAccessControl.sol) pragma solidity ^0.8.0; /** * @dev External interface of AccessControl declared to support ERC165 detection. */ interface IAccessControlUpgradeable { /** * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` * * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite * {RoleAdminChanged} not being emitted signaling this. * * _Available since v3.1._ */ event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole); /** * @dev Emitted when `account` is granted `role`. * * `sender` is the account that originated the contract call, an admin role * bearer except when using {AccessControl-_setupRole}. */ event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender); /** * @dev Emitted when `account` is revoked `role`. * * `sender` is the account that originated the contract call: * - if using `revokeRole`, it is the admin role bearer * - if using `renounceRole`, it is the role bearer (i.e. `account`) */ event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender); /** * @dev Returns `true` if `account` has been granted `role`. */ function hasRole(bytes32 role, address account) external view returns (bool); /** * @dev Returns the admin role that controls `role`. See {grantRole} and * {revokeRole}. * * To change a role's admin, use {AccessControl-_setRoleAdmin}. */ function getRoleAdmin(bytes32 role) external view returns (bytes32); /** * @dev Grants `role` to `account`. * * If `account` had not been already granted `role`, emits a {RoleGranted} * event. * * Requirements: * * - the caller must have ``role``'s admin role. */ function grantRole(bytes32 role, address account) external; /** * @dev Revokes `role` from `account`. * * If `account` had been granted `role`, emits a {RoleRevoked} event. * * Requirements: * * - the caller must have ``role``'s admin role. */ function revokeRole(bytes32 role, address account) external; /** * @dev Revokes `role` from the calling account. * * Roles are often managed via {grantRole} and {revokeRole}: this function's * purpose is to provide a mechanism for accounts to lose their privileges * if they are compromised (such as when a trusted device is misplaced). * * If the calling account had been granted `role`, emits a {RoleRevoked} * event. * * Requirements: * * - the caller must be `account`. */ function renounceRole(bytes32 role, address account) external; } // File: @openzeppelin/contracts-upgradeable/utils/math/MathUpgradeable.sol // OpenZeppelin Contracts (last updated v4.8.0) (utils/math/Math.sol) pragma solidity ^0.8.0; /** * @dev Standard math utilities missing in the Solidity language. */ library MathUpgradeable { enum Rounding { Down, // Toward negative infinity Up, // Toward infinity Zero // Toward zero } /** * @dev Returns the largest of two numbers. */ function max(uint256 a, uint256 b) internal pure returns (uint256) { return a > b ? a : b; } /** * @dev Returns the smallest of two numbers. */ function min(uint256 a, uint256 b) internal pure returns (uint256) { return a < b ? a : b; } /** * @dev Returns the average of two numbers. The result is rounded towards * zero. */ function average(uint256 a, uint256 b) internal pure returns (uint256) { // (a + b) / 2 can overflow. return (a & b) + (a ^ b) / 2; } /** * @dev Returns the ceiling of the division of two numbers. * * This differs from standard division with `/` in that it rounds up instead * of rounding down. */ function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) { // (a + b - 1) / b can overflow on addition, so we distribute. return a == 0 ? 0 : (a - 1) / b + 1; } /** * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0 * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv) * with further edits by Uniswap Labs also under MIT license. */ function mulDiv( uint256 x, uint256 y, uint256 denominator ) internal pure returns (uint256 result) { unchecked { // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256 // variables such that product = prod1 * 2^256 + prod0. uint256 prod0; // Least significant 256 bits of the product uint256 prod1; // Most significant 256 bits of the product assembly { let mm := mulmod(x, y, not(0)) prod0 := mul(x, y) prod1 := sub(sub(mm, prod0), lt(mm, prod0)) } // Handle non-overflow cases, 256 by 256 division. if (prod1 == 0) { return prod0 / denominator; } // Make sure the result is less than 2^256. Also prevents denominator == 0. require(denominator > prod1); /////////////////////////////////////////////// // 512 by 256 division. /////////////////////////////////////////////// // Make division exact by subtracting the remainder from [prod1 prod0]. uint256 remainder; assembly { // Compute remainder using mulmod. remainder := mulmod(x, y, denominator) // Subtract 256 bit number from 512 bit number. prod1 := sub(prod1, gt(remainder, prod0)) prod0 := sub(prod0, remainder) } // Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1. // See https://cs.stackexchange.com/q/138556/92363. // Does not overflow because the denominator cannot be zero at this stage in the function. uint256 twos = denominator & (~denominator + 1); assembly { // Divide denominator by twos. denominator := div(denominator, twos) // Divide [prod1 prod0] by twos. prod0 := div(prod0, twos) // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one. twos := add(div(sub(0, twos), twos), 1) } // Shift in bits from prod1 into prod0. prod0 |= prod1 * twos; // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for // four bits. That is, denominator * inv = 1 mod 2^4. uint256 inverse = (3 * denominator) ^ 2; // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works // in modular arithmetic, doubling the correct bits in each step. inverse *= 2 - denominator * inverse; // inverse mod 2^8 inverse *= 2 - denominator * inverse; // inverse mod 2^16 inverse *= 2 - denominator * inverse; // inverse mod 2^32 inverse *= 2 - denominator * inverse; // inverse mod 2^64 inverse *= 2 - denominator * inverse; // inverse mod 2^128 inverse *= 2 - denominator * inverse; // inverse mod 2^256 // Because the division is now exact we can divide by multiplying with the modular inverse of denominator. // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1 // is no longer required. result = prod0 * inverse; return result; } } /** * @notice Calculates x * y / denominator with full precision, following the selected rounding direction. */ function mulDiv( uint256 x, uint256 y, uint256 denominator, Rounding rounding ) internal pure returns (uint256) { uint256 result = mulDiv(x, y, denominator); if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) { result += 1; } return result; } /** * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded down. * * Inspired by Henry S. Warren, Jr.'s "Hacker's Delight" (Chapter 11). */ function sqrt(uint256 a) internal pure returns (uint256) { if (a == 0) { return 0; } // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target. // // We know that the "msb" (most significant bit) of our target number `a` is a power of 2 such that we have // `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`. // // This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)` // → `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))` // → `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)` // // Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit. uint256 result = 1 << (log2(a) >> 1); // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128, // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision // into the expected uint128 result. unchecked { result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; return min(result, a / result); } } /** * @notice Calculates sqrt(a), following the selected rounding direction. */ function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = sqrt(a); return result + (rounding == Rounding.Up && result * result < a ? 1 : 0); } } /** * @dev Return the log in base 2, rounded down, of a positive value. * Returns 0 if given 0. */ function log2(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >> 128 > 0) { value >>= 128; result += 128; } if (value >> 64 > 0) { value >>= 64; result += 64; } if (value >> 32 > 0) { value >>= 32; result += 32; } if (value >> 16 > 0) { value >>= 16; result += 16; } if (value >> 8 > 0) { value >>= 8; result += 8; } if (value >> 4 > 0) { value >>= 4; result += 4; } if (value >> 2 > 0) { value >>= 2; result += 2; } if (value >> 1 > 0) { result += 1; } } return result; } /** * @dev Return the log in base 2, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log2(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log2(value); return result + (rounding == Rounding.Up && 1 << result < value ? 1 : 0); } } /** * @dev Return the log in base 10, rounded down, of a positive value. * Returns 0 if given 0. */ function log10(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >= 10**64) { value /= 10**64; result += 64; } if (value >= 10**32) { value /= 10**32; result += 32; } if (value >= 10**16) { value /= 10**16; result += 16; } if (value >= 10**8) { value /= 10**8; result += 8; } if (value >= 10**4) { value /= 10**4; result += 4; } if (value >= 10**2) { value /= 10**2; result += 2; } if (value >= 10**1) { result += 1; } } return result; } /** * @dev Return the log in base 10, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log10(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log10(value); return result + (rounding == Rounding.Up && 10**result < value ? 1 : 0); } } /** * @dev Return the log in base 256, rounded down, of a positive value. * Returns 0 if given 0. * * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string. */ function log256(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >> 128 > 0) { value >>= 128; result += 16; } if (value >> 64 > 0) { value >>= 64; result += 8; } if (value >> 32 > 0) { value >>= 32; result += 4; } if (value >> 16 > 0) { value >>= 16; result += 2; } if (value >> 8 > 0) { result += 1; } } return result; } /** * @dev Return the log in base 10, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log256(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log256(value); return result + (rounding == Rounding.Up && 1 << (result * 8) < value ? 1 : 0); } } } // File: @openzeppelin/contracts-upgradeable/utils/StringsUpgradeable.sol // OpenZeppelin Contracts (last updated v4.8.0) (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library StringsUpgradeable { bytes16 private constant _SYMBOLS = "0123456789abcdef"; uint8 private constant _ADDRESS_LENGTH = 20; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { unchecked { uint256 length = MathUpgradeable.log10(value) + 1; string memory buffer = new string(length); uint256 ptr; /// @solidity memory-safe-assembly assembly { ptr := add(buffer, add(32, length)) } while (true) { ptr--; /// @solidity memory-safe-assembly assembly { mstore8(ptr, byte(mod(value, 10), _SYMBOLS)) } value /= 10; if (value == 0) break; } return buffer; } } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { unchecked { return toHexString(value, MathUpgradeable.log256(value) + 1); } } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } /** * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation. */ function toHexString(address addr) internal pure returns (string memory) { return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH); } } // File: @openzeppelin/contracts-upgradeable/token/ERC721/IERC721ReceiverUpgradeable.sol // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721Receiver.sol) pragma solidity ^0.8.0; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721ReceiverUpgradeable { /** * @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-upgradeable/utils/introspection/IERC165Upgradeable.sol // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165Upgradeable { /** * @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-upgradeable/interfaces/IERC2981Upgradeable.sol // OpenZeppelin Contracts (last updated v4.6.0) (interfaces/IERC2981.sol) pragma solidity ^0.8.0; /** * @dev Interface for the NFT Royalty Standard. * * A standardized way to retrieve royalty payment information for non-fungible tokens (NFTs) to enable universal * support for royalty payments across all NFT marketplaces and ecosystem participants. * * _Available since v4.5._ */ interface IERC2981Upgradeable is IERC165Upgradeable { /** * @dev Returns how much royalty is owed and to whom, based on a sale price that may be denominated in any unit of * exchange. The royalty amount is denominated and should be paid in that same unit of exchange. */ function royaltyInfo(uint256 tokenId, uint256 salePrice) external view returns (address receiver, uint256 royaltyAmount); } // File: @openzeppelin/contracts-upgradeable/token/ERC721/IERC721Upgradeable.sol // OpenZeppelin Contracts (last updated v4.8.0) (token/ERC721/IERC721.sol) pragma solidity ^0.8.0; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721Upgradeable is IERC165Upgradeable { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Note that the caller is responsible to confirm that the recipient is capable of receiving ERC721 * or else they may be permanently lost. Usage of {safeTransferFrom} prevents loss, though the caller must * understand this adds an external call which potentially creates a reentrancy vulnerability. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); } // File: @openzeppelin/contracts-upgradeable/token/ERC721/extensions/IERC721EnumerableUpgradeable.sol // OpenZeppelin Contracts (last updated v4.5.0) (token/ERC721/extensions/IERC721Enumerable.sol) pragma solidity ^0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721EnumerableUpgradeable is IERC721Upgradeable { /** * @dev Returns the total amount of tokens stored by the contract. */ function totalSupply() external view returns (uint256); /** * @dev Returns a token ID owned by `owner` at a given `index` of its token list. * Use along with {balanceOf} to enumerate all of ``owner``'s tokens. */ function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256); /** * @dev Returns a token ID at a given `index` of all the tokens stored by the contract. * Use along with {totalSupply} to enumerate all tokens. */ function tokenByIndex(uint256 index) external view returns (uint256); } // File: @openzeppelin/contracts-upgradeable/token/ERC721/extensions/IERC721MetadataUpgradeable.sol // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol) pragma solidity ^0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721MetadataUpgradeable is IERC721Upgradeable { /** * @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-upgradeable/utils/AddressUpgradeable.sol // OpenZeppelin Contracts (last updated v4.8.0) (utils/Address.sol) pragma solidity ^0.8.1; /** * @dev Collection of functions related to the address type */ library AddressUpgradeable { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract. * * _Available since v4.8._ */ function verifyCallResultFromTarget( address target, bool success, bytes memory returndata, string memory errorMessage ) internal view returns (bytes memory) { if (success) { if (returndata.length == 0) { // only check isContract if the call was successful and the return data is empty // otherwise we already know that it was a contract require(isContract(target), "Address: call to non-contract"); } return returndata; } else { _revert(returndata, errorMessage); } } /** * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason or using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { _revert(returndata, errorMessage); } } function _revert(bytes memory returndata, string memory errorMessage) private pure { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly /// @solidity memory-safe-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } // File: @openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol // OpenZeppelin Contracts (last updated v4.8.1) (proxy/utils/Initializable.sol) pragma solidity ^0.8.2; /** * @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed * behind a proxy. Since proxied contracts do not make use of a constructor, it's common to move constructor logic to an * external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer * function so it can only be called once. The {initializer} modifier provided by this contract will have this effect. * * The initialization functions use a version number. Once a version number is used, it is consumed and cannot be * reused. This mechanism prevents re-execution of each "step" but allows the creation of new initialization steps in * case an upgrade adds a module that needs to be initialized. * * For example: * * [.hljs-theme-light.nopadding] * ``` * contract MyToken is ERC20Upgradeable { * function initialize() initializer public { * __ERC20_init("MyToken", "MTK"); * } * } * contract MyTokenV2 is MyToken, ERC20PermitUpgradeable { * function initializeV2() reinitializer(2) public { * __ERC20Permit_init("MyToken"); * } * } * ``` * * TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as * possible by providing the encoded function call as the `_data` argument to {ERC1967Proxy-constructor}. * * CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure * that all initializers are idempotent. This is not verified automatically as constructors are by Solidity. * * [CAUTION] * ==== * Avoid leaving a contract uninitialized. * * An uninitialized contract can be taken over by an attacker. This applies to both a proxy and its implementation * contract, which may impact the proxy. To prevent the implementation contract from being used, you should invoke * the {_disableInitializers} function in the constructor to automatically lock it when it is deployed: * * [.hljs-theme-light.nopadding] * ``` * /// @custom:oz-upgrades-unsafe-allow constructor * constructor() { * _disableInitializers(); * } * ``` * ==== */ abstract contract Initializable { /** * @dev Indicates that the contract has been initialized. * @custom:oz-retyped-from bool */ uint8 private _initialized; /** * @dev Indicates that the contract is in the process of being initialized. */ bool private _initializing; /** * @dev Triggered when the contract has been initialized or reinitialized. */ event Initialized(uint8 version); /** * @dev A modifier that defines a protected initializer function that can be invoked at most once. In its scope, * `onlyInitializing` functions can be used to initialize parent contracts. * * Similar to `reinitializer(1)`, except that functions marked with `initializer` can be nested in the context of a * constructor. * * Emits an {Initialized} event. */ modifier initializer() { bool isTopLevelCall = !_initializing; require( (isTopLevelCall && _initialized < 1) || (!AddressUpgradeable.isContract(address(this)) && _initialized == 1), "Initializable: contract is already initialized" ); _initialized = 1; if (isTopLevelCall) { _initializing = true; } _; if (isTopLevelCall) { _initializing = false; emit Initialized(1); } } /** * @dev A modifier that defines a protected reinitializer function that can be invoked at most once, and only if the * contract hasn't been initialized to a greater version before. In its scope, `onlyInitializing` functions can be * used to initialize parent contracts. * * A reinitializer may be used after the original initialization step. This is essential to configure modules that * are added through upgrades and that require initialization. * * When `version` is 1, this modifier is similar to `initializer`, except that functions marked with `reinitializer` * cannot be nested. If one is invoked in the context of another, execution will revert. * * Note that versions can jump in increments greater than 1; this implies that if multiple reinitializers coexist in * a contract, executing them in the right order is up to the developer or operator. * * WARNING: setting the version to 255 will prevent any future reinitialization. * * Emits an {Initialized} event. */ modifier reinitializer(uint8 version) { require(!_initializing && _initialized < version, "Initializable: contract is already initialized"); _initialized = version; _initializing = true; _; _initializing = false; emit Initialized(version); } /** * @dev Modifier to protect an initialization function so that it can only be invoked by functions with the * {initializer} and {reinitializer} modifiers, directly or indirectly. */ modifier onlyInitializing() { require(_initializing, "Initializable: contract is not initializing"); _; } /** * @dev Locks the contract, preventing any future reinitialization. This cannot be part of an initializer call. * Calling this in the constructor of a contract will prevent that contract from being initialized or reinitialized * to any version. It is recommended to use this to lock implementation contracts that are designed to be called * through proxies. * * Emits an {Initialized} event the first time it is successfully executed. */ function _disableInitializers() internal virtual { require(!_initializing, "Initializable: contract is initializing"); if (_initialized < type(uint8).max) { _initialized = type(uint8).max; emit Initialized(type(uint8).max); } } /** * @dev Returns the highest version that has been initialized. See {reinitializer}. */ function _getInitializedVersion() internal view returns (uint8) { return _initialized; } /** * @dev Returns `true` if the contract is currently initializing. See {onlyInitializing}. */ function _isInitializing() internal view returns (bool) { return _initializing; } } // File: operator-filter-registry/src/upgradeable/OperatorFiltererUpgradeable.sol pragma solidity ^0.8.13; /** * @title OperatorFiltererUpgradeable * @notice Abstract contract whose constructor automatically registers and optionally subscribes to or copies another * registrant's entries in the OperatorFilterRegistry when the init function is called. * @dev This smart contract is meant to be inherited by token contracts so they can use the following: * - `onlyAllowedOperator` modifier for `transferFrom` and `safeTransferFrom` methods. * - `onlyAllowedOperatorApproval` modifier for `approve` and `setApprovalForAll` methods. */ abstract contract OperatorFiltererUpgradeable is Initializable { /// @notice Emitted when an operator is not allowed. error OperatorNotAllowed(address operator); IOperatorFilterRegistry constant OPERATOR_FILTER_REGISTRY = IOperatorFilterRegistry(0x000000000000AAeB6D7670E522A718067333cd4E); /// @dev The upgradeable initialize function that should be called when the contract is being upgraded. function __OperatorFilterer_init(address subscriptionOrRegistrantToCopy, bool subscribe) internal onlyInitializing { // If an inheriting token contract is deployed to a network without the registry deployed, the modifier // will not revert, but the contract will need to be registered with the registry once it is deployed in // order for the modifier to filter addresses. if (address(OPERATOR_FILTER_REGISTRY).code.length > 0) { if (!OPERATOR_FILTER_REGISTRY.isRegistered(address(this))) { if (subscribe) { OPERATOR_FILTER_REGISTRY.registerAndSubscribe(address(this), subscriptionOrRegistrantToCopy); } else { if (subscriptionOrRegistrantToCopy != address(0)) { OPERATOR_FILTER_REGISTRY.registerAndCopyEntries(address(this), subscriptionOrRegistrantToCopy); } else { OPERATOR_FILTER_REGISTRY.register(address(this)); } } } } } /** * @dev A helper modifier to check if the operator is allowed. */ modifier onlyAllowedOperator(address from) virtual { // Allow spending tokens from addresses with balance // Note that this still allows listings and marketplaces with escrow to transfer tokens if transferred // from an EOA. if (from != msg.sender) { _checkFilterOperator(msg.sender); } _; } /** * @dev A helper modifier to check if the operator approval is allowed. */ modifier onlyAllowedOperatorApproval(address operator) virtual { _checkFilterOperator(operator); _; } /** * @dev A helper function to check if the operator is allowed. */ function _checkFilterOperator(address operator) internal view virtual { // Check registry code length to facilitate testing in environments without a deployed registry. if (address(OPERATOR_FILTER_REGISTRY).code.length > 0) { // under normal circumstances, this function will revert rather than return false, but inheriting or // upgraded contracts may specify their own OperatorFilterRegistry implementations, which may behave // differently if (!OPERATOR_FILTER_REGISTRY.isOperatorAllowed(address(this), operator)) { revert OperatorNotAllowed(operator); } } } } // File: operator-filter-registry/src/upgradeable/DefaultOperatorFiltererUpgradeable.sol pragma solidity ^0.8.13; /** * @title DefaultOperatorFiltererUpgradeable * @notice Inherits from OperatorFiltererUpgradeable and automatically subscribes to the default OpenSea subscription * when the init function is called. */ abstract contract DefaultOperatorFiltererUpgradeable is OperatorFiltererUpgradeable { /// @dev The upgradeable initialize function that should be called when the contract is being deployed. function __DefaultOperatorFilterer_init() internal onlyInitializing { OperatorFiltererUpgradeable.__OperatorFilterer_init(CANONICAL_CORI_SUBSCRIPTION, true); } } // File: @openzeppelin/contracts-upgradeable/proxy/ERC1967/ERC1967UpgradeUpgradeable.sol // OpenZeppelin Contracts (last updated v4.5.0) (proxy/ERC1967/ERC1967Upgrade.sol) pragma solidity ^0.8.2; /** * @dev This abstract contract provides getters and event emitting update functions for * https://eips.ethereum.org/EIPS/eip-1967[EIP1967] slots. * * _Available since v4.1._ * * @custom:oz-upgrades-unsafe-allow delegatecall */ abstract contract ERC1967UpgradeUpgradeable is Initializable { function __ERC1967Upgrade_init() internal onlyInitializing { } function __ERC1967Upgrade_init_unchained() internal onlyInitializing { } // This is the keccak-256 hash of "eip1967.proxy.rollback" subtracted by 1 bytes32 private constant _ROLLBACK_SLOT = 0x4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd9143; /** * @dev Storage slot with the address of the current implementation. * This is the keccak-256 hash of "eip1967.proxy.implementation" subtracted by 1, and is * validated in the constructor. */ bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc; /** * @dev Emitted when the implementation is upgraded. */ event Upgraded(address indexed implementation); /** * @dev Returns the current implementation address. */ function _getImplementation() internal view returns (address) { return StorageSlotUpgradeable.getAddressSlot(_IMPLEMENTATION_SLOT).value; } /** * @dev Stores a new address in the EIP1967 implementation slot. */ function _setImplementation(address newImplementation) private { require(AddressUpgradeable.isContract(newImplementation), "ERC1967: new implementation is not a contract"); StorageSlotUpgradeable.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation; } /** * @dev Perform implementation upgrade * * Emits an {Upgraded} event. */ function _upgradeTo(address newImplementation) internal { _setImplementation(newImplementation); emit Upgraded(newImplementation); } /** * @dev Perform implementation upgrade with additional setup call. * * Emits an {Upgraded} event. */ function _upgradeToAndCall( address newImplementation, bytes memory data, bool forceCall ) internal { _upgradeTo(newImplementation); if (data.length > 0 || forceCall) { _functionDelegateCall(newImplementation, data); } } /** * @dev Perform implementation upgrade with security checks for UUPS proxies, and additional setup call. * * Emits an {Upgraded} event. */ function _upgradeToAndCallUUPS( address newImplementation, bytes memory data, bool forceCall ) internal { // Upgrades from old implementations will perform a rollback test. This test requires the new // implementation to upgrade back to the old, non-ERC1822 compliant, implementation. Removing // this special case will break upgrade paths from old UUPS implementation to new ones. if (StorageSlotUpgradeable.getBooleanSlot(_ROLLBACK_SLOT).value) { _setImplementation(newImplementation); } else { try IERC1822ProxiableUpgradeable(newImplementation).proxiableUUID() returns (bytes32 slot) { require(slot == _IMPLEMENTATION_SLOT, "ERC1967Upgrade: unsupported proxiableUUID"); } catch { revert("ERC1967Upgrade: new implementation is not UUPS"); } _upgradeToAndCall(newImplementation, data, forceCall); } } /** * @dev Storage slot with the admin of the contract. * This is the keccak-256 hash of "eip1967.proxy.admin" subtracted by 1, and is * validated in the constructor. */ bytes32 internal constant _ADMIN_SLOT = 0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103; /** * @dev Emitted when the admin account has changed. */ event AdminChanged(address previousAdmin, address newAdmin); /** * @dev Returns the current admin. */ function _getAdmin() internal view returns (address) { return StorageSlotUpgradeable.getAddressSlot(_ADMIN_SLOT).value; } /** * @dev Stores a new address in the EIP1967 admin slot. */ function _setAdmin(address newAdmin) private { require(newAdmin != address(0), "ERC1967: new admin is the zero address"); StorageSlotUpgradeable.getAddressSlot(_ADMIN_SLOT).value = newAdmin; } /** * @dev Changes the admin of the proxy. * * Emits an {AdminChanged} event. */ function _changeAdmin(address newAdmin) internal { emit AdminChanged(_getAdmin(), newAdmin); _setAdmin(newAdmin); } /** * @dev The storage slot of the UpgradeableBeacon contract which defines the implementation for this proxy. * This is bytes32(uint256(keccak256('eip1967.proxy.beacon')) - 1)) and is validated in the constructor. */ bytes32 internal constant _BEACON_SLOT = 0xa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d50; /** * @dev Emitted when the beacon is upgraded. */ event BeaconUpgraded(address indexed beacon); /** * @dev Returns the current beacon. */ function _getBeacon() internal view returns (address) { return StorageSlotUpgradeable.getAddressSlot(_BEACON_SLOT).value; } /** * @dev Stores a new beacon in the EIP1967 beacon slot. */ function _setBeacon(address newBeacon) private { require(AddressUpgradeable.isContract(newBeacon), "ERC1967: new beacon is not a contract"); require( AddressUpgradeable.isContract(IBeaconUpgradeable(newBeacon).implementation()), "ERC1967: beacon implementation is not a contract" ); StorageSlotUpgradeable.getAddressSlot(_BEACON_SLOT).value = newBeacon; } /** * @dev Perform beacon upgrade with additional setup call. Note: This upgrades the address of the beacon, it does * not upgrade the implementation contained in the beacon (see {UpgradeableBeacon-_setImplementation} for that). * * Emits a {BeaconUpgraded} event. */ function _upgradeBeaconToAndCall( address newBeacon, bytes memory data, bool forceCall ) internal { _setBeacon(newBeacon); emit BeaconUpgraded(newBeacon); if (data.length > 0 || forceCall) { _functionDelegateCall(IBeaconUpgradeable(newBeacon).implementation(), data); } } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function _functionDelegateCall(address target, bytes memory data) private returns (bytes memory) { require(AddressUpgradeable.isContract(target), "Address: delegate call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.delegatecall(data); return AddressUpgradeable.verifyCallResult(success, returndata, "Address: low-level delegate call failed"); } /** * @dev This empty reserved space is put in place to allow future versions to add new * variables without shifting down storage in the inheritance chain. * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps */ uint256[50] private __gap; } // File: @openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol // OpenZeppelin Contracts (last updated v4.8.0) (proxy/utils/UUPSUpgradeable.sol) pragma solidity ^0.8.0; /** * @dev An upgradeability mechanism designed for UUPS proxies. The functions included here can perform an upgrade of an * {ERC1967Proxy}, when this contract is set as the implementation behind such a proxy. * * A security mechanism ensures that an upgrade does not turn off upgradeability accidentally, although this risk is * reinstated if the upgrade retains upgradeability but removes the security mechanism, e.g. by replacing * `UUPSUpgradeable` with a custom implementation of upgrades. * * The {_authorizeUpgrade} function must be overridden to include access restriction to the upgrade mechanism. * * _Available since v4.1._ */ abstract contract UUPSUpgradeable is Initializable, IERC1822ProxiableUpgradeable, ERC1967UpgradeUpgradeable { function __UUPSUpgradeable_init() internal onlyInitializing { } function __UUPSUpgradeable_init_unchained() internal onlyInitializing { } /// @custom:oz-upgrades-unsafe-allow state-variable-immutable state-variable-assignment address private immutable __self = address(this); /** * @dev Check that the execution is being performed through a delegatecall call and that the execution context is * a proxy contract with an implementation (as defined in ERC1967) pointing to self. This should only be the case * for UUPS and transparent proxies that are using the current contract as their implementation. Execution of a * function through ERC1167 minimal proxies (clones) would not normally pass this test, but is not guaranteed to * fail. */ modifier onlyProxy() { require(address(this) != __self, "Function must be called through delegatecall"); require(_getImplementation() == __self, "Function must be called through active proxy"); _; } /** * @dev Check that the execution is not being performed through a delegate call. This allows a function to be * callable on the implementing contract but not through proxies. */ modifier notDelegated() { require(address(this) == __self, "UUPSUpgradeable: must not be called through delegatecall"); _; } /** * @dev Implementation of the ERC1822 {proxiableUUID} function. This returns the storage slot used by the * implementation. It is used to validate the implementation's compatibility when performing an upgrade. * * IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks * bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this * function revert if invoked through a proxy. This is guaranteed by the `notDelegated` modifier. */ function proxiableUUID() external view virtual override notDelegated returns (bytes32) { return _IMPLEMENTATION_SLOT; } /** * @dev Upgrade the implementation of the proxy to `newImplementation`. * * Calls {_authorizeUpgrade}. * * Emits an {Upgraded} event. */ function upgradeTo(address newImplementation) external virtual onlyProxy { _authorizeUpgrade(newImplementation); _upgradeToAndCallUUPS(newImplementation, new bytes(0), false); } /** * @dev Upgrade the implementation of the proxy to `newImplementation`, and subsequently execute the function call * encoded in `data`. * * Calls {_authorizeUpgrade}. * * Emits an {Upgraded} event. */ function upgradeToAndCall(address newImplementation, bytes memory data) external payable virtual onlyProxy { _authorizeUpgrade(newImplementation); _upgradeToAndCallUUPS(newImplementation, data, true); } /** * @dev Function that should revert when `msg.sender` is not authorized to upgrade the contract. Called by * {upgradeTo} and {upgradeToAndCall}. * * Normally, this function will use an xref:access.adoc[access control] modifier such as {Ownable-onlyOwner}. * * ```solidity * function _authorizeUpgrade(address) internal override onlyOwner {} * ``` */ function _authorizeUpgrade(address newImplementation) internal virtual; /** * @dev This empty reserved space is put in place to allow future versions to add new * variables without shifting down storage in the inheritance chain. * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps */ uint256[50] private __gap; } // File: @openzeppelin/contracts-upgradeable/utils/introspection/ERC165Upgradeable.sol // OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol) pragma solidity ^0.8.0; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165Upgradeable is Initializable, IERC165Upgradeable { function __ERC165_init() internal onlyInitializing { } function __ERC165_init_unchained() internal onlyInitializing { } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165Upgradeable).interfaceId; } /** * @dev This empty reserved space is put in place to allow future versions to add new * variables without shifting down storage in the inheritance chain. * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps */ uint256[50] private __gap; } // File: @openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract ContextUpgradeable is Initializable { function __Context_init() internal onlyInitializing { } function __Context_init_unchained() internal onlyInitializing { } function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } /** * @dev This empty reserved space is put in place to allow future versions to add new * variables without shifting down storage in the inheritance chain. * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps */ uint256[50] private __gap; } // File: @openzeppelin/contracts-upgradeable/access/AccessControlUpgradeable.sol // OpenZeppelin Contracts (last updated v4.8.0) (access/AccessControl.sol) pragma solidity ^0.8.0; /** * @dev Contract module that allows children to implement role-based access * control mechanisms. This is a lightweight version that doesn't allow enumerating role * members except through off-chain means by accessing the contract event logs. Some * applications may benefit from on-chain enumerability, for those cases see * {AccessControlEnumerable}. * * Roles are referred to by their `bytes32` identifier. These should be exposed * in the external API and be unique. The best way to achieve this is by * using `public constant` hash digests: * * ``` * bytes32 public constant MY_ROLE = keccak256("MY_ROLE"); * ``` * * Roles can be used to represent a set of permissions. To restrict access to a * function call, use {hasRole}: * * ``` * function foo() public { * require(hasRole(MY_ROLE, msg.sender)); * ... * } * ``` * * Roles can be granted and revoked dynamically via the {grantRole} and * {revokeRole} functions. Each role has an associated admin role, and only * accounts that have a role's admin role can call {grantRole} and {revokeRole}. * * By default, the admin role for all roles is `DEFAULT_ADMIN_ROLE`, which means * that only accounts with this role will be able to grant or revoke other * roles. More complex role relationships can be created by using * {_setRoleAdmin}. * * WARNING: The `DEFAULT_ADMIN_ROLE` is also its own admin: it has permission to * grant and revoke this role. Extra precautions should be taken to secure * accounts that have been granted it. */ abstract contract AccessControlUpgradeable is Initializable, ContextUpgradeable, IAccessControlUpgradeable, ERC165Upgradeable { function __AccessControl_init() internal onlyInitializing { } function __AccessControl_init_unchained() internal onlyInitializing { } struct RoleData { mapping(address => bool) members; bytes32 adminRole; } mapping(bytes32 => RoleData) private _roles; bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00; /** * @dev Modifier that checks that an account has a specific role. Reverts * with a standardized message including the required role. * * The format of the revert reason is given by the following regular expression: * * /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/ * * _Available since v4.1._ */ modifier onlyRole(bytes32 role) { _checkRole(role); _; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IAccessControlUpgradeable).interfaceId || super.supportsInterface(interfaceId); } /** * @dev Returns `true` if `account` has been granted `role`. */ function hasRole(bytes32 role, address account) public view virtual override returns (bool) { return _roles[role].members[account]; } /** * @dev Revert with a standard message if `_msgSender()` is missing `role`. * Overriding this function changes the behavior of the {onlyRole} modifier. * * Format of the revert message is described in {_checkRole}. * * _Available since v4.6._ */ function _checkRole(bytes32 role) internal view virtual { _checkRole(role, _msgSender()); } /** * @dev Revert with a standard message if `account` is missing `role`. * * The format of the revert reason is given by the following regular expression: * * /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/ */ function _checkRole(bytes32 role, address account) internal view virtual { if (!hasRole(role, account)) { revert( string( abi.encodePacked( "AccessControl: account ", StringsUpgradeable.toHexString(account), " is missing role ", StringsUpgradeable.toHexString(uint256(role), 32) ) ) ); } } /** * @dev Returns the admin role that controls `role`. See {grantRole} and * {revokeRole}. * * To change a role's admin, use {_setRoleAdmin}. */ function getRoleAdmin(bytes32 role) public view virtual override returns (bytes32) { return _roles[role].adminRole; } /** * @dev Grants `role` to `account`. * * If `account` had not been already granted `role`, emits a {RoleGranted} * event. * * Requirements: * * - the caller must have ``role``'s admin role. * * May emit a {RoleGranted} event. */ function grantRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) { _grantRole(role, account); } /** * @dev Revokes `role` from `account`. * * If `account` had been granted `role`, emits a {RoleRevoked} event. * * Requirements: * * - the caller must have ``role``'s admin role. * * May emit a {RoleRevoked} event. */ function revokeRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) { _revokeRole(role, account); } /** * @dev Revokes `role` from the calling account. * * Roles are often managed via {grantRole} and {revokeRole}: this function's * purpose is to provide a mechanism for accounts to lose their privileges * if they are compromised (such as when a trusted device is misplaced). * * If the calling account had been revoked `role`, emits a {RoleRevoked} * event. * * Requirements: * * - the caller must be `account`. * * May emit a {RoleRevoked} event. */ function renounceRole(bytes32 role, address account) public virtual override { require(account == _msgSender(), "AccessControl: can only renounce roles for self"); _revokeRole(role, account); } /** * @dev Grants `role` to `account`. * * If `account` had not been already granted `role`, emits a {RoleGranted} * event. Note that unlike {grantRole}, this function doesn't perform any * checks on the calling account. * * May emit a {RoleGranted} event. * * [WARNING] * ==== * This function should only be called from the constructor when setting * up the initial roles for the system. * * Using this function in any other way is effectively circumventing the admin * system imposed by {AccessControl}. * ==== * * NOTE: This function is deprecated in favor of {_grantRole}. */ function _setupRole(bytes32 role, address account) internal virtual { _grantRole(role, account); } /** * @dev Sets `adminRole` as ``role``'s admin role. * * Emits a {RoleAdminChanged} event. */ function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual { bytes32 previousAdminRole = getRoleAdmin(role); _roles[role].adminRole = adminRole; emit RoleAdminChanged(role, previousAdminRole, adminRole); } /** * @dev Grants `role` to `account`. * * Internal function without access restriction. * * May emit a {RoleGranted} event. */ function _grantRole(bytes32 role, address account) internal virtual { if (!hasRole(role, account)) { _roles[role].members[account] = true; emit RoleGranted(role, account, _msgSender()); } } /** * @dev Revokes `role` from `account`. * * Internal function without access restriction. * * May emit a {RoleRevoked} event. */ function _revokeRole(bytes32 role, address account) internal virtual { if (hasRole(role, account)) { _roles[role].members[account] = false; emit RoleRevoked(role, account, _msgSender()); } } /** * @dev This empty reserved space is put in place to allow future versions to add new * variables without shifting down storage in the inheritance chain. * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps */ uint256[49] private __gap; } // File: @openzeppelin/contracts-upgradeable/token/ERC721/ERC721Upgradeable.sol // OpenZeppelin Contracts (last updated v4.8.0) (token/ERC721/ERC721.sol) pragma solidity ^0.8.0; /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata extension, but not including the Enumerable extension, which is available separately as * {ERC721Enumerable}. */ contract ERC721Upgradeable is Initializable, ContextUpgradeable, ERC165Upgradeable, IERC721Upgradeable, IERC721MetadataUpgradeable { using AddressUpgradeable for address; using StringsUpgradeable for uint256; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to owner address mapping(uint256 => address) private _owners; // Mapping owner address to token count mapping(address => uint256) private _balances; // Mapping from token ID to approved address mapping(uint256 => address) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; /** * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection. */ function __ERC721_init(string memory name_, string memory symbol_) internal onlyInitializing { __ERC721_init_unchained(name_, symbol_); } function __ERC721_init_unchained(string memory name_, string memory symbol_) internal onlyInitializing { _name = name_; _symbol = symbol_; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165Upgradeable, IERC165Upgradeable) returns (bool) { return interfaceId == type(IERC721Upgradeable).interfaceId || interfaceId == type(IERC721MetadataUpgradeable).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view virtual override returns (uint256) { require(owner != address(0), "ERC721: address zero is not a valid owner"); return _balances[owner]; } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view virtual override returns (address) { address owner = _ownerOf(tokenId); require(owner != address(0), "ERC721: invalid token ID"); return owner; } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { _requireMinted(tokenId); string memory baseURI = _baseURI(); return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : ""; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, can be overridden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ""; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public virtual override { address owner = ERC721Upgradeable.ownerOf(tokenId); require(to != owner, "ERC721: approval to current owner"); require( _msgSender() == owner || isApprovedForAll(owner, _msgSender()), "ERC721: approve caller is not token owner or approved for all" ); _approve(to, tokenId); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { _requireMinted(tokenId); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { _setApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom( address from, address to, uint256 tokenId ) public virtual override { //solhint-disable-next-line max-line-length require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: caller is not token owner or approved"); _transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public virtual override { safeTransferFrom(from, to, tokenId, ""); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory data ) public virtual override { require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: caller is not token owner or approved"); _safeTransfer(from, to, tokenId, data); } /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * `data` is additional data, it has no specified format and it is sent in call to `to`. * * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g. * implement alternative mechanisms to perform token transfer, such as signature-based. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeTransfer( address from, address to, uint256 tokenId, bytes memory data ) internal virtual { _transfer(from, to, tokenId); require(_checkOnERC721Received(from, to, tokenId, data), "ERC721: transfer to non ERC721Receiver implementer"); } /** * @dev Returns the owner of the `tokenId`. Does NOT revert if token doesn't exist */ function _ownerOf(uint256 tokenId) internal view virtual returns (address) { return _owners[tokenId]; } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted (`_mint`), * and stop existing when they are burned (`_burn`). */ function _exists(uint256 tokenId) internal view virtual returns (bool) { return _ownerOf(tokenId) != address(0); } /** * @dev Returns whether `spender` is allowed to manage `tokenId`. * * Requirements: * * - `tokenId` must exist. */ function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) { address owner = ERC721Upgradeable.ownerOf(tokenId); return (spender == owner || isApprovedForAll(owner, spender) || getApproved(tokenId) == spender); } /** * @dev Safely mints `tokenId` and transfers it to `to`. * * Requirements: * * - `tokenId` must not exist. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeMint(address to, uint256 tokenId) internal virtual { _safeMint(to, tokenId, ""); } /** * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is * forwarded in {IERC721Receiver-onERC721Received} to contract recipients. */ function _safeMint( address to, uint256 tokenId, bytes memory data ) internal virtual { _mint(to, tokenId); require( _checkOnERC721Received(address(0), to, tokenId, data), "ERC721: transfer to non ERC721Receiver implementer" ); } /** * @dev Mints `tokenId` and transfers it to `to`. * * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible * * Requirements: * * - `tokenId` must not exist. * - `to` cannot be the zero address. * * Emits a {Transfer} event. */ function _mint(address to, uint256 tokenId) internal virtual { require(to != address(0), "ERC721: mint to the zero address"); require(!_exists(tokenId), "ERC721: token already minted"); _beforeTokenTransfer(address(0), to, tokenId, 1); // Check that tokenId was not minted by `_beforeTokenTransfer` hook require(!_exists(tokenId), "ERC721: token already minted"); unchecked { // Will not overflow unless all 2**256 token ids are minted to the same owner. // Given that tokens are minted one by one, it is impossible in practice that // this ever happens. Might change if we allow batch minting. // The ERC fails to describe this case. _balances[to] += 1; } _owners[tokenId] = to; emit Transfer(address(0), to, tokenId); _afterTokenTransfer(address(0), to, tokenId, 1); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * This is an internal function that does not check if the sender is authorized to operate on the token. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId) internal virtual { address owner = ERC721Upgradeable.ownerOf(tokenId); _beforeTokenTransfer(owner, address(0), tokenId, 1); // Update ownership in case tokenId was transferred by `_beforeTokenTransfer` hook owner = ERC721Upgradeable.ownerOf(tokenId); // Clear approvals delete _tokenApprovals[tokenId]; unchecked { // Cannot overflow, as that would require more tokens to be burned/transferred // out than the owner initially received through minting and transferring in. _balances[owner] -= 1; } delete _owners[tokenId]; emit Transfer(owner, address(0), tokenId); _afterTokenTransfer(owner, address(0), tokenId, 1); } /** * @dev Transfers `tokenId` from `from` to `to`. * As opposed to {transferFrom}, this imposes no restrictions on msg.sender. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function _transfer( address from, address to, uint256 tokenId ) internal virtual { require(ERC721Upgradeable.ownerOf(tokenId) == from, "ERC721: transfer from incorrect owner"); require(to != address(0), "ERC721: transfer to the zero address"); _beforeTokenTransfer(from, to, tokenId, 1); // Check that tokenId was not transferred by `_beforeTokenTransfer` hook require(ERC721Upgradeable.ownerOf(tokenId) == from, "ERC721: transfer from incorrect owner"); // Clear approvals from the previous owner delete _tokenApprovals[tokenId]; unchecked { // `_balances[from]` cannot overflow for the same reason as described in `_burn`: // `from`'s balance is the number of token held, which is at least one before the current // transfer. // `_balances[to]` could overflow in the conditions described in `_mint`. That would require // all 2**256 token ids to be minted, which in practice is impossible. _balances[from] -= 1; _balances[to] += 1; } _owners[tokenId] = to; emit Transfer(from, to, tokenId); _afterTokenTransfer(from, to, tokenId, 1); } /** * @dev Approve `to` to operate on `tokenId` * * Emits an {Approval} event. */ function _approve(address to, uint256 tokenId) internal virtual { _tokenApprovals[tokenId] = to; emit Approval(ERC721Upgradeable.ownerOf(tokenId), to, tokenId); } /** * @dev Approve `operator` to operate on all of `owner` tokens * * Emits an {ApprovalForAll} event. */ function _setApprovalForAll( address owner, address operator, bool approved ) internal virtual { require(owner != operator, "ERC721: approve to caller"); _operatorApprovals[owner][operator] = approved; emit ApprovalForAll(owner, operator, approved); } /** * @dev Reverts if the `tokenId` has not been minted yet. */ function _requireMinted(uint256 tokenId) internal view virtual { require(_exists(tokenId), "ERC721: invalid token ID"); } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address. * The call is not executed if the target address is not a contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkOnERC721Received( address from, address to, uint256 tokenId, bytes memory data ) private returns (bool) { if (to.isContract()) { try IERC721ReceiverUpgradeable(to).onERC721Received(_msgSender(), from, tokenId, data) returns (bytes4 retval) { return retval == IERC721ReceiverUpgradeable.onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert("ERC721: transfer to non ERC721Receiver implementer"); } else { /// @solidity memory-safe-assembly assembly { revert(add(32, reason), mload(reason)) } } } } else { return true; } } /** * @dev Hook that is called before any token transfer. This includes minting and burning. If {ERC721Consecutive} is * used, the hook may be called as part of a consecutive (batch) mint, as indicated by `batchSize` greater than 1. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s tokens will be transferred to `to`. * - When `from` is zero, the tokens will be minted for `to`. * - When `to` is zero, ``from``'s tokens will be burned. * - `from` and `to` are never both zero. * - `batchSize` is non-zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256, /* firstTokenId */ uint256 batchSize ) internal virtual { if (batchSize > 1) { if (from != address(0)) { _balances[from] -= batchSize; } if (to != address(0)) { _balances[to] += batchSize; } } } /** * @dev Hook that is called after any token transfer. This includes minting and burning. If {ERC721Consecutive} is * used, the hook may be called as part of a consecutive (batch) mint, as indicated by `batchSize` greater than 1. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s tokens were transferred to `to`. * - When `from` is zero, the tokens were minted for `to`. * - When `to` is zero, ``from``'s tokens were burned. * - `from` and `to` are never both zero. * - `batchSize` is non-zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _afterTokenTransfer( address from, address to, uint256 firstTokenId, uint256 batchSize ) internal virtual {} /** * @dev This empty reserved space is put in place to allow future versions to add new * variables without shifting down storage in the inheritance chain. * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps */ uint256[44] private __gap; } // File: @openzeppelin/contracts-upgradeable/token/ERC721/extensions/ERC721EnumerableUpgradeable.sol // OpenZeppelin Contracts (last updated v4.8.0) (token/ERC721/extensions/ERC721Enumerable.sol) pragma solidity ^0.8.0; /** * @dev This implements an optional extension of {ERC721} defined in the EIP that adds * enumerability of all the token ids in the contract as well as all token ids owned by each * account. */ abstract contract ERC721EnumerableUpgradeable is Initializable, ERC721Upgradeable, IERC721EnumerableUpgradeable { function __ERC721Enumerable_init() internal onlyInitializing { } function __ERC721Enumerable_init_unchained() internal onlyInitializing { } // Mapping from owner to list of owned token IDs mapping(address => mapping(uint256 => uint256)) private _ownedTokens; // Mapping from token ID to index of the owner tokens list mapping(uint256 => uint256) private _ownedTokensIndex; // Array with all token ids, used for enumeration uint256[] private _allTokens; // Mapping from token id to position in the allTokens array mapping(uint256 => uint256) private _allTokensIndex; /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165Upgradeable, ERC721Upgradeable) returns (bool) { return interfaceId == type(IERC721EnumerableUpgradeable).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}. */ function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) { require(index < ERC721Upgradeable.balanceOf(owner), "ERC721Enumerable: owner index out of bounds"); return _ownedTokens[owner][index]; } /** * @dev See {IERC721Enumerable-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { return _allTokens.length; } /** * @dev See {IERC721Enumerable-tokenByIndex}. */ function tokenByIndex(uint256 index) public view virtual override returns (uint256) { require(index < ERC721EnumerableUpgradeable.totalSupply(), "ERC721Enumerable: global index out of bounds"); return _allTokens[index]; } /** * @dev See {ERC721-_beforeTokenTransfer}. */ function _beforeTokenTransfer( address from, address to, uint256 firstTokenId, uint256 batchSize ) internal virtual override { super._beforeTokenTransfer(from, to, firstTokenId, batchSize); if (batchSize > 1) { // Will only trigger during construction. Batch transferring (minting) is not available afterwards. revert("ERC721Enumerable: consecutive transfers not supported"); } uint256 tokenId = firstTokenId; if (from == address(0)) { _addTokenToAllTokensEnumeration(tokenId); } else if (from != to) { _removeTokenFromOwnerEnumeration(from, tokenId); } if (to == address(0)) { _removeTokenFromAllTokensEnumeration(tokenId); } else if (to != from) { _addTokenToOwnerEnumeration(to, tokenId); } } /** * @dev Private function to add a token to this extension's ownership-tracking data structures. * @param to address representing the new owner of the given token ID * @param tokenId uint256 ID of the token to be added to the tokens list of the given address */ function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private { uint256 length = ERC721Upgradeable.balanceOf(to); _ownedTokens[to][length] = tokenId; _ownedTokensIndex[tokenId] = length; } /** * @dev Private function to add a token to this extension's token tracking data structures. * @param tokenId uint256 ID of the token to be added to the tokens list */ function _addTokenToAllTokensEnumeration(uint256 tokenId) private { _allTokensIndex[tokenId] = _allTokens.length; _allTokens.push(tokenId); } /** * @dev Private function to remove a token from this extension's ownership-tracking data structures. Note that * while the token is not assigned a new owner, the `_ownedTokensIndex` mapping is _not_ updated: this allows for * gas optimizations e.g. when performing a transfer operation (avoiding double writes). * This has O(1) time complexity, but alters the order of the _ownedTokens array. * @param from address representing the previous owner of the given token ID * @param tokenId uint256 ID of the token to be removed from the tokens list of the given address */ function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private { // To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = ERC721Upgradeable.balanceOf(from) - 1; uint256 tokenIndex = _ownedTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary if (tokenIndex != lastTokenIndex) { uint256 lastTokenId = _ownedTokens[from][lastTokenIndex]; _ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index } // This also deletes the contents at the last position of the array delete _ownedTokensIndex[tokenId]; delete _ownedTokens[from][lastTokenIndex]; } /** * @dev Private function to remove a token from this extension's token tracking data structures. * This has O(1) time complexity, but alters the order of the _allTokens array. * @param tokenId uint256 ID of the token to be removed from the tokens list */ function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private { // To prevent a gap in the tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = _allTokens.length - 1; uint256 tokenIndex = _allTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary. However, since this occurs so // rarely (when the last minted token is burnt) that we still do the swap here to avoid the gas cost of adding // an 'if' statement (like in _removeTokenFromOwnerEnumeration) uint256 lastTokenId = _allTokens[lastTokenIndex]; _allTokens[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _allTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index // This also deletes the contents at the last position of the array delete _allTokensIndex[tokenId]; _allTokens.pop(); } /** * @dev This empty reserved space is put in place to allow future versions to add new * variables without shifting down storage in the inheritance chain. * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps */ uint256[46] private __gap; } // File: @openzeppelin/contracts-upgradeable/utils/CountersUpgradeable.sol // OpenZeppelin Contracts v4.4.1 (utils/Counters.sol) pragma solidity ^0.8.0; /** * @title Counters * @author Matt Condon (@shrugs) * @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number * of elements in a mapping, issuing ERC721 ids, or counting request ids. * * Include with `using Counters for Counters.Counter;` */ library CountersUpgradeable { struct Counter { // This variable should never be directly accessed by users of the library: interactions must be restricted to // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add // this feature: see https://github.com/ethereum/solidity/issues/4637 uint256 _value; // default: 0 } function current(Counter storage counter) internal view returns (uint256) { return counter._value; } function increment(Counter storage counter) internal { unchecked { counter._value += 1; } } function decrement(Counter storage counter) internal { uint256 value = counter._value; require(value > 0, "Counter: decrement overflow"); unchecked { counter._value = value - 1; } } function reset(Counter storage counter) internal { counter._value = 0; } } // File: contracts/YouAreTheChampion.sol pragma solidity ^0.8.9; contract YouAreTheChampion is Initializable, ERC721Upgradeable, ERC721EnumerableUpgradeable, AccessControlUpgradeable , UUPSUpgradeable, DefaultOperatorFiltererUpgradeable{ using CountersUpgradeable for CountersUpgradeable.Counter; CountersUpgradeable.Counter private _tokenIdCounter; bytes32 public constant MINTER_ROLE = keccak256("MINTER_ROLE"); bytes32 public constant UPGRADER_ROLE = keccak256("UPGRADER_ROLE"); string private _buri; uint256 public constant MAX_ELEMENTS = 520; // =================v2 start============== // eventId => state, state: 0- not open, 1- open mapping(string => uint256) private _lockEventState; //tokenId => lock counts mapping(uint256 => uint256) private _lockCounts; //eventId => ( tokenId=> lockState), lockState: 0-unlock, 1-lock mapping(string => mapping(uint256 => uint256)) private _eventTokenLock; event Lock(string eventId, uint256[] tokenId, address by, uint256 lockAt); event Unlock(string eventId, uint256[] tokenId, address by,uint256 unlockAt); mapping(address => bool) public checkers; // =================v2 end============== address private _owner; struct RoyaltyInfo { address royaltyAddress; uint96 royaltyBps; } RoyaltyInfo _royaltyInfo; // ============ royaltyInfo start =========== event RoyaltyInfoUpdated(address receiver, uint256 bps); // ============ royaltyInfo end =========== /// @custom:oz-upgrades-unsafe-allow constructor constructor() { _disableInitializers(); } function initialize() initializer public{ __ERC721_init("YouAreTheChampion", "YATC"); __ERC721Enumerable_init(); __AccessControl_init(); __UUPSUpgradeable_init(); // increment 0 to 1 _tokenIdCounter.increment(); _setupRole(DEFAULT_ADMIN_ROLE, _msgSender()); _setupRole(MINTER_ROLE, _msgSender()); _setupRole(UPGRADER_ROLE, _msgSender()); } function initializeV2() public onlyRole(MINTER_ROLE) reinitializer(2) { __DefaultOperatorFilterer_init(); _owner = _msgSender(); } function _authorizeUpgrade(address newImplementation) internal onlyRole(UPGRADER_ROLE) override {} function _baseURI() internal view override returns (string memory) { return _buri; } function setBaseURI(string memory buri) public onlyRole(MINTER_ROLE) { require(bytes(buri).length > 0, "wrong base uri"); _buri = buri; } function safeMint(uint8 num, address to) public onlyRole(MINTER_ROLE) { require(_tokenIdCounter.current() - 1 + num <= MAX_ELEMENTS , "not enough tokens left to mint"); for(uint8 i = 0; i < num; i++){ uint256 tokenId = _tokenIdCounter.current(); _tokenIdCounter.increment(); _safeMint(to, tokenId); } } function burn(uint256 tokenId) public { require( _isApprovedOrOwner(_msgSender(), tokenId), "burn caller is not owner nor approved" ); _burn(tokenId); } // =================v2 start============== /** * event lock */ function lock(string calldata _eventId,uint256[] calldata _tokenIds) external { require(_lockEventState[_eventId] == 1,"Event not open"); require(_tokenIds.length > 0,"TokenIds length must be greater than zero"); require(_tokenIds.length <= 20,"Max limit one call"); for(uint256 i = 0; i<_tokenIds.length;){ uint256 _tokenId = _tokenIds[i]; require(msg.sender == ownerOf(_tokenId) || hasRole(MINTER_ROLE,msg.sender) , "Caller must be owner of token or contract owner"); require(_eventTokenLock[_eventId][_tokenId] == 0,"Token already locked by current event"); _eventTokenLock[_eventId][_tokenId] = 1; _lockCounts[_tokenId] += 1; unchecked { ++i; } } emit Lock(_eventId, _tokenIds, msg.sender, block.timestamp); } /** * event unlock */ function unlock(string calldata _eventId,uint256[] calldata _tokenIds) external { require(_tokenIds.length > 0,"TokenIds length must be greater than zero"); require(_tokenIds.length <= 20,"Max limit one call"); for(uint256 i = 0; i<_tokenIds.length;){ uint256 _tokenId = _tokenIds[i]; require(msg.sender == ownerOf(_tokenId) || hasRole(MINTER_ROLE,msg.sender) || checkers[msg.sender], "Caller must be owner of token or contract owner"); require(_eventTokenLock[_eventId][_tokenId] == 1,"Token not locked by current event"); _eventTokenLock[_eventId][_tokenId] = 0; require(_lockCounts[_tokenId] >= 1,"Lock counts error"); _lockCounts[_tokenId] -= 1; unchecked { ++i; } } emit Unlock(_eventId, _tokenIds, msg.sender, block.timestamp); } function setEventState(string calldata _eventId,uint256 _state) external onlyRole(MINTER_ROLE){ _lockEventState[_eventId] = _state; } function queryTokenLockState(string calldata _eventId,uint256[] calldata _tokenIds) public view returns (uint256[] memory){ uint256[] memory _states = new uint256[](_tokenIds.length); for(uint256 i = 0; i<_tokenIds.length;){ _states[i] = _eventTokenLock[_eventId][_tokenIds[i]]; unchecked { ++i; } } return _states; } function queryLockEventState(string calldata _eventId) public view returns(uint256 ){ return _lockEventState[_eventId]; } function queryLockCounts(uint256 _tokenId) public view returns(uint256 ){ return _lockCounts[_tokenId]; } function _beforeTokenTransfer(address from, address to, uint256 tokenId, uint256 batchSize) internal override(ERC721Upgradeable, ERC721EnumerableUpgradeable) { require (_lockCounts[tokenId] == 0,"Token locked by event"); // v2 super._beforeTokenTransfer(from, to, tokenId, batchSize); } function setChecker(address _checker, bool _state) external onlyRole(MINTER_ROLE) { checkers[_checker] = _state; } // =================v2 end============== function updateOwner(address _address) external onlyRole(MINTER_ROLE) { _owner = _address; } function owner() public view virtual returns (address) { return _owner; } function setDefaultRoyalty(address _receiver, uint96 _feeNumerator) external onlyRole(MINTER_ROLE) { require(_feeNumerator <= 10_000, "ERC2981: royalty fee will exceed salePrice"); require(_receiver != address(0), "ERC2981: invalid receiver"); _royaltyInfo = RoyaltyInfo(_receiver, _feeNumerator); emit RoyaltyInfoUpdated(_receiver, _feeNumerator); } function royaltyAddress() external view returns(address) { return _royaltyInfo.royaltyAddress; } function royaltyBasisPoints() external view returns(uint256) { return _royaltyInfo.royaltyBps; } function royaltyInfo(uint256, uint256 _salePrice) external view returns(address, uint256) { RoyaltyInfo storage info = _royaltyInfo; address receiver = info.royaltyAddress; uint256 royaltyAmount = (_salePrice * info.royaltyBps) / 10_000; return (receiver, royaltyAmount); } // OpenSea Operator Filter Registry Functions https://github.com/ProjectOpenSea/operator-filter-registry function setApprovalForAll(address operator, bool approved) public override(IERC721Upgradeable, ERC721Upgradeable) onlyAllowedOperatorApproval(operator) { super.setApprovalForAll(operator, approved); } function approve(address operator, uint256 tokenId) public override(IERC721Upgradeable, ERC721Upgradeable) onlyAllowedOperatorApproval(operator) { super.approve(operator, tokenId); } function transferFrom(address from, address to, uint256 tokenId) public override(IERC721Upgradeable, ERC721Upgradeable) onlyAllowedOperator(from) { super.transferFrom(from, to, tokenId); } function safeTransferFrom(address from, address to, uint256 tokenId) public override(IERC721Upgradeable, ERC721Upgradeable) onlyAllowedOperator(from) { super.safeTransferFrom(from, to, tokenId); } function safeTransferFrom(address from, address to, uint256 tokenId, bytes memory data) public override(IERC721Upgradeable, ERC721Upgradeable) onlyAllowedOperator(from) { super.safeTransferFrom(from, to, tokenId, data); } // End Opensea Operator Filter Registry function supportsInterface(bytes4 interfaceId) public view override(ERC721Upgradeable, ERC721EnumerableUpgradeable, AccessControlUpgradeable) returns (bool) { return interfaceId == type(IERC2981Upgradeable).interfaceId || super.supportsInterface(interfaceId); //IERC2981Upgradeable interfaceId 0x2a55205a } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"operator","type":"address"}],"name":"OperatorNotAllowed","type":"error"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"previousAdmin","type":"address"},{"indexed":false,"internalType":"address","name":"newAdmin","type":"address"}],"name":"AdminChanged","type":"event"},{"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":"beacon","type":"address"}],"name":"BeaconUpgraded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint8","name":"version","type":"uint8"}],"name":"Initialized","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"eventId","type":"string"},{"indexed":false,"internalType":"uint256[]","name":"tokenId","type":"uint256[]"},{"indexed":false,"internalType":"address","name":"by","type":"address"},{"indexed":false,"internalType":"uint256","name":"lockAt","type":"uint256"}],"name":"Lock","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"receiver","type":"address"},{"indexed":false,"internalType":"uint256","name":"bps","type":"uint256"}],"name":"RoyaltyInfoUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"eventId","type":"string"},{"indexed":false,"internalType":"uint256[]","name":"tokenId","type":"uint256[]"},{"indexed":false,"internalType":"address","name":"by","type":"address"},{"indexed":false,"internalType":"uint256","name":"unlockAt","type":"uint256"}],"name":"Unlock","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"implementation","type":"address"}],"name":"Upgraded","type":"event"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_ELEMENTS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MINTER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"UPGRADER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"checkers","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"initializeV2","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"_eventId","type":"string"},{"internalType":"uint256[]","name":"_tokenIds","type":"uint256[]"}],"name":"lock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"proxiableUUID","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"queryLockCounts","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"_eventId","type":"string"}],"name":"queryLockEventState","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"_eventId","type":"string"},{"internalType":"uint256[]","name":"_tokenIds","type":"uint256[]"}],"name":"queryTokenLockState","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"royaltyAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"royaltyBasisPoints","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"_salePrice","type":"uint256"}],"name":"royaltyInfo","outputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint8","name":"num","type":"uint8"},{"internalType":"address","name":"to","type":"address"}],"name":"safeMint","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":"buri","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_checker","type":"address"},{"internalType":"bool","name":"_state","type":"bool"}],"name":"setChecker","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_receiver","type":"address"},{"internalType":"uint96","name":"_feeNumerator","type":"uint96"}],"name":"setDefaultRoyalty","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_eventId","type":"string"},{"internalType":"uint256","name":"_state","type":"uint256"}],"name":"setEventState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"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":"string","name":"_eventId","type":"string"},{"internalType":"uint256[]","name":"_tokenIds","type":"uint256[]"}],"name":"unlock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"updateOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newImplementation","type":"address"}],"name":"upgradeTo","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newImplementation","type":"address"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"upgradeToAndCall","outputs":[],"stateMutability":"payable","type":"function"}]
Contract Creation Code
60a0604052306080523480156200001557600080fd5b506200002062000026565b620000e8565b600054610100900460ff1615620000935760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b60005460ff9081161015620000e6576000805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b60805161420662000120600039600081816112b5015281816112f5015281816114f701528181611537015261165901526142066000f3fe6080604052600436106102885760003560e01c80634f6ccce71161015a57806395d89b41116100c1578063c87b56dd1161007a578063c87b56dd146107ee578063d53913931461080e578063d547741f14610830578063da29bb0b14610850578063e985e9c514610870578063f72c0d8b146108b957600080fd5b806395d89b4114610737578063a217fddf1461074c578063a22cb46514610761578063a5a1b2ba14610781578063ad2f852a146107af578063b88d4fde146107ce57600080fd5b806370a082311161011357806370a08231146106835780638129fc1c146106a357806385eaf828146106b8578063880cdc31146106d85780638da5cb5b146106f857806391d148541461071757600080fd5b80634f6ccce7146105d957806352d1902d146105f957806355f804b31461060e5780635cd8a76b1461062e5780636352211e146106435780636ba060fb1461066357600080fd5b80632a55205a116101fe5780633659cfe6116101b75780633659cfe61461051357806342260b5d1461053357806342842e0e1461055957806342966c681461057957806342d7f293146105995780634f1ef286146105c657600080fd5b80632a55205a1461043e5780632f2ff15d1461047d5780632f745c591461049d57806331950400146104bd5780633502a716146104dd57806336568abe146104f357600080fd5b8063095ea7b311610250578063095ea7b31461035e57806318160ddd1461037e57806323b872dd1461039d578063248a9ca3146103bd57806329a587be146103ed5780632a261fb41461041e57600080fd5b806301ffc9a71461028d57806304634d8d146102c257806306fdde03146102e4578063081812fc146103065780630891e5451461033e575b600080fd5b34801561029957600080fd5b506102ad6102a836600461360c565b6108ed565b60405190151581526020015b60405180910390f35b3480156102ce57600080fd5b506102e26102dd366004613645565b610918565b005b3480156102f057600080fd5b506102f9610a6a565b6040516102b991906136e0565b34801561031257600080fd5b506103266103213660046136f3565b610afc565b6040516001600160a01b0390911681526020016102b9565b34801561034a57600080fd5b506102e261035936600461370c565b610b23565b34801561036a57600080fd5b506102e2610379366004613747565b610c01565b34801561038a57600080fd5b506099545b6040519081526020016102b9565b3480156103a957600080fd5b506102e26103b8366004613771565b610c1a565b3480156103c957600080fd5b5061038f6103d83660046136f3565b600090815260c9602052604090206001015490565b3480156103f957600080fd5b506102ad6104083660046137ad565b6101646020526000908152604090205460ff1681565b34801561042a57600080fd5b506102e261043936600461380a565b610c3f565b34801561044a57600080fd5b5061045e6104593660046138a4565b610eb0565b604080516001600160a01b0390931683526020830191909152016102b9565b34801561048957600080fd5b506102e26104983660046138c6565b610eff565b3480156104a957600080fd5b5061038f6104b8366004613747565b610f24565b3480156104c957600080fd5b506102e26104d836600461380a565b610fba565b3480156104e957600080fd5b5061038f61020881565b3480156104ff57600080fd5b506102e261050e3660046138c6565b61122d565b34801561051f57600080fd5b506102e261052e3660046137ad565b6112ab565b34801561053f57600080fd5b5061016654600160a01b90046001600160601b031661038f565b34801561056557600080fd5b506102e2610574366004613771565b61138a565b34801561058557600080fd5b506102e26105943660046136f3565b6113af565b3480156105a557600080fd5b506105b96105b436600461380a565b61141d565b6040516102b991906138e9565b6102e26105d43660046139d9565b6114ed565b3480156105e557600080fd5b5061038f6105f43660046136f3565b6115b9565b34801561060557600080fd5b5061038f61164c565b34801561061a57600080fd5b506102e2610629366004613a27565b6116ff565b34801561063a57600080fd5b506102e261176d565b34801561064f57600080fd5b5061032661065e3660046136f3565b611837565b34801561066f57600080fd5b506102e261067e366004613a70565b611897565b34801561068f57600080fd5b5061038f61069e3660046137ad565b6118d9565b3480156106af57600080fd5b506102e261195f565b3480156106c457600080fd5b506102e26106d3366004613aca565b611ae3565b3480156106e457600080fd5b506102e26106f33660046137ad565b611b28565b34801561070457600080fd5b50610165546001600160a01b0316610326565b34801561072357600080fd5b506102ad6107323660046138c6565b611b64565b34801561074357600080fd5b506102f9611b8f565b34801561075857600080fd5b5061038f600081565b34801561076d57600080fd5b506102e261077c366004613aca565b611b9e565b34801561078d57600080fd5b5061038f61079c3660046136f3565b6000908152610162602052604090205490565b3480156107bb57600080fd5b50610166546001600160a01b0316610326565b3480156107da57600080fd5b506102e26107e9366004613af6565b611bb2565b3480156107fa57600080fd5b506102f96108093660046136f3565b611bdf565b34801561081a57600080fd5b5061038f6000805160206141b183398151915281565b34801561083c57600080fd5b506102e261084b3660046138c6565b611c46565b34801561085c57600080fd5b5061038f61086b366004613b5e565b611c6b565b34801561087c57600080fd5b506102ad61088b366004613ba0565b6001600160a01b039182166000908152606a6020908152604080832093909416825291909152205460ff1690565b3480156108c557600080fd5b5061038f7f189ab7a9244df0848122154315af71fe140f3db0fe014031783b0946b8c9d2e381565b60006001600160e01b0319821663152a902d60e11b1480610912575061091282611c97565b92915050565b6000805160206141b183398151915261093081611cbc565b612710826001600160601b031611156109a35760405162461bcd60e51b815260206004820152602a60248201527f455243323938313a20726f79616c7479206665652077696c6c206578636565646044820152692073616c65507269636560b01b60648201526084015b60405180910390fd5b6001600160a01b0383166109f95760405162461bcd60e51b815260206004820152601960248201527f455243323938313a20696e76616c696420726563656976657200000000000000604482015260640161099a565b6040805180820182526001600160a01b0385168082526001600160601b0385166020928301819052600160a01b81028217610166558351918252918101919091527ff21fccf4d64d86d532c4e4eb86c007b6ad57a460c27d724188625e755ec6cf6d910160405180910390a1505050565b606060658054610a7990613bbc565b80601f0160208091040260200160405190810160405280929190818152602001828054610aa590613bbc565b8015610af25780601f10610ac757610100808354040283529160200191610af2565b820191906000526020600020905b815481529060010190602001808311610ad557829003601f168201915b5050505050905090565b6000610b0782611cc6565b506000908152606960205260409020546001600160a01b031690565b6000805160206141b1833981519152610b3b81611cbc565b6102088360ff166001610b4e61015f5490565b610b589190613c0c565b610b629190613c23565b1115610bb05760405162461bcd60e51b815260206004820152601e60248201527f6e6f7420656e6f75676820746f6b656e73206c65667420746f206d696e740000604482015260640161099a565b60005b8360ff168160ff161015610bfb576000610bcd61015f5490565b9050610bde61015f80546001019055565b610be88482611d25565b5080610bf381613c3b565b915050610bb3565b50505050565b81610c0b81611d3f565b610c158383611df8565b505050565b826001600160a01b0381163314610c3457610c3433611d3f565b610bfb848484611f08565b6101618484604051610c52929190613c5a565b908152602001604051809103902054600114610ca15760405162461bcd60e51b815260206004820152600e60248201526d22bb32b73a103737ba1037b832b760911b604482015260640161099a565b80610cbe5760405162461bcd60e51b815260040161099a90613c6a565b6014811115610d045760405162461bcd60e51b815260206004820152601260248201527113585e081b1a5b5a5d081bdb994818d85b1b60721b604482015260640161099a565b60005b81811015610e68576000838383818110610d2357610d23613cb3565b905060200201359050610d3581611837565b6001600160a01b0316336001600160a01b03161480610d675750610d676000805160206141b183398151915233611b64565b610d835760405162461bcd60e51b815260040161099a90613cc9565b6101638686604051610d96929190613c5a565b90815260408051602092819003830190206000848152925290205415610e0c5760405162461bcd60e51b815260206004820152602560248201527f546f6b656e20616c7265616479206c6f636b65642062792063757272656e7420604482015264195d995b9d60da1b606482015260840161099a565b60016101638787604051610e21929190613c5a565b90815260408051602092819003830190206000858152908352818120939093556101629091528120805460019290610e5a908490613c23565b909155505050600101610d07565b507ffea44eff610c2922d0be033f0d5754e30414842ab51cea561ee1993e2bf25d46848484843342604051610ea296959493929190613d18565b60405180910390a150505050565b610166805460009182916001600160a01b03811690839061271090610ee590600160a01b90046001600160601b031688613d96565b610eef9190613db5565b91945090925050505b9250929050565b600082815260c96020526040902060010154610f1a81611cbc565b610c158383611f38565b6000610f2f836118d9565b8210610f915760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b606482015260840161099a565b506001600160a01b03919091166000908152609760209081526040808320938352929052205490565b80610fd75760405162461bcd60e51b815260040161099a90613c6a565b601481111561101d5760405162461bcd60e51b815260206004820152601260248201527113585e081b1a5b5a5d081bdb994818d85b1b60721b604482015260640161099a565b60005b818110156111f357600083838381811061103c5761103c613cb3565b90506020020135905061104e81611837565b6001600160a01b0316336001600160a01b0316148061108057506110806000805160206141b183398151915233611b64565b8061109b5750336000908152610164602052604090205460ff165b6110b75760405162461bcd60e51b815260040161099a90613cc9565b61016386866040516110ca929190613c5a565b90815260200160405180910390206000828152602001908152602001600020546001146111435760405162461bcd60e51b815260206004820152602160248201527f546f6b656e206e6f74206c6f636b65642062792063757272656e74206576656e6044820152601d60fa1b606482015260840161099a565b60006101638787604051611158929190613c5a565b9081526040805160209281900383019020600085815290835281812093909355610162909152902054600111156111c55760405162461bcd60e51b81526020600482015260116024820152702637b1b59031b7bab73a399032b93937b960791b604482015260640161099a565b6000818152610162602052604081208054600192906111e5908490613c0c565b909155505050600101611020565b507f0e6a9b542100dff5c1e072c595fc95d46787c6371af93218c380a7dcf53efe4c848484843342604051610ea296959493929190613d18565b6001600160a01b038116331461129d5760405162461bcd60e51b815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201526e103937b632b9903337b91039b2b63360891b606482015260840161099a565b6112a78282611fbe565b5050565b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001630036112f35760405162461bcd60e51b815260040161099a90613dd7565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031661133c60008051602061416a833981519152546001600160a01b031690565b6001600160a01b0316146113625760405162461bcd60e51b815260040161099a90613e23565b61136b81612025565b604080516000808252602082019092526113879183919061204f565b50565b826001600160a01b03811633146113a4576113a433611d3f565b610bfb8484846121ba565b6113ba335b826121d5565b6114145760405162461bcd60e51b815260206004820152602560248201527f6275726e2063616c6c6572206973206e6f74206f776e6572206e6f72206170706044820152641c9bdd995960da1b606482015260840161099a565b61138781612253565b606060008267ffffffffffffffff81111561143a5761143a61392d565b604051908082528060200260200182016040528015611463578160200160208202803683370190505b50905060005b838110156114e1576101638787604051611484929190613c5a565b908152602001604051809103902060008686848181106114a6576114a6613cb3565b905060200201358152602001908152602001600020548282815181106114ce576114ce613cb3565b6020908102919091010152600101611469565b5090505b949350505050565b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001630036115355760405162461bcd60e51b815260040161099a90613dd7565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031661157e60008051602061416a833981519152546001600160a01b031690565b6001600160a01b0316146115a45760405162461bcd60e51b815260040161099a90613e23565b6115ad82612025565b6112a78282600161204f565b60006115c460995490565b82106116275760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b606482015260840161099a565b6099828154811061163a5761163a613cb3565b90600052602060002001549050919050565b6000306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146116ec5760405162461bcd60e51b815260206004820152603860248201527f555550535570677261646561626c653a206d757374206e6f742062652063616c60448201527f6c6564207468726f7567682064656c656761746563616c6c0000000000000000606482015260840161099a565b5060008051602061416a83398151915290565b6000805160206141b183398151915261171781611cbc565b60008251116117595760405162461bcd60e51b815260206004820152600e60248201526d77726f6e6720626173652075726960901b604482015260640161099a565b8151610c159061016090602085019061355d565b6000805160206141b183398151915261178581611cbc565b600054600290610100900460ff161580156117a7575060005460ff8083169116105b6117c35760405162461bcd60e51b815260040161099a90613e6f565b6000805461ffff191660ff8316176101001790556117df6122f6565b61016580546001600160a01b031916331790556000805461ff00191690556040805160ff8316815290517f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989181900360200190a15050565b6000818152606760205260408120546001600160a01b0316806109125760405162461bcd60e51b8152602060048201526018602482015277115490cdcc8c4e881a5b9d985b1a59081d1bdad95b88125160421b604482015260640161099a565b6000805160206141b18339815191526118af81611cbc565b8161016185856040516118c3929190613c5a565b9081526040519081900360200190205550505050565b60006001600160a01b0382166119435760405162461bcd60e51b815260206004820152602960248201527f4552433732313a2061646472657373207a65726f206973206e6f7420612076616044820152683634b21037bbb732b960b91b606482015260840161099a565b506001600160a01b031660009081526068602052604090205490565b600054610100900460ff161580801561197f5750600054600160ff909116105b806119995750303b158015611999575060005460ff166001145b6119b55760405162461bcd60e51b815260040161099a90613e6f565b6000805460ff1916600117905580156119d8576000805461ff0019166101001790555b611a27604051806040016040528060118152602001702cb7baa0b932aa3432a1b430b6b834b7b760791b815250604051806040016040528060048152602001635941544360e01b81525061233e565b611a2f61236f565b611a3761236f565b611a3f61236f565b611a4e61015f80546001019055565b611a59600033612396565b611a716000805160206141b183398151915233612396565b611a9b7f189ab7a9244df0848122154315af71fe140f3db0fe014031783b0946b8c9d2e333612396565b8015611387576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a150565b6000805160206141b1833981519152611afb81611cbc565b506001600160a01b0391909116600090815261016460205260409020805460ff1916911515919091179055565b6000805160206141b1833981519152611b4081611cbc565b5061016580546001600160a01b0319166001600160a01b0392909216919091179055565b600091825260c9602090815260408084206001600160a01b0393909316845291905290205460ff1690565b606060668054610a7990613bbc565b81611ba881611d3f565b610c1583836123a0565b836001600160a01b0381163314611bcc57611bcc33611d3f565b611bd8858585856123ab565b5050505050565b6060611bea82611cc6565b6000611bf46123dd565b90506000815111611c145760405180602001604052806000815250611c3f565b80611c1e846123ed565b604051602001611c2f929190613ebd565b6040516020818303038152906040525b9392505050565b600082815260c96020526040902060010154611c6181611cbc565b610c158383611fbe565b60006101618383604051611c80929190613c5a565b908152602001604051809103902054905092915050565b60006001600160e01b03198216637965db0b60e01b1480610912575061091282612480565b61138781336124a5565b6000818152606760205260409020546001600160a01b03166113875760405162461bcd60e51b8152602060048201526018602482015277115490cdcc8c4e881a5b9d985b1a59081d1bdad95b88125160421b604482015260640161099a565b6112a78282604051806020016040528060008152506124fe565b6daaeb6d7670e522a718067333cd4e3b1561138757604051633185c44d60e21b81523060048201526001600160a01b03821660248201526daaeb6d7670e522a718067333cd4e9063c617113490604401602060405180830381865afa158015611dac573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611dd09190613eec565b61138757604051633b79c77360e21b81526001600160a01b038216600482015260240161099a565b6000611e0382611837565b9050806001600160a01b0316836001600160a01b031603611e705760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b606482015260840161099a565b336001600160a01b0382161480611e8c5750611e8c813361088b565b611efe5760405162461bcd60e51b815260206004820152603d60248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60448201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c000000606482015260840161099a565b610c158383612531565b611f11336113b4565b611f2d5760405162461bcd60e51b815260040161099a90613f09565b610c1583838361259f565b611f428282611b64565b6112a757600082815260c9602090815260408083206001600160a01b03851684529091529020805460ff19166001179055611f7a3390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b611fc88282611b64565b156112a757600082815260c9602090815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b7f189ab7a9244df0848122154315af71fe140f3db0fe014031783b0946b8c9d2e36112a781611cbc565b7f4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd91435460ff161561208257610c1583612710565b826001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa9250505080156120dc575060408051601f3d908101601f191682019092526120d991810190613f56565b60015b61213f5760405162461bcd60e51b815260206004820152602e60248201527f45524331393637557067726164653a206e657720696d706c656d656e7461746960448201526d6f6e206973206e6f74205555505360901b606482015260840161099a565b60008051602061416a83398151915281146121ae5760405162461bcd60e51b815260206004820152602960248201527f45524331393637557067726164653a20756e737570706f727465642070726f786044820152681a58589b195555525160ba1b606482015260840161099a565b50610c158383836127ac565b610c1583838360405180602001604052806000815250611bb2565b6000806121e183611837565b9050806001600160a01b0316846001600160a01b0316148061222857506001600160a01b038082166000908152606a602090815260408083209388168352929052205460ff165b806114e55750836001600160a01b031661224184610afc565b6001600160a01b031614949350505050565b600061225e82611837565b905061226e8160008460016127d1565b61227782611837565b600083815260696020908152604080832080546001600160a01b03199081169091556001600160a01b0385168085526068845282852080546000190190558785526067909352818420805490911690555192935084927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b600054610100900460ff1661231d5760405162461bcd60e51b815260040161099a90613f6f565b61233c733cc6cdda760b79bafa08df41ecfa224f810dceb66001612832565b565b600054610100900460ff166123655760405162461bcd60e51b815260040161099a90613f6f565b6112a782826129d9565b600054610100900460ff1661233c5760405162461bcd60e51b815260040161099a90613f6f565b6112a78282611f38565b6112a7338383612a27565b6123b533836121d5565b6123d15760405162461bcd60e51b815260040161099a90613f09565b610bfb84848484612af5565b60606101608054610a7990613bbc565b606060006123fa83612b28565b600101905060008167ffffffffffffffff81111561241a5761241a61392d565b6040519080825280601f01601f191660200182016040528015612444576020820181803683370190505b5090508181016020015b600019016f181899199a1a9b1b9c1cb0b131b232b360811b600a86061a8153600a850494508461244e57509392505050565b60006001600160e01b0319821663780e9d6360e01b1480610912575061091282612c00565b6124af8282611b64565b6112a7576124bc81612c50565b6124c7836020612c62565b6040516020016124d8929190613fba565b60408051601f198184030181529082905262461bcd60e51b825261099a916004016136e0565b6125088383612dfe565b6125156000848484612f97565b610c155760405162461bcd60e51b815260040161099a9061402f565b600081815260696020526040902080546001600160a01b0319166001600160a01b038416908117909155819061256682611837565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b826001600160a01b03166125b282611837565b6001600160a01b0316146125d85760405162461bcd60e51b815260040161099a90614081565b6001600160a01b03821661263a5760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b606482015260840161099a565b61264783838360016127d1565b826001600160a01b031661265a82611837565b6001600160a01b0316146126805760405162461bcd60e51b815260040161099a90614081565b600081815260696020908152604080832080546001600160a01b03199081169091556001600160a01b0387811680865260688552838620805460001901905590871680865283862080546001019055868652606790945282852080549092168417909155905184937fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b6001600160a01b0381163b61277d5760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b606482015260840161099a565b60008051602061416a83398151915280546001600160a01b0319166001600160a01b0392909216919091179055565b6127b583613095565b6000825111806127c25750805b15610c1557610bfb83836130d5565b60008281526101626020526040902054156128265760405162461bcd60e51b8152602060048201526015602482015274151bdad95b881b1bd8dad95908189e48195d995b9d605a1b604482015260640161099a565b610bfb848484846131c9565b600054610100900460ff166128595760405162461bcd60e51b815260040161099a90613f6f565b6daaeb6d7670e522a718067333cd4e3b156112a75760405163c3c5a54760e01b81523060048201526daaeb6d7670e522a718067333cd4e9063c3c5a547906024016020604051808303816000875af11580156128b9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128dd9190613eec565b6112a757801561295957604051633e9f1edf60e11b81523060048201526001600160a01b03831660248201526daaeb6d7670e522a718067333cd4e90637d3e3dbe906044015b600060405180830381600087803b15801561293d57600080fd5b505af1158015612951573d6000803e3d6000fd5b505050505050565b6001600160a01b038216156129a85760405163a0af290360e01b81523060048201526001600160a01b03831660248201526daaeb6d7670e522a718067333cd4e9063a0af290390604401612923565b604051632210724360e11b81523060048201526daaeb6d7670e522a718067333cd4e90634420e48690602401612923565b600054610100900460ff16612a005760405162461bcd60e51b815260040161099a90613f6f565b8151612a1390606590602085019061355d565b508051610c1590606690602084019061355d565b816001600160a01b0316836001600160a01b031603612a885760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c657200000000000000604482015260640161099a565b6001600160a01b038381166000818152606a6020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b612b0084848461259f565b612b0c84848484612f97565b610bfb5760405162461bcd60e51b815260040161099a9061402f565b60008072184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b8310612b675772184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b830492506040015b6d04ee2d6d415b85acef81000000008310612b93576d04ee2d6d415b85acef8100000000830492506020015b662386f26fc100008310612bb157662386f26fc10000830492506010015b6305f5e1008310612bc9576305f5e100830492506008015b6127108310612bdd57612710830492506004015b60648310612bef576064830492506002015b600a83106109125760010192915050565b60006001600160e01b031982166380ac58cd60e01b1480612c3157506001600160e01b03198216635b5e139f60e01b145b8061091257506301ffc9a760e01b6001600160e01b0319831614610912565b60606109126001600160a01b03831660145b60606000612c71836002613d96565b612c7c906002613c23565b67ffffffffffffffff811115612c9457612c9461392d565b6040519080825280601f01601f191660200182016040528015612cbe576020820181803683370190505b509050600360fc1b81600081518110612cd957612cd9613cb3565b60200101906001600160f81b031916908160001a905350600f60fb1b81600181518110612d0857612d08613cb3565b60200101906001600160f81b031916908160001a9053506000612d2c846002613d96565b612d37906001613c23565b90505b6001811115612daf576f181899199a1a9b1b9c1cb0b131b232b360811b85600f1660108110612d6b57612d6b613cb3565b1a60f81b828281518110612d8157612d81613cb3565b60200101906001600160f81b031916908160001a90535060049490941c93612da8816140c6565b9050612d3a565b508315611c3f5760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e74604482015260640161099a565b6001600160a01b038216612e545760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f2061646472657373604482015260640161099a565b6000818152606760205260409020546001600160a01b031615612eb95760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000604482015260640161099a565b612ec76000838360016127d1565b6000818152606760205260409020546001600160a01b031615612f2c5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000604482015260640161099a565b6001600160a01b038216600081815260686020908152604080832080546001019055848352606790915280822080546001600160a01b0319168417905551839291907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b60006001600160a01b0384163b1561308d57604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290612fdb9033908990889088906004016140dd565b6020604051808303816000875af1925050508015613016575060408051601f3d908101601f191682019092526130139181019061411a565b60015b613073573d808015613044576040519150601f19603f3d011682016040523d82523d6000602084013e613049565b606091505b50805160000361306b5760405162461bcd60e51b815260040161099a9061402f565b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490506114e5565b5060016114e5565b61309e81612710565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b60606001600160a01b0383163b61313d5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a2064656c65676174652063616c6c20746f206e6f6e2d636f6044820152651b9d1c9858dd60d21b606482015260840161099a565b600080846001600160a01b0316846040516131589190614137565b600060405180830381855af49150503d8060008114613193576040519150601f19603f3d011682016040523d82523d6000602084013e613198565b606091505b50915091506131c0828260405180606001604052806027815260200161418a60279139613302565b95945050505050565b6131d58484848461331b565b60018111156132445760405162461bcd60e51b815260206004820152603560248201527f455243373231456e756d657261626c653a20636f6e7365637574697665207472604482015274185b9cd9995c9cc81b9bdd081cdd5c1c1bdc9d1959605a1b606482015260840161099a565b816001600160a01b0385166132a05761329b81609980546000838152609a60205260408120829055600182018355919091527f72a152ddfb8e864297c917af52ea6c1c68aead0fee1a62673fcc7e0c94979d000155565b6132c3565b836001600160a01b0316856001600160a01b0316146132c3576132c385826133a3565b6001600160a01b0384166132df576132da81613440565b611bd8565b846001600160a01b0316846001600160a01b031614611bd857611bd884826134ef565b60608315613311575081611c3f565b611c3f8383613533565b6001811115610bfb576001600160a01b03841615613361576001600160a01b0384166000908152606860205260408120805483929061335b908490613c0c565b90915550505b6001600160a01b03831615610bfb576001600160a01b03831660009081526068602052604081208054839290613398908490613c23565b909155505050505050565b600060016133b0846118d9565b6133ba9190613c0c565b60008381526098602052604090205490915080821461340d576001600160a01b03841660009081526097602090815260408083208584528252808320548484528184208190558352609890915290208190555b5060009182526098602090815260408084208490556001600160a01b039094168352609781528383209183525290812055565b60995460009061345290600190613c0c565b6000838152609a60205260408120546099805493945090928490811061347a5761347a613cb3565b90600052602060002001549050806099838154811061349b5761349b613cb3565b6000918252602080832090910192909255828152609a909152604080822084905585825281205560998054806134d3576134d3614153565b6001900381819060005260206000200160009055905550505050565b60006134fa836118d9565b6001600160a01b039093166000908152609760209081526040808320868452825280832085905593825260989052919091209190915550565b8151156135435781518083602001fd5b8060405162461bcd60e51b815260040161099a91906136e0565b82805461356990613bbc565b90600052602060002090601f01602090048101928261358b57600085556135d1565b82601f106135a457805160ff19168380011785556135d1565b828001600101855582156135d1579182015b828111156135d15782518255916020019190600101906135b6565b506135dd9291506135e1565b5090565b5b808211156135dd57600081556001016135e2565b6001600160e01b03198116811461138757600080fd5b60006020828403121561361e57600080fd5b8135611c3f816135f6565b80356001600160a01b038116811461364057600080fd5b919050565b6000806040838503121561365857600080fd5b61366183613629565b915060208301356001600160601b038116811461367d57600080fd5b809150509250929050565b60005b838110156136a357818101518382015260200161368b565b83811115610bfb5750506000910152565b600081518084526136cc816020860160208601613688565b601f01601f19169290920160200192915050565b602081526000611c3f60208301846136b4565b60006020828403121561370557600080fd5b5035919050565b6000806040838503121561371f57600080fd5b823560ff8116811461373057600080fd5b915061373e60208401613629565b90509250929050565b6000806040838503121561375a57600080fd5b61376383613629565b946020939093013593505050565b60008060006060848603121561378657600080fd5b61378f84613629565b925061379d60208501613629565b9150604084013590509250925092565b6000602082840312156137bf57600080fd5b611c3f82613629565b60008083601f8401126137da57600080fd5b50813567ffffffffffffffff8111156137f257600080fd5b602083019150836020828501011115610ef857600080fd5b6000806000806040858703121561382057600080fd5b843567ffffffffffffffff8082111561383857600080fd5b613844888389016137c8565b9096509450602087013591508082111561385d57600080fd5b818701915087601f83011261387157600080fd5b81358181111561388057600080fd5b8860208260051b850101111561389557600080fd5b95989497505060200194505050565b600080604083850312156138b757600080fd5b50508035926020909101359150565b600080604083850312156138d957600080fd5b8235915061373e60208401613629565b6020808252825182820181905260009190848201906040850190845b8181101561392157835183529284019291840191600101613905565b50909695505050505050565b634e487b7160e01b600052604160045260246000fd5b600067ffffffffffffffff8084111561395e5761395e61392d565b604051601f8501601f19908116603f011681019082821181831017156139865761398661392d565b8160405280935085815286868601111561399f57600080fd5b858560208301376000602087830101525050509392505050565b600082601f8301126139ca57600080fd5b611c3f83833560208501613943565b600080604083850312156139ec57600080fd5b6139f583613629565b9150602083013567ffffffffffffffff811115613a1157600080fd5b613a1d858286016139b9565b9150509250929050565b600060208284031215613a3957600080fd5b813567ffffffffffffffff811115613a5057600080fd5b8201601f81018413613a6157600080fd5b6114e584823560208401613943565b600080600060408486031215613a8557600080fd5b833567ffffffffffffffff811115613a9c57600080fd5b613aa8868287016137c8565b909790965060209590950135949350505050565b801515811461138757600080fd5b60008060408385031215613add57600080fd5b613ae683613629565b9150602083013561367d81613abc565b60008060008060808587031215613b0c57600080fd5b613b1585613629565b9350613b2360208601613629565b925060408501359150606085013567ffffffffffffffff811115613b4657600080fd5b613b52878288016139b9565b91505092959194509250565b60008060208385031215613b7157600080fd5b823567ffffffffffffffff811115613b8857600080fd5b613b94858286016137c8565b90969095509350505050565b60008060408385031215613bb357600080fd5b61373083613629565b600181811c90821680613bd057607f821691505b602082108103613bf057634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b600082821015613c1e57613c1e613bf6565b500390565b60008219821115613c3657613c36613bf6565b500190565b600060ff821660ff8103613c5157613c51613bf6565b60010192915050565b8183823760009101908152919050565b60208082526029908201527f546f6b656e496473206c656e677468206d7573742062652067726561746572206040820152687468616e207a65726f60b81b606082015260800190565b634e487b7160e01b600052603260045260246000fd5b6020808252602f908201527f43616c6c6572206d757374206265206f776e6572206f6620746f6b656e206f7260408201526e1031b7b73a3930b1ba1037bbb732b960891b606082015260800190565b60808152856080820152858760a0830137600060a08783018101829052601f19601f8901168301838103820160208501529081018690526001600160fb1b03861115613d6357600080fd5b8560051b808860c08401376000910160c0019081526001600160a01b039490941660408301525060600152949350505050565b6000816000190483118215151615613db057613db0613bf6565b500290565b600082613dd257634e487b7160e01b600052601260045260246000fd5b500490565b6020808252602c908201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060408201526b19195b1959d85d1958d85b1b60a21b606082015260800190565b6020808252602c908201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060408201526b6163746976652070726f787960a01b606082015260800190565b6020808252602e908201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160408201526d191e481a5b9a5d1a585b1a5e995960921b606082015260800190565b60008351613ecf818460208801613688565b835190830190613ee3818360208801613688565b01949350505050565b600060208284031215613efe57600080fd5b8151611c3f81613abc565b6020808252602d908201527f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560408201526c1c881bdc88185c1c1c9bdd9959609a1b606082015260800190565b600060208284031215613f6857600080fd5b5051919050565b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000815260008351613ff2816017850160208801613688565b7001034b99036b4b9b9b4b733903937b6329607d1b6017918401918201528351614023816028840160208801613688565b01602801949350505050565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b60208082526025908201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060408201526437bbb732b960d91b606082015260800190565b6000816140d5576140d5613bf6565b506000190190565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090614110908301846136b4565b9695505050505050565b60006020828403121561412c57600080fd5b8151611c3f816135f6565b60008251614149818460208701613688565b9190910192915050565b634e487b7160e01b600052603160045260246000fdfe360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c65649f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a6a26469706673582212204829cfd265502d468990a417d717e50939663194bfb2c47e0917bb24ebd2c52464736f6c634300080d0033
Deployed Bytecode
0x6080604052600436106102885760003560e01c80634f6ccce71161015a57806395d89b41116100c1578063c87b56dd1161007a578063c87b56dd146107ee578063d53913931461080e578063d547741f14610830578063da29bb0b14610850578063e985e9c514610870578063f72c0d8b146108b957600080fd5b806395d89b4114610737578063a217fddf1461074c578063a22cb46514610761578063a5a1b2ba14610781578063ad2f852a146107af578063b88d4fde146107ce57600080fd5b806370a082311161011357806370a08231146106835780638129fc1c146106a357806385eaf828146106b8578063880cdc31146106d85780638da5cb5b146106f857806391d148541461071757600080fd5b80634f6ccce7146105d957806352d1902d146105f957806355f804b31461060e5780635cd8a76b1461062e5780636352211e146106435780636ba060fb1461066357600080fd5b80632a55205a116101fe5780633659cfe6116101b75780633659cfe61461051357806342260b5d1461053357806342842e0e1461055957806342966c681461057957806342d7f293146105995780634f1ef286146105c657600080fd5b80632a55205a1461043e5780632f2ff15d1461047d5780632f745c591461049d57806331950400146104bd5780633502a716146104dd57806336568abe146104f357600080fd5b8063095ea7b311610250578063095ea7b31461035e57806318160ddd1461037e57806323b872dd1461039d578063248a9ca3146103bd57806329a587be146103ed5780632a261fb41461041e57600080fd5b806301ffc9a71461028d57806304634d8d146102c257806306fdde03146102e4578063081812fc146103065780630891e5451461033e575b600080fd5b34801561029957600080fd5b506102ad6102a836600461360c565b6108ed565b60405190151581526020015b60405180910390f35b3480156102ce57600080fd5b506102e26102dd366004613645565b610918565b005b3480156102f057600080fd5b506102f9610a6a565b6040516102b991906136e0565b34801561031257600080fd5b506103266103213660046136f3565b610afc565b6040516001600160a01b0390911681526020016102b9565b34801561034a57600080fd5b506102e261035936600461370c565b610b23565b34801561036a57600080fd5b506102e2610379366004613747565b610c01565b34801561038a57600080fd5b506099545b6040519081526020016102b9565b3480156103a957600080fd5b506102e26103b8366004613771565b610c1a565b3480156103c957600080fd5b5061038f6103d83660046136f3565b600090815260c9602052604090206001015490565b3480156103f957600080fd5b506102ad6104083660046137ad565b6101646020526000908152604090205460ff1681565b34801561042a57600080fd5b506102e261043936600461380a565b610c3f565b34801561044a57600080fd5b5061045e6104593660046138a4565b610eb0565b604080516001600160a01b0390931683526020830191909152016102b9565b34801561048957600080fd5b506102e26104983660046138c6565b610eff565b3480156104a957600080fd5b5061038f6104b8366004613747565b610f24565b3480156104c957600080fd5b506102e26104d836600461380a565b610fba565b3480156104e957600080fd5b5061038f61020881565b3480156104ff57600080fd5b506102e261050e3660046138c6565b61122d565b34801561051f57600080fd5b506102e261052e3660046137ad565b6112ab565b34801561053f57600080fd5b5061016654600160a01b90046001600160601b031661038f565b34801561056557600080fd5b506102e2610574366004613771565b61138a565b34801561058557600080fd5b506102e26105943660046136f3565b6113af565b3480156105a557600080fd5b506105b96105b436600461380a565b61141d565b6040516102b991906138e9565b6102e26105d43660046139d9565b6114ed565b3480156105e557600080fd5b5061038f6105f43660046136f3565b6115b9565b34801561060557600080fd5b5061038f61164c565b34801561061a57600080fd5b506102e2610629366004613a27565b6116ff565b34801561063a57600080fd5b506102e261176d565b34801561064f57600080fd5b5061032661065e3660046136f3565b611837565b34801561066f57600080fd5b506102e261067e366004613a70565b611897565b34801561068f57600080fd5b5061038f61069e3660046137ad565b6118d9565b3480156106af57600080fd5b506102e261195f565b3480156106c457600080fd5b506102e26106d3366004613aca565b611ae3565b3480156106e457600080fd5b506102e26106f33660046137ad565b611b28565b34801561070457600080fd5b50610165546001600160a01b0316610326565b34801561072357600080fd5b506102ad6107323660046138c6565b611b64565b34801561074357600080fd5b506102f9611b8f565b34801561075857600080fd5b5061038f600081565b34801561076d57600080fd5b506102e261077c366004613aca565b611b9e565b34801561078d57600080fd5b5061038f61079c3660046136f3565b6000908152610162602052604090205490565b3480156107bb57600080fd5b50610166546001600160a01b0316610326565b3480156107da57600080fd5b506102e26107e9366004613af6565b611bb2565b3480156107fa57600080fd5b506102f96108093660046136f3565b611bdf565b34801561081a57600080fd5b5061038f6000805160206141b183398151915281565b34801561083c57600080fd5b506102e261084b3660046138c6565b611c46565b34801561085c57600080fd5b5061038f61086b366004613b5e565b611c6b565b34801561087c57600080fd5b506102ad61088b366004613ba0565b6001600160a01b039182166000908152606a6020908152604080832093909416825291909152205460ff1690565b3480156108c557600080fd5b5061038f7f189ab7a9244df0848122154315af71fe140f3db0fe014031783b0946b8c9d2e381565b60006001600160e01b0319821663152a902d60e11b1480610912575061091282611c97565b92915050565b6000805160206141b183398151915261093081611cbc565b612710826001600160601b031611156109a35760405162461bcd60e51b815260206004820152602a60248201527f455243323938313a20726f79616c7479206665652077696c6c206578636565646044820152692073616c65507269636560b01b60648201526084015b60405180910390fd5b6001600160a01b0383166109f95760405162461bcd60e51b815260206004820152601960248201527f455243323938313a20696e76616c696420726563656976657200000000000000604482015260640161099a565b6040805180820182526001600160a01b0385168082526001600160601b0385166020928301819052600160a01b81028217610166558351918252918101919091527ff21fccf4d64d86d532c4e4eb86c007b6ad57a460c27d724188625e755ec6cf6d910160405180910390a1505050565b606060658054610a7990613bbc565b80601f0160208091040260200160405190810160405280929190818152602001828054610aa590613bbc565b8015610af25780601f10610ac757610100808354040283529160200191610af2565b820191906000526020600020905b815481529060010190602001808311610ad557829003601f168201915b5050505050905090565b6000610b0782611cc6565b506000908152606960205260409020546001600160a01b031690565b6000805160206141b1833981519152610b3b81611cbc565b6102088360ff166001610b4e61015f5490565b610b589190613c0c565b610b629190613c23565b1115610bb05760405162461bcd60e51b815260206004820152601e60248201527f6e6f7420656e6f75676820746f6b656e73206c65667420746f206d696e740000604482015260640161099a565b60005b8360ff168160ff161015610bfb576000610bcd61015f5490565b9050610bde61015f80546001019055565b610be88482611d25565b5080610bf381613c3b565b915050610bb3565b50505050565b81610c0b81611d3f565b610c158383611df8565b505050565b826001600160a01b0381163314610c3457610c3433611d3f565b610bfb848484611f08565b6101618484604051610c52929190613c5a565b908152602001604051809103902054600114610ca15760405162461bcd60e51b815260206004820152600e60248201526d22bb32b73a103737ba1037b832b760911b604482015260640161099a565b80610cbe5760405162461bcd60e51b815260040161099a90613c6a565b6014811115610d045760405162461bcd60e51b815260206004820152601260248201527113585e081b1a5b5a5d081bdb994818d85b1b60721b604482015260640161099a565b60005b81811015610e68576000838383818110610d2357610d23613cb3565b905060200201359050610d3581611837565b6001600160a01b0316336001600160a01b03161480610d675750610d676000805160206141b183398151915233611b64565b610d835760405162461bcd60e51b815260040161099a90613cc9565b6101638686604051610d96929190613c5a565b90815260408051602092819003830190206000848152925290205415610e0c5760405162461bcd60e51b815260206004820152602560248201527f546f6b656e20616c7265616479206c6f636b65642062792063757272656e7420604482015264195d995b9d60da1b606482015260840161099a565b60016101638787604051610e21929190613c5a565b90815260408051602092819003830190206000858152908352818120939093556101629091528120805460019290610e5a908490613c23565b909155505050600101610d07565b507ffea44eff610c2922d0be033f0d5754e30414842ab51cea561ee1993e2bf25d46848484843342604051610ea296959493929190613d18565b60405180910390a150505050565b610166805460009182916001600160a01b03811690839061271090610ee590600160a01b90046001600160601b031688613d96565b610eef9190613db5565b91945090925050505b9250929050565b600082815260c96020526040902060010154610f1a81611cbc565b610c158383611f38565b6000610f2f836118d9565b8210610f915760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b606482015260840161099a565b506001600160a01b03919091166000908152609760209081526040808320938352929052205490565b80610fd75760405162461bcd60e51b815260040161099a90613c6a565b601481111561101d5760405162461bcd60e51b815260206004820152601260248201527113585e081b1a5b5a5d081bdb994818d85b1b60721b604482015260640161099a565b60005b818110156111f357600083838381811061103c5761103c613cb3565b90506020020135905061104e81611837565b6001600160a01b0316336001600160a01b0316148061108057506110806000805160206141b183398151915233611b64565b8061109b5750336000908152610164602052604090205460ff165b6110b75760405162461bcd60e51b815260040161099a90613cc9565b61016386866040516110ca929190613c5a565b90815260200160405180910390206000828152602001908152602001600020546001146111435760405162461bcd60e51b815260206004820152602160248201527f546f6b656e206e6f74206c6f636b65642062792063757272656e74206576656e6044820152601d60fa1b606482015260840161099a565b60006101638787604051611158929190613c5a565b9081526040805160209281900383019020600085815290835281812093909355610162909152902054600111156111c55760405162461bcd60e51b81526020600482015260116024820152702637b1b59031b7bab73a399032b93937b960791b604482015260640161099a565b6000818152610162602052604081208054600192906111e5908490613c0c565b909155505050600101611020565b507f0e6a9b542100dff5c1e072c595fc95d46787c6371af93218c380a7dcf53efe4c848484843342604051610ea296959493929190613d18565b6001600160a01b038116331461129d5760405162461bcd60e51b815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201526e103937b632b9903337b91039b2b63360891b606482015260840161099a565b6112a78282611fbe565b5050565b6001600160a01b037f00000000000000000000000011000298e7b6f3f089e567a0271b66573a89f4681630036112f35760405162461bcd60e51b815260040161099a90613dd7565b7f00000000000000000000000011000298e7b6f3f089e567a0271b66573a89f4686001600160a01b031661133c60008051602061416a833981519152546001600160a01b031690565b6001600160a01b0316146113625760405162461bcd60e51b815260040161099a90613e23565b61136b81612025565b604080516000808252602082019092526113879183919061204f565b50565b826001600160a01b03811633146113a4576113a433611d3f565b610bfb8484846121ba565b6113ba335b826121d5565b6114145760405162461bcd60e51b815260206004820152602560248201527f6275726e2063616c6c6572206973206e6f74206f776e6572206e6f72206170706044820152641c9bdd995960da1b606482015260840161099a565b61138781612253565b606060008267ffffffffffffffff81111561143a5761143a61392d565b604051908082528060200260200182016040528015611463578160200160208202803683370190505b50905060005b838110156114e1576101638787604051611484929190613c5a565b908152602001604051809103902060008686848181106114a6576114a6613cb3565b905060200201358152602001908152602001600020548282815181106114ce576114ce613cb3565b6020908102919091010152600101611469565b5090505b949350505050565b6001600160a01b037f00000000000000000000000011000298e7b6f3f089e567a0271b66573a89f4681630036115355760405162461bcd60e51b815260040161099a90613dd7565b7f00000000000000000000000011000298e7b6f3f089e567a0271b66573a89f4686001600160a01b031661157e60008051602061416a833981519152546001600160a01b031690565b6001600160a01b0316146115a45760405162461bcd60e51b815260040161099a90613e23565b6115ad82612025565b6112a78282600161204f565b60006115c460995490565b82106116275760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b606482015260840161099a565b6099828154811061163a5761163a613cb3565b90600052602060002001549050919050565b6000306001600160a01b037f00000000000000000000000011000298e7b6f3f089e567a0271b66573a89f46816146116ec5760405162461bcd60e51b815260206004820152603860248201527f555550535570677261646561626c653a206d757374206e6f742062652063616c60448201527f6c6564207468726f7567682064656c656761746563616c6c0000000000000000606482015260840161099a565b5060008051602061416a83398151915290565b6000805160206141b183398151915261171781611cbc565b60008251116117595760405162461bcd60e51b815260206004820152600e60248201526d77726f6e6720626173652075726960901b604482015260640161099a565b8151610c159061016090602085019061355d565b6000805160206141b183398151915261178581611cbc565b600054600290610100900460ff161580156117a7575060005460ff8083169116105b6117c35760405162461bcd60e51b815260040161099a90613e6f565b6000805461ffff191660ff8316176101001790556117df6122f6565b61016580546001600160a01b031916331790556000805461ff00191690556040805160ff8316815290517f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989181900360200190a15050565b6000818152606760205260408120546001600160a01b0316806109125760405162461bcd60e51b8152602060048201526018602482015277115490cdcc8c4e881a5b9d985b1a59081d1bdad95b88125160421b604482015260640161099a565b6000805160206141b18339815191526118af81611cbc565b8161016185856040516118c3929190613c5a565b9081526040519081900360200190205550505050565b60006001600160a01b0382166119435760405162461bcd60e51b815260206004820152602960248201527f4552433732313a2061646472657373207a65726f206973206e6f7420612076616044820152683634b21037bbb732b960b91b606482015260840161099a565b506001600160a01b031660009081526068602052604090205490565b600054610100900460ff161580801561197f5750600054600160ff909116105b806119995750303b158015611999575060005460ff166001145b6119b55760405162461bcd60e51b815260040161099a90613e6f565b6000805460ff1916600117905580156119d8576000805461ff0019166101001790555b611a27604051806040016040528060118152602001702cb7baa0b932aa3432a1b430b6b834b7b760791b815250604051806040016040528060048152602001635941544360e01b81525061233e565b611a2f61236f565b611a3761236f565b611a3f61236f565b611a4e61015f80546001019055565b611a59600033612396565b611a716000805160206141b183398151915233612396565b611a9b7f189ab7a9244df0848122154315af71fe140f3db0fe014031783b0946b8c9d2e333612396565b8015611387576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a150565b6000805160206141b1833981519152611afb81611cbc565b506001600160a01b0391909116600090815261016460205260409020805460ff1916911515919091179055565b6000805160206141b1833981519152611b4081611cbc565b5061016580546001600160a01b0319166001600160a01b0392909216919091179055565b600091825260c9602090815260408084206001600160a01b0393909316845291905290205460ff1690565b606060668054610a7990613bbc565b81611ba881611d3f565b610c1583836123a0565b836001600160a01b0381163314611bcc57611bcc33611d3f565b611bd8858585856123ab565b5050505050565b6060611bea82611cc6565b6000611bf46123dd565b90506000815111611c145760405180602001604052806000815250611c3f565b80611c1e846123ed565b604051602001611c2f929190613ebd565b6040516020818303038152906040525b9392505050565b600082815260c96020526040902060010154611c6181611cbc565b610c158383611fbe565b60006101618383604051611c80929190613c5a565b908152602001604051809103902054905092915050565b60006001600160e01b03198216637965db0b60e01b1480610912575061091282612480565b61138781336124a5565b6000818152606760205260409020546001600160a01b03166113875760405162461bcd60e51b8152602060048201526018602482015277115490cdcc8c4e881a5b9d985b1a59081d1bdad95b88125160421b604482015260640161099a565b6112a78282604051806020016040528060008152506124fe565b6daaeb6d7670e522a718067333cd4e3b1561138757604051633185c44d60e21b81523060048201526001600160a01b03821660248201526daaeb6d7670e522a718067333cd4e9063c617113490604401602060405180830381865afa158015611dac573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611dd09190613eec565b61138757604051633b79c77360e21b81526001600160a01b038216600482015260240161099a565b6000611e0382611837565b9050806001600160a01b0316836001600160a01b031603611e705760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b606482015260840161099a565b336001600160a01b0382161480611e8c5750611e8c813361088b565b611efe5760405162461bcd60e51b815260206004820152603d60248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60448201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c000000606482015260840161099a565b610c158383612531565b611f11336113b4565b611f2d5760405162461bcd60e51b815260040161099a90613f09565b610c1583838361259f565b611f428282611b64565b6112a757600082815260c9602090815260408083206001600160a01b03851684529091529020805460ff19166001179055611f7a3390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b611fc88282611b64565b156112a757600082815260c9602090815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b7f189ab7a9244df0848122154315af71fe140f3db0fe014031783b0946b8c9d2e36112a781611cbc565b7f4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd91435460ff161561208257610c1583612710565b826001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa9250505080156120dc575060408051601f3d908101601f191682019092526120d991810190613f56565b60015b61213f5760405162461bcd60e51b815260206004820152602e60248201527f45524331393637557067726164653a206e657720696d706c656d656e7461746960448201526d6f6e206973206e6f74205555505360901b606482015260840161099a565b60008051602061416a83398151915281146121ae5760405162461bcd60e51b815260206004820152602960248201527f45524331393637557067726164653a20756e737570706f727465642070726f786044820152681a58589b195555525160ba1b606482015260840161099a565b50610c158383836127ac565b610c1583838360405180602001604052806000815250611bb2565b6000806121e183611837565b9050806001600160a01b0316846001600160a01b0316148061222857506001600160a01b038082166000908152606a602090815260408083209388168352929052205460ff165b806114e55750836001600160a01b031661224184610afc565b6001600160a01b031614949350505050565b600061225e82611837565b905061226e8160008460016127d1565b61227782611837565b600083815260696020908152604080832080546001600160a01b03199081169091556001600160a01b0385168085526068845282852080546000190190558785526067909352818420805490911690555192935084927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b600054610100900460ff1661231d5760405162461bcd60e51b815260040161099a90613f6f565b61233c733cc6cdda760b79bafa08df41ecfa224f810dceb66001612832565b565b600054610100900460ff166123655760405162461bcd60e51b815260040161099a90613f6f565b6112a782826129d9565b600054610100900460ff1661233c5760405162461bcd60e51b815260040161099a90613f6f565b6112a78282611f38565b6112a7338383612a27565b6123b533836121d5565b6123d15760405162461bcd60e51b815260040161099a90613f09565b610bfb84848484612af5565b60606101608054610a7990613bbc565b606060006123fa83612b28565b600101905060008167ffffffffffffffff81111561241a5761241a61392d565b6040519080825280601f01601f191660200182016040528015612444576020820181803683370190505b5090508181016020015b600019016f181899199a1a9b1b9c1cb0b131b232b360811b600a86061a8153600a850494508461244e57509392505050565b60006001600160e01b0319821663780e9d6360e01b1480610912575061091282612c00565b6124af8282611b64565b6112a7576124bc81612c50565b6124c7836020612c62565b6040516020016124d8929190613fba565b60408051601f198184030181529082905262461bcd60e51b825261099a916004016136e0565b6125088383612dfe565b6125156000848484612f97565b610c155760405162461bcd60e51b815260040161099a9061402f565b600081815260696020526040902080546001600160a01b0319166001600160a01b038416908117909155819061256682611837565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b826001600160a01b03166125b282611837565b6001600160a01b0316146125d85760405162461bcd60e51b815260040161099a90614081565b6001600160a01b03821661263a5760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b606482015260840161099a565b61264783838360016127d1565b826001600160a01b031661265a82611837565b6001600160a01b0316146126805760405162461bcd60e51b815260040161099a90614081565b600081815260696020908152604080832080546001600160a01b03199081169091556001600160a01b0387811680865260688552838620805460001901905590871680865283862080546001019055868652606790945282852080549092168417909155905184937fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b6001600160a01b0381163b61277d5760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b606482015260840161099a565b60008051602061416a83398151915280546001600160a01b0319166001600160a01b0392909216919091179055565b6127b583613095565b6000825111806127c25750805b15610c1557610bfb83836130d5565b60008281526101626020526040902054156128265760405162461bcd60e51b8152602060048201526015602482015274151bdad95b881b1bd8dad95908189e48195d995b9d605a1b604482015260640161099a565b610bfb848484846131c9565b600054610100900460ff166128595760405162461bcd60e51b815260040161099a90613f6f565b6daaeb6d7670e522a718067333cd4e3b156112a75760405163c3c5a54760e01b81523060048201526daaeb6d7670e522a718067333cd4e9063c3c5a547906024016020604051808303816000875af11580156128b9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128dd9190613eec565b6112a757801561295957604051633e9f1edf60e11b81523060048201526001600160a01b03831660248201526daaeb6d7670e522a718067333cd4e90637d3e3dbe906044015b600060405180830381600087803b15801561293d57600080fd5b505af1158015612951573d6000803e3d6000fd5b505050505050565b6001600160a01b038216156129a85760405163a0af290360e01b81523060048201526001600160a01b03831660248201526daaeb6d7670e522a718067333cd4e9063a0af290390604401612923565b604051632210724360e11b81523060048201526daaeb6d7670e522a718067333cd4e90634420e48690602401612923565b600054610100900460ff16612a005760405162461bcd60e51b815260040161099a90613f6f565b8151612a1390606590602085019061355d565b508051610c1590606690602084019061355d565b816001600160a01b0316836001600160a01b031603612a885760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c657200000000000000604482015260640161099a565b6001600160a01b038381166000818152606a6020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b612b0084848461259f565b612b0c84848484612f97565b610bfb5760405162461bcd60e51b815260040161099a9061402f565b60008072184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b8310612b675772184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b830492506040015b6d04ee2d6d415b85acef81000000008310612b93576d04ee2d6d415b85acef8100000000830492506020015b662386f26fc100008310612bb157662386f26fc10000830492506010015b6305f5e1008310612bc9576305f5e100830492506008015b6127108310612bdd57612710830492506004015b60648310612bef576064830492506002015b600a83106109125760010192915050565b60006001600160e01b031982166380ac58cd60e01b1480612c3157506001600160e01b03198216635b5e139f60e01b145b8061091257506301ffc9a760e01b6001600160e01b0319831614610912565b60606109126001600160a01b03831660145b60606000612c71836002613d96565b612c7c906002613c23565b67ffffffffffffffff811115612c9457612c9461392d565b6040519080825280601f01601f191660200182016040528015612cbe576020820181803683370190505b509050600360fc1b81600081518110612cd957612cd9613cb3565b60200101906001600160f81b031916908160001a905350600f60fb1b81600181518110612d0857612d08613cb3565b60200101906001600160f81b031916908160001a9053506000612d2c846002613d96565b612d37906001613c23565b90505b6001811115612daf576f181899199a1a9b1b9c1cb0b131b232b360811b85600f1660108110612d6b57612d6b613cb3565b1a60f81b828281518110612d8157612d81613cb3565b60200101906001600160f81b031916908160001a90535060049490941c93612da8816140c6565b9050612d3a565b508315611c3f5760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e74604482015260640161099a565b6001600160a01b038216612e545760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f2061646472657373604482015260640161099a565b6000818152606760205260409020546001600160a01b031615612eb95760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000604482015260640161099a565b612ec76000838360016127d1565b6000818152606760205260409020546001600160a01b031615612f2c5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000604482015260640161099a565b6001600160a01b038216600081815260686020908152604080832080546001019055848352606790915280822080546001600160a01b0319168417905551839291907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b60006001600160a01b0384163b1561308d57604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290612fdb9033908990889088906004016140dd565b6020604051808303816000875af1925050508015613016575060408051601f3d908101601f191682019092526130139181019061411a565b60015b613073573d808015613044576040519150601f19603f3d011682016040523d82523d6000602084013e613049565b606091505b50805160000361306b5760405162461bcd60e51b815260040161099a9061402f565b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490506114e5565b5060016114e5565b61309e81612710565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b60606001600160a01b0383163b61313d5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a2064656c65676174652063616c6c20746f206e6f6e2d636f6044820152651b9d1c9858dd60d21b606482015260840161099a565b600080846001600160a01b0316846040516131589190614137565b600060405180830381855af49150503d8060008114613193576040519150601f19603f3d011682016040523d82523d6000602084013e613198565b606091505b50915091506131c0828260405180606001604052806027815260200161418a60279139613302565b95945050505050565b6131d58484848461331b565b60018111156132445760405162461bcd60e51b815260206004820152603560248201527f455243373231456e756d657261626c653a20636f6e7365637574697665207472604482015274185b9cd9995c9cc81b9bdd081cdd5c1c1bdc9d1959605a1b606482015260840161099a565b816001600160a01b0385166132a05761329b81609980546000838152609a60205260408120829055600182018355919091527f72a152ddfb8e864297c917af52ea6c1c68aead0fee1a62673fcc7e0c94979d000155565b6132c3565b836001600160a01b0316856001600160a01b0316146132c3576132c385826133a3565b6001600160a01b0384166132df576132da81613440565b611bd8565b846001600160a01b0316846001600160a01b031614611bd857611bd884826134ef565b60608315613311575081611c3f565b611c3f8383613533565b6001811115610bfb576001600160a01b03841615613361576001600160a01b0384166000908152606860205260408120805483929061335b908490613c0c565b90915550505b6001600160a01b03831615610bfb576001600160a01b03831660009081526068602052604081208054839290613398908490613c23565b909155505050505050565b600060016133b0846118d9565b6133ba9190613c0c565b60008381526098602052604090205490915080821461340d576001600160a01b03841660009081526097602090815260408083208584528252808320548484528184208190558352609890915290208190555b5060009182526098602090815260408084208490556001600160a01b039094168352609781528383209183525290812055565b60995460009061345290600190613c0c565b6000838152609a60205260408120546099805493945090928490811061347a5761347a613cb3565b90600052602060002001549050806099838154811061349b5761349b613cb3565b6000918252602080832090910192909255828152609a909152604080822084905585825281205560998054806134d3576134d3614153565b6001900381819060005260206000200160009055905550505050565b60006134fa836118d9565b6001600160a01b039093166000908152609760209081526040808320868452825280832085905593825260989052919091209190915550565b8151156135435781518083602001fd5b8060405162461bcd60e51b815260040161099a91906136e0565b82805461356990613bbc565b90600052602060002090601f01602090048101928261358b57600085556135d1565b82601f106135a457805160ff19168380011785556135d1565b828001600101855582156135d1579182015b828111156135d15782518255916020019190600101906135b6565b506135dd9291506135e1565b5090565b5b808211156135dd57600081556001016135e2565b6001600160e01b03198116811461138757600080fd5b60006020828403121561361e57600080fd5b8135611c3f816135f6565b80356001600160a01b038116811461364057600080fd5b919050565b6000806040838503121561365857600080fd5b61366183613629565b915060208301356001600160601b038116811461367d57600080fd5b809150509250929050565b60005b838110156136a357818101518382015260200161368b565b83811115610bfb5750506000910152565b600081518084526136cc816020860160208601613688565b601f01601f19169290920160200192915050565b602081526000611c3f60208301846136b4565b60006020828403121561370557600080fd5b5035919050565b6000806040838503121561371f57600080fd5b823560ff8116811461373057600080fd5b915061373e60208401613629565b90509250929050565b6000806040838503121561375a57600080fd5b61376383613629565b946020939093013593505050565b60008060006060848603121561378657600080fd5b61378f84613629565b925061379d60208501613629565b9150604084013590509250925092565b6000602082840312156137bf57600080fd5b611c3f82613629565b60008083601f8401126137da57600080fd5b50813567ffffffffffffffff8111156137f257600080fd5b602083019150836020828501011115610ef857600080fd5b6000806000806040858703121561382057600080fd5b843567ffffffffffffffff8082111561383857600080fd5b613844888389016137c8565b9096509450602087013591508082111561385d57600080fd5b818701915087601f83011261387157600080fd5b81358181111561388057600080fd5b8860208260051b850101111561389557600080fd5b95989497505060200194505050565b600080604083850312156138b757600080fd5b50508035926020909101359150565b600080604083850312156138d957600080fd5b8235915061373e60208401613629565b6020808252825182820181905260009190848201906040850190845b8181101561392157835183529284019291840191600101613905565b50909695505050505050565b634e487b7160e01b600052604160045260246000fd5b600067ffffffffffffffff8084111561395e5761395e61392d565b604051601f8501601f19908116603f011681019082821181831017156139865761398661392d565b8160405280935085815286868601111561399f57600080fd5b858560208301376000602087830101525050509392505050565b600082601f8301126139ca57600080fd5b611c3f83833560208501613943565b600080604083850312156139ec57600080fd5b6139f583613629565b9150602083013567ffffffffffffffff811115613a1157600080fd5b613a1d858286016139b9565b9150509250929050565b600060208284031215613a3957600080fd5b813567ffffffffffffffff811115613a5057600080fd5b8201601f81018413613a6157600080fd5b6114e584823560208401613943565b600080600060408486031215613a8557600080fd5b833567ffffffffffffffff811115613a9c57600080fd5b613aa8868287016137c8565b909790965060209590950135949350505050565b801515811461138757600080fd5b60008060408385031215613add57600080fd5b613ae683613629565b9150602083013561367d81613abc565b60008060008060808587031215613b0c57600080fd5b613b1585613629565b9350613b2360208601613629565b925060408501359150606085013567ffffffffffffffff811115613b4657600080fd5b613b52878288016139b9565b91505092959194509250565b60008060208385031215613b7157600080fd5b823567ffffffffffffffff811115613b8857600080fd5b613b94858286016137c8565b90969095509350505050565b60008060408385031215613bb357600080fd5b61373083613629565b600181811c90821680613bd057607f821691505b602082108103613bf057634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b600082821015613c1e57613c1e613bf6565b500390565b60008219821115613c3657613c36613bf6565b500190565b600060ff821660ff8103613c5157613c51613bf6565b60010192915050565b8183823760009101908152919050565b60208082526029908201527f546f6b656e496473206c656e677468206d7573742062652067726561746572206040820152687468616e207a65726f60b81b606082015260800190565b634e487b7160e01b600052603260045260246000fd5b6020808252602f908201527f43616c6c6572206d757374206265206f776e6572206f6620746f6b656e206f7260408201526e1031b7b73a3930b1ba1037bbb732b960891b606082015260800190565b60808152856080820152858760a0830137600060a08783018101829052601f19601f8901168301838103820160208501529081018690526001600160fb1b03861115613d6357600080fd5b8560051b808860c08401376000910160c0019081526001600160a01b039490941660408301525060600152949350505050565b6000816000190483118215151615613db057613db0613bf6565b500290565b600082613dd257634e487b7160e01b600052601260045260246000fd5b500490565b6020808252602c908201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060408201526b19195b1959d85d1958d85b1b60a21b606082015260800190565b6020808252602c908201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060408201526b6163746976652070726f787960a01b606082015260800190565b6020808252602e908201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160408201526d191e481a5b9a5d1a585b1a5e995960921b606082015260800190565b60008351613ecf818460208801613688565b835190830190613ee3818360208801613688565b01949350505050565b600060208284031215613efe57600080fd5b8151611c3f81613abc565b6020808252602d908201527f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560408201526c1c881bdc88185c1c1c9bdd9959609a1b606082015260800190565b600060208284031215613f6857600080fd5b5051919050565b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000815260008351613ff2816017850160208801613688565b7001034b99036b4b9b9b4b733903937b6329607d1b6017918401918201528351614023816028840160208801613688565b01602801949350505050565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b60208082526025908201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060408201526437bbb732b960d91b606082015260800190565b6000816140d5576140d5613bf6565b506000190190565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090614110908301846136b4565b9695505050505050565b60006020828403121561412c57600080fd5b8151611c3f816135f6565b60008251614149818460208701613688565b9190910192915050565b634e487b7160e01b600052603160045260246000fdfe360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c65649f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a6a26469706673582212204829cfd265502d468990a417d717e50939663194bfb2c47e0917bb24ebd2c52464736f6c634300080d0033
Deployed Bytecode Sourcemap
110646:9313:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;119609:345;;;;;;;;;;-1:-1:-1;119609:345:0;;;;;:::i;:::-;;:::i;:::-;;;565:14:1;;558:22;540:41;;528:2;513:18;119609:345:0;;;;;;;;117377:393;;;;;;;;;;-1:-1:-1;117377:393:0;;;;;:::i;:::-;;:::i;:::-;;86226:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;87749:171::-;;;;;;;;;;-1:-1:-1;87749:171:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;2241:32:1;;;2223:51;;2211:2;2196:18;87749:171:0;2077:203:1;113243:373:0;;;;;;;;;;-1:-1:-1;113243:373:0;;;;;:::i;:::-;;:::i;118669:196::-;;;;;;;;;;-1:-1:-1;118669:196:0;;;;;:::i;:::-;;:::i;103436:113::-;;;;;;;;;;-1:-1:-1;103524:10:0;:17;103436:113;;;3038:25:1;;;3026:2;3011:18;103436:113:0;2892:177:1;118873:202:0;;;;;;;;;;-1:-1:-1;118873:202:0;;;;;:::i;:::-;;:::i;79380:131::-;;;;;;;;;;-1:-1:-1;79380:131:0;;;;;:::i;:::-;79454:7;79481:12;;;:6;:12;;;;;:22;;;;79380:131;111729:40;;;;;;;;;;-1:-1:-1;111729:40:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;113929:897;;;;;;;;;;-1:-1:-1;113929:897:0;;;;;:::i;:::-;;:::i;118014:314::-;;;;;;;;;;-1:-1:-1;118014:314:0;;;;;:::i;:::-;;:::i;:::-;;;;-1:-1:-1;;;;;5672:32:1;;;5654:51;;5736:2;5721:18;;5714:34;;;;5627:18;118014:314:0;5480:274:1;79821:147:0;;;;;;;;;;-1:-1:-1;79821:147:0;;;;;:::i;:::-;;:::i;103093:267::-;;;;;;;;;;-1:-1:-1;103093:267:0;;;;;:::i;:::-;;:::i;114875:923::-;;;;;;;;;;-1:-1:-1;114875:923:0;;;;;:::i;:::-;;:::i;111121:42::-;;;;;;;;;;;;111160:3;111121:42;;80965:218;;;;;;;;;;-1:-1:-1;80965:218:0;;;;;:::i;:::-;;:::i;70325:200::-;;;;;;;;;;-1:-1:-1;70325:200:0;;;;;:::i;:::-;;:::i;117896:110::-;;;;;;;;;;-1:-1:-1;117975:12:0;:23;-1:-1:-1;;;117975:23:0;;-1:-1:-1;;;;;117975:23:0;117896:110;;119083:210;;;;;;;;;;-1:-1:-1;119083:210:0;;;;;:::i;:::-;;:::i;113624:::-;;;;;;;;;;-1:-1:-1;113624:210:0;;;;;:::i;:::-;;:::i;115961:414::-;;;;;;;;;;-1:-1:-1;115961:414:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;70784:225::-;;;;;;:::i;:::-;;:::i;103626:244::-;;;;;;;;;;-1:-1:-1;103626:244:0;;;;;:::i;:::-;;:::i;70003:133::-;;;;;;;;;;;;;:::i;113075:160::-;;;;;;;;;;-1:-1:-1;113075:160:0;;;;;:::i;:::-;;:::i;112702:153::-;;;;;;;;;;;;;:::i;85936:223::-;;;;;;;;;;-1:-1:-1;85936:223:0;;;;;:::i;:::-;;:::i;115806:147::-;;;;;;;;;;-1:-1:-1;115806:147:0;;;;;:::i;:::-;;:::i;85667:207::-;;;;;;;;;;-1:-1:-1;85667:207:0;;;;;:::i;:::-;;:::i;112265:429::-;;;;;;;;;;;;;:::i;116986:128::-;;;;;;;;;;-1:-1:-1;116986:128:0;;;;;:::i;:::-;;:::i;117168:106::-;;;;;;;;;;-1:-1:-1;117168:106:0;;;;;:::i;:::-;;:::i;117282:87::-;;;;;;;;;;-1:-1:-1;117355:6:0;;-1:-1:-1;;;;;117355:6:0;117282:87;;77859:147;;;;;;;;;;-1:-1:-1;77859:147:0;;;;;:::i;:::-;;:::i;86395:104::-;;;;;;;;;;;;;:::i;76953:49::-;;;;;;;;;;-1:-1:-1;76953:49:0;76998:4;76953:49;;118446:215;;;;;;;;;;-1:-1:-1;118446:215:0;;;;;:::i;:::-;;:::i;116526:119::-;;;;;;;;;;-1:-1:-1;116526:119:0;;;;;:::i;:::-;116589:7;116616:21;;;:11;:21;;;;;;;116526:119;117778:110;;;;;;;;;;-1:-1:-1;117853:12:0;:27;-1:-1:-1;;;;;117853:27:0;117778:110;;119301:255;;;;;;;;;;-1:-1:-1;119301:255:0;;;;;:::i;:::-;;:::i;86570:281::-;;;;;;;;;;-1:-1:-1;86570:281:0;;;;;:::i;:::-;;:::i;110948:62::-;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;110948:62:0;;80261:149;;;;;;;;;;-1:-1:-1;80261:149:0;;;;;:::i;:::-;;:::i;116383:135::-;;;;;;;;;;-1:-1:-1;116383:135:0;;;;;:::i;:::-;;:::i;88218:164::-;;;;;;;;;;-1:-1:-1;88218:164:0;;;;;:::i;:::-;-1:-1:-1;;;;;88339:25:0;;;88315:4;88339:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;88218:164;111017:66;;;;;;;;;;;;111057:26;111017:66;;119609:345;119780:4;-1:-1:-1;;;;;;119809:52:0;;-1:-1:-1;;;119809:52:0;;:92;;;119865:36;119889:11;119865:23;:36::i;:::-;119802:99;119609:345;-1:-1:-1;;119609:345:0:o;117377:393::-;-1:-1:-1;;;;;;;;;;;77444:16:0;77455:4;77444:10;:16::i;:::-;117512:6:::1;117495:13;-1:-1:-1::0;;;;;117495:23:0::1;;;117487:78;;;::::0;-1:-1:-1;;;117487:78:0;;10854:2:1;117487:78:0::1;::::0;::::1;10836:21:1::0;10893:2;10873:18;;;10866:30;10932:34;10912:18;;;10905:62;-1:-1:-1;;;10983:18:1;;;10976:40;11033:19;;117487:78:0::1;;;;;;;;;-1:-1:-1::0;;;;;117584:23:0;::::1;117576:61;;;::::0;-1:-1:-1;;;117576:61:0;;11265:2:1;117576:61:0::1;::::0;::::1;11247:21:1::0;11304:2;11284:18;;;11277:30;11343:27;11323:18;;;11316:55;11388:18;;117576:61:0::1;11063:349:1::0;117576:61:0::1;117665:37;::::0;;;;::::1;::::0;;-1:-1:-1;;;;;117665:37:0;::::1;::::0;;;-1:-1:-1;;;;;117665:37:0;::::1;;::::0;;::::1;::::0;;;-1:-1:-1;;;117650:52:0;::::1;::::0;::::1;:12;:52:::0;117718:44;;11590:51:1;;;11657:18;;;11650:67;;;;117718:44:0::1;::::0;11563:18:1;117718:44:0::1;;;;;;;117377:393:::0;;;:::o;86226:100::-;86280:13;86313:5;86306:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;86226:100;:::o;87749:171::-;87825:7;87845:23;87860:7;87845:14;:23::i;:::-;-1:-1:-1;87888:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;87888:24:0;;87749:171::o;113243:373::-;-1:-1:-1;;;;;;;;;;;77444:16:0;77455:4;77444:10;:16::i;:::-;111160:3:::1;113364;113332:35;;113360:1;113332:25;:15;110060:14:::0;;109968:114;113332:25:::1;:29;;;;:::i;:::-;:35;;;;:::i;:::-;:51;;113324:95;;;::::0;-1:-1:-1;;;113324:95:0;;12710:2:1;113324:95:0::1;::::0;::::1;12692:21:1::0;12749:2;12729:18;;;12722:30;12788:32;12768:18;;;12761:60;12838:18;;113324:95:0::1;12508:354:1::0;113324:95:0::1;113434:7;113430:179;113451:3;113447:7;;:1;:7;;;113430:179;;;113475:15;113493:25;:15;110060:14:::0;;109968:114;113493:25:::1;113475:43;;113533:27;:15;110179:19:::0;;110197:1;110179:19;;;110090:127;113533:27:::1;113575:22;113585:2;113589:7;113575:9;:22::i;:::-;-1:-1:-1::0;113456:3:0;::::1;::::0;::::1;:::i;:::-;;;;113430:179;;;;113243:373:::0;;;:::o;118669:196::-;118804:8;57587:30;57608:8;57587:20;:30::i;:::-;118825:32:::1;118839:8;118849:7;118825:13;:32::i;:::-;118669:196:::0;;;:::o;118873:202::-;119013:4;-1:-1:-1;;;;;57312:18:0;;57320:10;57312:18;57308:83;;57347:32;57368:10;57347:20;:32::i;:::-;119030:37:::1;119049:4;119055:2;119059:7;119030:18;:37::i;113929:897::-:0;114026:15;114042:8;;114026:25;;;;;;;:::i;:::-;;;;;;;;;;;;;;114055:1;114026:30;114018:56;;;;-1:-1:-1;;;114018:56:0;;13527:2:1;114018:56:0;;;13509:21:1;13566:2;13546:18;;;13539:30;-1:-1:-1;;;13585:18:1;;;13578:44;13639:18;;114018:56:0;13325:338:1;114018:56:0;114093:20;114085:73;;;;-1:-1:-1;;;114085:73:0;;;;;;;:::i;:::-;114197:2;114177:22;;;114169:52;;;;-1:-1:-1;;;114169:52:0;;14280:2:1;114169:52:0;;;14262:21:1;14319:2;14299:18;;;14292:30;-1:-1:-1;;;14338:18:1;;;14331:48;14396:18;;114169:52:0;14078:342:1;114169:52:0;114236:9;114232:517;114251:18;;;114232:517;;;114286:16;114305:9;;114315:1;114305:12;;;;;;;:::i;:::-;;;;;;;114286:31;;114354:17;114362:8;114354:7;:17::i;:::-;-1:-1:-1;;;;;114340:31:0;:10;-1:-1:-1;;;;;114340:31:0;;:66;;;;114375:31;-1:-1:-1;;;;;;;;;;;114395:10:0;114375:7;:31::i;:::-;114332:144;;;;-1:-1:-1;;;114332:144:0;;;;;;;:::i;:::-;114499:15;114515:8;;114499:25;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;:35;;;;;;;;;:40;114491:89;;;;-1:-1:-1;;;114491:89:0;;15175:2:1;114491:89:0;;;15157:21:1;15214:2;15194:18;;;15187:30;15253:34;15233:18;;;15226:62;-1:-1:-1;;;15304:18:1;;;15297:35;15349:19;;114491:89:0;14973:401:1;114491:89:0;114633:1;114595:15;114611:8;;114595:25;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;:35;;;;;;;;;;:39;;;;114649:11;:21;;;;;:26;;114674:1;;114595:35;114649:26;;114674:1;;114649:26;:::i;:::-;;;;-1:-1:-1;;;114719:3:0;;114232:517;;;;114764:54;114769:8;;114779:9;;114790:10;114802:15;114764:54;;;;;;;;;;;:::i;:::-;;;;;;;;113929:897;;;;:::o;118014:314::-;118142:12;118184:19;;118086:7;;;;-1:-1:-1;;;;;118184:19:0;;;118086:7;;118271:6;;118239:28;;-1:-1:-1;;;118252:15:0;;-1:-1:-1;;;;;118252:15:0;118239:10;:28;:::i;:::-;118238:39;;;;:::i;:::-;118296:8;;-1:-1:-1;118214:63:0;;-1:-1:-1;;;118014:314:0;;;;;;:::o;79821:147::-;79454:7;79481:12;;;:6;:12;;;;;:22;;;77444:16;77455:4;77444:10;:16::i;:::-;79935:25:::1;79946:4;79952:7;79935:10;:25::i;103093:267::-:0;103190:7;103226:34;103254:5;103226:27;:34::i;:::-;103218:5;:42;103210:98;;;;-1:-1:-1;;;103210:98:0;;17093:2:1;103210:98:0;;;17075:21:1;17132:2;17112:18;;;17105:30;17171:34;17151:18;;;17144:62;-1:-1:-1;;;17222:18:1;;;17215:41;17273:19;;103210:98:0;16891:407:1;103210:98:0;-1:-1:-1;;;;;;103326:19:0;;;;;;;;:12;:19;;;;;;;;:26;;;;;;;;;103093:267::o;114875:923::-;114974:20;114966:73;;;;-1:-1:-1;;;114966:73:0;;;;;;;:::i;:::-;115078:2;115058:22;;;115050:52;;;;-1:-1:-1;;;115050:52:0;;14280:2:1;115050:52:0;;;14262:21:1;14319:2;14299:18;;;14292:30;-1:-1:-1;;;14338:18:1;;;14331:48;14396:18;;115050:52:0;14078:342:1;115050:52:0;115117:9;115113:606;115132:18;;;115113:606;;;115167:16;115186:9;;115196:1;115186:12;;;;;;;:::i;:::-;;;;;;;115167:31;;115235:17;115243:8;115235:7;:17::i;:::-;-1:-1:-1;;;;;115221:31:0;:10;-1:-1:-1;;;;;115221:31:0;;:66;;;;115256:31;-1:-1:-1;;;;;;;;;;;115276:10:0;115256:7;:31::i;:::-;115221:90;;;-1:-1:-1;115300:10:0;115291:20;;;;:8;:20;;;;;;;;115221:90;115213:167;;;;-1:-1:-1;;;115213:167:0;;;;;;;:::i;:::-;115403:15;115419:8;;115403:25;;;;;;;:::i;:::-;;;;;;;;;;;;;:35;115429:8;115403:35;;;;;;;;;;;;115442:1;115403:40;115395:85;;;;-1:-1:-1;;;115395:85:0;;17505:2:1;115395:85:0;;;17487:21:1;17544:2;17524:18;;;17517:30;17583:34;17563:18;;;17556:62;-1:-1:-1;;;17634:18:1;;;17627:31;17675:19;;115395:85:0;17303:397:1;115395:85:0;115533:1;115495:15;115511:8;;115495:25;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;:35;;;;;;;;;;:39;;;;115557:11;:21;;;;;;115582:1;-1:-1:-1;115557:26:0;115549:55;;;;-1:-1:-1;;;115549:55:0;;17907:2:1;115549:55:0;;;17889:21:1;17946:2;17926:18;;;17919:30;-1:-1:-1;;;17965:18:1;;;17958:47;18022:18;;115549:55:0;17705:341:1;115549:55:0;115619:21;;;;:11;:21;;;;;:26;;115644:1;;115619:21;:26;;115644:1;;115619:26;:::i;:::-;;;;-1:-1:-1;;;115689:3:0;;115113:606;;;;115734:56;115741:8;;115751:9;;115762:10;115774:15;115734:56;;;;;;;;;;;:::i;80965:218::-;-1:-1:-1;;;;;81061:23:0;;74303:10;81061:23;81053:83;;;;-1:-1:-1;;;81053:83:0;;18253:2:1;81053:83:0;;;18235:21:1;18292:2;18272:18;;;18265:30;18331:34;18311:18;;;18304:62;-1:-1:-1;;;18382:18:1;;;18375:45;18437:19;;81053:83:0;18051:411:1;81053:83:0;81149:26;81161:4;81167:7;81149:11;:26::i;:::-;80965:218;;:::o;70325:200::-;-1:-1:-1;;;;;68873:6:0;68856:23;68864:4;68856:23;68848:80;;;;-1:-1:-1;;;68848:80:0;;;;;;;:::i;:::-;68971:6;-1:-1:-1;;;;;68947:30:0;:20;-1:-1:-1;;;;;;;;;;;60660:65:0;-1:-1:-1;;;;;60660:65:0;;60580:153;68947:20;-1:-1:-1;;;;;68947:30:0;;68939:87;;;;-1:-1:-1;;;68939:87:0;;;;;;;:::i;:::-;70409:36:::1;70427:17;70409;:36::i;:::-;70497:12;::::0;;70507:1:::1;70497:12:::0;;;::::1;::::0;::::1;::::0;;;70456:61:::1;::::0;70478:17;;70497:12;70456:21:::1;:61::i;:::-;70325:200:::0;:::o;119083:210::-;119227:4;-1:-1:-1;;;;;57312:18:0;;57320:10;57312:18;57308:83;;57347:32;57368:10;57347:20;:32::i;:::-;119244:41:::1;119267:4;119273:2;119277:7;119244:22;:41::i;113624:210::-:0;113695:41;74303:10;113714:12;113728:7;113695:18;:41::i;:::-;113673:128;;;;-1:-1:-1;;;113673:128:0;;19495:2:1;113673:128:0;;;19477:21:1;19534:2;19514:18;;;19507:30;19573:34;19553:18;;;19546:62;-1:-1:-1;;;19624:18:1;;;19617:35;19669:19;;113673:128:0;19293:401:1;113673:128:0;113812:14;113818:7;113812:5;:14::i;115961:414::-;116066:16;116094:24;116135:9;116121:31;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;116121:31:0;;116094:58;;116167:9;116163:180;116182:18;;;116163:180;;;116230:15;116246:8;;116230:25;;;;;;;:::i;:::-;;;;;;;;;;;;;:39;116256:9;;116266:1;116256:12;;;;;;;:::i;:::-;;;;;;;116230:39;;;;;;;;;;;;116217:7;116225:1;116217:10;;;;;;;;:::i;:::-;;;;;;;;;;:52;116313:3;;116163:180;;;-1:-1:-1;116360:7:0;-1:-1:-1;115961:414:0;;;;;;;:::o;70784:225::-;-1:-1:-1;;;;;68873:6:0;68856:23;68864:4;68856:23;68848:80;;;;-1:-1:-1;;;68848:80:0;;;;;;;:::i;:::-;68971:6;-1:-1:-1;;;;;68947:30:0;:20;-1:-1:-1;;;;;;;;;;;60660:65:0;-1:-1:-1;;;;;60660:65:0;;60580:153;68947:20;-1:-1:-1;;;;;68947:30:0;;68939:87;;;;-1:-1:-1;;;68939:87:0;;;;;;;:::i;:::-;70902:36:::1;70920:17;70902;:36::i;:::-;70949:52;70971:17;70990:4;70996;70949:21;:52::i;103626:244::-:0;103701:7;103737:41;103524:10;:17;;103436:113;103737:41;103729:5;:49;103721:106;;;;-1:-1:-1;;;103721:106:0;;19901:2:1;103721:106:0;;;19883:21:1;19940:2;19920:18;;;19913:30;19979:34;19959:18;;;19952:62;-1:-1:-1;;;20030:18:1;;;20023:42;20082:19;;103721:106:0;19699:408:1;103721:106:0;103845:10;103856:5;103845:17;;;;;;;;:::i;:::-;;;;;;;;;103838:24;;103626:244;;;:::o;70003:133::-;70081:7;69309:4;-1:-1:-1;;;;;69318:6:0;69301:23;;69293:92;;;;-1:-1:-1;;;69293:92:0;;20314:2:1;69293:92:0;;;20296:21:1;20353:2;20333:18;;;20326:30;20392:34;20372:18;;;20365:62;20463:26;20443:18;;;20436:54;20507:19;;69293:92:0;20112:420:1;69293:92:0;-1:-1:-1;;;;;;;;;;;;70003:133:0;:::o;113075:160::-;-1:-1:-1;;;;;;;;;;;77444:16:0;77455:4;77444:10;:16::i;:::-;113184:1:::1;113169:4;113163:18;:22;113155:49;;;::::0;-1:-1:-1;;;113155:49:0;;20739:2:1;113155:49:0::1;::::0;::::1;20721:21:1::0;20778:2;20758:18;;;20751:30;-1:-1:-1;;;20797:18:1;;;20790:44;20851:18;;113155:49:0::1;20537:338:1::0;113155:49:0::1;113215:12:::0;;::::1;::::0;:5:::1;::::0;:12:::1;::::0;::::1;::::0;::::1;:::i;112702:153::-:0;-1:-1:-1;;;;;;;;;;;77444:16:0;77455:4;77444:10;:16::i;:::-;52926:13:::1;::::0;112769:1:::1;::::0;52926:13:::1;::::0;::::1;;;52925:14;:40:::0;::::1;;;-1:-1:-1::0;52943:12:0::1;::::0;:22:::1;::::0;;::::1;:12:::0;::::1;:22;52925:40;52917:99;;;;-1:-1:-1::0;;;52917:99:0::1;;;;;;;:::i;:::-;53027:12;:22:::0;;-1:-1:-1;;53060:20:0;53027:22:::1;::::0;::::1;53060:20:::0;53027:22:::1;53060:20;::::0;;112783:32:::2;:30;:32::i;:::-;112826:6;:21:::0;;-1:-1:-1;;;;;;112826:21:0::2;74303:10:::0;112826:21:::2;::::0;;-1:-1:-1;53103:21:0;;-1:-1:-1;;53103:21:0::1;::::0;;53140:20:::1;::::0;;21467:4:1;21455:17;;21437:36;;53140:20:0;;::::1;::::0;;;;21425:2:1;53140:20:0;;::::1;77471:1;112702:153:::0;:::o;85936:223::-;86008:7;90834:16;;;:7;:16;;;;;;-1:-1:-1;;;;;90834:16:0;;86072:56;;;;-1:-1:-1;;;86072:56:0;;21686:2:1;86072:56:0;;;21668:21:1;21725:2;21705:18;;;21698:30;-1:-1:-1;;;21744:18:1;;;21737:54;21808:18;;86072:56:0;21484:348:1;115806:147:0;-1:-1:-1;;;;;;;;;;;77444:16:0;77455:4;77444:10;:16::i;:::-;115939:6:::1;115911:15;115927:8;;115911:25;;;;;;;:::i;:::-;::::0;;;::::1;::::0;;;;;::::1;::::0;;;:34;-1:-1:-1;;;;115806:147:0:o;85667:207::-;85739:7;-1:-1:-1;;;;;85767:19:0;;85759:73;;;;-1:-1:-1;;;85759:73:0;;22039:2:1;85759:73:0;;;22021:21:1;22078:2;22058:18;;;22051:30;22117:34;22097:18;;;22090:62;-1:-1:-1;;;22168:18:1;;;22161:39;22217:19;;85759:73:0;21837:405:1;85759:73:0;-1:-1:-1;;;;;;85850:16:0;;;;;:9;:16;;;;;;;85667:207::o;112265:429::-;51288:19;51311:13;;;;;;51310:14;;51358:34;;;;-1:-1:-1;51376:12:0;;51391:1;51376:12;;;;:16;51358:34;51357:108;;;-1:-1:-1;51437:4:0;40949:19;:23;;;51398:66;;-1:-1:-1;51447:12:0;;;;;:17;51398:66;51335:204;;;;-1:-1:-1;;;51335:204:0;;;;;;;:::i;:::-;51550:12;:16;;-1:-1:-1;;51550:16:0;51565:1;51550:16;;;51577:67;;;;51612:13;:20;;-1:-1:-1;;51612:20:0;;;;;51577:67;112316:42:::1;;;;;;;;;;;;;;-1:-1:-1::0;;;112316:42:0::1;;::::0;::::1;;;;;;;;;;;;;-1:-1:-1::0;;;112316:42:0::1;;::::0;:13:::1;:42::i;:::-;112369:25;:23;:25::i;:::-;112405:22;:20;:22::i;:::-;112438:24;:22;:24::i;:::-;112504:27;:15;110179:19:::0;;110197:1;110179:19;;;110090:127;112504:27:::1;112544:44;76998:4;74303:10:::0;112544::::1;:44::i;:::-;112599:37;-1:-1:-1::0;;;;;;;;;;;74303:10:0;112544::::1;:44::i;112599:37::-;112647:39;111057:26;74303:10:::0;112544::::1;:44::i;112647:39::-;51670:14:::0;51666:102;;;51717:5;51701:21;;-1:-1:-1;;51701:21:0;;;51742:14;;-1:-1:-1;21437:36:1;;51742:14:0;;21425:2:1;21410:18;51742:14:0;;;;;;;51277:498;112265:429::o;116986:128::-;-1:-1:-1;;;;;;;;;;;77444:16:0;77455:4;77444:10;:16::i;:::-;-1:-1:-1;;;;;;117079:18:0;;;::::1;;::::0;;;:8:::1;:18;::::0;;;;:27;;-1:-1:-1;;117079:27:0::1;::::0;::::1;;::::0;;;::::1;::::0;;116986:128::o;117168:106::-;-1:-1:-1;;;;;;;;;;;77444:16:0;77455:4;77444:10;:16::i;:::-;-1:-1:-1;117249:6:0::1;:17:::0;;-1:-1:-1;;;;;;117249:17:0::1;-1:-1:-1::0;;;;;117249:17:0;;;::::1;::::0;;;::::1;::::0;;117168:106::o;77859:147::-;77945:4;77969:12;;;:6;:12;;;;;;;;-1:-1:-1;;;;;77969:29:0;;;;;;;;;;;;;;;77859:147::o;86395:104::-;86451:13;86484:7;86477:14;;;;;:::i;118446:215::-;118589:8;57587:30;57608:8;57587:20;:30::i;:::-;118610:43:::1;118634:8;118644;118610:23;:43::i;119301:255::-:0;119479:4;-1:-1:-1;;;;;57312:18:0;;57320:10;57312:18;57308:83;;57347:32;57368:10;57347:20;:32::i;:::-;119501:47:::1;119524:4;119530:2;119534:7;119543:4;119501:22;:47::i;:::-;119301:255:::0;;;;;:::o;86570:281::-;86643:13;86669:23;86684:7;86669:14;:23::i;:::-;86705:21;86729:10;:8;:10::i;:::-;86705:34;;86781:1;86763:7;86757:21;:25;:86;;;;;;;;;;;;;;;;;86809:7;86818:18;:7;:16;:18::i;:::-;86792:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;86757:86;86750:93;86570:281;-1:-1:-1;;;86570:281:0:o;80261:149::-;79454:7;79481:12;;;:6;:12;;;;;:22;;;77444:16;77455:4;77444:10;:16::i;:::-;80376:26:::1;80388:4;80394:7;80376:11;:26::i;116383:135::-:0;116458:7;116485:15;116501:8;;116485:25;;;;;;;:::i;:::-;;;;;;;;;;;;;;116478:32;;116383:135;;;;:::o;77552:215::-;77637:4;-1:-1:-1;;;;;;77661:58:0;;-1:-1:-1;;;77661:58:0;;:98;;;77723:36;77747:11;77723:23;:36::i;78310:105::-;78377:30;78388:4;74303:10;78377;:30::i;97590:135::-;91236:4;90834:16;;;:7;:16;;;;;;-1:-1:-1;;;;;90834:16:0;97664:53;;;;-1:-1:-1;;;97664:53:0;;21686:2:1;97664:53:0;;;21668:21:1;21725:2;21705:18;;;21698:30;-1:-1:-1;;;21744:18:1;;;21737:54;21808:18;;97664:53:0;21484:348:1;92083:110:0;92159:26;92169:2;92173:7;92159:26;;;;;;;;;;;;:9;:26::i;57731:675::-;55689:42;57922:45;:49;57918:481;;58249:67;;-1:-1:-1;;;58249:67:0;;58300:4;58249:67;;;23133:34:1;-1:-1:-1;;;;;23203:15:1;;23183:18;;;23176:43;55689:42:0;;58249;;23068:18:1;;58249:67:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;58244:144;;58344:28;;-1:-1:-1;;;58344:28:0;;-1:-1:-1;;;;;2241:32:1;;58344:28:0;;;2223:51:1;2196:18;;58344:28:0;2077:203:1;87256:427:0;87337:13;87353:34;87379:7;87353:25;:34::i;:::-;87337:50;;87412:5;-1:-1:-1;;;;;87406:11:0;:2;-1:-1:-1;;;;;87406:11:0;;87398:57;;;;-1:-1:-1;;;87398:57:0;;23682:2:1;87398:57:0;;;23664:21:1;23721:2;23701:18;;;23694:30;23760:34;23740:18;;;23733:62;-1:-1:-1;;;23811:18:1;;;23804:31;23852:19;;87398:57:0;23480:397:1;87398:57:0;74303:10;-1:-1:-1;;;;;87490:21:0;;;;:62;;-1:-1:-1;87515:37:0;87532:5;74303:10;88218:164;:::i;87515:37::-;87468:173;;;;-1:-1:-1;;;87468:173:0;;24084:2:1;87468:173:0;;;24066:21:1;24123:2;24103:18;;;24096:30;24162:34;24142:18;;;24135:62;24233:31;24213:18;;;24206:59;24282:19;;87468:173:0;23882:425:1;87468:173:0;87654:21;87663:2;87667:7;87654:8;:21::i;88449:335::-;88644:41;74303:10;88663:12;74223:98;88644:41;88636:99;;;;-1:-1:-1;;;88636:99:0;;;;;;;:::i;:::-;88748:28;88758:4;88764:2;88768:7;88748:9;:28::i;82562:238::-;82646:22;82654:4;82660:7;82646;:22::i;:::-;82641:152;;82685:12;;;;:6;:12;;;;;;;;-1:-1:-1;;;;;82685:29:0;;;;;;;;;:36;;-1:-1:-1;;82685:36:0;82717:4;82685:36;;;82768:12;74303:10;;74223:98;82768:12;-1:-1:-1;;;;;82741:40:0;82759:7;-1:-1:-1;;;;;82741:40:0;82753:4;82741:40;;;;;;;;;;82562:238;;:::o;82980:239::-;83064:22;83072:4;83078:7;83064;:22::i;:::-;83060:152;;;83135:5;83103:12;;;:6;:12;;;;;;;;-1:-1:-1;;;;;83103:29:0;;;;;;;;;;:37;;-1:-1:-1;;83103:37:0;;;83160:40;74303:10;;83103:12;;83160:40;;83135:5;83160:40;82980:239;;:::o;112863:98::-;111057:26;77444:16;77455:4;77444:10;:16::i;61998:992::-;59951:66;62452:59;;;62448:535;;;62528:37;62547:17;62528:18;:37::i;62448:535::-;62631:17;-1:-1:-1;;;;;62602:61:0;;:63;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;62602:63:0;;;;;;;;-1:-1:-1;;62602:63:0;;;;;;;;;;;;:::i;:::-;;;62598:306;;62832:56;;-1:-1:-1;;;62832:56:0;;25117:2:1;62832:56:0;;;25099:21:1;25156:2;25136:18;;;25129:30;25195:34;25175:18;;;25168:62;-1:-1:-1;;;25246:18:1;;;25239:44;25300:19;;62832:56:0;24915:410:1;62598:306:0;-1:-1:-1;;;;;;;;;;;62716:28:0;;62708:82;;;;-1:-1:-1;;;62708:82:0;;25532:2:1;62708:82:0;;;25514:21:1;25571:2;25551:18;;;25544:30;25610:34;25590:18;;;25583:62;-1:-1:-1;;;25661:18:1;;;25654:39;25710:19;;62708:82:0;25330:405:1;62708:82:0;62666:140;62918:53;62936:17;62955:4;62961:9;62918:17;:53::i;88855:185::-;88993:39;89010:4;89016:2;89020:7;88993:39;;;;;;;;;;;;:16;:39::i;91466:275::-;91559:4;91576:13;91592:34;91618:7;91592:25;:34::i;:::-;91576:50;;91656:5;-1:-1:-1;;;;;91645:16:0;:7;-1:-1:-1;;;;;91645:16:0;;:52;;;-1:-1:-1;;;;;;88339:25:0;;;88315:4;88339:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;91665:32;91645:87;;;;91725:7;-1:-1:-1;;;;;91701:31:0;:20;91713:7;91701:11;:20::i;:::-;-1:-1:-1;;;;;91701:31:0;;91637:96;91466:275;-1:-1:-1;;;;91466:275:0:o;94340:797::-;94400:13;94416:34;94442:7;94416:25;:34::i;:::-;94400:50;;94463:51;94484:5;94499:1;94503:7;94512:1;94463:20;:51::i;:::-;94627:34;94653:7;94627:25;:34::i;:::-;94709:24;;;;:15;:24;;;;;;;;94702:31;;-1:-1:-1;;;;;;94702:31:0;;;;;;-1:-1:-1;;;;;94946:16:0;;;;;:9;:16;;;;;:21;;-1:-1:-1;;94946:21:0;;;94996:16;;;:7;:16;;;;;;94989:23;;;;;;;95030:36;94619:42;;-1:-1:-1;94725:7:0;;95030:36;;94709:24;;95030:36;80965:218;;:::o;58961:173::-;53431:13;;;;;;;53423:69;;;;-1:-1:-1;;;53423:69:0;;;;;;;:::i;:::-;59040:86:::1;276:42;59121:4;59040:51;:86::i;:::-;58961:173::o:0;84860:151::-;53431:13;;;;;;;53423:69;;;;-1:-1:-1;;;53423:69:0;;;;;;;:::i;:::-;84964:39:::1;84988:5;84995:7;84964:23;:39::i;102052:69::-:0;53431:13;;;;;;;53423:69;;;;-1:-1:-1;;;53423:69:0;;;;;;;:::i;81890:112::-;81969:25;81980:4;81986:7;81969:10;:25::i;87992:155::-;88087:52;74303:10;88120:8;88130;88087:18;:52::i;89111:322::-;89285:41;74303:10;89318:7;89285:18;:41::i;:::-;89277:99;;;;-1:-1:-1;;;89277:99:0;;;;;;;:::i;:::-;89387:38;89401:4;89407:2;89411:7;89420:4;89387:13;:38::i;112969:98::-;113021:13;113054:5;113047:12;;;;;:::i;27373:723::-;27429:13;27480:14;27497:28;27519:5;27497:21;:28::i;:::-;27528:1;27497:32;27480:49;;27544:20;27578:6;27567:18;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;27567:18:0;-1:-1:-1;27544:41:0;-1:-1:-1;27705:28:0;;;27721:2;27705:28;27762:288;-1:-1:-1;;27794:5:0;-1:-1:-1;;;27931:2:0;27920:14;;27915:30;27794:5;27902:44;27992:2;27983:11;;;-1:-1:-1;28013:21:0;27762:288;28013:21;-1:-1:-1;28071:6:0;27373:723;-1:-1:-1;;;27373:723:0:o;102752:257::-;102876:4;-1:-1:-1;;;;;;102900:61:0;;-1:-1:-1;;;102900:61:0;;:101;;;102965:36;102989:11;102965:23;:36::i;78705:486::-;78794:22;78802:4;78808:7;78794;:22::i;:::-;78789:395;;78970:39;79001:7;78970:30;:39::i;:::-;79074:49;79113:4;79120:2;79074:30;:49::i;:::-;78883:259;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;78883:259:0;;;;;;;;;;-1:-1:-1;;;78833:339:0;;;;;;;:::i;92420:319::-;92549:18;92555:2;92559:7;92549:5;:18::i;:::-;92600:53;92631:1;92635:2;92639:7;92648:4;92600:22;:53::i;:::-;92578:153;;;;-1:-1:-1;;;92578:153:0;;;;;;;:::i;96858:185::-;96933:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;96933:29:0;-1:-1:-1;;;;;96933:29:0;;;;;;;;:24;;96987:34;96933:24;96987:25;:34::i;:::-;-1:-1:-1;;;;;96978:57:0;;;;;;;;;;;96858:185;;:::o;95474:1265::-;95644:4;-1:-1:-1;;;;;95606:42:0;:34;95632:7;95606:25;:34::i;:::-;-1:-1:-1;;;;;95606:42:0;;95598:92;;;;-1:-1:-1;;;95598:92:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;95709:16:0;;95701:65;;;;-1:-1:-1;;;95701:65:0;;27970:2:1;95701:65:0;;;27952:21:1;28009:2;27989:18;;;27982:30;28048:34;28028:18;;;28021:62;-1:-1:-1;;;28099:18:1;;;28092:34;28143:19;;95701:65:0;27768:400:1;95701:65:0;95779:42;95800:4;95806:2;95810:7;95819:1;95779:20;:42::i;:::-;95962:4;-1:-1:-1;;;;;95924:42:0;:34;95950:7;95924:25;:34::i;:::-;-1:-1:-1;;;;;95924:42:0;;95916:92;;;;-1:-1:-1;;;95916:92:0;;;;;;;:::i;:::-;96080:24;;;;:15;:24;;;;;;;;96073:31;;-1:-1:-1;;;;;;96073:31:0;;;;;;-1:-1:-1;;;;;96536:15:0;;;;;;:9;:15;;;;;:20;;-1:-1:-1;;96536:20:0;;;96571:13;;;;;;;;;:18;;96073:31;96571:18;;;96611:16;;;:7;:16;;;;;;:21;;;;;;;;;;96650:27;;96096:7;;96650:27;;;118669:196;;;:::o;60829:284::-;-1:-1:-1;;;;;40949:19:0;;;60903:106;;;;-1:-1:-1;;;60903:106:0;;28375:2:1;60903:106:0;;;28357:21:1;28414:2;28394:18;;;28387:30;28453:34;28433:18;;;28426:62;-1:-1:-1;;;28504:18:1;;;28497:43;28557:19;;60903:106:0;28173:409:1;60903:106:0;-1:-1:-1;;;;;;;;;;;61020:85:0;;-1:-1:-1;;;;;;61020:85:0;-1:-1:-1;;;;;61020:85:0;;;;;;;;;;60829:284::o;61522:297::-;61665:29;61676:17;61665:10;:29::i;:::-;61723:1;61709:4;:11;:15;:28;;;;61728:9;61709:28;61705:107;;;61754:46;61776:17;61795:4;61754:21;:46::i;116653:325::-;116846:20;;;;:11;:20;;;;;;:25;116837:59;;;;-1:-1:-1;;;116837:59:0;;28789:2:1;116837:59:0;;;28771:21:1;28828:2;28808:18;;;28801:30;-1:-1:-1;;;28847:18:1;;;28840:51;28908:18;;116837:59:0;28587:345:1;116837:59:0;116914:56;116941:4;116947:2;116951:7;116960:9;116914:26;:56::i;55850:1103::-;53431:13;;;;;;;53423:69;;;;-1:-1:-1;;;53423:69:0;;;;;;;:::i;:::-;55689:42:::1;56278:45;:49:::0;56274:672:::1;;56349:52;::::0;-1:-1:-1;;;56349:52:0;;56395:4:::1;56349:52;::::0;::::1;2223:51:1::0;55689:42:0::1;::::0;56349:37:::1;::::0;2196:18:1;;56349:52:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;56344:591;;56426:9;56422:498;;;56460:92;::::0;-1:-1:-1;;;56460:92:0;;56514:4:::1;56460:92;::::0;::::1;23133:34:1::0;-1:-1:-1;;;;;23203:15:1;;23183:18;;;23176:43;55689:42:0::1;::::0;56460:45:::1;::::0;23068:18:1;;56460:92:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;80965:218:::0;;:::o;56422:498::-:1;-1:-1:-1::0;;;;;56605:44:0;::::1;::::0;56601:300:::1;;56678:94;::::0;-1:-1:-1;;;56678:94:0;;56734:4:::1;56678:94;::::0;::::1;23133:34:1::0;-1:-1:-1;;;;;23203:15:1;;23183:18;;;23176:43;55689:42:0::1;::::0;56678:47:::1;::::0;23068:18:1;;56678:94:0::1;22921:304:1::0;56601:300:0::1;56829:48;::::0;-1:-1:-1;;;56829:48:0;;56871:4:::1;56829:48;::::0;::::1;2223:51:1::0;55689:42:0::1;::::0;56829:33:::1;::::0;2196:18:1;;56829:48:0::1;2077:203:1::0;85019:163:0;53431:13;;;;;;;53423:69;;;;-1:-1:-1;;;53423:69:0;;;;;;;:::i;:::-;85133:13;;::::1;::::0;:5:::1;::::0;:13:::1;::::0;::::1;::::0;::::1;:::i;:::-;-1:-1:-1::0;85157:17:0;;::::1;::::0;:7:::1;::::0;:17:::1;::::0;::::1;::::0;::::1;:::i;97186:315::-:0;97341:8;-1:-1:-1;;;;;97332:17:0;:5;-1:-1:-1;;;;;97332:17:0;;97324:55;;;;-1:-1:-1;;;97324:55:0;;29139:2:1;97324:55:0;;;29121:21:1;29178:2;29158:18;;;29151:30;29217:27;29197:18;;;29190:55;29262:18;;97324:55:0;28937:349:1;97324:55:0;-1:-1:-1;;;;;97390:25:0;;;;;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;:46;;-1:-1:-1;;97390:46:0;;;;;;;;;;97452:41;;540::1;;;97452::0;;513:18:1;97452:41:0;;;;;;;97186:315;;;:::o;90314:313::-;90470:28;90480:4;90486:2;90490:7;90470:9;:28::i;:::-;90517:47;90540:4;90546:2;90550:7;90559:4;90517:22;:47::i;:::-;90509:110;;;;-1:-1:-1;;;90509:110:0;;;;;;;:::i;24205:922::-;24258:7;;-1:-1:-1;;;24336:15:0;;24332:102;;-1:-1:-1;;;24372:15:0;;;-1:-1:-1;24416:2:0;24406:12;24332:102;24461:6;24452:5;:15;24448:102;;24497:6;24488:15;;;-1:-1:-1;24532:2:0;24522:12;24448:102;24577:6;24568:5;:15;24564:102;;24613:6;24604:15;;;-1:-1:-1;24648:2:0;24638:12;24564:102;24693:5;24684;:14;24680:99;;24728:5;24719:14;;;-1:-1:-1;24762:1:0;24752:11;24680:99;24806:5;24797;:14;24793:99;;24841:5;24832:14;;;-1:-1:-1;24875:1:0;24865:11;24793:99;24919:5;24910;:14;24906:99;;24954:5;24945:14;;;-1:-1:-1;24988:1:0;24978:11;24906:99;25032:5;25023;:14;25019:66;;25068:1;25058:11;25113:6;24205:922;-1:-1:-1;;24205:922:0:o;85254:349::-;85378:4;-1:-1:-1;;;;;;85415:51:0;;-1:-1:-1;;;85415:51:0;;:127;;-1:-1:-1;;;;;;;85483:59:0;;-1:-1:-1;;;85483:59:0;85415:127;:180;;;-1:-1:-1;;;;;;;;;;72983:51:0;;;85559:36;72874:168;29127:151;29185:13;29218:52;-1:-1:-1;;;;;29230:22:0;;27264:2;28523:447;28598:13;28624:19;28656:10;28660:6;28656:1;:10;:::i;:::-;:14;;28669:1;28656:14;:::i;:::-;28646:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;28646:25:0;;28624:47;;-1:-1:-1;;;28682:6:0;28689:1;28682:9;;;;;;;;:::i;:::-;;;;:15;-1:-1:-1;;;;;28682:15:0;;;;;;;;;-1:-1:-1;;;28708:6:0;28715:1;28708:9;;;;;;;;:::i;:::-;;;;:15;-1:-1:-1;;;;;28708:15:0;;;;;;;;-1:-1:-1;28739:9:0;28751:10;28755:6;28751:1;:10;:::i;:::-;:14;;28764:1;28751:14;:::i;:::-;28739:26;;28734:131;28771:1;28767;:5;28734:131;;;-1:-1:-1;;;28815:5:0;28823:3;28815:11;28806:21;;;;;;;:::i;:::-;;;;28794:6;28801:1;28794:9;;;;;;;;:::i;:::-;;;;:33;-1:-1:-1;;;;;28794:33:0;;;;;;;;-1:-1:-1;28852:1:0;28842:11;;;;;28774:3;;;:::i;:::-;;;28734:131;;;-1:-1:-1;28883:10:0;;28875:55;;;;-1:-1:-1;;;28875:55:0;;29634:2:1;28875:55:0;;;29616:21:1;;;29653:18;;;29646:30;29712:34;29692:18;;;29685:62;29764:18;;28875:55:0;29432:356:1;93075:926:0;-1:-1:-1;;;;;93155:16:0;;93147:61;;;;-1:-1:-1;;;93147:61:0;;29995:2:1;93147:61:0;;;29977:21:1;;;30014:18;;;30007:30;30073:34;30053:18;;;30046:62;30125:18;;93147:61:0;29793:356:1;93147:61:0;91236:4;90834:16;;;:7;:16;;;;;;-1:-1:-1;;;;;90834:16:0;91260:31;93219:58;;;;-1:-1:-1;;;93219:58:0;;30356:2:1;93219:58:0;;;30338:21:1;30395:2;30375:18;;;30368:30;30434;30414:18;;;30407:58;30482:18;;93219:58:0;30154:352:1;93219:58:0;93290:48;93319:1;93323:2;93327:7;93336:1;93290:20;:48::i;:::-;91236:4;90834:16;;;:7;:16;;;;;;-1:-1:-1;;;;;90834:16:0;91260:31;93428:58;;;;-1:-1:-1;;;93428:58:0;;30356:2:1;93428:58:0;;;30338:21:1;30395:2;30375:18;;;30368:30;30434;30414:18;;;30407:58;30482:18;;93428:58:0;30154:352:1;93428:58:0;-1:-1:-1;;;;;93819:13:0;;;;;;:9;:13;;;;;;;;:18;;93836:1;93819:18;;;93861:16;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;93861:21:0;;;;;93900:33;93869:7;;93819:13;;93900:33;;93819:13;;93900:33;80965:218;;:::o;98289:875::-;98443:4;-1:-1:-1;;;;;98464:13:0;;40949:19;:23;98460:697;;98500:82;;-1:-1:-1;;;98500:82:0;;-1:-1:-1;;;;;98500:47:0;;;;;:82;;74303:10;;98562:4;;98568:7;;98577:4;;98500:82;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;98500:82:0;;;;;;;;-1:-1:-1;;98500:82:0;;;;;;;;;;;;:::i;:::-;;;98496:606;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;98763:6;:13;98780:1;98763:18;98759:328;;98806:60;;-1:-1:-1;;;98806:60:0;;;;;;;:::i;98759:328::-;99037:6;99031:13;99022:6;99018:2;99014:15;99007:38;98496:606;-1:-1:-1;;;;;;98633:62:0;-1:-1:-1;;;98633:62:0;;-1:-1:-1;98626:69:0;;98460:697;-1:-1:-1;99141:4:0;99134:11;;61226:155;61293:37;61312:17;61293:18;:37::i;:::-;61346:27;;-1:-1:-1;;;;;61346:27:0;;;;;;;;61226:155;:::o;66259:461::-;66342:12;-1:-1:-1;;;;;40949:19:0;;;66367:88;;;;-1:-1:-1;;;66367:88:0;;31461:2:1;66367:88:0;;;31443:21:1;31500:2;31480:18;;;31473:30;31539:34;31519:18;;;31512:62;-1:-1:-1;;;31590:18:1;;;31583:36;31636:19;;66367:88:0;31259:402:1;66367:88:0;66529:12;66543:23;66570:6;-1:-1:-1;;;;;66570:19:0;66590:4;66570:25;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;66528:67;;;;66613:99;66649:7;66658:10;66613:99;;;;;;;;;;;;;;;;;:35;:99::i;:::-;66606:106;66259:461;-1:-1:-1;;;;;66259:461:0:o;103944:915::-;104121:61;104148:4;104154:2;104158:12;104172:9;104121:26;:61::i;:::-;104211:1;104199:9;:13;104195:222;;;104342:63;;-1:-1:-1;;;104342:63:0;;32147:2:1;104342:63:0;;;32129:21:1;32186:2;32166:18;;;32159:30;32225:34;32205:18;;;32198:62;-1:-1:-1;;;32276:18:1;;;32269:51;32337:19;;104342:63:0;31945:417:1;104195:222:0;104447:12;-1:-1:-1;;;;;104476:18:0;;104472:187;;104511:40;104543:7;105697:10;:17;;105670:24;;;;:15;:24;;;;;:44;;;105725:24;;;;;;;;;;;;105593:164;104511:40;104472:187;;;104581:2;-1:-1:-1;;;;;104573:10:0;:4;-1:-1:-1;;;;;104573:10:0;;104569:90;;104600:47;104633:4;104639:7;104600:32;:47::i;:::-;-1:-1:-1;;;;;104673:16:0;;104669:183;;104706:45;104743:7;104706:36;:45::i;:::-;104669:183;;;104779:4;-1:-1:-1;;;;;104773:10:0;:2;-1:-1:-1;;;;;104773:10:0;;104769:83;;104800:40;104828:2;104832:7;104800:27;:40::i;47064:305::-;47214:12;47243:7;47239:123;;;-1:-1:-1;47274:10:0;47267:17;;47239:123;47317:33;47325:10;47337:12;47317:7;:33::i;99896:410::-;100086:1;100074:9;:13;100070:229;;;-1:-1:-1;;;;;100108:18:0;;;100104:87;;-1:-1:-1;;;;;100147:15:0;;;;;;:9;:15;;;;;:28;;100166:9;;100147:15;:28;;100166:9;;100147:28;:::i;:::-;;;;-1:-1:-1;;100104:87:0;-1:-1:-1;;;;;100209:16:0;;;100205:83;;-1:-1:-1;;;;;100246:13:0;;;;;;:9;:13;;;;;:26;;100263:9;;100246:13;:26;;100263:9;;100246:26;:::i;:::-;;;;-1:-1:-1;;99896:410:0;;;;:::o;106384:999::-;106650:22;106711:1;106675:33;106703:4;106675:27;:33::i;:::-;:37;;;;:::i;:::-;106723:18;106744:26;;;:17;:26;;;;;;106650:62;;-1:-1:-1;106877:28:0;;;106873:328;;-1:-1:-1;;;;;106944:18:0;;106922:19;106944:18;;;:12;:18;;;;;;;;:34;;;;;;;;;106995:30;;;;;;:44;;;107112:30;;:17;:30;;;;;:43;;;106873:328;-1:-1:-1;107297:26:0;;;;:17;:26;;;;;;;;107290:33;;;-1:-1:-1;;;;;107341:18:0;;;;;:12;:18;;;;;:34;;;;;;;107334:41;106384:999::o;107678:1079::-;107956:10;:17;107931:22;;107956:21;;107976:1;;107956:21;:::i;:::-;107988:18;108009:24;;;:15;:24;;;;;;108382:10;:26;;107931:46;;-1:-1:-1;108009:24:0;;107931:46;;108382:26;;;;;;:::i;:::-;;;;;;;;;108360:48;;108446:11;108421:10;108432;108421:22;;;;;;;;:::i;:::-;;;;;;;;;;;;:36;;;;108526:28;;;:15;:28;;;;;;;:41;;;108698:24;;;;;108691:31;108733:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;107749:1008;;;107678:1079;:::o;105160:232::-;105245:14;105262:31;105290:2;105262:27;:31::i;:::-;-1:-1:-1;;;;;105304:16:0;;;;;;;:12;:16;;;;;;;;:24;;;;;;;;:34;;;105349:26;;;:17;:26;;;;;;:35;;;;-1:-1:-1;105160:232:0:o;47377:552::-;47538:17;;:21;47534:388;;47770:10;47764:17;47827:15;47814:10;47810:2;47806:19;47799:44;47534:388;47897:12;47890:20;;-1:-1:-1;;;47890:20:0;;;;;;;;:::i;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:131:1;-1:-1:-1;;;;;;88:32:1;;78:43;;68:71;;135:1;132;125:12;150:245;208:6;261:2;249:9;240:7;236:23;232:32;229:52;;;277:1;274;267:12;229:52;316:9;303:23;335:30;359:5;335:30;:::i;592:173::-;660:20;;-1:-1:-1;;;;;709:31:1;;699:42;;689:70;;755:1;752;745:12;689:70;592:173;;;:::o;770:366::-;837:6;845;898:2;886:9;877:7;873:23;869:32;866:52;;;914:1;911;904:12;866:52;937:29;956:9;937:29;:::i;:::-;927:39;;1016:2;1005:9;1001:18;988:32;-1:-1:-1;;;;;1053:5:1;1049:38;1042:5;1039:49;1029:77;;1102:1;1099;1092:12;1029:77;1125:5;1115:15;;;770:366;;;;;:::o;1141:258::-;1213:1;1223:113;1237:6;1234:1;1231:13;1223:113;;;1313:11;;;1307:18;1294:11;;;1287:39;1259:2;1252:10;1223:113;;;1354:6;1351:1;1348:13;1345:48;;;-1:-1:-1;;1389:1:1;1371:16;;1364:27;1141:258::o;1404:::-;1446:3;1484:5;1478:12;1511:6;1506:3;1499:19;1527:63;1583:6;1576:4;1571:3;1567:14;1560:4;1553:5;1549:16;1527:63;:::i;:::-;1644:2;1623:15;-1:-1:-1;;1619:29:1;1610:39;;;;1651:4;1606:50;;1404:258;-1:-1:-1;;1404:258:1:o;1667:220::-;1816:2;1805:9;1798:21;1779:4;1836:45;1877:2;1866:9;1862:18;1854:6;1836:45;:::i;1892:180::-;1951:6;2004:2;1992:9;1983:7;1979:23;1975:32;1972:52;;;2020:1;2017;2010:12;1972:52;-1:-1:-1;2043:23:1;;1892:180;-1:-1:-1;1892:180:1:o;2285:343::-;2351:6;2359;2412:2;2400:9;2391:7;2387:23;2383:32;2380:52;;;2428:1;2425;2418:12;2380:52;2467:9;2454:23;2517:4;2510:5;2506:16;2499:5;2496:27;2486:55;;2537:1;2534;2527:12;2486:55;2560:5;-1:-1:-1;2584:38:1;2618:2;2603:18;;2584:38;:::i;:::-;2574:48;;2285:343;;;;;:::o;2633:254::-;2701:6;2709;2762:2;2750:9;2741:7;2737:23;2733:32;2730:52;;;2778:1;2775;2768:12;2730:52;2801:29;2820:9;2801:29;:::i;:::-;2791:39;2877:2;2862:18;;;;2849:32;;-1:-1:-1;;;2633:254:1:o;3074:328::-;3151:6;3159;3167;3220:2;3208:9;3199:7;3195:23;3191:32;3188:52;;;3236:1;3233;3226:12;3188:52;3259:29;3278:9;3259:29;:::i;:::-;3249:39;;3307:38;3341:2;3330:9;3326:18;3307:38;:::i;:::-;3297:48;;3392:2;3381:9;3377:18;3364:32;3354:42;;3074:328;;;;;:::o;3774:186::-;3833:6;3886:2;3874:9;3865:7;3861:23;3857:32;3854:52;;;3902:1;3899;3892:12;3854:52;3925:29;3944:9;3925:29;:::i;3965:348::-;4017:8;4027:6;4081:3;4074:4;4066:6;4062:17;4058:27;4048:55;;4099:1;4096;4089:12;4048:55;-1:-1:-1;4122:20:1;;4165:18;4154:30;;4151:50;;;4197:1;4194;4187:12;4151:50;4234:4;4226:6;4222:17;4210:29;;4286:3;4279:4;4270:6;4262;4258:19;4254:30;4251:39;4248:59;;;4303:1;4300;4293:12;4318:904;4425:6;4433;4441;4449;4502:2;4490:9;4481:7;4477:23;4473:32;4470:52;;;4518:1;4515;4508:12;4470:52;4558:9;4545:23;4587:18;4628:2;4620:6;4617:14;4614:34;;;4644:1;4641;4634:12;4614:34;4683:59;4734:7;4725:6;4714:9;4710:22;4683:59;:::i;:::-;4761:8;;-1:-1:-1;4657:85:1;-1:-1:-1;4849:2:1;4834:18;;4821:32;;-1:-1:-1;4865:16:1;;;4862:36;;;4894:1;4891;4884:12;4862:36;4932:8;4921:9;4917:24;4907:34;;4979:7;4972:4;4968:2;4964:13;4960:27;4950:55;;5001:1;4998;4991:12;4950:55;5041:2;5028:16;5067:2;5059:6;5056:14;5053:34;;;5083:1;5080;5073:12;5053:34;5136:7;5131:2;5121:6;5118:1;5114:14;5110:2;5106:23;5102:32;5099:45;5096:65;;;5157:1;5154;5147:12;5096:65;4318:904;;;;-1:-1:-1;;5188:2:1;5180:11;;-1:-1:-1;;;4318:904:1:o;5227:248::-;5295:6;5303;5356:2;5344:9;5335:7;5331:23;5327:32;5324:52;;;5372:1;5369;5362:12;5324:52;-1:-1:-1;;5395:23:1;;;5465:2;5450:18;;;5437:32;;-1:-1:-1;5227:248:1:o;5759:254::-;5827:6;5835;5888:2;5876:9;5867:7;5863:23;5859:32;5856:52;;;5904:1;5901;5894:12;5856:52;5940:9;5927:23;5917:33;;5969:38;6003:2;5992:9;5988:18;5969:38;:::i;6018:632::-;6189:2;6241:21;;;6311:13;;6214:18;;;6333:22;;;6160:4;;6189:2;6412:15;;;;6386:2;6371:18;;;6160:4;6455:169;6469:6;6466:1;6463:13;6455:169;;;6530:13;;6518:26;;6599:15;;;;6564:12;;;;6491:1;6484:9;6455:169;;;-1:-1:-1;6641:3:1;;6018:632;-1:-1:-1;;;;;;6018:632:1:o;6655:127::-;6716:10;6711:3;6707:20;6704:1;6697:31;6747:4;6744:1;6737:15;6771:4;6768:1;6761:15;6787:631;6851:5;6881:18;6922:2;6914:6;6911:14;6908:40;;;6928:18;;:::i;:::-;7003:2;6997:9;6971:2;7057:15;;-1:-1:-1;;7053:24:1;;;7079:2;7049:33;7045:42;7033:55;;;7103:18;;;7123:22;;;7100:46;7097:72;;;7149:18;;:::i;:::-;7189:10;7185:2;7178:22;7218:6;7209:15;;7248:6;7240;7233:22;7288:3;7279:6;7274:3;7270:16;7267:25;7264:45;;;7305:1;7302;7295:12;7264:45;7355:6;7350:3;7343:4;7335:6;7331:17;7318:44;7410:1;7403:4;7394:6;7386;7382:19;7378:30;7371:41;;;;6787:631;;;;;:::o;7423:220::-;7465:5;7518:3;7511:4;7503:6;7499:17;7495:27;7485:55;;7536:1;7533;7526:12;7485:55;7558:79;7633:3;7624:6;7611:20;7604:4;7596:6;7592:17;7558:79;:::i;7648:394::-;7725:6;7733;7786:2;7774:9;7765:7;7761:23;7757:32;7754:52;;;7802:1;7799;7792:12;7754:52;7825:29;7844:9;7825:29;:::i;:::-;7815:39;;7905:2;7894:9;7890:18;7877:32;7932:18;7924:6;7921:30;7918:50;;;7964:1;7961;7954:12;7918:50;7987:49;8028:7;8019:6;8008:9;8004:22;7987:49;:::i;:::-;7977:59;;;7648:394;;;;;:::o;8047:450::-;8116:6;8169:2;8157:9;8148:7;8144:23;8140:32;8137:52;;;8185:1;8182;8175:12;8137:52;8225:9;8212:23;8258:18;8250:6;8247:30;8244:50;;;8290:1;8287;8280:12;8244:50;8313:22;;8366:4;8358:13;;8354:27;-1:-1:-1;8344:55:1;;8395:1;8392;8385:12;8344:55;8418:73;8483:7;8478:2;8465:16;8460:2;8456;8452:11;8418:73;:::i;8502:479::-;8582:6;8590;8598;8651:2;8639:9;8630:7;8626:23;8622:32;8619:52;;;8667:1;8664;8657:12;8619:52;8707:9;8694:23;8740:18;8732:6;8729:30;8726:50;;;8772:1;8769;8762:12;8726:50;8811:59;8862:7;8853:6;8842:9;8838:22;8811:59;:::i;:::-;8889:8;;8785:85;;-1:-1:-1;8971:2:1;8956:18;;;;8943:32;;8502:479;-1:-1:-1;;;;8502:479:1:o;8986:118::-;9072:5;9065:13;9058:21;9051:5;9048:32;9038:60;;9094:1;9091;9084:12;9109:315;9174:6;9182;9235:2;9223:9;9214:7;9210:23;9206:32;9203:52;;;9251:1;9248;9241:12;9203:52;9274:29;9293:9;9274:29;:::i;:::-;9264:39;;9353:2;9342:9;9338:18;9325:32;9366:28;9388:5;9366:28;:::i;9429:537::-;9524:6;9532;9540;9548;9601:3;9589:9;9580:7;9576:23;9572:33;9569:53;;;9618:1;9615;9608:12;9569:53;9641:29;9660:9;9641:29;:::i;:::-;9631:39;;9689:38;9723:2;9712:9;9708:18;9689:38;:::i;:::-;9679:48;;9774:2;9763:9;9759:18;9746:32;9736:42;;9829:2;9818:9;9814:18;9801:32;9856:18;9848:6;9845:30;9842:50;;;9888:1;9885;9878:12;9842:50;9911:49;9952:7;9943:6;9932:9;9928:22;9911:49;:::i;:::-;9901:59;;;9429:537;;;;;;;:::o;9971:411::-;10042:6;10050;10103:2;10091:9;10082:7;10078:23;10074:32;10071:52;;;10119:1;10116;10109:12;10071:52;10159:9;10146:23;10192:18;10184:6;10181:30;10178:50;;;10224:1;10221;10214:12;10178:50;10263:59;10314:7;10305:6;10294:9;10290:22;10263:59;:::i;:::-;10341:8;;10237:85;;-1:-1:-1;9971:411:1;-1:-1:-1;;;;9971:411:1:o;10387:260::-;10455:6;10463;10516:2;10504:9;10495:7;10491:23;10487:32;10484:52;;;10532:1;10529;10522:12;10484:52;10555:29;10574:9;10555:29;:::i;11728:380::-;11807:1;11803:12;;;;11850;;;11871:61;;11925:4;11917:6;11913:17;11903:27;;11871:61;11978:2;11970:6;11967:14;11947:18;11944:38;11941:161;;12024:10;12019:3;12015:20;12012:1;12005:31;12059:4;12056:1;12049:15;12087:4;12084:1;12077:15;11941:161;;11728:380;;;:::o;12113:127::-;12174:10;12169:3;12165:20;12162:1;12155:31;12205:4;12202:1;12195:15;12229:4;12226:1;12219:15;12245:125;12285:4;12313:1;12310;12307:8;12304:34;;;12318:18;;:::i;:::-;-1:-1:-1;12355:9:1;;12245:125::o;12375:128::-;12415:3;12446:1;12442:6;12439:1;12436:13;12433:39;;;12452:18;;:::i;:::-;-1:-1:-1;12488:9:1;;12375:128::o;12867:175::-;12904:3;12948:4;12941:5;12937:16;12977:4;12968:7;12965:17;12962:43;;12985:18;;:::i;:::-;13034:1;13021:15;;12867:175;-1:-1:-1;;12867:175:1:o;13047:273::-;13232:6;13224;13219:3;13206:33;13188:3;13258:16;;13283:13;;;13258:16;13047:273;-1:-1:-1;13047:273:1:o;13668:405::-;13870:2;13852:21;;;13909:2;13889:18;;;13882:30;13948:34;13943:2;13928:18;;13921:62;-1:-1:-1;;;14014:2:1;13999:18;;13992:39;14063:3;14048:19;;13668:405::o;14425:127::-;14486:10;14481:3;14477:20;14474:1;14467:31;14517:4;14514:1;14507:15;14541:4;14538:1;14531:15;14557:411;14759:2;14741:21;;;14798:2;14778:18;;;14771:30;14837:34;14832:2;14817:18;;14810:62;-1:-1:-1;;;14903:2:1;14888:18;;14881:45;14958:3;14943:19;;14557:411::o;15379:980::-;15682:3;15671:9;15664:22;15723:6;15717:3;15706:9;15702:19;15695:35;15781:6;15773;15767:3;15756:9;15752:19;15739:49;15838:1;15832:3;15808:22;;;15804:32;;15797:43;;;-1:-1:-1;;15899:2:1;15878:15;;15874:29;15859:45;;15946:18;;;15942:28;;15935:4;15920:20;;15913:58;15987:12;;;15980:28;;;-1:-1:-1;;;;;16020:31:1;;16017:51;;;16064:1;16061;16054:12;16017:51;16098:6;16095:1;16091:14;16149:6;16141;16135:3;16131:2;16127:12;16114:42;16220:1;16179:15;;16196:3;16175:25;16209:13;;;-1:-1:-1;;;;;16277:32:1;;;;16272:2;16257:18;;16250:60;-1:-1:-1;16341:2:1;16326:18;16319:34;16175:25;15379:980;-1:-1:-1;;;;15379:980:1:o;16364:168::-;16404:7;16470:1;16466;16462:6;16458:14;16455:1;16452:21;16447:1;16440:9;16433:17;16429:45;16426:71;;;16477:18;;:::i;:::-;-1:-1:-1;16517:9:1;;16364:168::o;16669:217::-;16709:1;16735;16725:132;;16779:10;16774:3;16770:20;16767:1;16760:31;16814:4;16811:1;16804:15;16842:4;16839:1;16832:15;16725:132;-1:-1:-1;16871:9:1;;16669:217::o;18467:408::-;18669:2;18651:21;;;18708:2;18688:18;;;18681:30;18747:34;18742:2;18727:18;;18720:62;-1:-1:-1;;;18813:2:1;18798:18;;18791:42;18865:3;18850:19;;18467:408::o;18880:::-;19082:2;19064:21;;;19121:2;19101:18;;;19094:30;19160:34;19155:2;19140:18;;19133:62;-1:-1:-1;;;19226:2:1;19211:18;;19204:42;19278:3;19263:19;;18880:408::o;20880:410::-;21082:2;21064:21;;;21121:2;21101:18;;;21094:30;21160:34;21155:2;21140:18;;21133:62;-1:-1:-1;;;21226:2:1;21211:18;;21204:44;21280:3;21265:19;;20880:410::o;22446:470::-;22625:3;22663:6;22657:13;22679:53;22725:6;22720:3;22713:4;22705:6;22701:17;22679:53;:::i;:::-;22795:13;;22754:16;;;;22817:57;22795:13;22754:16;22851:4;22839:17;;22817:57;:::i;:::-;22890:20;;22446:470;-1:-1:-1;;;;22446:470:1:o;23230:245::-;23297:6;23350:2;23338:9;23329:7;23325:23;23321:32;23318:52;;;23366:1;23363;23356:12;23318:52;23398:9;23392:16;23417:28;23439:5;23417:28;:::i;24312:409::-;24514:2;24496:21;;;24553:2;24533:18;;;24526:30;24592:34;24587:2;24572:18;;24565:62;-1:-1:-1;;;24658:2:1;24643:18;;24636:43;24711:3;24696:19;;24312:409::o;24726:184::-;24796:6;24849:2;24837:9;24828:7;24824:23;24820:32;24817:52;;;24865:1;24862;24855:12;24817:52;-1:-1:-1;24888:16:1;;24726:184;-1:-1:-1;24726:184:1:o;25740:407::-;25942:2;25924:21;;;25981:2;25961:18;;;25954:30;26020:34;26015:2;26000:18;;25993:62;-1:-1:-1;;;26086:2:1;26071:18;;26064:41;26137:3;26122:19;;25740:407::o;26152:786::-;26563:25;26558:3;26551:38;26533:3;26618:6;26612:13;26634:62;26689:6;26684:2;26679:3;26675:12;26668:4;26660:6;26656:17;26634:62;:::i;:::-;-1:-1:-1;;;26755:2:1;26715:16;;;26747:11;;;26740:40;26805:13;;26827:63;26805:13;26876:2;26868:11;;26861:4;26849:17;;26827:63;:::i;:::-;26910:17;26929:2;26906:26;;26152:786;-1:-1:-1;;;;26152:786:1:o;26943:414::-;27145:2;27127:21;;;27184:2;27164:18;;;27157:30;27223:34;27218:2;27203:18;;27196:62;-1:-1:-1;;;27289:2:1;27274:18;;27267:48;27347:3;27332:19;;26943:414::o;27362:401::-;27564:2;27546:21;;;27603:2;27583:18;;;27576:30;27642:34;27637:2;27622:18;;27615:62;-1:-1:-1;;;27708:2:1;27693:18;;27686:35;27753:3;27738:19;;27362:401::o;29291:136::-;29330:3;29358:5;29348:39;;29367:18;;:::i;:::-;-1:-1:-1;;;29403:18:1;;29291:136::o;30511:489::-;-1:-1:-1;;;;;30780:15:1;;;30762:34;;30832:15;;30827:2;30812:18;;30805:43;30879:2;30864:18;;30857:34;;;30927:3;30922:2;30907:18;;30900:31;;;30705:4;;30948:46;;30974:19;;30966:6;30948:46;:::i;:::-;30940:54;30511:489;-1:-1:-1;;;;;;30511:489:1:o;31005:249::-;31074:6;31127:2;31115:9;31106:7;31102:23;31098:32;31095:52;;;31143:1;31140;31133:12;31095:52;31175:9;31169:16;31194:30;31218:5;31194:30;:::i;31666:274::-;31795:3;31833:6;31827:13;31849:53;31895:6;31890:3;31883:4;31875:6;31871:17;31849:53;:::i;:::-;31918:16;;;;;31666:274;-1:-1:-1;;31666:274:1:o;32367:127::-;32428:10;32423:3;32419:20;32416:1;32409:31;32459:4;32456:1;32449:15;32483:4;32480:1;32473:15
Swarm Source
ipfs://4829cfd265502d468990a417d717e50939663194bfb2c47e0917bb24ebd2c524
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.