ETH Price: $2,422.72 (-0.96%)
 

Overview

Max Total Supply

1,712 YNFT

Holders

130

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A

Other Info

Balance
6 YNFT
0x6B5E5E61EBC2F6cD90A7009404c43DF4876b99fd
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:
YaShogun

Compiler Version
v0.8.11+commit.d7f03943

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

// Sources flattened with hardhat v2.10.0 https://hardhat.org

// File @openzeppelin/contracts/utils/introspection/[email protected]

// 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/token/ERC721/[email protected]

// OpenZeppelin Contracts (last updated v4.7.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 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/[email protected]

// 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/[email protected]

// 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 @openzeppelin/contracts/token/ERC721/[email protected]

// 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/[email protected]

// OpenZeppelin Contracts (last updated v4.7.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
                /// @solidity memory-safe-assembly
                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}


// File @openzeppelin/contracts/utils/[email protected]

// 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/utils/[email protected]

// OpenZeppelin Contracts (last updated v4.7.0) (utils/Strings.sol)

pragma solidity ^0.8.0;

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

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

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

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

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

    /**
     * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation.
     */
    function toHexString(address addr) internal pure returns (string memory) {
        return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH);
    }
}


// File @openzeppelin/contracts/utils/introspection/[email protected]

// 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 erc721a/contracts/[email protected]

// 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 @openzeppelin/contracts/utils/[email protected]

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

pragma solidity ^0.8.0;

/**
 * @title Counters
 * @author Matt Condon (@shrugs)
 * @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number
 * of elements in a mapping, issuing ERC721 ids, or counting request ids.
 *
 * Include with `using Counters for Counters.Counter;`
 */
library Counters {
    struct Counter {
        // This variable should never be directly accessed by users of the library: interactions must be restricted to
        // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add
        // this feature: see https://github.com/ethereum/solidity/issues/4637
        uint256 _value; // default: 0
    }

    function current(Counter storage counter) internal view returns (uint256) {
        return counter._value;
    }

    function increment(Counter storage counter) internal {
        unchecked {
            counter._value += 1;
        }
    }

    function decrement(Counter storage counter) internal {
        uint256 value = counter._value;
        require(value > 0, "Counter: decrement overflow");
        unchecked {
            counter._value = value - 1;
        }
    }

    function reset(Counter storage counter) internal {
        counter._value = 0;
    }
}


// File @openzeppelin/contracts/access/[email protected]

// OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol)

pragma solidity ^0.8.0;

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

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

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

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        _checkOwner();
        _;
    }

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

    /**
     * @dev Throws if the sender is not the owner.
     */
    function _checkOwner() internal view virtual {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
    }

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

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

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


// File contracts/YaShogun.sol
/// @author zscarabsz
/// @title YaShogun - Yasha NFT (genesis)
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.11;  
contract YaShogun is ERC721A , Ownable{  
    constructor() ERC721A("YaShogun", "YNFT") {}  

    using Counters for Counters.Counter;
    using Strings for uint256;

    address payable private _PaymentAddress = payable(0x48f8C548B0370426f4a62BdBbceA6a4bD2AdE7a8);

    Counters.Counter private _publicYNFT;
    uint256 private _YNFT_MAX = 2222;
    uint256 private _activeDateTime = 1665446400; 
    string private _tokenBaseURI = "";
    string private _revealURI = "https://ipfs.io/ipfs/QmYCqKkRNqaQfvkD8jAczZqBQq9EyZWUHou1yu4sYvgA4A";
    
    uint256 private PRESALE_PRICE = 0.025 ether;   // .025
    uint256 private PUBLIC_PRICE = 0.05 ether;	  // .05
    uint256 private REVEAL_DELAY = 96 hours;
    uint256 private PRESALE_HOURS = 72 hours;
    uint256 private PRESALE_MINT_LIMIT = 10;
	uint256 private PUBLIC_MINT_LIMIT = 10;

    mapping(address => bool) private _mappingWhiteList;
    mapping(address => uint256) private _mappingPresaleMintCount;
	mapping(address => uint256) private _mappingPublicMintCount;
	
	function setMaxMintAmount(uint256 maxAmount) external onlyOwner {
        _YNFT_MAX = maxAmount;
    }

    function setPaymentAddress(address paymentAddress) external onlyOwner {
        _PaymentAddress = payable(paymentAddress);
    }

    function setActiveDateTime(uint256 activeDateTime, uint256 presaleHours, uint256 revealDelay) external onlyOwner {
        _activeDateTime = activeDateTime;
        REVEAL_DELAY = revealDelay;
        PRESALE_HOURS = presaleHours;
    }

    function setWhiteList(address[] memory whiteListAddress, bool bEnable) external onlyOwner {
        for (uint256 i = 0; i < whiteListAddress.length; i++) {
            _mappingWhiteList[whiteListAddress[i]] = bEnable;
        }
    }

    function isWhiteListed(address addr) public view returns (bool) {
        return _mappingWhiteList[addr];
    }

    function setMintPrice(uint256 presaleMintPrice, uint256 publicMintPrice) external onlyOwner {
        PRESALE_PRICE = presaleMintPrice; 
        PUBLIC_PRICE = publicMintPrice; 
    }

    function setMintMaxLimit(uint256 presaleMintLimit, uint256 publicsaleMintLimit) external onlyOwner {
        PRESALE_MINT_LIMIT = presaleMintLimit;
		PUBLIC_MINT_LIMIT = publicsaleMintLimit;
    }
	
	function getPresaleMintMaxLimit() public view returns (uint256) {
		return PRESALE_MINT_LIMIT;
	}
	
	function getPublicsaleMintMaxLimit() public view returns (uint256) {
		return PUBLIC_MINT_LIMIT;
	}
	
	function getMintMax() public view returns (uint256) {
		return _YNFT_MAX;
	}
	
	function setURIs(string memory revealURI, string memory baseURI) external onlyOwner {
        _revealURI = revealURI;
		_tokenBaseURI = baseURI;
    }
	
    function tokenURI(uint256 tokenId) public view override(ERC721A) returns (string memory) {
        require(_exists(tokenId), "Token does not exist");

        if (_activeDateTime + REVEAL_DELAY < block.timestamp) {
            return string(abi.encodePacked(_tokenBaseURI, tokenId.toString()));
        }
        return _revealURI;
    }

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

    function price() public view returns (uint256) {
		return (block.timestamp < _activeDateTime)? PRESALE_PRICE : PUBLIC_PRICE;
    }
	
	function isPresaleMintActive() public view returns (bool) {
		if (isPublicMintActive() == true) {
			return false;
		}
		return (block.timestamp > _activeDateTime - PRESALE_HOURS)? true : false;
	}
	
	function isPublicMintActive() public view returns (bool) {
		return (block.timestamp > _activeDateTime)? true : false;
	}

    function adminMint(uint256 adminMintAmt) external onlyOwner {
		require(_publicYNFT.current() + adminMintAmt < _YNFT_MAX, "Purchase would exceed _YNFT_MAX");
		
		for (uint256 i = 0; i < adminMintAmt; i++) {
			_publicYNFT.increment();
		}
        _safeMint(msg.sender, adminMintAmt);
    }

    function purchase(uint256 numberOfTokens) external payable {
        require(msg.sender != owner(), "You are owner!");
        require(price() * numberOfTokens <= msg.value, "ETH amount is not sufficient");
        require(_publicYNFT.current() + numberOfTokens <= _YNFT_MAX, "Purchase would exceed _YNFT_MAX");

        if (block.timestamp < _activeDateTime) {
            require(_mappingWhiteList[msg.sender] == true, "Not registered to WhiteList");   
            require(block.timestamp > _activeDateTime - PRESALE_HOURS , "Mint is not activated for presale");
            require(_mappingPresaleMintCount[msg.sender] + numberOfTokens <= PRESALE_MINT_LIMIT, "Overflow for PRESALE_MINT_LIMIT");
            _mappingPresaleMintCount[msg.sender] = _mappingPresaleMintCount[msg.sender] + numberOfTokens;
        }
		else {
			require(block.timestamp > _activeDateTime, "Mint is not activated for public sale");
			require(numberOfTokens <= PUBLIC_MINT_LIMIT, "Amount to high for single transaction");
			require(_mappingPublicMintCount[msg.sender] + numberOfTokens <= PUBLIC_MINT_LIMIT, "Overflow for PUBLIC_MINT_LIMIT");
			_mappingPublicMintCount[msg.sender] = _mappingPublicMintCount[msg.sender] + numberOfTokens;
		}

        for(uint256 i =0;i<numberOfTokens;i++){
            _publicYNFT.increment();
        }
		_PaymentAddress.transfer(msg.value);
        _safeMint(msg.sender, numberOfTokens);
    }   

}

Contract Security Audit

Contract ABI

[{"inputs":[],"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":"uint256","name":"adminMintAmt","type":"uint256"}],"name":"adminMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getMintMax","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getPresaleMintMaxLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getPublicsaleMintMaxLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isPresaleMintActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isPublicMintActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"isWhiteListed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"price","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"numberOfTokens","type":"uint256"}],"name":"purchase","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"activeDateTime","type":"uint256"},{"internalType":"uint256","name":"presaleHours","type":"uint256"},{"internalType":"uint256","name":"revealDelay","type":"uint256"}],"name":"setActiveDateTime","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":"uint256","name":"maxAmount","type":"uint256"}],"name":"setMaxMintAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"presaleMintLimit","type":"uint256"},{"internalType":"uint256","name":"publicsaleMintLimit","type":"uint256"}],"name":"setMintMaxLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"presaleMintPrice","type":"uint256"},{"internalType":"uint256","name":"publicMintPrice","type":"uint256"}],"name":"setMintPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"paymentAddress","type":"address"}],"name":"setPaymentAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"revealURI","type":"string"},{"internalType":"string","name":"baseURI","type":"string"}],"name":"setURIs","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"whiteListAddress","type":"address[]"},{"internalType":"bool","name":"bEnable","type":"bool"}],"name":"setWhiteList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040527348f8c548b0370426f4a62bdbbcea6a4bd2ade7a8600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506108ae600b55636344b200600c5560405180602001604052806000815250600d90805190602001906200008e929190620002ac565b506040518060800160405280604381526020016200423d60439139600e9080519060200190620000c0929190620002ac565b506658d15e17628000600f5566b1a2bc2ec50000601055620546006011556203f480601255600a601355600a601455348015620000fc57600080fd5b506040518060400160405280600881526020017f596153686f67756e0000000000000000000000000000000000000000000000008152506040518060400160405280600481526020017f594e465400000000000000000000000000000000000000000000000000000000815250816002908051906020019062000181929190620002ac565b5080600390805190602001906200019a929190620002ac565b50620001ab620001d960201b60201c565b6000819055505050620001d3620001c7620001de60201b60201c565b620001e660201b60201c565b620003c1565b600090565b600033905090565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b828054620002ba906200038b565b90600052602060002090601f016020900481019282620002de57600085556200032a565b82601f10620002f957805160ff19168380011785556200032a565b828001600101855582156200032a579182015b82811115620003295782518255916020019190600101906200030c565b5b5090506200033991906200033d565b5090565b5b80821115620003585760008160009055506001016200033e565b5090565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680620003a457607f821691505b60208210811415620003bb57620003ba6200035c565b5b50919050565b613e6c80620003d16000396000f3fe6080604052600436106101f95760003560e01c8063715018a61161010d578063c1f26123116100a0578063e43f696e1161006f578063e43f696e1461070b578063e825417414610734578063e985e9c51461075d578063efef39a11461079a578063f2fde38b146107b6576101f9565b8063c1f2612314610651578063c55581981461067a578063c87b56dd146106a5578063d42f21f6146106e2576101f9565b80639791e389116100dc5780639791e389146105ab578063a035b1fe146105d4578063a22cb465146105ff578063b88d4fde14610628576101f9565b8063715018a6146105135780638da5cb5b1461052a578063928dd6e31461055557806395d89b4114610580576101f9565b806323b872dd1161019057806342842e0e1161015f57806342842e0e1461040a5780635e1e1004146104335780636352211e1461045c5780636f9170f61461049957806370a08231146104d6576101f9565b806323b872dd146103745780632483ada01461039d5780632d6b6224146103c85780633ccfd60b146103f3576101f9565b8063088a4ed0116101cc578063088a4ed0146102cc578063095ea7b3146102f557806318160ddd1461031e5780631e51e4a114610349576101f9565b806301ffc9a7146101fe5780630442bfa81461023b57806306fdde0314610264578063081812fc1461028f575b600080fd5b34801561020a57600080fd5b5061022560048036038101906102209190612c13565b6107df565b6040516102329190612c5b565b60405180910390f35b34801561024757600080fd5b50610262600480360381019061025d9190612cac565b6108c1565b005b34801561027057600080fd5b506102796108db565b6040516102869190612d85565b60405180910390f35b34801561029b57600080fd5b506102b660048036038101906102b19190612da7565b61096d565b6040516102c39190612e15565b60405180910390f35b3480156102d857600080fd5b506102f360048036038101906102ee9190612da7565b6109e9565b005b34801561030157600080fd5b5061031c60048036038101906103179190612e5c565b6109fb565b005b34801561032a57600080fd5b50610333610b00565b6040516103409190612eab565b60405180910390f35b34801561035557600080fd5b5061035e610b17565b60405161036b9190612eab565b60405180910390f35b34801561038057600080fd5b5061039b60048036038101906103969190612ec6565b610b21565b005b3480156103a957600080fd5b506103b2610b31565b6040516103bf9190612eab565b60405180910390f35b3480156103d457600080fd5b506103dd610b3b565b6040516103ea9190612c5b565b60405180910390f35b3480156103ff57600080fd5b50610408610b55565b005b34801561041657600080fd5b50610431600480360381019061042c9190612ec6565b610bac565b005b34801561043f57600080fd5b5061045a60048036038101906104559190612f19565b610bcc565b005b34801561046857600080fd5b50610483600480360381019061047e9190612da7565b610c18565b6040516104909190612e15565b60405180910390f35b3480156104a557600080fd5b506104c060048036038101906104bb9190612f19565b610c2e565b6040516104cd9190612c5b565b60405180910390f35b3480156104e257600080fd5b506104fd60048036038101906104f89190612f19565b610c84565b60405161050a9190612eab565b60405180910390f35b34801561051f57600080fd5b50610528610d54565b005b34801561053657600080fd5b5061053f610d68565b60405161054c9190612e15565b60405180910390f35b34801561056157600080fd5b5061056a610d92565b6040516105779190612eab565b60405180910390f35b34801561058c57600080fd5b50610595610d9c565b6040516105a29190612d85565b60405180910390f35b3480156105b757600080fd5b506105d260048036038101906105cd9190612f46565b610e2e565b005b3480156105e057600080fd5b506105e9610e50565b6040516105f69190612eab565b60405180910390f35b34801561060b57600080fd5b5061062660048036038101906106219190612fc5565b610e6c565b005b34801561063457600080fd5b5061064f600480360381019061064a919061313a565b610fe4565b005b34801561065d57600080fd5b5061067860048036038101906106739190612da7565b61105c565b005b34801561068657600080fd5b5061068f6110f2565b60405161069c9190612c5b565b60405180910390f35b3480156106b157600080fd5b506106cc60048036038101906106c79190612da7565b611137565b6040516106d99190612d85565b60405180910390f35b3480156106ee57600080fd5b5061070960048036038101906107049190612cac565b61125d565b005b34801561071757600080fd5b50610732600480360381019061072d9190613285565b611277565b005b34801561074057600080fd5b5061075b60048036038101906107569190613382565b611314565b005b34801561076957600080fd5b50610784600480360381019061077f91906133fa565b61134e565b6040516107919190612c5b565b60405180910390f35b6107b460048036038101906107af9190612da7565b6113e2565b005b3480156107c257600080fd5b506107dd60048036038101906107d89190612f19565b61195c565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806108aa57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806108ba57506108b9826119e0565b5b9050919050565b6108c9611a4a565b81600f81905550806010819055505050565b6060600280546108ea90613469565b80601f016020809104026020016040519081016040528092919081815260200182805461091690613469565b80156109635780601f1061093857610100808354040283529160200191610963565b820191906000526020600020905b81548152906001019060200180831161094657829003601f168201915b5050505050905090565b600061097882611ac8565b6109ae576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6109f1611a4a565b80600b8190555050565b6000610a0682610c18565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610a6e576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610a8d611b16565b73ffffffffffffffffffffffffffffffffffffffff1614610af057610ab981610ab4611b16565b61134e565b610aef576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b610afb838383611b1e565b505050565b6000610b0a611bd0565b6001546000540303905090565b6000600b54905090565b610b2c838383611bd5565b505050565b6000601354905090565b6000600c544211610b4d576000610b50565b60015b905090565b610b5d611a4a565b60004790503373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015610ba8573d6000803e3d6000fd5b5050565b610bc783838360405180602001604052806000815250610fe4565b505050565b610bd4611a4a565b80600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000610c238261208b565b600001519050919050565b6000601560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610cec576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b610d5c611a4a565b610d666000612316565b565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6000601454905090565b606060038054610dab90613469565b80601f0160208091040260200160405190810160405280929190818152602001828054610dd790613469565b8015610e245780601f10610df957610100808354040283529160200191610e24565b820191906000526020600020905b815481529060010190602001808311610e0757829003601f168201915b5050505050905090565b610e36611a4a565b82600c819055508060118190555081601281905550505050565b6000600c544210610e6357601054610e67565b600f545b905090565b610e74611b16565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610ed9576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060076000610ee6611b16565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16610f93611b16565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051610fd89190612c5b565b60405180910390a35050565b610fef848484611bd5565b61100e8373ffffffffffffffffffffffffffffffffffffffff166123dc565b156110565761101f848484846123ff565b611055576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b611064611a4a565b600b5481611072600a612550565b61107c91906134ca565b106110bc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110b39061356c565b60405180910390fd5b60005b818110156110e4576110d1600a61255e565b80806110dc9061358c565b9150506110bf565b506110ef3382612574565b50565b600060011515611100610b3b565b151514156111115760009050611134565b601254600c5461112191906135d5565b421161112e576000611131565b60015b90505b90565b606061114282611ac8565b611181576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161117890613655565b60405180910390fd5b42601154600c5461119291906134ca565b10156111ca57600d6111a383612592565b6040516020016111b4929190613745565b6040516020818303038152906040529050611258565b600e80546111d790613469565b80601f016020809104026020016040519081016040528092919081815260200182805461120390613469565b80156112505780601f1061122557610100808354040283529160200191611250565b820191906000526020600020905b81548152906001019060200180831161123357829003601f168201915b505050505090505b919050565b611265611a4a565b81601381905550806014819055505050565b61127f611a4a565b60005b825181101561130f5781601560008584815181106112a3576112a2613769565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555080806113079061358c565b915050611282565b505050565b61131c611a4a565b81600e9080519060200190611332929190612ac1565b5080600d9080519060200190611349929190612ac1565b505050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6113ea610d68565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415611458576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161144f906137e4565b60405180910390fd5b3481611462610e50565b61146c9190613804565b11156114ad576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114a4906138aa565b60405180910390fd5b600b54816114bb600a612550565b6114c591906134ca565b1115611506576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114fd9061356c565b60405180910390fd5b600c544210156117165760011515601560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515146115a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161159a90613916565b60405180910390fd5b601254600c546115b391906135d5565b42116115f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115eb906139a8565b60405180910390fd5b60135481601660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461164291906134ca565b1115611683576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161167a90613a14565b60405180910390fd5b80601660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546116ce91906134ca565b601660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506118bd565b600c54421161175a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161175190613aa6565b60405180910390fd5b60145481111561179f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161179690613b38565b60405180910390fd5b60145481601760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546117ed91906134ca565b111561182e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161182590613ba4565b60405180910390fd5b80601760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461187991906134ca565b601760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b60005b818110156118e5576118d2600a61255e565b80806118dd9061358c565b9150506118c0565b50600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc349081150290604051600060405180830381858888f1935050505015801561194e573d6000803e3d6000fd5b506119593382612574565b50565b611964611a4a565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156119d4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119cb90613c36565b60405180910390fd5b6119dd81612316565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b611a52611b16565b73ffffffffffffffffffffffffffffffffffffffff16611a70610d68565b73ffffffffffffffffffffffffffffffffffffffff1614611ac6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611abd90613ca2565b60405180910390fd5b565b600081611ad3611bd0565b11158015611ae2575060005482105b8015611b0f575060046000838152602001908152602001600020600001601c9054906101000a900460ff16155b9050919050565b600033905090565b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b600090565b6000611be08261208b565b90508373ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614611c4b576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff16611c6c611b16565b73ffffffffffffffffffffffffffffffffffffffff161480611c9b5750611c9a85611c95611b16565b61134e565b5b80611ce05750611ca9611b16565b73ffffffffffffffffffffffffffffffffffffffff16611cc88461096d565b73ffffffffffffffffffffffffffffffffffffffff16145b905080611d19576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415611d80576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611d8d85858560016126f3565b611d9960008487611b1e565b6001600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506001600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600460008581526020019081526020016000209050848160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550428160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060006001850190506000600460008381526020019081526020016000209050600073ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141561201957600054821461201857878160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555084602001518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b505050828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461208485858560016126f9565b5050505050565b612093612b47565b6000829050806120a1611bd0565b116122df576000548110156122de576000600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff161515151581525050905080604001516122dc57600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16146121c0578092505050612311565b5b6001156122db57818060019003925050600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16146122d6578092505050612311565b6121c1565b5b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612425611b16565b8786866040518563ffffffff1660e01b81526004016124479493929190613d17565b6020604051808303816000875af192505050801561248357506040513d601f19601f820116820180604052508101906124809190613d78565b60015b6124fd573d80600081146124b3576040519150601f19603f3d011682016040523d82523d6000602084013e6124b8565b606091505b506000815114156124f5576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b600081600001549050919050565b6001816000016000828254019250508190555050565b61258e8282604051806020016040528060008152506126ff565b5050565b606060008214156125da576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506126ee565b600082905060005b6000821461260c5780806125f59061358c565b915050600a826126059190613dd4565b91506125e2565b60008167ffffffffffffffff8111156126285761262761300f565b5b6040519080825280601f01601f19166020018201604052801561265a5781602001600182028036833780820191505090505b5090505b600085146126e75760018261267391906135d5565b9150600a856126829190613e05565b603061268e91906134ca565b60f81b8183815181106126a4576126a3613769565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856126e09190613dd4565b945061265e565b8093505050505b919050565b50505050565b50505050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16141561276c576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008314156127a7576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6127b460008583866126f3565b82600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555082600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550836004600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426004600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000819050600084820190506129758673ffffffffffffffffffffffffffffffffffffffff166123dc565b15612a3a575b818673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46129ea60008784806001019550876123ff565b612a20576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80821061297b578260005414612a3557600080fd5b612aa5565b5b818060010192508673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4808210612a3b575b816000819055505050612abb60008583866126f9565b50505050565b828054612acd90613469565b90600052602060002090601f016020900481019282612aef5760008555612b36565b82601f10612b0857805160ff1916838001178555612b36565b82800160010185558215612b36579182015b82811115612b35578251825591602001919060010190612b1a565b5b509050612b439190612b8a565b5090565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681526020016000151581525090565b5b80821115612ba3576000816000905550600101612b8b565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b612bf081612bbb565b8114612bfb57600080fd5b50565b600081359050612c0d81612be7565b92915050565b600060208284031215612c2957612c28612bb1565b5b6000612c3784828501612bfe565b91505092915050565b60008115159050919050565b612c5581612c40565b82525050565b6000602082019050612c706000830184612c4c565b92915050565b6000819050919050565b612c8981612c76565b8114612c9457600080fd5b50565b600081359050612ca681612c80565b92915050565b60008060408385031215612cc357612cc2612bb1565b5b6000612cd185828601612c97565b9250506020612ce285828601612c97565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612d26578082015181840152602081019050612d0b565b83811115612d35576000848401525b50505050565b6000601f19601f8301169050919050565b6000612d5782612cec565b612d618185612cf7565b9350612d71818560208601612d08565b612d7a81612d3b565b840191505092915050565b60006020820190508181036000830152612d9f8184612d4c565b905092915050565b600060208284031215612dbd57612dbc612bb1565b5b6000612dcb84828501612c97565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612dff82612dd4565b9050919050565b612e0f81612df4565b82525050565b6000602082019050612e2a6000830184612e06565b92915050565b612e3981612df4565b8114612e4457600080fd5b50565b600081359050612e5681612e30565b92915050565b60008060408385031215612e7357612e72612bb1565b5b6000612e8185828601612e47565b9250506020612e9285828601612c97565b9150509250929050565b612ea581612c76565b82525050565b6000602082019050612ec06000830184612e9c565b92915050565b600080600060608486031215612edf57612ede612bb1565b5b6000612eed86828701612e47565b9350506020612efe86828701612e47565b9250506040612f0f86828701612c97565b9150509250925092565b600060208284031215612f2f57612f2e612bb1565b5b6000612f3d84828501612e47565b91505092915050565b600080600060608486031215612f5f57612f5e612bb1565b5b6000612f6d86828701612c97565b9350506020612f7e86828701612c97565b9250506040612f8f86828701612c97565b9150509250925092565b612fa281612c40565b8114612fad57600080fd5b50565b600081359050612fbf81612f99565b92915050565b60008060408385031215612fdc57612fdb612bb1565b5b6000612fea85828601612e47565b9250506020612ffb85828601612fb0565b9150509250929050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61304782612d3b565b810181811067ffffffffffffffff821117156130665761306561300f565b5b80604052505050565b6000613079612ba7565b9050613085828261303e565b919050565b600067ffffffffffffffff8211156130a5576130a461300f565b5b6130ae82612d3b565b9050602081019050919050565b82818337600083830152505050565b60006130dd6130d88461308a565b61306f565b9050828152602081018484840111156130f9576130f861300a565b5b6131048482856130bb565b509392505050565b600082601f83011261312157613120613005565b5b81356131318482602086016130ca565b91505092915050565b6000806000806080858703121561315457613153612bb1565b5b600061316287828801612e47565b945050602061317387828801612e47565b935050604061318487828801612c97565b925050606085013567ffffffffffffffff8111156131a5576131a4612bb6565b5b6131b18782880161310c565b91505092959194509250565b600067ffffffffffffffff8211156131d8576131d761300f565b5b602082029050602081019050919050565b600080fd5b60006132016131fc846131bd565b61306f565b90508083825260208201905060208402830185811115613224576132236131e9565b5b835b8181101561324d57806132398882612e47565b845260208401935050602081019050613226565b5050509392505050565b600082601f83011261326c5761326b613005565b5b813561327c8482602086016131ee565b91505092915050565b6000806040838503121561329c5761329b612bb1565b5b600083013567ffffffffffffffff8111156132ba576132b9612bb6565b5b6132c685828601613257565b92505060206132d785828601612fb0565b9150509250929050565b600067ffffffffffffffff8211156132fc576132fb61300f565b5b61330582612d3b565b9050602081019050919050565b6000613325613320846132e1565b61306f565b9050828152602081018484840111156133415761334061300a565b5b61334c8482856130bb565b509392505050565b600082601f83011261336957613368613005565b5b8135613379848260208601613312565b91505092915050565b6000806040838503121561339957613398612bb1565b5b600083013567ffffffffffffffff8111156133b7576133b6612bb6565b5b6133c385828601613354565b925050602083013567ffffffffffffffff8111156133e4576133e3612bb6565b5b6133f085828601613354565b9150509250929050565b6000806040838503121561341157613410612bb1565b5b600061341f85828601612e47565b925050602061343085828601612e47565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061348157607f821691505b602082108114156134955761349461343a565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006134d582612c76565b91506134e083612c76565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156135155761351461349b565b5b828201905092915050565b7f507572636861736520776f756c6420657863656564205f594e46545f4d415800600082015250565b6000613556601f83612cf7565b915061356182613520565b602082019050919050565b6000602082019050818103600083015261358581613549565b9050919050565b600061359782612c76565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156135ca576135c961349b565b5b600182019050919050565b60006135e082612c76565b91506135eb83612c76565b9250828210156135fe576135fd61349b565b5b828203905092915050565b7f546f6b656e20646f6573206e6f74206578697374000000000000000000000000600082015250565b600061363f601483612cf7565b915061364a82613609565b602082019050919050565b6000602082019050818103600083015261366e81613632565b9050919050565b600081905092915050565b60008190508160005260206000209050919050565b600081546136a281613469565b6136ac8186613675565b945060018216600081146136c757600181146136d85761370b565b60ff1983168652818601935061370b565b6136e185613680565b60005b83811015613703578154818901526001820191506020810190506136e4565b838801955050505b50505092915050565b600061371f82612cec565b6137298185613675565b9350613739818560208601612d08565b80840191505092915050565b60006137518285613695565b915061375d8284613714565b91508190509392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f596f7520617265206f776e657221000000000000000000000000000000000000600082015250565b60006137ce600e83612cf7565b91506137d982613798565b602082019050919050565b600060208201905081810360008301526137fd816137c1565b9050919050565b600061380f82612c76565b915061381a83612c76565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156138535761385261349b565b5b828202905092915050565b7f45544820616d6f756e74206973206e6f742073756666696369656e7400000000600082015250565b6000613894601c83612cf7565b915061389f8261385e565b602082019050919050565b600060208201905081810360008301526138c381613887565b9050919050565b7f4e6f74207265676973746572656420746f2057686974654c6973740000000000600082015250565b6000613900601b83612cf7565b915061390b826138ca565b602082019050919050565b6000602082019050818103600083015261392f816138f3565b9050919050565b7f4d696e74206973206e6f742061637469766174656420666f722070726573616c60008201527f6500000000000000000000000000000000000000000000000000000000000000602082015250565b6000613992602183612cf7565b915061399d82613936565b604082019050919050565b600060208201905081810360008301526139c181613985565b9050919050565b7f4f766572666c6f7720666f722050524553414c455f4d494e545f4c494d495400600082015250565b60006139fe601f83612cf7565b9150613a09826139c8565b602082019050919050565b60006020820190508181036000830152613a2d816139f1565b9050919050565b7f4d696e74206973206e6f742061637469766174656420666f72207075626c696360008201527f2073616c65000000000000000000000000000000000000000000000000000000602082015250565b6000613a90602583612cf7565b9150613a9b82613a34565b604082019050919050565b60006020820190508181036000830152613abf81613a83565b9050919050565b7f416d6f756e7420746f206869676820666f722073696e676c65207472616e736160008201527f6374696f6e000000000000000000000000000000000000000000000000000000602082015250565b6000613b22602583612cf7565b9150613b2d82613ac6565b604082019050919050565b60006020820190508181036000830152613b5181613b15565b9050919050565b7f4f766572666c6f7720666f72205055424c49435f4d494e545f4c494d49540000600082015250565b6000613b8e601e83612cf7565b9150613b9982613b58565b602082019050919050565b60006020820190508181036000830152613bbd81613b81565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000613c20602683612cf7565b9150613c2b82613bc4565b604082019050919050565b60006020820190508181036000830152613c4f81613c13565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000613c8c602083612cf7565b9150613c9782613c56565b602082019050919050565b60006020820190508181036000830152613cbb81613c7f565b9050919050565b600081519050919050565b600082825260208201905092915050565b6000613ce982613cc2565b613cf38185613ccd565b9350613d03818560208601612d08565b613d0c81612d3b565b840191505092915050565b6000608082019050613d2c6000830187612e06565b613d396020830186612e06565b613d466040830185612e9c565b8181036060830152613d588184613cde565b905095945050505050565b600081519050613d7281612be7565b92915050565b600060208284031215613d8e57613d8d612bb1565b5b6000613d9c84828501613d63565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000613ddf82612c76565b9150613dea83612c76565b925082613dfa57613df9613da5565b5b828204905092915050565b6000613e1082612c76565b9150613e1b83612c76565b925082613e2b57613e2a613da5565b5b82820690509291505056fea26469706673582212205d5d11dcebc9d358593e89f712d94790a362a2c346147d69ed7a74f38420dd5264736f6c634300080b003368747470733a2f2f697066732e696f2f697066732f516d5943714b6b524e71615166766b44386a41637a5a714251713945795a5755486f753179753473597667413441

Deployed Bytecode

0x6080604052600436106101f95760003560e01c8063715018a61161010d578063c1f26123116100a0578063e43f696e1161006f578063e43f696e1461070b578063e825417414610734578063e985e9c51461075d578063efef39a11461079a578063f2fde38b146107b6576101f9565b8063c1f2612314610651578063c55581981461067a578063c87b56dd146106a5578063d42f21f6146106e2576101f9565b80639791e389116100dc5780639791e389146105ab578063a035b1fe146105d4578063a22cb465146105ff578063b88d4fde14610628576101f9565b8063715018a6146105135780638da5cb5b1461052a578063928dd6e31461055557806395d89b4114610580576101f9565b806323b872dd1161019057806342842e0e1161015f57806342842e0e1461040a5780635e1e1004146104335780636352211e1461045c5780636f9170f61461049957806370a08231146104d6576101f9565b806323b872dd146103745780632483ada01461039d5780632d6b6224146103c85780633ccfd60b146103f3576101f9565b8063088a4ed0116101cc578063088a4ed0146102cc578063095ea7b3146102f557806318160ddd1461031e5780631e51e4a114610349576101f9565b806301ffc9a7146101fe5780630442bfa81461023b57806306fdde0314610264578063081812fc1461028f575b600080fd5b34801561020a57600080fd5b5061022560048036038101906102209190612c13565b6107df565b6040516102329190612c5b565b60405180910390f35b34801561024757600080fd5b50610262600480360381019061025d9190612cac565b6108c1565b005b34801561027057600080fd5b506102796108db565b6040516102869190612d85565b60405180910390f35b34801561029b57600080fd5b506102b660048036038101906102b19190612da7565b61096d565b6040516102c39190612e15565b60405180910390f35b3480156102d857600080fd5b506102f360048036038101906102ee9190612da7565b6109e9565b005b34801561030157600080fd5b5061031c60048036038101906103179190612e5c565b6109fb565b005b34801561032a57600080fd5b50610333610b00565b6040516103409190612eab565b60405180910390f35b34801561035557600080fd5b5061035e610b17565b60405161036b9190612eab565b60405180910390f35b34801561038057600080fd5b5061039b60048036038101906103969190612ec6565b610b21565b005b3480156103a957600080fd5b506103b2610b31565b6040516103bf9190612eab565b60405180910390f35b3480156103d457600080fd5b506103dd610b3b565b6040516103ea9190612c5b565b60405180910390f35b3480156103ff57600080fd5b50610408610b55565b005b34801561041657600080fd5b50610431600480360381019061042c9190612ec6565b610bac565b005b34801561043f57600080fd5b5061045a60048036038101906104559190612f19565b610bcc565b005b34801561046857600080fd5b50610483600480360381019061047e9190612da7565b610c18565b6040516104909190612e15565b60405180910390f35b3480156104a557600080fd5b506104c060048036038101906104bb9190612f19565b610c2e565b6040516104cd9190612c5b565b60405180910390f35b3480156104e257600080fd5b506104fd60048036038101906104f89190612f19565b610c84565b60405161050a9190612eab565b60405180910390f35b34801561051f57600080fd5b50610528610d54565b005b34801561053657600080fd5b5061053f610d68565b60405161054c9190612e15565b60405180910390f35b34801561056157600080fd5b5061056a610d92565b6040516105779190612eab565b60405180910390f35b34801561058c57600080fd5b50610595610d9c565b6040516105a29190612d85565b60405180910390f35b3480156105b757600080fd5b506105d260048036038101906105cd9190612f46565b610e2e565b005b3480156105e057600080fd5b506105e9610e50565b6040516105f69190612eab565b60405180910390f35b34801561060b57600080fd5b5061062660048036038101906106219190612fc5565b610e6c565b005b34801561063457600080fd5b5061064f600480360381019061064a919061313a565b610fe4565b005b34801561065d57600080fd5b5061067860048036038101906106739190612da7565b61105c565b005b34801561068657600080fd5b5061068f6110f2565b60405161069c9190612c5b565b60405180910390f35b3480156106b157600080fd5b506106cc60048036038101906106c79190612da7565b611137565b6040516106d99190612d85565b60405180910390f35b3480156106ee57600080fd5b5061070960048036038101906107049190612cac565b61125d565b005b34801561071757600080fd5b50610732600480360381019061072d9190613285565b611277565b005b34801561074057600080fd5b5061075b60048036038101906107569190613382565b611314565b005b34801561076957600080fd5b50610784600480360381019061077f91906133fa565b61134e565b6040516107919190612c5b565b60405180910390f35b6107b460048036038101906107af9190612da7565b6113e2565b005b3480156107c257600080fd5b506107dd60048036038101906107d89190612f19565b61195c565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806108aa57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806108ba57506108b9826119e0565b5b9050919050565b6108c9611a4a565b81600f81905550806010819055505050565b6060600280546108ea90613469565b80601f016020809104026020016040519081016040528092919081815260200182805461091690613469565b80156109635780601f1061093857610100808354040283529160200191610963565b820191906000526020600020905b81548152906001019060200180831161094657829003601f168201915b5050505050905090565b600061097882611ac8565b6109ae576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6109f1611a4a565b80600b8190555050565b6000610a0682610c18565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610a6e576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610a8d611b16565b73ffffffffffffffffffffffffffffffffffffffff1614610af057610ab981610ab4611b16565b61134e565b610aef576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b610afb838383611b1e565b505050565b6000610b0a611bd0565b6001546000540303905090565b6000600b54905090565b610b2c838383611bd5565b505050565b6000601354905090565b6000600c544211610b4d576000610b50565b60015b905090565b610b5d611a4a565b60004790503373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015610ba8573d6000803e3d6000fd5b5050565b610bc783838360405180602001604052806000815250610fe4565b505050565b610bd4611a4a565b80600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000610c238261208b565b600001519050919050565b6000601560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610cec576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b610d5c611a4a565b610d666000612316565b565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6000601454905090565b606060038054610dab90613469565b80601f0160208091040260200160405190810160405280929190818152602001828054610dd790613469565b8015610e245780601f10610df957610100808354040283529160200191610e24565b820191906000526020600020905b815481529060010190602001808311610e0757829003601f168201915b5050505050905090565b610e36611a4a565b82600c819055508060118190555081601281905550505050565b6000600c544210610e6357601054610e67565b600f545b905090565b610e74611b16565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610ed9576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060076000610ee6611b16565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16610f93611b16565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051610fd89190612c5b565b60405180910390a35050565b610fef848484611bd5565b61100e8373ffffffffffffffffffffffffffffffffffffffff166123dc565b156110565761101f848484846123ff565b611055576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b611064611a4a565b600b5481611072600a612550565b61107c91906134ca565b106110bc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110b39061356c565b60405180910390fd5b60005b818110156110e4576110d1600a61255e565b80806110dc9061358c565b9150506110bf565b506110ef3382612574565b50565b600060011515611100610b3b565b151514156111115760009050611134565b601254600c5461112191906135d5565b421161112e576000611131565b60015b90505b90565b606061114282611ac8565b611181576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161117890613655565b60405180910390fd5b42601154600c5461119291906134ca565b10156111ca57600d6111a383612592565b6040516020016111b4929190613745565b6040516020818303038152906040529050611258565b600e80546111d790613469565b80601f016020809104026020016040519081016040528092919081815260200182805461120390613469565b80156112505780601f1061122557610100808354040283529160200191611250565b820191906000526020600020905b81548152906001019060200180831161123357829003601f168201915b505050505090505b919050565b611265611a4a565b81601381905550806014819055505050565b61127f611a4a565b60005b825181101561130f5781601560008584815181106112a3576112a2613769565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555080806113079061358c565b915050611282565b505050565b61131c611a4a565b81600e9080519060200190611332929190612ac1565b5080600d9080519060200190611349929190612ac1565b505050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6113ea610d68565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415611458576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161144f906137e4565b60405180910390fd5b3481611462610e50565b61146c9190613804565b11156114ad576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114a4906138aa565b60405180910390fd5b600b54816114bb600a612550565b6114c591906134ca565b1115611506576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114fd9061356c565b60405180910390fd5b600c544210156117165760011515601560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515146115a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161159a90613916565b60405180910390fd5b601254600c546115b391906135d5565b42116115f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115eb906139a8565b60405180910390fd5b60135481601660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461164291906134ca565b1115611683576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161167a90613a14565b60405180910390fd5b80601660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546116ce91906134ca565b601660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506118bd565b600c54421161175a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161175190613aa6565b60405180910390fd5b60145481111561179f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161179690613b38565b60405180910390fd5b60145481601760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546117ed91906134ca565b111561182e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161182590613ba4565b60405180910390fd5b80601760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461187991906134ca565b601760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b60005b818110156118e5576118d2600a61255e565b80806118dd9061358c565b9150506118c0565b50600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc349081150290604051600060405180830381858888f1935050505015801561194e573d6000803e3d6000fd5b506119593382612574565b50565b611964611a4a565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156119d4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119cb90613c36565b60405180910390fd5b6119dd81612316565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b611a52611b16565b73ffffffffffffffffffffffffffffffffffffffff16611a70610d68565b73ffffffffffffffffffffffffffffffffffffffff1614611ac6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611abd90613ca2565b60405180910390fd5b565b600081611ad3611bd0565b11158015611ae2575060005482105b8015611b0f575060046000838152602001908152602001600020600001601c9054906101000a900460ff16155b9050919050565b600033905090565b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b600090565b6000611be08261208b565b90508373ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614611c4b576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff16611c6c611b16565b73ffffffffffffffffffffffffffffffffffffffff161480611c9b5750611c9a85611c95611b16565b61134e565b5b80611ce05750611ca9611b16565b73ffffffffffffffffffffffffffffffffffffffff16611cc88461096d565b73ffffffffffffffffffffffffffffffffffffffff16145b905080611d19576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415611d80576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611d8d85858560016126f3565b611d9960008487611b1e565b6001600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506001600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600460008581526020019081526020016000209050848160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550428160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060006001850190506000600460008381526020019081526020016000209050600073ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141561201957600054821461201857878160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555084602001518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b505050828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461208485858560016126f9565b5050505050565b612093612b47565b6000829050806120a1611bd0565b116122df576000548110156122de576000600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff161515151581525050905080604001516122dc57600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16146121c0578092505050612311565b5b6001156122db57818060019003925050600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16146122d6578092505050612311565b6121c1565b5b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612425611b16565b8786866040518563ffffffff1660e01b81526004016124479493929190613d17565b6020604051808303816000875af192505050801561248357506040513d601f19601f820116820180604052508101906124809190613d78565b60015b6124fd573d80600081146124b3576040519150601f19603f3d011682016040523d82523d6000602084013e6124b8565b606091505b506000815114156124f5576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b600081600001549050919050565b6001816000016000828254019250508190555050565b61258e8282604051806020016040528060008152506126ff565b5050565b606060008214156125da576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506126ee565b600082905060005b6000821461260c5780806125f59061358c565b915050600a826126059190613dd4565b91506125e2565b60008167ffffffffffffffff8111156126285761262761300f565b5b6040519080825280601f01601f19166020018201604052801561265a5781602001600182028036833780820191505090505b5090505b600085146126e75760018261267391906135d5565b9150600a856126829190613e05565b603061268e91906134ca565b60f81b8183815181106126a4576126a3613769565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856126e09190613dd4565b945061265e565b8093505050505b919050565b50505050565b50505050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16141561276c576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008314156127a7576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6127b460008583866126f3565b82600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555082600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550836004600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426004600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000819050600084820190506129758673ffffffffffffffffffffffffffffffffffffffff166123dc565b15612a3a575b818673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46129ea60008784806001019550876123ff565b612a20576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80821061297b578260005414612a3557600080fd5b612aa5565b5b818060010192508673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4808210612a3b575b816000819055505050612abb60008583866126f9565b50505050565b828054612acd90613469565b90600052602060002090601f016020900481019282612aef5760008555612b36565b82601f10612b0857805160ff1916838001178555612b36565b82800160010185558215612b36579182015b82811115612b35578251825591602001919060010190612b1a565b5b509050612b439190612b8a565b5090565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681526020016000151581525090565b5b80821115612ba3576000816000905550600101612b8b565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b612bf081612bbb565b8114612bfb57600080fd5b50565b600081359050612c0d81612be7565b92915050565b600060208284031215612c2957612c28612bb1565b5b6000612c3784828501612bfe565b91505092915050565b60008115159050919050565b612c5581612c40565b82525050565b6000602082019050612c706000830184612c4c565b92915050565b6000819050919050565b612c8981612c76565b8114612c9457600080fd5b50565b600081359050612ca681612c80565b92915050565b60008060408385031215612cc357612cc2612bb1565b5b6000612cd185828601612c97565b9250506020612ce285828601612c97565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612d26578082015181840152602081019050612d0b565b83811115612d35576000848401525b50505050565b6000601f19601f8301169050919050565b6000612d5782612cec565b612d618185612cf7565b9350612d71818560208601612d08565b612d7a81612d3b565b840191505092915050565b60006020820190508181036000830152612d9f8184612d4c565b905092915050565b600060208284031215612dbd57612dbc612bb1565b5b6000612dcb84828501612c97565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612dff82612dd4565b9050919050565b612e0f81612df4565b82525050565b6000602082019050612e2a6000830184612e06565b92915050565b612e3981612df4565b8114612e4457600080fd5b50565b600081359050612e5681612e30565b92915050565b60008060408385031215612e7357612e72612bb1565b5b6000612e8185828601612e47565b9250506020612e9285828601612c97565b9150509250929050565b612ea581612c76565b82525050565b6000602082019050612ec06000830184612e9c565b92915050565b600080600060608486031215612edf57612ede612bb1565b5b6000612eed86828701612e47565b9350506020612efe86828701612e47565b9250506040612f0f86828701612c97565b9150509250925092565b600060208284031215612f2f57612f2e612bb1565b5b6000612f3d84828501612e47565b91505092915050565b600080600060608486031215612f5f57612f5e612bb1565b5b6000612f6d86828701612c97565b9350506020612f7e86828701612c97565b9250506040612f8f86828701612c97565b9150509250925092565b612fa281612c40565b8114612fad57600080fd5b50565b600081359050612fbf81612f99565b92915050565b60008060408385031215612fdc57612fdb612bb1565b5b6000612fea85828601612e47565b9250506020612ffb85828601612fb0565b9150509250929050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61304782612d3b565b810181811067ffffffffffffffff821117156130665761306561300f565b5b80604052505050565b6000613079612ba7565b9050613085828261303e565b919050565b600067ffffffffffffffff8211156130a5576130a461300f565b5b6130ae82612d3b565b9050602081019050919050565b82818337600083830152505050565b60006130dd6130d88461308a565b61306f565b9050828152602081018484840111156130f9576130f861300a565b5b6131048482856130bb565b509392505050565b600082601f83011261312157613120613005565b5b81356131318482602086016130ca565b91505092915050565b6000806000806080858703121561315457613153612bb1565b5b600061316287828801612e47565b945050602061317387828801612e47565b935050604061318487828801612c97565b925050606085013567ffffffffffffffff8111156131a5576131a4612bb6565b5b6131b18782880161310c565b91505092959194509250565b600067ffffffffffffffff8211156131d8576131d761300f565b5b602082029050602081019050919050565b600080fd5b60006132016131fc846131bd565b61306f565b90508083825260208201905060208402830185811115613224576132236131e9565b5b835b8181101561324d57806132398882612e47565b845260208401935050602081019050613226565b5050509392505050565b600082601f83011261326c5761326b613005565b5b813561327c8482602086016131ee565b91505092915050565b6000806040838503121561329c5761329b612bb1565b5b600083013567ffffffffffffffff8111156132ba576132b9612bb6565b5b6132c685828601613257565b92505060206132d785828601612fb0565b9150509250929050565b600067ffffffffffffffff8211156132fc576132fb61300f565b5b61330582612d3b565b9050602081019050919050565b6000613325613320846132e1565b61306f565b9050828152602081018484840111156133415761334061300a565b5b61334c8482856130bb565b509392505050565b600082601f83011261336957613368613005565b5b8135613379848260208601613312565b91505092915050565b6000806040838503121561339957613398612bb1565b5b600083013567ffffffffffffffff8111156133b7576133b6612bb6565b5b6133c385828601613354565b925050602083013567ffffffffffffffff8111156133e4576133e3612bb6565b5b6133f085828601613354565b9150509250929050565b6000806040838503121561341157613410612bb1565b5b600061341f85828601612e47565b925050602061343085828601612e47565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061348157607f821691505b602082108114156134955761349461343a565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006134d582612c76565b91506134e083612c76565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156135155761351461349b565b5b828201905092915050565b7f507572636861736520776f756c6420657863656564205f594e46545f4d415800600082015250565b6000613556601f83612cf7565b915061356182613520565b602082019050919050565b6000602082019050818103600083015261358581613549565b9050919050565b600061359782612c76565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156135ca576135c961349b565b5b600182019050919050565b60006135e082612c76565b91506135eb83612c76565b9250828210156135fe576135fd61349b565b5b828203905092915050565b7f546f6b656e20646f6573206e6f74206578697374000000000000000000000000600082015250565b600061363f601483612cf7565b915061364a82613609565b602082019050919050565b6000602082019050818103600083015261366e81613632565b9050919050565b600081905092915050565b60008190508160005260206000209050919050565b600081546136a281613469565b6136ac8186613675565b945060018216600081146136c757600181146136d85761370b565b60ff1983168652818601935061370b565b6136e185613680565b60005b83811015613703578154818901526001820191506020810190506136e4565b838801955050505b50505092915050565b600061371f82612cec565b6137298185613675565b9350613739818560208601612d08565b80840191505092915050565b60006137518285613695565b915061375d8284613714565b91508190509392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f596f7520617265206f776e657221000000000000000000000000000000000000600082015250565b60006137ce600e83612cf7565b91506137d982613798565b602082019050919050565b600060208201905081810360008301526137fd816137c1565b9050919050565b600061380f82612c76565b915061381a83612c76565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156138535761385261349b565b5b828202905092915050565b7f45544820616d6f756e74206973206e6f742073756666696369656e7400000000600082015250565b6000613894601c83612cf7565b915061389f8261385e565b602082019050919050565b600060208201905081810360008301526138c381613887565b9050919050565b7f4e6f74207265676973746572656420746f2057686974654c6973740000000000600082015250565b6000613900601b83612cf7565b915061390b826138ca565b602082019050919050565b6000602082019050818103600083015261392f816138f3565b9050919050565b7f4d696e74206973206e6f742061637469766174656420666f722070726573616c60008201527f6500000000000000000000000000000000000000000000000000000000000000602082015250565b6000613992602183612cf7565b915061399d82613936565b604082019050919050565b600060208201905081810360008301526139c181613985565b9050919050565b7f4f766572666c6f7720666f722050524553414c455f4d494e545f4c494d495400600082015250565b60006139fe601f83612cf7565b9150613a09826139c8565b602082019050919050565b60006020820190508181036000830152613a2d816139f1565b9050919050565b7f4d696e74206973206e6f742061637469766174656420666f72207075626c696360008201527f2073616c65000000000000000000000000000000000000000000000000000000602082015250565b6000613a90602583612cf7565b9150613a9b82613a34565b604082019050919050565b60006020820190508181036000830152613abf81613a83565b9050919050565b7f416d6f756e7420746f206869676820666f722073696e676c65207472616e736160008201527f6374696f6e000000000000000000000000000000000000000000000000000000602082015250565b6000613b22602583612cf7565b9150613b2d82613ac6565b604082019050919050565b60006020820190508181036000830152613b5181613b15565b9050919050565b7f4f766572666c6f7720666f72205055424c49435f4d494e545f4c494d49540000600082015250565b6000613b8e601e83612cf7565b9150613b9982613b58565b602082019050919050565b60006020820190508181036000830152613bbd81613b81565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000613c20602683612cf7565b9150613c2b82613bc4565b604082019050919050565b60006020820190508181036000830152613c4f81613c13565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000613c8c602083612cf7565b9150613c9782613c56565b602082019050919050565b60006020820190508181036000830152613cbb81613c7f565b9050919050565b600081519050919050565b600082825260208201905092915050565b6000613ce982613cc2565b613cf38185613ccd565b9350613d03818560208601612d08565b613d0c81612d3b565b840191505092915050565b6000608082019050613d2c6000830187612e06565b613d396020830186612e06565b613d466040830185612e9c565b8181036060830152613d588184613cde565b905095945050505050565b600081519050613d7281612be7565b92915050565b600060208284031215613d8e57613d8d612bb1565b5b6000613d9c84828501613d63565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000613ddf82612c76565b9150613dea83612c76565b925082613dfa57613df9613da5565b5b828204905092915050565b6000613e1082612c76565b9150613e1b83612c76565b925082613e2b57613e2a613da5565b5b82820690509291505056fea26469706673582212205d5d11dcebc9d358593e89f712d94790a362a2c346147d69ed7a74f38420dd5264736f6c634300080b0033

Deployed Bytecode Sourcemap

49700:5498:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26548:305;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51614:186;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;29663:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31167:204;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50750:104;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;30729:372;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;25788:312;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52225:78;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32032:170;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52013:99;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53322:123;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52823:145;;;;;;;;;;;;;:::i;:::-;;32273:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50862:130;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;29471:125;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51493:113;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26917:206;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48720:103;;;;;;;;;;;;;:::i;:::-;;48072:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52118:101;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29832:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51000:240;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52976:132;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31443:287;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;32529:370;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53453:297;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53114:202;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52471:344;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51808:199;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51248:237;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52309:153;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;31801:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53758:1432;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48978:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;26548:305;26650:4;26702:25;26687:40;;;:11;:40;;;;:105;;;;26759:33;26744:48;;;:11;:48;;;;26687:105;:158;;;;26809:36;26833:11;26809:23;:36::i;:::-;26687:158;26667:178;;26548:305;;;:::o;51614:186::-;47958:13;:11;:13::i;:::-;51733:16:::1;51717:13;:32;;;;51776:15;51761:12;:30;;;;51614:186:::0;;:::o;29663:100::-;29717:13;29750:5;29743:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29663:100;:::o;31167:204::-;31235:7;31260:16;31268:7;31260;:16::i;:::-;31255:64;;31285:34;;;;;;;;;;;;;;31255:64;31339:15;:24;31355:7;31339:24;;;;;;;;;;;;;;;;;;;;;31332:31;;31167:204;;;:::o;50750:104::-;47958:13;:11;:13::i;:::-;50837:9:::1;50825;:21;;;;50750:104:::0;:::o;30729:372::-;30802:13;30818:24;30834:7;30818:15;:24::i;:::-;30802:40;;30863:5;30857:11;;:2;:11;;;30853:48;;;30877:24;;;;;;;;;;;;;;30853:48;30934:5;30918:21;;:12;:10;:12::i;:::-;:21;;;30914:139;;30945:37;30962:5;30969:12;:10;:12::i;:::-;30945:16;:37::i;:::-;30941:112;;31006:35;;;;;;;;;;;;;;30941:112;30914:139;31065:28;31074:2;31078:7;31087:5;31065:8;:28::i;:::-;30791:310;30729:372;;:::o;25788:312::-;25841:7;26066:15;:13;:15::i;:::-;26051:12;;26035:13;;:28;:46;26028:53;;25788:312;:::o;52225:78::-;52268:7;52289:9;;52282:16;;52225:78;:::o;32032:170::-;32166:28;32176:4;32182:2;32186:7;32166:9;:28::i;:::-;32032:170;;;:::o;52013:99::-;52068:7;52089:18;;52082:25;;52013:99;:::o;53322:123::-;53373:4;53410:15;;53392;:33;53391:49;;53435:5;53391:49;;;53428:4;53391:49;53384:56;;53322:123;:::o;52823:145::-;47958:13;:11;:13::i;:::-;52873:15:::1;52891:21;52873:39;;52931:10;52923:28;;:37;52952:7;52923:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;52862:106;52823:145::o:0;32273:185::-;32411:39;32428:4;32434:2;32438:7;32411:39;;;;;;;;;;;;:16;:39::i;:::-;32273:185;;;:::o;50862:130::-;47958:13;:11;:13::i;:::-;50969:14:::1;50943:15;;:41;;;;;;;;;;;;;;;;;;50862:130:::0;:::o;29471:125::-;29535:7;29562:21;29575:7;29562:12;:21::i;:::-;:26;;;29555:33;;29471:125;;;:::o;51493:113::-;51551:4;51575:17;:23;51593:4;51575:23;;;;;;;;;;;;;;;;;;;;;;;;;51568:30;;51493:113;;;:::o;26917:206::-;26981:7;27022:1;27005:19;;:5;:19;;;27001:60;;;27033:28;;;;;;;;;;;;;;27001:60;27087:12;:19;27100:5;27087:19;;;;;;;;;;;;;;;:27;;;;;;;;;;;;27079:36;;27072:43;;26917:206;;;:::o;48720:103::-;47958:13;:11;:13::i;:::-;48785:30:::1;48812:1;48785:18;:30::i;:::-;48720:103::o:0;48072:87::-;48118:7;48145:6;;;;;;;;;;;48138:13;;48072:87;:::o;52118:101::-;52176:7;52197:17;;52190:24;;52118:101;:::o;29832:104::-;29888:13;29921:7;29914:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29832:104;:::o;51000:240::-;47958:13;:11;:13::i;:::-;51142:14:::1;51124:15;:32;;;;51182:11;51167:12;:26;;;;51220:12;51204:13;:28;;;;51000:240:::0;;;:::o;52976:132::-;53014:7;53054:15;;53036;:33;53035:65;;53088:12;;53035:65;;;53072:13;;53035:65;53028:72;;52976:132;:::o;31443:287::-;31554:12;:10;:12::i;:::-;31542:24;;:8;:24;;;31538:54;;;31575:17;;;;;;;;;;;;;;31538:54;31650:8;31605:18;:32;31624:12;:10;:12::i;:::-;31605:32;;;;;;;;;;;;;;;:42;31638:8;31605:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;31703:8;31674:48;;31689:12;:10;:12::i;:::-;31674:48;;;31713:8;31674:48;;;;;;:::i;:::-;;;;;;;;31443:287;;:::o;32529:370::-;32696:28;32706:4;32712:2;32716:7;32696:9;:28::i;:::-;32739:15;:2;:13;;;:15::i;:::-;32735:157;;;32760:56;32791:4;32797:2;32801:7;32810:5;32760:30;:56::i;:::-;32756:136;;32840:40;;;;;;;;;;;;;;32756:136;32735:157;32529:370;;;;:::o;53453:297::-;47958:13;:11;:13::i;:::-;53565:9:::1;;53550:12;53526:21;:11;:19;:21::i;:::-;:36;;;;:::i;:::-;:48;53518:92;;;;;;;;;;;;:::i;:::-;;;;;;;;;53624:9;53619:78;53643:12;53639:1;:16;53619:78;;;53668:23;:11;:21;:23::i;:::-;53657:3;;;;;:::i;:::-;;;;53619:78;;;;53707:35;53717:10;53729:12;53707:9;:35::i;:::-;53453:297:::0;:::o;53114:202::-;53166:4;53205;53181:28;;:20;:18;:20::i;:::-;:28;;;53177:58;;;53224:5;53217:12;;;;53177:58;53283:13;;53265:15;;:31;;;;:::i;:::-;53247:15;:49;53246:65;;53306:5;53246:65;;;53299:4;53246:65;53239:72;;53114:202;;:::o;52471:344::-;52545:13;52579:16;52587:7;52579;:16::i;:::-;52571:49;;;;;;;;;;;;:::i;:::-;;;;;;;;;52670:15;52655:12;;52637:15;;:30;;;;:::i;:::-;:48;52633:147;;;52733:13;52748:18;:7;:16;:18::i;:::-;52716:51;;;;;;;;;:::i;:::-;;;;;;;;;;;;;52702:66;;;;52633:147;52797:10;52790:17;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52471:344;;;;:::o;51808:199::-;47958:13;:11;:13::i;:::-;51939:16:::1;51918:18;:37;;;;51980:19;51960:17;:39;;;;51808:199:::0;;:::o;51248:237::-;47958:13;:11;:13::i;:::-;51354:9:::1;51349:129;51373:16;:23;51369:1;:27;51349:129;;;51459:7;51418:17;:38;51436:16;51453:1;51436:19;;;;;;;;:::i;:::-;;;;;;;;51418:38;;;;;;;;;;;;;;;;:48;;;;;;;;;;;;;;;;;;51398:3;;;;;:::i;:::-;;;;51349:129;;;;51248:237:::0;;:::o;52309:153::-;47958:13;:11;:13::i;:::-;52417:9:::1;52404:10;:22;;;;;;;;;;;;:::i;:::-;;52447:7;52431:13;:23;;;;;;;;;;;;:::i;:::-;;52309:153:::0;;:::o;31801:164::-;31898:4;31922:18;:25;31941:5;31922:25;;;;;;;;;;;;;;;:35;31948:8;31922:35;;;;;;;;;;;;;;;;;;;;;;;;;31915:42;;31801:164;;;;:::o;53758:1432::-;53850:7;:5;:7::i;:::-;53836:21;;:10;:21;;;;53828:48;;;;;;;;;;;;:::i;:::-;;;;;;;;;53923:9;53905:14;53895:7;:5;:7::i;:::-;:24;;;;:::i;:::-;:37;;53887:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;54026:9;;54008:14;53984:21;:11;:19;:21::i;:::-;:38;;;;:::i;:::-;:51;;53976:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;54106:15;;54088;:33;54084:911;;;54179:4;54146:37;;:17;:29;54164:10;54146:29;;;;;;;;;;;;;;;;;;;;;;;;;:37;;;54138:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;54277:13;;54259:15;;:31;;;;:::i;:::-;54241:15;:49;54233:96;;;;;;;;;;;;:::i;:::-;;;;;;;;;54409:18;;54391:14;54352:24;:36;54377:10;54352:36;;;;;;;;;;;;;;;;:53;;;;:::i;:::-;:75;;54344:119;;;;;;;;;;;;:::i;:::-;;;;;;;;;54556:14;54517:24;:36;54542:10;54517:36;;;;;;;;;;;;;;;;:53;;;;:::i;:::-;54478:24;:36;54503:10;54478:36;;;;;;;;;;;;;;;:92;;;;54084:911;;;54623:15;;54605;:33;54597:83;;;;;;;;;;;;:::i;:::-;;;;;;;;;54712:17;;54694:14;:35;;54686:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;54841:17;;54823:14;54785:23;:35;54809:10;54785:35;;;;;;;;;;;;;;;;:52;;;;:::i;:::-;:73;;54777:116;;;;;;;;;;;;:::i;:::-;;;;;;;;;54975:14;54937:23;:35;54961:10;54937:35;;;;;;;;;;;;;;;;:52;;;;:::i;:::-;54899:23;:35;54923:10;54899:35;;;;;;;;;;;;;;;:90;;;;54084:911;55011:9;55007:88;55026:14;55024:1;:16;55007:88;;;55060:23;:11;:21;:23::i;:::-;55041:3;;;;;:::i;:::-;;;;55007:88;;;;55099:15;;;;;;;;;;;:24;;:35;55124:9;55099:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55145:37;55155:10;55167:14;55145:9;:37::i;:::-;53758:1432;:::o;48978:201::-;47958:13;:11;:13::i;:::-;49087:1:::1;49067:22;;:8;:22;;;;49059:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;49143:28;49162:8;49143:18;:28::i;:::-;48978:201:::0;:::o;23531:157::-;23616:4;23655:25;23640:40;;;:11;:40;;;;23633:47;;23531:157;;;:::o;48237:132::-;48312:12;:10;:12::i;:::-;48301:23;;:7;:5;:7::i;:::-;:23;;;48293:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;48237:132::o;33154:174::-;33211:4;33254:7;33235:15;:13;:15::i;:::-;:26;;:53;;;;;33275:13;;33265:7;:23;33235:53;:85;;;;;33293:11;:20;33305:7;33293:20;;;;;;;;;;;:27;;;;;;;;;;;;33292:28;33235:85;33228:92;;33154:174;;;:::o;19945:98::-;19998:7;20025:10;20018:17;;19945:98;:::o;42376:196::-;42518:2;42491:15;:24;42507:7;42491:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;42556:7;42552:2;42536:28;;42545:5;42536:28;;;;;;;;;;;;42376:196;;;:::o;25562:92::-;25618:7;25562:92;:::o;37324:2130::-;37439:35;37477:21;37490:7;37477:12;:21::i;:::-;37439:59;;37537:4;37515:26;;:13;:18;;;:26;;;37511:67;;37550:28;;;;;;;;;;;;;;37511:67;37591:22;37633:4;37617:20;;:12;:10;:12::i;:::-;:20;;;:73;;;;37654:36;37671:4;37677:12;:10;:12::i;:::-;37654:16;:36::i;:::-;37617:73;:126;;;;37731:12;:10;:12::i;:::-;37707:36;;:20;37719:7;37707:11;:20::i;:::-;:36;;;37617:126;37591:153;;37762:17;37757:66;;37788:35;;;;;;;;;;;;;;37757:66;37852:1;37838:16;;:2;:16;;;37834:52;;;37863:23;;;;;;;;;;;;;;37834:52;37899:43;37921:4;37927:2;37931:7;37940:1;37899:21;:43::i;:::-;38007:35;38024:1;38028:7;38037:4;38007:8;:35::i;:::-;38368:1;38338:12;:18;38351:4;38338:18;;;;;;;;;;;;;;;:26;;;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38412:1;38384:12;:16;38397:2;38384:16;;;;;;;;;;;;;;;:24;;;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38430:31;38464:11;:20;38476:7;38464:20;;;;;;;;;;;38430:54;;38515:2;38499:8;:13;;;:18;;;;;;;;;;;;;;;;;;38565:15;38532:8;:23;;;:49;;;;;;;;;;;;;;;;;;38833:19;38865:1;38855:7;:11;38833:33;;38881:31;38915:11;:24;38927:11;38915:24;;;;;;;;;;;38881:58;;38983:1;38958:27;;:8;:13;;;;;;;;;;;;:27;;;38954:384;;;39168:13;;39153:11;:28;39149:174;;39222:4;39206:8;:13;;;:20;;;;;;;;;;;;;;;;;;39275:13;:28;;;39249:8;:23;;;:54;;;;;;;;;;;;;;;;;;39149:174;38954:384;38313:1036;;;39385:7;39381:2;39366:27;;39375:4;39366:27;;;;;;;;;;;;39404:42;39425:4;39431:2;39435:7;39444:1;39404:20;:42::i;:::-;37428:2026;;37324:2130;;;:::o;28298:1111::-;28360:21;;:::i;:::-;28394:12;28409:7;28394:22;;28477:4;28458:15;:13;:15::i;:::-;:23;28454:888;;28494:13;;28487:4;:20;28483:859;;;28528:31;28562:11;:17;28574:4;28562:17;;;;;;;;;;;28528:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28603:9;:16;;;28598:729;;28674:1;28648:28;;:9;:14;;;:28;;;28644:101;;28712:9;28705:16;;;;;;28644:101;29047:261;29054:4;29047:261;;;29087:6;;;;;;;;29132:11;:17;29144:4;29132:17;;;;;;;;;;;29120:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29206:1;29180:28;;:9;:14;;;:28;;;29176:109;;29248:9;29241:16;;;;;;29176:109;29047:261;;;28598:729;28509:833;28483:859;28454:888;29370:31;;;;;;;;;;;;;;28298:1111;;;;:::o;49339:191::-;49413:16;49432:6;;;;;;;;;;;49413:25;;49458:8;49449:6;;:17;;;;;;;;;;;;;;;;;;49513:8;49482:40;;49503:8;49482:40;;;;;;;;;;;;49402:128;49339:191;:::o;11940:326::-;12000:4;12257:1;12235:7;:19;;;:23;12228:30;;11940:326;;;:::o;43064:667::-;43227:4;43264:2;43248:36;;;43285:12;:10;:12::i;:::-;43299:4;43305:7;43314:5;43248:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;43244:480;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43499:1;43482:6;:13;:18;43478:235;;;43528:40;;;;;;;;;;;;;;43478:235;43671:6;43665:13;43656:6;43652:2;43648:15;43641:38;43244:480;43377:45;;;43367:55;;;:6;:55;;;;43360:62;;;43064:667;;;;;;:::o;46240:114::-;46305:7;46332;:14;;;46325:21;;46240:114;;;:::o;46362:127::-;46469:1;46451:7;:14;;;:19;;;;;;;;;;;46362:127;:::o;33412:104::-;33481:27;33491:2;33495:8;33481:27;;;;;;;;;;;;:9;:27::i;:::-;33412:104;;:::o;20595:723::-;20651:13;20881:1;20872:5;:10;20868:53;;;20899:10;;;;;;;;;;;;;;;;;;;;;20868:53;20931:12;20946:5;20931:20;;20962:14;20987:78;21002:1;20994:4;:9;20987:78;;21020:8;;;;;:::i;:::-;;;;21051:2;21043:10;;;;;:::i;:::-;;;20987:78;;;21075:19;21107:6;21097:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21075:39;;21125:154;21141:1;21132:5;:10;21125:154;;21169:1;21159:11;;;;;:::i;:::-;;;21236:2;21228:5;:10;;;;:::i;:::-;21215:2;:24;;;;:::i;:::-;21202:39;;21185:6;21192;21185:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;21265:2;21256:11;;;;;:::i;:::-;;;21125:154;;;21303:6;21289:21;;;;;20595:723;;;;:::o;44379:159::-;;;;;:::o;45197:158::-;;;;;:::o;33889:1749::-;34012:20;34035:13;;34012:36;;34077:1;34063:16;;:2;:16;;;34059:48;;;34088:19;;;;;;;;;;;;;;34059:48;34134:1;34122:8;:13;34118:44;;;34144:18;;;;;;;;;;;;;;34118:44;34175:61;34205:1;34209:2;34213:12;34227:8;34175:21;:61::i;:::-;34548:8;34513:12;:16;34526:2;34513:16;;;;;;;;;;;;;;;:24;;;:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34612:8;34572:12;:16;34585:2;34572:16;;;;;;;;;;;;;;;:29;;;:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34671:2;34638:11;:25;34650:12;34638:25;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;34738:15;34688:11;:25;34700:12;34688:25;;;;;;;;;;;:40;;;:66;;;;;;;;;;;;;;;;;;34771:20;34794:12;34771:35;;34821:11;34850:8;34835:12;:23;34821:37;;34879:15;:2;:13;;;:15::i;:::-;34875:631;;;34915:313;34971:12;34967:2;34946:38;;34963:1;34946:38;;;;;;;;;;;;35012:69;35051:1;35055:2;35059:14;;;;;;35075:5;35012:30;:69::i;:::-;35007:174;;35117:40;;;;;;;;;;;;;;35007:174;35223:3;35208:12;:18;34915:313;;35309:12;35292:13;;:29;35288:43;;35323:8;;;35288:43;34875:631;;;35372:119;35428:14;;;;;;35424:2;35403:40;;35420:1;35403:40;;;;;;;;;;;;35486:3;35471:12;:18;35372:119;;34875:631;35536:12;35520:13;:28;;;;34488:1072;;35570:60;35599:1;35603:2;35607:12;35621:8;35570:20;:60::i;:::-;34001:1637;33889: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:77::-;1555:7;1584:5;1573:16;;1518:77;;;:::o;1601:122::-;1674:24;1692:5;1674:24;:::i;:::-;1667:5;1664:35;1654:63;;1713:1;1710;1703:12;1654:63;1601:122;:::o;1729:139::-;1775:5;1813:6;1800:20;1791:29;;1829:33;1856:5;1829:33;:::i;:::-;1729:139;;;;:::o;1874:474::-;1942:6;1950;1999:2;1987:9;1978:7;1974:23;1970:32;1967:119;;;2005:79;;:::i;:::-;1967:119;2125:1;2150:53;2195:7;2186:6;2175:9;2171:22;2150:53;:::i;:::-;2140:63;;2096:117;2252:2;2278:53;2323:7;2314:6;2303:9;2299:22;2278:53;:::i;:::-;2268:63;;2223:118;1874:474;;;;;:::o;2354:99::-;2406:6;2440:5;2434:12;2424:22;;2354:99;;;:::o;2459:169::-;2543:11;2577:6;2572:3;2565:19;2617:4;2612:3;2608:14;2593:29;;2459:169;;;;:::o;2634:307::-;2702:1;2712:113;2726:6;2723:1;2720:13;2712:113;;;2811:1;2806:3;2802:11;2796:18;2792:1;2787:3;2783:11;2776:39;2748:2;2745:1;2741:10;2736:15;;2712:113;;;2843:6;2840:1;2837:13;2834:101;;;2923:1;2914:6;2909:3;2905:16;2898:27;2834:101;2683:258;2634:307;;;:::o;2947:102::-;2988:6;3039:2;3035:7;3030:2;3023:5;3019:14;3015:28;3005:38;;2947:102;;;:::o;3055:364::-;3143:3;3171:39;3204:5;3171:39;:::i;:::-;3226:71;3290:6;3285:3;3226:71;:::i;:::-;3219:78;;3306:52;3351:6;3346:3;3339:4;3332:5;3328:16;3306:52;:::i;:::-;3383:29;3405:6;3383:29;:::i;:::-;3378:3;3374:39;3367:46;;3147:272;3055:364;;;;:::o;3425:313::-;3538:4;3576:2;3565:9;3561:18;3553:26;;3625:9;3619:4;3615:20;3611:1;3600:9;3596:17;3589:47;3653:78;3726:4;3717:6;3653:78;:::i;:::-;3645:86;;3425:313;;;;:::o;3744:329::-;3803:6;3852:2;3840:9;3831:7;3827:23;3823:32;3820:119;;;3858:79;;:::i;:::-;3820:119;3978:1;4003:53;4048:7;4039:6;4028:9;4024:22;4003:53;:::i;:::-;3993:63;;3949:117;3744:329;;;;:::o;4079:126::-;4116:7;4156:42;4149:5;4145:54;4134:65;;4079:126;;;:::o;4211:96::-;4248:7;4277:24;4295:5;4277:24;:::i;:::-;4266:35;;4211:96;;;:::o;4313:118::-;4400:24;4418:5;4400:24;:::i;:::-;4395:3;4388:37;4313:118;;:::o;4437:222::-;4530:4;4568:2;4557:9;4553:18;4545:26;;4581:71;4649:1;4638:9;4634:17;4625:6;4581:71;:::i;:::-;4437:222;;;;:::o;4665:122::-;4738:24;4756:5;4738:24;:::i;:::-;4731:5;4728:35;4718:63;;4777:1;4774;4767:12;4718:63;4665:122;:::o;4793:139::-;4839:5;4877:6;4864:20;4855:29;;4893:33;4920:5;4893:33;:::i;:::-;4793:139;;;;:::o;4938:474::-;5006:6;5014;5063:2;5051:9;5042:7;5038:23;5034:32;5031:119;;;5069:79;;:::i;:::-;5031:119;5189:1;5214:53;5259:7;5250:6;5239:9;5235:22;5214:53;:::i;:::-;5204:63;;5160:117;5316:2;5342:53;5387:7;5378:6;5367:9;5363:22;5342:53;:::i;:::-;5332:63;;5287:118;4938:474;;;;;:::o;5418:118::-;5505:24;5523:5;5505:24;:::i;:::-;5500:3;5493:37;5418:118;;:::o;5542:222::-;5635:4;5673:2;5662:9;5658:18;5650:26;;5686:71;5754:1;5743:9;5739:17;5730:6;5686:71;:::i;:::-;5542:222;;;;:::o;5770:619::-;5847:6;5855;5863;5912:2;5900:9;5891:7;5887:23;5883:32;5880:119;;;5918:79;;:::i;:::-;5880:119;6038:1;6063:53;6108:7;6099:6;6088:9;6084:22;6063:53;:::i;:::-;6053:63;;6009:117;6165:2;6191:53;6236:7;6227:6;6216:9;6212:22;6191:53;:::i;:::-;6181:63;;6136:118;6293:2;6319:53;6364:7;6355:6;6344:9;6340:22;6319:53;:::i;:::-;6309:63;;6264:118;5770:619;;;;;:::o;6395:329::-;6454:6;6503:2;6491:9;6482:7;6478:23;6474:32;6471:119;;;6509:79;;:::i;:::-;6471:119;6629:1;6654:53;6699:7;6690:6;6679:9;6675:22;6654:53;:::i;:::-;6644:63;;6600:117;6395:329;;;;:::o;6730:619::-;6807:6;6815;6823;6872:2;6860:9;6851:7;6847:23;6843:32;6840:119;;;6878:79;;:::i;:::-;6840:119;6998:1;7023:53;7068:7;7059:6;7048:9;7044:22;7023:53;:::i;:::-;7013:63;;6969:117;7125:2;7151:53;7196:7;7187:6;7176:9;7172:22;7151:53;:::i;:::-;7141:63;;7096:118;7253:2;7279:53;7324:7;7315:6;7304:9;7300:22;7279:53;:::i;:::-;7269:63;;7224:118;6730:619;;;;;:::o;7355:116::-;7425:21;7440:5;7425:21;:::i;:::-;7418:5;7415:32;7405:60;;7461:1;7458;7451:12;7405:60;7355:116;:::o;7477:133::-;7520:5;7558:6;7545:20;7536:29;;7574:30;7598:5;7574:30;:::i;:::-;7477:133;;;;:::o;7616:468::-;7681:6;7689;7738:2;7726:9;7717:7;7713:23;7709:32;7706:119;;;7744:79;;:::i;:::-;7706:119;7864:1;7889:53;7934:7;7925:6;7914:9;7910:22;7889:53;:::i;:::-;7879:63;;7835:117;7991:2;8017:50;8059:7;8050:6;8039:9;8035:22;8017:50;:::i;:::-;8007:60;;7962:115;7616:468;;;;;:::o;8090:117::-;8199:1;8196;8189:12;8213:117;8322:1;8319;8312:12;8336:180;8384:77;8381:1;8374:88;8481:4;8478:1;8471:15;8505:4;8502:1;8495:15;8522:281;8605:27;8627:4;8605:27;:::i;:::-;8597:6;8593:40;8735:6;8723:10;8720:22;8699:18;8687:10;8684:34;8681:62;8678:88;;;8746:18;;:::i;:::-;8678:88;8786:10;8782:2;8775:22;8565:238;8522:281;;:::o;8809:129::-;8843:6;8870:20;;:::i;:::-;8860:30;;8899:33;8927:4;8919:6;8899:33;:::i;:::-;8809:129;;;:::o;8944:307::-;9005:4;9095:18;9087:6;9084:30;9081:56;;;9117:18;;:::i;:::-;9081:56;9155:29;9177:6;9155:29;:::i;:::-;9147:37;;9239:4;9233;9229:15;9221:23;;8944:307;;;:::o;9257:154::-;9341:6;9336:3;9331;9318:30;9403:1;9394:6;9389:3;9385:16;9378:27;9257:154;;;:::o;9417:410::-;9494:5;9519:65;9535:48;9576:6;9535:48;:::i;:::-;9519:65;:::i;:::-;9510:74;;9607:6;9600:5;9593:21;9645:4;9638:5;9634:16;9683:3;9674:6;9669:3;9665:16;9662:25;9659:112;;;9690:79;;:::i;:::-;9659:112;9780:41;9814:6;9809:3;9804;9780:41;:::i;:::-;9500:327;9417:410;;;;;:::o;9846:338::-;9901:5;9950:3;9943:4;9935:6;9931:17;9927:27;9917:122;;9958:79;;:::i;:::-;9917:122;10075:6;10062:20;10100:78;10174:3;10166:6;10159:4;10151:6;10147:17;10100:78;:::i;:::-;10091:87;;9907:277;9846:338;;;;:::o;10190:943::-;10285:6;10293;10301;10309;10358:3;10346:9;10337:7;10333:23;10329:33;10326:120;;;10365:79;;:::i;:::-;10326:120;10485:1;10510:53;10555:7;10546:6;10535:9;10531:22;10510:53;:::i;:::-;10500:63;;10456:117;10612:2;10638:53;10683:7;10674:6;10663:9;10659:22;10638:53;:::i;:::-;10628:63;;10583:118;10740:2;10766:53;10811:7;10802:6;10791:9;10787:22;10766:53;:::i;:::-;10756:63;;10711:118;10896:2;10885:9;10881:18;10868:32;10927:18;10919:6;10916:30;10913:117;;;10949:79;;:::i;:::-;10913:117;11054:62;11108:7;11099:6;11088:9;11084:22;11054:62;:::i;:::-;11044:72;;10839:287;10190:943;;;;;;;:::o;11139:311::-;11216:4;11306:18;11298:6;11295:30;11292:56;;;11328:18;;:::i;:::-;11292:56;11378:4;11370:6;11366:17;11358:25;;11438:4;11432;11428:15;11420:23;;11139:311;;;:::o;11456:117::-;11565:1;11562;11555:12;11596:710;11692:5;11717:81;11733:64;11790:6;11733:64;:::i;:::-;11717:81;:::i;:::-;11708:90;;11818:5;11847:6;11840:5;11833:21;11881:4;11874:5;11870:16;11863:23;;11934:4;11926:6;11922:17;11914:6;11910:30;11963:3;11955:6;11952:15;11949:122;;;11982:79;;:::i;:::-;11949:122;12097:6;12080:220;12114:6;12109:3;12106:15;12080:220;;;12189:3;12218:37;12251:3;12239:10;12218:37;:::i;:::-;12213:3;12206:50;12285:4;12280:3;12276:14;12269:21;;12156:144;12140:4;12135:3;12131:14;12124:21;;12080:220;;;12084:21;11698:608;;11596:710;;;;;:::o;12329:370::-;12400:5;12449:3;12442:4;12434:6;12430:17;12426:27;12416:122;;12457:79;;:::i;:::-;12416:122;12574:6;12561:20;12599:94;12689:3;12681:6;12674:4;12666:6;12662:17;12599:94;:::i;:::-;12590:103;;12406:293;12329:370;;;;:::o;12705:678::-;12795:6;12803;12852:2;12840:9;12831:7;12827:23;12823:32;12820:119;;;12858:79;;:::i;:::-;12820:119;13006:1;12995:9;12991:17;12978:31;13036:18;13028:6;13025:30;13022:117;;;13058:79;;:::i;:::-;13022:117;13163:78;13233:7;13224:6;13213:9;13209:22;13163:78;:::i;:::-;13153:88;;12949:302;13290:2;13316:50;13358:7;13349:6;13338:9;13334:22;13316:50;:::i;:::-;13306:60;;13261:115;12705:678;;;;;:::o;13389:308::-;13451:4;13541:18;13533:6;13530:30;13527:56;;;13563:18;;:::i;:::-;13527:56;13601:29;13623:6;13601:29;:::i;:::-;13593:37;;13685:4;13679;13675:15;13667:23;;13389:308;;;:::o;13703:412::-;13781:5;13806:66;13822:49;13864:6;13822:49;:::i;:::-;13806:66;:::i;:::-;13797:75;;13895:6;13888:5;13881:21;13933:4;13926:5;13922:16;13971:3;13962:6;13957:3;13953:16;13950:25;13947:112;;;13978:79;;:::i;:::-;13947:112;14068:41;14102:6;14097:3;14092;14068:41;:::i;:::-;13787:328;13703:412;;;;;:::o;14135:340::-;14191:5;14240:3;14233:4;14225:6;14221:17;14217:27;14207:122;;14248:79;;:::i;:::-;14207:122;14365:6;14352:20;14390:79;14465:3;14457:6;14450:4;14442:6;14438:17;14390:79;:::i;:::-;14381:88;;14197:278;14135:340;;;;:::o;14481:834::-;14569:6;14577;14626:2;14614:9;14605:7;14601:23;14597:32;14594:119;;;14632:79;;:::i;:::-;14594:119;14780:1;14769:9;14765:17;14752:31;14810:18;14802:6;14799:30;14796:117;;;14832:79;;:::i;:::-;14796:117;14937:63;14992:7;14983:6;14972:9;14968:22;14937:63;:::i;:::-;14927:73;;14723:287;15077:2;15066:9;15062:18;15049:32;15108:18;15100:6;15097:30;15094:117;;;15130:79;;:::i;:::-;15094:117;15235:63;15290:7;15281:6;15270:9;15266:22;15235:63;:::i;:::-;15225:73;;15020:288;14481:834;;;;;:::o;15321:474::-;15389:6;15397;15446:2;15434:9;15425:7;15421:23;15417:32;15414:119;;;15452:79;;:::i;:::-;15414:119;15572:1;15597:53;15642:7;15633:6;15622:9;15618:22;15597:53;:::i;:::-;15587:63;;15543:117;15699:2;15725:53;15770:7;15761:6;15750:9;15746:22;15725:53;:::i;:::-;15715:63;;15670:118;15321:474;;;;;:::o;15801:180::-;15849:77;15846:1;15839:88;15946:4;15943:1;15936:15;15970:4;15967:1;15960:15;15987:320;16031:6;16068:1;16062:4;16058:12;16048:22;;16115:1;16109:4;16105:12;16136:18;16126:81;;16192:4;16184:6;16180:17;16170:27;;16126:81;16254:2;16246:6;16243:14;16223:18;16220:38;16217:84;;;16273:18;;:::i;:::-;16217:84;16038:269;15987:320;;;:::o;16313:180::-;16361:77;16358:1;16351:88;16458:4;16455:1;16448:15;16482:4;16479:1;16472:15;16499:305;16539:3;16558:20;16576:1;16558:20;:::i;:::-;16553:25;;16592:20;16610:1;16592:20;:::i;:::-;16587:25;;16746:1;16678:66;16674:74;16671:1;16668:81;16665:107;;;16752:18;;:::i;:::-;16665:107;16796:1;16793;16789:9;16782:16;;16499:305;;;;:::o;16810:181::-;16950:33;16946:1;16938:6;16934:14;16927:57;16810:181;:::o;16997:366::-;17139:3;17160:67;17224:2;17219:3;17160:67;:::i;:::-;17153:74;;17236:93;17325:3;17236:93;:::i;:::-;17354:2;17349:3;17345:12;17338:19;;16997:366;;;:::o;17369:419::-;17535:4;17573:2;17562:9;17558:18;17550:26;;17622:9;17616:4;17612:20;17608:1;17597:9;17593:17;17586:47;17650:131;17776:4;17650:131;:::i;:::-;17642:139;;17369:419;;;:::o;17794:233::-;17833:3;17856:24;17874:5;17856:24;:::i;:::-;17847:33;;17902:66;17895:5;17892:77;17889:103;;;17972:18;;:::i;:::-;17889:103;18019:1;18012:5;18008:13;18001:20;;17794:233;;;:::o;18033:191::-;18073:4;18093:20;18111:1;18093:20;:::i;:::-;18088:25;;18127:20;18145:1;18127:20;:::i;:::-;18122:25;;18166:1;18163;18160:8;18157:34;;;18171:18;;:::i;:::-;18157:34;18216:1;18213;18209:9;18201:17;;18033:191;;;;:::o;18230:170::-;18370:22;18366:1;18358:6;18354:14;18347:46;18230:170;:::o;18406:366::-;18548:3;18569:67;18633:2;18628:3;18569:67;:::i;:::-;18562:74;;18645:93;18734:3;18645:93;:::i;:::-;18763:2;18758:3;18754:12;18747:19;;18406:366;;;:::o;18778:419::-;18944:4;18982:2;18971:9;18967:18;18959:26;;19031:9;19025:4;19021:20;19017:1;19006:9;19002:17;18995:47;19059:131;19185:4;19059:131;:::i;:::-;19051:139;;18778:419;;;:::o;19203:148::-;19305:11;19342:3;19327:18;;19203:148;;;;:::o;19357:141::-;19406:4;19429:3;19421:11;;19452:3;19449:1;19442:14;19486:4;19483:1;19473:18;19465:26;;19357:141;;;:::o;19528:845::-;19631:3;19668:5;19662:12;19697:36;19723:9;19697:36;:::i;:::-;19749:89;19831:6;19826:3;19749:89;:::i;:::-;19742:96;;19869:1;19858:9;19854:17;19885:1;19880:137;;;;20031:1;20026:341;;;;19847:520;;19880:137;19964:4;19960:9;19949;19945:25;19940:3;19933:38;20000:6;19995:3;19991:16;19984:23;;19880:137;;20026:341;20093:38;20125:5;20093:38;:::i;:::-;20153:1;20167:154;20181:6;20178:1;20175:13;20167:154;;;20255:7;20249:14;20245:1;20240:3;20236:11;20229:35;20305:1;20296:7;20292:15;20281:26;;20203:4;20200:1;20196:12;20191:17;;20167:154;;;20350:6;20345:3;20341:16;20334:23;;20033:334;;19847:520;;19635:738;;19528:845;;;;:::o;20379:377::-;20485:3;20513:39;20546:5;20513:39;:::i;:::-;20568:89;20650:6;20645:3;20568:89;:::i;:::-;20561:96;;20666:52;20711:6;20706:3;20699:4;20692:5;20688:16;20666:52;:::i;:::-;20743:6;20738:3;20734:16;20727:23;;20489:267;20379:377;;;;:::o;20762:429::-;20939:3;20961:92;21049:3;21040:6;20961:92;:::i;:::-;20954:99;;21070:95;21161:3;21152:6;21070:95;:::i;:::-;21063:102;;21182:3;21175:10;;20762:429;;;;;:::o;21197:180::-;21245:77;21242:1;21235:88;21342:4;21339:1;21332:15;21366:4;21363:1;21356:15;21383:164;21523:16;21519:1;21511:6;21507:14;21500:40;21383:164;:::o;21553:366::-;21695:3;21716:67;21780:2;21775:3;21716:67;:::i;:::-;21709:74;;21792:93;21881:3;21792:93;:::i;:::-;21910:2;21905:3;21901:12;21894:19;;21553:366;;;:::o;21925:419::-;22091:4;22129:2;22118:9;22114:18;22106:26;;22178:9;22172:4;22168:20;22164:1;22153:9;22149:17;22142:47;22206:131;22332:4;22206:131;:::i;:::-;22198:139;;21925:419;;;:::o;22350:348::-;22390:7;22413:20;22431:1;22413:20;:::i;:::-;22408:25;;22447:20;22465:1;22447:20;:::i;:::-;22442:25;;22635:1;22567:66;22563:74;22560:1;22557:81;22552:1;22545:9;22538:17;22534:105;22531:131;;;22642:18;;:::i;:::-;22531:131;22690:1;22687;22683:9;22672:20;;22350:348;;;;:::o;22704:178::-;22844:30;22840:1;22832:6;22828:14;22821:54;22704:178;:::o;22888:366::-;23030:3;23051:67;23115:2;23110:3;23051:67;:::i;:::-;23044:74;;23127:93;23216:3;23127:93;:::i;:::-;23245:2;23240:3;23236:12;23229:19;;22888:366;;;:::o;23260:419::-;23426:4;23464:2;23453:9;23449:18;23441:26;;23513:9;23507:4;23503:20;23499:1;23488:9;23484:17;23477:47;23541:131;23667:4;23541:131;:::i;:::-;23533:139;;23260:419;;;:::o;23685:177::-;23825:29;23821:1;23813:6;23809:14;23802:53;23685:177;:::o;23868:366::-;24010:3;24031:67;24095:2;24090:3;24031:67;:::i;:::-;24024:74;;24107:93;24196:3;24107:93;:::i;:::-;24225:2;24220:3;24216:12;24209:19;;23868:366;;;:::o;24240:419::-;24406:4;24444:2;24433:9;24429:18;24421:26;;24493:9;24487:4;24483:20;24479:1;24468:9;24464:17;24457:47;24521:131;24647:4;24521:131;:::i;:::-;24513:139;;24240:419;;;:::o;24665:220::-;24805:34;24801:1;24793:6;24789:14;24782:58;24874:3;24869:2;24861:6;24857:15;24850:28;24665:220;:::o;24891:366::-;25033:3;25054:67;25118:2;25113:3;25054:67;:::i;:::-;25047:74;;25130:93;25219:3;25130:93;:::i;:::-;25248:2;25243:3;25239:12;25232:19;;24891:366;;;:::o;25263:419::-;25429:4;25467:2;25456:9;25452:18;25444:26;;25516:9;25510:4;25506:20;25502:1;25491:9;25487:17;25480:47;25544:131;25670:4;25544:131;:::i;:::-;25536:139;;25263:419;;;:::o;25688:181::-;25828:33;25824:1;25816:6;25812:14;25805:57;25688:181;:::o;25875:366::-;26017:3;26038:67;26102:2;26097:3;26038:67;:::i;:::-;26031:74;;26114:93;26203:3;26114:93;:::i;:::-;26232:2;26227:3;26223:12;26216:19;;25875:366;;;:::o;26247:419::-;26413:4;26451:2;26440:9;26436:18;26428:26;;26500:9;26494:4;26490:20;26486:1;26475:9;26471:17;26464:47;26528:131;26654:4;26528:131;:::i;:::-;26520:139;;26247:419;;;:::o;26672:224::-;26812:34;26808:1;26800:6;26796:14;26789:58;26881:7;26876:2;26868:6;26864:15;26857:32;26672:224;:::o;26902:366::-;27044:3;27065:67;27129:2;27124:3;27065:67;:::i;:::-;27058:74;;27141:93;27230:3;27141:93;:::i;:::-;27259:2;27254:3;27250:12;27243:19;;26902:366;;;:::o;27274:419::-;27440:4;27478:2;27467:9;27463:18;27455:26;;27527:9;27521:4;27517:20;27513:1;27502:9;27498:17;27491:47;27555:131;27681:4;27555:131;:::i;:::-;27547:139;;27274:419;;;:::o;27699:224::-;27839:34;27835:1;27827:6;27823:14;27816:58;27908:7;27903:2;27895:6;27891:15;27884:32;27699:224;:::o;27929:366::-;28071:3;28092:67;28156:2;28151:3;28092:67;:::i;:::-;28085:74;;28168:93;28257:3;28168:93;:::i;:::-;28286:2;28281:3;28277:12;28270:19;;27929:366;;;:::o;28301:419::-;28467:4;28505:2;28494:9;28490:18;28482:26;;28554:9;28548:4;28544:20;28540:1;28529:9;28525:17;28518:47;28582:131;28708:4;28582:131;:::i;:::-;28574:139;;28301:419;;;:::o;28726:180::-;28866:32;28862:1;28854:6;28850:14;28843:56;28726:180;:::o;28912:366::-;29054:3;29075:67;29139:2;29134:3;29075:67;:::i;:::-;29068:74;;29151:93;29240:3;29151:93;:::i;:::-;29269:2;29264:3;29260:12;29253:19;;28912:366;;;:::o;29284:419::-;29450:4;29488:2;29477:9;29473:18;29465:26;;29537:9;29531:4;29527:20;29523:1;29512:9;29508:17;29501:47;29565:131;29691:4;29565:131;:::i;:::-;29557:139;;29284:419;;;:::o;29709:225::-;29849:34;29845:1;29837:6;29833:14;29826:58;29918:8;29913:2;29905:6;29901:15;29894:33;29709:225;:::o;29940:366::-;30082:3;30103:67;30167:2;30162:3;30103:67;:::i;:::-;30096:74;;30179:93;30268:3;30179:93;:::i;:::-;30297:2;30292:3;30288:12;30281:19;;29940:366;;;:::o;30312:419::-;30478:4;30516:2;30505:9;30501:18;30493:26;;30565:9;30559:4;30555:20;30551:1;30540:9;30536:17;30529:47;30593:131;30719:4;30593:131;:::i;:::-;30585:139;;30312:419;;;:::o;30737:182::-;30877:34;30873:1;30865:6;30861:14;30854:58;30737:182;:::o;30925:366::-;31067:3;31088:67;31152:2;31147:3;31088:67;:::i;:::-;31081:74;;31164:93;31253:3;31164:93;:::i;:::-;31282:2;31277:3;31273:12;31266:19;;30925:366;;;:::o;31297:419::-;31463:4;31501:2;31490:9;31486:18;31478:26;;31550:9;31544:4;31540:20;31536:1;31525:9;31521:17;31514:47;31578:131;31704:4;31578:131;:::i;:::-;31570:139;;31297:419;;;:::o;31722:98::-;31773:6;31807:5;31801:12;31791:22;;31722:98;;;:::o;31826:168::-;31909:11;31943:6;31938:3;31931:19;31983:4;31978:3;31974:14;31959:29;;31826:168;;;;:::o;32000:360::-;32086:3;32114:38;32146:5;32114:38;:::i;:::-;32168:70;32231:6;32226:3;32168:70;:::i;:::-;32161:77;;32247:52;32292:6;32287:3;32280:4;32273:5;32269:16;32247:52;:::i;:::-;32324:29;32346:6;32324:29;:::i;:::-;32319:3;32315:39;32308:46;;32090:270;32000:360;;;;:::o;32366:640::-;32561:4;32599:3;32588:9;32584:19;32576:27;;32613:71;32681:1;32670:9;32666:17;32657:6;32613:71;:::i;:::-;32694:72;32762:2;32751:9;32747:18;32738:6;32694:72;:::i;:::-;32776;32844:2;32833:9;32829:18;32820:6;32776:72;:::i;:::-;32895:9;32889:4;32885:20;32880:2;32869:9;32865:18;32858:48;32923:76;32994:4;32985:6;32923:76;:::i;:::-;32915:84;;32366:640;;;;;;;:::o;33012:141::-;33068:5;33099:6;33093:13;33084:22;;33115:32;33141:5;33115:32;:::i;:::-;33012:141;;;;:::o;33159:349::-;33228:6;33277:2;33265:9;33256:7;33252:23;33248:32;33245:119;;;33283:79;;:::i;:::-;33245:119;33403:1;33428:63;33483:7;33474:6;33463:9;33459:22;33428:63;:::i;:::-;33418:73;;33374:127;33159:349;;;;:::o;33514:180::-;33562:77;33559:1;33552:88;33659:4;33656:1;33649:15;33683:4;33680:1;33673:15;33700:185;33740:1;33757:20;33775:1;33757:20;:::i;:::-;33752:25;;33791:20;33809:1;33791:20;:::i;:::-;33786:25;;33830:1;33820:35;;33835:18;;:::i;:::-;33820:35;33877:1;33874;33870:9;33865:14;;33700:185;;;;:::o;33891:176::-;33923:1;33940:20;33958:1;33940:20;:::i;:::-;33935:25;;33974:20;33992:1;33974:20;:::i;:::-;33969:25;;34013:1;34003:35;;34018:18;;:::i;:::-;34003:35;34059:1;34056;34052:9;34047:14;;33891:176;;;;:::o

Swarm Source

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