ERC-721
Overview
Max Total Supply
77 PCBD
Holders
46
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
1 PCBDLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Source Code Verified (Exact Match)
Contract Name:
PREMECuddleBuddies
Compiler Version
v0.8.23+commit.f704f362
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2023-11-16 */ // File: erc721a/contracts/IERC721A.sol // ERC721A Contracts v4.2.3 // Creator: Chiru Labs pragma solidity ^0.8.4; /** * @dev Interface of ERC721A. */ interface IERC721A { /** * The caller must own the token or be an approved operator. */ error ApprovalCallerNotOwnerNorApproved(); /** * The token does not exist. */ error ApprovalQueryForNonexistentToken(); /** * Cannot query the balance for the zero address. */ error BalanceQueryForZeroAddress(); /** * Cannot mint to the zero address. */ error MintToZeroAddress(); /** * The quantity of tokens minted must be more than zero. */ error MintZeroQuantity(); /** * The token does not exist. */ error OwnerQueryForNonexistentToken(); /** * The caller must own the token or be an approved operator. */ error TransferCallerNotOwnerNorApproved(); /** * The token must be owned by `from`. */ error TransferFromIncorrectOwner(); /** * Cannot safely transfer to a contract that does not implement the * ERC721Receiver interface. */ error TransferToNonERC721ReceiverImplementer(); /** * Cannot transfer to the zero address. */ error TransferToZeroAddress(); /** * The token does not exist. */ error URIQueryForNonexistentToken(); /** * The `quantity` minted with ERC2309 exceeds the safety limit. */ error MintERC2309QuantityExceedsLimit(); /** * The `extraData` cannot be set on an unintialized ownership slot. */ error OwnershipNotInitializedForExtraData(); // ============================================================= // STRUCTS // ============================================================= struct TokenOwnership { // The address of the owner. address addr; // Stores the start time of ownership with minimal overhead for tokenomics. uint64 startTimestamp; // Whether the token has been burned. bool burned; // Arbitrary data similar to `startTimestamp` that can be set via {_extraData}. uint24 extraData; } // ============================================================= // TOKEN COUNTERS // ============================================================= /** * @dev Returns the total number of tokens in existence. * Burned tokens will reduce the count. * To get the total number of tokens minted, please see {_totalMinted}. */ function totalSupply() external view returns (uint256); // ============================================================= // IERC165 // ============================================================= /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * [EIP section](https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified) * to learn more about how these ids are created. * * This function call must use less than 30000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); // ============================================================= // IERC721 // ============================================================= /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables * (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in `owner`'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`, * checking first that contract recipients are aware of the ERC721 protocol * to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move * this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement * {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external payable; /** * @dev Equivalent to `safeTransferFrom(from, to, tokenId, '')`. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external payable; /** * @dev Transfers `tokenId` from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} * whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token * by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external payable; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the * zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external payable; /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} * for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll}. */ function isApprovedForAll(address owner, address operator) external view returns (bool); // ============================================================= // IERC721Metadata // ============================================================= /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); // ============================================================= // IERC2309 // ============================================================= /** * @dev Emitted when tokens in `fromTokenId` to `toTokenId` * (inclusive) is transferred from `from` to `to`, as defined in the * [ERC2309](https://eips.ethereum.org/EIPS/eip-2309) standard. * * See {_mintERC2309} for more details. */ event ConsecutiveTransfer(uint256 indexed fromTokenId, uint256 toTokenId, address indexed from, address indexed to); } // File: erc721a/contracts/ERC721A.sol // ERC721A Contracts v4.2.3 // Creator: Chiru Labs pragma solidity ^0.8.4; /** * @dev Interface of ERC721 token receiver. */ interface ERC721A__IERC721Receiver { function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } /** * @title ERC721A * * @dev Implementation of the [ERC721](https://eips.ethereum.org/EIPS/eip-721) * Non-Fungible Token Standard, including the Metadata extension. * Optimized for lower gas during batch mints. * * Token IDs are minted in sequential order (e.g. 0, 1, 2, 3, ...) * starting from `_startTokenId()`. * * Assumptions: * * - An owner cannot have more than 2**64 - 1 (max value of uint64) of supply. * - The maximum token ID cannot exceed 2**256 - 1 (max value of uint256). */ contract ERC721A is IERC721A { // Bypass for a `--via-ir` bug (https://github.com/chiru-labs/ERC721A/pull/364). struct TokenApprovalRef { address value; } // ============================================================= // CONSTANTS // ============================================================= // Mask of an entry in packed address data. uint256 private constant _BITMASK_ADDRESS_DATA_ENTRY = (1 << 64) - 1; // The bit position of `numberMinted` in packed address data. uint256 private constant _BITPOS_NUMBER_MINTED = 64; // The bit position of `numberBurned` in packed address data. uint256 private constant _BITPOS_NUMBER_BURNED = 128; // The bit position of `aux` in packed address data. uint256 private constant _BITPOS_AUX = 192; // Mask of all 256 bits in packed address data except the 64 bits for `aux`. uint256 private constant _BITMASK_AUX_COMPLEMENT = (1 << 192) - 1; // The bit position of `startTimestamp` in packed ownership. uint256 private constant _BITPOS_START_TIMESTAMP = 160; // The bit mask of the `burned` bit in packed ownership. uint256 private constant _BITMASK_BURNED = 1 << 224; // The bit position of the `nextInitialized` bit in packed ownership. uint256 private constant _BITPOS_NEXT_INITIALIZED = 225; // The bit mask of the `nextInitialized` bit in packed ownership. uint256 private constant _BITMASK_NEXT_INITIALIZED = 1 << 225; // The bit position of `extraData` in packed ownership. uint256 private constant _BITPOS_EXTRA_DATA = 232; // Mask of all 256 bits in a packed ownership except the 24 bits for `extraData`. uint256 private constant _BITMASK_EXTRA_DATA_COMPLEMENT = (1 << 232) - 1; // The mask of the lower 160 bits for addresses. uint256 private constant _BITMASK_ADDRESS = (1 << 160) - 1; // The maximum `quantity` that can be minted with {_mintERC2309}. // This limit is to prevent overflows on the address data entries. // For a limit of 5000, a total of 3.689e15 calls to {_mintERC2309} // is required to cause an overflow, which is unrealistic. uint256 private constant _MAX_MINT_ERC2309_QUANTITY_LIMIT = 5000; // The `Transfer` event signature is given by: // `keccak256(bytes("Transfer(address,address,uint256)"))`. bytes32 private constant _TRANSFER_EVENT_SIGNATURE = 0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef; // ============================================================= // STORAGE // ============================================================= // The next token ID to be minted. uint256 private _currentIndex; // The number of tokens burned. uint256 private _burnCounter; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to ownership details // An empty struct value does not necessarily mean the token is unowned. // See {_packedOwnershipOf} implementation for details. // // Bits Layout: // - [0..159] `addr` // - [160..223] `startTimestamp` // - [224] `burned` // - [225] `nextInitialized` // - [232..255] `extraData` mapping(uint256 => uint256) private _packedOwnerships; // Mapping owner address to address data. // // Bits Layout: // - [0..63] `balance` // - [64..127] `numberMinted` // - [128..191] `numberBurned` // - [192..255] `aux` mapping(address => uint256) private _packedAddressData; // Mapping from token ID to approved address. mapping(uint256 => TokenApprovalRef) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; // ============================================================= // CONSTRUCTOR // ============================================================= constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; _currentIndex = _startTokenId(); } // ============================================================= // TOKEN COUNTING OPERATIONS // ============================================================= /** * @dev Returns the starting token ID. * To change the starting token ID, please override this function. */ function _startTokenId() internal view virtual returns (uint256) { return 0; } /** * @dev Returns the next token ID to be minted. */ function _nextTokenId() internal view virtual returns (uint256) { return _currentIndex; } /** * @dev Returns the total number of tokens in existence. * Burned tokens will reduce the count. * To get the total number of tokens minted, please see {_totalMinted}. */ function totalSupply() public view virtual override returns (uint256) { // Counter underflow is impossible as _burnCounter cannot be incremented // more than `_currentIndex - _startTokenId()` times. unchecked { return _currentIndex - _burnCounter - _startTokenId(); } } /** * @dev Returns the total amount of tokens minted in the contract. */ function _totalMinted() internal view virtual returns (uint256) { // Counter underflow is impossible as `_currentIndex` does not decrement, // and it is initialized to `_startTokenId()`. unchecked { return _currentIndex - _startTokenId(); } } /** * @dev Returns the total number of tokens burned. */ function _totalBurned() internal view virtual returns (uint256) { return _burnCounter; } // ============================================================= // ADDRESS DATA OPERATIONS // ============================================================= /** * @dev Returns the number of tokens in `owner`'s account. */ function balanceOf(address owner) public view virtual override returns (uint256) { if (owner == address(0)) revert BalanceQueryForZeroAddress(); return _packedAddressData[owner] & _BITMASK_ADDRESS_DATA_ENTRY; } /** * Returns the number of tokens minted by `owner`. */ function _numberMinted(address owner) internal view returns (uint256) { return (_packedAddressData[owner] >> _BITPOS_NUMBER_MINTED) & _BITMASK_ADDRESS_DATA_ENTRY; } /** * Returns the number of tokens burned by or on behalf of `owner`. */ function _numberBurned(address owner) internal view returns (uint256) { return (_packedAddressData[owner] >> _BITPOS_NUMBER_BURNED) & _BITMASK_ADDRESS_DATA_ENTRY; } /** * Returns the auxiliary data for `owner`. (e.g. number of whitelist mint slots used). */ function _getAux(address owner) internal view returns (uint64) { return uint64(_packedAddressData[owner] >> _BITPOS_AUX); } /** * Sets the auxiliary data for `owner`. (e.g. number of whitelist mint slots used). * If there are multiple variables, please pack them into a uint64. */ function _setAux(address owner, uint64 aux) internal virtual { uint256 packed = _packedAddressData[owner]; uint256 auxCasted; // Cast `aux` with assembly to avoid redundant masking. assembly { auxCasted := aux } packed = (packed & _BITMASK_AUX_COMPLEMENT) | (auxCasted << _BITPOS_AUX); _packedAddressData[owner] = packed; } // ============================================================= // IERC165 // ============================================================= /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * [EIP section](https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified) * to learn more about how these ids are created. * * This function call must use less than 30000 gas. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { // The interface IDs are constants representing the first 4 bytes // of the XOR of all function selectors in the interface. // See: [ERC165](https://eips.ethereum.org/EIPS/eip-165) // (e.g. `bytes4(i.functionA.selector ^ i.functionB.selector ^ ...)`) return interfaceId == 0x01ffc9a7 || // ERC165 interface ID for ERC165. interfaceId == 0x80ac58cd || // ERC165 interface ID for ERC721. interfaceId == 0x5b5e139f; // ERC165 interface ID for ERC721Metadata. } // ============================================================= // IERC721Metadata // ============================================================= /** * @dev Returns the token collection name. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev Returns the token collection symbol. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { if (!_exists(tokenId)) revert URIQueryForNonexistentToken(); string memory baseURI = _baseURI(); return bytes(baseURI).length != 0 ? string(abi.encodePacked(baseURI, _toString(tokenId))) : ''; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, it can be overridden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ''; } // ============================================================= // OWNERSHIPS OPERATIONS // ============================================================= /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) public view virtual override returns (address) { return address(uint160(_packedOwnershipOf(tokenId))); } /** * @dev Gas spent here starts off proportional to the maximum mint batch size. * It gradually moves to O(1) as tokens get transferred around over time. */ function _ownershipOf(uint256 tokenId) internal view virtual returns (TokenOwnership memory) { return _unpackedOwnership(_packedOwnershipOf(tokenId)); } /** * @dev Returns the unpacked `TokenOwnership` struct at `index`. */ function _ownershipAt(uint256 index) internal view virtual returns (TokenOwnership memory) { return _unpackedOwnership(_packedOwnerships[index]); } /** * @dev Initializes the ownership slot minted at `index` for efficiency purposes. */ function _initializeOwnershipAt(uint256 index) internal virtual { if (_packedOwnerships[index] == 0) { _packedOwnerships[index] = _packedOwnershipOf(index); } } /** * Returns the packed ownership data of `tokenId`. */ function _packedOwnershipOf(uint256 tokenId) private view returns (uint256) { 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 payable 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 { _operatorApprovals[_msgSenderERC721A()][operator] = approved; emit ApprovalForAll(_msgSenderERC721A(), operator, approved); } /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted. See {_mint}. */ function _exists(uint256 tokenId) internal view virtual returns (bool) { return _startTokenId() <= tokenId && tokenId < _currentIndex && // If within bounds, _packedOwnerships[tokenId] & _BITMASK_BURNED == 0; // and not burned. } /** * @dev Returns whether `msgSender` is equal to `approvedAddress` or `owner`. */ function _isSenderApprovedOrOwner( address approvedAddress, address owner, address msgSender ) private pure returns (bool result) { assembly { // Mask `owner` to the lower 160 bits, in case the upper bits somehow aren't clean. owner := and(owner, _BITMASK_ADDRESS) // Mask `msgSender` to the lower 160 bits, in case the upper bits somehow aren't clean. msgSender := and(msgSender, _BITMASK_ADDRESS) // `msgSender == owner || msgSender == approvedAddress`. result := or(eq(msgSender, owner), eq(msgSender, approvedAddress)) } } /** * @dev Returns the storage slot and value for the approved address of `tokenId`. */ function _getApprovedSlotAndAddress(uint256 tokenId) private view returns (uint256 approvedAddressSlot, address approvedAddress) { TokenApprovalRef storage tokenApproval = _tokenApprovals[tokenId]; // The following is equivalent to `approvedAddress = _tokenApprovals[tokenId].value`. assembly { approvedAddressSlot := tokenApproval.slot approvedAddress := sload(approvedAddressSlot) } } // ============================================================= // TRANSFER OPERATIONS // ============================================================= /** * @dev Transfers `tokenId` from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token * by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) public payable virtual override { uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId); if (address(uint160(prevOwnershipPacked)) != from) revert TransferFromIncorrectOwner(); (uint256 approvedAddressSlot, address approvedAddress) = _getApprovedSlotAndAddress(tokenId); // The nested ifs save around 20+ gas over a compound boolean condition. if (!_isSenderApprovedOrOwner(approvedAddress, from, _msgSenderERC721A())) if (!isApprovedForAll(from, _msgSenderERC721A())) revert TransferCallerNotOwnerNorApproved(); if (to == address(0)) revert TransferToZeroAddress(); _beforeTokenTransfers(from, to, tokenId, 1); // Clear approvals from the previous owner. assembly { if approvedAddress { // This is equivalent to `delete _tokenApprovals[tokenId]`. sstore(approvedAddressSlot, 0) } } // Underflow of the sender's balance is impossible because we check for // ownership above and the recipient's balance can't realistically overflow. // Counter overflow is incredibly unrealistic as `tokenId` would have to be 2**256. unchecked { // We can directly increment and decrement the balances. --_packedAddressData[from]; // Updates: `balance -= 1`. ++_packedAddressData[to]; // Updates: `balance += 1`. // Updates: // - `address` to the next owner. // - `startTimestamp` to the timestamp of transfering. // - `burned` to `false`. // - `nextInitialized` to `true`. _packedOwnerships[tokenId] = _packOwnershipData( to, _BITMASK_NEXT_INITIALIZED | _nextExtraData(from, to, prevOwnershipPacked) ); // If the next slot may not have been initialized (i.e. `nextInitialized == false`) . if (prevOwnershipPacked & _BITMASK_NEXT_INITIALIZED == 0) { uint256 nextTokenId = tokenId + 1; // If the next slot's address is zero and not burned (i.e. packed value is zero). if (_packedOwnerships[nextTokenId] == 0) { // If the next slot is within bounds. if (nextTokenId != _currentIndex) { // Initialize the next slot to maintain correctness for `ownerOf(tokenId + 1)`. _packedOwnerships[nextTokenId] = prevOwnershipPacked; } } } } emit Transfer(from, to, tokenId); _afterTokenTransfers(from, to, tokenId, 1); } /** * @dev Equivalent to `safeTransferFrom(from, to, tokenId, '')`. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public payable virtual override { safeTransferFrom(from, to, tokenId, ''); } /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token * by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement * {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory _data ) public payable virtual override { transferFrom(from, to, tokenId); if (to.code.length != 0) if (!_checkContractOnERC721Received(from, to, tokenId, _data)) { revert TransferToNonERC721ReceiverImplementer(); } } /** * @dev Hook that is called before a set of serially-ordered token IDs * are about to be transferred. This includes minting. * And also called before burning one token. * * `startTokenId` - the first token ID to be transferred. * `quantity` - the amount to be transferred. * * Calling conditions: * * - When `from` and `to` are both non-zero, `from`'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, `tokenId` will be burned by `from`. * - `from` and `to` are never both zero. */ function _beforeTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} /** * @dev Hook that is called after a set of serially-ordered token IDs * have been transferred. This includes minting. * And also called after one token has been burned. * * `startTokenId` - the first token ID to be transferred. * `quantity` - the amount to be transferred. * * Calling conditions: * * - When `from` and `to` are both non-zero, `from`'s `tokenId` has been * transferred to `to`. * - When `from` is zero, `tokenId` has been minted for `to`. * - When `to` is zero, `tokenId` has been burned by `from`. * - `from` and `to` are never both zero. */ function _afterTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} /** * @dev Private function to invoke {IERC721Receiver-onERC721Received} on a target contract. * * `from` - Previous owner of the given token ID. * `to` - Target address that will receive the token. * `tokenId` - Token ID to be transferred. * `_data` - Optional data to send along with the call. * * Returns whether the call correctly returned the expected magic value. */ function _checkContractOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { try ERC721A__IERC721Receiver(to).onERC721Received(_msgSenderERC721A(), from, tokenId, _data) returns ( bytes4 retval ) { return retval == ERC721A__IERC721Receiver(to).onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert TransferToNonERC721ReceiverImplementer(); } else { assembly { revert(add(32, reason), mload(reason)) } } } } // ============================================================= // MINT OPERATIONS // ============================================================= /** * @dev Mints `quantity` tokens and transfers them to `to`. * * Requirements: * * - `to` cannot be the zero address. * - `quantity` must be greater than 0. * * Emits a {Transfer} event for each mint. */ function _mint(address to, uint256 quantity) internal virtual { uint256 startTokenId = _currentIndex; if (quantity == 0) revert MintZeroQuantity(); _beforeTokenTransfers(address(0), to, startTokenId, quantity); // Overflows are incredibly unrealistic. // `balance` and `numberMinted` have a maximum limit of 2**64. // `tokenId` has a maximum limit of 2**256. unchecked { // Updates: // - `balance += quantity`. // - `numberMinted += quantity`. // // We can directly add to the `balance` and `numberMinted`. _packedAddressData[to] += quantity * ((1 << _BITPOS_NUMBER_MINTED) | 1); // Updates: // - `address` to the owner. // - `startTimestamp` to the timestamp of minting. // - `burned` to `false`. // - `nextInitialized` to `quantity == 1`. _packedOwnerships[startTokenId] = _packOwnershipData( to, _nextInitializedFlag(quantity) | _nextExtraData(address(0), to, 0) ); uint256 toMasked; uint256 end = startTokenId + quantity; // Use assembly to loop and emit the `Transfer` event for gas savings. // The duplicated `log4` removes an extra check and reduces stack juggling. // The assembly, together with the surrounding Solidity code, have been // delicately arranged to nudge the compiler into producing optimized opcodes. assembly { // Mask `to` to the lower 160 bits, in case the upper bits somehow aren't clean. toMasked := and(to, _BITMASK_ADDRESS) // Emit the `Transfer` event. log4( 0, // Start of data (0, since no data). 0, // End of data (0, since no data). _TRANSFER_EVENT_SIGNATURE, // Signature. 0, // `address(0)`. toMasked, // `to`. startTokenId // `tokenId`. ) // The `iszero(eq(,))` check ensures that large values of `quantity` // that overflows uint256 will make the loop run out of gas. // The compiler will optimize the `iszero` away for performance. for { let tokenId := add(startTokenId, 1) } iszero(eq(tokenId, end)) { tokenId := add(tokenId, 1) } { // Emit the `Transfer` event. Similar to above. log4(0, 0, _TRANSFER_EVENT_SIGNATURE, 0, toMasked, tokenId) } } if (toMasked == 0) revert MintToZeroAddress(); _currentIndex = end; } _afterTokenTransfers(address(0), to, startTokenId, quantity); } /** * @dev Mints `quantity` tokens and transfers them to `to`. * * This function is intended for efficient minting only during contract creation. * * It emits only one {ConsecutiveTransfer} as defined in * [ERC2309](https://eips.ethereum.org/EIPS/eip-2309), * instead of a sequence of {Transfer} event(s). * * Calling this function outside of contract creation WILL make your contract * non-compliant with the ERC721 standard. * For full ERC721 compliance, substituting ERC721 {Transfer} event(s) with the ERC2309 * {ConsecutiveTransfer} event is only permissible during contract creation. * * Requirements: * * - `to` cannot be the zero address. * - `quantity` must be greater than 0. * * Emits a {ConsecutiveTransfer} event. */ function _mintERC2309(address to, uint256 quantity) internal virtual { uint256 startTokenId = _currentIndex; if (to == address(0)) revert MintToZeroAddress(); if (quantity == 0) revert MintZeroQuantity(); if (quantity > _MAX_MINT_ERC2309_QUANTITY_LIMIT) revert MintERC2309QuantityExceedsLimit(); _beforeTokenTransfers(address(0), to, startTokenId, quantity); // Overflows are unrealistic due to the above check for `quantity` to be below the limit. unchecked { // Updates: // - `balance += quantity`. // - `numberMinted += quantity`. // // We can directly add to the `balance` and `numberMinted`. _packedAddressData[to] += quantity * ((1 << _BITPOS_NUMBER_MINTED) | 1); // Updates: // - `address` to the owner. // - `startTimestamp` to the timestamp of minting. // - `burned` to `false`. // - `nextInitialized` to `quantity == 1`. _packedOwnerships[startTokenId] = _packOwnershipData( to, _nextInitializedFlag(quantity) | _nextExtraData(address(0), to, 0) ); emit ConsecutiveTransfer(startTokenId, startTokenId + quantity - 1, address(0), to); _currentIndex = startTokenId + quantity; } _afterTokenTransfers(address(0), to, startTokenId, quantity); } /** * @dev Safely mints `quantity` tokens and transfers them to `to`. * * Requirements: * * - If `to` refers to a smart contract, it must implement * {IERC721Receiver-onERC721Received}, which is called for each safe transfer. * - `quantity` must be greater than 0. * * See {_mint}. * * Emits a {Transfer} event for each mint. */ function _safeMint( address to, uint256 quantity, bytes memory _data ) internal virtual { _mint(to, quantity); unchecked { if (to.code.length != 0) { uint256 end = _currentIndex; uint256 index = end - quantity; do { if (!_checkContractOnERC721Received(address(0), to, index++, _data)) { revert TransferToNonERC721ReceiverImplementer(); } } while (index < end); // Reentrancy protection. if (_currentIndex != end) revert(); } } } /** * @dev Equivalent to `_safeMint(to, quantity, '')`. */ function _safeMint(address to, uint256 quantity) internal virtual { _safeMint(to, quantity, ''); } // ============================================================= // BURN OPERATIONS // ============================================================= /** * @dev Equivalent to `_burn(tokenId, false)`. */ function _burn(uint256 tokenId) internal virtual { _burn(tokenId, false); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId, bool approvalCheck) internal virtual { uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId); address from = address(uint160(prevOwnershipPacked)); (uint256 approvedAddressSlot, address approvedAddress) = _getApprovedSlotAndAddress(tokenId); if (approvalCheck) { // The nested ifs save around 20+ gas over a compound boolean condition. if (!_isSenderApprovedOrOwner(approvedAddress, from, _msgSenderERC721A())) if (!isApprovedForAll(from, _msgSenderERC721A())) revert TransferCallerNotOwnerNorApproved(); } _beforeTokenTransfers(from, address(0), tokenId, 1); // Clear approvals from the previous owner. assembly { if approvedAddress { // This is equivalent to `delete _tokenApprovals[tokenId]`. sstore(approvedAddressSlot, 0) } } // Underflow of the sender's balance is impossible because we check for // ownership above and the recipient's balance can't realistically overflow. // Counter overflow is incredibly unrealistic as `tokenId` would have to be 2**256. unchecked { // Updates: // - `balance -= 1`. // - `numberBurned += 1`. // // We can directly decrement the balance, and increment the number burned. // This is equivalent to `packed -= 1; packed += 1 << _BITPOS_NUMBER_BURNED;`. _packedAddressData[from] += (1 << _BITPOS_NUMBER_BURNED) - 1; // Updates: // - `address` to the last owner. // - `startTimestamp` to the timestamp of burning. // - `burned` to `true`. // - `nextInitialized` to `true`. _packedOwnerships[tokenId] = _packOwnershipData( from, (_BITMASK_BURNED | _BITMASK_NEXT_INITIALIZED) | _nextExtraData(from, address(0), prevOwnershipPacked) ); // If the next slot may not have been initialized (i.e. `nextInitialized == false`) . if (prevOwnershipPacked & _BITMASK_NEXT_INITIALIZED == 0) { uint256 nextTokenId = tokenId + 1; // If the next slot's address is zero and not burned (i.e. packed value is zero). if (_packedOwnerships[nextTokenId] == 0) { // If the next slot is within bounds. if (nextTokenId != _currentIndex) { // Initialize the next slot to maintain correctness for `ownerOf(tokenId + 1)`. _packedOwnerships[nextTokenId] = prevOwnershipPacked; } } } } emit Transfer(from, address(0), tokenId); _afterTokenTransfers(from, address(0), tokenId, 1); // Overflow not possible, as _burnCounter cannot be exceed _currentIndex times. unchecked { _burnCounter++; } } // ============================================================= // EXTRA DATA OPERATIONS // ============================================================= /** * @dev Directly sets the extra data for the ownership data `index`. */ function _setExtraDataAt(uint256 index, uint24 extraData) internal virtual { uint256 packed = _packedOwnerships[index]; if (packed == 0) revert OwnershipNotInitializedForExtraData(); uint256 extraDataCasted; // Cast `extraData` with assembly to avoid redundant masking. assembly { extraDataCasted := extraData } packed = (packed & _BITMASK_EXTRA_DATA_COMPLEMENT) | (extraDataCasted << _BITPOS_EXTRA_DATA); _packedOwnerships[index] = packed; } /** * @dev Called during each token transfer to set the 24bit `extraData` field. * Intended to be overridden by the cosumer contract. * * `previousExtraData` - the value of `extraData` before transfer. * * Calling conditions: * * - When `from` and `to` are both non-zero, `from`'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, `tokenId` will be burned by `from`. * - `from` and `to` are never both zero. */ function _extraData( address from, address to, uint24 previousExtraData ) internal view virtual returns (uint24) {} /** * @dev Returns the next extra data for the packed ownership data. * The returned result is shifted into position. */ function _nextExtraData( address from, address to, uint256 prevOwnershipPacked ) private view returns (uint256) { uint24 extraData = uint24(prevOwnershipPacked >> _BITPOS_EXTRA_DATA); return uint256(_extraData(from, to, extraData)) << _BITPOS_EXTRA_DATA; } // ============================================================= // OTHER OPERATIONS // ============================================================= /** * @dev Returns the message sender (defaults to `msg.sender`). * * If you are writing GSN compatible contracts, you need to override this function. */ function _msgSenderERC721A() internal view virtual returns (address) { return msg.sender; } /** * @dev Converts a uint256 to its ASCII string decimal representation. */ function _toString(uint256 value) internal pure virtual returns (string memory str) { assembly { // The maximum value of a uint256 contains 78 digits (1 byte per digit), but // we allocate 0xa0 bytes to keep the free memory pointer 32-byte word aligned. // We will need 1 word for the trailing zeros padding, 1 word for the length, // and 3 words for a maximum of 78 digits. Total: 5 * 0x20 = 0xa0. let m := add(mload(0x40), 0xa0) // Update the free memory pointer to allocate. mstore(0x40, m) // Assign the `str` to the end. str := sub(m, 0x20) // Zeroize the slot after the string. mstore(str, 0) // Cache the end of the memory to calculate the length later. let end := str // We write the string from rightmost digit to leftmost digit. // The following is essentially a do-while loop that also handles the zero case. // prettier-ignore for { let temp := value } 1 {} { str := sub(str, 1) // Write the character to the pointer. // The ASCII index of the '0' character is 48. mstore8(str, add(48, mod(temp, 10))) // Keep dividing `temp` until zero. temp := div(temp, 10) // prettier-ignore if iszero(temp) { break } } let length := sub(end, str) // Move the pointer 32 bytes leftwards to make room for the length. str := sub(str, 0x20) // Store the length. mstore(str, length) } } } // File: @openzeppelin/contracts/security/ReentrancyGuard.sol // OpenZeppelin Contracts (last updated v4.9.0) (security/ReentrancyGuard.sol) pragma solidity ^0.8.0; /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ abstract contract ReentrancyGuard { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; constructor() { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and making it call a * `private` function that does the actual work. */ modifier nonReentrant() { _nonReentrantBefore(); _; _nonReentrantAfter(); } function _nonReentrantBefore() private { // On the first call to nonReentrant, _status will be _NOT_ENTERED require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; } function _nonReentrantAfter() private { // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } /** * @dev Returns true if the reentrancy guard is currently set to "entered", which indicates there is a * `nonReentrant` function in the call stack. */ function _reentrancyGuardEntered() internal view returns (bool) { return _status == _ENTERED; } } // File: @openzeppelin/contracts/token/ERC20/IERC20.sol // OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/IERC20.sol) pragma solidity ^0.8.20; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); /** * @dev Returns the value of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the value of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves a `value` amount of tokens from the caller's account to `to`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address to, uint256 value) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets a `value` amount of tokens as the allowance of `spender` over the * caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 value) external returns (bool); /** * @dev Moves a `value` amount of tokens from `from` to `to` using the * allowance mechanism. `value` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom(address from, address to, uint256 value) external returns (bool); } // File: @openzeppelin/contracts/utils/math/SafeMath.sol // OpenZeppelin Contracts (last updated v4.9.0) (utils/math/SafeMath.sol) pragma solidity ^0.8.0; // CAUTION // This version of SafeMath should only be used with Solidity 0.8 or later, // because it relies on the compiler's built in overflow checks. /** * @dev Wrappers over Solidity's arithmetic operations. * * NOTE: `SafeMath` is generally not needed starting with Solidity 0.8, since the compiler * now has built in overflow checking. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { uint256 c = a + b; if (c < a) return (false, 0); return (true, c); } } /** * @dev Returns the subtraction of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b > a) return (false, 0); return (true, a - b); } } /** * @dev Returns the multiplication of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) return (true, 0); uint256 c = a * b; if (c / a != b) return (false, 0); return (true, c); } } /** * @dev Returns the division of two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a / b); } } /** * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a % b); } } /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { return a + b; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { return a - b; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { return a * b; } /** * @dev Returns the integer division of two unsigned integers, reverting on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { return a / b; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { return a % b; } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {trySub}. * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { unchecked { require(b <= a, errorMessage); return a - b; } } /** * @dev Returns the integer division of two unsigned integers, reverting with custom message on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a / b; } } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting with custom message when dividing by zero. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryMod}. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a % b; } } } // File: @openzeppelin/contracts/utils/math/SignedMath.sol // OpenZeppelin Contracts (last updated v5.0.0) (utils/math/SignedMath.sol) pragma solidity ^0.8.20; /** * @dev Standard signed math utilities missing in the Solidity language. */ library SignedMath { /** * @dev Returns the largest of two signed numbers. */ function max(int256 a, int256 b) internal pure returns (int256) { return a > b ? a : b; } /** * @dev Returns the smallest of two signed numbers. */ function min(int256 a, int256 b) internal pure returns (int256) { return a < b ? a : b; } /** * @dev Returns the average of two signed numbers without overflow. * The result is rounded towards zero. */ function average(int256 a, int256 b) internal pure returns (int256) { // Formula from the book "Hacker's Delight" int256 x = (a & b) + ((a ^ b) >> 1); return x + (int256(uint256(x) >> 255) & (a ^ b)); } /** * @dev Returns the absolute unsigned value of a signed value. */ function abs(int256 n) internal pure returns (uint256) { unchecked { // must be unchecked in order to support `n = type(int256).min` return uint256(n >= 0 ? n : -n); } } } // File: @openzeppelin/contracts/utils/math/Math.sol // OpenZeppelin Contracts (last updated v5.0.0) (utils/math/Math.sol) pragma solidity ^0.8.20; /** * @dev Standard math utilities missing in the Solidity language. */ library Math { /** * @dev Muldiv operation overflow. */ error MathOverflowedMulDiv(); enum Rounding { Floor, // Toward negative infinity Ceil, // Toward positive infinity Trunc, // Toward zero Expand // Away from zero } /** * @dev Returns the addition of two unsigned integers, with an overflow flag. */ function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { uint256 c = a + b; if (c < a) return (false, 0); return (true, c); } } /** * @dev Returns the subtraction of two unsigned integers, with an overflow flag. */ function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b > a) return (false, 0); return (true, a - b); } } /** * @dev Returns the multiplication of two unsigned integers, with an overflow flag. */ function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) return (true, 0); uint256 c = a * b; if (c / a != b) return (false, 0); return (true, c); } } /** * @dev Returns the division of two unsigned integers, with a division by zero flag. */ function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a / b); } } /** * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag. */ function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a % b); } } /** * @dev Returns the largest of two numbers. */ function max(uint256 a, uint256 b) internal pure returns (uint256) { return a > b ? a : b; } /** * @dev Returns the smallest of two numbers. */ function min(uint256 a, uint256 b) internal pure returns (uint256) { return a < b ? a : b; } /** * @dev Returns the average of two numbers. The result is rounded towards * zero. */ function average(uint256 a, uint256 b) internal pure returns (uint256) { // (a + b) / 2 can overflow. return (a & b) + (a ^ b) / 2; } /** * @dev Returns the ceiling of the division of two numbers. * * This differs from standard division with `/` in that it rounds towards infinity instead * of rounding towards zero. */ function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) { if (b == 0) { // Guarantee the same behavior as in a regular Solidity division. return a / b; } // (a + b - 1) / b can overflow on addition, so we distribute. return a == 0 ? 0 : (a - 1) / b + 1; } /** * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or * denominator == 0. * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv) with further edits by * Uniswap Labs also under MIT license. */ function mulDiv(uint256 x, uint256 y, uint256 denominator) internal pure returns (uint256 result) { unchecked { // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256 // variables such that product = prod1 * 2^256 + prod0. uint256 prod0 = x * y; // Least significant 256 bits of the product uint256 prod1; // Most significant 256 bits of the product assembly { let mm := mulmod(x, y, not(0)) prod1 := sub(sub(mm, prod0), lt(mm, prod0)) } // Handle non-overflow cases, 256 by 256 division. if (prod1 == 0) { // Solidity will revert if denominator == 0, unlike the div opcode on its own. // The surrounding unchecked block does not change this fact. // See https://docs.soliditylang.org/en/latest/control-structures.html#checked-or-unchecked-arithmetic. return prod0 / denominator; } // Make sure the result is less than 2^256. Also prevents denominator == 0. if (denominator <= prod1) { revert MathOverflowedMulDiv(); } /////////////////////////////////////////////// // 512 by 256 division. /////////////////////////////////////////////// // Make division exact by subtracting the remainder from [prod1 prod0]. uint256 remainder; assembly { // Compute remainder using mulmod. remainder := mulmod(x, y, denominator) // Subtract 256 bit number from 512 bit number. prod1 := sub(prod1, gt(remainder, prod0)) prod0 := sub(prod0, remainder) } // Factor powers of two out of denominator and compute largest power of two divisor of denominator. // Always >= 1. See https://cs.stackexchange.com/q/138556/92363. uint256 twos = denominator & (0 - denominator); assembly { // Divide denominator by twos. denominator := div(denominator, twos) // Divide [prod1 prod0] by twos. prod0 := div(prod0, twos) // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one. twos := add(div(sub(0, twos), twos), 1) } // Shift in bits from prod1 into prod0. prod0 |= prod1 * twos; // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for // four bits. That is, denominator * inv = 1 mod 2^4. uint256 inverse = (3 * denominator) ^ 2; // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also // works in modular arithmetic, doubling the correct bits in each step. inverse *= 2 - denominator * inverse; // inverse mod 2^8 inverse *= 2 - denominator * inverse; // inverse mod 2^16 inverse *= 2 - denominator * inverse; // inverse mod 2^32 inverse *= 2 - denominator * inverse; // inverse mod 2^64 inverse *= 2 - denominator * inverse; // inverse mod 2^128 inverse *= 2 - denominator * inverse; // inverse mod 2^256 // Because the division is now exact we can divide by multiplying with the modular inverse of denominator. // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1 // is no longer required. result = prod0 * inverse; return result; } } /** * @notice Calculates x * y / denominator with full precision, following the selected rounding direction. */ function mulDiv(uint256 x, uint256 y, uint256 denominator, Rounding rounding) internal pure returns (uint256) { uint256 result = mulDiv(x, y, denominator); if (unsignedRoundsUp(rounding) && mulmod(x, y, denominator) > 0) { result += 1; } return result; } /** * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded * towards zero. * * Inspired by Henry S. Warren, Jr.'s "Hacker's Delight" (Chapter 11). */ function sqrt(uint256 a) internal pure returns (uint256) { if (a == 0) { return 0; } // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target. // // We know that the "msb" (most significant bit) of our target number `a` is a power of 2 such that we have // `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`. // // This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)` // → `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))` // → `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)` // // Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit. uint256 result = 1 << (log2(a) >> 1); // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128, // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision // into the expected uint128 result. unchecked { result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; return min(result, a / result); } } /** * @notice Calculates sqrt(a), following the selected rounding direction. */ function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = sqrt(a); return result + (unsignedRoundsUp(rounding) && result * result < a ? 1 : 0); } } /** * @dev Return the log in base 2 of a positive value rounded towards zero. * Returns 0 if given 0. */ function log2(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >> 128 > 0) { value >>= 128; result += 128; } if (value >> 64 > 0) { value >>= 64; result += 64; } if (value >> 32 > 0) { value >>= 32; result += 32; } if (value >> 16 > 0) { value >>= 16; result += 16; } if (value >> 8 > 0) { value >>= 8; result += 8; } if (value >> 4 > 0) { value >>= 4; result += 4; } if (value >> 2 > 0) { value >>= 2; result += 2; } if (value >> 1 > 0) { result += 1; } } return result; } /** * @dev Return the log in base 2, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log2(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log2(value); return result + (unsignedRoundsUp(rounding) && 1 << result < value ? 1 : 0); } } /** * @dev Return the log in base 10 of a positive value rounded towards zero. * Returns 0 if given 0. */ function log10(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >= 10 ** 64) { value /= 10 ** 64; result += 64; } if (value >= 10 ** 32) { value /= 10 ** 32; result += 32; } if (value >= 10 ** 16) { value /= 10 ** 16; result += 16; } if (value >= 10 ** 8) { value /= 10 ** 8; result += 8; } if (value >= 10 ** 4) { value /= 10 ** 4; result += 4; } if (value >= 10 ** 2) { value /= 10 ** 2; result += 2; } if (value >= 10 ** 1) { result += 1; } } return result; } /** * @dev Return the log in base 10, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log10(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log10(value); return result + (unsignedRoundsUp(rounding) && 10 ** result < value ? 1 : 0); } } /** * @dev Return the log in base 256 of a positive value rounded towards zero. * Returns 0 if given 0. * * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string. */ function log256(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >> 128 > 0) { value >>= 128; result += 16; } if (value >> 64 > 0) { value >>= 64; result += 8; } if (value >> 32 > 0) { value >>= 32; result += 4; } if (value >> 16 > 0) { value >>= 16; result += 2; } if (value >> 8 > 0) { result += 1; } } return result; } /** * @dev Return the log in base 256, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log256(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log256(value); return result + (unsignedRoundsUp(rounding) && 1 << (result << 3) < value ? 1 : 0); } } /** * @dev Returns whether a provided rounding mode is considered rounding up for unsigned integers. */ function unsignedRoundsUp(Rounding rounding) internal pure returns (bool) { return uint8(rounding) % 2 == 1; } } // File: @openzeppelin/contracts/utils/Strings.sol // OpenZeppelin Contracts (last updated v5.0.0) (utils/Strings.sol) pragma solidity ^0.8.20; /** * @dev String operations. */ library Strings { bytes16 private constant HEX_DIGITS = "0123456789abcdef"; uint8 private constant ADDRESS_LENGTH = 20; /** * @dev The `value` string doesn't fit in the specified `length`. */ error StringsInsufficientHexLength(uint256 value, uint256 length); /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { unchecked { uint256 length = Math.log10(value) + 1; string memory buffer = new string(length); uint256 ptr; /// @solidity memory-safe-assembly assembly { ptr := add(buffer, add(32, length)) } while (true) { ptr--; /// @solidity memory-safe-assembly assembly { mstore8(ptr, byte(mod(value, 10), HEX_DIGITS)) } value /= 10; if (value == 0) break; } return buffer; } } /** * @dev Converts a `int256` to its ASCII `string` decimal representation. */ function toStringSigned(int256 value) internal pure returns (string memory) { return string.concat(value < 0 ? "-" : "", toString(SignedMath.abs(value))); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { unchecked { return toHexString(value, Math.log256(value) + 1); } } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { uint256 localValue = value; 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_DIGITS[localValue & 0xf]; localValue >>= 4; } if (localValue != 0) { revert StringsInsufficientHexLength(value, length); } return string(buffer); } /** * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal * representation. */ function toHexString(address addr) internal pure returns (string memory) { return toHexString(uint256(uint160(addr)), ADDRESS_LENGTH); } /** * @dev Returns true if the two strings are equal. */ function equal(string memory a, string memory b) internal pure returns (bool) { return bytes(a).length == bytes(b).length && keccak256(bytes(a)) == keccak256(bytes(b)); } } // File: @openzeppelin/contracts/utils/Context.sol // OpenZeppelin Contracts (last updated v5.0.0) (utils/Context.sol) pragma solidity ^0.8.20; /** * @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 v5.0.0) (access/Ownable.sol) pragma solidity ^0.8.20; /** * @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. * * The initial owner is set to the address provided by the deployer. 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; /** * @dev The caller account is not authorized to perform an operation. */ error OwnableUnauthorizedAccount(address account); /** * @dev The owner is not a valid owner account. (eg. `address(0)`) */ error OwnableInvalidOwner(address owner); event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the address provided by the deployer as the initial owner. */ constructor(address initialOwner) { if (initialOwner == address(0)) { revert OwnableInvalidOwner(address(0)); } _transferOwnership(initialOwner); } /** * @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 { if (owner() != _msgSender()) { revert OwnableUnauthorizedAccount(_msgSender()); } } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby disabling 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 { if (newOwner == address(0)) { revert OwnableInvalidOwner(address(0)); } _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: PREMECuddleBuddies.sol pragma solidity >=0.8.9 <0.9.0; contract PREMECuddleBuddies is ERC721A, Ownable, ReentrancyGuard{ using Strings for uint256; using SafeMath for uint256; uint256 public SaleStartTimestamp; uint256 public MaxNFTSupply = 300; uint256 public maxMintAmountPerTx; uint256 public NameChangePrice; // in WEI uint256 public NameChangePriceETH; // in WEI uint256 public cost; // in WEI uint256 public percentage; // 50 = 50% address payoutaddress1; address payoutaddress2; address public Moderator; address public burnaddress; IERC20 public burntoken; string public uriPrefix = ''; string public uriSuffix = '.json'; string public hiddenMetadataUri; bool public revealed = false; mapping (uint256 => string) private _tokenName; mapping (string => bool) private _nameReserved; event NameChange (uint256 indexed NFTIndex, string newName); modifier onlyModerator() { require(msg.sender == Moderator, "Caller is not the Moderator"); _;} modifier mintCompliance(uint256 _mintAmount) { require(totalSupply() + _mintAmount <= MaxNFTSupply, 'Max supply exceeded!'); _;} modifier mintPriceCompliance(uint256 _mintAmount) { require(msg.value >= cost * _mintAmount, 'Insufficient funds!'); _;} modifier changeNameCompliance(uint256 tokenId, string memory newName) { address owner = ownerOf(tokenId); require(_msgSender() == owner, "ERC721: caller is not the owner"); require(validateName(newName) == true, "Not a valid new name"); require(sha256(bytes(newName)) != sha256(bytes(_tokenName[tokenId])), "New name is same as the current one"); require(isNameReserved(newName) == false, "Name already reserved"); _;} modifier changeNamePriceETHCompliance() { require(msg.value >= NameChangePriceETH, 'Insufficient funds!'); _;} constructor( address initialOwner, string memory name, string memory symbol, uint256 _cost, // in Wei uint256 _maxMintAmountPerTx, string memory _hiddenMetadataUri, uint256 _SaleStartTimestamp, uint256 _NameChangePrice, // in WEI uint256 _NameChangePriceETH, // in WEI address _burnaddress, address _burntokenaddress) ERC721A(name, symbol) Ownable(initialOwner) { Moderator = initialOwner; payoutaddress1 = initialOwner; payoutaddress2 = initialOwner; cost = _cost; maxMintAmountPerTx = _maxMintAmountPerTx; hiddenMetadataUri = _hiddenMetadataUri; SaleStartTimestamp = _SaleStartTimestamp; NameChangePrice = _NameChangePrice; NameChangePriceETH = _NameChangePriceETH; burnaddress = _burnaddress; burntoken = IERC20(_burntokenaddress); } /** * Change sale start time */ function setSaleStartTimestamp(uint256 _SaleStartTimestamp) public onlyOwner { SaleStartTimestamp = _SaleStartTimestamp;} /** * Change max mint amount */ function setMaxMintAmountPerTx(uint256 _maxMintAmountPerTx) public onlyOwner { maxMintAmountPerTx = _maxMintAmountPerTx;} /** * Change mint price */ function setMintPrice(uint256 _MintPrice) public onlyOwner { cost = _MintPrice;} /** * Mint NFT */ function mint(uint256 _mintAmount) public payable mintCompliance(_mintAmount) mintPriceCompliance(_mintAmount) { require(block.timestamp >= SaleStartTimestamp, "Sale has not started"); require(_mintAmount > 0 && _mintAmount <= maxMintAmountPerTx, 'Invalid mint amount!'); _safeMint(_msgSender(), _mintAmount);} function mintForAddress(uint256 _mintAmount, address _receiver) public mintCompliance(_mintAmount) onlyOwner { _safeMint(_receiver, _mintAmount);} function _startTokenId() internal view virtual override returns (uint256) { return 1;} /** * Uri settings */ function _baseURI() internal view virtual override returns (string memory) { return uriPrefix;} function tokenURI(uint256 _tokenId) public view virtual override returns (string memory) { require(_exists(_tokenId), 'ERC721Metadata: URI query for nonexistent token'); if (revealed == false) { return hiddenMetadataUri;} string memory currentBaseURI = _baseURI(); return bytes(currentBaseURI).length > 0 ? string(abi.encodePacked(currentBaseURI, _tokenId.toString(), uriSuffix)) : '';} function setHiddenMetadataUri(string memory _hiddenMetadataUri) public onlyOwner { hiddenMetadataUri = _hiddenMetadataUri;} function setUriPrefix(string memory _uriPrefix) public onlyModerator { uriPrefix = _uriPrefix;} function setUriSuffix(string memory _uriSuffix) public onlyOwner { uriSuffix = _uriSuffix;} /** * Set reveal status */ function setRevealed(bool _state) public onlyOwner { revealed = _state;} /* * Change Moderator */ function changeModerator(address _Moderator) public onlyOwner { Moderator = _Moderator;} /** * Changes the name for CuddleBuddies tokenId */ function changeName(uint256 tokenId, string memory newName) external changeNameCompliance(tokenId, newName) { burntoken.transferFrom(msg.sender,burnaddress, NameChangePrice); // If already named, dereserve old name if (bytes(_tokenName[tokenId]).length > 0) { toggleReserveName(_tokenName[tokenId], false);} toggleReserveName(newName, true); _tokenName[tokenId] = newName; emit NameChange(tokenId, newName);} function changeNameETH(uint256 tokenId, string memory newName) public payable changeNameCompliance(tokenId, newName) changeNamePriceETHCompliance{ // If already named, dereserve old name if (bytes(_tokenName[tokenId]).length > 0) { toggleReserveName(_tokenName[tokenId], false);} toggleReserveName(newName, true); _tokenName[tokenId] = newName; emit NameChange(tokenId, newName);} function changeNameDev(uint256 tokenId, string memory newName) public changeNameCompliance(tokenId, newName) onlyOwner{ // If already named, dereserve old name if (bytes(_tokenName[tokenId]).length > 0) { toggleReserveName(_tokenName[tokenId], false);} toggleReserveName(newName, true); _tokenName[tokenId] = newName; emit NameChange(tokenId, newName);} /** * Change name change price */ function setNameChangePrice(uint256 _NameChangePrice) public onlyOwner { NameChangePrice = _NameChangePrice;} function setNameChangePriceETH(uint256 _NameChangePriceETH) public onlyOwner { NameChangePriceETH = _NameChangePriceETH;} /** * Returns name of the NFT at index. */ function tokenNameByIndex(uint256 index) public view returns (string memory) { return _tokenName[index];} /** * Returns if the name has been reserved. */ function isNameReserved(string memory nameString) public view returns (bool) { return _nameReserved[toLower(nameString)];} /** * Reserves the name if isReserve is set to true, de-reserves if set to false */ function toggleReserveName(string memory str, bool isReserve) internal { _nameReserved[toLower(str)] = isReserve;} /** * Check if the name string is valid (Alphanumeric and spaces without leading or trailing space) */ function validateName(string memory str) public pure returns (bool){ bytes memory b = bytes(str); if(b.length < 1) return false; if(b.length > 25) return false; // Cannot be longer than 25 characters if(b[0] == 0x20) return false; // Leading space if (b[b.length - 1] == 0x20) return false; // Trailing space bytes1 lastChar = b[0]; for(uint i; i<b.length; i++){ bytes1 char = b[i]; if (char == 0x20 && lastChar == 0x20) return false; // Cannot contain continous spaces if ( !(char >= 0x30 && char <= 0x39) && //9-0 !(char >= 0x41 && char <= 0x5A) && //A-Z !(char >= 0x61 && char <= 0x7A) && //a-z !(char == 0x20) //space ) return false; lastChar = char;} return true;} /** * Converts the string to lowercase */ function toLower(string memory str) public pure returns (string memory){ bytes memory bStr = bytes(str); bytes memory bLower = new bytes(bStr.length); for (uint i = 0; i < bStr.length; i++) { // Uppercase character if ((uint8(bStr[i]) >= 65) && (uint8(bStr[i]) <= 90)) { bLower[i] = bytes1(uint8(bStr[i]) + 32); } else { bLower[i] = bStr[i];}} return string(bLower);} /** * Change burn settings */ function setBurnaddress(address _burnaddress) public onlyOwner { burnaddress = _burnaddress;} function setBurntoken(address _burntokenaddress) public onlyOwner { burntoken = IERC20(_burntokenaddress);} /** * Withdraw settings */ function setPercentage(uint256 _percentage) public onlyOwner { percentage = _percentage;} function setPayoutaddress1(address _payoutaddress1) public onlyOwner { payoutaddress1 = _payoutaddress1;} function setPayoutaddress2(address _payoutaddress2) public onlyOwner { payoutaddress2 = _payoutaddress2;} function withdraw() public onlyOwner nonReentrant { // This will send a specific percentage to payoutaddress1. (bool hs, ) = payable(payoutaddress1).call{value: address(this).balance * percentage / 100}(''); require(hs); // This will transfer the remaining contract balance to payoutaddress2. (bool os, ) = payable(payoutaddress2).call{value: address(this).balance}(''); require(os);} }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"initialOwner","type":"address"},{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"symbol","type":"string"},{"internalType":"uint256","name":"_cost","type":"uint256"},{"internalType":"uint256","name":"_maxMintAmountPerTx","type":"uint256"},{"internalType":"string","name":"_hiddenMetadataUri","type":"string"},{"internalType":"uint256","name":"_SaleStartTimestamp","type":"uint256"},{"internalType":"uint256","name":"_NameChangePrice","type":"uint256"},{"internalType":"uint256","name":"_NameChangePriceETH","type":"uint256"},{"internalType":"address","name":"_burnaddress","type":"address"},{"internalType":"address","name":"_burntokenaddress","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintERC2309QuantityExceedsLimit","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"OwnableInvalidOwner","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"OwnableUnauthorizedAccount","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":"uint256","name":"NFTIndex","type":"uint256"},{"indexed":false,"internalType":"string","name":"newName","type":"string"}],"name":"NameChange","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"MaxNFTSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"Moderator","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"NameChangePrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"NameChangePriceETH","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SaleStartTimestamp","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":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"burnaddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"burntoken","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_Moderator","type":"address"}],"name":"changeModerator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"string","name":"newName","type":"string"}],"name":"changeName","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"string","name":"newName","type":"string"}],"name":"changeNameDev","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"string","name":"newName","type":"string"}],"name":"changeNameETH","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"cost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"hiddenMetadataUri","outputs":[{"internalType":"string","name":"","type":"string"}],"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":"string","name":"nameString","type":"string"}],"name":"isNameReserved","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxMintAmountPerTx","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"},{"internalType":"address","name":"_receiver","type":"address"}],"name":"mintForAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"percentage","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"revealed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_burnaddress","type":"address"}],"name":"setBurnaddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_burntokenaddress","type":"address"}],"name":"setBurntoken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_hiddenMetadataUri","type":"string"}],"name":"setHiddenMetadataUri","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxMintAmountPerTx","type":"uint256"}],"name":"setMaxMintAmountPerTx","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_MintPrice","type":"uint256"}],"name":"setMintPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_NameChangePrice","type":"uint256"}],"name":"setNameChangePrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_NameChangePriceETH","type":"uint256"}],"name":"setNameChangePriceETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_payoutaddress1","type":"address"}],"name":"setPayoutaddress1","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_payoutaddress2","type":"address"}],"name":"setPayoutaddress2","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_percentage","type":"uint256"}],"name":"setPercentage","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"setRevealed","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_SaleStartTimestamp","type":"uint256"}],"name":"setSaleStartTimestamp","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_uriPrefix","type":"string"}],"name":"setUriPrefix","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_uriSuffix","type":"string"}],"name":"setUriSuffix","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"str","type":"string"}],"name":"toLower","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenNameByIndex","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"uriPrefix","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uriSuffix","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"str","type":"string"}],"name":"validateName","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
608060405261012c600b5560405180602001604052805f815250601690816200002991906200063c565b506040518060400160405280600581526020017f2e6a736f6e000000000000000000000000000000000000000000000000000000815250601790816200007091906200063c565b505f60195f6101000a81548160ff02191690831515021790555034801562000096575f80fd5b5060405162005aa438038062005aa48339818101604052810190620000bc919062000908565b8a8a8a8160029081620000d091906200063c565b508060039081620000e291906200063c565b50620000f36200030d60201b60201c565b5f8190555050505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036200016d575f6040517f1e4fbdf700000000000000000000000000000000000000000000000000000000815260040162000164919062000a7c565b60405180910390fd5b6200017e816200031560201b60201c565b5060016009819055508a60135f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508a60115f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508a60125f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555087600f8190555086600c8190555085601890816200026691906200063c565b5084600a8190555083600d8190555082600e819055508160145f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508060155f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550505050505050505050505062000a97565b5f6001905090565b5f60085f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508160085f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b5f81519050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f60028204905060018216806200045457607f821691505b6020821081036200046a57620004696200040f565b5b50919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f60088302620004ce7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8262000491565b620004da868362000491565b95508019841693508086168417925050509392505050565b5f819050919050565b5f819050919050565b5f620005246200051e6200051884620004f2565b620004fb565b620004f2565b9050919050565b5f819050919050565b6200053f8362000504565b620005576200054e826200052b565b8484546200049d565b825550505050565b5f90565b6200056d6200055f565b6200057a81848462000534565b505050565b5b81811015620005a157620005955f8262000563565b60018101905062000580565b5050565b601f821115620005f057620005ba8162000470565b620005c58462000482565b81016020851015620005d5578190505b620005ed620005e48562000482565b8301826200057f565b50505b505050565b5f82821c905092915050565b5f620006125f1984600802620005f5565b1980831691505092915050565b5f6200062c838362000601565b9150826002028217905092915050565b6200064782620003d8565b67ffffffffffffffff811115620006635762000662620003e2565b5b6200066f82546200043c565b6200067c828285620005a5565b5f60209050601f831160018114620006b2575f84156200069d578287015190505b620006a985826200061f565b86555062000718565b601f198416620006c28662000470565b5f5b82811015620006eb57848901518255600182019150602085019450602081019050620006c4565b868310156200070b578489015162000707601f89168262000601565b8355505b6001600288020188555050505b505050505050565b5f604051905090565b5f80fd5b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6200075c8262000731565b9050919050565b6200076e8162000750565b811462000779575f80fd5b50565b5f815190506200078c8162000763565b92915050565b5f80fd5b5f80fd5b5f601f19601f8301169050919050565b620007b5826200079a565b810181811067ffffffffffffffff82111715620007d757620007d6620003e2565b5b80604052505050565b5f620007eb62000720565b9050620007f98282620007aa565b919050565b5f67ffffffffffffffff8211156200081b576200081a620003e2565b5b62000826826200079a565b9050602081019050919050565b5f5b838110156200085257808201518184015260208101905062000835565b5f8484015250505050565b5f620008736200086d84620007fe565b620007e0565b90508281526020810184848401111562000892576200089162000796565b5b6200089f84828562000833565b509392505050565b5f82601f830112620008be57620008bd62000792565b5b8151620008d08482602086016200085d565b91505092915050565b620008e481620004f2565b8114620008ef575f80fd5b50565b5f815190506200090281620008d9565b92915050565b5f805f805f805f805f805f6101608c8e0312156200092b576200092a62000729565b5b5f6200093a8e828f016200077c565b9b505060208c015167ffffffffffffffff8111156200095e576200095d6200072d565b5b6200096c8e828f01620008a7565b9a505060408c015167ffffffffffffffff81111562000990576200098f6200072d565b5b6200099e8e828f01620008a7565b9950506060620009b18e828f01620008f2565b9850506080620009c48e828f01620008f2565b97505060a08c015167ffffffffffffffff811115620009e857620009e76200072d565b5b620009f68e828f01620008a7565b96505060c062000a098e828f01620008f2565b95505060e062000a1c8e828f01620008f2565b94505061010062000a308e828f01620008f2565b93505061012062000a448e828f016200077c565b92505061014062000a588e828f016200077c565b9150509295989b509295989b9093969950565b62000a768162000750565b82525050565b5f60208201905062000a915f83018462000a6b565b92915050565b614fff8062000aa55f395ff3fe60806040526004361061036a575f3560e01c80637ec4a659116101c5578063b071401b116100f6578063d8a7de1e11610094578063e985e9c51161006e578063e985e9c514610bfa578063efbd73f414610c36578063f2fde38b14610c5e578063f4a0a52814610c865761036a565b8063d8a7de1e14610b7e578063e0a8085314610ba8578063e5c5f1d514610bd05761036a565b8063b8c489e1116100d0578063b8c489e114610ac8578063c39cbef114610af0578063c78ad77f14610b18578063c87b56dd14610b425761036a565b8063b071401b14610a5a578063b42f0fb814610a82578063b88d4fde14610aac5761036a565b806395d89b4111610163578063a0712d681161013d578063a0712d68146109c2578063a22cb465146109de578063a45ba8e714610a06578063a675ca2f14610a305761036a565b806395d89b411461093257806399b1755b1461095c5780639ffdb65a146109865761036a565b80638c0f66db1161019f5780638c0f66db1461087a5780638da5cb5b146108a25780639416b423146108cc57806394354fd0146109085761036a565b80637ec4a6591461080e5780637ec7e7a41461083657806384a1b902146108525761036a565b8063466429211161029f57806362b99ad41161023d5780636bf8a5f6116102175780636bf8a5f6146107565780636d5224181461078057806370a08231146107bc578063715018a6146107f85761036a565b806362b99ad4146106c85780636352211e146106f257806365657c411461072e5761036a565b806354c6191d1161027957806354c6191d146106245780635503a0e81461064e57806355c8d840146106785780635da4a1d3146106a05761036a565b806346642921146105aa5780634fdd43cb146105d257806351830227146105fa5761036a565b806318160ddd1161030c5780633ccfd60b116102e65780633ccfd60b146105285780633db82fb51461053e5780633ebee8f51461056657806342842e0e1461058e5761036a565b806318160ddd146104ba57806323b872dd146104e457806332744e3a146105005761036a565b8063095ea7b311610348578063095ea7b31461041057806313faede61461042c57806315b56d101461045657806316ba10e0146104925761036a565b806301ffc9a71461036e57806306fdde03146103aa578063081812fc146103d4575b5f80fd5b348015610379575f80fd5b50610394600480360381019061038f9190613b94565b610cae565b6040516103a19190613bd9565b60405180910390f35b3480156103b5575f80fd5b506103be610d3f565b6040516103cb9190613c7c565b60405180910390f35b3480156103df575f80fd5b506103fa60048036038101906103f59190613ccf565b610dcf565b6040516104079190613d39565b60405180910390f35b61042a60048036038101906104259190613d7c565b610e49565b005b348015610437575f80fd5b50610440610f88565b60405161044d9190613dc9565b60405180910390f35b348015610461575f80fd5b5061047c60048036038101906104779190613f0e565b610f8e565b6040516104899190613bd9565b60405180910390f35b34801561049d575f80fd5b506104b860048036038101906104b39190613f0e565b610fc9565b005b3480156104c5575f80fd5b506104ce610fe4565b6040516104db9190613dc9565b60405180910390f35b6104fe60048036038101906104f99190613f55565b610ff9565b005b34801561050b575f80fd5b5061052660048036038101906105219190613fa5565b611307565b005b348015610533575f80fd5b5061053c611352565b005b348015610549575f80fd5b50610564600480360381019061055f9190613ccf565b6114ab565b005b348015610571575f80fd5b5061058c60048036038101906105879190613fa5565b6114bd565b005b6105a860048036038101906105a39190613f55565b611508565b005b3480156105b5575f80fd5b506105d060048036038101906105cb9190613fa5565b611527565b005b3480156105dd575f80fd5b506105f860048036038101906105f39190613f0e565b611572565b005b348015610605575f80fd5b5061060e61158d565b60405161061b9190613bd9565b60405180910390f35b34801561062f575f80fd5b5061063861159f565b6040516106459190613dc9565b60405180910390f35b348015610659575f80fd5b506106626115a5565b60405161066f9190613c7c565b60405180910390f35b348015610683575f80fd5b5061069e60048036038101906106999190613fa5565b611631565b005b3480156106ab575f80fd5b506106c660048036038101906106c19190613ccf565b61167c565b005b3480156106d3575f80fd5b506106dc61168e565b6040516106e99190613c7c565b60405180910390f35b3480156106fd575f80fd5b5061071860048036038101906107139190613ccf565b61171a565b6040516107259190613d39565b60405180910390f35b348015610739575f80fd5b50610754600480360381019061074f9190613fd0565b61172b565b005b348015610761575f80fd5b5061076a611a6f565b6040516107779190613d39565b60405180910390f35b34801561078b575f80fd5b506107a660048036038101906107a19190613ccf565b611a94565b6040516107b39190613c7c565b60405180910390f35b3480156107c7575f80fd5b506107e260048036038101906107dd9190613fa5565b611b35565b6040516107ef9190613dc9565b60405180910390f35b348015610803575f80fd5b5061080c611bea565b005b348015610819575f80fd5b50610834600480360381019061082f9190613f0e565b611bfd565b005b610850600480360381019061084b9190613fd0565b611c9f565b005b34801561085d575f80fd5b5061087860048036038101906108739190613ccf565b612020565b005b348015610885575f80fd5b506108a0600480360381019061089b9190613fa5565b612032565b005b3480156108ad575f80fd5b506108b661207d565b6040516108c39190613d39565b60405180910390f35b3480156108d7575f80fd5b506108f260048036038101906108ed9190613f0e565b6120a5565b6040516108ff9190613c7c565b60405180910390f35b348015610913575f80fd5b5061091c612252565b6040516109299190613dc9565b60405180910390f35b34801561093d575f80fd5b50610946612258565b6040516109539190613c7c565b60405180910390f35b348015610967575f80fd5b506109706122e8565b60405161097d9190613dc9565b60405180910390f35b348015610991575f80fd5b506109ac60048036038101906109a79190613f0e565b6122ee565b6040516109b99190613bd9565b60405180910390f35b6109dc60048036038101906109d79190613ccf565b61260c565b005b3480156109e9575f80fd5b50610a0460048036038101906109ff9190614054565b612760565b005b348015610a11575f80fd5b50610a1a612866565b604051610a279190613c7c565b60405180910390f35b348015610a3b575f80fd5b50610a446128f2565b604051610a519190613dc9565b60405180910390f35b348015610a65575f80fd5b50610a806004803603810190610a7b9190613ccf565b6128f8565b005b348015610a8d575f80fd5b50610a9661290a565b604051610aa391906140ed565b60405180910390f35b610ac66004803603810190610ac191906141a4565b61292f565b005b348015610ad3575f80fd5b50610aee6004803603810190610ae99190613ccf565b6129a1565b005b348015610afb575f80fd5b50610b166004803603810190610b119190613fd0565b6129b3565b005b348015610b23575f80fd5b50610b2c612db1565b604051610b399190613dc9565b60405180910390f35b348015610b4d575f80fd5b50610b686004803603810190610b639190613ccf565b612db7565b604051610b759190613c7c565b60405180910390f35b348015610b89575f80fd5b50610b92612f08565b604051610b9f9190613dc9565b60405180910390f35b348015610bb3575f80fd5b50610bce6004803603810190610bc99190614224565b612f0e565b005b348015610bdb575f80fd5b50610be4612f32565b604051610bf19190613d39565b60405180910390f35b348015610c05575f80fd5b50610c206004803603810190610c1b919061424f565b612f57565b604051610c2d9190613bd9565b60405180910390f35b348015610c41575f80fd5b50610c5c6004803603810190610c57919061428d565b612fe5565b005b348015610c69575f80fd5b50610c846004803603810190610c7f9190613fa5565b613054565b005b348015610c91575f80fd5b50610cac6004803603810190610ca79190613ccf565b6130d8565b005b5f6301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610d0857506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610d385750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b606060028054610d4e906142f8565b80601f0160208091040260200160405190810160405280929190818152602001828054610d7a906142f8565b8015610dc55780601f10610d9c57610100808354040283529160200191610dc5565b820191905f5260205f20905b815481529060010190602001808311610da857829003601f168201915b5050505050905090565b5f610dd9826130ea565b610e0f576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60065f8381526020019081526020015f205f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b5f610e538261171a565b90508073ffffffffffffffffffffffffffffffffffffffff16610e74613144565b73ffffffffffffffffffffffffffffffffffffffff1614610ed757610ea081610e9b613144565b612f57565b610ed6576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b8260065f8481526020019081526020015f205f015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b600f5481565b5f601b610f9a836120a5565b604051610fa79190614362565b90815260200160405180910390205f9054906101000a900460ff169050919050565b610fd161314b565b8060179081610fe0919061450c565b5050565b5f610fed6131d2565b6001545f540303905090565b5f611003826131da565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161461106a576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f806110758461329d565b9150915061108b8187611086613144565b6132c0565b6110d7576110a08661109b613144565b612f57565b6110d6576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b5f73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff160361113c576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6111498686866001613303565b8015611153575f82555b60055f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8154600190039190508190555060055f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f81546001019190508190555061121b856111f7888887613309565b7c020000000000000000000000000000000000000000000000000000000017613330565b60045f8681526020019081526020015f20819055505f7c0200000000000000000000000000000000000000000000000000000000841603611297575f6001850190505f60045f8381526020019081526020015f205403611295575f548114611294578360045f8381526020019081526020015f20819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46112ff868686600161335a565b505050505050565b61130f61314b565b8060155f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b61135a61314b565b611362613360565b5f60115f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166064601054476113ab9190614608565b6113b59190614676565b6040516113c1906146d3565b5f6040518083038185875af1925050503d805f81146113fb576040519150601f19603f3d011682016040523d82523d5f602084013e611400565b606091505b505090508061140d575f80fd5b5f60125f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1647604051611453906146d3565b5f6040518083038185875af1925050503d805f811461148d576040519150601f19603f3d011682016040523d82523d5f602084013e611492565b606091505b505090508061149f575f80fd5b50506114a96133af565b565b6114b361314b565b80600a8190555050565b6114c561314b565b8060115f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b61152283838360405180602001604052805f81525061292f565b505050565b61152f61314b565b8060135f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b61157a61314b565b8060189081611589919061450c565b5050565b60195f9054906101000a900460ff1681565b600b5481565b601780546115b2906142f8565b80601f01602080910402602001604051908101604052809291908181526020018280546115de906142f8565b80156116295780601f1061160057610100808354040283529160200191611629565b820191905f5260205f20905b81548152906001019060200180831161160c57829003601f168201915b505050505081565b61163961314b565b8060125f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b61168461314b565b8060108190555050565b6016805461169b906142f8565b80601f01602080910402602001604051908101604052809291908181526020018280546116c7906142f8565b80156117125780601f106116e957610100808354040283529160200191611712565b820191905f5260205f20905b8154815290600101906020018083116116f557829003601f168201915b505050505081565b5f611724826131da565b9050919050565b81815f6117378361171a565b90508073ffffffffffffffffffffffffffffffffffffffff166117586133b9565b73ffffffffffffffffffffffffffffffffffffffff16146117ae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117a590614731565b60405180910390fd5b600115156117bb836122ee565b1515146117fd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117f490614799565b60405180910390fd5b6002601a5f8581526020019081526020015f2060405161181d9190614849565b602060405180830381855afa158015611838573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061185b9190614892565b60028360405161186b91906148f7565b602060405180830381855afa158015611886573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906118a99190614892565b036118e9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118e09061497d565b60405180910390fd5b5f15156118f583610f8e565b151514611937576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161192e906149e5565b60405180910390fd5b61193f61314b565b5f601a5f8781526020019081526020015f20805461195c906142f8565b90501115611a0657611a05601a5f8781526020019081526020015f208054611983906142f8565b80601f01602080910402602001604051908101604052809291908181526020018280546119af906142f8565b80156119fa5780601f106119d1576101008083540402835291602001916119fa565b820191905f5260205f20905b8154815290600101906020018083116119dd57829003601f168201915b50505050505f6133c0565b5b611a118460016133c0565b83601a5f8781526020019081526020015f209081611a2f919061450c565b50847f7e632a301794d8d4a81ea7e20f37d1947158d36e66403af04ba85dd194b66f1b85604051611a609190613c7c565b60405180910390a25050505050565b60135f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6060601a5f8381526020019081526020015f208054611ab2906142f8565b80601f0160208091040260200160405190810160405280929190818152602001828054611ade906142f8565b8015611b295780601f10611b0057610100808354040283529160200191611b29565b820191905f5260205f20905b815481529060010190602001808311611b0c57829003601f168201915b50505050509050919050565b5f8073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611b9b576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff60055f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054169050919050565b611bf261314b565b611bfb5f613401565b565b60135f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611c8c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c8390614a4d565b60405180910390fd5b8060169081611c9b919061450c565b5050565b81815f611cab8361171a565b90508073ffffffffffffffffffffffffffffffffffffffff16611ccc6133b9565b73ffffffffffffffffffffffffffffffffffffffff1614611d22576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d1990614731565b60405180910390fd5b60011515611d2f836122ee565b151514611d71576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d6890614799565b60405180910390fd5b6002601a5f8581526020019081526020015f20604051611d919190614849565b602060405180830381855afa158015611dac573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190611dcf9190614892565b600283604051611ddf91906148f7565b602060405180830381855afa158015611dfa573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190611e1d9190614892565b03611e5d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e549061497d565b60405180910390fd5b5f1515611e6983610f8e565b151514611eab576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ea2906149e5565b60405180910390fd5b600e54341015611ef0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ee790614ab5565b60405180910390fd5b5f601a5f8781526020019081526020015f208054611f0d906142f8565b90501115611fb757611fb6601a5f8781526020019081526020015f208054611f34906142f8565b80601f0160208091040260200160405190810160405280929190818152602001828054611f60906142f8565b8015611fab5780601f10611f8257610100808354040283529160200191611fab565b820191905f5260205f20905b815481529060010190602001808311611f8e57829003601f168201915b50505050505f6133c0565b5b611fc28460016133c0565b83601a5f8781526020019081526020015f209081611fe0919061450c565b50847f7e632a301794d8d4a81ea7e20f37d1947158d36e66403af04ba85dd194b66f1b856040516120119190613c7c565b60405180910390a25050505050565b61202861314b565b80600d8190555050565b61203a61314b565b8060145f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b5f60085f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60605f8290505f815167ffffffffffffffff8111156120c7576120c6613dea565b5b6040519080825280601f01601f1916602001820160405280156120f95781602001600182028036833780820191505090505b5090505f5b825181101561224757604183828151811061211c5761211b614ad3565b5b602001015160f81c60f81b60f81c60ff161015801561215f5750605a83828151811061214b5761214a614ad3565b5b602001015160f81c60f81b60f81c60ff1611155b156121da57602083828151811061217957612178614ad3565b5b602001015160f81c60f81b60f81c6121919190614b0c565b60f81b8282815181106121a7576121a6614ad3565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a90535061223a565b8281815181106121ed576121ec614ad3565b5b602001015160f81c60f81b82828151811061220b5761220a614ad3565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a9053505b80806001019150506120fe565b508092505050919050565b600c5481565b606060038054612267906142f8565b80601f0160208091040260200160405190810160405280929190818152602001828054612293906142f8565b80156122de5780601f106122b5576101008083540402835291602001916122de565b820191905f5260205f20905b8154815290600101906020018083116122c157829003601f168201915b5050505050905090565b600a5481565b5f80829050600181511015612306575f915050612607565b601981511115612319575f915050612607565b602060f81b815f8151811061233157612330614ad3565b5b602001015160f81c60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19160361236c575f915050612607565b602060f81b81600183516123809190614b40565b8151811061239157612390614ad3565b5b602001015160f81c60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916036123cc575f915050612607565b5f815f815181106123e0576123df614ad3565b5b602001015160f81c60f81b90505f5b82518110156125ff575f83828151811061240c5761240b614ad3565b5b602001015160f81c60f81b9050602060f81b817effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480156124735750602060f81b837effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b15612484575f945050505050612607565b603060f81b817effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916101580156124e05750603960f81b817effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191611155b1580156125465750604160f81b817effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916101580156125445750605a60f81b817effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191611155b155b80156125ab5750606160f81b817effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916101580156125a95750607a60f81b817effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191611155b155b80156125dd5750602060f81b817effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614155b156125ee575f945050505050612607565b8092505080806001019150506123ef565b506001925050505b919050565b80600b5481612619610fe4565b6126239190614b73565b1115612664576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161265b90614bf0565b60405180910390fd5b8180600f546126739190614608565b3410156126b5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126ac90614ab5565b60405180910390fd5b600a544210156126fa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126f190614c58565b60405180910390fd5b5f8311801561270b5750600c548311155b61274a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161274190614cc0565b60405180910390fd5b61275b6127556133b9565b846134c4565b505050565b8060075f61276c613144565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16612815613144565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161285a9190613bd9565b60405180910390a35050565b60188054612873906142f8565b80601f016020809104026020016040519081016040528092919081815260200182805461289f906142f8565b80156128ea5780601f106128c1576101008083540402835291602001916128ea565b820191905f5260205f20905b8154815290600101906020018083116128cd57829003601f168201915b505050505081565b600e5481565b61290061314b565b80600c8190555050565b60155f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b61293a848484610ff9565b5f8373ffffffffffffffffffffffffffffffffffffffff163b1461299b57612964848484846134e1565b61299a576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b6129a961314b565b80600e8190555050565b81815f6129bf8361171a565b90508073ffffffffffffffffffffffffffffffffffffffff166129e06133b9565b73ffffffffffffffffffffffffffffffffffffffff1614612a36576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a2d90614731565b60405180910390fd5b60011515612a43836122ee565b151514612a85576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a7c90614799565b60405180910390fd5b6002601a5f8581526020019081526020015f20604051612aa59190614849565b602060405180830381855afa158015612ac0573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190612ae39190614892565b600283604051612af391906148f7565b602060405180830381855afa158015612b0e573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190612b319190614892565b03612b71576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b689061497d565b60405180910390fd5b5f1515612b7d83610f8e565b151514612bbf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bb6906149e5565b60405180910390fd5b60155f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd3360145f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600d546040518463ffffffff1660e01b8152600401612c4093929190614cde565b6020604051808303815f875af1158015612c5c573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612c809190614d27565b505f601a5f8781526020019081526020015f208054612c9e906142f8565b90501115612d4857612d47601a5f8781526020019081526020015f208054612cc5906142f8565b80601f0160208091040260200160405190810160405280929190818152602001828054612cf1906142f8565b8015612d3c5780601f10612d1357610100808354040283529160200191612d3c565b820191905f5260205f20905b815481529060010190602001808311612d1f57829003601f168201915b50505050505f6133c0565b5b612d538460016133c0565b83601a5f8781526020019081526020015f209081612d71919061450c565b50847f7e632a301794d8d4a81ea7e20f37d1947158d36e66403af04ba85dd194b66f1b85604051612da29190613c7c565b60405180910390a25050505050565b60105481565b6060612dc2826130ea565b612e01576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612df890614dc2565b60405180910390fd5b5f151560195f9054906101000a900460ff16151503612eaa5760188054612e27906142f8565b80601f0160208091040260200160405190810160405280929190818152602001828054612e53906142f8565b8015612e9e5780601f10612e7557610100808354040283529160200191612e9e565b820191905f5260205f20905b815481529060010190602001808311612e8157829003601f168201915b50505050509050612f03565b5f612eb361362c565b90505f815111612ed15760405180602001604052805f815250612eff565b80612edb846136bc565b6017604051602001612eef93929190614e60565b6040516020818303038152906040525b9150505b919050565b600d5481565b612f1661314b565b8060195f6101000a81548160ff02191690831515021790555050565b60145f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b5f60075f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16905092915050565b81600b5481612ff2610fe4565b612ffc9190614b73565b111561303d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161303490614bf0565b60405180910390fd5b61304561314b565b61304f82846134c4565b505050565b61305c61314b565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036130cc575f6040517f1e4fbdf70000000000000000000000000000000000000000000000000000000081526004016130c39190613d39565b60405180910390fd5b6130d581613401565b50565b6130e061314b565b80600f8190555050565b5f816130f46131d2565b1115801561310257505f5482105b801561313d57505f7c010000000000000000000000000000000000000000000000000000000060045f8581526020019081526020015f205416145b9050919050565b5f33905090565b6131536133b9565b73ffffffffffffffffffffffffffffffffffffffff1661317161207d565b73ffffffffffffffffffffffffffffffffffffffff16146131d0576131946133b9565b6040517f118cdaa70000000000000000000000000000000000000000000000000000000081526004016131c79190613d39565b60405180910390fd5b565b5f6001905090565b5f80829050806131e86131d2565b11613266575f54811015613265575f60045f8381526020019081526020015f205490505f7c0100000000000000000000000000000000000000000000000000000000821603613263575b5f81036132595760045f836001900393508381526020019081526020015f20549050613232565b8092505050613298565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b5f805f60065f8581526020019081526020015f2090508092508254915050915091565b5f73ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b5f8060e883901c905060e861331f868684613786565b62ffffff16901b9150509392505050565b5f73ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b6002600954036133a5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161339c90614eda565b60405180910390fd5b6002600981905550565b6001600981905550565b5f33905090565b80601b6133cc846120a5565b6040516133d99190614362565b90815260200160405180910390205f6101000a81548160ff0219169083151502179055505050565b5f60085f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508160085f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6134dd828260405180602001604052805f81525061378e565b5050565b5f8373ffffffffffffffffffffffffffffffffffffffff1663150b7a02613506613144565b8786866040518563ffffffff1660e01b81526004016135289493929190614f40565b6020604051808303815f875af192505050801561356357506040513d601f19601f820116820180604052508101906135609190614f9e565b60015b6135d9573d805f8114613591576040519150601f19603f3d011682016040523d82523d5f602084013e613596565b606091505b505f8151036135d1576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b60606016805461363b906142f8565b80601f0160208091040260200160405190810160405280929190818152602001828054613667906142f8565b80156136b25780601f10613689576101008083540402835291602001916136b2565b820191905f5260205f20905b81548152906001019060200180831161369557829003601f168201915b5050505050905090565b60605f60016136ca84613825565b0190505f8167ffffffffffffffff8111156136e8576136e7613dea565b5b6040519080825280601f01601f19166020018201604052801561371a5781602001600182028036833780820191505090505b5090505f82602001820190505b60011561377b578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a85816137705761376f614649565b5b0494505f8503613727575b819350505050919050565b5f9392505050565b6137988383613976565b5f8373ffffffffffffffffffffffffffffffffffffffff163b14613820575f805490505f83820390505b6137d45f8683806001019450866134e1565b61380a576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8181106137c257815f541461381d575f80fd5b50505b505050565b5f805f90507a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008310613881577a184f03e93ff9f4daa797ed6e38ed64bf6a1f010000000000000000838161387757613876614649565b5b0492506040810190505b6d04ee2d6d415b85acef810000000083106138be576d04ee2d6d415b85acef810000000083816138b4576138b3614649565b5b0492506020810190505b662386f26fc1000083106138ed57662386f26fc1000083816138e3576138e2614649565b5b0492506010810190505b6305f5e1008310613916576305f5e100838161390c5761390b614649565b5b0492506008810190505b612710831061393b57612710838161393157613930614649565b5b0492506004810190505b6064831061395e576064838161395457613953614649565b5b0492506002810190505b600a831061396d576001810190505b80915050919050565b5f805490505f82036139b4576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6139c05f848385613303565b600160406001901b17820260055f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8282540192505081905550613a3283613a235f865f613309565b613a2c85613b1f565b17613330565b60045f8381526020019081526020015f20819055505f80838301905073ffffffffffffffffffffffffffffffffffffffff8516915082825f7fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef5f80a4600183015b818114613acc5780835f7fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef5f80a4600181019050613a93565b505f8203613b06576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805f819055505050613b1a5f84838561335a565b505050565b5f6001821460e11b9050919050565b5f604051905090565b5f80fd5b5f80fd5b5f7fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b613b7381613b3f565b8114613b7d575f80fd5b50565b5f81359050613b8e81613b6a565b92915050565b5f60208284031215613ba957613ba8613b37565b5b5f613bb684828501613b80565b91505092915050565b5f8115159050919050565b613bd381613bbf565b82525050565b5f602082019050613bec5f830184613bca565b92915050565b5f81519050919050565b5f82825260208201905092915050565b5f5b83811015613c29578082015181840152602081019050613c0e565b5f8484015250505050565b5f601f19601f8301169050919050565b5f613c4e82613bf2565b613c588185613bfc565b9350613c68818560208601613c0c565b613c7181613c34565b840191505092915050565b5f6020820190508181035f830152613c948184613c44565b905092915050565b5f819050919050565b613cae81613c9c565b8114613cb8575f80fd5b50565b5f81359050613cc981613ca5565b92915050565b5f60208284031215613ce457613ce3613b37565b5b5f613cf184828501613cbb565b91505092915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f613d2382613cfa565b9050919050565b613d3381613d19565b82525050565b5f602082019050613d4c5f830184613d2a565b92915050565b613d5b81613d19565b8114613d65575f80fd5b50565b5f81359050613d7681613d52565b92915050565b5f8060408385031215613d9257613d91613b37565b5b5f613d9f85828601613d68565b9250506020613db085828601613cbb565b9150509250929050565b613dc381613c9c565b82525050565b5f602082019050613ddc5f830184613dba565b92915050565b5f80fd5b5f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b613e2082613c34565b810181811067ffffffffffffffff82111715613e3f57613e3e613dea565b5b80604052505050565b5f613e51613b2e565b9050613e5d8282613e17565b919050565b5f67ffffffffffffffff821115613e7c57613e7b613dea565b5b613e8582613c34565b9050602081019050919050565b828183375f83830152505050565b5f613eb2613ead84613e62565b613e48565b905082815260208101848484011115613ece57613ecd613de6565b5b613ed9848285613e92565b509392505050565b5f82601f830112613ef557613ef4613de2565b5b8135613f05848260208601613ea0565b91505092915050565b5f60208284031215613f2357613f22613b37565b5b5f82013567ffffffffffffffff811115613f4057613f3f613b3b565b5b613f4c84828501613ee1565b91505092915050565b5f805f60608486031215613f6c57613f6b613b37565b5b5f613f7986828701613d68565b9350506020613f8a86828701613d68565b9250506040613f9b86828701613cbb565b9150509250925092565b5f60208284031215613fba57613fb9613b37565b5b5f613fc784828501613d68565b91505092915050565b5f8060408385031215613fe657613fe5613b37565b5b5f613ff385828601613cbb565b925050602083013567ffffffffffffffff81111561401457614013613b3b565b5b61402085828601613ee1565b9150509250929050565b61403381613bbf565b811461403d575f80fd5b50565b5f8135905061404e8161402a565b92915050565b5f806040838503121561406a57614069613b37565b5b5f61407785828601613d68565b925050602061408885828601614040565b9150509250929050565b5f819050919050565b5f6140b56140b06140ab84613cfa565b614092565b613cfa565b9050919050565b5f6140c68261409b565b9050919050565b5f6140d7826140bc565b9050919050565b6140e7816140cd565b82525050565b5f6020820190506141005f8301846140de565b92915050565b5f67ffffffffffffffff8211156141205761411f613dea565b5b61412982613c34565b9050602081019050919050565b5f61414861414384614106565b613e48565b90508281526020810184848401111561416457614163613de6565b5b61416f848285613e92565b509392505050565b5f82601f83011261418b5761418a613de2565b5b813561419b848260208601614136565b91505092915050565b5f805f80608085870312156141bc576141bb613b37565b5b5f6141c987828801613d68565b94505060206141da87828801613d68565b93505060406141eb87828801613cbb565b925050606085013567ffffffffffffffff81111561420c5761420b613b3b565b5b61421887828801614177565b91505092959194509250565b5f6020828403121561423957614238613b37565b5b5f61424684828501614040565b91505092915050565b5f806040838503121561426557614264613b37565b5b5f61427285828601613d68565b925050602061428385828601613d68565b9150509250929050565b5f80604083850312156142a3576142a2613b37565b5b5f6142b085828601613cbb565b92505060206142c185828601613d68565b9150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f600282049050600182168061430f57607f821691505b602082108103614322576143216142cb565b5b50919050565b5f81905092915050565b5f61433c82613bf2565b6143468185614328565b9350614356818560208601613c0c565b80840191505092915050565b5f61436d8284614332565b915081905092915050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f600883026143d47fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82614399565b6143de8683614399565b95508019841693508086168417925050509392505050565b5f61441061440b61440684613c9c565b614092565b613c9c565b9050919050565b5f819050919050565b614429836143f6565b61443d61443582614417565b8484546143a5565b825550505050565b5f90565b614451614445565b61445c818484614420565b505050565b5b8181101561447f576144745f82614449565b600181019050614462565b5050565b601f8211156144c45761449581614378565b61449e8461438a565b810160208510156144ad578190505b6144c16144b98561438a565b830182614461565b50505b505050565b5f82821c905092915050565b5f6144e45f19846008026144c9565b1980831691505092915050565b5f6144fc83836144d5565b9150826002028217905092915050565b61451582613bf2565b67ffffffffffffffff81111561452e5761452d613dea565b5b61453882546142f8565b614543828285614483565b5f60209050601f831160018114614574575f8415614562578287015190505b61456c85826144f1565b8655506145d3565b601f19841661458286614378565b5f5b828110156145a957848901518255600182019150602085019450602081019050614584565b868310156145c657848901516145c2601f8916826144d5565b8355505b6001600288020188555050505b505050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f61461282613c9c565b915061461d83613c9c565b925082820261462b81613c9c565b91508282048414831517614642576146416145db565b5b5092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f61468082613c9c565b915061468b83613c9c565b92508261469b5761469a614649565b5b828204905092915050565b5f81905092915050565b50565b5f6146be5f836146a6565b91506146c9826146b0565b5f82019050919050565b5f6146dd826146b3565b9150819050919050565b7f4552433732313a2063616c6c6572206973206e6f7420746865206f776e6572005f82015250565b5f61471b601f83613bfc565b9150614726826146e7565b602082019050919050565b5f6020820190508181035f8301526147488161470f565b9050919050565b7f4e6f7420612076616c6964206e6577206e616d650000000000000000000000005f82015250565b5f614783601483613bfc565b915061478e8261474f565b602082019050919050565b5f6020820190508181035f8301526147b081614777565b9050919050565b5f819050815f5260205f209050919050565b5f81546147d5816142f8565b6147df81866146a6565b9450600182165f81146147f9576001811461480e57614840565b60ff1983168652811515820286019350614840565b614817856147b7565b5f5b8381101561483857815481890152600182019150602081019050614819565b838801955050505b50505092915050565b5f61485482846147c9565b915081905092915050565b5f819050919050565b6148718161485f565b811461487b575f80fd5b50565b5f8151905061488c81614868565b92915050565b5f602082840312156148a7576148a6613b37565b5b5f6148b48482850161487e565b91505092915050565b5f81519050919050565b5f6148d1826148bd565b6148db81856146a6565b93506148eb818560208601613c0c565b80840191505092915050565b5f61490282846148c7565b915081905092915050565b7f4e6577206e616d652069732073616d65206173207468652063757272656e74205f8201527f6f6e650000000000000000000000000000000000000000000000000000000000602082015250565b5f614967602383613bfc565b91506149728261490d565b604082019050919050565b5f6020820190508181035f8301526149948161495b565b9050919050565b7f4e616d6520616c726561647920726573657276656400000000000000000000005f82015250565b5f6149cf601583613bfc565b91506149da8261499b565b602082019050919050565b5f6020820190508181035f8301526149fc816149c3565b9050919050565b7f43616c6c6572206973206e6f7420746865204d6f64657261746f7200000000005f82015250565b5f614a37601b83613bfc565b9150614a4282614a03565b602082019050919050565b5f6020820190508181035f830152614a6481614a2b565b9050919050565b7f496e73756666696369656e742066756e647321000000000000000000000000005f82015250565b5f614a9f601383613bfc565b9150614aaa82614a6b565b602082019050919050565b5f6020820190508181035f830152614acc81614a93565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f60ff82169050919050565b5f614b1682614b00565b9150614b2183614b00565b9250828201905060ff811115614b3a57614b396145db565b5b92915050565b5f614b4a82613c9c565b9150614b5583613c9c565b9250828203905081811115614b6d57614b6c6145db565b5b92915050565b5f614b7d82613c9c565b9150614b8883613c9c565b9250828201905080821115614ba057614b9f6145db565b5b92915050565b7f4d617820737570706c79206578636565646564210000000000000000000000005f82015250565b5f614bda601483613bfc565b9150614be582614ba6565b602082019050919050565b5f6020820190508181035f830152614c0781614bce565b9050919050565b7f53616c6520686173206e6f7420737461727465640000000000000000000000005f82015250565b5f614c42601483613bfc565b9150614c4d82614c0e565b602082019050919050565b5f6020820190508181035f830152614c6f81614c36565b9050919050565b7f496e76616c6964206d696e7420616d6f756e74210000000000000000000000005f82015250565b5f614caa601483613bfc565b9150614cb582614c76565b602082019050919050565b5f6020820190508181035f830152614cd781614c9e565b9050919050565b5f606082019050614cf15f830186613d2a565b614cfe6020830185613d2a565b614d0b6040830184613dba565b949350505050565b5f81519050614d218161402a565b92915050565b5f60208284031215614d3c57614d3b613b37565b5b5f614d4984828501614d13565b91505092915050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f5f8201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b5f614dac602f83613bfc565b9150614db782614d52565b604082019050919050565b5f6020820190508181035f830152614dd981614da0565b9050919050565b5f8154614dec816142f8565b614df68186614328565b9450600182165f8114614e105760018114614e2557614e57565b60ff1983168652811515820286019350614e57565b614e2e85614378565b5f5b83811015614e4f57815481890152600182019150602081019050614e30565b838801955050505b50505092915050565b5f614e6b8286614332565b9150614e778285614332565b9150614e838284614de0565b9150819050949350505050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c005f82015250565b5f614ec4601f83613bfc565b9150614ecf82614e90565b602082019050919050565b5f6020820190508181035f830152614ef181614eb8565b9050919050565b5f82825260208201905092915050565b5f614f12826148bd565b614f1c8185614ef8565b9350614f2c818560208601613c0c565b614f3581613c34565b840191505092915050565b5f608082019050614f535f830187613d2a565b614f606020830186613d2a565b614f6d6040830185613dba565b8181036060830152614f7f8184614f08565b905095945050505050565b5f81519050614f9881613b6a565b92915050565b5f60208284031215614fb357614fb2613b37565b5b5f614fc084828501614f8a565b9150509291505056fea2646970667358221220cf2a693f2fe409cf0f171578f1218cc405c5f5ebc7f05c7ee5aaef7d96ea4ab364736f6c634300081700330000000000000000000000006c3c3224350ad7d1e2855339c2f509aa91c4dca2000000000000000000000000000000000000000000000000000000000000016000000000000000000000000000000000000000000000000000000000000001a0000000000000000000000000000000000000000000000000016345785d8a0000000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000001e00000000000000000000000000000000000000000000000000000018bd9134280000000000000000000000000000000000000000000000000016345785d8a0000000000000000000000000000000000000000000000000000016345785d8a0000000000000000000000000000dead0000000000000000420694206942069420690000000000000000000000007d0c49057c09501595a8ce23b773bb36a40b521f00000000000000000000000000000000000000000000000000000000000000145052454d4520437564646c652042756464696573000000000000000000000000000000000000000000000000000000000000000000000000000000000000000450434244000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000041697066733a2f2f516d5178694269706574367a6d4c474b7a674c463257364253363474765765745459466e397a5271444d63486f362f68696464656e2e6a736f6e00000000000000000000000000000000000000000000000000000000000000
Deployed Bytecode
0x60806040526004361061036a575f3560e01c80637ec4a659116101c5578063b071401b116100f6578063d8a7de1e11610094578063e985e9c51161006e578063e985e9c514610bfa578063efbd73f414610c36578063f2fde38b14610c5e578063f4a0a52814610c865761036a565b8063d8a7de1e14610b7e578063e0a8085314610ba8578063e5c5f1d514610bd05761036a565b8063b8c489e1116100d0578063b8c489e114610ac8578063c39cbef114610af0578063c78ad77f14610b18578063c87b56dd14610b425761036a565b8063b071401b14610a5a578063b42f0fb814610a82578063b88d4fde14610aac5761036a565b806395d89b4111610163578063a0712d681161013d578063a0712d68146109c2578063a22cb465146109de578063a45ba8e714610a06578063a675ca2f14610a305761036a565b806395d89b411461093257806399b1755b1461095c5780639ffdb65a146109865761036a565b80638c0f66db1161019f5780638c0f66db1461087a5780638da5cb5b146108a25780639416b423146108cc57806394354fd0146109085761036a565b80637ec4a6591461080e5780637ec7e7a41461083657806384a1b902146108525761036a565b8063466429211161029f57806362b99ad41161023d5780636bf8a5f6116102175780636bf8a5f6146107565780636d5224181461078057806370a08231146107bc578063715018a6146107f85761036a565b806362b99ad4146106c85780636352211e146106f257806365657c411461072e5761036a565b806354c6191d1161027957806354c6191d146106245780635503a0e81461064e57806355c8d840146106785780635da4a1d3146106a05761036a565b806346642921146105aa5780634fdd43cb146105d257806351830227146105fa5761036a565b806318160ddd1161030c5780633ccfd60b116102e65780633ccfd60b146105285780633db82fb51461053e5780633ebee8f51461056657806342842e0e1461058e5761036a565b806318160ddd146104ba57806323b872dd146104e457806332744e3a146105005761036a565b8063095ea7b311610348578063095ea7b31461041057806313faede61461042c57806315b56d101461045657806316ba10e0146104925761036a565b806301ffc9a71461036e57806306fdde03146103aa578063081812fc146103d4575b5f80fd5b348015610379575f80fd5b50610394600480360381019061038f9190613b94565b610cae565b6040516103a19190613bd9565b60405180910390f35b3480156103b5575f80fd5b506103be610d3f565b6040516103cb9190613c7c565b60405180910390f35b3480156103df575f80fd5b506103fa60048036038101906103f59190613ccf565b610dcf565b6040516104079190613d39565b60405180910390f35b61042a60048036038101906104259190613d7c565b610e49565b005b348015610437575f80fd5b50610440610f88565b60405161044d9190613dc9565b60405180910390f35b348015610461575f80fd5b5061047c60048036038101906104779190613f0e565b610f8e565b6040516104899190613bd9565b60405180910390f35b34801561049d575f80fd5b506104b860048036038101906104b39190613f0e565b610fc9565b005b3480156104c5575f80fd5b506104ce610fe4565b6040516104db9190613dc9565b60405180910390f35b6104fe60048036038101906104f99190613f55565b610ff9565b005b34801561050b575f80fd5b5061052660048036038101906105219190613fa5565b611307565b005b348015610533575f80fd5b5061053c611352565b005b348015610549575f80fd5b50610564600480360381019061055f9190613ccf565b6114ab565b005b348015610571575f80fd5b5061058c60048036038101906105879190613fa5565b6114bd565b005b6105a860048036038101906105a39190613f55565b611508565b005b3480156105b5575f80fd5b506105d060048036038101906105cb9190613fa5565b611527565b005b3480156105dd575f80fd5b506105f860048036038101906105f39190613f0e565b611572565b005b348015610605575f80fd5b5061060e61158d565b60405161061b9190613bd9565b60405180910390f35b34801561062f575f80fd5b5061063861159f565b6040516106459190613dc9565b60405180910390f35b348015610659575f80fd5b506106626115a5565b60405161066f9190613c7c565b60405180910390f35b348015610683575f80fd5b5061069e60048036038101906106999190613fa5565b611631565b005b3480156106ab575f80fd5b506106c660048036038101906106c19190613ccf565b61167c565b005b3480156106d3575f80fd5b506106dc61168e565b6040516106e99190613c7c565b60405180910390f35b3480156106fd575f80fd5b5061071860048036038101906107139190613ccf565b61171a565b6040516107259190613d39565b60405180910390f35b348015610739575f80fd5b50610754600480360381019061074f9190613fd0565b61172b565b005b348015610761575f80fd5b5061076a611a6f565b6040516107779190613d39565b60405180910390f35b34801561078b575f80fd5b506107a660048036038101906107a19190613ccf565b611a94565b6040516107b39190613c7c565b60405180910390f35b3480156107c7575f80fd5b506107e260048036038101906107dd9190613fa5565b611b35565b6040516107ef9190613dc9565b60405180910390f35b348015610803575f80fd5b5061080c611bea565b005b348015610819575f80fd5b50610834600480360381019061082f9190613f0e565b611bfd565b005b610850600480360381019061084b9190613fd0565b611c9f565b005b34801561085d575f80fd5b5061087860048036038101906108739190613ccf565b612020565b005b348015610885575f80fd5b506108a0600480360381019061089b9190613fa5565b612032565b005b3480156108ad575f80fd5b506108b661207d565b6040516108c39190613d39565b60405180910390f35b3480156108d7575f80fd5b506108f260048036038101906108ed9190613f0e565b6120a5565b6040516108ff9190613c7c565b60405180910390f35b348015610913575f80fd5b5061091c612252565b6040516109299190613dc9565b60405180910390f35b34801561093d575f80fd5b50610946612258565b6040516109539190613c7c565b60405180910390f35b348015610967575f80fd5b506109706122e8565b60405161097d9190613dc9565b60405180910390f35b348015610991575f80fd5b506109ac60048036038101906109a79190613f0e565b6122ee565b6040516109b99190613bd9565b60405180910390f35b6109dc60048036038101906109d79190613ccf565b61260c565b005b3480156109e9575f80fd5b50610a0460048036038101906109ff9190614054565b612760565b005b348015610a11575f80fd5b50610a1a612866565b604051610a279190613c7c565b60405180910390f35b348015610a3b575f80fd5b50610a446128f2565b604051610a519190613dc9565b60405180910390f35b348015610a65575f80fd5b50610a806004803603810190610a7b9190613ccf565b6128f8565b005b348015610a8d575f80fd5b50610a9661290a565b604051610aa391906140ed565b60405180910390f35b610ac66004803603810190610ac191906141a4565b61292f565b005b348015610ad3575f80fd5b50610aee6004803603810190610ae99190613ccf565b6129a1565b005b348015610afb575f80fd5b50610b166004803603810190610b119190613fd0565b6129b3565b005b348015610b23575f80fd5b50610b2c612db1565b604051610b399190613dc9565b60405180910390f35b348015610b4d575f80fd5b50610b686004803603810190610b639190613ccf565b612db7565b604051610b759190613c7c565b60405180910390f35b348015610b89575f80fd5b50610b92612f08565b604051610b9f9190613dc9565b60405180910390f35b348015610bb3575f80fd5b50610bce6004803603810190610bc99190614224565b612f0e565b005b348015610bdb575f80fd5b50610be4612f32565b604051610bf19190613d39565b60405180910390f35b348015610c05575f80fd5b50610c206004803603810190610c1b919061424f565b612f57565b604051610c2d9190613bd9565b60405180910390f35b348015610c41575f80fd5b50610c5c6004803603810190610c57919061428d565b612fe5565b005b348015610c69575f80fd5b50610c846004803603810190610c7f9190613fa5565b613054565b005b348015610c91575f80fd5b50610cac6004803603810190610ca79190613ccf565b6130d8565b005b5f6301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610d0857506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610d385750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b606060028054610d4e906142f8565b80601f0160208091040260200160405190810160405280929190818152602001828054610d7a906142f8565b8015610dc55780601f10610d9c57610100808354040283529160200191610dc5565b820191905f5260205f20905b815481529060010190602001808311610da857829003601f168201915b5050505050905090565b5f610dd9826130ea565b610e0f576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60065f8381526020019081526020015f205f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b5f610e538261171a565b90508073ffffffffffffffffffffffffffffffffffffffff16610e74613144565b73ffffffffffffffffffffffffffffffffffffffff1614610ed757610ea081610e9b613144565b612f57565b610ed6576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b8260065f8481526020019081526020015f205f015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b600f5481565b5f601b610f9a836120a5565b604051610fa79190614362565b90815260200160405180910390205f9054906101000a900460ff169050919050565b610fd161314b565b8060179081610fe0919061450c565b5050565b5f610fed6131d2565b6001545f540303905090565b5f611003826131da565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161461106a576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f806110758461329d565b9150915061108b8187611086613144565b6132c0565b6110d7576110a08661109b613144565b612f57565b6110d6576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b5f73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff160361113c576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6111498686866001613303565b8015611153575f82555b60055f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8154600190039190508190555060055f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f81546001019190508190555061121b856111f7888887613309565b7c020000000000000000000000000000000000000000000000000000000017613330565b60045f8681526020019081526020015f20819055505f7c0200000000000000000000000000000000000000000000000000000000841603611297575f6001850190505f60045f8381526020019081526020015f205403611295575f548114611294578360045f8381526020019081526020015f20819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46112ff868686600161335a565b505050505050565b61130f61314b565b8060155f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b61135a61314b565b611362613360565b5f60115f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166064601054476113ab9190614608565b6113b59190614676565b6040516113c1906146d3565b5f6040518083038185875af1925050503d805f81146113fb576040519150601f19603f3d011682016040523d82523d5f602084013e611400565b606091505b505090508061140d575f80fd5b5f60125f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1647604051611453906146d3565b5f6040518083038185875af1925050503d805f811461148d576040519150601f19603f3d011682016040523d82523d5f602084013e611492565b606091505b505090508061149f575f80fd5b50506114a96133af565b565b6114b361314b565b80600a8190555050565b6114c561314b565b8060115f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b61152283838360405180602001604052805f81525061292f565b505050565b61152f61314b565b8060135f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b61157a61314b565b8060189081611589919061450c565b5050565b60195f9054906101000a900460ff1681565b600b5481565b601780546115b2906142f8565b80601f01602080910402602001604051908101604052809291908181526020018280546115de906142f8565b80156116295780601f1061160057610100808354040283529160200191611629565b820191905f5260205f20905b81548152906001019060200180831161160c57829003601f168201915b505050505081565b61163961314b565b8060125f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b61168461314b565b8060108190555050565b6016805461169b906142f8565b80601f01602080910402602001604051908101604052809291908181526020018280546116c7906142f8565b80156117125780601f106116e957610100808354040283529160200191611712565b820191905f5260205f20905b8154815290600101906020018083116116f557829003601f168201915b505050505081565b5f611724826131da565b9050919050565b81815f6117378361171a565b90508073ffffffffffffffffffffffffffffffffffffffff166117586133b9565b73ffffffffffffffffffffffffffffffffffffffff16146117ae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117a590614731565b60405180910390fd5b600115156117bb836122ee565b1515146117fd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117f490614799565b60405180910390fd5b6002601a5f8581526020019081526020015f2060405161181d9190614849565b602060405180830381855afa158015611838573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061185b9190614892565b60028360405161186b91906148f7565b602060405180830381855afa158015611886573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906118a99190614892565b036118e9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118e09061497d565b60405180910390fd5b5f15156118f583610f8e565b151514611937576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161192e906149e5565b60405180910390fd5b61193f61314b565b5f601a5f8781526020019081526020015f20805461195c906142f8565b90501115611a0657611a05601a5f8781526020019081526020015f208054611983906142f8565b80601f01602080910402602001604051908101604052809291908181526020018280546119af906142f8565b80156119fa5780601f106119d1576101008083540402835291602001916119fa565b820191905f5260205f20905b8154815290600101906020018083116119dd57829003601f168201915b50505050505f6133c0565b5b611a118460016133c0565b83601a5f8781526020019081526020015f209081611a2f919061450c565b50847f7e632a301794d8d4a81ea7e20f37d1947158d36e66403af04ba85dd194b66f1b85604051611a609190613c7c565b60405180910390a25050505050565b60135f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6060601a5f8381526020019081526020015f208054611ab2906142f8565b80601f0160208091040260200160405190810160405280929190818152602001828054611ade906142f8565b8015611b295780601f10611b0057610100808354040283529160200191611b29565b820191905f5260205f20905b815481529060010190602001808311611b0c57829003601f168201915b50505050509050919050565b5f8073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611b9b576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff60055f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054169050919050565b611bf261314b565b611bfb5f613401565b565b60135f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611c8c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c8390614a4d565b60405180910390fd5b8060169081611c9b919061450c565b5050565b81815f611cab8361171a565b90508073ffffffffffffffffffffffffffffffffffffffff16611ccc6133b9565b73ffffffffffffffffffffffffffffffffffffffff1614611d22576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d1990614731565b60405180910390fd5b60011515611d2f836122ee565b151514611d71576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d6890614799565b60405180910390fd5b6002601a5f8581526020019081526020015f20604051611d919190614849565b602060405180830381855afa158015611dac573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190611dcf9190614892565b600283604051611ddf91906148f7565b602060405180830381855afa158015611dfa573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190611e1d9190614892565b03611e5d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e549061497d565b60405180910390fd5b5f1515611e6983610f8e565b151514611eab576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ea2906149e5565b60405180910390fd5b600e54341015611ef0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ee790614ab5565b60405180910390fd5b5f601a5f8781526020019081526020015f208054611f0d906142f8565b90501115611fb757611fb6601a5f8781526020019081526020015f208054611f34906142f8565b80601f0160208091040260200160405190810160405280929190818152602001828054611f60906142f8565b8015611fab5780601f10611f8257610100808354040283529160200191611fab565b820191905f5260205f20905b815481529060010190602001808311611f8e57829003601f168201915b50505050505f6133c0565b5b611fc28460016133c0565b83601a5f8781526020019081526020015f209081611fe0919061450c565b50847f7e632a301794d8d4a81ea7e20f37d1947158d36e66403af04ba85dd194b66f1b856040516120119190613c7c565b60405180910390a25050505050565b61202861314b565b80600d8190555050565b61203a61314b565b8060145f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b5f60085f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60605f8290505f815167ffffffffffffffff8111156120c7576120c6613dea565b5b6040519080825280601f01601f1916602001820160405280156120f95781602001600182028036833780820191505090505b5090505f5b825181101561224757604183828151811061211c5761211b614ad3565b5b602001015160f81c60f81b60f81c60ff161015801561215f5750605a83828151811061214b5761214a614ad3565b5b602001015160f81c60f81b60f81c60ff1611155b156121da57602083828151811061217957612178614ad3565b5b602001015160f81c60f81b60f81c6121919190614b0c565b60f81b8282815181106121a7576121a6614ad3565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a90535061223a565b8281815181106121ed576121ec614ad3565b5b602001015160f81c60f81b82828151811061220b5761220a614ad3565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a9053505b80806001019150506120fe565b508092505050919050565b600c5481565b606060038054612267906142f8565b80601f0160208091040260200160405190810160405280929190818152602001828054612293906142f8565b80156122de5780601f106122b5576101008083540402835291602001916122de565b820191905f5260205f20905b8154815290600101906020018083116122c157829003601f168201915b5050505050905090565b600a5481565b5f80829050600181511015612306575f915050612607565b601981511115612319575f915050612607565b602060f81b815f8151811061233157612330614ad3565b5b602001015160f81c60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19160361236c575f915050612607565b602060f81b81600183516123809190614b40565b8151811061239157612390614ad3565b5b602001015160f81c60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916036123cc575f915050612607565b5f815f815181106123e0576123df614ad3565b5b602001015160f81c60f81b90505f5b82518110156125ff575f83828151811061240c5761240b614ad3565b5b602001015160f81c60f81b9050602060f81b817effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480156124735750602060f81b837effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b15612484575f945050505050612607565b603060f81b817effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916101580156124e05750603960f81b817effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191611155b1580156125465750604160f81b817effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916101580156125445750605a60f81b817effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191611155b155b80156125ab5750606160f81b817effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916101580156125a95750607a60f81b817effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191611155b155b80156125dd5750602060f81b817effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614155b156125ee575f945050505050612607565b8092505080806001019150506123ef565b506001925050505b919050565b80600b5481612619610fe4565b6126239190614b73565b1115612664576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161265b90614bf0565b60405180910390fd5b8180600f546126739190614608565b3410156126b5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126ac90614ab5565b60405180910390fd5b600a544210156126fa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126f190614c58565b60405180910390fd5b5f8311801561270b5750600c548311155b61274a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161274190614cc0565b60405180910390fd5b61275b6127556133b9565b846134c4565b505050565b8060075f61276c613144565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16612815613144565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161285a9190613bd9565b60405180910390a35050565b60188054612873906142f8565b80601f016020809104026020016040519081016040528092919081815260200182805461289f906142f8565b80156128ea5780601f106128c1576101008083540402835291602001916128ea565b820191905f5260205f20905b8154815290600101906020018083116128cd57829003601f168201915b505050505081565b600e5481565b61290061314b565b80600c8190555050565b60155f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b61293a848484610ff9565b5f8373ffffffffffffffffffffffffffffffffffffffff163b1461299b57612964848484846134e1565b61299a576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b6129a961314b565b80600e8190555050565b81815f6129bf8361171a565b90508073ffffffffffffffffffffffffffffffffffffffff166129e06133b9565b73ffffffffffffffffffffffffffffffffffffffff1614612a36576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a2d90614731565b60405180910390fd5b60011515612a43836122ee565b151514612a85576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a7c90614799565b60405180910390fd5b6002601a5f8581526020019081526020015f20604051612aa59190614849565b602060405180830381855afa158015612ac0573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190612ae39190614892565b600283604051612af391906148f7565b602060405180830381855afa158015612b0e573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190612b319190614892565b03612b71576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b689061497d565b60405180910390fd5b5f1515612b7d83610f8e565b151514612bbf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bb6906149e5565b60405180910390fd5b60155f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd3360145f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600d546040518463ffffffff1660e01b8152600401612c4093929190614cde565b6020604051808303815f875af1158015612c5c573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612c809190614d27565b505f601a5f8781526020019081526020015f208054612c9e906142f8565b90501115612d4857612d47601a5f8781526020019081526020015f208054612cc5906142f8565b80601f0160208091040260200160405190810160405280929190818152602001828054612cf1906142f8565b8015612d3c5780601f10612d1357610100808354040283529160200191612d3c565b820191905f5260205f20905b815481529060010190602001808311612d1f57829003601f168201915b50505050505f6133c0565b5b612d538460016133c0565b83601a5f8781526020019081526020015f209081612d71919061450c565b50847f7e632a301794d8d4a81ea7e20f37d1947158d36e66403af04ba85dd194b66f1b85604051612da29190613c7c565b60405180910390a25050505050565b60105481565b6060612dc2826130ea565b612e01576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612df890614dc2565b60405180910390fd5b5f151560195f9054906101000a900460ff16151503612eaa5760188054612e27906142f8565b80601f0160208091040260200160405190810160405280929190818152602001828054612e53906142f8565b8015612e9e5780601f10612e7557610100808354040283529160200191612e9e565b820191905f5260205f20905b815481529060010190602001808311612e8157829003601f168201915b50505050509050612f03565b5f612eb361362c565b90505f815111612ed15760405180602001604052805f815250612eff565b80612edb846136bc565b6017604051602001612eef93929190614e60565b6040516020818303038152906040525b9150505b919050565b600d5481565b612f1661314b565b8060195f6101000a81548160ff02191690831515021790555050565b60145f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b5f60075f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16905092915050565b81600b5481612ff2610fe4565b612ffc9190614b73565b111561303d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161303490614bf0565b60405180910390fd5b61304561314b565b61304f82846134c4565b505050565b61305c61314b565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036130cc575f6040517f1e4fbdf70000000000000000000000000000000000000000000000000000000081526004016130c39190613d39565b60405180910390fd5b6130d581613401565b50565b6130e061314b565b80600f8190555050565b5f816130f46131d2565b1115801561310257505f5482105b801561313d57505f7c010000000000000000000000000000000000000000000000000000000060045f8581526020019081526020015f205416145b9050919050565b5f33905090565b6131536133b9565b73ffffffffffffffffffffffffffffffffffffffff1661317161207d565b73ffffffffffffffffffffffffffffffffffffffff16146131d0576131946133b9565b6040517f118cdaa70000000000000000000000000000000000000000000000000000000081526004016131c79190613d39565b60405180910390fd5b565b5f6001905090565b5f80829050806131e86131d2565b11613266575f54811015613265575f60045f8381526020019081526020015f205490505f7c0100000000000000000000000000000000000000000000000000000000821603613263575b5f81036132595760045f836001900393508381526020019081526020015f20549050613232565b8092505050613298565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b5f805f60065f8581526020019081526020015f2090508092508254915050915091565b5f73ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b5f8060e883901c905060e861331f868684613786565b62ffffff16901b9150509392505050565b5f73ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b6002600954036133a5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161339c90614eda565b60405180910390fd5b6002600981905550565b6001600981905550565b5f33905090565b80601b6133cc846120a5565b6040516133d99190614362565b90815260200160405180910390205f6101000a81548160ff0219169083151502179055505050565b5f60085f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508160085f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6134dd828260405180602001604052805f81525061378e565b5050565b5f8373ffffffffffffffffffffffffffffffffffffffff1663150b7a02613506613144565b8786866040518563ffffffff1660e01b81526004016135289493929190614f40565b6020604051808303815f875af192505050801561356357506040513d601f19601f820116820180604052508101906135609190614f9e565b60015b6135d9573d805f8114613591576040519150601f19603f3d011682016040523d82523d5f602084013e613596565b606091505b505f8151036135d1576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b60606016805461363b906142f8565b80601f0160208091040260200160405190810160405280929190818152602001828054613667906142f8565b80156136b25780601f10613689576101008083540402835291602001916136b2565b820191905f5260205f20905b81548152906001019060200180831161369557829003601f168201915b5050505050905090565b60605f60016136ca84613825565b0190505f8167ffffffffffffffff8111156136e8576136e7613dea565b5b6040519080825280601f01601f19166020018201604052801561371a5781602001600182028036833780820191505090505b5090505f82602001820190505b60011561377b578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a85816137705761376f614649565b5b0494505f8503613727575b819350505050919050565b5f9392505050565b6137988383613976565b5f8373ffffffffffffffffffffffffffffffffffffffff163b14613820575f805490505f83820390505b6137d45f8683806001019450866134e1565b61380a576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8181106137c257815f541461381d575f80fd5b50505b505050565b5f805f90507a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008310613881577a184f03e93ff9f4daa797ed6e38ed64bf6a1f010000000000000000838161387757613876614649565b5b0492506040810190505b6d04ee2d6d415b85acef810000000083106138be576d04ee2d6d415b85acef810000000083816138b4576138b3614649565b5b0492506020810190505b662386f26fc1000083106138ed57662386f26fc1000083816138e3576138e2614649565b5b0492506010810190505b6305f5e1008310613916576305f5e100838161390c5761390b614649565b5b0492506008810190505b612710831061393b57612710838161393157613930614649565b5b0492506004810190505b6064831061395e576064838161395457613953614649565b5b0492506002810190505b600a831061396d576001810190505b80915050919050565b5f805490505f82036139b4576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6139c05f848385613303565b600160406001901b17820260055f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8282540192505081905550613a3283613a235f865f613309565b613a2c85613b1f565b17613330565b60045f8381526020019081526020015f20819055505f80838301905073ffffffffffffffffffffffffffffffffffffffff8516915082825f7fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef5f80a4600183015b818114613acc5780835f7fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef5f80a4600181019050613a93565b505f8203613b06576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805f819055505050613b1a5f84838561335a565b505050565b5f6001821460e11b9050919050565b5f604051905090565b5f80fd5b5f80fd5b5f7fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b613b7381613b3f565b8114613b7d575f80fd5b50565b5f81359050613b8e81613b6a565b92915050565b5f60208284031215613ba957613ba8613b37565b5b5f613bb684828501613b80565b91505092915050565b5f8115159050919050565b613bd381613bbf565b82525050565b5f602082019050613bec5f830184613bca565b92915050565b5f81519050919050565b5f82825260208201905092915050565b5f5b83811015613c29578082015181840152602081019050613c0e565b5f8484015250505050565b5f601f19601f8301169050919050565b5f613c4e82613bf2565b613c588185613bfc565b9350613c68818560208601613c0c565b613c7181613c34565b840191505092915050565b5f6020820190508181035f830152613c948184613c44565b905092915050565b5f819050919050565b613cae81613c9c565b8114613cb8575f80fd5b50565b5f81359050613cc981613ca5565b92915050565b5f60208284031215613ce457613ce3613b37565b5b5f613cf184828501613cbb565b91505092915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f613d2382613cfa565b9050919050565b613d3381613d19565b82525050565b5f602082019050613d4c5f830184613d2a565b92915050565b613d5b81613d19565b8114613d65575f80fd5b50565b5f81359050613d7681613d52565b92915050565b5f8060408385031215613d9257613d91613b37565b5b5f613d9f85828601613d68565b9250506020613db085828601613cbb565b9150509250929050565b613dc381613c9c565b82525050565b5f602082019050613ddc5f830184613dba565b92915050565b5f80fd5b5f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b613e2082613c34565b810181811067ffffffffffffffff82111715613e3f57613e3e613dea565b5b80604052505050565b5f613e51613b2e565b9050613e5d8282613e17565b919050565b5f67ffffffffffffffff821115613e7c57613e7b613dea565b5b613e8582613c34565b9050602081019050919050565b828183375f83830152505050565b5f613eb2613ead84613e62565b613e48565b905082815260208101848484011115613ece57613ecd613de6565b5b613ed9848285613e92565b509392505050565b5f82601f830112613ef557613ef4613de2565b5b8135613f05848260208601613ea0565b91505092915050565b5f60208284031215613f2357613f22613b37565b5b5f82013567ffffffffffffffff811115613f4057613f3f613b3b565b5b613f4c84828501613ee1565b91505092915050565b5f805f60608486031215613f6c57613f6b613b37565b5b5f613f7986828701613d68565b9350506020613f8a86828701613d68565b9250506040613f9b86828701613cbb565b9150509250925092565b5f60208284031215613fba57613fb9613b37565b5b5f613fc784828501613d68565b91505092915050565b5f8060408385031215613fe657613fe5613b37565b5b5f613ff385828601613cbb565b925050602083013567ffffffffffffffff81111561401457614013613b3b565b5b61402085828601613ee1565b9150509250929050565b61403381613bbf565b811461403d575f80fd5b50565b5f8135905061404e8161402a565b92915050565b5f806040838503121561406a57614069613b37565b5b5f61407785828601613d68565b925050602061408885828601614040565b9150509250929050565b5f819050919050565b5f6140b56140b06140ab84613cfa565b614092565b613cfa565b9050919050565b5f6140c68261409b565b9050919050565b5f6140d7826140bc565b9050919050565b6140e7816140cd565b82525050565b5f6020820190506141005f8301846140de565b92915050565b5f67ffffffffffffffff8211156141205761411f613dea565b5b61412982613c34565b9050602081019050919050565b5f61414861414384614106565b613e48565b90508281526020810184848401111561416457614163613de6565b5b61416f848285613e92565b509392505050565b5f82601f83011261418b5761418a613de2565b5b813561419b848260208601614136565b91505092915050565b5f805f80608085870312156141bc576141bb613b37565b5b5f6141c987828801613d68565b94505060206141da87828801613d68565b93505060406141eb87828801613cbb565b925050606085013567ffffffffffffffff81111561420c5761420b613b3b565b5b61421887828801614177565b91505092959194509250565b5f6020828403121561423957614238613b37565b5b5f61424684828501614040565b91505092915050565b5f806040838503121561426557614264613b37565b5b5f61427285828601613d68565b925050602061428385828601613d68565b9150509250929050565b5f80604083850312156142a3576142a2613b37565b5b5f6142b085828601613cbb565b92505060206142c185828601613d68565b9150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f600282049050600182168061430f57607f821691505b602082108103614322576143216142cb565b5b50919050565b5f81905092915050565b5f61433c82613bf2565b6143468185614328565b9350614356818560208601613c0c565b80840191505092915050565b5f61436d8284614332565b915081905092915050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f600883026143d47fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82614399565b6143de8683614399565b95508019841693508086168417925050509392505050565b5f61441061440b61440684613c9c565b614092565b613c9c565b9050919050565b5f819050919050565b614429836143f6565b61443d61443582614417565b8484546143a5565b825550505050565b5f90565b614451614445565b61445c818484614420565b505050565b5b8181101561447f576144745f82614449565b600181019050614462565b5050565b601f8211156144c45761449581614378565b61449e8461438a565b810160208510156144ad578190505b6144c16144b98561438a565b830182614461565b50505b505050565b5f82821c905092915050565b5f6144e45f19846008026144c9565b1980831691505092915050565b5f6144fc83836144d5565b9150826002028217905092915050565b61451582613bf2565b67ffffffffffffffff81111561452e5761452d613dea565b5b61453882546142f8565b614543828285614483565b5f60209050601f831160018114614574575f8415614562578287015190505b61456c85826144f1565b8655506145d3565b601f19841661458286614378565b5f5b828110156145a957848901518255600182019150602085019450602081019050614584565b868310156145c657848901516145c2601f8916826144d5565b8355505b6001600288020188555050505b505050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f61461282613c9c565b915061461d83613c9c565b925082820261462b81613c9c565b91508282048414831517614642576146416145db565b5b5092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f61468082613c9c565b915061468b83613c9c565b92508261469b5761469a614649565b5b828204905092915050565b5f81905092915050565b50565b5f6146be5f836146a6565b91506146c9826146b0565b5f82019050919050565b5f6146dd826146b3565b9150819050919050565b7f4552433732313a2063616c6c6572206973206e6f7420746865206f776e6572005f82015250565b5f61471b601f83613bfc565b9150614726826146e7565b602082019050919050565b5f6020820190508181035f8301526147488161470f565b9050919050565b7f4e6f7420612076616c6964206e6577206e616d650000000000000000000000005f82015250565b5f614783601483613bfc565b915061478e8261474f565b602082019050919050565b5f6020820190508181035f8301526147b081614777565b9050919050565b5f819050815f5260205f209050919050565b5f81546147d5816142f8565b6147df81866146a6565b9450600182165f81146147f9576001811461480e57614840565b60ff1983168652811515820286019350614840565b614817856147b7565b5f5b8381101561483857815481890152600182019150602081019050614819565b838801955050505b50505092915050565b5f61485482846147c9565b915081905092915050565b5f819050919050565b6148718161485f565b811461487b575f80fd5b50565b5f8151905061488c81614868565b92915050565b5f602082840312156148a7576148a6613b37565b5b5f6148b48482850161487e565b91505092915050565b5f81519050919050565b5f6148d1826148bd565b6148db81856146a6565b93506148eb818560208601613c0c565b80840191505092915050565b5f61490282846148c7565b915081905092915050565b7f4e6577206e616d652069732073616d65206173207468652063757272656e74205f8201527f6f6e650000000000000000000000000000000000000000000000000000000000602082015250565b5f614967602383613bfc565b91506149728261490d565b604082019050919050565b5f6020820190508181035f8301526149948161495b565b9050919050565b7f4e616d6520616c726561647920726573657276656400000000000000000000005f82015250565b5f6149cf601583613bfc565b91506149da8261499b565b602082019050919050565b5f6020820190508181035f8301526149fc816149c3565b9050919050565b7f43616c6c6572206973206e6f7420746865204d6f64657261746f7200000000005f82015250565b5f614a37601b83613bfc565b9150614a4282614a03565b602082019050919050565b5f6020820190508181035f830152614a6481614a2b565b9050919050565b7f496e73756666696369656e742066756e647321000000000000000000000000005f82015250565b5f614a9f601383613bfc565b9150614aaa82614a6b565b602082019050919050565b5f6020820190508181035f830152614acc81614a93565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f60ff82169050919050565b5f614b1682614b00565b9150614b2183614b00565b9250828201905060ff811115614b3a57614b396145db565b5b92915050565b5f614b4a82613c9c565b9150614b5583613c9c565b9250828203905081811115614b6d57614b6c6145db565b5b92915050565b5f614b7d82613c9c565b9150614b8883613c9c565b9250828201905080821115614ba057614b9f6145db565b5b92915050565b7f4d617820737570706c79206578636565646564210000000000000000000000005f82015250565b5f614bda601483613bfc565b9150614be582614ba6565b602082019050919050565b5f6020820190508181035f830152614c0781614bce565b9050919050565b7f53616c6520686173206e6f7420737461727465640000000000000000000000005f82015250565b5f614c42601483613bfc565b9150614c4d82614c0e565b602082019050919050565b5f6020820190508181035f830152614c6f81614c36565b9050919050565b7f496e76616c6964206d696e7420616d6f756e74210000000000000000000000005f82015250565b5f614caa601483613bfc565b9150614cb582614c76565b602082019050919050565b5f6020820190508181035f830152614cd781614c9e565b9050919050565b5f606082019050614cf15f830186613d2a565b614cfe6020830185613d2a565b614d0b6040830184613dba565b949350505050565b5f81519050614d218161402a565b92915050565b5f60208284031215614d3c57614d3b613b37565b5b5f614d4984828501614d13565b91505092915050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f5f8201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b5f614dac602f83613bfc565b9150614db782614d52565b604082019050919050565b5f6020820190508181035f830152614dd981614da0565b9050919050565b5f8154614dec816142f8565b614df68186614328565b9450600182165f8114614e105760018114614e2557614e57565b60ff1983168652811515820286019350614e57565b614e2e85614378565b5f5b83811015614e4f57815481890152600182019150602081019050614e30565b838801955050505b50505092915050565b5f614e6b8286614332565b9150614e778285614332565b9150614e838284614de0565b9150819050949350505050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c005f82015250565b5f614ec4601f83613bfc565b9150614ecf82614e90565b602082019050919050565b5f6020820190508181035f830152614ef181614eb8565b9050919050565b5f82825260208201905092915050565b5f614f12826148bd565b614f1c8185614ef8565b9350614f2c818560208601613c0c565b614f3581613c34565b840191505092915050565b5f608082019050614f535f830187613d2a565b614f606020830186613d2a565b614f6d6040830185613dba565b8181036060830152614f7f8184614f08565b905095945050505050565b5f81519050614f9881613b6a565b92915050565b5f60208284031215614fb357614fb2613b37565b5b5f614fc084828501614f8a565b9150509291505056fea2646970667358221220cf2a693f2fe409cf0f171578f1218cc405c5f5ebc7f05c7ee5aaef7d96ea4ab364736f6c63430008170033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000006c3c3224350ad7d1e2855339c2f509aa91c4dca2000000000000000000000000000000000000000000000000000000000000016000000000000000000000000000000000000000000000000000000000000001a0000000000000000000000000000000000000000000000000016345785d8a0000000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000001e00000000000000000000000000000000000000000000000000000018bd9134280000000000000000000000000000000000000000000000000016345785d8a0000000000000000000000000000000000000000000000000000016345785d8a0000000000000000000000000000dead0000000000000000420694206942069420690000000000000000000000007d0c49057c09501595a8ce23b773bb36a40b521f00000000000000000000000000000000000000000000000000000000000000145052454d4520437564646c652042756464696573000000000000000000000000000000000000000000000000000000000000000000000000000000000000000450434244000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000041697066733a2f2f516d5178694269706574367a6d4c474b7a674c463257364253363474765765745459466e397a5271444d63486f362f68696464656e2e6a736f6e00000000000000000000000000000000000000000000000000000000000000
-----Decoded View---------------
Arg [0] : initialOwner (address): 0x6C3C3224350Ad7d1e2855339C2F509AA91C4dcA2
Arg [1] : name (string): PREME Cuddle Buddies
Arg [2] : symbol (string): PCBD
Arg [3] : _cost (uint256): 100000000000000000
Arg [4] : _maxMintAmountPerTx (uint256): 10
Arg [5] : _hiddenMetadataUri (string): ipfs://QmQxiBipet6zmLGKzgLF2W6BS64tvWetTYFn9zRqDMcHo6/hidden.json
Arg [6] : _SaleStartTimestamp (uint256): 1700154000000
Arg [7] : _NameChangePrice (uint256): 100000000000000000
Arg [8] : _NameChangePriceETH (uint256): 100000000000000000
Arg [9] : _burnaddress (address): 0xdEAD000000000000000042069420694206942069
Arg [10] : _burntokenaddress (address): 0x7d0C49057c09501595A8ce23b773BB36A40b521F
-----Encoded View---------------
19 Constructor Arguments found :
Arg [0] : 0000000000000000000000006c3c3224350ad7d1e2855339c2f509aa91c4dca2
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000160
Arg [2] : 00000000000000000000000000000000000000000000000000000000000001a0
Arg [3] : 000000000000000000000000000000000000000000000000016345785d8a0000
Arg [4] : 000000000000000000000000000000000000000000000000000000000000000a
Arg [5] : 00000000000000000000000000000000000000000000000000000000000001e0
Arg [6] : 0000000000000000000000000000000000000000000000000000018bd9134280
Arg [7] : 000000000000000000000000000000000000000000000000016345785d8a0000
Arg [8] : 000000000000000000000000000000000000000000000000016345785d8a0000
Arg [9] : 000000000000000000000000dead000000000000000042069420694206942069
Arg [10] : 0000000000000000000000007d0c49057c09501595a8ce23b773bb36a40b521f
Arg [11] : 0000000000000000000000000000000000000000000000000000000000000014
Arg [12] : 5052454d4520437564646c652042756464696573000000000000000000000000
Arg [13] : 0000000000000000000000000000000000000000000000000000000000000004
Arg [14] : 5043424400000000000000000000000000000000000000000000000000000000
Arg [15] : 0000000000000000000000000000000000000000000000000000000000000041
Arg [16] : 697066733a2f2f516d5178694269706574367a6d4c474b7a674c463257364253
Arg [17] : 363474765765745459466e397a5271444d63486f362f68696464656e2e6a736f
Arg [18] : 6e00000000000000000000000000000000000000000000000000000000000000
Deployed Bytecode Sourcemap
88708:9258:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18404:639;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;19306:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25797:218;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25230:408;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;89037:19;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;95322:125;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;93199:94;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;15057:323;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29436:2825;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;97091:110;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;97562:400;;;;;;;;;;;;;:::i;:::-;;91401:130;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;97336:108;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;32357:193;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;93451:91;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;92965:126;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;89352:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;88872:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;89280;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;97449:108;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;97239:92;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;89248:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20699:152;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;94443:372;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;89163:24;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;95155:108;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;16241:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;87786:103;;;;;;;;;;;;;:::i;:::-;;93096:98;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;94039:399;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;94860:112;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;96990:96;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;87111:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;96553:396;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;88909:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;19482:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;88835:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;95773:727;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;91850:319;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;26355:234;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;89317:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;88990:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;91576:124;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;89221:23;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33148:407;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;94977:124;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;93605:429;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;89070:25;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;92553:407;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;88946:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;93331:75;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;89191:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26746:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;92174:149;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;88044:220;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;91738:83;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;18404:639;18489:4;18828:10;18813:25;;:11;:25;;;;:102;;;;18905:10;18890:25;;:11;:25;;;;18813:102;:179;;;;18982:10;18967:25;;:11;:25;;;;18813:179;18793:199;;18404:639;;;:::o;19306:100::-;19360:13;19393:5;19386:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19306:100;:::o;25797:218::-;25873:7;25898:16;25906:7;25898;:16::i;:::-;25893:64;;25923:34;;;;;;;;;;;;;;25893:64;25977:15;:24;25993:7;25977:24;;;;;;;;;;;:30;;;;;;;;;;;;25970:37;;25797:218;;;:::o;25230:408::-;25319:13;25335:16;25343:7;25335;:16::i;:::-;25319:32;;25391:5;25368:28;;:19;:17;:19::i;:::-;:28;;;25364:175;;25416:44;25433:5;25440:19;:17;:19::i;:::-;25416:16;:44::i;:::-;25411:128;;25488:35;;;;;;;;;;;;;;25411:128;25364:175;25584:2;25551:15;:24;25567:7;25551:24;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;25622:7;25618:2;25602:28;;25611:5;25602:28;;;;;;;;;;;;25308:330;25230:408;;:::o;89037:19::-;;;;:::o;95322:125::-;95393:4;95411:13;95425:19;95433:10;95425:7;:19::i;:::-;95411:34;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;95404:41;;95322:125;;;:::o;93199:94::-;86997:13;:11;:13::i;:::-;93281:10:::1;93269:9;:22;;;;;;:::i;:::-;;93199:94:::0;:::o;15057:323::-;15118:7;15346:15;:13;:15::i;:::-;15331:12;;15315:13;;:28;:46;15308:53;;15057:323;:::o;29436:2825::-;29578:27;29608;29627:7;29608:18;:27::i;:::-;29578:57;;29693:4;29652:45;;29668:19;29652:45;;;29648:86;;29706:28;;;;;;;;;;;;;;29648:86;29748:27;29777:23;29804:35;29831:7;29804:26;:35::i;:::-;29747:92;;;;29939:68;29964:15;29981:4;29987:19;:17;:19::i;:::-;29939:24;:68::i;:::-;29934:180;;30027:43;30044:4;30050:19;:17;:19::i;:::-;30027:16;:43::i;:::-;30022:92;;30079:35;;;;;;;;;;;;;;30022:92;29934:180;30145:1;30131:16;;:2;:16;;;30127:52;;30156:23;;;;;;;;;;;;;;30127:52;30192:43;30214:4;30220:2;30224:7;30233:1;30192:21;:43::i;:::-;30328:15;30325:160;;;30468:1;30447:19;30440:30;30325:160;30865:18;:24;30884:4;30865:24;;;;;;;;;;;;;;;;30863:26;;;;;;;;;;;;30934:18;:22;30953:2;30934:22;;;;;;;;;;;;;;;;30932:24;;;;;;;;;;;31256:146;31293:2;31342:45;31357:4;31363:2;31367:19;31342:14;:45::i;:::-;11456:8;31314:73;31256:18;:146::i;:::-;31227:17;:26;31245:7;31227:26;;;;;;;;;;;:175;;;;31573:1;11456:8;31522:19;:47;:52;31518:627;;31595:19;31627:1;31617:7;:11;31595:33;;31784:1;31750:17;:30;31768:11;31750:30;;;;;;;;;;;;:35;31746:384;;31888:13;;31873:11;:28;31869:242;;32068:19;32035:17;:30;32053:11;32035:30;;;;;;;;;;;:52;;;;31869:242;31746:384;31576:569;31518:627;32192:7;32188:2;32173:27;;32182:4;32173:27;;;;;;;;;;;;32211:42;32232:4;32238:2;32242:7;32251:1;32211:20;:42::i;:::-;29567:2694;;;29436:2825;;;:::o;97091:110::-;86997:13;:11;:13::i;:::-;97181:17:::1;97162:9;;:37;;;;;;;;;;;;;;;;;;97091:110:::0;:::o;97562:400::-;86997:13;:11;:13::i;:::-;53780:21:::1;:19;:21::i;:::-;97679:7:::2;97700:14;;;;;;;;;;;97692:28;;97765:3;97752:10;;97728:21;:34;;;;:::i;:::-;:40;;;;:::i;:::-;97692:81;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;97678:95;;;97786:2;97778:11;;;::::0;::::2;;97869:7;97890:14;;;;;;;;;;;97882:28;;97918:21;97882:62;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;97868:76;;;97957:2;97949:11;;;::::0;::::2;;97612:350;;53824:20:::1;:18;:20::i;:::-;97562:400::o:0;91401:130::-;86997:13;:11;:13::i;:::-;91510:19:::1;91489:18;:40;;;;91401:130:::0;:::o;97336:108::-;86997:13;:11;:13::i;:::-;97427:15:::1;97410:14;;:32;;;;;;;;;;;;;;;;;;97336:108:::0;:::o;32357:193::-;32503:39;32520:4;32526:2;32530:7;32503:39;;;;;;;;;;;;:16;:39::i;:::-;32357:193;;;:::o;93451:91::-;86997:13;:11;:13::i;:::-;93530:10:::1;93518:9;;:22;;;;;;;;;;;;;;;;;;93451:91:::0;:::o;92965:126::-;86997:13;:11;:13::i;:::-;93071:18:::1;93051:17;:38;;;;;;:::i;:::-;;92965:126:::0;:::o;89352:28::-;;;;;;;;;;;;;:::o;88872:33::-;;;;:::o;89280:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;97449:108::-;86997:13;:11;:13::i;:::-;97540:15:::1;97523:14;;:32;;;;;;;;;;;;;;;;;;97449:108:::0;:::o;97239:92::-;86997:13;:11;:13::i;:::-;97318:11:::1;97305:10;:24;;;;97239:92:::0;:::o;89248:28::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;20699:152::-;20771:7;20814:27;20833:7;20814:18;:27::i;:::-;20791:52;;20699:152;;;:::o;94443:372::-;94535:7;94544;90007:13;90023:16;90031:7;90023;:16::i;:::-;90007:32;;90068:5;90052:21;;:12;:10;:12::i;:::-;:21;;;90044:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;90147:4;90122:29;;:21;90135:7;90122:12;:21::i;:::-;:29;;;90114:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;90215:34;90228:10;:19;90239:7;90228:19;;;;;;;;;;;90215:34;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;90189:22;90202:7;90189:22;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:60;90181:108;;;;;;;;;;;;:::i;:::-;;;;;;;;;90329:5;90302:32;;:23;90317:7;90302:14;:23::i;:::-;:32;;;90294:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;86997:13:::1;:11;:13::i;:::-;94650:1:::2;94620:10;:19;94631:7;94620:19;;;;;;;;;;;94614:33;;;;;:::i;:::-;;;:37;94610:95;;;94658:45;94676:10;:19;94687:7;94676:19;;;;;;;;;;;94658:45;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;94697:5;94658:17;:45::i;:::-;94610:95;94709:32;94727:7;94736:4;94709:17;:32::i;:::-;94768:7;94746:10;:19;94757:7;94746:19;;;;;;;;;;;:29;;;;;;:::i;:::-;;94796:7;94785:28;94805:7;94785:28;;;;;;:::i;:::-;;;;;;;;90002:366:::0;94443:372;;;;:::o;89163:24::-;;;;;;;;;;;;;:::o;95155:108::-;95217:13;95244:10;:17;95255:5;95244:17;;;;;;;;;;;95237:24;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;95155:108;;;:::o;16241:233::-;16313:7;16354:1;16337:19;;:5;:19;;;16333:60;;16365:28;;;;;;;;;;;;;;16333:60;10400:13;16411:18;:25;16430:5;16411:25;;;;;;;;;;;;;;;;:55;16404:62;;16241:233;;;:::o;87786:103::-;86997:13;:11;:13::i;:::-;87851:30:::1;87878:1;87851:18;:30::i;:::-;87786:103::o:0;93096:98::-;89609:9;;;;;;;;;;;89595:23;;:10;:23;;;89587:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;93182:10:::1;93170:9;:22;;;;;;:::i;:::-;;93096:98:::0;:::o;94039:399::-;94139:7;94148;90007:13;90023:16;90031:7;90023;:16::i;:::-;90007:32;;90068:5;90052:21;;:12;:10;:12::i;:::-;:21;;;90044:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;90147:4;90122:29;;:21;90135:7;90122:12;:21::i;:::-;:29;;;90114:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;90215:34;90228:10;:19;90239:7;90228:19;;;;;;;;;;;90215:34;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;90189:22;90202:7;90189:22;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:60;90181:108;;;;;;;;;;;;:::i;:::-;;;;;;;;;90329:5;90302:32;;:23;90317:7;90302:14;:23::i;:::-;:32;;;90294:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;90439:18:::1;;90426:9;:31;;90418:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;94273:1:::2;94243:10;:19;94254:7;94243:19;;;;;;;;;;;94237:33;;;;;:::i;:::-;;;:37;94233:95;;;94281:45;94299:10;:19;94310:7;94299:19;;;;;;;;;;;94281:45;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;94320:5;94281:17;:45::i;:::-;94233:95;94332:32;94350:7;94359:4;94332:17;:32::i;:::-;94391:7;94369:10;:19;94380:7;94369:19;;;;;;;;;;;:29;;;;;;:::i;:::-;;94419:7;94408:28;94428:7;94408:28;;;;;;:::i;:::-;;;;;;;;90002:366:::0;94039:399;;;;:::o;94860:112::-;86997:13;:11;:13::i;:::-;94954:16:::1;94936:15;:34;;;;94860:112:::0;:::o;96990:96::-;86997:13;:11;:13::i;:::-;97072:12:::1;97058:11;;:26;;;;;;;;;;;;;;;;;;96990:96:::0;:::o;87111:87::-;87157:7;87184:6;;;;;;;;;;;87177:13;;87111:87;:::o;96553:396::-;96610:13;96629:17;96655:3;96629:30;;96664:19;96696:4;:11;96686:22;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;96664:44;;96718:6;96713:209;96734:4;:11;96730:1;:15;96713:209;;;96806:2;96794:4;96799:1;96794:7;;;;;;;;:::i;:::-;;;;;;;;;;96788:14;;:20;;;;96787:48;;;;;96832:2;96820:4;96825:1;96820:7;;;;;;;;:::i;:::-;;;;;;;;;;96814:14;;:20;;;;96787:48;96783:138;;;96879:2;96868:4;96873:1;96868:7;;;;;;;;:::i;:::-;;;;;;;;;;96862:14;;:19;;;;:::i;:::-;96855:27;;96843:6;96850:1;96843:9;;;;;;;;:::i;:::-;;;;;:39;;;;;;;;;;;96783:138;;;96912:4;96917:1;96912:7;;;;;;;;:::i;:::-;;;;;;;;;;96900:6;96907:1;96900:9;;;;;;;;:::i;:::-;;;;;:19;;;;;;;;;;;96783:138;96747:3;;;;;;;96713:209;;;;96940:6;96926:21;;;;96553:396;;;:::o;88909:33::-;;;;:::o;19482:104::-;19538:13;19571:7;19564:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19482:104;:::o;88835:33::-;;;;:::o;95773:727::-;95835:4;95845:14;95868:3;95845:27;;95891:1;95880;:8;:12;95877:29;;;95901:5;95894:12;;;;;95877:29;95925:2;95914:1;:8;:13;95911:30;;;95936:5;95929:12;;;;;95911:30;95996:4;95988:12;;:1;95990;95988:4;;;;;;;;:::i;:::-;;;;;;;;;;:12;;;;95985:29;;96009:5;96002:12;;;;;95985:29;96059:4;96040:23;;:1;96053;96042;:8;:12;;;;:::i;:::-;96040:15;;;;;;;;:::i;:::-;;;;;;;;;;:23;;;;96036:41;;96072:5;96065:12;;;;;96036:41;96100:15;96118:1;96120;96118:4;;;;;;;;:::i;:::-;;;;;;;;;;96100:22;;96131:6;96127:356;96141:1;:8;96139:1;:10;96127:356;;;96160:11;96174:1;96176;96174:4;;;;;;;;:::i;:::-;;;;;;;;;;96160:18;;96195:4;96187:12;;:4;:12;;;;:32;;;;;96215:4;96203:16;;:8;:16;;;;96187:32;96183:50;;;96228:5;96221:12;;;;;;;;96183:50;96292:4;96284:12;;:4;:12;;;;;:28;;;;;96308:4;96300:12;;:4;:12;;;;;96284:28;96282:31;:76;;;;;96337:4;96329:12;;:4;:12;;;;;:28;;;;;96353:4;96345:12;;:4;:12;;;;;96329:28;96327:31;96282:76;:121;;;;;96382:4;96374:12;;:4;:12;;;;;:28;;;;;96398:4;96390:12;;:4;:12;;;;;96374:28;96372:31;96282:121;:150;;;;;96427:4;96419:12;;:4;:12;;;;96417:15;96282:150;96273:188;;;96456:5;96449:12;;;;;;;;96273:188;96477:4;96466:15;;96155:328;96151:3;;;;;;;96127:356;;;;96494:4;96487:11;;;;95773:727;;;;:::o;91850:319::-;91915:11;89751:12;;89736:11;89720:13;:11;:13::i;:::-;:27;;;;:::i;:::-;:43;;89712:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;91948:11:::1;89884;89877:4;;:18;;;;:::i;:::-;89864:9;:31;;89856:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;91993:18:::2;;91974:15;:37;;91966:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;92063:1;92049:11;:15;:52;;;;;92083:18;;92068:11;:33;;92049:52;92041:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;92131:36;92141:12;:10;:12::i;:::-;92155:11;92131:9;:36::i;:::-;89793:1:::1;91850:319:::0;;:::o;26355:234::-;26502:8;26450:18;:39;26469:19;:17;:19::i;:::-;26450:39;;;;;;;;;;;;;;;:49;26490:8;26450:49;;;;;;;;;;;;;;;;:60;;;;;;;;;;;;;;;;;;26562:8;26526:55;;26541:19;:17;:19::i;:::-;26526:55;;;26572:8;26526:55;;;;;;:::i;:::-;;;;;;;;26355:234;;:::o;89317:31::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;88990:33::-;;;;:::o;91576:124::-;86997:13;:11;:13::i;:::-;91679:19:::1;91658:18;:40;;;;91576:124:::0;:::o;89221:23::-;;;;;;;;;;;;;:::o;33148:407::-;33323:31;33336:4;33342:2;33346:7;33323:12;:31::i;:::-;33387:1;33369:2;:14;;;:19;33365:183;;33408:56;33439:4;33445:2;33449:7;33458:5;33408:30;:56::i;:::-;33403:145;;33492:40;;;;;;;;;;;;;;33403:145;33365:183;33148:407;;;;:::o;94977:124::-;86997:13;:11;:13::i;:::-;95080:19:::1;95059:18;:40;;;;94977:124:::0;:::o;93605:429::-;93695:7;93704;90007:13;90023:16;90031:7;90023;:16::i;:::-;90007:32;;90068:5;90052:21;;:12;:10;:12::i;:::-;:21;;;90044:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;90147:4;90122:29;;:21;90135:7;90122:12;:21::i;:::-;:29;;;90114:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;90215:34;90228:10;:19;90239:7;90228:19;;;;;;;;;;;90215:34;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;90189:22;90202:7;90189:22;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:60;90181:108;;;;;;;;;;;;:::i;:::-;;;;;;;;;90329:5;90302:32;;:23;90317:7;90302:14;:23::i;:::-;:32;;;90294:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;93718:9:::1;;;;;;;;;;;:22;;;93741:10;93752:11;;;;;;;;;;;93765:15;;93718:63;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;93869:1;93839:10;:19;93850:7;93839:19;;;;;;;;;;;93833:33;;;;;:::i;:::-;;;:37;93829:95;;;93877:45;93895:10;:19;93906:7;93895:19;;;;;;;;;;;93877:45;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;93916:5;93877:17;:45::i;:::-;93829:95;93928:32;93946:7;93955:4;93928:17;:32::i;:::-;93987:7;93965:10;:19;93976:7;93965:19;;;;;;;;;;;:29;;;;;;:::i;:::-;;94015:7;94004:28;94024:7;94004:28;;;;;;:::i;:::-;;;;;;;;90002:366:::0;93605:429;;;;:::o;89070:25::-;;;;:::o;92553:407::-;92627:13;92655:17;92663:8;92655:7;:17::i;:::-;92647:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;92745:5;92733:17;;:8;;;;;;;;;;;:17;;;92729:54;;92764:17;92757:24;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;92729:54;92787:28;92818:10;:8;:10::i;:::-;92787:41;;92871:1;92846:14;92840:28;:32;:118;;;;;;;;;;;;;;;;;92902:14;92918:19;:8;:17;:19::i;:::-;92939:9;92885:64;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;92840:118;92833:125;;;92553:407;;;;:::o;88946:30::-;;;;:::o;93331:75::-;86997:13;:11;:13::i;:::-;93398:6:::1;93387:8;;:17;;;;;;;;;;;;;;;;;;93331:75:::0;:::o;89191:26::-;;;;;;;;;;;;;:::o;26746:164::-;26843:4;26867:18;:25;26886:5;26867:25;;;;;;;;;;;;;;;:35;26893:8;26867:35;;;;;;;;;;;;;;;;;;;;;;;;;26860:42;;26746:164;;;;:::o;92174:149::-;92260:11;89751:12;;89736:11;89720:13;:11;:13::i;:::-;:27;;;;:::i;:::-;:43;;89712:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;86997:13:::1;:11;:13::i;:::-;92288:33:::2;92298:9;92309:11;92288:9;:33::i;:::-;92174:149:::0;;;:::o;88044:220::-;86997:13;:11;:13::i;:::-;88149:1:::1;88129:22;;:8;:22;;::::0;88125:93:::1;;88203:1;88175:31;;;;;;;;;;;:::i;:::-;;;;;;;;88125:93;88228:28;88247:8;88228:18;:28::i;:::-;88044:220:::0;:::o;91738:83::-;86997:13;:11;:13::i;:::-;91809:10:::1;91802:4;:17;;;;91738:83:::0;:::o;27168:282::-;27233:4;27289:7;27270:15;:13;:15::i;:::-;:26;;:66;;;;;27323:13;;27313:7;:23;27270:66;:153;;;;;27422:1;11176:8;27374:17;:26;27392:7;27374:26;;;;;;;;;;;;:44;:49;27270:153;27250:173;;27168:282;;;:::o;49476:105::-;49536:7;49563:10;49556:17;;49476:105;:::o;87276:166::-;87347:12;:10;:12::i;:::-;87336:23;;:7;:5;:7::i;:::-;:23;;;87332:103;;87410:12;:10;:12::i;:::-;87383:40;;;;;;;;;;;:::i;:::-;;;;;;;;87332:103;87276:166::o;92328:89::-;92393:7;92414:1;92407:8;;92328:89;:::o;21854:1275::-;21921:7;21941:12;21956:7;21941:22;;22024:4;22005:15;:13;:15::i;:::-;:23;22001:1061;;22058:13;;22051:4;:20;22047:1015;;;22096:14;22113:17;:23;22131:4;22113:23;;;;;;;;;;;;22096:40;;22230:1;11176:8;22202:6;:24;:29;22198:845;;22867:113;22884:1;22874:6;:11;22867:113;;22927:17;:25;22945:6;;;;;;;22927:25;;;;;;;;;;;;22918:34;;22867:113;;;23013:6;23006:13;;;;;;22198:845;22073:989;22047:1015;22001:1061;23090:31;;;;;;;;;;;;;;21854:1275;;;;:::o;28331:485::-;28433:27;28462:23;28503:38;28544:15;:24;28560:7;28544:24;;;;;;;;;;;28503:65;;28721:18;28698:41;;28778:19;28772:26;28753:45;;28683:126;28331:485;;;:::o;27559:659::-;27708:11;27873:16;27866:5;27862:28;27853:37;;28033:16;28022:9;28018:32;28005:45;;28183:15;28172:9;28169:30;28161:5;28150:9;28147:20;28144:56;28134:66;;27559:659;;;;;:::o;34217:159::-;;;;;:::o;48785:311::-;48920:7;48940:16;11580:3;48966:19;:41;;48940:68;;11580:3;49034:31;49045:4;49051:2;49055:9;49034:10;:31::i;:::-;49026:40;;:62;;49019:69;;;48785:311;;;;;:::o;23677:450::-;23757:14;23925:16;23918:5;23914:28;23905:37;;24102:5;24088:11;24063:23;24059:41;24056:52;24049:5;24046:63;24036:73;;23677:450;;;;:::o;35041:158::-;;;;;:::o;53860:293::-;53262:1;53994:7;;:19;53986:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;53262:1;54127:7;:18;;;;53860:293::o;54161:213::-;53218:1;54344:7;:22;;;;54161:213::o;85227:98::-;85280:7;85307:10;85300:17;;85227:98;:::o;95542:117::-;95648:9;95618:13;95632:12;95640:3;95632:7;:12::i;:::-;95618:27;;;;;;:::i;:::-;;;;;;;;;;;;;;:39;;;;;;;;;;;;;;;;;;95542:117;;:::o;88424:191::-;88498:16;88517:6;;;;;;;;;;;88498:25;;88543:8;88534:6;;:17;;;;;;;;;;;;;;;;;;88598:8;88567:40;;88588:8;88567:40;;;;;;;;;;;;88487:128;88424:191;:::o;43308:112::-;43385:27;43395:2;43399:8;43385:27;;;;;;;;;;;;:9;:27::i;:::-;43308:112;;:::o;35639:716::-;35802:4;35848:2;35823:45;;;35869:19;:17;:19::i;:::-;35890:4;35896:7;35905:5;35823:88;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;35819:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36123:1;36106:6;:13;:18;36102:235;;36152:40;;;;;;;;;;;;;;36102:235;36295:6;36289:13;36280:6;36276:2;36272:15;36265:38;35819:529;35992:54;;;35982:64;;;:6;:64;;;;35975:71;;;35639:716;;;;;;:::o;92450:98::-;92510:13;92537:9;92530:16;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;92450:98;:::o;81997:718::-;82053:13;82104:14;82141:1;82121:17;82132:5;82121:10;:17::i;:::-;:21;82104:38;;82157:20;82191:6;82180:18;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;82157:41;;82213:11;82342:6;82338:2;82334:15;82326:6;82322:28;82315:35;;82379:290;82386:4;82379:290;;;82411:5;;;;;;;;82553:10;82548:2;82541:5;82537:14;82532:32;82527:3;82519:46;82611:2;82602:11;;;;;;:::i;:::-;;;;;82645:1;82636:5;:10;82379:290;82632:21;82379:290;82690:6;82683:13;;;;;81997:718;;;:::o;48486:147::-;48623:6;48486:147;;;;;:::o;42535:689::-;42666:19;42672:2;42676:8;42666:5;:19::i;:::-;42745:1;42727:2;:14;;;:19;42723:483;;42767:11;42781:13;;42767:27;;42813:13;42835:8;42829:3;:14;42813:30;;42862:233;42893:62;42932:1;42936:2;42940:7;;;;;;42949:5;42893:30;:62::i;:::-;42888:167;;42991:40;;;;;;;;;;;;;;42888:167;43090:3;43082:5;:11;42862:233;;43177:3;43160:13;;:20;43156:34;;43182:8;;;43156:34;42748:458;;42723:483;42535:689;;;:::o;78401:948::-;78454:7;78474:14;78491:1;78474:18;;78541:8;78532:5;:17;78528:106;;78579:8;78570:17;;;;;;:::i;:::-;;;;;78616:2;78606:12;;;;78528:106;78661:8;78652:5;:17;78648:106;;78699:8;78690:17;;;;;;:::i;:::-;;;;;78736:2;78726:12;;;;78648:106;78781:8;78772:5;:17;78768:106;;78819:8;78810:17;;;;;;:::i;:::-;;;;;78856:2;78846:12;;;;78768:106;78901:7;78892:5;:16;78888:103;;78938:7;78929:16;;;;;;:::i;:::-;;;;;78974:1;78964:11;;;;78888:103;79018:7;79009:5;:16;79005:103;;79055:7;79046:16;;;;;;:::i;:::-;;;;;79091:1;79081:11;;;;79005:103;79135:7;79126:5;:16;79122:103;;79172:7;79163:16;;;;;;:::i;:::-;;;;;79208:1;79198:11;;;;79122:103;79252:7;79243:5;:16;79239:68;;79290:1;79280:11;;;;79239:68;79335:6;79328:13;;;78401:948;;;:::o;36817:2966::-;36890:20;36913:13;;36890:36;;36953:1;36941:8;:13;36937:44;;36963:18;;;;;;;;;;;;;;36937:44;36994:61;37024:1;37028:2;37032:12;37046:8;36994:21;:61::i;:::-;37538:1;10538:2;37508:1;:26;;37507:32;37495:8;:45;37469:18;:22;37488:2;37469:22;;;;;;;;;;;;;;;;:71;;;;;;;;;;;37817:139;37854:2;37908:33;37931:1;37935:2;37939:1;37908:14;:33::i;:::-;37875:30;37896:8;37875:20;:30::i;:::-;:66;37817:18;:139::i;:::-;37783:17;:31;37801:12;37783:31;;;;;;;;;;;:173;;;;37973:16;38004:11;38033:8;38018:12;:23;38004:37;;38554:16;38550:2;38546:25;38534:37;;38926:12;38886:8;38845:1;38783:25;38724:1;38663;38636:335;39297:1;39283:12;39279:20;39237:346;39338:3;39329:7;39326:16;39237:346;;39556:7;39546:8;39543:1;39516:25;39513:1;39510;39505:59;39391:1;39382:7;39378:15;39367:26;;39237:346;;;39241:77;39628:1;39616:8;:13;39612:45;;39638:19;;;;;;;;;;;;;;39612:45;39690:3;39674:13;:19;;;;37243:2462;;39715:60;39744:1;39748:2;39752:12;39766:8;39715:20;:60::i;:::-;36879:2904;36817:2966;;:::o;24229:324::-;24299:14;24532:1;24522:8;24519:15;24493:24;24489:46;24479:56;;24229:324;;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:99::-;1570:6;1604:5;1598:12;1588:22;;1518:99;;;:::o;1623:169::-;1707:11;1741:6;1736:3;1729:19;1781:4;1776:3;1772:14;1757:29;;1623:169;;;;:::o;1798:246::-;1879:1;1889:113;1903:6;1900:1;1897:13;1889:113;;;1988:1;1983:3;1979:11;1973:18;1969:1;1964:3;1960:11;1953:39;1925:2;1922:1;1918:10;1913:15;;1889:113;;;2036:1;2027:6;2022:3;2018:16;2011:27;1860:184;1798:246;;;:::o;2050:102::-;2091:6;2142:2;2138:7;2133:2;2126:5;2122:14;2118:28;2108:38;;2050:102;;;:::o;2158:377::-;2246:3;2274:39;2307:5;2274:39;:::i;:::-;2329:71;2393:6;2388:3;2329:71;:::i;:::-;2322:78;;2409:65;2467:6;2462:3;2455:4;2448:5;2444:16;2409:65;:::i;:::-;2499:29;2521:6;2499:29;:::i;:::-;2494:3;2490:39;2483:46;;2250:285;2158:377;;;;:::o;2541:313::-;2654:4;2692:2;2681:9;2677:18;2669:26;;2741:9;2735:4;2731:20;2727:1;2716:9;2712:17;2705:47;2769:78;2842:4;2833:6;2769:78;:::i;:::-;2761:86;;2541:313;;;;:::o;2860:77::-;2897:7;2926:5;2915:16;;2860:77;;;:::o;2943:122::-;3016:24;3034:5;3016:24;:::i;:::-;3009:5;3006:35;2996:63;;3055:1;3052;3045:12;2996:63;2943:122;:::o;3071:139::-;3117:5;3155:6;3142:20;3133:29;;3171:33;3198:5;3171:33;:::i;:::-;3071:139;;;;:::o;3216:329::-;3275:6;3324:2;3312:9;3303:7;3299:23;3295:32;3292:119;;;3330:79;;:::i;:::-;3292:119;3450:1;3475:53;3520:7;3511:6;3500:9;3496:22;3475:53;:::i;:::-;3465:63;;3421:117;3216:329;;;;:::o;3551:126::-;3588:7;3628:42;3621:5;3617:54;3606:65;;3551:126;;;:::o;3683:96::-;3720:7;3749:24;3767:5;3749:24;:::i;:::-;3738:35;;3683:96;;;:::o;3785:118::-;3872:24;3890:5;3872:24;:::i;:::-;3867:3;3860:37;3785:118;;:::o;3909:222::-;4002:4;4040:2;4029:9;4025:18;4017:26;;4053:71;4121:1;4110:9;4106:17;4097:6;4053:71;:::i;:::-;3909:222;;;;:::o;4137:122::-;4210:24;4228:5;4210:24;:::i;:::-;4203:5;4200:35;4190:63;;4249:1;4246;4239:12;4190:63;4137:122;:::o;4265:139::-;4311:5;4349:6;4336:20;4327:29;;4365:33;4392:5;4365:33;:::i;:::-;4265:139;;;;:::o;4410:474::-;4478:6;4486;4535:2;4523:9;4514:7;4510:23;4506:32;4503:119;;;4541:79;;:::i;:::-;4503:119;4661:1;4686:53;4731:7;4722:6;4711:9;4707:22;4686:53;:::i;:::-;4676:63;;4632:117;4788:2;4814:53;4859:7;4850:6;4839:9;4835:22;4814:53;:::i;:::-;4804:63;;4759:118;4410:474;;;;;:::o;4890:118::-;4977:24;4995:5;4977:24;:::i;:::-;4972:3;4965:37;4890:118;;:::o;5014:222::-;5107:4;5145:2;5134:9;5130:18;5122:26;;5158:71;5226:1;5215:9;5211:17;5202:6;5158:71;:::i;:::-;5014:222;;;;:::o;5242:117::-;5351:1;5348;5341:12;5365:117;5474:1;5471;5464:12;5488:180;5536:77;5533:1;5526:88;5633:4;5630:1;5623:15;5657:4;5654:1;5647:15;5674:281;5757:27;5779:4;5757:27;:::i;:::-;5749:6;5745:40;5887:6;5875:10;5872:22;5851:18;5839:10;5836:34;5833:62;5830:88;;;5898:18;;:::i;:::-;5830:88;5938:10;5934:2;5927:22;5717:238;5674:281;;:::o;5961:129::-;5995:6;6022:20;;:::i;:::-;6012:30;;6051:33;6079:4;6071:6;6051:33;:::i;:::-;5961:129;;;:::o;6096:308::-;6158:4;6248:18;6240:6;6237:30;6234:56;;;6270:18;;:::i;:::-;6234:56;6308:29;6330:6;6308:29;:::i;:::-;6300:37;;6392:4;6386;6382:15;6374:23;;6096:308;;;:::o;6410:146::-;6507:6;6502:3;6497;6484:30;6548:1;6539:6;6534:3;6530:16;6523:27;6410:146;;;:::o;6562:425::-;6640:5;6665:66;6681:49;6723:6;6681:49;:::i;:::-;6665:66;:::i;:::-;6656:75;;6754:6;6747:5;6740:21;6792:4;6785:5;6781:16;6830:3;6821:6;6816:3;6812:16;6809:25;6806:112;;;6837:79;;:::i;:::-;6806:112;6927:54;6974:6;6969:3;6964;6927:54;:::i;:::-;6646:341;6562:425;;;;;:::o;7007:340::-;7063:5;7112:3;7105:4;7097:6;7093:17;7089:27;7079:122;;7120:79;;:::i;:::-;7079:122;7237:6;7224:20;7262:79;7337:3;7329:6;7322:4;7314:6;7310:17;7262:79;:::i;:::-;7253:88;;7069:278;7007:340;;;;:::o;7353:509::-;7422:6;7471:2;7459:9;7450:7;7446:23;7442:32;7439:119;;;7477:79;;:::i;:::-;7439:119;7625:1;7614:9;7610:17;7597:31;7655:18;7647:6;7644:30;7641:117;;;7677:79;;:::i;:::-;7641:117;7782:63;7837:7;7828:6;7817:9;7813:22;7782:63;:::i;:::-;7772:73;;7568:287;7353:509;;;;:::o;7868:619::-;7945:6;7953;7961;8010:2;7998:9;7989:7;7985:23;7981:32;7978:119;;;8016:79;;:::i;:::-;7978:119;8136:1;8161:53;8206:7;8197:6;8186:9;8182:22;8161:53;:::i;:::-;8151:63;;8107:117;8263:2;8289:53;8334:7;8325:6;8314:9;8310:22;8289:53;:::i;:::-;8279:63;;8234:118;8391:2;8417:53;8462:7;8453:6;8442:9;8438:22;8417:53;:::i;:::-;8407:63;;8362:118;7868:619;;;;;:::o;8493:329::-;8552:6;8601:2;8589:9;8580:7;8576:23;8572:32;8569:119;;;8607:79;;:::i;:::-;8569:119;8727:1;8752:53;8797:7;8788:6;8777:9;8773:22;8752:53;:::i;:::-;8742:63;;8698:117;8493:329;;;;:::o;8828:654::-;8906:6;8914;8963:2;8951:9;8942:7;8938:23;8934:32;8931:119;;;8969:79;;:::i;:::-;8931:119;9089:1;9114:53;9159:7;9150:6;9139:9;9135:22;9114:53;:::i;:::-;9104:63;;9060:117;9244:2;9233:9;9229:18;9216:32;9275:18;9267:6;9264:30;9261:117;;;9297:79;;:::i;:::-;9261:117;9402:63;9457:7;9448:6;9437:9;9433:22;9402:63;:::i;:::-;9392:73;;9187:288;8828:654;;;;;:::o;9488:116::-;9558:21;9573:5;9558:21;:::i;:::-;9551:5;9548:32;9538:60;;9594:1;9591;9584:12;9538:60;9488:116;:::o;9610:133::-;9653:5;9691:6;9678:20;9669:29;;9707:30;9731:5;9707:30;:::i;:::-;9610:133;;;;:::o;9749:468::-;9814:6;9822;9871:2;9859:9;9850:7;9846:23;9842:32;9839:119;;;9877:79;;:::i;:::-;9839:119;9997:1;10022:53;10067:7;10058:6;10047:9;10043:22;10022:53;:::i;:::-;10012:63;;9968:117;10124:2;10150:50;10192:7;10183:6;10172:9;10168:22;10150:50;:::i;:::-;10140:60;;10095:115;9749:468;;;;;:::o;10223:60::-;10251:3;10272:5;10265:12;;10223:60;;;:::o;10289:142::-;10339:9;10372:53;10390:34;10399:24;10417:5;10399:24;:::i;:::-;10390:34;:::i;:::-;10372:53;:::i;:::-;10359:66;;10289:142;;;:::o;10437:126::-;10487:9;10520:37;10551:5;10520:37;:::i;:::-;10507:50;;10437:126;;;:::o;10569:141::-;10634:9;10667:37;10698:5;10667:37;:::i;:::-;10654:50;;10569:141;;;:::o;10716:161::-;10818:52;10864:5;10818:52;:::i;:::-;10813:3;10806:65;10716:161;;:::o;10883:252::-;10991:4;11029:2;11018:9;11014:18;11006:26;;11042:86;11125:1;11114:9;11110:17;11101:6;11042:86;:::i;:::-;10883:252;;;;:::o;11141:307::-;11202:4;11292:18;11284:6;11281:30;11278:56;;;11314:18;;:::i;:::-;11278:56;11352:29;11374:6;11352:29;:::i;:::-;11344:37;;11436:4;11430;11426:15;11418:23;;11141:307;;;:::o;11454:423::-;11531:5;11556:65;11572:48;11613:6;11572:48;:::i;:::-;11556:65;:::i;:::-;11547:74;;11644:6;11637:5;11630:21;11682:4;11675:5;11671:16;11720:3;11711:6;11706:3;11702:16;11699:25;11696:112;;;11727:79;;:::i;:::-;11696:112;11817:54;11864:6;11859:3;11854;11817:54;:::i;:::-;11537:340;11454:423;;;;;:::o;11896:338::-;11951:5;12000:3;11993:4;11985:6;11981:17;11977:27;11967:122;;12008:79;;:::i;:::-;11967:122;12125:6;12112:20;12150:78;12224:3;12216:6;12209:4;12201:6;12197:17;12150:78;:::i;:::-;12141:87;;11957:277;11896:338;;;;:::o;12240:943::-;12335:6;12343;12351;12359;12408:3;12396:9;12387:7;12383:23;12379:33;12376:120;;;12415:79;;:::i;:::-;12376:120;12535:1;12560:53;12605:7;12596:6;12585:9;12581:22;12560:53;:::i;:::-;12550:63;;12506:117;12662:2;12688:53;12733:7;12724:6;12713:9;12709:22;12688:53;:::i;:::-;12678:63;;12633:118;12790:2;12816:53;12861:7;12852:6;12841:9;12837:22;12816:53;:::i;:::-;12806:63;;12761:118;12946:2;12935:9;12931:18;12918:32;12977:18;12969:6;12966:30;12963:117;;;12999:79;;:::i;:::-;12963:117;13104:62;13158:7;13149:6;13138:9;13134:22;13104:62;:::i;:::-;13094:72;;12889:287;12240:943;;;;;;;:::o;13189:323::-;13245:6;13294:2;13282:9;13273:7;13269:23;13265:32;13262:119;;;13300:79;;:::i;:::-;13262:119;13420:1;13445:50;13487:7;13478:6;13467:9;13463:22;13445:50;:::i;:::-;13435:60;;13391:114;13189:323;;;;:::o;13518:474::-;13586:6;13594;13643:2;13631:9;13622:7;13618:23;13614:32;13611:119;;;13649:79;;:::i;:::-;13611:119;13769:1;13794:53;13839:7;13830:6;13819:9;13815:22;13794:53;:::i;:::-;13784:63;;13740:117;13896:2;13922:53;13967:7;13958:6;13947:9;13943:22;13922:53;:::i;:::-;13912:63;;13867:118;13518:474;;;;;:::o;13998:::-;14066:6;14074;14123:2;14111:9;14102:7;14098:23;14094:32;14091:119;;;14129:79;;:::i;:::-;14091:119;14249:1;14274:53;14319:7;14310:6;14299:9;14295:22;14274:53;:::i;:::-;14264:63;;14220:117;14376:2;14402:53;14447:7;14438:6;14427:9;14423:22;14402:53;:::i;:::-;14392:63;;14347:118;13998:474;;;;;:::o;14478:180::-;14526:77;14523:1;14516:88;14623:4;14620:1;14613:15;14647:4;14644:1;14637:15;14664:320;14708:6;14745:1;14739:4;14735:12;14725:22;;14792:1;14786:4;14782:12;14813:18;14803:81;;14869:4;14861:6;14857:17;14847:27;;14803:81;14931:2;14923:6;14920:14;14900:18;14897:38;14894:84;;14950:18;;:::i;:::-;14894:84;14715:269;14664:320;;;:::o;14990:148::-;15092:11;15129:3;15114:18;;14990:148;;;;:::o;15144:390::-;15250:3;15278:39;15311:5;15278:39;:::i;:::-;15333:89;15415:6;15410:3;15333:89;:::i;:::-;15326:96;;15431:65;15489:6;15484:3;15477:4;15470:5;15466:16;15431:65;:::i;:::-;15521:6;15516:3;15512:16;15505:23;;15254:280;15144:390;;;;:::o;15540:275::-;15672:3;15694:95;15785:3;15776:6;15694:95;:::i;:::-;15687:102;;15806:3;15799:10;;15540:275;;;;:::o;15821:141::-;15870:4;15893:3;15885:11;;15916:3;15913:1;15906:14;15950:4;15947:1;15937:18;15929:26;;15821:141;;;:::o;15968:93::-;16005:6;16052:2;16047;16040:5;16036:14;16032:23;16022:33;;15968:93;;;:::o;16067:107::-;16111:8;16161:5;16155:4;16151:16;16130:37;;16067:107;;;;:::o;16180:393::-;16249:6;16299:1;16287:10;16283:18;16322:97;16352:66;16341:9;16322:97;:::i;:::-;16440:39;16470:8;16459:9;16440:39;:::i;:::-;16428:51;;16512:4;16508:9;16501:5;16497:21;16488:30;;16561:4;16551:8;16547:19;16540:5;16537:30;16527:40;;16256:317;;16180:393;;;;;:::o;16579:142::-;16629:9;16662:53;16680:34;16689:24;16707:5;16689:24;:::i;:::-;16680:34;:::i;:::-;16662:53;:::i;:::-;16649:66;;16579:142;;;:::o;16727:75::-;16770:3;16791:5;16784:12;;16727:75;;;:::o;16808:269::-;16918:39;16949:7;16918:39;:::i;:::-;16979:91;17028:41;17052:16;17028:41;:::i;:::-;17020:6;17013:4;17007:11;16979:91;:::i;:::-;16973:4;16966:105;16884:193;16808:269;;;:::o;17083:73::-;17128:3;17083:73;:::o;17162:189::-;17239:32;;:::i;:::-;17280:65;17338:6;17330;17324:4;17280:65;:::i;:::-;17215:136;17162:189;;:::o;17357:186::-;17417:120;17434:3;17427:5;17424:14;17417:120;;;17488:39;17525:1;17518:5;17488:39;:::i;:::-;17461:1;17454:5;17450:13;17441:22;;17417:120;;;17357:186;;:::o;17549:543::-;17650:2;17645:3;17642:11;17639:446;;;17684:38;17716:5;17684:38;:::i;:::-;17768:29;17786:10;17768:29;:::i;:::-;17758:8;17754:44;17951:2;17939:10;17936:18;17933:49;;;17972:8;17957:23;;17933:49;17995:80;18051:22;18069:3;18051:22;:::i;:::-;18041:8;18037:37;18024:11;17995:80;:::i;:::-;17654:431;;17639:446;17549:543;;;:::o;18098:117::-;18152:8;18202:5;18196:4;18192:16;18171:37;;18098:117;;;;:::o;18221:169::-;18265:6;18298:51;18346:1;18342:6;18334:5;18331:1;18327:13;18298:51;:::i;:::-;18294:56;18379:4;18373;18369:15;18359:25;;18272:118;18221:169;;;;:::o;18395:295::-;18471:4;18617:29;18642:3;18636:4;18617:29;:::i;:::-;18609:37;;18679:3;18676:1;18672:11;18666:4;18663:21;18655:29;;18395:295;;;;:::o;18695:1395::-;18812:37;18845:3;18812:37;:::i;:::-;18914:18;18906:6;18903:30;18900:56;;;18936:18;;:::i;:::-;18900:56;18980:38;19012:4;19006:11;18980:38;:::i;:::-;19065:67;19125:6;19117;19111:4;19065:67;:::i;:::-;19159:1;19183:4;19170:17;;19215:2;19207:6;19204:14;19232:1;19227:618;;;;19889:1;19906:6;19903:77;;;19955:9;19950:3;19946:19;19940:26;19931:35;;19903:77;20006:67;20066:6;20059:5;20006:67;:::i;:::-;20000:4;19993:81;19862:222;19197:887;;19227:618;19279:4;19275:9;19267:6;19263:22;19313:37;19345:4;19313:37;:::i;:::-;19372:1;19386:208;19400:7;19397:1;19394:14;19386:208;;;19479:9;19474:3;19470:19;19464:26;19456:6;19449:42;19530:1;19522:6;19518:14;19508:24;;19577:2;19566:9;19562:18;19549:31;;19423:4;19420:1;19416:12;19411:17;;19386:208;;;19622:6;19613:7;19610:19;19607:179;;;19680:9;19675:3;19671:19;19665:26;19723:48;19765:4;19757:6;19753:17;19742:9;19723:48;:::i;:::-;19715:6;19708:64;19630:156;19607:179;19832:1;19828;19820:6;19816:14;19812:22;19806:4;19799:36;19234:611;;;19197:887;;18787:1303;;;18695:1395;;:::o;20096:180::-;20144:77;20141:1;20134:88;20241:4;20238:1;20231:15;20265:4;20262:1;20255:15;20282:410;20322:7;20345:20;20363:1;20345:20;:::i;:::-;20340:25;;20379:20;20397:1;20379:20;:::i;:::-;20374:25;;20434:1;20431;20427:9;20456:30;20474:11;20456:30;:::i;:::-;20445:41;;20635:1;20626:7;20622:15;20619:1;20616:22;20596:1;20589:9;20569:83;20546:139;;20665:18;;:::i;:::-;20546:139;20330:362;20282:410;;;;:::o;20698:180::-;20746:77;20743:1;20736:88;20843:4;20840:1;20833:15;20867:4;20864:1;20857:15;20884:185;20924:1;20941:20;20959:1;20941:20;:::i;:::-;20936:25;;20975:20;20993:1;20975:20;:::i;:::-;20970:25;;21014:1;21004:35;;21019:18;;:::i;:::-;21004:35;21061:1;21058;21054:9;21049:14;;20884:185;;;;:::o;21075:147::-;21176:11;21213:3;21198:18;;21075:147;;;;:::o;21228:114::-;;:::o;21348:398::-;21507:3;21528:83;21609:1;21604:3;21528:83;:::i;:::-;21521:90;;21620:93;21709:3;21620:93;:::i;:::-;21738:1;21733:3;21729:11;21722:18;;21348:398;;;:::o;21752:379::-;21936:3;21958:147;22101:3;21958:147;:::i;:::-;21951:154;;22122:3;22115:10;;21752:379;;;:::o;22137:181::-;22277:33;22273:1;22265:6;22261:14;22254:57;22137:181;:::o;22324:366::-;22466:3;22487:67;22551:2;22546:3;22487:67;:::i;:::-;22480:74;;22563:93;22652:3;22563:93;:::i;:::-;22681:2;22676:3;22672:12;22665:19;;22324:366;;;:::o;22696:419::-;22862:4;22900:2;22889:9;22885:18;22877:26;;22949:9;22943:4;22939:20;22935:1;22924:9;22920:17;22913:47;22977:131;23103:4;22977:131;:::i;:::-;22969:139;;22696:419;;;:::o;23121:170::-;23261:22;23257:1;23249:6;23245:14;23238:46;23121:170;:::o;23297:366::-;23439:3;23460:67;23524:2;23519:3;23460:67;:::i;:::-;23453:74;;23536:93;23625:3;23536:93;:::i;:::-;23654:2;23649:3;23645:12;23638:19;;23297:366;;;:::o;23669:419::-;23835:4;23873:2;23862:9;23858:18;23850:26;;23922:9;23916:4;23912:20;23908:1;23897:9;23893:17;23886:47;23950:131;24076:4;23950:131;:::i;:::-;23942:139;;23669:419;;;:::o;24094:144::-;24146:4;24169:3;24161:11;;24192:3;24189:1;24182:14;24226:4;24223:1;24213:18;24205:26;;24094:144;;;:::o;24266:878::-;24371:3;24408:5;24402:12;24437:36;24463:9;24437:36;:::i;:::-;24489:88;24570:6;24565:3;24489:88;:::i;:::-;24482:95;;24608:1;24597:9;24593:17;24624:1;24619:166;;;;24799:1;24794:344;;;;24586:552;;24619:166;24703:4;24699:9;24688;24684:25;24679:3;24672:38;24765:6;24758:14;24751:22;24743:6;24739:35;24734:3;24730:45;24723:52;;24619:166;;24794:344;24861:41;24896:5;24861:41;:::i;:::-;24924:1;24938:154;24952:6;24949:1;24946:13;24938:154;;;25026:7;25020:14;25016:1;25011:3;25007:11;25000:35;25076:1;25067:7;25063:15;25052:26;;24974:4;24971:1;24967:12;24962:17;;24938:154;;;25121:6;25116:3;25112:16;25105:23;;24801:337;;24586:552;;24375:769;;24266:878;;;;:::o;25150:273::-;25281:3;25303:94;25393:3;25384:6;25303:94;:::i;:::-;25296:101;;25414:3;25407:10;;25150:273;;;;:::o;25429:77::-;25466:7;25495:5;25484:16;;25429:77;;;:::o;25512:122::-;25585:24;25603:5;25585:24;:::i;:::-;25578:5;25575:35;25565:63;;25624:1;25621;25614:12;25565:63;25512:122;:::o;25640:143::-;25697:5;25728:6;25722:13;25713:22;;25744:33;25771:5;25744:33;:::i;:::-;25640:143;;;;:::o;25789:351::-;25859:6;25908:2;25896:9;25887:7;25883:23;25879:32;25876:119;;;25914:79;;:::i;:::-;25876:119;26034:1;26059:64;26115:7;26106:6;26095:9;26091:22;26059:64;:::i;:::-;26049:74;;26005:128;25789:351;;;;:::o;26146:98::-;26197:6;26231:5;26225:12;26215:22;;26146:98;;;:::o;26250:386::-;26354:3;26382:38;26414:5;26382:38;:::i;:::-;26436:88;26517:6;26512:3;26436:88;:::i;:::-;26429:95;;26533:65;26591:6;26586:3;26579:4;26572:5;26568:16;26533:65;:::i;:::-;26623:6;26618:3;26614:16;26607:23;;26358:278;26250:386;;;;:::o;26642:271::-;26772:3;26794:93;26883:3;26874:6;26794:93;:::i;:::-;26787:100;;26904:3;26897:10;;26642:271;;;;:::o;26919:222::-;27059:34;27055:1;27047:6;27043:14;27036:58;27128:5;27123:2;27115:6;27111:15;27104:30;26919:222;:::o;27147:366::-;27289:3;27310:67;27374:2;27369:3;27310:67;:::i;:::-;27303:74;;27386:93;27475:3;27386:93;:::i;:::-;27504:2;27499:3;27495:12;27488:19;;27147:366;;;:::o;27519:419::-;27685:4;27723:2;27712:9;27708:18;27700:26;;27772:9;27766:4;27762:20;27758:1;27747:9;27743:17;27736:47;27800:131;27926:4;27800:131;:::i;:::-;27792:139;;27519:419;;;:::o;27944:171::-;28084:23;28080:1;28072:6;28068:14;28061:47;27944:171;:::o;28121:366::-;28263:3;28284:67;28348:2;28343:3;28284:67;:::i;:::-;28277:74;;28360:93;28449:3;28360:93;:::i;:::-;28478:2;28473:3;28469:12;28462:19;;28121:366;;;:::o;28493:419::-;28659:4;28697:2;28686:9;28682:18;28674:26;;28746:9;28740:4;28736:20;28732:1;28721:9;28717:17;28710:47;28774:131;28900:4;28774:131;:::i;:::-;28766:139;;28493:419;;;:::o;28918:177::-;29058:29;29054:1;29046:6;29042:14;29035:53;28918:177;:::o;29101:366::-;29243:3;29264:67;29328:2;29323:3;29264:67;:::i;:::-;29257:74;;29340:93;29429:3;29340:93;:::i;:::-;29458:2;29453:3;29449:12;29442:19;;29101:366;;;:::o;29473:419::-;29639:4;29677:2;29666:9;29662:18;29654:26;;29726:9;29720:4;29716:20;29712:1;29701:9;29697:17;29690:47;29754:131;29880:4;29754:131;:::i;:::-;29746:139;;29473:419;;;:::o;29898:169::-;30038:21;30034:1;30026:6;30022:14;30015:45;29898:169;:::o;30073:366::-;30215:3;30236:67;30300:2;30295:3;30236:67;:::i;:::-;30229:74;;30312:93;30401:3;30312:93;:::i;:::-;30430:2;30425:3;30421:12;30414:19;;30073:366;;;:::o;30445:419::-;30611:4;30649:2;30638:9;30634:18;30626:26;;30698:9;30692:4;30688:20;30684:1;30673:9;30669:17;30662:47;30726:131;30852:4;30726:131;:::i;:::-;30718:139;;30445:419;;;:::o;30870:180::-;30918:77;30915:1;30908:88;31015:4;31012:1;31005:15;31039:4;31036:1;31029:15;31056:86;31091:7;31131:4;31124:5;31120:16;31109:27;;31056:86;;;:::o;31148:188::-;31186:3;31205:18;31221:1;31205:18;:::i;:::-;31200:23;;31237:18;31253:1;31237:18;:::i;:::-;31232:23;;31278:1;31275;31271:9;31264:16;;31301:4;31296:3;31293:13;31290:39;;;31309:18;;:::i;:::-;31290:39;31148:188;;;;:::o;31342:194::-;31382:4;31402:20;31420:1;31402:20;:::i;:::-;31397:25;;31436:20;31454:1;31436:20;:::i;:::-;31431:25;;31480:1;31477;31473:9;31465:17;;31504:1;31498:4;31495:11;31492:37;;;31509:18;;:::i;:::-;31492:37;31342:194;;;;:::o;31542:191::-;31582:3;31601:20;31619:1;31601:20;:::i;:::-;31596:25;;31635:20;31653:1;31635:20;:::i;:::-;31630:25;;31678:1;31675;31671:9;31664:16;;31699:3;31696:1;31693:10;31690:36;;;31706:18;;:::i;:::-;31690:36;31542:191;;;;:::o;31739:170::-;31879:22;31875:1;31867:6;31863:14;31856:46;31739:170;:::o;31915:366::-;32057:3;32078:67;32142:2;32137:3;32078:67;:::i;:::-;32071:74;;32154:93;32243:3;32154:93;:::i;:::-;32272:2;32267:3;32263:12;32256:19;;31915:366;;;:::o;32287:419::-;32453:4;32491:2;32480:9;32476:18;32468:26;;32540:9;32534:4;32530:20;32526:1;32515:9;32511:17;32504:47;32568:131;32694:4;32568:131;:::i;:::-;32560:139;;32287:419;;;:::o;32712:170::-;32852:22;32848:1;32840:6;32836:14;32829:46;32712:170;:::o;32888:366::-;33030:3;33051:67;33115:2;33110:3;33051:67;:::i;:::-;33044:74;;33127:93;33216:3;33127:93;:::i;:::-;33245:2;33240:3;33236:12;33229:19;;32888:366;;;:::o;33260:419::-;33426:4;33464:2;33453:9;33449:18;33441:26;;33513:9;33507:4;33503:20;33499:1;33488:9;33484:17;33477:47;33541:131;33667:4;33541:131;:::i;:::-;33533:139;;33260:419;;;:::o;33685:170::-;33825:22;33821:1;33813:6;33809:14;33802:46;33685:170;:::o;33861:366::-;34003:3;34024:67;34088:2;34083:3;34024:67;:::i;:::-;34017:74;;34100:93;34189:3;34100:93;:::i;:::-;34218:2;34213:3;34209:12;34202:19;;33861:366;;;:::o;34233:419::-;34399:4;34437:2;34426:9;34422:18;34414:26;;34486:9;34480:4;34476:20;34472:1;34461:9;34457:17;34450:47;34514:131;34640:4;34514:131;:::i;:::-;34506:139;;34233:419;;;:::o;34658:442::-;34807:4;34845:2;34834:9;34830:18;34822:26;;34858:71;34926:1;34915:9;34911:17;34902:6;34858:71;:::i;:::-;34939:72;35007:2;34996:9;34992:18;34983:6;34939:72;:::i;:::-;35021;35089:2;35078:9;35074:18;35065:6;35021:72;:::i;:::-;34658:442;;;;;;:::o;35106:137::-;35160:5;35191:6;35185:13;35176:22;;35207:30;35231:5;35207:30;:::i;:::-;35106:137;;;;:::o;35249:345::-;35316:6;35365:2;35353:9;35344:7;35340:23;35336:32;35333:119;;;35371:79;;:::i;:::-;35333:119;35491:1;35516:61;35569:7;35560:6;35549:9;35545:22;35516:61;:::i;:::-;35506:71;;35462:125;35249:345;;;;:::o;35600:234::-;35740:34;35736:1;35728:6;35724:14;35717:58;35809:17;35804:2;35796:6;35792:15;35785:42;35600:234;:::o;35840:366::-;35982:3;36003:67;36067:2;36062:3;36003:67;:::i;:::-;35996:74;;36079:93;36168:3;36079:93;:::i;:::-;36197:2;36192:3;36188:12;36181:19;;35840:366;;;:::o;36212:419::-;36378:4;36416:2;36405:9;36401:18;36393:26;;36465:9;36459:4;36455:20;36451:1;36440:9;36436:17;36429:47;36493:131;36619:4;36493:131;:::i;:::-;36485:139;;36212:419;;;:::o;36661:874::-;36764:3;36801:5;36795:12;36830:36;36856:9;36830:36;:::i;:::-;36882:89;36964:6;36959:3;36882:89;:::i;:::-;36875:96;;37002:1;36991:9;36987:17;37018:1;37013:166;;;;37193:1;37188:341;;;;36980:549;;37013:166;37097:4;37093:9;37082;37078:25;37073:3;37066:38;37159:6;37152:14;37145:22;37137:6;37133:35;37128:3;37124:45;37117:52;;37013:166;;37188:341;37255:38;37287:5;37255:38;:::i;:::-;37315:1;37329:154;37343:6;37340:1;37337:13;37329:154;;;37417:7;37411:14;37407:1;37402:3;37398:11;37391:35;37467:1;37458:7;37454:15;37443:26;;37365:4;37362:1;37358:12;37353:17;;37329:154;;;37512:6;37507:3;37503:16;37496:23;;37195:334;;36980:549;;36768:767;;36661:874;;;;:::o;37541:589::-;37766:3;37788:95;37879:3;37870:6;37788:95;:::i;:::-;37781:102;;37900:95;37991:3;37982:6;37900:95;:::i;:::-;37893:102;;38012:92;38100:3;38091:6;38012:92;:::i;:::-;38005:99;;38121:3;38114:10;;37541:589;;;;;;:::o;38136:181::-;38276:33;38272:1;38264:6;38260:14;38253:57;38136:181;:::o;38323:366::-;38465:3;38486:67;38550:2;38545:3;38486:67;:::i;:::-;38479:74;;38562:93;38651:3;38562:93;:::i;:::-;38680:2;38675:3;38671:12;38664:19;;38323:366;;;:::o;38695:419::-;38861:4;38899:2;38888:9;38884:18;38876:26;;38948:9;38942:4;38938:20;38934:1;38923:9;38919:17;38912:47;38976:131;39102:4;38976:131;:::i;:::-;38968:139;;38695:419;;;:::o;39120:168::-;39203:11;39237:6;39232:3;39225:19;39277:4;39272:3;39268:14;39253:29;;39120:168;;;;:::o;39294:373::-;39380:3;39408:38;39440:5;39408:38;:::i;:::-;39462:70;39525:6;39520:3;39462:70;:::i;:::-;39455:77;;39541:65;39599:6;39594:3;39587:4;39580:5;39576:16;39541:65;:::i;:::-;39631:29;39653:6;39631:29;:::i;:::-;39626:3;39622:39;39615:46;;39384:283;39294:373;;;;:::o;39673:640::-;39868:4;39906:3;39895:9;39891:19;39883:27;;39920:71;39988:1;39977:9;39973:17;39964:6;39920:71;:::i;:::-;40001:72;40069:2;40058:9;40054:18;40045:6;40001:72;:::i;:::-;40083;40151:2;40140:9;40136:18;40127:6;40083:72;:::i;:::-;40202:9;40196:4;40192:20;40187:2;40176:9;40172:18;40165:48;40230:76;40301:4;40292:6;40230:76;:::i;:::-;40222:84;;39673:640;;;;;;;:::o;40319:141::-;40375:5;40406:6;40400:13;40391:22;;40422:32;40448:5;40422:32;:::i;:::-;40319:141;;;;:::o;40466:349::-;40535:6;40584:2;40572:9;40563:7;40559:23;40555:32;40552:119;;;40590:79;;:::i;:::-;40552:119;40710:1;40735:63;40790:7;40781:6;40770:9;40766:22;40735:63;:::i;:::-;40725:73;;40681:127;40466:349;;;;:::o
Swarm Source
ipfs://cf2a693f2fe409cf0f171578f1218cc405c5f5ebc7f05c7ee5aaef7d96ea4ab3
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.