ETH Price: $3,682.24 (-5.17%)

Token

Poke Poke Ahh (PPA)
 

Overview

Max Total Supply

2,004 PPA

Holders

929

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
2 PPA
0x4f7f037be3b51ae2c6d8968f77580a2bca1344c2
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:
PPA

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-07-06
*/

// File: @openzeppelin/contracts/security/ReentrancyGuard.sol


// OpenZeppelin Contracts v4.4.1 (security/ReentrancyGuard.sol)

pragma solidity ^0.8.0;

/**
 * @dev Contract module that helps prevent reentrant calls to a function.
 *
 * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier
 * available, which can be applied to functions to make sure there are no nested
 * (reentrant) calls to them.
 *
 * Note that because there is a single `nonReentrant` guard, functions marked as
 * `nonReentrant` may not call one another. This can be worked around by making
 * those functions `private`, and then adding `external` `nonReentrant` entry
 * points to them.
 *
 * TIP: If you would like to learn more about reentrancy and alternative ways
 * to protect against it, check out our blog post
 * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].
 */
abstract contract ReentrancyGuard {
    // Booleans are more expensive than uint256 or any type that takes up a full
    // word because each write operation emits an extra SLOAD to first read the
    // slot's contents, replace the bits taken up by the boolean, and then write
    // back. This is the compiler's defense against contract upgrades and
    // pointer aliasing, and it cannot be disabled.

    // The values being non-zero value makes deployment a bit more expensive,
    // but in exchange the refund on every call to nonReentrant will be lower in
    // amount. Since refunds are capped to a percentage of the total
    // transaction's gas, it is best to keep them low in cases like this one, to
    // increase the likelihood of the full refund coming into effect.
    uint256 private constant _NOT_ENTERED = 1;
    uint256 private constant _ENTERED = 2;

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

    /**
     * @dev Prevents a contract from calling itself, directly or indirectly.
     * Calling a `nonReentrant` function from another `nonReentrant`
     * function is not supported. It is possible to prevent this from happening
     * by making the `nonReentrant` function external, and making it call a
     * `private` function that does the actual work.
     */
    modifier nonReentrant() {
        // On the first call to nonReentrant, _notEntered will be true
        require(_status != _ENTERED, "ReentrancyGuard: reentrant call");

        // Any calls to nonReentrant after this point will fail
        _status = _ENTERED;

        _;

        // By storing the original value once again, a refund is triggered (see
        // https://eips.ethereum.org/EIPS/eip-2200)
        _status = _NOT_ENTERED;
    }
}

// File: erc721a/contracts/IERC721A.sol


// ERC721A Contracts v4.1.0
// Creator: Chiru Labs

pragma solidity ^0.8.4;

/**
 * @dev Interface of an ERC721A compliant contract.
 */
interface IERC721A {
    /**
     * The caller must own the token or be an approved operator.
     */
    error ApprovalCallerNotOwnerNorApproved();

    /**
     * The token does not exist.
     */
    error ApprovalQueryForNonexistentToken();

    /**
     * The caller cannot approve to their own address.
     */
    error ApproveToCaller();

    /**
     * Cannot query the balance for the zero address.
     */
    error BalanceQueryForZeroAddress();

    /**
     * Cannot mint to the zero address.
     */
    error MintToZeroAddress();

    /**
     * The quantity of tokens minted must be more than zero.
     */
    error MintZeroQuantity();

    /**
     * The token does not exist.
     */
    error OwnerQueryForNonexistentToken();

    /**
     * The caller must own the token or be an approved operator.
     */
    error TransferCallerNotOwnerNorApproved();

    /**
     * The token must be owned by `from`.
     */
    error TransferFromIncorrectOwner();

    /**
     * Cannot safely transfer to a contract that does not implement the ERC721Receiver interface.
     */
    error TransferToNonERC721ReceiverImplementer();

    /**
     * Cannot transfer to the zero address.
     */
    error TransferToZeroAddress();

    /**
     * The token does not exist.
     */
    error URIQueryForNonexistentToken();

    /**
     * The `quantity` minted with ERC2309 exceeds the safety limit.
     */
    error MintERC2309QuantityExceedsLimit();

    /**
     * The `extraData` cannot be set on an unintialized ownership slot.
     */
    error OwnershipNotInitializedForExtraData();

    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;
        // Arbitrary data similar to `startTimestamp` that can be set through `_extraData`.
        uint24 extraData;
    }

    /**
     * @dev Returns the total amount of tokens stored by the contract.
     *
     * Burned tokens are calculated here, use `_totalMinted()` if you want to count just minted tokens.
     */
    function totalSupply() external view returns (uint256);

    // ==============================
    //            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);

    // ==============================
    //            IERC721
    // ==============================

    /**
     * @dev Emitted when `tokenId` token is transferred from `from` to `to`.
     */
    event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);

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

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

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

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

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

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
     * are aware of the ERC721 protocol to prevent tokens from being forever locked.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must 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 Approve or remove `operator` as an operator for the caller.
     * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller.
     *
     * Requirements:
     *
     * - The `operator` cannot be the caller.
     *
     * Emits an {ApprovalForAll} event.
     */
    function setApprovalForAll(address operator, bool _approved) external;

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

    /**
     * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`.
     *
     * See {setApprovalForAll}
     */
    function isApprovedForAll(address owner, address operator) external view returns (bool);

    // ==============================
    //        IERC721Metadata
    // ==============================

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

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

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

    // ==============================
    //            IERC2309
    // ==============================

    /**
     * @dev Emitted when tokens in `fromTokenId` to `toTokenId` (inclusive) is transferred from `from` to `to`,
     * as defined in the ERC2309 standard. See `_mintERC2309` for more details.
     */
    event ConsecutiveTransfer(uint256 indexed fromTokenId, uint256 toTokenId, address indexed from, address indexed to);
}

// File: erc721a/contracts/ERC721A.sol


// ERC721A Contracts v4.1.0
// Creator: Chiru Labs

pragma solidity ^0.8.4;


/**
 * @dev ERC721 token receiver interface.
 */
interface ERC721A__IERC721Receiver {
    function onERC721Received(
        address operator,
        address from,
        uint256 tokenId,
        bytes calldata data
    ) external returns (bytes4);
}

/**
 * @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 IERC721A {
    // Mask of an entry in packed address data.
    uint256 private constant BITMASK_ADDRESS_DATA_ENTRY = (1 << 64) - 1;

    // The bit position of `numberMinted` in packed address data.
    uint256 private constant BITPOS_NUMBER_MINTED = 64;

    // The bit position of `numberBurned` in packed address data.
    uint256 private constant BITPOS_NUMBER_BURNED = 128;

    // The bit position of `aux` in packed address data.
    uint256 private constant BITPOS_AUX = 192;

    // Mask of all 256 bits in packed address data except the 64 bits for `aux`.
    uint256 private constant BITMASK_AUX_COMPLEMENT = (1 << 192) - 1;

    // The bit position of `startTimestamp` in packed ownership.
    uint256 private constant BITPOS_START_TIMESTAMP = 160;

    // The bit mask of the `burned` bit in packed ownership.
    uint256 private constant BITMASK_BURNED = 1 << 224;

    // The bit position of the `nextInitialized` bit in packed ownership.
    uint256 private constant BITPOS_NEXT_INITIALIZED = 225;

    // The bit mask of the `nextInitialized` bit in packed ownership.
    uint256 private constant BITMASK_NEXT_INITIALIZED = 1 << 225;

    // The bit position of `extraData` in packed ownership.
    uint256 private constant BITPOS_EXTRA_DATA = 232;

    // Mask of all 256 bits in a packed ownership except the 24 bits for `extraData`.
    uint256 private constant BITMASK_EXTRA_DATA_COMPLEMENT = (1 << 232) - 1;

    // The mask of the lower 160 bits for addresses.
    uint256 private constant BITMASK_ADDRESS = (1 << 160) - 1;

    // The maximum `quantity` that can be minted with `_mintERC2309`.
    // This limit is to prevent overflows on the address data entries.
    // For a limit of 5000, a total of 3.689e15 calls to `_mintERC2309`
    // is required to cause an overflow, which is unrealistic.
    uint256 private constant MAX_MINT_ERC2309_QUANTITY_LIMIT = 5000;

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

    // The number of tokens burned.
    uint256 private _burnCounter;

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

    // Mapping from token ID to ownership details
    // An empty struct value does not necessarily mean the token is unowned.
    // See `_packedOwnershipOf` implementation for details.
    //
    // Bits Layout:
    // - [0..159]   `addr`
    // - [160..223] `startTimestamp`
    // - [224]      `burned`
    // - [225]      `nextInitialized`
    // - [232..255] `extraData`
    mapping(uint256 => uint256) private _packedOwnerships;

    // Mapping owner address to address data.
    //
    // Bits Layout:
    // - [0..63]    `balance`
    // - [64..127]  `numberMinted`
    // - [128..191] `numberBurned`
    // - [192..255] `aux`
    mapping(address => uint256) private _packedAddressData;

    // Mapping from token ID to approved address.
    mapping(uint256 => 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();
    }

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

    /**
     * @dev Returns the next token ID to be minted.
     */
    function _nextTokenId() internal view returns (uint256) {
        return _currentIndex;
    }

    /**
     * @dev Returns the total number of tokens in existence.
     * Burned tokens will reduce the count.
     * To get the total number of tokens minted, please see `_totalMinted`.
     */
    function totalSupply() public view override returns (uint256) {
        // Counter underflow is impossible as _burnCounter cannot be incremented
        // more than `_currentIndex - _startTokenId()` times.
        unchecked {
            return _currentIndex - _burnCounter - _startTokenId();
        }
    }

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

    /**
     * @dev Returns the total number of tokens burned.
     */
    function _totalBurned() internal view returns (uint256) {
        return _burnCounter;
    }

    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        // The interface IDs are constants representing the first 4 bytes of the XOR of
        // all function selectors in the interface. See: https://eips.ethereum.org/EIPS/eip-165
        // e.g. `bytes4(i.functionA.selector ^ i.functionB.selector ^ ...)`
        return
            interfaceId == 0x01ffc9a7 || // ERC165 interface ID for ERC165.
            interfaceId == 0x80ac58cd || // ERC165 interface ID for ERC721.
            interfaceId == 0x5b5e139f; // ERC165 interface ID for ERC721Metadata.
    }

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

    /**
     * Returns the number of tokens minted by `owner`.
     */
    function _numberMinted(address owner) internal view returns (uint256) {
        return (_packedAddressData[owner] >> BITPOS_NUMBER_MINTED) & BITMASK_ADDRESS_DATA_ENTRY;
    }

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

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

    /**
     * Sets the auxiliary data for `owner`. (e.g. number of whitelist mint slots used).
     * If there are multiple variables, please pack them into a uint64.
     */
    function _setAux(address owner, uint64 aux) internal {
        uint256 packed = _packedAddressData[owner];
        uint256 auxCasted;
        // Cast `aux` with assembly to avoid redundant masking.
        assembly {
            auxCasted := aux
        }
        packed = (packed & BITMASK_AUX_COMPLEMENT) | (auxCasted << BITPOS_AUX);
        _packedAddressData[owner] = packed;
    }

    /**
     * Returns the packed ownership data of `tokenId`.
     */
    function _packedOwnershipOf(uint256 tokenId) private view returns (uint256) {
        uint256 curr = tokenId;

        unchecked {
            if (_startTokenId() <= curr)
                if (curr < _currentIndex) {
                    uint256 packed = _packedOwnerships[curr];
                    // If not burned.
                    if (packed & BITMASK_BURNED == 0) {
                        // Invariant:
                        // There will always be an 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.
                        //
                        // We can directly compare the packed value.
                        // If the address is zero, packed is zero.
                        while (packed == 0) {
                            packed = _packedOwnerships[--curr];
                        }
                        return packed;
                    }
                }
        }
        revert OwnerQueryForNonexistentToken();
    }

    /**
     * Returns the unpacked `TokenOwnership` struct from `packed`.
     */
    function _unpackedOwnership(uint256 packed) private pure returns (TokenOwnership memory ownership) {
        ownership.addr = address(uint160(packed));
        ownership.startTimestamp = uint64(packed >> BITPOS_START_TIMESTAMP);
        ownership.burned = packed & BITMASK_BURNED != 0;
        ownership.extraData = uint24(packed >> BITPOS_EXTRA_DATA);
    }

    /**
     * Returns the unpacked `TokenOwnership` struct at `index`.
     */
    function _ownershipAt(uint256 index) internal view returns (TokenOwnership memory) {
        return _unpackedOwnership(_packedOwnerships[index]);
    }

    /**
     * @dev Initializes the ownership slot minted at `index` for efficiency purposes.
     */
    function _initializeOwnershipAt(uint256 index) internal {
        if (_packedOwnerships[index] == 0) {
            _packedOwnerships[index] = _packedOwnershipOf(index);
        }
    }

    /**
     * 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) {
        return _unpackedOwnership(_packedOwnershipOf(tokenId));
    }

    /**
     * @dev Packs ownership data into a single uint256.
     */
    function _packOwnershipData(address owner, uint256 flags) private view returns (uint256 result) {
        assembly {
            // Mask `owner` to the lower 160 bits, in case the upper bits somehow aren't clean.
            owner := and(owner, BITMASK_ADDRESS)
            // `owner | (block.timestamp << BITPOS_START_TIMESTAMP) | flags`.
            result := or(owner, or(shl(BITPOS_START_TIMESTAMP, timestamp()), flags))
        }
    }

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

    /**
     * @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, _toString(tokenId))) : '';
    }

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

    /**
     * @dev Returns the `nextInitialized` flag set if `quantity` equals 1.
     */
    function _nextInitializedFlag(uint256 quantity) private pure returns (uint256 result) {
        // For branchless setting of the `nextInitialized` flag.
        assembly {
            // `(quantity == 1) << BITPOS_NEXT_INITIALIZED`.
            result := shl(BITPOS_NEXT_INITIALIZED, eq(quantity, 1))
        }
    }

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

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

        _tokenApprovals[tokenId] = to;
        emit Approval(owner, to, tokenId);
    }

    /**
     * @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 == _msgSenderERC721A()) revert ApproveToCaller();

        _operatorApprovals[_msgSenderERC721A()][operator] = approved;
        emit ApprovalForAll(_msgSenderERC721A(), 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-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 {
        transferFrom(from, to, tokenId);
        if (to.code.length != 0)
            if (!_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 && // If within bounds,
            _packedOwnerships[tokenId] & BITMASK_BURNED == 0; // and not burned.
    }

    /**
     * @dev Equivalent to `_safeMint(to, quantity, '')`.
     */
    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.
     *
     * See {_mint}.
     *
     * Emits a {Transfer} event for each mint.
     */
    function _safeMint(
        address to,
        uint256 quantity,
        bytes memory _data
    ) internal {
        _mint(to, quantity);

        unchecked {
            if (to.code.length != 0) {
                uint256 end = _currentIndex;
                uint256 index = end - quantity;
                do {
                    if (!_checkContractOnERC721Received(address(0), to, index++, _data)) {
                        revert TransferToNonERC721ReceiverImplementer();
                    }
                } while (index < end);
                // Reentrancy protection.
                if (_currentIndex != end) revert();
            }
        }
    }

    /**
     * @dev Mints `quantity` tokens and transfers them to `to`.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `quantity` must be greater than 0.
     *
     * Emits a {Transfer} event for each mint.
     */
    function _mint(address to, uint256 quantity) internal {
        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` and `numberMinted` have a maximum limit of 2**64.
        // `tokenId` has a maximum limit of 2**256.
        unchecked {
            // Updates:
            // - `balance += quantity`.
            // - `numberMinted += quantity`.
            //
            // We can directly add to the `balance` and `numberMinted`.
            _packedAddressData[to] += quantity * ((1 << BITPOS_NUMBER_MINTED) | 1);

            // Updates:
            // - `address` to the owner.
            // - `startTimestamp` to the timestamp of minting.
            // - `burned` to `false`.
            // - `nextInitialized` to `quantity == 1`.
            _packedOwnerships[startTokenId] = _packOwnershipData(
                to,
                _nextInitializedFlag(quantity) | _nextExtraData(address(0), to, 0)
            );

            uint256 tokenId = startTokenId;
            uint256 end = startTokenId + quantity;
            do {
                emit Transfer(address(0), to, tokenId++);
            } while (tokenId < end);

            _currentIndex = end;
        }
        _afterTokenTransfers(address(0), to, startTokenId, quantity);
    }

    /**
     * @dev Mints `quantity` tokens and transfers them to `to`.
     *
     * This function is intended for efficient minting only during contract creation.
     *
     * It emits only one {ConsecutiveTransfer} as defined in
     * [ERC2309](https://eips.ethereum.org/EIPS/eip-2309),
     * instead of a sequence of {Transfer} event(s).
     *
     * Calling this function outside of contract creation WILL make your contract
     * non-compliant with the ERC721 standard.
     * For full ERC721 compliance, substituting ERC721 {Transfer} event(s) with the ERC2309
     * {ConsecutiveTransfer} event is only permissible during contract creation.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `quantity` must be greater than 0.
     *
     * Emits a {ConsecutiveTransfer} event.
     */
    function _mintERC2309(address to, uint256 quantity) internal {
        uint256 startTokenId = _currentIndex;
        if (to == address(0)) revert MintToZeroAddress();
        if (quantity == 0) revert MintZeroQuantity();
        if (quantity > MAX_MINT_ERC2309_QUANTITY_LIMIT) revert MintERC2309QuantityExceedsLimit();

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

        // Overflows are unrealistic due to the above check for `quantity` to be below the limit.
        unchecked {
            // Updates:
            // - `balance += quantity`.
            // - `numberMinted += quantity`.
            //
            // We can directly add to the `balance` and `numberMinted`.
            _packedAddressData[to] += quantity * ((1 << BITPOS_NUMBER_MINTED) | 1);

            // Updates:
            // - `address` to the owner.
            // - `startTimestamp` to the timestamp of minting.
            // - `burned` to `false`.
            // - `nextInitialized` to `quantity == 1`.
            _packedOwnerships[startTokenId] = _packOwnershipData(
                to,
                _nextInitializedFlag(quantity) | _nextExtraData(address(0), to, 0)
            );

            emit ConsecutiveTransfer(startTokenId, startTokenId + quantity - 1, address(0), to);

            _currentIndex = startTokenId + quantity;
        }
        _afterTokenTransfers(address(0), to, startTokenId, quantity);
    }

    /**
     * @dev Returns the storage slot and value for the approved address of `tokenId`.
     */
    function _getApprovedAddress(uint256 tokenId)
        private
        view
        returns (uint256 approvedAddressSlot, address approvedAddress)
    {
        mapping(uint256 => address) storage tokenApprovalsPtr = _tokenApprovals;
        // The following is equivalent to `approvedAddress = _tokenApprovals[tokenId]`.
        assembly {
            // Compute the slot.
            mstore(0x00, tokenId)
            mstore(0x20, tokenApprovalsPtr.slot)
            approvedAddressSlot := keccak256(0x00, 0x40)
            // Load the slot's value from storage.
            approvedAddress := sload(approvedAddressSlot)
        }
    }

    /**
     * @dev Returns whether the `approvedAddress` is equals to `from` or `msgSender`.
     */
    function _isOwnerOrApproved(
        address approvedAddress,
        address from,
        address msgSender
    ) private pure returns (bool result) {
        assembly {
            // Mask `from` to the lower 160 bits, in case the upper bits somehow aren't clean.
            from := and(from, BITMASK_ADDRESS)
            // Mask `msgSender` to the lower 160 bits, in case the upper bits somehow aren't clean.
            msgSender := and(msgSender, BITMASK_ADDRESS)
            // `msgSender == from || msgSender == approvedAddress`.
            result := or(eq(msgSender, from), eq(msgSender, approvedAddress))
        }
    }

    /**
     * @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 transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId);

        if (address(uint160(prevOwnershipPacked)) != from) revert TransferFromIncorrectOwner();

        (uint256 approvedAddressSlot, address approvedAddress) = _getApprovedAddress(tokenId);

        // The nested ifs save around 20+ gas over a compound boolean condition.
        if (!_isOwnerOrApproved(approvedAddress, from, _msgSenderERC721A()))
            if (!isApprovedForAll(from, _msgSenderERC721A())) revert TransferCallerNotOwnerNorApproved();

        if (to == address(0)) revert TransferToZeroAddress();

        _beforeTokenTransfers(from, to, tokenId, 1);

        // Clear approvals from the previous owner.
        assembly {
            if approvedAddress {
                // This is equivalent to `delete _tokenApprovals[tokenId]`.
                sstore(approvedAddressSlot, 0)
            }
        }

        // Underflow of the sender's balance is impossible because we check for
        // ownership above and the recipient's balance can't realistically overflow.
        // Counter overflow is incredibly unrealistic as tokenId would have to be 2**256.
        unchecked {
            // We can directly increment and decrement the balances.
            --_packedAddressData[from]; // Updates: `balance -= 1`.
            ++_packedAddressData[to]; // Updates: `balance += 1`.

            // Updates:
            // - `address` to the next owner.
            // - `startTimestamp` to the timestamp of transfering.
            // - `burned` to `false`.
            // - `nextInitialized` to `true`.
            _packedOwnerships[tokenId] = _packOwnershipData(
                to,
                BITMASK_NEXT_INITIALIZED | _nextExtraData(from, to, prevOwnershipPacked)
            );

            // If the next slot may not have been initialized (i.e. `nextInitialized == false`) .
            if (prevOwnershipPacked & BITMASK_NEXT_INITIALIZED == 0) {
                uint256 nextTokenId = tokenId + 1;
                // If the next slot's address is zero and not burned (i.e. packed value is zero).
                if (_packedOwnerships[nextTokenId] == 0) {
                    // If the next slot is within bounds.
                    if (nextTokenId != _currentIndex) {
                        // Initialize the next slot to maintain correctness for `ownerOf(tokenId + 1)`.
                        _packedOwnerships[nextTokenId] = prevOwnershipPacked;
                    }
                }
            }
        }

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

    /**
     * @dev Equivalent to `_burn(tokenId, false)`.
     */
    function _burn(uint256 tokenId) internal virtual {
        _burn(tokenId, false);
    }

    /**
     * @dev Destroys `tokenId`.
     * The approval is cleared when the token is burned.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     *
     * Emits a {Transfer} event.
     */
    function _burn(uint256 tokenId, bool approvalCheck) internal virtual {
        uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId);

        address from = address(uint160(prevOwnershipPacked));

        (uint256 approvedAddressSlot, address approvedAddress) = _getApprovedAddress(tokenId);

        if (approvalCheck) {
            // The nested ifs save around 20+ gas over a compound boolean condition.
            if (!_isOwnerOrApproved(approvedAddress, from, _msgSenderERC721A()))
                if (!isApprovedForAll(from, _msgSenderERC721A())) revert TransferCallerNotOwnerNorApproved();
        }

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

        // Clear approvals from the previous owner.
        assembly {
            if approvedAddress {
                // This is equivalent to `delete _tokenApprovals[tokenId]`.
                sstore(approvedAddressSlot, 0)
            }
        }

        // Underflow of the sender's balance is impossible because we check for
        // ownership above and the recipient's balance can't realistically overflow.
        // Counter overflow is incredibly unrealistic as `tokenId` would have to be 2**256.
        unchecked {
            // Updates:
            // - `balance -= 1`.
            // - `numberBurned += 1`.
            //
            // We can directly decrement the balance, and increment the number burned.
            // This is equivalent to `packed -= 1; packed += 1 << BITPOS_NUMBER_BURNED;`.
            _packedAddressData[from] += (1 << BITPOS_NUMBER_BURNED) - 1;

            // Updates:
            // - `address` to the last owner.
            // - `startTimestamp` to the timestamp of burning.
            // - `burned` to `true`.
            // - `nextInitialized` to `true`.
            _packedOwnerships[tokenId] = _packOwnershipData(
                from,
                (BITMASK_BURNED | BITMASK_NEXT_INITIALIZED) | _nextExtraData(from, address(0), prevOwnershipPacked)
            );

            // If the next slot may not have been initialized (i.e. `nextInitialized == false`) .
            if (prevOwnershipPacked & BITMASK_NEXT_INITIALIZED == 0) {
                uint256 nextTokenId = tokenId + 1;
                // If the next slot's address is zero and not burned (i.e. packed value is zero).
                if (_packedOwnerships[nextTokenId] == 0) {
                    // If the next slot is within bounds.
                    if (nextTokenId != _currentIndex) {
                        // Initialize the next slot to maintain correctness for `ownerOf(tokenId + 1)`.
                        _packedOwnerships[nextTokenId] = prevOwnershipPacked;
                    }
                }
            }
        }

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

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

    /**
     * @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 ERC721A__IERC721Receiver(to).onERC721Received(_msgSenderERC721A(), from, tokenId, _data) returns (
            bytes4 retval
        ) {
            return retval == ERC721A__IERC721Receiver(to).onERC721Received.selector;
        } catch (bytes memory reason) {
            if (reason.length == 0) {
                revert TransferToNonERC721ReceiverImplementer();
            } else {
                assembly {
                    revert(add(32, reason), mload(reason))
                }
            }
        }
    }

    /**
     * @dev Directly sets the extra data for the ownership data `index`.
     */
    function _setExtraDataAt(uint256 index, uint24 extraData) internal {
        uint256 packed = _packedOwnerships[index];
        if (packed == 0) revert OwnershipNotInitializedForExtraData();
        uint256 extraDataCasted;
        // Cast `extraData` with assembly to avoid redundant masking.
        assembly {
            extraDataCasted := extraData
        }
        packed = (packed & BITMASK_EXTRA_DATA_COMPLEMENT) | (extraDataCasted << BITPOS_EXTRA_DATA);
        _packedOwnerships[index] = packed;
    }

    /**
     * @dev Returns the next extra data for the packed ownership data.
     * The returned result is shifted into position.
     */
    function _nextExtraData(
        address from,
        address to,
        uint256 prevOwnershipPacked
    ) private view returns (uint256) {
        uint24 extraData = uint24(prevOwnershipPacked >> BITPOS_EXTRA_DATA);
        return uint256(_extraData(from, to, extraData)) << BITPOS_EXTRA_DATA;
    }

    /**
     * @dev Called during each token transfer to set the 24bit `extraData` field.
     * Intended to be overridden by the cosumer contract.
     *
     * `previousExtraData` - the value of `extraData` before transfer.
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, `from`'s `tokenId` will be
     * transferred to `to`.
     * - When `from` is zero, `tokenId` will be minted for `to`.
     * - When `to` is zero, `tokenId` will be burned by `from`.
     * - `from` and `to` are never both zero.
     */
    function _extraData(
        address from,
        address to,
        uint24 previousExtraData
    ) internal view virtual returns (uint24) {}

    /**
     * @dev Hook that is called before a set of serially-ordered token ids are about to be transferred.
     * This includes minting.
     * And also called before burning one token.
     *
     * startTokenId - the first token id to be transferred
     * quantity - the amount to be transferred
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, `from`'s `tokenId` will be
     * transferred to `to`.
     * - When `from` is zero, `tokenId` will be minted for `to`.
     * - When `to` is zero, `tokenId` will be burned by `from`.
     * - `from` and `to` are never both zero.
     */
    function _beforeTokenTransfers(
        address from,
        address to,
        uint256 startTokenId,
        uint256 quantity
    ) internal virtual {}

    /**
     * @dev Hook that is called after a set of serially-ordered token ids have been transferred.
     * This includes minting.
     * And also called after one token has been burned.
     *
     * startTokenId - the first token id to be transferred
     * quantity - the amount to be transferred
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, `from`'s `tokenId` has been
     * transferred to `to`.
     * - When `from` is zero, `tokenId` has been minted for `to`.
     * - When `to` is zero, `tokenId` has been burned by `from`.
     * - `from` and `to` are never both zero.
     */
    function _afterTokenTransfers(
        address from,
        address to,
        uint256 startTokenId,
        uint256 quantity
    ) internal virtual {}

    /**
     * @dev Returns the message sender (defaults to `msg.sender`).
     *
     * If you are writing GSN compatible contracts, you need to override this function.
     */
    function _msgSenderERC721A() internal view virtual returns (address) {
        return msg.sender;
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` decimal representation.
     */
    function _toString(uint256 value) internal pure returns (string memory ptr) {
        assembly {
            // The maximum value of a uint256 contains 78 digits (1 byte per digit),
            // but we allocate 128 bytes to keep the free memory pointer 32-byte word aliged.
            // We will need 1 32-byte word to store the length,
            // and 3 32-byte words to store a maximum of 78 digits. Total: 32 + 3 * 32 = 128.
            ptr := add(mload(0x40), 128)
            // Update the free memory pointer to allocate.
            mstore(0x40, ptr)

            // Cache the end of the memory to calculate the length later.
            let end := ptr

            // We write the string from the rightmost digit to the leftmost digit.
            // The following is essentially a do-while loop that also handles the zero case.
            // Costs a bit more than early returning for the zero case,
            // but cheaper in terms of deployment and overall runtime costs.
            for {
                // Initialize and perform the first pass without check.
                let temp := value
                // Move the pointer 1 byte leftwards to point to an empty character slot.
                ptr := sub(ptr, 1)
                // Write the character to the pointer. 48 is the ASCII index of '0'.
                mstore8(ptr, add(48, mod(temp, 10)))
                temp := div(temp, 10)
            } temp {
                // Keep dividing `temp` until zero.
                temp := div(temp, 10)
            } {
                // Body of the for loop.
                ptr := sub(ptr, 1)
                mstore8(ptr, add(48, mod(temp, 10)))
            }

            let length := sub(end, ptr)
            // Move the pointer 32 bytes leftwards to make room for the length.
            ptr := sub(ptr, 32)
            // Store the length.
            mstore(ptr, length)
        }
    }
}

// File: @openzeppelin/contracts/utils/Strings.sol


// 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: @openzeppelin/contracts/utils/Context.sol


// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)

pragma solidity ^0.8.0;

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

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

// File: @openzeppelin/contracts/access/Ownable.sol


// OpenZeppelin Contracts v4.4.1 (access/Ownable.sol)

pragma solidity ^0.8.0;


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

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

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

    /**
     * @dev 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: contracts/ppa.sol



pragma solidity 0.8.7;





contract PPA is ERC721A, Ownable, ReentrancyGuard {
    string private baseURI;

    // Public Variables
    bool public started = false;
    uint256 public minted = 0;
    uint256 public freeMinted = 0;
    bool public devCliamed = false;

    // Public Constants
    uint256 public constant MAX_SUPPLY = 5000;
    uint256 public constant FREE_SUPPLY = 2000;
    uint256 public constant PRICE = 0.0177 ether;
    uint256 public constant MAX_MINT = 2;
    uint256 public constant DEV_MINT = 200;

    mapping(address => uint256) public addressClaimed;

    constructor() ERC721A("Poke Poke Ahh", "PPA") {}

    // Start tokenid at 1 instead of 0
    function _startTokenId() internal view virtual override returns (uint256) {
        return 1;
    }

    function mint(uint256 amount) external payable notContract nonReentrant {
        require(started, "Minting not started yet");
        require(
            addressClaimed[_msgSender()] + amount <= MAX_MINT,
            "Exceed wallet max mint: 2"
        );
        require(totalSupply() < MAX_SUPPLY, "Minting Finished");
        require(totalSupply() + amount <= MAX_SUPPLY, "Exceed max supply");
        require(msg.sender != owner(), "Dev is not allowd to use public mint");

        uint256 freeQuota = FREE_SUPPLY - freeMinted;
        uint256 freeAmount = 0;

        if (freeQuota >= MAX_MINT) {
            // all free
            freeAmount = amount;
        } else if (freeQuota > 0) {
            // partially free
            freeAmount = freeQuota;
        } else {
            freeAmount = 0;
        }

        uint256 requiredValue = (amount - freeAmount) * PRICE;
        require(requiredValue <= msg.value, "Insufficient funds");

        _safeMint(msg.sender, amount);
        addressClaimed[_msgSender()] += amount;
        freeMinted += freeAmount;
        minted += amount;
    }

    function setBaseURI(string memory baseURI_) external onlyOwner {
        baseURI = baseURI_;
    }

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

    function enableMint(bool mintStarted) external onlyOwner {
        started = mintStarted;
    }

    function getBalance() external view returns (uint256) {
        return address(this).balance;
    }

    function withdraw() external onlyOwner {
        payable(msg.sender).transfer(address(this).balance);
    }

    function _isContract(address account) internal view returns (bool) {
        uint256 size;
        assembly {
            size := extcodesize(account)
        }
        return size > 0;
    }

    function devMint() external onlyOwner {
        require(totalSupply() < MAX_SUPPLY, "Minting Finished");
        require(devCliamed == false, "Dev mint over");
        _safeMint(msg.sender, DEV_MINT);
        freeMinted += DEV_MINT;
        minted += DEV_MINT;
        devCliamed = true;
    }

    modifier notContract() {
        require(!_isContract(msg.sender), "Contract not allowed");
        require(msg.sender == tx.origin, "Proxy contract not allowed");
        _;
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintERC2309QuantityExceedsLimit","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"OwnershipNotInitializedForExtraData","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"inputs":[],"name":"URIQueryForNonexistentToken","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"fromTokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"toTokenId","type":"uint256"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"}],"name":"ConsecutiveTransfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"DEV_MINT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"FREE_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_MINT","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":"","type":"address"}],"name":"addressClaimed","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":"devCliamed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"devMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"mintStarted","type":"bool"}],"name":"enableMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"freeMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"minted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI_","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"started","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040526000600b60006101000a81548160ff0219169083151502179055506000600c556000600d556000600e60006101000a81548160ff0219169083151502179055503480156200005157600080fd5b506040518060400160405280600d81526020017f506f6b6520506f6b6520416868000000000000000000000000000000000000008152506040518060400160405280600381526020017f50504100000000000000000000000000000000000000000000000000000000008152508160029080519060200190620000d69291906200020d565b508060039080519060200190620000ef9291906200020d565b50620001006200013660201b60201c565b6000819055505050620001286200011c6200013f60201b60201c565b6200014760201b60201c565b600160098190555062000322565b60006001905090565b600033905090565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8280546200021b90620002bd565b90600052602060002090601f0160209004810192826200023f57600085556200028b565b82601f106200025a57805160ff19168380011785556200028b565b828001600101855582156200028b579182015b828111156200028a5782518255916020019190600101906200026d565b5b5090506200029a91906200029e565b5090565b5b80821115620002b95760008160009055506001016200029f565b5090565b60006002820490506001821680620002d657607f821691505b60208210811415620002ed57620002ec620002f3565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6133cb80620003326000396000f3fe6080604052600436106101ee5760003560e01c8063772dc32f1161010d578063a22cb465116100a0578063c87b56dd1161006f578063c87b56dd146106a8578063d10a1a2b146106e5578063e985e9c514610710578063f0292a031461074d578063f2fde38b14610778576101ee565b8063a22cb46514610602578063b88d4fde1461062b578063b8a73b8314610654578063c68b33051461067f576101ee565b80638da5cb5b116100dc5780638da5cb5b1461056557806395d89b41146105905780639858cf19146105bb578063a0712d68146105e6576101ee565b8063772dc32f146104bb5780637c69e207146104f85780638b53f85e1461050f5780638d859f3e1461053a576101ee565b806332cb6b0c1161018557806355f804b31161015457806355f804b3146104015780636352211e1461042a57806370a0823114610467578063715018a6146104a4576101ee565b806332cb6b0c1461036b5780633ccfd60b1461039657806342842e0e146103ad5780634f02c420146103d6576101ee565b806312065fe0116101c157806312065fe0146102c157806318160ddd146102ec5780631f2698ab1461031757806323b872dd14610342576101ee565b806301ffc9a7146101f357806306fdde0314610230578063081812fc1461025b578063095ea7b314610298575b600080fd5b3480156101ff57600080fd5b5061021a600480360381019061021591906127e1565b6107a1565b6040516102279190612bb0565b60405180910390f35b34801561023c57600080fd5b50610245610833565b6040516102529190612bcb565b60405180910390f35b34801561026757600080fd5b50610282600480360381019061027d9190612884565b6108c5565b60405161028f9190612b49565b60405180910390f35b3480156102a457600080fd5b506102bf60048036038101906102ba9190612774565b610941565b005b3480156102cd57600080fd5b506102d6610a82565b6040516102e39190612d6d565b60405180910390f35b3480156102f857600080fd5b50610301610a8a565b60405161030e9190612d6d565b60405180910390f35b34801561032357600080fd5b5061032c610aa1565b6040516103399190612bb0565b60405180910390f35b34801561034e57600080fd5b506103696004803603810190610364919061265e565b610ab4565b005b34801561037757600080fd5b50610380610dd9565b60405161038d9190612d6d565b60405180910390f35b3480156103a257600080fd5b506103ab610ddf565b005b3480156103b957600080fd5b506103d460048036038101906103cf919061265e565b610ea4565b005b3480156103e257600080fd5b506103eb610ec4565b6040516103f89190612d6d565b60405180910390f35b34801561040d57600080fd5b506104286004803603810190610423919061283b565b610eca565b005b34801561043657600080fd5b50610451600480360381019061044c9190612884565b610f60565b60405161045e9190612b49565b60405180910390f35b34801561047357600080fd5b5061048e600480360381019061048991906125f1565b610f72565b60405161049b9190612d6d565b60405180910390f35b3480156104b057600080fd5b506104b961102b565b005b3480156104c757600080fd5b506104e260048036038101906104dd91906125f1565b6110b3565b6040516104ef9190612d6d565b60405180910390f35b34801561050457600080fd5b5061050d6110cb565b005b34801561051b57600080fd5b50610524611244565b6040516105319190612d6d565b60405180910390f35b34801561054657600080fd5b5061054f611249565b60405161055c9190612d6d565b60405180910390f35b34801561057157600080fd5b5061057a611254565b6040516105879190612b49565b60405180910390f35b34801561059c57600080fd5b506105a561127e565b6040516105b29190612bcb565b60405180910390f35b3480156105c757600080fd5b506105d0611310565b6040516105dd9190612d6d565b60405180910390f35b61060060048036038101906105fb9190612884565b611316565b005b34801561060e57600080fd5b5061062960048036038101906106249190612734565b611760565b005b34801561063757600080fd5b50610652600480360381019061064d91906126b1565b6118d8565b005b34801561066057600080fd5b5061066961194b565b6040516106769190612bb0565b60405180910390f35b34801561068b57600080fd5b506106a660048036038101906106a191906127b4565b61195e565b005b3480156106b457600080fd5b506106cf60048036038101906106ca9190612884565b6119f7565b6040516106dc9190612bcb565b60405180910390f35b3480156106f157600080fd5b506106fa611a96565b6040516107079190612d6d565b60405180910390f35b34801561071c57600080fd5b506107376004803603810190610732919061261e565b611a9c565b6040516107449190612bb0565b60405180910390f35b34801561075957600080fd5b50610762611b30565b60405161076f9190612d6d565b60405180910390f35b34801561078457600080fd5b5061079f600480360381019061079a91906125f1565b611b35565b005b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806107fc57506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061082c5750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b60606002805461084290612fec565b80601f016020809104026020016040519081016040528092919081815260200182805461086e90612fec565b80156108bb5780601f10610890576101008083540402835291602001916108bb565b820191906000526020600020905b81548152906001019060200180831161089e57829003601f168201915b5050505050905090565b60006108d082611c2d565b610906576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061094c82610f60565b90508073ffffffffffffffffffffffffffffffffffffffff1661096d611c8c565b73ffffffffffffffffffffffffffffffffffffffff16146109d05761099981610994611c8c565b611a9c565b6109cf576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b600047905090565b6000610a94611c94565b6001546000540303905090565b600b60009054906101000a900460ff1681565b6000610abf82611c9d565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610b26576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080610b3284611d6b565b91509150610b488187610b43611c8c565b611d8d565b610b9457610b5d86610b58611c8c565b611a9c565b610b93576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415610bfb576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610c088686866001611dd1565b8015610c1357600082555b600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815460010191905081905550610ce185610cbd888887611dd7565b7c020000000000000000000000000000000000000000000000000000000017611dff565b600460008681526020019081526020016000208190555060007c020000000000000000000000000000000000000000000000000000000084161415610d69576000600185019050600060046000838152602001908152602001600020541415610d67576000548114610d66578360046000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4610dd18686866001611e2a565b505050505050565b61138881565b610de7611e30565b73ffffffffffffffffffffffffffffffffffffffff16610e05611254565b73ffffffffffffffffffffffffffffffffffffffff1614610e5b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e5290612ccd565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015610ea1573d6000803e3d6000fd5b50565b610ebf838383604051806020016040528060008152506118d8565b505050565b600c5481565b610ed2611e30565b73ffffffffffffffffffffffffffffffffffffffff16610ef0611254565b73ffffffffffffffffffffffffffffffffffffffff1614610f46576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f3d90612ccd565b60405180910390fd5b80600a9080519060200190610f5c929190612405565b5050565b6000610f6b82611c9d565b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610fda576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b611033611e30565b73ffffffffffffffffffffffffffffffffffffffff16611051611254565b73ffffffffffffffffffffffffffffffffffffffff16146110a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161109e90612ccd565b60405180910390fd5b6110b16000611e38565b565b600f6020528060005260406000206000915090505481565b6110d3611e30565b73ffffffffffffffffffffffffffffffffffffffff166110f1611254565b73ffffffffffffffffffffffffffffffffffffffff1614611147576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161113e90612ccd565b60405180910390fd5b611388611152610a8a565b10611192576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161118990612c2d565b60405180910390fd5b60001515600e60009054906101000a900460ff161515146111e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111df90612d2d565b60405180910390fd5b6111f33360c8611efe565b60c8600d60008282546112069190612e52565b9250508190555060c8600c60008282546112209190612e52565b925050819055506001600e60006101000a81548160ff021916908315150217905550565b60c881565b663ee20e6486400081565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606003805461128d90612fec565b80601f01602080910402602001604051908101604052809291908181526020018280546112b990612fec565b80156113065780601f106112db57610100808354040283529160200191611306565b820191906000526020600020905b8154815290600101906020018083116112e957829003601f168201915b5050505050905090565b6107d081565b61131f33611f1c565b1561135f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161135690612c0d565b60405180910390fd5b3273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146113cd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113c490612c6d565b60405180910390fd5b60026009541415611413576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161140a90612d4d565b60405180910390fd5b6002600981905550600b60009054906101000a900460ff1661146a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161146190612cad565b60405180910390fd5b600281600f6000611479611e30565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546114be9190612e52565b11156114ff576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114f690612d0d565b60405180910390fd5b61138861150a610a8a565b1061154a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161154190612c2d565b60405180910390fd5b61138881611556610a8a565b6115609190612e52565b11156115a1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161159890612c8d565b60405180910390fd5b6115a9611254565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415611617576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161160e90612ced565b60405180910390fd5b6000600d546107d06116299190612f02565b905060006002821061163d57829050611654565b600082111561164e57819050611653565b600090505b5b6000663ee20e64864000828561166a9190612f02565b6116749190612ea8565b9050348111156116b9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116b090612c4d565b60405180910390fd5b6116c33385611efe565b83600f60006116d0611e30565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546117199190612e52565b9250508190555081600d60008282546117329190612e52565b9250508190555083600c600082825461174b9190612e52565b92505081905550505050600160098190555050565b611768611c8c565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156117cd576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600760006117da611c8c565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611887611c8c565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516118cc9190612bb0565b60405180910390a35050565b6118e3848484610ab4565b60008373ffffffffffffffffffffffffffffffffffffffff163b146119455761190e84848484611f2f565b611944576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b600e60009054906101000a900460ff1681565b611966611e30565b73ffffffffffffffffffffffffffffffffffffffff16611984611254565b73ffffffffffffffffffffffffffffffffffffffff16146119da576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119d190612ccd565b60405180910390fd5b80600b60006101000a81548160ff02191690831515021790555050565b6060611a0282611c2d565b611a38576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000611a4261208f565b9050600081511415611a635760405180602001604052806000815250611a8e565b80611a6d84612121565b604051602001611a7e929190612b25565b6040516020818303038152906040525b915050919050565b600d5481565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600281565b611b3d611e30565b73ffffffffffffffffffffffffffffffffffffffff16611b5b611254565b73ffffffffffffffffffffffffffffffffffffffff1614611bb1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ba890612ccd565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611c21576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c1890612bed565b60405180910390fd5b611c2a81611e38565b50565b600081611c38611c94565b11158015611c47575060005482105b8015611c85575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b600033905090565b60006001905090565b60008082905080611cac611c94565b11611d3457600054811015611d335760006004600083815260200190815260200160002054905060007c010000000000000000000000000000000000000000000000000000000082161415611d31575b6000811415611d27576004600083600190039350838152602001908152602001600020549050611cfc565b8092505050611d66565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000806000600690508360005280602052604060002092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e8611dee86868461217b565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b600033905090565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b611f18828260405180602001604052806000815250612184565b5050565b600080823b905060008111915050919050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02611f55611c8c565b8786866040518563ffffffff1660e01b8152600401611f779493929190612b64565b602060405180830381600087803b158015611f9157600080fd5b505af1925050508015611fc257506040513d601f19601f82011682018060405250810190611fbf919061280e565b60015b61203c573d8060008114611ff2576040519150601f19603f3d011682016040523d82523d6000602084013e611ff7565b606091505b50600081511415612034576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b6060600a805461209e90612fec565b80601f01602080910402602001604051908101604052809291908181526020018280546120ca90612fec565b80156121175780601f106120ec57610100808354040283529160200191612117565b820191906000526020600020905b8154815290600101906020018083116120fa57829003601f168201915b5050505050905090565b60606080604051019050806040528082600183039250600a81066030018353600a810490505b801561216757600183039250600a81066030018353600a81049050612147565b508181036020830392508083525050919050565b60009392505050565b61218e8383612221565b60008373ffffffffffffffffffffffffffffffffffffffff163b1461221c57600080549050600083820390505b6121ce6000868380600101945086611f2f565b612204576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8181106121bb57816000541461221957600080fd5b50505b505050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561228e576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008214156122c9576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6122d66000848385611dd1565b600160406001901b178202600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254019250508190555061234d8361233e6000866000611dd7565b612347856123f5565b17611dff565b60046000838152602001908152602001600020819055506000819050600083830190505b818060010192508573ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4808210612371578060008190555050506123f06000848385611e2a565b505050565b60006001821460e11b9050919050565b82805461241190612fec565b90600052602060002090601f016020900481019282612433576000855561247a565b82601f1061244c57805160ff191683800117855561247a565b8280016001018555821561247a579182015b8281111561247957825182559160200191906001019061245e565b5b509050612487919061248b565b5090565b5b808211156124a457600081600090555060010161248c565b5090565b60006124bb6124b684612dad565b612d88565b9050828152602081018484840111156124d7576124d66130e1565b5b6124e2848285612faa565b509392505050565b60006124fd6124f884612dde565b612d88565b905082815260208101848484011115612519576125186130e1565b5b612524848285612faa565b509392505050565b60008135905061253b81613339565b92915050565b60008135905061255081613350565b92915050565b60008135905061256581613367565b92915050565b60008151905061257a81613367565b92915050565b600082601f830112612595576125946130dc565b5b81356125a58482602086016124a8565b91505092915050565b600082601f8301126125c3576125c26130dc565b5b81356125d38482602086016124ea565b91505092915050565b6000813590506125eb8161337e565b92915050565b600060208284031215612607576126066130eb565b5b60006126158482850161252c565b91505092915050565b60008060408385031215612635576126346130eb565b5b60006126438582860161252c565b92505060206126548582860161252c565b9150509250929050565b600080600060608486031215612677576126766130eb565b5b60006126858682870161252c565b93505060206126968682870161252c565b92505060406126a7868287016125dc565b9150509250925092565b600080600080608085870312156126cb576126ca6130eb565b5b60006126d98782880161252c565b94505060206126ea8782880161252c565b93505060406126fb878288016125dc565b925050606085013567ffffffffffffffff81111561271c5761271b6130e6565b5b61272887828801612580565b91505092959194509250565b6000806040838503121561274b5761274a6130eb565b5b60006127598582860161252c565b925050602061276a85828601612541565b9150509250929050565b6000806040838503121561278b5761278a6130eb565b5b60006127998582860161252c565b92505060206127aa858286016125dc565b9150509250929050565b6000602082840312156127ca576127c96130eb565b5b60006127d884828501612541565b91505092915050565b6000602082840312156127f7576127f66130eb565b5b600061280584828501612556565b91505092915050565b600060208284031215612824576128236130eb565b5b60006128328482850161256b565b91505092915050565b600060208284031215612851576128506130eb565b5b600082013567ffffffffffffffff81111561286f5761286e6130e6565b5b61287b848285016125ae565b91505092915050565b60006020828403121561289a576128996130eb565b5b60006128a8848285016125dc565b91505092915050565b6128ba81612f36565b82525050565b6128c981612f48565b82525050565b60006128da82612e0f565b6128e48185612e25565b93506128f4818560208601612fb9565b6128fd816130f0565b840191505092915050565b600061291382612e1a565b61291d8185612e36565b935061292d818560208601612fb9565b612936816130f0565b840191505092915050565b600061294c82612e1a565b6129568185612e47565b9350612966818560208601612fb9565b80840191505092915050565b600061297f602683612e36565b915061298a82613101565b604082019050919050565b60006129a2601483612e36565b91506129ad82613150565b602082019050919050565b60006129c5601083612e36565b91506129d082613179565b602082019050919050565b60006129e8601283612e36565b91506129f3826131a2565b602082019050919050565b6000612a0b601a83612e36565b9150612a16826131cb565b602082019050919050565b6000612a2e601183612e36565b9150612a39826131f4565b602082019050919050565b6000612a51601783612e36565b9150612a5c8261321d565b602082019050919050565b6000612a74602083612e36565b9150612a7f82613246565b602082019050919050565b6000612a97602483612e36565b9150612aa28261326f565b604082019050919050565b6000612aba601983612e36565b9150612ac5826132be565b602082019050919050565b6000612add600d83612e36565b9150612ae8826132e7565b602082019050919050565b6000612b00601f83612e36565b9150612b0b82613310565b602082019050919050565b612b1f81612fa0565b82525050565b6000612b318285612941565b9150612b3d8284612941565b91508190509392505050565b6000602082019050612b5e60008301846128b1565b92915050565b6000608082019050612b7960008301876128b1565b612b8660208301866128b1565b612b936040830185612b16565b8181036060830152612ba581846128cf565b905095945050505050565b6000602082019050612bc560008301846128c0565b92915050565b60006020820190508181036000830152612be58184612908565b905092915050565b60006020820190508181036000830152612c0681612972565b9050919050565b60006020820190508181036000830152612c2681612995565b9050919050565b60006020820190508181036000830152612c46816129b8565b9050919050565b60006020820190508181036000830152612c66816129db565b9050919050565b60006020820190508181036000830152612c86816129fe565b9050919050565b60006020820190508181036000830152612ca681612a21565b9050919050565b60006020820190508181036000830152612cc681612a44565b9050919050565b60006020820190508181036000830152612ce681612a67565b9050919050565b60006020820190508181036000830152612d0681612a8a565b9050919050565b60006020820190508181036000830152612d2681612aad565b9050919050565b60006020820190508181036000830152612d4681612ad0565b9050919050565b60006020820190508181036000830152612d6681612af3565b9050919050565b6000602082019050612d826000830184612b16565b92915050565b6000612d92612da3565b9050612d9e828261301e565b919050565b6000604051905090565b600067ffffffffffffffff821115612dc857612dc76130ad565b5b612dd1826130f0565b9050602081019050919050565b600067ffffffffffffffff821115612df957612df86130ad565b5b612e02826130f0565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000612e5d82612fa0565b9150612e6883612fa0565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115612e9d57612e9c61304f565b5b828201905092915050565b6000612eb382612fa0565b9150612ebe83612fa0565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615612ef757612ef661304f565b5b828202905092915050565b6000612f0d82612fa0565b9150612f1883612fa0565b925082821015612f2b57612f2a61304f565b5b828203905092915050565b6000612f4182612f80565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015612fd7578082015181840152602081019050612fbc565b83811115612fe6576000848401525b50505050565b6000600282049050600182168061300457607f821691505b602082108114156130185761301761307e565b5b50919050565b613027826130f0565b810181811067ffffffffffffffff82111715613046576130456130ad565b5b80604052505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f436f6e7472616374206e6f7420616c6c6f776564000000000000000000000000600082015250565b7f4d696e74696e672046696e697368656400000000000000000000000000000000600082015250565b7f496e73756666696369656e742066756e64730000000000000000000000000000600082015250565b7f50726f787920636f6e7472616374206e6f7420616c6c6f776564000000000000600082015250565b7f457863656564206d617820737570706c79000000000000000000000000000000600082015250565b7f4d696e74696e67206e6f74207374617274656420796574000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f446576206973206e6f7420616c6c6f776420746f20757365207075626c69632060008201527f6d696e7400000000000000000000000000000000000000000000000000000000602082015250565b7f4578636565642077616c6c6574206d6178206d696e743a203200000000000000600082015250565b7f446576206d696e74206f76657200000000000000000000000000000000000000600082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b61334281612f36565b811461334d57600080fd5b50565b61335981612f48565b811461336457600080fd5b50565b61337081612f54565b811461337b57600080fd5b50565b61338781612fa0565b811461339257600080fd5b5056fea2646970667358221220526eb873260d88f48aa75dcb3c38797e4c4dfff674ef7526119b957e26dee1f164736f6c63430008070033

Deployed Bytecode

0x6080604052600436106101ee5760003560e01c8063772dc32f1161010d578063a22cb465116100a0578063c87b56dd1161006f578063c87b56dd146106a8578063d10a1a2b146106e5578063e985e9c514610710578063f0292a031461074d578063f2fde38b14610778576101ee565b8063a22cb46514610602578063b88d4fde1461062b578063b8a73b8314610654578063c68b33051461067f576101ee565b80638da5cb5b116100dc5780638da5cb5b1461056557806395d89b41146105905780639858cf19146105bb578063a0712d68146105e6576101ee565b8063772dc32f146104bb5780637c69e207146104f85780638b53f85e1461050f5780638d859f3e1461053a576101ee565b806332cb6b0c1161018557806355f804b31161015457806355f804b3146104015780636352211e1461042a57806370a0823114610467578063715018a6146104a4576101ee565b806332cb6b0c1461036b5780633ccfd60b1461039657806342842e0e146103ad5780634f02c420146103d6576101ee565b806312065fe0116101c157806312065fe0146102c157806318160ddd146102ec5780631f2698ab1461031757806323b872dd14610342576101ee565b806301ffc9a7146101f357806306fdde0314610230578063081812fc1461025b578063095ea7b314610298575b600080fd5b3480156101ff57600080fd5b5061021a600480360381019061021591906127e1565b6107a1565b6040516102279190612bb0565b60405180910390f35b34801561023c57600080fd5b50610245610833565b6040516102529190612bcb565b60405180910390f35b34801561026757600080fd5b50610282600480360381019061027d9190612884565b6108c5565b60405161028f9190612b49565b60405180910390f35b3480156102a457600080fd5b506102bf60048036038101906102ba9190612774565b610941565b005b3480156102cd57600080fd5b506102d6610a82565b6040516102e39190612d6d565b60405180910390f35b3480156102f857600080fd5b50610301610a8a565b60405161030e9190612d6d565b60405180910390f35b34801561032357600080fd5b5061032c610aa1565b6040516103399190612bb0565b60405180910390f35b34801561034e57600080fd5b506103696004803603810190610364919061265e565b610ab4565b005b34801561037757600080fd5b50610380610dd9565b60405161038d9190612d6d565b60405180910390f35b3480156103a257600080fd5b506103ab610ddf565b005b3480156103b957600080fd5b506103d460048036038101906103cf919061265e565b610ea4565b005b3480156103e257600080fd5b506103eb610ec4565b6040516103f89190612d6d565b60405180910390f35b34801561040d57600080fd5b506104286004803603810190610423919061283b565b610eca565b005b34801561043657600080fd5b50610451600480360381019061044c9190612884565b610f60565b60405161045e9190612b49565b60405180910390f35b34801561047357600080fd5b5061048e600480360381019061048991906125f1565b610f72565b60405161049b9190612d6d565b60405180910390f35b3480156104b057600080fd5b506104b961102b565b005b3480156104c757600080fd5b506104e260048036038101906104dd91906125f1565b6110b3565b6040516104ef9190612d6d565b60405180910390f35b34801561050457600080fd5b5061050d6110cb565b005b34801561051b57600080fd5b50610524611244565b6040516105319190612d6d565b60405180910390f35b34801561054657600080fd5b5061054f611249565b60405161055c9190612d6d565b60405180910390f35b34801561057157600080fd5b5061057a611254565b6040516105879190612b49565b60405180910390f35b34801561059c57600080fd5b506105a561127e565b6040516105b29190612bcb565b60405180910390f35b3480156105c757600080fd5b506105d0611310565b6040516105dd9190612d6d565b60405180910390f35b61060060048036038101906105fb9190612884565b611316565b005b34801561060e57600080fd5b5061062960048036038101906106249190612734565b611760565b005b34801561063757600080fd5b50610652600480360381019061064d91906126b1565b6118d8565b005b34801561066057600080fd5b5061066961194b565b6040516106769190612bb0565b60405180910390f35b34801561068b57600080fd5b506106a660048036038101906106a191906127b4565b61195e565b005b3480156106b457600080fd5b506106cf60048036038101906106ca9190612884565b6119f7565b6040516106dc9190612bcb565b60405180910390f35b3480156106f157600080fd5b506106fa611a96565b6040516107079190612d6d565b60405180910390f35b34801561071c57600080fd5b506107376004803603810190610732919061261e565b611a9c565b6040516107449190612bb0565b60405180910390f35b34801561075957600080fd5b50610762611b30565b60405161076f9190612d6d565b60405180910390f35b34801561078457600080fd5b5061079f600480360381019061079a91906125f1565b611b35565b005b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806107fc57506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061082c5750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b60606002805461084290612fec565b80601f016020809104026020016040519081016040528092919081815260200182805461086e90612fec565b80156108bb5780601f10610890576101008083540402835291602001916108bb565b820191906000526020600020905b81548152906001019060200180831161089e57829003601f168201915b5050505050905090565b60006108d082611c2d565b610906576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061094c82610f60565b90508073ffffffffffffffffffffffffffffffffffffffff1661096d611c8c565b73ffffffffffffffffffffffffffffffffffffffff16146109d05761099981610994611c8c565b611a9c565b6109cf576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b600047905090565b6000610a94611c94565b6001546000540303905090565b600b60009054906101000a900460ff1681565b6000610abf82611c9d565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610b26576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080610b3284611d6b565b91509150610b488187610b43611c8c565b611d8d565b610b9457610b5d86610b58611c8c565b611a9c565b610b93576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415610bfb576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610c088686866001611dd1565b8015610c1357600082555b600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815460010191905081905550610ce185610cbd888887611dd7565b7c020000000000000000000000000000000000000000000000000000000017611dff565b600460008681526020019081526020016000208190555060007c020000000000000000000000000000000000000000000000000000000084161415610d69576000600185019050600060046000838152602001908152602001600020541415610d67576000548114610d66578360046000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4610dd18686866001611e2a565b505050505050565b61138881565b610de7611e30565b73ffffffffffffffffffffffffffffffffffffffff16610e05611254565b73ffffffffffffffffffffffffffffffffffffffff1614610e5b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e5290612ccd565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015610ea1573d6000803e3d6000fd5b50565b610ebf838383604051806020016040528060008152506118d8565b505050565b600c5481565b610ed2611e30565b73ffffffffffffffffffffffffffffffffffffffff16610ef0611254565b73ffffffffffffffffffffffffffffffffffffffff1614610f46576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f3d90612ccd565b60405180910390fd5b80600a9080519060200190610f5c929190612405565b5050565b6000610f6b82611c9d565b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610fda576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b611033611e30565b73ffffffffffffffffffffffffffffffffffffffff16611051611254565b73ffffffffffffffffffffffffffffffffffffffff16146110a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161109e90612ccd565b60405180910390fd5b6110b16000611e38565b565b600f6020528060005260406000206000915090505481565b6110d3611e30565b73ffffffffffffffffffffffffffffffffffffffff166110f1611254565b73ffffffffffffffffffffffffffffffffffffffff1614611147576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161113e90612ccd565b60405180910390fd5b611388611152610a8a565b10611192576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161118990612c2d565b60405180910390fd5b60001515600e60009054906101000a900460ff161515146111e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111df90612d2d565b60405180910390fd5b6111f33360c8611efe565b60c8600d60008282546112069190612e52565b9250508190555060c8600c60008282546112209190612e52565b925050819055506001600e60006101000a81548160ff021916908315150217905550565b60c881565b663ee20e6486400081565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606003805461128d90612fec565b80601f01602080910402602001604051908101604052809291908181526020018280546112b990612fec565b80156113065780601f106112db57610100808354040283529160200191611306565b820191906000526020600020905b8154815290600101906020018083116112e957829003601f168201915b5050505050905090565b6107d081565b61131f33611f1c565b1561135f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161135690612c0d565b60405180910390fd5b3273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146113cd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113c490612c6d565b60405180910390fd5b60026009541415611413576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161140a90612d4d565b60405180910390fd5b6002600981905550600b60009054906101000a900460ff1661146a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161146190612cad565b60405180910390fd5b600281600f6000611479611e30565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546114be9190612e52565b11156114ff576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114f690612d0d565b60405180910390fd5b61138861150a610a8a565b1061154a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161154190612c2d565b60405180910390fd5b61138881611556610a8a565b6115609190612e52565b11156115a1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161159890612c8d565b60405180910390fd5b6115a9611254565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415611617576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161160e90612ced565b60405180910390fd5b6000600d546107d06116299190612f02565b905060006002821061163d57829050611654565b600082111561164e57819050611653565b600090505b5b6000663ee20e64864000828561166a9190612f02565b6116749190612ea8565b9050348111156116b9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116b090612c4d565b60405180910390fd5b6116c33385611efe565b83600f60006116d0611e30565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546117199190612e52565b9250508190555081600d60008282546117329190612e52565b9250508190555083600c600082825461174b9190612e52565b92505081905550505050600160098190555050565b611768611c8c565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156117cd576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600760006117da611c8c565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611887611c8c565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516118cc9190612bb0565b60405180910390a35050565b6118e3848484610ab4565b60008373ffffffffffffffffffffffffffffffffffffffff163b146119455761190e84848484611f2f565b611944576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b600e60009054906101000a900460ff1681565b611966611e30565b73ffffffffffffffffffffffffffffffffffffffff16611984611254565b73ffffffffffffffffffffffffffffffffffffffff16146119da576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119d190612ccd565b60405180910390fd5b80600b60006101000a81548160ff02191690831515021790555050565b6060611a0282611c2d565b611a38576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000611a4261208f565b9050600081511415611a635760405180602001604052806000815250611a8e565b80611a6d84612121565b604051602001611a7e929190612b25565b6040516020818303038152906040525b915050919050565b600d5481565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600281565b611b3d611e30565b73ffffffffffffffffffffffffffffffffffffffff16611b5b611254565b73ffffffffffffffffffffffffffffffffffffffff1614611bb1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ba890612ccd565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611c21576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c1890612bed565b60405180910390fd5b611c2a81611e38565b50565b600081611c38611c94565b11158015611c47575060005482105b8015611c85575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b600033905090565b60006001905090565b60008082905080611cac611c94565b11611d3457600054811015611d335760006004600083815260200190815260200160002054905060007c010000000000000000000000000000000000000000000000000000000082161415611d31575b6000811415611d27576004600083600190039350838152602001908152602001600020549050611cfc565b8092505050611d66565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000806000600690508360005280602052604060002092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e8611dee86868461217b565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b600033905090565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b611f18828260405180602001604052806000815250612184565b5050565b600080823b905060008111915050919050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02611f55611c8c565b8786866040518563ffffffff1660e01b8152600401611f779493929190612b64565b602060405180830381600087803b158015611f9157600080fd5b505af1925050508015611fc257506040513d601f19601f82011682018060405250810190611fbf919061280e565b60015b61203c573d8060008114611ff2576040519150601f19603f3d011682016040523d82523d6000602084013e611ff7565b606091505b50600081511415612034576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b6060600a805461209e90612fec565b80601f01602080910402602001604051908101604052809291908181526020018280546120ca90612fec565b80156121175780601f106120ec57610100808354040283529160200191612117565b820191906000526020600020905b8154815290600101906020018083116120fa57829003601f168201915b5050505050905090565b60606080604051019050806040528082600183039250600a81066030018353600a810490505b801561216757600183039250600a81066030018353600a81049050612147565b508181036020830392508083525050919050565b60009392505050565b61218e8383612221565b60008373ffffffffffffffffffffffffffffffffffffffff163b1461221c57600080549050600083820390505b6121ce6000868380600101945086611f2f565b612204576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8181106121bb57816000541461221957600080fd5b50505b505050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561228e576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008214156122c9576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6122d66000848385611dd1565b600160406001901b178202600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254019250508190555061234d8361233e6000866000611dd7565b612347856123f5565b17611dff565b60046000838152602001908152602001600020819055506000819050600083830190505b818060010192508573ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4808210612371578060008190555050506123f06000848385611e2a565b505050565b60006001821460e11b9050919050565b82805461241190612fec565b90600052602060002090601f016020900481019282612433576000855561247a565b82601f1061244c57805160ff191683800117855561247a565b8280016001018555821561247a579182015b8281111561247957825182559160200191906001019061245e565b5b509050612487919061248b565b5090565b5b808211156124a457600081600090555060010161248c565b5090565b60006124bb6124b684612dad565b612d88565b9050828152602081018484840111156124d7576124d66130e1565b5b6124e2848285612faa565b509392505050565b60006124fd6124f884612dde565b612d88565b905082815260208101848484011115612519576125186130e1565b5b612524848285612faa565b509392505050565b60008135905061253b81613339565b92915050565b60008135905061255081613350565b92915050565b60008135905061256581613367565b92915050565b60008151905061257a81613367565b92915050565b600082601f830112612595576125946130dc565b5b81356125a58482602086016124a8565b91505092915050565b600082601f8301126125c3576125c26130dc565b5b81356125d38482602086016124ea565b91505092915050565b6000813590506125eb8161337e565b92915050565b600060208284031215612607576126066130eb565b5b60006126158482850161252c565b91505092915050565b60008060408385031215612635576126346130eb565b5b60006126438582860161252c565b92505060206126548582860161252c565b9150509250929050565b600080600060608486031215612677576126766130eb565b5b60006126858682870161252c565b93505060206126968682870161252c565b92505060406126a7868287016125dc565b9150509250925092565b600080600080608085870312156126cb576126ca6130eb565b5b60006126d98782880161252c565b94505060206126ea8782880161252c565b93505060406126fb878288016125dc565b925050606085013567ffffffffffffffff81111561271c5761271b6130e6565b5b61272887828801612580565b91505092959194509250565b6000806040838503121561274b5761274a6130eb565b5b60006127598582860161252c565b925050602061276a85828601612541565b9150509250929050565b6000806040838503121561278b5761278a6130eb565b5b60006127998582860161252c565b92505060206127aa858286016125dc565b9150509250929050565b6000602082840312156127ca576127c96130eb565b5b60006127d884828501612541565b91505092915050565b6000602082840312156127f7576127f66130eb565b5b600061280584828501612556565b91505092915050565b600060208284031215612824576128236130eb565b5b60006128328482850161256b565b91505092915050565b600060208284031215612851576128506130eb565b5b600082013567ffffffffffffffff81111561286f5761286e6130e6565b5b61287b848285016125ae565b91505092915050565b60006020828403121561289a576128996130eb565b5b60006128a8848285016125dc565b91505092915050565b6128ba81612f36565b82525050565b6128c981612f48565b82525050565b60006128da82612e0f565b6128e48185612e25565b93506128f4818560208601612fb9565b6128fd816130f0565b840191505092915050565b600061291382612e1a565b61291d8185612e36565b935061292d818560208601612fb9565b612936816130f0565b840191505092915050565b600061294c82612e1a565b6129568185612e47565b9350612966818560208601612fb9565b80840191505092915050565b600061297f602683612e36565b915061298a82613101565b604082019050919050565b60006129a2601483612e36565b91506129ad82613150565b602082019050919050565b60006129c5601083612e36565b91506129d082613179565b602082019050919050565b60006129e8601283612e36565b91506129f3826131a2565b602082019050919050565b6000612a0b601a83612e36565b9150612a16826131cb565b602082019050919050565b6000612a2e601183612e36565b9150612a39826131f4565b602082019050919050565b6000612a51601783612e36565b9150612a5c8261321d565b602082019050919050565b6000612a74602083612e36565b9150612a7f82613246565b602082019050919050565b6000612a97602483612e36565b9150612aa28261326f565b604082019050919050565b6000612aba601983612e36565b9150612ac5826132be565b602082019050919050565b6000612add600d83612e36565b9150612ae8826132e7565b602082019050919050565b6000612b00601f83612e36565b9150612b0b82613310565b602082019050919050565b612b1f81612fa0565b82525050565b6000612b318285612941565b9150612b3d8284612941565b91508190509392505050565b6000602082019050612b5e60008301846128b1565b92915050565b6000608082019050612b7960008301876128b1565b612b8660208301866128b1565b612b936040830185612b16565b8181036060830152612ba581846128cf565b905095945050505050565b6000602082019050612bc560008301846128c0565b92915050565b60006020820190508181036000830152612be58184612908565b905092915050565b60006020820190508181036000830152612c0681612972565b9050919050565b60006020820190508181036000830152612c2681612995565b9050919050565b60006020820190508181036000830152612c46816129b8565b9050919050565b60006020820190508181036000830152612c66816129db565b9050919050565b60006020820190508181036000830152612c86816129fe565b9050919050565b60006020820190508181036000830152612ca681612a21565b9050919050565b60006020820190508181036000830152612cc681612a44565b9050919050565b60006020820190508181036000830152612ce681612a67565b9050919050565b60006020820190508181036000830152612d0681612a8a565b9050919050565b60006020820190508181036000830152612d2681612aad565b9050919050565b60006020820190508181036000830152612d4681612ad0565b9050919050565b60006020820190508181036000830152612d6681612af3565b9050919050565b6000602082019050612d826000830184612b16565b92915050565b6000612d92612da3565b9050612d9e828261301e565b919050565b6000604051905090565b600067ffffffffffffffff821115612dc857612dc76130ad565b5b612dd1826130f0565b9050602081019050919050565b600067ffffffffffffffff821115612df957612df86130ad565b5b612e02826130f0565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000612e5d82612fa0565b9150612e6883612fa0565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115612e9d57612e9c61304f565b5b828201905092915050565b6000612eb382612fa0565b9150612ebe83612fa0565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615612ef757612ef661304f565b5b828202905092915050565b6000612f0d82612fa0565b9150612f1883612fa0565b925082821015612f2b57612f2a61304f565b5b828203905092915050565b6000612f4182612f80565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015612fd7578082015181840152602081019050612fbc565b83811115612fe6576000848401525b50505050565b6000600282049050600182168061300457607f821691505b602082108114156130185761301761307e565b5b50919050565b613027826130f0565b810181811067ffffffffffffffff82111715613046576130456130ad565b5b80604052505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f436f6e7472616374206e6f7420616c6c6f776564000000000000000000000000600082015250565b7f4d696e74696e672046696e697368656400000000000000000000000000000000600082015250565b7f496e73756666696369656e742066756e64730000000000000000000000000000600082015250565b7f50726f787920636f6e7472616374206e6f7420616c6c6f776564000000000000600082015250565b7f457863656564206d617820737570706c79000000000000000000000000000000600082015250565b7f4d696e74696e67206e6f74207374617274656420796574000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f446576206973206e6f7420616c6c6f776420746f20757365207075626c69632060008201527f6d696e7400000000000000000000000000000000000000000000000000000000602082015250565b7f4578636565642077616c6c6574206d6178206d696e743a203200000000000000600082015250565b7f446576206d696e74206f76657200000000000000000000000000000000000000600082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b61334281612f36565b811461334d57600080fd5b50565b61335981612f48565b811461336457600080fd5b50565b61337081612f54565b811461337b57600080fd5b50565b61338781612fa0565b811461339257600080fd5b5056fea2646970667358221220526eb873260d88f48aa75dcb3c38797e4c4dfff674ef7526119b957e26dee1f164736f6c63430008070033

Deployed Bytecode Sourcemap

53098:3175:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17351:615;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22998:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24944:204;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24492:386;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55347:101;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;16405:315;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53211:27;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34209:2800;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53377:41;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55456:109;;;;;;;;;;;;;:::i;:::-;;25834:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53245:25;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55018:100;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;22787:144;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;18030:224;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52213:103;;;;;;;;;;;;;:::i;:::-;;53615:49;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55778:300;;;;;;;;;;;;;:::i;:::-;;53568:38;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53474:44;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51562:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23167:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53425:42;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53878:1132;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;25220:308;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;26090:399;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53313:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55242:97;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;23342:318;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53277:29;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25599:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53525:36;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52471:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;17351:615;17436:4;17751:10;17736:25;;:11;:25;;;;:102;;;;17828:10;17813:25;;:11;:25;;;;17736:102;:179;;;;17905:10;17890:25;;:11;:25;;;;17736:179;17716:199;;17351:615;;;:::o;22998:100::-;23052:13;23085:5;23078:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22998:100;:::o;24944:204::-;25012:7;25037:16;25045:7;25037;:16::i;:::-;25032:64;;25062:34;;;;;;;;;;;;;;25032:64;25116:15;:24;25132:7;25116:24;;;;;;;;;;;;;;;;;;;;;25109:31;;24944:204;;;:::o;24492:386::-;24565:13;24581:16;24589:7;24581;:16::i;:::-;24565:32;;24637:5;24614:28;;:19;:17;:19::i;:::-;:28;;;24610:175;;24662:44;24679:5;24686:19;:17;:19::i;:::-;24662:16;:44::i;:::-;24657:128;;24734:35;;;;;;;;;;;;;;24657:128;24610:175;24824:2;24797:15;:24;24813:7;24797:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;24862:7;24858:2;24842:28;;24851:5;24842:28;;;;;;;;;;;;24554:324;24492:386;;:::o;55347:101::-;55392:7;55419:21;55412:28;;55347:101;:::o;16405:315::-;16458:7;16686:15;:13;:15::i;:::-;16671:12;;16655:13;;:28;:46;16648:53;;16405:315;:::o;53211:27::-;;;;;;;;;;;;;:::o;34209:2800::-;34343:27;34373;34392:7;34373:18;:27::i;:::-;34343:57;;34458:4;34417:45;;34433:19;34417:45;;;34413:86;;34471:28;;;;;;;;;;;;;;34413:86;34513:27;34542:23;34569:28;34589:7;34569:19;:28::i;:::-;34512:85;;;;34697:62;34716:15;34733:4;34739:19;:17;:19::i;:::-;34697:18;:62::i;:::-;34692:174;;34779:43;34796:4;34802:19;:17;:19::i;:::-;34779:16;:43::i;:::-;34774:92;;34831:35;;;;;;;;;;;;;;34774:92;34692:174;34897:1;34883:16;;:2;:16;;;34879:52;;;34908:23;;;;;;;;;;;;;;34879:52;34944:43;34966:4;34972:2;34976:7;34985:1;34944:21;:43::i;:::-;35080:15;35077:160;;;35220:1;35199:19;35192:30;35077:160;35615:18;:24;35634:4;35615:24;;;;;;;;;;;;;;;;35613:26;;;;;;;;;;;;35684:18;:22;35703:2;35684:22;;;;;;;;;;;;;;;;35682:24;;;;;;;;;;;36006:145;36043:2;36091:45;36106:4;36112:2;36116:19;36091:14;:45::i;:::-;13633:8;36064:72;36006:18;:145::i;:::-;35977:17;:26;35995:7;35977:26;;;;;;;;;;;:174;;;;36321:1;13633:8;36271:19;:46;:51;36267:626;;;36343:19;36375:1;36365:7;:11;36343:33;;36532:1;36498:17;:30;36516:11;36498:30;;;;;;;;;;;;:35;36494:384;;;36636:13;;36621:11;:28;36617:242;;36816:19;36783:17;:30;36801:11;36783:30;;;;;;;;;;;:52;;;;36617:242;36494:384;36324:569;36267:626;36940:7;36936:2;36921:27;;36930:4;36921:27;;;;;;;;;;;;36959:42;36980:4;36986:2;36990:7;36999:1;36959:20;:42::i;:::-;34332:2677;;;34209:2800;;;:::o;53377:41::-;53414:4;53377:41;:::o;55456:109::-;51793:12;:10;:12::i;:::-;51782:23;;:7;:5;:7::i;:::-;:23;;;51774:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;55514:10:::1;55506:28;;:51;55535:21;55506:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;55456:109::o:0;25834:185::-;25972:39;25989:4;25995:2;25999:7;25972:39;;;;;;;;;;;;:16;:39::i;:::-;25834:185;;;:::o;53245:25::-;;;;:::o;55018:100::-;51793:12;:10;:12::i;:::-;51782:23;;:7;:5;:7::i;:::-;:23;;;51774:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;55102:8:::1;55092:7;:18;;;;;;;;;;;;:::i;:::-;;55018:100:::0;:::o;22787:144::-;22851:7;22894:27;22913:7;22894:18;:27::i;:::-;22871:52;;22787:144;;;:::o;18030:224::-;18094:7;18135:1;18118:19;;:5;:19;;;18114:60;;;18146:28;;;;;;;;;;;;;;18114:60;12585:13;18192:18;:25;18211:5;18192:25;;;;;;;;;;;;;;;;:54;18185:61;;18030:224;;;:::o;52213:103::-;51793:12;:10;:12::i;:::-;51782:23;;:7;:5;:7::i;:::-;:23;;;51774:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;52278:30:::1;52305:1;52278:18;:30::i;:::-;52213:103::o:0;53615:49::-;;;;;;;;;;;;;;;;;:::o;55778:300::-;51793:12;:10;:12::i;:::-;51782:23;;:7;:5;:7::i;:::-;:23;;;51774:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;53414:4:::1;55835:13;:11;:13::i;:::-;:26;55827:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;55915:5;55901:19;;:10;;;;;;;;;;;:19;;;55893:45;;;;;;;;;;;;:::i;:::-;;;;;;;;;55949:31;55959:10;53603:3;55949:9;:31::i;:::-;53603:3;55991:10;;:22;;;;;;;:::i;:::-;;;;;;;;53603:3;56024:6;;:18;;;;;;;:::i;:::-;;;;;;;;56066:4;56053:10;;:17;;;;;;;;;;;;;;;;;;55778:300::o:0;53568:38::-;53603:3;53568:38;:::o;53474:44::-;53506:12;53474:44;:::o;51562:87::-;51608:7;51635:6;;;;;;;;;;;51628:13;;51562:87;:::o;23167:104::-;23223:13;23256:7;23249:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23167:104;:::o;53425:42::-;53463:4;53425:42;:::o;53878:1132::-;56129:23;56141:10;56129:11;:23::i;:::-;56128:24;56120:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;56210:9;56196:23;;:10;:23;;;56188:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;1812:1:::1;2410:7;;:19;;2402:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;1812:1;2543:7;:18;;;;53969:7:::2;;;;;;;;;;;53961:43;;;;;;;;;;;;:::i;:::-;;;;;;;;;53560:1;54068:6;54037:14;:28;54052:12;:10;:12::i;:::-;54037:28;;;;;;;;;;;;;;;;:37;;;;:::i;:::-;:49;;54015:124;;;;;;;;;;;;:::i;:::-;;;;;;;;;53414:4;54158:13;:11;:13::i;:::-;:26;54150:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;53414:4;54240:6;54224:13;:11;:13::i;:::-;:22;;;;:::i;:::-;:36;;54216:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;54315:7;:5;:7::i;:::-;54301:21;;:10;:21;;;;54293:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;54376:17;54410:10;;53463:4;54396:24;;;;:::i;:::-;54376:44;;54431:18;53560:1;54470:9;:21;54466:250;;54546:6;54533:19;;54466:250;;;54586:1;54574:9;:13;54570:146;;;54648:9;54635:22;;54570:146;;;54703:1;54690:14;;54570:146;54466:250;54728:21;53506:12;54762:10;54753:6;:19;;;;:::i;:::-;54752:29;;;;:::i;:::-;54728:53;;54817:9;54800:13;:26;;54792:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;54862:29;54872:10;54884:6;54862:9;:29::i;:::-;54934:6;54902:14;:28;54917:12;:10;:12::i;:::-;54902:28;;;;;;;;;;;;;;;;:38;;;;;;;:::i;:::-;;;;;;;;54965:10;54951;;:24;;;;;;;:::i;:::-;;;;;;;;54996:6;54986;;:16;;;;;;;:::i;:::-;;;;;;;;53950:1060;;;1768:1:::1;2722:7;:22;;;;53878:1132:::0;:::o;25220:308::-;25331:19;:17;:19::i;:::-;25319:31;;:8;:31;;;25315:61;;;25359:17;;;;;;;;;;;;;;25315:61;25441:8;25389:18;:39;25408:19;:17;:19::i;:::-;25389:39;;;;;;;;;;;;;;;:49;25429:8;25389:49;;;;;;;;;;;;;;;;:60;;;;;;;;;;;;;;;;;;25501:8;25465:55;;25480:19;:17;:19::i;:::-;25465:55;;;25511:8;25465:55;;;;;;:::i;:::-;;;;;;;;25220:308;;:::o;26090:399::-;26257:31;26270:4;26276:2;26280:7;26257:12;:31::i;:::-;26321:1;26303:2;:14;;;:19;26299:183;;26342:56;26373:4;26379:2;26383:7;26392:5;26342:30;:56::i;:::-;26337:145;;26426:40;;;;;;;;;;;;;;26337:145;26299:183;26090:399;;;;:::o;53313:30::-;;;;;;;;;;;;;:::o;55242:97::-;51793:12;:10;:12::i;:::-;51782:23;;:7;:5;:7::i;:::-;:23;;;51774:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;55320:11:::1;55310:7;;:21;;;;;;;;;;;;;;;;;;55242:97:::0;:::o;23342:318::-;23415:13;23446:16;23454:7;23446;:16::i;:::-;23441:59;;23471:29;;;;;;;;;;;;;;23441:59;23513:21;23537:10;:8;:10::i;:::-;23513:34;;23590:1;23571:7;23565:21;:26;;:87;;;;;;;;;;;;;;;;;23618:7;23627:18;23637:7;23627:9;:18::i;:::-;23601:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;23565:87;23558:94;;;23342:318;;;:::o;53277:29::-;;;;:::o;25599:164::-;25696:4;25720:18;:25;25739:5;25720:25;;;;;;;;;;;;;;;:35;25746:8;25720:35;;;;;;;;;;;;;;;;;;;;;;;;;25713:42;;25599:164;;;;:::o;53525:36::-;53560:1;53525:36;:::o;52471:201::-;51793:12;:10;:12::i;:::-;51782:23;;:7;:5;:7::i;:::-;:23;;;51774:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;52580:1:::1;52560:22;;:8;:22;;;;52552:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;52636:28;52655:8;52636:18;:28::i;:::-;52471:201:::0;:::o;26744:273::-;26801:4;26857:7;26838:15;:13;:15::i;:::-;:26;;:66;;;;;26891:13;;26881:7;:23;26838:66;:152;;;;;26989:1;13355:8;26942:17;:26;26960:7;26942:26;;;;;;;;;;;;:43;:48;26838:152;26818:172;;26744:273;;;:::o;45305:105::-;45365:7;45392:10;45385:17;;45305:105;:::o;53769:101::-;53834:7;53861:1;53854:8;;53769:101;:::o;19704:1129::-;19771:7;19791:12;19806:7;19791:22;;19874:4;19855:15;:13;:15::i;:::-;:23;19851:915;;19908:13;;19901:4;:20;19897:869;;;19946:14;19963:17;:23;19981:4;19963:23;;;;;;;;;;;;19946:40;;20079:1;13355:8;20052:6;:23;:28;20048:699;;;20571:113;20588:1;20578:6;:11;20571:113;;;20631:17;:25;20649:6;;;;;;;20631:25;;;;;;;;;;;;20622:34;;20571:113;;;20717:6;20710:13;;;;;;20048:699;19923:843;19897:869;19851:915;20794:31;;;;;;;;;;;;;;19704:1129;;;;:::o;32545:652::-;32640:27;32669:23;32710:53;32766:15;32710:71;;32952:7;32946:4;32939:21;32987:22;32981:4;32974:36;33063:4;33057;33047:21;33024:44;;33159:19;33153:26;33134:45;;32890:300;32545:652;;;:::o;33310:645::-;33452:11;33614:15;33608:4;33604:26;33596:34;;33773:15;33762:9;33758:31;33745:44;;33920:15;33909:9;33906:30;33899:4;33888:9;33885:19;33882:55;33872:65;;33310:645;;;;;:::o;44138:159::-;;;;;:::o;42450:309::-;42585:7;42605:16;13756:3;42631:19;:40;;42605:67;;13756:3;42698:31;42709:4;42715:2;42719:9;42698:10;:31::i;:::-;42690:40;;:61;;42683:68;;;42450:309;;;;;:::o;22278:447::-;22358:14;22526:15;22519:5;22515:27;22506:36;;22700:5;22686:11;22662:22;22658:40;22655:51;22648:5;22645:62;22635:72;;22278:447;;;;:::o;44956:158::-;;;;;:::o;50286:98::-;50339:7;50366:10;50359:17;;50286:98;:::o;52832:191::-;52906:16;52925:6;;;;;;;;;;;52906:25;;52951:8;52942:6;;:17;;;;;;;;;;;;;;;;;;53006:8;52975:40;;52996:8;52975:40;;;;;;;;;;;;52895:128;52832:191;:::o;27101:104::-;27170:27;27180:2;27184:8;27170:27;;;;;;;;;;;;:9;:27::i;:::-;27101:104;;:::o;55573:197::-;55634:4;55651:12;55718:7;55706:20;55698:28;;55761:1;55754:4;:8;55747:15;;;55573:197;;;:::o;40960:716::-;41123:4;41169:2;41144:45;;;41190:19;:17;:19::i;:::-;41211:4;41217:7;41226:5;41144:88;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;41140:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41444:1;41427:6;:13;:18;41423:235;;;41473:40;;;;;;;;;;;;;;41423:235;41616:6;41610:13;41601:6;41597:2;41593:15;41586:38;41140:529;41313:54;;;41303:64;;;:6;:64;;;;41296:71;;;40960:716;;;;;;:::o;55126:108::-;55186:13;55219:7;55212:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55126:108;:::o;45516:1960::-;45573:17;45992:3;45985:4;45979:11;45975:21;45968:28;;46083:3;46077:4;46070:17;46189:3;46645:5;46775:1;46770:3;46766:11;46759:18;;46912:2;46906:4;46902:13;46898:2;46894:22;46889:3;46881:36;46953:2;46947:4;46943:13;46935:21;;46537:697;46972:4;46537:697;;;47163:1;47158:3;47154:11;47147:18;;47214:2;47208:4;47204:13;47200:2;47196:22;47191:3;47183:36;47067:2;47061:4;47057:13;47049:21;;46537:697;;;46541:430;47273:3;47268;47264:13;47388:2;47383:3;47379:12;47372:19;;47451:6;47446:3;47439:19;45612:1857;;45516:1960;;;:::o;43335:147::-;43472:6;43335:147;;;;;:::o;27621:681::-;27744:19;27750:2;27754:8;27744:5;:19::i;:::-;27823:1;27805:2;:14;;;:19;27801:483;;27845:11;27859:13;;27845:27;;27891:13;27913:8;27907:3;:14;27891:30;;27940:233;27971:62;28010:1;28014:2;28018:7;;;;;;28027:5;27971:30;:62::i;:::-;27966:167;;28069:40;;;;;;;;;;;;;;27966:167;28168:3;28160:5;:11;27940:233;;28255:3;28238:13;;:20;28234:34;;28260:8;;;28234:34;27826:458;;27801:483;27621:681;;;:::o;28575:1529::-;28640:20;28663:13;;28640:36;;28705:1;28691:16;;:2;:16;;;28687:48;;;28716:19;;;;;;;;;;;;;;28687:48;28762:1;28750:8;:13;28746:44;;;28772:18;;;;;;;;;;;;;;28746:44;28803:61;28833:1;28837:2;28841:12;28855:8;28803:21;:61::i;:::-;29346:1;12722:2;29317:1;:25;;29316:31;29304:8;:44;29278:18;:22;29297:2;29278:22;;;;;;;;;;;;;;;;:70;;;;;;;;;;;29625:139;29662:2;29716:33;29739:1;29743:2;29747:1;29716:14;:33::i;:::-;29683:30;29704:8;29683:20;:30::i;:::-;:66;29625:18;:139::i;:::-;29591:17;:31;29609:12;29591:31;;;;;;;;;;;:173;;;;29781:15;29799:12;29781:30;;29826:11;29855:8;29840:12;:23;29826:37;;29878:101;29930:9;;;;;;29926:2;29905:35;;29922:1;29905:35;;;;;;;;;;;;29974:3;29964:7;:13;29878:101;;30011:3;29995:13;:19;;;;29052:974;;30036:60;30065:1;30069:2;30073:12;30087:8;30036:20;:60::i;:::-;28629:1475;28575:1529;;:::o;24108:322::-;24178:14;24409:1;24399:8;24396:15;24371:23;24367:45;24357:55;;24108:322;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:410:1:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:112;;;280:79;;:::i;:::-;249:112;370:41;404:6;399:3;394;370:41;:::i;:::-;90:327;7:410;;;;;:::o;423:412::-;501:5;526:66;542:49;584:6;542:49;:::i;:::-;526:66;:::i;:::-;517:75;;615:6;608:5;601:21;653:4;646:5;642:16;691:3;682:6;677:3;673:16;670:25;667:112;;;698:79;;:::i;:::-;667:112;788:41;822:6;817:3;812;788:41;:::i;:::-;507:328;423:412;;;;;:::o;841:139::-;887:5;925:6;912:20;903:29;;941:33;968:5;941:33;:::i;:::-;841:139;;;;:::o;986:133::-;1029:5;1067:6;1054:20;1045:29;;1083:30;1107:5;1083:30;:::i;:::-;986:133;;;;:::o;1125:137::-;1170:5;1208:6;1195:20;1186:29;;1224:32;1250:5;1224:32;:::i;:::-;1125:137;;;;:::o;1268:141::-;1324:5;1355:6;1349:13;1340:22;;1371:32;1397:5;1371:32;:::i;:::-;1268:141;;;;:::o;1428:338::-;1483:5;1532:3;1525:4;1517:6;1513:17;1509:27;1499:122;;1540:79;;:::i;:::-;1499:122;1657:6;1644:20;1682:78;1756:3;1748:6;1741:4;1733:6;1729:17;1682:78;:::i;:::-;1673:87;;1489:277;1428:338;;;;:::o;1786:340::-;1842:5;1891:3;1884:4;1876:6;1872:17;1868:27;1858:122;;1899:79;;:::i;:::-;1858:122;2016:6;2003:20;2041:79;2116:3;2108:6;2101:4;2093:6;2089:17;2041:79;:::i;:::-;2032:88;;1848:278;1786:340;;;;:::o;2132:139::-;2178:5;2216:6;2203:20;2194:29;;2232:33;2259:5;2232:33;:::i;:::-;2132:139;;;;:::o;2277:329::-;2336:6;2385:2;2373:9;2364:7;2360:23;2356:32;2353:119;;;2391:79;;:::i;:::-;2353:119;2511:1;2536:53;2581:7;2572:6;2561:9;2557:22;2536:53;:::i;:::-;2526:63;;2482:117;2277:329;;;;:::o;2612:474::-;2680:6;2688;2737:2;2725:9;2716:7;2712:23;2708:32;2705:119;;;2743:79;;:::i;:::-;2705:119;2863:1;2888:53;2933:7;2924:6;2913:9;2909:22;2888:53;:::i;:::-;2878:63;;2834:117;2990:2;3016:53;3061:7;3052:6;3041:9;3037:22;3016:53;:::i;:::-;3006:63;;2961:118;2612:474;;;;;:::o;3092:619::-;3169:6;3177;3185;3234:2;3222:9;3213:7;3209:23;3205:32;3202:119;;;3240:79;;:::i;:::-;3202:119;3360:1;3385:53;3430:7;3421:6;3410:9;3406:22;3385:53;:::i;:::-;3375:63;;3331:117;3487:2;3513:53;3558:7;3549:6;3538:9;3534:22;3513:53;:::i;:::-;3503:63;;3458:118;3615:2;3641:53;3686:7;3677:6;3666:9;3662:22;3641:53;:::i;:::-;3631:63;;3586:118;3092:619;;;;;:::o;3717:943::-;3812:6;3820;3828;3836;3885:3;3873:9;3864:7;3860:23;3856:33;3853:120;;;3892:79;;:::i;:::-;3853:120;4012:1;4037:53;4082:7;4073:6;4062:9;4058:22;4037:53;:::i;:::-;4027:63;;3983:117;4139:2;4165:53;4210:7;4201:6;4190:9;4186:22;4165:53;:::i;:::-;4155:63;;4110:118;4267:2;4293:53;4338:7;4329:6;4318:9;4314:22;4293:53;:::i;:::-;4283:63;;4238:118;4423:2;4412:9;4408:18;4395:32;4454:18;4446:6;4443:30;4440:117;;;4476:79;;:::i;:::-;4440:117;4581:62;4635:7;4626:6;4615:9;4611:22;4581:62;:::i;:::-;4571:72;;4366:287;3717:943;;;;;;;:::o;4666:468::-;4731:6;4739;4788:2;4776:9;4767:7;4763:23;4759:32;4756:119;;;4794:79;;:::i;:::-;4756:119;4914:1;4939:53;4984:7;4975:6;4964:9;4960:22;4939:53;:::i;:::-;4929:63;;4885:117;5041:2;5067:50;5109:7;5100:6;5089:9;5085:22;5067:50;:::i;:::-;5057:60;;5012:115;4666:468;;;;;:::o;5140:474::-;5208:6;5216;5265:2;5253:9;5244:7;5240:23;5236:32;5233:119;;;5271:79;;:::i;:::-;5233:119;5391:1;5416:53;5461:7;5452:6;5441:9;5437:22;5416:53;:::i;:::-;5406:63;;5362:117;5518:2;5544:53;5589:7;5580:6;5569:9;5565:22;5544:53;:::i;:::-;5534:63;;5489:118;5140:474;;;;;:::o;5620:323::-;5676:6;5725:2;5713:9;5704:7;5700:23;5696:32;5693:119;;;5731:79;;:::i;:::-;5693:119;5851:1;5876:50;5918:7;5909:6;5898:9;5894:22;5876:50;:::i;:::-;5866:60;;5822:114;5620:323;;;;:::o;5949:327::-;6007:6;6056:2;6044:9;6035:7;6031:23;6027:32;6024:119;;;6062:79;;:::i;:::-;6024:119;6182:1;6207:52;6251:7;6242:6;6231:9;6227:22;6207:52;:::i;:::-;6197:62;;6153:116;5949:327;;;;:::o;6282:349::-;6351:6;6400:2;6388:9;6379:7;6375:23;6371:32;6368:119;;;6406:79;;:::i;:::-;6368:119;6526:1;6551:63;6606:7;6597:6;6586:9;6582:22;6551:63;:::i;:::-;6541:73;;6497:127;6282:349;;;;:::o;6637:509::-;6706:6;6755:2;6743:9;6734:7;6730:23;6726:32;6723:119;;;6761:79;;:::i;:::-;6723:119;6909:1;6898:9;6894:17;6881:31;6939:18;6931:6;6928:30;6925:117;;;6961:79;;:::i;:::-;6925:117;7066:63;7121:7;7112:6;7101:9;7097:22;7066:63;:::i;:::-;7056:73;;6852:287;6637:509;;;;:::o;7152:329::-;7211:6;7260:2;7248:9;7239:7;7235:23;7231:32;7228:119;;;7266:79;;:::i;:::-;7228:119;7386:1;7411:53;7456:7;7447:6;7436:9;7432:22;7411:53;:::i;:::-;7401:63;;7357:117;7152:329;;;;:::o;7487:118::-;7574:24;7592:5;7574:24;:::i;:::-;7569:3;7562:37;7487:118;;:::o;7611:109::-;7692:21;7707:5;7692:21;:::i;:::-;7687:3;7680:34;7611:109;;:::o;7726:360::-;7812:3;7840:38;7872:5;7840:38;:::i;:::-;7894:70;7957:6;7952:3;7894:70;:::i;:::-;7887:77;;7973:52;8018:6;8013:3;8006:4;7999:5;7995:16;7973:52;:::i;:::-;8050:29;8072:6;8050:29;:::i;:::-;8045:3;8041:39;8034:46;;7816:270;7726:360;;;;:::o;8092:364::-;8180:3;8208:39;8241:5;8208:39;:::i;:::-;8263:71;8327:6;8322:3;8263:71;:::i;:::-;8256:78;;8343:52;8388:6;8383:3;8376:4;8369:5;8365:16;8343:52;:::i;:::-;8420:29;8442:6;8420:29;:::i;:::-;8415:3;8411:39;8404:46;;8184:272;8092:364;;;;:::o;8462:377::-;8568:3;8596:39;8629:5;8596:39;:::i;:::-;8651:89;8733:6;8728:3;8651:89;:::i;:::-;8644:96;;8749:52;8794:6;8789:3;8782:4;8775:5;8771:16;8749:52;:::i;:::-;8826:6;8821:3;8817:16;8810:23;;8572:267;8462:377;;;;:::o;8845:366::-;8987:3;9008:67;9072:2;9067:3;9008:67;:::i;:::-;9001:74;;9084:93;9173:3;9084:93;:::i;:::-;9202:2;9197:3;9193:12;9186:19;;8845:366;;;:::o;9217:::-;9359:3;9380:67;9444:2;9439:3;9380:67;:::i;:::-;9373:74;;9456:93;9545:3;9456:93;:::i;:::-;9574:2;9569:3;9565:12;9558:19;;9217:366;;;:::o;9589:::-;9731:3;9752:67;9816:2;9811:3;9752:67;:::i;:::-;9745:74;;9828:93;9917:3;9828:93;:::i;:::-;9946:2;9941:3;9937:12;9930:19;;9589:366;;;:::o;9961:::-;10103:3;10124:67;10188:2;10183:3;10124:67;:::i;:::-;10117:74;;10200:93;10289:3;10200:93;:::i;:::-;10318:2;10313:3;10309:12;10302:19;;9961:366;;;:::o;10333:::-;10475:3;10496:67;10560:2;10555:3;10496:67;:::i;:::-;10489:74;;10572:93;10661:3;10572:93;:::i;:::-;10690:2;10685:3;10681:12;10674:19;;10333:366;;;:::o;10705:::-;10847:3;10868:67;10932:2;10927:3;10868:67;:::i;:::-;10861:74;;10944:93;11033:3;10944:93;:::i;:::-;11062:2;11057:3;11053:12;11046:19;;10705:366;;;:::o;11077:::-;11219:3;11240:67;11304:2;11299:3;11240:67;:::i;:::-;11233:74;;11316:93;11405:3;11316:93;:::i;:::-;11434:2;11429:3;11425:12;11418:19;;11077:366;;;:::o;11449:::-;11591:3;11612:67;11676:2;11671:3;11612:67;:::i;:::-;11605:74;;11688:93;11777:3;11688:93;:::i;:::-;11806:2;11801:3;11797:12;11790:19;;11449:366;;;:::o;11821:::-;11963:3;11984:67;12048:2;12043:3;11984:67;:::i;:::-;11977:74;;12060:93;12149:3;12060:93;:::i;:::-;12178:2;12173:3;12169:12;12162:19;;11821:366;;;:::o;12193:::-;12335:3;12356:67;12420:2;12415:3;12356:67;:::i;:::-;12349:74;;12432:93;12521:3;12432:93;:::i;:::-;12550:2;12545:3;12541:12;12534:19;;12193:366;;;:::o;12565:::-;12707:3;12728:67;12792:2;12787:3;12728:67;:::i;:::-;12721:74;;12804:93;12893:3;12804:93;:::i;:::-;12922:2;12917:3;12913:12;12906:19;;12565:366;;;:::o;12937:::-;13079:3;13100:67;13164:2;13159:3;13100:67;:::i;:::-;13093:74;;13176:93;13265:3;13176:93;:::i;:::-;13294:2;13289:3;13285:12;13278:19;;12937:366;;;:::o;13309:118::-;13396:24;13414:5;13396:24;:::i;:::-;13391:3;13384:37;13309:118;;:::o;13433:435::-;13613:3;13635:95;13726:3;13717:6;13635:95;:::i;:::-;13628:102;;13747:95;13838:3;13829:6;13747:95;:::i;:::-;13740:102;;13859:3;13852:10;;13433:435;;;;;:::o;13874:222::-;13967:4;14005:2;13994:9;13990:18;13982:26;;14018:71;14086:1;14075:9;14071:17;14062:6;14018:71;:::i;:::-;13874:222;;;;:::o;14102:640::-;14297:4;14335:3;14324:9;14320:19;14312:27;;14349:71;14417:1;14406:9;14402:17;14393:6;14349:71;:::i;:::-;14430:72;14498:2;14487:9;14483:18;14474:6;14430:72;:::i;:::-;14512;14580:2;14569:9;14565:18;14556:6;14512:72;:::i;:::-;14631:9;14625:4;14621:20;14616:2;14605:9;14601:18;14594:48;14659:76;14730:4;14721:6;14659:76;:::i;:::-;14651:84;;14102:640;;;;;;;:::o;14748:210::-;14835:4;14873:2;14862:9;14858:18;14850:26;;14886:65;14948:1;14937:9;14933:17;14924:6;14886:65;:::i;:::-;14748:210;;;;:::o;14964:313::-;15077:4;15115:2;15104:9;15100:18;15092:26;;15164:9;15158:4;15154:20;15150:1;15139:9;15135:17;15128:47;15192:78;15265:4;15256:6;15192:78;:::i;:::-;15184:86;;14964:313;;;;:::o;15283:419::-;15449:4;15487:2;15476:9;15472:18;15464:26;;15536:9;15530:4;15526:20;15522:1;15511:9;15507:17;15500:47;15564:131;15690:4;15564:131;:::i;:::-;15556:139;;15283:419;;;:::o;15708:::-;15874:4;15912:2;15901:9;15897:18;15889:26;;15961:9;15955:4;15951:20;15947:1;15936:9;15932:17;15925:47;15989:131;16115:4;15989:131;:::i;:::-;15981:139;;15708:419;;;:::o;16133:::-;16299:4;16337:2;16326:9;16322:18;16314:26;;16386:9;16380:4;16376:20;16372:1;16361:9;16357:17;16350:47;16414:131;16540:4;16414:131;:::i;:::-;16406:139;;16133:419;;;:::o;16558:::-;16724:4;16762:2;16751:9;16747:18;16739:26;;16811:9;16805:4;16801:20;16797:1;16786:9;16782:17;16775:47;16839:131;16965:4;16839:131;:::i;:::-;16831:139;;16558:419;;;:::o;16983:::-;17149:4;17187:2;17176:9;17172:18;17164:26;;17236:9;17230:4;17226:20;17222:1;17211:9;17207:17;17200:47;17264:131;17390:4;17264:131;:::i;:::-;17256:139;;16983:419;;;:::o;17408:::-;17574:4;17612:2;17601:9;17597:18;17589:26;;17661:9;17655:4;17651:20;17647:1;17636:9;17632:17;17625:47;17689:131;17815:4;17689:131;:::i;:::-;17681:139;;17408:419;;;:::o;17833:::-;17999:4;18037:2;18026:9;18022:18;18014:26;;18086:9;18080:4;18076:20;18072:1;18061:9;18057:17;18050:47;18114:131;18240:4;18114:131;:::i;:::-;18106:139;;17833:419;;;:::o;18258:::-;18424:4;18462:2;18451:9;18447:18;18439:26;;18511:9;18505:4;18501:20;18497:1;18486:9;18482:17;18475:47;18539:131;18665:4;18539:131;:::i;:::-;18531:139;;18258:419;;;:::o;18683:::-;18849:4;18887:2;18876:9;18872:18;18864:26;;18936:9;18930:4;18926:20;18922:1;18911:9;18907:17;18900:47;18964:131;19090:4;18964:131;:::i;:::-;18956:139;;18683:419;;;:::o;19108:::-;19274:4;19312:2;19301:9;19297:18;19289:26;;19361:9;19355:4;19351:20;19347:1;19336:9;19332:17;19325:47;19389:131;19515:4;19389:131;:::i;:::-;19381:139;;19108:419;;;:::o;19533:::-;19699:4;19737:2;19726:9;19722:18;19714:26;;19786:9;19780:4;19776:20;19772:1;19761:9;19757:17;19750:47;19814:131;19940:4;19814:131;:::i;:::-;19806:139;;19533:419;;;:::o;19958:::-;20124:4;20162:2;20151:9;20147:18;20139:26;;20211:9;20205:4;20201:20;20197:1;20186:9;20182:17;20175:47;20239:131;20365:4;20239:131;:::i;:::-;20231:139;;19958:419;;;:::o;20383:222::-;20476:4;20514:2;20503:9;20499:18;20491:26;;20527:71;20595:1;20584:9;20580:17;20571:6;20527:71;:::i;:::-;20383:222;;;;:::o;20611:129::-;20645:6;20672:20;;:::i;:::-;20662:30;;20701:33;20729:4;20721:6;20701:33;:::i;:::-;20611:129;;;:::o;20746:75::-;20779:6;20812:2;20806:9;20796:19;;20746:75;:::o;20827:307::-;20888:4;20978:18;20970:6;20967:30;20964:56;;;21000:18;;:::i;:::-;20964:56;21038:29;21060:6;21038:29;:::i;:::-;21030:37;;21122:4;21116;21112:15;21104:23;;20827:307;;;:::o;21140:308::-;21202:4;21292:18;21284:6;21281:30;21278:56;;;21314:18;;:::i;:::-;21278:56;21352:29;21374:6;21352:29;:::i;:::-;21344:37;;21436:4;21430;21426:15;21418:23;;21140:308;;;:::o;21454:98::-;21505:6;21539:5;21533:12;21523:22;;21454:98;;;:::o;21558:99::-;21610:6;21644:5;21638:12;21628:22;;21558:99;;;:::o;21663:168::-;21746:11;21780:6;21775:3;21768:19;21820:4;21815:3;21811:14;21796:29;;21663:168;;;;:::o;21837:169::-;21921:11;21955:6;21950:3;21943:19;21995:4;21990:3;21986:14;21971:29;;21837:169;;;;:::o;22012:148::-;22114:11;22151:3;22136:18;;22012:148;;;;:::o;22166:305::-;22206:3;22225:20;22243:1;22225:20;:::i;:::-;22220:25;;22259:20;22277:1;22259:20;:::i;:::-;22254:25;;22413:1;22345:66;22341:74;22338:1;22335:81;22332:107;;;22419:18;;:::i;:::-;22332:107;22463:1;22460;22456:9;22449:16;;22166:305;;;;:::o;22477:348::-;22517:7;22540:20;22558:1;22540:20;:::i;:::-;22535:25;;22574:20;22592:1;22574:20;:::i;:::-;22569:25;;22762:1;22694:66;22690:74;22687:1;22684:81;22679:1;22672:9;22665:17;22661:105;22658:131;;;22769:18;;:::i;:::-;22658:131;22817:1;22814;22810:9;22799:20;;22477:348;;;;:::o;22831:191::-;22871:4;22891:20;22909:1;22891:20;:::i;:::-;22886:25;;22925:20;22943:1;22925:20;:::i;:::-;22920:25;;22964:1;22961;22958:8;22955:34;;;22969:18;;:::i;:::-;22955:34;23014:1;23011;23007:9;22999:17;;22831:191;;;;:::o;23028:96::-;23065:7;23094:24;23112:5;23094:24;:::i;:::-;23083:35;;23028:96;;;:::o;23130:90::-;23164:7;23207:5;23200:13;23193:21;23182:32;;23130:90;;;:::o;23226:149::-;23262:7;23302:66;23295:5;23291:78;23280:89;;23226:149;;;:::o;23381:126::-;23418:7;23458:42;23451:5;23447:54;23436:65;;23381:126;;;:::o;23513:77::-;23550:7;23579:5;23568:16;;23513:77;;;:::o;23596:154::-;23680:6;23675:3;23670;23657:30;23742:1;23733:6;23728:3;23724:16;23717:27;23596:154;;;:::o;23756:307::-;23824:1;23834:113;23848:6;23845:1;23842:13;23834:113;;;23933:1;23928:3;23924:11;23918:18;23914:1;23909:3;23905:11;23898:39;23870:2;23867:1;23863:10;23858:15;;23834:113;;;23965:6;23962:1;23959:13;23956:101;;;24045:1;24036:6;24031:3;24027:16;24020:27;23956:101;23805:258;23756:307;;;:::o;24069:320::-;24113:6;24150:1;24144:4;24140:12;24130:22;;24197:1;24191:4;24187:12;24218:18;24208:81;;24274:4;24266:6;24262:17;24252:27;;24208:81;24336:2;24328:6;24325:14;24305:18;24302:38;24299:84;;;24355:18;;:::i;:::-;24299:84;24120:269;24069:320;;;:::o;24395:281::-;24478:27;24500:4;24478:27;:::i;:::-;24470:6;24466:40;24608:6;24596:10;24593:22;24572:18;24560:10;24557:34;24554:62;24551:88;;;24619:18;;:::i;:::-;24551:88;24659:10;24655:2;24648:22;24438:238;24395:281;;:::o;24682:180::-;24730:77;24727:1;24720:88;24827:4;24824:1;24817:15;24851:4;24848:1;24841:15;24868:180;24916:77;24913:1;24906:88;25013:4;25010:1;25003:15;25037:4;25034:1;25027:15;25054:180;25102:77;25099:1;25092:88;25199:4;25196:1;25189:15;25223:4;25220:1;25213:15;25240:117;25349:1;25346;25339:12;25363:117;25472:1;25469;25462:12;25486:117;25595:1;25592;25585:12;25609:117;25718:1;25715;25708:12;25732:102;25773:6;25824:2;25820:7;25815:2;25808:5;25804:14;25800:28;25790:38;;25732:102;;;:::o;25840:225::-;25980:34;25976:1;25968:6;25964:14;25957:58;26049:8;26044:2;26036:6;26032:15;26025:33;25840:225;:::o;26071:170::-;26211:22;26207:1;26199:6;26195:14;26188:46;26071:170;:::o;26247:166::-;26387:18;26383:1;26375:6;26371:14;26364:42;26247:166;:::o;26419:168::-;26559:20;26555:1;26547:6;26543:14;26536:44;26419:168;:::o;26593:176::-;26733:28;26729:1;26721:6;26717:14;26710:52;26593:176;:::o;26775:167::-;26915:19;26911:1;26903:6;26899:14;26892:43;26775:167;:::o;26948:173::-;27088:25;27084:1;27076:6;27072:14;27065:49;26948:173;:::o;27127:182::-;27267:34;27263:1;27255:6;27251:14;27244:58;27127:182;:::o;27315:223::-;27455:34;27451:1;27443:6;27439:14;27432:58;27524:6;27519:2;27511:6;27507:15;27500:31;27315:223;:::o;27544:175::-;27684:27;27680:1;27672:6;27668:14;27661:51;27544:175;:::o;27725:163::-;27865:15;27861:1;27853:6;27849:14;27842:39;27725:163;:::o;27894:181::-;28034:33;28030:1;28022:6;28018:14;28011:57;27894:181;:::o;28081:122::-;28154:24;28172:5;28154:24;:::i;:::-;28147:5;28144:35;28134:63;;28193:1;28190;28183:12;28134:63;28081:122;:::o;28209:116::-;28279:21;28294:5;28279:21;:::i;:::-;28272:5;28269:32;28259:60;;28315:1;28312;28305:12;28259:60;28209:116;:::o;28331:120::-;28403:23;28420:5;28403:23;:::i;:::-;28396:5;28393:34;28383:62;;28441:1;28438;28431:12;28383:62;28331:120;:::o;28457:122::-;28530:24;28548:5;28530:24;:::i;:::-;28523:5;28520:35;28510:63;;28569:1;28566;28559:12;28510:63;28457:122;:::o

Swarm Source

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