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
ContractCreator
Latest 1 from a total of 1 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
0x60806040 | 17983941 | 401 days ago | IN | 0 ETH | 0.05393932 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
ScorpiosRevealableNftCollection
Compiler Version
v0.8.9+commit.e5eed63a
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2023-08-24 */ // SPDX-License-Identifier: MIT pragma solidity =0.8.9; /** * @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; } /** * @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); } } } /** * @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 Internal function that returns the initialized version. Returns `_initialized` */ function _getInitializedVersion() internal view returns (uint8) { return _initialized; } /** * @dev Internal function that returns the initialized version. Returns `_initializing` */ function _isInitializing() internal view returns (bool) { return _initializing; } } /** * @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; } /** * @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); } /** * @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; } /** * @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); } } } /** * @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); } } /** * @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; } /** * @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); } /** * @dev Implementation of the NFT Royalty Standard, a standardized way to retrieve royalty payment information. * * Royalty information can be specified globally for all token ids via {_setDefaultRoyalty}, and/or individually for * specific token ids via {_setTokenRoyalty}. The latter takes precedence over the first. * * Royalty is specified as a fraction of sale price. {_feeDenominator} is overridable but defaults to 10000, meaning the * fee is specified in basis points by default. * * IMPORTANT: ERC-2981 only specifies a way to signal royalty information and does not enforce its payment. See * https://eips.ethereum.org/EIPS/eip-2981#optional-royalty-payments[Rationale] in the EIP. Marketplaces are expected to * voluntarily pay royalties together with sales, but note that this standard is not yet widely supported. * * _Available since v4.5._ */ abstract contract ERC2981Upgradeable is Initializable, IERC2981Upgradeable, ERC165Upgradeable { function __ERC2981_init() internal onlyInitializing { } function __ERC2981_init_unchained() internal onlyInitializing { } struct RoyaltyInfo { address receiver; uint96 royaltyFraction; } RoyaltyInfo private _defaultRoyaltyInfo; mapping(uint256 => RoyaltyInfo) private _tokenRoyaltyInfo; /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165Upgradeable, ERC165Upgradeable) returns (bool) { return interfaceId == type(IERC2981Upgradeable).interfaceId || super.supportsInterface(interfaceId); } /** * @inheritdoc IERC2981Upgradeable */ function royaltyInfo(uint256 _tokenId, uint256 _salePrice) public view virtual override returns (address, uint256) { RoyaltyInfo memory royalty = _tokenRoyaltyInfo[_tokenId]; if (royalty.receiver == address(0)) { royalty = _defaultRoyaltyInfo; } uint256 royaltyAmount = (_salePrice * royalty.royaltyFraction) / _feeDenominator(); return (royalty.receiver, royaltyAmount); } /** * @dev The denominator with which to interpret the fee set in {_setTokenRoyalty} and {_setDefaultRoyalty} as a * fraction of the sale price. Defaults to 10000 so fees are expressed in basis points, but may be customized by an * override. */ function _feeDenominator() internal pure virtual returns (uint96) { return 10000; } /** * @dev Sets the royalty information that all ids in this contract will default to. * * Requirements: * * - `receiver` cannot be the zero address. * - `feeNumerator` cannot be greater than the fee denominator. */ function _setDefaultRoyalty(address receiver, uint96 feeNumerator) internal virtual { require(feeNumerator <= _feeDenominator(), "ERC2981: royalty fee will exceed salePrice"); require(receiver != address(0), "ERC2981: invalid receiver"); _defaultRoyaltyInfo = RoyaltyInfo(receiver, feeNumerator); } /** * @dev Removes default royalty information. */ function _deleteDefaultRoyalty() internal virtual { delete _defaultRoyaltyInfo; } /** * @dev Sets the royalty information for a specific token id, overriding the global default. * * Requirements: * * - `receiver` cannot be the zero address. * - `feeNumerator` cannot be greater than the fee denominator. */ function _setTokenRoyalty( uint256 tokenId, address receiver, uint96 feeNumerator ) internal virtual { require(feeNumerator <= _feeDenominator(), "ERC2981: royalty fee will exceed salePrice"); require(receiver != address(0), "ERC2981: Invalid parameters"); _tokenRoyaltyInfo[tokenId] = RoyaltyInfo(receiver, feeNumerator); } /** * @dev Resets royalty information for the token id back to the global default. */ function _resetTokenRoyalty(uint256 tokenId) internal virtual { delete _tokenRoyaltyInfo[tokenId]; } /** * @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[48] private __gap; } /** * @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); } /** * @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); } /** * @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); } /** * @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; } /** * @dev Extension of ERC721 with the ERC2981 NFT Royalty Standard, a standardized way to retrieve royalty payment * information. * * Royalty information can be specified globally for all token ids via {ERC2981-_setDefaultRoyalty}, and/or individually for * specific token ids via {ERC2981-_setTokenRoyalty}. The latter takes precedence over the first. * * IMPORTANT: ERC-2981 only specifies a way to signal royalty information and does not enforce its payment. See * https://eips.ethereum.org/EIPS/eip-2981#optional-royalty-payments[Rationale] in the EIP. Marketplaces are expected to * voluntarily pay royalties together with sales, but note that this standard is not yet widely supported. * * _Available since v4.5._ */ abstract contract ERC721RoyaltyUpgradeable is Initializable, ERC2981Upgradeable, ERC721Upgradeable { function __ERC721Royalty_init() internal onlyInitializing { } function __ERC721Royalty_init_unchained() internal onlyInitializing { } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC721Upgradeable, ERC2981Upgradeable) returns (bool) { return super.supportsInterface(interfaceId); } /** * @dev See {ERC721-_burn}. This override additionally clears the royalty information for the token. */ function _burn(uint256 tokenId) internal virtual override { super._burn(tokenId); _resetTokenRoyalty(tokenId); } /** * @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; } struct ReservedToken { uint256 tokenId; address user; } struct Share { address holder; uint16 bps; } struct BaseUriSettings { string baseUri; bool isEveryTokenUnique; } struct TokenInfo { uint256 tokenId; bool isValidTokenId; address reservedUser; bool isMinted; } contract ScorpiosRevealableNftCollection is AccessControlUpgradeable, ERC721RoyaltyUpgradeable { Share[] public shares_; uint256 public maxPossibleTotalSupply_; uint256 private totalSupply_; string public baseUri_; bool public isEveryTokenUnique_; uint256 public price_; bool public isSaleActive_; mapping(uint256/*token id*/ => address) public reservedTokens_; function version() external pure returns (string memory) { return "ScorpiosRevealableNftCollection v2"; } constructor() { _disableInitializers(); } function initialize( string memory _name, string memory _symbol, address _admin, Share[] memory _shares, ReservedToken[] calldata _reservedTokens, uint256 _maxPossibleTotalSupply, BaseUriSettings memory _baseUriSettings, uint256 _price, address _royaltyReceiver, uint96 _royaltyPercentage, bool _isSaleActive ) external initializer { __ERC721_init(_name, _symbol); _grantRole(DEFAULT_ADMIN_ROLE, _admin); uint16 totalShares; for (uint256 i = 0; i < _shares.length; i++) { require(_shares[i].holder != address(0), "Zero shareholder address"); require(_shares[i].bps != 0, "Zero share"); shares_.push(_shares[i]); totalShares += _shares[i].bps; } require(totalShares == 10_000, "Invalid total shares"); require(_maxPossibleTotalSupply != 0, "Zero max possible total supply"); maxPossibleTotalSupply_ = _maxPossibleTotalSupply; _updateReservedTokens(_reservedTokens); _setBaseUri(_baseUriSettings.baseUri, _baseUriSettings.isEveryTokenUnique); require(_price != 0, "Zero price"); price_ = _price; _setDefaultRoyalty(_royaltyReceiver, _royaltyPercentage); isSaleActive_ = _isSaleActive; } function tokenURI(uint256 _tokenId) public view virtual override returns (string memory) { _requireMinted(_tokenId); return isEveryTokenUnique_ ? string(abi.encodePacked(baseUri_, _toString(_tokenId), ".json")) : baseUri_; } function activateSale(bool _on) external onlyRole(DEFAULT_ADMIN_ROLE) { require(isSaleActive_ != _on, "Already done"); isSaleActive_ = _on; } function setPrice(uint256 _price) external onlyRole(DEFAULT_ADMIN_ROLE) { require(_price != 0, "Zero price"); require(price_ != _price, "Already done"); price_ = _price; } function updateReservedTokens(ReservedToken[] calldata _reservedTokens) external onlyRole(DEFAULT_ADMIN_ROLE) { _updateReservedTokens(_reservedTokens); } function _updateReservedTokens(ReservedToken[] calldata _reservedTokens) private { for (uint16 i = 0; i < _reservedTokens.length; ++i) { reservedTokens_[_reservedTokens[i].tokenId] = _reservedTokens[i].user; } } function increaseMaxPossibleTotalSupply(uint256 _incrementAmount) external onlyRole(DEFAULT_ADMIN_ROLE) { maxPossibleTotalSupply_ += _incrementAmount; } function totalSupply() public view returns (uint256) { return totalSupply_; } function availableForMintAmount() external view returns (uint256) { return maxPossibleTotalSupply_ - totalSupply_; } function getTokenInfoBatch() external view returns (TokenInfo[] memory) { return getTokenInfoBatch(1, maxPossibleTotalSupply_); } function getTokenInfoBatch(uint256 _tokenIdFrom, uint256 _tokenIdTo) public view returns (TokenInfo[] memory) { if (_tokenIdTo < _tokenIdFrom) return new TokenInfo[](0); TokenInfo[] memory result = new TokenInfo[](_tokenIdTo - _tokenIdFrom + 1); for (uint256 tokenId = _tokenIdFrom; tokenId < _tokenIdTo + 1; ++tokenId) { uint256 resultIndex = tokenId - _tokenIdFrom; result[resultIndex].tokenId = tokenId; result[resultIndex].isValidTokenId = _isValidTokenId(tokenId); result[resultIndex].reservedUser = reservedTokens_[tokenId]; result[resultIndex].isMinted = _exists(tokenId); } return result; } function getTokenInfoBatch(uint256[] calldata _tokenIds) external view returns (TokenInfo[] memory) { TokenInfo[] memory result = new TokenInfo[](_tokenIds.length); for (uint16 i = 0; i < _tokenIds.length; ++i) { result[i].tokenId = _tokenIds[i]; result[i].isValidTokenId = _isValidTokenId(_tokenIds[i]); result[i].reservedUser = reservedTokens_[_tokenIds[i]]; result[i].isMinted = _exists(_tokenIds[i]); } return result; } function _isValidTokenId(uint256 _tokenId) private view returns (bool) { return _tokenId != 0 && _tokenId <= maxPossibleTotalSupply_; } function buy(address _to, uint256 _tokenId) external payable { require(isSaleActive_, "Sale paused"); _takeSingleMintPayment(); _mintReservedToken(_to, _tokenId); } function _mintReservedToken(address _to, uint256 _tokenId) private { require(_isValidTokenId(_tokenId), "Invalid token id"); address reservedUser = reservedTokens_[_tokenId]; // gas savings require(reservedUser == _to || reservedUser == address(0), "Token ID is reserved for another address"); totalSupply_ += 1; _safeMint(_to, _tokenId); } function _takeSingleMintPayment() private { require(msg.value == price_, "Payment amount mismatch"); uint256 sharesLength = shares_.length; // gas savings uint256 transferAmount; uint256 totalTransferred; for (uint16 i = 0; i < sharesLength - 1; ++i) { transferAmount = msg.value * shares_[i].bps / 10_000; totalTransferred += transferAmount; _sendCoin(shares_[i].holder, transferAmount); } _sendCoin(shares_[sharesLength - 1].holder, msg.value - totalTransferred); } function setBaseUri(string memory _baseUri, bool _isEveryTokenUnique) external onlyRole(DEFAULT_ADMIN_ROLE) { _setBaseUri(_baseUri, _isEveryTokenUnique); } function _setBaseUri(string memory _baseUri, bool _isEveryTokenUnique) private { require(bytes(_baseUri).length != 0, "Empty base URI"); baseUri_ = _baseUri; isEveryTokenUnique_ = _isEveryTokenUnique; } function _grantRole(bytes32 _role, address _account) internal virtual override { require(_account != address(0), "Unable to grant role to zero address"); super._grantRole(_role, _account); } function _revokeRole(bytes32 _role, address _account) internal virtual override { require(_account != address(0), "Unable to revoke role from zero address"); super._revokeRole(_role, _account); } function supportsInterface( bytes4 _interfaceId ) public view virtual override(AccessControlUpgradeable, ERC721RoyaltyUpgradeable) returns (bool) { return AccessControlUpgradeable.supportsInterface(_interfaceId) || ERC721RoyaltyUpgradeable.supportsInterface(_interfaceId); } function _sendCoin(address _to, uint256 _amount) private { (bool sent,) = _to.call{value : _amount}(""); require(sent, "Coin send failed"); } /** * @dev Converts a `uint256` to its ASCII `string` decimal representation */ function _toString(uint256 _value) private pure returns (string memory) { if (_value == 0) { return "0"; } uint256 temp = _value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (_value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(_value % 10))); _value /= 10; } return string(buffer); } function _safeSub(uint256 _value, uint256 _sub) private pure returns (uint256) { unchecked { return _value > _sub ? _value - _sub : 0; } } function _min(uint256 _a, uint256 _b) private pure returns (uint256) { return _a <= _b ? _a : _b; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint8","name":"version","type":"uint8"}],"name":"Initialized","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":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"_on","type":"bool"}],"name":"activateSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"availableForMintAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseUri_","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"buy","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"_tokenIds","type":"uint256[]"}],"name":"getTokenInfoBatch","outputs":[{"components":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bool","name":"isValidTokenId","type":"bool"},{"internalType":"address","name":"reservedUser","type":"address"},{"internalType":"bool","name":"isMinted","type":"bool"}],"internalType":"struct TokenInfo[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenIdFrom","type":"uint256"},{"internalType":"uint256","name":"_tokenIdTo","type":"uint256"}],"name":"getTokenInfoBatch","outputs":[{"components":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bool","name":"isValidTokenId","type":"bool"},{"internalType":"address","name":"reservedUser","type":"address"},{"internalType":"bool","name":"isMinted","type":"bool"}],"internalType":"struct TokenInfo[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTokenInfoBatch","outputs":[{"components":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bool","name":"isValidTokenId","type":"bool"},{"internalType":"address","name":"reservedUser","type":"address"},{"internalType":"bool","name":"isMinted","type":"bool"}],"internalType":"struct TokenInfo[]","name":"","type":"tuple[]"}],"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":[{"internalType":"uint256","name":"_incrementAmount","type":"uint256"}],"name":"increaseMaxPossibleTotalSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"},{"internalType":"address","name":"_admin","type":"address"},{"components":[{"internalType":"address","name":"holder","type":"address"},{"internalType":"uint16","name":"bps","type":"uint16"}],"internalType":"struct Share[]","name":"_shares","type":"tuple[]"},{"components":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"address","name":"user","type":"address"}],"internalType":"struct ReservedToken[]","name":"_reservedTokens","type":"tuple[]"},{"internalType":"uint256","name":"_maxPossibleTotalSupply","type":"uint256"},{"components":[{"internalType":"string","name":"baseUri","type":"string"},{"internalType":"bool","name":"isEveryTokenUnique","type":"bool"}],"internalType":"struct BaseUriSettings","name":"_baseUriSettings","type":"tuple"},{"internalType":"uint256","name":"_price","type":"uint256"},{"internalType":"address","name":"_royaltyReceiver","type":"address"},{"internalType":"uint96","name":"_royaltyPercentage","type":"uint96"},{"internalType":"bool","name":"_isSaleActive","type":"bool"}],"name":"initialize","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":[],"name":"isEveryTokenUnique_","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isSaleActive_","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxPossibleTotalSupply_","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"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":"price_","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":"uint256","name":"","type":"uint256"}],"name":"reservedTokens_","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","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":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_baseUri","type":"string"},{"internalType":"bool","name":"_isEveryTokenUnique","type":"bool"}],"name":"setBaseUri","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_price","type":"uint256"}],"name":"setPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"shares_","outputs":[{"internalType":"address","name":"holder","type":"address"},{"internalType":"uint16","name":"bps","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"_interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_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":[{"components":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"address","name":"user","type":"address"}],"internalType":"struct ReservedToken[]","name":"_reservedTokens","type":"tuple[]"}],"name":"updateReservedTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"version","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"}]
Contract Creation Code
60806040523480156200001157600080fd5b506200001c62000022565b620000e4565b600054610100900460ff16156200008f5760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b60005460ff9081161015620000e2576000805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b61371d80620000f46000396000f3fe60806040526004361061023b5760003560e01c806389bc8f661161012e578063c87b56dd116100ab578063d547741f1161006f578063d547741f146106f4578063e25a1a0c14610714578063e985e9c514610729578063ec3829ef14610772578063f0098e5f1461078d57600080fd5b8063c87b56dd14610648578063cce7ec1314610668578063ce40b03f1461067b578063cf4f31c714610692578063d3ccf5f2146106b257600080fd5b80639b099055116100f25780639b099055146105be578063a217fddf146105de578063a22cb465146105f3578063addb8e5814610613578063b88d4fde1461062857600080fd5b806389bc8f661461052957806391b7f5ed1461054957806391d148541461056957806395d89b41146105895780639a26d4c31461059e57600080fd5b80632f2ff15d116101bc5780636352211e116101805780636352211e1461047c578063699e0d2b1461049c5780636a38727e146104c957806370a08231146104e9578063789272871461050957600080fd5b80632f2ff15d146103d057806336568abe146103f057806342842e0e1461041057806354fd4d50146104305780636160f5e11461044557600080fd5b806316b32eaa1161020357806316b32eaa1461030657806318160ddd1461032b57806323b872dd14610341578063248a9ca3146103615780632a55205a1461039157600080fd5b806301ffc9a71461024057806306fdde0314610275578063081812fc14610297578063095ea7b3146102cf57806315702c4e146102f1575b600080fd5b34801561024c57600080fd5b5061026061025b366004612af5565b6107a8565b60405190151581526020015b60405180910390f35b34801561028157600080fd5b5061028a6107c8565b60405161026c9190612b6a565b3480156102a357600080fd5b506102b76102b2366004612b7d565b61085a565b6040516001600160a01b03909116815260200161026c565b3480156102db57600080fd5b506102ef6102ea366004612bb2565b610881565b005b3480156102fd57600080fd5b5061028a61099c565b34801561031257600080fd5b5061031d61012e5481565b60405190815260200161026c565b34801561033757600080fd5b5061012f5461031d565b34801561034d57600080fd5b506102ef61035c366004612bdc565b610a2b565b34801561036d57600080fd5b5061031d61037c366004612b7d565b60009081526065602052604090206001015490565b34801561039d57600080fd5b506103b16103ac366004612c18565b610a5c565b604080516001600160a01b03909316835260208301919091520161026c565b3480156103dc57600080fd5b506102ef6103eb366004612c3a565b610b0a565b3480156103fc57600080fd5b506102ef61040b366004612c3a565b610b2f565b34801561041c57600080fd5b506102ef61042b366004612bdc565b610bad565b34801561043c57600080fd5b5061028a610bc8565b34801561045157600080fd5b506102b7610460366004612b7d565b610134602052600090815260409020546001600160a01b031681565b34801561048857600080fd5b506102b7610497366004612b7d565b610be8565b3480156104a857600080fd5b506104bc6104b7366004612c66565b610c48565b60405161026c9190612cda565b3480156104d557600080fd5b506102ef6104e4366004612fae565b610e51565b3480156104f557600080fd5b5061031d6105043660046130f9565b611224565b34801561051557600080fd5b506104bc610524366004612c18565b6112aa565b34801561053557600080fd5b506102ef610544366004612b7d565b61148f565b34801561055557600080fd5b506102ef610564366004612b7d565b6114b6565b34801561057557600080fd5b50610260610584366004612c3a565b611544565b34801561059557600080fd5b5061028a61156f565b3480156105aa57600080fd5b506102ef6105b9366004613114565b61157e565b3480156105ca57600080fd5b506102ef6105d9366004613155565b611593565b3480156105ea57600080fd5b5061031d600081565b3480156105ff57600080fd5b506102ef61060e366004613199565b6115a8565b34801561061f57600080fd5b506104bc6115b3565b34801561063457600080fd5b506102ef6106433660046131c3565b6115c8565b34801561065457600080fd5b5061028a610663366004612b7d565b611600565b6102ef610676366004612bb2565b6116d9565b34801561068757600080fd5b5061031d6101325481565b34801561069e57600080fd5b506102ef6106ad36600461323e565b61172c565b3480156106be57600080fd5b506106d26106cd366004612b7d565b611795565b604080516001600160a01b03909316835261ffff90911660208301520161026c565b34801561070057600080fd5b506102ef61070f366004612c3a565b6117cc565b34801561072057600080fd5b5061031d6117f1565b34801561073557600080fd5b50610260610744366004613259565b6001600160a01b03918216600090815260ce6020908152604080832093909416825291909152205460ff1690565b34801561077e57600080fd5b50610131546102609060ff1681565b34801561079957600080fd5b50610133546102609060ff1681565b60006107b382611805565b806107c257506107c28261183a565b92915050565b606060c980546107d790613283565b80601f016020809104026020016040519081016040528092919081815260200182805461080390613283565b80156108505780601f1061082557610100808354040283529160200191610850565b820191906000526020600020905b81548152906001019060200180831161083357829003601f168201915b5050505050905090565b600061086582611845565b50600090815260cd60205260409020546001600160a01b031690565b600061088c82610be8565b9050806001600160a01b0316836001600160a01b031614156108ff5760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b60648201526084015b60405180910390fd5b336001600160a01b038216148061091b575061091b8133610744565b61098d5760405162461bcd60e51b815260206004820152603d60248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60448201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c00000060648201526084016108f6565b61099783836118a7565b505050565b61013080546109aa90613283565b80601f01602080910402602001604051908101604052809291908181526020018280546109d690613283565b8015610a235780601f106109f857610100808354040283529160200191610a23565b820191906000526020600020905b815481529060010190602001808311610a0657829003601f168201915b505050505081565b610a353382611915565b610a515760405162461bcd60e51b81526004016108f6906132be565b610997838383611994565b60008281526098602090815260408083208151808301909252546001600160a01b038116808352600160a01b9091046001600160601b0316928201929092528291610ad15750604080518082019091526097546001600160a01b0381168252600160a01b90046001600160601b031660208201525b602081015160009061271090610af0906001600160601b031687613321565b610afa9190613356565b91519350909150505b9250929050565b600082815260656020526040902060010154610b2581611b05565b6109978383611b0f565b6001600160a01b0381163314610b9f5760405162461bcd60e51b815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201526e103937b632b9903337b91039b2b63360891b60648201526084016108f6565b610ba98282611b7b565b5050565b610997838383604051806020016040528060008152506115c8565b60606040518060600160405280602281526020016136c660229139905090565b600081815260cb60205260408120546001600160a01b0316806107c25760405162461bcd60e51b8152602060048201526018602482015277115490cdcc8c4e881a5b9d985b1a59081d1bdad95b88125160421b60448201526064016108f6565b60606000826001600160401b03811115610c6457610c64612d4b565b604051908082528060200260200182016040528015610cb657816020015b604080516080810182526000808252602080830182905292820181905260608201528252600019909201910181610c825790505b50905060005b61ffff8116841115610e495784848261ffff16818110610cde57610cde61336a565b90506020020135828261ffff1681518110610cfb57610cfb61336a565b602090810291909101015152610d2c858561ffff8416818110610d2057610d2061336a565b90506020020135611beb565b828261ffff1681518110610d4257610d4261336a565b6020908102919091018101519115159101526101346000868661ffff8516818110610d6f57610d6f61336a565b90506020020135815260200190815260200160002060009054906101000a90046001600160a01b0316828261ffff1681518110610dae57610dae61336a565b6020026020010151604001906001600160a01b031690816001600160a01b031681525050610e0f85858361ffff16818110610deb57610deb61336a565b90506020020135600090815260cb60205260409020546001600160a01b0316151590565b828261ffff1681518110610e2557610e2561336a565b6020908102919091010151901515606090910152610e4281613380565b9050610cbc565b509392505050565b600054610100900460ff1615808015610e715750600054600160ff909116105b80610e8b5750303b158015610e8b575060005460ff166001145b610eee5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084016108f6565b6000805460ff191660011790558015610f11576000805461ff0019166101001790555b610f1b8d8d611c01565b610f2660008c611b0f565b6000805b8b518110156110b95760006001600160a01b03168c8281518110610f5057610f5061336a565b6020026020010151600001516001600160a01b03161415610fb35760405162461bcd60e51b815260206004820152601860248201527f5a65726f207368617265686f6c6465722061646472657373000000000000000060448201526064016108f6565b8b8181518110610fc557610fc561336a565b60200260200101516020015161ffff16600014156110125760405162461bcd60e51b815260206004820152600a6024820152695a65726f20736861726560b01b60448201526064016108f6565b61012d8c82815181106110275761102761336a565b6020908102919091018101518254600181018455600093845292829020815193018054919092015161ffff16600160a01b026001600160b01b03199091166001600160a01b03909316929092179190911790558b518c908290811061108e5761108e61336a565b602002602001015160200151826110a591906133a2565b9150806110b1816133c8565b915050610f2a565b508061ffff16612710146111065760405162461bcd60e51b8152602060048201526014602482015273496e76616c696420746f74616c2073686172657360601b60448201526064016108f6565b876111535760405162461bcd60e51b815260206004820152601e60248201527f5a65726f206d617820706f737369626c6520746f74616c20737570706c79000060448201526064016108f6565b61012e8890556111638a8a611c32565b61117587600001518860200151611cd7565b856111af5760405162461bcd60e51b815260206004820152600a6024820152695a65726f20707269636560b01b60448201526064016108f6565b6101328690556111bf8585611d40565b50610133805460ff19168315151790558015611215576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050505050505050505050565b60006001600160a01b03821661128e5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a2061646472657373207a65726f206973206e6f7420612076616044820152683634b21037bbb732b960b91b60648201526084016108f6565b506001600160a01b0316600090815260cc602052604090205490565b6060828210156113065760408051600080825260208201909252906112fe565b6040805160808101825260008082526020808301829052928201819052606082015282526000199092019101816112ca5790505b5090506107c2565b600061131284846133e3565b61131d9060016133fa565b6001600160401b0381111561133457611334612d4b565b60405190808252806020026020018201604052801561138657816020015b6040805160808101825260008082526020808301829052928201819052606082015282526000199092019101816113525790505b509050835b6113968460016133fa565b811015610e495760006113a986836133e3565b9050818382815181106113be576113be61336a565b6020908102919091010151526113d382611beb565b8382815181106113e5576113e561336a565b602090810291909101810151911515918101919091526000838152610134909152604090205483516001600160a01b039091169084908390811061142b5761142b61336a565b6020908102919091018101516001600160a01b03928316604091820152600085815260cb90925290205416151583828151811061146a5761146a61336a565b602090810291909101015190151560609091015250611488816133c8565b905061138b565b600061149a81611b05565b8161012e60008282546114ad91906133fa565b90915550505050565b60006114c181611b05565b816114fb5760405162461bcd60e51b815260206004820152600a6024820152695a65726f20707269636560b01b60448201526064016108f6565b8161013254141561153d5760405162461bcd60e51b815260206004820152600c60248201526b416c726561647920646f6e6560a01b60448201526064016108f6565b5061013255565b60009182526065602090815260408084206001600160a01b0393909316845291905290205460ff1690565b606060ca80546107d790613283565b600061158981611b05565b6109978383611c32565b600061159e81611b05565b6109978383611cd7565b610ba9338383611e3d565b60606115c3600161012e546112aa565b905090565b6115d23383611915565b6115ee5760405162461bcd60e51b81526004016108f6906132be565b6115fa84848484611f0c565b50505050565b606061160b82611845565b6101315460ff166116a757610130805461162490613283565b80601f016020809104026020016040519081016040528092919081815260200182805461165090613283565b801561169d5780601f106116725761010080835404028352916020019161169d565b820191906000526020600020905b81548152906001019060200180831161168057829003601f168201915b50505050506107c2565b6101306116b383611f3f565b6040516020016116c492919061342e565b60405160208183030381529060405292915050565b6101335460ff1661171a5760405162461bcd60e51b815260206004820152600b60248201526a14d85b19481c185d5cd95960aa1b60448201526064016108f6565b61172261203c565b610ba9828261218d565b600061173781611b05565b6101335460ff16151582151514156117805760405162461bcd60e51b815260206004820152600c60248201526b416c726561647920646f6e6560a01b60448201526064016108f6565b50610133805460ff1916911515919091179055565b61012d81815481106117a657600080fd5b6000918252602090912001546001600160a01b0381169150600160a01b900461ffff1682565b6000828152606560205260409020600101546117e781611b05565b6109978383611b7b565b600061012f5461012e546115c391906133e3565b60006001600160e01b03198216637965db0b60e01b14806107c257506301ffc9a760e01b6001600160e01b03198316146107c2565b60006107c282612288565b600081815260cb60205260409020546001600160a01b03166118a45760405162461bcd60e51b8152602060048201526018602482015277115490cdcc8c4e881a5b9d985b1a59081d1bdad95b88125160421b60448201526064016108f6565b50565b600081815260cd6020526040902080546001600160a01b0319166001600160a01b03841690811790915581906118dc82610be8565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60008061192183610be8565b9050806001600160a01b0316846001600160a01b0316148061196857506001600160a01b03808216600090815260ce602090815260408083209388168352929052205460ff165b8061198c5750836001600160a01b03166119818461085a565b6001600160a01b0316145b949350505050565b826001600160a01b03166119a782610be8565b6001600160a01b0316146119cd5760405162461bcd60e51b81526004016108f6906134e9565b6001600160a01b038216611a2f5760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b60648201526084016108f6565b611a3c83838360016122c8565b826001600160a01b0316611a4f82610be8565b6001600160a01b031614611a755760405162461bcd60e51b81526004016108f6906134e9565b600081815260cd6020908152604080832080546001600160a01b03199081169091556001600160a01b0387811680865260cc855283862080546000190190559087168086528386208054600101905586865260cb90945282852080549092168417909155905184937fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b6118a48133612350565b6001600160a01b038116611b715760405162461bcd60e51b8152602060048201526024808201527f556e61626c6520746f206772616e7420726f6c6520746f207a65726f206164646044820152637265737360e01b60648201526084016108f6565b610ba982826123a9565b6001600160a01b038116611be15760405162461bcd60e51b815260206004820152602760248201527f556e61626c6520746f207265766f6b6520726f6c652066726f6d207a65726f206044820152666164647265737360c81b60648201526084016108f6565b610ba9828261242f565b600081158015906107c257505061012e54101590565b600054610100900460ff16611c285760405162461bcd60e51b81526004016108f69061352e565b610ba98282612496565b60005b61ffff81168211156109975782828261ffff16818110611c5757611c5761336a565b9050604002016020016020810190611c6f91906130f9565b610134600085858561ffff16818110611c8a57611c8a61336a565b90506040020160000135815260200190815260200160002060006101000a8154816001600160a01b0302191690836001600160a01b0316021790555080611cd090613380565b9050611c35565b8151611d165760405162461bcd60e51b815260206004820152600e60248201526d456d70747920626173652055524960901b60448201526064016108f6565b8151611d2a90610130906020850190612a46565b50610131805460ff191691151591909117905550565b6127106001600160601b0382161115611dae5760405162461bcd60e51b815260206004820152602a60248201527f455243323938313a20726f79616c7479206665652077696c6c206578636565646044820152692073616c65507269636560b01b60648201526084016108f6565b6001600160a01b038216611e045760405162461bcd60e51b815260206004820152601960248201527f455243323938313a20696e76616c69642072656365697665720000000000000060448201526064016108f6565b604080518082019091526001600160a01b039092168083526001600160601b039091166020909201829052600160a01b90910217609755565b816001600160a01b0316836001600160a01b03161415611e9f5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c65720000000000000060448201526064016108f6565b6001600160a01b03838116600081815260ce6020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b611f17848484611994565b611f23848484846124e4565b6115fa5760405162461bcd60e51b81526004016108f690613579565b606081611f635750506040805180820190915260018152600360fc1b602082015290565b8160005b8115611f8d5780611f77816133c8565b9150611f869050600a83613356565b9150611f67565b6000816001600160401b03811115611fa757611fa7612d4b565b6040519080825280601f01601f191660200182016040528015611fd1576020820181803683370190505b5090505b841561198c57611fe66001836133e3565b9150611ff3600a866135cb565b611ffe9060306133fa565b60f81b8183815181106120135761201361336a565b60200101906001600160f81b031916908160001a905350612035600a86613356565b9450611fd5565b61013254341461208e5760405162461bcd60e51b815260206004820152601760248201527f5061796d656e7420616d6f756e74206d69736d6174636800000000000000000060448201526064016108f6565b61012d54600080805b6120a26001856133e3565b8161ffff1610156121475761271061012d8261ffff16815481106120c8576120c861336a565b6000918252602090912001546120e990600160a01b900461ffff1634613321565b6120f39190613356565b92506120ff83836133fa565b915061213761012d8261ffff168154811061211c5761211c61336a565b6000918252602090912001546001600160a01b0316846125f1565b61214081613380565b9050612097565b5061099761012d6121596001866133e3565b815481106121695761216961336a565b6000918252602090912001546001600160a01b031661218883346133e3565b6125f1565b61219681611beb565b6121d55760405162461bcd60e51b815260206004820152601060248201526f125b9d985b1a59081d1bdad95b881a5960821b60448201526064016108f6565b600081815261013460205260409020546001600160a01b0390811690831681148061220757506001600160a01b038116155b6122645760405162461bcd60e51b815260206004820152602860248201527f546f6b656e20494420697320726573657276656420666f7220616e6f74686572604482015267206164647265737360c01b60648201526084016108f6565b600161012f600082825461227891906133fa565b9091555061099790508383612687565b60006001600160e01b031982166380ac58cd60e01b14806122b957506001600160e01b03198216635b5e139f60e01b145b806107c257506107c2826126a1565b60018111156115fa576001600160a01b0384161561230e576001600160a01b038416600090815260cc6020526040812080548392906123089084906133e3565b90915550505b6001600160a01b038316156115fa576001600160a01b038316600090815260cc6020526040812080548392906123459084906133fa565b909155505050505050565b61235a8282611544565b610ba957612367816126c6565b6123728360206126d8565b6040516020016123839291906135df565b60408051601f198184030181529082905262461bcd60e51b82526108f691600401612b6a565b6123b38282611544565b610ba95760008281526065602090815260408083206001600160a01b03851684529091529020805460ff191660011790556123eb3390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b6124398282611544565b15610ba95760008281526065602090815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b600054610100900460ff166124bd5760405162461bcd60e51b81526004016108f69061352e565b81516124d09060c9906020850190612a46565b5080516109979060ca906020840190612a46565b60006001600160a01b0384163b156125e657604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290612528903390899088908890600401613654565b602060405180830381600087803b15801561254257600080fd5b505af1925050508015612572575060408051601f3d908101601f1916820190925261256f91810190613691565b60015b6125cc573d8080156125a0576040519150601f19603f3d011682016040523d82523d6000602084013e6125a5565b606091505b5080516125c45760405162461bcd60e51b81526004016108f690613579565b805181602001fd5b6001600160e01b031916630a85bd0160e11b14905061198c565b506001949350505050565b6000826001600160a01b03168260405160006040518083038185875af1925050503d806000811461263e576040519150601f19603f3d011682016040523d82523d6000602084013e612643565b606091505b50509050806109975760405162461bcd60e51b815260206004820152601060248201526f10dbda5b881cd95b990819985a5b195960821b60448201526064016108f6565b610ba982826040518060200160405280600081525061287a565b60006001600160e01b0319821663152a902d60e11b14806107c257506107c282611805565b60606107c26001600160a01b03831660145b606060006126e7836002613321565b6126f29060026133fa565b6001600160401b0381111561270957612709612d4b565b6040519080825280601f01601f191660200182016040528015612733576020820181803683370190505b509050600360fc1b8160008151811061274e5761274e61336a565b60200101906001600160f81b031916908160001a905350600f60fb1b8160018151811061277d5761277d61336a565b60200101906001600160f81b031916908160001a90535060006127a1846002613321565b6127ac9060016133fa565b90505b6001811115612824576f181899199a1a9b1b9c1cb0b131b232b360811b85600f16601081106127e0576127e061336a565b1a60f81b8282815181106127f6576127f661336a565b60200101906001600160f81b031916908160001a90535060049490941c9361281d816136ae565b90506127af565b5083156128735760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e7460448201526064016108f6565b9392505050565b61288483836128ad565b61289160008484846124e4565b6109975760405162461bcd60e51b81526004016108f690613579565b6001600160a01b0382166129035760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f206164647265737360448201526064016108f6565b600081815260cb60205260409020546001600160a01b0316156129685760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e7465640000000060448201526064016108f6565b6129766000838360016122c8565b600081815260cb60205260409020546001600160a01b0316156129db5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e7465640000000060448201526064016108f6565b6001600160a01b038216600081815260cc602090815260408083208054600101905584835260cb90915280822080546001600160a01b0319168417905551839291907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b828054612a5290613283565b90600052602060002090601f016020900481019282612a745760008555612aba565b82601f10612a8d57805160ff1916838001178555612aba565b82800160010185558215612aba579182015b82811115612aba578251825591602001919060010190612a9f565b50612ac6929150612aca565b5090565b5b80821115612ac65760008155600101612acb565b6001600160e01b0319811681146118a457600080fd5b600060208284031215612b0757600080fd5b813561287381612adf565b60005b83811015612b2d578181015183820152602001612b15565b838111156115fa5750506000910152565b60008151808452612b56816020860160208601612b12565b601f01601f19169290920160200192915050565b6020815260006128736020830184612b3e565b600060208284031215612b8f57600080fd5b5035919050565b80356001600160a01b0381168114612bad57600080fd5b919050565b60008060408385031215612bc557600080fd5b612bce83612b96565b946020939093013593505050565b600080600060608486031215612bf157600080fd5b612bfa84612b96565b9250612c0860208501612b96565b9150604084013590509250925092565b60008060408385031215612c2b57600080fd5b50508035926020909101359150565b60008060408385031215612c4d57600080fd5b82359150612c5d60208401612b96565b90509250929050565b60008060208385031215612c7957600080fd5b82356001600160401b0380821115612c9057600080fd5b818501915085601f830112612ca457600080fd5b813581811115612cb357600080fd5b8660208260051b8501011115612cc857600080fd5b60209290920196919550909350505050565b602080825282518282018190526000919060409081850190868401855b82811015612d3e5781518051855286810151151587860152858101516001600160a01b03168686015260609081015115159085015260809093019290850190600101612cf7565b5091979650505050505050565b634e487b7160e01b600052604160045260246000fd5b604080519081016001600160401b0381118282101715612d8357612d83612d4b565b60405290565b604051601f8201601f191681016001600160401b0381118282101715612db157612db1612d4b565b604052919050565b60006001600160401b03831115612dd257612dd2612d4b565b612de5601f8401601f1916602001612d89565b9050828152838383011115612df957600080fd5b828260208301376000602084830101529392505050565b600082601f830112612e2157600080fd5b61287383833560208501612db9565b600082601f830112612e4157600080fd5b813560206001600160401b03821115612e5c57612e5c612d4b565b612e6a818360051b01612d89565b82815260069290921b84018101918181019086841115612e8957600080fd5b8286015b84811015612ee05760408189031215612ea65760008081fd5b612eae612d61565b612eb782612b96565b81528482013561ffff81168114612ece5760008081fd5b81860152835291830191604001612e8d565b509695505050505050565b60008083601f840112612efd57600080fd5b5081356001600160401b03811115612f1457600080fd5b6020830191508360208260061b8501011115610b0357600080fd5b80358015158114612bad57600080fd5b600060408284031215612f5157600080fd5b612f59612d61565b905081356001600160401b03811115612f7157600080fd5b612f7d84828501612e10565b825250612f8c60208301612f2f565b602082015292915050565b80356001600160601b0381168114612bad57600080fd5b6000806000806000806000806000806000806101608d8f031215612fd157600080fd5b6001600160401b038d351115612fe657600080fd5b612ff38e8e358f01612e10565b9b506001600160401b0360208e0135111561300d57600080fd5b61301d8e60208f01358f01612e10565b9a5061302b60408e01612b96565b99506001600160401b0360608e0135111561304557600080fd5b6130558e60608f01358f01612e30565b98506001600160401b0360808e0135111561306f57600080fd5b61307f8e60808f01358f01612eeb565b909850965060a08d013595506001600160401b0360c08e013511156130a357600080fd5b6130b38e60c08f01358f01612f3f565b945060e08d013593506130c96101008e01612b96565b92506130d86101208e01612f97565b91506130e76101408e01612f2f565b90509295989b509295989b509295989b565b60006020828403121561310b57600080fd5b61287382612b96565b6000806020838503121561312757600080fd5b82356001600160401b0381111561313d57600080fd5b61314985828601612eeb565b90969095509350505050565b6000806040838503121561316857600080fd5b82356001600160401b0381111561317e57600080fd5b61318a85828601612e10565b925050612c5d60208401612f2f565b600080604083850312156131ac57600080fd5b6131b583612b96565b9150612c5d60208401612f2f565b600080600080608085870312156131d957600080fd5b6131e285612b96565b93506131f060208601612b96565b92506040850135915060608501356001600160401b0381111561321257600080fd5b8501601f8101871361322357600080fd5b61323287823560208401612db9565b91505092959194509250565b60006020828403121561325057600080fd5b61287382612f2f565b6000806040838503121561326c57600080fd5b61327583612b96565b9150612c5d60208401612b96565b600181811c9082168061329757607f821691505b602082108114156132b857634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252602d908201527f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560408201526c1c881bdc88185c1c1c9bdd9959609a1b606082015260800190565b634e487b7160e01b600052601160045260246000fd5b600081600019048311821515161561333b5761333b61330b565b500290565b634e487b7160e01b600052601260045260246000fd5b60008261336557613365613340565b500490565b634e487b7160e01b600052603260045260246000fd5b600061ffff808316818114156133985761339861330b565b6001019392505050565b600061ffff8083168185168083038211156133bf576133bf61330b565b01949350505050565b60006000198214156133dc576133dc61330b565b5060010190565b6000828210156133f5576133f561330b565b500390565b6000821982111561340d5761340d61330b565b500190565b60008151613424818560208601612b12565b9290920192915050565b600080845481600182811c91508083168061344a57607f831692505b602080841082141561346a57634e487b7160e01b86526022600452602486fd5b81801561347e576001811461348f576134bc565b60ff198616895284890196506134bc565b60008b81526020902060005b868110156134b45781548b82015290850190830161349b565b505084890196505b5050505050506134e06134cf8286613412565b64173539b7b760d91b815260050190565b95945050505050565b60208082526025908201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060408201526437bbb732b960d91b606082015260800190565b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6000826135da576135da613340565b500690565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000815260008351613617816017850160208801612b12565b7001034b99036b4b9b9b4b733903937b6329607d1b6017918401918201528351613648816028840160208801612b12565b01602801949350505050565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061368790830184612b3e565b9695505050505050565b6000602082840312156136a357600080fd5b815161287381612adf565b6000816136bd576136bd61330b565b50600019019056fe53636f7270696f7352657665616c61626c654e6674436f6c6c656374696f6e207632a264697066735822122091c65f43ba720967cf12af66bd8ba59e80a233e90e2825fadc94a71d0609c4a664736f6c63430008090033
Deployed Bytecode
0x60806040526004361061023b5760003560e01c806389bc8f661161012e578063c87b56dd116100ab578063d547741f1161006f578063d547741f146106f4578063e25a1a0c14610714578063e985e9c514610729578063ec3829ef14610772578063f0098e5f1461078d57600080fd5b8063c87b56dd14610648578063cce7ec1314610668578063ce40b03f1461067b578063cf4f31c714610692578063d3ccf5f2146106b257600080fd5b80639b099055116100f25780639b099055146105be578063a217fddf146105de578063a22cb465146105f3578063addb8e5814610613578063b88d4fde1461062857600080fd5b806389bc8f661461052957806391b7f5ed1461054957806391d148541461056957806395d89b41146105895780639a26d4c31461059e57600080fd5b80632f2ff15d116101bc5780636352211e116101805780636352211e1461047c578063699e0d2b1461049c5780636a38727e146104c957806370a08231146104e9578063789272871461050957600080fd5b80632f2ff15d146103d057806336568abe146103f057806342842e0e1461041057806354fd4d50146104305780636160f5e11461044557600080fd5b806316b32eaa1161020357806316b32eaa1461030657806318160ddd1461032b57806323b872dd14610341578063248a9ca3146103615780632a55205a1461039157600080fd5b806301ffc9a71461024057806306fdde0314610275578063081812fc14610297578063095ea7b3146102cf57806315702c4e146102f1575b600080fd5b34801561024c57600080fd5b5061026061025b366004612af5565b6107a8565b60405190151581526020015b60405180910390f35b34801561028157600080fd5b5061028a6107c8565b60405161026c9190612b6a565b3480156102a357600080fd5b506102b76102b2366004612b7d565b61085a565b6040516001600160a01b03909116815260200161026c565b3480156102db57600080fd5b506102ef6102ea366004612bb2565b610881565b005b3480156102fd57600080fd5b5061028a61099c565b34801561031257600080fd5b5061031d61012e5481565b60405190815260200161026c565b34801561033757600080fd5b5061012f5461031d565b34801561034d57600080fd5b506102ef61035c366004612bdc565b610a2b565b34801561036d57600080fd5b5061031d61037c366004612b7d565b60009081526065602052604090206001015490565b34801561039d57600080fd5b506103b16103ac366004612c18565b610a5c565b604080516001600160a01b03909316835260208301919091520161026c565b3480156103dc57600080fd5b506102ef6103eb366004612c3a565b610b0a565b3480156103fc57600080fd5b506102ef61040b366004612c3a565b610b2f565b34801561041c57600080fd5b506102ef61042b366004612bdc565b610bad565b34801561043c57600080fd5b5061028a610bc8565b34801561045157600080fd5b506102b7610460366004612b7d565b610134602052600090815260409020546001600160a01b031681565b34801561048857600080fd5b506102b7610497366004612b7d565b610be8565b3480156104a857600080fd5b506104bc6104b7366004612c66565b610c48565b60405161026c9190612cda565b3480156104d557600080fd5b506102ef6104e4366004612fae565b610e51565b3480156104f557600080fd5b5061031d6105043660046130f9565b611224565b34801561051557600080fd5b506104bc610524366004612c18565b6112aa565b34801561053557600080fd5b506102ef610544366004612b7d565b61148f565b34801561055557600080fd5b506102ef610564366004612b7d565b6114b6565b34801561057557600080fd5b50610260610584366004612c3a565b611544565b34801561059557600080fd5b5061028a61156f565b3480156105aa57600080fd5b506102ef6105b9366004613114565b61157e565b3480156105ca57600080fd5b506102ef6105d9366004613155565b611593565b3480156105ea57600080fd5b5061031d600081565b3480156105ff57600080fd5b506102ef61060e366004613199565b6115a8565b34801561061f57600080fd5b506104bc6115b3565b34801561063457600080fd5b506102ef6106433660046131c3565b6115c8565b34801561065457600080fd5b5061028a610663366004612b7d565b611600565b6102ef610676366004612bb2565b6116d9565b34801561068757600080fd5b5061031d6101325481565b34801561069e57600080fd5b506102ef6106ad36600461323e565b61172c565b3480156106be57600080fd5b506106d26106cd366004612b7d565b611795565b604080516001600160a01b03909316835261ffff90911660208301520161026c565b34801561070057600080fd5b506102ef61070f366004612c3a565b6117cc565b34801561072057600080fd5b5061031d6117f1565b34801561073557600080fd5b50610260610744366004613259565b6001600160a01b03918216600090815260ce6020908152604080832093909416825291909152205460ff1690565b34801561077e57600080fd5b50610131546102609060ff1681565b34801561079957600080fd5b50610133546102609060ff1681565b60006107b382611805565b806107c257506107c28261183a565b92915050565b606060c980546107d790613283565b80601f016020809104026020016040519081016040528092919081815260200182805461080390613283565b80156108505780601f1061082557610100808354040283529160200191610850565b820191906000526020600020905b81548152906001019060200180831161083357829003601f168201915b5050505050905090565b600061086582611845565b50600090815260cd60205260409020546001600160a01b031690565b600061088c82610be8565b9050806001600160a01b0316836001600160a01b031614156108ff5760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b60648201526084015b60405180910390fd5b336001600160a01b038216148061091b575061091b8133610744565b61098d5760405162461bcd60e51b815260206004820152603d60248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60448201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c00000060648201526084016108f6565b61099783836118a7565b505050565b61013080546109aa90613283565b80601f01602080910402602001604051908101604052809291908181526020018280546109d690613283565b8015610a235780601f106109f857610100808354040283529160200191610a23565b820191906000526020600020905b815481529060010190602001808311610a0657829003601f168201915b505050505081565b610a353382611915565b610a515760405162461bcd60e51b81526004016108f6906132be565b610997838383611994565b60008281526098602090815260408083208151808301909252546001600160a01b038116808352600160a01b9091046001600160601b0316928201929092528291610ad15750604080518082019091526097546001600160a01b0381168252600160a01b90046001600160601b031660208201525b602081015160009061271090610af0906001600160601b031687613321565b610afa9190613356565b91519350909150505b9250929050565b600082815260656020526040902060010154610b2581611b05565b6109978383611b0f565b6001600160a01b0381163314610b9f5760405162461bcd60e51b815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201526e103937b632b9903337b91039b2b63360891b60648201526084016108f6565b610ba98282611b7b565b5050565b610997838383604051806020016040528060008152506115c8565b60606040518060600160405280602281526020016136c660229139905090565b600081815260cb60205260408120546001600160a01b0316806107c25760405162461bcd60e51b8152602060048201526018602482015277115490cdcc8c4e881a5b9d985b1a59081d1bdad95b88125160421b60448201526064016108f6565b60606000826001600160401b03811115610c6457610c64612d4b565b604051908082528060200260200182016040528015610cb657816020015b604080516080810182526000808252602080830182905292820181905260608201528252600019909201910181610c825790505b50905060005b61ffff8116841115610e495784848261ffff16818110610cde57610cde61336a565b90506020020135828261ffff1681518110610cfb57610cfb61336a565b602090810291909101015152610d2c858561ffff8416818110610d2057610d2061336a565b90506020020135611beb565b828261ffff1681518110610d4257610d4261336a565b6020908102919091018101519115159101526101346000868661ffff8516818110610d6f57610d6f61336a565b90506020020135815260200190815260200160002060009054906101000a90046001600160a01b0316828261ffff1681518110610dae57610dae61336a565b6020026020010151604001906001600160a01b031690816001600160a01b031681525050610e0f85858361ffff16818110610deb57610deb61336a565b90506020020135600090815260cb60205260409020546001600160a01b0316151590565b828261ffff1681518110610e2557610e2561336a565b6020908102919091010151901515606090910152610e4281613380565b9050610cbc565b509392505050565b600054610100900460ff1615808015610e715750600054600160ff909116105b80610e8b5750303b158015610e8b575060005460ff166001145b610eee5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084016108f6565b6000805460ff191660011790558015610f11576000805461ff0019166101001790555b610f1b8d8d611c01565b610f2660008c611b0f565b6000805b8b518110156110b95760006001600160a01b03168c8281518110610f5057610f5061336a565b6020026020010151600001516001600160a01b03161415610fb35760405162461bcd60e51b815260206004820152601860248201527f5a65726f207368617265686f6c6465722061646472657373000000000000000060448201526064016108f6565b8b8181518110610fc557610fc561336a565b60200260200101516020015161ffff16600014156110125760405162461bcd60e51b815260206004820152600a6024820152695a65726f20736861726560b01b60448201526064016108f6565b61012d8c82815181106110275761102761336a565b6020908102919091018101518254600181018455600093845292829020815193018054919092015161ffff16600160a01b026001600160b01b03199091166001600160a01b03909316929092179190911790558b518c908290811061108e5761108e61336a565b602002602001015160200151826110a591906133a2565b9150806110b1816133c8565b915050610f2a565b508061ffff16612710146111065760405162461bcd60e51b8152602060048201526014602482015273496e76616c696420746f74616c2073686172657360601b60448201526064016108f6565b876111535760405162461bcd60e51b815260206004820152601e60248201527f5a65726f206d617820706f737369626c6520746f74616c20737570706c79000060448201526064016108f6565b61012e8890556111638a8a611c32565b61117587600001518860200151611cd7565b856111af5760405162461bcd60e51b815260206004820152600a6024820152695a65726f20707269636560b01b60448201526064016108f6565b6101328690556111bf8585611d40565b50610133805460ff19168315151790558015611215576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050505050505050505050565b60006001600160a01b03821661128e5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a2061646472657373207a65726f206973206e6f7420612076616044820152683634b21037bbb732b960b91b60648201526084016108f6565b506001600160a01b0316600090815260cc602052604090205490565b6060828210156113065760408051600080825260208201909252906112fe565b6040805160808101825260008082526020808301829052928201819052606082015282526000199092019101816112ca5790505b5090506107c2565b600061131284846133e3565b61131d9060016133fa565b6001600160401b0381111561133457611334612d4b565b60405190808252806020026020018201604052801561138657816020015b6040805160808101825260008082526020808301829052928201819052606082015282526000199092019101816113525790505b509050835b6113968460016133fa565b811015610e495760006113a986836133e3565b9050818382815181106113be576113be61336a565b6020908102919091010151526113d382611beb565b8382815181106113e5576113e561336a565b602090810291909101810151911515918101919091526000838152610134909152604090205483516001600160a01b039091169084908390811061142b5761142b61336a565b6020908102919091018101516001600160a01b03928316604091820152600085815260cb90925290205416151583828151811061146a5761146a61336a565b602090810291909101015190151560609091015250611488816133c8565b905061138b565b600061149a81611b05565b8161012e60008282546114ad91906133fa565b90915550505050565b60006114c181611b05565b816114fb5760405162461bcd60e51b815260206004820152600a6024820152695a65726f20707269636560b01b60448201526064016108f6565b8161013254141561153d5760405162461bcd60e51b815260206004820152600c60248201526b416c726561647920646f6e6560a01b60448201526064016108f6565b5061013255565b60009182526065602090815260408084206001600160a01b0393909316845291905290205460ff1690565b606060ca80546107d790613283565b600061158981611b05565b6109978383611c32565b600061159e81611b05565b6109978383611cd7565b610ba9338383611e3d565b60606115c3600161012e546112aa565b905090565b6115d23383611915565b6115ee5760405162461bcd60e51b81526004016108f6906132be565b6115fa84848484611f0c565b50505050565b606061160b82611845565b6101315460ff166116a757610130805461162490613283565b80601f016020809104026020016040519081016040528092919081815260200182805461165090613283565b801561169d5780601f106116725761010080835404028352916020019161169d565b820191906000526020600020905b81548152906001019060200180831161168057829003601f168201915b50505050506107c2565b6101306116b383611f3f565b6040516020016116c492919061342e565b60405160208183030381529060405292915050565b6101335460ff1661171a5760405162461bcd60e51b815260206004820152600b60248201526a14d85b19481c185d5cd95960aa1b60448201526064016108f6565b61172261203c565b610ba9828261218d565b600061173781611b05565b6101335460ff16151582151514156117805760405162461bcd60e51b815260206004820152600c60248201526b416c726561647920646f6e6560a01b60448201526064016108f6565b50610133805460ff1916911515919091179055565b61012d81815481106117a657600080fd5b6000918252602090912001546001600160a01b0381169150600160a01b900461ffff1682565b6000828152606560205260409020600101546117e781611b05565b6109978383611b7b565b600061012f5461012e546115c391906133e3565b60006001600160e01b03198216637965db0b60e01b14806107c257506301ffc9a760e01b6001600160e01b03198316146107c2565b60006107c282612288565b600081815260cb60205260409020546001600160a01b03166118a45760405162461bcd60e51b8152602060048201526018602482015277115490cdcc8c4e881a5b9d985b1a59081d1bdad95b88125160421b60448201526064016108f6565b50565b600081815260cd6020526040902080546001600160a01b0319166001600160a01b03841690811790915581906118dc82610be8565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60008061192183610be8565b9050806001600160a01b0316846001600160a01b0316148061196857506001600160a01b03808216600090815260ce602090815260408083209388168352929052205460ff165b8061198c5750836001600160a01b03166119818461085a565b6001600160a01b0316145b949350505050565b826001600160a01b03166119a782610be8565b6001600160a01b0316146119cd5760405162461bcd60e51b81526004016108f6906134e9565b6001600160a01b038216611a2f5760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b60648201526084016108f6565b611a3c83838360016122c8565b826001600160a01b0316611a4f82610be8565b6001600160a01b031614611a755760405162461bcd60e51b81526004016108f6906134e9565b600081815260cd6020908152604080832080546001600160a01b03199081169091556001600160a01b0387811680865260cc855283862080546000190190559087168086528386208054600101905586865260cb90945282852080549092168417909155905184937fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b6118a48133612350565b6001600160a01b038116611b715760405162461bcd60e51b8152602060048201526024808201527f556e61626c6520746f206772616e7420726f6c6520746f207a65726f206164646044820152637265737360e01b60648201526084016108f6565b610ba982826123a9565b6001600160a01b038116611be15760405162461bcd60e51b815260206004820152602760248201527f556e61626c6520746f207265766f6b6520726f6c652066726f6d207a65726f206044820152666164647265737360c81b60648201526084016108f6565b610ba9828261242f565b600081158015906107c257505061012e54101590565b600054610100900460ff16611c285760405162461bcd60e51b81526004016108f69061352e565b610ba98282612496565b60005b61ffff81168211156109975782828261ffff16818110611c5757611c5761336a565b9050604002016020016020810190611c6f91906130f9565b610134600085858561ffff16818110611c8a57611c8a61336a565b90506040020160000135815260200190815260200160002060006101000a8154816001600160a01b0302191690836001600160a01b0316021790555080611cd090613380565b9050611c35565b8151611d165760405162461bcd60e51b815260206004820152600e60248201526d456d70747920626173652055524960901b60448201526064016108f6565b8151611d2a90610130906020850190612a46565b50610131805460ff191691151591909117905550565b6127106001600160601b0382161115611dae5760405162461bcd60e51b815260206004820152602a60248201527f455243323938313a20726f79616c7479206665652077696c6c206578636565646044820152692073616c65507269636560b01b60648201526084016108f6565b6001600160a01b038216611e045760405162461bcd60e51b815260206004820152601960248201527f455243323938313a20696e76616c69642072656365697665720000000000000060448201526064016108f6565b604080518082019091526001600160a01b039092168083526001600160601b039091166020909201829052600160a01b90910217609755565b816001600160a01b0316836001600160a01b03161415611e9f5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c65720000000000000060448201526064016108f6565b6001600160a01b03838116600081815260ce6020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b611f17848484611994565b611f23848484846124e4565b6115fa5760405162461bcd60e51b81526004016108f690613579565b606081611f635750506040805180820190915260018152600360fc1b602082015290565b8160005b8115611f8d5780611f77816133c8565b9150611f869050600a83613356565b9150611f67565b6000816001600160401b03811115611fa757611fa7612d4b565b6040519080825280601f01601f191660200182016040528015611fd1576020820181803683370190505b5090505b841561198c57611fe66001836133e3565b9150611ff3600a866135cb565b611ffe9060306133fa565b60f81b8183815181106120135761201361336a565b60200101906001600160f81b031916908160001a905350612035600a86613356565b9450611fd5565b61013254341461208e5760405162461bcd60e51b815260206004820152601760248201527f5061796d656e7420616d6f756e74206d69736d6174636800000000000000000060448201526064016108f6565b61012d54600080805b6120a26001856133e3565b8161ffff1610156121475761271061012d8261ffff16815481106120c8576120c861336a565b6000918252602090912001546120e990600160a01b900461ffff1634613321565b6120f39190613356565b92506120ff83836133fa565b915061213761012d8261ffff168154811061211c5761211c61336a565b6000918252602090912001546001600160a01b0316846125f1565b61214081613380565b9050612097565b5061099761012d6121596001866133e3565b815481106121695761216961336a565b6000918252602090912001546001600160a01b031661218883346133e3565b6125f1565b61219681611beb565b6121d55760405162461bcd60e51b815260206004820152601060248201526f125b9d985b1a59081d1bdad95b881a5960821b60448201526064016108f6565b600081815261013460205260409020546001600160a01b0390811690831681148061220757506001600160a01b038116155b6122645760405162461bcd60e51b815260206004820152602860248201527f546f6b656e20494420697320726573657276656420666f7220616e6f74686572604482015267206164647265737360c01b60648201526084016108f6565b600161012f600082825461227891906133fa565b9091555061099790508383612687565b60006001600160e01b031982166380ac58cd60e01b14806122b957506001600160e01b03198216635b5e139f60e01b145b806107c257506107c2826126a1565b60018111156115fa576001600160a01b0384161561230e576001600160a01b038416600090815260cc6020526040812080548392906123089084906133e3565b90915550505b6001600160a01b038316156115fa576001600160a01b038316600090815260cc6020526040812080548392906123459084906133fa565b909155505050505050565b61235a8282611544565b610ba957612367816126c6565b6123728360206126d8565b6040516020016123839291906135df565b60408051601f198184030181529082905262461bcd60e51b82526108f691600401612b6a565b6123b38282611544565b610ba95760008281526065602090815260408083206001600160a01b03851684529091529020805460ff191660011790556123eb3390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b6124398282611544565b15610ba95760008281526065602090815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b600054610100900460ff166124bd5760405162461bcd60e51b81526004016108f69061352e565b81516124d09060c9906020850190612a46565b5080516109979060ca906020840190612a46565b60006001600160a01b0384163b156125e657604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290612528903390899088908890600401613654565b602060405180830381600087803b15801561254257600080fd5b505af1925050508015612572575060408051601f3d908101601f1916820190925261256f91810190613691565b60015b6125cc573d8080156125a0576040519150601f19603f3d011682016040523d82523d6000602084013e6125a5565b606091505b5080516125c45760405162461bcd60e51b81526004016108f690613579565b805181602001fd5b6001600160e01b031916630a85bd0160e11b14905061198c565b506001949350505050565b6000826001600160a01b03168260405160006040518083038185875af1925050503d806000811461263e576040519150601f19603f3d011682016040523d82523d6000602084013e612643565b606091505b50509050806109975760405162461bcd60e51b815260206004820152601060248201526f10dbda5b881cd95b990819985a5b195960821b60448201526064016108f6565b610ba982826040518060200160405280600081525061287a565b60006001600160e01b0319821663152a902d60e11b14806107c257506107c282611805565b60606107c26001600160a01b03831660145b606060006126e7836002613321565b6126f29060026133fa565b6001600160401b0381111561270957612709612d4b565b6040519080825280601f01601f191660200182016040528015612733576020820181803683370190505b509050600360fc1b8160008151811061274e5761274e61336a565b60200101906001600160f81b031916908160001a905350600f60fb1b8160018151811061277d5761277d61336a565b60200101906001600160f81b031916908160001a90535060006127a1846002613321565b6127ac9060016133fa565b90505b6001811115612824576f181899199a1a9b1b9c1cb0b131b232b360811b85600f16601081106127e0576127e061336a565b1a60f81b8282815181106127f6576127f661336a565b60200101906001600160f81b031916908160001a90535060049490941c9361281d816136ae565b90506127af565b5083156128735760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e7460448201526064016108f6565b9392505050565b61288483836128ad565b61289160008484846124e4565b6109975760405162461bcd60e51b81526004016108f690613579565b6001600160a01b0382166129035760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f206164647265737360448201526064016108f6565b600081815260cb60205260409020546001600160a01b0316156129685760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e7465640000000060448201526064016108f6565b6129766000838360016122c8565b600081815260cb60205260409020546001600160a01b0316156129db5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e7465640000000060448201526064016108f6565b6001600160a01b038216600081815260cc602090815260408083208054600101905584835260cb90915280822080546001600160a01b0319168417905551839291907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b828054612a5290613283565b90600052602060002090601f016020900481019282612a745760008555612aba565b82601f10612a8d57805160ff1916838001178555612aba565b82800160010185558215612aba579182015b82811115612aba578251825591602001919060010190612a9f565b50612ac6929150612aca565b5090565b5b80821115612ac65760008155600101612acb565b6001600160e01b0319811681146118a457600080fd5b600060208284031215612b0757600080fd5b813561287381612adf565b60005b83811015612b2d578181015183820152602001612b15565b838111156115fa5750506000910152565b60008151808452612b56816020860160208601612b12565b601f01601f19169290920160200192915050565b6020815260006128736020830184612b3e565b600060208284031215612b8f57600080fd5b5035919050565b80356001600160a01b0381168114612bad57600080fd5b919050565b60008060408385031215612bc557600080fd5b612bce83612b96565b946020939093013593505050565b600080600060608486031215612bf157600080fd5b612bfa84612b96565b9250612c0860208501612b96565b9150604084013590509250925092565b60008060408385031215612c2b57600080fd5b50508035926020909101359150565b60008060408385031215612c4d57600080fd5b82359150612c5d60208401612b96565b90509250929050565b60008060208385031215612c7957600080fd5b82356001600160401b0380821115612c9057600080fd5b818501915085601f830112612ca457600080fd5b813581811115612cb357600080fd5b8660208260051b8501011115612cc857600080fd5b60209290920196919550909350505050565b602080825282518282018190526000919060409081850190868401855b82811015612d3e5781518051855286810151151587860152858101516001600160a01b03168686015260609081015115159085015260809093019290850190600101612cf7565b5091979650505050505050565b634e487b7160e01b600052604160045260246000fd5b604080519081016001600160401b0381118282101715612d8357612d83612d4b565b60405290565b604051601f8201601f191681016001600160401b0381118282101715612db157612db1612d4b565b604052919050565b60006001600160401b03831115612dd257612dd2612d4b565b612de5601f8401601f1916602001612d89565b9050828152838383011115612df957600080fd5b828260208301376000602084830101529392505050565b600082601f830112612e2157600080fd5b61287383833560208501612db9565b600082601f830112612e4157600080fd5b813560206001600160401b03821115612e5c57612e5c612d4b565b612e6a818360051b01612d89565b82815260069290921b84018101918181019086841115612e8957600080fd5b8286015b84811015612ee05760408189031215612ea65760008081fd5b612eae612d61565b612eb782612b96565b81528482013561ffff81168114612ece5760008081fd5b81860152835291830191604001612e8d565b509695505050505050565b60008083601f840112612efd57600080fd5b5081356001600160401b03811115612f1457600080fd5b6020830191508360208260061b8501011115610b0357600080fd5b80358015158114612bad57600080fd5b600060408284031215612f5157600080fd5b612f59612d61565b905081356001600160401b03811115612f7157600080fd5b612f7d84828501612e10565b825250612f8c60208301612f2f565b602082015292915050565b80356001600160601b0381168114612bad57600080fd5b6000806000806000806000806000806000806101608d8f031215612fd157600080fd5b6001600160401b038d351115612fe657600080fd5b612ff38e8e358f01612e10565b9b506001600160401b0360208e0135111561300d57600080fd5b61301d8e60208f01358f01612e10565b9a5061302b60408e01612b96565b99506001600160401b0360608e0135111561304557600080fd5b6130558e60608f01358f01612e30565b98506001600160401b0360808e0135111561306f57600080fd5b61307f8e60808f01358f01612eeb565b909850965060a08d013595506001600160401b0360c08e013511156130a357600080fd5b6130b38e60c08f01358f01612f3f565b945060e08d013593506130c96101008e01612b96565b92506130d86101208e01612f97565b91506130e76101408e01612f2f565b90509295989b509295989b509295989b565b60006020828403121561310b57600080fd5b61287382612b96565b6000806020838503121561312757600080fd5b82356001600160401b0381111561313d57600080fd5b61314985828601612eeb565b90969095509350505050565b6000806040838503121561316857600080fd5b82356001600160401b0381111561317e57600080fd5b61318a85828601612e10565b925050612c5d60208401612f2f565b600080604083850312156131ac57600080fd5b6131b583612b96565b9150612c5d60208401612f2f565b600080600080608085870312156131d957600080fd5b6131e285612b96565b93506131f060208601612b96565b92506040850135915060608501356001600160401b0381111561321257600080fd5b8501601f8101871361322357600080fd5b61323287823560208401612db9565b91505092959194509250565b60006020828403121561325057600080fd5b61287382612f2f565b6000806040838503121561326c57600080fd5b61327583612b96565b9150612c5d60208401612b96565b600181811c9082168061329757607f821691505b602082108114156132b857634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252602d908201527f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560408201526c1c881bdc88185c1c1c9bdd9959609a1b606082015260800190565b634e487b7160e01b600052601160045260246000fd5b600081600019048311821515161561333b5761333b61330b565b500290565b634e487b7160e01b600052601260045260246000fd5b60008261336557613365613340565b500490565b634e487b7160e01b600052603260045260246000fd5b600061ffff808316818114156133985761339861330b565b6001019392505050565b600061ffff8083168185168083038211156133bf576133bf61330b565b01949350505050565b60006000198214156133dc576133dc61330b565b5060010190565b6000828210156133f5576133f561330b565b500390565b6000821982111561340d5761340d61330b565b500190565b60008151613424818560208601612b12565b9290920192915050565b600080845481600182811c91508083168061344a57607f831692505b602080841082141561346a57634e487b7160e01b86526022600452602486fd5b81801561347e576001811461348f576134bc565b60ff198616895284890196506134bc565b60008b81526020902060005b868110156134b45781548b82015290850190830161349b565b505084890196505b5050505050506134e06134cf8286613412565b64173539b7b760d91b815260050190565b95945050505050565b60208082526025908201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060408201526437bbb732b960d91b606082015260800190565b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6000826135da576135da613340565b500690565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000815260008351613617816017850160208801612b12565b7001034b99036b4b9b9b4b733903937b6329607d1b6017918401918201528351613648816028840160208801612b12565b01602801949350505050565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061368790830184612b3e565b9695505050505050565b6000602082840312156136a357600080fd5b815161287381612adf565b6000816136bd576136bd61330b565b50600019019056fe53636f7270696f7352657665616c61626c654e6674436f6c6c656374696f6e207632a264697066735822122091c65f43ba720967cf12af66bd8ba59e80a233e90e2825fadc94a71d0609c4a664736f6c63430008090033
Deployed Bytecode Sourcemap
76546:8536:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;83646:315;;;;;;;;;;-1:-1:-1;83646:315:0;;;;;:::i;:::-;;:::i;:::-;;;565:14:1;;558:22;540:41;;528:2;513:18;83646:315:0;;;;;;;;59066:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;60589:171::-;;;;;;;;;;-1:-1:-1;60589:171:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;1714:32:1;;;1696:51;;1684:2;1669:18;60589:171:0;1550:203:1;60096:427:0;;;;;;;;;;-1:-1:-1;60096:427:0;;;;;:::i;:::-;;:::i;:::-;;76761:22;;;;;;;;;;;;;:::i;76679:38::-;;;;;;;;;;;;;;;;;;;2341:25:1;;;2329:2;2314:18;76679:38:0;2195:177:1;79782:91:0;;;;;;;;;;-1:-1:-1;79853:12:0;;79782:91;;61289:335;;;;;;;;;;-1:-1:-1;61289:335:0;;;;;:::i;:::-;;:::i;40679:131::-;;;;;;;;;;-1:-1:-1;40679:131:0;;;;;:::i;:::-;40753:7;40780:12;;;:6;:12;;;;;:22;;;;40679:131;47295:442;;;;;;;;;;-1:-1:-1;47295:442:0;;;;;:::i;:::-;;:::i;:::-;;;;-1:-1:-1;;;;;3522:32:1;;;3504:51;;3586:2;3571:18;;3564:34;;;;3477:18;47295:442:0;3330:274:1;41120:147:0;;;;;;;;;;-1:-1:-1;41120:147:0;;;;;:::i;:::-;;:::i;42264:218::-;;;;;;;;;;-1:-1:-1;42264:218:0;;;;;:::i;:::-;;:::i;61695:185::-;;;;;;;;;;-1:-1:-1;61695:185:0;;;;;:::i;:::-;;:::i;76965:105::-;;;;;;;;;;;;;:::i;76894:62::-;;;;;;;;;;-1:-1:-1;76894:62:0;;;;;:::i;:::-;;;;;;;;;;;;-1:-1:-1;;;;;76894:62:0;;;58776:223;;;;;;;;;;-1:-1:-1;58776:223:0;;;;;:::i;:::-;;:::i;80899:520::-;;;;;;;;;;-1:-1:-1;80899:520:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;77141:1387::-;;;;;;;;;;-1:-1:-1;77141:1387:0;;;;;:::i;:::-;;:::i;58507:207::-;;;;;;;;;;-1:-1:-1;58507:207:0;;;;;:::i;:::-;;:::i;80170:721::-;;;;;;;;;;-1:-1:-1;80170:721:0;;;;;:::i;:::-;;:::i;79608:166::-;;;;;;;;;;-1:-1:-1;79608:166:0;;;;;:::i;:::-;;:::i;78965:205::-;;;;;;;;;;-1:-1:-1;78965:205:0;;;;;:::i;:::-;;:::i;39130:147::-;;;;;;;;;;-1:-1:-1;39130:147:0;;;;;:::i;:::-;;:::i;59235:104::-;;;;;;;;;;;;;:::i;79178:167::-;;;;;;;;;;-1:-1:-1;79178:167:0;;;;;:::i;:::-;;:::i;82778:169::-;;;;;;;;;;-1:-1:-1;82778:169:0;;;;;:::i;:::-;;:::i;38224:49::-;;;;;;;;;;-1:-1:-1;38224:49:0;38269:4;38224:49;;60832:155;;;;;;;;;;-1:-1:-1;60832:155:0;;;;;:::i;:::-;;:::i;80019:143::-;;;;;;;;;;;;;:::i;61951:322::-;;;;;;;;;;-1:-1:-1;61951:322:0;;;;;:::i;:::-;;:::i;78536:247::-;;;;;;;;;;-1:-1:-1;78536:247:0;;;;;:::i;:::-;;:::i;81584:198::-;;;;;;:::i;:::-;;:::i;76830:21::-;;;;;;;;;;;;;;;;78791:166;;;;;;;;;;-1:-1:-1;78791:166:0;;;;;:::i;:::-;;:::i;76648:22::-;;;;;;;;;;-1:-1:-1;76648:22:0;;;;;:::i;:::-;;:::i;:::-;;;;-1:-1:-1;;;;;13360:32:1;;;13342:51;;13441:6;13429:19;;;13424:2;13409:18;;13402:47;13315:18;76648:22:0;13170:285:1;41560:149:0;;;;;;;;;;-1:-1:-1;41560:149:0;;;;;:::i;:::-;;:::i;79881:130::-;;;;;;;;;;;;;:::i;61058:164::-;;;;;;;;;;-1:-1:-1;61058:164:0;;;;;:::i;:::-;-1:-1:-1;;;;;61179:25:0;;;61155:4;61179:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;61058:164;76790:31;;;;;;;;;;-1:-1:-1;76790:31:0;;;;;;;;76860:25;;;;;;;;;;-1:-1:-1;76860:25:0;;;;;;;;83646:315;83800:4;83824:56;83867:12;83824:42;:56::i;:::-;:129;;;;83897:56;83940:12;83897:42;:56::i;:::-;83817:136;83646:315;-1:-1:-1;;83646:315:0:o;59066:100::-;59120:13;59153:5;59146:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;59066:100;:::o;60589:171::-;60665:7;60685:23;60700:7;60685:14;:23::i;:::-;-1:-1:-1;60728:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;60728:24:0;;60589:171::o;60096:427::-;60177:13;60193:34;60219:7;60193:25;:34::i;:::-;60177:50;;60252:5;-1:-1:-1;;;;;60246:11:0;:2;-1:-1:-1;;;;;60246:11:0;;;60238:57;;;;-1:-1:-1;;;60238:57:0;;14312:2:1;60238:57:0;;;14294:21:1;14351:2;14331:18;;;14324:30;14390:34;14370:18;;;14363:62;-1:-1:-1;;;14441:18:1;;;14434:31;14482:19;;60238:57:0;;;;;;;;;18729:10;-1:-1:-1;;;;;60330:21:0;;;;:62;;-1:-1:-1;60355:37:0;60372:5;18729:10;61058:164;:::i;60355:37::-;60308:173;;;;-1:-1:-1;;;60308:173:0;;14714:2:1;60308:173:0;;;14696:21:1;14753:2;14733:18;;;14726:30;14792:34;14772:18;;;14765:62;14863:31;14843:18;;;14836:59;14912:19;;60308:173:0;14512:425:1;60308:173:0;60494:21;60503:2;60507:7;60494:8;:21::i;:::-;60166:357;60096:427;;:::o;76761:22::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;61289:335::-;61484:41;18729:10;61517:7;61484:18;:41::i;:::-;61476:99;;;;-1:-1:-1;;;61476:99:0;;;;;;;:::i;:::-;61588:28;61598:4;61604:2;61608:7;61588:9;:28::i;47295:442::-;47392:7;47450:27;;;:17;:27;;;;;;;;47421:56;;;;;;;;;-1:-1:-1;;;;;47421:56:0;;;;;-1:-1:-1;;;47421:56:0;;;-1:-1:-1;;;;;47421:56:0;;;;;;;;47392:7;;47490:92;;-1:-1:-1;47541:29:0;;;;;;;;;47551:19;47541:29;-1:-1:-1;;;;;47541:29:0;;;;-1:-1:-1;;;47541:29:0;;-1:-1:-1;;;;;47541:29:0;;;;;47490:92;47632:23;;;;47594:21;;48103:5;;47619:36;;-1:-1:-1;;;;;47619:36:0;:10;:36;:::i;:::-;47618:58;;;;:::i;:::-;47697:16;;;-1:-1:-1;47594:82:0;;-1:-1:-1;;47295:442:0;;;;;;:::o;41120:147::-;40753:7;40780:12;;;:6;:12;;;;;:22;;;38715:16;38726:4;38715:10;:16::i;:::-;41234:25:::1;41245:4;41251:7;41234:10;:25::i;42264:218::-:0;-1:-1:-1;;;;;42360:23:0;;18729:10;42360:23;42352:83;;;;-1:-1:-1;;;42352:83:0;;16120:2:1;42352:83:0;;;16102:21:1;16159:2;16139:18;;;16132:30;16198:34;16178:18;;;16171:62;-1:-1:-1;;;16249:18:1;;;16242:45;16304:19;;42352:83:0;15918:411:1;42352:83:0;42448:26;42460:4;42466:7;42448:11;:26::i;:::-;42264:218;;:::o;61695:185::-;61833:39;61850:4;61856:2;61860:7;61833:39;;;;;;;;;;;;:16;:39::i;76965:105::-;77007:13;77024:43;;;;;;;;;;;;;;;;;;;76965:105;:::o;58776:223::-;58848:7;63674:16;;;:7;:16;;;;;;-1:-1:-1;;;;;63674:16:0;;58912:56;;;;-1:-1:-1;;;58912:56:0;;16536:2:1;58912:56:0;;;16518:21:1;16575:2;16555:18;;;16548:30;-1:-1:-1;;;16594:18:1;;;16587:54;16658:18;;58912:56:0;16334:348:1;80899:520:0;80979:18;81010:25;81054:9;-1:-1:-1;;;;;81038:33:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;81038:33:0;;-1:-1:-1;;81038:33:0;;;;;;;;;;;;81010:61;;81089:8;81084:302;81103:20;;;;-1:-1:-1;81084:302:0;;;81165:9;;81175:1;81165:12;;;;;;;;;:::i;:::-;;;;;;;81145:6;81152:1;81145:9;;;;;;;;;;:::i;:::-;;;;;;;;;;;:32;81219:29;81235:9;;:12;;;;;;;;;;:::i;:::-;;;;;;;81219:15;:29::i;:::-;81192:6;81199:1;81192:9;;;;;;;;;;:::i;:::-;;;;;;;;;;;;:56;;;:24;;:56;81288:15;-1:-1:-1;81304:9:0;;:12;;;;;;;;;;:::i;:::-;;;;;;;81288:29;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;81288:29:0;81263:6;81270:1;81263:9;;;;;;;;;;:::i;:::-;;;;;;;:22;;:54;-1:-1:-1;;;;;81263:54:0;;;-1:-1:-1;;;;;81263:54:0;;;;;81353:21;81361:9;;81371:1;81361:12;;;;;;;;;:::i;:::-;;;;;;;64076:4;63674:16;;;:7;:16;;;;;;-1:-1:-1;;;;;63674:16:0;64100:31;;;64011:128;81353:21;81332:6;81339:1;81332:9;;;;;;;;;;:::i;:::-;;;;;;;;;;;:42;;;:18;;;;:42;81125:3;;;:::i;:::-;;;81084:302;;;-1:-1:-1;81405:6:0;80899:520;-1:-1:-1;;;80899:520:0:o;77141:1387::-;14491:19;14514:13;;;;;;14513:14;;14561:34;;;;-1:-1:-1;14579:12:0;;14594:1;14579:12;;;;:16;14561:34;14560:108;;;-1:-1:-1;14640:4:0;4344:19;:23;;;14601:66;;-1:-1:-1;14650:12:0;;;;;:17;14601:66;14538:204;;;;-1:-1:-1;;;14538:204:0;;17223:2:1;14538:204:0;;;17205:21:1;17262:2;17242:18;;;17235:30;17301:34;17281:18;;;17274:62;-1:-1:-1;;;17352:18:1;;;17345:44;17406:19;;14538:204:0;17021:410:1;14538:204:0;14753:12;:16;;-1:-1:-1;;14753:16:0;14768:1;14753:16;;;14780:67;;;;14815:13;:20;;-1:-1:-1;;14815:20:0;;;;;14780:67;77588:29:::1;77602:5;77609:7;77588:13;:29::i;:::-;77630:38;38269:4;77661:6:::0;77630:10:::1;:38::i;:::-;77681:18;::::0;77710:280:::1;77734:7;:14;77730:1;:18;77710:280;;;77807:1;-1:-1:-1::0;;;;;77778:31:0::1;:7;77786:1;77778:10;;;;;;;;:::i;:::-;;;;;;;:17;;;-1:-1:-1::0;;;;;77778:31:0::1;;;77770:68;;;::::0;-1:-1:-1;;;77770:68:0;;17638:2:1;77770:68:0::1;::::0;::::1;17620:21:1::0;17677:2;17657:18;;;17650:30;17716:26;17696:18;;;17689:54;17760:18;;77770:68:0::1;17436:348:1::0;77770:68:0::1;77861:7;77869:1;77861:10;;;;;;;;:::i;:::-;;;;;;;:14;;;:19;;77879:1;77861:19;;77853:42;;;::::0;-1:-1:-1;;;77853:42:0;;17991:2:1;77853:42:0::1;::::0;::::1;17973:21:1::0;18030:2;18010:18;;;18003:30;-1:-1:-1;;;18049:18:1;;;18042:40;18099:18;;77853:42:0::1;17789:334:1::0;77853:42:0::1;77910:7;77923;77931:1;77923:10;;;;;;;;:::i;:::-;;::::0;;::::1;::::0;;;;;;;77910:24;;::::1;::::0;::::1;::::0;;-1:-1:-1;77910:24:0;;;;;;;;;;::::1;::::0;;;;;::::1;::::0;::::1;;-1:-1:-1::0;;;77910:24:0::1;-1:-1:-1::0;;;;;;77910:24:0;;;-1:-1:-1;;;;;77910:24:0;;::::1;::::0;;;;;;;::::1;::::0;;77964:10;;:7;;77972:1;;77964:10;::::1;;;;;:::i;:::-;;;;;;;:14;;;77949:29;;;;;:::i;:::-;::::0;-1:-1:-1;77750:3:0;::::1;::::0;::::1;:::i;:::-;;;;77710:280;;;;78008:11;:21;;78023:6;78008:21;78000:54;;;::::0;-1:-1:-1;;;78000:54:0;;18699:2:1;78000:54:0::1;::::0;::::1;18681:21:1::0;18738:2;18718:18;;;18711:30;-1:-1:-1;;;18757:18:1;;;18750:50;18817:18;;78000:54:0::1;18497:344:1::0;78000:54:0::1;78075:28:::0;78067:71:::1;;;::::0;-1:-1:-1;;;78067:71:0;;19048:2:1;78067:71:0::1;::::0;::::1;19030:21:1::0;19087:2;19067:18;;;19060:30;19126:32;19106:18;;;19099:60;19176:18;;78067:71:0::1;18846:354:1::0;78067:71:0::1;78149:23;:49:::0;;;78211:38:::1;78233:15:::0;;78211:21:::1;:38::i;:::-;78262:74;78274:16;:24;;;78300:16;:35;;;78262:11;:74::i;:::-;78357:11:::0;78349:34:::1;;;::::0;-1:-1:-1;;;78349:34:0;;19407:2:1;78349:34:0::1;::::0;::::1;19389:21:1::0;19446:2;19426:18;;;19419:30;-1:-1:-1;;;19465:18:1;;;19458:40;19515:18;;78349:34:0::1;19205:334:1::0;78349:34:0::1;78394:6;:15:::0;;;78422:56:::1;78441:16:::0;78459:18;78422::::1;:56::i;:::-;-1:-1:-1::0;78491:13:0::1;:29:::0;;-1:-1:-1;;78491:29:0::1;::::0;::::1;;;::::0;;14869:102;;;;14920:5;14904:21;;-1:-1:-1;;14904:21:0;;;14945:14;;-1:-1:-1;19696:36:1;;14945:14:0;;19684:2:1;19669:18;14945:14:0;;;;;;;14869:102;14480:498;77141:1387;;;;;;;;;;;;:::o;58507:207::-;58579:7;-1:-1:-1;;;;;58607:19:0;;58599:73;;;;-1:-1:-1;;;58599:73:0;;19945:2:1;58599:73:0;;;19927:21:1;19984:2;19964:18;;;19957:30;20023:34;20003:18;;;19996:62;-1:-1:-1;;;20074:18:1;;;20067:39;20123:19;;58599:73:0;19743:405:1;58599:73:0;-1:-1:-1;;;;;;58690:16:0;;;;;:9;:16;;;;;;;58507:207::o;80170:721::-;80260:18;80308:12;80295:10;:25;80291:56;;;80329:18;;;80345:1;80329:18;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;80329:18:0;;-1:-1:-1;;80329:18:0;;;;;;;;;;;;80322:25;;;;80291:56;80360:25;80404;80417:12;80404:10;:25;:::i;:::-;:29;;80432:1;80404:29;:::i;:::-;-1:-1:-1;;;;;80388:46:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;80388:46:0;;-1:-1:-1;;80388:46:0;;;;;;;;;;;-1:-1:-1;80360:74:0;-1:-1:-1;80470:12:0;80447:411;80494:14;:10;80507:1;80494:14;:::i;:::-;80484:7;:24;80447:411;;;80536:19;80558:22;80568:12;80558:7;:22;:::i;:::-;80536:44;;80627:7;80597:6;80604:11;80597:19;;;;;;;;:::i;:::-;;;;;;;;;;;:37;80686:24;80702:7;80686:15;:24::i;:::-;80649:6;80656:11;80649:19;;;;;;;;:::i;:::-;;;;;;;;;;;;:61;;;:34;;;:61;;;;-1:-1:-1;80760:24:0;;;:15;:24;;;;;;;80725:19;;-1:-1:-1;;;;;80760:24:0;;;;80725:6;;80732:11;;80725:19;;;;;;:::i;:::-;;;;;;;;;;;;-1:-1:-1;;;;;80725:59:0;;;:32;;;;:59;64076:4;63674:16;;;:7;:16;;;;;;;64100:31;;80799:6;80806:11;80799:19;;;;;;;;:::i;:::-;;;;;;;;;;;:47;;;:28;;;;:47;-1:-1:-1;80510:9:0;;;:::i;:::-;;;80447:411;;79608:166;38269:4;38715:16;38269:4;38715:10;:16::i;:::-;79750::::1;79723:23;;:43;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;;;79608:166:0:o;78965:205::-;38269:4;38715:16;38269:4;38715:10;:16::i;:::-;79056:11;79048:34:::1;;;::::0;-1:-1:-1;;;79048:34:0;;19407:2:1;79048:34:0::1;::::0;::::1;19389:21:1::0;19446:2;19426:18;;;19419:30;-1:-1:-1;;;19465:18:1;;;19458:40;19515:18;;79048:34:0::1;19205:334:1::0;79048:34:0::1;79111:6;79101;;:16;;79093:41;;;::::0;-1:-1:-1;;;79093:41:0;;20618:2:1;79093:41:0::1;::::0;::::1;20600:21:1::0;20657:2;20637:18;;;20630:30;-1:-1:-1;;;20676:18:1;;;20669:42;20728:18;;79093:41:0::1;20416:336:1::0;79093:41:0::1;-1:-1:-1::0;79147:6:0::1;:15:::0;78965:205::o;39130:147::-;39216:4;39240:12;;;:6;:12;;;;;;;;-1:-1:-1;;;;;39240:29:0;;;;;;;;;;;;;;;39130:147::o;59235:104::-;59291:13;59324:7;59317:14;;;;;:::i;79178:167::-;38269:4;38715:16;38269:4;38715:10;:16::i;:::-;79299:38:::1;79321:15;;79299:21;:38::i;82778:169::-:0;38269:4;38715:16;38269:4;38715:10;:16::i;:::-;82897:42:::1;82909:8;82919:19;82897:11;:42::i;60832:155::-:0;60927:52;18729:10;60960:8;60970;60927:18;:52::i;80019:143::-;80071:18;80109:45;80127:1;80130:23;;80109:17;:45::i;:::-;80102:52;;80019:143;:::o;61951:322::-;62125:41;18729:10;62158:7;62125:18;:41::i;:::-;62117:99;;;;-1:-1:-1;;;62117:99:0;;;;;;;:::i;:::-;62227:38;62241:4;62247:2;62251:7;62260:4;62227:13;:38::i;:::-;61951:322;;;;:::o;78536:247::-;78610:13;78636:24;78651:8;78636:14;:24::i;:::-;78678:19;;;;:97;;78767:8;78678:97;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;78724:8;78734:19;78744:8;78734:9;:19::i;:::-;78707:56;;;;;;;;;:::i;:::-;;;;;;;;;;;;;78671:104;78536:247;-1:-1:-1;;78536:247:0:o;81584:198::-;81664:13;;;;81656:37;;;;-1:-1:-1;;;81656:37:0;;22699:2:1;81656:37:0;;;22681:21:1;22738:2;22718:18;;;22711:30;-1:-1:-1;;;22757:18:1;;;22750:41;22808:18;;81656:37:0;22497:335:1;81656:37:0;81706:24;:22;:24::i;:::-;81741:33;81760:3;81765:8;81741:18;:33::i;78791:166::-;38269:4;38715:16;38269:4;38715:10;:16::i;:::-;78880:13:::1;::::0;::::1;;:20;;::::0;::::1;;;;78872:45;;;::::0;-1:-1:-1;;;78872:45:0;;20618:2:1;78872:45:0::1;::::0;::::1;20600:21:1::0;20657:2;20637:18;;;20630:30;-1:-1:-1;;;20676:18:1;;;20669:42;20728:18;;78872:45:0::1;20416:336:1::0;78872:45:0::1;-1:-1:-1::0;78930:13:0::1;:19:::0;;-1:-1:-1;;78930:19:0::1;::::0;::::1;;::::0;;;::::1;::::0;;78791:166::o;76648:22::-;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;76648:22:0;;;-1:-1:-1;;;;76648:22:0;;;;;:::o;41560:149::-;40753:7;40780:12;;;:6;:12;;;;;:22;;;38715:16;38726:4;38715:10;:16::i;:::-;41675:26:::1;41687:4;41693:7;41675:11;:26::i;79881:130::-:0;79938:7;79991:12;;79965:23;;:38;;;;:::i;38823:215::-;38908:4;-1:-1:-1;;;;;;38932:58:0;;-1:-1:-1;;;38932:58:0;;:98;;-1:-1:-1;;;;;;;;;;20908:51:0;;;38994:36;20799:168;75451:192;75575:4;75599:36;75623:11;75599:23;:36::i;70474:135::-;64076:4;63674:16;;;:7;:16;;;;;;-1:-1:-1;;;;;63674:16:0;70548:53;;;;-1:-1:-1;;;70548:53:0;;16536:2:1;70548:53:0;;;16518:21:1;16575:2;16555:18;;;16548:30;-1:-1:-1;;;16594:18:1;;;16587:54;16658:18;;70548:53:0;16334:348:1;70548:53:0;70474:135;:::o;69742:185::-;69817:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;69817:29:0;-1:-1:-1;;;;;69817:29:0;;;;;;;;:24;;69871:34;69817:24;69871:25;:34::i;:::-;-1:-1:-1;;;;;69862:57:0;;;;;;;;;;;69742:185;;:::o;64306:275::-;64399:4;64416:13;64432:34;64458:7;64432:25;:34::i;:::-;64416:50;;64496:5;-1:-1:-1;;;;;64485:16:0;:7;-1:-1:-1;;;;;64485:16:0;;:52;;;-1:-1:-1;;;;;;61179:25:0;;;61155:4;61179:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;64505:32;64485:87;;;;64565:7;-1:-1:-1;;;;;64541:31:0;:20;64553:7;64541:11;:20::i;:::-;-1:-1:-1;;;;;64541:31:0;;64485:87;64477:96;64306:275;-1:-1:-1;;;;64306:275:0:o;68338:1285::-;68508:4;-1:-1:-1;;;;;68470:42:0;:34;68496:7;68470:25;:34::i;:::-;-1:-1:-1;;;;;68470:42:0;;68462:92;;;;-1:-1:-1;;;68462:92:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;68573:16:0;;68565:65;;;;-1:-1:-1;;;68565:65:0;;23445:2:1;68565:65:0;;;23427:21:1;23484:2;23464:18;;;23457:30;23523:34;23503:18;;;23496:62;-1:-1:-1;;;23574:18:1;;;23567:34;23618:19;;68565:65:0;23243:400:1;68565:65:0;68643:42;68664:4;68670:2;68674:7;68683:1;68643:20;:42::i;:::-;68826:4;-1:-1:-1;;;;;68788:42:0;:34;68814:7;68788:25;:34::i;:::-;-1:-1:-1;;;;;68788:42:0;;68780:92;;;;-1:-1:-1;;;68780:92:0;;;;;;;:::i;:::-;68944:24;;;;:15;:24;;;;;;;;68937:31;;-1:-1:-1;;;;;;68937:31:0;;;;;;-1:-1:-1;;;;;69420:15:0;;;;;;:9;:15;;;;;:20;;-1:-1:-1;;69420:20:0;;;69455:13;;;;;;;;;:18;;68937:31;69455:18;;;69495:16;;;:7;:16;;;;;;:21;;;;;;;;;;69534:27;;68960:7;;69534:27;;;60166:357;60096:427;;:::o;39581:105::-;39648:30;39659:4;18729:10;39648;:30::i;83199:213::-;-1:-1:-1;;;;;83297:22:0;;83289:71;;;;-1:-1:-1;;;83289:71:0;;23850:2:1;83289:71:0;;;23832:21:1;23889:2;23869:18;;;23862:30;23928:34;23908:18;;;23901:62;-1:-1:-1;;;23979:18:1;;;23972:34;24023:19;;83289:71:0;23648:400:1;83289:71:0;83371:33;83388:5;83395:8;83371:16;:33::i;83420:218::-;-1:-1:-1;;;;;83519:22:0;;83511:74;;;;-1:-1:-1;;;83511:74:0;;24255:2:1;83511:74:0;;;24237:21:1;24294:2;24274:18;;;24267:30;24333:34;24313:18;;;24306:62;-1:-1:-1;;;24384:18:1;;;24377:37;24431:19;;83511:74:0;24053:403:1;83511:74:0;83596:34;83614:5;83621:8;83596:17;:34::i;81427:149::-;81492:4;81516:13;;;;;:52;;-1:-1:-1;;81545:23:0;;-1:-1:-1;81533:35:0;;81427:149::o;57700:151::-;16634:13;;;;;;;16626:69;;;;-1:-1:-1;;;16626:69:0;;;;;;;:::i;:::-;57804:39:::1;57828:5;57835:7;57804:23;:39::i;79353:247::-:0;79450:8;79445:148;79464:26;;;;-1:-1:-1;79445:148:0;;;79558:15;;79574:1;79558:18;;;;;;;;;:::i;:::-;;;;;;:23;;;;;;;;;;:::i;:::-;79512:15;:43;79528:15;;79544:1;79528:18;;;;;;;;;:::i;:::-;;;;;;:26;;;79512:43;;;;;;;;;;;;:69;;;;;-1:-1:-1;;;;;79512:69:0;;;;;-1:-1:-1;;;;;79512:69:0;;;;;;79492:3;;;;:::i;:::-;;;79445:148;;82955:236;83053:22;;83045:54;;;;-1:-1:-1;;;83045:54:0;;25075:2:1;83045:54:0;;;25057:21:1;25114:2;25094:18;;;25087:30;-1:-1:-1;;;25133:18:1;;;25126:44;25187:18;;83045:54:0;24873:338:1;83045:54:0;83112:19;;;;:8;;:19;;;;;:::i;:::-;-1:-1:-1;83142:19:0;:41;;-1:-1:-1;;83142:41:0;;;;;;;;;;-1:-1:-1;82955:236:0:o;48387:332::-;48103:5;-1:-1:-1;;;;;48490:33:0;;;;48482:88;;;;-1:-1:-1;;;48482:88:0;;25418:2:1;48482:88:0;;;25400:21:1;25457:2;25437:18;;;25430:30;25496:34;25476:18;;;25469:62;-1:-1:-1;;;25547:18:1;;;25540:40;25597:19;;48482:88:0;25216:406:1;48482:88:0;-1:-1:-1;;;;;48589:22:0;;48581:60;;;;-1:-1:-1;;;48581:60:0;;25829:2:1;48581:60:0;;;25811:21:1;25868:2;25848:18;;;25841:30;25907:27;25887:18;;;25880:55;25952:18;;48581:60:0;25627:349:1;48581:60:0;48676:35;;;;;;;;;-1:-1:-1;;;;;48676:35:0;;;;;;-1:-1:-1;;;;;48676:35:0;;;;;;;;;;-1:-1:-1;;;48654:57:0;;;;:19;:57;48387:332::o;70070:315::-;70225:8;-1:-1:-1;;;;;70216:17:0;:5;-1:-1:-1;;;;;70216:17:0;;;70208:55;;;;-1:-1:-1;;;70208:55:0;;26183:2:1;70208:55:0;;;26165:21:1;26222:2;26202:18;;;26195:30;26261:27;26241:18;;;26234:55;26306:18;;70208:55:0;25981:349:1;70208:55:0;-1:-1:-1;;;;;70274:25:0;;;;;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;:46;;-1:-1:-1;;70274:46:0;;;;;;;;;;70336:41;;540::1;;;70336::0;;513:18:1;70336:41:0;;;;;;;70070:315;;;:::o;63154:313::-;63310:28;63320:4;63326:2;63330:7;63310:9;:28::i;:::-;63357:47;63380:4;63386:2;63390:7;63399:4;63357:22;:47::i;:::-;63349:110;;;;-1:-1:-1;;;63349:110:0;;;;;;;:::i;84238:538::-;84295:13;84325:11;84321:54;;-1:-1:-1;;84353:10:0;;;;;;;;;;;;-1:-1:-1;;;84353:10:0;;;;;84238:538::o;84321:54::-;84400:6;84385:12;84442:78;84449:9;;84442:78;;84475:8;;;;:::i;:::-;;-1:-1:-1;84498:10:0;;-1:-1:-1;84506:2:0;84498:10;;:::i;:::-;;;84442:78;;;84530:19;84562:6;-1:-1:-1;;;;;84552:17:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;84552:17:0;;84530:39;;84580:157;84587:11;;84580:157;;84615:11;84625:1;84615:11;;:::i;:::-;;-1:-1:-1;84684:11:0;84693:2;84684:6;:11;:::i;:::-;84671:25;;:2;:25;:::i;:::-;84658:40;;84641:6;84648;84641:14;;;;;;;;:::i;:::-;;;;:57;-1:-1:-1;;;;;84641:57:0;;;;;;;;-1:-1:-1;84713:12:0;84723:2;84713:12;;:::i;:::-;;;84580:157;;82192:578;82266:6;;82253:9;:19;82245:55;;;;-1:-1:-1;;;82245:55:0;;27073:2:1;82245:55:0;;;27055:21:1;27112:2;27092:18;;;27085:30;27151:25;27131:18;;;27124:53;27194:18;;82245:55:0;26871:347:1;82245:55:0;82336:7;:14;82313:20;;;82446:233;82469:16;82484:1;82469:12;:16;:::i;:::-;82465:1;:20;;;82446:233;;;82553:6;82536:7;82544:1;82536:10;;;;;;;;;;:::i;:::-;;;;;;;;;;:14;82524:26;;-1:-1:-1;;;82536:14:0;;;;82524:9;:26;:::i;:::-;:35;;;;:::i;:::-;82507:52;-1:-1:-1;82574:34:0;82507:52;82574:34;;:::i;:::-;;;82623:44;82633:7;82641:1;82633:10;;;;;;;;;;:::i;:::-;;;;;;;;;;:17;-1:-1:-1;;;;;82633:17:0;82652:14;82623:9;:44::i;:::-;82487:3;;;:::i;:::-;;;82446:233;;;-1:-1:-1;82689:73:0;82699:7;82707:16;82722:1;82707:12;:16;:::i;:::-;82699:25;;;;;;;;:::i;:::-;;;;;;;;;;:32;-1:-1:-1;;;;;82699:32:0;82733:28;82745:16;82733:9;:28;:::i;:::-;82689:9;:73::i;81790:394::-;81876:25;81892:8;81876:15;:25::i;:::-;81868:54;;;;-1:-1:-1;;;81868:54:0;;27425:2:1;81868:54:0;;;27407:21:1;27464:2;27444:18;;;27437:30;-1:-1:-1;;;27483:18:1;;;27476:46;27539:18;;81868:54:0;27223:340:1;81868:54:0;81935:20;81958:25;;;:15;:25;;;;;;-1:-1:-1;;;;;81958:25:0;;;;82017:19;;;;;:49;;-1:-1:-1;;;;;;82040:26:0;;;82017:49;82009:102;;;;-1:-1:-1;;;82009:102:0;;27770:2:1;82009:102:0;;;27752:21:1;27809:2;27789:18;;;27782:30;27848:34;27828:18;;;27821:62;-1:-1:-1;;;27899:18:1;;;27892:38;27947:19;;82009:102:0;27568:404:1;82009:102:0;82140:1;82124:12;;:17;;;;;;;:::i;:::-;;;;-1:-1:-1;82152:24:0;;-1:-1:-1;82162:3:0;82167:8;82152:9;:24::i;58094:349::-;58218:4;-1:-1:-1;;;;;;58255:51:0;;-1:-1:-1;;;58255:51:0;;:127;;-1:-1:-1;;;;;;;58323:59:0;;-1:-1:-1;;;58323:59:0;58255:127;:180;;;;58399:36;58423:11;58399:23;:36::i;72780:410::-;72970:1;72958:9;:13;72954:229;;;-1:-1:-1;;;;;72992:18:0;;;72988:87;;-1:-1:-1;;;;;73031:15:0;;;;;;:9;:15;;;;;:28;;73050:9;;73031:15;:28;;73050:9;;73031:28;:::i;:::-;;;;-1:-1:-1;;72988:87:0;-1:-1:-1;;;;;73093:16:0;;;73089:83;;-1:-1:-1;;;;;73130:13:0;;;;;;:9;:13;;;;;:26;;73147:9;;73130:13;:26;;73147:9;;73130:26;:::i;:::-;;;;-1:-1:-1;;72780:410:0;;;;:::o;39976:514::-;40065:22;40073:4;40079:7;40065;:22::i;:::-;40060:423;;40253:39;40284:7;40253:30;:39::i;:::-;40365:49;40404:4;40411:2;40365:30;:49::i;:::-;40158:279;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;40158:279:0;;;;;;;;;;-1:-1:-1;;;40104:367:0;;;;;;;:::i;43861:238::-;43945:22;43953:4;43959:7;43945;:22::i;:::-;43940:152;;43984:12;;;;:6;:12;;;;;;;;-1:-1:-1;;;;;43984:29:0;;;;;;;;;:36;;-1:-1:-1;;43984:36:0;44016:4;43984:36;;;44067:12;18729:10;;18649:98;44067:12;-1:-1:-1;;;;;44040:40:0;44058:7;-1:-1:-1;;;;;44040:40:0;44052:4;44040:40;;;;;;;;;;43861:238;;:::o;44279:239::-;44363:22;44371:4;44377:7;44363;:22::i;:::-;44359:152;;;44434:5;44402:12;;;:6;:12;;;;;;;;-1:-1:-1;;;;;44402:29:0;;;;;;;;;;:37;;-1:-1:-1;;44402:37:0;;;44459:40;18729:10;;44402:12;;44459:40;;44434:5;44459:40;44279:239;;:::o;57859:163::-;16634:13;;;;;;;16626:69;;;;-1:-1:-1;;;16626:69:0;;;;;;;:::i;:::-;57973:13;;::::1;::::0;:5:::1;::::0;:13:::1;::::0;::::1;::::0;::::1;:::i;:::-;-1:-1:-1::0;57997:17:0;;::::1;::::0;:7:::1;::::0;:17:::1;::::0;::::1;::::0;::::1;:::i;71173:875::-:0;71327:4;-1:-1:-1;;;;;71348:13:0;;4344:19;:23;71344:697;;71384:82;;-1:-1:-1;;;71384:82:0;;-1:-1:-1;;;;;71384:47:0;;;;;:82;;18729:10;;71446:4;;71452:7;;71461:4;;71384:82;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;71384:82:0;;;;;;;;-1:-1:-1;;71384:82:0;;;;;;;;;;;;:::i;:::-;;;71380:606;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;71647:13:0;;71643:328;;71690:60;;-1:-1:-1;;;71690:60:0;;;;;;;:::i;71643:328::-;71921:6;71915:13;71906:6;71902:2;71898:15;71891:38;71380:606;-1:-1:-1;;;;;;71517:62:0;-1:-1:-1;;;71517:62:0;;-1:-1:-1;71510:69:0;;71344:697;-1:-1:-1;72025:4:0;71173:875;;;;;;:::o;83969:164::-;84038:9;84052:3;-1:-1:-1;;;;;84052:8:0;84069:7;84052:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;84037:44;;;84100:4;84092:33;;;;-1:-1:-1;;;84092:33:0;;29939:2:1;84092:33:0;;;29921:21:1;29978:2;29958:18;;;29951:30;-1:-1:-1;;;29997:18:1;;;29990:46;30053:18;;84092:33:0;29737:340:1;64923:110:0;64999:26;65009:2;65013:7;64999:26;;;;;;;;;;;;:9;:26::i;46981:248::-;47105:4;-1:-1:-1;;;;;;47129:52:0;;-1:-1:-1;;;47129:52:0;;:92;;;47185:36;47209:11;47185:23;:36::i;36049:151::-;36107:13;36140:52;-1:-1:-1;;;;;36152:22:0;;34182:2;35445:447;35520:13;35546:19;35578:10;35582:6;35578:1;:10;:::i;:::-;:14;;35591:1;35578:14;:::i;:::-;-1:-1:-1;;;;;35568:25:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;35568:25:0;;35546:47;;-1:-1:-1;;;35604:6:0;35611:1;35604:9;;;;;;;;:::i;:::-;;;;:15;-1:-1:-1;;;;;35604:15:0;;;;;;;;;-1:-1:-1;;;35630:6:0;35637:1;35630:9;;;;;;;;:::i;:::-;;;;:15;-1:-1:-1;;;;;35630:15:0;;;;;;;;-1:-1:-1;35661:9:0;35673:10;35677:6;35673:1;:10;:::i;:::-;:14;;35686:1;35673:14;:::i;:::-;35661:26;;35656:131;35693:1;35689;:5;35656:131;;;-1:-1:-1;;;35737:5:0;35745:3;35737:11;35728:21;;;;;;;:::i;:::-;;;;35716:6;35723:1;35716:9;;;;;;;;:::i;:::-;;;;:33;-1:-1:-1;;;;;35716:33:0;;;;;;;;-1:-1:-1;35774:1:0;35764:11;;;;;35696:3;;;:::i;:::-;;;35656:131;;;-1:-1:-1;35805:10:0;;35797:55;;;;-1:-1:-1;;;35797:55:0;;30425:2:1;35797:55:0;;;30407:21:1;;;30444:18;;;30437:30;30503:34;30483:18;;;30476:62;30555:18;;35797:55:0;30223:356:1;35797:55:0;35877:6;35445:447;-1:-1:-1;;;35445:447:0:o;65260:319::-;65389:18;65395:2;65399:7;65389:5;:18::i;:::-;65440:53;65471:1;65475:2;65479:7;65488:4;65440:22;:53::i;:::-;65418:153;;;;-1:-1:-1;;;65418:153:0;;;;;;;:::i;65915:942::-;-1:-1:-1;;;;;65995:16:0;;65987:61;;;;-1:-1:-1;;;65987:61:0;;30786:2:1;65987:61:0;;;30768:21:1;;;30805:18;;;30798:30;30864:34;30844:18;;;30837:62;30916:18;;65987:61:0;30584:356:1;65987:61:0;64076:4;63674:16;;;:7;:16;;;;;;-1:-1:-1;;;;;63674:16:0;64100:31;66059:58;;;;-1:-1:-1;;;66059:58:0;;31147:2:1;66059:58:0;;;31129:21:1;31186:2;31166:18;;;31159:30;31225;31205:18;;;31198:58;31273:18;;66059:58:0;30945:352:1;66059:58:0;66130:48;66159:1;66163:2;66167:7;66176:1;66130:20;:48::i;:::-;64076:4;63674:16;;;:7;:16;;;;;;-1:-1:-1;;;;;63674:16:0;64100:31;66268:58;;;;-1:-1:-1;;;66268:58:0;;31147:2:1;66268:58:0;;;31129:21:1;31186:2;31166:18;;;31159:30;31225;31205:18;;;31198:58;31273:18;;66268:58:0;30945:352:1;66268:58:0;-1:-1:-1;;;;;66675:13:0;;;;;;:9;:13;;;;;;;;:18;;66692:1;66675:18;;;66717:16;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;66717:21:0;;;;;66756:33;66725:7;;66675:13;;66756:33;;66675:13;;66756:33;42264:218;;:::o;-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:258::-;664:1;674:113;688:6;685:1;682:13;674:113;;;764:11;;;758:18;745:11;;;738:39;710:2;703:10;674:113;;;805:6;802:1;799:13;796:48;;;-1:-1:-1;;840:1:1;822:16;;815:27;592:258::o;855:269::-;908:3;946:5;940:12;973:6;968:3;961:19;989:63;1045:6;1038:4;1033:3;1029:14;1022:4;1015:5;1011:16;989:63;:::i;:::-;1106:2;1085:15;-1:-1:-1;;1081:29:1;1072:39;;;;1113:4;1068:50;;855:269;-1:-1:-1;;855:269:1:o;1129:231::-;1278:2;1267:9;1260:21;1241:4;1298:56;1350:2;1339:9;1335:18;1327:6;1298:56;:::i;1365:180::-;1424:6;1477:2;1465:9;1456:7;1452:23;1448:32;1445:52;;;1493:1;1490;1483:12;1445:52;-1:-1:-1;1516:23:1;;1365:180;-1:-1:-1;1365:180:1:o;1758:173::-;1826:20;;-1:-1:-1;;;;;1875:31:1;;1865:42;;1855:70;;1921:1;1918;1911:12;1855:70;1758:173;;;:::o;1936:254::-;2004:6;2012;2065:2;2053:9;2044:7;2040:23;2036:32;2033:52;;;2081:1;2078;2071:12;2033:52;2104:29;2123:9;2104:29;:::i;:::-;2094:39;2180:2;2165:18;;;;2152:32;;-1:-1:-1;;;1936:254:1:o;2377:328::-;2454:6;2462;2470;2523:2;2511:9;2502:7;2498:23;2494:32;2491:52;;;2539:1;2536;2529:12;2491:52;2562:29;2581:9;2562:29;:::i;:::-;2552:39;;2610:38;2644:2;2633:9;2629:18;2610:38;:::i;:::-;2600:48;;2695:2;2684:9;2680:18;2667:32;2657:42;;2377:328;;;;;:::o;3077:248::-;3145:6;3153;3206:2;3194:9;3185:7;3181:23;3177:32;3174:52;;;3222:1;3219;3212:12;3174:52;-1:-1:-1;;3245:23:1;;;3315:2;3300:18;;;3287:32;;-1:-1:-1;3077:248:1:o;3609:254::-;3677:6;3685;3738:2;3726:9;3717:7;3713:23;3709:32;3706:52;;;3754:1;3751;3744:12;3706:52;3790:9;3777:23;3767:33;;3819:38;3853:2;3842:9;3838:18;3819:38;:::i;:::-;3809:48;;3609:254;;;;;:::o;3868:615::-;3954:6;3962;4015:2;4003:9;3994:7;3990:23;3986:32;3983:52;;;4031:1;4028;4021:12;3983:52;4071:9;4058:23;-1:-1:-1;;;;;4141:2:1;4133:6;4130:14;4127:34;;;4157:1;4154;4147:12;4127:34;4195:6;4184:9;4180:22;4170:32;;4240:7;4233:4;4229:2;4225:13;4221:27;4211:55;;4262:1;4259;4252:12;4211:55;4302:2;4289:16;4328:2;4320:6;4317:14;4314:34;;;4344:1;4341;4334:12;4314:34;4397:7;4392:2;4382:6;4379:1;4375:14;4371:2;4367:23;4363:32;4360:45;4357:65;;;4418:1;4415;4408:12;4357:65;4449:2;4441:11;;;;;4471:6;;-1:-1:-1;3868:615:1;;-1:-1:-1;;;;3868:615:1:o;4488:985::-;4713:2;4765:21;;;4835:13;;4738:18;;;4857:22;;;4684:4;;4713:2;4898;;4916:18;;;;4957:15;;;4684:4;5000:447;5014:6;5011:1;5008:13;5000:447;;;5073:13;;5111:9;;5099:22;;5175:11;;;5169:18;5162:26;5155:34;5141:12;;;5134:56;5234:11;;;5228:18;-1:-1:-1;;;;;5224:44:1;5210:12;;;5203:66;5292:4;5350:11;;;5344:18;5337:26;5330:34;5316:12;;;5309:56;5394:4;5385:14;;;;5422:15;;;;5265:1;5029:9;5000:447;;;-1:-1:-1;5464:3:1;;4488:985;-1:-1:-1;;;;;;;4488:985:1:o;5478:127::-;5539:10;5534:3;5530:20;5527:1;5520:31;5570:4;5567:1;5560:15;5594:4;5591:1;5584:15;5610:257;5682:4;5676:11;;;5714:17;;-1:-1:-1;;;;;5746:34:1;;5782:22;;;5743:62;5740:88;;;5808:18;;:::i;:::-;5844:4;5837:24;5610:257;:::o;5872:275::-;5943:2;5937:9;6008:2;5989:13;;-1:-1:-1;;5985:27:1;5973:40;;-1:-1:-1;;;;;6028:34:1;;6064:22;;;6025:62;6022:88;;;6090:18;;:::i;:::-;6126:2;6119:22;5872:275;;-1:-1:-1;5872:275:1:o;6152:407::-;6217:5;-1:-1:-1;;;;;6243:6:1;6240:30;6237:56;;;6273:18;;:::i;:::-;6311:57;6356:2;6335:15;;-1:-1:-1;;6331:29:1;6362:4;6327:40;6311:57;:::i;:::-;6302:66;;6391:6;6384:5;6377:21;6431:3;6422:6;6417:3;6413:16;6410:25;6407:45;;;6448:1;6445;6438:12;6407:45;6497:6;6492:3;6485:4;6478:5;6474:16;6461:43;6551:1;6544:4;6535:6;6528:5;6524:18;6520:29;6513:40;6152:407;;;;;:::o;6564:222::-;6607:5;6660:3;6653:4;6645:6;6641:17;6637:27;6627:55;;6678:1;6675;6668:12;6627:55;6700:80;6776:3;6767:6;6754:20;6747:4;6739:6;6735:17;6700:80;:::i;6791:1162::-;6850:5;6903:3;6896:4;6888:6;6884:17;6880:27;6870:55;;6921:1;6918;6911:12;6870:55;6957:6;6944:20;6983:4;-1:-1:-1;;;;;7002:2:1;6999:26;6996:52;;;7028:18;;:::i;:::-;7068:36;7100:2;7095;7092:1;7088:10;7084:19;7068:36;:::i;:::-;7138:15;;;7224:1;7220:10;;;;7208:23;;7204:32;;;7169:12;;;;7248:15;;;7245:35;;;7276:1;7273;7266:12;7245:35;7312:2;7304:6;7300:15;7324:600;7340:6;7335:3;7332:15;7324:600;;;7418:4;7412:3;7407;7403:13;7399:24;7396:114;;;7464:1;7493:2;7489;7482:14;7396:114;7536:22;;:::i;:::-;7585:23;7604:3;7585:23;:::i;:::-;7578:5;7571:38;7659:2;7654:3;7650:12;7637:26;7711:6;7702:7;7698:20;7689:7;7686:33;7676:131;;7761:1;7790:2;7786;7779:14;7676:131;7827:14;;;7820:31;7864:18;;7902:12;;;;7366:4;7357:14;7324:600;;;-1:-1:-1;7942:5:1;6791:1162;-1:-1:-1;;;;;;6791:1162:1:o;7958:389::-;8043:8;8053:6;8107:3;8100:4;8092:6;8088:17;8084:27;8074:55;;8125:1;8122;8115:12;8074:55;-1:-1:-1;8148:20:1;;-1:-1:-1;;;;;8180:30:1;;8177:50;;;8223:1;8220;8213:12;8177:50;8260:4;8252:6;8248:17;8236:29;;8320:3;8313:4;8303:6;8300:1;8296:14;8288:6;8284:27;8280:38;8277:47;8274:67;;;8337:1;8334;8327:12;8352:160;8417:20;;8473:13;;8466:21;8456:32;;8446:60;;8502:1;8499;8492:12;8517:421;8579:5;8627:4;8615:9;8610:3;8606:19;8602:30;8599:50;;;8645:1;8642;8635:12;8599:50;8667:22;;:::i;:::-;8658:31;;8725:9;8712:23;-1:-1:-1;;;;;8750:6:1;8747:30;8744:50;;;8790:1;8787;8780:12;8744:50;8817:46;8859:3;8850:6;8839:9;8835:22;8817:46;:::i;:::-;8810:5;8803:61;;8896:35;8927:2;8916:9;8912:18;8896:35;:::i;:::-;8891:2;8884:5;8880:14;8873:59;8517:421;;;;:::o;8943:179::-;9010:20;;-1:-1:-1;;;;;9059:38:1;;9049:49;;9039:77;;9112:1;9109;9102:12;9127:1839;9433:6;9441;9449;9457;9465;9473;9481;9489;9497;9505;9513:7;9522;9576:3;9564:9;9555:7;9551:23;9547:33;9544:53;;;9593:1;9590;9583:12;9544:53;-1:-1:-1;;;;;9625:9:1;9612:23;9609:47;9606:67;;;9669:1;9666;9659:12;9606:67;9692;9751:7;9738:9;9725:23;9714:9;9710:39;9692:67;:::i;:::-;9682:77;;-1:-1:-1;;;;;9802:2:1;9791:9;9787:18;9774:32;9771:56;9768:76;;;9840:1;9837;9830:12;9768:76;9863;9931:7;9924:2;9913:9;9909:18;9896:32;9885:9;9881:48;9863:76;:::i;:::-;9853:86;;9958:38;9992:2;9981:9;9977:18;9958:38;:::i;:::-;9948:48;;-1:-1:-1;;;;;10039:2:1;10028:9;10024:18;10011:32;10008:56;10005:76;;;10077:1;10074;10067:12;10005:76;10100:92;10184:7;10177:2;10166:9;10162:18;10149:32;10138:9;10134:48;10100:92;:::i;:::-;10090:102;;-1:-1:-1;;;;;10235:3:1;10224:9;10220:19;10207:33;10204:57;10201:77;;;10274:1;10271;10264:12;10201:77;10313:119;10424:7;10416:3;10405:9;10401:19;10388:33;10377:9;10373:49;10313:119;:::i;:::-;10451:8;;-1:-1:-1;10478:8:1;-1:-1:-1;10533:3:1;10518:19;;10505:33;;-1:-1:-1;;;;;;10581:3:1;10566:19;;10553:33;10550:57;10547:77;;;10620:1;10617;10610:12;10547:77;10643:93;10728:7;10720:3;10709:9;10705:19;10692:33;10681:9;10677:49;10643:93;:::i;:::-;10633:103;;10783:3;10772:9;10768:19;10755:33;10745:43;;10807:39;10841:3;10830:9;10826:19;10807:39;:::i;:::-;10797:49;;10866:38;10899:3;10888:9;10884:19;10866:38;:::i;:::-;10855:49;;10924:36;10955:3;10944:9;10940:19;10924:36;:::i;:::-;10913:47;;9127:1839;;;;;;;;;;;;;;:::o;10971:186::-;11030:6;11083:2;11071:9;11062:7;11058:23;11054:32;11051:52;;;11099:1;11096;11089:12;11051:52;11122:29;11141:9;11122:29;:::i;11162:492::-;11281:6;11289;11342:2;11330:9;11321:7;11317:23;11313:32;11310:52;;;11358:1;11355;11348:12;11310:52;11398:9;11385:23;-1:-1:-1;;;;;11423:6:1;11420:30;11417:50;;;11463:1;11460;11453:12;11417:50;11502:92;11586:7;11577:6;11566:9;11562:22;11502:92;:::i;:::-;11613:8;;11476:118;;-1:-1:-1;11162:492:1;-1:-1:-1;;;;11162:492:1:o;11659:390::-;11734:6;11742;11795:2;11783:9;11774:7;11770:23;11766:32;11763:52;;;11811:1;11808;11801:12;11763:52;11851:9;11838:23;-1:-1:-1;;;;;11876:6:1;11873:30;11870:50;;;11916:1;11913;11906:12;11870:50;11939;11981:7;11972:6;11961:9;11957:22;11939:50;:::i;:::-;11929:60;;;12008:35;12039:2;12028:9;12024:18;12008:35;:::i;12054:254::-;12119:6;12127;12180:2;12168:9;12159:7;12155:23;12151:32;12148:52;;;12196:1;12193;12186:12;12148:52;12219:29;12238:9;12219:29;:::i;:::-;12209:39;;12267:35;12298:2;12287:9;12283:18;12267:35;:::i;12313:667::-;12408:6;12416;12424;12432;12485:3;12473:9;12464:7;12460:23;12456:33;12453:53;;;12502:1;12499;12492:12;12453:53;12525:29;12544:9;12525:29;:::i;:::-;12515:39;;12573:38;12607:2;12596:9;12592:18;12573:38;:::i;:::-;12563:48;;12658:2;12647:9;12643:18;12630:32;12620:42;;12713:2;12702:9;12698:18;12685:32;-1:-1:-1;;;;;12732:6:1;12729:30;12726:50;;;12772:1;12769;12762:12;12726:50;12795:22;;12848:4;12840:13;;12836:27;-1:-1:-1;12826:55:1;;12877:1;12874;12867:12;12826:55;12900:74;12966:7;12961:2;12948:16;12943:2;12939;12935:11;12900:74;:::i;:::-;12890:84;;;12313:667;;;;;;;:::o;12985:180::-;13041:6;13094:2;13082:9;13073:7;13069:23;13065:32;13062:52;;;13110:1;13107;13100:12;13062:52;13133:26;13149:9;13133:26;:::i;13460:260::-;13528:6;13536;13589:2;13577:9;13568:7;13564:23;13560:32;13557:52;;;13605:1;13602;13595:12;13557:52;13628:29;13647:9;13628:29;:::i;:::-;13618:39;;13676:38;13710:2;13699:9;13695:18;13676:38;:::i;13725:380::-;13804:1;13800:12;;;;13847;;;13868:61;;13922:4;13914:6;13910:17;13900:27;;13868:61;13975:2;13967:6;13964:14;13944:18;13941:38;13938:161;;;14021:10;14016:3;14012:20;14009:1;14002:31;14056:4;14053:1;14046:15;14084:4;14081:1;14074:15;13938:161;;13725:380;;;:::o;14942:409::-;15144:2;15126:21;;;15183:2;15163:18;;;15156:30;15222:34;15217:2;15202:18;;15195:62;-1:-1:-1;;;15288:2:1;15273:18;;15266:43;15341:3;15326:19;;14942:409::o;15356:127::-;15417:10;15412:3;15408:20;15405:1;15398:31;15448:4;15445:1;15438:15;15472:4;15469:1;15462:15;15488:168;15528:7;15594:1;15590;15586:6;15582:14;15579:1;15576:21;15571:1;15564:9;15557:17;15553:45;15550:71;;;15601:18;;:::i;:::-;-1:-1:-1;15641:9:1;;15488:168::o;15661:127::-;15722:10;15717:3;15713:20;15710:1;15703:31;15753:4;15750:1;15743:15;15777:4;15774:1;15767:15;15793:120;15833:1;15859;15849:35;;15864:18;;:::i;:::-;-1:-1:-1;15898:9:1;;15793:120::o;16687:127::-;16748:10;16743:3;16739:20;16736:1;16729:31;16779:4;16776:1;16769:15;16803:4;16800:1;16793:15;16819:197;16857:3;16885:6;16926:2;16919:5;16915:14;16953:2;16944:7;16941:15;16938:41;;;16959:18;;:::i;:::-;17008:1;16995:15;;16819:197;-1:-1:-1;;;16819:197:1:o;18128:224::-;18167:3;18195:6;18228:2;18225:1;18221:10;18258:2;18255:1;18251:10;18289:3;18285:2;18281:12;18276:3;18273:21;18270:47;;;18297:18;;:::i;:::-;18333:13;;18128:224;-1:-1:-1;;;;18128:224:1:o;18357:135::-;18396:3;-1:-1:-1;;18417:17:1;;18414:43;;;18437:18;;:::i;:::-;-1:-1:-1;18484:1:1;18473:13;;18357:135::o;20153:125::-;20193:4;20221:1;20218;20215:8;20212:34;;;20226:18;;:::i;:::-;-1:-1:-1;20263:9:1;;20153:125::o;20283:128::-;20323:3;20354:1;20350:6;20347:1;20344:13;20341:39;;;20360:18;;:::i;:::-;-1:-1:-1;20396:9:1;;20283:128::o;20883:185::-;20925:3;20963:5;20957:12;20978:52;21023:6;21018:3;21011:4;21004:5;21000:16;20978:52;:::i;:::-;21046:16;;;;;20883:185;-1:-1:-1;;20883:185:1:o;21191:1301::-;21468:3;21497:1;21530:6;21524:13;21560:3;21582:1;21610:9;21606:2;21602:18;21592:28;;21670:2;21659:9;21655:18;21692;21682:61;;21736:4;21728:6;21724:17;21714:27;;21682:61;21762:2;21810;21802:6;21799:14;21779:18;21776:38;21773:165;;;-1:-1:-1;;;21837:33:1;;21893:4;21890:1;21883:15;21923:4;21844:3;21911:17;21773:165;21954:18;21981:104;;;;22099:1;22094:320;;;;21947:467;;21981:104;-1:-1:-1;;22014:24:1;;22002:37;;22059:16;;;;-1:-1:-1;21981:104:1;;22094:320;20830:1;20823:14;;;20867:4;20854:18;;22189:1;22203:165;22217:6;22214:1;22211:13;22203:165;;;22295:14;;22282:11;;;22275:35;22338:16;;;;22232:10;;22203:165;;;22207:3;;22397:6;22392:3;22388:16;22381:23;;21947:467;;;;;;;22430:56;22455:30;22481:3;22473:6;22455:30;:::i;:::-;-1:-1:-1;;;21133:20:1;;21178:1;21169:11;;21073:113;22430:56;22423:63;21191:1301;-1:-1:-1;;;;;21191:1301:1:o;22837:401::-;23039:2;23021:21;;;23078:2;23058:18;;;23051:30;23117:34;23112:2;23097:18;;23090:62;-1:-1:-1;;;23183:2:1;23168:18;;23161:35;23228:3;23213:19;;22837:401::o;24461:407::-;24663:2;24645:21;;;24702:2;24682:18;;;24675:30;24741:34;24736:2;24721:18;;24714:62;-1:-1:-1;;;24807:2:1;24792:18;;24785:41;24858:3;24843:19;;24461:407::o;26335:414::-;26537:2;26519:21;;;26576:2;26556:18;;;26549:30;26615:34;26610:2;26595:18;;26588:62;-1:-1:-1;;;26681:2:1;26666:18;;26659:48;26739:3;26724:19;;26335:414::o;26754:112::-;26786:1;26812;26802:35;;26817:18;;:::i;:::-;-1:-1:-1;26851:9:1;;26754:112::o;27977:786::-;28388:25;28383:3;28376:38;28358:3;28443:6;28437:13;28459:62;28514:6;28509:2;28504:3;28500:12;28493:4;28485:6;28481:17;28459:62;:::i;:::-;-1:-1:-1;;;28580:2:1;28540:16;;;28572:11;;;28565:40;28630:13;;28652:63;28630:13;28701:2;28693:11;;28686:4;28674:17;;28652:63;:::i;:::-;28735:17;28754:2;28731:26;;27977:786;-1:-1:-1;;;;27977:786:1:o;28768:500::-;-1:-1:-1;;;;;29037:15:1;;;29019:34;;29089:15;;29084:2;29069:18;;29062:43;29136:2;29121:18;;29114:34;;;29184:3;29179:2;29164:18;;29157:31;;;28962:4;;29205:57;;29242:19;;29234:6;29205:57;:::i;:::-;29197:65;28768:500;-1:-1:-1;;;;;;28768:500:1:o;29273:249::-;29342:6;29395:2;29383:9;29374:7;29370:23;29366:32;29363:52;;;29411:1;29408;29401:12;29363:52;29443:9;29437:16;29462:30;29486:5;29462:30;:::i;30082:136::-;30121:3;30149:5;30139:39;;30158:18;;:::i;:::-;-1:-1:-1;;;30194:18:1;;30082:136::o
Swarm Source
ipfs://91c65f43ba720967cf12af66bd8ba59e80a233e90e2825fadc94a71d0609c4a6
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 27 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.