ETH Price: $3,427.91 (-1.56%)
Gas: 6 Gwei

Token

Fantastic Beasts (FBEASTS)
 

Overview

Max Total Supply

772 FBEASTS

Holders

281

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
3l0nmusk.eth
Balance
2 FBEASTS
0x9a4dba60aa3f36b48cdb25266140a4844df4a8a3
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:
FantasticBeasts

Compiler Version
v0.8.9+commit.e5eed63a

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

// File: FantasticBeasts.sol

/**
 *Submitted for verification at Etherscan.io on 2022-05-27
*/

// File: Ningen.sol

//SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

abstract contract ReentrancyGuard {
  
    uint256 private constant _NOT_ENTERED = 1;
    uint256 private constant _ENTERED = 2;

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

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

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

        _;

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

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


// OpenZeppelin Contracts (last updated v4.5.0) (utils/Address.sol)

pragma solidity ^0.8.1;

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

        return account.code.length > 0;
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

// File: @openzeppelin/contracts/token/ERC721/IERC721Receiver.sol


// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721Receiver.sol)

pragma solidity ^0.8.0;

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

// File: @openzeppelin/contracts/utils/introspection/IERC165.sol


// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)

pragma solidity ^0.8.0;

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

// File: @openzeppelin/contracts/utils/introspection/ERC165.sol


// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol)

pragma solidity ^0.8.0;


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

// File: @openzeppelin/contracts/token/ERC721/IERC721.sol


// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721.sol)

pragma solidity ^0.8.0;


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

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

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

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

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

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

// File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol)

pragma solidity ^0.8.0;


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

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

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

// File: erc721a/contracts/IERC721A.sol

// ERC721A Contracts v3.3.0
// Creator: Chiru Labs

pragma solidity ^0.8.4;

/**
 * @dev Interface of an ERC721A compliant contract.
 */
interface IERC721A is IERC721, IERC721Metadata {
    /**
     * 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();

    /**
     * The caller cannot approve to the current owner.
     */
    error ApprovalToCurrentOwner();

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

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

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

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

// File: erc721a/contracts/ERC721A.sol


// ERC721A Contracts v3.3.0
// Creator: Chiru Labs

pragma solidity ^0.8.4;

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

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

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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

    // Mapping from token ID to ownership details
    // An empty struct value does not necessarily mean the token is unowned. See _ownershipOf implementation for details.
    mapping(uint256 => TokenOwnership) internal _ownerships;

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

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

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

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

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

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

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

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

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

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

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

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

    /**
     * Sets the auxillary data for `owner`. (e.g. number of whitelist mint slots used).
     * If there are multiple variables, please pack them into a uint64.
     */
    function _setAux(address owner, uint64 aux) internal {
        _addressData[owner].aux = aux;
    }

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

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

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

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

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

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

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

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

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

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

        _approve(to, tokenId, owner);
    }

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

        return _tokenApprovals[tokenId];
    }

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

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

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

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

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

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) public virtual override {
        _transfer(from, to, tokenId);
        if (to.isContract()) 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 && !_ownerships[tokenId].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.
     *
     * Emits a {Transfer} event.
     */
    function _safeMint(
        address to,
        uint256 quantity,
        bytes memory _data
    ) internal {
        uint256 startTokenId = _currentIndex;
        if (to == address(0)) revert MintToZeroAddress();
        if (quantity == 0) revert MintZeroQuantity();

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

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

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

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

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

    /**
     * @dev Mints `quantity` tokens and transfers them to `to`.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `quantity` must be greater than 0.
     *
     * Emits a {Transfer} event.
     */
    function _mint(address to, uint256 quantity) internal {
        uint256 startTokenId = _currentIndex;
        if (to == address(0)) revert MintToZeroAddress();
        if (quantity == 0) revert MintZeroQuantity();

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

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

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

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

            do {
                emit Transfer(address(0), to, updatedIndex++);
            } while (updatedIndex < end);

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

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

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

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

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

        _beforeTokenTransfers(from, to, tokenId, 1);

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

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

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

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

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

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

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

        address from = prevOwnership.addr;

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

            if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved();
        }

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

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

        // Underflow of the sender's balance is impossible because we check for
        // ownership above and the recipient's balance can't realistically overflow.
        // Counter overflow is incredibly unrealistic as tokenId would have to be 2**256.
        unchecked {
            AddressData storage addressData = _addressData[from];
            addressData.balance -= 1;
            addressData.numberBurned += 1;

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

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

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

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

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

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

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

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

// File: contracts/FantasticBeasts.sol

pragma solidity ^0.8.9;

contract FantasticBeasts is ERC721A, Ownable, ReentrancyGuard {
    using Strings for uint256;

    string baseURI;
    string public baseExtension = ".json";
    uint256 public price = 0.004 ether;
    uint256 public maxPerTx = 2;
    uint256 public totalFree = 400;
    uint256 public maxSupply = 600;
    uint256 public maxPerWallet = 20;
    bool public paused = true;
    
    constructor(
        string memory _initBaseURI
        ) ERC721A(
            "Fantastic Beasts", "FBEASTS"
        ) { 
        setBaseURI(_initBaseURI);
        _safeMint(msg.sender, 1);
    }

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

    function mint(uint256 _mintAmount) external payable {
        uint256 cost = price;

        if (totalSupply() + _mintAmount < totalFree + 1) {
            cost = 0;
        }

        require(msg.value >= _mintAmount * cost, "Not enough ETH.");
        require(totalSupply() + _mintAmount < maxSupply + 1, "Exceeds supply.");
        require(!paused, "Minting is not live yet.");
        require(_mintAmount < maxPerTx + 1, "Max per TX reached.");
        require(_numberMinted(msg.sender) + _mintAmount <= maxPerWallet,"Too many per wallet!");

        _safeMint(msg.sender, _mintAmount);
    }

    function tokenURI(uint256 tokenId)
        public
        view
        virtual
        override
        returns (string memory)
    {
        require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token");
        string memory currentBaseURI = _baseURI();
        return bytes(currentBaseURI).length > 0
            ? string(abi.encodePacked(currentBaseURI, tokenId.toString(), baseExtension))
            : "";
    }

    function setFreeAmount(uint256 amount) external onlyOwner {
        totalFree = amount;
    }

    function setMaxPerWallet(uint256 _maxPerWallet) external onlyOwner {
        maxPerWallet = _maxPerWallet;
    }
    
    function setMaxPerTx(uint256 _maxPerTx) public onlyOwner {
        maxPerTx = _maxPerTx;
    }

    function setMaxSupply(uint256 _maxSupply) public onlyOwner {
        maxSupply = _maxSupply;
    }

    function setPrice(uint256 _newPrice) external onlyOwner {
        price = _newPrice;
    }

    function setPaused() public onlyOwner {
        paused = !paused;
    }

    function setBaseURI(string memory _newBaseURI) public onlyOwner {
        baseURI = _newBaseURI;
    }

    function setBaseExtension(string memory _newBaseExtension) public onlyOwner {
        baseExtension = _newBaseExtension;
    }

    function _startTokenId() internal view virtual override returns (uint256) {
        return 1;
    }

    function withdraw() external onlyOwner {
        uint256 balance = address(this).balance;
        (bool success, ) = _msgSender().call{value: balance}("");
        require(success, "Failed to send");
    }      
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"_initBaseURI","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApprovalToCurrentOwner","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"inputs":[],"name":"URIQueryForNonexistentToken","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"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":"baseExtension","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxPerTx","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxPerWallet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"price","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"_newBaseExtension","type":"string"}],"name":"setBaseExtension","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newBaseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"setFreeAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxPerTx","type":"uint256"}],"name":"setMaxPerTx","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxPerWallet","type":"uint256"}],"name":"setMaxPerWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxSupply","type":"uint256"}],"name":"setMaxSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"setPaused","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newPrice","type":"uint256"}],"name":"setPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalFree","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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"}]

60806040526040518060400160405280600581526020017f2e6a736f6e000000000000000000000000000000000000000000000000000000815250600b9080519060200190620000519291906200092c565b50660e35fa931a0000600c556002600d55610190600e55610258600f5560146010556001601160006101000a81548160ff0219169083151502179055503480156200009b57600080fd5b50604051620049d2380380620049d28339818101604052810190620000c1919062000b79565b6040518060400160405280601081526020017f46616e74617374696320426561737473000000000000000000000000000000008152506040518060400160405280600781526020017f46424541535453000000000000000000000000000000000000000000000000008152508160029080519060200190620001459291906200092c565b5080600390805190602001906200015e9291906200092c565b506200016f620001ca60201b60201c565b6000819055505050620001976200018b620001d360201b60201c565b620001db60201b60201c565b6001600981905550620001b081620002a160201b60201c565b620001c33360016200034c60201b60201c565b5062000e52565b60006001905090565b600033905090565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b620002b1620001d360201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16620002d76200037260201b60201c565b73ffffffffffffffffffffffffffffffffffffffff161462000330576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620003279062000c2b565b60405180910390fd5b80600a9080519060200190620003489291906200092c565b5050565b6200036e8282604051806020016040528060008152506200039c60201b60201c565b5050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614156200040a576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600083141562000446576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6200045b60008583866200078b60201b60201c565b82600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555082600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550836004600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426004600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600081905060008482019050620006298673ffffffffffffffffffffffffffffffffffffffff166200079160201b6200199a1760201c565b15620006fb575b818673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4620006a76000878480600101955087620007b460201b60201c565b620006de576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80821062000630578260005414620006f557600080fd5b62000767565b5b818060010192508673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4808210620006fc575b8160008190555050506200078560008583866200092660201b60201c565b50505050565b50505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02620007e2620001d360201b60201c565b8786866040518563ffffffff1660e01b815260040162000806949392919062000d0a565b602060405180830381600087803b1580156200082157600080fd5b505af19250505080156200085557506040513d601f19601f8201168201806040525081019062000852919062000dbb565b60015b620008d3573d806000811462000888576040519150601f19603f3d011682016040523d82523d6000602084013e6200088d565b606091505b50600081511415620008cb576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b50505050565b8280546200093a9062000e1c565b90600052602060002090601f0160209004810192826200095e5760008555620009aa565b82601f106200097957805160ff1916838001178555620009aa565b82800160010185558215620009aa579182015b82811115620009a95782518255916020019190600101906200098c565b5b509050620009b99190620009bd565b5090565b5b80821115620009d8576000816000905550600101620009be565b5090565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b62000a4582620009fa565b810181811067ffffffffffffffff8211171562000a675762000a6662000a0b565b5b80604052505050565b600062000a7c620009dc565b905062000a8a828262000a3a565b919050565b600067ffffffffffffffff82111562000aad5762000aac62000a0b565b5b62000ab882620009fa565b9050602081019050919050565b60005b8381101562000ae557808201518184015260208101905062000ac8565b8381111562000af5576000848401525b50505050565b600062000b1262000b0c8462000a8f565b62000a70565b90508281526020810184848401111562000b315762000b30620009f5565b5b62000b3e84828562000ac5565b509392505050565b600082601f83011262000b5e5762000b5d620009f0565b5b815162000b7084826020860162000afb565b91505092915050565b60006020828403121562000b925762000b91620009e6565b5b600082015167ffffffffffffffff81111562000bb35762000bb2620009eb565b5b62000bc18482850162000b46565b91505092915050565b600082825260208201905092915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b600062000c1360208362000bca565b915062000c208262000bdb565b602082019050919050565b6000602082019050818103600083015262000c468162000c04565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600062000c7a8262000c4d565b9050919050565b62000c8c8162000c6d565b82525050565b6000819050919050565b62000ca78162000c92565b82525050565b600081519050919050565b600082825260208201905092915050565b600062000cd68262000cad565b62000ce2818562000cb8565b935062000cf481856020860162000ac5565b62000cff81620009fa565b840191505092915050565b600060808201905062000d21600083018762000c81565b62000d30602083018662000c81565b62000d3f604083018562000c9c565b818103606083015262000d53818462000cc9565b905095945050505050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b62000d958162000d5e565b811462000da157600080fd5b50565b60008151905062000db58162000d8a565b92915050565b60006020828403121562000dd45762000dd3620009e6565b5b600062000de48482850162000da4565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168062000e3557607f821691505b6020821081141562000e4c5762000e4b62000ded565b5b50919050565b613b708062000e626000396000f3fe6080604052600436106101f95760003560e01c80638da5cb5b1161010d578063c6682862116100a0578063da3ef23f1161006f578063da3ef23f146106d8578063e268e4d314610701578063e985e9c51461072a578063f2fde38b14610767578063f968adbe14610790576101f9565b8063c66828621461061c578063c6f6f21614610647578063c87b56dd14610670578063d5abeb01146106ad576101f9565b8063a035b1fe116100dc578063a035b1fe14610583578063a0712d68146105ae578063a22cb465146105ca578063b88d4fde146105f3576101f9565b80638da5cb5b146104db57806391b7f5ed1461050657806392910eec1461052f57806395d89b4114610558576101f9565b80633ccfd60b116101905780635c975abb1161015f5780635c975abb146103f65780636352211e146104215780636f8b44b01461045e57806370a0823114610487578063715018a6146104c4576101f9565b80633ccfd60b1461036257806342842e0e14610379578063453c2310146103a257806355f804b3146103cd576101f9565b806318160ddd116101cc57806318160ddd146102cc57806323b872dd146102f7578063333e44e61461032057806337a66d851461034b576101f9565b806301ffc9a7146101fe57806306fdde031461023b578063081812fc14610266578063095ea7b3146102a3575b600080fd5b34801561020a57600080fd5b5061022560048036038101906102209190612c3a565b6107bb565b6040516102329190612c82565b60405180910390f35b34801561024757600080fd5b5061025061089d565b60405161025d9190612d36565b60405180910390f35b34801561027257600080fd5b5061028d60048036038101906102889190612d8e565b61092f565b60405161029a9190612dfc565b60405180910390f35b3480156102af57600080fd5b506102ca60048036038101906102c59190612e43565b6109ab565b005b3480156102d857600080fd5b506102e1610ab0565b6040516102ee9190612e92565b60405180910390f35b34801561030357600080fd5b5061031e60048036038101906103199190612ead565b610ac7565b005b34801561032c57600080fd5b50610335610ad7565b6040516103429190612e92565b60405180910390f35b34801561035757600080fd5b50610360610add565b005b34801561036e57600080fd5b50610377610b85565b005b34801561038557600080fd5b506103a0600480360381019061039b9190612ead565b610cbd565b005b3480156103ae57600080fd5b506103b7610cdd565b6040516103c49190612e92565b60405180910390f35b3480156103d957600080fd5b506103f460048036038101906103ef9190613035565b610ce3565b005b34801561040257600080fd5b5061040b610d79565b6040516104189190612c82565b60405180910390f35b34801561042d57600080fd5b5061044860048036038101906104439190612d8e565b610d8c565b6040516104559190612dfc565b60405180910390f35b34801561046a57600080fd5b5061048560048036038101906104809190612d8e565b610da2565b005b34801561049357600080fd5b506104ae60048036038101906104a9919061307e565b610e28565b6040516104bb9190612e92565b60405180910390f35b3480156104d057600080fd5b506104d9610ef8565b005b3480156104e757600080fd5b506104f0610f80565b6040516104fd9190612dfc565b60405180910390f35b34801561051257600080fd5b5061052d60048036038101906105289190612d8e565b610faa565b005b34801561053b57600080fd5b5061055660048036038101906105519190612d8e565b611030565b005b34801561056457600080fd5b5061056d6110b6565b60405161057a9190612d36565b60405180910390f35b34801561058f57600080fd5b50610598611148565b6040516105a59190612e92565b60405180910390f35b6105c860048036038101906105c39190612d8e565b61114e565b005b3480156105d657600080fd5b506105f160048036038101906105ec91906130d7565b611338565b005b3480156105ff57600080fd5b5061061a600480360381019061061591906131b8565b6114b0565b005b34801561062857600080fd5b50610631611528565b60405161063e9190612d36565b60405180910390f35b34801561065357600080fd5b5061066e60048036038101906106699190612d8e565b6115b6565b005b34801561067c57600080fd5b5061069760048036038101906106929190612d8e565b61163c565b6040516106a49190612d36565b60405180910390f35b3480156106b957600080fd5b506106c26116e6565b6040516106cf9190612e92565b60405180910390f35b3480156106e457600080fd5b506106ff60048036038101906106fa9190613035565b6116ec565b005b34801561070d57600080fd5b5061072860048036038101906107239190612d8e565b611782565b005b34801561073657600080fd5b50610751600480360381019061074c919061323b565b611808565b60405161075e9190612c82565b60405180910390f35b34801561077357600080fd5b5061078e6004803603810190610789919061307e565b61189c565b005b34801561079c57600080fd5b506107a5611994565b6040516107b29190612e92565b60405180910390f35b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061088657507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806108965750610895826119bd565b5b9050919050565b6060600280546108ac906132aa565b80601f01602080910402602001604051908101604052809291908181526020018280546108d8906132aa565b80156109255780601f106108fa57610100808354040283529160200191610925565b820191906000526020600020905b81548152906001019060200180831161090857829003601f168201915b5050505050905090565b600061093a82611a27565b610970576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006109b682610d8c565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610a1e576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610a3d611a75565b73ffffffffffffffffffffffffffffffffffffffff1614610aa057610a6981610a64611a75565b611808565b610a9f576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b610aab838383611a7d565b505050565b6000610aba611b2f565b6001546000540303905090565b610ad2838383611b38565b505050565b600e5481565b610ae5611a75565b73ffffffffffffffffffffffffffffffffffffffff16610b03610f80565b73ffffffffffffffffffffffffffffffffffffffff1614610b59576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b5090613328565b60405180910390fd5b601160009054906101000a900460ff1615601160006101000a81548160ff021916908315150217905550565b610b8d611a75565b73ffffffffffffffffffffffffffffffffffffffff16610bab610f80565b73ffffffffffffffffffffffffffffffffffffffff1614610c01576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bf890613328565b60405180910390fd5b60004790506000610c10611a75565b73ffffffffffffffffffffffffffffffffffffffff1682604051610c3390613379565b60006040518083038185875af1925050503d8060008114610c70576040519150601f19603f3d011682016040523d82523d6000602084013e610c75565b606091505b5050905080610cb9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cb0906133da565b60405180910390fd5b5050565b610cd8838383604051806020016040528060008152506114b0565b505050565b60105481565b610ceb611a75565b73ffffffffffffffffffffffffffffffffffffffff16610d09610f80565b73ffffffffffffffffffffffffffffffffffffffff1614610d5f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d5690613328565b60405180910390fd5b80600a9080519060200190610d75929190612ae8565b5050565b601160009054906101000a900460ff1681565b6000610d9782611fee565b600001519050919050565b610daa611a75565b73ffffffffffffffffffffffffffffffffffffffff16610dc8610f80565b73ffffffffffffffffffffffffffffffffffffffff1614610e1e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e1590613328565b60405180910390fd5b80600f8190555050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610e90576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b610f00611a75565b73ffffffffffffffffffffffffffffffffffffffff16610f1e610f80565b73ffffffffffffffffffffffffffffffffffffffff1614610f74576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f6b90613328565b60405180910390fd5b610f7e6000612279565b565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b610fb2611a75565b73ffffffffffffffffffffffffffffffffffffffff16610fd0610f80565b73ffffffffffffffffffffffffffffffffffffffff1614611026576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161101d90613328565b60405180910390fd5b80600c8190555050565b611038611a75565b73ffffffffffffffffffffffffffffffffffffffff16611056610f80565b73ffffffffffffffffffffffffffffffffffffffff16146110ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110a390613328565b60405180910390fd5b80600e8190555050565b6060600380546110c5906132aa565b80601f01602080910402602001604051908101604052809291908181526020018280546110f1906132aa565b801561113e5780601f106111135761010080835404028352916020019161113e565b820191906000526020600020905b81548152906001019060200180831161112157829003601f168201915b5050505050905090565b600c5481565b6000600c5490506001600e546111649190613429565b8261116d610ab0565b6111779190613429565b101561118257600090505b808261118e919061347f565b3410156111d0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111c790613525565b60405180910390fd5b6001600f546111df9190613429565b826111e8610ab0565b6111f29190613429565b10611232576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161122990613591565b60405180910390fd5b601160009054906101000a900460ff1615611282576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611279906135fd565b60405180910390fd5b6001600d546112919190613429565b82106112d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112c990613669565b60405180910390fd5b601054826112df3361233f565b6112e99190613429565b111561132a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611321906136d5565b60405180910390fd5b61133433836123a9565b5050565b611340611a75565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156113a5576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600760006113b2611a75565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661145f611a75565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516114a49190612c82565b60405180910390a35050565b6114bb848484611b38565b6114da8373ffffffffffffffffffffffffffffffffffffffff1661199a565b15611522576114eb848484846123c7565b611521576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b600b8054611535906132aa565b80601f0160208091040260200160405190810160405280929190818152602001828054611561906132aa565b80156115ae5780601f10611583576101008083540402835291602001916115ae565b820191906000526020600020905b81548152906001019060200180831161159157829003601f168201915b505050505081565b6115be611a75565b73ffffffffffffffffffffffffffffffffffffffff166115dc610f80565b73ffffffffffffffffffffffffffffffffffffffff1614611632576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161162990613328565b60405180910390fd5b80600d8190555050565b606061164782611a27565b611686576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161167d90613767565b60405180910390fd5b6000611690612527565b905060008151116116b057604051806020016040528060008152506116de565b806116ba846125b9565b600b6040516020016116ce93929190613857565b6040516020818303038152906040525b915050919050565b600f5481565b6116f4611a75565b73ffffffffffffffffffffffffffffffffffffffff16611712610f80565b73ffffffffffffffffffffffffffffffffffffffff1614611768576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161175f90613328565b60405180910390fd5b80600b908051906020019061177e929190612ae8565b5050565b61178a611a75565b73ffffffffffffffffffffffffffffffffffffffff166117a8610f80565b73ffffffffffffffffffffffffffffffffffffffff16146117fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117f590613328565b60405180910390fd5b8060108190555050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6118a4611a75565b73ffffffffffffffffffffffffffffffffffffffff166118c2610f80565b73ffffffffffffffffffffffffffffffffffffffff1614611918576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161190f90613328565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611988576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161197f906138fa565b60405180910390fd5b61199181612279565b50565b600d5481565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600081611a32611b2f565b11158015611a41575060005482105b8015611a6e575060046000838152602001908152602001600020600001601c9054906101000a900460ff16155b9050919050565b600033905090565b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b60006001905090565b6000611b4382611fee565b90508373ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614611bae576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff16611bcf611a75565b73ffffffffffffffffffffffffffffffffffffffff161480611bfe5750611bfd85611bf8611a75565b611808565b5b80611c435750611c0c611a75565b73ffffffffffffffffffffffffffffffffffffffff16611c2b8461092f565b73ffffffffffffffffffffffffffffffffffffffff16145b905080611c7c576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415611ce3576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611cf0858585600161271a565b611cfc60008487611a7d565b6001600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506001600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600460008581526020019081526020016000209050848160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550428160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060006001850190506000600460008381526020019081526020016000209050600073ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415611f7c576000548214611f7b57878160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555084602001518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b505050828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611fe78585856001612720565b5050505050565b611ff6612b6e565b600082905080612004611b2f565b1161224257600054811015612241576000600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050806040015161223f57600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614612123578092505050612274565b5b60011561223e57818060019003925050600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614612239578092505050612274565b612124565b5b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160089054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b6123c3828260405180602001604052806000815250612726565b5050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a026123ed611a75565b8786866040518563ffffffff1660e01b815260040161240f949392919061396f565b602060405180830381600087803b15801561242957600080fd5b505af192505050801561245a57506040513d601f19601f8201168201806040525081019061245791906139d0565b60015b6124d4573d806000811461248a576040519150601f19603f3d011682016040523d82523d6000602084013e61248f565b606091505b506000815114156124cc576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b6060600a8054612536906132aa565b80601f0160208091040260200160405190810160405280929190818152602001828054612562906132aa565b80156125af5780601f10612584576101008083540402835291602001916125af565b820191906000526020600020905b81548152906001019060200180831161259257829003601f168201915b5050505050905090565b60606000821415612601576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612715565b600082905060005b6000821461263357808061261c906139fd565b915050600a8261262c9190613a75565b9150612609565b60008167ffffffffffffffff81111561264f5761264e612f0a565b5b6040519080825280601f01601f1916602001820160405280156126815781602001600182028036833780820191505090505b5090505b6000851461270e5760018261269a9190613aa6565b9150600a856126a99190613ada565b60306126b59190613429565b60f81b8183815181106126cb576126ca613b0b565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856127079190613a75565b9450612685565b8093505050505b919050565b50505050565b50505050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415612793576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008314156127ce576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6127db600085838661271a565b82600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555082600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550836004600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426004600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060008190506000848201905061299c8673ffffffffffffffffffffffffffffffffffffffff1661199a565b15612a61575b818673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612a1160008784806001019550876123c7565b612a47576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8082106129a2578260005414612a5c57600080fd5b612acc565b5b818060010192508673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4808210612a62575b816000819055505050612ae26000858386612720565b50505050565b828054612af4906132aa565b90600052602060002090601f016020900481019282612b165760008555612b5d565b82601f10612b2f57805160ff1916838001178555612b5d565b82800160010185558215612b5d579182015b82811115612b5c578251825591602001919060010190612b41565b5b509050612b6a9190612bb1565b5090565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681526020016000151581525090565b5b80821115612bca576000816000905550600101612bb2565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b612c1781612be2565b8114612c2257600080fd5b50565b600081359050612c3481612c0e565b92915050565b600060208284031215612c5057612c4f612bd8565b5b6000612c5e84828501612c25565b91505092915050565b60008115159050919050565b612c7c81612c67565b82525050565b6000602082019050612c976000830184612c73565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612cd7578082015181840152602081019050612cbc565b83811115612ce6576000848401525b50505050565b6000601f19601f8301169050919050565b6000612d0882612c9d565b612d128185612ca8565b9350612d22818560208601612cb9565b612d2b81612cec565b840191505092915050565b60006020820190508181036000830152612d508184612cfd565b905092915050565b6000819050919050565b612d6b81612d58565b8114612d7657600080fd5b50565b600081359050612d8881612d62565b92915050565b600060208284031215612da457612da3612bd8565b5b6000612db284828501612d79565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612de682612dbb565b9050919050565b612df681612ddb565b82525050565b6000602082019050612e116000830184612ded565b92915050565b612e2081612ddb565b8114612e2b57600080fd5b50565b600081359050612e3d81612e17565b92915050565b60008060408385031215612e5a57612e59612bd8565b5b6000612e6885828601612e2e565b9250506020612e7985828601612d79565b9150509250929050565b612e8c81612d58565b82525050565b6000602082019050612ea76000830184612e83565b92915050565b600080600060608486031215612ec657612ec5612bd8565b5b6000612ed486828701612e2e565b9350506020612ee586828701612e2e565b9250506040612ef686828701612d79565b9150509250925092565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b612f4282612cec565b810181811067ffffffffffffffff82111715612f6157612f60612f0a565b5b80604052505050565b6000612f74612bce565b9050612f808282612f39565b919050565b600067ffffffffffffffff821115612fa057612f9f612f0a565b5b612fa982612cec565b9050602081019050919050565b82818337600083830152505050565b6000612fd8612fd384612f85565b612f6a565b905082815260208101848484011115612ff457612ff3612f05565b5b612fff848285612fb6565b509392505050565b600082601f83011261301c5761301b612f00565b5b813561302c848260208601612fc5565b91505092915050565b60006020828403121561304b5761304a612bd8565b5b600082013567ffffffffffffffff81111561306957613068612bdd565b5b61307584828501613007565b91505092915050565b60006020828403121561309457613093612bd8565b5b60006130a284828501612e2e565b91505092915050565b6130b481612c67565b81146130bf57600080fd5b50565b6000813590506130d1816130ab565b92915050565b600080604083850312156130ee576130ed612bd8565b5b60006130fc85828601612e2e565b925050602061310d858286016130c2565b9150509250929050565b600067ffffffffffffffff82111561313257613131612f0a565b5b61313b82612cec565b9050602081019050919050565b600061315b61315684613117565b612f6a565b90508281526020810184848401111561317757613176612f05565b5b613182848285612fb6565b509392505050565b600082601f83011261319f5761319e612f00565b5b81356131af848260208601613148565b91505092915050565b600080600080608085870312156131d2576131d1612bd8565b5b60006131e087828801612e2e565b94505060206131f187828801612e2e565b935050604061320287828801612d79565b925050606085013567ffffffffffffffff81111561322357613222612bdd565b5b61322f8782880161318a565b91505092959194509250565b6000806040838503121561325257613251612bd8565b5b600061326085828601612e2e565b925050602061327185828601612e2e565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806132c257607f821691505b602082108114156132d6576132d561327b565b5b50919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000613312602083612ca8565b915061331d826132dc565b602082019050919050565b6000602082019050818103600083015261334181613305565b9050919050565b600081905092915050565b50565b6000613363600083613348565b915061336e82613353565b600082019050919050565b600061338482613356565b9150819050919050565b7f4661696c656420746f2073656e64000000000000000000000000000000000000600082015250565b60006133c4600e83612ca8565b91506133cf8261338e565b602082019050919050565b600060208201905081810360008301526133f3816133b7565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061343482612d58565b915061343f83612d58565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613474576134736133fa565b5b828201905092915050565b600061348a82612d58565b915061349583612d58565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156134ce576134cd6133fa565b5b828202905092915050565b7f4e6f7420656e6f756768204554482e0000000000000000000000000000000000600082015250565b600061350f600f83612ca8565b915061351a826134d9565b602082019050919050565b6000602082019050818103600083015261353e81613502565b9050919050565b7f4578636565647320737570706c792e0000000000000000000000000000000000600082015250565b600061357b600f83612ca8565b915061358682613545565b602082019050919050565b600060208201905081810360008301526135aa8161356e565b9050919050565b7f4d696e74696e67206973206e6f74206c697665207965742e0000000000000000600082015250565b60006135e7601883612ca8565b91506135f2826135b1565b602082019050919050565b60006020820190508181036000830152613616816135da565b9050919050565b7f4d61782070657220545820726561636865642e00000000000000000000000000600082015250565b6000613653601383612ca8565b915061365e8261361d565b602082019050919050565b6000602082019050818103600083015261368281613646565b9050919050565b7f546f6f206d616e79207065722077616c6c657421000000000000000000000000600082015250565b60006136bf601483612ca8565b91506136ca82613689565b602082019050919050565b600060208201905081810360008301526136ee816136b2565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b6000613751602f83612ca8565b915061375c826136f5565b604082019050919050565b6000602082019050818103600083015261378081613744565b9050919050565b600081905092915050565b600061379d82612c9d565b6137a78185613787565b93506137b7818560208601612cb9565b80840191505092915050565b60008190508160005260206000209050919050565b600081546137e5816132aa565b6137ef8186613787565b9450600182166000811461380a576001811461381b5761384e565b60ff1983168652818601935061384e565b613824856137c3565b60005b8381101561384657815481890152600182019150602081019050613827565b838801955050505b50505092915050565b60006138638286613792565b915061386f8285613792565b915061387b82846137d8565b9150819050949350505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006138e4602683612ca8565b91506138ef82613888565b604082019050919050565b60006020820190508181036000830152613913816138d7565b9050919050565b600081519050919050565b600082825260208201905092915050565b60006139418261391a565b61394b8185613925565b935061395b818560208601612cb9565b61396481612cec565b840191505092915050565b60006080820190506139846000830187612ded565b6139916020830186612ded565b61399e6040830185612e83565b81810360608301526139b08184613936565b905095945050505050565b6000815190506139ca81612c0e565b92915050565b6000602082840312156139e6576139e5612bd8565b5b60006139f4848285016139bb565b91505092915050565b6000613a0882612d58565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613a3b57613a3a6133fa565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000613a8082612d58565b9150613a8b83612d58565b925082613a9b57613a9a613a46565b5b828204905092915050565b6000613ab182612d58565b9150613abc83612d58565b925082821015613acf57613ace6133fa565b5b828203905092915050565b6000613ae582612d58565b9150613af083612d58565b925082613b0057613aff613a46565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fdfea2646970667358221220cd334aa08b58332e551a85f7949642cf2bc40e0d5630409c495f5bf0ac3c6b3464736f6c6343000809003300000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000036697066733a2f2f516d586d37566b39614e597879667233644375516d35753556334a566d716b795053697334396b4b3154393937712f00000000000000000000

Deployed Bytecode

0x6080604052600436106101f95760003560e01c80638da5cb5b1161010d578063c6682862116100a0578063da3ef23f1161006f578063da3ef23f146106d8578063e268e4d314610701578063e985e9c51461072a578063f2fde38b14610767578063f968adbe14610790576101f9565b8063c66828621461061c578063c6f6f21614610647578063c87b56dd14610670578063d5abeb01146106ad576101f9565b8063a035b1fe116100dc578063a035b1fe14610583578063a0712d68146105ae578063a22cb465146105ca578063b88d4fde146105f3576101f9565b80638da5cb5b146104db57806391b7f5ed1461050657806392910eec1461052f57806395d89b4114610558576101f9565b80633ccfd60b116101905780635c975abb1161015f5780635c975abb146103f65780636352211e146104215780636f8b44b01461045e57806370a0823114610487578063715018a6146104c4576101f9565b80633ccfd60b1461036257806342842e0e14610379578063453c2310146103a257806355f804b3146103cd576101f9565b806318160ddd116101cc57806318160ddd146102cc57806323b872dd146102f7578063333e44e61461032057806337a66d851461034b576101f9565b806301ffc9a7146101fe57806306fdde031461023b578063081812fc14610266578063095ea7b3146102a3575b600080fd5b34801561020a57600080fd5b5061022560048036038101906102209190612c3a565b6107bb565b6040516102329190612c82565b60405180910390f35b34801561024757600080fd5b5061025061089d565b60405161025d9190612d36565b60405180910390f35b34801561027257600080fd5b5061028d60048036038101906102889190612d8e565b61092f565b60405161029a9190612dfc565b60405180910390f35b3480156102af57600080fd5b506102ca60048036038101906102c59190612e43565b6109ab565b005b3480156102d857600080fd5b506102e1610ab0565b6040516102ee9190612e92565b60405180910390f35b34801561030357600080fd5b5061031e60048036038101906103199190612ead565b610ac7565b005b34801561032c57600080fd5b50610335610ad7565b6040516103429190612e92565b60405180910390f35b34801561035757600080fd5b50610360610add565b005b34801561036e57600080fd5b50610377610b85565b005b34801561038557600080fd5b506103a0600480360381019061039b9190612ead565b610cbd565b005b3480156103ae57600080fd5b506103b7610cdd565b6040516103c49190612e92565b60405180910390f35b3480156103d957600080fd5b506103f460048036038101906103ef9190613035565b610ce3565b005b34801561040257600080fd5b5061040b610d79565b6040516104189190612c82565b60405180910390f35b34801561042d57600080fd5b5061044860048036038101906104439190612d8e565b610d8c565b6040516104559190612dfc565b60405180910390f35b34801561046a57600080fd5b5061048560048036038101906104809190612d8e565b610da2565b005b34801561049357600080fd5b506104ae60048036038101906104a9919061307e565b610e28565b6040516104bb9190612e92565b60405180910390f35b3480156104d057600080fd5b506104d9610ef8565b005b3480156104e757600080fd5b506104f0610f80565b6040516104fd9190612dfc565b60405180910390f35b34801561051257600080fd5b5061052d60048036038101906105289190612d8e565b610faa565b005b34801561053b57600080fd5b5061055660048036038101906105519190612d8e565b611030565b005b34801561056457600080fd5b5061056d6110b6565b60405161057a9190612d36565b60405180910390f35b34801561058f57600080fd5b50610598611148565b6040516105a59190612e92565b60405180910390f35b6105c860048036038101906105c39190612d8e565b61114e565b005b3480156105d657600080fd5b506105f160048036038101906105ec91906130d7565b611338565b005b3480156105ff57600080fd5b5061061a600480360381019061061591906131b8565b6114b0565b005b34801561062857600080fd5b50610631611528565b60405161063e9190612d36565b60405180910390f35b34801561065357600080fd5b5061066e60048036038101906106699190612d8e565b6115b6565b005b34801561067c57600080fd5b5061069760048036038101906106929190612d8e565b61163c565b6040516106a49190612d36565b60405180910390f35b3480156106b957600080fd5b506106c26116e6565b6040516106cf9190612e92565b60405180910390f35b3480156106e457600080fd5b506106ff60048036038101906106fa9190613035565b6116ec565b005b34801561070d57600080fd5b5061072860048036038101906107239190612d8e565b611782565b005b34801561073657600080fd5b50610751600480360381019061074c919061323b565b611808565b60405161075e9190612c82565b60405180910390f35b34801561077357600080fd5b5061078e6004803603810190610789919061307e565b61189c565b005b34801561079c57600080fd5b506107a5611994565b6040516107b29190612e92565b60405180910390f35b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061088657507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806108965750610895826119bd565b5b9050919050565b6060600280546108ac906132aa565b80601f01602080910402602001604051908101604052809291908181526020018280546108d8906132aa565b80156109255780601f106108fa57610100808354040283529160200191610925565b820191906000526020600020905b81548152906001019060200180831161090857829003601f168201915b5050505050905090565b600061093a82611a27565b610970576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006109b682610d8c565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610a1e576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610a3d611a75565b73ffffffffffffffffffffffffffffffffffffffff1614610aa057610a6981610a64611a75565b611808565b610a9f576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b610aab838383611a7d565b505050565b6000610aba611b2f565b6001546000540303905090565b610ad2838383611b38565b505050565b600e5481565b610ae5611a75565b73ffffffffffffffffffffffffffffffffffffffff16610b03610f80565b73ffffffffffffffffffffffffffffffffffffffff1614610b59576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b5090613328565b60405180910390fd5b601160009054906101000a900460ff1615601160006101000a81548160ff021916908315150217905550565b610b8d611a75565b73ffffffffffffffffffffffffffffffffffffffff16610bab610f80565b73ffffffffffffffffffffffffffffffffffffffff1614610c01576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bf890613328565b60405180910390fd5b60004790506000610c10611a75565b73ffffffffffffffffffffffffffffffffffffffff1682604051610c3390613379565b60006040518083038185875af1925050503d8060008114610c70576040519150601f19603f3d011682016040523d82523d6000602084013e610c75565b606091505b5050905080610cb9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cb0906133da565b60405180910390fd5b5050565b610cd8838383604051806020016040528060008152506114b0565b505050565b60105481565b610ceb611a75565b73ffffffffffffffffffffffffffffffffffffffff16610d09610f80565b73ffffffffffffffffffffffffffffffffffffffff1614610d5f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d5690613328565b60405180910390fd5b80600a9080519060200190610d75929190612ae8565b5050565b601160009054906101000a900460ff1681565b6000610d9782611fee565b600001519050919050565b610daa611a75565b73ffffffffffffffffffffffffffffffffffffffff16610dc8610f80565b73ffffffffffffffffffffffffffffffffffffffff1614610e1e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e1590613328565b60405180910390fd5b80600f8190555050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610e90576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b610f00611a75565b73ffffffffffffffffffffffffffffffffffffffff16610f1e610f80565b73ffffffffffffffffffffffffffffffffffffffff1614610f74576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f6b90613328565b60405180910390fd5b610f7e6000612279565b565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b610fb2611a75565b73ffffffffffffffffffffffffffffffffffffffff16610fd0610f80565b73ffffffffffffffffffffffffffffffffffffffff1614611026576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161101d90613328565b60405180910390fd5b80600c8190555050565b611038611a75565b73ffffffffffffffffffffffffffffffffffffffff16611056610f80565b73ffffffffffffffffffffffffffffffffffffffff16146110ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110a390613328565b60405180910390fd5b80600e8190555050565b6060600380546110c5906132aa565b80601f01602080910402602001604051908101604052809291908181526020018280546110f1906132aa565b801561113e5780601f106111135761010080835404028352916020019161113e565b820191906000526020600020905b81548152906001019060200180831161112157829003601f168201915b5050505050905090565b600c5481565b6000600c5490506001600e546111649190613429565b8261116d610ab0565b6111779190613429565b101561118257600090505b808261118e919061347f565b3410156111d0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111c790613525565b60405180910390fd5b6001600f546111df9190613429565b826111e8610ab0565b6111f29190613429565b10611232576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161122990613591565b60405180910390fd5b601160009054906101000a900460ff1615611282576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611279906135fd565b60405180910390fd5b6001600d546112919190613429565b82106112d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112c990613669565b60405180910390fd5b601054826112df3361233f565b6112e99190613429565b111561132a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611321906136d5565b60405180910390fd5b61133433836123a9565b5050565b611340611a75565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156113a5576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600760006113b2611a75565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661145f611a75565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516114a49190612c82565b60405180910390a35050565b6114bb848484611b38565b6114da8373ffffffffffffffffffffffffffffffffffffffff1661199a565b15611522576114eb848484846123c7565b611521576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b600b8054611535906132aa565b80601f0160208091040260200160405190810160405280929190818152602001828054611561906132aa565b80156115ae5780601f10611583576101008083540402835291602001916115ae565b820191906000526020600020905b81548152906001019060200180831161159157829003601f168201915b505050505081565b6115be611a75565b73ffffffffffffffffffffffffffffffffffffffff166115dc610f80565b73ffffffffffffffffffffffffffffffffffffffff1614611632576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161162990613328565b60405180910390fd5b80600d8190555050565b606061164782611a27565b611686576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161167d90613767565b60405180910390fd5b6000611690612527565b905060008151116116b057604051806020016040528060008152506116de565b806116ba846125b9565b600b6040516020016116ce93929190613857565b6040516020818303038152906040525b915050919050565b600f5481565b6116f4611a75565b73ffffffffffffffffffffffffffffffffffffffff16611712610f80565b73ffffffffffffffffffffffffffffffffffffffff1614611768576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161175f90613328565b60405180910390fd5b80600b908051906020019061177e929190612ae8565b5050565b61178a611a75565b73ffffffffffffffffffffffffffffffffffffffff166117a8610f80565b73ffffffffffffffffffffffffffffffffffffffff16146117fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117f590613328565b60405180910390fd5b8060108190555050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6118a4611a75565b73ffffffffffffffffffffffffffffffffffffffff166118c2610f80565b73ffffffffffffffffffffffffffffffffffffffff1614611918576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161190f90613328565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611988576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161197f906138fa565b60405180910390fd5b61199181612279565b50565b600d5481565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600081611a32611b2f565b11158015611a41575060005482105b8015611a6e575060046000838152602001908152602001600020600001601c9054906101000a900460ff16155b9050919050565b600033905090565b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b60006001905090565b6000611b4382611fee565b90508373ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614611bae576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff16611bcf611a75565b73ffffffffffffffffffffffffffffffffffffffff161480611bfe5750611bfd85611bf8611a75565b611808565b5b80611c435750611c0c611a75565b73ffffffffffffffffffffffffffffffffffffffff16611c2b8461092f565b73ffffffffffffffffffffffffffffffffffffffff16145b905080611c7c576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415611ce3576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611cf0858585600161271a565b611cfc60008487611a7d565b6001600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506001600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600460008581526020019081526020016000209050848160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550428160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060006001850190506000600460008381526020019081526020016000209050600073ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415611f7c576000548214611f7b57878160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555084602001518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b505050828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611fe78585856001612720565b5050505050565b611ff6612b6e565b600082905080612004611b2f565b1161224257600054811015612241576000600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050806040015161223f57600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614612123578092505050612274565b5b60011561223e57818060019003925050600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614612239578092505050612274565b612124565b5b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160089054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b6123c3828260405180602001604052806000815250612726565b5050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a026123ed611a75565b8786866040518563ffffffff1660e01b815260040161240f949392919061396f565b602060405180830381600087803b15801561242957600080fd5b505af192505050801561245a57506040513d601f19601f8201168201806040525081019061245791906139d0565b60015b6124d4573d806000811461248a576040519150601f19603f3d011682016040523d82523d6000602084013e61248f565b606091505b506000815114156124cc576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b6060600a8054612536906132aa565b80601f0160208091040260200160405190810160405280929190818152602001828054612562906132aa565b80156125af5780601f10612584576101008083540402835291602001916125af565b820191906000526020600020905b81548152906001019060200180831161259257829003601f168201915b5050505050905090565b60606000821415612601576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612715565b600082905060005b6000821461263357808061261c906139fd565b915050600a8261262c9190613a75565b9150612609565b60008167ffffffffffffffff81111561264f5761264e612f0a565b5b6040519080825280601f01601f1916602001820160405280156126815781602001600182028036833780820191505090505b5090505b6000851461270e5760018261269a9190613aa6565b9150600a856126a99190613ada565b60306126b59190613429565b60f81b8183815181106126cb576126ca613b0b565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856127079190613a75565b9450612685565b8093505050505b919050565b50505050565b50505050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415612793576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008314156127ce576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6127db600085838661271a565b82600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555082600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550836004600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426004600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060008190506000848201905061299c8673ffffffffffffffffffffffffffffffffffffffff1661199a565b15612a61575b818673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612a1160008784806001019550876123c7565b612a47576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8082106129a2578260005414612a5c57600080fd5b612acc565b5b818060010192508673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4808210612a62575b816000819055505050612ae26000858386612720565b50505050565b828054612af4906132aa565b90600052602060002090601f016020900481019282612b165760008555612b5d565b82601f10612b2f57805160ff1916838001178555612b5d565b82800160010185558215612b5d579182015b82811115612b5c578251825591602001919060010190612b41565b5b509050612b6a9190612bb1565b5090565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681526020016000151581525090565b5b80821115612bca576000816000905550600101612bb2565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b612c1781612be2565b8114612c2257600080fd5b50565b600081359050612c3481612c0e565b92915050565b600060208284031215612c5057612c4f612bd8565b5b6000612c5e84828501612c25565b91505092915050565b60008115159050919050565b612c7c81612c67565b82525050565b6000602082019050612c976000830184612c73565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612cd7578082015181840152602081019050612cbc565b83811115612ce6576000848401525b50505050565b6000601f19601f8301169050919050565b6000612d0882612c9d565b612d128185612ca8565b9350612d22818560208601612cb9565b612d2b81612cec565b840191505092915050565b60006020820190508181036000830152612d508184612cfd565b905092915050565b6000819050919050565b612d6b81612d58565b8114612d7657600080fd5b50565b600081359050612d8881612d62565b92915050565b600060208284031215612da457612da3612bd8565b5b6000612db284828501612d79565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612de682612dbb565b9050919050565b612df681612ddb565b82525050565b6000602082019050612e116000830184612ded565b92915050565b612e2081612ddb565b8114612e2b57600080fd5b50565b600081359050612e3d81612e17565b92915050565b60008060408385031215612e5a57612e59612bd8565b5b6000612e6885828601612e2e565b9250506020612e7985828601612d79565b9150509250929050565b612e8c81612d58565b82525050565b6000602082019050612ea76000830184612e83565b92915050565b600080600060608486031215612ec657612ec5612bd8565b5b6000612ed486828701612e2e565b9350506020612ee586828701612e2e565b9250506040612ef686828701612d79565b9150509250925092565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b612f4282612cec565b810181811067ffffffffffffffff82111715612f6157612f60612f0a565b5b80604052505050565b6000612f74612bce565b9050612f808282612f39565b919050565b600067ffffffffffffffff821115612fa057612f9f612f0a565b5b612fa982612cec565b9050602081019050919050565b82818337600083830152505050565b6000612fd8612fd384612f85565b612f6a565b905082815260208101848484011115612ff457612ff3612f05565b5b612fff848285612fb6565b509392505050565b600082601f83011261301c5761301b612f00565b5b813561302c848260208601612fc5565b91505092915050565b60006020828403121561304b5761304a612bd8565b5b600082013567ffffffffffffffff81111561306957613068612bdd565b5b61307584828501613007565b91505092915050565b60006020828403121561309457613093612bd8565b5b60006130a284828501612e2e565b91505092915050565b6130b481612c67565b81146130bf57600080fd5b50565b6000813590506130d1816130ab565b92915050565b600080604083850312156130ee576130ed612bd8565b5b60006130fc85828601612e2e565b925050602061310d858286016130c2565b9150509250929050565b600067ffffffffffffffff82111561313257613131612f0a565b5b61313b82612cec565b9050602081019050919050565b600061315b61315684613117565b612f6a565b90508281526020810184848401111561317757613176612f05565b5b613182848285612fb6565b509392505050565b600082601f83011261319f5761319e612f00565b5b81356131af848260208601613148565b91505092915050565b600080600080608085870312156131d2576131d1612bd8565b5b60006131e087828801612e2e565b94505060206131f187828801612e2e565b935050604061320287828801612d79565b925050606085013567ffffffffffffffff81111561322357613222612bdd565b5b61322f8782880161318a565b91505092959194509250565b6000806040838503121561325257613251612bd8565b5b600061326085828601612e2e565b925050602061327185828601612e2e565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806132c257607f821691505b602082108114156132d6576132d561327b565b5b50919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000613312602083612ca8565b915061331d826132dc565b602082019050919050565b6000602082019050818103600083015261334181613305565b9050919050565b600081905092915050565b50565b6000613363600083613348565b915061336e82613353565b600082019050919050565b600061338482613356565b9150819050919050565b7f4661696c656420746f2073656e64000000000000000000000000000000000000600082015250565b60006133c4600e83612ca8565b91506133cf8261338e565b602082019050919050565b600060208201905081810360008301526133f3816133b7565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061343482612d58565b915061343f83612d58565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613474576134736133fa565b5b828201905092915050565b600061348a82612d58565b915061349583612d58565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156134ce576134cd6133fa565b5b828202905092915050565b7f4e6f7420656e6f756768204554482e0000000000000000000000000000000000600082015250565b600061350f600f83612ca8565b915061351a826134d9565b602082019050919050565b6000602082019050818103600083015261353e81613502565b9050919050565b7f4578636565647320737570706c792e0000000000000000000000000000000000600082015250565b600061357b600f83612ca8565b915061358682613545565b602082019050919050565b600060208201905081810360008301526135aa8161356e565b9050919050565b7f4d696e74696e67206973206e6f74206c697665207965742e0000000000000000600082015250565b60006135e7601883612ca8565b91506135f2826135b1565b602082019050919050565b60006020820190508181036000830152613616816135da565b9050919050565b7f4d61782070657220545820726561636865642e00000000000000000000000000600082015250565b6000613653601383612ca8565b915061365e8261361d565b602082019050919050565b6000602082019050818103600083015261368281613646565b9050919050565b7f546f6f206d616e79207065722077616c6c657421000000000000000000000000600082015250565b60006136bf601483612ca8565b91506136ca82613689565b602082019050919050565b600060208201905081810360008301526136ee816136b2565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b6000613751602f83612ca8565b915061375c826136f5565b604082019050919050565b6000602082019050818103600083015261378081613744565b9050919050565b600081905092915050565b600061379d82612c9d565b6137a78185613787565b93506137b7818560208601612cb9565b80840191505092915050565b60008190508160005260206000209050919050565b600081546137e5816132aa565b6137ef8186613787565b9450600182166000811461380a576001811461381b5761384e565b60ff1983168652818601935061384e565b613824856137c3565b60005b8381101561384657815481890152600182019150602081019050613827565b838801955050505b50505092915050565b60006138638286613792565b915061386f8285613792565b915061387b82846137d8565b9150819050949350505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006138e4602683612ca8565b91506138ef82613888565b604082019050919050565b60006020820190508181036000830152613913816138d7565b9050919050565b600081519050919050565b600082825260208201905092915050565b60006139418261391a565b61394b8185613925565b935061395b818560208601612cb9565b61396481612cec565b840191505092915050565b60006080820190506139846000830187612ded565b6139916020830186612ded565b61399e6040830185612e83565b81810360608301526139b08184613936565b905095945050505050565b6000815190506139ca81612c0e565b92915050565b6000602082840312156139e6576139e5612bd8565b5b60006139f4848285016139bb565b91505092915050565b6000613a0882612d58565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613a3b57613a3a6133fa565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000613a8082612d58565b9150613a8b83612d58565b925082613a9b57613a9a613a46565b5b828204905092915050565b6000613ab182612d58565b9150613abc83612d58565b925082821015613acf57613ace6133fa565b5b828203905092915050565b6000613ae582612d58565b9150613af083612d58565b925082613b0057613aff613a46565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fdfea2646970667358221220cd334aa08b58332e551a85f7949642cf2bc40e0d5630409c495f5bf0ac3c6b3464736f6c63430008090033

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

00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000036697066733a2f2f516d586d37566b39614e597879667233644375516d35753556334a566d716b795053697334396b4b3154393937712f00000000000000000000

-----Decoded View---------------
Arg [0] : _initBaseURI (string): ipfs://QmXm7Vk9aNYxyfr3dCuQm5u5V3JVmqkyPSis49kK1T997q/

-----Encoded View---------------
4 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000020
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000036
Arg [2] : 697066733a2f2f516d586d37566b39614e597879667233644375516d35753556
Arg [3] : 334a566d716b795053697334396b4b3154393937712f00000000000000000000


Deployed Bytecode Sourcemap

48673:3037:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29790:305;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32905:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34409:204;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33971:372;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;29030:312;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35274:170;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48916:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51054:73;;;;;;;;;;;;;:::i;:::-;;51492:209;;;;;;;;;;;;;:::i;:::-;;35515:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48990:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51135:104;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49029:25;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32713:125;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50846:100;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;30159:206;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5993:103;;;;;;;;;;;;;:::i;:::-;;5342:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50954:92;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50513:95;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;33074:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48841:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49443:610;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34685:287;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35771:370;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48797:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50742:96;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50061:444;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48953:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51247:128;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50616:114;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35043:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;6251:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48882:27;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29790:305;29892:4;29944:25;29929:40;;;:11;:40;;;;:105;;;;30001:33;29986:48;;;:11;:48;;;;29929:105;:158;;;;30051:36;30075:11;30051:23;:36::i;:::-;29929:158;29909:178;;29790:305;;;:::o;32905:100::-;32959:13;32992:5;32985:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32905:100;:::o;34409:204::-;34477:7;34502:16;34510:7;34502;:16::i;:::-;34497:64;;34527:34;;;;;;;;;;;;;;34497:64;34581:15;:24;34597:7;34581:24;;;;;;;;;;;;;;;;;;;;;34574:31;;34409:204;;;:::o;33971:372::-;34044:13;34060:24;34076:7;34060:15;:24::i;:::-;34044:40;;34105:5;34099:11;;:2;:11;;;34095:48;;;34119:24;;;;;;;;;;;;;;34095:48;34176:5;34160:21;;:12;:10;:12::i;:::-;:21;;;34156:139;;34187:37;34204:5;34211:12;:10;:12::i;:::-;34187:16;:37::i;:::-;34183:112;;34248:35;;;;;;;;;;;;;;34183:112;34156:139;34307:28;34316:2;34320:7;34329:5;34307:8;:28::i;:::-;34033:310;33971:372;;:::o;29030:312::-;29083:7;29308:15;:13;:15::i;:::-;29293:12;;29277:13;;:28;:46;29270:53;;29030:312;:::o;35274:170::-;35408:28;35418:4;35424:2;35428:7;35408:9;:28::i;:::-;35274:170;;;:::o;48916:30::-;;;;:::o;51054:73::-;5573:12;:10;:12::i;:::-;5562:23;;:7;:5;:7::i;:::-;:23;;;5554:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;51113:6:::1;;;;;;;;;;;51112:7;51103:6;;:16;;;;;;;;;;;;;;;;;;51054:73::o:0;51492:209::-;5573:12;:10;:12::i;:::-;5562:23;;:7;:5;:7::i;:::-;:23;;;5554:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;51542:15:::1;51560:21;51542:39;;51593:12;51611;:10;:12::i;:::-;:17;;51636:7;51611:37;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51592:56;;;51667:7;51659:34;;;;;;;;;;;;:::i;:::-;;;;;;;;;51531:170;;51492:209::o:0;35515:185::-;35653:39;35670:4;35676:2;35680:7;35653:39;;;;;;;;;;;;:16;:39::i;:::-;35515:185;;;:::o;48990:32::-;;;;:::o;51135:104::-;5573:12;:10;:12::i;:::-;5562:23;;:7;:5;:7::i;:::-;:23;;;5554:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;51220:11:::1;51210:7;:21;;;;;;;;;;;;:::i;:::-;;51135:104:::0;:::o;49029:25::-;;;;;;;;;;;;;:::o;32713:125::-;32777:7;32804:21;32817:7;32804:12;:21::i;:::-;:26;;;32797:33;;32713:125;;;:::o;50846:100::-;5573:12;:10;:12::i;:::-;5562:23;;:7;:5;:7::i;:::-;:23;;;5554:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;50928:10:::1;50916:9;:22;;;;50846:100:::0;:::o;30159:206::-;30223:7;30264:1;30247:19;;:5;:19;;;30243:60;;;30275:28;;;;;;;;;;;;;;30243:60;30329:12;:19;30342:5;30329:19;;;;;;;;;;;;;;;:27;;;;;;;;;;;;30321:36;;30314:43;;30159:206;;;:::o;5993:103::-;5573:12;:10;:12::i;:::-;5562:23;;:7;:5;:7::i;:::-;:23;;;5554:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;6058:30:::1;6085:1;6058:18;:30::i;:::-;5993:103::o:0;5342:87::-;5388:7;5415:6;;;;;;;;;;;5408:13;;5342:87;:::o;50954:92::-;5573:12;:10;:12::i;:::-;5562:23;;:7;:5;:7::i;:::-;:23;;;5554:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;51029:9:::1;51021:5;:17;;;;50954:92:::0;:::o;50513:95::-;5573:12;:10;:12::i;:::-;5562:23;;:7;:5;:7::i;:::-;:23;;;5554:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;50594:6:::1;50582:9;:18;;;;50513:95:::0;:::o;33074:104::-;33130:13;33163:7;33156:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33074:104;:::o;48841:34::-;;;;:::o;49443:610::-;49506:12;49521:5;;49506:20;;49585:1;49573:9;;:13;;;;:::i;:::-;49559:11;49543:13;:11;:13::i;:::-;:27;;;;:::i;:::-;:43;49539:84;;;49610:1;49603:8;;49539:84;49670:4;49656:11;:18;;;;:::i;:::-;49643:9;:31;;49635:59;;;;;;;;;;;;:::i;:::-;;;;;;;;;49755:1;49743:9;;:13;;;;:::i;:::-;49729:11;49713:13;:11;:13::i;:::-;:27;;;;:::i;:::-;:43;49705:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;49796:6;;;;;;;;;;;49795:7;49787:44;;;;;;;;;;;;:::i;:::-;;;;;;;;;49875:1;49864:8;;:12;;;;:::i;:::-;49850:11;:26;49842:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;49962:12;;49947:11;49919:25;49933:10;49919:13;:25::i;:::-;:39;;;;:::i;:::-;:55;;49911:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;50011:34;50021:10;50033:11;50011:9;:34::i;:::-;49495:558;49443:610;:::o;34685:287::-;34796:12;:10;:12::i;:::-;34784:24;;:8;:24;;;34780:54;;;34817:17;;;;;;;;;;;;;;34780:54;34892:8;34847:18;:32;34866:12;:10;:12::i;:::-;34847:32;;;;;;;;;;;;;;;:42;34880:8;34847:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;34945:8;34916:48;;34931:12;:10;:12::i;:::-;34916:48;;;34955:8;34916:48;;;;;;:::i;:::-;;;;;;;;34685:287;;:::o;35771:370::-;35938:28;35948:4;35954:2;35958:7;35938:9;:28::i;:::-;35981:15;:2;:13;;;:15::i;:::-;35977:157;;;36002:56;36033:4;36039:2;36043:7;36052:5;36002:30;:56::i;:::-;35998:136;;36082:40;;;;;;;;;;;;;;35998:136;35977:157;35771:370;;;;:::o;48797:37::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;50742:96::-;5573:12;:10;:12::i;:::-;5562:23;;:7;:5;:7::i;:::-;:23;;;5554:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;50821:9:::1;50810:8;:20;;;;50742:96:::0;:::o;50061:444::-;50179:13;50218:16;50226:7;50218;:16::i;:::-;50210:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;50297:28;50328:10;:8;:10::i;:::-;50297:41;;50387:1;50362:14;50356:28;:32;:141;;;;;;;;;;;;;;;;;50428:14;50444:18;:7;:16;:18::i;:::-;50464:13;50411:67;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;50356:141;50349:148;;;50061:444;;;:::o;48953:30::-;;;;:::o;51247:128::-;5573:12;:10;:12::i;:::-;5562:23;;:7;:5;:7::i;:::-;:23;;;5554:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;51350:17:::1;51334:13;:33;;;;;;;;;;;;:::i;:::-;;51247:128:::0;:::o;50616:114::-;5573:12;:10;:12::i;:::-;5562:23;;:7;:5;:7::i;:::-;:23;;;5554:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;50709:13:::1;50694:12;:28;;;;50616:114:::0;:::o;35043:164::-;35140:4;35164:18;:25;35183:5;35164:25;;;;;;;;;;;;;;;:35;35190:8;35164:35;;;;;;;;;;;;;;;;;;;;;;;;;35157:42;;35043:164;;;;:::o;6251:201::-;5573:12;:10;:12::i;:::-;5562:23;;:7;:5;:7::i;:::-;:23;;;5554:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;6360:1:::1;6340:22;;:8;:22;;;;6332:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;6416:28;6435:8;6416:18;:28::i;:::-;6251:201:::0;:::o;48882:27::-;;;;:::o;8043:326::-;8103:4;8360:1;8338:7;:19;;;:23;8331:30;;8043:326;;;:::o;18149:157::-;18234:4;18273:25;18258:40;;;:11;:40;;;;18251:47;;18149:157;;;:::o;36396:174::-;36453:4;36496:7;36477:15;:13;:15::i;:::-;:26;;:53;;;;;36517:13;;36507:7;:23;36477:53;:85;;;;;36535:11;:20;36547:7;36535:20;;;;;;;;;;;:27;;;;;;;;;;;;36534:28;36477:85;36470:92;;36396:174;;;:::o;4066:98::-;4119:7;4146:10;4139:17;;4066:98;:::o;45618:196::-;45760:2;45733:15;:24;45749:7;45733:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;45798:7;45794:2;45778:28;;45787:5;45778:28;;;;;;;;;;;;45618:196;;;:::o;51383:101::-;51448:7;51475:1;51468:8;;51383:101;:::o;40566:2130::-;40681:35;40719:21;40732:7;40719:12;:21::i;:::-;40681:59;;40779:4;40757:26;;:13;:18;;;:26;;;40753:67;;40792:28;;;;;;;;;;;;;;40753:67;40833:22;40875:4;40859:20;;:12;:10;:12::i;:::-;:20;;;:73;;;;40896:36;40913:4;40919:12;:10;:12::i;:::-;40896:16;:36::i;:::-;40859:73;:126;;;;40973:12;:10;:12::i;:::-;40949:36;;:20;40961:7;40949:11;:20::i;:::-;:36;;;40859:126;40833:153;;41004:17;40999:66;;41030:35;;;;;;;;;;;;;;40999:66;41094:1;41080:16;;:2;:16;;;41076:52;;;41105:23;;;;;;;;;;;;;;41076:52;41141:43;41163:4;41169:2;41173:7;41182:1;41141:21;:43::i;:::-;41249:35;41266:1;41270:7;41279:4;41249:8;:35::i;:::-;41610:1;41580:12;:18;41593:4;41580:18;;;;;;;;;;;;;;;:26;;;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41654:1;41626:12;:16;41639:2;41626:16;;;;;;;;;;;;;;;:24;;;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41672:31;41706:11;:20;41718:7;41706:20;;;;;;;;;;;41672:54;;41757:2;41741:8;:13;;;:18;;;;;;;;;;;;;;;;;;41807:15;41774:8;:23;;;:49;;;;;;;;;;;;;;;;;;42075:19;42107:1;42097:7;:11;42075:33;;42123:31;42157:11;:24;42169:11;42157:24;;;;;;;;;;;42123:58;;42225:1;42200:27;;:8;:13;;;;;;;;;;;;:27;;;42196:384;;;42410:13;;42395:11;:28;42391:174;;42464:4;42448:8;:13;;;:20;;;;;;;;;;;;;;;;;;42517:13;:28;;;42491:8;:23;;;:54;;;;;;;;;;;;;;;;;;42391:174;42196:384;41555:1036;;;42627:7;42623:2;42608:27;;42617:4;42608:27;;;;;;;;;;;;42646:42;42667:4;42673:2;42677:7;42686:1;42646:20;:42::i;:::-;40670:2026;;40566:2130;;;:::o;31540:1111::-;31602:21;;:::i;:::-;31636:12;31651:7;31636:22;;31719:4;31700:15;:13;:15::i;:::-;:23;31696:888;;31736:13;;31729:4;:20;31725:859;;;31770:31;31804:11;:17;31816:4;31804:17;;;;;;;;;;;31770:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31845:9;:16;;;31840:729;;31916:1;31890:28;;:9;:14;;;:28;;;31886:101;;31954:9;31947:16;;;;;;31886:101;32289:261;32296:4;32289:261;;;32329:6;;;;;;;;32374:11;:17;32386:4;32374:17;;;;;;;;;;;32362:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32448:1;32422:28;;:9;:14;;;:28;;;32418:109;;32490:9;32483:16;;;;;;32418:109;32289:261;;;31840:729;31751:833;31725:859;31696:888;32612:31;;;;;;;;;;;;;;31540:1111;;;;:::o;6612:191::-;6686:16;6705:6;;;;;;;;;;;6686:25;;6731:8;6722:6;;:17;;;;;;;;;;;;;;;;;;6786:8;6755:40;;6776:8;6755:40;;;;;;;;;;;;6675:128;6612:191;:::o;30447:137::-;30508:7;30543:12;:19;30556:5;30543:19;;;;;;;;;;;;;;;:32;;;;;;;;;;;;30535:41;;30528:48;;30447:137;;;:::o;36654:104::-;36723:27;36733:2;36737:8;36723:27;;;;;;;;;;;;:9;:27::i;:::-;36654:104;;:::o;46306:667::-;46469:4;46506:2;46490:36;;;46527:12;:10;:12::i;:::-;46541:4;46547:7;46556:5;46490:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;46486:480;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46741:1;46724:6;:13;:18;46720:235;;;46770:40;;;;;;;;;;;;;;46720:235;46913:6;46907:13;46898:6;46894:2;46890:15;46883:38;46486:480;46619:45;;;46609:55;;;:6;:55;;;;46602:62;;;46306:667;;;;;;:::o;49277:158::-;49387:13;49420:7;49413:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49277:158;:::o;1628:723::-;1684:13;1914:1;1905:5;:10;1901:53;;;1932:10;;;;;;;;;;;;;;;;;;;;;1901:53;1964:12;1979:5;1964:20;;1995:14;2020:78;2035:1;2027:4;:9;2020:78;;2053:8;;;;;:::i;:::-;;;;2084:2;2076:10;;;;;:::i;:::-;;;2020:78;;;2108:19;2140:6;2130:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2108:39;;2158:154;2174:1;2165:5;:10;2158:154;;2202:1;2192:11;;;;;:::i;:::-;;;2269:2;2261:5;:10;;;;:::i;:::-;2248:2;:24;;;;:::i;:::-;2235:39;;2218:6;2225;2218:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;2298:2;2289:11;;;;;:::i;:::-;;;2158:154;;;2336:6;2322:21;;;;;1628:723;;;;:::o;47621:159::-;;;;;:::o;48439:158::-;;;;;:::o;37131:1749::-;37254:20;37277:13;;37254:36;;37319:1;37305:16;;:2;:16;;;37301:48;;;37330:19;;;;;;;;;;;;;;37301:48;37376:1;37364:8;:13;37360:44;;;37386:18;;;;;;;;;;;;;;37360:44;37417:61;37447:1;37451:2;37455:12;37469:8;37417:21;:61::i;:::-;37790:8;37755:12;:16;37768:2;37755:16;;;;;;;;;;;;;;;:24;;;:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37854:8;37814:12;:16;37827:2;37814:16;;;;;;;;;;;;;;;:29;;;:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37913:2;37880:11;:25;37892:12;37880:25;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;37980:15;37930:11;:25;37942:12;37930:25;;;;;;;;;;;:40;;;:66;;;;;;;;;;;;;;;;;;38013:20;38036:12;38013:35;;38063:11;38092:8;38077:12;:23;38063:37;;38121:15;:2;:13;;;:15::i;:::-;38117:631;;;38157:313;38213:12;38209:2;38188:38;;38205:1;38188:38;;;;;;;;;;;;38254:69;38293:1;38297:2;38301:14;;;;;;38317:5;38254:30;:69::i;:::-;38249:174;;38359:40;;;;;;;;;;;;;;38249:174;38465:3;38450:12;:18;38157:313;;38551:12;38534:13;;:29;38530:43;;38565:8;;;38530:43;38117:631;;;38614:119;38670:14;;;;;;38666:2;38645:40;;38662:1;38645:40;;;;;;;;;;;;38728:3;38713:12;:18;38614:119;;38117:631;38778:12;38762:13;:28;;;;37730:1072;;38812:60;38841:1;38845:2;38849:12;38863:8;38812:20;:60::i;:::-;37243:1637;37131:1749;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:99::-;1570:6;1604:5;1598:12;1588:22;;1518:99;;;:::o;1623:169::-;1707:11;1741:6;1736:3;1729:19;1781:4;1776:3;1772:14;1757:29;;1623:169;;;;:::o;1798:307::-;1866:1;1876:113;1890:6;1887:1;1884:13;1876:113;;;1975:1;1970:3;1966:11;1960:18;1956:1;1951:3;1947:11;1940:39;1912:2;1909:1;1905:10;1900:15;;1876:113;;;2007:6;2004:1;2001:13;1998:101;;;2087:1;2078:6;2073:3;2069:16;2062:27;1998:101;1847:258;1798:307;;;:::o;2111:102::-;2152:6;2203:2;2199:7;2194:2;2187:5;2183:14;2179:28;2169:38;;2111:102;;;:::o;2219:364::-;2307:3;2335:39;2368:5;2335:39;:::i;:::-;2390:71;2454:6;2449:3;2390:71;:::i;:::-;2383:78;;2470:52;2515:6;2510:3;2503:4;2496:5;2492:16;2470:52;:::i;:::-;2547:29;2569:6;2547:29;:::i;:::-;2542:3;2538:39;2531:46;;2311:272;2219:364;;;;:::o;2589:313::-;2702:4;2740:2;2729:9;2725:18;2717:26;;2789:9;2783:4;2779:20;2775:1;2764:9;2760:17;2753:47;2817:78;2890:4;2881:6;2817:78;:::i;:::-;2809:86;;2589:313;;;;:::o;2908:77::-;2945:7;2974:5;2963:16;;2908:77;;;:::o;2991:122::-;3064:24;3082:5;3064:24;:::i;:::-;3057:5;3054:35;3044:63;;3103:1;3100;3093:12;3044:63;2991:122;:::o;3119:139::-;3165:5;3203:6;3190:20;3181:29;;3219:33;3246:5;3219:33;:::i;:::-;3119:139;;;;:::o;3264:329::-;3323:6;3372:2;3360:9;3351:7;3347:23;3343:32;3340:119;;;3378:79;;:::i;:::-;3340:119;3498:1;3523:53;3568:7;3559:6;3548:9;3544:22;3523:53;:::i;:::-;3513:63;;3469:117;3264:329;;;;:::o;3599:126::-;3636:7;3676:42;3669:5;3665:54;3654:65;;3599:126;;;:::o;3731:96::-;3768:7;3797:24;3815:5;3797:24;:::i;:::-;3786:35;;3731:96;;;:::o;3833:118::-;3920:24;3938:5;3920:24;:::i;:::-;3915:3;3908:37;3833:118;;:::o;3957:222::-;4050:4;4088:2;4077:9;4073:18;4065:26;;4101:71;4169:1;4158:9;4154:17;4145:6;4101:71;:::i;:::-;3957:222;;;;:::o;4185:122::-;4258:24;4276:5;4258:24;:::i;:::-;4251:5;4248:35;4238:63;;4297:1;4294;4287:12;4238:63;4185:122;:::o;4313:139::-;4359:5;4397:6;4384:20;4375:29;;4413:33;4440:5;4413:33;:::i;:::-;4313:139;;;;:::o;4458:474::-;4526:6;4534;4583:2;4571:9;4562:7;4558:23;4554:32;4551:119;;;4589:79;;:::i;:::-;4551:119;4709:1;4734:53;4779:7;4770:6;4759:9;4755:22;4734:53;:::i;:::-;4724:63;;4680:117;4836:2;4862:53;4907:7;4898:6;4887:9;4883:22;4862:53;:::i;:::-;4852:63;;4807:118;4458:474;;;;;:::o;4938:118::-;5025:24;5043:5;5025:24;:::i;:::-;5020:3;5013:37;4938:118;;:::o;5062:222::-;5155:4;5193:2;5182:9;5178:18;5170:26;;5206:71;5274:1;5263:9;5259:17;5250:6;5206:71;:::i;:::-;5062:222;;;;:::o;5290:619::-;5367:6;5375;5383;5432:2;5420:9;5411:7;5407:23;5403:32;5400:119;;;5438:79;;:::i;:::-;5400:119;5558:1;5583:53;5628:7;5619:6;5608:9;5604:22;5583:53;:::i;:::-;5573:63;;5529:117;5685:2;5711:53;5756:7;5747:6;5736:9;5732:22;5711:53;:::i;:::-;5701:63;;5656:118;5813:2;5839:53;5884:7;5875:6;5864:9;5860:22;5839:53;:::i;:::-;5829:63;;5784:118;5290:619;;;;;:::o;5915:117::-;6024:1;6021;6014:12;6038:117;6147:1;6144;6137:12;6161:180;6209:77;6206:1;6199:88;6306:4;6303:1;6296:15;6330:4;6327:1;6320:15;6347:281;6430:27;6452:4;6430:27;:::i;:::-;6422:6;6418:40;6560:6;6548:10;6545:22;6524:18;6512:10;6509:34;6506:62;6503:88;;;6571:18;;:::i;:::-;6503:88;6611:10;6607:2;6600:22;6390:238;6347:281;;:::o;6634:129::-;6668:6;6695:20;;:::i;:::-;6685:30;;6724:33;6752:4;6744:6;6724:33;:::i;:::-;6634:129;;;:::o;6769:308::-;6831:4;6921:18;6913:6;6910:30;6907:56;;;6943:18;;:::i;:::-;6907:56;6981:29;7003:6;6981:29;:::i;:::-;6973:37;;7065:4;7059;7055:15;7047:23;;6769:308;;;:::o;7083:154::-;7167:6;7162:3;7157;7144:30;7229:1;7220:6;7215:3;7211:16;7204:27;7083:154;;;:::o;7243:412::-;7321:5;7346:66;7362:49;7404:6;7362:49;:::i;:::-;7346:66;:::i;:::-;7337:75;;7435:6;7428:5;7421:21;7473:4;7466:5;7462:16;7511:3;7502:6;7497:3;7493:16;7490:25;7487:112;;;7518:79;;:::i;:::-;7487:112;7608:41;7642:6;7637:3;7632;7608:41;:::i;:::-;7327:328;7243:412;;;;;:::o;7675:340::-;7731:5;7780:3;7773:4;7765:6;7761:17;7757:27;7747:122;;7788:79;;:::i;:::-;7747:122;7905:6;7892:20;7930:79;8005:3;7997:6;7990:4;7982:6;7978:17;7930:79;:::i;:::-;7921:88;;7737:278;7675:340;;;;:::o;8021:509::-;8090:6;8139:2;8127:9;8118:7;8114:23;8110:32;8107:119;;;8145:79;;:::i;:::-;8107:119;8293:1;8282:9;8278:17;8265:31;8323:18;8315:6;8312:30;8309:117;;;8345:79;;:::i;:::-;8309:117;8450:63;8505:7;8496:6;8485:9;8481:22;8450:63;:::i;:::-;8440:73;;8236:287;8021:509;;;;:::o;8536:329::-;8595:6;8644:2;8632:9;8623:7;8619:23;8615:32;8612:119;;;8650:79;;:::i;:::-;8612:119;8770:1;8795:53;8840:7;8831:6;8820:9;8816:22;8795:53;:::i;:::-;8785:63;;8741:117;8536:329;;;;:::o;8871:116::-;8941:21;8956:5;8941:21;:::i;:::-;8934:5;8931:32;8921:60;;8977:1;8974;8967:12;8921:60;8871:116;:::o;8993:133::-;9036:5;9074:6;9061:20;9052:29;;9090:30;9114:5;9090:30;:::i;:::-;8993:133;;;;:::o;9132:468::-;9197:6;9205;9254:2;9242:9;9233:7;9229:23;9225:32;9222:119;;;9260:79;;:::i;:::-;9222:119;9380:1;9405:53;9450:7;9441:6;9430:9;9426:22;9405:53;:::i;:::-;9395:63;;9351:117;9507:2;9533:50;9575:7;9566:6;9555:9;9551:22;9533:50;:::i;:::-;9523:60;;9478:115;9132:468;;;;;:::o;9606:307::-;9667:4;9757:18;9749:6;9746:30;9743:56;;;9779:18;;:::i;:::-;9743:56;9817:29;9839:6;9817:29;:::i;:::-;9809:37;;9901:4;9895;9891:15;9883:23;;9606:307;;;:::o;9919:410::-;9996:5;10021:65;10037:48;10078:6;10037:48;:::i;:::-;10021:65;:::i;:::-;10012:74;;10109:6;10102:5;10095:21;10147:4;10140:5;10136:16;10185:3;10176:6;10171:3;10167:16;10164:25;10161:112;;;10192:79;;:::i;:::-;10161:112;10282:41;10316:6;10311:3;10306;10282:41;:::i;:::-;10002:327;9919:410;;;;;:::o;10348:338::-;10403:5;10452:3;10445:4;10437:6;10433:17;10429:27;10419:122;;10460:79;;:::i;:::-;10419:122;10577:6;10564:20;10602:78;10676:3;10668:6;10661:4;10653:6;10649:17;10602:78;:::i;:::-;10593:87;;10409:277;10348:338;;;;:::o;10692:943::-;10787:6;10795;10803;10811;10860:3;10848:9;10839:7;10835:23;10831:33;10828:120;;;10867:79;;:::i;:::-;10828:120;10987:1;11012:53;11057:7;11048:6;11037:9;11033:22;11012:53;:::i;:::-;11002:63;;10958:117;11114:2;11140:53;11185:7;11176:6;11165:9;11161:22;11140:53;:::i;:::-;11130:63;;11085:118;11242:2;11268:53;11313:7;11304:6;11293:9;11289:22;11268:53;:::i;:::-;11258:63;;11213:118;11398:2;11387:9;11383:18;11370:32;11429:18;11421:6;11418:30;11415:117;;;11451:79;;:::i;:::-;11415:117;11556:62;11610:7;11601:6;11590:9;11586:22;11556:62;:::i;:::-;11546:72;;11341:287;10692:943;;;;;;;:::o;11641:474::-;11709:6;11717;11766:2;11754:9;11745:7;11741:23;11737:32;11734:119;;;11772:79;;:::i;:::-;11734:119;11892:1;11917:53;11962:7;11953:6;11942:9;11938:22;11917:53;:::i;:::-;11907:63;;11863:117;12019:2;12045:53;12090:7;12081:6;12070:9;12066:22;12045:53;:::i;:::-;12035:63;;11990:118;11641:474;;;;;:::o;12121:180::-;12169:77;12166:1;12159:88;12266:4;12263:1;12256:15;12290:4;12287:1;12280:15;12307:320;12351:6;12388:1;12382:4;12378:12;12368:22;;12435:1;12429:4;12425:12;12456:18;12446:81;;12512:4;12504:6;12500:17;12490:27;;12446:81;12574:2;12566:6;12563:14;12543:18;12540:38;12537:84;;;12593:18;;:::i;:::-;12537:84;12358:269;12307:320;;;:::o;12633:182::-;12773:34;12769:1;12761:6;12757:14;12750:58;12633:182;:::o;12821:366::-;12963:3;12984:67;13048:2;13043:3;12984:67;:::i;:::-;12977:74;;13060:93;13149:3;13060:93;:::i;:::-;13178:2;13173:3;13169:12;13162:19;;12821:366;;;:::o;13193:419::-;13359:4;13397:2;13386:9;13382:18;13374:26;;13446:9;13440:4;13436:20;13432:1;13421:9;13417:17;13410:47;13474:131;13600:4;13474:131;:::i;:::-;13466:139;;13193:419;;;:::o;13618:147::-;13719:11;13756:3;13741:18;;13618:147;;;;:::o;13771:114::-;;:::o;13891:398::-;14050:3;14071:83;14152:1;14147:3;14071:83;:::i;:::-;14064:90;;14163:93;14252:3;14163:93;:::i;:::-;14281:1;14276:3;14272:11;14265:18;;13891:398;;;:::o;14295:379::-;14479:3;14501:147;14644:3;14501:147;:::i;:::-;14494:154;;14665:3;14658:10;;14295:379;;;:::o;14680:164::-;14820:16;14816:1;14808:6;14804:14;14797:40;14680:164;:::o;14850:366::-;14992:3;15013:67;15077:2;15072:3;15013:67;:::i;:::-;15006:74;;15089:93;15178:3;15089:93;:::i;:::-;15207:2;15202:3;15198:12;15191:19;;14850:366;;;:::o;15222:419::-;15388:4;15426:2;15415:9;15411:18;15403:26;;15475:9;15469:4;15465:20;15461:1;15450:9;15446:17;15439:47;15503:131;15629:4;15503:131;:::i;:::-;15495:139;;15222:419;;;:::o;15647:180::-;15695:77;15692:1;15685:88;15792:4;15789:1;15782:15;15816:4;15813:1;15806:15;15833:305;15873:3;15892:20;15910:1;15892:20;:::i;:::-;15887:25;;15926:20;15944:1;15926:20;:::i;:::-;15921:25;;16080:1;16012:66;16008:74;16005:1;16002:81;15999:107;;;16086:18;;:::i;:::-;15999:107;16130:1;16127;16123:9;16116:16;;15833:305;;;;:::o;16144:348::-;16184:7;16207:20;16225:1;16207:20;:::i;:::-;16202:25;;16241:20;16259:1;16241:20;:::i;:::-;16236:25;;16429:1;16361:66;16357:74;16354:1;16351:81;16346:1;16339:9;16332:17;16328:105;16325:131;;;16436:18;;:::i;:::-;16325:131;16484:1;16481;16477:9;16466:20;;16144:348;;;;:::o;16498:165::-;16638:17;16634:1;16626:6;16622:14;16615:41;16498:165;:::o;16669:366::-;16811:3;16832:67;16896:2;16891:3;16832:67;:::i;:::-;16825:74;;16908:93;16997:3;16908:93;:::i;:::-;17026:2;17021:3;17017:12;17010:19;;16669:366;;;:::o;17041:419::-;17207:4;17245:2;17234:9;17230:18;17222:26;;17294:9;17288:4;17284:20;17280:1;17269:9;17265:17;17258:47;17322:131;17448:4;17322:131;:::i;:::-;17314:139;;17041:419;;;:::o;17466:165::-;17606:17;17602:1;17594:6;17590:14;17583:41;17466:165;:::o;17637:366::-;17779:3;17800:67;17864:2;17859:3;17800:67;:::i;:::-;17793:74;;17876:93;17965:3;17876:93;:::i;:::-;17994:2;17989:3;17985:12;17978:19;;17637:366;;;:::o;18009:419::-;18175:4;18213:2;18202:9;18198:18;18190:26;;18262:9;18256:4;18252:20;18248:1;18237:9;18233:17;18226:47;18290:131;18416:4;18290:131;:::i;:::-;18282:139;;18009:419;;;:::o;18434:174::-;18574:26;18570:1;18562:6;18558:14;18551:50;18434:174;:::o;18614:366::-;18756:3;18777:67;18841:2;18836:3;18777:67;:::i;:::-;18770:74;;18853:93;18942:3;18853:93;:::i;:::-;18971:2;18966:3;18962:12;18955:19;;18614:366;;;:::o;18986:419::-;19152:4;19190:2;19179:9;19175:18;19167:26;;19239:9;19233:4;19229:20;19225:1;19214:9;19210:17;19203:47;19267:131;19393:4;19267:131;:::i;:::-;19259:139;;18986:419;;;:::o;19411:169::-;19551:21;19547:1;19539:6;19535:14;19528:45;19411:169;:::o;19586:366::-;19728:3;19749:67;19813:2;19808:3;19749:67;:::i;:::-;19742:74;;19825:93;19914:3;19825:93;:::i;:::-;19943:2;19938:3;19934:12;19927:19;;19586:366;;;:::o;19958:419::-;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:170::-;20523:22;20519:1;20511:6;20507:14;20500:46;20383:170;:::o;20559:366::-;20701:3;20722:67;20786:2;20781:3;20722:67;:::i;:::-;20715:74;;20798:93;20887:3;20798:93;:::i;:::-;20916:2;20911:3;20907:12;20900:19;;20559:366;;;:::o;20931:419::-;21097:4;21135:2;21124:9;21120:18;21112:26;;21184:9;21178:4;21174:20;21170:1;21159:9;21155:17;21148:47;21212:131;21338:4;21212:131;:::i;:::-;21204:139;;20931:419;;;:::o;21356:234::-;21496:34;21492:1;21484:6;21480:14;21473:58;21565:17;21560:2;21552:6;21548:15;21541:42;21356:234;:::o;21596:366::-;21738:3;21759:67;21823:2;21818:3;21759:67;:::i;:::-;21752:74;;21835:93;21924:3;21835:93;:::i;:::-;21953:2;21948:3;21944:12;21937:19;;21596:366;;;:::o;21968:419::-;22134:4;22172:2;22161:9;22157:18;22149:26;;22221:9;22215:4;22211:20;22207:1;22196:9;22192:17;22185:47;22249:131;22375:4;22249:131;:::i;:::-;22241:139;;21968:419;;;:::o;22393:148::-;22495:11;22532:3;22517:18;;22393:148;;;;:::o;22547:377::-;22653:3;22681:39;22714:5;22681:39;:::i;:::-;22736:89;22818:6;22813:3;22736:89;:::i;:::-;22729:96;;22834:52;22879:6;22874:3;22867:4;22860:5;22856:16;22834:52;:::i;:::-;22911:6;22906:3;22902:16;22895:23;;22657:267;22547:377;;;;:::o;22930:141::-;22979:4;23002:3;22994:11;;23025:3;23022:1;23015:14;23059:4;23056:1;23046:18;23038:26;;22930:141;;;:::o;23101:845::-;23204:3;23241:5;23235:12;23270:36;23296:9;23270:36;:::i;:::-;23322:89;23404:6;23399:3;23322:89;:::i;:::-;23315:96;;23442:1;23431:9;23427:17;23458:1;23453:137;;;;23604:1;23599:341;;;;23420:520;;23453:137;23537:4;23533:9;23522;23518:25;23513:3;23506:38;23573:6;23568:3;23564:16;23557:23;;23453:137;;23599:341;23666:38;23698:5;23666:38;:::i;:::-;23726:1;23740:154;23754:6;23751:1;23748:13;23740:154;;;23828:7;23822:14;23818:1;23813:3;23809:11;23802:35;23878:1;23869:7;23865:15;23854:26;;23776:4;23773:1;23769:12;23764:17;;23740:154;;;23923:6;23918:3;23914:16;23907:23;;23606:334;;23420:520;;23208:738;;23101:845;;;;:::o;23952:589::-;24177:3;24199:95;24290:3;24281:6;24199:95;:::i;:::-;24192:102;;24311:95;24402:3;24393:6;24311:95;:::i;:::-;24304:102;;24423:92;24511:3;24502:6;24423:92;:::i;:::-;24416:99;;24532:3;24525:10;;23952:589;;;;;;:::o;24547:225::-;24687:34;24683:1;24675:6;24671:14;24664:58;24756:8;24751:2;24743:6;24739:15;24732:33;24547:225;:::o;24778:366::-;24920:3;24941:67;25005:2;25000:3;24941:67;:::i;:::-;24934:74;;25017:93;25106:3;25017:93;:::i;:::-;25135:2;25130:3;25126:12;25119:19;;24778:366;;;:::o;25150:419::-;25316:4;25354:2;25343:9;25339:18;25331:26;;25403:9;25397:4;25393:20;25389:1;25378:9;25374:17;25367:47;25431:131;25557:4;25431:131;:::i;:::-;25423:139;;25150:419;;;:::o;25575:98::-;25626:6;25660:5;25654:12;25644:22;;25575:98;;;:::o;25679:168::-;25762:11;25796:6;25791:3;25784:19;25836:4;25831:3;25827:14;25812:29;;25679:168;;;;:::o;25853:360::-;25939:3;25967:38;25999:5;25967:38;:::i;:::-;26021:70;26084:6;26079:3;26021:70;:::i;:::-;26014:77;;26100:52;26145:6;26140:3;26133:4;26126:5;26122:16;26100:52;:::i;:::-;26177:29;26199:6;26177:29;:::i;:::-;26172:3;26168:39;26161:46;;25943:270;25853:360;;;;:::o;26219:640::-;26414:4;26452:3;26441:9;26437:19;26429:27;;26466:71;26534:1;26523:9;26519:17;26510:6;26466:71;:::i;:::-;26547:72;26615:2;26604:9;26600:18;26591:6;26547:72;:::i;:::-;26629;26697:2;26686:9;26682:18;26673:6;26629:72;:::i;:::-;26748:9;26742:4;26738:20;26733:2;26722:9;26718:18;26711:48;26776:76;26847:4;26838:6;26776:76;:::i;:::-;26768:84;;26219:640;;;;;;;:::o;26865:141::-;26921:5;26952:6;26946:13;26937:22;;26968:32;26994:5;26968:32;:::i;:::-;26865:141;;;;:::o;27012:349::-;27081:6;27130:2;27118:9;27109:7;27105:23;27101:32;27098:119;;;27136:79;;:::i;:::-;27098:119;27256:1;27281:63;27336:7;27327:6;27316:9;27312:22;27281:63;:::i;:::-;27271:73;;27227:127;27012:349;;;;:::o;27367:233::-;27406:3;27429:24;27447:5;27429:24;:::i;:::-;27420:33;;27475:66;27468:5;27465:77;27462:103;;;27545:18;;:::i;:::-;27462:103;27592:1;27585:5;27581:13;27574:20;;27367:233;;;:::o;27606:180::-;27654:77;27651:1;27644:88;27751:4;27748:1;27741:15;27775:4;27772:1;27765:15;27792:185;27832:1;27849:20;27867:1;27849:20;:::i;:::-;27844:25;;27883:20;27901:1;27883:20;:::i;:::-;27878:25;;27922:1;27912:35;;27927:18;;:::i;:::-;27912:35;27969:1;27966;27962:9;27957:14;;27792:185;;;;:::o;27983:191::-;28023:4;28043:20;28061:1;28043:20;:::i;:::-;28038:25;;28077:20;28095:1;28077:20;:::i;:::-;28072:25;;28116:1;28113;28110:8;28107:34;;;28121:18;;:::i;:::-;28107:34;28166:1;28163;28159:9;28151:17;;27983:191;;;;:::o;28180:176::-;28212:1;28229:20;28247:1;28229:20;:::i;:::-;28224:25;;28263:20;28281:1;28263:20;:::i;:::-;28258:25;;28302:1;28292:35;;28307:18;;:::i;:::-;28292:35;28348:1;28345;28341:9;28336:14;;28180:176;;;;:::o;28362:180::-;28410:77;28407:1;28400:88;28507:4;28504:1;28497:15;28531:4;28528:1;28521:15

Swarm Source

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