ERC-721
Overview
Max Total Supply
3,333 ITSEGG
Holders
1,915
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
4 ITSEGGLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
Egg
Compiler Version
v0.8.7+commit.e28d00a7
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-07-31 */ // File: @openzeppelin/contracts/utils/Strings.sol // OpenZeppelin Contracts (last updated v4.7.0) (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; uint8 private constant _ADDRESS_LENGTH = 20; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } /** * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation. */ function toHexString(address addr) internal pure returns (string memory) { return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH); } } // File: IERC721A.sol // ERC721A Contracts v4.2.0 // Creator: Chiru Labs pragma solidity ^0.8.1; /** * @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(); /** * The caller cannot approve to their own address. */ error ApproveToCaller(); /** * 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; /** * @dev Equivalent to `safeTransferFrom(from, to, tokenId, '')`. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @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; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the * zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} * for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll}. */ function isApprovedForAll(address owner, address operator) external view returns (bool); // ============================================================= // 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); } // File: ERC721A.sol // ERC721A Contracts v4.2.0 // Creator: Chiru Labs pragma solidity ^0.8.1; /** * @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 { // Reference type for token approval. 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) { uint256 curr = tokenId; unchecked { if (_startTokenId() <= curr) if (curr < _currentIndex) { uint256 packed = _packedOwnerships[curr]; // If not burned. if (packed & _BITMASK_BURNED == 0) { // 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, `curr` will not underflow. // // We can directly compare the packed value. // If the address is zero, packed will be zero. while (packed == 0) { packed = _packedOwnerships[--curr]; } 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. * 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) public virtual override { address owner = ownerOf(tokenId); if (_msgSenderERC721A() != owner) if (!isApprovedForAll(owner, _msgSenderERC721A())) { revert ApprovalCallerNotOwnerNorApproved(); } _tokenApprovals[tokenId].value = to; emit Approval(owner, to, tokenId); } /** * @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 { if (operator == _msgSenderERC721A()) revert ApproveToCaller(); _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]`. 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 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 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 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. 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`. ) 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, ''); } // ============================================================= // 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 ptr) { assembly { // The maximum value of a uint256 contains 78 digits (1 byte per digit), // but we allocate 128 bytes to keep the free memory pointer 32-byte word aliged. // We will need 1 32-byte word to store the length, // and 3 32-byte words to store a maximum of 78 digits. Total: 32 + 3 * 32 = 128. ptr := add(mload(0x40), 128) // Update the free memory pointer to allocate. mstore(0x40, ptr) // Cache the end of the memory to calculate the length later. let end := ptr // We write the string from the rightmost digit to the leftmost digit. // The following is essentially a do-while loop that also handles the zero case. // Costs a bit more than early returning for the zero case, // but cheaper in terms of deployment and overall runtime costs. for { // Initialize and perform the first pass without check. let temp := value // Move the pointer 1 byte leftwards to point to an empty character slot. ptr := sub(ptr, 1) // Write the character to the pointer. // The ASCII index of the '0' character is 48. mstore8(ptr, add(48, mod(temp, 10))) temp := div(temp, 10) } temp { // Keep dividing `temp` until zero. temp := div(temp, 10) } { // Body of the for loop. ptr := sub(ptr, 1) mstore8(ptr, add(48, mod(temp, 10))) } let length := sub(end, ptr) // Move the pointer 32 bytes leftwards to make room for the length. ptr := sub(ptr, 32) // Store the length. mstore(ptr, length) } } } // File: @openzeppelin/contracts/utils/cryptography/MerkleProof.sol // OpenZeppelin Contracts (last updated v4.7.0) (utils/cryptography/MerkleProof.sol) pragma solidity ^0.8.0; /** * @dev These functions deal with verification of Merkle Tree proofs. * * The proofs can be generated using the JavaScript library * https://github.com/miguelmota/merkletreejs[merkletreejs]. * Note: the hashing algorithm should be keccak256 and pair sorting should be enabled. * * See `test/utils/cryptography/MerkleProof.test.js` for some examples. * * WARNING: You should avoid using leaf values that are 64 bytes long prior to * hashing, or use a hash function other than keccak256 for hashing leaves. * This is because the concatenation of a sorted pair of internal nodes in * the merkle tree could be reinterpreted as a leaf value. */ library MerkleProof { /** * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree * defined by `root`. For this, a `proof` must be provided, containing * sibling hashes on the branch from the leaf to the root of the tree. Each * pair of leaves and each pair of pre-images are assumed to be sorted. */ function verify( bytes32[] memory proof, bytes32 root, bytes32 leaf ) internal pure returns (bool) { return processProof(proof, leaf) == root; } /** * @dev Calldata version of {verify} * * _Available since v4.7._ */ function verifyCalldata( bytes32[] calldata proof, bytes32 root, bytes32 leaf ) internal pure returns (bool) { return processProofCalldata(proof, leaf) == root; } /** * @dev Returns the rebuilt hash obtained by traversing a Merkle tree up * from `leaf` using `proof`. A `proof` is valid if and only if the rebuilt * hash matches the root of the tree. When processing the proof, the pairs * of leafs & pre-images are assumed to be sorted. * * _Available since v4.4._ */ function processProof(bytes32[] memory proof, bytes32 leaf) internal pure returns (bytes32) { bytes32 computedHash = leaf; for (uint256 i = 0; i < proof.length; i++) { computedHash = _hashPair(computedHash, proof[i]); } return computedHash; } /** * @dev Calldata version of {processProof} * * _Available since v4.7._ */ function processProofCalldata(bytes32[] calldata proof, bytes32 leaf) internal pure returns (bytes32) { bytes32 computedHash = leaf; for (uint256 i = 0; i < proof.length; i++) { computedHash = _hashPair(computedHash, proof[i]); } return computedHash; } /** * @dev Returns true if the `leaves` can be proved to be a part of a Merkle tree defined by * `root`, according to `proof` and `proofFlags` as described in {processMultiProof}. * * _Available since v4.7._ */ function multiProofVerify( bytes32[] memory proof, bool[] memory proofFlags, bytes32 root, bytes32[] memory leaves ) internal pure returns (bool) { return processMultiProof(proof, proofFlags, leaves) == root; } /** * @dev Calldata version of {multiProofVerify} * * _Available since v4.7._ */ function multiProofVerifyCalldata( bytes32[] calldata proof, bool[] calldata proofFlags, bytes32 root, bytes32[] memory leaves ) internal pure returns (bool) { return processMultiProofCalldata(proof, proofFlags, leaves) == root; } /** * @dev Returns the root of a tree reconstructed from `leaves` and the sibling nodes in `proof`, * consuming from one or the other at each step according to the instructions given by * `proofFlags`. * * _Available since v4.7._ */ function processMultiProof( bytes32[] memory proof, bool[] memory proofFlags, bytes32[] memory leaves ) internal pure returns (bytes32 merkleRoot) { // This function rebuild the root hash by traversing the tree up from the leaves. The root is rebuilt by // consuming and producing values on a queue. The queue starts with the `leaves` array, then goes onto the // `hashes` array. At the end of the process, the last hash in the `hashes` array should contain the root of // the merkle tree. uint256 leavesLen = leaves.length; uint256 totalHashes = proofFlags.length; // Check proof validity. require(leavesLen + proof.length - 1 == totalHashes, "MerkleProof: invalid multiproof"); // The xxxPos values are "pointers" to the next value to consume in each array. All accesses are done using // `xxx[xxxPos++]`, which return the current value and increment the pointer, thus mimicking a queue's "pop". bytes32[] memory hashes = new bytes32[](totalHashes); uint256 leafPos = 0; uint256 hashPos = 0; uint256 proofPos = 0; // At each step, we compute the next hash using two values: // - a value from the "main queue". If not all leaves have been consumed, we get the next leaf, otherwise we // get the next hash. // - depending on the flag, either another value for the "main queue" (merging branches) or an element from the // `proof` array. for (uint256 i = 0; i < totalHashes; i++) { bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++]; bytes32 b = proofFlags[i] ? leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++] : proof[proofPos++]; hashes[i] = _hashPair(a, b); } if (totalHashes > 0) { return hashes[totalHashes - 1]; } else if (leavesLen > 0) { return leaves[0]; } else { return proof[0]; } } /** * @dev Calldata version of {processMultiProof} * * _Available since v4.7._ */ function processMultiProofCalldata( bytes32[] calldata proof, bool[] calldata proofFlags, bytes32[] memory leaves ) internal pure returns (bytes32 merkleRoot) { // This function rebuild the root hash by traversing the tree up from the leaves. The root is rebuilt by // consuming and producing values on a queue. The queue starts with the `leaves` array, then goes onto the // `hashes` array. At the end of the process, the last hash in the `hashes` array should contain the root of // the merkle tree. uint256 leavesLen = leaves.length; uint256 totalHashes = proofFlags.length; // Check proof validity. require(leavesLen + proof.length - 1 == totalHashes, "MerkleProof: invalid multiproof"); // The xxxPos values are "pointers" to the next value to consume in each array. All accesses are done using // `xxx[xxxPos++]`, which return the current value and increment the pointer, thus mimicking a queue's "pop". bytes32[] memory hashes = new bytes32[](totalHashes); uint256 leafPos = 0; uint256 hashPos = 0; uint256 proofPos = 0; // At each step, we compute the next hash using two values: // - a value from the "main queue". If not all leaves have been consumed, we get the next leaf, otherwise we // get the next hash. // - depending on the flag, either another value for the "main queue" (merging branches) or an element from the // `proof` array. for (uint256 i = 0; i < totalHashes; i++) { bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++]; bytes32 b = proofFlags[i] ? leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++] : proof[proofPos++]; hashes[i] = _hashPair(a, b); } if (totalHashes > 0) { return hashes[totalHashes - 1]; } else if (leavesLen > 0) { return leaves[0]; } else { return proof[0]; } } function _hashPair(bytes32 a, bytes32 b) private pure returns (bytes32) { return a < b ? _efficientHash(a, b) : _efficientHash(b, a); } function _efficientHash(bytes32 a, bytes32 b) private pure returns (bytes32 value) { /// @solidity memory-safe-assembly assembly { mstore(0x00, a) mstore(0x20, b) value := keccak256(0x00, 0x40) } } } // File: @openzeppelin/contracts/security/ReentrancyGuard.sol // OpenZeppelin Contracts v4.4.1 (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() { // On the first call to nonReentrant, _notEntered will be true require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; _; // 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 // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // File: @openzeppelin/contracts/access/Ownable.sol // OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol) pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { _checkOwner(); _; } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if the sender is not the owner. */ function _checkOwner() internal view virtual { require(owner() == _msgSender(), "Ownable: caller is not the owner"); } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // File: Egg.sol pragma solidity ^0.8.1; interface Kakapo { function burnMint(uint256 tokenId) external; } contract Egg is Ownable, ERC721A, ReentrancyGuard { uint256 public immutable maxPerAllowlistAddressMint; uint256 public immutable amountForDevs; uint256 public immutable amountForAllowlist; uint256 public immutable collectionSize; bytes32 private merkleRoot; address private birdContractAddress; Kakapo public kakapo; // V2 contract uint32 private burnStartTime; mapping(address => bool) public publicMinted; struct SaleConfig { uint32 allowlistSaleStartTime; uint32 publicSaleStartTime; uint32 publicSaleKey; } SaleConfig public saleConfig; constructor( uint256 maxAllowlistSize_, uint256 collectionSize_, uint256 amountForDevs_, uint256 amountForAllowlist_ ) ERC721A("ItsEgg", "ITSEGG") { maxPerAllowlistAddressMint = maxAllowlistSize_; amountForDevs = amountForDevs_; amountForAllowlist = amountForAllowlist_; collectionSize = collectionSize_; require( amountForAllowlist_ <= collectionSize_, "larger collection size needed" ); } modifier callerIsUser() { require(tx.origin == msg.sender, "The caller is another contract"); _; } function allowlistMint(bytes32[] calldata _merkleProof) external payable callerIsUser { uint256 _saleStartTime = uint256(saleConfig.allowlistSaleStartTime); require( _saleStartTime != 0 && block.timestamp >= _saleStartTime, "sale has not started yet" ); require( numberMinted(msg.sender) + 1 <= maxPerAllowlistAddressMint, "can not mint this many" ); require(totalSupply() + 1 <= collectionSize, "reached max supply"); require(isAllowList(msg.sender, _merkleProof), "not eligible for allowlist mint"); _safeMint(msg.sender, 1); } function publicSaleMint(uint256 callerPublicSaleKey) external payable callerIsUser { require(msg.sender == tx.origin, "Minting from smart contracts is disallowed"); SaleConfig memory config = saleConfig; uint256 publicSaleKey = uint256(config.publicSaleKey); uint256 publicSaleStartTime = uint256(config.publicSaleStartTime); require( publicSaleKey == callerPublicSaleKey, "called with incorrect public sale key" ); require( isPublicSaleOn(publicSaleKey, publicSaleStartTime), "public sale has not begun yet" ); require(totalSupply() + 1 <= collectionSize, "reached max supply"); require(!publicMinted[msg.sender], "Already minted."); _safeMint(msg.sender, 1); publicMinted[msg.sender] = true; } function devMint(uint256 quantity) external onlyOwner { require( totalSupply() + quantity <= amountForDevs, "too many already minted before dev mint" ); _safeMint(msg.sender, quantity); } function stakeMint() external { require(msg.sender != tx.origin, "must mint from smart contracts"); require(msg.sender == birdContractAddress, "sender error"); _safeMint(tx.origin, 1); } function setBirdContractAddr(address _address) external onlyOwner { birdContractAddress = _address; } function isPublicSaleOn( uint256 publicSaleKey, uint256 publicSaleStartTime ) public view returns (bool) { return publicSaleKey != 0 && block.timestamp >= publicSaleStartTime; } function setSaleInfo( uint32 allowlistSaleTime, uint32 publicSaleStartTime ) external onlyOwner { saleConfig = SaleConfig( allowlistSaleTime, publicSaleStartTime, saleConfig.publicSaleKey ); } function setPublicSaleKey(uint32 key) external onlyOwner { saleConfig.publicSaleKey = key; } function setAllowlistSaleStartTime(uint32 timestamp) external onlyOwner { saleConfig.allowlistSaleStartTime = timestamp; } function setPublicSaleStartTime(uint32 timestamp) external onlyOwner { saleConfig.publicSaleStartTime = timestamp; } function setMerkleRoot (bytes32 _merkleRoot) public onlyOwner { merkleRoot = _merkleRoot; } function isAllowList(address _address, bytes32[] calldata _merkleProof) public view returns (bool){ bytes32 leaf = keccak256(abi.encodePacked(_address)); require(MerkleProof.verify(_merkleProof, merkleRoot, leaf), "Incorrect proof"); return true; } // metadata URI string private _baseTokenURI; function _baseURI() internal view virtual override returns (string memory) { return _baseTokenURI; } function setBaseURI(string calldata baseURI) external onlyOwner { _baseTokenURI = baseURI; } function withdrawMoney() external onlyOwner nonReentrant { (bool success, ) = msg.sender.call{value: address(this).balance}(""); require(success, "Transfer failed."); } /** *@dev Destroy the token and generate a new token in the new contract */ function burn(uint256 tokenId) public virtual { uint256 _burnStartTime = uint256(burnStartTime); require(_burnStartTime != 0 && block.timestamp >= _burnStartTime, "burn has not begun yet"); _burn(tokenId, true); kakapo.burnMint(tokenId); } function setBurnStartTime(uint32 timestamp) external onlyOwner { burnStartTime = timestamp; } function setBurnContractAddress(address _Address) external onlyOwner { kakapo = Kakapo(_Address); } // function setOwnersExplicit(uint256 quantity) external onlyOwner nonReentrant { // _setOwnersExplicit(quantity); // } function numberMinted(address owner) public view returns (uint256) { return _numberMinted(owner); } function getOwnershipData(uint256 tokenId) external view returns (TokenOwnership memory) { return _ownershipOf(tokenId); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"uint256","name":"maxAllowlistSize_","type":"uint256"},{"internalType":"uint256","name":"collectionSize_","type":"uint256"},{"internalType":"uint256","name":"amountForDevs_","type":"uint256"},{"internalType":"uint256","name":"amountForAllowlist_","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintERC2309QuantityExceedsLimit","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","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":[{"internalType":"bytes32[]","name":"_merkleProof","type":"bytes32[]"}],"name":"allowlistMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"amountForAllowlist","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"amountForDevs","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"collectionSize","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"devMint","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":"uint256","name":"tokenId","type":"uint256"}],"name":"getOwnershipData","outputs":[{"components":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"uint64","name":"startTimestamp","type":"uint64"},{"internalType":"bool","name":"burned","type":"bool"},{"internalType":"uint24","name":"extraData","type":"uint24"}],"internalType":"struct IERC721A.TokenOwnership","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"},{"internalType":"bytes32[]","name":"_merkleProof","type":"bytes32[]"}],"name":"isAllowList","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"publicSaleKey","type":"uint256"},{"internalType":"uint256","name":"publicSaleStartTime","type":"uint256"}],"name":"isPublicSaleOn","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"kakapo","outputs":[{"internalType":"contract Kakapo","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxPerAllowlistAddressMint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"numberMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"publicMinted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"callerPublicSaleKey","type":"uint256"}],"name":"publicSaleMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"saleConfig","outputs":[{"internalType":"uint32","name":"allowlistSaleStartTime","type":"uint32"},{"internalType":"uint32","name":"publicSaleStartTime","type":"uint32"},{"internalType":"uint32","name":"publicSaleKey","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint32","name":"timestamp","type":"uint32"}],"name":"setAllowlistSaleStartTime","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"setBirdContractAddr","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_Address","type":"address"}],"name":"setBurnContractAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint32","name":"timestamp","type":"uint32"}],"name":"setBurnStartTime","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_merkleRoot","type":"bytes32"}],"name":"setMerkleRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint32","name":"key","type":"uint32"}],"name":"setPublicSaleKey","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint32","name":"timestamp","type":"uint32"}],"name":"setPublicSaleStartTime","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint32","name":"allowlistSaleTime","type":"uint32"},{"internalType":"uint32","name":"publicSaleStartTime","type":"uint32"}],"name":"setSaleInfo","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"stakeMint","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":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawMoney","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
6101006040523480156200001257600080fd5b5060405162004b4438038062004b4483398181016040528101906200003891906200031e565b6040518060400160405280600681526020017f49747345676700000000000000000000000000000000000000000000000000008152506040518060400160405280600681526020017f4954534547470000000000000000000000000000000000000000000000000000815250620000c4620000b86200018660201b60201c565b6200018e60201b60201c565b8160039080519060200190620000dc92919062000257565b508060049080519060200190620000f592919062000257565b50620001066200025260201b60201c565b6001819055505050600160098190555083608081815250508160a081815250508060c081815250508260e08181525050828111156200017c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200017390620003b7565b60405180910390fd5b50505050620004a1565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600090565b8280546200026590620003f4565b90600052602060002090601f016020900481019282620002895760008555620002d5565b82601f10620002a457805160ff1916838001178555620002d5565b82800160010185558215620002d5579182015b82811115620002d4578251825591602001919060010190620002b7565b5b509050620002e49190620002e8565b5090565b5b8082111562000303576000816000905550600101620002e9565b5090565b600081519050620003188162000487565b92915050565b600080600080608085870312156200033b576200033a62000459565b5b60006200034b8782880162000307565b94505060206200035e8782880162000307565b9350506040620003718782880162000307565b9250506060620003848782880162000307565b91505092959194509250565b60006200039f601d83620003d9565b9150620003ac826200045e565b602082019050919050565b60006020820190508181036000830152620003d28162000390565b9050919050565b600082825260208201905092915050565b6000819050919050565b600060028204905060018216806200040d57607f821691505b602082108114156200042457620004236200042a565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600080fd5b7f6c617267657220636f6c6c656374696f6e2073697a65206e6565646564000000600082015250565b6200049281620003ea565b81146200049e57600080fd5b50565b60805160a05160c05160e05161464d620004f760003960008181611319015281816114920152611ec80152600061219001526000818161116e01526122f801526000818161141b015261216c015261464d6000f3fe60806040526004361061025c5760003560e01c806381cdf76611610144578063b3ab66b0116100b6578063d62b63031161007a578063d62b6303146108b0578063dbcad76f146108db578063dc33e68114610918578063e985e9c514610955578063f2fde38b14610992578063fbe1aa51146109bb5761025c565b8063b3ab66b0146107d8578063b88d4fde146107f4578063be05f11d1461081d578063c87b56dd14610848578063d453c17a146108855761025c565b80639231ab2a116101085780639231ab2a146106de57806395d89b411461071b5780639c14d8ac146107465780639f871cb91461076f578063a22cb46514610798578063ac446002146107c15761025c565b806381cdf7661461060b578063870242b9146106345780638da5cb5b1461065d578063900280831461068857806390aa0b0f146106b15761025c565b806342842e0e116101dd5780635e3867ca116101a15780635e3867ca146104eb5780635fd84c28146105285780636352211e1461055157806370a082311461058e578063715018a6146105cb5780637cb64759146105e25761025c565b806342842e0e1461042957806342966c681461045257806345c0f5331461047b578063537924ef146104a657806355f804b3146104c25761025c565b806318160ddd1161022457806318160ddd1461036c57806323b872dd1461039757806332c314e1146103c05780633593ab6a146103e9578063375a069a146104005761025c565b806301ffc9a71461026157806306fdde031461029e578063081812fc146102c9578063095ea7b3146103065780631015805b1461032f575b600080fd5b34801561026d57600080fd5b50610288600480360381019061028391906134b5565b6109e6565b6040516102959190613b20565b60405180910390f35b3480156102aa57600080fd5b506102b3610a78565b6040516102c09190613b56565b60405180910390f35b3480156102d557600080fd5b506102f060048036038101906102eb919061355c565b610b0a565b6040516102fd9190613ab9565b60405180910390f35b34801561031257600080fd5b5061032d600480360381019061032891906133fb565b610b89565b005b34801561033b57600080fd5b5061035660048036038101906103519190613218565b610ccd565b6040516103639190613b20565b60405180910390f35b34801561037857600080fd5b50610381610ced565b60405161038e9190613dd3565b60405180910390f35b3480156103a357600080fd5b506103be60048036038101906103b99190613285565b610d04565b005b3480156103cc57600080fd5b506103e760048036038101906103e291906135c9565b611029565b005b3480156103f557600080fd5b506103fe611058565b005b34801561040c57600080fd5b506104276004803603810190610422919061355c565b611164565b005b34801561043557600080fd5b50610450600480360381019061044b9190613285565b6111ee565b005b34801561045e57600080fd5b506104796004803603810190610474919061355c565b61120e565b005b34801561048757600080fd5b50610490611317565b60405161049d9190613dd3565b60405180910390f35b6104c060048036038101906104bb919061343b565b61133b565b005b3480156104ce57600080fd5b506104e960048036038101906104e4919061350f565b611560565b005b3480156104f757600080fd5b50610512600480360381019061050d919061335b565b61157e565b60405161051f9190613b20565b60405180910390f35b34801561053457600080fd5b5061054f600480360381019061054a91906135c9565b611643565b005b34801561055d57600080fd5b506105786004803603810190610573919061355c565b611672565b6040516105859190613ab9565b60405180910390f35b34801561059a57600080fd5b506105b560048036038101906105b09190613218565b611684565b6040516105c29190613dd3565b60405180910390f35b3480156105d757600080fd5b506105e061173d565b005b3480156105ee57600080fd5b5061060960048036038101906106049190613488565b611751565b005b34801561061757600080fd5b50610632600480360381019061062d9190613218565b611763565b005b34801561064057600080fd5b5061065b600480360381019061065691906135f6565b6117af565b005b34801561066957600080fd5b50610672611877565b60405161067f9190613ab9565b60405180910390f35b34801561069457600080fd5b506106af60048036038101906106aa91906135c9565b6118a0565b005b3480156106bd57600080fd5b506106c66118cf565b6040516106d593929190613dee565b60405180910390f35b3480156106ea57600080fd5b506107056004803603810190610700919061355c565b611917565b6040516107129190613db8565b60405180910390f35b34801561072757600080fd5b5061073061192f565b60405161073d9190613b56565b60405180910390f35b34801561075257600080fd5b5061076d60048036038101906107689190613218565b6119c1565b005b34801561077b57600080fd5b50610796600480360381019061079191906135c9565b611a0d565b005b3480156107a457600080fd5b506107bf60048036038101906107ba91906133bb565b611a39565b005b3480156107cd57600080fd5b506107d6611bb1565b005b6107f260048036038101906107ed919061355c565b611cbe565b005b34801561080057600080fd5b5061081b600480360381019061081691906132d8565b612032565b005b34801561082957600080fd5b506108326120a5565b60405161083f9190613b3b565b60405180910390f35b34801561085457600080fd5b5061086f600480360381019061086a919061355c565b6120cb565b60405161087c9190613b56565b60405180910390f35b34801561089157600080fd5b5061089a61216a565b6040516108a79190613dd3565b60405180910390f35b3480156108bc57600080fd5b506108c561218e565b6040516108d29190613dd3565b60405180910390f35b3480156108e757600080fd5b5061090260048036038101906108fd9190613589565b6121b2565b60405161090f9190613b20565b60405180910390f35b34801561092457600080fd5b5061093f600480360381019061093a9190613218565b6121cc565b60405161094c9190613dd3565b60405180910390f35b34801561096157600080fd5b5061097c60048036038101906109779190613245565b6121de565b6040516109899190613b20565b60405180910390f35b34801561099e57600080fd5b506109b960048036038101906109b49190613218565b612272565b005b3480156109c757600080fd5b506109d06122f6565b6040516109dd9190613dd3565b60405180910390f35b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610a4157506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610a715750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b606060038054610a8790614048565b80601f0160208091040260200160405190810160405280929190818152602001828054610ab390614048565b8015610b005780601f10610ad557610100808354040283529160200191610b00565b820191906000526020600020905b815481529060010190602001808311610ae357829003601f168201915b5050505050905090565b6000610b158261231a565b610b4b576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6007600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610b9482611672565b90508073ffffffffffffffffffffffffffffffffffffffff16610bb5612379565b73ffffffffffffffffffffffffffffffffffffffff1614610c1857610be181610bdc612379565b6121de565b610c17576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826007600084815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b600d6020528060005260406000206000915054906101000a900460ff1681565b6000610cf7612381565b6002546001540303905090565b6000610d0f82612386565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610d76576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080610d8284612454565b91509150610d988187610d93612379565b61247b565b610de457610dad86610da8612379565b6121de565b610de3576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415610e4b576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610e5886868660016124bf565b8015610e6357600082555b600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815460010191905081905550610f3185610f0d8888876124c5565b7c0200000000000000000000000000000000000000000000000000000000176124ed565b600560008681526020019081526020016000208190555060007c020000000000000000000000000000000000000000000000000000000084161415610fb9576000600185019050600060056000838152602001908152602001600020541415610fb7576001548114610fb6578360056000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46110218686866001612518565b505050505050565b61103161251e565b80600e60000160006101000a81548163ffffffff021916908363ffffffff16021790555050565b3273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614156110c7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110be90613c38565b60405180910390fd5b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611157576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161114e90613c98565b60405180910390fd5b61116232600161259c565b565b61116c61251e565b7f000000000000000000000000000000000000000000000000000000000000000081611196610ced565b6111a09190613ec9565b11156111e1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111d890613d78565b60405180910390fd5b6111eb338261259c565b50565b61120983838360405180602001604052806000815250612032565b505050565b6000600c60149054906101000a900463ffffffff1663ffffffff1690506000811415801561123c5750804210155b61127b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161127290613d38565b60405180910390fd5b6112868260016125ba565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16633125ac6c836040518263ffffffff1660e01b81526004016112e19190613dd3565b600060405180830381600087803b1580156112fb57600080fd5b505af115801561130f573d6000803e3d6000fd5b505050505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff16146113a9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113a090613c18565b60405180910390fd5b6000600e60000160009054906101000a900463ffffffff1663ffffffff169050600081141580156113da5750804210155b611419576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161141090613bd8565b60405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006001611445336121cc565b61144f9190613ec9565b1115611490576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161148790613d58565b60405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000060016114bb610ced565b6114c59190613ec9565b1115611506576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114fd90613c58565b60405180910390fd5b61151133848461157e565b611550576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161154790613c78565b60405180910390fd5b61155b33600161259c565b505050565b61156861251e565b8181600f9190611579929190612f77565b505050565b600080846040516020016115929190613a65565b6040516020818303038152906040528051906020012090506115f8848480806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050600a548361280e565b611637576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161162e90613cd8565b60405180910390fd5b60019150509392505050565b61164b61251e565b80600e60000160046101000a81548163ffffffff021916908363ffffffff16021790555050565b600061167d82612386565b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156116ec576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b61174561251e565b61174f6000612825565b565b61175961251e565b80600a8190555050565b61176b61251e565b80600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6117b761251e565b60405180606001604052808363ffffffff1681526020018263ffffffff168152602001600e60000160089054906101000a900463ffffffff1663ffffffff16815250600e60008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a81548163ffffffff021916908363ffffffff16021790555060408201518160000160086101000a81548163ffffffff021916908363ffffffff1602179055509050505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6118a861251e565b80600e60000160086101000a81548163ffffffff021916908363ffffffff16021790555050565b600e8060000160009054906101000a900463ffffffff16908060000160049054906101000a900463ffffffff16908060000160089054906101000a900463ffffffff16905083565b61191f612ffd565b611928826128e9565b9050919050565b60606004805461193e90614048565b80601f016020809104026020016040519081016040528092919081815260200182805461196a90614048565b80156119b75780601f1061198c576101008083540402835291602001916119b7565b820191906000526020600020905b81548152906001019060200180831161199a57829003601f168201915b5050505050905090565b6119c961251e565b80600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b611a1561251e565b80600c60146101000a81548163ffffffff021916908363ffffffff16021790555050565b611a41612379565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611aa6576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060086000611ab3612379565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611b60612379565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611ba59190613b20565b60405180910390a35050565b611bb961251e565b60026009541415611bff576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bf690613d98565b60405180910390fd5b600260098190555060003373ffffffffffffffffffffffffffffffffffffffff1647604051611c2d90613aa4565b60006040518083038185875af1925050503d8060008114611c6a576040519150601f19603f3d011682016040523d82523d6000602084013e611c6f565b606091505b5050905080611cb3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611caa90613d18565b60405180910390fd5b506001600981905550565b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff1614611d2c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d2390613c18565b60405180910390fd5b3273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611d9a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d9190613b98565b60405180910390fd5b6000600e6040518060600160405290816000820160009054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016000820160049054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016000820160089054906101000a900463ffffffff1663ffffffff1663ffffffff168152505090506000816040015163ffffffff1690506000826020015163ffffffff169050838214611e7d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e7490613bf8565b60405180910390fd5b611e8782826121b2565b611ec6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ebd90613cf8565b60405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006001611ef1610ced565b611efb9190613ec9565b1115611f3c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f3390613c58565b60405180910390fd5b600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615611fc9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fc090613bb8565b60405180910390fd5b611fd433600161259c565b6001600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050505050565b61203d848484610d04565b60008373ffffffffffffffffffffffffffffffffffffffff163b1461209f5761206884848484612909565b61209e576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60606120d68261231a565b61210c576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000612116612a69565b90506000815114156121375760405180602001604052806000815250612162565b8061214184612afb565b604051602001612152929190613a80565b6040516020818303038152906040525b915050919050565b7f000000000000000000000000000000000000000000000000000000000000000081565b7f000000000000000000000000000000000000000000000000000000000000000081565b60008083141580156121c45750814210155b905092915050565b60006121d782612b55565b9050919050565b6000600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61227a61251e565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156122ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122e190613b78565b60405180910390fd5b6122f381612825565b50565b7f000000000000000000000000000000000000000000000000000000000000000081565b600081612325612381565b11158015612334575060015482105b8015612372575060007c0100000000000000000000000000000000000000000000000000000000600560008581526020019081526020016000205416145b9050919050565b600033905090565b600090565b60008082905080612395612381565b1161241d5760015481101561241c5760006005600083815260200190815260200160002054905060007c01000000000000000000000000000000000000000000000000000000008216141561241a575b60008114156124105760056000836001900393508381526020019081526020016000205490506123e5565b809250505061244f565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b60008060006007600085815260200190815260200160002090508092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e86124dc868684612bac565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b612526612bb5565b73ffffffffffffffffffffffffffffffffffffffff16612544611877565b73ffffffffffffffffffffffffffffffffffffffff161461259a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161259190613cb8565b60405180910390fd5b565b6125b6828260405180602001604052806000815250612bbd565b5050565b60006125c583612386565b905060008190506000806125d886612454565b915091508415612641576125f481846125ef612379565b61247b565b6126405761260983612604612379565b6121de565b61263f576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b5b61264f8360008860016124bf565b801561265a57600082555b600160806001901b03600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550612702836126bf856000886124c5565b7c02000000000000000000000000000000000000000000000000000000007c010000000000000000000000000000000000000000000000000000000017176124ed565b600560008881526020019081526020016000208190555060007c02000000000000000000000000000000000000000000000000000000008516141561278a576000600187019050600060056000838152602001908152602001600020541415612788576001548114612787578460056000838152602001908152602001600020819055505b5b505b85600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46127f4836000886001612518565b600260008154809291906001019190505550505050505050565b60008261281b8584612c5b565b1490509392505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6128f1612ffd565b6129026128fd83612386565b612cb1565b9050919050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261292f612379565b8786866040518563ffffffff1660e01b81526004016129519493929190613ad4565b602060405180830381600087803b15801561296b57600080fd5b505af192505050801561299c57506040513d601f19601f8201168201806040525081019061299991906134e2565b60015b612a16573d80600081146129cc576040519150601f19603f3d011682016040523d82523d6000602084013e6129d1565b606091505b50600081511415612a0e576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b6060600f8054612a7890614048565b80601f0160208091040260200160405190810160405280929190818152602001828054612aa490614048565b8015612af15780601f10612ac657610100808354040283529160200191612af1565b820191906000526020600020905b815481529060010190602001808311612ad457829003601f168201915b5050505050905090565b60606080604051019050806040528082600183039250600a81066030018353600a810490505b8015612b4157600183039250600a81066030018353600a81049050612b21565b508181036020830392508083525050919050565b600067ffffffffffffffff6040600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054901c169050919050565b60009392505050565b600033905090565b612bc78383612d67565b60008373ffffffffffffffffffffffffffffffffffffffff163b14612c565760006001549050600083820390505b612c086000868380600101945086612909565b612c3e576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b818110612bf5578160015414612c5357600080fd5b50505b505050565b60008082905060005b8451811015612ca657612c9182868381518110612c8457612c83614176565b5b6020026020010151612f25565b91508080612c9e906140ab565b915050612c64565b508091505092915050565b612cb9612ffd565b81816000019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505060a082901c816020019067ffffffffffffffff16908167ffffffffffffffff168152505060007c01000000000000000000000000000000000000000000000000000000008316141581604001901515908115158152505060e882901c816060019062ffffff16908162ffffff1681525050919050565b600060015490506000821415612da9576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612db660008483856124bf565b600160406001901b178202600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550612e2d83612e1e60008660006124c5565b612e2785612f50565b176124ed565b6005600083815260200190815260200160002081905550600080838301905073ffffffffffffffffffffffffffffffffffffffff85169150828260007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600183015b818114612ece57808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600181019050612e93565b506000821415612f0a576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806001819055505050612f206000848385612518565b505050565b6000818310612f3d57612f388284612f60565b612f48565b612f478383612f60565b5b905092915050565b60006001821460e11b9050919050565b600082600052816020526040600020905092915050565b828054612f8390614048565b90600052602060002090601f016020900481019282612fa55760008555612fec565b82601f10612fbe57803560ff1916838001178555612fec565b82800160010185558215612fec579182015b82811115612feb578235825591602001919060010190612fd0565b5b509050612ff9919061304c565b5090565b6040518060800160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff168152602001600015158152602001600062ffffff1681525090565b5b8082111561306557600081600090555060010161304d565b5090565b600061307c61307784613e4a565b613e25565b905082815260208101848484011115613098576130976141e3565b5b6130a3848285614006565b509392505050565b6000813590506130ba8161458d565b92915050565b60008083601f8401126130d6576130d56141d9565b5b8235905067ffffffffffffffff8111156130f3576130f26141d4565b5b60208301915083602082028301111561310f5761310e6141de565b5b9250929050565b600081359050613125816145a4565b92915050565b60008135905061313a816145bb565b92915050565b60008135905061314f816145d2565b92915050565b600081519050613164816145d2565b92915050565b600082601f83011261317f5761317e6141d9565b5b813561318f848260208601613069565b91505092915050565b60008083601f8401126131ae576131ad6141d9565b5b8235905067ffffffffffffffff8111156131cb576131ca6141d4565b5b6020830191508360018202830111156131e7576131e66141de565b5b9250929050565b6000813590506131fd816145e9565b92915050565b60008135905061321281614600565b92915050565b60006020828403121561322e5761322d6141ed565b5b600061323c848285016130ab565b91505092915050565b6000806040838503121561325c5761325b6141ed565b5b600061326a858286016130ab565b925050602061327b858286016130ab565b9150509250929050565b60008060006060848603121561329e5761329d6141ed565b5b60006132ac868287016130ab565b93505060206132bd868287016130ab565b92505060406132ce868287016131ee565b9150509250925092565b600080600080608085870312156132f2576132f16141ed565b5b6000613300878288016130ab565b9450506020613311878288016130ab565b9350506040613322878288016131ee565b925050606085013567ffffffffffffffff811115613343576133426141e8565b5b61334f8782880161316a565b91505092959194509250565b600080600060408486031215613374576133736141ed565b5b6000613382868287016130ab565b935050602084013567ffffffffffffffff8111156133a3576133a26141e8565b5b6133af868287016130c0565b92509250509250925092565b600080604083850312156133d2576133d16141ed565b5b60006133e0858286016130ab565b92505060206133f185828601613116565b9150509250929050565b60008060408385031215613412576134116141ed565b5b6000613420858286016130ab565b9250506020613431858286016131ee565b9150509250929050565b60008060208385031215613452576134516141ed565b5b600083013567ffffffffffffffff8111156134705761346f6141e8565b5b61347c858286016130c0565b92509250509250929050565b60006020828403121561349e5761349d6141ed565b5b60006134ac8482850161312b565b91505092915050565b6000602082840312156134cb576134ca6141ed565b5b60006134d984828501613140565b91505092915050565b6000602082840312156134f8576134f76141ed565b5b600061350684828501613155565b91505092915050565b60008060208385031215613526576135256141ed565b5b600083013567ffffffffffffffff811115613544576135436141e8565b5b61355085828601613198565b92509250509250929050565b600060208284031215613572576135716141ed565b5b6000613580848285016131ee565b91505092915050565b600080604083850312156135a05761359f6141ed565b5b60006135ae858286016131ee565b92505060206135bf858286016131ee565b9150509250929050565b6000602082840312156135df576135de6141ed565b5b60006135ed84828501613203565b91505092915050565b6000806040838503121561360d5761360c6141ed565b5b600061361b85828601613203565b925050602061362c85828601613203565b9150509250929050565b61363f81613f1f565b82525050565b61364e81613f1f565b82525050565b61366561366082613f1f565b6140f4565b82525050565b61367481613f31565b82525050565b61368381613f31565b82525050565b600061369482613e7b565b61369e8185613e91565b93506136ae818560208601614015565b6136b7816141f2565b840191505092915050565b6136cb81613fd0565b82525050565b60006136dc82613e86565b6136e68185613ead565b93506136f6818560208601614015565b6136ff816141f2565b840191505092915050565b600061371582613e86565b61371f8185613ebe565b935061372f818560208601614015565b80840191505092915050565b6000613748602683613ead565b915061375382614210565b604082019050919050565b600061376b602a83613ead565b91506137768261425f565b604082019050919050565b600061378e600f83613ead565b9150613799826142ae565b602082019050919050565b60006137b1601883613ead565b91506137bc826142d7565b602082019050919050565b60006137d4602583613ead565b91506137df82614300565b604082019050919050565b60006137f7601e83613ead565b91506138028261434f565b602082019050919050565b600061381a601e83613ead565b915061382582614378565b602082019050919050565b600061383d601283613ead565b9150613848826143a1565b602082019050919050565b6000613860601f83613ead565b915061386b826143ca565b602082019050919050565b6000613883600c83613ead565b915061388e826143f3565b602082019050919050565b60006138a6602083613ead565b91506138b18261441c565b602082019050919050565b60006138c9600f83613ead565b91506138d482614445565b602082019050919050565b60006138ec601d83613ead565b91506138f78261446e565b602082019050919050565b600061390f600083613ea2565b915061391a82614497565b600082019050919050565b6000613932601083613ead565b915061393d8261449a565b602082019050919050565b6000613955601683613ead565b9150613960826144c3565b602082019050919050565b6000613978601683613ead565b9150613983826144ec565b602082019050919050565b600061399b602783613ead565b91506139a682614515565b604082019050919050565b60006139be601f83613ead565b91506139c982614564565b602082019050919050565b6080820160008201516139ea6000850182613636565b5060208201516139fd6020850182613a56565b506040820151613a10604085018261366b565b506060820151613a236060850182613a29565b50505050565b613a3281613f93565b82525050565b613a4181613fa2565b82525050565b613a5081613fac565b82525050565b613a5f81613fbc565b82525050565b6000613a718284613654565b60148201915081905092915050565b6000613a8c828561370a565b9150613a98828461370a565b91508190509392505050565b6000613aaf82613902565b9150819050919050565b6000602082019050613ace6000830184613645565b92915050565b6000608082019050613ae96000830187613645565b613af66020830186613645565b613b036040830185613a38565b8181036060830152613b158184613689565b905095945050505050565b6000602082019050613b35600083018461367a565b92915050565b6000602082019050613b5060008301846136c2565b92915050565b60006020820190508181036000830152613b7081846136d1565b905092915050565b60006020820190508181036000830152613b918161373b565b9050919050565b60006020820190508181036000830152613bb18161375e565b9050919050565b60006020820190508181036000830152613bd181613781565b9050919050565b60006020820190508181036000830152613bf1816137a4565b9050919050565b60006020820190508181036000830152613c11816137c7565b9050919050565b60006020820190508181036000830152613c31816137ea565b9050919050565b60006020820190508181036000830152613c518161380d565b9050919050565b60006020820190508181036000830152613c7181613830565b9050919050565b60006020820190508181036000830152613c9181613853565b9050919050565b60006020820190508181036000830152613cb181613876565b9050919050565b60006020820190508181036000830152613cd181613899565b9050919050565b60006020820190508181036000830152613cf1816138bc565b9050919050565b60006020820190508181036000830152613d11816138df565b9050919050565b60006020820190508181036000830152613d3181613925565b9050919050565b60006020820190508181036000830152613d5181613948565b9050919050565b60006020820190508181036000830152613d718161396b565b9050919050565b60006020820190508181036000830152613d918161398e565b9050919050565b60006020820190508181036000830152613db1816139b1565b9050919050565b6000608082019050613dcd60008301846139d4565b92915050565b6000602082019050613de86000830184613a38565b92915050565b6000606082019050613e036000830186613a47565b613e106020830185613a47565b613e1d6040830184613a47565b949350505050565b6000613e2f613e40565b9050613e3b828261407a565b919050565b6000604051905090565b600067ffffffffffffffff821115613e6557613e646141a5565b5b613e6e826141f2565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000613ed482613fa2565b9150613edf83613fa2565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613f1457613f13614118565b5b828201905092915050565b6000613f2a82613f73565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600062ffffff82169050919050565b6000819050919050565b600063ffffffff82169050919050565b600067ffffffffffffffff82169050919050565b6000613fdb82613fe2565b9050919050565b6000613fed82613ff4565b9050919050565b6000613fff82613f73565b9050919050565b82818337600083830152505050565b60005b83811015614033578082015181840152602081019050614018565b83811115614042576000848401525b50505050565b6000600282049050600182168061406057607f821691505b6020821081141561407457614073614147565b5b50919050565b614083826141f2565b810181811067ffffffffffffffff821117156140a2576140a16141a5565b5b80604052505050565b60006140b682613fa2565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156140e9576140e8614118565b5b600182019050919050565b60006140ff82614106565b9050919050565b600061411182614203565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4d696e74696e672066726f6d20736d61727420636f6e7472616374732069732060008201527f646973616c6c6f77656400000000000000000000000000000000000000000000602082015250565b7f416c7265616479206d696e7465642e0000000000000000000000000000000000600082015250565b7f73616c6520686173206e6f742073746172746564207965740000000000000000600082015250565b7f63616c6c6564207769746820696e636f7272656374207075626c69632073616c60008201527f65206b6579000000000000000000000000000000000000000000000000000000602082015250565b7f5468652063616c6c657220697320616e6f7468657220636f6e74726163740000600082015250565b7f6d757374206d696e742066726f6d20736d61727420636f6e7472616374730000600082015250565b7f72656163686564206d617820737570706c790000000000000000000000000000600082015250565b7f6e6f7420656c696769626c6520666f7220616c6c6f776c697374206d696e7400600082015250565b7f73656e646572206572726f720000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f496e636f72726563742070726f6f660000000000000000000000000000000000600082015250565b7f7075626c69632073616c6520686173206e6f7420626567756e20796574000000600082015250565b50565b7f5472616e73666572206661696c65642e00000000000000000000000000000000600082015250565b7f6275726e20686173206e6f7420626567756e2079657400000000000000000000600082015250565b7f63616e206e6f74206d696e742074686973206d616e7900000000000000000000600082015250565b7f746f6f206d616e7920616c7265616479206d696e746564206265666f7265206460008201527f6576206d696e7400000000000000000000000000000000000000000000000000602082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b61459681613f1f565b81146145a157600080fd5b50565b6145ad81613f31565b81146145b857600080fd5b50565b6145c481613f3d565b81146145cf57600080fd5b50565b6145db81613f47565b81146145e657600080fd5b50565b6145f281613fa2565b81146145fd57600080fd5b50565b61460981613fac565b811461461457600080fd5b5056fea2646970667358221220bab22c9909d4d71dbf396a6090941d43030e7e9477e3b334be0909a85304274164736f6c6343000807003300000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000d05000000000000000000000000000000000000000000000000000000000000012c0000000000000000000000000000000000000000000000000000000000000d05
Deployed Bytecode
0x60806040526004361061025c5760003560e01c806381cdf76611610144578063b3ab66b0116100b6578063d62b63031161007a578063d62b6303146108b0578063dbcad76f146108db578063dc33e68114610918578063e985e9c514610955578063f2fde38b14610992578063fbe1aa51146109bb5761025c565b8063b3ab66b0146107d8578063b88d4fde146107f4578063be05f11d1461081d578063c87b56dd14610848578063d453c17a146108855761025c565b80639231ab2a116101085780639231ab2a146106de57806395d89b411461071b5780639c14d8ac146107465780639f871cb91461076f578063a22cb46514610798578063ac446002146107c15761025c565b806381cdf7661461060b578063870242b9146106345780638da5cb5b1461065d578063900280831461068857806390aa0b0f146106b15761025c565b806342842e0e116101dd5780635e3867ca116101a15780635e3867ca146104eb5780635fd84c28146105285780636352211e1461055157806370a082311461058e578063715018a6146105cb5780637cb64759146105e25761025c565b806342842e0e1461042957806342966c681461045257806345c0f5331461047b578063537924ef146104a657806355f804b3146104c25761025c565b806318160ddd1161022457806318160ddd1461036c57806323b872dd1461039757806332c314e1146103c05780633593ab6a146103e9578063375a069a146104005761025c565b806301ffc9a71461026157806306fdde031461029e578063081812fc146102c9578063095ea7b3146103065780631015805b1461032f575b600080fd5b34801561026d57600080fd5b50610288600480360381019061028391906134b5565b6109e6565b6040516102959190613b20565b60405180910390f35b3480156102aa57600080fd5b506102b3610a78565b6040516102c09190613b56565b60405180910390f35b3480156102d557600080fd5b506102f060048036038101906102eb919061355c565b610b0a565b6040516102fd9190613ab9565b60405180910390f35b34801561031257600080fd5b5061032d600480360381019061032891906133fb565b610b89565b005b34801561033b57600080fd5b5061035660048036038101906103519190613218565b610ccd565b6040516103639190613b20565b60405180910390f35b34801561037857600080fd5b50610381610ced565b60405161038e9190613dd3565b60405180910390f35b3480156103a357600080fd5b506103be60048036038101906103b99190613285565b610d04565b005b3480156103cc57600080fd5b506103e760048036038101906103e291906135c9565b611029565b005b3480156103f557600080fd5b506103fe611058565b005b34801561040c57600080fd5b506104276004803603810190610422919061355c565b611164565b005b34801561043557600080fd5b50610450600480360381019061044b9190613285565b6111ee565b005b34801561045e57600080fd5b506104796004803603810190610474919061355c565b61120e565b005b34801561048757600080fd5b50610490611317565b60405161049d9190613dd3565b60405180910390f35b6104c060048036038101906104bb919061343b565b61133b565b005b3480156104ce57600080fd5b506104e960048036038101906104e4919061350f565b611560565b005b3480156104f757600080fd5b50610512600480360381019061050d919061335b565b61157e565b60405161051f9190613b20565b60405180910390f35b34801561053457600080fd5b5061054f600480360381019061054a91906135c9565b611643565b005b34801561055d57600080fd5b506105786004803603810190610573919061355c565b611672565b6040516105859190613ab9565b60405180910390f35b34801561059a57600080fd5b506105b560048036038101906105b09190613218565b611684565b6040516105c29190613dd3565b60405180910390f35b3480156105d757600080fd5b506105e061173d565b005b3480156105ee57600080fd5b5061060960048036038101906106049190613488565b611751565b005b34801561061757600080fd5b50610632600480360381019061062d9190613218565b611763565b005b34801561064057600080fd5b5061065b600480360381019061065691906135f6565b6117af565b005b34801561066957600080fd5b50610672611877565b60405161067f9190613ab9565b60405180910390f35b34801561069457600080fd5b506106af60048036038101906106aa91906135c9565b6118a0565b005b3480156106bd57600080fd5b506106c66118cf565b6040516106d593929190613dee565b60405180910390f35b3480156106ea57600080fd5b506107056004803603810190610700919061355c565b611917565b6040516107129190613db8565b60405180910390f35b34801561072757600080fd5b5061073061192f565b60405161073d9190613b56565b60405180910390f35b34801561075257600080fd5b5061076d60048036038101906107689190613218565b6119c1565b005b34801561077b57600080fd5b50610796600480360381019061079191906135c9565b611a0d565b005b3480156107a457600080fd5b506107bf60048036038101906107ba91906133bb565b611a39565b005b3480156107cd57600080fd5b506107d6611bb1565b005b6107f260048036038101906107ed919061355c565b611cbe565b005b34801561080057600080fd5b5061081b600480360381019061081691906132d8565b612032565b005b34801561082957600080fd5b506108326120a5565b60405161083f9190613b3b565b60405180910390f35b34801561085457600080fd5b5061086f600480360381019061086a919061355c565b6120cb565b60405161087c9190613b56565b60405180910390f35b34801561089157600080fd5b5061089a61216a565b6040516108a79190613dd3565b60405180910390f35b3480156108bc57600080fd5b506108c561218e565b6040516108d29190613dd3565b60405180910390f35b3480156108e757600080fd5b5061090260048036038101906108fd9190613589565b6121b2565b60405161090f9190613b20565b60405180910390f35b34801561092457600080fd5b5061093f600480360381019061093a9190613218565b6121cc565b60405161094c9190613dd3565b60405180910390f35b34801561096157600080fd5b5061097c60048036038101906109779190613245565b6121de565b6040516109899190613b20565b60405180910390f35b34801561099e57600080fd5b506109b960048036038101906109b49190613218565b612272565b005b3480156109c757600080fd5b506109d06122f6565b6040516109dd9190613dd3565b60405180910390f35b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610a4157506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610a715750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b606060038054610a8790614048565b80601f0160208091040260200160405190810160405280929190818152602001828054610ab390614048565b8015610b005780601f10610ad557610100808354040283529160200191610b00565b820191906000526020600020905b815481529060010190602001808311610ae357829003601f168201915b5050505050905090565b6000610b158261231a565b610b4b576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6007600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610b9482611672565b90508073ffffffffffffffffffffffffffffffffffffffff16610bb5612379565b73ffffffffffffffffffffffffffffffffffffffff1614610c1857610be181610bdc612379565b6121de565b610c17576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826007600084815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b600d6020528060005260406000206000915054906101000a900460ff1681565b6000610cf7612381565b6002546001540303905090565b6000610d0f82612386565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610d76576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080610d8284612454565b91509150610d988187610d93612379565b61247b565b610de457610dad86610da8612379565b6121de565b610de3576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415610e4b576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610e5886868660016124bf565b8015610e6357600082555b600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815460010191905081905550610f3185610f0d8888876124c5565b7c0200000000000000000000000000000000000000000000000000000000176124ed565b600560008681526020019081526020016000208190555060007c020000000000000000000000000000000000000000000000000000000084161415610fb9576000600185019050600060056000838152602001908152602001600020541415610fb7576001548114610fb6578360056000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46110218686866001612518565b505050505050565b61103161251e565b80600e60000160006101000a81548163ffffffff021916908363ffffffff16021790555050565b3273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614156110c7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110be90613c38565b60405180910390fd5b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611157576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161114e90613c98565b60405180910390fd5b61116232600161259c565b565b61116c61251e565b7f000000000000000000000000000000000000000000000000000000000000012c81611196610ced565b6111a09190613ec9565b11156111e1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111d890613d78565b60405180910390fd5b6111eb338261259c565b50565b61120983838360405180602001604052806000815250612032565b505050565b6000600c60149054906101000a900463ffffffff1663ffffffff1690506000811415801561123c5750804210155b61127b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161127290613d38565b60405180910390fd5b6112868260016125ba565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16633125ac6c836040518263ffffffff1660e01b81526004016112e19190613dd3565b600060405180830381600087803b1580156112fb57600080fd5b505af115801561130f573d6000803e3d6000fd5b505050505050565b7f0000000000000000000000000000000000000000000000000000000000000d0581565b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff16146113a9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113a090613c18565b60405180910390fd5b6000600e60000160009054906101000a900463ffffffff1663ffffffff169050600081141580156113da5750804210155b611419576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161141090613bd8565b60405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000016001611445336121cc565b61144f9190613ec9565b1115611490576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161148790613d58565b60405180910390fd5b7f0000000000000000000000000000000000000000000000000000000000000d0560016114bb610ced565b6114c59190613ec9565b1115611506576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114fd90613c58565b60405180910390fd5b61151133848461157e565b611550576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161154790613c78565b60405180910390fd5b61155b33600161259c565b505050565b61156861251e565b8181600f9190611579929190612f77565b505050565b600080846040516020016115929190613a65565b6040516020818303038152906040528051906020012090506115f8848480806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050600a548361280e565b611637576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161162e90613cd8565b60405180910390fd5b60019150509392505050565b61164b61251e565b80600e60000160046101000a81548163ffffffff021916908363ffffffff16021790555050565b600061167d82612386565b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156116ec576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b61174561251e565b61174f6000612825565b565b61175961251e565b80600a8190555050565b61176b61251e565b80600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6117b761251e565b60405180606001604052808363ffffffff1681526020018263ffffffff168152602001600e60000160089054906101000a900463ffffffff1663ffffffff16815250600e60008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a81548163ffffffff021916908363ffffffff16021790555060408201518160000160086101000a81548163ffffffff021916908363ffffffff1602179055509050505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6118a861251e565b80600e60000160086101000a81548163ffffffff021916908363ffffffff16021790555050565b600e8060000160009054906101000a900463ffffffff16908060000160049054906101000a900463ffffffff16908060000160089054906101000a900463ffffffff16905083565b61191f612ffd565b611928826128e9565b9050919050565b60606004805461193e90614048565b80601f016020809104026020016040519081016040528092919081815260200182805461196a90614048565b80156119b75780601f1061198c576101008083540402835291602001916119b7565b820191906000526020600020905b81548152906001019060200180831161199a57829003601f168201915b5050505050905090565b6119c961251e565b80600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b611a1561251e565b80600c60146101000a81548163ffffffff021916908363ffffffff16021790555050565b611a41612379565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611aa6576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060086000611ab3612379565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611b60612379565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611ba59190613b20565b60405180910390a35050565b611bb961251e565b60026009541415611bff576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bf690613d98565b60405180910390fd5b600260098190555060003373ffffffffffffffffffffffffffffffffffffffff1647604051611c2d90613aa4565b60006040518083038185875af1925050503d8060008114611c6a576040519150601f19603f3d011682016040523d82523d6000602084013e611c6f565b606091505b5050905080611cb3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611caa90613d18565b60405180910390fd5b506001600981905550565b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff1614611d2c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d2390613c18565b60405180910390fd5b3273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611d9a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d9190613b98565b60405180910390fd5b6000600e6040518060600160405290816000820160009054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016000820160049054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016000820160089054906101000a900463ffffffff1663ffffffff1663ffffffff168152505090506000816040015163ffffffff1690506000826020015163ffffffff169050838214611e7d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e7490613bf8565b60405180910390fd5b611e8782826121b2565b611ec6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ebd90613cf8565b60405180910390fd5b7f0000000000000000000000000000000000000000000000000000000000000d056001611ef1610ced565b611efb9190613ec9565b1115611f3c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f3390613c58565b60405180910390fd5b600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615611fc9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fc090613bb8565b60405180910390fd5b611fd433600161259c565b6001600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050505050565b61203d848484610d04565b60008373ffffffffffffffffffffffffffffffffffffffff163b1461209f5761206884848484612909565b61209e576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60606120d68261231a565b61210c576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000612116612a69565b90506000815114156121375760405180602001604052806000815250612162565b8061214184612afb565b604051602001612152929190613a80565b6040516020818303038152906040525b915050919050565b7f000000000000000000000000000000000000000000000000000000000000000181565b7f0000000000000000000000000000000000000000000000000000000000000d0581565b60008083141580156121c45750814210155b905092915050565b60006121d782612b55565b9050919050565b6000600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61227a61251e565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156122ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122e190613b78565b60405180910390fd5b6122f381612825565b50565b7f000000000000000000000000000000000000000000000000000000000000012c81565b600081612325612381565b11158015612334575060015482105b8015612372575060007c0100000000000000000000000000000000000000000000000000000000600560008581526020019081526020016000205416145b9050919050565b600033905090565b600090565b60008082905080612395612381565b1161241d5760015481101561241c5760006005600083815260200190815260200160002054905060007c01000000000000000000000000000000000000000000000000000000008216141561241a575b60008114156124105760056000836001900393508381526020019081526020016000205490506123e5565b809250505061244f565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b60008060006007600085815260200190815260200160002090508092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e86124dc868684612bac565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b612526612bb5565b73ffffffffffffffffffffffffffffffffffffffff16612544611877565b73ffffffffffffffffffffffffffffffffffffffff161461259a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161259190613cb8565b60405180910390fd5b565b6125b6828260405180602001604052806000815250612bbd565b5050565b60006125c583612386565b905060008190506000806125d886612454565b915091508415612641576125f481846125ef612379565b61247b565b6126405761260983612604612379565b6121de565b61263f576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b5b61264f8360008860016124bf565b801561265a57600082555b600160806001901b03600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550612702836126bf856000886124c5565b7c02000000000000000000000000000000000000000000000000000000007c010000000000000000000000000000000000000000000000000000000017176124ed565b600560008881526020019081526020016000208190555060007c02000000000000000000000000000000000000000000000000000000008516141561278a576000600187019050600060056000838152602001908152602001600020541415612788576001548114612787578460056000838152602001908152602001600020819055505b5b505b85600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46127f4836000886001612518565b600260008154809291906001019190505550505050505050565b60008261281b8584612c5b565b1490509392505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6128f1612ffd565b6129026128fd83612386565b612cb1565b9050919050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261292f612379565b8786866040518563ffffffff1660e01b81526004016129519493929190613ad4565b602060405180830381600087803b15801561296b57600080fd5b505af192505050801561299c57506040513d601f19601f8201168201806040525081019061299991906134e2565b60015b612a16573d80600081146129cc576040519150601f19603f3d011682016040523d82523d6000602084013e6129d1565b606091505b50600081511415612a0e576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b6060600f8054612a7890614048565b80601f0160208091040260200160405190810160405280929190818152602001828054612aa490614048565b8015612af15780601f10612ac657610100808354040283529160200191612af1565b820191906000526020600020905b815481529060010190602001808311612ad457829003601f168201915b5050505050905090565b60606080604051019050806040528082600183039250600a81066030018353600a810490505b8015612b4157600183039250600a81066030018353600a81049050612b21565b508181036020830392508083525050919050565b600067ffffffffffffffff6040600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054901c169050919050565b60009392505050565b600033905090565b612bc78383612d67565b60008373ffffffffffffffffffffffffffffffffffffffff163b14612c565760006001549050600083820390505b612c086000868380600101945086612909565b612c3e576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b818110612bf5578160015414612c5357600080fd5b50505b505050565b60008082905060005b8451811015612ca657612c9182868381518110612c8457612c83614176565b5b6020026020010151612f25565b91508080612c9e906140ab565b915050612c64565b508091505092915050565b612cb9612ffd565b81816000019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505060a082901c816020019067ffffffffffffffff16908167ffffffffffffffff168152505060007c01000000000000000000000000000000000000000000000000000000008316141581604001901515908115158152505060e882901c816060019062ffffff16908162ffffff1681525050919050565b600060015490506000821415612da9576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612db660008483856124bf565b600160406001901b178202600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550612e2d83612e1e60008660006124c5565b612e2785612f50565b176124ed565b6005600083815260200190815260200160002081905550600080838301905073ffffffffffffffffffffffffffffffffffffffff85169150828260007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600183015b818114612ece57808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600181019050612e93565b506000821415612f0a576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806001819055505050612f206000848385612518565b505050565b6000818310612f3d57612f388284612f60565b612f48565b612f478383612f60565b5b905092915050565b60006001821460e11b9050919050565b600082600052816020526040600020905092915050565b828054612f8390614048565b90600052602060002090601f016020900481019282612fa55760008555612fec565b82601f10612fbe57803560ff1916838001178555612fec565b82800160010185558215612fec579182015b82811115612feb578235825591602001919060010190612fd0565b5b509050612ff9919061304c565b5090565b6040518060800160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff168152602001600015158152602001600062ffffff1681525090565b5b8082111561306557600081600090555060010161304d565b5090565b600061307c61307784613e4a565b613e25565b905082815260208101848484011115613098576130976141e3565b5b6130a3848285614006565b509392505050565b6000813590506130ba8161458d565b92915050565b60008083601f8401126130d6576130d56141d9565b5b8235905067ffffffffffffffff8111156130f3576130f26141d4565b5b60208301915083602082028301111561310f5761310e6141de565b5b9250929050565b600081359050613125816145a4565b92915050565b60008135905061313a816145bb565b92915050565b60008135905061314f816145d2565b92915050565b600081519050613164816145d2565b92915050565b600082601f83011261317f5761317e6141d9565b5b813561318f848260208601613069565b91505092915050565b60008083601f8401126131ae576131ad6141d9565b5b8235905067ffffffffffffffff8111156131cb576131ca6141d4565b5b6020830191508360018202830111156131e7576131e66141de565b5b9250929050565b6000813590506131fd816145e9565b92915050565b60008135905061321281614600565b92915050565b60006020828403121561322e5761322d6141ed565b5b600061323c848285016130ab565b91505092915050565b6000806040838503121561325c5761325b6141ed565b5b600061326a858286016130ab565b925050602061327b858286016130ab565b9150509250929050565b60008060006060848603121561329e5761329d6141ed565b5b60006132ac868287016130ab565b93505060206132bd868287016130ab565b92505060406132ce868287016131ee565b9150509250925092565b600080600080608085870312156132f2576132f16141ed565b5b6000613300878288016130ab565b9450506020613311878288016130ab565b9350506040613322878288016131ee565b925050606085013567ffffffffffffffff811115613343576133426141e8565b5b61334f8782880161316a565b91505092959194509250565b600080600060408486031215613374576133736141ed565b5b6000613382868287016130ab565b935050602084013567ffffffffffffffff8111156133a3576133a26141e8565b5b6133af868287016130c0565b92509250509250925092565b600080604083850312156133d2576133d16141ed565b5b60006133e0858286016130ab565b92505060206133f185828601613116565b9150509250929050565b60008060408385031215613412576134116141ed565b5b6000613420858286016130ab565b9250506020613431858286016131ee565b9150509250929050565b60008060208385031215613452576134516141ed565b5b600083013567ffffffffffffffff8111156134705761346f6141e8565b5b61347c858286016130c0565b92509250509250929050565b60006020828403121561349e5761349d6141ed565b5b60006134ac8482850161312b565b91505092915050565b6000602082840312156134cb576134ca6141ed565b5b60006134d984828501613140565b91505092915050565b6000602082840312156134f8576134f76141ed565b5b600061350684828501613155565b91505092915050565b60008060208385031215613526576135256141ed565b5b600083013567ffffffffffffffff811115613544576135436141e8565b5b61355085828601613198565b92509250509250929050565b600060208284031215613572576135716141ed565b5b6000613580848285016131ee565b91505092915050565b600080604083850312156135a05761359f6141ed565b5b60006135ae858286016131ee565b92505060206135bf858286016131ee565b9150509250929050565b6000602082840312156135df576135de6141ed565b5b60006135ed84828501613203565b91505092915050565b6000806040838503121561360d5761360c6141ed565b5b600061361b85828601613203565b925050602061362c85828601613203565b9150509250929050565b61363f81613f1f565b82525050565b61364e81613f1f565b82525050565b61366561366082613f1f565b6140f4565b82525050565b61367481613f31565b82525050565b61368381613f31565b82525050565b600061369482613e7b565b61369e8185613e91565b93506136ae818560208601614015565b6136b7816141f2565b840191505092915050565b6136cb81613fd0565b82525050565b60006136dc82613e86565b6136e68185613ead565b93506136f6818560208601614015565b6136ff816141f2565b840191505092915050565b600061371582613e86565b61371f8185613ebe565b935061372f818560208601614015565b80840191505092915050565b6000613748602683613ead565b915061375382614210565b604082019050919050565b600061376b602a83613ead565b91506137768261425f565b604082019050919050565b600061378e600f83613ead565b9150613799826142ae565b602082019050919050565b60006137b1601883613ead565b91506137bc826142d7565b602082019050919050565b60006137d4602583613ead565b91506137df82614300565b604082019050919050565b60006137f7601e83613ead565b91506138028261434f565b602082019050919050565b600061381a601e83613ead565b915061382582614378565b602082019050919050565b600061383d601283613ead565b9150613848826143a1565b602082019050919050565b6000613860601f83613ead565b915061386b826143ca565b602082019050919050565b6000613883600c83613ead565b915061388e826143f3565b602082019050919050565b60006138a6602083613ead565b91506138b18261441c565b602082019050919050565b60006138c9600f83613ead565b91506138d482614445565b602082019050919050565b60006138ec601d83613ead565b91506138f78261446e565b602082019050919050565b600061390f600083613ea2565b915061391a82614497565b600082019050919050565b6000613932601083613ead565b915061393d8261449a565b602082019050919050565b6000613955601683613ead565b9150613960826144c3565b602082019050919050565b6000613978601683613ead565b9150613983826144ec565b602082019050919050565b600061399b602783613ead565b91506139a682614515565b604082019050919050565b60006139be601f83613ead565b91506139c982614564565b602082019050919050565b6080820160008201516139ea6000850182613636565b5060208201516139fd6020850182613a56565b506040820151613a10604085018261366b565b506060820151613a236060850182613a29565b50505050565b613a3281613f93565b82525050565b613a4181613fa2565b82525050565b613a5081613fac565b82525050565b613a5f81613fbc565b82525050565b6000613a718284613654565b60148201915081905092915050565b6000613a8c828561370a565b9150613a98828461370a565b91508190509392505050565b6000613aaf82613902565b9150819050919050565b6000602082019050613ace6000830184613645565b92915050565b6000608082019050613ae96000830187613645565b613af66020830186613645565b613b036040830185613a38565b8181036060830152613b158184613689565b905095945050505050565b6000602082019050613b35600083018461367a565b92915050565b6000602082019050613b5060008301846136c2565b92915050565b60006020820190508181036000830152613b7081846136d1565b905092915050565b60006020820190508181036000830152613b918161373b565b9050919050565b60006020820190508181036000830152613bb18161375e565b9050919050565b60006020820190508181036000830152613bd181613781565b9050919050565b60006020820190508181036000830152613bf1816137a4565b9050919050565b60006020820190508181036000830152613c11816137c7565b9050919050565b60006020820190508181036000830152613c31816137ea565b9050919050565b60006020820190508181036000830152613c518161380d565b9050919050565b60006020820190508181036000830152613c7181613830565b9050919050565b60006020820190508181036000830152613c9181613853565b9050919050565b60006020820190508181036000830152613cb181613876565b9050919050565b60006020820190508181036000830152613cd181613899565b9050919050565b60006020820190508181036000830152613cf1816138bc565b9050919050565b60006020820190508181036000830152613d11816138df565b9050919050565b60006020820190508181036000830152613d3181613925565b9050919050565b60006020820190508181036000830152613d5181613948565b9050919050565b60006020820190508181036000830152613d718161396b565b9050919050565b60006020820190508181036000830152613d918161398e565b9050919050565b60006020820190508181036000830152613db1816139b1565b9050919050565b6000608082019050613dcd60008301846139d4565b92915050565b6000602082019050613de86000830184613a38565b92915050565b6000606082019050613e036000830186613a47565b613e106020830185613a47565b613e1d6040830184613a47565b949350505050565b6000613e2f613e40565b9050613e3b828261407a565b919050565b6000604051905090565b600067ffffffffffffffff821115613e6557613e646141a5565b5b613e6e826141f2565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000613ed482613fa2565b9150613edf83613fa2565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613f1457613f13614118565b5b828201905092915050565b6000613f2a82613f73565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600062ffffff82169050919050565b6000819050919050565b600063ffffffff82169050919050565b600067ffffffffffffffff82169050919050565b6000613fdb82613fe2565b9050919050565b6000613fed82613ff4565b9050919050565b6000613fff82613f73565b9050919050565b82818337600083830152505050565b60005b83811015614033578082015181840152602081019050614018565b83811115614042576000848401525b50505050565b6000600282049050600182168061406057607f821691505b6020821081141561407457614073614147565b5b50919050565b614083826141f2565b810181811067ffffffffffffffff821117156140a2576140a16141a5565b5b80604052505050565b60006140b682613fa2565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156140e9576140e8614118565b5b600182019050919050565b60006140ff82614106565b9050919050565b600061411182614203565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4d696e74696e672066726f6d20736d61727420636f6e7472616374732069732060008201527f646973616c6c6f77656400000000000000000000000000000000000000000000602082015250565b7f416c7265616479206d696e7465642e0000000000000000000000000000000000600082015250565b7f73616c6520686173206e6f742073746172746564207965740000000000000000600082015250565b7f63616c6c6564207769746820696e636f7272656374207075626c69632073616c60008201527f65206b6579000000000000000000000000000000000000000000000000000000602082015250565b7f5468652063616c6c657220697320616e6f7468657220636f6e74726163740000600082015250565b7f6d757374206d696e742066726f6d20736d61727420636f6e7472616374730000600082015250565b7f72656163686564206d617820737570706c790000000000000000000000000000600082015250565b7f6e6f7420656c696769626c6520666f7220616c6c6f776c697374206d696e7400600082015250565b7f73656e646572206572726f720000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f496e636f72726563742070726f6f660000000000000000000000000000000000600082015250565b7f7075626c69632073616c6520686173206e6f7420626567756e20796574000000600082015250565b50565b7f5472616e73666572206661696c65642e00000000000000000000000000000000600082015250565b7f6275726e20686173206e6f7420626567756e2079657400000000000000000000600082015250565b7f63616e206e6f74206d696e742074686973206d616e7900000000000000000000600082015250565b7f746f6f206d616e7920616c7265616479206d696e746564206265666f7265206460008201527f6576206d696e7400000000000000000000000000000000000000000000000000602082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b61459681613f1f565b81146145a157600080fd5b50565b6145ad81613f31565b81146145b857600080fd5b50565b6145c481613f3d565b81146145cf57600080fd5b50565b6145db81613f47565b81146145e657600080fd5b50565b6145f281613fa2565b81146145fd57600080fd5b50565b61460981613fac565b811461461457600080fd5b5056fea2646970667358221220bab22c9909d4d71dbf396a6090941d43030e7e9477e3b334be0909a85304274164736f6c63430008070033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000d05000000000000000000000000000000000000000000000000000000000000012c0000000000000000000000000000000000000000000000000000000000000d05
-----Decoded View---------------
Arg [0] : maxAllowlistSize_ (uint256): 1
Arg [1] : collectionSize_ (uint256): 3333
Arg [2] : amountForDevs_ (uint256): 300
Arg [3] : amountForAllowlist_ (uint256): 3333
-----Encoded View---------------
4 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000001
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000d05
Arg [2] : 000000000000000000000000000000000000000000000000000000000000012c
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000d05
Deployed Bytecode Sourcemap
68917:6009:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20894:639;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21796:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28279:218;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27720:400;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;69469:44;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;17547:323;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31986:2817;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;72837:130;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;71943:204;;;;;;;;;;;;;:::i;:::-;;71718:219;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34899:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;74041:262;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;69161:39;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;70298:602;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;73663:100;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;73222:267;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;72973:124;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;23189:152;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;18731:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;67966:103;;;;;;;;;;;;;:::i;:::-;;73103:113;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;74416:107;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;72486:239;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;67318:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;72731:100;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;69680:28;;;;;;;;;;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;74775:148;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21972:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;72153:109;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;74309:101;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;28837:308;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;73769:181;;;;;;;;;;;;;:::i;:::-;;70906:806;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35682:399;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;69327:20;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22182:318;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;68972:51;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;69098:43;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;72268:212;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;74662:107;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29302:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;68224:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;69035:38;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20894:639;20979:4;21318:10;21303:25;;:11;:25;;;;:102;;;;21395:10;21380:25;;:11;:25;;;;21303:102;:179;;;;21472:10;21457:25;;:11;:25;;;;21303:179;21283:199;;20894:639;;;:::o;21796:100::-;21850:13;21883:5;21876:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21796:100;:::o;28279:218::-;28355:7;28380:16;28388:7;28380;:16::i;:::-;28375:64;;28405:34;;;;;;;;;;;;;;28375:64;28459:15;:24;28475:7;28459:24;;;;;;;;;;;:30;;;;;;;;;;;;28452:37;;28279:218;;;:::o;27720:400::-;27801:13;27817:16;27825:7;27817;:16::i;:::-;27801:32;;27873:5;27850:28;;:19;:17;:19::i;:::-;:28;;;27846:175;;27898:44;27915:5;27922:19;:17;:19::i;:::-;27898:16;:44::i;:::-;27893:128;;27970:35;;;;;;;;;;;;;;27893:128;27846:175;28066:2;28033:15;:24;28049:7;28033:24;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;28104:7;28100:2;28084:28;;28093:5;28084:28;;;;;;;;;;;;27790:330;27720:400;;:::o;69469:44::-;;;;;;;;;;;;;;;;;;;;;;:::o;17547:323::-;17608:7;17836:15;:13;:15::i;:::-;17821:12;;17805:13;;:28;:46;17798:53;;17547:323;:::o;31986:2817::-;32120:27;32150;32169:7;32150:18;:27::i;:::-;32120:57;;32235:4;32194:45;;32210:19;32194:45;;;32190:86;;32248:28;;;;;;;;;;;;;;32190:86;32290:27;32319:23;32346:35;32373:7;32346:26;:35::i;:::-;32289:92;;;;32481:68;32506:15;32523:4;32529:19;:17;:19::i;:::-;32481:24;:68::i;:::-;32476:180;;32569:43;32586:4;32592:19;:17;:19::i;:::-;32569:16;:43::i;:::-;32564:92;;32621:35;;;;;;;;;;;;;;32564:92;32476:180;32687:1;32673:16;;:2;:16;;;32669:52;;;32698:23;;;;;;;;;;;;;;32669:52;32734:43;32756:4;32762:2;32766:7;32775:1;32734:21;:43::i;:::-;32870:15;32867:160;;;33010:1;32989:19;32982:30;32867:160;33407:18;:24;33426:4;33407:24;;;;;;;;;;;;;;;;33405:26;;;;;;;;;;;;33476:18;:22;33495:2;33476:22;;;;;;;;;;;;;;;;33474:24;;;;;;;;;;;33798:146;33835:2;33884:45;33899:4;33905:2;33909:19;33884:14;:45::i;:::-;13946:8;33856:73;33798:18;:146::i;:::-;33769:17;:26;33787:7;33769:26;;;;;;;;;;;:175;;;;34115:1;13946:8;34064:19;:47;:52;34060:627;;;34137:19;34169:1;34159:7;:11;34137:33;;34326:1;34292:17;:30;34310:11;34292:30;;;;;;;;;;;;:35;34288:384;;;34430:13;;34415:11;:28;34411:242;;34610:19;34577:17;:30;34595:11;34577:30;;;;;;;;;;;:52;;;;34411:242;34288:384;34118:569;34060:627;34734:7;34730:2;34715:27;;34724:4;34715:27;;;;;;;;;;;;34753:42;34774:4;34780:2;34784:7;34793:1;34753:20;:42::i;:::-;32109:2694;;;31986:2817;;;:::o;72837:130::-;67204:13;:11;:13::i;:::-;72952:9:::1;72916:10;:33;;;:45;;;;;;;;;;;;;;;;;;72837:130:::0;:::o;71943:204::-;72002:9;71988:23;;:10;:23;;;;71980:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;72075:19;;;;;;;;;;;72061:33;;:10;:33;;;72053:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;72118:23;72128:9;72139:1;72118:9;:23::i;:::-;71943:204::o;71718:219::-;67204:13;:11;:13::i;:::-;71823::::1;71811:8;71795:13;:11;:13::i;:::-;:24;;;;:::i;:::-;:41;;71779:114;;;;;;;;;;;;:::i;:::-;;;;;;;;;71900:31;71910:10;71922:8;71900:9;:31::i;:::-;71718:219:::0;:::o;34899:185::-;35037:39;35054:4;35060:2;35064:7;35037:39;;;;;;;;;;;;:16;:39::i;:::-;34899:185;;;:::o;74041:262::-;74094:22;74127:13;;;;;;;;;;;74119:22;;74094:47;;74174:1;74156:14;:19;;:56;;;;;74198:14;74179:15;:33;;74156:56;74148:91;;;;;;;;;;;;:::i;:::-;;;;;;;;;74246:20;74252:7;74261:4;74246:5;:20::i;:::-;74273:6;;;;;;;;;;;:15;;;74289:7;74273:24;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;74087:216;74041:262;:::o;69161:39::-;;;:::o;70298:602::-;70233:10;70220:23;;:9;:23;;;70212:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;70391:22:::1;70424:10;:33;;;;;;;;;;;;70416:42;;70391:67;;70499:1;70481:14;:19;;:56;;;;;70523:14;70504:15;:33;;70481:56;70465:114;;;;;;;;;;;;:::i;:::-;;;;;;;;;70636:26;70631:1;70604:24;70617:10;70604:12;:24::i;:::-;:28;;;;:::i;:::-;:58;;70588:114;;;;;;;;;;;;:::i;:::-;;;;;;;;;70738:14;70733:1;70717:13;:11;:13::i;:::-;:17;;;;:::i;:::-;:35;;70709:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;70790:37;70802:10;70814:12;;70790:11;:37::i;:::-;70782:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;70870:24;70880:10;70892:1;70870:9;:24::i;:::-;70384:516;70298:602:::0;;:::o;73663:100::-;67204:13;:11;:13::i;:::-;73750:7:::1;;73734:13;:23;;;;;;;:::i;:::-;;73663:100:::0;;:::o;73222:267::-;73315:4;73327:12;73369:8;73352:26;;;;;;;;:::i;:::-;;;;;;;;;;;;;73342:37;;;;;;73327:52;;73394:50;73413:12;;73394:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;73427:10;;73439:4;73394:18;:50::i;:::-;73386:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;73478:4;73471:11;;;73222:267;;;;;:::o;72973:124::-;67204:13;:11;:13::i;:::-;73082:9:::1;73049:10;:30;;;:42;;;;;;;;;;;;;;;;;;72973:124:::0;:::o;23189:152::-;23261:7;23304:27;23323:7;23304:18;:27::i;:::-;23281:52;;23189:152;;;:::o;18731:233::-;18803:7;18844:1;18827:19;;:5;:19;;;18823:60;;;18855:28;;;;;;;;;;;;;;18823:60;12890:13;18901:18;:25;18920:5;18901:25;;;;;;;;;;;;;;;;:55;18894:62;;18731:233;;;:::o;67966:103::-;67204:13;:11;:13::i;:::-;68031:30:::1;68058:1;68031:18;:30::i;:::-;67966:103::o:0;73103:113::-;67204:13;:11;:13::i;:::-;73199:11:::1;73186:10;:24;;;;73103:113:::0;:::o;74416:107::-;67204:13;:11;:13::i;:::-;74508:8:::1;74492:6;;:25;;;;;;;;;;;;;;;;;;74416:107:::0;:::o;72486:239::-;67204:13;:11;:13::i;:::-;72615:104:::1;;;;;;;;72634:17;72615:104;;;;;;72660:19;72615:104;;;;;;72688:10;:24;;;;;;;;;;;;72615:104;;;;::::0;72602:10:::1;:117;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;72486:239:::0;;:::o;67318:87::-;67364:7;67391:6;;;;;;;;;;;67384:13;;67318:87;:::o;72731:100::-;67204:13;:11;:13::i;:::-;72822:3:::1;72795:10;:24;;;:30;;;;;;;;;;;;;;;;;;72731:100:::0;:::o;69680:28::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;74775:148::-;74856:21;;:::i;:::-;74896;74909:7;74896:12;:21::i;:::-;74889:28;;74775:148;;;:::o;21972:104::-;22028:13;22061:7;22054:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21972:104;:::o;72153:109::-;67204:13;:11;:13::i;:::-;72248:8:::1;72226:19;;:30;;;;;;;;;;;;;;;;;;72153:109:::0;:::o;74309:101::-;67204:13;:11;:13::i;:::-;74395:9:::1;74379:13;;:25;;;;;;;;;;;;;;;;;;74309:101:::0;:::o;28837:308::-;28948:19;:17;:19::i;:::-;28936:31;;:8;:31;;;28932:61;;;28976:17;;;;;;;;;;;;;;28932:61;29058:8;29006:18;:39;29025:19;:17;:19::i;:::-;29006:39;;;;;;;;;;;;;;;:49;29046:8;29006:49;;;;;;;;;;;;;;;;:60;;;;;;;;;;;;;;;;;;29118:8;29082:55;;29097:19;:17;:19::i;:::-;29082:55;;;29128:8;29082:55;;;;;;:::i;:::-;;;;;;;;28837:308;;:::o;73769:181::-;67204:13;:11;:13::i;:::-;64243:1:::1;64841:7;;:19;;64833:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;64243:1;64974:7;:18;;;;73834:12:::2;73852:10;:15;;73875:21;73852:49;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;73833:68;;;73916:7;73908:36;;;;;;;;;;;;:::i;:::-;;;;;;;;;73826:124;64199:1:::1;65153:7;:22;;;;73769:181::o:0;70906:806::-;70233:10;70220:23;;:9;:23;;;70212:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;71036:9:::1;71022:23;;:10;:23;;;71014:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;71099:24;71126:10;71099:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;71143:21;71175:6;:20;;;71167:29;;71143:53;;71203:27;71241:6;:26;;;71233:35;;71203:65;;71308:19;71291:13;:36;71275:107;;;;;;;;;;;;:::i;:::-;;;;;;;;;71407:50;71422:13;71437:19;71407:14;:50::i;:::-;71391:113;;;;;;;;;;;;:::i;:::-;;;;;;;;;71540:14;71535:1;71519:13;:11;:13::i;:::-;:17;;;;:::i;:::-;:35;;71511:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;71593:12;:24;71606:10;71593:24;;;;;;;;;;;;;;;;;;;;;;;;;71592:25;71584:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;71644:24;71654:10;71666:1;71644:9;:24::i;:::-;71702:4;71675:12;:24;71688:10;71675:24;;;;;;;;;;;;;;;;:31;;;;;;;;;;;;;;;;;;71007:705;;;70906:806:::0;:::o;35682:399::-;35849:31;35862:4;35868:2;35872:7;35849:12;:31::i;:::-;35913:1;35895:2;:14;;;:19;35891:183;;35934:56;35965:4;35971:2;35975:7;35984:5;35934:30;:56::i;:::-;35929:145;;36018:40;;;;;;;;;;;;;;35929:145;35891:183;35682:399;;;;:::o;69327:20::-;;;;;;;;;;;;;:::o;22182:318::-;22255:13;22286:16;22294:7;22286;:16::i;:::-;22281:59;;22311:29;;;;;;;;;;;;;;22281:59;22353:21;22377:10;:8;:10::i;:::-;22353:34;;22430:1;22411:7;22405:21;:26;;:87;;;;;;;;;;;;;;;;;22458:7;22467:18;22477:7;22467:9;:18::i;:::-;22441:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;22405:87;22398:94;;;22182:318;;;:::o;68972:51::-;;;:::o;69098:43::-;;;:::o;72268:212::-;72380:4;72424:1;72407:13;:18;;:67;;;;;72455:19;72436:15;:38;;72407:67;72393:81;;72268:212;;;;:::o;74662:107::-;74720:7;74743:20;74757:5;74743:13;:20::i;:::-;74736:27;;74662:107;;;:::o;29302:164::-;29399:4;29423:18;:25;29442:5;29423:25;;;;;;;;;;;;;;;:35;29449:8;29423:35;;;;;;;;;;;;;;;;;;;;;;;;;29416:42;;29302:164;;;;:::o;68224:201::-;67204:13;:11;:13::i;:::-;68333:1:::1;68313:22;;:8;:22;;;;68305:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;68389:28;68408:8;68389:18;:28::i;:::-;68224:201:::0;:::o;69035:38::-;;;:::o;29724:282::-;29789:4;29845:7;29826:15;:13;:15::i;:::-;:26;;:66;;;;;29879:13;;29869:7;:23;29826:66;:153;;;;;29978:1;13666:8;29930:17;:26;29948:7;29930:26;;;;;;;;;;;;:44;:49;29826:153;29806:173;;29724:282;;;:::o;51490:105::-;51550:7;51577:10;51570:17;;51490:105;:::o;17063:92::-;17119:7;17063:92;:::o;24344:1275::-;24411:7;24431:12;24446:7;24431:22;;24514:4;24495:15;:13;:15::i;:::-;:23;24491:1061;;24548:13;;24541:4;:20;24537:1015;;;24586:14;24603:17;:23;24621:4;24603:23;;;;;;;;;;;;24586:40;;24720:1;13666:8;24692:6;:24;:29;24688:845;;;25357:113;25374:1;25364:6;:11;25357:113;;;25417:17;:25;25435:6;;;;;;;25417:25;;;;;;;;;;;;25408:34;;25357:113;;;25503:6;25496:13;;;;;;24688:845;24563:989;24537:1015;24491:1061;25580:31;;;;;;;;;;;;;;24344:1275;;;;:::o;30887:479::-;30989:27;31018:23;31059:38;31100:15;:24;31116:7;31100:24;;;;;;;;;;;31059:65;;31271:18;31248:41;;31328:19;31322:26;31303:45;;31233:126;30887:479;;;:::o;30115:659::-;30264:11;30429:16;30422:5;30418:28;30409:37;;30589:16;30578:9;30574:32;30561:45;;30739:15;30728:9;30725:30;30717:5;30706:9;30703:20;30700:56;30690:66;;30115:659;;;;;:::o;36743:159::-;;;;;:::o;50799:311::-;50934:7;50954:16;14070:3;50980:19;:41;;50954:68;;14070:3;51048:31;51059:4;51065:2;51069:9;51048:10;:31::i;:::-;51040:40;;:62;;51033:69;;;50799:311;;;;;:::o;26167:450::-;26247:14;26415:16;26408:5;26404:28;26395:37;;26592:5;26578:11;26553:23;26549:41;26546:52;26539:5;26536:63;26526:73;;26167:450;;;;:::o;37567:158::-;;;;;:::o;67483:132::-;67558:12;:10;:12::i;:::-;67547:23;;:7;:5;:7::i;:::-;:23;;;67539:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;67483:132::o;45322:112::-;45399:27;45409:2;45413:8;45399:27;;;;;;;;;;;;:9;:27::i;:::-;45322:112;;:::o;46019:3081::-;46099:27;46129;46148:7;46129:18;:27::i;:::-;46099:57;;46169:12;46200:19;46169:52;;46235:27;46264:23;46291:35;46318:7;46291:26;:35::i;:::-;46234:92;;;;46343:13;46339:316;;;46464:68;46489:15;46506:4;46512:19;:17;:19::i;:::-;46464:24;:68::i;:::-;46459:184;;46556:43;46573:4;46579:19;:17;:19::i;:::-;46556:16;:43::i;:::-;46551:92;;46608:35;;;;;;;;;;;;;;46551:92;46459:184;46339:316;46667:51;46689:4;46703:1;46707:7;46716:1;46667:21;:51::i;:::-;46811:15;46808:160;;;46951:1;46930:19;46923:30;46808:160;47629:1;13155:3;47599:1;:26;;47598:32;47570:18;:24;47589:4;47570:24;;;;;;;;;;;;;;;;:60;;;;;;;;;;;47897:176;47934:4;48005:53;48020:4;48034:1;48038:19;48005:14;:53::i;:::-;13946:8;13666;47958:43;47957:101;47897:18;:176::i;:::-;47868:17;:26;47886:7;47868:26;;;;;;;;;;;:205;;;;48244:1;13946:8;48193:19;:47;:52;48189:627;;;48266:19;48298:1;48288:7;:11;48266:33;;48455:1;48421:17;:30;48439:11;48421:30;;;;;;;;;;;;:35;48417:384;;;48559:13;;48544:11;:28;48540:242;;48739:19;48706:17;:30;48724:11;48706:30;;;;;;;;;;;:52;;;;48540:242;48417:384;48247:569;48189:627;48871:7;48867:1;48844:35;;48853:4;48844:35;;;;;;;;;;;;48890:50;48911:4;48925:1;48929:7;48938:1;48890:20;:50::i;:::-;49067:12;;:14;;;;;;;;;;;;;46088:3012;;;;46019:3081;;:::o;54925:190::-;55050:4;55103;55074:25;55087:5;55094:4;55074:12;:25::i;:::-;:33;55067:40;;54925:190;;;;;:::o;68585:191::-;68659:16;68678:6;;;;;;;;;;;68659:25;;68704:8;68695:6;;:17;;;;;;;;;;;;;;;;;;68759:8;68728:40;;68749:8;68728:40;;;;;;;;;;;;68648:128;68585:191;:::o;23530:166::-;23600:21;;:::i;:::-;23641:47;23660:27;23679:7;23660:18;:27::i;:::-;23641:18;:47::i;:::-;23634:54;;23530:166;;;:::o;38165:716::-;38328:4;38374:2;38349:45;;;38395:19;:17;:19::i;:::-;38416:4;38422:7;38431:5;38349:88;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;38345:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38649:1;38632:6;:13;:18;38628:235;;;38678:40;;;;;;;;;;;;;;38628:235;38821:6;38815:13;38806:6;38802:2;38798:15;38791:38;38345:529;38518:54;;;38508:64;;;:6;:64;;;;38501:71;;;38165:716;;;;;;:::o;73549:108::-;73609:13;73638;73631:20;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;73549:108;:::o;51697:2002::-;51762:17;52181:3;52174:4;52168:11;52164:21;52157:28;;52272:3;52266:4;52259:17;52378:3;52834:5;52964:1;52959:3;52955:11;52948:18;;53135:2;53129:4;53125:13;53121:2;53117:22;53112:3;53104:36;53176:2;53170:4;53166:13;53158:21;;52726:731;53195:4;52726:731;;;53386:1;53381:3;53377:11;53370:18;;53437:2;53431:4;53427:13;53423:2;53419:22;53414:3;53406:36;53290:2;53284:4;53280:13;53272:21;;52726:731;;;52730:464;53496:3;53491;53487:13;53611:2;53606:3;53602:12;53595:19;;53674:6;53669:3;53662:19;51801:1891;;51697:2002;;;:::o;19046:178::-;19107:7;12890:13;13028:2;19135:18;:25;19154:5;19135:25;;;;;;;;;;;;;;;;:50;;19134:82;19127:89;;19046:178;;;:::o;50500:147::-;50637:6;50500:147;;;;;:::o;65869:98::-;65922:7;65949:10;65942:17;;65869:98;:::o;44549:689::-;44680:19;44686:2;44690:8;44680:5;:19::i;:::-;44759:1;44741:2;:14;;;:19;44737:483;;44781:11;44795:13;;44781:27;;44827:13;44849:8;44843:3;:14;44827:30;;44876:233;44907:62;44946:1;44950:2;44954:7;;;;;;44963:5;44907:30;:62::i;:::-;44902:167;;45005:40;;;;;;;;;;;;;;44902:167;45104:3;45096:5;:11;44876:233;;45191:3;45174:13;;:20;45170:34;;45196:8;;;45170:34;44762:458;;44737:483;44549:689;;;:::o;55792:296::-;55875:7;55895:20;55918:4;55895:27;;55938:9;55933:118;55957:5;:12;55953:1;:16;55933:118;;;56006:33;56016:12;56030:5;56036:1;56030:8;;;;;;;;:::i;:::-;;;;;;;;56006:9;:33::i;:::-;55991:48;;55971:3;;;;;:::i;:::-;;;;55933:118;;;;56068:12;56061:19;;;55792:296;;;;:::o;25718:366::-;25784:31;;:::i;:::-;25861:6;25828:9;:14;;:41;;;;;;;;;;;13549:3;25914:6;:33;;25880:9;:24;;:68;;;;;;;;;;;26006:1;13666:8;25978:6;:24;:29;;25959:9;:16;;:48;;;;;;;;;;;14070:3;26047:6;:28;;26018:9;:19;;:58;;;;;;;;;;;25718:366;;;:::o;39343:2454::-;39416:20;39439:13;;39416:36;;39479:1;39467:8;:13;39463:44;;;39489:18;;;;;;;;;;;;;;39463:44;39520:61;39550:1;39554:2;39558:12;39572:8;39520:21;:61::i;:::-;40064:1;13028:2;40034:1;:26;;40033:32;40021:8;:45;39995:18;:22;40014:2;39995:22;;;;;;;;;;;;;;;;:71;;;;;;;;;;;40343:139;40380:2;40434:33;40457:1;40461:2;40465:1;40434:14;:33::i;:::-;40401:30;40422:8;40401:20;:30::i;:::-;:66;40343:18;:139::i;:::-;40309:17;:31;40327:12;40309:31;;;;;;;;;;;:173;;;;40499:16;40530:11;40559:8;40544:12;:23;40530:37;;40814:16;40810:2;40806:25;40794:37;;41186:12;41146:8;41105:1;41043:25;40984:1;40923;40896:335;41311:1;41297:12;41293:20;41251:346;41352:3;41343:7;41340:16;41251:346;;41570:7;41560:8;41557:1;41530:25;41527:1;41524;41519:59;41405:1;41396:7;41392:15;41381:26;;41251:346;;;41255:77;41642:1;41630:8;:13;41626:45;;;41652:19;;;;;;;;;;;;;;41626:45;41704:3;41688:13;:19;;;;39769:1950;;41729:60;41758:1;41762:2;41766:12;41780:8;41729:20;:60::i;:::-;39405:2392;39343:2454;;:::o;61999:149::-;62062:7;62093:1;62089;:5;:51;;62120:20;62135:1;62138;62120:14;:20::i;:::-;62089:51;;;62097:20;62112:1;62115;62097:14;:20::i;:::-;62089:51;62082:58;;61999:149;;;;:::o;26719:324::-;26789:14;27022:1;27012:8;27009:15;26983:24;26979:46;26969:56;;26719:324;;;:::o;62156:268::-;62224:13;62331:1;62325:4;62318:15;62360:1;62354:4;62347:15;62401:4;62395;62385:21;62376:30;;62156:268;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:410:1:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:112;;;280:79;;:::i;:::-;249:112;370:41;404:6;399:3;394;370:41;:::i;:::-;90:327;7:410;;;;;:::o;423:139::-;469:5;507:6;494:20;485:29;;523:33;550:5;523:33;:::i;:::-;423:139;;;;:::o;585:568::-;658:8;668:6;718:3;711:4;703:6;699:17;695:27;685:122;;726:79;;:::i;:::-;685:122;839:6;826:20;816:30;;869:18;861:6;858:30;855:117;;;891:79;;:::i;:::-;855:117;1005:4;997:6;993:17;981:29;;1059:3;1051:4;1043:6;1039:17;1029:8;1025:32;1022:41;1019:128;;;1066:79;;:::i;:::-;1019:128;585:568;;;;;:::o;1159:133::-;1202:5;1240:6;1227:20;1218:29;;1256:30;1280:5;1256:30;:::i;:::-;1159:133;;;;:::o;1298:139::-;1344:5;1382:6;1369:20;1360:29;;1398:33;1425:5;1398:33;:::i;:::-;1298:139;;;;:::o;1443:137::-;1488:5;1526:6;1513:20;1504:29;;1542:32;1568:5;1542:32;:::i;:::-;1443:137;;;;:::o;1586:141::-;1642:5;1673:6;1667:13;1658:22;;1689:32;1715:5;1689:32;:::i;:::-;1586:141;;;;:::o;1746:338::-;1801:5;1850:3;1843:4;1835:6;1831:17;1827:27;1817:122;;1858:79;;:::i;:::-;1817:122;1975:6;1962:20;2000:78;2074:3;2066:6;2059:4;2051:6;2047:17;2000:78;:::i;:::-;1991:87;;1807:277;1746:338;;;;:::o;2104:553::-;2162:8;2172:6;2222:3;2215:4;2207:6;2203:17;2199:27;2189:122;;2230:79;;:::i;:::-;2189:122;2343:6;2330:20;2320:30;;2373:18;2365:6;2362:30;2359:117;;;2395:79;;:::i;:::-;2359:117;2509:4;2501:6;2497:17;2485:29;;2563:3;2555:4;2547:6;2543:17;2533:8;2529:32;2526:41;2523:128;;;2570:79;;:::i;:::-;2523:128;2104:553;;;;;:::o;2663:139::-;2709:5;2747:6;2734:20;2725:29;;2763:33;2790:5;2763:33;:::i;:::-;2663:139;;;;:::o;2808:137::-;2853:5;2891:6;2878:20;2869:29;;2907:32;2933:5;2907:32;:::i;:::-;2808:137;;;;:::o;2951:329::-;3010:6;3059:2;3047:9;3038:7;3034:23;3030:32;3027:119;;;3065:79;;:::i;:::-;3027:119;3185:1;3210:53;3255:7;3246:6;3235:9;3231:22;3210:53;:::i;:::-;3200:63;;3156:117;2951:329;;;;:::o;3286:474::-;3354:6;3362;3411:2;3399:9;3390:7;3386:23;3382:32;3379:119;;;3417:79;;:::i;:::-;3379:119;3537:1;3562:53;3607:7;3598:6;3587:9;3583:22;3562:53;:::i;:::-;3552:63;;3508:117;3664:2;3690:53;3735:7;3726:6;3715:9;3711:22;3690:53;:::i;:::-;3680:63;;3635:118;3286:474;;;;;:::o;3766:619::-;3843:6;3851;3859;3908:2;3896:9;3887:7;3883:23;3879:32;3876:119;;;3914:79;;:::i;:::-;3876:119;4034:1;4059:53;4104:7;4095:6;4084:9;4080:22;4059:53;:::i;:::-;4049:63;;4005:117;4161:2;4187:53;4232:7;4223:6;4212:9;4208:22;4187:53;:::i;:::-;4177:63;;4132:118;4289:2;4315:53;4360:7;4351:6;4340:9;4336:22;4315:53;:::i;:::-;4305:63;;4260:118;3766:619;;;;;:::o;4391:943::-;4486:6;4494;4502;4510;4559:3;4547:9;4538:7;4534:23;4530:33;4527:120;;;4566:79;;:::i;:::-;4527:120;4686:1;4711:53;4756:7;4747:6;4736:9;4732:22;4711:53;:::i;:::-;4701:63;;4657:117;4813:2;4839:53;4884:7;4875:6;4864:9;4860:22;4839:53;:::i;:::-;4829:63;;4784:118;4941:2;4967:53;5012:7;5003:6;4992:9;4988:22;4967:53;:::i;:::-;4957:63;;4912:118;5097:2;5086:9;5082:18;5069:32;5128:18;5120:6;5117:30;5114:117;;;5150:79;;:::i;:::-;5114:117;5255:62;5309:7;5300:6;5289:9;5285:22;5255:62;:::i;:::-;5245:72;;5040:287;4391:943;;;;;;;:::o;5340:704::-;5435:6;5443;5451;5500:2;5488:9;5479:7;5475:23;5471:32;5468:119;;;5506:79;;:::i;:::-;5468:119;5626:1;5651:53;5696:7;5687:6;5676:9;5672:22;5651:53;:::i;:::-;5641:63;;5597:117;5781:2;5770:9;5766:18;5753:32;5812:18;5804:6;5801:30;5798:117;;;5834:79;;:::i;:::-;5798:117;5947:80;6019:7;6010:6;5999:9;5995:22;5947:80;:::i;:::-;5929:98;;;;5724:313;5340:704;;;;;:::o;6050:468::-;6115:6;6123;6172:2;6160:9;6151:7;6147:23;6143:32;6140:119;;;6178:79;;:::i;:::-;6140:119;6298:1;6323:53;6368:7;6359:6;6348:9;6344:22;6323:53;:::i;:::-;6313:63;;6269:117;6425:2;6451:50;6493:7;6484:6;6473:9;6469:22;6451:50;:::i;:::-;6441:60;;6396:115;6050:468;;;;;:::o;6524:474::-;6592:6;6600;6649:2;6637:9;6628:7;6624:23;6620:32;6617:119;;;6655:79;;:::i;:::-;6617:119;6775:1;6800:53;6845:7;6836:6;6825:9;6821:22;6800:53;:::i;:::-;6790:63;;6746:117;6902:2;6928:53;6973:7;6964:6;6953:9;6949:22;6928:53;:::i;:::-;6918:63;;6873:118;6524:474;;;;;:::o;7004:559::-;7090:6;7098;7147:2;7135:9;7126:7;7122:23;7118:32;7115:119;;;7153:79;;:::i;:::-;7115:119;7301:1;7290:9;7286:17;7273:31;7331:18;7323:6;7320:30;7317:117;;;7353:79;;:::i;:::-;7317:117;7466:80;7538:7;7529:6;7518:9;7514:22;7466:80;:::i;:::-;7448:98;;;;7244:312;7004:559;;;;;:::o;7569:329::-;7628:6;7677:2;7665:9;7656:7;7652:23;7648:32;7645:119;;;7683:79;;:::i;:::-;7645:119;7803:1;7828:53;7873:7;7864:6;7853:9;7849:22;7828:53;:::i;:::-;7818:63;;7774:117;7569:329;;;;:::o;7904:327::-;7962:6;8011:2;7999:9;7990:7;7986:23;7982:32;7979:119;;;8017:79;;:::i;:::-;7979:119;8137:1;8162:52;8206:7;8197:6;8186:9;8182:22;8162:52;:::i;:::-;8152:62;;8108:116;7904:327;;;;:::o;8237:349::-;8306:6;8355:2;8343:9;8334:7;8330:23;8326:32;8323:119;;;8361:79;;:::i;:::-;8323:119;8481:1;8506:63;8561:7;8552:6;8541:9;8537:22;8506:63;:::i;:::-;8496:73;;8452:127;8237:349;;;;:::o;8592:529::-;8663:6;8671;8720:2;8708:9;8699:7;8695:23;8691:32;8688:119;;;8726:79;;:::i;:::-;8688:119;8874:1;8863:9;8859:17;8846:31;8904:18;8896:6;8893:30;8890:117;;;8926:79;;:::i;:::-;8890:117;9039:65;9096:7;9087:6;9076:9;9072:22;9039:65;:::i;:::-;9021:83;;;;8817:297;8592:529;;;;;:::o;9127:329::-;9186:6;9235:2;9223:9;9214:7;9210:23;9206:32;9203:119;;;9241:79;;:::i;:::-;9203:119;9361:1;9386:53;9431:7;9422:6;9411:9;9407:22;9386:53;:::i;:::-;9376:63;;9332:117;9127:329;;;;:::o;9462:474::-;9530:6;9538;9587:2;9575:9;9566:7;9562:23;9558:32;9555:119;;;9593:79;;:::i;:::-;9555:119;9713:1;9738:53;9783:7;9774:6;9763:9;9759:22;9738:53;:::i;:::-;9728:63;;9684:117;9840:2;9866:53;9911:7;9902:6;9891:9;9887:22;9866:53;:::i;:::-;9856:63;;9811:118;9462:474;;;;;:::o;9942:327::-;10000:6;10049:2;10037:9;10028:7;10024:23;10020:32;10017:119;;;10055:79;;:::i;:::-;10017:119;10175:1;10200:52;10244:7;10235:6;10224:9;10220:22;10200:52;:::i;:::-;10190:62;;10146:116;9942:327;;;;:::o;10275:470::-;10341:6;10349;10398:2;10386:9;10377:7;10373:23;10369:32;10366:119;;;10404:79;;:::i;:::-;10366:119;10524:1;10549:52;10593:7;10584:6;10573:9;10569:22;10549:52;:::i;:::-;10539:62;;10495:116;10650:2;10676:52;10720:7;10711:6;10700:9;10696:22;10676:52;:::i;:::-;10666:62;;10621:117;10275:470;;;;;:::o;10751:108::-;10828:24;10846:5;10828:24;:::i;:::-;10823:3;10816:37;10751:108;;:::o;10865:118::-;10952:24;10970:5;10952:24;:::i;:::-;10947:3;10940:37;10865:118;;:::o;10989:157::-;11094:45;11114:24;11132:5;11114:24;:::i;:::-;11094:45;:::i;:::-;11089:3;11082:58;10989:157;;:::o;11152:99::-;11223:21;11238:5;11223:21;:::i;:::-;11218:3;11211:34;11152:99;;:::o;11257:109::-;11338:21;11353:5;11338:21;:::i;:::-;11333:3;11326:34;11257:109;;:::o;11372:360::-;11458:3;11486:38;11518:5;11486:38;:::i;:::-;11540:70;11603:6;11598:3;11540:70;:::i;:::-;11533:77;;11619:52;11664:6;11659:3;11652:4;11645:5;11641:16;11619:52;:::i;:::-;11696:29;11718:6;11696:29;:::i;:::-;11691:3;11687:39;11680:46;;11462:270;11372:360;;;;:::o;11738:161::-;11840:52;11886:5;11840:52;:::i;:::-;11835:3;11828:65;11738:161;;:::o;11905:364::-;11993:3;12021:39;12054:5;12021:39;:::i;:::-;12076:71;12140:6;12135:3;12076:71;:::i;:::-;12069:78;;12156:52;12201:6;12196:3;12189:4;12182:5;12178:16;12156:52;:::i;:::-;12233:29;12255:6;12233:29;:::i;:::-;12228:3;12224:39;12217:46;;11997:272;11905:364;;;;:::o;12275:377::-;12381:3;12409:39;12442:5;12409:39;:::i;:::-;12464:89;12546:6;12541:3;12464:89;:::i;:::-;12457:96;;12562:52;12607:6;12602:3;12595:4;12588:5;12584:16;12562:52;:::i;:::-;12639:6;12634:3;12630:16;12623:23;;12385:267;12275:377;;;;:::o;12658:366::-;12800:3;12821:67;12885:2;12880:3;12821:67;:::i;:::-;12814:74;;12897:93;12986:3;12897:93;:::i;:::-;13015:2;13010:3;13006:12;12999:19;;12658:366;;;:::o;13030:::-;13172:3;13193:67;13257:2;13252:3;13193:67;:::i;:::-;13186:74;;13269:93;13358:3;13269:93;:::i;:::-;13387:2;13382:3;13378:12;13371:19;;13030:366;;;:::o;13402:::-;13544:3;13565:67;13629:2;13624:3;13565:67;:::i;:::-;13558:74;;13641:93;13730:3;13641:93;:::i;:::-;13759:2;13754:3;13750:12;13743:19;;13402:366;;;:::o;13774:::-;13916:3;13937:67;14001:2;13996:3;13937:67;:::i;:::-;13930:74;;14013:93;14102:3;14013:93;:::i;:::-;14131:2;14126:3;14122:12;14115:19;;13774:366;;;:::o;14146:::-;14288:3;14309:67;14373:2;14368:3;14309:67;:::i;:::-;14302:74;;14385:93;14474:3;14385:93;:::i;:::-;14503:2;14498:3;14494:12;14487:19;;14146:366;;;:::o;14518:::-;14660:3;14681:67;14745:2;14740:3;14681:67;:::i;:::-;14674:74;;14757:93;14846:3;14757:93;:::i;:::-;14875:2;14870:3;14866:12;14859:19;;14518:366;;;:::o;14890:::-;15032:3;15053:67;15117:2;15112:3;15053:67;:::i;:::-;15046:74;;15129:93;15218:3;15129:93;:::i;:::-;15247:2;15242:3;15238:12;15231:19;;14890:366;;;:::o;15262:::-;15404:3;15425:67;15489:2;15484:3;15425:67;:::i;:::-;15418:74;;15501:93;15590:3;15501:93;:::i;:::-;15619:2;15614:3;15610:12;15603:19;;15262:366;;;:::o;15634:::-;15776:3;15797:67;15861:2;15856:3;15797:67;:::i;:::-;15790:74;;15873:93;15962:3;15873:93;:::i;:::-;15991:2;15986:3;15982:12;15975:19;;15634:366;;;:::o;16006:::-;16148:3;16169:67;16233:2;16228:3;16169:67;:::i;:::-;16162:74;;16245:93;16334:3;16245:93;:::i;:::-;16363:2;16358:3;16354:12;16347:19;;16006:366;;;:::o;16378:::-;16520:3;16541:67;16605:2;16600:3;16541:67;:::i;:::-;16534:74;;16617:93;16706:3;16617:93;:::i;:::-;16735:2;16730:3;16726:12;16719:19;;16378:366;;;:::o;16750:::-;16892:3;16913:67;16977:2;16972:3;16913:67;:::i;:::-;16906:74;;16989:93;17078:3;16989:93;:::i;:::-;17107:2;17102:3;17098:12;17091:19;;16750:366;;;:::o;17122:::-;17264:3;17285:67;17349:2;17344:3;17285:67;:::i;:::-;17278:74;;17361:93;17450:3;17361:93;:::i;:::-;17479:2;17474:3;17470:12;17463:19;;17122:366;;;:::o;17494:398::-;17653:3;17674:83;17755:1;17750:3;17674:83;:::i;:::-;17667:90;;17766:93;17855:3;17766:93;:::i;:::-;17884:1;17879:3;17875:11;17868:18;;17494:398;;;:::o;17898:366::-;18040:3;18061:67;18125:2;18120:3;18061:67;:::i;:::-;18054:74;;18137:93;18226:3;18137:93;:::i;:::-;18255:2;18250:3;18246:12;18239:19;;17898:366;;;:::o;18270:::-;18412:3;18433:67;18497:2;18492:3;18433:67;:::i;:::-;18426:74;;18509:93;18598:3;18509:93;:::i;:::-;18627:2;18622:3;18618:12;18611:19;;18270:366;;;:::o;18642:::-;18784:3;18805:67;18869:2;18864:3;18805:67;:::i;:::-;18798:74;;18881:93;18970:3;18881:93;:::i;:::-;18999:2;18994:3;18990:12;18983:19;;18642:366;;;:::o;19014:::-;19156:3;19177:67;19241:2;19236:3;19177:67;:::i;:::-;19170:74;;19253:93;19342:3;19253:93;:::i;:::-;19371:2;19366:3;19362:12;19355:19;;19014:366;;;:::o;19386:::-;19528:3;19549:67;19613:2;19608:3;19549:67;:::i;:::-;19542:74;;19625:93;19714:3;19625:93;:::i;:::-;19743:2;19738:3;19734:12;19727:19;;19386:366;;;:::o;19830:874::-;19989:4;19984:3;19980:14;20076:4;20069:5;20065:16;20059:23;20095:63;20152:4;20147:3;20143:14;20129:12;20095:63;:::i;:::-;20004:164;20260:4;20253:5;20249:16;20243:23;20279:61;20334:4;20329:3;20325:14;20311:12;20279:61;:::i;:::-;20178:172;20434:4;20427:5;20423:16;20417:23;20453:57;20504:4;20499:3;20495:14;20481:12;20453:57;:::i;:::-;20360:160;20607:4;20600:5;20596:16;20590:23;20626:61;20681:4;20676:3;20672:14;20658:12;20626:61;:::i;:::-;20530:167;19958:746;19830:874;;:::o;20710:105::-;20785:23;20802:5;20785:23;:::i;:::-;20780:3;20773:36;20710:105;;:::o;20821:118::-;20908:24;20926:5;20908:24;:::i;:::-;20903:3;20896:37;20821:118;;:::o;20945:115::-;21030:23;21047:5;21030:23;:::i;:::-;21025:3;21018:36;20945:115;;:::o;21066:105::-;21141:23;21158:5;21141:23;:::i;:::-;21136:3;21129:36;21066:105;;:::o;21177:256::-;21289:3;21304:75;21375:3;21366:6;21304:75;:::i;:::-;21404:2;21399:3;21395:12;21388:19;;21424:3;21417:10;;21177:256;;;;:::o;21439:435::-;21619:3;21641:95;21732:3;21723:6;21641:95;:::i;:::-;21634:102;;21753:95;21844:3;21835:6;21753:95;:::i;:::-;21746:102;;21865:3;21858:10;;21439:435;;;;;:::o;21880:379::-;22064:3;22086:147;22229:3;22086:147;:::i;:::-;22079:154;;22250:3;22243:10;;21880:379;;;:::o;22265:222::-;22358:4;22396:2;22385:9;22381:18;22373:26;;22409:71;22477:1;22466:9;22462:17;22453:6;22409:71;:::i;:::-;22265:222;;;;:::o;22493:640::-;22688:4;22726:3;22715:9;22711:19;22703:27;;22740:71;22808:1;22797:9;22793:17;22784:6;22740:71;:::i;:::-;22821:72;22889:2;22878:9;22874:18;22865:6;22821:72;:::i;:::-;22903;22971:2;22960:9;22956:18;22947:6;22903:72;:::i;:::-;23022:9;23016:4;23012:20;23007:2;22996:9;22992:18;22985:48;23050:76;23121:4;23112:6;23050:76;:::i;:::-;23042:84;;22493:640;;;;;;;:::o;23139:210::-;23226:4;23264:2;23253:9;23249:18;23241:26;;23277:65;23339:1;23328:9;23324:17;23315:6;23277:65;:::i;:::-;23139:210;;;;:::o;23355:252::-;23463:4;23501:2;23490:9;23486:18;23478:26;;23514:86;23597:1;23586:9;23582:17;23573:6;23514:86;:::i;:::-;23355:252;;;;:::o;23613:313::-;23726:4;23764:2;23753:9;23749:18;23741:26;;23813:9;23807:4;23803:20;23799:1;23788:9;23784:17;23777:47;23841:78;23914:4;23905:6;23841:78;:::i;:::-;23833:86;;23613:313;;;;:::o;23932:419::-;24098:4;24136:2;24125:9;24121:18;24113:26;;24185:9;24179:4;24175:20;24171:1;24160:9;24156:17;24149:47;24213:131;24339:4;24213:131;:::i;:::-;24205:139;;23932:419;;;:::o;24357:::-;24523:4;24561:2;24550:9;24546:18;24538:26;;24610:9;24604:4;24600:20;24596:1;24585:9;24581:17;24574:47;24638:131;24764:4;24638:131;:::i;:::-;24630:139;;24357:419;;;:::o;24782:::-;24948:4;24986:2;24975:9;24971:18;24963:26;;25035:9;25029:4;25025:20;25021:1;25010:9;25006:17;24999:47;25063:131;25189:4;25063:131;:::i;:::-;25055:139;;24782:419;;;:::o;25207:::-;25373:4;25411:2;25400:9;25396:18;25388:26;;25460:9;25454:4;25450:20;25446:1;25435:9;25431:17;25424:47;25488:131;25614:4;25488:131;:::i;:::-;25480:139;;25207:419;;;:::o;25632:::-;25798:4;25836:2;25825:9;25821:18;25813:26;;25885:9;25879:4;25875:20;25871:1;25860:9;25856:17;25849:47;25913:131;26039:4;25913:131;:::i;:::-;25905:139;;25632:419;;;:::o;26057:::-;26223:4;26261:2;26250:9;26246:18;26238:26;;26310:9;26304:4;26300:20;26296:1;26285:9;26281:17;26274:47;26338:131;26464:4;26338:131;:::i;:::-;26330:139;;26057:419;;;:::o;26482:::-;26648:4;26686:2;26675:9;26671:18;26663:26;;26735:9;26729:4;26725:20;26721:1;26710:9;26706:17;26699:47;26763:131;26889:4;26763:131;:::i;:::-;26755:139;;26482:419;;;:::o;26907:::-;27073:4;27111:2;27100:9;27096:18;27088:26;;27160:9;27154:4;27150:20;27146:1;27135:9;27131:17;27124:47;27188:131;27314:4;27188:131;:::i;:::-;27180:139;;26907:419;;;:::o;27332:::-;27498:4;27536:2;27525:9;27521:18;27513:26;;27585:9;27579:4;27575:20;27571:1;27560:9;27556:17;27549:47;27613:131;27739:4;27613:131;:::i;:::-;27605:139;;27332:419;;;:::o;27757:::-;27923:4;27961:2;27950:9;27946:18;27938:26;;28010:9;28004:4;28000:20;27996:1;27985:9;27981:17;27974:47;28038:131;28164:4;28038:131;:::i;:::-;28030:139;;27757:419;;;:::o;28182:::-;28348:4;28386:2;28375:9;28371:18;28363:26;;28435:9;28429:4;28425:20;28421:1;28410:9;28406:17;28399:47;28463:131;28589:4;28463:131;:::i;:::-;28455:139;;28182:419;;;:::o;28607:::-;28773:4;28811:2;28800:9;28796:18;28788:26;;28860:9;28854:4;28850:20;28846:1;28835:9;28831:17;28824:47;28888:131;29014:4;28888:131;:::i;:::-;28880:139;;28607:419;;;:::o;29032:::-;29198:4;29236:2;29225:9;29221:18;29213:26;;29285:9;29279:4;29275:20;29271:1;29260:9;29256:17;29249:47;29313:131;29439:4;29313:131;:::i;:::-;29305:139;;29032:419;;;:::o;29457:::-;29623:4;29661:2;29650:9;29646:18;29638:26;;29710:9;29704:4;29700:20;29696:1;29685:9;29681:17;29674:47;29738:131;29864:4;29738:131;:::i;:::-;29730:139;;29457:419;;;:::o;29882:::-;30048:4;30086:2;30075:9;30071:18;30063:26;;30135:9;30129:4;30125:20;30121:1;30110:9;30106:17;30099:47;30163:131;30289:4;30163:131;:::i;:::-;30155:139;;29882:419;;;:::o;30307:::-;30473:4;30511:2;30500:9;30496:18;30488:26;;30560:9;30554:4;30550:20;30546:1;30535:9;30531:17;30524:47;30588:131;30714:4;30588:131;:::i;:::-;30580:139;;30307:419;;;:::o;30732:::-;30898:4;30936:2;30925:9;30921:18;30913:26;;30985:9;30979:4;30975:20;30971:1;30960:9;30956:17;30949:47;31013:131;31139:4;31013:131;:::i;:::-;31005:139;;30732:419;;;:::o;31157:::-;31323:4;31361:2;31350:9;31346:18;31338:26;;31410:9;31404:4;31400:20;31396:1;31385:9;31381:17;31374:47;31438:131;31564:4;31438:131;:::i;:::-;31430:139;;31157:419;;;:::o;31582:347::-;31737:4;31775:3;31764:9;31760:19;31752:27;;31789:133;31919:1;31908:9;31904:17;31895:6;31789:133;:::i;:::-;31582:347;;;;:::o;31935:222::-;32028:4;32066:2;32055:9;32051:18;32043:26;;32079:71;32147:1;32136:9;32132:17;32123:6;32079:71;:::i;:::-;31935:222;;;;:::o;32163:430::-;32306:4;32344:2;32333:9;32329:18;32321:26;;32357:69;32423:1;32412:9;32408:17;32399:6;32357:69;:::i;:::-;32436:70;32502:2;32491:9;32487:18;32478:6;32436:70;:::i;:::-;32516;32582:2;32571:9;32567:18;32558:6;32516:70;:::i;:::-;32163:430;;;;;;:::o;32599:129::-;32633:6;32660:20;;:::i;:::-;32650:30;;32689:33;32717:4;32709:6;32689:33;:::i;:::-;32599:129;;;:::o;32734:75::-;32767:6;32800:2;32794:9;32784:19;;32734:75;:::o;32815:307::-;32876:4;32966:18;32958:6;32955:30;32952:56;;;32988:18;;:::i;:::-;32952:56;33026:29;33048:6;33026:29;:::i;:::-;33018:37;;33110:4;33104;33100:15;33092:23;;32815:307;;;:::o;33128:98::-;33179:6;33213:5;33207:12;33197:22;;33128:98;;;:::o;33232:99::-;33284:6;33318:5;33312:12;33302:22;;33232:99;;;:::o;33337:168::-;33420:11;33454:6;33449:3;33442:19;33494:4;33489:3;33485:14;33470:29;;33337:168;;;;:::o;33511:147::-;33612:11;33649:3;33634:18;;33511:147;;;;:::o;33664:169::-;33748:11;33782:6;33777:3;33770:19;33822:4;33817:3;33813:14;33798:29;;33664:169;;;;:::o;33839:148::-;33941:11;33978:3;33963:18;;33839:148;;;;:::o;33993:305::-;34033:3;34052:20;34070:1;34052:20;:::i;:::-;34047:25;;34086:20;34104:1;34086:20;:::i;:::-;34081:25;;34240:1;34172:66;34168:74;34165:1;34162:81;34159:107;;;34246:18;;:::i;:::-;34159:107;34290:1;34287;34283:9;34276:16;;33993:305;;;;:::o;34304:96::-;34341:7;34370:24;34388:5;34370:24;:::i;:::-;34359:35;;34304:96;;;:::o;34406:90::-;34440:7;34483:5;34476:13;34469:21;34458:32;;34406:90;;;:::o;34502:77::-;34539:7;34568:5;34557:16;;34502:77;;;:::o;34585:149::-;34621:7;34661:66;34654:5;34650:78;34639:89;;34585:149;;;:::o;34740:126::-;34777:7;34817:42;34810:5;34806:54;34795:65;;34740:126;;;:::o;34872:91::-;34908:7;34948:8;34941:5;34937:20;34926:31;;34872:91;;;:::o;34969:77::-;35006:7;35035:5;35024:16;;34969:77;;;:::o;35052:93::-;35088:7;35128:10;35121:5;35117:22;35106:33;;35052:93;;;:::o;35151:101::-;35187:7;35227:18;35220:5;35216:30;35205:41;;35151:101;;;:::o;35258:141::-;35323:9;35356:37;35387:5;35356:37;:::i;:::-;35343:50;;35258:141;;;:::o;35405:126::-;35455:9;35488:37;35519:5;35488:37;:::i;:::-;35475:50;;35405:126;;;:::o;35537:113::-;35587:9;35620:24;35638:5;35620:24;:::i;:::-;35607:37;;35537:113;;;:::o;35656:154::-;35740:6;35735:3;35730;35717:30;35802:1;35793:6;35788:3;35784:16;35777:27;35656:154;;;:::o;35816:307::-;35884:1;35894:113;35908:6;35905:1;35902:13;35894:113;;;35993:1;35988:3;35984:11;35978:18;35974:1;35969:3;35965:11;35958:39;35930:2;35927:1;35923:10;35918:15;;35894:113;;;36025:6;36022:1;36019:13;36016:101;;;36105:1;36096:6;36091:3;36087:16;36080:27;36016:101;35865:258;35816:307;;;:::o;36129:320::-;36173:6;36210:1;36204:4;36200:12;36190:22;;36257:1;36251:4;36247:12;36278:18;36268:81;;36334:4;36326:6;36322:17;36312:27;;36268:81;36396:2;36388:6;36385:14;36365:18;36362:38;36359:84;;;36415:18;;:::i;:::-;36359:84;36180:269;36129:320;;;:::o;36455:281::-;36538:27;36560:4;36538:27;:::i;:::-;36530:6;36526:40;36668:6;36656:10;36653:22;36632:18;36620:10;36617:34;36614:62;36611:88;;;36679:18;;:::i;:::-;36611:88;36719:10;36715:2;36708:22;36498:238;36455:281;;:::o;36742:233::-;36781:3;36804:24;36822:5;36804:24;:::i;:::-;36795:33;;36850:66;36843:5;36840:77;36837:103;;;36920:18;;:::i;:::-;36837:103;36967:1;36960:5;36956:13;36949:20;;36742:233;;;:::o;36981:100::-;37020:7;37049:26;37069:5;37049:26;:::i;:::-;37038:37;;36981:100;;;:::o;37087:94::-;37126:7;37155:20;37169:5;37155:20;:::i;:::-;37144:31;;37087:94;;;:::o;37187:180::-;37235:77;37232:1;37225:88;37332:4;37329:1;37322:15;37356:4;37353:1;37346:15;37373:180;37421:77;37418:1;37411:88;37518:4;37515:1;37508:15;37542:4;37539:1;37532:15;37559:180;37607:77;37604:1;37597:88;37704:4;37701:1;37694:15;37728:4;37725:1;37718:15;37745:180;37793:77;37790:1;37783:88;37890:4;37887:1;37880:15;37914:4;37911:1;37904:15;37931:117;38040:1;38037;38030:12;38054:117;38163:1;38160;38153:12;38177:117;38286:1;38283;38276:12;38300:117;38409:1;38406;38399:12;38423:117;38532:1;38529;38522:12;38546:117;38655:1;38652;38645:12;38669:102;38710:6;38761:2;38757:7;38752:2;38745:5;38741:14;38737:28;38727:38;;38669:102;;;:::o;38777:94::-;38810:8;38858:5;38854:2;38850:14;38829:35;;38777:94;;;:::o;38877:225::-;39017:34;39013:1;39005:6;39001:14;38994:58;39086:8;39081:2;39073:6;39069:15;39062:33;38877:225;:::o;39108:229::-;39248:34;39244:1;39236:6;39232:14;39225:58;39317:12;39312:2;39304:6;39300:15;39293:37;39108:229;:::o;39343:165::-;39483:17;39479:1;39471:6;39467:14;39460:41;39343:165;:::o;39514:174::-;39654:26;39650:1;39642:6;39638:14;39631:50;39514:174;:::o;39694:224::-;39834:34;39830:1;39822:6;39818:14;39811:58;39903:7;39898:2;39890:6;39886:15;39879:32;39694:224;:::o;39924:180::-;40064:32;40060:1;40052:6;40048:14;40041:56;39924:180;:::o;40110:::-;40250:32;40246:1;40238:6;40234:14;40227:56;40110:180;:::o;40296:168::-;40436:20;40432:1;40424:6;40420:14;40413:44;40296:168;:::o;40470:181::-;40610:33;40606:1;40598:6;40594:14;40587:57;40470:181;:::o;40657:162::-;40797:14;40793:1;40785:6;40781:14;40774:38;40657:162;:::o;40825:182::-;40965:34;40961:1;40953:6;40949:14;40942:58;40825:182;:::o;41013:165::-;41153:17;41149:1;41141:6;41137:14;41130:41;41013:165;:::o;41184:179::-;41324:31;41320:1;41312:6;41308:14;41301:55;41184:179;:::o;41369:114::-;;:::o;41489:166::-;41629:18;41625:1;41617:6;41613:14;41606:42;41489:166;:::o;41661:172::-;41801:24;41797:1;41789:6;41785:14;41778:48;41661:172;:::o;41839:::-;41979:24;41975:1;41967:6;41963:14;41956:48;41839:172;:::o;42017:226::-;42157:34;42153:1;42145:6;42141:14;42134:58;42226:9;42221:2;42213:6;42209:15;42202:34;42017:226;:::o;42249:181::-;42389:33;42385:1;42377:6;42373:14;42366:57;42249:181;:::o;42436:122::-;42509:24;42527:5;42509:24;:::i;:::-;42502:5;42499:35;42489:63;;42548:1;42545;42538:12;42489:63;42436:122;:::o;42564:116::-;42634:21;42649:5;42634:21;:::i;:::-;42627:5;42624:32;42614:60;;42670:1;42667;42660:12;42614:60;42564:116;:::o;42686:122::-;42759:24;42777:5;42759:24;:::i;:::-;42752:5;42749:35;42739:63;;42798:1;42795;42788:12;42739:63;42686:122;:::o;42814:120::-;42886:23;42903:5;42886:23;:::i;:::-;42879:5;42876:34;42866:62;;42924:1;42921;42914:12;42866:62;42814:120;:::o;42940:122::-;43013:24;43031:5;43013:24;:::i;:::-;43006:5;43003:35;42993:63;;43052:1;43049;43042:12;42993:63;42940:122;:::o;43068:120::-;43140:23;43157:5;43140:23;:::i;:::-;43133:5;43130:34;43120:62;;43178:1;43175;43168:12;43120:62;43068:120;:::o
Swarm Source
ipfs://bab22c9909d4d71dbf396a6090941d43030e7e9477e3b334be0909a853042741
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.