ETH Price: $3,164.22 (-8.56%)
Gas: 3 Gwei

Token

LetsLoveLain (LoveLain)
 

Overview

Max Total Supply

999 LoveLain

Holders

534

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
boyibo.eth
Balance
1 LoveLain
0x30d385e930ddc80052393ee152affc74b08b448f
Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information
# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
LoveLain

Compiler Version
v0.8.4+commit.c7e474f2

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license
File 1 of 11 : LoveLain.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.4;

import "@openzeppelin/contracts/access/Ownable.sol";
import "erc721a/contracts/ERC721A.sol";

contract LoveLain is ERC721A, Ownable {

    string public baseURI;
    uint256 public constant MAX_MINT_PER_ADDR = 3;
    uint256 public constant MAX_SUPPLY = 999;
    uint256 public PRICE = 0.003 ether;

    bool public saleIsActive = true;

    event Minted(address minter, uint256 amount);
    event BaseURIChanged(string newBaseURI);

    constructor(string memory initBaseURI) ERC721A("LetsLoveLain", "LoveLain") {
        baseURI = initBaseURI;
    }

    function _baseURI() internal view override returns (string memory) {
        return baseURI;
    }

    function mint(uint256 quantity) external payable {
        require(saleIsActive, "Not started yet");
        require(tx.origin == msg.sender, "No contract calls allowed");
        require(
            numberMinted(msg.sender) + quantity <= MAX_MINT_PER_ADDR,
            "Max mint per address."
        );
        require(
            totalSupply() + quantity <= MAX_SUPPLY,
            "Purchase would exceed max supply of tokens"
        );

        _safeMint(msg.sender, quantity);

        emit Minted(msg.sender, quantity);
    }


    function numberMinted(address owner) public view returns (uint256) {
        return _numberMinted(owner);
    }


    function toggleSaleState() external onlyOwner {
        saleIsActive = !saleIsActive;
    }

    function setBaseURI(string calldata newBaseURI) external onlyOwner {
        baseURI = newBaseURI;
        emit BaseURIChanged(newBaseURI);
    }

    function setPRICE(uint256 _newPRRICE) public onlyOwner {
    PRICE = _newPRRICE;
    }

    function withdraw(address payable recipient) external onlyOwner {
        uint256 balance = address(this).balance;
        (bool success, ) = recipient.call{value: balance}("");
        require(success, "U don't love Lain...");
    }
}

File 2 of 11 : Ownable.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (access/Ownable.sol)

pragma solidity ^0.8.0;

import "../utils/Context.sol";

/**
 * @dev Contract module which provides a basic access control mechanism, where
 * there is an account (an owner) that can be granted exclusive access to
 * specific functions.
 *
 * By default, the owner account will be the one that deploys the contract. This
 * can later be changed with {transferOwnership}.
 *
 * This module is used through inheritance. It will make available the modifier
 * `onlyOwner`, which can be applied to your functions to restrict their use to
 * the owner.
 */
abstract contract Ownable is Context {
    address private _owner;

    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor() {
        _transferOwnership(_msgSender());
    }

    /**
     * @dev Returns the address of the current owner.
     */
    function owner() public view virtual returns (address) {
        return _owner;
    }

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
        _;
    }

    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions anymore. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby removing any functionality that is only available to the owner.
     */
    function renounceOwnership() public virtual onlyOwner {
        _transferOwnership(address(0));
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Can only be called by the current owner.
     */
    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        _transferOwnership(newOwner);
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Internal function without access restriction.
     */
    function _transferOwnership(address newOwner) internal virtual {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

File 3 of 11 : ERC721A.sol
// SPDX-License-Identifier: MIT
// Creator: Chiru Labs

pragma solidity ^0.8.4;

import '@openzeppelin/contracts/token/ERC721/IERC721.sol';
import '@openzeppelin/contracts/token/ERC721/IERC721Receiver.sol';
import '@openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol';
import '@openzeppelin/contracts/utils/Address.sol';
import '@openzeppelin/contracts/utils/Context.sol';
import '@openzeppelin/contracts/utils/Strings.sol';
import '@openzeppelin/contracts/utils/introspection/ERC165.sol';

error ApprovalCallerNotOwnerNorApproved();
error ApprovalQueryForNonexistentToken();
error ApproveToCaller();
error ApprovalToCurrentOwner();
error BalanceQueryForZeroAddress();
error MintToZeroAddress();
error MintZeroQuantity();
error OwnerQueryForNonexistentToken();
error TransferCallerNotOwnerNorApproved();
error TransferFromIncorrectOwner();
error TransferToNonERC721ReceiverImplementer();
error TransferToZeroAddress();
error URIQueryForNonexistentToken();

/**
 * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including
 * the Metadata extension. Built to optimize for lower gas during batch mints.
 *
 * Assumes serials are sequentially minted starting at _startTokenId() (defaults to 0, e.g. 0, 1, 2, 3..).
 *
 * Assumes that an owner cannot have more than 2**64 - 1 (max value of uint64) of supply.
 *
 * Assumes that the maximum token id cannot exceed 2**256 - 1 (max value of uint256).
 */
contract ERC721A is Context, ERC165, IERC721, IERC721Metadata {
    using Address for address;
    using Strings for uint256;

    // Compiler will pack this into a single 256bit word.
    struct TokenOwnership {
        // The address of the owner.
        address addr;
        // Keeps track of the start time of ownership with minimal overhead for tokenomics.
        uint64 startTimestamp;
        // Whether the token has been burned.
        bool burned;
    }

    // Compiler will pack this into a single 256bit word.
    struct AddressData {
        // Realistically, 2**64-1 is more than enough.
        uint64 balance;
        // Keeps track of mint count with minimal overhead for tokenomics.
        uint64 numberMinted;
        // Keeps track of burn count with minimal overhead for tokenomics.
        uint64 numberBurned;
        // For miscellaneous variable(s) pertaining to the address
        // (e.g. number of whitelist mint slots used).
        // If there are multiple variables, please pack them into a uint64.
        uint64 aux;
    }

    // The tokenId of the next token to be minted.
    uint256 internal _currentIndex;

    // The number of tokens burned.
    uint256 internal _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 _ownershipOf implementation for details.
    mapping(uint256 => TokenOwnership) internal _ownerships;

    // Mapping owner address to address data
    mapping(address => AddressData) private _addressData;

    // Mapping from token ID to approved address
    mapping(uint256 => address) private _tokenApprovals;

    // Mapping from owner to operator approvals
    mapping(address => mapping(address => bool)) private _operatorApprovals;

    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
        _currentIndex = _startTokenId();
    }

    /**
     * To change the starting tokenId, please override this function.
     */
    function _startTokenId() internal view virtual returns (uint256) {
        return 0;
    }

    /**
     * @dev Burned tokens are calculated here, use _totalMinted() if you want to count just minted tokens.
     */
    function totalSupply() public view returns (uint256) {
        // Counter underflow is impossible as _burnCounter cannot be incremented
        // more than _currentIndex - _startTokenId() times
        unchecked {
            return _currentIndex - _burnCounter - _startTokenId();
        }
    }

    /**
     * Returns the total amount of tokens minted in the contract.
     */
    function _totalMinted() internal view returns (uint256) {
        // Counter underflow is impossible as _currentIndex does not decrement,
        // and it is initialized to _startTokenId()
        unchecked {
            return _currentIndex - _startTokenId();
        }
    }

    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) {
        return
            interfaceId == type(IERC721).interfaceId ||
            interfaceId == type(IERC721Metadata).interfaceId ||
            super.supportsInterface(interfaceId);
    }

    /**
     * @dev See {IERC721-balanceOf}.
     */
    function balanceOf(address owner) public view override returns (uint256) {
        if (owner == address(0)) revert BalanceQueryForZeroAddress();
        return uint256(_addressData[owner].balance);
    }

    /**
     * Returns the number of tokens minted by `owner`.
     */
    function _numberMinted(address owner) internal view returns (uint256) {
        return uint256(_addressData[owner].numberMinted);
    }

    /**
     * Returns the number of tokens burned by or on behalf of `owner`.
     */
    function _numberBurned(address owner) internal view returns (uint256) {
        return uint256(_addressData[owner].numberBurned);
    }

    /**
     * Returns the auxillary data for `owner`. (e.g. number of whitelist mint slots used).
     */
    function _getAux(address owner) internal view returns (uint64) {
        return _addressData[owner].aux;
    }

    /**
     * Sets the auxillary 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 {
        _addressData[owner].aux = aux;
    }

    /**
     * Gas spent here starts off proportional to the maximum mint batch size.
     * It gradually moves to O(1) as tokens get transferred around in the collection over time.
     */
    function _ownershipOf(uint256 tokenId) internal view returns (TokenOwnership memory) {
        uint256 curr = tokenId;

        unchecked {
            if (_startTokenId() <= curr && curr < _currentIndex) {
                TokenOwnership memory ownership = _ownerships[curr];
                if (!ownership.burned) {
                    if (ownership.addr != address(0)) {
                        return ownership;
                    }
                    // Invariant:
                    // There will always be an ownership that has an address and is not burned
                    // before an ownership that does not have an address and is not burned.
                    // Hence, curr will not underflow.
                    while (true) {
                        curr--;
                        ownership = _ownerships[curr];
                        if (ownership.addr != address(0)) {
                            return ownership;
                        }
                    }
                }
            }
        }
        revert OwnerQueryForNonexistentToken();
    }

    /**
     * @dev See {IERC721-ownerOf}.
     */
    function ownerOf(uint256 tokenId) public view override returns (address) {
        return _ownershipOf(tokenId).addr;
    }

    /**
     * @dev See {IERC721Metadata-name}.
     */
    function name() public view virtual override returns (string memory) {
        return _name;
    }

    /**
     * @dev See {IERC721Metadata-symbol}.
     */
    function symbol() public view virtual override returns (string memory) {
        return _symbol;
    }

    /**
     * @dev See {IERC721Metadata-tokenURI}.
     */
    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        if (!_exists(tokenId)) revert URIQueryForNonexistentToken();

        string memory baseURI = _baseURI();
        return bytes(baseURI).length != 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : '';
    }

    /**
     * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each
     * token will be the concatenation of the `baseURI` and the `tokenId`. Empty
     * by default, can be overriden in child contracts.
     */
    function _baseURI() internal view virtual returns (string memory) {
        return '';
    }

    /**
     * @dev See {IERC721-approve}.
     */
    function approve(address to, uint256 tokenId) public override {
        address owner = ERC721A.ownerOf(tokenId);
        if (to == owner) revert ApprovalToCurrentOwner();

        if (_msgSender() != owner && !isApprovedForAll(owner, _msgSender())) {
            revert ApprovalCallerNotOwnerNorApproved();
        }

        _approve(to, tokenId, owner);
    }

    /**
     * @dev See {IERC721-getApproved}.
     */
    function getApproved(uint256 tokenId) public view override returns (address) {
        if (!_exists(tokenId)) revert ApprovalQueryForNonexistentToken();

        return _tokenApprovals[tokenId];
    }

    /**
     * @dev See {IERC721-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved) public virtual override {
        if (operator == _msgSender()) revert ApproveToCaller();

        _operatorApprovals[_msgSender()][operator] = approved;
        emit ApprovalForAll(_msgSender(), operator, approved);
    }

    /**
     * @dev See {IERC721-isApprovedForAll}.
     */
    function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) {
        return _operatorApprovals[owner][operator];
    }

    /**
     * @dev See {IERC721-transferFrom}.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        _transfer(from, to, tokenId);
    }

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        safeTransferFrom(from, to, tokenId, '');
    }

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) public virtual override {
        _transfer(from, to, tokenId);
        if (to.isContract() && !_checkContractOnERC721Received(from, to, tokenId, _data)) {
            revert TransferToNonERC721ReceiverImplementer();
        }
    }

    /**
     * @dev Returns whether `tokenId` exists.
     *
     * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}.
     *
     * Tokens start existing when they are minted (`_mint`),
     */
    function _exists(uint256 tokenId) internal view returns (bool) {
        return _startTokenId() <= tokenId && tokenId < _currentIndex && !_ownerships[tokenId].burned;
    }

    function _safeMint(address to, uint256 quantity) internal {
        _safeMint(to, 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.
     *
     * Emits a {Transfer} event.
     */
    function _safeMint(
        address to,
        uint256 quantity,
        bytes memory _data
    ) internal {
        _mint(to, quantity, _data, true);
    }

    /**
     * @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.
     */
    function _mint(
        address to,
        uint256 quantity,
        bytes memory _data,
        bool safe
    ) internal {
        uint256 startTokenId = _currentIndex;
        if (to == address(0)) revert MintToZeroAddress();
        if (quantity == 0) revert MintZeroQuantity();

        _beforeTokenTransfers(address(0), to, startTokenId, quantity);

        // Overflows are incredibly unrealistic.
        // balance or numberMinted overflow if current value of either + quantity > 1.8e19 (2**64) - 1
        // updatedIndex overflows if _currentIndex + quantity > 1.2e77 (2**256) - 1
        unchecked {
            _addressData[to].balance += uint64(quantity);
            _addressData[to].numberMinted += uint64(quantity);

            _ownerships[startTokenId].addr = to;
            _ownerships[startTokenId].startTimestamp = uint64(block.timestamp);

            uint256 updatedIndex = startTokenId;
            uint256 end = updatedIndex + quantity;

            if (safe && to.isContract()) {
                do {
                    emit Transfer(address(0), to, updatedIndex);
                    if (!_checkContractOnERC721Received(address(0), to, updatedIndex++, _data)) {
                        revert TransferToNonERC721ReceiverImplementer();
                    }
                } while (updatedIndex != end);
                // Reentrancy protection
                if (_currentIndex != startTokenId) revert();
            } else {
                do {
                    emit Transfer(address(0), to, updatedIndex++);
                } while (updatedIndex != end);
            }
            _currentIndex = updatedIndex;
        }
        _afterTokenTransfers(address(0), to, startTokenId, quantity);
    }

    /**
     * @dev Transfers `tokenId` from `from` to `to`.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     *
     * Emits a {Transfer} event.
     */
    function _transfer(
        address from,
        address to,
        uint256 tokenId
    ) private {
        TokenOwnership memory prevOwnership = _ownershipOf(tokenId);

        if (prevOwnership.addr != from) revert TransferFromIncorrectOwner();

        bool isApprovedOrOwner = (_msgSender() == from ||
            isApprovedForAll(from, _msgSender()) ||
            getApproved(tokenId) == _msgSender());

        if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved();
        if (to == address(0)) revert TransferToZeroAddress();

        _beforeTokenTransfers(from, to, tokenId, 1);

        // Clear approvals from the previous owner
        _approve(address(0), tokenId, from);

        // 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 {
            _addressData[from].balance -= 1;
            _addressData[to].balance += 1;

            TokenOwnership storage currSlot = _ownerships[tokenId];
            currSlot.addr = to;
            currSlot.startTimestamp = uint64(block.timestamp);

            // If the ownership slot of tokenId+1 is not explicitly set, that means the transfer initiator owns it.
            // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls.
            uint256 nextTokenId = tokenId + 1;
            TokenOwnership storage nextSlot = _ownerships[nextTokenId];
            if (nextSlot.addr == address(0)) {
                // This will suffice for checking _exists(nextTokenId),
                // as a burned slot cannot contain the zero address.
                if (nextTokenId != _currentIndex) {
                    nextSlot.addr = from;
                    nextSlot.startTimestamp = prevOwnership.startTimestamp;
                }
            }
        }

        emit Transfer(from, to, tokenId);
        _afterTokenTransfers(from, to, tokenId, 1);
    }

    /**
     * @dev This is 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 {
        TokenOwnership memory prevOwnership = _ownershipOf(tokenId);

        address from = prevOwnership.addr;

        if (approvalCheck) {
            bool isApprovedOrOwner = (_msgSender() == from ||
                isApprovedForAll(from, _msgSender()) ||
                getApproved(tokenId) == _msgSender());

            if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved();
        }

        _beforeTokenTransfers(from, address(0), tokenId, 1);

        // Clear approvals from the previous owner
        _approve(address(0), tokenId, from);

        // 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 {
            AddressData storage addressData = _addressData[from];
            addressData.balance -= 1;
            addressData.numberBurned += 1;

            // Keep track of who burned the token, and the timestamp of burning.
            TokenOwnership storage currSlot = _ownerships[tokenId];
            currSlot.addr = from;
            currSlot.startTimestamp = uint64(block.timestamp);
            currSlot.burned = true;

            // If the ownership slot of tokenId+1 is not explicitly set, that means the burn initiator owns it.
            // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls.
            uint256 nextTokenId = tokenId + 1;
            TokenOwnership storage nextSlot = _ownerships[nextTokenId];
            if (nextSlot.addr == address(0)) {
                // This will suffice for checking _exists(nextTokenId),
                // as a burned slot cannot contain the zero address.
                if (nextTokenId != _currentIndex) {
                    nextSlot.addr = from;
                    nextSlot.startTimestamp = prevOwnership.startTimestamp;
                }
            }
        }

        emit Transfer(from, address(0), tokenId);
        _afterTokenTransfers(from, address(0), tokenId, 1);

        // Overflow not possible, as _burnCounter cannot be exceed _currentIndex times.
        unchecked {
            _burnCounter++;
        }
    }

    /**
     * @dev Approve `to` to operate on `tokenId`
     *
     * Emits a {Approval} event.
     */
    function _approve(
        address to,
        uint256 tokenId,
        address owner
    ) private {
        _tokenApprovals[tokenId] = to;
        emit Approval(owner, to, tokenId);
    }

    /**
     * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target contract.
     *
     * @param from address representing the previous owner of the given token ID
     * @param to target address that will receive the tokens
     * @param tokenId uint256 ID of the token to be transferred
     * @param _data bytes optional data to send along with the call
     * @return bool whether the call correctly returned the expected magic value
     */
    function _checkContractOnERC721Received(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) private returns (bool) {
        try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) {
            return retval == IERC721Receiver(to).onERC721Received.selector;
        } catch (bytes memory reason) {
            if (reason.length == 0) {
                revert TransferToNonERC721ReceiverImplementer();
            } else {
                assembly {
                    revert(add(32, reason), mload(reason))
                }
            }
        }
    }

    /**
     * @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 {}
}

File 4 of 11 : Context.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)

pragma solidity ^0.8.0;

/**
 * @dev Provides information about the current execution context, including the
 * sender of the transaction and its data. While these are generally available
 * via msg.sender and msg.data, they should not be accessed in such a direct
 * manner, since when dealing with meta-transactions the account sending and
 * paying for execution may not be the actual sender (as far as an application
 * is concerned).
 *
 * This contract is only required for intermediate, library-like contracts.
 */
abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

    function _msgData() internal view virtual returns (bytes calldata) {
        return msg.data;
    }
}

File 5 of 11 : IERC721.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721.sol)

pragma solidity ^0.8.0;

import "../../utils/introspection/IERC165.sol";

/**
 * @dev Required interface of an ERC721 compliant contract.
 */
interface IERC721 is IERC165 {
    /**
     * @dev Emitted when `tokenId` token is transferred from `from` to `to`.
     */
    event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);

    /**
     * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token.
     */
    event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);

    /**
     * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets.
     */
    event ApprovalForAll(address indexed owner, address indexed operator, bool approved);

    /**
     * @dev Returns the number of tokens in ``owner``'s account.
     */
    function balanceOf(address owner) external view returns (uint256 balance);

    /**
     * @dev Returns the owner of the `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function ownerOf(uint256 tokenId) external view returns (address owner);

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`, 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
    ) external;

    /**
     * @dev Transfers `tokenId` token from `from` to `to`.
     *
     * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

    /**
     * @dev Gives permission to `to` to transfer `tokenId` token to another account.
     * The approval is cleared when the token is transferred.
     *
     * Only a single account can be approved at a time, so approving the zero address clears previous approvals.
     *
     * Requirements:
     *
     * - The caller must own the token or be an approved operator.
     * - `tokenId` must exist.
     *
     * Emits an {Approval} event.
     */
    function approve(address to, uint256 tokenId) external;

    /**
     * @dev Returns the account approved for `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function getApproved(uint256 tokenId) external view returns (address operator);

    /**
     * @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 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);

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes calldata data
    ) external;
}

File 6 of 11 : IERC721Receiver.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721Receiver.sol)

pragma solidity ^0.8.0;

/**
 * @title ERC721 token receiver interface
 * @dev Interface for any contract that wants to support safeTransfers
 * from ERC721 asset contracts.
 */
interface IERC721Receiver {
    /**
     * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom}
     * by `operator` from `from`, this function is called.
     *
     * It must return its Solidity selector to confirm the token transfer.
     * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted.
     *
     * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`.
     */
    function onERC721Received(
        address operator,
        address from,
        uint256 tokenId,
        bytes calldata data
    ) external returns (bytes4);
}

File 7 of 11 : IERC721Metadata.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol)

pragma solidity ^0.8.0;

import "../IERC721.sol";

/**
 * @title ERC-721 Non-Fungible Token Standard, optional metadata extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Metadata is IERC721 {
    /**
     * @dev Returns the token collection name.
     */
    function name() external view returns (string memory);

    /**
     * @dev Returns the token collection symbol.
     */
    function symbol() external view returns (string memory);

    /**
     * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token.
     */
    function tokenURI(uint256 tokenId) external view returns (string memory);
}

File 8 of 11 : Address.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.5.0) (utils/Address.sol)

pragma solidity ^0.8.1;

/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     *
     * [IMPORTANT]
     * ====
     * You shouldn't rely on `isContract` to protect against flash loan attacks!
     *
     * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets
     * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract
     * constructor.
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize/address.code.length, which returns 0
        // for contracts in construction, since the code is only stored at the end
        // of the constructor execution.

        return account.code.length > 0;
    }

    /**
     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to
     * `recipient`, forwarding all available gas and reverting on errors.
     *
     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
     * of certain opcodes, possibly making contracts go over the 2300 gas limit
     * imposed by `transfer`, making them unable to receive funds via
     * `transfer`. {sendValue} removes this limitation.
     *
     * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].
     *
     * IMPORTANT: because control is transferred to `recipient`, care must be
     * taken to not create reentrancy vulnerabilities. Consider using
     * {ReentrancyGuard} or the
     * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
     */
    function sendValue(address payable recipient, uint256 amount) internal {
        require(address(this).balance >= amount, "Address: insufficient balance");

        (bool success, ) = recipient.call{value: amount}("");
        require(success, "Address: unable to send value, recipient may have reverted");
    }

    /**
     * @dev Performs a Solidity function call using a low level `call`. A
     * plain `call` is an unsafe replacement for a function call: use this
     * function instead.
     *
     * If `target` reverts with a revert reason, it is bubbled up by this
     * function (like regular Solidity function calls).
     *
     * Returns the raw returned data. To convert to the expected return value,
     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
     *
     * Requirements:
     *
     * - `target` must be a contract.
     * - calling `target` with `data` must not revert.
     *
     * _Available since v3.1._
     */
    function functionCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionCall(target, data, "Address: low-level call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
     * `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, 0, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but also transferring `value` wei to `target`.
     *
     * Requirements:
     *
     * - the calling contract must have an ETH balance of at least `value`.
     * - the called Solidity function must be `payable`.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
    }

    /**
     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
     * with `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(address(this).balance >= value, "Address: insufficient balance for call");
        require(isContract(target), "Address: call to non-contract");

        (bool success, bytes memory returndata) = target.call{value: value}(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
        return functionStaticCall(target, data, "Address: low-level static call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal view returns (bytes memory) {
        require(isContract(target), "Address: static call to non-contract");

        (bool success, bytes memory returndata) = target.staticcall(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionDelegateCall(target, data, "Address: low-level delegate call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(isContract(target), "Address: delegate call to non-contract");

        (bool success, bytes memory returndata) = target.delegatecall(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the
     * revert reason using the provided one.
     *
     * _Available since v4.3._
     */
    function verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal pure returns (bytes memory) {
        if (success) {
            return returndata;
        } else {
            // Look for revert reason and bubble it up if present
            if (returndata.length > 0) {
                // The easiest way to bubble the revert reason is using memory via assembly

                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

File 9 of 11 : Strings.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/Strings.sol)

pragma solidity ^0.8.0;

/**
 * @dev String operations.
 */
library Strings {
    bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef";

    /**
     * @dev Converts a `uint256` to its ASCII `string` decimal representation.
     */
    function toString(uint256 value) internal pure returns (string memory) {
        // Inspired by OraclizeAPI's implementation - MIT licence
        // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol

        if (value == 0) {
            return "0";
        }
        uint256 temp = value;
        uint256 digits;
        while (temp != 0) {
            digits++;
            temp /= 10;
        }
        bytes memory buffer = new bytes(digits);
        while (value != 0) {
            digits -= 1;
            buffer[digits] = bytes1(uint8(48 + uint256(value % 10)));
            value /= 10;
        }
        return string(buffer);
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.
     */
    function toHexString(uint256 value) internal pure returns (string memory) {
        if (value == 0) {
            return "0x00";
        }
        uint256 temp = value;
        uint256 length = 0;
        while (temp != 0) {
            length++;
            temp >>= 8;
        }
        return toHexString(value, length);
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.
     */
    function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {
        bytes memory buffer = new bytes(2 * length + 2);
        buffer[0] = "0";
        buffer[1] = "x";
        for (uint256 i = 2 * length + 1; i > 1; --i) {
            buffer[i] = _HEX_SYMBOLS[value & 0xf];
            value >>= 4;
        }
        require(value == 0, "Strings: hex length insufficient");
        return string(buffer);
    }
}

File 10 of 11 : ERC165.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol)

pragma solidity ^0.8.0;

import "./IERC165.sol";

/**
 * @dev Implementation of the {IERC165} interface.
 *
 * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check
 * for the additional interface id that will be supported. For example:
 *
 * ```solidity
 * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
 *     return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);
 * }
 * ```
 *
 * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation.
 */
abstract contract ERC165 is IERC165 {
    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        return interfaceId == type(IERC165).interfaceId;
    }
}

File 11 of 11 : IERC165.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC165 standard, as defined in the
 * https://eips.ethereum.org/EIPS/eip-165[EIP].
 *
 * Implementers can declare support of contract interfaces, which can then be
 * queried by others ({ERC165Checker}).
 *
 * For an implementation, see {ERC165}.
 */
interface IERC165 {
    /**
     * @dev Returns true if this contract implements the interface defined by
     * `interfaceId`. See the corresponding
     * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]
     * to learn more about how these ids are created.
     *
     * This function call must use less than 30 000 gas.
     */
    function supportsInterface(bytes4 interfaceId) external view returns (bool);
}

Settings
{
  "optimizer": {
    "enabled": false,
    "runs": 200
  },
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "abi"
      ]
    }
  }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"initBaseURI","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApprovalToCurrentOwner","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","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":false,"internalType":"string","name":"newBaseURI","type":"string"}],"name":"BaseURIChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"minter","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Minted","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":"MAX_MINT_PER_ADDR","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"numberMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"saleIsActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"newBaseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newPRRICE","type":"uint256"}],"name":"setPRICE","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":[],"name":"toggleSaleState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"recipient","type":"address"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

6080604052660aa87bee538000600a556001600b60006101000a81548160ff0219169083151502179055503480156200003757600080fd5b5060405162003b5d38038062003b5d83398181016040528101906200005d919062000348565b6040518060400160405280600c81526020017f4c6574734c6f76654c61696e00000000000000000000000000000000000000008152506040518060400160405280600881526020017f4c6f76654c61696e0000000000000000000000000000000000000000000000008152508160029080519060200190620000e192919062000226565b508060039080519060200190620000fa92919062000226565b506200010b6200015360201b60201c565b600081905550505062000133620001276200015860201b60201c565b6200016060201b60201c565b80600990805190602001906200014b92919062000226565b5050620004fd565b600090565b600033905090565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b828054620002349062000422565b90600052602060002090601f016020900481019282620002585760008555620002a4565b82601f106200027357805160ff1916838001178555620002a4565b82800160010185558215620002a4579182015b82811115620002a357825182559160200191906001019062000286565b5b509050620002b39190620002b7565b5090565b5b80821115620002d2576000816000905550600101620002b8565b5090565b6000620002ed620002e784620003b6565b6200038d565b9050828152602081018484840111156200030657600080fd5b62000313848285620003ec565b509392505050565b600082601f8301126200032d57600080fd5b81516200033f848260208601620002d6565b91505092915050565b6000602082840312156200035b57600080fd5b600082015167ffffffffffffffff8111156200037657600080fd5b62000384848285016200031b565b91505092915050565b600062000399620003ac565b9050620003a7828262000458565b919050565b6000604051905090565b600067ffffffffffffffff821115620003d457620003d3620004bd565b5b620003df82620004ec565b9050602081019050919050565b60005b838110156200040c578082015181840152602081019050620003ef565b838111156200041c576000848401525b50505050565b600060028204905060018216806200043b57607f821691505b602082108114156200045257620004516200048e565b5b50919050565b6200046382620004ec565b810181811067ffffffffffffffff82111715620004855762000484620004bd565b5b80604052505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b613650806200050d6000396000f3fe6080604052600436106101b75760003560e01c8063715018a6116100ec578063c87b56dd1161008a578063e985e9c511610064578063e985e9c5146105eb578063eb8d244414610628578063eea52d3814610653578063f2fde38b1461067c576101b7565b8063c87b56dd1461055a578063daaeec8614610597578063dc33e681146105ae576101b7565b806395d89b41116100c657806395d89b41146104c1578063a0712d68146104ec578063a22cb46514610508578063b88d4fde14610531576101b7565b8063715018a6146104545780638d859f3e1461046b5780638da5cb5b14610496576101b7565b806332cb6b0c1161015957806355f804b31161013357806355f804b3146103865780636352211e146103af5780636c0360eb146103ec57806370a0823114610417576101b7565b806332cb6b0c1461030957806342842e0e1461033457806351cff8d91461035d576101b7565b8063095ea7b311610195578063095ea7b314610261578063161548621461028a57806318160ddd146102b557806323b872dd146102e0576101b7565b806301ffc9a7146101bc57806306fdde03146101f9578063081812fc14610224575b600080fd5b3480156101c857600080fd5b506101e360048036038101906101de9190612b6e565b6106a5565b6040516101f09190612f0c565b60405180910390f35b34801561020557600080fd5b5061020e610787565b60405161021b9190612f4b565b60405180910390f35b34801561023057600080fd5b5061024b60048036038101906102469190612c05565b610819565b6040516102589190612e7c565b60405180910390f35b34801561026d57600080fd5b5061028860048036038101906102839190612b32565b610895565b005b34801561029657600080fd5b5061029f6109a0565b6040516102ac919061304d565b60405180910390f35b3480156102c157600080fd5b506102ca6109a5565b6040516102d7919061304d565b60405180910390f35b3480156102ec57600080fd5b5061030760048036038101906103029190612a2c565b6109bc565b005b34801561031557600080fd5b5061031e6109cc565b60405161032b919061304d565b60405180910390f35b34801561034057600080fd5b5061035b60048036038101906103569190612a2c565b6109d2565b005b34801561036957600080fd5b50610384600480360381019061037f91906129c7565b6109f2565b005b34801561039257600080fd5b506103ad60048036038101906103a89190612bc0565b610b24565b005b3480156103bb57600080fd5b506103d660048036038101906103d19190612c05565b610bef565b6040516103e39190612e7c565b60405180910390f35b3480156103f857600080fd5b50610401610c05565b60405161040e9190612f4b565b60405180910390f35b34801561042357600080fd5b5061043e6004803603810190610439919061299e565b610c93565b60405161044b919061304d565b60405180910390f35b34801561046057600080fd5b50610469610d63565b005b34801561047757600080fd5b50610480610deb565b60405161048d919061304d565b60405180910390f35b3480156104a257600080fd5b506104ab610df1565b6040516104b89190612e7c565b60405180910390f35b3480156104cd57600080fd5b506104d6610e1b565b6040516104e39190612f4b565b60405180910390f35b61050660048036038101906105019190612c05565b610ead565b005b34801561051457600080fd5b5061052f600480360381019061052a9190612af6565b61105e565b005b34801561053d57600080fd5b5061055860048036038101906105539190612a7b565b6111d6565b005b34801561056657600080fd5b50610581600480360381019061057c9190612c05565b611252565b60405161058e9190612f4b565b60405180910390f35b3480156105a357600080fd5b506105ac6112f1565b005b3480156105ba57600080fd5b506105d560048036038101906105d0919061299e565b611399565b6040516105e2919061304d565b60405180910390f35b3480156105f757600080fd5b50610612600480360381019061060d91906129f0565b6113ab565b60405161061f9190612f0c565b60405180910390f35b34801561063457600080fd5b5061063d61143f565b60405161064a9190612f0c565b60405180910390f35b34801561065f57600080fd5b5061067a60048036038101906106759190612c05565b611452565b005b34801561068857600080fd5b506106a3600480360381019061069e919061299e565b6114d8565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061077057507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610780575061077f826115d0565b5b9050919050565b6060600280546107969061328f565b80601f01602080910402602001604051908101604052809291908181526020018280546107c29061328f565b801561080f5780601f106107e45761010080835404028352916020019161080f565b820191906000526020600020905b8154815290600101906020018083116107f257829003601f168201915b5050505050905090565b60006108248261163a565b61085a576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006108a082610bef565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610908576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610927611688565b73ffffffffffffffffffffffffffffffffffffffff1614158015610959575061095781610952611688565b6113ab565b155b15610990576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61099b838383611690565b505050565b600381565b60006109af611742565b6001546000540303905090565b6109c7838383611747565b505050565b6103e781565b6109ed838383604051806020016040528060008152506111d6565b505050565b6109fa611688565b73ffffffffffffffffffffffffffffffffffffffff16610a18610df1565b73ffffffffffffffffffffffffffffffffffffffff1614610a6e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a6590612fed565b60405180910390fd5b600047905060008273ffffffffffffffffffffffffffffffffffffffff1682604051610a9990612e67565b60006040518083038185875af1925050503d8060008114610ad6576040519150601f19603f3d011682016040523d82523d6000602084013e610adb565b606091505b5050905080610b1f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b169061302d565b60405180910390fd5b505050565b610b2c611688565b73ffffffffffffffffffffffffffffffffffffffff16610b4a610df1565b73ffffffffffffffffffffffffffffffffffffffff1614610ba0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b9790612fed565b60405180910390fd5b818160099190610bb1929190612788565b507f5411e8ebf1636d9e83d5fc4900bf80cbac82e8790da2a4c94db4895e889eedf68282604051610be3929190612f27565b60405180910390a15050565b6000610bfa82611bfd565b600001519050919050565b60098054610c129061328f565b80601f0160208091040260200160405190810160405280929190818152602001828054610c3e9061328f565b8015610c8b5780601f10610c6057610100808354040283529160200191610c8b565b820191906000526020600020905b815481529060010190602001808311610c6e57829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610cfb576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b610d6b611688565b73ffffffffffffffffffffffffffffffffffffffff16610d89610df1565b73ffffffffffffffffffffffffffffffffffffffff1614610ddf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dd690612fed565b60405180910390fd5b610de96000611e8c565b565b600a5481565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060038054610e2a9061328f565b80601f0160208091040260200160405190810160405280929190818152602001828054610e569061328f565b8015610ea35780601f10610e7857610100808354040283529160200191610ea3565b820191906000526020600020905b815481529060010190602001808311610e8657829003601f168201915b5050505050905090565b600b60009054906101000a900460ff16610efc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ef39061300d565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff1614610f6a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f6190612fad565b60405180910390fd5b600381610f7633611399565b610f80919061310c565b1115610fc1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fb890612f8d565b60405180910390fd5b6103e781610fcd6109a5565b610fd7919061310c565b1115611018576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161100f90612fcd565b60405180910390fd5b6110223382611f52565b7f30385c845b448a36257a6a1716e6ad2e1bc2cbe333cde1e69fe849ad6511adfe3382604051611053929190612ee3565b60405180910390a150565b611066611688565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156110cb576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600760006110d8611688565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611185611688565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516111ca9190612f0c565b60405180910390a35050565b6111e1848484611747565b6112008373ffffffffffffffffffffffffffffffffffffffff16611f70565b8015611215575061121384848484611f93565b155b1561124c576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b606061125d8261163a565b611293576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600061129d6120f3565b90506000815114156112be57604051806020016040528060008152506112e9565b806112c884612185565b6040516020016112d9929190612e43565b6040516020818303038152906040525b915050919050565b6112f9611688565b73ffffffffffffffffffffffffffffffffffffffff16611317610df1565b73ffffffffffffffffffffffffffffffffffffffff161461136d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161136490612fed565b60405180910390fd5b600b60009054906101000a900460ff1615600b60006101000a81548160ff021916908315150217905550565b60006113a482612332565b9050919050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600b60009054906101000a900460ff1681565b61145a611688565b73ffffffffffffffffffffffffffffffffffffffff16611478610df1565b73ffffffffffffffffffffffffffffffffffffffff16146114ce576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114c590612fed565b60405180910390fd5b80600a8190555050565b6114e0611688565b73ffffffffffffffffffffffffffffffffffffffff166114fe610df1565b73ffffffffffffffffffffffffffffffffffffffff1614611554576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161154b90612fed565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156115c4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115bb90612f6d565b60405180910390fd5b6115cd81611e8c565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600081611645611742565b11158015611654575060005482105b8015611681575060046000838152602001908152602001600020600001601c9054906101000a900460ff16155b9050919050565b600033905090565b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b600090565b600061175282611bfd565b90508373ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16146117bd576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff166117de611688565b73ffffffffffffffffffffffffffffffffffffffff16148061180d575061180c85611807611688565b6113ab565b5b80611852575061181b611688565b73ffffffffffffffffffffffffffffffffffffffff1661183a84610819565b73ffffffffffffffffffffffffffffffffffffffff16145b90508061188b576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614156118f2576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6118ff858585600161239c565b61190b60008487611690565b6001600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506001600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600460008581526020019081526020016000209050848160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550428160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060006001850190506000600460008381526020019081526020016000209050600073ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415611b8b576000548214611b8a57878160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555084602001518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b505050828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611bf685858560016123a2565b5050505050565b611c0561280e565b600082905080611c13611742565b11158015611c22575060005481105b15611e55576000600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff16151515158152505090508060400151611e5357600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614611d37578092505050611e87565b5b600115611e5257818060019003925050600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614611e4d578092505050611e87565b611d38565b5b505b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b611f6c8282604051806020016040528060008152506123a8565b5050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02611fb9611688565b8786866040518563ffffffff1660e01b8152600401611fdb9493929190612e97565b602060405180830381600087803b158015611ff557600080fd5b505af192505050801561202657506040513d601f19601f820116820180604052508101906120239190612b97565b60015b6120a0573d8060008114612056576040519150601f19603f3d011682016040523d82523d6000602084013e61205b565b606091505b50600081511415612098576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b6060600980546121029061328f565b80601f016020809104026020016040519081016040528092919081815260200182805461212e9061328f565b801561217b5780601f106121505761010080835404028352916020019161217b565b820191906000526020600020905b81548152906001019060200180831161215e57829003601f168201915b5050505050905090565b606060008214156121cd576040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250905061232d565b600082905060005b600082146121ff5780806121e8906132f2565b915050600a826121f89190613162565b91506121d5565b60008167ffffffffffffffff811115612241577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156122735781602001600182028036833780820191505090505b5090505b600085146123265760018261228c9190613193565b9150600a8561229b919061333b565b60306122a7919061310c565b60f81b8183815181106122e3577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561231f9190613162565b9450612277565b8093505050505b919050565b6000600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160089054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b50505050565b50505050565b6123b583838360016123ba565b505050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415612427576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000841415612462576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61246f600086838761239c565b83600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555083600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550846004600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426004600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060008190506000858201905083801561263957506126388773ffffffffffffffffffffffffffffffffffffffff16611f70565b5b156126ff575b818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46126ae6000888480600101955088611f93565b6126e4576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8082141561263f5782600054146126fa57600080fd5b61276b565b5b818060010192508773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a480821415612700575b81600081905550505061278160008683876123a2565b5050505050565b8280546127949061328f565b90600052602060002090601f0160209004810192826127b657600085556127fd565b82601f106127cf57803560ff19168380011785556127fd565b828001600101855582156127fd579182015b828111156127fc5782358255916020019190600101906127e1565b5b50905061280a9190612851565b5090565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681526020016000151581525090565b5b8082111561286a576000816000905550600101612852565b5090565b600061288161287c8461308d565b613068565b90508281526020810184848401111561289957600080fd5b6128a484828561324d565b509392505050565b6000813590506128bb816135a7565b92915050565b6000813590506128d0816135be565b92915050565b6000813590506128e5816135d5565b92915050565b6000813590506128fa816135ec565b92915050565b60008151905061290f816135ec565b92915050565b600082601f83011261292657600080fd5b813561293684826020860161286e565b91505092915050565b60008083601f84011261295157600080fd5b8235905067ffffffffffffffff81111561296a57600080fd5b60208301915083600182028301111561298257600080fd5b9250929050565b60008135905061299881613603565b92915050565b6000602082840312156129b057600080fd5b60006129be848285016128ac565b91505092915050565b6000602082840312156129d957600080fd5b60006129e7848285016128c1565b91505092915050565b60008060408385031215612a0357600080fd5b6000612a11858286016128ac565b9250506020612a22858286016128ac565b9150509250929050565b600080600060608486031215612a4157600080fd5b6000612a4f868287016128ac565b9350506020612a60868287016128ac565b9250506040612a7186828701612989565b9150509250925092565b60008060008060808587031215612a9157600080fd5b6000612a9f878288016128ac565b9450506020612ab0878288016128ac565b9350506040612ac187828801612989565b925050606085013567ffffffffffffffff811115612ade57600080fd5b612aea87828801612915565b91505092959194509250565b60008060408385031215612b0957600080fd5b6000612b17858286016128ac565b9250506020612b28858286016128d6565b9150509250929050565b60008060408385031215612b4557600080fd5b6000612b53858286016128ac565b9250506020612b6485828601612989565b9150509250929050565b600060208284031215612b8057600080fd5b6000612b8e848285016128eb565b91505092915050565b600060208284031215612ba957600080fd5b6000612bb784828501612900565b91505092915050565b60008060208385031215612bd357600080fd5b600083013567ffffffffffffffff811115612bed57600080fd5b612bf98582860161293f565b92509250509250929050565b600060208284031215612c1757600080fd5b6000612c2584828501612989565b91505092915050565b612c37816131c7565b82525050565b612c46816131eb565b82525050565b6000612c57826130be565b612c6181856130d4565b9350612c7181856020860161325c565b612c7a81613428565b840191505092915050565b6000612c9183856130f0565b9350612c9e83858461324d565b612ca783613428565b840190509392505050565b6000612cbd826130c9565b612cc781856130f0565b9350612cd781856020860161325c565b612ce081613428565b840191505092915050565b6000612cf6826130c9565b612d008185613101565b9350612d1081856020860161325c565b80840191505092915050565b6000612d296026836130f0565b9150612d3482613439565b604082019050919050565b6000612d4c6015836130f0565b9150612d5782613488565b602082019050919050565b6000612d6f6019836130f0565b9150612d7a826134b1565b602082019050919050565b6000612d92602a836130f0565b9150612d9d826134da565b604082019050919050565b6000612db56020836130f0565b9150612dc082613529565b602082019050919050565b6000612dd86000836130e5565b9150612de382613552565b600082019050919050565b6000612dfb600f836130f0565b9150612e0682613555565b602082019050919050565b6000612e1e6014836130f0565b9150612e298261357e565b602082019050919050565b612e3d81613243565b82525050565b6000612e4f8285612ceb565b9150612e5b8284612ceb565b91508190509392505050565b6000612e7282612dcb565b9150819050919050565b6000602082019050612e916000830184612c2e565b92915050565b6000608082019050612eac6000830187612c2e565b612eb96020830186612c2e565b612ec66040830185612e34565b8181036060830152612ed88184612c4c565b905095945050505050565b6000604082019050612ef86000830185612c2e565b612f056020830184612e34565b9392505050565b6000602082019050612f216000830184612c3d565b92915050565b60006020820190508181036000830152612f42818486612c85565b90509392505050565b60006020820190508181036000830152612f658184612cb2565b905092915050565b60006020820190508181036000830152612f8681612d1c565b9050919050565b60006020820190508181036000830152612fa681612d3f565b9050919050565b60006020820190508181036000830152612fc681612d62565b9050919050565b60006020820190508181036000830152612fe681612d85565b9050919050565b6000602082019050818103600083015261300681612da8565b9050919050565b6000602082019050818103600083015261302681612dee565b9050919050565b6000602082019050818103600083015261304681612e11565b9050919050565b60006020820190506130626000830184612e34565b92915050565b6000613072613083565b905061307e82826132c1565b919050565b6000604051905090565b600067ffffffffffffffff8211156130a8576130a76133f9565b5b6130b182613428565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b600061311782613243565b915061312283613243565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156131575761315661336c565b5b828201905092915050565b600061316d82613243565b915061317883613243565b9250826131885761318761339b565b5b828204905092915050565b600061319e82613243565b91506131a983613243565b9250828210156131bc576131bb61336c565b5b828203905092915050565b60006131d282613223565b9050919050565b60006131e482613223565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b8381101561327a57808201518184015260208101905061325f565b83811115613289576000848401525b50505050565b600060028204905060018216806132a757607f821691505b602082108114156132bb576132ba6133ca565b5b50919050565b6132ca82613428565b810181811067ffffffffffffffff821117156132e9576132e86133f9565b5b80604052505050565b60006132fd82613243565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156133305761332f61336c565b5b600182019050919050565b600061334682613243565b915061335183613243565b9250826133615761336061339b565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4d6178206d696e742070657220616464726573732e0000000000000000000000600082015250565b7f4e6f20636f6e74726163742063616c6c7320616c6c6f77656400000000000000600082015250565b7f507572636861736520776f756c6420657863656564206d617820737570706c7960008201527f206f6620746f6b656e7300000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b50565b7f4e6f742073746172746564207965740000000000000000000000000000000000600082015250565b7f5520646f6e2774206c6f7665204c61696e2e2e2e000000000000000000000000600082015250565b6135b0816131c7565b81146135bb57600080fd5b50565b6135c7816131d9565b81146135d257600080fd5b50565b6135de816131eb565b81146135e957600080fd5b50565b6135f5816131f7565b811461360057600080fd5b50565b61360c81613243565b811461361757600080fd5b5056fea2646970667358221220bd952be899de1eae4ce127f7558e9d8d1d167672766c234cf6f62fc7883db80364736f6c6343000804003300000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000036697066733a2f2f516d5767785a4b433931574866436755697938523862344b414b566133617474724441516b5631616b71366f576a2f00000000000000000000

Deployed Bytecode

0x6080604052600436106101b75760003560e01c8063715018a6116100ec578063c87b56dd1161008a578063e985e9c511610064578063e985e9c5146105eb578063eb8d244414610628578063eea52d3814610653578063f2fde38b1461067c576101b7565b8063c87b56dd1461055a578063daaeec8614610597578063dc33e681146105ae576101b7565b806395d89b41116100c657806395d89b41146104c1578063a0712d68146104ec578063a22cb46514610508578063b88d4fde14610531576101b7565b8063715018a6146104545780638d859f3e1461046b5780638da5cb5b14610496576101b7565b806332cb6b0c1161015957806355f804b31161013357806355f804b3146103865780636352211e146103af5780636c0360eb146103ec57806370a0823114610417576101b7565b806332cb6b0c1461030957806342842e0e1461033457806351cff8d91461035d576101b7565b8063095ea7b311610195578063095ea7b314610261578063161548621461028a57806318160ddd146102b557806323b872dd146102e0576101b7565b806301ffc9a7146101bc57806306fdde03146101f9578063081812fc14610224575b600080fd5b3480156101c857600080fd5b506101e360048036038101906101de9190612b6e565b6106a5565b6040516101f09190612f0c565b60405180910390f35b34801561020557600080fd5b5061020e610787565b60405161021b9190612f4b565b60405180910390f35b34801561023057600080fd5b5061024b60048036038101906102469190612c05565b610819565b6040516102589190612e7c565b60405180910390f35b34801561026d57600080fd5b5061028860048036038101906102839190612b32565b610895565b005b34801561029657600080fd5b5061029f6109a0565b6040516102ac919061304d565b60405180910390f35b3480156102c157600080fd5b506102ca6109a5565b6040516102d7919061304d565b60405180910390f35b3480156102ec57600080fd5b5061030760048036038101906103029190612a2c565b6109bc565b005b34801561031557600080fd5b5061031e6109cc565b60405161032b919061304d565b60405180910390f35b34801561034057600080fd5b5061035b60048036038101906103569190612a2c565b6109d2565b005b34801561036957600080fd5b50610384600480360381019061037f91906129c7565b6109f2565b005b34801561039257600080fd5b506103ad60048036038101906103a89190612bc0565b610b24565b005b3480156103bb57600080fd5b506103d660048036038101906103d19190612c05565b610bef565b6040516103e39190612e7c565b60405180910390f35b3480156103f857600080fd5b50610401610c05565b60405161040e9190612f4b565b60405180910390f35b34801561042357600080fd5b5061043e6004803603810190610439919061299e565b610c93565b60405161044b919061304d565b60405180910390f35b34801561046057600080fd5b50610469610d63565b005b34801561047757600080fd5b50610480610deb565b60405161048d919061304d565b60405180910390f35b3480156104a257600080fd5b506104ab610df1565b6040516104b89190612e7c565b60405180910390f35b3480156104cd57600080fd5b506104d6610e1b565b6040516104e39190612f4b565b60405180910390f35b61050660048036038101906105019190612c05565b610ead565b005b34801561051457600080fd5b5061052f600480360381019061052a9190612af6565b61105e565b005b34801561053d57600080fd5b5061055860048036038101906105539190612a7b565b6111d6565b005b34801561056657600080fd5b50610581600480360381019061057c9190612c05565b611252565b60405161058e9190612f4b565b60405180910390f35b3480156105a357600080fd5b506105ac6112f1565b005b3480156105ba57600080fd5b506105d560048036038101906105d0919061299e565b611399565b6040516105e2919061304d565b60405180910390f35b3480156105f757600080fd5b50610612600480360381019061060d91906129f0565b6113ab565b60405161061f9190612f0c565b60405180910390f35b34801561063457600080fd5b5061063d61143f565b60405161064a9190612f0c565b60405180910390f35b34801561065f57600080fd5b5061067a60048036038101906106759190612c05565b611452565b005b34801561068857600080fd5b506106a3600480360381019061069e919061299e565b6114d8565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061077057507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610780575061077f826115d0565b5b9050919050565b6060600280546107969061328f565b80601f01602080910402602001604051908101604052809291908181526020018280546107c29061328f565b801561080f5780601f106107e45761010080835404028352916020019161080f565b820191906000526020600020905b8154815290600101906020018083116107f257829003601f168201915b5050505050905090565b60006108248261163a565b61085a576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006108a082610bef565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610908576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610927611688565b73ffffffffffffffffffffffffffffffffffffffff1614158015610959575061095781610952611688565b6113ab565b155b15610990576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61099b838383611690565b505050565b600381565b60006109af611742565b6001546000540303905090565b6109c7838383611747565b505050565b6103e781565b6109ed838383604051806020016040528060008152506111d6565b505050565b6109fa611688565b73ffffffffffffffffffffffffffffffffffffffff16610a18610df1565b73ffffffffffffffffffffffffffffffffffffffff1614610a6e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a6590612fed565b60405180910390fd5b600047905060008273ffffffffffffffffffffffffffffffffffffffff1682604051610a9990612e67565b60006040518083038185875af1925050503d8060008114610ad6576040519150601f19603f3d011682016040523d82523d6000602084013e610adb565b606091505b5050905080610b1f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b169061302d565b60405180910390fd5b505050565b610b2c611688565b73ffffffffffffffffffffffffffffffffffffffff16610b4a610df1565b73ffffffffffffffffffffffffffffffffffffffff1614610ba0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b9790612fed565b60405180910390fd5b818160099190610bb1929190612788565b507f5411e8ebf1636d9e83d5fc4900bf80cbac82e8790da2a4c94db4895e889eedf68282604051610be3929190612f27565b60405180910390a15050565b6000610bfa82611bfd565b600001519050919050565b60098054610c129061328f565b80601f0160208091040260200160405190810160405280929190818152602001828054610c3e9061328f565b8015610c8b5780601f10610c6057610100808354040283529160200191610c8b565b820191906000526020600020905b815481529060010190602001808311610c6e57829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610cfb576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b610d6b611688565b73ffffffffffffffffffffffffffffffffffffffff16610d89610df1565b73ffffffffffffffffffffffffffffffffffffffff1614610ddf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dd690612fed565b60405180910390fd5b610de96000611e8c565b565b600a5481565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060038054610e2a9061328f565b80601f0160208091040260200160405190810160405280929190818152602001828054610e569061328f565b8015610ea35780601f10610e7857610100808354040283529160200191610ea3565b820191906000526020600020905b815481529060010190602001808311610e8657829003601f168201915b5050505050905090565b600b60009054906101000a900460ff16610efc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ef39061300d565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff1614610f6a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f6190612fad565b60405180910390fd5b600381610f7633611399565b610f80919061310c565b1115610fc1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fb890612f8d565b60405180910390fd5b6103e781610fcd6109a5565b610fd7919061310c565b1115611018576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161100f90612fcd565b60405180910390fd5b6110223382611f52565b7f30385c845b448a36257a6a1716e6ad2e1bc2cbe333cde1e69fe849ad6511adfe3382604051611053929190612ee3565b60405180910390a150565b611066611688565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156110cb576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600760006110d8611688565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611185611688565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516111ca9190612f0c565b60405180910390a35050565b6111e1848484611747565b6112008373ffffffffffffffffffffffffffffffffffffffff16611f70565b8015611215575061121384848484611f93565b155b1561124c576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b606061125d8261163a565b611293576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600061129d6120f3565b90506000815114156112be57604051806020016040528060008152506112e9565b806112c884612185565b6040516020016112d9929190612e43565b6040516020818303038152906040525b915050919050565b6112f9611688565b73ffffffffffffffffffffffffffffffffffffffff16611317610df1565b73ffffffffffffffffffffffffffffffffffffffff161461136d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161136490612fed565b60405180910390fd5b600b60009054906101000a900460ff1615600b60006101000a81548160ff021916908315150217905550565b60006113a482612332565b9050919050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600b60009054906101000a900460ff1681565b61145a611688565b73ffffffffffffffffffffffffffffffffffffffff16611478610df1565b73ffffffffffffffffffffffffffffffffffffffff16146114ce576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114c590612fed565b60405180910390fd5b80600a8190555050565b6114e0611688565b73ffffffffffffffffffffffffffffffffffffffff166114fe610df1565b73ffffffffffffffffffffffffffffffffffffffff1614611554576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161154b90612fed565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156115c4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115bb90612f6d565b60405180910390fd5b6115cd81611e8c565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600081611645611742565b11158015611654575060005482105b8015611681575060046000838152602001908152602001600020600001601c9054906101000a900460ff16155b9050919050565b600033905090565b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b600090565b600061175282611bfd565b90508373ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16146117bd576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff166117de611688565b73ffffffffffffffffffffffffffffffffffffffff16148061180d575061180c85611807611688565b6113ab565b5b80611852575061181b611688565b73ffffffffffffffffffffffffffffffffffffffff1661183a84610819565b73ffffffffffffffffffffffffffffffffffffffff16145b90508061188b576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614156118f2576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6118ff858585600161239c565b61190b60008487611690565b6001600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506001600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600460008581526020019081526020016000209050848160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550428160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060006001850190506000600460008381526020019081526020016000209050600073ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415611b8b576000548214611b8a57878160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555084602001518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b505050828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611bf685858560016123a2565b5050505050565b611c0561280e565b600082905080611c13611742565b11158015611c22575060005481105b15611e55576000600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff16151515158152505090508060400151611e5357600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614611d37578092505050611e87565b5b600115611e5257818060019003925050600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614611e4d578092505050611e87565b611d38565b5b505b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b611f6c8282604051806020016040528060008152506123a8565b5050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02611fb9611688565b8786866040518563ffffffff1660e01b8152600401611fdb9493929190612e97565b602060405180830381600087803b158015611ff557600080fd5b505af192505050801561202657506040513d601f19601f820116820180604052508101906120239190612b97565b60015b6120a0573d8060008114612056576040519150601f19603f3d011682016040523d82523d6000602084013e61205b565b606091505b50600081511415612098576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b6060600980546121029061328f565b80601f016020809104026020016040519081016040528092919081815260200182805461212e9061328f565b801561217b5780601f106121505761010080835404028352916020019161217b565b820191906000526020600020905b81548152906001019060200180831161215e57829003601f168201915b5050505050905090565b606060008214156121cd576040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250905061232d565b600082905060005b600082146121ff5780806121e8906132f2565b915050600a826121f89190613162565b91506121d5565b60008167ffffffffffffffff811115612241577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156122735781602001600182028036833780820191505090505b5090505b600085146123265760018261228c9190613193565b9150600a8561229b919061333b565b60306122a7919061310c565b60f81b8183815181106122e3577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561231f9190613162565b9450612277565b8093505050505b919050565b6000600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160089054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b50505050565b50505050565b6123b583838360016123ba565b505050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415612427576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000841415612462576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61246f600086838761239c565b83600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555083600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550846004600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426004600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060008190506000858201905083801561263957506126388773ffffffffffffffffffffffffffffffffffffffff16611f70565b5b156126ff575b818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46126ae6000888480600101955088611f93565b6126e4576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8082141561263f5782600054146126fa57600080fd5b61276b565b5b818060010192508773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a480821415612700575b81600081905550505061278160008683876123a2565b5050505050565b8280546127949061328f565b90600052602060002090601f0160209004810192826127b657600085556127fd565b82601f106127cf57803560ff19168380011785556127fd565b828001600101855582156127fd579182015b828111156127fc5782358255916020019190600101906127e1565b5b50905061280a9190612851565b5090565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681526020016000151581525090565b5b8082111561286a576000816000905550600101612852565b5090565b600061288161287c8461308d565b613068565b90508281526020810184848401111561289957600080fd5b6128a484828561324d565b509392505050565b6000813590506128bb816135a7565b92915050565b6000813590506128d0816135be565b92915050565b6000813590506128e5816135d5565b92915050565b6000813590506128fa816135ec565b92915050565b60008151905061290f816135ec565b92915050565b600082601f83011261292657600080fd5b813561293684826020860161286e565b91505092915050565b60008083601f84011261295157600080fd5b8235905067ffffffffffffffff81111561296a57600080fd5b60208301915083600182028301111561298257600080fd5b9250929050565b60008135905061299881613603565b92915050565b6000602082840312156129b057600080fd5b60006129be848285016128ac565b91505092915050565b6000602082840312156129d957600080fd5b60006129e7848285016128c1565b91505092915050565b60008060408385031215612a0357600080fd5b6000612a11858286016128ac565b9250506020612a22858286016128ac565b9150509250929050565b600080600060608486031215612a4157600080fd5b6000612a4f868287016128ac565b9350506020612a60868287016128ac565b9250506040612a7186828701612989565b9150509250925092565b60008060008060808587031215612a9157600080fd5b6000612a9f878288016128ac565b9450506020612ab0878288016128ac565b9350506040612ac187828801612989565b925050606085013567ffffffffffffffff811115612ade57600080fd5b612aea87828801612915565b91505092959194509250565b60008060408385031215612b0957600080fd5b6000612b17858286016128ac565b9250506020612b28858286016128d6565b9150509250929050565b60008060408385031215612b4557600080fd5b6000612b53858286016128ac565b9250506020612b6485828601612989565b9150509250929050565b600060208284031215612b8057600080fd5b6000612b8e848285016128eb565b91505092915050565b600060208284031215612ba957600080fd5b6000612bb784828501612900565b91505092915050565b60008060208385031215612bd357600080fd5b600083013567ffffffffffffffff811115612bed57600080fd5b612bf98582860161293f565b92509250509250929050565b600060208284031215612c1757600080fd5b6000612c2584828501612989565b91505092915050565b612c37816131c7565b82525050565b612c46816131eb565b82525050565b6000612c57826130be565b612c6181856130d4565b9350612c7181856020860161325c565b612c7a81613428565b840191505092915050565b6000612c9183856130f0565b9350612c9e83858461324d565b612ca783613428565b840190509392505050565b6000612cbd826130c9565b612cc781856130f0565b9350612cd781856020860161325c565b612ce081613428565b840191505092915050565b6000612cf6826130c9565b612d008185613101565b9350612d1081856020860161325c565b80840191505092915050565b6000612d296026836130f0565b9150612d3482613439565b604082019050919050565b6000612d4c6015836130f0565b9150612d5782613488565b602082019050919050565b6000612d6f6019836130f0565b9150612d7a826134b1565b602082019050919050565b6000612d92602a836130f0565b9150612d9d826134da565b604082019050919050565b6000612db56020836130f0565b9150612dc082613529565b602082019050919050565b6000612dd86000836130e5565b9150612de382613552565b600082019050919050565b6000612dfb600f836130f0565b9150612e0682613555565b602082019050919050565b6000612e1e6014836130f0565b9150612e298261357e565b602082019050919050565b612e3d81613243565b82525050565b6000612e4f8285612ceb565b9150612e5b8284612ceb565b91508190509392505050565b6000612e7282612dcb565b9150819050919050565b6000602082019050612e916000830184612c2e565b92915050565b6000608082019050612eac6000830187612c2e565b612eb96020830186612c2e565b612ec66040830185612e34565b8181036060830152612ed88184612c4c565b905095945050505050565b6000604082019050612ef86000830185612c2e565b612f056020830184612e34565b9392505050565b6000602082019050612f216000830184612c3d565b92915050565b60006020820190508181036000830152612f42818486612c85565b90509392505050565b60006020820190508181036000830152612f658184612cb2565b905092915050565b60006020820190508181036000830152612f8681612d1c565b9050919050565b60006020820190508181036000830152612fa681612d3f565b9050919050565b60006020820190508181036000830152612fc681612d62565b9050919050565b60006020820190508181036000830152612fe681612d85565b9050919050565b6000602082019050818103600083015261300681612da8565b9050919050565b6000602082019050818103600083015261302681612dee565b9050919050565b6000602082019050818103600083015261304681612e11565b9050919050565b60006020820190506130626000830184612e34565b92915050565b6000613072613083565b905061307e82826132c1565b919050565b6000604051905090565b600067ffffffffffffffff8211156130a8576130a76133f9565b5b6130b182613428565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b600061311782613243565b915061312283613243565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156131575761315661336c565b5b828201905092915050565b600061316d82613243565b915061317883613243565b9250826131885761318761339b565b5b828204905092915050565b600061319e82613243565b91506131a983613243565b9250828210156131bc576131bb61336c565b5b828203905092915050565b60006131d282613223565b9050919050565b60006131e482613223565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b8381101561327a57808201518184015260208101905061325f565b83811115613289576000848401525b50505050565b600060028204905060018216806132a757607f821691505b602082108114156132bb576132ba6133ca565b5b50919050565b6132ca82613428565b810181811067ffffffffffffffff821117156132e9576132e86133f9565b5b80604052505050565b60006132fd82613243565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156133305761332f61336c565b5b600182019050919050565b600061334682613243565b915061335183613243565b9250826133615761336061339b565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4d6178206d696e742070657220616464726573732e0000000000000000000000600082015250565b7f4e6f20636f6e74726163742063616c6c7320616c6c6f77656400000000000000600082015250565b7f507572636861736520776f756c6420657863656564206d617820737570706c7960008201527f206f6620746f6b656e7300000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b50565b7f4e6f742073746172746564207965740000000000000000000000000000000000600082015250565b7f5520646f6e2774206c6f7665204c61696e2e2e2e000000000000000000000000600082015250565b6135b0816131c7565b81146135bb57600080fd5b50565b6135c7816131d9565b81146135d257600080fd5b50565b6135de816131eb565b81146135e957600080fd5b50565b6135f5816131f7565b811461360057600080fd5b50565b61360c81613243565b811461361757600080fd5b5056fea2646970667358221220bd952be899de1eae4ce127f7558e9d8d1d167672766c234cf6f62fc7883db80364736f6c63430008040033

Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)

00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000036697066733a2f2f516d5767785a4b433931574866436755697938523862344b414b566133617474724441516b5631616b71366f576a2f00000000000000000000

-----Decoded View---------------
Arg [0] : initBaseURI (string): ipfs://QmWgxZKC91WHfCgUiy8R8b4KAKVa3attrDAQkV1akq6oWj/

-----Encoded View---------------
4 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000020
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000036
Arg [2] : 697066733a2f2f516d5767785a4b433931574866436755697938523862344b41
Arg [3] : 4b566133617474724441516b5631616b71366f576a2f00000000000000000000


Deployed Bytecode Sourcemap

157:1862:9:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4551:300:10;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;7579:98;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;9035:200;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;8612:362;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;232:45:9;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3822:297:10;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;9874:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;284:40:9;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;10104:179:10;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1779:237:9;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1527:148;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;7394:123:10;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;204:21:9;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4910:203:10;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1668:101:0;;;;;;;;;;;;;:::i;:::-;;331:34:9;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1036:85:0;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;7741:102:10;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;744:549:9;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;9302:282:10;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;10349:359;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;7909:313;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1426:93:9;;;;;;;;;;;;;:::i;:::-;;1303:113;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;9650:162:10;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;374:31:9;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1683:88;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1918:198:0;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;4551:300:10;4653:4;4703:25;4688:40;;;:11;:40;;;;:104;;;;4759:33;4744:48;;;:11;:48;;;;4688:104;:156;;;;4808:36;4832:11;4808:23;:36::i;:::-;4688:156;4669:175;;4551:300;;;:::o;7579:98::-;7633:13;7665:5;7658:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7579:98;:::o;9035:200::-;9103:7;9127:16;9135:7;9127;:16::i;:::-;9122:64;;9152:34;;;;;;;;;;;;;;9122:64;9204:15;:24;9220:7;9204:24;;;;;;;;;;;;;;;;;;;;;9197:31;;9035:200;;;:::o;8612:362::-;8684:13;8700:24;8716:7;8700:15;:24::i;:::-;8684:40;;8744:5;8738:11;;:2;:11;;;8734:48;;;8758:24;;;;;;;;;;;;;;8734:48;8813:5;8797:21;;:12;:10;:12::i;:::-;:21;;;;:63;;;;;8823:37;8840:5;8847:12;:10;:12::i;:::-;8823:16;:37::i;:::-;8822:38;8797:63;8793:136;;;8883:35;;;;;;;;;;;;;;8793:136;8939:28;8948:2;8952:7;8961:5;8939:8;:28::i;:::-;8612:362;;;:::o;232:45:9:-;276:1;232:45;:::o;3822:297:10:-;3866:7;4087:15;:13;:15::i;:::-;4072:12;;4056:13;;:28;:46;4049:53;;3822:297;:::o;9874:164::-;10003:28;10013:4;10019:2;10023:7;10003:9;:28::i;:::-;9874:164;;;:::o;284:40:9:-;321:3;284:40;:::o;10104:179:10:-;10237:39;10254:4;10260:2;10264:7;10237:39;;;;;;;;;;;;:16;:39::i;:::-;10104:179;;;:::o;1779:237:9:-;1259:12:0;:10;:12::i;:::-;1248:23;;:7;:5;:7::i;:::-;:23;;;1240:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1854:15:9::1;1872:21;1854:39;;1905:12;1923:9;:14;;1945:7;1923:34;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1904:53;;;1976:7;1968:40;;;;;;;;;;;;:::i;:::-;;;;;;;;;1318:1:0;;1779:237:9::0;:::o;1527:148::-;1259:12:0;:10;:12::i;:::-;1248:23;;:7;:5;:7::i;:::-;:23;;;1240:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1615:10:9::1;;1605:7;:20;;;;;;;:::i;:::-;;1641:26;1656:10;;1641:26;;;;;;;:::i;:::-;;;;;;;;1527:148:::0;;:::o;7394:123:10:-;7458:7;7484:21;7497:7;7484:12;:21::i;:::-;:26;;;7477:33;;7394:123;;;:::o;204:21:9:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;4910:203:10:-;4974:7;5014:1;4997:19;;:5;:19;;;4993:60;;;5025:28;;;;;;;;;;;;;;4993:60;5078:12;:19;5091:5;5078:19;;;;;;;;;;;;;;;:27;;;;;;;;;;;;5070:36;;5063:43;;4910:203;;;:::o;1668:101:0:-;1259:12;:10;:12::i;:::-;1248:23;;:7;:5;:7::i;:::-;:23;;;1240:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1732:30:::1;1759:1;1732:18;:30::i;:::-;1668:101::o:0;331:34:9:-;;;;:::o;1036:85:0:-;1082:7;1108:6;;;;;;;;;;;1101:13;;1036:85;:::o;7741:102:10:-;7797:13;7829:7;7822:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7741:102;:::o;744:549:9:-;812:12;;;;;;;;;;;804:40;;;;;;;;;;;;:::i;:::-;;;;;;;;;876:10;863:23;;:9;:23;;;855:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;276:1;976:8;949:24;962:10;949:12;:24::i;:::-;:35;;;;:::i;:::-;:56;;927:127;;;;;;;;;;;;:::i;:::-;;;;;;;;;321:3;1103:8;1087:13;:11;:13::i;:::-;:24;;;;:::i;:::-;:38;;1065:130;;;;;;;;;;;;:::i;:::-;;;;;;;;;1208:31;1218:10;1230:8;1208:9;:31::i;:::-;1257:28;1264:10;1276:8;1257:28;;;;;;;:::i;:::-;;;;;;;;744:549;:::o;9302:282:10:-;9412:12;:10;:12::i;:::-;9400:24;;:8;:24;;;9396:54;;;9433:17;;;;;;;;;;;;;;9396:54;9506:8;9461:18;:32;9480:12;:10;:12::i;:::-;9461:32;;;;;;;;;;;;;;;:42;9494:8;9461:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;9558:8;9529:48;;9544:12;:10;:12::i;:::-;9529:48;;;9568:8;9529:48;;;;;;:::i;:::-;;;;;;;;9302:282;;:::o;10349:359::-;10510:28;10520:4;10526:2;10530:7;10510:9;:28::i;:::-;10552:15;:2;:13;;;:15::i;:::-;:76;;;;;10572:56;10603:4;10609:2;10613:7;10622:5;10572:30;:56::i;:::-;10571:57;10552:76;10548:154;;;10651:40;;;;;;;;;;;;;;10548:154;10349:359;;;;:::o;7909:313::-;7982:13;8012:16;8020:7;8012;:16::i;:::-;8007:59;;8037:29;;;;;;;;;;;;;;8007:59;8077:21;8101:10;:8;:10::i;:::-;8077:34;;8153:1;8134:7;8128:21;:26;;:87;;;;;;;;;;;;;;;;;8181:7;8190:18;:7;:16;:18::i;:::-;8164:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;8128:87;8121:94;;;7909:313;;;:::o;1426:93:9:-;1259:12:0;:10;:12::i;:::-;1248:23;;:7;:5;:7::i;:::-;:23;;;1240:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1499:12:9::1;;;;;;;;;;;1498:13;1483:12;;:28;;;;;;;;;;;;;;;;;;1426:93::o:0;1303:113::-;1361:7;1388:20;1402:5;1388:13;:20::i;:::-;1381:27;;1303:113;;;:::o;9650:162:10:-;9747:4;9770:18;:25;9789:5;9770:25;;;;;;;;;;;;;;;:35;9796:8;9770:35;;;;;;;;;;;;;;;;;;;;;;;;;9763:42;;9650:162;;;;:::o;374:31:9:-;;;;;;;;;;;;;:::o;1683:88::-;1259:12:0;:10;:12::i;:::-;1248:23;;:7;:5;:7::i;:::-;:23;;;1240:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1753:10:9::1;1745:5;:18;;;;1683:88:::0;:::o;1918:198:0:-;1259:12;:10;:12::i;:::-;1248:23;;:7;:5;:7::i;:::-;:23;;;1240:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2026:1:::1;2006:22;;:8;:22;;;;1998:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;2081:28;2100:8;2081:18;:28::i;:::-;1918:198:::0;:::o;829:155:7:-;914:4;952:25;937:40;;;:11;:40;;;;930:47;;829:155;;;:::o;10954:172:10:-;11011:4;11053:7;11034:15;:13;:15::i;:::-;:26;;:53;;;;;11074:13;;11064:7;:23;11034:53;:85;;;;;11092:11;:20;11104:7;11092:20;;;;;;;;;;;:27;;;;;;;;;;;;11091:28;11034:85;11027:92;;10954:172;;;:::o;640:96:5:-;693:7;719:10;712:17;;640:96;:::o;18894:189:10:-;19031:2;19004:15;:24;19020:7;19004:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;19068:7;19064:2;19048:28;;19057:5;19048:28;;;;;;;;;;;;18894:189;;;:::o;3603:90::-;3659:7;3603:90;:::o;13964:2082::-;14074:35;14112:21;14125:7;14112:12;:21::i;:::-;14074:59;;14170:4;14148:26;;:13;:18;;;:26;;;14144:67;;14183:28;;;;;;;;;;;;;;14144:67;14222:22;14264:4;14248:20;;:12;:10;:12::i;:::-;:20;;;:72;;;;14284:36;14301:4;14307:12;:10;:12::i;:::-;14284:16;:36::i;:::-;14248:72;:124;;;;14360:12;:10;:12::i;:::-;14336:36;;:20;14348:7;14336:11;:20::i;:::-;:36;;;14248:124;14222:151;;14389:17;14384:66;;14415:35;;;;;;;;;;;;;;14384:66;14478:1;14464:16;;:2;:16;;;14460:52;;;14489:23;;;;;;;;;;;;;;14460:52;14523:43;14545:4;14551:2;14555:7;14564:1;14523:21;:43::i;:::-;14628:35;14645:1;14649:7;14658:4;14628:8;:35::i;:::-;14983:1;14953:12;:18;14966:4;14953:18;;;;;;;;;;;;;;;:26;;;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15026:1;14998:12;:16;15011:2;14998:16;;;;;;;;;;;;;;;:24;;;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15042:31;15076:11;:20;15088:7;15076:20;;;;;;;;;;;15042:54;;15126:2;15110:8;:13;;;:18;;;;;;;;;;;;;;;;;;15175:15;15142:8;:23;;;:49;;;;;;;;;;;;;;;;;;15439:19;15471:1;15461:7;:11;15439:33;;15486:31;15520:11;:24;15532:11;15520:24;;;;;;;;;;;15486:58;;15587:1;15562:27;;:8;:13;;;;;;;;;;;;:27;;;15558:377;;;15769:13;;15754:11;:28;15750:171;;15822:4;15806:8;:13;;;:20;;;;;;;;;;;;;;;;;;15874:13;:28;;;15848:8;:23;;;:54;;;;;;;;;;;;;;;;;;15750:171;15558:377;13964:2082;;;15979:7;15975:2;15960:27;;15969:4;15960:27;;;;;;;;;;;;15997:42;16018:4;16024:2;16028:7;16037:1;15997:20;:42::i;:::-;13964:2082;;;;;:::o;6253:1084::-;6315:21;;:::i;:::-;6348:12;6363:7;6348:22;;6428:4;6409:15;:13;:15::i;:::-;:23;;:47;;;;;6443:13;;6436:4;:20;6409:47;6405:868;;;6476:31;6510:11;:17;6522:4;6510:17;;;;;;;;;;;6476:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6550:9;:16;;;6545:714;;6620:1;6594:28;;:9;:14;;;:28;;;6590:99;;6657:9;6650:16;;;;;;6590:99;6986:255;6993:4;6986:255;;;7025:6;;;;;;;;7069:11;:17;7081:4;7069:17;;;;;;;;;;;7057:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7142:1;7116:28;;:9;:14;;;:28;;;7112:107;;7183:9;7176:16;;;;;;7112:107;6986:255;;;6545:714;6405:868;;7299:31;;;;;;;;;;;;;;6253:1084;;;;:::o;2270:187:0:-;2343:16;2362:6;;;;;;;;;;;2343:25;;2387:8;2378:6;;:17;;;;;;;;;;;;;;;;;;2441:8;2410:40;;2431:8;2410:40;;;;;;;;;;;;2270:187;;:::o;11132:102:10:-;11200:27;11210:2;11214:8;11200:27;;;;;;;;;;;;:9;:27::i;:::-;11132:102;;:::o;1175:320:4:-;1235:4;1487:1;1465:7;:19;;;:23;1458:30;;1175:320;;;:::o;19564:650:10:-;19722:4;19758:2;19742:36;;;19779:12;:10;:12::i;:::-;19793:4;19799:7;19808:5;19742:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;19738:470;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19990:1;19973:6;:13;:18;19969:229;;;20018:40;;;;;;;;;;;;;;19969:229;20158:6;20152:13;20143:6;20139:2;20135:15;20128:38;19738:470;19870:45;;;19860:55;;;:6;:55;;;;19853:62;;;19564:650;;;;;;:::o;636:100:9:-;688:13;721:7;714:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;636:100;:::o;328:703:6:-;384:13;610:1;601:5;:10;597:51;;;627:10;;;;;;;;;;;;;;;;;;;;;597:51;657:12;672:5;657:20;;687:14;711:75;726:1;718:4;:9;711:75;;743:8;;;;;:::i;:::-;;;;773:2;765:10;;;;;:::i;:::-;;;711:75;;;795:19;827:6;817:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;795:39;;844:150;860:1;851:5;:10;844:150;;887:1;877:11;;;;;:::i;:::-;;;953:2;945:5;:10;;;;:::i;:::-;932:2;:24;;;;:::i;:::-;919:39;;902:6;909;902:14;;;;;;;;;;;;;;;;;;;:56;;;;;;;;;;;981:2;972:11;;;;;:::i;:::-;;;844:150;;;1017:6;1003:21;;;;;328:703;;;;:::o;5190:135:10:-;5251:7;5285:12;:19;5298:5;5285:19;;;;;;;;;;;;;;;:32;;;;;;;;;;;;5277:41;;5270:48;;5190:135;;;:::o;20845:154::-;;;;;:::o;21640:153::-;;;;;:::o;11585:157::-;11703:32;11709:2;11713:8;11723:5;11730:4;11703:5;:32::i;:::-;11585:157;;;:::o;11989:1733::-;12122:20;12145:13;;12122:36;;12186:1;12172:16;;:2;:16;;;12168:48;;;12197:19;;;;;;;;;;;;;;12168:48;12242:1;12230:8;:13;12226:44;;;12252:18;;;;;;;;;;;;;;12226:44;12281:61;12311:1;12315:2;12319:12;12333:8;12281:21;:61::i;:::-;12648:8;12613:12;:16;12626:2;12613:16;;;;;;;;;;;;;;;:24;;;:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12711:8;12671:12;:16;12684:2;12671:16;;;;;;;;;;;;;;;:29;;;:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12768:2;12735:11;:25;12747:12;12735:25;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;12834:15;12784:11;:25;12796:12;12784:25;;;;;;;;;;;:40;;;:66;;;;;;;;;;;;;;;;;;12865:20;12888:12;12865:35;;12914:11;12943:8;12928:12;:23;12914:37;;12970:4;:23;;;;;12978:15;:2;:13;;;:15::i;:::-;12970:23;12966:628;;;13013:309;13068:12;13064:2;13043:38;;13060:1;13043:38;;;;;;;;;;;;13108:69;13147:1;13151:2;13155:14;;;;;;13171:5;13108:30;:69::i;:::-;13103:172;;13212:40;;;;;;;;;;;;;;13103:172;13317:3;13301:12;:19;;13013:309;;13401:12;13384:13;;:29;13380:43;;13415:8;;;13380:43;12966:628;;;13462:118;13517:14;;;;;;13513:2;13492:40;;13509:1;13492:40;;;;;;;;;;;;13575:3;13559:12;:19;;13462:118;;12966:628;13623:12;13607:13;:28;;;;11989:1733;;13655:60;13684:1;13688:2;13692:12;13706:8;13655:20;:60::i;:::-;11989:1733;;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:343:11:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:2;;;290:1;287;280:12;249:2;303:41;337:6;332:3;327;303:41;:::i;:::-;90:260;;;;;;:::o;356:139::-;402:5;440:6;427:20;418:29;;456:33;483:5;456:33;:::i;:::-;408:87;;;;:::o;501:155::-;555:5;593:6;580:20;571:29;;609:41;644:5;609:41;:::i;:::-;561:95;;;;:::o;662:133::-;705:5;743:6;730:20;721:29;;759:30;783:5;759:30;:::i;:::-;711:84;;;;:::o;801:137::-;846:5;884:6;871:20;862:29;;900:32;926:5;900:32;:::i;:::-;852:86;;;;:::o;944:141::-;1000:5;1031:6;1025:13;1016:22;;1047:32;1073:5;1047:32;:::i;:::-;1006:79;;;;:::o;1104:271::-;1159:5;1208:3;1201:4;1193:6;1189:17;1185:27;1175:2;;1226:1;1223;1216:12;1175:2;1266:6;1253:20;1291:78;1365:3;1357:6;1350:4;1342:6;1338:17;1291:78;:::i;:::-;1282:87;;1165:210;;;;;:::o;1395:352::-;1453:8;1463:6;1513:3;1506:4;1498:6;1494:17;1490:27;1480:2;;1531:1;1528;1521:12;1480:2;1567:6;1554:20;1544:30;;1597:18;1589:6;1586:30;1583:2;;;1629:1;1626;1619:12;1583:2;1666:4;1658:6;1654:17;1642:29;;1720:3;1712:4;1704:6;1700:17;1690:8;1686:32;1683:41;1680:2;;;1737:1;1734;1727:12;1680:2;1470:277;;;;;:::o;1753:139::-;1799:5;1837:6;1824:20;1815:29;;1853:33;1880:5;1853:33;:::i;:::-;1805:87;;;;:::o;1898:262::-;1957:6;2006:2;1994:9;1985:7;1981:23;1977:32;1974:2;;;2022:1;2019;2012:12;1974:2;2065:1;2090:53;2135:7;2126:6;2115:9;2111:22;2090:53;:::i;:::-;2080:63;;2036:117;1964:196;;;;:::o;2166:278::-;2233:6;2282:2;2270:9;2261:7;2257:23;2253:32;2250:2;;;2298:1;2295;2288:12;2250:2;2341:1;2366:61;2419:7;2410:6;2399:9;2395:22;2366:61;:::i;:::-;2356:71;;2312:125;2240:204;;;;:::o;2450:407::-;2518:6;2526;2575:2;2563:9;2554:7;2550:23;2546:32;2543:2;;;2591:1;2588;2581:12;2543:2;2634:1;2659:53;2704:7;2695:6;2684:9;2680:22;2659:53;:::i;:::-;2649:63;;2605:117;2761:2;2787:53;2832:7;2823:6;2812:9;2808:22;2787:53;:::i;:::-;2777:63;;2732:118;2533:324;;;;;:::o;2863:552::-;2940:6;2948;2956;3005:2;2993:9;2984:7;2980:23;2976:32;2973:2;;;3021:1;3018;3011:12;2973:2;3064:1;3089:53;3134:7;3125:6;3114:9;3110:22;3089:53;:::i;:::-;3079:63;;3035:117;3191:2;3217:53;3262:7;3253:6;3242:9;3238:22;3217:53;:::i;:::-;3207:63;;3162:118;3319:2;3345:53;3390:7;3381:6;3370:9;3366:22;3345:53;:::i;:::-;3335:63;;3290:118;2963:452;;;;;:::o;3421:809::-;3516:6;3524;3532;3540;3589:3;3577:9;3568:7;3564:23;3560:33;3557:2;;;3606:1;3603;3596:12;3557:2;3649:1;3674:53;3719:7;3710:6;3699:9;3695:22;3674:53;:::i;:::-;3664:63;;3620:117;3776:2;3802:53;3847:7;3838:6;3827:9;3823:22;3802:53;:::i;:::-;3792:63;;3747:118;3904:2;3930:53;3975:7;3966:6;3955:9;3951:22;3930:53;:::i;:::-;3920:63;;3875:118;4060:2;4049:9;4045:18;4032:32;4091:18;4083:6;4080:30;4077:2;;;4123:1;4120;4113:12;4077:2;4151:62;4205:7;4196:6;4185:9;4181:22;4151:62;:::i;:::-;4141:72;;4003:220;3547:683;;;;;;;:::o;4236:401::-;4301:6;4309;4358:2;4346:9;4337:7;4333:23;4329:32;4326:2;;;4374:1;4371;4364:12;4326:2;4417:1;4442:53;4487:7;4478:6;4467:9;4463:22;4442:53;:::i;:::-;4432:63;;4388:117;4544:2;4570:50;4612:7;4603:6;4592:9;4588:22;4570:50;:::i;:::-;4560:60;;4515:115;4316:321;;;;;:::o;4643:407::-;4711:6;4719;4768:2;4756:9;4747:7;4743:23;4739:32;4736:2;;;4784:1;4781;4774:12;4736:2;4827:1;4852:53;4897:7;4888:6;4877:9;4873:22;4852:53;:::i;:::-;4842:63;;4798:117;4954:2;4980:53;5025:7;5016:6;5005:9;5001:22;4980:53;:::i;:::-;4970:63;;4925:118;4726:324;;;;;:::o;5056:260::-;5114:6;5163:2;5151:9;5142:7;5138:23;5134:32;5131:2;;;5179:1;5176;5169:12;5131:2;5222:1;5247:52;5291:7;5282:6;5271:9;5267:22;5247:52;:::i;:::-;5237:62;;5193:116;5121:195;;;;:::o;5322:282::-;5391:6;5440:2;5428:9;5419:7;5415:23;5411:32;5408:2;;;5456:1;5453;5446:12;5408:2;5499:1;5524:63;5579:7;5570:6;5559:9;5555:22;5524:63;:::i;:::-;5514:73;;5470:127;5398:206;;;;:::o;5610:395::-;5681:6;5689;5738:2;5726:9;5717:7;5713:23;5709:32;5706:2;;;5754:1;5751;5744:12;5706:2;5825:1;5814:9;5810:17;5797:31;5855:18;5847:6;5844:30;5841:2;;;5887:1;5884;5877:12;5841:2;5923:65;5980:7;5971:6;5960:9;5956:22;5923:65;:::i;:::-;5905:83;;;;5768:230;5696:309;;;;;:::o;6011:262::-;6070:6;6119:2;6107:9;6098:7;6094:23;6090:32;6087:2;;;6135:1;6132;6125:12;6087:2;6178:1;6203:53;6248:7;6239:6;6228:9;6224:22;6203:53;:::i;:::-;6193:63;;6149:117;6077:196;;;;:::o;6279:118::-;6366:24;6384:5;6366:24;:::i;:::-;6361:3;6354:37;6344:53;;:::o;6403:109::-;6484:21;6499:5;6484:21;:::i;:::-;6479:3;6472:34;6462:50;;:::o;6518:360::-;6604:3;6632:38;6664:5;6632:38;:::i;:::-;6686:70;6749:6;6744:3;6686:70;:::i;:::-;6679:77;;6765:52;6810:6;6805:3;6798:4;6791:5;6787:16;6765:52;:::i;:::-;6842:29;6864:6;6842:29;:::i;:::-;6837:3;6833:39;6826:46;;6608:270;;;;;:::o;6908:304::-;7006:3;7027:71;7091:6;7086:3;7027:71;:::i;:::-;7020:78;;7108:43;7144:6;7139:3;7132:5;7108:43;:::i;:::-;7176:29;7198:6;7176:29;:::i;:::-;7171:3;7167:39;7160:46;;7010:202;;;;;:::o;7218:364::-;7306:3;7334:39;7367:5;7334:39;:::i;:::-;7389:71;7453:6;7448:3;7389:71;:::i;:::-;7382:78;;7469:52;7514:6;7509:3;7502:4;7495:5;7491:16;7469:52;:::i;:::-;7546:29;7568:6;7546:29;:::i;:::-;7541:3;7537:39;7530:46;;7310:272;;;;;:::o;7588:377::-;7694:3;7722:39;7755:5;7722:39;:::i;:::-;7777:89;7859:6;7854:3;7777:89;:::i;:::-;7770:96;;7875:52;7920:6;7915:3;7908:4;7901:5;7897:16;7875:52;:::i;:::-;7952:6;7947:3;7943:16;7936:23;;7698:267;;;;;:::o;7971:366::-;8113:3;8134:67;8198:2;8193:3;8134:67;:::i;:::-;8127:74;;8210:93;8299:3;8210:93;:::i;:::-;8328:2;8323:3;8319:12;8312:19;;8117:220;;;:::o;8343:366::-;8485:3;8506:67;8570:2;8565:3;8506:67;:::i;:::-;8499:74;;8582:93;8671:3;8582:93;:::i;:::-;8700:2;8695:3;8691:12;8684:19;;8489:220;;;:::o;8715:366::-;8857:3;8878:67;8942:2;8937:3;8878:67;:::i;:::-;8871:74;;8954:93;9043:3;8954:93;:::i;:::-;9072:2;9067:3;9063:12;9056:19;;8861:220;;;:::o;9087:366::-;9229:3;9250:67;9314:2;9309:3;9250:67;:::i;:::-;9243:74;;9326:93;9415:3;9326:93;:::i;:::-;9444:2;9439:3;9435:12;9428:19;;9233:220;;;:::o;9459:366::-;9601:3;9622:67;9686:2;9681:3;9622:67;:::i;:::-;9615:74;;9698:93;9787:3;9698:93;:::i;:::-;9816:2;9811:3;9807:12;9800:19;;9605:220;;;:::o;9831:398::-;9990:3;10011:83;10092:1;10087:3;10011:83;:::i;:::-;10004:90;;10103:93;10192:3;10103:93;:::i;:::-;10221:1;10216:3;10212:11;10205:18;;9994:235;;;:::o;10235:366::-;10377:3;10398:67;10462:2;10457:3;10398:67;:::i;:::-;10391:74;;10474:93;10563:3;10474:93;:::i;:::-;10592:2;10587:3;10583:12;10576:19;;10381:220;;;:::o;10607:366::-;10749:3;10770:67;10834:2;10829:3;10770:67;:::i;:::-;10763:74;;10846:93;10935:3;10846:93;:::i;:::-;10964:2;10959:3;10955:12;10948:19;;10753:220;;;:::o;10979:118::-;11066:24;11084:5;11066:24;:::i;:::-;11061:3;11054:37;11044:53;;:::o;11103:435::-;11283:3;11305:95;11396:3;11387:6;11305:95;:::i;:::-;11298:102;;11417:95;11508:3;11499:6;11417:95;:::i;:::-;11410:102;;11529:3;11522:10;;11287:251;;;;;:::o;11544:379::-;11728:3;11750:147;11893:3;11750:147;:::i;:::-;11743:154;;11914:3;11907:10;;11732:191;;;:::o;11929:222::-;12022:4;12060:2;12049:9;12045:18;12037:26;;12073:71;12141:1;12130:9;12126:17;12117:6;12073:71;:::i;:::-;12027:124;;;;:::o;12157:640::-;12352:4;12390:3;12379:9;12375:19;12367:27;;12404:71;12472:1;12461:9;12457:17;12448:6;12404:71;:::i;:::-;12485:72;12553:2;12542:9;12538:18;12529:6;12485:72;:::i;:::-;12567;12635:2;12624:9;12620:18;12611:6;12567:72;:::i;:::-;12686:9;12680:4;12676:20;12671:2;12660:9;12656:18;12649:48;12714:76;12785:4;12776:6;12714:76;:::i;:::-;12706:84;;12357:440;;;;;;;:::o;12803:332::-;12924:4;12962:2;12951:9;12947:18;12939:26;;12975:71;13043:1;13032:9;13028:17;13019:6;12975:71;:::i;:::-;13056:72;13124:2;13113:9;13109:18;13100:6;13056:72;:::i;:::-;12929:206;;;;;:::o;13141:210::-;13228:4;13266:2;13255:9;13251:18;13243:26;;13279:65;13341:1;13330:9;13326:17;13317:6;13279:65;:::i;:::-;13233:118;;;;:::o;13357:333::-;13480:4;13518:2;13507:9;13503:18;13495:26;;13567:9;13561:4;13557:20;13553:1;13542:9;13538:17;13531:47;13595:88;13678:4;13669:6;13661;13595:88;:::i;:::-;13587:96;;13485:205;;;;;:::o;13696:313::-;13809:4;13847:2;13836:9;13832:18;13824:26;;13896:9;13890:4;13886:20;13882:1;13871:9;13867:17;13860:47;13924:78;13997:4;13988:6;13924:78;:::i;:::-;13916:86;;13814:195;;;;:::o;14015:419::-;14181:4;14219:2;14208:9;14204:18;14196:26;;14268:9;14262:4;14258:20;14254:1;14243:9;14239:17;14232:47;14296:131;14422:4;14296:131;:::i;:::-;14288:139;;14186:248;;;:::o;14440:419::-;14606:4;14644:2;14633:9;14629:18;14621:26;;14693:9;14687:4;14683:20;14679:1;14668:9;14664:17;14657:47;14721:131;14847:4;14721:131;:::i;:::-;14713:139;;14611:248;;;:::o;14865:419::-;15031:4;15069:2;15058:9;15054:18;15046:26;;15118:9;15112:4;15108:20;15104:1;15093:9;15089:17;15082:47;15146:131;15272:4;15146:131;:::i;:::-;15138:139;;15036:248;;;:::o;15290:419::-;15456:4;15494:2;15483:9;15479:18;15471:26;;15543:9;15537:4;15533:20;15529:1;15518:9;15514:17;15507:47;15571:131;15697:4;15571:131;:::i;:::-;15563:139;;15461:248;;;:::o;15715:419::-;15881:4;15919:2;15908:9;15904:18;15896:26;;15968:9;15962:4;15958:20;15954:1;15943:9;15939:17;15932:47;15996:131;16122:4;15996:131;:::i;:::-;15988:139;;15886:248;;;:::o;16140:419::-;16306:4;16344:2;16333:9;16329:18;16321:26;;16393:9;16387:4;16383:20;16379:1;16368:9;16364:17;16357:47;16421:131;16547:4;16421:131;:::i;:::-;16413:139;;16311:248;;;:::o;16565:419::-;16731:4;16769:2;16758:9;16754:18;16746:26;;16818:9;16812:4;16808:20;16804:1;16793:9;16789:17;16782:47;16846:131;16972:4;16846:131;:::i;:::-;16838:139;;16736:248;;;:::o;16990:222::-;17083:4;17121:2;17110:9;17106:18;17098:26;;17134:71;17202:1;17191:9;17187:17;17178:6;17134:71;:::i;:::-;17088:124;;;;:::o;17218:129::-;17252:6;17279:20;;:::i;:::-;17269:30;;17308:33;17336:4;17328:6;17308:33;:::i;:::-;17259:88;;;:::o;17353:75::-;17386:6;17419:2;17413:9;17403:19;;17393:35;:::o;17434:307::-;17495:4;17585:18;17577:6;17574:30;17571:2;;;17607:18;;:::i;:::-;17571:2;17645:29;17667:6;17645:29;:::i;:::-;17637:37;;17729:4;17723;17719:15;17711:23;;17500:241;;;:::o;17747:98::-;17798:6;17832:5;17826:12;17816:22;;17805:40;;;:::o;17851:99::-;17903:6;17937:5;17931:12;17921:22;;17910:40;;;:::o;17956:168::-;18039:11;18073:6;18068:3;18061:19;18113:4;18108:3;18104:14;18089:29;;18051:73;;;;:::o;18130:147::-;18231:11;18268:3;18253:18;;18243:34;;;;:::o;18283:169::-;18367:11;18401:6;18396:3;18389:19;18441:4;18436:3;18432:14;18417:29;;18379:73;;;;:::o;18458:148::-;18560:11;18597:3;18582:18;;18572:34;;;;:::o;18612:305::-;18652:3;18671:20;18689:1;18671:20;:::i;:::-;18666:25;;18705:20;18723:1;18705:20;:::i;:::-;18700:25;;18859:1;18791:66;18787:74;18784:1;18781:81;18778:2;;;18865:18;;:::i;:::-;18778:2;18909:1;18906;18902:9;18895:16;;18656:261;;;;:::o;18923:185::-;18963:1;18980:20;18998:1;18980:20;:::i;:::-;18975:25;;19014:20;19032:1;19014:20;:::i;:::-;19009:25;;19053:1;19043:2;;19058:18;;:::i;:::-;19043:2;19100:1;19097;19093:9;19088:14;;18965:143;;;;:::o;19114:191::-;19154:4;19174:20;19192:1;19174:20;:::i;:::-;19169:25;;19208:20;19226:1;19208:20;:::i;:::-;19203:25;;19247:1;19244;19241:8;19238:2;;;19252:18;;:::i;:::-;19238:2;19297:1;19294;19290:9;19282:17;;19159:146;;;;:::o;19311:96::-;19348:7;19377:24;19395:5;19377:24;:::i;:::-;19366:35;;19356:51;;;:::o;19413:104::-;19458:7;19487:24;19505:5;19487:24;:::i;:::-;19476:35;;19466:51;;;:::o;19523:90::-;19557:7;19600:5;19593:13;19586:21;19575:32;;19565:48;;;:::o;19619:149::-;19655:7;19695:66;19688:5;19684:78;19673:89;;19663:105;;;:::o;19774:126::-;19811:7;19851:42;19844:5;19840:54;19829:65;;19819:81;;;:::o;19906:77::-;19943:7;19972:5;19961:16;;19951:32;;;:::o;19989:154::-;20073:6;20068:3;20063;20050:30;20135:1;20126:6;20121:3;20117:16;20110:27;20040:103;;;:::o;20149:307::-;20217:1;20227:113;20241:6;20238:1;20235:13;20227:113;;;20326:1;20321:3;20317:11;20311:18;20307:1;20302:3;20298:11;20291:39;20263:2;20260:1;20256:10;20251:15;;20227:113;;;20358:6;20355:1;20352:13;20349:2;;;20438:1;20429:6;20424:3;20420:16;20413:27;20349:2;20198:258;;;;:::o;20462:320::-;20506:6;20543:1;20537:4;20533:12;20523:22;;20590:1;20584:4;20580:12;20611:18;20601:2;;20667:4;20659:6;20655:17;20645:27;;20601:2;20729;20721:6;20718:14;20698:18;20695:38;20692:2;;;20748:18;;:::i;:::-;20692:2;20513:269;;;;:::o;20788:281::-;20871:27;20893:4;20871:27;:::i;:::-;20863:6;20859:40;21001:6;20989:10;20986:22;20965:18;20953:10;20950:34;20947:62;20944:2;;;21012:18;;:::i;:::-;20944:2;21052:10;21048:2;21041:22;20831:238;;;:::o;21075:233::-;21114:3;21137:24;21155:5;21137:24;:::i;:::-;21128:33;;21183:66;21176:5;21173:77;21170:2;;;21253:18;;:::i;:::-;21170:2;21300:1;21293:5;21289:13;21282:20;;21118:190;;;:::o;21314:176::-;21346:1;21363:20;21381:1;21363:20;:::i;:::-;21358:25;;21397:20;21415:1;21397:20;:::i;:::-;21392:25;;21436:1;21426:2;;21441:18;;:::i;:::-;21426:2;21482:1;21479;21475:9;21470:14;;21348:142;;;;:::o;21496:180::-;21544:77;21541:1;21534:88;21641:4;21638:1;21631:15;21665:4;21662:1;21655:15;21682:180;21730:77;21727:1;21720:88;21827:4;21824:1;21817:15;21851:4;21848:1;21841:15;21868:180;21916:77;21913:1;21906:88;22013:4;22010:1;22003:15;22037:4;22034:1;22027:15;22054:180;22102:77;22099:1;22092:88;22199:4;22196:1;22189:15;22223:4;22220:1;22213:15;22240:102;22281:6;22332:2;22328:7;22323:2;22316:5;22312:14;22308:28;22298:38;;22288:54;;;:::o;22348:225::-;22488:34;22484:1;22476:6;22472:14;22465:58;22557:8;22552:2;22544:6;22540:15;22533:33;22454:119;:::o;22579:171::-;22719:23;22715:1;22707:6;22703:14;22696:47;22685:65;:::o;22756:175::-;22896:27;22892:1;22884:6;22880:14;22873:51;22862:69;:::o;22937:229::-;23077:34;23073:1;23065:6;23061:14;23054:58;23146:12;23141:2;23133:6;23129:15;23122:37;23043:123;:::o;23172:182::-;23312:34;23308:1;23300:6;23296:14;23289:58;23278:76;:::o;23360:114::-;23466:8;:::o;23480:165::-;23620:17;23616:1;23608:6;23604:14;23597:41;23586:59;:::o;23651:170::-;23791:22;23787:1;23779:6;23775:14;23768:46;23757:64;:::o;23827:122::-;23900:24;23918:5;23900:24;:::i;:::-;23893:5;23890:35;23880:2;;23939:1;23936;23929:12;23880:2;23870:79;:::o;23955:138::-;24036:32;24062:5;24036:32;:::i;:::-;24029:5;24026:43;24016:2;;24083:1;24080;24073:12;24016:2;24006:87;:::o;24099:116::-;24169:21;24184:5;24169:21;:::i;:::-;24162:5;24159:32;24149:2;;24205:1;24202;24195:12;24149:2;24139:76;:::o;24221:120::-;24293:23;24310:5;24293:23;:::i;:::-;24286:5;24283:34;24273:2;;24331:1;24328;24321:12;24273:2;24263:78;:::o;24347:122::-;24420:24;24438:5;24420:24;:::i;:::-;24413:5;24410:35;24400:2;;24459:1;24456;24449:12;24400:2;24390:79;:::o

Swarm Source

ipfs://bd952be899de1eae4ce127f7558e9d8d1d167672766c234cf6f62fc7883db803
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.