ETH Price: $3,454.63 (+6.39%)
Gas: 6 Gwei

Token

Europe North Penguin (EUNP)
 

Overview

Max Total Supply

0 EUNP

Holders

120

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
1 EUNP
0xf0ea26e6c122637c803a75aab253f5f541600372
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:
EUNPenguin

Compiler Version
v0.8.10+commit.fc410830

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

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

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

pragma solidity ^0.8.0;

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

// File: @openzeppelin/contracts/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`, checking first that contract recipients
     * are aware of the ERC721 protocol to prevent tokens from being forever locked.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

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

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

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

    /**
     * @dev Approve or remove `operator` as an operator for the caller.
     * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller.
     *
     * Requirements:
     *
     * - The `operator` cannot be the caller.
     *
     * Emits an {ApprovalForAll} event.
     */
    function setApprovalForAll(address operator, bool _approved) external;

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

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

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


pragma solidity ^0.8.0;

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

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


pragma solidity ^0.8.1;

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

        return account.code.length > 0;
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


pragma solidity ^0.8.0;

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

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

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

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

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

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


pragma solidity ^0.8.0;

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

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


pragma solidity ^0.8.0;







/**
 * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including
 * the Metadata extension, but not including the Enumerable extension, which is available separately as
 * {ERC721Enumerable}.
 */
contract ERC721 is Context, ERC165, IERC721, IERC721Metadata {
    using Address for address;
    using Strings for uint256;

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

    // Mapping from token ID to owner address
    mapping(uint256 => address) private _owners;

    // Mapping owner address to token count
    mapping(address => uint256) private _balances;

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

    /**
     * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection.
     */
    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }

    /**
     * @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 virtual override returns (uint256) {
        require(owner != address(0), "ERC721: balance query for the zero address");
        return _balances[owner];
    }

    /**
     * @dev See {IERC721-ownerOf}.
     */
    function ownerOf(uint256 tokenId) public view virtual override returns (address) {
        address owner = _owners[tokenId];
        require(owner != address(0), "ERC721: owner query for nonexistent token");
        return owner;
    }

    /**
     * @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) {
        require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token");

        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 virtual override {
        address owner = ERC721.ownerOf(tokenId);
        require(to != owner, "ERC721: approval to current owner");

        require(
            _msgSender() == owner || isApprovedForAll(owner, _msgSender()),
            "ERC721: approve caller is not owner nor approved for all"
        );

        _approve(to, tokenId);
    }

    /**
     * @dev See {IERC721-getApproved}.
     */
    function getApproved(uint256 tokenId) public view virtual override returns (address) {
        require(_exists(tokenId), "ERC721: approved query for nonexistent token");

        return _tokenApprovals[tokenId];
    }

    /**
     * @dev See {IERC721-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved) public virtual override {
        _setApprovalForAll(_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 {
        //solhint-disable-next-line max-line-length
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved");

        _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 {
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved");
        _safeTransfer(from, to, tokenId, _data);
    }

    /**
     * @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.
     *
     * `_data` is additional data, it has no specified format and it is sent in call to `to`.
     *
     * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g.
     * implement alternative mechanisms to perform token transfer, such as signature-based.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function _safeTransfer(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) internal virtual {
        _transfer(from, to, tokenId);
        require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer");
    }

    /**
     * @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`),
     * and stop existing when they are burned (`_burn`).
     */
    function _exists(uint256 tokenId) internal view virtual returns (bool) {
        return _owners[tokenId] != address(0);
    }

    /**
     * @dev Returns whether `spender` is allowed to manage `tokenId`.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) {
        require(_exists(tokenId), "ERC721: operator query for nonexistent token");
        address owner = ERC721.ownerOf(tokenId);
        return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender));
    }

    /**
     * @dev Safely mints `tokenId` and transfers it to `to`.
     *
     * Requirements:
     *
     * - `tokenId` must not exist.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function _safeMint(address to, uint256 tokenId) internal virtual {
        _safeMint(to, tokenId, "");
    }

    /**
     * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is
     * forwarded in {IERC721Receiver-onERC721Received} to contract recipients.
     */
    function _safeMint(
        address to,
        uint256 tokenId,
        bytes memory _data
    ) internal virtual {
        _mint(to, tokenId);
        require(
            _checkOnERC721Received(address(0), to, tokenId, _data),
            "ERC721: transfer to non ERC721Receiver implementer"
        );
    }

    /**
     * @dev Mints `tokenId` and transfers it to `to`.
     *
     * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible
     *
     * Requirements:
     *
     * - `tokenId` must not exist.
     * - `to` cannot be the zero address.
     *
     * Emits a {Transfer} event.
     */
    function _mint(address to, uint256 tokenId) internal virtual {
        require(to != address(0), "ERC721: mint to the zero address");
        require(!_exists(tokenId), "ERC721: token already minted");

        _beforeTokenTransfer(address(0), to, tokenId);

        _balances[to] += 1;
        _owners[tokenId] = to;

        emit Transfer(address(0), to, tokenId);

        _afterTokenTransfer(address(0), to, tokenId);
    }

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

        _beforeTokenTransfer(owner, address(0), tokenId);

        // Clear approvals
        _approve(address(0), tokenId);

        _balances[owner] -= 1;
        delete _owners[tokenId];

        emit Transfer(owner, address(0), tokenId);

        _afterTokenTransfer(owner, address(0), tokenId);
    }

    /**
     * @dev Transfers `tokenId` from `from` to `to`.
     *  As opposed to {transferFrom}, this imposes no restrictions on msg.sender.
     *
     * 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
    ) internal virtual {
        require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer from incorrect owner");
        require(to != address(0), "ERC721: transfer to the zero address");

        _beforeTokenTransfer(from, to, tokenId);

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

        _balances[from] -= 1;
        _balances[to] += 1;
        _owners[tokenId] = to;

        emit Transfer(from, to, tokenId);

        _afterTokenTransfer(from, to, tokenId);
    }

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

    /**
     * @dev Approve `operator` to operate on all of `owner` tokens
     *
     * Emits a {ApprovalForAll} event.
     */
    function _setApprovalForAll(
        address owner,
        address operator,
        bool approved
    ) internal virtual {
        require(owner != operator, "ERC721: approve to caller");
        _operatorApprovals[owner][operator] = approved;
        emit ApprovalForAll(owner, operator, approved);
    }

    /**
     * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address.
     * The call is not executed if the target address is not a 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 _checkOnERC721Received(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) private returns (bool) {
        if (to.isContract()) {
            try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) {
                return retval == IERC721Receiver.onERC721Received.selector;
            } catch (bytes memory reason) {
                if (reason.length == 0) {
                    revert("ERC721: transfer to non ERC721Receiver implementer");
                } else {
                    assembly {
                        revert(add(32, reason), mload(reason))
                    }
                }
            }
        } else {
            return true;
        }
    }

    /**
     * @dev Hook that is called before any token transfer. This includes minting
     * and burning.
     *
     * 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, ``from``'s `tokenId` will be burned.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {}

    /**
     * @dev Hook that is called after any transfer of tokens. This includes
     * minting and burning.
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _afterTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {}
}

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


pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

pragma solidity ^0.8.0;




contract EUNPenguin is ERC721, Ownable {

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

  Counters.Counter _tokenIds;
  string currentBaseURI;

  constructor(string memory _baseURI) ERC721("Europe North Penguin", "EUNP") {
    currentBaseURI = _baseURI;
  }

  function changeBaseURI(string memory _newBaseURI) external onlyOwner {
    currentBaseURI = _newBaseURI;
  }

  function mint(address[] memory _receivers) external onlyOwner {
    for (uint256 i = 0; i < _receivers.length; i++) {
      _tokenIds.increment();
      uint256 _tokenId = _tokenIds.current();
      _safeMint(_receivers[i], _tokenId);
    }
  }

  function tokenURI(uint256 _tokenId) public view override returns (string memory) {
    require(_exists(_tokenId), "Requesting URI for nonexistent token");
    return bytes(currentBaseURI).length > 0 ? string(abi.encodePacked(currentBaseURI, _tokenId.toString(), ".json")) : "";
  }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"_baseURI","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"_newBaseURI","type":"string"}],"name":"changeBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"_receivers","type":"address[]"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"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":[{"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"}]

60806040523480156200001157600080fd5b506040516200353c3803806200353c833981810160405281019062000037919062000432565b6040518060400160405280601481526020017f4575726f7065204e6f7274682050656e6775696e0000000000000000000000008152506040518060400160405280600481526020017f45554e50000000000000000000000000000000000000000000000000000000008152508160009080519060200190620000bb929190620001e5565b508060019080519060200190620000d4929190620001e5565b505050620000f7620000eb6200011760201b60201c565b6200011f60201b60201c565b80600890805190602001906200010f929190620001e5565b5050620004e8565b600033905090565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b828054620001f390620004b2565b90600052602060002090601f01602090048101928262000217576000855562000263565b82601f106200023257805160ff191683800117855562000263565b8280016001018555821562000263579182015b828111156200026257825182559160200191906001019062000245565b5b50905062000272919062000276565b5090565b5b808211156200029157600081600090555060010162000277565b5090565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b620002fe82620002b3565b810181811067ffffffffffffffff8211171562000320576200031f620002c4565b5b80604052505050565b60006200033562000295565b9050620003438282620002f3565b919050565b600067ffffffffffffffff821115620003665762000365620002c4565b5b6200037182620002b3565b9050602081019050919050565b60005b838110156200039e57808201518184015260208101905062000381565b83811115620003ae576000848401525b50505050565b6000620003cb620003c58462000348565b62000329565b905082815260208101848484011115620003ea57620003e9620002ae565b5b620003f78482856200037e565b509392505050565b600082601f830112620004175762000416620002a9565b5b815162000429848260208601620003b4565b91505092915050565b6000602082840312156200044b576200044a6200029f565b5b600082015167ffffffffffffffff8111156200046c576200046b620002a4565b5b6200047a84828501620003ff565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680620004cb57607f821691505b60208210811415620004e257620004e162000483565b5b50919050565b61304480620004f86000396000f3fe608060405234801561001057600080fd5b50600436106101165760003560e01c8063715018a6116100a2578063b88d4fde11610071578063b88d4fde146102cb578063bd075b84146102e7578063c87b56dd14610303578063e985e9c514610333578063f2fde38b1461036357610116565b8063715018a6146102695780638da5cb5b1461027357806395d89b4114610291578063a22cb465146102af57610116565b806323b872dd116100e957806323b872dd146101b557806339a0c6f9146101d157806342842e0e146101ed5780636352211e1461020957806370a082311461023957610116565b806301ffc9a71461011b57806306fdde031461014b578063081812fc14610169578063095ea7b314610199575b600080fd5b61013560048036038101906101309190611be3565b61037f565b6040516101429190611c2b565b60405180910390f35b610153610461565b6040516101609190611cdf565b60405180910390f35b610183600480360381019061017e9190611d37565b6104f3565b6040516101909190611da5565b60405180910390f35b6101b360048036038101906101ae9190611dec565b610578565b005b6101cf60048036038101906101ca9190611e2c565b610690565b005b6101eb60048036038101906101e69190611fb4565b6106f0565b005b61020760048036038101906102029190611e2c565b610786565b005b610223600480360381019061021e9190611d37565b6107a6565b6040516102309190611da5565b60405180910390f35b610253600480360381019061024e9190611ffd565b610858565b6040516102609190612039565b60405180910390f35b610271610910565b005b61027b610998565b6040516102889190611da5565b60405180910390f35b6102996109c2565b6040516102a69190611cdf565b60405180910390f35b6102c960048036038101906102c49190612080565b610a54565b005b6102e560048036038101906102e09190612161565b610a6a565b005b61030160048036038101906102fc91906122ac565b610acc565b005b61031d60048036038101906103189190611d37565b610ba8565b60405161032a9190611cdf565b60405180910390f35b61034d600480360381019061034891906122f5565b610c50565b60405161035a9190611c2b565b60405180910390f35b61037d60048036038101906103789190611ffd565b610ce4565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061044a57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061045a575061045982610ddc565b5b9050919050565b60606000805461047090612364565b80601f016020809104026020016040519081016040528092919081815260200182805461049c90612364565b80156104e95780601f106104be576101008083540402835291602001916104e9565b820191906000526020600020905b8154815290600101906020018083116104cc57829003601f168201915b5050505050905090565b60006104fe82610e46565b61053d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161053490612408565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610583826107a6565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156105f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105eb9061249a565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610613610eb2565b73ffffffffffffffffffffffffffffffffffffffff16148061064257506106418161063c610eb2565b610c50565b5b610681576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106789061252c565b60405180910390fd5b61068b8383610eba565b505050565b6106a161069b610eb2565b82610f73565b6106e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106d7906125be565b60405180910390fd5b6106eb838383611051565b505050565b6106f8610eb2565b73ffffffffffffffffffffffffffffffffffffffff16610716610998565b73ffffffffffffffffffffffffffffffffffffffff161461076c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107639061262a565b60405180910390fd5b8060089080519060200190610782929190611ad4565b5050565b6107a183838360405180602001604052806000815250610a6a565b505050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561084f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610846906126bc565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156108c9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108c09061274e565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610918610eb2565b73ffffffffffffffffffffffffffffffffffffffff16610936610998565b73ffffffffffffffffffffffffffffffffffffffff161461098c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109839061262a565b60405180910390fd5b61099660006112b8565b565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600180546109d190612364565b80601f01602080910402602001604051908101604052809291908181526020018280546109fd90612364565b8015610a4a5780601f10610a1f57610100808354040283529160200191610a4a565b820191906000526020600020905b815481529060010190602001808311610a2d57829003601f168201915b5050505050905090565b610a66610a5f610eb2565b838361137e565b5050565b610a7b610a75610eb2565b83610f73565b610aba576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ab1906125be565b60405180910390fd5b610ac6848484846114eb565b50505050565b610ad4610eb2565b73ffffffffffffffffffffffffffffffffffffffff16610af2610998565b73ffffffffffffffffffffffffffffffffffffffff1614610b48576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b3f9061262a565b60405180910390fd5b60005b8151811015610ba457610b5e6007611547565b6000610b6a600761155d565b9050610b90838381518110610b8257610b8161276e565b5b60200260200101518261156b565b508080610b9c906127cc565b915050610b4b565b5050565b6060610bb382610e46565b610bf2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610be990612887565b60405180910390fd5b600060088054610c0190612364565b905011610c1d5760405180602001604052806000815250610c49565b6008610c2883611589565b604051602001610c399291906129c3565b6040516020818303038152906040525b9050919050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b610cec610eb2565b73ffffffffffffffffffffffffffffffffffffffff16610d0a610998565b73ffffffffffffffffffffffffffffffffffffffff1614610d60576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d579061262a565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610dd0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dc790612a64565b60405180910390fd5b610dd9816112b8565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16610f2d836107a6565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000610f7e82610e46565b610fbd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fb490612af6565b60405180910390fd5b6000610fc8836107a6565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061103757508373ffffffffffffffffffffffffffffffffffffffff1661101f846104f3565b73ffffffffffffffffffffffffffffffffffffffff16145b8061104857506110478185610c50565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611071826107a6565b73ffffffffffffffffffffffffffffffffffffffff16146110c7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110be90612b88565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611137576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161112e90612c1a565b60405180910390fd5b6111428383836116ea565b61114d600082610eba565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461119d9190612c3a565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546111f49190612c6e565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46112b38383836116ef565b505050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156113ed576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113e490612d10565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516114de9190611c2b565b60405180910390a3505050565b6114f6848484611051565b611502848484846116f4565b611541576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161153890612da2565b60405180910390fd5b50505050565b6001816000016000828254019250508190555050565b600081600001549050919050565b61158582826040518060200160405280600081525061187c565b5050565b606060008214156115d1576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506116e5565b600082905060005b600082146116035780806115ec906127cc565b915050600a826115fc9190612df1565b91506115d9565b60008167ffffffffffffffff81111561161f5761161e611e89565b5b6040519080825280601f01601f1916602001820160405280156116515781602001600182028036833780820191505090505b5090505b600085146116de5760018261166a9190612c3a565b9150600a856116799190612e22565b60306116859190612c6e565b60f81b81838151811061169b5761169a61276e565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856116d79190612df1565b9450611655565b8093505050505b919050565b505050565b505050565b60006117158473ffffffffffffffffffffffffffffffffffffffff166118d7565b1561186f578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261173e610eb2565b8786866040518563ffffffff1660e01b81526004016117609493929190612ea8565b6020604051808303816000875af192505050801561179c57506040513d601f19601f820116820180604052508101906117999190612f09565b60015b61181f573d80600081146117cc576040519150601f19603f3d011682016040523d82523d6000602084013e6117d1565b606091505b50600081511415611817576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161180e90612da2565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050611874565b600190505b949350505050565b61188683836118fa565b61189360008484846116f4565b6118d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118c990612da2565b60405180910390fd5b505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561196a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161196190612f82565b60405180910390fd5b61197381610e46565b156119b3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119aa90612fee565b60405180910390fd5b6119bf600083836116ea565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611a0f9190612c6e565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611ad0600083836116ef565b5050565b828054611ae090612364565b90600052602060002090601f016020900481019282611b025760008555611b49565b82601f10611b1b57805160ff1916838001178555611b49565b82800160010185558215611b49579182015b82811115611b48578251825591602001919060010190611b2d565b5b509050611b569190611b5a565b5090565b5b80821115611b73576000816000905550600101611b5b565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b611bc081611b8b565b8114611bcb57600080fd5b50565b600081359050611bdd81611bb7565b92915050565b600060208284031215611bf957611bf8611b81565b5b6000611c0784828501611bce565b91505092915050565b60008115159050919050565b611c2581611c10565b82525050565b6000602082019050611c406000830184611c1c565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015611c80578082015181840152602081019050611c65565b83811115611c8f576000848401525b50505050565b6000601f19601f8301169050919050565b6000611cb182611c46565b611cbb8185611c51565b9350611ccb818560208601611c62565b611cd481611c95565b840191505092915050565b60006020820190508181036000830152611cf98184611ca6565b905092915050565b6000819050919050565b611d1481611d01565b8114611d1f57600080fd5b50565b600081359050611d3181611d0b565b92915050565b600060208284031215611d4d57611d4c611b81565b5b6000611d5b84828501611d22565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000611d8f82611d64565b9050919050565b611d9f81611d84565b82525050565b6000602082019050611dba6000830184611d96565b92915050565b611dc981611d84565b8114611dd457600080fd5b50565b600081359050611de681611dc0565b92915050565b60008060408385031215611e0357611e02611b81565b5b6000611e1185828601611dd7565b9250506020611e2285828601611d22565b9150509250929050565b600080600060608486031215611e4557611e44611b81565b5b6000611e5386828701611dd7565b9350506020611e6486828701611dd7565b9250506040611e7586828701611d22565b9150509250925092565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b611ec182611c95565b810181811067ffffffffffffffff82111715611ee057611edf611e89565b5b80604052505050565b6000611ef3611b77565b9050611eff8282611eb8565b919050565b600067ffffffffffffffff821115611f1f57611f1e611e89565b5b611f2882611c95565b9050602081019050919050565b82818337600083830152505050565b6000611f57611f5284611f04565b611ee9565b905082815260208101848484011115611f7357611f72611e84565b5b611f7e848285611f35565b509392505050565b600082601f830112611f9b57611f9a611e7f565b5b8135611fab848260208601611f44565b91505092915050565b600060208284031215611fca57611fc9611b81565b5b600082013567ffffffffffffffff811115611fe857611fe7611b86565b5b611ff484828501611f86565b91505092915050565b60006020828403121561201357612012611b81565b5b600061202184828501611dd7565b91505092915050565b61203381611d01565b82525050565b600060208201905061204e600083018461202a565b92915050565b61205d81611c10565b811461206857600080fd5b50565b60008135905061207a81612054565b92915050565b6000806040838503121561209757612096611b81565b5b60006120a585828601611dd7565b92505060206120b68582860161206b565b9150509250929050565b600067ffffffffffffffff8211156120db576120da611e89565b5b6120e482611c95565b9050602081019050919050565b60006121046120ff846120c0565b611ee9565b9050828152602081018484840111156121205761211f611e84565b5b61212b848285611f35565b509392505050565b600082601f83011261214857612147611e7f565b5b81356121588482602086016120f1565b91505092915050565b6000806000806080858703121561217b5761217a611b81565b5b600061218987828801611dd7565b945050602061219a87828801611dd7565b93505060406121ab87828801611d22565b925050606085013567ffffffffffffffff8111156121cc576121cb611b86565b5b6121d887828801612133565b91505092959194509250565b600067ffffffffffffffff8211156121ff576121fe611e89565b5b602082029050602081019050919050565b600080fd5b6000612228612223846121e4565b611ee9565b9050808382526020820190506020840283018581111561224b5761224a612210565b5b835b8181101561227457806122608882611dd7565b84526020840193505060208101905061224d565b5050509392505050565b600082601f83011261229357612292611e7f565b5b81356122a3848260208601612215565b91505092915050565b6000602082840312156122c2576122c1611b81565b5b600082013567ffffffffffffffff8111156122e0576122df611b86565b5b6122ec8482850161227e565b91505092915050565b6000806040838503121561230c5761230b611b81565b5b600061231a85828601611dd7565b925050602061232b85828601611dd7565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061237c57607f821691505b602082108114156123905761238f612335565b5b50919050565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b60006123f2602c83611c51565b91506123fd82612396565b604082019050919050565b60006020820190508181036000830152612421816123e5565b9050919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b6000612484602183611c51565b915061248f82612428565b604082019050919050565b600060208201905081810360008301526124b381612477565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b6000612516603883611c51565b9150612521826124ba565b604082019050919050565b6000602082019050818103600083015261254581612509565b9050919050565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b60006125a8603183611c51565b91506125b38261254c565b604082019050919050565b600060208201905081810360008301526125d78161259b565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000612614602083611c51565b915061261f826125de565b602082019050919050565b6000602082019050818103600083015261264381612607565b9050919050565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b60006126a6602983611c51565b91506126b18261264a565b604082019050919050565b600060208201905081810360008301526126d581612699565b9050919050565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b6000612738602a83611c51565b9150612743826126dc565b604082019050919050565b600060208201905081810360008301526127678161272b565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006127d782611d01565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561280a5761280961279d565b5b600182019050919050565b7f52657175657374696e672055524920666f72206e6f6e6578697374656e74207460008201527f6f6b656e00000000000000000000000000000000000000000000000000000000602082015250565b6000612871602483611c51565b915061287c82612815565b604082019050919050565b600060208201905081810360008301526128a081612864565b9050919050565b600081905092915050565b60008190508160005260206000209050919050565b600081546128d481612364565b6128de81866128a7565b945060018216600081146128f9576001811461290a5761293d565b60ff1983168652818601935061293d565b612913856128b2565b60005b8381101561293557815481890152600182019150602081019050612916565b838801955050505b50505092915050565b600061295182611c46565b61295b81856128a7565b935061296b818560208601611c62565b80840191505092915050565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b60006129ad6005836128a7565b91506129b882612977565b600582019050919050565b60006129cf82856128c7565b91506129db8284612946565b91506129e6826129a0565b91508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000612a4e602683611c51565b9150612a59826129f2565b604082019050919050565b60006020820190508181036000830152612a7d81612a41565b9050919050565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b6000612ae0602c83611c51565b9150612aeb82612a84565b604082019050919050565b60006020820190508181036000830152612b0f81612ad3565b9050919050565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b6000612b72602583611c51565b9150612b7d82612b16565b604082019050919050565b60006020820190508181036000830152612ba181612b65565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000612c04602483611c51565b9150612c0f82612ba8565b604082019050919050565b60006020820190508181036000830152612c3381612bf7565b9050919050565b6000612c4582611d01565b9150612c5083611d01565b925082821015612c6357612c6261279d565b5b828203905092915050565b6000612c7982611d01565b9150612c8483611d01565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115612cb957612cb861279d565b5b828201905092915050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b6000612cfa601983611c51565b9150612d0582612cc4565b602082019050919050565b60006020820190508181036000830152612d2981612ced565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b6000612d8c603283611c51565b9150612d9782612d30565b604082019050919050565b60006020820190508181036000830152612dbb81612d7f565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000612dfc82611d01565b9150612e0783611d01565b925082612e1757612e16612dc2565b5b828204905092915050565b6000612e2d82611d01565b9150612e3883611d01565b925082612e4857612e47612dc2565b5b828206905092915050565b600081519050919050565b600082825260208201905092915050565b6000612e7a82612e53565b612e848185612e5e565b9350612e94818560208601611c62565b612e9d81611c95565b840191505092915050565b6000608082019050612ebd6000830187611d96565b612eca6020830186611d96565b612ed7604083018561202a565b8181036060830152612ee98184612e6f565b905095945050505050565b600081519050612f0381611bb7565b92915050565b600060208284031215612f1f57612f1e611b81565b5b6000612f2d84828501612ef4565b91505092915050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b6000612f6c602083611c51565b9150612f7782612f36565b602082019050919050565b60006020820190508181036000830152612f9b81612f5f565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b6000612fd8601c83611c51565b9150612fe382612fa2565b602082019050919050565b6000602082019050818103600083015261300781612fcb565b905091905056fea26469706673582212203347623cb33b46040cc734c8bd80ee8d5011f28550b644bf2ef5502aace0b19c64736f6c634300080a003300000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000036697066733a2f2f516d63453964784b464c44576f797a4b515767776544473868613465743267516b68464138586a47585a566143762f00000000000000000000

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106101165760003560e01c8063715018a6116100a2578063b88d4fde11610071578063b88d4fde146102cb578063bd075b84146102e7578063c87b56dd14610303578063e985e9c514610333578063f2fde38b1461036357610116565b8063715018a6146102695780638da5cb5b1461027357806395d89b4114610291578063a22cb465146102af57610116565b806323b872dd116100e957806323b872dd146101b557806339a0c6f9146101d157806342842e0e146101ed5780636352211e1461020957806370a082311461023957610116565b806301ffc9a71461011b57806306fdde031461014b578063081812fc14610169578063095ea7b314610199575b600080fd5b61013560048036038101906101309190611be3565b61037f565b6040516101429190611c2b565b60405180910390f35b610153610461565b6040516101609190611cdf565b60405180910390f35b610183600480360381019061017e9190611d37565b6104f3565b6040516101909190611da5565b60405180910390f35b6101b360048036038101906101ae9190611dec565b610578565b005b6101cf60048036038101906101ca9190611e2c565b610690565b005b6101eb60048036038101906101e69190611fb4565b6106f0565b005b61020760048036038101906102029190611e2c565b610786565b005b610223600480360381019061021e9190611d37565b6107a6565b6040516102309190611da5565b60405180910390f35b610253600480360381019061024e9190611ffd565b610858565b6040516102609190612039565b60405180910390f35b610271610910565b005b61027b610998565b6040516102889190611da5565b60405180910390f35b6102996109c2565b6040516102a69190611cdf565b60405180910390f35b6102c960048036038101906102c49190612080565b610a54565b005b6102e560048036038101906102e09190612161565b610a6a565b005b61030160048036038101906102fc91906122ac565b610acc565b005b61031d60048036038101906103189190611d37565b610ba8565b60405161032a9190611cdf565b60405180910390f35b61034d600480360381019061034891906122f5565b610c50565b60405161035a9190611c2b565b60405180910390f35b61037d60048036038101906103789190611ffd565b610ce4565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061044a57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061045a575061045982610ddc565b5b9050919050565b60606000805461047090612364565b80601f016020809104026020016040519081016040528092919081815260200182805461049c90612364565b80156104e95780601f106104be576101008083540402835291602001916104e9565b820191906000526020600020905b8154815290600101906020018083116104cc57829003601f168201915b5050505050905090565b60006104fe82610e46565b61053d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161053490612408565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610583826107a6565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156105f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105eb9061249a565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610613610eb2565b73ffffffffffffffffffffffffffffffffffffffff16148061064257506106418161063c610eb2565b610c50565b5b610681576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106789061252c565b60405180910390fd5b61068b8383610eba565b505050565b6106a161069b610eb2565b82610f73565b6106e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106d7906125be565b60405180910390fd5b6106eb838383611051565b505050565b6106f8610eb2565b73ffffffffffffffffffffffffffffffffffffffff16610716610998565b73ffffffffffffffffffffffffffffffffffffffff161461076c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107639061262a565b60405180910390fd5b8060089080519060200190610782929190611ad4565b5050565b6107a183838360405180602001604052806000815250610a6a565b505050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561084f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610846906126bc565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156108c9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108c09061274e565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610918610eb2565b73ffffffffffffffffffffffffffffffffffffffff16610936610998565b73ffffffffffffffffffffffffffffffffffffffff161461098c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109839061262a565b60405180910390fd5b61099660006112b8565b565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600180546109d190612364565b80601f01602080910402602001604051908101604052809291908181526020018280546109fd90612364565b8015610a4a5780601f10610a1f57610100808354040283529160200191610a4a565b820191906000526020600020905b815481529060010190602001808311610a2d57829003601f168201915b5050505050905090565b610a66610a5f610eb2565b838361137e565b5050565b610a7b610a75610eb2565b83610f73565b610aba576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ab1906125be565b60405180910390fd5b610ac6848484846114eb565b50505050565b610ad4610eb2565b73ffffffffffffffffffffffffffffffffffffffff16610af2610998565b73ffffffffffffffffffffffffffffffffffffffff1614610b48576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b3f9061262a565b60405180910390fd5b60005b8151811015610ba457610b5e6007611547565b6000610b6a600761155d565b9050610b90838381518110610b8257610b8161276e565b5b60200260200101518261156b565b508080610b9c906127cc565b915050610b4b565b5050565b6060610bb382610e46565b610bf2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610be990612887565b60405180910390fd5b600060088054610c0190612364565b905011610c1d5760405180602001604052806000815250610c49565b6008610c2883611589565b604051602001610c399291906129c3565b6040516020818303038152906040525b9050919050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b610cec610eb2565b73ffffffffffffffffffffffffffffffffffffffff16610d0a610998565b73ffffffffffffffffffffffffffffffffffffffff1614610d60576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d579061262a565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610dd0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dc790612a64565b60405180910390fd5b610dd9816112b8565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16610f2d836107a6565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000610f7e82610e46565b610fbd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fb490612af6565b60405180910390fd5b6000610fc8836107a6565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061103757508373ffffffffffffffffffffffffffffffffffffffff1661101f846104f3565b73ffffffffffffffffffffffffffffffffffffffff16145b8061104857506110478185610c50565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611071826107a6565b73ffffffffffffffffffffffffffffffffffffffff16146110c7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110be90612b88565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611137576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161112e90612c1a565b60405180910390fd5b6111428383836116ea565b61114d600082610eba565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461119d9190612c3a565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546111f49190612c6e565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46112b38383836116ef565b505050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156113ed576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113e490612d10565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516114de9190611c2b565b60405180910390a3505050565b6114f6848484611051565b611502848484846116f4565b611541576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161153890612da2565b60405180910390fd5b50505050565b6001816000016000828254019250508190555050565b600081600001549050919050565b61158582826040518060200160405280600081525061187c565b5050565b606060008214156115d1576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506116e5565b600082905060005b600082146116035780806115ec906127cc565b915050600a826115fc9190612df1565b91506115d9565b60008167ffffffffffffffff81111561161f5761161e611e89565b5b6040519080825280601f01601f1916602001820160405280156116515781602001600182028036833780820191505090505b5090505b600085146116de5760018261166a9190612c3a565b9150600a856116799190612e22565b60306116859190612c6e565b60f81b81838151811061169b5761169a61276e565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856116d79190612df1565b9450611655565b8093505050505b919050565b505050565b505050565b60006117158473ffffffffffffffffffffffffffffffffffffffff166118d7565b1561186f578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261173e610eb2565b8786866040518563ffffffff1660e01b81526004016117609493929190612ea8565b6020604051808303816000875af192505050801561179c57506040513d601f19601f820116820180604052508101906117999190612f09565b60015b61181f573d80600081146117cc576040519150601f19603f3d011682016040523d82523d6000602084013e6117d1565b606091505b50600081511415611817576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161180e90612da2565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050611874565b600190505b949350505050565b61188683836118fa565b61189360008484846116f4565b6118d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118c990612da2565b60405180910390fd5b505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561196a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161196190612f82565b60405180910390fd5b61197381610e46565b156119b3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119aa90612fee565b60405180910390fd5b6119bf600083836116ea565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611a0f9190612c6e565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611ad0600083836116ef565b5050565b828054611ae090612364565b90600052602060002090601f016020900481019282611b025760008555611b49565b82601f10611b1b57805160ff1916838001178555611b49565b82800160010185558215611b49579182015b82811115611b48578251825591602001919060010190611b2d565b5b509050611b569190611b5a565b5090565b5b80821115611b73576000816000905550600101611b5b565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b611bc081611b8b565b8114611bcb57600080fd5b50565b600081359050611bdd81611bb7565b92915050565b600060208284031215611bf957611bf8611b81565b5b6000611c0784828501611bce565b91505092915050565b60008115159050919050565b611c2581611c10565b82525050565b6000602082019050611c406000830184611c1c565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015611c80578082015181840152602081019050611c65565b83811115611c8f576000848401525b50505050565b6000601f19601f8301169050919050565b6000611cb182611c46565b611cbb8185611c51565b9350611ccb818560208601611c62565b611cd481611c95565b840191505092915050565b60006020820190508181036000830152611cf98184611ca6565b905092915050565b6000819050919050565b611d1481611d01565b8114611d1f57600080fd5b50565b600081359050611d3181611d0b565b92915050565b600060208284031215611d4d57611d4c611b81565b5b6000611d5b84828501611d22565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000611d8f82611d64565b9050919050565b611d9f81611d84565b82525050565b6000602082019050611dba6000830184611d96565b92915050565b611dc981611d84565b8114611dd457600080fd5b50565b600081359050611de681611dc0565b92915050565b60008060408385031215611e0357611e02611b81565b5b6000611e1185828601611dd7565b9250506020611e2285828601611d22565b9150509250929050565b600080600060608486031215611e4557611e44611b81565b5b6000611e5386828701611dd7565b9350506020611e6486828701611dd7565b9250506040611e7586828701611d22565b9150509250925092565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b611ec182611c95565b810181811067ffffffffffffffff82111715611ee057611edf611e89565b5b80604052505050565b6000611ef3611b77565b9050611eff8282611eb8565b919050565b600067ffffffffffffffff821115611f1f57611f1e611e89565b5b611f2882611c95565b9050602081019050919050565b82818337600083830152505050565b6000611f57611f5284611f04565b611ee9565b905082815260208101848484011115611f7357611f72611e84565b5b611f7e848285611f35565b509392505050565b600082601f830112611f9b57611f9a611e7f565b5b8135611fab848260208601611f44565b91505092915050565b600060208284031215611fca57611fc9611b81565b5b600082013567ffffffffffffffff811115611fe857611fe7611b86565b5b611ff484828501611f86565b91505092915050565b60006020828403121561201357612012611b81565b5b600061202184828501611dd7565b91505092915050565b61203381611d01565b82525050565b600060208201905061204e600083018461202a565b92915050565b61205d81611c10565b811461206857600080fd5b50565b60008135905061207a81612054565b92915050565b6000806040838503121561209757612096611b81565b5b60006120a585828601611dd7565b92505060206120b68582860161206b565b9150509250929050565b600067ffffffffffffffff8211156120db576120da611e89565b5b6120e482611c95565b9050602081019050919050565b60006121046120ff846120c0565b611ee9565b9050828152602081018484840111156121205761211f611e84565b5b61212b848285611f35565b509392505050565b600082601f83011261214857612147611e7f565b5b81356121588482602086016120f1565b91505092915050565b6000806000806080858703121561217b5761217a611b81565b5b600061218987828801611dd7565b945050602061219a87828801611dd7565b93505060406121ab87828801611d22565b925050606085013567ffffffffffffffff8111156121cc576121cb611b86565b5b6121d887828801612133565b91505092959194509250565b600067ffffffffffffffff8211156121ff576121fe611e89565b5b602082029050602081019050919050565b600080fd5b6000612228612223846121e4565b611ee9565b9050808382526020820190506020840283018581111561224b5761224a612210565b5b835b8181101561227457806122608882611dd7565b84526020840193505060208101905061224d565b5050509392505050565b600082601f83011261229357612292611e7f565b5b81356122a3848260208601612215565b91505092915050565b6000602082840312156122c2576122c1611b81565b5b600082013567ffffffffffffffff8111156122e0576122df611b86565b5b6122ec8482850161227e565b91505092915050565b6000806040838503121561230c5761230b611b81565b5b600061231a85828601611dd7565b925050602061232b85828601611dd7565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061237c57607f821691505b602082108114156123905761238f612335565b5b50919050565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b60006123f2602c83611c51565b91506123fd82612396565b604082019050919050565b60006020820190508181036000830152612421816123e5565b9050919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b6000612484602183611c51565b915061248f82612428565b604082019050919050565b600060208201905081810360008301526124b381612477565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b6000612516603883611c51565b9150612521826124ba565b604082019050919050565b6000602082019050818103600083015261254581612509565b9050919050565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b60006125a8603183611c51565b91506125b38261254c565b604082019050919050565b600060208201905081810360008301526125d78161259b565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000612614602083611c51565b915061261f826125de565b602082019050919050565b6000602082019050818103600083015261264381612607565b9050919050565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b60006126a6602983611c51565b91506126b18261264a565b604082019050919050565b600060208201905081810360008301526126d581612699565b9050919050565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b6000612738602a83611c51565b9150612743826126dc565b604082019050919050565b600060208201905081810360008301526127678161272b565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006127d782611d01565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561280a5761280961279d565b5b600182019050919050565b7f52657175657374696e672055524920666f72206e6f6e6578697374656e74207460008201527f6f6b656e00000000000000000000000000000000000000000000000000000000602082015250565b6000612871602483611c51565b915061287c82612815565b604082019050919050565b600060208201905081810360008301526128a081612864565b9050919050565b600081905092915050565b60008190508160005260206000209050919050565b600081546128d481612364565b6128de81866128a7565b945060018216600081146128f9576001811461290a5761293d565b60ff1983168652818601935061293d565b612913856128b2565b60005b8381101561293557815481890152600182019150602081019050612916565b838801955050505b50505092915050565b600061295182611c46565b61295b81856128a7565b935061296b818560208601611c62565b80840191505092915050565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b60006129ad6005836128a7565b91506129b882612977565b600582019050919050565b60006129cf82856128c7565b91506129db8284612946565b91506129e6826129a0565b91508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000612a4e602683611c51565b9150612a59826129f2565b604082019050919050565b60006020820190508181036000830152612a7d81612a41565b9050919050565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b6000612ae0602c83611c51565b9150612aeb82612a84565b604082019050919050565b60006020820190508181036000830152612b0f81612ad3565b9050919050565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b6000612b72602583611c51565b9150612b7d82612b16565b604082019050919050565b60006020820190508181036000830152612ba181612b65565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000612c04602483611c51565b9150612c0f82612ba8565b604082019050919050565b60006020820190508181036000830152612c3381612bf7565b9050919050565b6000612c4582611d01565b9150612c5083611d01565b925082821015612c6357612c6261279d565b5b828203905092915050565b6000612c7982611d01565b9150612c8483611d01565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115612cb957612cb861279d565b5b828201905092915050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b6000612cfa601983611c51565b9150612d0582612cc4565b602082019050919050565b60006020820190508181036000830152612d2981612ced565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b6000612d8c603283611c51565b9150612d9782612d30565b604082019050919050565b60006020820190508181036000830152612dbb81612d7f565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000612dfc82611d01565b9150612e0783611d01565b925082612e1757612e16612dc2565b5b828204905092915050565b6000612e2d82611d01565b9150612e3883611d01565b925082612e4857612e47612dc2565b5b828206905092915050565b600081519050919050565b600082825260208201905092915050565b6000612e7a82612e53565b612e848185612e5e565b9350612e94818560208601611c62565b612e9d81611c95565b840191505092915050565b6000608082019050612ebd6000830187611d96565b612eca6020830186611d96565b612ed7604083018561202a565b8181036060830152612ee98184612e6f565b905095945050505050565b600081519050612f0381611bb7565b92915050565b600060208284031215612f1f57612f1e611b81565b5b6000612f2d84828501612ef4565b91505092915050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b6000612f6c602083611c51565b9150612f7782612f36565b602082019050919050565b60006020820190508181036000830152612f9b81612f5f565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b6000612fd8601c83611c51565b9150612fe382612fa2565b602082019050919050565b6000602082019050818103600083015261300781612fcb565b905091905056fea26469706673582212203347623cb33b46040cc734c8bd80ee8d5011f28550b644bf2ef5502aace0b19c64736f6c634300080a0033

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

00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000036697066733a2f2f516d63453964784b464c44576f797a4b515767776544473868613465743267516b68464138586a47585a566143762f00000000000000000000

-----Decoded View---------------
Arg [0] : _baseURI (string): ipfs://QmcE9dxKFLDWoyzKQWgweDG8ha4et2gQkhFA8XjGXZVaCv/

-----Encoded View---------------
4 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000020
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000036
Arg [2] : 697066733a2f2f516d63453964784b464c44576f797a4b515767776544473868
Arg [3] : 613465743267516b68464138586a47585a566143762f00000000000000000000


Deployed Bytecode Sourcemap

38120:955:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21057:305;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22002:100;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23561:221;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23084:411;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;24311:339;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38416:110;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;24721:185;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;21696:239;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21426:208;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35825:103;;;:::i;:::-;;35174:87;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22171:104;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23854:155;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;24977:328;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38532:250;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38788:284;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24080:164;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36083:201;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;21057:305;21159:4;21211:25;21196:40;;;:11;:40;;;;:105;;;;21268:33;21253:48;;;:11;:48;;;;21196:105;:158;;;;21318:36;21342:11;21318:23;:36::i;:::-;21196:158;21176:178;;21057:305;;;:::o;22002:100::-;22056:13;22089:5;22082:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22002:100;:::o;23561:221::-;23637:7;23665:16;23673:7;23665;:16::i;:::-;23657:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;23750:15;:24;23766:7;23750:24;;;;;;;;;;;;;;;;;;;;;23743:31;;23561:221;;;:::o;23084:411::-;23165:13;23181:23;23196:7;23181:14;:23::i;:::-;23165:39;;23229:5;23223:11;;:2;:11;;;;23215:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;23323:5;23307:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;23332:37;23349:5;23356:12;:10;:12::i;:::-;23332:16;:37::i;:::-;23307:62;23285:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;23466:21;23475:2;23479:7;23466:8;:21::i;:::-;23154:341;23084:411;;:::o;24311:339::-;24506:41;24525:12;:10;:12::i;:::-;24539:7;24506:18;:41::i;:::-;24498:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;24614:28;24624:4;24630:2;24634:7;24614:9;:28::i;:::-;24311:339;;;:::o;38416:110::-;35405:12;:10;:12::i;:::-;35394:23;;:7;:5;:7::i;:::-;:23;;;35386:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;38509:11:::1;38492:14;:28;;;;;;;;;;;;:::i;:::-;;38416:110:::0;:::o;24721:185::-;24859:39;24876:4;24882:2;24886:7;24859:39;;;;;;;;;;;;:16;:39::i;:::-;24721:185;;;:::o;21696:239::-;21768:7;21788:13;21804:7;:16;21812:7;21804:16;;;;;;;;;;;;;;;;;;;;;21788:32;;21856:1;21839:19;;:5;:19;;;;21831:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;21922:5;21915:12;;;21696:239;;;:::o;21426:208::-;21498:7;21543:1;21526:19;;:5;:19;;;;21518:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;21610:9;:16;21620:5;21610:16;;;;;;;;;;;;;;;;21603:23;;21426:208;;;:::o;35825:103::-;35405:12;:10;:12::i;:::-;35394:23;;:7;:5;:7::i;:::-;:23;;;35386:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;35890:30:::1;35917:1;35890:18;:30::i;:::-;35825:103::o:0;35174:87::-;35220:7;35247:6;;;;;;;;;;;35240:13;;35174:87;:::o;22171:104::-;22227:13;22260:7;22253:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22171:104;:::o;23854:155::-;23949:52;23968:12;:10;:12::i;:::-;23982:8;23992;23949:18;:52::i;:::-;23854:155;;:::o;24977:328::-;25152:41;25171:12;:10;:12::i;:::-;25185:7;25152:18;:41::i;:::-;25144:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;25258:39;25272:4;25278:2;25282:7;25291:5;25258:13;:39::i;:::-;24977:328;;;;:::o;38532:250::-;35405:12;:10;:12::i;:::-;35394:23;;:7;:5;:7::i;:::-;:23;;;35386:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;38606:9:::1;38601:176;38625:10;:17;38621:1;:21;38601:176;;;38658:21;:9;:19;:21::i;:::-;38688:16;38707:19;:9;:17;:19::i;:::-;38688:38;;38735:34;38745:10;38756:1;38745:13;;;;;;;;:::i;:::-;;;;;;;;38760:8;38735:9;:34::i;:::-;38649:128;38644:3;;;;;:::i;:::-;;;;38601:176;;;;38532:250:::0;:::o;38788:284::-;38854:13;38884:17;38892:8;38884:7;:17::i;:::-;38876:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;38987:1;38962:14;38956:28;;;;;:::i;:::-;;;:32;:110;;;;;;;;;;;;;;;;;39015:14;39031:19;:8;:17;:19::i;:::-;38998:62;;;;;;;;;:::i;:::-;;;;;;;;;;;;;38956:110;38949:117;;38788:284;;;:::o;24080:164::-;24177:4;24201:18;:25;24220:5;24201:25;;;;;;;;;;;;;;;:35;24227:8;24201:35;;;;;;;;;;;;;;;;;;;;;;;;;24194:42;;24080:164;;;;:::o;36083:201::-;35405:12;:10;:12::i;:::-;35394:23;;:7;:5;:7::i;:::-;:23;;;35386:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;36192:1:::1;36172:22;;:8;:22;;;;36164:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;36248:28;36267:8;36248:18;:28::i;:::-;36083:201:::0;:::o;19565:157::-;19650:4;19689:25;19674:40;;;:11;:40;;;;19667:47;;19565:157;;;:::o;26815:127::-;26880:4;26932:1;26904:30;;:7;:16;26912:7;26904:16;;;;;;;;;;;;;;;;;;;;;:30;;;;26897:37;;26815:127;;;:::o;16489:98::-;16542:7;16569:10;16562:17;;16489:98;:::o;30961:174::-;31063:2;31036:15;:24;31052:7;31036:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;31119:7;31115:2;31081:46;;31090:23;31105:7;31090:14;:23::i;:::-;31081:46;;;;;;;;;;;;30961:174;;:::o;27109:348::-;27202:4;27227:16;27235:7;27227;:16::i;:::-;27219:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;27303:13;27319:23;27334:7;27319:14;:23::i;:::-;27303:39;;27372:5;27361:16;;:7;:16;;;:51;;;;27405:7;27381:31;;:20;27393:7;27381:11;:20::i;:::-;:31;;;27361:51;:87;;;;27416:32;27433:5;27440:7;27416:16;:32::i;:::-;27361:87;27353:96;;;27109:348;;;;:::o;30218:625::-;30377:4;30350:31;;:23;30365:7;30350:14;:23::i;:::-;:31;;;30342:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;30456:1;30442:16;;:2;:16;;;;30434:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;30512:39;30533:4;30539:2;30543:7;30512:20;:39::i;:::-;30616:29;30633:1;30637:7;30616:8;:29::i;:::-;30677:1;30658:9;:15;30668:4;30658:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;30706:1;30689:9;:13;30699:2;30689:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;30737:2;30718:7;:16;30726:7;30718:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;30776:7;30772:2;30757:27;;30766:4;30757:27;;;;;;;;;;;;30797:38;30817:4;30823:2;30827:7;30797:19;:38::i;:::-;30218:625;;;:::o;36444:191::-;36518:16;36537:6;;;;;;;;;;;36518:25;;36563:8;36554:6;;:17;;;;;;;;;;;;;;;;;;36618:8;36587:40;;36608:8;36587:40;;;;;;;;;;;;36507:128;36444:191;:::o;31277:315::-;31432:8;31423:17;;:5;:17;;;;31415:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;31519:8;31481:18;:25;31500:5;31481:25;;;;;;;;;;;;;;;:35;31507:8;31481:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;31565:8;31543:41;;31558:5;31543:41;;;31575:8;31543:41;;;;;;:::i;:::-;;;;;;;;31277:315;;;:::o;26187:::-;26344:28;26354:4;26360:2;26364:7;26344:9;:28::i;:::-;26391:48;26414:4;26420:2;26424:7;26433:5;26391:22;:48::i;:::-;26383:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;26187:315;;;;:::o;37579:127::-;37686:1;37668:7;:14;;;:19;;;;;;;;;;;37579:127;:::o;37457:114::-;37522:7;37549;:14;;;37542:21;;37457:114;;;:::o;27799:110::-;27875:26;27885:2;27889:7;27875:26;;;;;;;;;;;;:9;:26::i;:::-;27799:110;;:::o;17012:723::-;17068:13;17298:1;17289:5;:10;17285:53;;;17316:10;;;;;;;;;;;;;;;;;;;;;17285:53;17348:12;17363:5;17348:20;;17379:14;17404:78;17419:1;17411:4;:9;17404:78;;17437:8;;;;;:::i;:::-;;;;17468:2;17460:10;;;;;:::i;:::-;;;17404:78;;;17492:19;17524:6;17514:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17492:39;;17542:154;17558:1;17549:5;:10;17542:154;;17586:1;17576:11;;;;;:::i;:::-;;;17653:2;17645:5;:10;;;;:::i;:::-;17632:2;:24;;;;:::i;:::-;17619:39;;17602:6;17609;17602:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;17682:2;17673:11;;;;;:::i;:::-;;;17542:154;;;17720:6;17706:21;;;;;17012:723;;;;:::o;33528:126::-;;;;:::o;34039:125::-;;;;:::o;32157:799::-;32312:4;32333:15;:2;:13;;;:15::i;:::-;32329:620;;;32385:2;32369:36;;;32406:12;:10;:12::i;:::-;32420:4;32426:7;32435:5;32369:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;32365:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32628:1;32611:6;:13;:18;32607:272;;;32654:60;;;;;;;;;;:::i;:::-;;;;;;;;32607:272;32829:6;32823:13;32814:6;32810:2;32806:15;32799:38;32365:529;32502:41;;;32492:51;;;:6;:51;;;;32485:58;;;;;32329:620;32933:4;32926:11;;32157:799;;;;;;;:::o;28136:321::-;28266:18;28272:2;28276:7;28266:5;:18::i;:::-;28317:54;28348:1;28352:2;28356:7;28365:5;28317:22;:54::i;:::-;28295:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;28136:321;;;:::o;8596:326::-;8656:4;8913:1;8891:7;:19;;;:23;8884:30;;8596:326;;;:::o;28793:439::-;28887:1;28873:16;;:2;:16;;;;28865:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;28946:16;28954:7;28946;:16::i;:::-;28945:17;28937:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;29008:45;29037:1;29041:2;29045:7;29008:20;:45::i;:::-;29083:1;29066:9;:13;29076:2;29066:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;29114:2;29095:7;:16;29103:7;29095:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;29159:7;29155:2;29134:33;;29151:1;29134:33;;;;;;;;;;;;29180:44;29208:1;29212:2;29216:7;29180:19;:44::i;:::-;28793:439;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:99::-;1570:6;1604:5;1598:12;1588:22;;1518:99;;;:::o;1623:169::-;1707:11;1741:6;1736:3;1729:19;1781:4;1776:3;1772:14;1757:29;;1623:169;;;;:::o;1798:307::-;1866:1;1876:113;1890:6;1887:1;1884:13;1876:113;;;1975:1;1970:3;1966:11;1960:18;1956:1;1951:3;1947:11;1940:39;1912:2;1909:1;1905:10;1900:15;;1876:113;;;2007:6;2004:1;2001:13;1998:101;;;2087:1;2078:6;2073:3;2069:16;2062:27;1998:101;1847:258;1798:307;;;:::o;2111:102::-;2152:6;2203:2;2199:7;2194:2;2187:5;2183:14;2179:28;2169:38;;2111:102;;;:::o;2219:364::-;2307:3;2335:39;2368:5;2335:39;:::i;:::-;2390:71;2454:6;2449:3;2390:71;:::i;:::-;2383:78;;2470:52;2515:6;2510:3;2503:4;2496:5;2492:16;2470:52;:::i;:::-;2547:29;2569:6;2547:29;:::i;:::-;2542:3;2538:39;2531:46;;2311:272;2219:364;;;;:::o;2589:313::-;2702:4;2740:2;2729:9;2725:18;2717:26;;2789:9;2783:4;2779:20;2775:1;2764:9;2760:17;2753:47;2817:78;2890:4;2881:6;2817:78;:::i;:::-;2809:86;;2589:313;;;;:::o;2908:77::-;2945:7;2974:5;2963:16;;2908:77;;;:::o;2991:122::-;3064:24;3082:5;3064:24;:::i;:::-;3057:5;3054:35;3044:63;;3103:1;3100;3093:12;3044:63;2991:122;:::o;3119:139::-;3165:5;3203:6;3190:20;3181:29;;3219:33;3246:5;3219:33;:::i;:::-;3119:139;;;;:::o;3264:329::-;3323:6;3372:2;3360:9;3351:7;3347:23;3343:32;3340:119;;;3378:79;;:::i;:::-;3340:119;3498:1;3523:53;3568:7;3559:6;3548:9;3544:22;3523:53;:::i;:::-;3513:63;;3469:117;3264:329;;;;:::o;3599:126::-;3636:7;3676:42;3669:5;3665:54;3654:65;;3599:126;;;:::o;3731:96::-;3768:7;3797:24;3815:5;3797:24;:::i;:::-;3786:35;;3731:96;;;:::o;3833:118::-;3920:24;3938:5;3920:24;:::i;:::-;3915:3;3908:37;3833:118;;:::o;3957:222::-;4050:4;4088:2;4077:9;4073:18;4065:26;;4101:71;4169:1;4158:9;4154:17;4145:6;4101:71;:::i;:::-;3957:222;;;;:::o;4185:122::-;4258:24;4276:5;4258:24;:::i;:::-;4251:5;4248:35;4238:63;;4297:1;4294;4287:12;4238:63;4185:122;:::o;4313:139::-;4359:5;4397:6;4384:20;4375:29;;4413:33;4440:5;4413:33;:::i;:::-;4313:139;;;;:::o;4458:474::-;4526:6;4534;4583:2;4571:9;4562:7;4558:23;4554:32;4551:119;;;4589:79;;:::i;:::-;4551:119;4709:1;4734:53;4779:7;4770:6;4759:9;4755:22;4734:53;:::i;:::-;4724:63;;4680:117;4836:2;4862:53;4907:7;4898:6;4887:9;4883:22;4862:53;:::i;:::-;4852:63;;4807:118;4458:474;;;;;:::o;4938:619::-;5015:6;5023;5031;5080:2;5068:9;5059:7;5055:23;5051:32;5048:119;;;5086:79;;:::i;:::-;5048:119;5206:1;5231:53;5276:7;5267:6;5256:9;5252:22;5231:53;:::i;:::-;5221:63;;5177:117;5333:2;5359:53;5404:7;5395:6;5384:9;5380:22;5359:53;:::i;:::-;5349:63;;5304:118;5461:2;5487:53;5532:7;5523:6;5512:9;5508:22;5487:53;:::i;:::-;5477:63;;5432:118;4938:619;;;;;:::o;5563:117::-;5672:1;5669;5662:12;5686:117;5795:1;5792;5785:12;5809:180;5857:77;5854:1;5847:88;5954:4;5951:1;5944:15;5978:4;5975:1;5968:15;5995:281;6078:27;6100:4;6078:27;:::i;:::-;6070:6;6066:40;6208:6;6196:10;6193:22;6172:18;6160:10;6157:34;6154:62;6151:88;;;6219:18;;:::i;:::-;6151:88;6259:10;6255:2;6248:22;6038:238;5995:281;;:::o;6282:129::-;6316:6;6343:20;;:::i;:::-;6333:30;;6372:33;6400:4;6392:6;6372:33;:::i;:::-;6282:129;;;:::o;6417:308::-;6479:4;6569:18;6561:6;6558:30;6555:56;;;6591:18;;:::i;:::-;6555:56;6629:29;6651:6;6629:29;:::i;:::-;6621:37;;6713:4;6707;6703:15;6695:23;;6417:308;;;:::o;6731:154::-;6815:6;6810:3;6805;6792:30;6877:1;6868:6;6863:3;6859:16;6852:27;6731:154;;;:::o;6891:412::-;6969:5;6994:66;7010:49;7052:6;7010:49;:::i;:::-;6994:66;:::i;:::-;6985:75;;7083:6;7076:5;7069:21;7121:4;7114:5;7110:16;7159:3;7150:6;7145:3;7141:16;7138:25;7135:112;;;7166:79;;:::i;:::-;7135:112;7256:41;7290:6;7285:3;7280;7256:41;:::i;:::-;6975:328;6891:412;;;;;:::o;7323:340::-;7379:5;7428:3;7421:4;7413:6;7409:17;7405:27;7395:122;;7436:79;;:::i;:::-;7395:122;7553:6;7540:20;7578:79;7653:3;7645:6;7638:4;7630:6;7626:17;7578:79;:::i;:::-;7569:88;;7385:278;7323:340;;;;:::o;7669:509::-;7738:6;7787:2;7775:9;7766:7;7762:23;7758:32;7755:119;;;7793:79;;:::i;:::-;7755:119;7941:1;7930:9;7926:17;7913:31;7971:18;7963:6;7960:30;7957:117;;;7993:79;;:::i;:::-;7957:117;8098:63;8153:7;8144:6;8133:9;8129:22;8098:63;:::i;:::-;8088:73;;7884:287;7669:509;;;;:::o;8184:329::-;8243:6;8292:2;8280:9;8271:7;8267:23;8263:32;8260:119;;;8298:79;;:::i;:::-;8260:119;8418:1;8443:53;8488:7;8479:6;8468:9;8464:22;8443:53;:::i;:::-;8433:63;;8389:117;8184:329;;;;:::o;8519:118::-;8606:24;8624:5;8606:24;:::i;:::-;8601:3;8594:37;8519:118;;:::o;8643:222::-;8736:4;8774:2;8763:9;8759:18;8751:26;;8787:71;8855:1;8844:9;8840:17;8831:6;8787:71;:::i;:::-;8643:222;;;;:::o;8871:116::-;8941:21;8956:5;8941:21;:::i;:::-;8934:5;8931:32;8921:60;;8977:1;8974;8967:12;8921:60;8871:116;:::o;8993:133::-;9036:5;9074:6;9061:20;9052:29;;9090:30;9114:5;9090:30;:::i;:::-;8993:133;;;;:::o;9132:468::-;9197:6;9205;9254:2;9242:9;9233:7;9229:23;9225:32;9222:119;;;9260:79;;:::i;:::-;9222:119;9380:1;9405:53;9450:7;9441:6;9430:9;9426:22;9405:53;:::i;:::-;9395:63;;9351:117;9507:2;9533:50;9575:7;9566:6;9555:9;9551:22;9533:50;:::i;:::-;9523:60;;9478:115;9132:468;;;;;:::o;9606:307::-;9667:4;9757:18;9749:6;9746:30;9743:56;;;9779:18;;:::i;:::-;9743:56;9817:29;9839:6;9817:29;:::i;:::-;9809:37;;9901:4;9895;9891:15;9883:23;;9606:307;;;:::o;9919:410::-;9996:5;10021:65;10037:48;10078:6;10037:48;:::i;:::-;10021:65;:::i;:::-;10012:74;;10109:6;10102:5;10095:21;10147:4;10140:5;10136:16;10185:3;10176:6;10171:3;10167:16;10164:25;10161:112;;;10192:79;;:::i;:::-;10161:112;10282:41;10316:6;10311:3;10306;10282:41;:::i;:::-;10002:327;9919:410;;;;;:::o;10348:338::-;10403:5;10452:3;10445:4;10437:6;10433:17;10429:27;10419:122;;10460:79;;:::i;:::-;10419:122;10577:6;10564:20;10602:78;10676:3;10668:6;10661:4;10653:6;10649:17;10602:78;:::i;:::-;10593:87;;10409:277;10348:338;;;;:::o;10692:943::-;10787:6;10795;10803;10811;10860:3;10848:9;10839:7;10835:23;10831:33;10828:120;;;10867:79;;:::i;:::-;10828:120;10987:1;11012:53;11057:7;11048:6;11037:9;11033:22;11012:53;:::i;:::-;11002:63;;10958:117;11114:2;11140:53;11185:7;11176:6;11165:9;11161:22;11140:53;:::i;:::-;11130:63;;11085:118;11242:2;11268:53;11313:7;11304:6;11293:9;11289:22;11268:53;:::i;:::-;11258:63;;11213:118;11398:2;11387:9;11383:18;11370:32;11429:18;11421:6;11418:30;11415:117;;;11451:79;;:::i;:::-;11415:117;11556:62;11610:7;11601:6;11590:9;11586:22;11556:62;:::i;:::-;11546:72;;11341:287;10692:943;;;;;;;:::o;11641:311::-;11718:4;11808:18;11800:6;11797:30;11794:56;;;11830:18;;:::i;:::-;11794:56;11880:4;11872:6;11868:17;11860:25;;11940:4;11934;11930:15;11922:23;;11641:311;;;:::o;11958:117::-;12067:1;12064;12057:12;12098:710;12194:5;12219:81;12235:64;12292:6;12235:64;:::i;:::-;12219:81;:::i;:::-;12210:90;;12320:5;12349:6;12342:5;12335:21;12383:4;12376:5;12372:16;12365:23;;12436:4;12428:6;12424:17;12416:6;12412:30;12465:3;12457:6;12454:15;12451:122;;;12484:79;;:::i;:::-;12451:122;12599:6;12582:220;12616:6;12611:3;12608:15;12582:220;;;12691:3;12720:37;12753:3;12741:10;12720:37;:::i;:::-;12715:3;12708:50;12787:4;12782:3;12778:14;12771:21;;12658:144;12642:4;12637:3;12633:14;12626:21;;12582:220;;;12586:21;12200:608;;12098:710;;;;;:::o;12831:370::-;12902:5;12951:3;12944:4;12936:6;12932:17;12928:27;12918:122;;12959:79;;:::i;:::-;12918:122;13076:6;13063:20;13101:94;13191:3;13183:6;13176:4;13168:6;13164:17;13101:94;:::i;:::-;13092:103;;12908:293;12831:370;;;;:::o;13207:539::-;13291:6;13340:2;13328:9;13319:7;13315:23;13311:32;13308:119;;;13346:79;;:::i;:::-;13308:119;13494:1;13483:9;13479:17;13466:31;13524:18;13516:6;13513:30;13510:117;;;13546:79;;:::i;:::-;13510:117;13651:78;13721:7;13712:6;13701:9;13697:22;13651:78;:::i;:::-;13641:88;;13437:302;13207:539;;;;:::o;13752:474::-;13820:6;13828;13877:2;13865:9;13856:7;13852:23;13848:32;13845:119;;;13883:79;;:::i;:::-;13845:119;14003:1;14028:53;14073:7;14064:6;14053:9;14049:22;14028:53;:::i;:::-;14018:63;;13974:117;14130:2;14156:53;14201:7;14192:6;14181:9;14177:22;14156:53;:::i;:::-;14146:63;;14101:118;13752:474;;;;;:::o;14232:180::-;14280:77;14277:1;14270:88;14377:4;14374:1;14367:15;14401:4;14398:1;14391:15;14418:320;14462:6;14499:1;14493:4;14489:12;14479:22;;14546:1;14540:4;14536:12;14567:18;14557:81;;14623:4;14615:6;14611:17;14601:27;;14557:81;14685:2;14677:6;14674:14;14654:18;14651:38;14648:84;;;14704:18;;:::i;:::-;14648:84;14469:269;14418:320;;;:::o;14744:231::-;14884:34;14880:1;14872:6;14868:14;14861:58;14953:14;14948:2;14940:6;14936:15;14929:39;14744:231;:::o;14981:366::-;15123:3;15144:67;15208:2;15203:3;15144:67;:::i;:::-;15137:74;;15220:93;15309:3;15220:93;:::i;:::-;15338:2;15333:3;15329:12;15322:19;;14981:366;;;:::o;15353:419::-;15519:4;15557:2;15546:9;15542:18;15534:26;;15606:9;15600:4;15596:20;15592:1;15581:9;15577:17;15570:47;15634:131;15760:4;15634:131;:::i;:::-;15626:139;;15353:419;;;:::o;15778:220::-;15918:34;15914:1;15906:6;15902:14;15895:58;15987:3;15982:2;15974:6;15970:15;15963:28;15778:220;:::o;16004:366::-;16146:3;16167:67;16231:2;16226:3;16167:67;:::i;:::-;16160:74;;16243:93;16332:3;16243:93;:::i;:::-;16361:2;16356:3;16352:12;16345:19;;16004:366;;;:::o;16376:419::-;16542:4;16580:2;16569:9;16565:18;16557:26;;16629:9;16623:4;16619:20;16615:1;16604:9;16600:17;16593:47;16657:131;16783:4;16657:131;:::i;:::-;16649:139;;16376:419;;;:::o;16801:243::-;16941:34;16937:1;16929:6;16925:14;16918:58;17010:26;17005:2;16997:6;16993:15;16986:51;16801:243;:::o;17050:366::-;17192:3;17213:67;17277:2;17272:3;17213:67;:::i;:::-;17206:74;;17289:93;17378:3;17289:93;:::i;:::-;17407:2;17402:3;17398:12;17391:19;;17050:366;;;:::o;17422:419::-;17588:4;17626:2;17615:9;17611:18;17603:26;;17675:9;17669:4;17665:20;17661:1;17650:9;17646:17;17639:47;17703:131;17829:4;17703:131;:::i;:::-;17695:139;;17422:419;;;:::o;17847:236::-;17987:34;17983:1;17975:6;17971:14;17964:58;18056:19;18051:2;18043:6;18039:15;18032:44;17847:236;:::o;18089:366::-;18231:3;18252:67;18316:2;18311:3;18252:67;:::i;:::-;18245:74;;18328:93;18417:3;18328:93;:::i;:::-;18446:2;18441:3;18437:12;18430:19;;18089:366;;;:::o;18461:419::-;18627:4;18665:2;18654:9;18650:18;18642:26;;18714:9;18708:4;18704:20;18700:1;18689:9;18685:17;18678:47;18742:131;18868:4;18742:131;:::i;:::-;18734:139;;18461:419;;;:::o;18886:182::-;19026:34;19022:1;19014:6;19010:14;19003:58;18886:182;:::o;19074:366::-;19216:3;19237:67;19301:2;19296:3;19237:67;:::i;:::-;19230:74;;19313:93;19402:3;19313:93;:::i;:::-;19431:2;19426:3;19422:12;19415:19;;19074:366;;;:::o;19446:419::-;19612:4;19650:2;19639:9;19635:18;19627:26;;19699:9;19693:4;19689:20;19685:1;19674:9;19670:17;19663:47;19727:131;19853:4;19727:131;:::i;:::-;19719:139;;19446:419;;;:::o;19871:228::-;20011:34;20007:1;19999:6;19995:14;19988:58;20080:11;20075:2;20067:6;20063:15;20056:36;19871:228;:::o;20105:366::-;20247:3;20268:67;20332:2;20327:3;20268:67;:::i;:::-;20261:74;;20344:93;20433:3;20344:93;:::i;:::-;20462:2;20457:3;20453:12;20446:19;;20105:366;;;:::o;20477:419::-;20643:4;20681:2;20670:9;20666:18;20658:26;;20730:9;20724:4;20720:20;20716:1;20705:9;20701:17;20694:47;20758:131;20884:4;20758:131;:::i;:::-;20750:139;;20477:419;;;:::o;20902:229::-;21042:34;21038:1;21030:6;21026:14;21019:58;21111:12;21106:2;21098:6;21094:15;21087:37;20902:229;:::o;21137:366::-;21279:3;21300:67;21364:2;21359:3;21300:67;:::i;:::-;21293:74;;21376:93;21465:3;21376:93;:::i;:::-;21494:2;21489:3;21485:12;21478:19;;21137:366;;;:::o;21509:419::-;21675:4;21713:2;21702:9;21698:18;21690:26;;21762:9;21756:4;21752:20;21748:1;21737:9;21733:17;21726:47;21790:131;21916:4;21790:131;:::i;:::-;21782:139;;21509:419;;;:::o;21934:180::-;21982:77;21979:1;21972:88;22079:4;22076:1;22069:15;22103:4;22100:1;22093:15;22120:180;22168:77;22165:1;22158:88;22265:4;22262:1;22255:15;22289:4;22286:1;22279:15;22306:233;22345:3;22368:24;22386:5;22368:24;:::i;:::-;22359:33;;22414:66;22407:5;22404:77;22401:103;;;22484:18;;:::i;:::-;22401:103;22531:1;22524:5;22520:13;22513:20;;22306:233;;;:::o;22545:223::-;22685:34;22681:1;22673:6;22669:14;22662:58;22754:6;22749:2;22741:6;22737:15;22730:31;22545:223;:::o;22774:366::-;22916:3;22937:67;23001:2;22996:3;22937:67;:::i;:::-;22930:74;;23013:93;23102:3;23013:93;:::i;:::-;23131:2;23126:3;23122:12;23115:19;;22774:366;;;:::o;23146:419::-;23312:4;23350:2;23339:9;23335:18;23327:26;;23399:9;23393:4;23389:20;23385:1;23374:9;23370:17;23363:47;23427:131;23553:4;23427:131;:::i;:::-;23419:139;;23146:419;;;:::o;23571:148::-;23673:11;23710:3;23695:18;;23571:148;;;;:::o;23725:141::-;23774:4;23797:3;23789:11;;23820:3;23817:1;23810:14;23854:4;23851:1;23841:18;23833:26;;23725:141;;;:::o;23896:845::-;23999:3;24036:5;24030:12;24065:36;24091:9;24065:36;:::i;:::-;24117:89;24199:6;24194:3;24117:89;:::i;:::-;24110:96;;24237:1;24226:9;24222:17;24253:1;24248:137;;;;24399:1;24394:341;;;;24215:520;;24248:137;24332:4;24328:9;24317;24313:25;24308:3;24301:38;24368:6;24363:3;24359:16;24352:23;;24248:137;;24394:341;24461:38;24493:5;24461:38;:::i;:::-;24521:1;24535:154;24549:6;24546:1;24543:13;24535:154;;;24623:7;24617:14;24613:1;24608:3;24604:11;24597:35;24673:1;24664:7;24660:15;24649:26;;24571:4;24568:1;24564:12;24559:17;;24535:154;;;24718:6;24713:3;24709:16;24702:23;;24401:334;;24215:520;;24003:738;;23896:845;;;;:::o;24747:377::-;24853:3;24881:39;24914:5;24881:39;:::i;:::-;24936:89;25018:6;25013:3;24936:89;:::i;:::-;24929:96;;25034:52;25079:6;25074:3;25067:4;25060:5;25056:16;25034:52;:::i;:::-;25111:6;25106:3;25102:16;25095:23;;24857:267;24747:377;;;;:::o;25130:155::-;25270:7;25266:1;25258:6;25254:14;25247:31;25130:155;:::o;25291:400::-;25451:3;25472:84;25554:1;25549:3;25472:84;:::i;:::-;25465:91;;25565:93;25654:3;25565:93;:::i;:::-;25683:1;25678:3;25674:11;25667:18;;25291:400;;;:::o;25697:695::-;25975:3;25997:92;26085:3;26076:6;25997:92;:::i;:::-;25990:99;;26106:95;26197:3;26188:6;26106:95;:::i;:::-;26099:102;;26218:148;26362:3;26218:148;:::i;:::-;26211:155;;26383:3;26376:10;;25697:695;;;;;:::o;26398:225::-;26538:34;26534:1;26526:6;26522:14;26515:58;26607:8;26602:2;26594:6;26590:15;26583:33;26398:225;:::o;26629:366::-;26771:3;26792:67;26856:2;26851:3;26792:67;:::i;:::-;26785:74;;26868:93;26957:3;26868:93;:::i;:::-;26986:2;26981:3;26977:12;26970:19;;26629:366;;;:::o;27001:419::-;27167:4;27205:2;27194:9;27190:18;27182:26;;27254:9;27248:4;27244:20;27240:1;27229:9;27225:17;27218:47;27282:131;27408:4;27282:131;:::i;:::-;27274:139;;27001:419;;;:::o;27426:231::-;27566:34;27562:1;27554:6;27550:14;27543:58;27635:14;27630:2;27622:6;27618:15;27611:39;27426:231;:::o;27663:366::-;27805:3;27826:67;27890:2;27885:3;27826:67;:::i;:::-;27819:74;;27902:93;27991:3;27902:93;:::i;:::-;28020:2;28015:3;28011:12;28004:19;;27663:366;;;:::o;28035:419::-;28201:4;28239:2;28228:9;28224:18;28216:26;;28288:9;28282:4;28278:20;28274:1;28263:9;28259:17;28252:47;28316:131;28442:4;28316:131;:::i;:::-;28308:139;;28035:419;;;:::o;28460:224::-;28600:34;28596:1;28588:6;28584:14;28577:58;28669:7;28664:2;28656:6;28652:15;28645:32;28460:224;:::o;28690:366::-;28832:3;28853:67;28917:2;28912:3;28853:67;:::i;:::-;28846:74;;28929:93;29018:3;28929:93;:::i;:::-;29047:2;29042:3;29038:12;29031:19;;28690:366;;;:::o;29062:419::-;29228:4;29266:2;29255:9;29251:18;29243:26;;29315:9;29309:4;29305:20;29301:1;29290:9;29286:17;29279:47;29343:131;29469:4;29343:131;:::i;:::-;29335:139;;29062:419;;;:::o;29487:223::-;29627:34;29623:1;29615:6;29611:14;29604:58;29696:6;29691:2;29683:6;29679:15;29672:31;29487:223;:::o;29716:366::-;29858:3;29879:67;29943:2;29938:3;29879:67;:::i;:::-;29872:74;;29955:93;30044:3;29955:93;:::i;:::-;30073:2;30068:3;30064:12;30057:19;;29716:366;;;:::o;30088:419::-;30254:4;30292:2;30281:9;30277:18;30269:26;;30341:9;30335:4;30331:20;30327:1;30316:9;30312:17;30305:47;30369:131;30495:4;30369:131;:::i;:::-;30361:139;;30088:419;;;:::o;30513:191::-;30553:4;30573:20;30591:1;30573:20;:::i;:::-;30568:25;;30607:20;30625:1;30607:20;:::i;:::-;30602:25;;30646:1;30643;30640:8;30637:34;;;30651:18;;:::i;:::-;30637:34;30696:1;30693;30689:9;30681:17;;30513:191;;;;:::o;30710:305::-;30750:3;30769:20;30787:1;30769:20;:::i;:::-;30764:25;;30803:20;30821:1;30803:20;:::i;:::-;30798:25;;30957:1;30889:66;30885:74;30882:1;30879:81;30876:107;;;30963:18;;:::i;:::-;30876:107;31007:1;31004;31000:9;30993:16;;30710:305;;;;:::o;31021:175::-;31161:27;31157:1;31149:6;31145:14;31138:51;31021:175;:::o;31202:366::-;31344:3;31365:67;31429:2;31424:3;31365:67;:::i;:::-;31358:74;;31441:93;31530:3;31441:93;:::i;:::-;31559:2;31554:3;31550:12;31543:19;;31202:366;;;:::o;31574:419::-;31740:4;31778:2;31767:9;31763:18;31755:26;;31827:9;31821:4;31817:20;31813:1;31802:9;31798:17;31791:47;31855:131;31981:4;31855:131;:::i;:::-;31847:139;;31574:419;;;:::o;31999:237::-;32139:34;32135:1;32127:6;32123:14;32116:58;32208:20;32203:2;32195:6;32191:15;32184:45;31999:237;:::o;32242:366::-;32384:3;32405:67;32469:2;32464:3;32405:67;:::i;:::-;32398:74;;32481:93;32570:3;32481:93;:::i;:::-;32599:2;32594:3;32590:12;32583:19;;32242:366;;;:::o;32614:419::-;32780:4;32818:2;32807:9;32803:18;32795:26;;32867:9;32861:4;32857:20;32853:1;32842:9;32838:17;32831:47;32895:131;33021:4;32895:131;:::i;:::-;32887:139;;32614:419;;;:::o;33039:180::-;33087:77;33084:1;33077:88;33184:4;33181:1;33174:15;33208:4;33205:1;33198:15;33225:185;33265:1;33282:20;33300:1;33282:20;:::i;:::-;33277:25;;33316:20;33334:1;33316:20;:::i;:::-;33311:25;;33355:1;33345:35;;33360:18;;:::i;:::-;33345:35;33402:1;33399;33395:9;33390:14;;33225:185;;;;:::o;33416:176::-;33448:1;33465:20;33483:1;33465:20;:::i;:::-;33460:25;;33499:20;33517:1;33499:20;:::i;:::-;33494:25;;33538:1;33528:35;;33543:18;;:::i;:::-;33528:35;33584:1;33581;33577:9;33572:14;;33416:176;;;;:::o;33598:98::-;33649:6;33683:5;33677:12;33667:22;;33598:98;;;:::o;33702:168::-;33785:11;33819:6;33814:3;33807:19;33859:4;33854:3;33850:14;33835:29;;33702:168;;;;:::o;33876:360::-;33962:3;33990:38;34022:5;33990:38;:::i;:::-;34044:70;34107:6;34102:3;34044:70;:::i;:::-;34037:77;;34123:52;34168:6;34163:3;34156:4;34149:5;34145:16;34123:52;:::i;:::-;34200:29;34222:6;34200:29;:::i;:::-;34195:3;34191:39;34184:46;;33966:270;33876:360;;;;:::o;34242:640::-;34437:4;34475:3;34464:9;34460:19;34452:27;;34489:71;34557:1;34546:9;34542:17;34533:6;34489:71;:::i;:::-;34570:72;34638:2;34627:9;34623:18;34614:6;34570:72;:::i;:::-;34652;34720:2;34709:9;34705:18;34696:6;34652:72;:::i;:::-;34771:9;34765:4;34761:20;34756:2;34745:9;34741:18;34734:48;34799:76;34870:4;34861:6;34799:76;:::i;:::-;34791:84;;34242:640;;;;;;;:::o;34888:141::-;34944:5;34975:6;34969:13;34960:22;;34991:32;35017:5;34991:32;:::i;:::-;34888:141;;;;:::o;35035:349::-;35104:6;35153:2;35141:9;35132:7;35128:23;35124:32;35121:119;;;35159:79;;:::i;:::-;35121:119;35279:1;35304:63;35359:7;35350:6;35339:9;35335:22;35304:63;:::i;:::-;35294:73;;35250:127;35035:349;;;;:::o;35390:182::-;35530:34;35526:1;35518:6;35514:14;35507:58;35390:182;:::o;35578:366::-;35720:3;35741:67;35805:2;35800:3;35741:67;:::i;:::-;35734:74;;35817:93;35906:3;35817:93;:::i;:::-;35935:2;35930:3;35926:12;35919:19;;35578:366;;;:::o;35950:419::-;36116:4;36154:2;36143:9;36139:18;36131:26;;36203:9;36197:4;36193:20;36189:1;36178:9;36174:17;36167:47;36231:131;36357:4;36231:131;:::i;:::-;36223:139;;35950:419;;;:::o;36375:178::-;36515:30;36511:1;36503:6;36499:14;36492:54;36375:178;:::o;36559:366::-;36701:3;36722:67;36786:2;36781:3;36722:67;:::i;:::-;36715:74;;36798:93;36887:3;36798:93;:::i;:::-;36916:2;36911:3;36907:12;36900:19;;36559:366;;;:::o;36931:419::-;37097:4;37135:2;37124:9;37120:18;37112:26;;37184:9;37178:4;37174:20;37170:1;37159:9;37155:17;37148:47;37212:131;37338:4;37212:131;:::i;:::-;37204:139;;36931:419;;;:::o

Swarm Source

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