ERC-721
Overview
Max Total Supply
200 CSG
Holders
12
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
2 CSGLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Source Code Verified (Exact Match)
Contract Name:
CryptoSweepGenesis
Compiler Version
v0.8.17+commit.8df45f5f
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-12-09 */ // SPDX-License-Identifier: GPL-3.0 /** ___ _ __ / __\ __ _ _ _ __ | |_ ___ / _\_ _____ ___ _ __ / / | '__| | | | '_ \| __/ _ \ \ \\ \ /\ / / _ \/ _ \ '_ \ / /__| | | |_| | |_) | || (_) | _\ \\ V V / __/ __/ |_) | \____/_| \__, | .__/ \__\___/ \__/ \_/\_/ \___|\___| .__/ |___/|_| |_| */ // File: operator-filter-registry/src/IOperatorFilterRegistry.sol pragma solidity ^0.8.13; 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 unregister(address addr) 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: operator-filter-registry/src/OperatorFilterer.sol pragma solidity ^0.8.13; /** * @title OperatorFilterer * @notice Abstract contract whose constructor automatically registers and optionally subscribes to or copies another * registrant's entries in the OperatorFilterRegistry. * @dev This smart contract is meant to be inherited by token contracts so they can use the following: * - `onlyAllowedOperator` modifier for `transferFrom` and `safeTransferFrom` methods. * - `onlyAllowedOperatorApproval` modifier for `approve` and `setApprovalForAll` methods. */ abstract contract OperatorFilterer { error OperatorNotAllowed(address operator); IOperatorFilterRegistry public constant OPERATOR_FILTER_REGISTRY = 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(OPERATOR_FILTER_REGISTRY).code.length > 0) { if (subscribe) { OPERATOR_FILTER_REGISTRY.registerAndSubscribe(address(this), subscriptionOrRegistrantToCopy); } else { if (subscriptionOrRegistrantToCopy != address(0)) { OPERATOR_FILTER_REGISTRY.registerAndCopyEntries(address(this), subscriptionOrRegistrantToCopy); } else { OPERATOR_FILTER_REGISTRY.register(address(this)); } } } } modifier onlyAllowedOperator(address from) virtual { // Allow spending tokens from addresses with balance // Note that this still allows listings and marketplaces with escrow to transfer tokens if transferred // from an EOA. if (from != msg.sender) { _checkFilterOperator(msg.sender); } _; } modifier onlyAllowedOperatorApproval(address operator) virtual { _checkFilterOperator(operator); _; } function _checkFilterOperator(address operator) internal view virtual { // Check registry code length to facilitate testing in environments without a deployed registry. if (address(OPERATOR_FILTER_REGISTRY).code.length > 0) { if (!OPERATOR_FILTER_REGISTRY.isOperatorAllowed(address(this), operator)) { revert OperatorNotAllowed(operator); } } } } // File: operator-filter-registry/src/DefaultOperatorFilterer.sol pragma solidity ^0.8.13; /** * @title DefaultOperatorFilterer * @notice Inherits from OperatorFilterer and automatically subscribes to the default OpenSea subscription. */ abstract contract DefaultOperatorFilterer is OperatorFilterer { address constant DEFAULT_SUBSCRIPTION = address(0x3cc6CddA760b79bAfa08dF41ECFA224f810dCeB6); constructor() OperatorFilterer(DEFAULT_SUBSCRIPTION, true) {} } // File: @openzeppelin/contracts/security/ReentrancyGuard.sol pragma solidity ^0.8.0; /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ abstract contract ReentrancyGuard { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; constructor() { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and making it call a * `private` function that does the actual work. */ modifier nonReentrant() { _nonReentrantBefore(); _; _nonReentrantAfter(); } function _nonReentrantBefore() private { // On the first call to nonReentrant, _status will be _NOT_ENTERED require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; } function _nonReentrantAfter() private { // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } } // File: @openzeppelin/contracts/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); } } // ERC721A Contracts v4.2.3 // Creator: Chiru Labs pragma solidity ^0.8.4; /** * @dev Interface of ERC721A. */ interface IERC721A { /** * The caller must own the token or be an approved operator. */ error ApprovalCallerNotOwnerNorApproved(); /** * The token does not exist. */ error ApprovalQueryForNonexistentToken(); /** * Cannot query the balance for the zero address. */ error BalanceQueryForZeroAddress(); /** * Cannot mint to the zero address. */ error MintToZeroAddress(); /** * The quantity of tokens minted must be more than zero. */ error MintZeroQuantity(); /** * The token does not exist. */ error OwnerQueryForNonexistentToken(); /** * The caller must own the token or be an approved operator. */ error TransferCallerNotOwnerNorApproved(); /** * The token must be owned by `from`. */ error TransferFromIncorrectOwner(); /** * Cannot safely transfer to a contract that does not implement the * ERC721Receiver interface. */ error TransferToNonERC721ReceiverImplementer(); /** * Cannot transfer to the zero address. */ error TransferToZeroAddress(); /** * The token does not exist. */ error URIQueryForNonexistentToken(); /** * The `quantity` minted with ERC2309 exceeds the safety limit. */ error MintERC2309QuantityExceedsLimit(); /** * The `extraData` cannot be set on an unintialized ownership slot. */ error OwnershipNotInitializedForExtraData(); // ============================================================= // STRUCTS // ============================================================= struct TokenOwnership { // The address of the owner. address addr; // Stores the start time of ownership with minimal overhead for tokenomics. uint64 startTimestamp; // Whether the token has been burned. bool burned; // Arbitrary data similar to `startTimestamp` that can be set via {_extraData}. uint24 extraData; } // ============================================================= // TOKEN COUNTERS // ============================================================= /** * @dev Returns the total number of tokens in existence. * Burned tokens will reduce the count. * To get the total number of tokens minted, please see {_totalMinted}. */ function totalSupply() external view returns (uint256); // ============================================================= // IERC165 // ============================================================= /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * [EIP section](https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified) * to learn more about how these ids are created. * * This function call must use less than 30000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); // ============================================================= // IERC721 // ============================================================= /** * @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`, * 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 be 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, bytes calldata data ) external payable; /** * @dev Equivalent to `safeTransferFrom(from, to, tokenId, '')`. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external payable; /** * @dev Transfers `tokenId` 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 payable; /** * @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 payable; /** * @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); // ============================================================= // IERC721Metadata // ============================================================= /** * @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); // ============================================================= // IERC2309 // ============================================================= /** * @dev Emitted when tokens in `fromTokenId` to `toTokenId` * (inclusive) is transferred from `from` to `to`, as defined in the * [ERC2309](https://eips.ethereum.org/EIPS/eip-2309) standard. * * See {_mintERC2309} for more details. */ event ConsecutiveTransfer(uint256 indexed fromTokenId, uint256 toTokenId, address indexed from, address indexed to); } pragma solidity ^0.8.4; /** * @dev Interface of ERC721 token receiver. */ interface ERC721A__IERC721Receiver { function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } /** * @title ERC721A * * @dev Implementation of the [ERC721](https://eips.ethereum.org/EIPS/eip-721) * Non-Fungible Token Standard, including the Metadata extension. * Optimized for lower gas during batch mints. * * Token IDs are minted in sequential order (e.g. 0, 1, 2, 3, ...) * starting from `_startTokenId()`. * * Assumptions: * * - An owner cannot have more than 2**64 - 1 (max value of uint64) of supply. * - The maximum token ID cannot exceed 2**256 - 1 (max value of uint256). */ contract ERC721A is IERC721A { // Bypass for a `--via-ir` bug (https://github.com/chiru-labs/ERC721A/pull/364). struct TokenApprovalRef { address value; } // ============================================================= // CONSTANTS // ============================================================= // Mask of an entry in packed address data. uint256 private constant _BITMASK_ADDRESS_DATA_ENTRY = (1 << 64) - 1; // The bit position of `numberMinted` in packed address data. uint256 private constant _BITPOS_NUMBER_MINTED = 64; // The bit position of `numberBurned` in packed address data. uint256 private constant _BITPOS_NUMBER_BURNED = 128; // The bit position of `aux` in packed address data. uint256 private constant _BITPOS_AUX = 192; // Mask of all 256 bits in packed address data except the 64 bits for `aux`. uint256 private constant _BITMASK_AUX_COMPLEMENT = (1 << 192) - 1; // The bit position of `startTimestamp` in packed ownership. uint256 private constant _BITPOS_START_TIMESTAMP = 160; // The bit mask of the `burned` bit in packed ownership. uint256 private constant _BITMASK_BURNED = 1 << 224; // The bit position of the `nextInitialized` bit in packed ownership. uint256 private constant _BITPOS_NEXT_INITIALIZED = 225; // The bit mask of the `nextInitialized` bit in packed ownership. uint256 private constant _BITMASK_NEXT_INITIALIZED = 1 << 225; // The bit position of `extraData` in packed ownership. uint256 private constant _BITPOS_EXTRA_DATA = 232; // Mask of all 256 bits in a packed ownership except the 24 bits for `extraData`. uint256 private constant _BITMASK_EXTRA_DATA_COMPLEMENT = (1 << 232) - 1; // The mask of the lower 160 bits for addresses. uint256 private constant _BITMASK_ADDRESS = (1 << 160) - 1; // The maximum `quantity` that can be minted with {_mintERC2309}. // This limit is to prevent overflows on the address data entries. // For a limit of 5000, a total of 3.689e15 calls to {_mintERC2309} // is required to cause an overflow, which is unrealistic. uint256 private constant _MAX_MINT_ERC2309_QUANTITY_LIMIT = 5000; // The `Transfer` event signature is given by: // `keccak256(bytes("Transfer(address,address,uint256)"))`. bytes32 private constant _TRANSFER_EVENT_SIGNATURE = 0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef; // ============================================================= // STORAGE // ============================================================= // The next token ID to be minted. uint256 private _currentIndex; // The number of tokens burned. uint256 private _burnCounter; // 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 {_packedOwnershipOf} implementation for details. // // Bits Layout: // - [0..159] `addr` // - [160..223] `startTimestamp` // - [224] `burned` // - [225] `nextInitialized` // - [232..255] `extraData` mapping(uint256 => uint256) private _packedOwnerships; // Mapping owner address to address data. // // Bits Layout: // - [0..63] `balance` // - [64..127] `numberMinted` // - [128..191] `numberBurned` // - [192..255] `aux` mapping(address => uint256) private _packedAddressData; // Mapping from token ID to approved address. mapping(uint256 => TokenApprovalRef) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; // ============================================================= // CONSTRUCTOR // ============================================================= constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; _currentIndex = _startTokenId(); } // ============================================================= // TOKEN COUNTING OPERATIONS // ============================================================= /** * @dev Returns the starting token ID. * To change the starting token ID, please override this function. */ function _startTokenId() internal view virtual returns (uint256) { return 0; } /** * @dev Returns the next token ID to be minted. */ function _nextTokenId() internal view virtual returns (uint256) { return _currentIndex; } /** * @dev Returns the total number of tokens in existence. * Burned tokens will reduce the count. * To get the total number of tokens minted, please see {_totalMinted}. */ function totalSupply() public view virtual override returns (uint256) { // Counter underflow is impossible as _burnCounter cannot be incremented // more than `_currentIndex - _startTokenId()` times. unchecked { return _currentIndex - _burnCounter - _startTokenId(); } } /** * @dev Returns the total amount of tokens minted in the contract. */ function _totalMinted() internal view virtual returns (uint256) { // Counter underflow is impossible as `_currentIndex` does not decrement, // and it is initialized to `_startTokenId()`. unchecked { return _currentIndex - _startTokenId(); } } /** * @dev Returns the total number of tokens burned. */ function _totalBurned() internal view virtual returns (uint256) { return _burnCounter; } // ============================================================= // ADDRESS DATA OPERATIONS // ============================================================= /** * @dev Returns the number of tokens in `owner`'s account. */ function balanceOf(address owner) public view virtual override returns (uint256) { if (owner == address(0)) revert BalanceQueryForZeroAddress(); return _packedAddressData[owner] & _BITMASK_ADDRESS_DATA_ENTRY; } /** * Returns the number of tokens minted by `owner`. */ function _numberMinted(address owner) internal view returns (uint256) { return (_packedAddressData[owner] >> _BITPOS_NUMBER_MINTED) & _BITMASK_ADDRESS_DATA_ENTRY; } /** * Returns the number of tokens burned by or on behalf of `owner`. */ function _numberBurned(address owner) internal view returns (uint256) { return (_packedAddressData[owner] >> _BITPOS_NUMBER_BURNED) & _BITMASK_ADDRESS_DATA_ENTRY; } /** * Returns the auxiliary data for `owner`. (e.g. number of whitelist mint slots used). */ function _getAux(address owner) internal view returns (uint64) { return uint64(_packedAddressData[owner] >> _BITPOS_AUX); } /** * Sets the auxiliary data for `owner`. (e.g. number of whitelist mint slots used). * If there are multiple variables, please pack them into a uint64. */ function _setAux(address owner, uint64 aux) internal virtual { uint256 packed = _packedAddressData[owner]; uint256 auxCasted; // Cast `aux` with assembly to avoid redundant masking. assembly { auxCasted := aux } packed = (packed & _BITMASK_AUX_COMPLEMENT) | (auxCasted << _BITPOS_AUX); _packedAddressData[owner] = packed; } // ============================================================= // IERC165 // ============================================================= /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * [EIP section](https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified) * to learn more about how these ids are created. * * This function call must use less than 30000 gas. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { // The interface IDs are constants representing the first 4 bytes // of the XOR of all function selectors in the interface. // See: [ERC165](https://eips.ethereum.org/EIPS/eip-165) // (e.g. `bytes4(i.functionA.selector ^ i.functionB.selector ^ ...)`) return interfaceId == 0x01ffc9a7 || // ERC165 interface ID for ERC165. interfaceId == 0x80ac58cd || // ERC165 interface ID for ERC721. interfaceId == 0x5b5e139f; // ERC165 interface ID for ERC721Metadata. } // ============================================================= // IERC721Metadata // ============================================================= /** * @dev Returns the token collection name. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev Returns the token collection symbol. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { if (!_exists(tokenId)) revert URIQueryForNonexistentToken(); string memory baseURI = _baseURI(); return bytes(baseURI).length != 0 ? string(abi.encodePacked(baseURI, _toString(tokenId))) : ''; } /** * @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, it can be overridden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ''; } // ============================================================= // OWNERSHIPS OPERATIONS // ============================================================= /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) public view virtual override returns (address) { return address(uint160(_packedOwnershipOf(tokenId))); } /** * @dev Gas spent here starts off proportional to the maximum mint batch size. * It gradually moves to O(1) as tokens get transferred around over time. */ function _ownershipOf(uint256 tokenId) internal view virtual returns (TokenOwnership memory) { return _unpackedOwnership(_packedOwnershipOf(tokenId)); } /** * @dev Returns the unpacked `TokenOwnership` struct at `index`. */ function _ownershipAt(uint256 index) internal view virtual returns (TokenOwnership memory) { return _unpackedOwnership(_packedOwnerships[index]); } /** * @dev Initializes the ownership slot minted at `index` for efficiency purposes. */ function _initializeOwnershipAt(uint256 index) internal virtual { if (_packedOwnerships[index] == 0) { _packedOwnerships[index] = _packedOwnershipOf(index); } } /** * Returns the packed ownership data of `tokenId`. */ function _packedOwnershipOf(uint256 tokenId) private view returns (uint256 packed) { if (_startTokenId() <= tokenId) { packed = _packedOwnerships[tokenId]; // If not burned. if (packed & _BITMASK_BURNED == 0) { // If the data at the starting slot does not exist, start the scan. if (packed == 0) { if (tokenId >= _currentIndex) revert OwnerQueryForNonexistentToken(); // Invariant: // There will always be an initialized ownership slot // (i.e. `ownership.addr != address(0) && ownership.burned == false`) // before an unintialized ownership slot // (i.e. `ownership.addr == address(0) && ownership.burned == false`) // Hence, `tokenId` will not underflow. // // We can directly compare the packed value. // If the address is zero, packed will be zero. for (;;) { unchecked { packed = _packedOwnerships[--tokenId]; } if (packed == 0) continue; return packed; } } // Otherwise, the data exists and is not burned. We can skip the scan. // This is possible because we have already achieved the target condition. // This saves 2143 gas on transfers of initialized tokens. return packed; } } revert OwnerQueryForNonexistentToken(); } /** * @dev Returns the unpacked `TokenOwnership` struct from `packed`. */ function _unpackedOwnership(uint256 packed) private pure returns (TokenOwnership memory ownership) { ownership.addr = address(uint160(packed)); ownership.startTimestamp = uint64(packed >> _BITPOS_START_TIMESTAMP); ownership.burned = packed & _BITMASK_BURNED != 0; ownership.extraData = uint24(packed >> _BITPOS_EXTRA_DATA); } /** * @dev Packs ownership data into a single uint256. */ function _packOwnershipData(address owner, uint256 flags) private view returns (uint256 result) { assembly { // Mask `owner` to the lower 160 bits, in case the upper bits somehow aren't clean. owner := and(owner, _BITMASK_ADDRESS) // `owner | (block.timestamp << _BITPOS_START_TIMESTAMP) | flags`. result := or(owner, or(shl(_BITPOS_START_TIMESTAMP, timestamp()), flags)) } } /** * @dev Returns the `nextInitialized` flag set if `quantity` equals 1. */ function _nextInitializedFlag(uint256 quantity) private pure returns (uint256 result) { // For branchless setting of the `nextInitialized` flag. assembly { // `(quantity == 1) << _BITPOS_NEXT_INITIALIZED`. result := shl(_BITPOS_NEXT_INITIALIZED, eq(quantity, 1)) } } // ============================================================= // APPROVAL OPERATIONS // ============================================================= /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. See {ERC721A-_approve}. * * Requirements: * * - The caller must own the token or be an approved operator. */ function approve(address to, uint256 tokenId) public payable virtual override { _approve(to, tokenId, true); } /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { if (!_exists(tokenId)) revert ApprovalQueryForNonexistentToken(); return _tokenApprovals[tokenId].value; } /** * @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) public virtual override { _operatorApprovals[_msgSenderERC721A()][operator] = approved; emit ApprovalForAll(_msgSenderERC721A(), operator, approved); } /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @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. See {_mint}. */ function _exists(uint256 tokenId) internal view virtual returns (bool) { return _startTokenId() <= tokenId && tokenId < _currentIndex && // If within bounds, _packedOwnerships[tokenId] & _BITMASK_BURNED == 0; // and not burned. } /** * @dev Returns whether `msgSender` is equal to `approvedAddress` or `owner`. */ function _isSenderApprovedOrOwner( address approvedAddress, address owner, address msgSender ) private pure returns (bool result) { assembly { // Mask `owner` to the lower 160 bits, in case the upper bits somehow aren't clean. owner := and(owner, _BITMASK_ADDRESS) // Mask `msgSender` to the lower 160 bits, in case the upper bits somehow aren't clean. msgSender := and(msgSender, _BITMASK_ADDRESS) // `msgSender == owner || msgSender == approvedAddress`. result := or(eq(msgSender, owner), eq(msgSender, approvedAddress)) } } /** * @dev Returns the storage slot and value for the approved address of `tokenId`. */ function _getApprovedSlotAndAddress(uint256 tokenId) private view returns (uint256 approvedAddressSlot, address approvedAddress) { TokenApprovalRef storage tokenApproval = _tokenApprovals[tokenId]; // The following is equivalent to `approvedAddress = _tokenApprovals[tokenId].value`. assembly { approvedAddressSlot := tokenApproval.slot approvedAddress := sload(approvedAddressSlot) } } // ============================================================= // TRANSFER OPERATIONS // ============================================================= /** * @dev Transfers `tokenId` from `from` to `to`. * * 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 ) public payable virtual override { uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId); if (address(uint160(prevOwnershipPacked)) != from) revert TransferFromIncorrectOwner(); (uint256 approvedAddressSlot, address approvedAddress) = _getApprovedSlotAndAddress(tokenId); // The nested ifs save around 20+ gas over a compound boolean condition. if (!_isSenderApprovedOrOwner(approvedAddress, from, _msgSenderERC721A())) if (!isApprovedForAll(from, _msgSenderERC721A())) revert TransferCallerNotOwnerNorApproved(); if (to == address(0)) revert TransferToZeroAddress(); _beforeTokenTransfers(from, to, tokenId, 1); // Clear approvals from the previous owner. assembly { if approvedAddress { // This is equivalent to `delete _tokenApprovals[tokenId]`. sstore(approvedAddressSlot, 0) } } // Underflow of the sender's balance is impossible because we check for // ownership above and the recipient's balance can't realistically overflow. // Counter overflow is incredibly unrealistic as `tokenId` would have to be 2**256. unchecked { // We can directly increment and decrement the balances. --_packedAddressData[from]; // Updates: `balance -= 1`. ++_packedAddressData[to]; // Updates: `balance += 1`. // Updates: // - `address` to the next owner. // - `startTimestamp` to the timestamp of transfering. // - `burned` to `false`. // - `nextInitialized` to `true`. _packedOwnerships[tokenId] = _packOwnershipData( to, _BITMASK_NEXT_INITIALIZED | _nextExtraData(from, to, prevOwnershipPacked) ); // If the next slot may not have been initialized (i.e. `nextInitialized == false`) . if (prevOwnershipPacked & _BITMASK_NEXT_INITIALIZED == 0) { uint256 nextTokenId = tokenId + 1; // If the next slot's address is zero and not burned (i.e. packed value is zero). if (_packedOwnerships[nextTokenId] == 0) { // If the next slot is within bounds. if (nextTokenId != _currentIndex) { // Initialize the next slot to maintain correctness for `ownerOf(tokenId + 1)`. _packedOwnerships[nextTokenId] = prevOwnershipPacked; } } } } emit Transfer(from, to, tokenId); _afterTokenTransfers(from, to, tokenId, 1); } /** * @dev Equivalent to `safeTransferFrom(from, to, tokenId, '')`. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public payable virtual override { safeTransferFrom(from, to, tokenId, ''); } /** * @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 memory _data ) public payable virtual override { transferFrom(from, to, tokenId); if (to.code.length != 0) if (!_checkContractOnERC721Received(from, to, tokenId, _data)) { revert TransferToNonERC721ReceiverImplementer(); } } /** * @dev Hook that is called before a set of serially-ordered token IDs * are about to be transferred. This includes minting. * And also called before burning one token. * * `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`. * - When `to` is zero, `tokenId` will be burned by `from`. * - `from` and `to` are never both zero. */ 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. * And also called after one token has been burned. * * `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` has been * transferred to `to`. * - When `from` is zero, `tokenId` has been minted for `to`. * - When `to` is zero, `tokenId` has been burned by `from`. * - `from` and `to` are never both zero. */ function _afterTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} /** * @dev Private function to invoke {IERC721Receiver-onERC721Received} on a target contract. * * `from` - Previous owner of the given token ID. * `to` - Target address that will receive the token. * `tokenId` - Token ID to be transferred. * `_data` - Optional data to send along with the call. * * Returns whether the call correctly returned the expected magic value. */ function _checkContractOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { try ERC721A__IERC721Receiver(to).onERC721Received(_msgSenderERC721A(), from, tokenId, _data) returns ( bytes4 retval ) { return retval == ERC721A__IERC721Receiver(to).onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert TransferToNonERC721ReceiverImplementer(); } else { assembly { revert(add(32, reason), mload(reason)) } } } } // ============================================================= // MINT OPERATIONS // ============================================================= /** * @dev Mints `quantity` tokens and transfers them to `to`. * * Requirements: * * - `to` cannot be the zero address. * - `quantity` must be greater than 0. * * Emits a {Transfer} event for each mint. */ function _mint(address to, uint256 quantity) internal virtual { uint256 startTokenId = _currentIndex; if (quantity == 0) revert MintZeroQuantity(); _beforeTokenTransfers(address(0), to, startTokenId, quantity); // Overflows are incredibly unrealistic. // `balance` and `numberMinted` have a maximum limit of 2**64. // `tokenId` has a maximum limit of 2**256. unchecked { // Updates: // - `balance += quantity`. // - `numberMinted += quantity`. // // We can directly add to the `balance` and `numberMinted`. _packedAddressData[to] += quantity * ((1 << _BITPOS_NUMBER_MINTED) | 1); // Updates: // - `address` to the owner. // - `startTimestamp` to the timestamp of minting. // - `burned` to `false`. // - `nextInitialized` to `quantity == 1`. _packedOwnerships[startTokenId] = _packOwnershipData( to, _nextInitializedFlag(quantity) | _nextExtraData(address(0), to, 0) ); uint256 toMasked; uint256 end = startTokenId + quantity; // Use assembly to loop and emit the `Transfer` event for gas savings. // The duplicated `log4` removes an extra check and reduces stack juggling. // The assembly, together with the surrounding Solidity code, have been // delicately arranged to nudge the compiler into producing optimized opcodes. assembly { // Mask `to` to the lower 160 bits, in case the upper bits somehow aren't clean. toMasked := and(to, _BITMASK_ADDRESS) // Emit the `Transfer` event. log4( 0, // Start of data (0, since no data). 0, // End of data (0, since no data). _TRANSFER_EVENT_SIGNATURE, // Signature. 0, // `address(0)`. toMasked, // `to`. startTokenId // `tokenId`. ) // The `iszero(eq(,))` check ensures that large values of `quantity` // that overflows uint256 will make the loop run out of gas. // The compiler will optimize the `iszero` away for performance. for { let tokenId := add(startTokenId, 1) } iszero(eq(tokenId, end)) { tokenId := add(tokenId, 1) } { // Emit the `Transfer` event. Similar to above. log4(0, 0, _TRANSFER_EVENT_SIGNATURE, 0, toMasked, tokenId) } } if (toMasked == 0) revert MintToZeroAddress(); _currentIndex = end; } _afterTokenTransfers(address(0), to, startTokenId, quantity); } /** * @dev Mints `quantity` tokens and transfers them to `to`. * * This function is intended for efficient minting only during contract creation. * * It emits only one {ConsecutiveTransfer} as defined in * [ERC2309](https://eips.ethereum.org/EIPS/eip-2309), * instead of a sequence of {Transfer} event(s). * * Calling this function outside of contract creation WILL make your contract * non-compliant with the ERC721 standard. * For full ERC721 compliance, substituting ERC721 {Transfer} event(s) with the ERC2309 * {ConsecutiveTransfer} event is only permissible during contract creation. * * Requirements: * * - `to` cannot be the zero address. * - `quantity` must be greater than 0. * * Emits a {ConsecutiveTransfer} event. */ function _mintERC2309(address to, uint256 quantity) internal virtual { uint256 startTokenId = _currentIndex; if (to == address(0)) revert MintToZeroAddress(); if (quantity == 0) revert MintZeroQuantity(); if (quantity > _MAX_MINT_ERC2309_QUANTITY_LIMIT) revert MintERC2309QuantityExceedsLimit(); _beforeTokenTransfers(address(0), to, startTokenId, quantity); // Overflows are unrealistic due to the above check for `quantity` to be below the limit. unchecked { // Updates: // - `balance += quantity`. // - `numberMinted += quantity`. // // We can directly add to the `balance` and `numberMinted`. _packedAddressData[to] += quantity * ((1 << _BITPOS_NUMBER_MINTED) | 1); // Updates: // - `address` to the owner. // - `startTimestamp` to the timestamp of minting. // - `burned` to `false`. // - `nextInitialized` to `quantity == 1`. _packedOwnerships[startTokenId] = _packOwnershipData( to, _nextInitializedFlag(quantity) | _nextExtraData(address(0), to, 0) ); emit ConsecutiveTransfer(startTokenId, startTokenId + quantity - 1, address(0), to); _currentIndex = startTokenId + quantity; } _afterTokenTransfers(address(0), to, startTokenId, quantity); } /** * @dev Safely mints `quantity` tokens and transfers them to `to`. * * Requirements: * * - If `to` refers to a smart contract, it must implement * {IERC721Receiver-onERC721Received}, which is called for each safe transfer. * - `quantity` must be greater than 0. * * See {_mint}. * * Emits a {Transfer} event for each mint. */ function _safeMint( address to, uint256 quantity, bytes memory _data ) internal virtual { _mint(to, quantity); unchecked { if (to.code.length != 0) { uint256 end = _currentIndex; uint256 index = end - quantity; do { if (!_checkContractOnERC721Received(address(0), to, index++, _data)) { revert TransferToNonERC721ReceiverImplementer(); } } while (index < end); // Reentrancy protection. if (_currentIndex != end) revert(); } } } /** * @dev Equivalent to `_safeMint(to, quantity, '')`. */ function _safeMint(address to, uint256 quantity) internal virtual { _safeMint(to, quantity, ''); } // ============================================================= // APPROVAL OPERATIONS // ============================================================= /** * @dev Equivalent to `_approve(to, tokenId, false)`. */ function _approve(address to, uint256 tokenId) internal virtual { _approve(to, tokenId, false); } /** * @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: * * - `tokenId` must exist. * * Emits an {Approval} event. */ function _approve( address to, uint256 tokenId, bool approvalCheck ) internal virtual { address owner = ownerOf(tokenId); if (approvalCheck) if (_msgSenderERC721A() != owner) if (!isApprovedForAll(owner, _msgSenderERC721A())) { revert ApprovalCallerNotOwnerNorApproved(); } _tokenApprovals[tokenId].value = to; emit Approval(owner, to, tokenId); } // ============================================================= // BURN OPERATIONS // ============================================================= /** * @dev Equivalent to `_burn(tokenId, false)`. */ function _burn(uint256 tokenId) internal virtual { _burn(tokenId, false); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId, bool approvalCheck) internal virtual { uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId); address from = address(uint160(prevOwnershipPacked)); (uint256 approvedAddressSlot, address approvedAddress) = _getApprovedSlotAndAddress(tokenId); if (approvalCheck) { // The nested ifs save around 20+ gas over a compound boolean condition. if (!_isSenderApprovedOrOwner(approvedAddress, from, _msgSenderERC721A())) if (!isApprovedForAll(from, _msgSenderERC721A())) revert TransferCallerNotOwnerNorApproved(); } _beforeTokenTransfers(from, address(0), tokenId, 1); // Clear approvals from the previous owner. assembly { if approvedAddress { // This is equivalent to `delete _tokenApprovals[tokenId]`. sstore(approvedAddressSlot, 0) } } // Underflow of the sender's balance is impossible because we check for // ownership above and the recipient's balance can't realistically overflow. // Counter overflow is incredibly unrealistic as `tokenId` would have to be 2**256. unchecked { // Updates: // - `balance -= 1`. // - `numberBurned += 1`. // // We can directly decrement the balance, and increment the number burned. // This is equivalent to `packed -= 1; packed += 1 << _BITPOS_NUMBER_BURNED;`. _packedAddressData[from] += (1 << _BITPOS_NUMBER_BURNED) - 1; // Updates: // - `address` to the last owner. // - `startTimestamp` to the timestamp of burning. // - `burned` to `true`. // - `nextInitialized` to `true`. _packedOwnerships[tokenId] = _packOwnershipData( from, (_BITMASK_BURNED | _BITMASK_NEXT_INITIALIZED) | _nextExtraData(from, address(0), prevOwnershipPacked) ); // If the next slot may not have been initialized (i.e. `nextInitialized == false`) . if (prevOwnershipPacked & _BITMASK_NEXT_INITIALIZED == 0) { uint256 nextTokenId = tokenId + 1; // If the next slot's address is zero and not burned (i.e. packed value is zero). if (_packedOwnerships[nextTokenId] == 0) { // If the next slot is within bounds. if (nextTokenId != _currentIndex) { // Initialize the next slot to maintain correctness for `ownerOf(tokenId + 1)`. _packedOwnerships[nextTokenId] = prevOwnershipPacked; } } } } emit Transfer(from, address(0), tokenId); _afterTokenTransfers(from, address(0), tokenId, 1); // Overflow not possible, as _burnCounter cannot be exceed _currentIndex times. unchecked { _burnCounter++; } } // ============================================================= // EXTRA DATA OPERATIONS // ============================================================= /** * @dev Directly sets the extra data for the ownership data `index`. */ function _setExtraDataAt(uint256 index, uint24 extraData) internal virtual { uint256 packed = _packedOwnerships[index]; if (packed == 0) revert OwnershipNotInitializedForExtraData(); uint256 extraDataCasted; // Cast `extraData` with assembly to avoid redundant masking. assembly { extraDataCasted := extraData } packed = (packed & _BITMASK_EXTRA_DATA_COMPLEMENT) | (extraDataCasted << _BITPOS_EXTRA_DATA); _packedOwnerships[index] = packed; } /** * @dev Called during each token transfer to set the 24bit `extraData` field. * Intended to be overridden by the cosumer contract. * * `previousExtraData` - the value of `extraData` before transfer. * * 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, `tokenId` will be burned by `from`. * - `from` and `to` are never both zero. */ function _extraData( address from, address to, uint24 previousExtraData ) internal view virtual returns (uint24) {} /** * @dev Returns the next extra data for the packed ownership data. * The returned result is shifted into position. */ function _nextExtraData( address from, address to, uint256 prevOwnershipPacked ) private view returns (uint256) { uint24 extraData = uint24(prevOwnershipPacked >> _BITPOS_EXTRA_DATA); return uint256(_extraData(from, to, extraData)) << _BITPOS_EXTRA_DATA; } // ============================================================= // OTHER OPERATIONS // ============================================================= /** * @dev Returns the message sender (defaults to `msg.sender`). * * If you are writing GSN compatible contracts, you need to override this function. */ function _msgSenderERC721A() internal view virtual returns (address) { return msg.sender; } /** * @dev Converts a uint256 to its ASCII string decimal representation. */ function _toString(uint256 value) internal pure virtual returns (string memory str) { assembly { // The maximum value of a uint256 contains 78 digits (1 byte per digit), but // we allocate 0xa0 bytes to keep the free memory pointer 32-byte word aligned. // We will need 1 word for the trailing zeros padding, 1 word for the length, // and 3 words for a maximum of 78 digits. Total: 5 * 0x20 = 0xa0. let m := add(mload(0x40), 0xa0) // Update the free memory pointer to allocate. mstore(0x40, m) // Assign the `str` to the end. str := sub(m, 0x20) // Zeroize the slot after the string. mstore(str, 0) // Cache the end of the memory to calculate the length later. let end := str // We write the string from rightmost digit to leftmost digit. // The following is essentially a do-while loop that also handles the zero case. // prettier-ignore for { let temp := value } 1 {} { str := sub(str, 1) // Write the character to the pointer. // The ASCII index of the '0' character is 48. mstore8(str, add(48, mod(temp, 10))) // Keep dividing `temp` until zero. temp := div(temp, 10) // prettier-ignore if iszero(temp) { break } } let length := sub(end, str) // Move the pointer 32 bytes leftwards to make room for the length. str := sub(str, 0x20) // Store the length. mstore(str, length) } } } pragma solidity ^0.8.15; contract CryptoSweepGenesis is ERC721A, ReentrancyGuard, DefaultOperatorFilterer, Ownable { //---------------[ Token URI ]---------------\\ string public baseURI = ''; string public uriSuffix = '.json'; //---------------[ Cost & Supply ]---------------\\ uint256 public maxSupply = 2800; uint256 public maxPerTx = 3; uint256 public cost = 0.03 ether; //---------------[ Setting Toggles ]---------------\\ bool public saleActive = false; //---------------[ ]---------------\\ constructor( string memory _tokenName, string memory _tokenSymbol, string memory _initBaseURI ) ERC721A(_tokenName, _tokenSymbol) { baseURI = _initBaseURI; } //---------------[ Mint Functions ]---------------\\ function mint(uint256 _mintAmount) public payable nonReentrant { require(saleActive, 'The public mint is currently not active'); require(totalSupply() + _mintAmount <= maxSupply, 'Maximum NFT supply exceeded'); require(_mintAmount > 0, "Mint amount must be betwee 1 and 3"); require(_mintAmount <= maxPerTx, "Mint amount must be betwee 1 and 3"); require(msg.value >= _mintAmount * cost, "not enough ETH sent"); //- Minting _safeMint(_msgSender(), _mintAmount); } function airdrop(address[] memory _receiver, uint256 _mintAmount) public onlyOwner nonReentrant { for(uint256 i = 0; i < _receiver.length; i++) { _safeMint(_receiver[i], _mintAmount, ""); } } //---------------[ Public Functions ]---------------\\ function tokenURI(uint256 _tokenId) public view virtual override returns (string memory) { require(_exists(_tokenId), 'ERC721Metadata: URI query for nonexistent token'); string memory currentBaseURI = _baseURI(); return bytes(currentBaseURI).length > 0 ? string(abi.encodePacked(currentBaseURI, _toString(_tokenId), uriSuffix)) : ''; } //---------------[ Internal Functions ]---------------\\ function _startTokenId() internal view virtual override returns (uint256) { return 1; } function _baseURI() internal view virtual override returns (string memory) { return baseURI; } //---------------[ onlyOwner Functions ]---------------\\ function setBaseURI(string memory _newURI) public onlyOwner { baseURI = _newURI; } function setUriSuffix(string memory _uriSuffix) public onlyOwner { uriSuffix = _uriSuffix; } function flipSaleState() public onlyOwner { saleActive = !saleActive; } function setCost(uint256 _newCost) public onlyOwner { cost = _newCost; } function withdraw() public payable onlyOwner { (bool success, ) = payable(msg.sender).call{value: address(this).balance}(""); require(success); } //---------------[ OpenSea Registry Filter Functions ]---------------\\ function setApprovalForAll(address operator, bool approved) public override onlyAllowedOperatorApproval(operator) { super.setApprovalForAll(operator, approved); } function approve(address operator, uint256 tokenId) public payable override onlyAllowedOperatorApproval(operator) { super.approve(operator, tokenId); } function transferFrom(address from, address to, uint256 tokenId) public payable override onlyAllowedOperator(from) { super.transferFrom(from, to, tokenId); } function safeTransferFrom(address from, address to, uint256 tokenId) public payable override onlyAllowedOperator(from) { super.safeTransferFrom(from, to, tokenId); } function safeTransferFrom(address from, address to, uint256 tokenId, bytes memory data) public payable override onlyAllowedOperator(from) { super.safeTransferFrom(from, to, tokenId, data); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"string","name":"_tokenName","type":"string"},{"internalType":"string","name":"_tokenSymbol","type":"string"},{"internalType":"string","name":"_initBaseURI","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintERC2309QuantityExceedsLimit","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[{"internalType":"address","name":"operator","type":"address"}],"name":"OperatorNotAllowed","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"OwnershipNotInitializedForExtraData","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"inputs":[],"name":"URIQueryForNonexistentToken","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":"uint256","name":"fromTokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"toTokenId","type":"uint256"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"}],"name":"ConsecutiveTransfer","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":[],"name":"OPERATOR_FILTER_REGISTRY","outputs":[{"internalType":"contract IOperatorFilterRegistry","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"_receiver","type":"address[]"},{"internalType":"uint256","name":"_mintAmount","type":"uint256"}],"name":"airdrop","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"cost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"flipSaleState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxPerTx","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"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":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"payable","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":"payable","type":"function"},{"inputs":[],"name":"saleActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","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":"_newURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newCost","type":"uint256"}],"name":"setCost","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_uriSuffix","type":"string"}],"name":"setUriSuffix","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_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":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"uriSuffix","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"payable","type":"function"}]
Contract Creation Code
608060405260405180602001604052806000815250600a9081620000249190620006b0565b506040518060400160405280600581526020017f2e6a736f6e000000000000000000000000000000000000000000000000000000815250600b90816200006b9190620006b0565b50610af0600c556003600d55666a94d74f430000600e556000600f60006101000a81548160ff021916908315150217905550348015620000aa57600080fd5b5060405162003e5e38038062003e5e8339818101604052810190620000d09190620008fb565b733cc6cdda760b79bafa08df41ecfa224f810dceb6600184848160029081620000fa9190620006b0565b5080600390816200010c9190620006b0565b506200011d6200035f60201b60201c565b6000819055505050600160088190555060006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b111562000322578015620001e8576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff16637d3e3dbe30846040518363ffffffff1660e01b8152600401620001ae929190620009f9565b600060405180830381600087803b158015620001c957600080fd5b505af1158015620001de573d6000803e3d6000fd5b5050505062000321565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614620002a2576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663a0af290330846040518363ffffffff1660e01b815260040162000268929190620009f9565b600060405180830381600087803b1580156200028357600080fd5b505af115801562000298573d6000803e3d6000fd5b5050505062000320565b6daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff16634420e486306040518263ffffffff1660e01b8152600401620002eb919062000a26565b600060405180830381600087803b1580156200030657600080fd5b505af11580156200031b573d6000803e3d6000fd5b505050505b5b5b505062000344620003386200036860201b60201c565b6200037060201b60201c565b80600a9081620003559190620006b0565b5050505062000a43565b60006001905090565b600033905090565b6000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680620004b857607f821691505b602082108103620004ce57620004cd62000470565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302620005387fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82620004f9565b620005448683620004f9565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b6000620005916200058b62000585846200055c565b62000566565b6200055c565b9050919050565b6000819050919050565b620005ad8362000570565b620005c5620005bc8262000598565b84845462000506565b825550505050565b600090565b620005dc620005cd565b620005e9818484620005a2565b505050565b5b81811015620006115762000605600082620005d2565b600181019050620005ef565b5050565b601f82111562000660576200062a81620004d4565b6200063584620004e9565b8101602085101562000645578190505b6200065d6200065485620004e9565b830182620005ee565b50505b505050565b600082821c905092915050565b6000620006856000198460080262000665565b1980831691505092915050565b6000620006a0838362000672565b9150826002028217905092915050565b620006bb8262000436565b67ffffffffffffffff811115620006d757620006d662000441565b5b620006e382546200049f565b620006f082828562000615565b600060209050601f83116001811462000728576000841562000713578287015190505b6200071f858262000692565b8655506200078f565b601f1984166200073886620004d4565b60005b8281101562000762578489015182556001820191506020850194506020810190506200073b565b868310156200078257848901516200077e601f89168262000672565b8355505b6001600288020188555050505b505050505050565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b620007d182620007b5565b810181811067ffffffffffffffff82111715620007f357620007f262000441565b5b80604052505050565b60006200080862000797565b9050620008168282620007c6565b919050565b600067ffffffffffffffff82111562000839576200083862000441565b5b6200084482620007b5565b9050602081019050919050565b60005b838110156200087157808201518184015260208101905062000854565b60008484015250505050565b6000620008946200088e846200081b565b620007fc565b905082815260208101848484011115620008b357620008b2620007b0565b5b620008c084828562000851565b509392505050565b600082601f830112620008e057620008df620007ab565b5b8151620008f28482602086016200087d565b91505092915050565b600080600060608486031215620009175762000916620007a1565b5b600084015167ffffffffffffffff811115620009385762000937620007a6565b5b6200094686828701620008c8565b935050602084015167ffffffffffffffff8111156200096a5762000969620007a6565b5b6200097886828701620008c8565b925050604084015167ffffffffffffffff8111156200099c576200099b620007a6565b5b620009aa86828701620008c8565b9150509250925092565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620009e182620009b4565b9050919050565b620009f381620009d4565b82525050565b600060408201905062000a106000830185620009e8565b62000a1f6020830184620009e8565b9392505050565b600060208201905062000a3d6000830184620009e8565b92915050565b61340b8062000a536000396000f3fe6080604052600436106101d85760003560e01c80636352211e11610102578063a22cb46511610095578063d5abeb0111610064578063d5abeb0114610622578063e985e9c51461064d578063f2fde38b1461068a578063f968adbe146106b3576101d8565b8063a22cb46514610577578063b88d4fde146105a0578063c204642c146105bc578063c87b56dd146105e5576101d8565b8063715018a6116100d1578063715018a6146104ee5780638da5cb5b1461050557806395d89b4114610530578063a0712d681461055b576101d8565b80636352211e1461041e57806368428a1b1461045b5780636c0360eb1461048657806370a08231146104b1576101d8565b806323b872dd1161017a57806342842e0e1161014957806342842e0e1461038557806344a0d68a146103a15780635503a0e8146103ca57806355f804b3146103f5576101d8565b806323b872dd1461031d57806334918dfd146103395780633ccfd60b1461035057806341f434341461035a576101d8565b8063095ea7b3116101b6578063095ea7b31461028257806313faede61461029e57806316ba10e0146102c957806318160ddd146102f2576101d8565b806301ffc9a7146101dd57806306fdde031461021a578063081812fc14610245575b600080fd5b3480156101e957600080fd5b5061020460048036038101906101ff9190612193565b6106de565b60405161021191906121db565b60405180910390f35b34801561022657600080fd5b5061022f610770565b60405161023c9190612286565b60405180910390f35b34801561025157600080fd5b5061026c600480360381019061026791906122de565b610802565b604051610279919061234c565b60405180910390f35b61029c60048036038101906102979190612393565b610881565b005b3480156102aa57600080fd5b506102b361089a565b6040516102c091906123e2565b60405180910390f35b3480156102d557600080fd5b506102f060048036038101906102eb9190612532565b6108a0565b005b3480156102fe57600080fd5b506103076108bb565b60405161031491906123e2565b60405180910390f35b6103376004803603810190610332919061257b565b6108d2565b005b34801561034557600080fd5b5061034e610921565b005b610358610955565b005b34801561036657600080fd5b5061036f6109d6565b60405161037c919061262d565b60405180910390f35b61039f600480360381019061039a919061257b565b6109e8565b005b3480156103ad57600080fd5b506103c860048036038101906103c391906122de565b610a37565b005b3480156103d657600080fd5b506103df610a49565b6040516103ec9190612286565b60405180910390f35b34801561040157600080fd5b5061041c60048036038101906104179190612532565b610ad7565b005b34801561042a57600080fd5b50610445600480360381019061044091906122de565b610af2565b604051610452919061234c565b60405180910390f35b34801561046757600080fd5b50610470610b04565b60405161047d91906121db565b60405180910390f35b34801561049257600080fd5b5061049b610b17565b6040516104a89190612286565b60405180910390f35b3480156104bd57600080fd5b506104d860048036038101906104d39190612648565b610ba5565b6040516104e591906123e2565b60405180910390f35b3480156104fa57600080fd5b50610503610c5d565b005b34801561051157600080fd5b5061051a610c71565b604051610527919061234c565b60405180910390f35b34801561053c57600080fd5b50610545610c9b565b6040516105529190612286565b60405180910390f35b610575600480360381019061057091906122de565b610d2d565b005b34801561058357600080fd5b5061059e600480360381019061059991906126a1565b610ecf565b005b6105ba60048036038101906105b59190612782565b610ee8565b005b3480156105c857600080fd5b506105e360048036038101906105de91906128cd565b610f39565b005b3480156105f157600080fd5b5061060c600480360381019061060791906122de565b610fa9565b6040516106199190612286565b60405180910390f35b34801561062e57600080fd5b50610637611053565b60405161064491906123e2565b60405180910390f35b34801561065957600080fd5b50610674600480360381019061066f9190612929565b611059565b60405161068191906121db565b60405180910390f35b34801561069657600080fd5b506106b160048036038101906106ac9190612648565b6110ed565b005b3480156106bf57600080fd5b506106c8611170565b6040516106d591906123e2565b60405180910390f35b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061073957506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806107695750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b60606002805461077f90612998565b80601f01602080910402602001604051908101604052809291908181526020018280546107ab90612998565b80156107f85780601f106107cd576101008083540402835291602001916107f8565b820191906000526020600020905b8154815290600101906020018083116107db57829003601f168201915b5050505050905090565b600061080d82611176565b610843576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b8161088b816111d5565b61089583836112d2565b505050565b600e5481565b6108a86112e2565b80600b90816108b79190612b6b565b5050565b60006108c5611360565b6001546000540303905090565b823373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146109105761090f336111d5565b5b61091b848484611369565b50505050565b6109296112e2565b600f60009054906101000a900460ff1615600f60006101000a81548160ff021916908315150217905550565b61095d6112e2565b60003373ffffffffffffffffffffffffffffffffffffffff164760405161098390612c6e565b60006040518083038185875af1925050503d80600081146109c0576040519150601f19603f3d011682016040523d82523d6000602084013e6109c5565b606091505b50509050806109d357600080fd5b50565b6daaeb6d7670e522a718067333cd4e81565b823373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610a2657610a25336111d5565b5b610a3184848461168b565b50505050565b610a3f6112e2565b80600e8190555050565b600b8054610a5690612998565b80601f0160208091040260200160405190810160405280929190818152602001828054610a8290612998565b8015610acf5780601f10610aa457610100808354040283529160200191610acf565b820191906000526020600020905b815481529060010190602001808311610ab257829003601f168201915b505050505081565b610adf6112e2565b80600a9081610aee9190612b6b565b5050565b6000610afd826116ab565b9050919050565b600f60009054906101000a900460ff1681565b600a8054610b2490612998565b80601f0160208091040260200160405190810160405280929190818152602001828054610b5090612998565b8015610b9d5780601f10610b7257610100808354040283529160200191610b9d565b820191906000526020600020905b815481529060010190602001808311610b8057829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610c0c576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b610c656112e2565b610c6f60006117a3565b565b6000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060038054610caa90612998565b80601f0160208091040260200160405190810160405280929190818152602001828054610cd690612998565b8015610d235780601f10610cf857610100808354040283529160200191610d23565b820191906000526020600020905b815481529060010190602001808311610d0657829003601f168201915b5050505050905090565b610d35611869565b600f60009054906101000a900460ff16610d84576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d7b90612cf5565b60405180910390fd5b600c5481610d906108bb565b610d9a9190612d44565b1115610ddb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dd290612dc4565b60405180910390fd5b60008111610e1e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e1590612e56565b60405180910390fd5b600d54811115610e63576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e5a90612e56565b60405180910390fd5b600e5481610e719190612e76565b341015610eb3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eaa90612f04565b60405180910390fd5b610ec4610ebe6118b8565b826118c0565b610ecc6118de565b50565b81610ed9816111d5565b610ee383836118e8565b505050565b833373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610f2657610f25336111d5565b5b610f32858585856119f3565b5050505050565b610f416112e2565b610f49611869565b60005b8251811015610f9c57610f89838281518110610f6b57610f6a612f24565b5b60200260200101518360405180602001604052806000815250611a66565b8080610f9490612f53565b915050610f4c565b50610fa56118de565b5050565b6060610fb482611176565b610ff3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fea9061300d565b60405180910390fd5b6000610ffd611b03565b9050600081511161101d576040518060200160405280600081525061104b565b8061102784611b95565b600b60405160200161103b939291906130ec565b6040516020818303038152906040525b915050919050565b600c5481565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6110f56112e2565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611164576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161115b9061318f565b60405180910390fd5b61116d816117a3565b50565b600d5481565b600081611181611360565b11158015611190575060005482105b80156111ce575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b60006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b11156112cf576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430836040518363ffffffff1660e01b815260040161124c9291906131af565b602060405180830381865afa158015611269573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061128d91906131ed565b6112ce57806040517fede71dcc0000000000000000000000000000000000000000000000000000000081526004016112c5919061234c565b60405180910390fd5b5b50565b6112de82826001611be5565b5050565b6112ea6118b8565b73ffffffffffffffffffffffffffffffffffffffff16611308610c71565b73ffffffffffffffffffffffffffffffffffffffff161461135e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161135590613266565b60405180910390fd5b565b60006001905090565b6000611374826116ab565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146113db576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000806113e784611d31565b915091506113fd81876113f8611d58565b611d60565b611449576114128661140d611d58565b611059565b611448576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16036114af576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6114bc8686866001611da4565b80156114c757600082555b600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001019190508190555061159585611571888887611daa565b7c020000000000000000000000000000000000000000000000000000000017611dd2565b600460008681526020019081526020016000208190555060007c020000000000000000000000000000000000000000000000000000000084160361161b5760006001850190506000600460008381526020019081526020016000205403611619576000548114611618578360046000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46116838686866001611dfd565b505050505050565b6116a683838360405180602001604052806000815250610ee8565b505050565b6000816116b6611360565b1161176c576004600083815260200190815260200160002054905060007c010000000000000000000000000000000000000000000000000000000082160361176b576000810361176657600054821061173b576040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b60046000836001900393508381526020019081526020016000205490506000810361179e5761173c565b61179e565b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6002600854036118ae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118a5906132d2565b60405180910390fd5b6002600881905550565b600033905090565b6118da828260405180602001604052806000815250611a66565b5050565b6001600881905550565b80600760006118f5611d58565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166119a2611d58565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516119e791906121db565b60405180910390a35050565b6119fe8484846108d2565b60008373ffffffffffffffffffffffffffffffffffffffff163b14611a6057611a2984848484611e03565b611a5f576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b611a708383611f53565b60008373ffffffffffffffffffffffffffffffffffffffff163b14611afe57600080549050600083820390505b611ab06000868380600101945086611e03565b611ae6576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b818110611a9d578160005414611afb57600080fd5b50505b505050565b6060600a8054611b1290612998565b80601f0160208091040260200160405190810160405280929190818152602001828054611b3e90612998565b8015611b8b5780601f10611b6057610100808354040283529160200191611b8b565b820191906000526020600020905b815481529060010190602001808311611b6e57829003601f168201915b5050505050905090565b606060a060405101806040526020810391506000825281835b600115611bd057600184039350600a81066030018453600a8104905080611bae575b50828103602084039350808452505050919050565b6000611bf083610af2565b90508115611c7b578073ffffffffffffffffffffffffffffffffffffffff16611c17611d58565b73ffffffffffffffffffffffffffffffffffffffff1614611c7a57611c4381611c3e611d58565b611059565b611c79576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b5b836006600085815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550828473ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a450505050565b60008060006006600085815260200190815260200160002090508092508254915050915091565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e8611dc186868461210e565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02611e29611d58565b8786866040518563ffffffff1660e01b8152600401611e4b9493929190613347565b6020604051808303816000875af1925050508015611e8757506040513d601f19601f82011682018060405250810190611e8491906133a8565b60015b611f00573d8060008114611eb7576040519150601f19603f3d011682016040523d82523d6000602084013e611ebc565b606091505b506000815103611ef8576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b60008054905060008203611f93576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611fa06000848385611da4565b600160406001901b178202600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550612017836120086000866000611daa565b61201185612117565b17611dd2565b6004600083815260200190815260200160002081905550600080838301905073ffffffffffffffffffffffffffffffffffffffff85169150828260007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600183015b8181146120b857808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a460018101905061207d565b50600082036120f3576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060008190555050506121096000848385611dfd565b505050565b60009392505050565b60006001821460e11b9050919050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6121708161213b565b811461217b57600080fd5b50565b60008135905061218d81612167565b92915050565b6000602082840312156121a9576121a8612131565b5b60006121b78482850161217e565b91505092915050565b60008115159050919050565b6121d5816121c0565b82525050565b60006020820190506121f060008301846121cc565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612230578082015181840152602081019050612215565b60008484015250505050565b6000601f19601f8301169050919050565b6000612258826121f6565b6122628185612201565b9350612272818560208601612212565b61227b8161223c565b840191505092915050565b600060208201905081810360008301526122a0818461224d565b905092915050565b6000819050919050565b6122bb816122a8565b81146122c657600080fd5b50565b6000813590506122d8816122b2565b92915050565b6000602082840312156122f4576122f3612131565b5b6000612302848285016122c9565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006123368261230b565b9050919050565b6123468161232b565b82525050565b6000602082019050612361600083018461233d565b92915050565b6123708161232b565b811461237b57600080fd5b50565b60008135905061238d81612367565b92915050565b600080604083850312156123aa576123a9612131565b5b60006123b88582860161237e565b92505060206123c9858286016122c9565b9150509250929050565b6123dc816122a8565b82525050565b60006020820190506123f760008301846123d3565b92915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61243f8261223c565b810181811067ffffffffffffffff8211171561245e5761245d612407565b5b80604052505050565b6000612471612127565b905061247d8282612436565b919050565b600067ffffffffffffffff82111561249d5761249c612407565b5b6124a68261223c565b9050602081019050919050565b82818337600083830152505050565b60006124d56124d084612482565b612467565b9050828152602081018484840111156124f1576124f0612402565b5b6124fc8482856124b3565b509392505050565b600082601f830112612519576125186123fd565b5b81356125298482602086016124c2565b91505092915050565b60006020828403121561254857612547612131565b5b600082013567ffffffffffffffff81111561256657612565612136565b5b61257284828501612504565b91505092915050565b60008060006060848603121561259457612593612131565b5b60006125a28682870161237e565b93505060206125b38682870161237e565b92505060406125c4868287016122c9565b9150509250925092565b6000819050919050565b60006125f36125ee6125e98461230b565b6125ce565b61230b565b9050919050565b6000612605826125d8565b9050919050565b6000612617826125fa565b9050919050565b6126278161260c565b82525050565b6000602082019050612642600083018461261e565b92915050565b60006020828403121561265e5761265d612131565b5b600061266c8482850161237e565b91505092915050565b61267e816121c0565b811461268957600080fd5b50565b60008135905061269b81612675565b92915050565b600080604083850312156126b8576126b7612131565b5b60006126c68582860161237e565b92505060206126d78582860161268c565b9150509250929050565b600067ffffffffffffffff8211156126fc576126fb612407565b5b6127058261223c565b9050602081019050919050565b6000612725612720846126e1565b612467565b90508281526020810184848401111561274157612740612402565b5b61274c8482856124b3565b509392505050565b600082601f830112612769576127686123fd565b5b8135612779848260208601612712565b91505092915050565b6000806000806080858703121561279c5761279b612131565b5b60006127aa8782880161237e565b94505060206127bb8782880161237e565b93505060406127cc878288016122c9565b925050606085013567ffffffffffffffff8111156127ed576127ec612136565b5b6127f987828801612754565b91505092959194509250565b600067ffffffffffffffff8211156128205761281f612407565b5b602082029050602081019050919050565b600080fd5b600061284961284484612805565b612467565b9050808382526020820190506020840283018581111561286c5761286b612831565b5b835b818110156128955780612881888261237e565b84526020840193505060208101905061286e565b5050509392505050565b600082601f8301126128b4576128b36123fd565b5b81356128c4848260208601612836565b91505092915050565b600080604083850312156128e4576128e3612131565b5b600083013567ffffffffffffffff81111561290257612901612136565b5b61290e8582860161289f565b925050602061291f858286016122c9565b9150509250929050565b600080604083850312156129405761293f612131565b5b600061294e8582860161237e565b925050602061295f8582860161237e565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806129b057607f821691505b6020821081036129c3576129c2612969565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302612a2b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826129ee565b612a3586836129ee565b95508019841693508086168417925050509392505050565b6000612a68612a63612a5e846122a8565b6125ce565b6122a8565b9050919050565b6000819050919050565b612a8283612a4d565b612a96612a8e82612a6f565b8484546129fb565b825550505050565b600090565b612aab612a9e565b612ab6818484612a79565b505050565b5b81811015612ada57612acf600082612aa3565b600181019050612abc565b5050565b601f821115612b1f57612af0816129c9565b612af9846129de565b81016020851015612b08578190505b612b1c612b14856129de565b830182612abb565b50505b505050565b600082821c905092915050565b6000612b4260001984600802612b24565b1980831691505092915050565b6000612b5b8383612b31565b9150826002028217905092915050565b612b74826121f6565b67ffffffffffffffff811115612b8d57612b8c612407565b5b612b978254612998565b612ba2828285612ade565b600060209050601f831160018114612bd55760008415612bc3578287015190505b612bcd8582612b4f565b865550612c35565b601f198416612be3866129c9565b60005b82811015612c0b57848901518255600182019150602085019450602081019050612be6565b86831015612c285784890151612c24601f891682612b31565b8355505b6001600288020188555050505b505050505050565b600081905092915050565b50565b6000612c58600083612c3d565b9150612c6382612c48565b600082019050919050565b6000612c7982612c4b565b9150819050919050565b7f546865207075626c6963206d696e742069732063757272656e746c79206e6f7460008201527f2061637469766500000000000000000000000000000000000000000000000000602082015250565b6000612cdf602783612201565b9150612cea82612c83565b604082019050919050565b60006020820190508181036000830152612d0e81612cd2565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000612d4f826122a8565b9150612d5a836122a8565b9250828201905080821115612d7257612d71612d15565b5b92915050565b7f4d6178696d756d204e465420737570706c792065786365656465640000000000600082015250565b6000612dae601b83612201565b9150612db982612d78565b602082019050919050565b60006020820190508181036000830152612ddd81612da1565b9050919050565b7f4d696e7420616d6f756e74206d75737420626520626574776565203120616e6460008201527f2033000000000000000000000000000000000000000000000000000000000000602082015250565b6000612e40602283612201565b9150612e4b82612de4565b604082019050919050565b60006020820190508181036000830152612e6f81612e33565b9050919050565b6000612e81826122a8565b9150612e8c836122a8565b9250828202612e9a816122a8565b91508282048414831517612eb157612eb0612d15565b5b5092915050565b7f6e6f7420656e6f756768204554482073656e7400000000000000000000000000600082015250565b6000612eee601383612201565b9150612ef982612eb8565b602082019050919050565b60006020820190508181036000830152612f1d81612ee1565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000612f5e826122a8565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203612f9057612f8f612d15565b5b600182019050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b6000612ff7602f83612201565b915061300282612f9b565b604082019050919050565b6000602082019050818103600083015261302681612fea565b9050919050565b600081905092915050565b6000613043826121f6565b61304d818561302d565b935061305d818560208601612212565b80840191505092915050565b6000815461307681612998565b613080818661302d565b9450600182166000811461309b57600181146130b0576130e3565b60ff19831686528115158202860193506130e3565b6130b9856129c9565b60005b838110156130db578154818901526001820191506020810190506130bc565b838801955050505b50505092915050565b60006130f88286613038565b91506131048285613038565b91506131108284613069565b9150819050949350505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000613179602683612201565b91506131848261311d565b604082019050919050565b600060208201905081810360008301526131a88161316c565b9050919050565b60006040820190506131c4600083018561233d565b6131d1602083018461233d565b9392505050565b6000815190506131e781612675565b92915050565b60006020828403121561320357613202612131565b5b6000613211848285016131d8565b91505092915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000613250602083612201565b915061325b8261321a565b602082019050919050565b6000602082019050818103600083015261327f81613243565b9050919050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b60006132bc601f83612201565b91506132c782613286565b602082019050919050565b600060208201905081810360008301526132eb816132af565b9050919050565b600081519050919050565b600082825260208201905092915050565b6000613319826132f2565b61332381856132fd565b9350613333818560208601612212565b61333c8161223c565b840191505092915050565b600060808201905061335c600083018761233d565b613369602083018661233d565b61337660408301856123d3565b8181036060830152613388818461330e565b905095945050505050565b6000815190506133a281612167565b92915050565b6000602082840312156133be576133bd612131565b5b60006133cc84828501613393565b9150509291505056fea26469706673582212200e165552da07799be9afcc97f0b2a4fe88c9ea66c7ec0ef617e6b93d022aa8a664736f6c63430008110033000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000000000001243727974706f537765657047656e65736973000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000034353470000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002468747470733a2f2f6170692e63727970746f73776565702e78797a2f67656e657369732f00000000000000000000000000000000000000000000000000000000
Deployed Bytecode
0x6080604052600436106101d85760003560e01c80636352211e11610102578063a22cb46511610095578063d5abeb0111610064578063d5abeb0114610622578063e985e9c51461064d578063f2fde38b1461068a578063f968adbe146106b3576101d8565b8063a22cb46514610577578063b88d4fde146105a0578063c204642c146105bc578063c87b56dd146105e5576101d8565b8063715018a6116100d1578063715018a6146104ee5780638da5cb5b1461050557806395d89b4114610530578063a0712d681461055b576101d8565b80636352211e1461041e57806368428a1b1461045b5780636c0360eb1461048657806370a08231146104b1576101d8565b806323b872dd1161017a57806342842e0e1161014957806342842e0e1461038557806344a0d68a146103a15780635503a0e8146103ca57806355f804b3146103f5576101d8565b806323b872dd1461031d57806334918dfd146103395780633ccfd60b1461035057806341f434341461035a576101d8565b8063095ea7b3116101b6578063095ea7b31461028257806313faede61461029e57806316ba10e0146102c957806318160ddd146102f2576101d8565b806301ffc9a7146101dd57806306fdde031461021a578063081812fc14610245575b600080fd5b3480156101e957600080fd5b5061020460048036038101906101ff9190612193565b6106de565b60405161021191906121db565b60405180910390f35b34801561022657600080fd5b5061022f610770565b60405161023c9190612286565b60405180910390f35b34801561025157600080fd5b5061026c600480360381019061026791906122de565b610802565b604051610279919061234c565b60405180910390f35b61029c60048036038101906102979190612393565b610881565b005b3480156102aa57600080fd5b506102b361089a565b6040516102c091906123e2565b60405180910390f35b3480156102d557600080fd5b506102f060048036038101906102eb9190612532565b6108a0565b005b3480156102fe57600080fd5b506103076108bb565b60405161031491906123e2565b60405180910390f35b6103376004803603810190610332919061257b565b6108d2565b005b34801561034557600080fd5b5061034e610921565b005b610358610955565b005b34801561036657600080fd5b5061036f6109d6565b60405161037c919061262d565b60405180910390f35b61039f600480360381019061039a919061257b565b6109e8565b005b3480156103ad57600080fd5b506103c860048036038101906103c391906122de565b610a37565b005b3480156103d657600080fd5b506103df610a49565b6040516103ec9190612286565b60405180910390f35b34801561040157600080fd5b5061041c60048036038101906104179190612532565b610ad7565b005b34801561042a57600080fd5b50610445600480360381019061044091906122de565b610af2565b604051610452919061234c565b60405180910390f35b34801561046757600080fd5b50610470610b04565b60405161047d91906121db565b60405180910390f35b34801561049257600080fd5b5061049b610b17565b6040516104a89190612286565b60405180910390f35b3480156104bd57600080fd5b506104d860048036038101906104d39190612648565b610ba5565b6040516104e591906123e2565b60405180910390f35b3480156104fa57600080fd5b50610503610c5d565b005b34801561051157600080fd5b5061051a610c71565b604051610527919061234c565b60405180910390f35b34801561053c57600080fd5b50610545610c9b565b6040516105529190612286565b60405180910390f35b610575600480360381019061057091906122de565b610d2d565b005b34801561058357600080fd5b5061059e600480360381019061059991906126a1565b610ecf565b005b6105ba60048036038101906105b59190612782565b610ee8565b005b3480156105c857600080fd5b506105e360048036038101906105de91906128cd565b610f39565b005b3480156105f157600080fd5b5061060c600480360381019061060791906122de565b610fa9565b6040516106199190612286565b60405180910390f35b34801561062e57600080fd5b50610637611053565b60405161064491906123e2565b60405180910390f35b34801561065957600080fd5b50610674600480360381019061066f9190612929565b611059565b60405161068191906121db565b60405180910390f35b34801561069657600080fd5b506106b160048036038101906106ac9190612648565b6110ed565b005b3480156106bf57600080fd5b506106c8611170565b6040516106d591906123e2565b60405180910390f35b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061073957506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806107695750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b60606002805461077f90612998565b80601f01602080910402602001604051908101604052809291908181526020018280546107ab90612998565b80156107f85780601f106107cd576101008083540402835291602001916107f8565b820191906000526020600020905b8154815290600101906020018083116107db57829003601f168201915b5050505050905090565b600061080d82611176565b610843576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b8161088b816111d5565b61089583836112d2565b505050565b600e5481565b6108a86112e2565b80600b90816108b79190612b6b565b5050565b60006108c5611360565b6001546000540303905090565b823373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146109105761090f336111d5565b5b61091b848484611369565b50505050565b6109296112e2565b600f60009054906101000a900460ff1615600f60006101000a81548160ff021916908315150217905550565b61095d6112e2565b60003373ffffffffffffffffffffffffffffffffffffffff164760405161098390612c6e565b60006040518083038185875af1925050503d80600081146109c0576040519150601f19603f3d011682016040523d82523d6000602084013e6109c5565b606091505b50509050806109d357600080fd5b50565b6daaeb6d7670e522a718067333cd4e81565b823373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610a2657610a25336111d5565b5b610a3184848461168b565b50505050565b610a3f6112e2565b80600e8190555050565b600b8054610a5690612998565b80601f0160208091040260200160405190810160405280929190818152602001828054610a8290612998565b8015610acf5780601f10610aa457610100808354040283529160200191610acf565b820191906000526020600020905b815481529060010190602001808311610ab257829003601f168201915b505050505081565b610adf6112e2565b80600a9081610aee9190612b6b565b5050565b6000610afd826116ab565b9050919050565b600f60009054906101000a900460ff1681565b600a8054610b2490612998565b80601f0160208091040260200160405190810160405280929190818152602001828054610b5090612998565b8015610b9d5780601f10610b7257610100808354040283529160200191610b9d565b820191906000526020600020905b815481529060010190602001808311610b8057829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610c0c576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b610c656112e2565b610c6f60006117a3565b565b6000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060038054610caa90612998565b80601f0160208091040260200160405190810160405280929190818152602001828054610cd690612998565b8015610d235780601f10610cf857610100808354040283529160200191610d23565b820191906000526020600020905b815481529060010190602001808311610d0657829003601f168201915b5050505050905090565b610d35611869565b600f60009054906101000a900460ff16610d84576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d7b90612cf5565b60405180910390fd5b600c5481610d906108bb565b610d9a9190612d44565b1115610ddb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dd290612dc4565b60405180910390fd5b60008111610e1e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e1590612e56565b60405180910390fd5b600d54811115610e63576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e5a90612e56565b60405180910390fd5b600e5481610e719190612e76565b341015610eb3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eaa90612f04565b60405180910390fd5b610ec4610ebe6118b8565b826118c0565b610ecc6118de565b50565b81610ed9816111d5565b610ee383836118e8565b505050565b833373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610f2657610f25336111d5565b5b610f32858585856119f3565b5050505050565b610f416112e2565b610f49611869565b60005b8251811015610f9c57610f89838281518110610f6b57610f6a612f24565b5b60200260200101518360405180602001604052806000815250611a66565b8080610f9490612f53565b915050610f4c565b50610fa56118de565b5050565b6060610fb482611176565b610ff3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fea9061300d565b60405180910390fd5b6000610ffd611b03565b9050600081511161101d576040518060200160405280600081525061104b565b8061102784611b95565b600b60405160200161103b939291906130ec565b6040516020818303038152906040525b915050919050565b600c5481565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6110f56112e2565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611164576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161115b9061318f565b60405180910390fd5b61116d816117a3565b50565b600d5481565b600081611181611360565b11158015611190575060005482105b80156111ce575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b60006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b11156112cf576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430836040518363ffffffff1660e01b815260040161124c9291906131af565b602060405180830381865afa158015611269573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061128d91906131ed565b6112ce57806040517fede71dcc0000000000000000000000000000000000000000000000000000000081526004016112c5919061234c565b60405180910390fd5b5b50565b6112de82826001611be5565b5050565b6112ea6118b8565b73ffffffffffffffffffffffffffffffffffffffff16611308610c71565b73ffffffffffffffffffffffffffffffffffffffff161461135e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161135590613266565b60405180910390fd5b565b60006001905090565b6000611374826116ab565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146113db576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000806113e784611d31565b915091506113fd81876113f8611d58565b611d60565b611449576114128661140d611d58565b611059565b611448576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16036114af576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6114bc8686866001611da4565b80156114c757600082555b600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001019190508190555061159585611571888887611daa565b7c020000000000000000000000000000000000000000000000000000000017611dd2565b600460008681526020019081526020016000208190555060007c020000000000000000000000000000000000000000000000000000000084160361161b5760006001850190506000600460008381526020019081526020016000205403611619576000548114611618578360046000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46116838686866001611dfd565b505050505050565b6116a683838360405180602001604052806000815250610ee8565b505050565b6000816116b6611360565b1161176c576004600083815260200190815260200160002054905060007c010000000000000000000000000000000000000000000000000000000082160361176b576000810361176657600054821061173b576040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b60046000836001900393508381526020019081526020016000205490506000810361179e5761173c565b61179e565b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6002600854036118ae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118a5906132d2565b60405180910390fd5b6002600881905550565b600033905090565b6118da828260405180602001604052806000815250611a66565b5050565b6001600881905550565b80600760006118f5611d58565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166119a2611d58565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516119e791906121db565b60405180910390a35050565b6119fe8484846108d2565b60008373ffffffffffffffffffffffffffffffffffffffff163b14611a6057611a2984848484611e03565b611a5f576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b611a708383611f53565b60008373ffffffffffffffffffffffffffffffffffffffff163b14611afe57600080549050600083820390505b611ab06000868380600101945086611e03565b611ae6576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b818110611a9d578160005414611afb57600080fd5b50505b505050565b6060600a8054611b1290612998565b80601f0160208091040260200160405190810160405280929190818152602001828054611b3e90612998565b8015611b8b5780601f10611b6057610100808354040283529160200191611b8b565b820191906000526020600020905b815481529060010190602001808311611b6e57829003601f168201915b5050505050905090565b606060a060405101806040526020810391506000825281835b600115611bd057600184039350600a81066030018453600a8104905080611bae575b50828103602084039350808452505050919050565b6000611bf083610af2565b90508115611c7b578073ffffffffffffffffffffffffffffffffffffffff16611c17611d58565b73ffffffffffffffffffffffffffffffffffffffff1614611c7a57611c4381611c3e611d58565b611059565b611c79576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b5b836006600085815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550828473ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a450505050565b60008060006006600085815260200190815260200160002090508092508254915050915091565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e8611dc186868461210e565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02611e29611d58565b8786866040518563ffffffff1660e01b8152600401611e4b9493929190613347565b6020604051808303816000875af1925050508015611e8757506040513d601f19601f82011682018060405250810190611e8491906133a8565b60015b611f00573d8060008114611eb7576040519150601f19603f3d011682016040523d82523d6000602084013e611ebc565b606091505b506000815103611ef8576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b60008054905060008203611f93576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611fa06000848385611da4565b600160406001901b178202600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550612017836120086000866000611daa565b61201185612117565b17611dd2565b6004600083815260200190815260200160002081905550600080838301905073ffffffffffffffffffffffffffffffffffffffff85169150828260007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600183015b8181146120b857808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a460018101905061207d565b50600082036120f3576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060008190555050506121096000848385611dfd565b505050565b60009392505050565b60006001821460e11b9050919050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6121708161213b565b811461217b57600080fd5b50565b60008135905061218d81612167565b92915050565b6000602082840312156121a9576121a8612131565b5b60006121b78482850161217e565b91505092915050565b60008115159050919050565b6121d5816121c0565b82525050565b60006020820190506121f060008301846121cc565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612230578082015181840152602081019050612215565b60008484015250505050565b6000601f19601f8301169050919050565b6000612258826121f6565b6122628185612201565b9350612272818560208601612212565b61227b8161223c565b840191505092915050565b600060208201905081810360008301526122a0818461224d565b905092915050565b6000819050919050565b6122bb816122a8565b81146122c657600080fd5b50565b6000813590506122d8816122b2565b92915050565b6000602082840312156122f4576122f3612131565b5b6000612302848285016122c9565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006123368261230b565b9050919050565b6123468161232b565b82525050565b6000602082019050612361600083018461233d565b92915050565b6123708161232b565b811461237b57600080fd5b50565b60008135905061238d81612367565b92915050565b600080604083850312156123aa576123a9612131565b5b60006123b88582860161237e565b92505060206123c9858286016122c9565b9150509250929050565b6123dc816122a8565b82525050565b60006020820190506123f760008301846123d3565b92915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61243f8261223c565b810181811067ffffffffffffffff8211171561245e5761245d612407565b5b80604052505050565b6000612471612127565b905061247d8282612436565b919050565b600067ffffffffffffffff82111561249d5761249c612407565b5b6124a68261223c565b9050602081019050919050565b82818337600083830152505050565b60006124d56124d084612482565b612467565b9050828152602081018484840111156124f1576124f0612402565b5b6124fc8482856124b3565b509392505050565b600082601f830112612519576125186123fd565b5b81356125298482602086016124c2565b91505092915050565b60006020828403121561254857612547612131565b5b600082013567ffffffffffffffff81111561256657612565612136565b5b61257284828501612504565b91505092915050565b60008060006060848603121561259457612593612131565b5b60006125a28682870161237e565b93505060206125b38682870161237e565b92505060406125c4868287016122c9565b9150509250925092565b6000819050919050565b60006125f36125ee6125e98461230b565b6125ce565b61230b565b9050919050565b6000612605826125d8565b9050919050565b6000612617826125fa565b9050919050565b6126278161260c565b82525050565b6000602082019050612642600083018461261e565b92915050565b60006020828403121561265e5761265d612131565b5b600061266c8482850161237e565b91505092915050565b61267e816121c0565b811461268957600080fd5b50565b60008135905061269b81612675565b92915050565b600080604083850312156126b8576126b7612131565b5b60006126c68582860161237e565b92505060206126d78582860161268c565b9150509250929050565b600067ffffffffffffffff8211156126fc576126fb612407565b5b6127058261223c565b9050602081019050919050565b6000612725612720846126e1565b612467565b90508281526020810184848401111561274157612740612402565b5b61274c8482856124b3565b509392505050565b600082601f830112612769576127686123fd565b5b8135612779848260208601612712565b91505092915050565b6000806000806080858703121561279c5761279b612131565b5b60006127aa8782880161237e565b94505060206127bb8782880161237e565b93505060406127cc878288016122c9565b925050606085013567ffffffffffffffff8111156127ed576127ec612136565b5b6127f987828801612754565b91505092959194509250565b600067ffffffffffffffff8211156128205761281f612407565b5b602082029050602081019050919050565b600080fd5b600061284961284484612805565b612467565b9050808382526020820190506020840283018581111561286c5761286b612831565b5b835b818110156128955780612881888261237e565b84526020840193505060208101905061286e565b5050509392505050565b600082601f8301126128b4576128b36123fd565b5b81356128c4848260208601612836565b91505092915050565b600080604083850312156128e4576128e3612131565b5b600083013567ffffffffffffffff81111561290257612901612136565b5b61290e8582860161289f565b925050602061291f858286016122c9565b9150509250929050565b600080604083850312156129405761293f612131565b5b600061294e8582860161237e565b925050602061295f8582860161237e565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806129b057607f821691505b6020821081036129c3576129c2612969565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302612a2b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826129ee565b612a3586836129ee565b95508019841693508086168417925050509392505050565b6000612a68612a63612a5e846122a8565b6125ce565b6122a8565b9050919050565b6000819050919050565b612a8283612a4d565b612a96612a8e82612a6f565b8484546129fb565b825550505050565b600090565b612aab612a9e565b612ab6818484612a79565b505050565b5b81811015612ada57612acf600082612aa3565b600181019050612abc565b5050565b601f821115612b1f57612af0816129c9565b612af9846129de565b81016020851015612b08578190505b612b1c612b14856129de565b830182612abb565b50505b505050565b600082821c905092915050565b6000612b4260001984600802612b24565b1980831691505092915050565b6000612b5b8383612b31565b9150826002028217905092915050565b612b74826121f6565b67ffffffffffffffff811115612b8d57612b8c612407565b5b612b978254612998565b612ba2828285612ade565b600060209050601f831160018114612bd55760008415612bc3578287015190505b612bcd8582612b4f565b865550612c35565b601f198416612be3866129c9565b60005b82811015612c0b57848901518255600182019150602085019450602081019050612be6565b86831015612c285784890151612c24601f891682612b31565b8355505b6001600288020188555050505b505050505050565b600081905092915050565b50565b6000612c58600083612c3d565b9150612c6382612c48565b600082019050919050565b6000612c7982612c4b565b9150819050919050565b7f546865207075626c6963206d696e742069732063757272656e746c79206e6f7460008201527f2061637469766500000000000000000000000000000000000000000000000000602082015250565b6000612cdf602783612201565b9150612cea82612c83565b604082019050919050565b60006020820190508181036000830152612d0e81612cd2565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000612d4f826122a8565b9150612d5a836122a8565b9250828201905080821115612d7257612d71612d15565b5b92915050565b7f4d6178696d756d204e465420737570706c792065786365656465640000000000600082015250565b6000612dae601b83612201565b9150612db982612d78565b602082019050919050565b60006020820190508181036000830152612ddd81612da1565b9050919050565b7f4d696e7420616d6f756e74206d75737420626520626574776565203120616e6460008201527f2033000000000000000000000000000000000000000000000000000000000000602082015250565b6000612e40602283612201565b9150612e4b82612de4565b604082019050919050565b60006020820190508181036000830152612e6f81612e33565b9050919050565b6000612e81826122a8565b9150612e8c836122a8565b9250828202612e9a816122a8565b91508282048414831517612eb157612eb0612d15565b5b5092915050565b7f6e6f7420656e6f756768204554482073656e7400000000000000000000000000600082015250565b6000612eee601383612201565b9150612ef982612eb8565b602082019050919050565b60006020820190508181036000830152612f1d81612ee1565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000612f5e826122a8565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203612f9057612f8f612d15565b5b600182019050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b6000612ff7602f83612201565b915061300282612f9b565b604082019050919050565b6000602082019050818103600083015261302681612fea565b9050919050565b600081905092915050565b6000613043826121f6565b61304d818561302d565b935061305d818560208601612212565b80840191505092915050565b6000815461307681612998565b613080818661302d565b9450600182166000811461309b57600181146130b0576130e3565b60ff19831686528115158202860193506130e3565b6130b9856129c9565b60005b838110156130db578154818901526001820191506020810190506130bc565b838801955050505b50505092915050565b60006130f88286613038565b91506131048285613038565b91506131108284613069565b9150819050949350505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000613179602683612201565b91506131848261311d565b604082019050919050565b600060208201905081810360008301526131a88161316c565b9050919050565b60006040820190506131c4600083018561233d565b6131d1602083018461233d565b9392505050565b6000815190506131e781612675565b92915050565b60006020828403121561320357613202612131565b5b6000613211848285016131d8565b91505092915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000613250602083612201565b915061325b8261321a565b602082019050919050565b6000602082019050818103600083015261327f81613243565b9050919050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b60006132bc601f83612201565b91506132c782613286565b602082019050919050565b600060208201905081810360008301526132eb816132af565b9050919050565b600081519050919050565b600082825260208201905092915050565b6000613319826132f2565b61332381856132fd565b9350613333818560208601612212565b61333c8161223c565b840191505092915050565b600060808201905061335c600083018761233d565b613369602083018661233d565b61337660408301856123d3565b8181036060830152613388818461330e565b905095945050505050565b6000815190506133a281612167565b92915050565b6000602082840312156133be576133bd612131565b5b60006133cc84828501613393565b9150509291505056fea26469706673582212200e165552da07799be9afcc97f0b2a4fe88c9ea66c7ec0ef617e6b93d022aa8a664736f6c63430008110033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000000000001243727974706f537765657047656e65736973000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000034353470000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002468747470733a2f2f6170692e63727970746f73776565702e78797a2f67656e657369732f00000000000000000000000000000000000000000000000000000000
-----Decoded View---------------
Arg [0] : _tokenName (string): CrytpoSweepGenesis
Arg [1] : _tokenSymbol (string): CSG
Arg [2] : _initBaseURI (string): https://api.cryptosweep.xyz/genesis/
-----Encoded View---------------
10 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000060
Arg [1] : 00000000000000000000000000000000000000000000000000000000000000a0
Arg [2] : 00000000000000000000000000000000000000000000000000000000000000e0
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000012
Arg [4] : 43727974706f537765657047656e657369730000000000000000000000000000
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000003
Arg [6] : 4353470000000000000000000000000000000000000000000000000000000000
Arg [7] : 0000000000000000000000000000000000000000000000000000000000000024
Arg [8] : 68747470733a2f2f6170692e63727970746f73776565702e78797a2f67656e65
Arg [9] : 7369732f00000000000000000000000000000000000000000000000000000000
Deployed Bytecode Sourcemap
64754:4001:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30486:639;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31388:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37788:218;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;68009:165;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;65110:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;67271:106;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;27139:323;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;68182:171;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;67385:85;;;;;;;;;;;;;:::i;:::-;;67572:168;;;:::i;:::-;;3351:143;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;68361:179;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;67478:86;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;64939:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;67167:96;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;32781:152;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;65214:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;64906:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28323:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;11413:103;;;;;;;;;;;;;:::i;:::-;;10765:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31564:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;65566:541;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;67825:176;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;68548:204;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;66115:231;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;66414:395;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;65038:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38737:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;11671:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;65076:27;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30486:639;30571:4;30910:10;30895:25;;:11;:25;;;;:102;;;;30987:10;30972:25;;:11;:25;;;;30895:102;:179;;;;31064:10;31049:25;;:11;:25;;;;30895:179;30875:199;;30486:639;;;:::o;31388:100::-;31442:13;31475:5;31468:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31388:100;:::o;37788:218::-;37864:7;37889:16;37897:7;37889;:16::i;:::-;37884:64;;37914:34;;;;;;;;;;;;;;37884:64;37968:15;:24;37984:7;37968:24;;;;;;;;;;;:30;;;;;;;;;;;;37961:37;;37788:218;;;:::o;68009:165::-;68113:8;4872:30;4893:8;4872:20;:30::i;:::-;68134:32:::1;68148:8;68158:7;68134:13;:32::i;:::-;68009:165:::0;;;:::o;65110:32::-;;;;:::o;67271:106::-;10651:13;:11;:13::i;:::-;67359:10:::1;67347:9;:22;;;;;;:::i;:::-;;67271:106:::0;:::o;27139:323::-;27200:7;27428:15;:13;:15::i;:::-;27413:12;;27397:13;;:28;:46;27390:53;;27139:323;:::o;68182:171::-;68291:4;4700:10;4692:18;;:4;:18;;;4688:83;;4727:32;4748:10;4727:20;:32::i;:::-;4688:83;68308:37:::1;68327:4;68333:2;68337:7;68308:18;:37::i;:::-;68182:171:::0;;;;:::o;67385:85::-;10651:13;:11;:13::i;:::-;67452:10:::1;;;;;;;;;;;67451:11;67438:10;;:24;;;;;;;;;;;;;;;;;;67385:85::o:0;67572:168::-;10651:13;:11;:13::i;:::-;67629:12:::1;67655:10;67647:24;;67679:21;67647:58;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;67628:77;;;67724:7;67716:16;;;::::0;::::1;;67617:123;67572:168::o:0;3351:143::-;3451:42;3351:143;:::o;68361:179::-;68474:4;4700:10;4692:18;;:4;:18;;;4688:83;;4727:32;4748:10;4727:20;:32::i;:::-;4688:83;68491:41:::1;68514:4;68520:2;68524:7;68491:22;:41::i;:::-;68361:179:::0;;;;:::o;67478:86::-;10651:13;:11;:13::i;:::-;67548:8:::1;67541:4;:15;;;;67478:86:::0;:::o;64939:33::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;67167:96::-;10651:13;:11;:13::i;:::-;67248:7:::1;67238;:17;;;;;;:::i;:::-;;67167:96:::0;:::o;32781:152::-;32853:7;32896:27;32915:7;32896:18;:27::i;:::-;32873:52;;32781:152;;;:::o;65214:30::-;;;;;;;;;;;;;:::o;64906:26::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;28323:233::-;28395:7;28436:1;28419:19;;:5;:19;;;28415:60;;28447:28;;;;;;;;;;;;;;28415:60;22482:13;28493:18;:25;28512:5;28493:25;;;;;;;;;;;;;;;;:55;28486:62;;28323:233;;;:::o;11413:103::-;10651:13;:11;:13::i;:::-;11478:30:::1;11505:1;11478:18;:30::i;:::-;11413:103::o:0;10765:87::-;10811:7;10838:6;;;;;;;;;;;10831:13;;10765:87;:::o;31564:104::-;31620:13;31653:7;31646:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31564:104;:::o;65566:541::-;8104:21;:19;:21::i;:::-;65650:10:::1;;;;;;;;;;;65642:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;65754:9;;65739:11;65723:13;:11;:13::i;:::-;:27;;;;:::i;:::-;:40;;65715:80;;;;;;;;;;;;:::i;:::-;;;;;;;;;65830:1;65816:11;:15;65808:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;65904:8;;65889:11;:23;;65881:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;65999:4;;65985:11;:18;;;;:::i;:::-;65972:9;:31;;65964:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;66061:36;66071:12;:10;:12::i;:::-;66085:11;66061:9;:36::i;:::-;8148:20:::0;:18;:20::i;:::-;65566:541;:::o;67825:176::-;67929:8;4872:30;4893:8;4872:20;:30::i;:::-;67950:43:::1;67974:8;67984;67950:23;:43::i;:::-;67825:176:::0;;;:::o;68548:204::-;68680:4;4700:10;4692:18;;:4;:18;;;4688:83;;4727:32;4748:10;4727:20;:32::i;:::-;4688:83;68697:47:::1;68720:4;68726:2;68730:7;68739:4;68697:22;:47::i;:::-;68548:204:::0;;;;;:::o;66115:231::-;10651:13;:11;:13::i;:::-;8104:21:::1;:19;:21::i;:::-;66228:9:::2;66224:113;66247:9;:16;66243:1;:20;66224:113;;;66285:40;66295:9;66305:1;66295:12;;;;;;;;:::i;:::-;;;;;;;;66309:11;66285:40;;;;;;;;;;;::::0;:9:::2;:40::i;:::-;66265:3;;;;;:::i;:::-;;;;66224:113;;;;8148:20:::1;:18;:20::i;:::-;66115:231:::0;;:::o;66414:395::-;66488:13;66522:17;66530:8;66522:7;:17::i;:::-;66514:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;66604:28;66635:10;:8;:10::i;:::-;66604:41;;66694:1;66669:14;66663:28;:32;:138;;;;;;;;;;;;;;;;;66735:14;66751:19;66761:8;66751:9;:19::i;:::-;66772:9;66718:64;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;66663:138;66656:145;;;66414:395;;;:::o;65038:31::-;;;;:::o;38737:164::-;38834:4;38858:18;:25;38877:5;38858:25;;;;;;;;;;;;;;;:35;38884:8;38858:35;;;;;;;;;;;;;;;;;;;;;;;;;38851:42;;38737:164;;;;:::o;11671:201::-;10651:13;:11;:13::i;:::-;11780:1:::1;11760:22;;:8;:22;;::::0;11752:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;11836:28;11855:8;11836:18;:28::i;:::-;11671:201:::0;:::o;65076:27::-;;;;:::o;39159:282::-;39224:4;39280:7;39261:15;:13;:15::i;:::-;:26;;:66;;;;;39314:13;;39304:7;:23;39261:66;:153;;;;;39413:1;23258:8;39365:17;:26;39383:7;39365:26;;;;;;;;;;;;:44;:49;39261:153;39241:173;;39159:282;;;:::o;4930:419::-;5169:1;3451:42;5121:45;;;:49;5117:225;;;3451:42;5192;;;5243:4;5250:8;5192:67;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;5187:144;;5306:8;5287:28;;;;;;;;;;;:::i;:::-;;;;;;;;5187:144;5117:225;4930:419;:::o;37505:124::-;37594:27;37603:2;37607:7;37616:4;37594:8;:27::i;:::-;37505:124;;:::o;10930:132::-;11005:12;:10;:12::i;:::-;10994:23;;:7;:5;:7::i;:::-;:23;;;10986:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;10930:132::o;66879:101::-;66944:7;66971:1;66964:8;;66879:101;:::o;41427:2825::-;41569:27;41599;41618:7;41599:18;:27::i;:::-;41569:57;;41684:4;41643:45;;41659:19;41643:45;;;41639:86;;41697:28;;;;;;;;;;;;;;41639:86;41739:27;41768:23;41795:35;41822:7;41795:26;:35::i;:::-;41738:92;;;;41930:68;41955:15;41972:4;41978:19;:17;:19::i;:::-;41930:24;:68::i;:::-;41925:180;;42018:43;42035:4;42041:19;:17;:19::i;:::-;42018:16;:43::i;:::-;42013:92;;42070:35;;;;;;;;;;;;;;42013:92;41925:180;42136:1;42122:16;;:2;:16;;;42118:52;;42147:23;;;;;;;;;;;;;;42118:52;42183:43;42205:4;42211:2;42215:7;42224:1;42183:21;:43::i;:::-;42319:15;42316:160;;;42459:1;42438:19;42431:30;42316:160;42856:18;:24;42875:4;42856:24;;;;;;;;;;;;;;;;42854:26;;;;;;;;;;;;42925:18;:22;42944:2;42925:22;;;;;;;;;;;;;;;;42923:24;;;;;;;;;;;43247:146;43284:2;43333:45;43348:4;43354:2;43358:19;43333:14;:45::i;:::-;23538:8;43305:73;43247:18;:146::i;:::-;43218:17;:26;43236:7;43218:26;;;;;;;;;;;:175;;;;43564:1;23538:8;43513:19;:47;:52;43509:627;;43586:19;43618:1;43608:7;:11;43586:33;;43775:1;43741:17;:30;43759:11;43741:30;;;;;;;;;;;;:35;43737:384;;43879:13;;43864:11;:28;43860:242;;44059:19;44026:17;:30;44044:11;44026:30;;;;;;;;;;;:52;;;;43860:242;43737:384;43567:569;43509:627;44183:7;44179:2;44164:27;;44173:4;44164:27;;;;;;;;;;;;44202:42;44223:4;44229:2;44233:7;44242:1;44202:20;:42::i;:::-;41558:2694;;;41427:2825;;;:::o;44348:193::-;44494:39;44511:4;44517:2;44521:7;44494:39;;;;;;;;;;;;:16;:39::i;:::-;44348:193;;;:::o;33936:1712::-;34003:14;34053:7;34034:15;:13;:15::i;:::-;:26;34030:1562;;34086:17;:26;34104:7;34086:26;;;;;;;;;;;;34077:35;;34190:1;23258:8;34162:6;:24;:29;34158:1423;;34311:1;34301:6;:11;34297:981;;34352:13;;34341:7;:24;34337:68;;34374:31;;;;;;;;;;;;;;34337:68;35002:257;35088:17;:28;35106:9;;;;;;;35088:28;;;;;;;;;;;;35079:37;;35184:1;35174:6;:11;35222:13;35170:25;35002:257;;34297:981;35552:13;;34158:1423;34030:1562;35609:31;;;;;;;;;;;;;;33936:1712;;;;:::o;12032:191::-;12106:16;12125:6;;;;;;;;;;;12106:25;;12151:8;12142:6;;:17;;;;;;;;;;;;;;;;;;12206:8;12175:40;;12196:8;12175:40;;;;;;;;;;;;12095:128;12032:191;:::o;8184:293::-;7586:1;8318:7;;:19;8310:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;7586:1;8451:7;:18;;;;8184:293::o;9324:98::-;9377:7;9404:10;9397:17;;9324:98;:::o;55299:112::-;55376:27;55386:2;55390:8;55376:27;;;;;;;;;;;;:9;:27::i;:::-;55299:112;;:::o;8485:213::-;7542:1;8668:7;:22;;;;8485:213::o;38346:234::-;38493:8;38441:18;:39;38460:19;:17;:19::i;:::-;38441:39;;;;;;;;;;;;;;;:49;38481:8;38441:49;;;;;;;;;;;;;;;;:60;;;;;;;;;;;;;;;;;;38553:8;38517:55;;38532:19;:17;:19::i;:::-;38517:55;;;38563:8;38517:55;;;;;;:::i;:::-;;;;;;;;38346:234;;:::o;45139:407::-;45314:31;45327:4;45333:2;45337:7;45314:12;:31::i;:::-;45378:1;45360:2;:14;;;:19;45356:183;;45399:56;45430:4;45436:2;45440:7;45449:5;45399:30;:56::i;:::-;45394:145;;45483:40;;;;;;;;;;;;;;45394:145;45356:183;45139:407;;;;:::o;54526:689::-;54657:19;54663:2;54667:8;54657:5;:19::i;:::-;54736:1;54718:2;:14;;;:19;54714:483;;54758:11;54772:13;;54758:27;;54804:13;54826:8;54820:3;:14;54804:30;;54853:233;54884:62;54923:1;54927:2;54931:7;;;;;;54940:5;54884:30;:62::i;:::-;54879:167;;54982:40;;;;;;;;;;;;;;54879:167;55081:3;55073:5;:11;54853:233;;55168:3;55151:13;;:20;55147:34;;55173:8;;;55147:34;54739:458;;54714:483;54526:689;;;:::o;66988:108::-;67048:13;67081:7;67074:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;66988:108;:::o;62972:1745::-;63037:17;63471:4;63464;63458:11;63454:22;63563:1;63557:4;63550:15;63638:4;63635:1;63631:12;63624:19;;63720:1;63715:3;63708:14;63824:3;64063:5;64045:428;64071:1;64045:428;;;64111:1;64106:3;64102:11;64095:18;;64282:2;64276:4;64272:13;64268:2;64264:22;64259:3;64251:36;64376:2;64370:4;64366:13;64358:21;;64443:4;64045:428;64433:25;64045:428;64049:21;64512:3;64507;64503:13;64627:4;64622:3;64618:14;64611:21;;64692:6;64687:3;64680:19;63076:1634;;;62972:1745;;;:::o;56217:492::-;56346:13;56362:16;56370:7;56362;:16::i;:::-;56346:32;;56395:13;56391:219;;;56450:5;56427:28;;:19;:17;:19::i;:::-;:28;;;56423:187;;56479:44;56496:5;56503:19;:17;:19::i;:::-;56479:16;:44::i;:::-;56474:136;;56555:35;;;;;;;;;;;;;;56474:136;56423:187;56391:219;56655:2;56622:15;:24;56638:7;56622:24;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;56693:7;56689:2;56673:28;;56682:5;56673:28;;;;;;;;;;;;56335:374;56217:492;;;:::o;40322:485::-;40424:27;40453:23;40494:38;40535:15;:24;40551:7;40535:24;;;;;;;;;;;40494:65;;40712:18;40689:41;;40769:19;40763:26;40744:45;;40674:126;40322:485;;;:::o;62765:105::-;62825:7;62852:10;62845:17;;62765:105;:::o;39550:659::-;39699:11;39864:16;39857:5;39853:28;39844:37;;40024:16;40013:9;40009:32;39996:45;;40174:15;40163:9;40160:30;40152:5;40141:9;40138:20;40135:56;40125:66;;39550:659;;;;;:::o;46208:159::-;;;;;:::o;62074:311::-;62209:7;62229:16;23662:3;62255:19;:41;;62229:68;;23662:3;62323:31;62334:4;62340:2;62344:9;62323:10;:31::i;:::-;62315:40;;:62;;62308:69;;;62074:311;;;;;:::o;36196:450::-;36276:14;36444:16;36437:5;36433:28;36424:37;;36621:5;36607:11;36582:23;36578:41;36575:52;36568:5;36565:63;36555:73;;36196:450;;;;:::o;47032:158::-;;;;;:::o;47630:716::-;47793:4;47839:2;47814:45;;;47860:19;:17;:19::i;:::-;47881:4;47887:7;47896:5;47814:88;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;47810:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48114:1;48097:6;:13;:18;48093:235;;48143:40;;;;;;;;;;;;;;48093:235;48286:6;48280:13;48271:6;48267:2;48263:15;48256:38;47810:529;47983:54;;;47973:64;;;:6;:64;;;;47966:71;;;47630:716;;;;;;:::o;48808:2966::-;48881:20;48904:13;;48881:36;;48944:1;48932:8;:13;48928:44;;48954:18;;;;;;;;;;;;;;48928:44;48985:61;49015:1;49019:2;49023:12;49037:8;48985:21;:61::i;:::-;49529:1;22620:2;49499:1;:26;;49498:32;49486:8;:45;49460:18;:22;49479:2;49460:22;;;;;;;;;;;;;;;;:71;;;;;;;;;;;49808:139;49845:2;49899:33;49922:1;49926:2;49930:1;49899:14;:33::i;:::-;49866:30;49887:8;49866:20;:30::i;:::-;:66;49808:18;:139::i;:::-;49774:17;:31;49792:12;49774:31;;;;;;;;;;;:173;;;;49964:16;49995:11;50024:8;50009:12;:23;49995:37;;50545:16;50541:2;50537:25;50525:37;;50917:12;50877:8;50836:1;50774:25;50715:1;50654;50627:335;51288:1;51274:12;51270:20;51228:346;51329:3;51320:7;51317:16;51228:346;;51547:7;51537:8;51534:1;51507:25;51504:1;51501;51496:59;51382:1;51373:7;51369:15;51358:26;;51228:346;;;51232:77;51619:1;51607:8;:13;51603:45;;51629:19;;;;;;;;;;;;;;51603:45;51681:3;51665:13;:19;;;;49234:2462;;51706:60;51735:1;51739:2;51743:12;51757:8;51706:20;:60::i;:::-;48870:2904;48808:2966;;:::o;61775:147::-;61912:6;61775:147;;;;;:::o;36748:324::-;36818:14;37051:1;37041:8;37038:15;37012:24;37008:46;36998:56;;36748:324;;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:99::-;1570:6;1604:5;1598:12;1588:22;;1518:99;;;:::o;1623:169::-;1707:11;1741:6;1736:3;1729:19;1781:4;1776:3;1772:14;1757:29;;1623:169;;;;:::o;1798:246::-;1879:1;1889:113;1903:6;1900:1;1897:13;1889:113;;;1988:1;1983:3;1979:11;1973:18;1969:1;1964:3;1960:11;1953:39;1925:2;1922:1;1918:10;1913:15;;1889:113;;;2036:1;2027:6;2022:3;2018:16;2011:27;1860:184;1798:246;;;:::o;2050:102::-;2091:6;2142:2;2138:7;2133:2;2126:5;2122:14;2118:28;2108:38;;2050:102;;;:::o;2158:377::-;2246:3;2274:39;2307:5;2274:39;:::i;:::-;2329:71;2393:6;2388:3;2329:71;:::i;:::-;2322:78;;2409:65;2467:6;2462:3;2455:4;2448:5;2444:16;2409:65;:::i;:::-;2499:29;2521:6;2499:29;:::i;:::-;2494:3;2490:39;2483:46;;2250:285;2158:377;;;;:::o;2541:313::-;2654:4;2692:2;2681:9;2677:18;2669:26;;2741:9;2735:4;2731:20;2727:1;2716:9;2712:17;2705:47;2769:78;2842:4;2833:6;2769:78;:::i;:::-;2761:86;;2541:313;;;;:::o;2860:77::-;2897:7;2926:5;2915:16;;2860:77;;;:::o;2943:122::-;3016:24;3034:5;3016:24;:::i;:::-;3009:5;3006:35;2996:63;;3055:1;3052;3045:12;2996:63;2943:122;:::o;3071:139::-;3117:5;3155:6;3142:20;3133:29;;3171:33;3198:5;3171:33;:::i;:::-;3071:139;;;;:::o;3216:329::-;3275:6;3324:2;3312:9;3303:7;3299:23;3295:32;3292:119;;;3330:79;;:::i;:::-;3292:119;3450:1;3475:53;3520:7;3511:6;3500:9;3496:22;3475:53;:::i;:::-;3465:63;;3421:117;3216:329;;;;:::o;3551:126::-;3588:7;3628:42;3621:5;3617:54;3606:65;;3551:126;;;:::o;3683:96::-;3720:7;3749:24;3767:5;3749:24;:::i;:::-;3738:35;;3683:96;;;:::o;3785:118::-;3872:24;3890:5;3872:24;:::i;:::-;3867:3;3860:37;3785:118;;:::o;3909:222::-;4002:4;4040:2;4029:9;4025:18;4017:26;;4053:71;4121:1;4110:9;4106:17;4097:6;4053:71;:::i;:::-;3909:222;;;;:::o;4137:122::-;4210:24;4228:5;4210:24;:::i;:::-;4203:5;4200:35;4190:63;;4249:1;4246;4239:12;4190:63;4137:122;:::o;4265:139::-;4311:5;4349:6;4336:20;4327:29;;4365:33;4392:5;4365:33;:::i;:::-;4265:139;;;;:::o;4410:474::-;4478:6;4486;4535:2;4523:9;4514:7;4510:23;4506:32;4503:119;;;4541:79;;:::i;:::-;4503:119;4661:1;4686:53;4731:7;4722:6;4711:9;4707:22;4686:53;:::i;:::-;4676:63;;4632:117;4788:2;4814:53;4859:7;4850:6;4839:9;4835:22;4814:53;:::i;:::-;4804:63;;4759:118;4410:474;;;;;:::o;4890:118::-;4977:24;4995:5;4977:24;:::i;:::-;4972:3;4965:37;4890:118;;:::o;5014:222::-;5107:4;5145:2;5134:9;5130:18;5122:26;;5158:71;5226:1;5215:9;5211:17;5202:6;5158:71;:::i;:::-;5014:222;;;;:::o;5242:117::-;5351:1;5348;5341:12;5365:117;5474:1;5471;5464:12;5488:180;5536:77;5533:1;5526:88;5633:4;5630:1;5623:15;5657:4;5654:1;5647:15;5674:281;5757:27;5779:4;5757:27;:::i;:::-;5749:6;5745:40;5887:6;5875:10;5872:22;5851:18;5839:10;5836:34;5833:62;5830:88;;;5898:18;;:::i;:::-;5830:88;5938:10;5934:2;5927:22;5717:238;5674:281;;:::o;5961:129::-;5995:6;6022:20;;:::i;:::-;6012:30;;6051:33;6079:4;6071:6;6051:33;:::i;:::-;5961:129;;;:::o;6096:308::-;6158:4;6248:18;6240:6;6237:30;6234:56;;;6270:18;;:::i;:::-;6234:56;6308:29;6330:6;6308:29;:::i;:::-;6300:37;;6392:4;6386;6382:15;6374:23;;6096:308;;;:::o;6410:146::-;6507:6;6502:3;6497;6484:30;6548:1;6539:6;6534:3;6530:16;6523:27;6410:146;;;:::o;6562:425::-;6640:5;6665:66;6681:49;6723:6;6681:49;:::i;:::-;6665:66;:::i;:::-;6656:75;;6754:6;6747:5;6740:21;6792:4;6785:5;6781:16;6830:3;6821:6;6816:3;6812:16;6809:25;6806:112;;;6837:79;;:::i;:::-;6806:112;6927:54;6974:6;6969:3;6964;6927:54;:::i;:::-;6646:341;6562:425;;;;;:::o;7007:340::-;7063:5;7112:3;7105:4;7097:6;7093:17;7089:27;7079:122;;7120:79;;:::i;:::-;7079:122;7237:6;7224:20;7262:79;7337:3;7329:6;7322:4;7314:6;7310:17;7262:79;:::i;:::-;7253:88;;7069:278;7007:340;;;;:::o;7353:509::-;7422:6;7471:2;7459:9;7450:7;7446:23;7442:32;7439:119;;;7477:79;;:::i;:::-;7439:119;7625:1;7614:9;7610:17;7597:31;7655:18;7647:6;7644:30;7641:117;;;7677:79;;:::i;:::-;7641:117;7782:63;7837:7;7828:6;7817:9;7813:22;7782:63;:::i;:::-;7772:73;;7568:287;7353:509;;;;:::o;7868:619::-;7945:6;7953;7961;8010:2;7998:9;7989:7;7985:23;7981:32;7978:119;;;8016:79;;:::i;:::-;7978:119;8136:1;8161:53;8206:7;8197:6;8186:9;8182:22;8161:53;:::i;:::-;8151:63;;8107:117;8263:2;8289:53;8334:7;8325:6;8314:9;8310:22;8289:53;:::i;:::-;8279:63;;8234:118;8391:2;8417:53;8462:7;8453:6;8442:9;8438:22;8417:53;:::i;:::-;8407:63;;8362:118;7868:619;;;;;:::o;8493:60::-;8521:3;8542:5;8535:12;;8493:60;;;:::o;8559:142::-;8609:9;8642:53;8660:34;8669:24;8687:5;8669:24;:::i;:::-;8660:34;:::i;:::-;8642:53;:::i;:::-;8629:66;;8559:142;;;:::o;8707:126::-;8757:9;8790:37;8821:5;8790:37;:::i;:::-;8777:50;;8707:126;;;:::o;8839:157::-;8920:9;8953:37;8984:5;8953:37;:::i;:::-;8940:50;;8839:157;;;:::o;9002:193::-;9120:68;9182:5;9120:68;:::i;:::-;9115:3;9108:81;9002:193;;:::o;9201:284::-;9325:4;9363:2;9352:9;9348:18;9340:26;;9376:102;9475:1;9464:9;9460:17;9451:6;9376:102;:::i;:::-;9201:284;;;;:::o;9491:329::-;9550:6;9599:2;9587:9;9578:7;9574:23;9570:32;9567:119;;;9605:79;;:::i;:::-;9567:119;9725:1;9750:53;9795:7;9786:6;9775:9;9771:22;9750:53;:::i;:::-;9740:63;;9696:117;9491:329;;;;:::o;9826:116::-;9896:21;9911:5;9896:21;:::i;:::-;9889:5;9886:32;9876:60;;9932:1;9929;9922:12;9876:60;9826:116;:::o;9948:133::-;9991:5;10029:6;10016:20;10007:29;;10045:30;10069:5;10045:30;:::i;:::-;9948:133;;;;:::o;10087:468::-;10152:6;10160;10209:2;10197:9;10188:7;10184:23;10180:32;10177:119;;;10215:79;;:::i;:::-;10177:119;10335:1;10360:53;10405:7;10396:6;10385:9;10381:22;10360:53;:::i;:::-;10350:63;;10306:117;10462:2;10488:50;10530:7;10521:6;10510:9;10506:22;10488:50;:::i;:::-;10478:60;;10433:115;10087:468;;;;;:::o;10561:307::-;10622:4;10712:18;10704:6;10701:30;10698:56;;;10734:18;;:::i;:::-;10698:56;10772:29;10794:6;10772:29;:::i;:::-;10764:37;;10856:4;10850;10846:15;10838:23;;10561:307;;;:::o;10874:423::-;10951:5;10976:65;10992:48;11033:6;10992:48;:::i;:::-;10976:65;:::i;:::-;10967:74;;11064:6;11057:5;11050:21;11102:4;11095:5;11091:16;11140:3;11131:6;11126:3;11122:16;11119:25;11116:112;;;11147:79;;:::i;:::-;11116:112;11237:54;11284:6;11279:3;11274;11237:54;:::i;:::-;10957:340;10874:423;;;;;:::o;11316:338::-;11371:5;11420:3;11413:4;11405:6;11401:17;11397:27;11387:122;;11428:79;;:::i;:::-;11387:122;11545:6;11532:20;11570:78;11644:3;11636:6;11629:4;11621:6;11617:17;11570:78;:::i;:::-;11561:87;;11377:277;11316:338;;;;:::o;11660:943::-;11755:6;11763;11771;11779;11828:3;11816:9;11807:7;11803:23;11799:33;11796:120;;;11835:79;;:::i;:::-;11796:120;11955:1;11980:53;12025:7;12016:6;12005:9;12001:22;11980:53;:::i;:::-;11970:63;;11926:117;12082:2;12108:53;12153:7;12144:6;12133:9;12129:22;12108:53;:::i;:::-;12098:63;;12053:118;12210:2;12236:53;12281:7;12272:6;12261:9;12257:22;12236:53;:::i;:::-;12226:63;;12181:118;12366:2;12355:9;12351:18;12338:32;12397:18;12389:6;12386:30;12383:117;;;12419:79;;:::i;:::-;12383:117;12524:62;12578:7;12569:6;12558:9;12554:22;12524:62;:::i;:::-;12514:72;;12309:287;11660:943;;;;;;;:::o;12609:311::-;12686:4;12776:18;12768:6;12765:30;12762:56;;;12798:18;;:::i;:::-;12762:56;12848:4;12840:6;12836:17;12828:25;;12908:4;12902;12898:15;12890:23;;12609:311;;;:::o;12926:117::-;13035:1;13032;13025:12;13066:710;13162:5;13187:81;13203:64;13260:6;13203:64;:::i;:::-;13187:81;:::i;:::-;13178:90;;13288:5;13317:6;13310:5;13303:21;13351:4;13344:5;13340:16;13333:23;;13404:4;13396:6;13392:17;13384:6;13380:30;13433:3;13425:6;13422:15;13419:122;;;13452:79;;:::i;:::-;13419:122;13567:6;13550:220;13584:6;13579:3;13576:15;13550:220;;;13659:3;13688:37;13721:3;13709:10;13688:37;:::i;:::-;13683:3;13676:50;13755:4;13750:3;13746:14;13739:21;;13626:144;13610:4;13605:3;13601:14;13594:21;;13550:220;;;13554:21;13168:608;;13066:710;;;;;:::o;13799:370::-;13870:5;13919:3;13912:4;13904:6;13900:17;13896:27;13886:122;;13927:79;;:::i;:::-;13886:122;14044:6;14031:20;14069:94;14159:3;14151:6;14144:4;14136:6;14132:17;14069:94;:::i;:::-;14060:103;;13876:293;13799:370;;;;:::o;14175:684::-;14268:6;14276;14325:2;14313:9;14304:7;14300:23;14296:32;14293:119;;;14331:79;;:::i;:::-;14293:119;14479:1;14468:9;14464:17;14451:31;14509:18;14501:6;14498:30;14495:117;;;14531:79;;:::i;:::-;14495:117;14636:78;14706:7;14697:6;14686:9;14682:22;14636:78;:::i;:::-;14626:88;;14422:302;14763:2;14789:53;14834:7;14825:6;14814:9;14810:22;14789:53;:::i;:::-;14779:63;;14734:118;14175:684;;;;;:::o;14865:474::-;14933:6;14941;14990:2;14978:9;14969:7;14965:23;14961:32;14958:119;;;14996:79;;:::i;:::-;14958:119;15116:1;15141:53;15186:7;15177:6;15166:9;15162:22;15141:53;:::i;:::-;15131:63;;15087:117;15243:2;15269:53;15314:7;15305:6;15294:9;15290:22;15269:53;:::i;:::-;15259:63;;15214:118;14865:474;;;;;:::o;15345:180::-;15393:77;15390:1;15383:88;15490:4;15487:1;15480:15;15514:4;15511:1;15504:15;15531:320;15575:6;15612:1;15606:4;15602:12;15592:22;;15659:1;15653:4;15649:12;15680:18;15670:81;;15736:4;15728:6;15724:17;15714:27;;15670:81;15798:2;15790:6;15787:14;15767:18;15764:38;15761:84;;15817:18;;:::i;:::-;15761:84;15582:269;15531:320;;;:::o;15857:141::-;15906:4;15929:3;15921:11;;15952:3;15949:1;15942:14;15986:4;15983:1;15973:18;15965:26;;15857:141;;;:::o;16004:93::-;16041:6;16088:2;16083;16076:5;16072:14;16068:23;16058:33;;16004:93;;;:::o;16103:107::-;16147:8;16197:5;16191:4;16187:16;16166:37;;16103:107;;;;:::o;16216:393::-;16285:6;16335:1;16323:10;16319:18;16358:97;16388:66;16377:9;16358:97;:::i;:::-;16476:39;16506:8;16495:9;16476:39;:::i;:::-;16464:51;;16548:4;16544:9;16537:5;16533:21;16524:30;;16597:4;16587:8;16583:19;16576:5;16573:30;16563:40;;16292:317;;16216:393;;;;;:::o;16615:142::-;16665:9;16698:53;16716:34;16725:24;16743:5;16725:24;:::i;:::-;16716:34;:::i;:::-;16698:53;:::i;:::-;16685:66;;16615:142;;;:::o;16763:75::-;16806:3;16827:5;16820:12;;16763:75;;;:::o;16844:269::-;16954:39;16985:7;16954:39;:::i;:::-;17015:91;17064:41;17088:16;17064:41;:::i;:::-;17056:6;17049:4;17043:11;17015:91;:::i;:::-;17009:4;17002:105;16920:193;16844:269;;;:::o;17119:73::-;17164:3;17119:73;:::o;17198:189::-;17275:32;;:::i;:::-;17316:65;17374:6;17366;17360:4;17316:65;:::i;:::-;17251:136;17198:189;;:::o;17393:186::-;17453:120;17470:3;17463:5;17460:14;17453:120;;;17524:39;17561:1;17554:5;17524:39;:::i;:::-;17497:1;17490:5;17486:13;17477:22;;17453:120;;;17393:186;;:::o;17585:543::-;17686:2;17681:3;17678:11;17675:446;;;17720:38;17752:5;17720:38;:::i;:::-;17804:29;17822:10;17804:29;:::i;:::-;17794:8;17790:44;17987:2;17975:10;17972:18;17969:49;;;18008:8;17993:23;;17969:49;18031:80;18087:22;18105:3;18087:22;:::i;:::-;18077:8;18073:37;18060:11;18031:80;:::i;:::-;17690:431;;17675:446;17585:543;;;:::o;18134:117::-;18188:8;18238:5;18232:4;18228:16;18207:37;;18134:117;;;;:::o;18257:169::-;18301:6;18334:51;18382:1;18378:6;18370:5;18367:1;18363:13;18334:51;:::i;:::-;18330:56;18415:4;18409;18405:15;18395:25;;18308:118;18257:169;;;;:::o;18431:295::-;18507:4;18653:29;18678:3;18672:4;18653:29;:::i;:::-;18645:37;;18715:3;18712:1;18708:11;18702:4;18699:21;18691:29;;18431:295;;;;:::o;18731:1395::-;18848:37;18881:3;18848:37;:::i;:::-;18950:18;18942:6;18939:30;18936:56;;;18972:18;;:::i;:::-;18936:56;19016:38;19048:4;19042:11;19016:38;:::i;:::-;19101:67;19161:6;19153;19147:4;19101:67;:::i;:::-;19195:1;19219:4;19206:17;;19251:2;19243:6;19240:14;19268:1;19263:618;;;;19925:1;19942:6;19939:77;;;19991:9;19986:3;19982:19;19976:26;19967:35;;19939:77;20042:67;20102:6;20095:5;20042:67;:::i;:::-;20036:4;20029:81;19898:222;19233:887;;19263:618;19315:4;19311:9;19303:6;19299:22;19349:37;19381:4;19349:37;:::i;:::-;19408:1;19422:208;19436:7;19433:1;19430:14;19422:208;;;19515:9;19510:3;19506:19;19500:26;19492:6;19485:42;19566:1;19558:6;19554:14;19544:24;;19613:2;19602:9;19598:18;19585:31;;19459:4;19456:1;19452:12;19447:17;;19422:208;;;19658:6;19649:7;19646:19;19643:179;;;19716:9;19711:3;19707:19;19701:26;19759:48;19801:4;19793:6;19789:17;19778:9;19759:48;:::i;:::-;19751:6;19744:64;19666:156;19643:179;19868:1;19864;19856:6;19852:14;19848:22;19842:4;19835:36;19270:611;;;19233:887;;18823:1303;;;18731:1395;;:::o;20132:147::-;20233:11;20270:3;20255:18;;20132:147;;;;:::o;20285:114::-;;:::o;20405:398::-;20564:3;20585:83;20666:1;20661:3;20585:83;:::i;:::-;20578:90;;20677:93;20766:3;20677:93;:::i;:::-;20795:1;20790:3;20786:11;20779:18;;20405:398;;;:::o;20809:379::-;20993:3;21015:147;21158:3;21015:147;:::i;:::-;21008:154;;21179:3;21172:10;;20809:379;;;:::o;21194:226::-;21334:34;21330:1;21322:6;21318:14;21311:58;21403:9;21398:2;21390:6;21386:15;21379:34;21194:226;:::o;21426:366::-;21568:3;21589:67;21653:2;21648:3;21589:67;:::i;:::-;21582:74;;21665:93;21754:3;21665:93;:::i;:::-;21783:2;21778:3;21774:12;21767:19;;21426:366;;;:::o;21798:419::-;21964:4;22002:2;21991:9;21987:18;21979:26;;22051:9;22045:4;22041:20;22037:1;22026:9;22022:17;22015:47;22079:131;22205:4;22079:131;:::i;:::-;22071:139;;21798:419;;;:::o;22223:180::-;22271:77;22268:1;22261:88;22368:4;22365:1;22358:15;22392:4;22389:1;22382:15;22409:191;22449:3;22468:20;22486:1;22468:20;:::i;:::-;22463:25;;22502:20;22520:1;22502:20;:::i;:::-;22497:25;;22545:1;22542;22538:9;22531:16;;22566:3;22563:1;22560:10;22557:36;;;22573:18;;:::i;:::-;22557:36;22409:191;;;;:::o;22606:177::-;22746:29;22742:1;22734:6;22730:14;22723:53;22606:177;:::o;22789:366::-;22931:3;22952:67;23016:2;23011:3;22952:67;:::i;:::-;22945:74;;23028:93;23117:3;23028:93;:::i;:::-;23146:2;23141:3;23137:12;23130:19;;22789:366;;;:::o;23161:419::-;23327:4;23365:2;23354:9;23350:18;23342:26;;23414:9;23408:4;23404:20;23400:1;23389:9;23385:17;23378:47;23442:131;23568:4;23442:131;:::i;:::-;23434:139;;23161:419;;;:::o;23586:221::-;23726:34;23722:1;23714:6;23710:14;23703:58;23795:4;23790:2;23782:6;23778:15;23771:29;23586:221;:::o;23813:366::-;23955:3;23976:67;24040:2;24035:3;23976:67;:::i;:::-;23969:74;;24052:93;24141:3;24052:93;:::i;:::-;24170:2;24165:3;24161:12;24154:19;;23813:366;;;:::o;24185:419::-;24351:4;24389:2;24378:9;24374:18;24366:26;;24438:9;24432:4;24428:20;24424:1;24413:9;24409:17;24402:47;24466:131;24592:4;24466:131;:::i;:::-;24458:139;;24185:419;;;:::o;24610:410::-;24650:7;24673:20;24691:1;24673:20;:::i;:::-;24668:25;;24707:20;24725:1;24707:20;:::i;:::-;24702:25;;24762:1;24759;24755:9;24784:30;24802:11;24784:30;:::i;:::-;24773:41;;24963:1;24954:7;24950:15;24947:1;24944:22;24924:1;24917:9;24897:83;24874:139;;24993:18;;:::i;:::-;24874:139;24658:362;24610:410;;;;:::o;25026:169::-;25166:21;25162:1;25154:6;25150:14;25143:45;25026:169;:::o;25201:366::-;25343:3;25364:67;25428:2;25423:3;25364:67;:::i;:::-;25357:74;;25440:93;25529:3;25440:93;:::i;:::-;25558:2;25553:3;25549:12;25542:19;;25201:366;;;:::o;25573:419::-;25739:4;25777:2;25766:9;25762:18;25754:26;;25826:9;25820:4;25816:20;25812:1;25801:9;25797:17;25790:47;25854:131;25980:4;25854:131;:::i;:::-;25846:139;;25573:419;;;:::o;25998:180::-;26046:77;26043:1;26036:88;26143:4;26140:1;26133:15;26167:4;26164:1;26157:15;26184:233;26223:3;26246:24;26264:5;26246:24;:::i;:::-;26237:33;;26292:66;26285:5;26282:77;26279:103;;26362:18;;:::i;:::-;26279:103;26409:1;26402:5;26398:13;26391:20;;26184:233;;;:::o;26423:234::-;26563:34;26559:1;26551:6;26547:14;26540:58;26632:17;26627:2;26619:6;26615:15;26608:42;26423:234;:::o;26663:366::-;26805:3;26826:67;26890:2;26885:3;26826:67;:::i;:::-;26819:74;;26902:93;26991:3;26902:93;:::i;:::-;27020:2;27015:3;27011:12;27004:19;;26663:366;;;:::o;27035:419::-;27201:4;27239:2;27228:9;27224:18;27216:26;;27288:9;27282:4;27278:20;27274:1;27263:9;27259:17;27252:47;27316:131;27442:4;27316:131;:::i;:::-;27308:139;;27035:419;;;:::o;27460:148::-;27562:11;27599:3;27584:18;;27460:148;;;;:::o;27614:390::-;27720:3;27748:39;27781:5;27748:39;:::i;:::-;27803:89;27885:6;27880:3;27803:89;:::i;:::-;27796:96;;27901:65;27959:6;27954:3;27947:4;27940:5;27936:16;27901:65;:::i;:::-;27991:6;27986:3;27982:16;27975:23;;27724:280;27614:390;;;;:::o;28034:874::-;28137:3;28174:5;28168:12;28203:36;28229:9;28203:36;:::i;:::-;28255:89;28337:6;28332:3;28255:89;:::i;:::-;28248:96;;28375:1;28364:9;28360:17;28391:1;28386:166;;;;28566:1;28561:341;;;;28353:549;;28386:166;28470:4;28466:9;28455;28451:25;28446:3;28439:38;28532:6;28525:14;28518:22;28510:6;28506:35;28501:3;28497:45;28490:52;;28386:166;;28561:341;28628:38;28660:5;28628:38;:::i;:::-;28688:1;28702:154;28716:6;28713:1;28710:13;28702:154;;;28790:7;28784:14;28780:1;28775:3;28771:11;28764:35;28840:1;28831:7;28827:15;28816:26;;28738:4;28735:1;28731:12;28726:17;;28702:154;;;28885:6;28880:3;28876:16;28869:23;;28568:334;;28353:549;;28141:767;;28034:874;;;;:::o;28914:589::-;29139:3;29161:95;29252:3;29243:6;29161:95;:::i;:::-;29154:102;;29273:95;29364:3;29355:6;29273:95;:::i;:::-;29266:102;;29385:92;29473:3;29464:6;29385:92;:::i;:::-;29378:99;;29494:3;29487:10;;28914:589;;;;;;:::o;29509:225::-;29649:34;29645:1;29637:6;29633:14;29626:58;29718:8;29713:2;29705:6;29701:15;29694:33;29509:225;:::o;29740:366::-;29882:3;29903:67;29967:2;29962:3;29903:67;:::i;:::-;29896:74;;29979:93;30068:3;29979:93;:::i;:::-;30097:2;30092:3;30088:12;30081:19;;29740:366;;;:::o;30112:419::-;30278:4;30316:2;30305:9;30301:18;30293:26;;30365:9;30359:4;30355:20;30351:1;30340:9;30336:17;30329:47;30393:131;30519:4;30393:131;:::i;:::-;30385:139;;30112:419;;;:::o;30537:332::-;30658:4;30696:2;30685:9;30681:18;30673:26;;30709:71;30777:1;30766:9;30762:17;30753:6;30709:71;:::i;:::-;30790:72;30858:2;30847:9;30843:18;30834:6;30790:72;:::i;:::-;30537:332;;;;;:::o;30875:137::-;30929:5;30960:6;30954:13;30945:22;;30976:30;31000:5;30976:30;:::i;:::-;30875:137;;;;:::o;31018:345::-;31085:6;31134:2;31122:9;31113:7;31109:23;31105:32;31102:119;;;31140:79;;:::i;:::-;31102:119;31260:1;31285:61;31338:7;31329:6;31318:9;31314:22;31285:61;:::i;:::-;31275:71;;31231:125;31018:345;;;;:::o;31369:182::-;31509:34;31505:1;31497:6;31493:14;31486:58;31369:182;:::o;31557:366::-;31699:3;31720:67;31784:2;31779:3;31720:67;:::i;:::-;31713:74;;31796:93;31885:3;31796:93;:::i;:::-;31914:2;31909:3;31905:12;31898:19;;31557:366;;;:::o;31929:419::-;32095:4;32133:2;32122:9;32118:18;32110:26;;32182:9;32176:4;32172:20;32168:1;32157:9;32153:17;32146:47;32210:131;32336:4;32210:131;:::i;:::-;32202:139;;31929:419;;;:::o;32354:181::-;32494:33;32490:1;32482:6;32478:14;32471:57;32354:181;:::o;32541:366::-;32683:3;32704:67;32768:2;32763:3;32704:67;:::i;:::-;32697:74;;32780:93;32869:3;32780:93;:::i;:::-;32898:2;32893:3;32889:12;32882:19;;32541:366;;;:::o;32913:419::-;33079:4;33117:2;33106:9;33102:18;33094:26;;33166:9;33160:4;33156:20;33152:1;33141:9;33137:17;33130:47;33194:131;33320:4;33194:131;:::i;:::-;33186:139;;32913:419;;;:::o;33338:98::-;33389:6;33423:5;33417:12;33407:22;;33338:98;;;:::o;33442:168::-;33525:11;33559:6;33554:3;33547:19;33599:4;33594:3;33590:14;33575:29;;33442:168;;;;:::o;33616:373::-;33702:3;33730:38;33762:5;33730:38;:::i;:::-;33784:70;33847:6;33842:3;33784:70;:::i;:::-;33777:77;;33863:65;33921:6;33916:3;33909:4;33902:5;33898:16;33863:65;:::i;:::-;33953:29;33975:6;33953:29;:::i;:::-;33948:3;33944:39;33937:46;;33706:283;33616:373;;;;:::o;33995:640::-;34190:4;34228:3;34217:9;34213:19;34205:27;;34242:71;34310:1;34299:9;34295:17;34286:6;34242:71;:::i;:::-;34323:72;34391:2;34380:9;34376:18;34367:6;34323:72;:::i;:::-;34405;34473:2;34462:9;34458:18;34449:6;34405:72;:::i;:::-;34524:9;34518:4;34514:20;34509:2;34498:9;34494:18;34487:48;34552:76;34623:4;34614:6;34552:76;:::i;:::-;34544:84;;33995:640;;;;;;;:::o;34641:141::-;34697:5;34728:6;34722:13;34713:22;;34744:32;34770:5;34744:32;:::i;:::-;34641:141;;;;:::o;34788:349::-;34857:6;34906:2;34894:9;34885:7;34881:23;34877:32;34874:119;;;34912:79;;:::i;:::-;34874:119;35032:1;35057:63;35112:7;35103:6;35092:9;35088:22;35057:63;:::i;:::-;35047:73;;35003:127;34788:349;;;;:::o
Swarm Source
ipfs://0e165552da07799be9afcc97f0b2a4fe88c9ea66c7ec0ef617e6b93d022aa8a6
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.