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
TokenTracker
Latest 25 from a total of 48 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Set Approval For... | 17192465 | 580 days ago | IN | 0 ETH | 0.00355395 | ||||
Safe Transfer Fr... | 16948634 | 615 days ago | IN | 0 ETH | 0.00515869 | ||||
Safe Transfer Fr... | 16874573 | 625 days ago | IN | 0 ETH | 0.00089654 | ||||
Safe Transfer Fr... | 16874569 | 625 days ago | IN | 0 ETH | 0.00145471 | ||||
Safe Transfer Fr... | 16874547 | 625 days ago | IN | 0 ETH | 0.0011957 | ||||
Safe Transfer Fr... | 16874546 | 625 days ago | IN | 0 ETH | 0.00182187 | ||||
Safe Transfer Fr... | 16874505 | 625 days ago | IN | 0 ETH | 0.00163204 | ||||
Safe Transfer Fr... | 16874502 | 625 days ago | IN | 0 ETH | 0.00143623 | ||||
Safe Transfer Fr... | 16874498 | 625 days ago | IN | 0 ETH | 0.00125966 | ||||
Safe Transfer Fr... | 16874497 | 625 days ago | IN | 0 ETH | 0.00164752 | ||||
Safe Transfer Fr... | 16874495 | 625 days ago | IN | 0 ETH | 0.00170715 | ||||
Safe Transfer Fr... | 16874493 | 625 days ago | IN | 0 ETH | 0.00164217 | ||||
Safe Transfer Fr... | 16874460 | 625 days ago | IN | 0 ETH | 0.00184647 | ||||
Safe Transfer Fr... | 16874459 | 625 days ago | IN | 0 ETH | 0.00140325 | ||||
Safe Transfer Fr... | 16874444 | 625 days ago | IN | 0 ETH | 0.00186257 | ||||
Safe Transfer Fr... | 16873029 | 625 days ago | IN | 0 ETH | 0.00236633 | ||||
Safe Transfer Fr... | 16873019 | 625 days ago | IN | 0 ETH | 0.00209512 | ||||
Safe Transfer Fr... | 16509278 | 676 days ago | IN | 0 ETH | 0.00155211 | ||||
Safe Transfer Fr... | 16509268 | 676 days ago | IN | 0 ETH | 0.00118757 | ||||
Set Approval For... | 16509139 | 676 days ago | IN | 0 ETH | 0.00078955 | ||||
Safe Transfer Fr... | 16508984 | 676 days ago | IN | 0 ETH | 0.00117209 | ||||
Safe Transfer Fr... | 16508983 | 676 days ago | IN | 0 ETH | 0.00204135 | ||||
Safe Transfer Fr... | 16508963 | 676 days ago | IN | 0 ETH | 0.0014523 | ||||
Safe Transfer Fr... | 16508942 | 676 days ago | IN | 0 ETH | 0.00116605 | ||||
Safe Transfer Fr... | 16508941 | 676 days ago | IN | 0 ETH | 0.00177246 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
CampusERC721A
Compiler Version
v0.8.17+commit.8df45f5f
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2023-01-03 */ //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ // _.-="_- _ // _.-=" _- | ||"""""""---._______ __.. // ___.===""""-.______-,,,,,,,,,,,,`-''----" """"" """"" __' // __.--"" __ ,' EXOTICS DAO o \ __ [__| // __-""=======.--"" ""--.=================================.--"" ""--.=======: // ] [w] : / \ : |========================| : / \ : [w] : // V___________:| |: |========================| :| |: _-" // V__________: \ / :_|=======================/_____: \ / :__-" // -----------' "-____-" `-------------------------------' "-____-" //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ // By Campus / Elmer Morales // for Exotics DAO // File: contracts/IOperatorFilterRegistry.sol pragma solidity ^0.8.4; interface IOperatorFilterRegistry { function isOperatorAllowed(address registrant, address operator) external view returns (bool); function register(address registrant) external; function registerAndSubscribe(address registrant, address subscription) external; function registerAndCopyEntries(address registrant, address registrantToCopy) external; function updateOperator(address registrant, address operator, bool filtered) external; function updateOperators(address registrant, address[] calldata operators, bool filtered) external; function updateCodeHash(address registrant, bytes32 codehash, bool filtered) external; function updateCodeHashes(address registrant, bytes32[] calldata codeHashes, bool filtered) external; function subscribe(address registrant, address registrantToSubscribe) external; function unsubscribe(address registrant, bool copyExistingEntries) external; function subscriptionOf(address addr) external returns (address registrant); function subscribers(address registrant) external returns (address[] memory); function subscriberAt(address registrant, uint256 index) external returns (address); function copyEntriesOf(address registrant, address registrantToCopy) external; function isOperatorFiltered(address registrant, address operator) external returns (bool); function isCodeHashOfFiltered(address registrant, address operatorWithCode) external returns (bool); function isCodeHashFiltered(address registrant, bytes32 codeHash) external returns (bool); function filteredOperators(address addr) external returns (address[] memory); function filteredCodeHashes(address addr) external returns (bytes32[] memory); function filteredOperatorAt(address registrant, uint256 index) external returns (address); function filteredCodeHashAt(address registrant, uint256 index) external returns (bytes32); function isRegistered(address addr) external returns (bool); function codeHashOf(address addr) external returns (bytes32); } // File: contracts/OperatorFilterer721.sol //pragma solidity ^0.8.13; pragma solidity ^0.8.4; abstract contract OperatorFilterer721 { error OperatorNotAllowed(address operator); IOperatorFilterRegistry constant operatorFilterRegistry = IOperatorFilterRegistry(0x000000000000AAeB6D7670E522A718067333cd4E); constructor(address subscriptionOrRegistrantToCopy, bool subscribe) { // If an inheriting token contract is deployed to a network without the registry deployed, the modifier // will not revert, but the contract will need to be registered with the registry once it is deployed in // order for the modifier to filter addresses. if (address(operatorFilterRegistry).code.length > 0) { if (subscribe) { operatorFilterRegistry.registerAndSubscribe(address(this), subscriptionOrRegistrantToCopy); } else { if (subscriptionOrRegistrantToCopy != address(0)) { operatorFilterRegistry.registerAndCopyEntries(address(this), subscriptionOrRegistrantToCopy); } else { operatorFilterRegistry.register(address(this)); } } } } modifier onlyAllowedOperator(address from) virtual { // Check registry code length to facilitate testing in environments without a deployed registry. if (address(operatorFilterRegistry).code.length > 0) { // Allow spending tokens from addresses with balance // Note that this still allows listings and marketplaces with escrow to transfer tokens if transferred // from an EOA. if (from == msg.sender) { if (balanceOf(msg.sender) > 0) { _; return; } } if ( !( operatorFilterRegistry.isOperatorAllowed(address(this), msg.sender) && operatorFilterRegistry.isOperatorAllowed(address(this), from) ) ) { revert OperatorNotAllowed(msg.sender); } } _; } function balanceOf(address owner) public view virtual returns (uint256 balance); } // File: contracts/DefaultOperatorFilterer721.sol //pragma solidity ^0.8.13; pragma solidity ^0.8.4; abstract contract DefaultOperatorFilterer721 is OperatorFilterer721 { address constant DEFAULT_SUBSCRIPTION = address(0x3cc6CddA760b79bAfa08dF41ECFA224f810dCeB6); constructor() OperatorFilterer721(DEFAULT_SUBSCRIPTION, true) {} } // File: @openzeppelin/contracts/utils/Strings.sol // OpenZeppelin Contracts (last updated v4.7.0) (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_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) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol 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); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @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] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } /** * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation. */ function toHexString(address addr) internal pure returns (string memory) { return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH); } } // File: @openzeppelin/contracts/utils/Context.sol // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // File: @openzeppelin/contracts/access/Ownable.sol // OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol) pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { _checkOwner(); _; } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if the sender is not the owner. */ function _checkOwner() internal view virtual { require(owner() == _msgSender(), "Ownable: caller is not the owner"); } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // File: @openzeppelin/contracts/utils/Address.sol // OpenZeppelin Contracts (last updated v4.7.0) (utils/Address.sol) pragma solidity ^0.8.1; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== * * [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 functionCall(target, data, "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"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(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) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason 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 { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly /// @solidity memory-safe-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File: @openzeppelin/contracts/token/ERC721/IERC721Receiver.sol // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721Receiver.sol) pragma solidity ^0.8.0; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721Receiver.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } // File: @openzeppelin/contracts/utils/introspection/IERC165.sol // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } // File: @openzeppelin/contracts/interfaces/IERC2981.sol // OpenZeppelin Contracts (last updated v4.6.0) (interfaces/IERC2981.sol) pragma solidity ^0.8.0; /** * @dev Interface for the NFT Royalty Standard. * * A standardized way to retrieve royalty payment information for non-fungible tokens (NFTs) to enable universal * support for royalty payments across all NFT marketplaces and ecosystem participants. * * _Available since v4.5._ */ interface IERC2981 is IERC165 { /** * @dev Returns how much royalty is owed and to whom, based on a sale price that may be denominated in any unit of * exchange. The royalty amount is denominated and should be paid in that same unit of exchange. */ function royaltyInfo(uint256 tokenId, uint256 salePrice) external view returns (address receiver, uint256 royaltyAmount); } // File: @openzeppelin/contracts/utils/introspection/ERC165.sol // OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol) pragma solidity ^0.8.0; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } } // File: @openzeppelin/contracts/token/common/ERC2981.sol // OpenZeppelin Contracts (last updated v4.7.0) (token/common/ERC2981.sol) pragma solidity ^0.8.0; /** * @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 ERC2981 is IERC2981, ERC165 { 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(IERC165, ERC165) returns (bool) { return interfaceId == type(IERC2981).interfaceId || super.supportsInterface(interfaceId); } /** * @inheritdoc IERC2981 */ 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]; } } // File: @openzeppelin/contracts/token/ERC721/IERC721.sol // OpenZeppelin Contracts (last updated v4.7.0) (token/ERC721/IERC721.sol) pragma solidity ^0.8.0; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); } // File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Enumerable.sol // OpenZeppelin Contracts (last updated v4.5.0) (token/ERC721/extensions/IERC721Enumerable.sol) pragma solidity ^0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Enumerable is IERC721 { /** * @dev Returns the total amount of tokens stored by the contract. */ function totalSupply() external view returns (uint256); /** * @dev Returns a token ID owned by `owner` at a given `index` of its token list. * Use along with {balanceOf} to enumerate all of ``owner``'s tokens. */ function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256); /** * @dev Returns a token ID at a given `index` of all the tokens stored by the contract. * Use along with {totalSupply} to enumerate all tokens. */ function tokenByIndex(uint256 index) external view returns (uint256); } // File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol) pragma solidity ^0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Metadata is IERC721 { /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); } // File: @openzeppelin/contracts/token/ERC721/ERC721.sol // OpenZeppelin Contracts (last updated v4.7.0) (token/ERC721/ERC721.sol) pragma solidity ^0.8.0; /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata extension, but not including the Enumerable extension, which is available separately as * {ERC721Enumerable}. */ contract ERC721 is Context, ERC165, IERC721, IERC721Metadata { using Address for address; using Strings for uint256; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to owner address mapping(uint256 => address) private _owners; // Mapping owner address to token count mapping(address => uint256) private _balances; // Mapping from token ID to approved address mapping(uint256 => address) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; /** * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection. */ constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC721).interfaceId || interfaceId == type(IERC721Metadata).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view virtual override returns (uint256) { require(owner != address(0), "ERC721: address zero is not a valid owner"); return _balances[owner]; } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view virtual override returns (address) { address owner = _owners[tokenId]; require(owner != address(0), "ERC721: invalid token ID"); return owner; } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { _requireMinted(tokenId); string memory baseURI = _baseURI(); return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : ""; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, can be overridden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ""; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public virtual override { address owner = ERC721.ownerOf(tokenId); require(to != owner, "ERC721: approval to current owner"); require( _msgSender() == owner || isApprovedForAll(owner, _msgSender()), "ERC721: approve caller is not token owner nor 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 nor 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 nor 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 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 _owners[tokenId] != address(0); } /** * @dev Returns whether `spender` is allowed to manage `tokenId`. * * Requirements: * * - `tokenId` must exist. */ function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) { address owner = ERC721.ownerOf(tokenId); return (spender == owner || isApprovedForAll(owner, spender) || getApproved(tokenId) == spender); } /** * @dev Safely mints `tokenId` and transfers it to `to`. * * Requirements: * * - `tokenId` must not exist. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeMint(address to, uint256 tokenId) internal virtual { _safeMint(to, tokenId, ""); } /** * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is * forwarded in {IERC721Receiver-onERC721Received} to contract recipients. */ function _safeMint( address to, uint256 tokenId, bytes memory data ) internal virtual { _mint(to, tokenId); require( _checkOnERC721Received(address(0), to, tokenId, data), "ERC721: transfer to non ERC721Receiver implementer" ); } /** * @dev Mints `tokenId` and transfers it to `to`. * * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible * * Requirements: * * - `tokenId` must not exist. * - `to` cannot be the zero address. * * Emits a {Transfer} event. */ function _mint(address to, uint256 tokenId) internal virtual { require(to != address(0), "ERC721: mint to the zero address"); require(!_exists(tokenId), "ERC721: token already minted"); _beforeTokenTransfer(address(0), to, tokenId); _balances[to] += 1; _owners[tokenId] = to; emit Transfer(address(0), to, tokenId); _afterTokenTransfer(address(0), to, tokenId); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId) internal virtual { address owner = ERC721.ownerOf(tokenId); _beforeTokenTransfer(owner, address(0), tokenId); // Clear approvals _approve(address(0), tokenId); _balances[owner] -= 1; delete _owners[tokenId]; emit Transfer(owner, address(0), tokenId); _afterTokenTransfer(owner, address(0), tokenId); } /** * @dev Transfers `tokenId` from `from` to `to`. * As opposed to {transferFrom}, this imposes no restrictions on msg.sender. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function _transfer( address from, address to, uint256 tokenId ) internal virtual { require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer from incorrect owner"); require(to != address(0), "ERC721: transfer to the zero address"); _beforeTokenTransfer(from, to, tokenId); // Clear approvals from the previous owner _approve(address(0), tokenId); _balances[from] -= 1; _balances[to] += 1; _owners[tokenId] = to; emit Transfer(from, to, tokenId); _afterTokenTransfer(from, to, tokenId); } /** * @dev Approve `to` to operate on `tokenId` * * Emits an {Approval} event. */ function _approve(address to, uint256 tokenId) internal virtual { _tokenApprovals[tokenId] = to; emit Approval(ERC721.ownerOf(tokenId), to, tokenId); } /** * @dev Approve `operator` to operate on all of `owner` tokens * * Emits an {ApprovalForAll} event. */ function _setApprovalForAll( address owner, address operator, bool approved ) internal virtual { require(owner != operator, "ERC721: approve to caller"); _operatorApprovals[owner][operator] = approved; emit ApprovalForAll(owner, operator, approved); } /** * @dev Reverts if the `tokenId` has not been minted yet. */ function _requireMinted(uint256 tokenId) internal view virtual { require(_exists(tokenId), "ERC721: invalid token ID"); } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address. * The call is not executed if the target address is not a contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkOnERC721Received( address from, address to, uint256 tokenId, bytes memory data ) private returns (bool) { if (to.isContract()) { try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, data) returns (bytes4 retval) { return retval == IERC721Receiver.onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert("ERC721: transfer to non ERC721Receiver implementer"); } else { /// @solidity memory-safe-assembly assembly { revert(add(32, reason), mload(reason)) } } } } else { return true; } } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, ``from``'s `tokenId` will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual {} /** * @dev Hook that is called after any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _afterTokenTransfer( address from, address to, uint256 tokenId ) internal virtual {} } // File: @openzeppelin/contracts/token/ERC721/extensions/ERC721Royalty.sol // OpenZeppelin Contracts (last updated v4.5.0) (token/ERC721/extensions/ERC721Royalty.sol) pragma solidity ^0.8.0; /** * @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 {_setDefaultRoyalty}, and/or individually for * specific token ids via {_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 ERC721Royalty is ERC2981, ERC721 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC721, ERC2981) 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); } } // File: contracts/ERC721A.sol // Creators: locationtba.eth, 2pmflow.eth pragma solidity ^0.8.0; /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata and Enumerable extension. Built to optimize for lower gas during batch mints. * * Assumes serials are sequentially minted starting at 0 (e.g. 0, 1, 2, 3..). * * Does not support burning tokens to address(0). */ contract ERC721A is Context, ERC165, IERC721, IERC721Metadata, IERC721Enumerable { using Address for address; using Strings for uint256; struct TokenOwnership { address addr; uint64 startTimestamp; } struct AddressData { uint128 balance; uint128 numberMinted; } uint256 private currentIndex = 0; uint256 internal maxBatchSize; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to ownership details // An empty struct value does not necessarily mean the token is unowned. See ownershipOf implementation for details. mapping(uint256 => TokenOwnership) private _ownerships; // Mapping owner address to address data mapping(address => AddressData) private _addressData; // 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 * `maxBatchSize` refers to how much a minter can mint at a time. */ constructor( string memory name_, string memory symbol_, uint256 maxBatchSize_ ) { require(maxBatchSize_ > 0, "ERC721A: max batch size must be nonzero"); _name = name_; _symbol = symbol_; maxBatchSize = maxBatchSize_; } /** * @dev See {IERC721Enumerable-totalSupply}. */ function totalSupply() public view override returns (uint256) { return currentIndex; } /** * @dev See {IERC721Enumerable-tokenByIndex}. */ function tokenByIndex(uint256 index) public view override returns (uint256) { require(index < totalSupply(), "ERC721A: global index out of bounds"); return index; } /** * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}. * This read function is O(totalSupply). If calling from a separate contract, be sure to test gas first. * It may also degrade with extremely large collection sizes (e.g >> 10000), test for your use case. */ function tokenOfOwnerByIndex(address owner, uint256 index) public view override returns (uint256) { require(index < balanceOf(owner), "ERC721A: owner index out of bounds"); uint256 numMintedSoFar = totalSupply(); uint256 tokenIdsIdx = 0; address currOwnershipAddr = address(0); for (uint256 i = 0; i < numMintedSoFar; i++) { TokenOwnership memory ownership = _ownerships[i]; if (ownership.addr != address(0)) { currOwnershipAddr = ownership.addr; } if (currOwnershipAddr == owner) { if (tokenIdsIdx == index) { return i; } tokenIdsIdx++; } } revert("ERC721A: unable to get token of owner by index"); } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC721).interfaceId || interfaceId == type(IERC721Metadata).interfaceId || interfaceId == type(IERC721Enumerable).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view virtual override returns (uint256) { require(owner != address(0), "ERC721A: balance query for the zero address"); return uint256(_addressData[owner].balance); } function _numberMinted(address owner) internal view returns (uint256) { require( owner != address(0), "ERC721A: number minted query for the zero address" ); return uint256(_addressData[owner].numberMinted); } function ownershipOf(uint256 tokenId) internal view returns (TokenOwnership memory) { require(_exists(tokenId), "ERC721A: owner query for nonexistent token"); uint256 lowestTokenToCheck; if (tokenId >= maxBatchSize) { lowestTokenToCheck = tokenId - maxBatchSize + 1; } for (uint256 curr = tokenId; curr >= lowestTokenToCheck; curr--) { TokenOwnership memory ownership = _ownerships[curr]; if (ownership.addr != address(0)) { return ownership; } } revert("ERC721A: unable to determine the owner of token"); } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view override returns (address) { return ownershipOf(tokenId).addr; } /** * @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) { require( _exists(tokenId), "ERC721Metadata: URI query for nonexistent token" ); 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 overriden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ""; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public override { address owner = ERC721A.ownerOf(tokenId); require(to != owner, "ERC721A: approval to current owner"); require( _msgSender() == owner || isApprovedForAll(owner, _msgSender()), "ERC721A: approve caller is not owner nor approved for all" ); _approve(to, tokenId, owner); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view override returns (address) { require(_exists(tokenId), "ERC721A: approved query for nonexistent token"); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public override { require(operator != _msgSender(), "ERC721A: approve to caller"); _operatorApprovals[_msgSender()][operator] = approved; emit ApprovalForAll(_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 { _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 { _transfer(from, to, tokenId); require( _checkOnERC721Received(from, to, tokenId, _data), "ERC721A: transfer to non ERC721Receiver implementer" ); } /** * @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`), */ function _exists(uint256 tokenId) internal view returns (bool) { return tokenId < currentIndex; } function _safeMint(address to, uint256 quantity) internal { _safeMint(to, quantity, ""); } /** * @dev Mints `quantity` tokens and transfers them to `to`. * * Requirements: * * - `to` cannot be the zero address. * - `quantity` cannot be larger than the max batch size. * * Emits a {Transfer} event. */ function _safeMint( address to, uint256 quantity, bytes memory _data ) internal { uint256 startTokenId = currentIndex; require(to != address(0), "ERC721A: mint to the zero address"); // We know if the first token in the batch doesn't exist, the other ones don't as well, because of serial ordering. require(!_exists(startTokenId), "ERC721A: token already minted"); // require(quantity <= maxBatchSize, "ERC721A: quantity to mint too high"); _beforeTokenTransfers(address(0), to, startTokenId, quantity); AddressData memory addressData = _addressData[to]; _addressData[to] = AddressData( addressData.balance + uint128(quantity), addressData.numberMinted + uint128(quantity) ); _ownerships[startTokenId] = TokenOwnership(to, uint64(block.timestamp)); uint256 updatedIndex = startTokenId; for (uint256 i = 0; i < quantity; i++) { emit Transfer(address(0), to, updatedIndex); require( _checkOnERC721Received(address(0), to, updatedIndex, _data), "ERC721A: transfer to non ERC721Receiver implementer" ); updatedIndex++; } currentIndex = updatedIndex; _afterTokenTransfers(address(0), to, startTokenId, quantity); } /** * @dev Transfers `tokenId` from `from` to `to`. * * 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 ) private { TokenOwnership memory prevOwnership = ownershipOf(tokenId); bool isApprovedOrOwner = (_msgSender() == prevOwnership.addr || getApproved(tokenId) == _msgSender() || isApprovedForAll(prevOwnership.addr, _msgSender())); require( isApprovedOrOwner, "ERC721A: transfer caller is not owner nor approved" ); require( prevOwnership.addr == from, "ERC721A: transfer from incorrect owner" ); require(to != address(0), "ERC721A: transfer to the zero address"); _beforeTokenTransfers(from, to, tokenId, 1); // Clear approvals from the previous owner _approve(address(0), tokenId, prevOwnership.addr); _addressData[from].balance -= 1; _addressData[to].balance += 1; _ownerships[tokenId] = TokenOwnership(to, uint64(block.timestamp)); // If the ownership slot of tokenId+1 is not explicitly set, that means the transfer initiator owns it. // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls. uint256 nextTokenId = tokenId + 1; if (_ownerships[nextTokenId].addr == address(0)) { if (_exists(nextTokenId)) { _ownerships[nextTokenId] = TokenOwnership( prevOwnership.addr, prevOwnership.startTimestamp ); } } emit Transfer(from, to, tokenId); _afterTokenTransfers(from, to, tokenId, 1); } /** * @dev Approve `to` to operate on `tokenId` * * Emits a {Approval} event. */ function _approve( address to, uint256 tokenId, address owner ) private { _tokenApprovals[tokenId] = to; emit Approval(owner, to, tokenId); } uint256 public nextOwnerToExplicitlySet = 0; /** * @dev Explicitly set `owners` to eliminate loops in future calls of ownerOf(). */ function _setOwnersExplicit(uint256 quantity) internal { uint256 oldNextOwnerToSet = nextOwnerToExplicitlySet; require(quantity > 0, "quantity must be nonzero"); uint256 endIndex = oldNextOwnerToSet + quantity - 1; if (endIndex > currentIndex - 1) { endIndex = currentIndex - 1; } // We know if the last one in the group exists, all in the group exist, due to serial ordering. require(_exists(endIndex), "not enough minted yet for this cleanup"); for (uint256 i = oldNextOwnerToSet; i <= endIndex; i++) { if (_ownerships[i].addr == address(0)) { TokenOwnership memory ownership = ownershipOf(i); _ownerships[i] = TokenOwnership( ownership.addr, ownership.startTimestamp ); } } nextOwnerToExplicitlySet = endIndex + 1; } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address. * The call is not executed if the target address is not a contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param _data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { if (to.isContract()) { try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) { return retval == IERC721Receiver(to).onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert("ERC721A: transfer to non ERC721Receiver implementer"); } else { assembly { revert(add(32, reason), mload(reason)) } } } } else { return true; } } /** * @dev Hook that is called before a set of serially-ordered token ids are about to be transferred. This includes minting. * * startTokenId - the first token id to be transferred * quantity - the amount to be transferred * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. */ function _beforeTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} /** * @dev Hook that is called after a set of serially-ordered token ids have been transferred. This includes * minting. * * startTokenId - the first token id to be transferred * quantity - the amount to be transferred * * Calling conditions: * * - when `from` and `to` are both non-zero. * - `from` and `to` are never both zero. */ function _afterTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} } // File: contracts/Campus.sol //SPDX-License-Identifier: MIT /* --------------------------------------------------------------------------------------- _____ ____ ___ _____ ____ ___ ___ / ___/ ___ _ __ _ ___ __ __ ___ ____ / __/ / _ \ / ___//_ / |_ | < / / /__ / _ `/ / ' \ / _ \/ // / (_-< /___/ / _/ / , _// /__ / / / __/ / / \___/ \_,_/ /_/_/_/ / .__/\_,_/ /___/ /___/ /_/|_| \___/ /_/ /____/ /_/ /_/ ------------------------------------------------------------------------------------------ */ pragma solidity ^0.8.4; contract CampusERC721A is ERC721A, Ownable, DefaultOperatorFilterer721 { struct ReservedList { uint256 cost; mapping(address => uint256) users; uint64 startDate; } mapping(string => ReservedList) public reservedLists; string[] public listIds; using Strings for uint256; string public baseURI; string public baseExtension = ".json"; uint256 public maxSupply = 250; uint256 public tier1Cost = .005 ether; uint256 public tier2Cost = .0075 ether; uint256 public tier1Ceiling = 20; uint256 public tier2Ceiling = 30; uint64 public startDate; uint256 public cost = 0.01 ether; uint256 public presaleCost = 0.0 ether; bool public paused = false; mapping(address => uint256) private mintedQuantity; address payable public payments; address private royaltyAddress; uint96 private royaltyBasisPoints = 1000; bytes4 private constant _INTERFACE_ID_ERC2981 = 0x2a55205a; constructor( string memory _name, string memory _symbol, string memory _initBaseURI, uint256 maxBatchSize_ ) ERC721A (_name, _symbol, maxBatchSize_){ setBaseURI(_initBaseURI); } /* Overrides for regsitry */ function transferFrom(address from, address to, uint256 tokenId) public override onlyAllowedOperator(from) { super.transferFrom(from, to, tokenId); } function safeTransferFrom(address from, address to, uint256 tokenId) public override onlyAllowedOperator(from) { super.safeTransferFrom(from, to, tokenId); } function safeTransferFrom(address from, address to, uint256 tokenId, bytes memory data) public override onlyAllowedOperator(from) { super.safeTransferFrom(from, to, tokenId, data); } function balanceOf(address owner) public view override(ERC721A, OperatorFilterer721) returns (uint256) { require(owner != address(0), "ERC721A: balance query for the zero address"); return super.balanceOf(owner); } /* LIST FUNCTIONS */ /** * @dev Adds a list to the contract with a `_listCost`, `_startDate` and `_id` */ function addList(uint256 _listCost, uint64 _startDate, string calldata _id) public onlyOwner { reservedLists[_id].cost = _listCost; reservedLists[_id].startDate = _startDate; listIds.push(_id); } /** * @dev Returns `cost` from a specific list */ function getListInfo(string calldata id) external view returns(uint256 listCost) { return (reservedLists[id].cost); } /** * @dev Adds an array of addresses to a list with a specified `quantity` */ function addAddressesToList(string calldata id, address[] calldata addresses, uint256 quantity) public onlyOwner { for (uint256 i; i < addresses.length; i++) { reservedLists[id].users[addresses[i]] = quantity; } } /* END LIST FUNCTIONS */ /* TIER FUNCTIONS */ /** * @dev Sets the `_tier1Cost`, specified the defined mint ceiling */ function setTier1Cost(uint256 _tier1Cost) external onlyOwner { tier1Cost = _tier1Cost; } /** * @dev Sets the `_tier2Cost`, specified the defined mint ceiling */ function setTier2Cost(uint256 _tier2Cost) external onlyOwner { tier2Cost = _tier2Cost; } /** * @dev Sets the `_publicCost`, specified the defined mint ceiling */ function setPublicCost(uint256 _publicCost) external onlyOwner { cost = _publicCost; } /* END TIER FUNCTIONS */ /** * @dev Pause contract for minting */ function pause() external onlyOwner { paused = true; } /** * @dev Resume contract for minting */ function start() external onlyOwner { paused = false; } /** * @dev Set `_startDate` for the public sale when non-list based minting begins */ function setStartDate(uint64 _startDate) external onlyOwner { startDate = _startDate; } /** * @dev Set `_maxBatchSize` for the maximum amount of tokens that can be minted at once */ function setMaxBatchSize(uint256 _maxBatchSize) external onlyOwner { maxBatchSize = _maxBatchSize; } /** * @dev Return `_maxBatchSize` for the maximum amount of tokens that can be minted at once */ function getMaxBatchSize() external view returns (uint256 _maxBatchSize) { return maxBatchSize; } /** * @dev Set `_payments` for the address to withdraw the balance of the contract to */ function setPayments(address payable _payments) external onlyOwner { payments = _payments; } /** * @dev Return view containing general contract data with no specific address specified - only based on the tiers */ function data() public view returns (uint256 _cost, uint64 _startDate, uint256 _availableAtPrice, uint256 _mintedQuantity, uint256 _maxSupply, string memory _listId) { if (totalSupply() < tier1Ceiling){ return (tier1Cost, startDate, tier1Ceiling - totalSupply(), totalSupply(), maxSupply, _listId); } else if (totalSupply() < tier2Ceiling){ return (tier2Cost, startDate, tier2Ceiling - totalSupply(), totalSupply(), maxSupply, _listId); } else return (cost, startDate, maxSupply - totalSupply(), totalSupply(), maxSupply, _listId); } /** * @dev Return view containing specific contract data based on the `_to` address */ function dataByCaller(address _to) public view returns (uint256 _cost, uint64 _startDate, uint256 _availableAtPrice, uint256 _mintedQuantity, uint256 _currSupply, uint256 _maxSupply, string memory _listId) { bool onList = false; uint256 currCost = 1000000000000000000000000; for (uint256 i; i < listIds.length; i++) { string memory listId = listIds[i]; if (reservedLists[listId].users[_to] >= 1) { if (reservedLists[listId].cost < currCost) { _listId = listId; _cost = reservedLists[listId].cost; _startDate = reservedLists[listId].startDate; _availableAtPrice = reservedLists[listId].users[_to]; } onList = true; } } if (!onList){ (_cost, _startDate, _availableAtPrice, _mintedQuantity, _maxSupply, _listId) = data(); } return (_cost, _startDate, _availableAtPrice, mintedQuantity[_to], totalSupply(), maxSupply, _listId); } /** * @notice Mint a specific quantity of tokens */ function mint(address _to, uint256 _mintAmount) public payable { require(_mintAmount > 0, "Mint at least 1 token"); require(_mintAmount + totalSupply() <= maxSupply, "Not enough tokens remaining"); require(!paused, "Sale paused"); (uint256 mintCost, uint64 mintStart, uint256 _availableAtPrice, uint256 alreadyMinted, uint256 _currSupply, uint256 maxSupply, string memory mintList) = dataByCaller(_to); if (msg.sender != owner()) { require(msg.value >= mintCost * _mintAmount, "Insufficient funds"); require(_availableAtPrice >= _mintAmount, "Not enough tokens at price"); require(alreadyMinted + _mintAmount <= maxBatchSize, "Over max per wallet"); require(_mintAmount <= maxBatchSize, "Over max per call"); } require(mintStart <= block.timestamp, "Sale hasn't started"); mintedQuantity[_to] += _mintAmount; if (bytes(mintList).length > 0) { reservedLists[mintList].users[_to] -= _mintAmount; } _safeMint(_to, _mintAmount); } /** * @notice Withdraw funds to `payments` address */ function withdraw() public payable onlyOwner { (bool success, ) = payable(payments).call{value: address(this).balance}(""); require(success, "Failed to send ether"); } /** * @notice Update `baseURI` with `_newBaseURI` */ function setBaseURI(string memory _newBaseURI) public onlyOwner { baseURI = _newBaseURI; } /** * @notice set royalty address */ function setRoyaltyAddress(address _royaltyAddress) external onlyOwner { royaltyAddress = _royaltyAddress; } /** * @notice set royalty rate */ function setRoyalty(uint96 _royaltyBasisPoints) external onlyOwner { royaltyBasisPoints = _royaltyBasisPoints; } /** * @notice royalty information */ function royaltyInfo(uint256 _tokenId, uint256 _salePrice) external view returns (address receiver, uint256 royaltyAmount) { require(_exists(_tokenId), "Cannot query non-existent token"); return (royaltyAddress, (_salePrice * royaltyBasisPoints) / 10000); } /** * @notice supports interface * @dev overridden for EIP2981 royalties */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC721A) returns (bool) { if (interfaceId == _INTERFACE_ID_ERC2981) { return true; } return super.supportsInterface(interfaceId); } /** * @notice token URI */ function tokenURI(uint256 _tokenId) public view virtual override returns (string memory) { require(_exists(_tokenId), "Cannot query non-existent token"); return string(abi.encodePacked(baseURI, _tokenId.toString(), baseExtension)); } /* Overrides function _burn(uint256 tokenId) internal override(ERC721A) { super._burn(tokenId); }*/ }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"},{"internalType":"string","name":"_initBaseURI","type":"string"},{"internalType":"uint256","name":"maxBatchSize_","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"operator","type":"address"}],"name":"OperatorNotAllowed","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"string","name":"id","type":"string"},{"internalType":"address[]","name":"addresses","type":"address[]"},{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"addAddressesToList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_listCost","type":"uint256"},{"internalType":"uint64","name":"_startDate","type":"uint64"},{"internalType":"string","name":"_id","type":"string"}],"name":"addList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseExtension","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"cost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"data","outputs":[{"internalType":"uint256","name":"_cost","type":"uint256"},{"internalType":"uint64","name":"_startDate","type":"uint64"},{"internalType":"uint256","name":"_availableAtPrice","type":"uint256"},{"internalType":"uint256","name":"_mintedQuantity","type":"uint256"},{"internalType":"uint256","name":"_maxSupply","type":"uint256"},{"internalType":"string","name":"_listId","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"}],"name":"dataByCaller","outputs":[{"internalType":"uint256","name":"_cost","type":"uint256"},{"internalType":"uint64","name":"_startDate","type":"uint64"},{"internalType":"uint256","name":"_availableAtPrice","type":"uint256"},{"internalType":"uint256","name":"_mintedQuantity","type":"uint256"},{"internalType":"uint256","name":"_currSupply","type":"uint256"},{"internalType":"uint256","name":"_maxSupply","type":"uint256"},{"internalType":"string","name":"_listId","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"id","type":"string"}],"name":"getListInfo","outputs":[{"internalType":"uint256","name":"listCost","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getMaxBatchSize","outputs":[{"internalType":"uint256","name":"_maxBatchSize","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"listIds","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_mintAmount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nextOwnerToExplicitlySet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"payments","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"presaleCost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"","type":"string"}],"name":"reservedLists","outputs":[{"internalType":"uint256","name":"cost","type":"uint256"},{"internalType":"uint64","name":"startDate","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"uint256","name":"_salePrice","type":"uint256"}],"name":"royaltyInfo","outputs":[{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint256","name":"royaltyAmount","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":"_newBaseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxBatchSize","type":"uint256"}],"name":"setMaxBatchSize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"_payments","type":"address"}],"name":"setPayments","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_publicCost","type":"uint256"}],"name":"setPublicCost","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint96","name":"_royaltyBasisPoints","type":"uint96"}],"name":"setRoyalty","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_royaltyAddress","type":"address"}],"name":"setRoyaltyAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint64","name":"_startDate","type":"uint64"}],"name":"setStartDate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tier1Cost","type":"uint256"}],"name":"setTier1Cost","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tier2Cost","type":"uint256"}],"name":"setTier2Cost","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"start","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"startDate","outputs":[{"internalType":"uint64","name":"","type":"uint64"}],"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":[],"name":"tier1Ceiling","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tier1Cost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tier2Ceiling","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tier2Cost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"payable","type":"function"}]
Contract Creation Code
600080805560085560c06040526005608090815264173539b7b760d91b60a052600d906200002e908262000431565b5060fa600e556611c37937e08000600f55661aa535d3d0c00060105560146011819055601e601255662386f26fc10000905560006015556016805460ff19169055601980546001600160a01b0316607d60a31b1790553480156200009157600080fd5b5060405162003c8738038062003c87833981016040819052620000b491620005ac565b733cc6cdda760b79bafa08df41ecfa224f810dceb6600185858460008111620001345760405162461bcd60e51b815260206004820152602760248201527f455243373231413a206d61782062617463682073697a65206d757374206265206044820152666e6f6e7a65726f60c81b60648201526084015b60405180910390fd5b600262000142848262000431565b50600362000151838262000431565b506001555062000163905033620002c0565b6daaeb6d7670e522a718067333cd4e3b15620002a8578015620001f657604051633e9f1edf60e11b81523060048201526001600160a01b03831660248201526daaeb6d7670e522a718067333cd4e90637d3e3dbe906044015b600060405180830381600087803b158015620001d757600080fd5b505af1158015620001ec573d6000803e3d6000fd5b50505050620002a8565b6001600160a01b03821615620002475760405163a0af290360e01b81523060048201526001600160a01b03831660248201526daaeb6d7670e522a718067333cd4e9063a0af290390604401620001bc565b604051632210724360e11b81523060048201526daaeb6d7670e522a718067333cd4e90634420e48690602401600060405180830381600087803b1580156200028e57600080fd5b505af1158015620002a3573d6000803e3d6000fd5b505050505b50620002b690508262000312565b5050505062000645565b600980546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6200031c6200032e565b600c6200032a828262000431565b5050565b6009546001600160a01b031633146200038a5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016200012b565b565b634e487b7160e01b600052604160045260246000fd5b600181811c90821680620003b757607f821691505b602082108103620003d857634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200042c57600081815260208120601f850160051c81016020861015620004075750805b601f850160051c820191505b81811015620004285782815560010162000413565b5050505b505050565b81516001600160401b038111156200044d576200044d6200038c565b62000465816200045e8454620003a2565b84620003de565b602080601f8311600181146200049d5760008415620004845750858301515b600019600386901b1c1916600185901b17855562000428565b600085815260208120601f198616915b82811015620004ce57888601518255948401946001909101908401620004ad565b5085821015620004ed5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b600082601f8301126200050f57600080fd5b81516001600160401b03808211156200052c576200052c6200038c565b604051601f8301601f19908116603f011681019082821181831017156200055757620005576200038c565b816040528381526020925086838588010111156200057457600080fd5b600091505b8382101562000598578582018301518183018401529082019062000579565b600093810190920192909252949350505050565b60008060008060808587031215620005c357600080fd5b84516001600160401b0380821115620005db57600080fd5b620005e988838901620004fd565b955060208701519150808211156200060057600080fd5b6200060e88838901620004fd565b945060408701519150808211156200062557600080fd5b506200063487828801620004fd565b606096909601519497939650505050565b61363280620006556000396000f3fe6080604052600436106103355760003560e01c806370a08231116101ab578063be9a6555116100f7578063d7224ba011610095578063e0236fa41161006f578063e0236fa414610972578063e7c00f6e146109a5578063e985e9c5146109ba578063f2fde38b14610a0357600080fd5b8063d7224ba014610930578063d89693dd14610946578063e006154c1461095c57600080fd5b8063c87b56dd116100d1578063c87b56dd146108c4578063cac92669146108e4578063cc2848d814610904578063d5abeb011461091a57600080fd5b8063be9a65551461087a578063c66828621461088f578063c75ea537146108a457600080fd5b80639548fd7d11610164578063a22cb4651161013e578063a22cb465146107fa578063a6d23e101461081a578063af231a581461083a578063b88d4fde1461085a57600080fd5b80639548fd7d146107a557806395c594be146107c557806395d89b41146107e557600080fd5b806370a08231146106f6578063715018a61461071657806373d4a13a1461072b578063811d2437146107525780638456cb59146107725780638da5cb5b1461078757600080fd5b80632a55205a116102855780634f6ccce7116102235780635c975abb116101fd5780635c975abb146106915780636352211e146106ab5780636c0360eb146106cb5780636c37749f146106e057600080fd5b80634f6ccce7146105ec57806355f804b31461060c578063568fe6d31461062c57600080fd5b80633ccfd60b1161025f5780633ccfd60b1461059157806340c10f191461059957806342842e0e146105ac5780634d0a8a3a146105cc57600080fd5b80632a55205a146105125780632b26a6bf146105515780632f745c591461057157600080fd5b80631157498e116102f257806320af1883116102cc57806320af18831461049c57806323b872dd146104bc57806324c91ac9146104dc5780632a23d07d146104fc57600080fd5b80631157498e1461044357806313faede61461047157806318160ddd1461048757600080fd5b806301ffc9a71461033a57806306d254da1461036f57806306fdde0314610391578063081812fc146103b3578063095ea7b3146103eb5780630b97bc861461040b575b600080fd5b34801561034657600080fd5b5061035a610355366004612b62565b610a23565b60405190151581526020015b60405180910390f35b34801561037b57600080fd5b5061038f61038a366004612b9b565b610a54565b005b34801561039d57600080fd5b506103a6610a7e565b6040516103669190612c08565b3480156103bf57600080fd5b506103d36103ce366004612c1b565b610b10565b6040516001600160a01b039091168152602001610366565b3480156103f757600080fd5b5061038f610406366004612c34565b610ba0565b34801561041757600080fd5b5060135461042b906001600160401b031681565b6040516001600160401b039091168152602001610366565b34801561044f57600080fd5b5061046361045e366004612ca1565b610cb7565b604051908152602001610366565b34801561047d57600080fd5b5061046360145481565b34801561049357600080fd5b50600054610463565b3480156104a857600080fd5b5061038f6104b7366004612c1b565b610ce3565b3480156104c857600080fd5b5061038f6104d7366004612ce2565b610cf0565b3480156104e857600080fd5b506103a66104f7366004612c1b565b610e5d565b34801561050857600080fd5b5061046360155481565b34801561051e57600080fd5b5061053261052d366004612d23565b610f09565b604080516001600160a01b039093168352602083019190915201610366565b34801561055d57600080fd5b5061038f61056c366004612c1b565b610fa5565b34801561057d57600080fd5b5061046361058c366004612c34565b610fb2565b61038f61111d565b61038f6105a7366004612c34565b6111c2565b3480156105b857600080fd5b5061038f6105c7366004612ce2565b61151c565b3480156105d857600080fd5b5061038f6105e7366004612d61565b61167e565b3480156105f857600080fd5b50610463610607366004612c1b565b611735565b34801561061857600080fd5b5061038f610627366004612e45565b611797565b34801561063857600080fd5b50610674610647366004612e45565b8051602081830181018051600a82529282019190930120915280546002909101546001600160401b031682565b604080519283526001600160401b03909116602083015201610366565b34801561069d57600080fd5b5060165461035a9060ff1681565b3480156106b757600080fd5b506103d36106c6366004612c1b565b6117af565b3480156106d757600080fd5b506103a66117c1565b3480156106ec57600080fd5b5061046360125481565b34801561070257600080fd5b50610463610711366004612b9b565b6117ce565b34801561072257600080fd5b5061038f6117ff565b34801561073757600080fd5b50610740611813565b60405161036696959493929190612e8d565b34801561075e57600080fd5b5061038f61076d366004612c1b565b6118c7565b34801561077e57600080fd5b5061038f6118d4565b34801561079357600080fd5b506009546001600160a01b03166103d3565b3480156107b157600080fd5b5061038f6107c0366004612ed3565b6118eb565b3480156107d157600080fd5b5061038f6107e0366004612c1b565b611916565b3480156107f157600080fd5b506103a6611923565b34801561080657600080fd5b5061038f610815366004612efc565b611932565b34801561082657600080fd5b506018546103d3906001600160a01b031681565b34801561084657600080fd5b5061038f610855366004612b9b565b6119f6565b34801561086657600080fd5b5061038f610875366004612f35565b611a20565b34801561088657600080fd5b5061038f611b89565b34801561089b57600080fd5b506103a6611b9d565b3480156108b057600080fd5b5061038f6108bf366004612fb4565b611baa565b3480156108d057600080fd5b506103a66108df366004612c1b565b611c3e565b3480156108f057600080fd5b5061038f6108ff366004613055565b611ccc565b34801561091057600080fd5b5061046360115481565b34801561092657600080fd5b50610463600e5481565b34801561093c57600080fd5b5061046360085481565b34801561095257600080fd5b50610463600f5481565b34801561096857600080fd5b5061046360105481565b34801561097e57600080fd5b5061099261098d366004612b9b565b611cfc565b604051610366979695949392919061307e565b3480156109b157600080fd5b50600154610463565b3480156109c657600080fd5b5061035a6109d53660046130cb565b6001600160a01b03918216600090815260076020908152604080832093909416825291909152205460ff1690565b348015610a0f57600080fd5b5061038f610a1e366004612b9b565b611f4b565b6000636ad56fd360e11b6001600160e01b0319831601610a4557506001919050565b610a4e82611fc1565b92915050565b610a5c61202c565b601980546001600160a01b0319166001600160a01b0392909216919091179055565b606060028054610a8d906130f9565b80601f0160208091040260200160405190810160405280929190818152602001828054610ab9906130f9565b8015610b065780601f10610adb57610100808354040283529160200191610b06565b820191906000526020600020905b815481529060010190602001808311610ae957829003601f168201915b5050505050905090565b6000610b1d826000541190565b610b845760405162461bcd60e51b815260206004820152602d60248201527f455243373231413a20617070726f76656420717565727920666f72206e6f6e6560448201526c3c34b9ba32b73a103a37b5b2b760991b60648201526084015b60405180910390fd5b506000908152600660205260409020546001600160a01b031690565b6000610bab826117af565b9050806001600160a01b0316836001600160a01b031603610c195760405162461bcd60e51b815260206004820152602260248201527f455243373231413a20617070726f76616c20746f2063757272656e74206f776e60448201526132b960f11b6064820152608401610b7b565b336001600160a01b0382161480610c355750610c3581336109d5565b610ca75760405162461bcd60e51b815260206004820152603960248201527f455243373231413a20617070726f76652063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f76656420666f7220616c6c000000000000006064820152608401610b7b565b610cb2838383612086565b505050565b6000600a8383604051610ccb929190613133565b90815260405190819003602001902054905092915050565b610ceb61202c565b601055565b826daaeb6d7670e522a718067333cd4e3b15610e4c57336001600160a01b03821603610d37576000610d21336117ce565b1115610d3757610d328484846120e2565b610e57565b604051633185c44d60e21b81523060048201523360248201526daaeb6d7670e522a718067333cd4e9063c617113490604401602060405180830381865afa158015610d86573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610daa9190613143565b8015610e2d5750604051633185c44d60e21b81523060048201526001600160a01b03821660248201526daaeb6d7670e522a718067333cd4e9063c617113490604401602060405180830381865afa158015610e09573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e2d9190613143565b610e4c57604051633b79c77360e21b8152336004820152602401610b7b565b610e578484846120e2565b50505050565b600b8181548110610e6d57600080fd5b906000526020600020016000915090508054610e88906130f9565b80601f0160208091040260200160405190810160405280929190818152602001828054610eb4906130f9565b8015610f015780601f10610ed657610100808354040283529160200191610f01565b820191906000526020600020905b815481529060010190602001808311610ee457829003601f168201915b505050505081565b600080610f17846000541190565b610f635760405162461bcd60e51b815260206004820152601f60248201527f43616e6e6f74207175657279206e6f6e2d6578697374656e7420746f6b656e006044820152606401610b7b565b6019546001600160a01b0381169061271090610f8f90600160a01b90046001600160601b031686613176565b610f9991906131a3565b915091505b9250929050565b610fad61202c565b600155565b6000610fbd836117ce565b82106110165760405162461bcd60e51b815260206004820152602260248201527f455243373231413a206f776e657220696e646578206f7574206f6620626f756e604482015261647360f01b6064820152608401610b7b565b600080549080805b838110156110bd576000818152600460209081526040918290208251808401909352546001600160a01b038116808452600160a01b9091046001600160401b0316918301919091521561107057805192505b876001600160a01b0316836001600160a01b0316036110aa5786840361109c57509350610a4e92505050565b836110a6816131b7565b9450505b50806110b5816131b7565b91505061101e565b5060405162461bcd60e51b815260206004820152602e60248201527f455243373231413a20756e61626c6520746f2067657420746f6b656e206f662060448201526d0deeedccae440c4f240d2dcc8caf60931b6064820152608401610b7b565b61112561202c565b6018546040516000916001600160a01b03169047908381818185875af1925050503d8060008114611172576040519150601f19603f3d011682016040523d82523d6000602084013e611177565b606091505b50509050806111bf5760405162461bcd60e51b81526020600482015260146024820152732330b4b632b2103a379039b2b7321032ba3432b960611b6044820152606401610b7b565b50565b6000811161120a5760405162461bcd60e51b815260206004820152601560248201527426b4b73a1030ba103632b0b9ba1018903a37b5b2b760591b6044820152606401610b7b565b600e5460005461121a90836131d0565b11156112685760405162461bcd60e51b815260206004820152601b60248201527f4e6f7420656e6f75676820746f6b656e732072656d61696e696e6700000000006044820152606401610b7b565b60165460ff16156112a95760405162461bcd60e51b815260206004820152600b60248201526a14d85b19481c185d5cd95960aa1b6044820152606401610b7b565b60008060008060008060006112bd89611cfc565b96509650965096509650965096506112dd6009546001600160a01b031690565b6001600160a01b0316336001600160a01b03161461142a576112ff8888613176565b3410156113435760405162461bcd60e51b8152602060048201526012602482015271496e73756666696369656e742066756e647360701b6044820152606401610b7b565b878510156113935760405162461bcd60e51b815260206004820152601a60248201527f4e6f7420656e6f75676820746f6b656e732061742070726963650000000000006044820152606401610b7b565b6001546113a089866131d0565b11156113e45760405162461bcd60e51b815260206004820152601360248201527213dd995c881b585e081c195c881dd85b1b195d606a1b6044820152606401610b7b565b60015488111561142a5760405162461bcd60e51b815260206004820152601160248201527013dd995c881b585e081c195c8818d85b1b607a1b6044820152606401610b7b565b42866001600160401b031611156114795760405162461bcd60e51b815260206004820152601360248201527214d85b19481a185cdb89dd081cdd185c9d1959606a1b6044820152606401610b7b565b6001600160a01b038916600090815260176020526040812080548a92906114a19084906131d0565b90915550508051156115075787600a826040516114be91906131e3565b908152602001604051809103902060010160008b6001600160a01b03166001600160a01b03168152602001908152602001600020600082825461150191906131ff565b90915550505b61151189896120ed565b505050505050505050565b826daaeb6d7670e522a718067333cd4e3b1561167357336001600160a01b0382160361155e57600061154d336117ce565b111561155e57610d32848484612107565b604051633185c44d60e21b81523060048201523360248201526daaeb6d7670e522a718067333cd4e9063c617113490604401602060405180830381865afa1580156115ad573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115d19190613143565b80156116545750604051633185c44d60e21b81523060048201526001600160a01b03821660248201526daaeb6d7670e522a718067333cd4e9063c617113490604401602060405180830381865afa158015611630573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116549190613143565b61167357604051633b79c77360e21b8152336004820152602401610b7b565b610e57848484612107565b61168661202c565b83600a8383604051611699929190613133565b908152604051908190036020018120919091558390600a906116be9085908590613133565b90815260405190819003602001902060020180546001600160401b039290921667ffffffffffffffff19909216919091179055600b80546001810182556000919091527f0175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01db90161172e828483613258565b5050505050565b6000805482106117935760405162461bcd60e51b815260206004820152602360248201527f455243373231413a20676c6f62616c20696e646578206f7574206f6620626f756044820152626e647360e81b6064820152608401610b7b565b5090565b61179f61202c565b600c6117ab8282613317565b5050565b60006117ba82612122565b5192915050565b600c8054610e88906130f9565b60006001600160a01b0382166117f65760405162461bcd60e51b8152600401610b7b906133d6565b610a4e82612290565b61180761202c565b61181160006122dd565b565b6000806000806000606060115461182960005490565b101561186957600f546013546001600160401b031661184760005490565b60115461185491906131ff565b600054600e54955095509550955095506118bf565b601254600054101561189a576010546013546001600160401b031661188d60005490565b60125461185491906131ff565b6014546013546001600160401b03166118b260005490565b600e5461185491906131ff565b909192939495565b6118cf61202c565b601455565b6118dc61202c565b6016805460ff19166001179055565b6118f361202c565b6013805467ffffffffffffffff19166001600160401b0392909216919091179055565b61191e61202c565b600f55565b606060038054610a8d906130f9565b336001600160a01b0383160361198a5760405162461bcd60e51b815260206004820152601a60248201527f455243373231413a20617070726f766520746f2063616c6c65720000000000006044820152606401610b7b565b3360008181526007602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6119fe61202c565b601880546001600160a01b0319166001600160a01b0392909216919091179055565b836daaeb6d7670e522a718067333cd4e3b15611b7d57336001600160a01b03821603611a68576000611a51336117ce565b1115611a6857611a638585858561232f565b61172e565b604051633185c44d60e21b81523060048201523360248201526daaeb6d7670e522a718067333cd4e9063c617113490604401602060405180830381865afa158015611ab7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611adb9190613143565b8015611b5e5750604051633185c44d60e21b81523060048201526001600160a01b03821660248201526daaeb6d7670e522a718067333cd4e9063c617113490604401602060405180830381865afa158015611b3a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b5e9190613143565b611b7d57604051633b79c77360e21b8152336004820152602401610b7b565b61172e8585858561232f565b611b9161202c565b6016805460ff19169055565b600d8054610e88906130f9565b611bb261202c565b60005b82811015611c365781600a8787604051611bd0929190613133565b90815260200160405180910390206001016000868685818110611bf557611bf5613421565b9050602002016020810190611c0a9190612b9b565b6001600160a01b0316815260208101919091526040016000205580611c2e816131b7565b915050611bb5565b505050505050565b6060611c4b826000541190565b611c975760405162461bcd60e51b815260206004820152601f60248201527f43616e6e6f74207175657279206e6f6e2d6578697374656e7420746f6b656e006044820152606401610b7b565b600c611ca283612362565b600d604051602001611cb6939291906134aa565b6040516020818303038152906040529050919050565b611cd461202c565b601980546001600160601b03909216600160a01b026001600160a01b03909216919091179055565b6000808080808060608169d3c21bcecceda1000000815b600b54811015611ee9576000600b8281548110611d3257611d32613421565b906000526020600020018054611d47906130f9565b80601f0160208091040260200160405190810160405280929190818152602001828054611d73906130f9565b8015611dc05780601f10611d9557610100808354040283529160200191611dc0565b820191906000526020600020905b815481529060010190602001808311611da357829003601f168201915b505050505090506001600a82604051611dd991906131e3565b908152602001604051809103902060010160008e6001600160a01b03166001600160a01b031681526020019081526020016000205410611ed65782600a82604051611e2491906131e3565b908152604051908190036020019020541015611ed157809450600a81604051611e4d91906131e3565b908152604051908190036020018120549b50600a90611e6d9083906131e3565b908152604051908190036020018120600201546001600160401b03169a50600a90611e999083906131e3565b908152602001604051809103902060010160008d6001600160a01b03166001600160a01b031681526020019081526020016000205498505b600193505b5080611ee1816131b7565b915050611d13565b5081611f0757611ef7611813565b949d50929b509099509750945092505b6001600160a01b038a16600090815260176020526040902054899089908990611f2f60005490565b600e549850985098509850985098505050919395979092949650565b611f5361202c565b6001600160a01b038116611fb85760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610b7b565b6111bf816122dd565b60006001600160e01b031982166380ac58cd60e01b1480611ff257506001600160e01b03198216635b5e139f60e01b145b8061200d57506001600160e01b0319821663780e9d6360e01b145b80610a4e57506301ffc9a760e01b6001600160e01b0319831614610a4e565b6009546001600160a01b031633146118115760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610b7b565b60008281526006602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b610cb283838361246a565b6117ab8282604051806020016040528060008152506127ec565b610cb283838360405180602001604052806000815250611a20565b6040805180820190915260008082526020820152612141826000541190565b6121a05760405162461bcd60e51b815260206004820152602a60248201527f455243373231413a206f776e657220717565727920666f72206e6f6e657869736044820152693a32b73a103a37b5b2b760b11b6064820152608401610b7b565b600060015483106121c6576001546121b890846131ff565b6121c39060016131d0565b90505b825b81811061222f576000818152600460209081526040918290208251808401909352546001600160a01b038116808452600160a01b9091046001600160401b0316918301919091521561221c57949350505050565b5080612227816134dd565b9150506121c8565b5060405162461bcd60e51b815260206004820152602f60248201527f455243373231413a20756e61626c6520746f2064657465726d696e652074686560448201526e1037bbb732b91037b3103a37b5b2b760891b6064820152608401610b7b565b60006001600160a01b0382166122b85760405162461bcd60e51b8152600401610b7b906133d6565b506001600160a01b03166000908152600560205260409020546001600160801b031690565b600980546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b61233a84848461246a565b61234684848484612a4b565b610e575760405162461bcd60e51b8152600401610b7b906134f4565b6060816000036123895750506040805180820190915260018152600360fc1b602082015290565b8160005b81156123b3578061239d816131b7565b91506123ac9050600a836131a3565b915061238d565b6000816001600160401b038111156123cd576123cd612dba565b6040519080825280601f01601f1916602001820160405280156123f7576020820181803683370190505b5090505b84156124625761240c6001836131ff565b9150612419600a86613547565b6124249060306131d0565b60f81b81838151811061243957612439613421565b60200101906001600160f81b031916908160001a90535061245b600a866131a3565b94506123fb565b949350505050565b600061247582612122565b80519091506000906001600160a01b0316336001600160a01b031614806124ac5750336124a184610b10565b6001600160a01b0316145b806124be575081516124be90336109d5565b9050806125285760405162461bcd60e51b815260206004820152603260248201527f455243373231413a207472616e736665722063616c6c6572206973206e6f74206044820152711bdddb995c881b9bdc88185c1c1c9bdd995960721b6064820152608401610b7b565b846001600160a01b031682600001516001600160a01b03161461259c5760405162461bcd60e51b815260206004820152602660248201527f455243373231413a207472616e736665722066726f6d20696e636f72726563746044820152651037bbb732b960d11b6064820152608401610b7b565b6001600160a01b0384166126005760405162461bcd60e51b815260206004820152602560248201527f455243373231413a207472616e7366657220746f20746865207a65726f206164604482015264647265737360d81b6064820152608401610b7b565b6126106000848460000151612086565b6001600160a01b03851660009081526005602052604081208054600192906126429084906001600160801b031661355b565b82546101009290920a6001600160801b038181021990931691831602179091556001600160a01b0386166000908152600560205260408120805460019450909261268e91859116613582565b82546001600160801b039182166101009390930a9283029190920219909116179055506040805180820182526001600160a01b0380871682526001600160401b03428116602080850191825260008981526004909152948520935184549151909216600160a01b026001600160e01b031990911691909216171790556127158460016131d0565b6000818152600460205260409020549091506001600160a01b03166127a65761273f816000541190565b156127a65760408051808201825284516001600160a01b0390811682526020808701516001600160401b039081168285019081526000878152600490935294909120925183549451909116600160a01b026001600160e01b03199094169116179190911790555b83856001600160a01b0316876001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611c36565b6000546001600160a01b03841661284f5760405162461bcd60e51b815260206004820152602160248201527f455243373231413a206d696e7420746f20746865207a65726f206164647265736044820152607360f81b6064820152608401610b7b565b61285a816000541190565b156128a75760405162461bcd60e51b815260206004820152601d60248201527f455243373231413a20746f6b656e20616c7265616479206d696e7465640000006044820152606401610b7b565b6001600160a01b0384166000908152600560209081526040918290208251808401845290546001600160801b038082168352600160801b9091041691810191909152815180830190925280519091908190612903908790613582565b6001600160801b031681526020018583602001516129219190613582565b6001600160801b039081169091526001600160a01b0380881660008181526005602090815260408083208751978301518716600160801b029790961696909617909455845180860186529182526001600160401b034281168386019081528883526004909552948120915182549451909516600160a01b026001600160e01b031990941694909216939093179190911790915582905b85811015612a405760405182906001600160a01b038916906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a4612a046000888488612a4b565b612a205760405162461bcd60e51b8152600401610b7b906134f4565b81612a2a816131b7565b9250508080612a38906131b7565b9150506129b7565b506000819055611c36565b60006001600160a01b0384163b15612b4157604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290612a8f9033908990889088906004016135a2565b6020604051808303816000875af1925050508015612aca575060408051601f3d908101601f19168201909252612ac7918101906135df565b60015b612b27573d808015612af8576040519150601f19603f3d011682016040523d82523d6000602084013e612afd565b606091505b508051600003612b1f5760405162461bcd60e51b8152600401610b7b906134f4565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050612462565b506001949350505050565b6001600160e01b0319811681146111bf57600080fd5b600060208284031215612b7457600080fd5b8135612b7f81612b4c565b9392505050565b6001600160a01b03811681146111bf57600080fd5b600060208284031215612bad57600080fd5b8135612b7f81612b86565b60005b83811015612bd3578181015183820152602001612bbb565b50506000910152565b60008151808452612bf4816020860160208601612bb8565b601f01601f19169290920160200192915050565b602081526000612b7f6020830184612bdc565b600060208284031215612c2d57600080fd5b5035919050565b60008060408385031215612c4757600080fd5b8235612c5281612b86565b946020939093013593505050565b60008083601f840112612c7257600080fd5b5081356001600160401b03811115612c8957600080fd5b602083019150836020828501011115610f9e57600080fd5b60008060208385031215612cb457600080fd5b82356001600160401b03811115612cca57600080fd5b612cd685828601612c60565b90969095509350505050565b600080600060608486031215612cf757600080fd5b8335612d0281612b86565b92506020840135612d1281612b86565b929592945050506040919091013590565b60008060408385031215612d3657600080fd5b50508035926020909101359150565b80356001600160401b0381168114612d5c57600080fd5b919050565b60008060008060608587031215612d7757600080fd5b84359350612d8760208601612d45565b925060408501356001600160401b03811115612da257600080fd5b612dae87828801612c60565b95989497509550505050565b634e487b7160e01b600052604160045260246000fd5b60006001600160401b0380841115612dea57612dea612dba565b604051601f8501601f19908116603f01168101908282118183101715612e1257612e12612dba565b81604052809350858152868686011115612e2b57600080fd5b858560208301376000602087830101525050509392505050565b600060208284031215612e5757600080fd5b81356001600160401b03811115612e6d57600080fd5b8201601f81018413612e7e57600080fd5b61246284823560208401612dd0565b8681526001600160401b038616602082015284604082015283606082015282608082015260c060a08201526000612ec760c0830184612bdc565b98975050505050505050565b600060208284031215612ee557600080fd5b612b7f82612d45565b80151581146111bf57600080fd5b60008060408385031215612f0f57600080fd5b8235612f1a81612b86565b91506020830135612f2a81612eee565b809150509250929050565b60008060008060808587031215612f4b57600080fd5b8435612f5681612b86565b93506020850135612f6681612b86565b92506040850135915060608501356001600160401b03811115612f8857600080fd5b8501601f81018713612f9957600080fd5b612fa887823560208401612dd0565b91505092959194509250565b600080600080600060608688031215612fcc57600080fd5b85356001600160401b0380821115612fe357600080fd5b612fef89838a01612c60565b9097509550602088013591508082111561300857600080fd5b818801915088601f83011261301c57600080fd5b81358181111561302b57600080fd5b8960208260051b850101111561304057600080fd5b96999598505060200195604001359392505050565b60006020828403121561306757600080fd5b81356001600160601b0381168114612b7f57600080fd5b8781526001600160401b03871660208201528560408201528460608201528360808201528260a082015260e060c082015260006130be60e0830184612bdc565b9998505050505050505050565b600080604083850312156130de57600080fd5b82356130e981612b86565b91506020830135612f2a81612b86565b600181811c9082168061310d57607f821691505b60208210810361312d57634e487b7160e01b600052602260045260246000fd5b50919050565b8183823760009101908152919050565b60006020828403121561315557600080fd5b8151612b7f81612eee565b634e487b7160e01b600052601160045260246000fd5b8082028115828204841417610a4e57610a4e613160565b634e487b7160e01b600052601260045260246000fd5b6000826131b2576131b261318d565b500490565b6000600182016131c9576131c9613160565b5060010190565b80820180821115610a4e57610a4e613160565b600082516131f5818460208701612bb8565b9190910192915050565b81810381811115610a4e57610a4e613160565b601f821115610cb257600081815260208120601f850160051c810160208610156132395750805b601f850160051c820191505b81811015611c3657828155600101613245565b6001600160401b0383111561326f5761326f612dba565b6132838361327d83546130f9565b83613212565b6000601f8411600181146132b7576000851561329f5750838201355b600019600387901b1c1916600186901b17835561172e565b600083815260209020601f19861690835b828110156132e857868501358255602094850194600190920191016132c8565b50868210156133055760001960f88860031b161c19848701351681555b505060018560011b0183555050505050565b81516001600160401b0381111561333057613330612dba565b6133448161333e84546130f9565b84613212565b602080601f83116001811461337957600084156133615750858301515b600019600386901b1c1916600185901b178555611c36565b600085815260208120601f198616915b828110156133a857888601518255948401946001909101908401613389565b50858210156133c65787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b6020808252602b908201527f455243373231413a2062616c616e636520717565727920666f7220746865207a60408201526a65726f206164647265737360a81b606082015260800190565b634e487b7160e01b600052603260045260246000fd5b60008154613444816130f9565b6001828116801561345c5760018114613471576134a0565b60ff19841687528215158302870194506134a0565b8560005260208060002060005b858110156134975781548a82015290840190820161347e565b50505082870194505b5050505092915050565b60006134b68286613437565b84516134c6818360208901612bb8565b6134d281830186613437565b979650505050505050565b6000816134ec576134ec613160565b506000190190565b60208082526033908201527f455243373231413a207472616e7366657220746f206e6f6e204552433732315260408201527232b1b2b4bb32b91034b6b83632b6b2b73a32b960691b606082015260800190565b6000826135565761355661318d565b500690565b6001600160801b0382811682821603908082111561357b5761357b613160565b5092915050565b6001600160801b0381811683821601908082111561357b5761357b613160565b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906135d590830184612bdc565b9695505050505050565b6000602082840312156135f157600080fd5b8151612b7f81612b4c56fea26469706673582212205eaa9eb853327e346ca984311968fb4f581c91c54844e031595ca9299e8856e764736f6c63430008110033000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000032000000000000000000000000000000000000000000000000000000000000001545786f74696373466f756e64657245646974696f6e0000000000000000000000000000000000000000000000000000000000000000000000000000000000000745584f544943530000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000000
Deployed Bytecode
0x6080604052600436106103355760003560e01c806370a08231116101ab578063be9a6555116100f7578063d7224ba011610095578063e0236fa41161006f578063e0236fa414610972578063e7c00f6e146109a5578063e985e9c5146109ba578063f2fde38b14610a0357600080fd5b8063d7224ba014610930578063d89693dd14610946578063e006154c1461095c57600080fd5b8063c87b56dd116100d1578063c87b56dd146108c4578063cac92669146108e4578063cc2848d814610904578063d5abeb011461091a57600080fd5b8063be9a65551461087a578063c66828621461088f578063c75ea537146108a457600080fd5b80639548fd7d11610164578063a22cb4651161013e578063a22cb465146107fa578063a6d23e101461081a578063af231a581461083a578063b88d4fde1461085a57600080fd5b80639548fd7d146107a557806395c594be146107c557806395d89b41146107e557600080fd5b806370a08231146106f6578063715018a61461071657806373d4a13a1461072b578063811d2437146107525780638456cb59146107725780638da5cb5b1461078757600080fd5b80632a55205a116102855780634f6ccce7116102235780635c975abb116101fd5780635c975abb146106915780636352211e146106ab5780636c0360eb146106cb5780636c37749f146106e057600080fd5b80634f6ccce7146105ec57806355f804b31461060c578063568fe6d31461062c57600080fd5b80633ccfd60b1161025f5780633ccfd60b1461059157806340c10f191461059957806342842e0e146105ac5780634d0a8a3a146105cc57600080fd5b80632a55205a146105125780632b26a6bf146105515780632f745c591461057157600080fd5b80631157498e116102f257806320af1883116102cc57806320af18831461049c57806323b872dd146104bc57806324c91ac9146104dc5780632a23d07d146104fc57600080fd5b80631157498e1461044357806313faede61461047157806318160ddd1461048757600080fd5b806301ffc9a71461033a57806306d254da1461036f57806306fdde0314610391578063081812fc146103b3578063095ea7b3146103eb5780630b97bc861461040b575b600080fd5b34801561034657600080fd5b5061035a610355366004612b62565b610a23565b60405190151581526020015b60405180910390f35b34801561037b57600080fd5b5061038f61038a366004612b9b565b610a54565b005b34801561039d57600080fd5b506103a6610a7e565b6040516103669190612c08565b3480156103bf57600080fd5b506103d36103ce366004612c1b565b610b10565b6040516001600160a01b039091168152602001610366565b3480156103f757600080fd5b5061038f610406366004612c34565b610ba0565b34801561041757600080fd5b5060135461042b906001600160401b031681565b6040516001600160401b039091168152602001610366565b34801561044f57600080fd5b5061046361045e366004612ca1565b610cb7565b604051908152602001610366565b34801561047d57600080fd5b5061046360145481565b34801561049357600080fd5b50600054610463565b3480156104a857600080fd5b5061038f6104b7366004612c1b565b610ce3565b3480156104c857600080fd5b5061038f6104d7366004612ce2565b610cf0565b3480156104e857600080fd5b506103a66104f7366004612c1b565b610e5d565b34801561050857600080fd5b5061046360155481565b34801561051e57600080fd5b5061053261052d366004612d23565b610f09565b604080516001600160a01b039093168352602083019190915201610366565b34801561055d57600080fd5b5061038f61056c366004612c1b565b610fa5565b34801561057d57600080fd5b5061046361058c366004612c34565b610fb2565b61038f61111d565b61038f6105a7366004612c34565b6111c2565b3480156105b857600080fd5b5061038f6105c7366004612ce2565b61151c565b3480156105d857600080fd5b5061038f6105e7366004612d61565b61167e565b3480156105f857600080fd5b50610463610607366004612c1b565b611735565b34801561061857600080fd5b5061038f610627366004612e45565b611797565b34801561063857600080fd5b50610674610647366004612e45565b8051602081830181018051600a82529282019190930120915280546002909101546001600160401b031682565b604080519283526001600160401b03909116602083015201610366565b34801561069d57600080fd5b5060165461035a9060ff1681565b3480156106b757600080fd5b506103d36106c6366004612c1b565b6117af565b3480156106d757600080fd5b506103a66117c1565b3480156106ec57600080fd5b5061046360125481565b34801561070257600080fd5b50610463610711366004612b9b565b6117ce565b34801561072257600080fd5b5061038f6117ff565b34801561073757600080fd5b50610740611813565b60405161036696959493929190612e8d565b34801561075e57600080fd5b5061038f61076d366004612c1b565b6118c7565b34801561077e57600080fd5b5061038f6118d4565b34801561079357600080fd5b506009546001600160a01b03166103d3565b3480156107b157600080fd5b5061038f6107c0366004612ed3565b6118eb565b3480156107d157600080fd5b5061038f6107e0366004612c1b565b611916565b3480156107f157600080fd5b506103a6611923565b34801561080657600080fd5b5061038f610815366004612efc565b611932565b34801561082657600080fd5b506018546103d3906001600160a01b031681565b34801561084657600080fd5b5061038f610855366004612b9b565b6119f6565b34801561086657600080fd5b5061038f610875366004612f35565b611a20565b34801561088657600080fd5b5061038f611b89565b34801561089b57600080fd5b506103a6611b9d565b3480156108b057600080fd5b5061038f6108bf366004612fb4565b611baa565b3480156108d057600080fd5b506103a66108df366004612c1b565b611c3e565b3480156108f057600080fd5b5061038f6108ff366004613055565b611ccc565b34801561091057600080fd5b5061046360115481565b34801561092657600080fd5b50610463600e5481565b34801561093c57600080fd5b5061046360085481565b34801561095257600080fd5b50610463600f5481565b34801561096857600080fd5b5061046360105481565b34801561097e57600080fd5b5061099261098d366004612b9b565b611cfc565b604051610366979695949392919061307e565b3480156109b157600080fd5b50600154610463565b3480156109c657600080fd5b5061035a6109d53660046130cb565b6001600160a01b03918216600090815260076020908152604080832093909416825291909152205460ff1690565b348015610a0f57600080fd5b5061038f610a1e366004612b9b565b611f4b565b6000636ad56fd360e11b6001600160e01b0319831601610a4557506001919050565b610a4e82611fc1565b92915050565b610a5c61202c565b601980546001600160a01b0319166001600160a01b0392909216919091179055565b606060028054610a8d906130f9565b80601f0160208091040260200160405190810160405280929190818152602001828054610ab9906130f9565b8015610b065780601f10610adb57610100808354040283529160200191610b06565b820191906000526020600020905b815481529060010190602001808311610ae957829003601f168201915b5050505050905090565b6000610b1d826000541190565b610b845760405162461bcd60e51b815260206004820152602d60248201527f455243373231413a20617070726f76656420717565727920666f72206e6f6e6560448201526c3c34b9ba32b73a103a37b5b2b760991b60648201526084015b60405180910390fd5b506000908152600660205260409020546001600160a01b031690565b6000610bab826117af565b9050806001600160a01b0316836001600160a01b031603610c195760405162461bcd60e51b815260206004820152602260248201527f455243373231413a20617070726f76616c20746f2063757272656e74206f776e60448201526132b960f11b6064820152608401610b7b565b336001600160a01b0382161480610c355750610c3581336109d5565b610ca75760405162461bcd60e51b815260206004820152603960248201527f455243373231413a20617070726f76652063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f76656420666f7220616c6c000000000000006064820152608401610b7b565b610cb2838383612086565b505050565b6000600a8383604051610ccb929190613133565b90815260405190819003602001902054905092915050565b610ceb61202c565b601055565b826daaeb6d7670e522a718067333cd4e3b15610e4c57336001600160a01b03821603610d37576000610d21336117ce565b1115610d3757610d328484846120e2565b610e57565b604051633185c44d60e21b81523060048201523360248201526daaeb6d7670e522a718067333cd4e9063c617113490604401602060405180830381865afa158015610d86573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610daa9190613143565b8015610e2d5750604051633185c44d60e21b81523060048201526001600160a01b03821660248201526daaeb6d7670e522a718067333cd4e9063c617113490604401602060405180830381865afa158015610e09573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e2d9190613143565b610e4c57604051633b79c77360e21b8152336004820152602401610b7b565b610e578484846120e2565b50505050565b600b8181548110610e6d57600080fd5b906000526020600020016000915090508054610e88906130f9565b80601f0160208091040260200160405190810160405280929190818152602001828054610eb4906130f9565b8015610f015780601f10610ed657610100808354040283529160200191610f01565b820191906000526020600020905b815481529060010190602001808311610ee457829003601f168201915b505050505081565b600080610f17846000541190565b610f635760405162461bcd60e51b815260206004820152601f60248201527f43616e6e6f74207175657279206e6f6e2d6578697374656e7420746f6b656e006044820152606401610b7b565b6019546001600160a01b0381169061271090610f8f90600160a01b90046001600160601b031686613176565b610f9991906131a3565b915091505b9250929050565b610fad61202c565b600155565b6000610fbd836117ce565b82106110165760405162461bcd60e51b815260206004820152602260248201527f455243373231413a206f776e657220696e646578206f7574206f6620626f756e604482015261647360f01b6064820152608401610b7b565b600080549080805b838110156110bd576000818152600460209081526040918290208251808401909352546001600160a01b038116808452600160a01b9091046001600160401b0316918301919091521561107057805192505b876001600160a01b0316836001600160a01b0316036110aa5786840361109c57509350610a4e92505050565b836110a6816131b7565b9450505b50806110b5816131b7565b91505061101e565b5060405162461bcd60e51b815260206004820152602e60248201527f455243373231413a20756e61626c6520746f2067657420746f6b656e206f662060448201526d0deeedccae440c4f240d2dcc8caf60931b6064820152608401610b7b565b61112561202c565b6018546040516000916001600160a01b03169047908381818185875af1925050503d8060008114611172576040519150601f19603f3d011682016040523d82523d6000602084013e611177565b606091505b50509050806111bf5760405162461bcd60e51b81526020600482015260146024820152732330b4b632b2103a379039b2b7321032ba3432b960611b6044820152606401610b7b565b50565b6000811161120a5760405162461bcd60e51b815260206004820152601560248201527426b4b73a1030ba103632b0b9ba1018903a37b5b2b760591b6044820152606401610b7b565b600e5460005461121a90836131d0565b11156112685760405162461bcd60e51b815260206004820152601b60248201527f4e6f7420656e6f75676820746f6b656e732072656d61696e696e6700000000006044820152606401610b7b565b60165460ff16156112a95760405162461bcd60e51b815260206004820152600b60248201526a14d85b19481c185d5cd95960aa1b6044820152606401610b7b565b60008060008060008060006112bd89611cfc565b96509650965096509650965096506112dd6009546001600160a01b031690565b6001600160a01b0316336001600160a01b03161461142a576112ff8888613176565b3410156113435760405162461bcd60e51b8152602060048201526012602482015271496e73756666696369656e742066756e647360701b6044820152606401610b7b565b878510156113935760405162461bcd60e51b815260206004820152601a60248201527f4e6f7420656e6f75676820746f6b656e732061742070726963650000000000006044820152606401610b7b565b6001546113a089866131d0565b11156113e45760405162461bcd60e51b815260206004820152601360248201527213dd995c881b585e081c195c881dd85b1b195d606a1b6044820152606401610b7b565b60015488111561142a5760405162461bcd60e51b815260206004820152601160248201527013dd995c881b585e081c195c8818d85b1b607a1b6044820152606401610b7b565b42866001600160401b031611156114795760405162461bcd60e51b815260206004820152601360248201527214d85b19481a185cdb89dd081cdd185c9d1959606a1b6044820152606401610b7b565b6001600160a01b038916600090815260176020526040812080548a92906114a19084906131d0565b90915550508051156115075787600a826040516114be91906131e3565b908152602001604051809103902060010160008b6001600160a01b03166001600160a01b03168152602001908152602001600020600082825461150191906131ff565b90915550505b61151189896120ed565b505050505050505050565b826daaeb6d7670e522a718067333cd4e3b1561167357336001600160a01b0382160361155e57600061154d336117ce565b111561155e57610d32848484612107565b604051633185c44d60e21b81523060048201523360248201526daaeb6d7670e522a718067333cd4e9063c617113490604401602060405180830381865afa1580156115ad573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115d19190613143565b80156116545750604051633185c44d60e21b81523060048201526001600160a01b03821660248201526daaeb6d7670e522a718067333cd4e9063c617113490604401602060405180830381865afa158015611630573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116549190613143565b61167357604051633b79c77360e21b8152336004820152602401610b7b565b610e57848484612107565b61168661202c565b83600a8383604051611699929190613133565b908152604051908190036020018120919091558390600a906116be9085908590613133565b90815260405190819003602001902060020180546001600160401b039290921667ffffffffffffffff19909216919091179055600b80546001810182556000919091527f0175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01db90161172e828483613258565b5050505050565b6000805482106117935760405162461bcd60e51b815260206004820152602360248201527f455243373231413a20676c6f62616c20696e646578206f7574206f6620626f756044820152626e647360e81b6064820152608401610b7b565b5090565b61179f61202c565b600c6117ab8282613317565b5050565b60006117ba82612122565b5192915050565b600c8054610e88906130f9565b60006001600160a01b0382166117f65760405162461bcd60e51b8152600401610b7b906133d6565b610a4e82612290565b61180761202c565b61181160006122dd565b565b6000806000806000606060115461182960005490565b101561186957600f546013546001600160401b031661184760005490565b60115461185491906131ff565b600054600e54955095509550955095506118bf565b601254600054101561189a576010546013546001600160401b031661188d60005490565b60125461185491906131ff565b6014546013546001600160401b03166118b260005490565b600e5461185491906131ff565b909192939495565b6118cf61202c565b601455565b6118dc61202c565b6016805460ff19166001179055565b6118f361202c565b6013805467ffffffffffffffff19166001600160401b0392909216919091179055565b61191e61202c565b600f55565b606060038054610a8d906130f9565b336001600160a01b0383160361198a5760405162461bcd60e51b815260206004820152601a60248201527f455243373231413a20617070726f766520746f2063616c6c65720000000000006044820152606401610b7b565b3360008181526007602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6119fe61202c565b601880546001600160a01b0319166001600160a01b0392909216919091179055565b836daaeb6d7670e522a718067333cd4e3b15611b7d57336001600160a01b03821603611a68576000611a51336117ce565b1115611a6857611a638585858561232f565b61172e565b604051633185c44d60e21b81523060048201523360248201526daaeb6d7670e522a718067333cd4e9063c617113490604401602060405180830381865afa158015611ab7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611adb9190613143565b8015611b5e5750604051633185c44d60e21b81523060048201526001600160a01b03821660248201526daaeb6d7670e522a718067333cd4e9063c617113490604401602060405180830381865afa158015611b3a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b5e9190613143565b611b7d57604051633b79c77360e21b8152336004820152602401610b7b565b61172e8585858561232f565b611b9161202c565b6016805460ff19169055565b600d8054610e88906130f9565b611bb261202c565b60005b82811015611c365781600a8787604051611bd0929190613133565b90815260200160405180910390206001016000868685818110611bf557611bf5613421565b9050602002016020810190611c0a9190612b9b565b6001600160a01b0316815260208101919091526040016000205580611c2e816131b7565b915050611bb5565b505050505050565b6060611c4b826000541190565b611c975760405162461bcd60e51b815260206004820152601f60248201527f43616e6e6f74207175657279206e6f6e2d6578697374656e7420746f6b656e006044820152606401610b7b565b600c611ca283612362565b600d604051602001611cb6939291906134aa565b6040516020818303038152906040529050919050565b611cd461202c565b601980546001600160601b03909216600160a01b026001600160a01b03909216919091179055565b6000808080808060608169d3c21bcecceda1000000815b600b54811015611ee9576000600b8281548110611d3257611d32613421565b906000526020600020018054611d47906130f9565b80601f0160208091040260200160405190810160405280929190818152602001828054611d73906130f9565b8015611dc05780601f10611d9557610100808354040283529160200191611dc0565b820191906000526020600020905b815481529060010190602001808311611da357829003601f168201915b505050505090506001600a82604051611dd991906131e3565b908152602001604051809103902060010160008e6001600160a01b03166001600160a01b031681526020019081526020016000205410611ed65782600a82604051611e2491906131e3565b908152604051908190036020019020541015611ed157809450600a81604051611e4d91906131e3565b908152604051908190036020018120549b50600a90611e6d9083906131e3565b908152604051908190036020018120600201546001600160401b03169a50600a90611e999083906131e3565b908152602001604051809103902060010160008d6001600160a01b03166001600160a01b031681526020019081526020016000205498505b600193505b5080611ee1816131b7565b915050611d13565b5081611f0757611ef7611813565b949d50929b509099509750945092505b6001600160a01b038a16600090815260176020526040902054899089908990611f2f60005490565b600e549850985098509850985098505050919395979092949650565b611f5361202c565b6001600160a01b038116611fb85760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610b7b565b6111bf816122dd565b60006001600160e01b031982166380ac58cd60e01b1480611ff257506001600160e01b03198216635b5e139f60e01b145b8061200d57506001600160e01b0319821663780e9d6360e01b145b80610a4e57506301ffc9a760e01b6001600160e01b0319831614610a4e565b6009546001600160a01b031633146118115760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610b7b565b60008281526006602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b610cb283838361246a565b6117ab8282604051806020016040528060008152506127ec565b610cb283838360405180602001604052806000815250611a20565b6040805180820190915260008082526020820152612141826000541190565b6121a05760405162461bcd60e51b815260206004820152602a60248201527f455243373231413a206f776e657220717565727920666f72206e6f6e657869736044820152693a32b73a103a37b5b2b760b11b6064820152608401610b7b565b600060015483106121c6576001546121b890846131ff565b6121c39060016131d0565b90505b825b81811061222f576000818152600460209081526040918290208251808401909352546001600160a01b038116808452600160a01b9091046001600160401b0316918301919091521561221c57949350505050565b5080612227816134dd565b9150506121c8565b5060405162461bcd60e51b815260206004820152602f60248201527f455243373231413a20756e61626c6520746f2064657465726d696e652074686560448201526e1037bbb732b91037b3103a37b5b2b760891b6064820152608401610b7b565b60006001600160a01b0382166122b85760405162461bcd60e51b8152600401610b7b906133d6565b506001600160a01b03166000908152600560205260409020546001600160801b031690565b600980546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b61233a84848461246a565b61234684848484612a4b565b610e575760405162461bcd60e51b8152600401610b7b906134f4565b6060816000036123895750506040805180820190915260018152600360fc1b602082015290565b8160005b81156123b3578061239d816131b7565b91506123ac9050600a836131a3565b915061238d565b6000816001600160401b038111156123cd576123cd612dba565b6040519080825280601f01601f1916602001820160405280156123f7576020820181803683370190505b5090505b84156124625761240c6001836131ff565b9150612419600a86613547565b6124249060306131d0565b60f81b81838151811061243957612439613421565b60200101906001600160f81b031916908160001a90535061245b600a866131a3565b94506123fb565b949350505050565b600061247582612122565b80519091506000906001600160a01b0316336001600160a01b031614806124ac5750336124a184610b10565b6001600160a01b0316145b806124be575081516124be90336109d5565b9050806125285760405162461bcd60e51b815260206004820152603260248201527f455243373231413a207472616e736665722063616c6c6572206973206e6f74206044820152711bdddb995c881b9bdc88185c1c1c9bdd995960721b6064820152608401610b7b565b846001600160a01b031682600001516001600160a01b03161461259c5760405162461bcd60e51b815260206004820152602660248201527f455243373231413a207472616e736665722066726f6d20696e636f72726563746044820152651037bbb732b960d11b6064820152608401610b7b565b6001600160a01b0384166126005760405162461bcd60e51b815260206004820152602560248201527f455243373231413a207472616e7366657220746f20746865207a65726f206164604482015264647265737360d81b6064820152608401610b7b565b6126106000848460000151612086565b6001600160a01b03851660009081526005602052604081208054600192906126429084906001600160801b031661355b565b82546101009290920a6001600160801b038181021990931691831602179091556001600160a01b0386166000908152600560205260408120805460019450909261268e91859116613582565b82546001600160801b039182166101009390930a9283029190920219909116179055506040805180820182526001600160a01b0380871682526001600160401b03428116602080850191825260008981526004909152948520935184549151909216600160a01b026001600160e01b031990911691909216171790556127158460016131d0565b6000818152600460205260409020549091506001600160a01b03166127a65761273f816000541190565b156127a65760408051808201825284516001600160a01b0390811682526020808701516001600160401b039081168285019081526000878152600490935294909120925183549451909116600160a01b026001600160e01b03199094169116179190911790555b83856001600160a01b0316876001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611c36565b6000546001600160a01b03841661284f5760405162461bcd60e51b815260206004820152602160248201527f455243373231413a206d696e7420746f20746865207a65726f206164647265736044820152607360f81b6064820152608401610b7b565b61285a816000541190565b156128a75760405162461bcd60e51b815260206004820152601d60248201527f455243373231413a20746f6b656e20616c7265616479206d696e7465640000006044820152606401610b7b565b6001600160a01b0384166000908152600560209081526040918290208251808401845290546001600160801b038082168352600160801b9091041691810191909152815180830190925280519091908190612903908790613582565b6001600160801b031681526020018583602001516129219190613582565b6001600160801b039081169091526001600160a01b0380881660008181526005602090815260408083208751978301518716600160801b029790961696909617909455845180860186529182526001600160401b034281168386019081528883526004909552948120915182549451909516600160a01b026001600160e01b031990941694909216939093179190911790915582905b85811015612a405760405182906001600160a01b038916906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a4612a046000888488612a4b565b612a205760405162461bcd60e51b8152600401610b7b906134f4565b81612a2a816131b7565b9250508080612a38906131b7565b9150506129b7565b506000819055611c36565b60006001600160a01b0384163b15612b4157604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290612a8f9033908990889088906004016135a2565b6020604051808303816000875af1925050508015612aca575060408051601f3d908101601f19168201909252612ac7918101906135df565b60015b612b27573d808015612af8576040519150601f19603f3d011682016040523d82523d6000602084013e612afd565b606091505b508051600003612b1f5760405162461bcd60e51b8152600401610b7b906134f4565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050612462565b506001949350505050565b6001600160e01b0319811681146111bf57600080fd5b600060208284031215612b7457600080fd5b8135612b7f81612b4c565b9392505050565b6001600160a01b03811681146111bf57600080fd5b600060208284031215612bad57600080fd5b8135612b7f81612b86565b60005b83811015612bd3578181015183820152602001612bbb565b50506000910152565b60008151808452612bf4816020860160208601612bb8565b601f01601f19169290920160200192915050565b602081526000612b7f6020830184612bdc565b600060208284031215612c2d57600080fd5b5035919050565b60008060408385031215612c4757600080fd5b8235612c5281612b86565b946020939093013593505050565b60008083601f840112612c7257600080fd5b5081356001600160401b03811115612c8957600080fd5b602083019150836020828501011115610f9e57600080fd5b60008060208385031215612cb457600080fd5b82356001600160401b03811115612cca57600080fd5b612cd685828601612c60565b90969095509350505050565b600080600060608486031215612cf757600080fd5b8335612d0281612b86565b92506020840135612d1281612b86565b929592945050506040919091013590565b60008060408385031215612d3657600080fd5b50508035926020909101359150565b80356001600160401b0381168114612d5c57600080fd5b919050565b60008060008060608587031215612d7757600080fd5b84359350612d8760208601612d45565b925060408501356001600160401b03811115612da257600080fd5b612dae87828801612c60565b95989497509550505050565b634e487b7160e01b600052604160045260246000fd5b60006001600160401b0380841115612dea57612dea612dba565b604051601f8501601f19908116603f01168101908282118183101715612e1257612e12612dba565b81604052809350858152868686011115612e2b57600080fd5b858560208301376000602087830101525050509392505050565b600060208284031215612e5757600080fd5b81356001600160401b03811115612e6d57600080fd5b8201601f81018413612e7e57600080fd5b61246284823560208401612dd0565b8681526001600160401b038616602082015284604082015283606082015282608082015260c060a08201526000612ec760c0830184612bdc565b98975050505050505050565b600060208284031215612ee557600080fd5b612b7f82612d45565b80151581146111bf57600080fd5b60008060408385031215612f0f57600080fd5b8235612f1a81612b86565b91506020830135612f2a81612eee565b809150509250929050565b60008060008060808587031215612f4b57600080fd5b8435612f5681612b86565b93506020850135612f6681612b86565b92506040850135915060608501356001600160401b03811115612f8857600080fd5b8501601f81018713612f9957600080fd5b612fa887823560208401612dd0565b91505092959194509250565b600080600080600060608688031215612fcc57600080fd5b85356001600160401b0380821115612fe357600080fd5b612fef89838a01612c60565b9097509550602088013591508082111561300857600080fd5b818801915088601f83011261301c57600080fd5b81358181111561302b57600080fd5b8960208260051b850101111561304057600080fd5b96999598505060200195604001359392505050565b60006020828403121561306757600080fd5b81356001600160601b0381168114612b7f57600080fd5b8781526001600160401b03871660208201528560408201528460608201528360808201528260a082015260e060c082015260006130be60e0830184612bdc565b9998505050505050505050565b600080604083850312156130de57600080fd5b82356130e981612b86565b91506020830135612f2a81612b86565b600181811c9082168061310d57607f821691505b60208210810361312d57634e487b7160e01b600052602260045260246000fd5b50919050565b8183823760009101908152919050565b60006020828403121561315557600080fd5b8151612b7f81612eee565b634e487b7160e01b600052601160045260246000fd5b8082028115828204841417610a4e57610a4e613160565b634e487b7160e01b600052601260045260246000fd5b6000826131b2576131b261318d565b500490565b6000600182016131c9576131c9613160565b5060010190565b80820180821115610a4e57610a4e613160565b600082516131f5818460208701612bb8565b9190910192915050565b81810381811115610a4e57610a4e613160565b601f821115610cb257600081815260208120601f850160051c810160208610156132395750805b601f850160051c820191505b81811015611c3657828155600101613245565b6001600160401b0383111561326f5761326f612dba565b6132838361327d83546130f9565b83613212565b6000601f8411600181146132b7576000851561329f5750838201355b600019600387901b1c1916600186901b17835561172e565b600083815260209020601f19861690835b828110156132e857868501358255602094850194600190920191016132c8565b50868210156133055760001960f88860031b161c19848701351681555b505060018560011b0183555050505050565b81516001600160401b0381111561333057613330612dba565b6133448161333e84546130f9565b84613212565b602080601f83116001811461337957600084156133615750858301515b600019600386901b1c1916600185901b178555611c36565b600085815260208120601f198616915b828110156133a857888601518255948401946001909101908401613389565b50858210156133c65787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b6020808252602b908201527f455243373231413a2062616c616e636520717565727920666f7220746865207a60408201526a65726f206164647265737360a81b606082015260800190565b634e487b7160e01b600052603260045260246000fd5b60008154613444816130f9565b6001828116801561345c5760018114613471576134a0565b60ff19841687528215158302870194506134a0565b8560005260208060002060005b858110156134975781548a82015290840190820161347e565b50505082870194505b5050505092915050565b60006134b68286613437565b84516134c6818360208901612bb8565b6134d281830186613437565b979650505050505050565b6000816134ec576134ec613160565b506000190190565b60208082526033908201527f455243373231413a207472616e7366657220746f206e6f6e204552433732315260408201527232b1b2b4bb32b91034b6b83632b6b2b73a32b960691b606082015260800190565b6000826135565761355661318d565b500690565b6001600160801b0382811682821603908082111561357b5761357b613160565b5092915050565b6001600160801b0381811683821601908082111561357b5761357b613160565b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906135d590830184612bdc565b9695505050505050565b6000602082840312156135f157600080fd5b8151612b7f81612b4c56fea26469706673582212205eaa9eb853327e346ca984311968fb4f581c91c54844e031595ca9299e8856e764736f6c63430008110033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000032000000000000000000000000000000000000000000000000000000000000001545786f74696373466f756e64657245646974696f6e0000000000000000000000000000000000000000000000000000000000000000000000000000000000000745584f544943530000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000000
-----Decoded View---------------
Arg [0] : _name (string): ExoticsFounderEdition
Arg [1] : _symbol (string): EXOTICS
Arg [2] : _initBaseURI (string):
Arg [3] : maxBatchSize_ (uint256): 50
-----Encoded View---------------
10 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000080
Arg [1] : 00000000000000000000000000000000000000000000000000000000000000c0
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000100
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000032
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000015
Arg [5] : 45786f74696373466f756e64657245646974696f6e0000000000000000000000
Arg [6] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [7] : 45584f5449435300000000000000000000000000000000000000000000000000
Arg [8] : 0000000000000000000000000000000000000000000000000000000000000001
Arg [9] : 2000000000000000000000000000000000000000000000000000000000000000
Deployed Bytecode Sourcemap
68060:10261:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;77521:302;;;;;;;;;;-1:-1:-1;77521:302:0;;;;;:::i;:::-;;:::i;:::-;;;565:14:1;;558:22;540:41;;528:2;513:18;77521:302:0;;;;;;;;76729:122;;;;;;;;;;-1:-1:-1;76729:122:0;;;;;:::i;:::-;;:::i;:::-;;56862:94;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;58387:204::-;;;;;;;;;;-1:-1:-1;58387:204:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;2085:32:1;;;2067:51;;2055:2;2040:18;58387:204:0;1921:203:1;57950:379:0;;;;;;;;;;-1:-1:-1;57950:379:0;;;;;:::i;:::-;;:::i;68679:23::-;;;;;;;;;;-1:-1:-1;68679:23:0;;;;-1:-1:-1;;;;;68679:23:0;;;;;;-1:-1:-1;;;;;2611:31:1;;;2593:50;;2581:2;2566:18;68679:23:0;2449:200:1;70617:131:0;;;;;;;;;;-1:-1:-1;70617:131:0;;;;;:::i;:::-;;:::i;:::-;;;3569:25:1;;;3557:2;3542:18;70617:131:0;3423:177:1;68711:32:0;;;;;;;;;;;;;;;;53692:94;;;;;;;;;;-1:-1:-1;53745:7:0;53768:12;53692:94;;71453:102;;;;;;;;;;-1:-1:-1;71453:102:0;;;;;:::i;:::-;;:::i;69360:163::-;;;;;;;;;;-1:-1:-1;69360:163:0;;;;;:::i;:::-;;:::i;68329:23::-;;;;;;;;;;-1:-1:-1;68329:23:0;;;;;:::i;:::-;;:::i;68750:38::-;;;;;;;;;;;;;;;;77102:312;;;;;;;;;;-1:-1:-1;77102:312:0;;;;;:::i;:::-;;:::i;:::-;;;;-1:-1:-1;;;;;4511:32:1;;;4493:51;;4575:2;4560:18;;4553:34;;;;4466:18;77102:312:0;4319:274:1;72377:114:0;;;;;;;;;;-1:-1:-1;72377:114:0;;;;;:::i;:::-;;:::i;54320:744::-;;;;;;;;;;-1:-1:-1;54320:744:0;;;;;:::i;:::-;;:::i;76294:190::-;;;:::i;75116:1099::-;;;;;;:::i;:::-;;:::i;69531:171::-;;;;;;;;;;-1:-1:-1;69531:171:0;;;;;:::i;:::-;;:::i;70317:227::-;;;;;;;;;;-1:-1:-1;70317:227:0;;;;;:::i;:::-;;:::i;53855:177::-;;;;;;;;;;-1:-1:-1;53855:177:0;;;;;:::i;:::-;;:::i;76562:105::-;;;;;;;;;;-1:-1:-1;76562:105:0;;;;;:::i;:::-;;:::i;68270:52::-;;;;;;;;;;-1:-1:-1;68270:52:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;68270:52:0;;;;;;;6727:25:1;;;-1:-1:-1;;;;;6788:31:1;;;6783:2;6768:18;;6761:59;6700:18;68270:52:0;6555:271:1;68797:26:0;;;;;;;;;;-1:-1:-1;68797:26:0;;;;;;;;56685:118;;;;;;;;;;-1:-1:-1;56685:118:0;;;;;:::i;:::-;;:::i;68399:21::-;;;;;;;;;;;;;:::i;68638:32::-;;;;;;;;;;;;;;;;69946:237;;;;;;;;;;-1:-1:-1;69946:237:0;;;;;:::i;:::-;;:::i;11449:103::-;;;;;;;;;;;;;:::i;73084:656::-;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;:::i;71652:100::-;;;;;;;;;;-1:-1:-1;71652:100:0;;;;;:::i;:::-;;:::i;71846:68::-;;;;;;;;;;;;;:::i;10801:87::-;;;;;;;;;;-1:-1:-1;10874:6:0;;-1:-1:-1;;;;;10874:6:0;10801:87;;72157:101;;;;;;;;;;-1:-1:-1;72157:101:0;;;;;:::i;:::-;;:::i;71255:102::-;;;;;;;;;;-1:-1:-1;71255:102:0;;;;;:::i;:::-;;:::i;57017:98::-;;;;;;;;;;;;;:::i;58655:274::-;;;;;;;;;;-1:-1:-1;58655:274:0;;;;;:::i;:::-;;:::i;68887:31::-;;;;;;;;;;-1:-1:-1;68887:31:0;;;;-1:-1:-1;;;;;68887:31:0;;;72835:106;;;;;;;;;;-1:-1:-1;72835:106:0;;;;;:::i;:::-;;:::i;69710:228::-;;;;;;;;;;-1:-1:-1;69710:228:0;;;;;:::i;:::-;;:::i;71979:69::-;;;;;;;;;;;;;:::i;68427:37::-;;;;;;;;;;;;;:::i;70850:253::-;;;;;;;;;;-1:-1:-1;70850:253:0;;;;;:::i;:::-;;:::i;77879:306::-;;;;;;;;;;-1:-1:-1;77879:306:0;;;;;:::i;:::-;;:::i;76910:126::-;;;;;;;;;;-1:-1:-1;76910:126:0;;;;;:::i;:::-;;:::i;68599:32::-;;;;;;;;;;;;;;;;68471:30;;;;;;;;;;;;;;;;64020:43;;;;;;;;;;;;;;;;68510:37;;;;;;;;;;;;;;;;68554:38;;;;;;;;;;;;;;;;73850:1189;;;;;;;;;;-1:-1:-1;73850:1189:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;;;:::i;72611:111::-;;;;;;;;;;-1:-1:-1;72702:12:0;;72611:111;;58992:186;;;;;;;;;;-1:-1:-1;58992:186:0;;;;;:::i;:::-;-1:-1:-1;;;;;59137:25:0;;;59114:4;59137:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;58992:186;11707:201;;;;;;;;;;-1:-1:-1;11707:201:0;;;;;:::i;:::-;;:::i;77521:302::-;77660:4;-1:-1:-1;;;;;;;;;77686:36:0;;;77682:80;;-1:-1:-1;77746:4:0;;77521:302;-1:-1:-1;77521:302:0:o;77682:80::-;77779:36;77803:11;77779:23;:36::i;:::-;77772:43;77521:302;-1:-1:-1;;77521:302:0:o;76729:122::-;10687:13;:11;:13::i;:::-;76811:14:::1;:32:::0;;-1:-1:-1;;;;;;76811:32:0::1;-1:-1:-1::0;;;;;76811:32:0;;;::::1;::::0;;;::::1;::::0;;76729:122::o;56862:94::-;56916:13;56945:5;56938:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56862:94;:::o;58387:204::-;58455:7;58479:16;58487:7;60293:4;60323:12;-1:-1:-1;60313:22:0;60236:105;58479:16;58471:74;;;;-1:-1:-1;;;58471:74:0;;12354:2:1;58471:74:0;;;12336:21:1;12393:2;12373:18;;;12366:30;12432:34;12412:18;;;12405:62;-1:-1:-1;;;12483:18:1;;;12476:43;12536:19;;58471:74:0;;;;;;;;;-1:-1:-1;58561:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;58561:24:0;;58387:204::o;57950:379::-;58019:13;58035:24;58051:7;58035:15;:24::i;:::-;58019:40;;58080:5;-1:-1:-1;;;;;58074:11:0;:2;-1:-1:-1;;;;;58074:11:0;;58066:58;;;;-1:-1:-1;;;58066:58:0;;12768:2:1;58066:58:0;;;12750:21:1;12807:2;12787:18;;;12780:30;12846:34;12826:18;;;12819:62;-1:-1:-1;;;12897:18:1;;;12890:32;12939:19;;58066:58:0;12566:398:1;58066:58:0;9432:10;-1:-1:-1;;;;;58149:21:0;;;;:62;;-1:-1:-1;58174:37:0;58191:5;9432:10;58992:186;:::i;58174:37::-;58133:153;;;;-1:-1:-1;;;58133:153:0;;13171:2:1;58133:153:0;;;13153:21:1;13210:2;13190:18;;;13183:30;13249:34;13229:18;;;13222:62;13320:27;13300:18;;;13293:55;13365:19;;58133:153:0;12969:421:1;58133:153:0;58295:28;58304:2;58308:7;58317:5;58295:8;:28::i;:::-;58012:317;57950:379;;:::o;70617:131::-;70680:16;70717:13;70731:2;;70717:17;;;;;;;:::i;:::-;;;;;;;;;;;;;;:22;;-1:-1:-1;70617:131:0;;;;:::o;71453:102::-;10687:13;:11;:13::i;:::-;71525:9:::1;:22:::0;71453:102::o;69360:163::-;69461:4;3796:42;4936:43;:47;4932:776;;5223:10;-1:-1:-1;;;;;5215:18:0;;;5211:162;;5282:1;5258:21;5268:10;5258:9;:21::i;:::-;:25;5254:104;;;69478:37:::1;69497:4;69503:2;69507:7;69478:18;:37::i;:::-;5332:7:::0;;5254:104;5433:67;;-1:-1:-1;;;5433:67:0;;5482:4;5433:67;;;13885:34:1;5489:10:0;13935:18:1;;;13928:43;3796:42:0;;5433:40;;13820:18:1;;5433:67:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:157;;;;-1:-1:-1;5529:61:0;;-1:-1:-1;;;5529:61:0;;5578:4;5529:61;;;13885:34:1;-1:-1:-1;;;;;13955:15:1;;13935:18;;;13928:43;3796:42:0;;5529:40;;13820:18:1;;5529:61:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;5387:310;;5651:30;;-1:-1:-1;;;5651:30:0;;5670:10;5651:30;;;2067:51:1;2040:18;;5651:30:0;1921:203:1;5387:310:0;69478:37:::1;69497:4;69503:2;69507:7;69478:18;:37::i;:::-;69360:163:::0;;;;:::o;68329:23::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;77102:312::-;77211:16;77229:21;77276:17;77284:8;60293:4;60323:12;-1:-1:-1;60313:22:0;60236:105;77276:17;77268:61;;;;-1:-1:-1;;;77268:61:0;;14434:2:1;77268:61:0;;;14416:21:1;14473:2;14453:18;;;14446:30;14512:33;14492:18;;;14485:61;14563:18;;77268:61:0;14232:355:1;77268:61:0;77348:14;;-1:-1:-1;;;;;77348:14:0;;;77400:5;;77365:31;;-1:-1:-1;;;77378:18:0;;-1:-1:-1;;;;;77378:18:0;77365:10;:31;:::i;:::-;77364:41;;;;:::i;:::-;77340:66;;;;77102:312;;;;;;:::o;72377:114::-;10687:13;:11;:13::i;:::-;72455:12:::1;:28:::0;72377:114::o;54320:744::-;54429:7;54464:16;54474:5;54464:9;:16::i;:::-;54456:5;:24;54448:71;;;;-1:-1:-1;;;54448:71:0;;15356:2:1;54448:71:0;;;15338:21:1;15395:2;15375:18;;;15368:30;15434:34;15414:18;;;15407:62;-1:-1:-1;;;15485:18:1;;;15478:32;15527:19;;54448:71:0;15154:398:1;54448:71:0;54526:22;53768:12;;;54526:22;;54646:350;54670:14;54666:1;:18;54646:350;;;54700:31;54734:14;;;:11;:14;;;;;;;;;54700:48;;;;;;;;;-1:-1:-1;;;;;54700:48:0;;;;;-1:-1:-1;;;54700:48:0;;;-1:-1:-1;;;;;54700:48:0;;;;;;;;54761:28;54757:89;;54822:14;;;-1:-1:-1;54757:89:0;54879:5;-1:-1:-1;;;;;54858:26:0;:17;-1:-1:-1;;;;;54858:26:0;;54854:135;;54916:5;54901:11;:20;54897:59;;-1:-1:-1;54943:1:0;-1:-1:-1;54936:8:0;;-1:-1:-1;;;54936:8:0;54897:59;54966:13;;;;:::i;:::-;;;;54854:135;-1:-1:-1;54686:3:0;;;;:::i;:::-;;;;54646:350;;;-1:-1:-1;55002:56:0;;-1:-1:-1;;;55002:56:0;;15899:2:1;55002:56:0;;;15881:21:1;15938:2;15918:18;;;15911:30;15977:34;15957:18;;;15950:62;-1:-1:-1;;;16028:18:1;;;16021:44;16082:19;;55002:56:0;15697:410:1;76294:190:0;10687:13;:11;:13::i;:::-;76377:8:::1;::::0;76369:56:::1;::::0;76351:12:::1;::::0;-1:-1:-1;;;;;76377:8:0::1;::::0;76399:21:::1;::::0;76351:12;76369:56;76351:12;76369:56;76399:21;76377:8;76369:56:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;76350:75;;;76444:7;76436:40;;;::::0;-1:-1:-1;;;76436:40:0;;16524:2:1;76436:40:0::1;::::0;::::1;16506:21:1::0;16563:2;16543:18;;;16536:30;-1:-1:-1;;;16582:18:1;;;16575:50;16642:18;;76436:40:0::1;16322:344:1::0;76436:40:0::1;76339:145;76294:190::o:0;75116:1099::-;75212:1;75198:11;:15;75190:49;;;;-1:-1:-1;;;75190:49:0;;16873:2:1;75190:49:0;;;16855:21:1;16912:2;16892:18;;;16885:30;-1:-1:-1;;;16931:18:1;;;16924:51;16992:18;;75190:49:0;16671:345:1;75190:49:0;75289:9;;53745:7;53768:12;75258:27;;:11;:27;:::i;:::-;:40;;75250:80;;;;-1:-1:-1;;;75250:80:0;;17353:2:1;75250:80:0;;;17335:21:1;17392:2;17372:18;;;17365:30;17431:29;17411:18;;;17404:57;17478:18;;75250:80:0;17151:351:1;75250:80:0;75350:6;;;;75349:7;75341:31;;;;-1:-1:-1;;;75341:31:0;;17709:2:1;75341:31:0;;;17691:21:1;17748:2;17728:18;;;17721:30;-1:-1:-1;;;17767:18:1;;;17760:41;17818:18;;75341:31:0;17507:335:1;75341:31:0;75384:16;75402;75420:25;75447:21;75470:19;75491:17;75510:22;75536:17;75549:3;75536:12;:17::i;:::-;75383:170;;;;;;;;;;;;;;75582:7;10874:6;;-1:-1:-1;;;;;10874:6:0;;10801:87;75582:7;-1:-1:-1;;;;;75568:21:0;:10;-1:-1:-1;;;;;75568:21:0;;75564:368;;75627:22;75638:11;75627:8;:22;:::i;:::-;75614:9;:35;;75606:66;;;;-1:-1:-1;;;75606:66:0;;18049:2:1;75606:66:0;;;18031:21:1;18088:2;18068:18;;;18061:30;-1:-1:-1;;;18107:18:1;;;18100:48;18165:18;;75606:66:0;17847:342:1;75606:66:0;75716:11;75695:17;:32;;75687:71;;;;-1:-1:-1;;;75687:71:0;;18396:2:1;75687:71:0;;;18378:21:1;18435:2;18415:18;;;18408:30;18474:28;18454:18;;;18447:56;18520:18;;75687:71:0;18194:350:1;75687:71:0;75812:12;;75781:27;75797:11;75781:13;:27;:::i;:::-;:43;;75773:75;;;;-1:-1:-1;;;75773:75:0;;18751:2:1;75773:75:0;;;18733:21:1;18790:2;18770:18;;;18763:30;-1:-1:-1;;;18809:18:1;;;18802:49;18868:18;;75773:75:0;18549:343:1;75773:75:0;75886:12;;75871:11;:27;;75863:57;;;;-1:-1:-1;;;75863:57:0;;19099:2:1;75863:57:0;;;19081:21:1;19138:2;19118:18;;;19111:30;-1:-1:-1;;;19157:18:1;;;19150:47;19214:18;;75863:57:0;18897:341:1;75863:57:0;75963:15;75950:9;-1:-1:-1;;;;;75950:28:0;;;75942:60;;;;-1:-1:-1;;;75942:60:0;;19445:2:1;75942:60:0;;;19427:21:1;19484:2;19464:18;;;19457:30;-1:-1:-1;;;19503:18:1;;;19496:49;19562:18;;75942:60:0;19243:343:1;75942:60:0;-1:-1:-1;;;;;76015:19:0;;;;;;:14;:19;;;;;:34;;76038:11;;76015:19;:34;;76038:11;;76015:34;:::i;:::-;;;;-1:-1:-1;;76064:22:0;;:26;76060:108;;76145:11;76107:13;76121:8;76107:23;;;;;;:::i;:::-;;;;;;;;;;;;;:29;;:34;76137:3;-1:-1:-1;;;;;76107:34:0;-1:-1:-1;;;;;76107:34:0;;;;;;;;;;;;;:49;;;;;;;:::i;:::-;;;;-1:-1:-1;;76060:108:0;76178:27;76188:3;76193:11;76178:9;:27::i;:::-;75179:1036;;;;;;;75116:1099;;:::o;69531:171::-;69636:4;3796:42;4936:43;:47;4932:776;;5223:10;-1:-1:-1;;;;;5215:18:0;;;5211:162;;5282:1;5258:21;5268:10;5258:9;:21::i;:::-;:25;5254:104;;;69653:41:::1;69676:4;69682:2;69686:7;69653:22;:41::i;5254:104::-:0;5433:67;;-1:-1:-1;;;5433:67:0;;5482:4;5433:67;;;13885:34:1;5489:10:0;13935:18:1;;;13928:43;3796:42:0;;5433:40;;13820:18:1;;5433:67:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:157;;;;-1:-1:-1;5529:61:0;;-1:-1:-1;;;5529:61:0;;5578:4;5529:61;;;13885:34:1;-1:-1:-1;;;;;13955:15:1;;13935:18;;;13928:43;3796:42:0;;5529:40;;13820:18:1;;5529:61:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;5387:310;;5651:30;;-1:-1:-1;;;5651:30:0;;5670:10;5651:30;;;2067:51:1;2040:18;;5651:30:0;1921:203:1;5387:310:0;69653:41:::1;69676:4;69682:2;69686:7;69653:22;:41::i;70317:227::-:0;10687:13;:11;:13::i;:::-;70447:9:::1;70421:13;70435:3;;70421:18;;;;;;;:::i;:::-;::::0;;;::::1;::::0;;;;;::::1;::::0;;;:35;;;;70498:10;;70467:13:::1;::::0;:18:::1;::::0;70481:3;;;;70467:18:::1;:::i;:::-;::::0;;;::::1;::::0;;;;;::::1;::::0;;;:28:::1;;:41:::0;;-1:-1:-1;;;;;70467:41:0;;;::::1;-1:-1:-1::0;;70467:41:0;;::::1;::::0;;;::::1;::::0;;70519:7:::1;:17:::0;;70467:41;70519:17;::::1;::::0;;70467:28:::1;70519:17:::0;;;;;::::1;;70532:3:::0;;70519:17;::::1;:::i;:::-;;70317:227:::0;;;;:::o;53855:177::-;53922:7;53768:12;;53946:5;:21;53938:69;;;;-1:-1:-1;;;53938:69:0;;22278:2:1;53938:69:0;;;22260:21:1;22317:2;22297:18;;;22290:30;22356:34;22336:18;;;22329:62;-1:-1:-1;;;22407:18:1;;;22400:33;22450:19;;53938:69:0;22076:399:1;53938:69:0;-1:-1:-1;54021:5:0;53855:177::o;76562:105::-;10687:13;:11;:13::i;:::-;76637:7:::1;:21;76647:11:::0;76637:7;:21:::1;:::i;:::-;;76562:105:::0;:::o;56685:118::-;56749:7;56772:20;56784:7;56772:11;:20::i;:::-;:25;;56685:118;-1:-1:-1;;56685:118:0:o;68399:21::-;;;;;;;:::i;69946:237::-;70040:7;-1:-1:-1;;;;;70068:19:0;;70060:75;;;;-1:-1:-1;;;70060:75:0;;;;;;;:::i;:::-;70153:22;70169:5;70153:15;:22::i;11449:103::-;10687:13;:11;:13::i;:::-;11514:30:::1;11541:1;11514:18;:30::i;:::-;11449:103::o:0;73084:656::-;73148:13;73163:17;73182:25;73209:23;73234:18;73254:21;73313:12;;73297:13;53745:7;53768:12;;53692:94;73297:13;:28;73293:437;;;73349:9;;73360;;-1:-1:-1;;;;;73360:9:0;73386:13;53745:7;53768:12;;53692:94;73386:13;73371:12;;:28;;;;:::i;:::-;53745:7;53768:12;73416:9;;73341:94;;;;;;;;;;;;73293:437;73482:12;;53745:7;53768:12;73466:28;73462:268;;;73518:9;;73529;;-1:-1:-1;;;;;73529:9:0;73555:13;53745:7;53768:12;;53692:94;73555:13;73540:12;;:28;;;;:::i;73462:268::-;73652:4;;73658:9;;-1:-1:-1;;;;;73658:9:0;73681:13;53745:7;53768:12;;53692:94;73681:13;73669:9;;:25;;;;:::i;73462:268::-;73084:656;;;;;;:::o;71652:100::-;10687:13;:11;:13::i;:::-;71726:4:::1;:18:::0;71652:100::o;71846:68::-;10687:13;:11;:13::i;:::-;71893:6:::1;:13:::0;;-1:-1:-1;;71893:13:0::1;71902:4;71893:13;::::0;;71846:68::o;72157:101::-;10687:13;:11;:13::i;:::-;72228:9:::1;:22:::0;;-1:-1:-1;;72228:22:0::1;-1:-1:-1::0;;;;;72228:22:0;;;::::1;::::0;;;::::1;::::0;;72157:101::o;71255:102::-;10687:13;:11;:13::i;:::-;71327:9:::1;:22:::0;71255:102::o;57017:98::-;57073:13;57102:7;57095:14;;;;;:::i;58655:274::-;9432:10;-1:-1:-1;;;;;58746:24:0;;;58738:63;;;;-1:-1:-1;;;58738:63:0;;24451:2:1;58738:63:0;;;24433:21:1;24490:2;24470:18;;;24463:30;24529:28;24509:18;;;24502:56;24575:18;;58738:63:0;24249:350:1;58738:63:0;9432:10;58810:32;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;58810:42:0;;;;;;;;;;;;:53;;-1:-1:-1;;58810:53:0;;;;;;;;;;58875:48;;540:41:1;;;58810:42:0;;9432:10;58875:48;;513:18:1;58875:48:0;;;;;;;58655:274;;:::o;72835:106::-;10687:13;:11;:13::i;:::-;72913:8:::1;:20:::0;;-1:-1:-1;;;;;;72913:20:0::1;-1:-1:-1::0;;;;;72913:20:0;;;::::1;::::0;;;::::1;::::0;;72835:106::o;69710:228::-;69861:4;3796:42;4936:43;:47;4932:776;;5223:10;-1:-1:-1;;;;;5215:18:0;;;5211:162;;5282:1;5258:21;5268:10;5258:9;:21::i;:::-;:25;5254:104;;;69883:47:::1;69906:4;69912:2;69916:7;69925:4;69883:22;:47::i;:::-;5332:7:::0;;5254:104;5433:67;;-1:-1:-1;;;5433:67:0;;5482:4;5433:67;;;13885:34:1;5489:10:0;13935:18:1;;;13928:43;3796:42:0;;5433:40;;13820:18:1;;5433:67:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:157;;;;-1:-1:-1;5529:61:0;;-1:-1:-1;;;5529:61:0;;5578:4;5529:61;;;13885:34:1;-1:-1:-1;;;;;13955:15:1;;13935:18;;;13928:43;3796:42:0;;5529:40;;13820:18:1;;5529:61:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;5387:310;;5651:30;;-1:-1:-1;;;5651:30:0;;5670:10;5651:30;;;2067:51:1;2040:18;;5651:30:0;1921:203:1;5387:310:0;69883:47:::1;69906:4;69912:2;69916:7;69925:4;69883:22;:47::i;71979:69::-:0;10687:13;:11;:13::i;:::-;72026:6:::1;:14:::0;;-1:-1:-1;;72026:14:0::1;::::0;;71979:69::o;68427:37::-;;;;;;;:::i;70850:253::-;10687:13;:11;:13::i;:::-;70983:9:::1;70978:118;70994:20:::0;;::::1;70978:118;;;71076:8;71036:13;71050:2;;71036:17;;;;;;;:::i;:::-;;;;;;;;;;;;;:23;;:37;71060:9;;71070:1;71060:12;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;71036:37:0::1;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;71036:37:0;:48;71016:3;::::1;::::0;::::1;:::i;:::-;;;;70978:118;;;;70850:253:::0;;;;;:::o;77879:306::-;77998:13;78037:17;78045:8;60293:4;60323:12;-1:-1:-1;60313:22:0;60236:105;78037:17;78029:61;;;;-1:-1:-1;;;78029:61:0;;14434:2:1;78029:61:0;;;14416:21:1;14473:2;14453:18;;;14446:30;14512:33;14492:18;;;14485:61;14563:18;;78029:61:0;14232:355:1;78029:61:0;78132:7;78141:19;:8;:17;:19::i;:::-;78162:13;78115:61;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;78101:76;;77879:306;;;:::o;76910:126::-;10687:13;:11;:13::i;:::-;76988:18:::1;:40:::0;;-1:-1:-1;;;;;76988:40:0;;::::1;-1:-1:-1::0;;;76988:40:0::1;-1:-1:-1::0;;;;;76988:40:0;;::::1;::::0;;;::::1;::::0;;76910:126::o;73850:1189::-;73933:13;;;;;;74060:21;73933:13;74153:25;73933:13;74195:569;74215:7;:14;74211:18;;74195:569;;;74255:20;74278:7;74286:1;74278:10;;;;;;;;:::i;:::-;;;;;;;;74255:33;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;74347:1;74311:13;74325:6;74311:21;;;;;;:::i;:::-;;;;;;;;;;;;;:27;;:32;74339:3;-1:-1:-1;;;;;74311:32:0;-1:-1:-1;;;;;74311:32:0;;;;;;;;;;;;;:37;74307:442;;74406:8;74377:13;74391:6;74377:21;;;;;;:::i;:::-;;;;;;;;;;;;;;:26;:37;74373:321;;;74453:6;74443:16;;74494:13;74508:6;74494:21;;;;;;:::i;:::-;;;;;;;;;;;;;;:26;;-1:-1:-1;74560:13:0;;:21;;74574:6;;74560:21;:::i;:::-;;;;;;;;;;;;;;:31;;;-1:-1:-1;;;;;74560:31:0;;-1:-1:-1;74638:13:0;;:21;;74652:6;;74638:21;:::i;:::-;;;;;;;;;;;;;:27;;:32;74666:3;-1:-1:-1;;;;;74638:32:0;-1:-1:-1;;;;;74638:32:0;;;;;;;;;;;;;74618:52;;74373:321;74725:4;74716:13;;74307:442;-1:-1:-1;74231:3:0;;;;:::i;:::-;;;;74195:569;;;;74785:6;74780:132;;74890:6;:4;:6::i;:::-;74811:85;;-1:-1:-1;74811:85:0;;-1:-1:-1;74811:85:0;;-1:-1:-1;74811:85:0;-1:-1:-1;74811:85:0;-1:-1:-1;74811:85:0;-1:-1:-1;74780:132:0;-1:-1:-1;;;;;74974:19:0;;;;;;:14;:19;;;;;;74936:5;;74943:10;;74955:17;;74995:13;53745:7;53768:12;;53692:94;74995:13;75010:9;;74928:101;;;;;;;;;;;;;;73850:1189;;;;;;;;;:::o;11707:201::-;10687:13;:11;:13::i;:::-;-1:-1:-1;;;;;11796:22:0;::::1;11788:73;;;::::0;-1:-1:-1;;;11788:73:0;;26139:2:1;11788:73:0::1;::::0;::::1;26121:21:1::0;26178:2;26158:18;;;26151:30;26217:34;26197:18;;;26190:62;-1:-1:-1;;;26268:18:1;;;26261:36;26314:19;;11788:73:0::1;25937:402:1::0;11788:73:0::1;11872:28;11891:8;11872:18;:28::i;55128:370::-:0;55255:4;-1:-1:-1;;;;;;55285:40:0;;-1:-1:-1;;;55285:40:0;;:99;;-1:-1:-1;;;;;;;55336:48:0;;-1:-1:-1;;;55336:48:0;55285:99;:160;;;-1:-1:-1;;;;;;;55395:50:0;;-1:-1:-1;;;55395:50:0;55285:160;:207;;;-1:-1:-1;;;;;;;;;;24662:40:0;;;55456:36;24553:157;10966:132;10874:6;;-1:-1:-1;;;;;10874:6:0;9432:10;11030:23;11022:68;;;;-1:-1:-1;;;11022:68:0;;26546:2:1;11022:68:0;;;26528:21:1;;;26565:18;;;26558:30;26624:34;26604:18;;;26597:62;26676:18;;11022:68:0;26344:356:1;63842:172:0;63939:24;;;;:15;:24;;;;;;:29;;-1:-1:-1;;;;;;63939:29:0;-1:-1:-1;;;;;63939:29:0;;;;;;;;;63980:28;;63939:24;;63980:28;;;;;;;63842:172;;;:::o;59237:150::-;59353:28;59363:4;59369:2;59373:7;59353:9;:28::i;60347:98::-;60412:27;60422:2;60426:8;60412:27;;;;;;;;;;;;:9;:27::i;59450:165::-;59570:39;59587:4;59593:2;59597:7;59570:39;;;;;;;;;;;;:16;:39::i;56025:606::-;-1:-1:-1;;;;;;;;;;;;;;;;;56142:16:0;56150:7;60293:4;60323:12;-1:-1:-1;60313:22:0;60236:105;56142:16;56134:71;;;;-1:-1:-1;;;56134:71:0;;26907:2:1;56134:71:0;;;26889:21:1;26946:2;26926:18;;;26919:30;26985:34;26965:18;;;26958:62;-1:-1:-1;;;27036:18:1;;;27029:40;27086:19;;56134:71:0;26705:406:1;56134:71:0;56214:26;56262:12;;56251:7;:23;56247:93;;56316:12;;56306:22;;:7;:22;:::i;:::-;:26;;56331:1;56306:26;:::i;:::-;56285:47;;56247:93;56368:7;56348:212;56385:18;56377:4;:26;56348:212;;56422:31;56456:17;;;:11;:17;;;;;;;;;56422:51;;;;;;;;;-1:-1:-1;;;;;56422:51:0;;;;;-1:-1:-1;;;56422:51:0;;;-1:-1:-1;;;;;56422:51:0;;;;;;;;56486:28;56482:71;;56534:9;56025:606;-1:-1:-1;;;;56025:606:0:o;56482:71::-;-1:-1:-1;56405:6:0;;;;:::i;:::-;;;;56348:212;;;-1:-1:-1;56568:57:0;;-1:-1:-1;;;56568:57:0;;27459:2:1;56568:57:0;;;27441:21:1;27498:2;27478:18;;;27471:30;27537:34;27517:18;;;27510:62;-1:-1:-1;;;27588:18:1;;;27581:45;27643:19;;56568:57:0;27257:411:1;55554:219:0;55626:7;-1:-1:-1;;;;;55650:19:0;;55642:75;;;;-1:-1:-1;;;55642:75:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;;55739:19:0;;;;;:12;:19;;;;;:27;-1:-1:-1;;;;;55739:27:0;;55554:219::o;12068:191::-;12161:6;;;-1:-1:-1;;;;;12178:17:0;;;-1:-1:-1;;;;;;12178:17:0;;;;;;;12211:40;;12161:6;;;12178:17;12161:6;;12211:40;;12142:16;;12211:40;12131:128;12068:191;:::o;59678:319::-;59823:28;59833:4;59839:2;59843:7;59823:9;:28::i;:::-;59874:48;59897:4;59903:2;59907:7;59916:5;59874:22;:48::i;:::-;59858:133;;;;-1:-1:-1;;;59858:133:0;;;;;;;:::i;6606:723::-;6662:13;6883:5;6892:1;6883:10;6879:53;;-1:-1:-1;;6910:10:0;;;;;;;;;;;;-1:-1:-1;;;6910:10:0;;;;;6606:723::o;6879:53::-;6957:5;6942:12;6998:78;7005:9;;6998:78;;7031:8;;;;:::i;:::-;;-1:-1:-1;7054:10:0;;-1:-1:-1;7062:2:0;7054:10;;:::i;:::-;;;6998:78;;;7086:19;7118:6;-1:-1:-1;;;;;7108:17:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;7108:17:0;;7086:39;;7136:154;7143:10;;7136:154;;7170:11;7180:1;7170:11;;:::i;:::-;;-1:-1:-1;7239:10:0;7247:2;7239:5;:10;:::i;:::-;7226:24;;:2;:24;:::i;:::-;7213:39;;7196:6;7203;7196:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;7196:56:0;;;;;;;;-1:-1:-1;7267:11:0;7276:2;7267:11;;:::i;:::-;;;7136:154;;;7314:6;6606:723;-1:-1:-1;;;;6606:723:0:o;62207:1529::-;62304:35;62342:20;62354:7;62342:11;:20::i;:::-;62413:18;;62304:58;;-1:-1:-1;62371:22:0;;-1:-1:-1;;;;;62397:34:0;9432:10;-1:-1:-1;;;;;62397:34:0;;:81;;;-1:-1:-1;9432:10:0;62442:20;62454:7;62442:11;:20::i;:::-;-1:-1:-1;;;;;62442:36:0;;62397:81;:142;;;-1:-1:-1;62506:18:0;;62489:50;;9432:10;58992:186;:::i;62489:50::-;62371:169;;62565:17;62549:101;;;;-1:-1:-1;;;62549:101:0;;28412:2:1;62549:101:0;;;28394:21:1;28451:2;28431:18;;;28424:30;28490:34;28470:18;;;28463:62;-1:-1:-1;;;28541:18:1;;;28534:48;28599:19;;62549:101:0;28210:414:1;62549:101:0;62697:4;-1:-1:-1;;;;;62675:26:0;:13;:18;;;-1:-1:-1;;;;;62675:26:0;;62659:98;;;;-1:-1:-1;;;62659:98:0;;28831:2:1;62659:98:0;;;28813:21:1;28870:2;28850:18;;;28843:30;28909:34;28889:18;;;28882:62;-1:-1:-1;;;28960:18:1;;;28953:36;29006:19;;62659:98:0;28629:402:1;62659:98:0;-1:-1:-1;;;;;62772:16:0;;62764:66;;;;-1:-1:-1;;;62764:66:0;;29238:2:1;62764:66:0;;;29220:21:1;29277:2;29257:18;;;29250:30;29316:34;29296:18;;;29289:62;-1:-1:-1;;;29367:18:1;;;29360:35;29412:19;;62764:66:0;29036:401:1;62764:66:0;62939:49;62956:1;62960:7;62969:13;:18;;;62939:8;:49::i;:::-;-1:-1:-1;;;;;62997:18:0;;;;;;:12;:18;;;;;:31;;63027:1;;62997:18;:31;;63027:1;;-1:-1:-1;;;;;62997:31:0;;:::i;:::-;;;;;;;;-1:-1:-1;;;;;62997:31:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;63035:16:0;;-1:-1:-1;63035:16:0;;;:12;:16;;;;;:29;;-1:-1:-1;;;63035:16:0;;:29;;-1:-1:-1;;63035:29:0;;:::i;:::-;;;-1:-1:-1;;;;;63035:29:0;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;63094:43:0;;;;;;;;-1:-1:-1;;;;;63094:43:0;;;;;-1:-1:-1;;;;;63120:15:0;63094:43;;;;;;;;;-1:-1:-1;63071:20:0;;;:11;:20;;;;;;:66;;;;;;;;;-1:-1:-1;;;63071:66:0;-1:-1:-1;;;;;;63071:66:0;;;;;;;;;;;63387:11;63083:7;-1:-1:-1;63387:11:0;:::i;:::-;63450:1;63409:24;;;:11;:24;;;;;:29;63365:33;;-1:-1:-1;;;;;;63409:29:0;63405:236;;63467:20;63475:11;60293:4;60323:12;-1:-1:-1;60313:22:0;60236:105;63467:20;63463:171;;;63527:97;;;;;;;;63554:18;;-1:-1:-1;;;;;63527:97:0;;;;;;63585:28;;;;-1:-1:-1;;;;;63527:97:0;;;;;;;;;-1:-1:-1;63500:24:0;;;:11;:24;;;;;;;:124;;;;;;;;;-1:-1:-1;;;63500:124:0;-1:-1:-1;;;;;;63500:124:0;;;;;;;;;;;;63463:171;63673:7;63669:2;-1:-1:-1;;;;;63654:27:0;63663:4;-1:-1:-1;;;;;63654:27:0;;;;;;;;;;;63688:42;69360:163;60700:1275;60805:20;60828:12;-1:-1:-1;;;;;60855:16:0;;60847:62;;;;-1:-1:-1;;;60847:62:0;;30051:2:1;60847:62:0;;;30033:21:1;30090:2;30070:18;;;30063:30;30129:34;30109:18;;;30102:62;-1:-1:-1;;;30180:18:1;;;30173:31;30221:19;;60847:62:0;29849:397:1;60847:62:0;61046:21;61054:12;60293:4;60323:12;-1:-1:-1;60313:22:0;60236:105;61046:21;61045:22;61037:64;;;;-1:-1:-1;;;61037:64:0;;30453:2:1;61037:64:0;;;30435:21:1;30492:2;30472:18;;;30465:30;30531:31;30511:18;;;30504:59;30580:18;;61037:64:0;30251:353:1;61037:64:0;-1:-1:-1;;;;;61294:16:0;;61261:30;61294:16;;;:12;:16;;;;;;;;;61261:49;;;;;;;;;-1:-1:-1;;;;;61261:49:0;;;;;-1:-1:-1;;;61261:49:0;;;;;;;;;;;61336:119;;;;;;;;61356:19;;61261:49;;61336:119;;;61356:39;;61386:8;;61356:39;:::i;:::-;-1:-1:-1;;;;;61336:119:0;;;;;61439:8;61404:11;:24;;;:44;;;;:::i;:::-;-1:-1:-1;;;;;61336:119:0;;;;;;-1:-1:-1;;;;;61317:16:0;;;;;;;:12;:16;;;;;;;;:138;;;;;;;;-1:-1:-1;;;61317:138:0;;;;;;;;;;;;61490:43;;;;;;;;;;-1:-1:-1;;;;;61516:15:0;61490:43;;;;;;;;61462:25;;;:11;:25;;;;;;:71;;;;;;;;;-1:-1:-1;;;61462:71:0;-1:-1:-1;;;;;;61462:71:0;;;;;;;;;;;;;;;;;;61474:12;;61586:281;61610:8;61606:1;:12;61586:281;;;61639:38;;61664:12;;-1:-1:-1;;;;;61639:38:0;;;61656:1;;61639:38;;61656:1;;61639:38;61704:59;61735:1;61739:2;61743:12;61757:5;61704:22;:59::i;:::-;61686:150;;;;-1:-1:-1;;;61686:150:0;;;;;;;:::i;:::-;61845:14;;;;:::i;:::-;;;;61620:3;;;;;:::i;:::-;;;;61586:281;;;-1:-1:-1;61875:12:0;:27;;;61909:60;69360:163;65553:690;65690:4;-1:-1:-1;;;;;65707:13:0;;13794:19;:23;65703:535;;65746:72;;-1:-1:-1;;;65746:72:0;;-1:-1:-1;;;;;65746:36:0;;;;;:72;;9432:10;;65797:4;;65803:7;;65812:5;;65746:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;65746:72:0;;;;;;;;-1:-1:-1;;65746:72:0;;;;;;;;;;;;:::i;:::-;;;65733:464;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;65977:6;:13;65994:1;65977:18;65973:215;;66010:61;;-1:-1:-1;;;66010:61:0;;;;;;;:::i;65973:215::-;66156:6;66150:13;66141:6;66137:2;66133:15;66126:38;65733:464;-1:-1:-1;;;;;;65868:55:0;-1:-1:-1;;;65868:55:0;;-1:-1:-1;65861:62:0;;65703:535;-1:-1:-1;66226:4:0;65553:690;;;;;;:::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;:::-;384:5;150:245;-1:-1:-1;;;150:245:1:o;592:131::-;-1:-1:-1;;;;;667:31:1;;657:42;;647:70;;713:1;710;703:12;728:247;787:6;840:2;828:9;819:7;815:23;811:32;808:52;;;856:1;853;846:12;808:52;895:9;882:23;914:31;939:5;914:31;:::i;980:250::-;1065:1;1075:113;1089:6;1086:1;1083:13;1075:113;;;1165:11;;;1159:18;1146:11;;;1139:39;1111:2;1104:10;1075:113;;;-1:-1:-1;;1222:1:1;1204:16;;1197:27;980:250::o;1235:271::-;1277:3;1315:5;1309:12;1342:6;1337:3;1330:19;1358:76;1427:6;1420:4;1415:3;1411:14;1404:4;1397:5;1393:16;1358:76;:::i;:::-;1488:2;1467:15;-1:-1:-1;;1463:29:1;1454:39;;;;1495:4;1450:50;;1235:271;-1:-1:-1;;1235:271:1:o;1511:220::-;1660:2;1649:9;1642:21;1623:4;1680:45;1721:2;1710:9;1706:18;1698:6;1680:45;:::i;1736:180::-;1795:6;1848:2;1836:9;1827:7;1823:23;1819:32;1816:52;;;1864:1;1861;1854:12;1816:52;-1:-1:-1;1887:23:1;;1736:180;-1:-1:-1;1736:180:1:o;2129:315::-;2197:6;2205;2258:2;2246:9;2237:7;2233:23;2229:32;2226:52;;;2274:1;2271;2264:12;2226:52;2313:9;2300:23;2332:31;2357:5;2332:31;:::i;:::-;2382:5;2434:2;2419:18;;;;2406:32;;-1:-1:-1;;;2129:315:1:o;2654:348::-;2706:8;2716:6;2770:3;2763:4;2755:6;2751:17;2747:27;2737:55;;2788:1;2785;2778:12;2737:55;-1:-1:-1;2811:20:1;;-1:-1:-1;;;;;2843:30:1;;2840:50;;;2886:1;2883;2876:12;2840:50;2923:4;2915:6;2911:17;2899:29;;2975:3;2968:4;2959:6;2951;2947:19;2943:30;2940:39;2937:59;;;2992:1;2989;2982:12;3007:411;3078:6;3086;3139:2;3127:9;3118:7;3114:23;3110:32;3107:52;;;3155:1;3152;3145:12;3107:52;3195:9;3182:23;-1:-1:-1;;;;;3220:6:1;3217:30;3214:50;;;3260:1;3257;3250:12;3214:50;3299:59;3350:7;3341:6;3330:9;3326:22;3299:59;:::i;:::-;3377:8;;3273:85;;-1:-1:-1;3007:411:1;-1:-1:-1;;;;3007:411:1:o;3605:456::-;3682:6;3690;3698;3751:2;3739:9;3730:7;3726:23;3722:32;3719:52;;;3767:1;3764;3757:12;3719:52;3806:9;3793:23;3825:31;3850:5;3825:31;:::i;:::-;3875:5;-1:-1:-1;3932:2:1;3917:18;;3904:32;3945:33;3904:32;3945:33;:::i;:::-;3605:456;;3997:7;;-1:-1:-1;;;4051:2:1;4036:18;;;;4023:32;;3605:456::o;4066:248::-;4134:6;4142;4195:2;4183:9;4174:7;4170:23;4166:32;4163:52;;;4211:1;4208;4201:12;4163:52;-1:-1:-1;;4234:23:1;;;4304:2;4289:18;;;4276:32;;-1:-1:-1;4066:248:1:o;4598:171::-;4665:20;;-1:-1:-1;;;;;4714:30:1;;4704:41;;4694:69;;4759:1;4756;4749:12;4694:69;4598:171;;;:::o;4774:551::-;4862:6;4870;4878;4886;4939:2;4927:9;4918:7;4914:23;4910:32;4907:52;;;4955:1;4952;4945:12;4907:52;4991:9;4978:23;4968:33;;5020:37;5053:2;5042:9;5038:18;5020:37;:::i;:::-;5010:47;;5108:2;5097:9;5093:18;5080:32;-1:-1:-1;;;;;5127:6:1;5124:30;5121:50;;;5167:1;5164;5157:12;5121:50;5206:59;5257:7;5248:6;5237:9;5233:22;5206:59;:::i;:::-;4774:551;;;;-1:-1:-1;5284:8:1;-1:-1:-1;;;;4774:551:1:o;5330:127::-;5391:10;5386:3;5382:20;5379:1;5372:31;5422:4;5419:1;5412:15;5446:4;5443:1;5436:15;5462:632;5527:5;-1:-1:-1;;;;;5598:2:1;5590:6;5587:14;5584:40;;;5604:18;;:::i;:::-;5679:2;5673:9;5647:2;5733:15;;-1:-1:-1;;5729:24:1;;;5755:2;5725:33;5721:42;5709:55;;;5779:18;;;5799:22;;;5776:46;5773:72;;;5825:18;;:::i;:::-;5865:10;5861:2;5854:22;5894:6;5885:15;;5924:6;5916;5909:22;5964:3;5955:6;5950:3;5946:16;5943:25;5940:45;;;5981:1;5978;5971:12;5940:45;6031:6;6026:3;6019:4;6011:6;6007:17;5994:44;6086:1;6079:4;6070:6;6062;6058:19;6054:30;6047:41;;;;5462:632;;;;;:::o;6099:451::-;6168:6;6221:2;6209:9;6200:7;6196:23;6192:32;6189:52;;;6237:1;6234;6227:12;6189:52;6277:9;6264:23;-1:-1:-1;;;;;6302:6:1;6299:30;6296:50;;;6342:1;6339;6332:12;6296:50;6365:22;;6418:4;6410:13;;6406:27;-1:-1:-1;6396:55:1;;6447:1;6444;6437:12;6396:55;6470:74;6536:7;6531:2;6518:16;6513:2;6509;6505:11;6470:74;:::i;6831:602::-;7118:6;7107:9;7100:25;-1:-1:-1;;;;;7165:6:1;7161:31;7156:2;7145:9;7141:18;7134:59;7229:6;7224:2;7213:9;7209:18;7202:34;7272:6;7267:2;7256:9;7252:18;7245:34;7316:6;7310:3;7299:9;7295:19;7288:35;7360:3;7354;7343:9;7339:19;7332:32;7081:4;7381:46;7422:3;7411:9;7407:19;7399:6;7381:46;:::i;:::-;7373:54;6831:602;-1:-1:-1;;;;;;;;6831:602:1:o;7438:184::-;7496:6;7549:2;7537:9;7528:7;7524:23;7520:32;7517:52;;;7565:1;7562;7555:12;7517:52;7588:28;7606:9;7588:28;:::i;7627:118::-;7713:5;7706:13;7699:21;7692:5;7689:32;7679:60;;7735:1;7732;7725:12;7750:382;7815:6;7823;7876:2;7864:9;7855:7;7851:23;7847:32;7844:52;;;7892:1;7889;7882:12;7844:52;7931:9;7918:23;7950:31;7975:5;7950:31;:::i;:::-;8000:5;-1:-1:-1;8057:2:1;8042:18;;8029:32;8070:30;8029:32;8070:30;:::i;:::-;8119:7;8109:17;;;7750:382;;;;;:::o;8621:795::-;8716:6;8724;8732;8740;8793:3;8781:9;8772:7;8768:23;8764:33;8761:53;;;8810:1;8807;8800:12;8761:53;8849:9;8836:23;8868:31;8893:5;8868:31;:::i;:::-;8918:5;-1:-1:-1;8975:2:1;8960:18;;8947:32;8988:33;8947:32;8988:33;:::i;:::-;9040:7;-1:-1:-1;9094:2:1;9079:18;;9066:32;;-1:-1:-1;9149:2:1;9134:18;;9121:32;-1:-1:-1;;;;;9165:30:1;;9162:50;;;9208:1;9205;9198:12;9162:50;9231:22;;9284:4;9276:13;;9272:27;-1:-1:-1;9262:55:1;;9313:1;9310;9303:12;9262:55;9336:74;9402:7;9397:2;9384:16;9379:2;9375;9371:11;9336:74;:::i;:::-;9326:84;;;8621:795;;;;;;;:::o;9421:972::-;9537:6;9545;9553;9561;9569;9622:2;9610:9;9601:7;9597:23;9593:32;9590:52;;;9638:1;9635;9628:12;9590:52;9678:9;9665:23;-1:-1:-1;;;;;9748:2:1;9740:6;9737:14;9734:34;;;9764:1;9761;9754:12;9734:34;9803:59;9854:7;9845:6;9834:9;9830:22;9803:59;:::i;:::-;9881:8;;-1:-1:-1;9777:85:1;-1:-1:-1;9969:2:1;9954:18;;9941:32;;-1:-1:-1;9985:16:1;;;9982:36;;;10014:1;10011;10004:12;9982:36;10052:8;10041:9;10037:24;10027:34;;10099:7;10092:4;10088:2;10084:13;10080:27;10070:55;;10121:1;10118;10111:12;10070:55;10161:2;10148:16;10187:2;10179:6;10176:14;10173:34;;;10203:1;10200;10193:12;10173:34;10256:7;10251:2;10241:6;10238:1;10234:14;10230:2;10226:23;10222:32;10219:45;10216:65;;;10277:1;10274;10267:12;10216:65;9421:972;;;;-1:-1:-1;;10308:2:1;10300:11;;10383:2;10368:18;10355:32;;9421:972;-1:-1:-1;;;9421:972:1:o;10398:292::-;10456:6;10509:2;10497:9;10488:7;10484:23;10480:32;10477:52;;;10525:1;10522;10515:12;10477:52;10564:9;10551:23;-1:-1:-1;;;;;10607:5:1;10603:38;10596:5;10593:49;10583:77;;10656:1;10653;10646:12;10695:674;11010:6;10999:9;10992:25;-1:-1:-1;;;;;11057:6:1;11053:31;11048:2;11037:9;11033:18;11026:59;11121:6;11116:2;11105:9;11101:18;11094:34;11164:6;11159:2;11148:9;11144:18;11137:34;11208:6;11202:3;11191:9;11187:19;11180:35;11252:6;11246:3;11235:9;11231:19;11224:35;11296:3;11290;11279:9;11275:19;11268:32;10973:4;11317:46;11358:3;11347:9;11343:19;11335:6;11317:46;:::i;:::-;11309:54;10695:674;-1:-1:-1;;;;;;;;;10695:674:1:o;11374:388::-;11442:6;11450;11503:2;11491:9;11482:7;11478:23;11474:32;11471:52;;;11519:1;11516;11509:12;11471:52;11558:9;11545:23;11577:31;11602:5;11577:31;:::i;:::-;11627:5;-1:-1:-1;11684:2:1;11669:18;;11656:32;11697:33;11656:32;11697:33;:::i;11767:380::-;11846:1;11842:12;;;;11889;;;11910:61;;11964:4;11956:6;11952:17;11942:27;;11910:61;12017:2;12009:6;12006:14;11986:18;11983:38;11980:161;;12063:10;12058:3;12054:20;12051:1;12044:31;12098:4;12095:1;12088:15;12126:4;12123:1;12116:15;11980:161;;11767:380;;;:::o;13395:273::-;13580:6;13572;13567:3;13554:33;13536:3;13606:16;;13631:13;;;13606:16;13395:273;-1:-1:-1;13395:273:1:o;13982:245::-;14049:6;14102:2;14090:9;14081:7;14077:23;14073:32;14070:52;;;14118:1;14115;14108:12;14070:52;14150:9;14144:16;14169:28;14191:5;14169:28;:::i;14592:127::-;14653:10;14648:3;14644:20;14641:1;14634:31;14684:4;14681:1;14674:15;14708:4;14705:1;14698:15;14724:168;14797:9;;;14828;;14845:15;;;14839:22;;14825:37;14815:71;;14866:18;;:::i;14897:127::-;14958:10;14953:3;14949:20;14946:1;14939:31;14989:4;14986:1;14979:15;15013:4;15010:1;15003:15;15029:120;15069:1;15095;15085:35;;15100:18;;:::i;:::-;-1:-1:-1;15134:9:1;;15029:120::o;15557:135::-;15596:3;15617:17;;;15614:43;;15637:18;;:::i;:::-;-1:-1:-1;15684:1:1;15673:13;;15557:135::o;17021:125::-;17086:9;;;17107:10;;;17104:36;;;17120:18;;:::i;19591:289::-;19722:3;19760:6;19754:13;19776:66;19835:6;19830:3;19823:4;19815:6;19811:17;19776:66;:::i;:::-;19858:16;;;;;19591:289;-1:-1:-1;;19591:289:1:o;19885:128::-;19952:9;;;19973:11;;;19970:37;;;19987:18;;:::i;20144:545::-;20246:2;20241:3;20238:11;20235:448;;;20282:1;20307:5;20303:2;20296:17;20352:4;20348:2;20338:19;20422:2;20410:10;20406:19;20403:1;20399:27;20393:4;20389:38;20458:4;20446:10;20443:20;20440:47;;;-1:-1:-1;20481:4:1;20440:47;20536:2;20531:3;20527:12;20524:1;20520:20;20514:4;20510:31;20500:41;;20591:82;20609:2;20602:5;20599:13;20591:82;;;20654:17;;;20635:1;20624:13;20591:82;;20865:1206;-1:-1:-1;;;;;20984:3:1;20981:27;20978:53;;;21011:18;;:::i;:::-;21040:94;21130:3;21090:38;21122:4;21116:11;21090:38;:::i;:::-;21084:4;21040:94;:::i;:::-;21160:1;21185:2;21180:3;21177:11;21202:1;21197:616;;;;21857:1;21874:3;21871:93;;;-1:-1:-1;21930:19:1;;;21917:33;21871:93;-1:-1:-1;;20822:1:1;20818:11;;;20814:24;20810:29;20800:40;20846:1;20842:11;;;20797:57;21977:78;;21170:895;;21197:616;20091:1;20084:14;;;20128:4;20115:18;;-1:-1:-1;;21233:17:1;;;21334:9;21356:229;21370:7;21367:1;21364:14;21356:229;;;21459:19;;;21446:33;21431:49;;21566:4;21551:20;;;;21519:1;21507:14;;;;21386:12;21356:229;;;21360:3;21613;21604:7;21601:16;21598:159;;;21737:1;21733:6;21727:3;21721;21718:1;21714:11;21710:21;21706:34;21702:39;21689:9;21684:3;21680:19;21667:33;21663:79;21655:6;21648:95;21598:159;;;21800:1;21794:3;21791:1;21787:11;21783:19;21777:4;21770:33;21170:895;;20865:1206;;;:::o;22480:1352::-;22606:3;22600:10;-1:-1:-1;;;;;22625:6:1;22622:30;22619:56;;;22655:18;;:::i;:::-;22684:97;22774:6;22734:38;22766:4;22760:11;22734:38;:::i;:::-;22728:4;22684:97;:::i;:::-;22836:4;;22900:2;22889:14;;22917:1;22912:663;;;;23619:1;23636:6;23633:89;;;-1:-1:-1;23688:19:1;;;23682:26;23633:89;-1:-1:-1;;20822:1:1;20818:11;;;20814:24;20810:29;20800:40;20846:1;20842:11;;;20797:57;23735:81;;22882:944;;22912:663;20091:1;20084:14;;;20128:4;20115:18;;-1:-1:-1;;22948:20:1;;;23066:236;23080:7;23077:1;23074:14;23066:236;;;23169:19;;;23163:26;23148:42;;23261:27;;;;23229:1;23217:14;;;;23096:19;;23066:236;;;23070:3;23330:6;23321:7;23318:19;23315:201;;;23391:19;;;23385:26;-1:-1:-1;;23474:1:1;23470:14;;;23486:3;23466:24;23462:37;23458:42;23443:58;23428:74;;23315:201;-1:-1:-1;;;;;23562:1:1;23546:14;;;23542:22;23529:36;;-1:-1:-1;22480:1352:1:o;23837:407::-;24039:2;24021:21;;;24078:2;24058:18;;;24051:30;24117:34;24112:2;24097:18;;24090:62;-1:-1:-1;;;24183:2:1;24168:18;;24161:41;24234:3;24219:19;;23837:407::o;24604:127::-;24665:10;24660:3;24656:20;24653:1;24646:31;24696:4;24693:1;24686:15;24720:4;24717:1;24710:15;24736:722;24786:3;24827:5;24821:12;24856:36;24882:9;24856:36;:::i;:::-;24911:1;24928:18;;;24955:133;;;;25102:1;25097:355;;;;24921:531;;24955:133;-1:-1:-1;;24988:24:1;;24976:37;;25061:14;;25054:22;25042:35;;25033:45;;;-1:-1:-1;24955:133:1;;25097:355;25128:5;25125:1;25118:16;25157:4;25202:2;25199:1;25189:16;25227:1;25241:165;25255:6;25252:1;25249:13;25241:165;;;25333:14;;25320:11;;;25313:35;25376:16;;;;25270:10;;25241:165;;;25245:3;;;25435:6;25430:3;25426:16;25419:23;;24921:531;;;;;24736:722;;;;:::o;25463:469::-;25684:3;25712:38;25746:3;25738:6;25712:38;:::i;:::-;25779:6;25773:13;25795:65;25853:6;25849:2;25842:4;25834:6;25830:17;25795:65;:::i;:::-;25876:50;25918:6;25914:2;25910:15;25902:6;25876:50;:::i;:::-;25869:57;25463:469;-1:-1:-1;;;;;;;25463:469:1:o;27116:136::-;27155:3;27183:5;27173:39;;27192:18;;:::i;:::-;-1:-1:-1;;;27228:18:1;;27116:136::o;27673:415::-;27875:2;27857:21;;;27914:2;27894:18;;;27887:30;27953:34;27948:2;27933:18;;27926:62;-1:-1:-1;;;28019:2:1;28004:18;;27997:49;28078:3;28063:19;;27673:415::o;28093:112::-;28125:1;28151;28141:35;;28156:18;;:::i;:::-;-1:-1:-1;28190:9:1;;28093:112::o;29442:200::-;-1:-1:-1;;;;;29578:10:1;;;29566;;;29562:27;;29601:12;;;29598:38;;;29616:18;;:::i;:::-;29598:38;29442:200;;;;:::o;29647:197::-;-1:-1:-1;;;;;29769:10:1;;;29781;;;29765:27;;29804:11;;;29801:37;;;29818:18;;:::i;30609:489::-;-1:-1:-1;;;;;30878:15:1;;;30860:34;;30930:15;;30925:2;30910:18;;30903:43;30977:2;30962:18;;30955:34;;;31025:3;31020:2;31005:18;;30998:31;;;30803:4;;31046:46;;31072:19;;31064:6;31046:46;:::i;:::-;31038:54;30609:489;-1:-1:-1;;;;;;30609:489:1:o;31103:249::-;31172:6;31225:2;31213:9;31204:7;31200:23;31196:32;31193:52;;;31241:1;31238;31231:12;31193:52;31273:9;31267:16;31292:30;31316:5;31292:30;:::i
Swarm Source
ipfs://5eaa9eb853327e346ca984311968fb4f581c91c54844e031595ca9299e8856e7
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.