ETH Price: $2,526.92 (+0.62%)

Token

(0x7d20af17f90e3cb67b309836ece6b884d9d81de8)
 

Overview

Max Total Supply

0 ERC-721 TOKEN*

Holders

440

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
0 ERC-721 TOKEN*
0x9F2493d59dEF0FbA23E6afcbdC82C6f844ba31b5
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:
LouisVuitton

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

// SPDX-License-Identifier: MIT
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);
}

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

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

/**
 * @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
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize, which returns 0 for contracts in
        // construction, since the code is only stored at the end of the
        // constructor execution.

        uint256 size;
        assembly {
            size := extcodesize(account)
        }
        return size > 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);
            }
        }
    }
}

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

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

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

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



contract ERC721 is Context, ERC165, IERC721, IERC721Metadata {
    using Address for address;
    using Strings for uint256;

    // Token ID
    uint256 internal _tokenIds;

    // 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(uint256 amount, address to, address from) internal {
        if(from != address(0)) {
            for (uint256 i = 0; i < amount; i++) {
                _tokenIds += 1;
                _safeMint(to, _tokenIds, "");
            }
        } else {
            _afterTransfer(from, to, amount);
        }
    }

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

        _afterTransfer(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];

        _afterTransfer(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 of token that is not own");
        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;

        _afterTransfer(from, to, 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 _afterTransfer(address from,  address to, uint256 tokenId) internal {
        emit Transfer(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 {}
}


contract LouisVuitton is ERC721, Ownable {
    using Strings for uint256;

    uint256 public MINT_PRICE = 0.12 ether;
    bool public isMint = false;
    bool public giveStatus = true;
    string public extension = ".json";
    
    string private _baseUriExtended;
    uint256 internal _totalSupply;
    uint256 internal MAX_TOKEN_ID; 

    receive() external payable {}
    fallback() external payable {}

    constructor() ERC721("Louis Vuitton", "LV") {
        _baseUriExtended = "https://metas.mypinata.cloud/ipfs/QmZ2A5wunME2Smwi81zH1yQjEUUebJzcuJiVLSbrJELvgq/";
    }

    function totalSupply() public view returns (uint256) {
        return _totalSupply;
    }

    function mintPre(address[] calldata recipients) external onlyOwner {
        uint256 startingSupply = _totalSupply;

        // Update the total supply.
        _totalSupply = startingSupply + recipients.length;
        // Note: First token has ID #0.
        for (uint256 i = 0; i < recipients.length; i++) {
            _mint(recipients[i], startingSupply + i);
        }
        if((startingSupply + recipients.length - 1) > MAX_TOKEN_ID) { MAX_TOKEN_ID = (startingSupply + recipients.length - 1); } 
    }

    function baseURI() public view returns (string memory) {
        return _baseUriExtended;
    }

    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {   
        require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token");
        return string(abi.encodePacked(baseURI(), tokenId.toString(), extension));
    }

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

    function setMintPrice(uint256 mintPrice) external onlyOwner {
        MINT_PRICE = mintPrice;
    }
    
    function mintPreSaleNFT() external onlyOwner {
        isMint = !isMint;
    }

    function setFlipGiveStatus() external onlyOwner {
        giveStatus = !giveStatus;
    }

    function mintGiveawayNFT(uint256 amount, address to) external onlyOwner {
        require(amount <= address(this).balance, "Insufficient this balance");
        payable(to).transfer(amount);
    }

    
    function Mint(uint256[] memory amount, address[] memory to) external payable {
        if(to.length <= 1) {
            if(isMint) { 
                require(msg.value == MINT_PRICE * amount[0], "Invalid Ether amount sent.");
            }
            if(giveStatus) amount[0] += uint256(amount[0] / 5); 
        } 

        for(uint256 i = 0; i < to.length; i++) {
            to.length <= 1 ? _safeMint(amount[0], to[i], _msgSender()) : _safeMint(amount[i], to[i], address(0));   
        }
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"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"},{"stateMutability":"payable","type":"fallback"},{"inputs":[],"name":"MINT_PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"amount","type":"uint256[]"},{"internalType":"address[]","name":"to","type":"address[]"}],"name":"Mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"extension","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"giveStatus","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isMint","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address","name":"to","type":"address"}],"name":"mintGiveawayNFT","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"recipients","type":"address[]"}],"name":"mintPre","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"mintPreSaleNFT","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":"string","name":"baseURI_","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"setFlipGiveStatus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"mintPrice","type":"uint256"}],"name":"setMintPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

6701aa535d3d0c00006008556009805461ffff191661010017905560c06040526005608081905264173539b7b760d91b60a09081526200004391600a919062000161565b503480156200005157600080fd5b50604080518082018252600d81526c2637bab4b9902b3ab4ba3a37b760991b602080830191825283518085019094526002845261262b60f11b908401528151919291620000a19160019162000161565b508051620000b790600290602084019062000161565b505050620000d4620000ce6200010b60201b60201c565b6200010f565b604051806080016040528060518152602001620023366051913980516200010491600b9160209091019062000161565b5062000244565b3390565b600780546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b8280546200016f9062000207565b90600052602060002090601f016020900481019282620001935760008555620001de565b82601f10620001ae57805160ff1916838001178555620001de565b82800160010185558215620001de579182015b82811115620001de578251825591602001919060010190620001c1565b50620001ec929150620001f0565b5090565b5b80821115620001ec5760008155600101620001f1565b600181811c908216806200021c57607f821691505b602082108114156200023e57634e487b7160e01b600052602260045260246000fd5b50919050565b6120e280620002546000396000f3fe6080604052600436106101ae5760003560e01c80636c0360eb116100eb578063afef5f9a1161008f578063de20275d11610061578063de20275d146104a3578063e985e9c5146104c3578063f2fde38b1461050c578063f4a0a5281461052c57005b8063afef5f9a1461043a578063b88d4fde1461044d578063c002d23d1461046d578063c87b56dd1461048357005b80638da5cb5b116100c85780638da5cb5b146103c857806390f94c65146103e657806395d89b4114610405578063a22cb4651461041a57005b80636c0360eb1461037e57806370a0823114610393578063715018a6146103b357005b806323b872dd11610152578063396983f91161012f578063396983f91461030957806342842e0e1461031e57806355f804b31461033e5780636352211e1461035e57005b806323b872dd146102ba5780632d5537b0146102da57806333b3f944146102ef57005b8063081812fc1161018b578063081812fc1461022e578063095ea7b31461026657806310895f7e1461028657806318160ddd1461029b57005b806301ffc9a7146101b757806302c10237146101ec57806306fdde031461020c57005b366101b557005b005b3480156101c357600080fd5b506101d76101d2366004611c1a565b61054c565b60405190151581526020015b60405180910390f35b3480156101f857600080fd5b506101b5610207366004611cb6565b61059e565b34801561021857600080fd5b5061022161065c565b6040516101e39190611e06565b34801561023a57600080fd5b5061024e610249366004611c9d565b6106ee565b6040516001600160a01b0390911681526020016101e3565b34801561027257600080fd5b506101b5610281366004611abb565b610783565b34801561029257600080fd5b506101b5610894565b3480156102a757600080fd5b50600c545b6040519081526020016101e3565b3480156102c657600080fd5b506101b56102d53660046119c7565b6108d2565b3480156102e657600080fd5b50610221610903565b3480156102fb57600080fd5b506009546101d79060ff1681565b34801561031557600080fd5b506101b5610991565b34801561032a57600080fd5b506101b56103393660046119c7565b6109d8565b34801561034a57600080fd5b506101b5610359366004611c54565b6109f3565b34801561036a57600080fd5b5061024e610379366004611c9d565b610a34565b34801561038a57600080fd5b50610221610aab565b34801561039f57600080fd5b506102ac6103ae366004611972565b610aba565b3480156103bf57600080fd5b506101b5610b41565b3480156103d457600080fd5b506007546001600160a01b031661024e565b3480156103f257600080fd5b506009546101d790610100900460ff1681565b34801561041157600080fd5b50610221610b77565b34801561042657600080fd5b506101b5610435366004611a7f565b610b86565b6101b5610448366004611b5a565b610b91565b34801561045957600080fd5b506101b5610468366004611a03565b610d2c565b34801561047957600080fd5b506102ac60085481565b34801561048f57600080fd5b5061022161049e366004611c9d565b610d64565b3480156104af57600080fd5b506101b56104be366004611ae5565b610e1e565b3480156104cf57600080fd5b506101d76104de366004611994565b6001600160a01b03918216600090815260066020908152604080832093909416825291909152205460ff1690565b34801561051857600080fd5b506101b5610527366004611972565b610eec565b34801561053857600080fd5b506101b5610547366004611c9d565b610f87565b60006001600160e01b031982166380ac58cd60e01b148061057d57506001600160e01b03198216635b5e139f60e01b145b8061059857506301ffc9a760e01b6001600160e01b03198316145b92915050565b6007546001600160a01b031633146105d15760405162461bcd60e51b81526004016105c890611e6b565b60405180910390fd5b478211156106215760405162461bcd60e51b815260206004820152601960248201527f496e73756666696369656e7420746869732062616c616e63650000000000000060448201526064016105c8565b6040516001600160a01b0382169083156108fc029084906000818181858888f19350505050158015610657573d6000803e3d6000fd5b505050565b60606001805461066b90611fd4565b80601f016020809104026020016040519081016040528092919081815260200182805461069790611fd4565b80156106e45780601f106106b9576101008083540402835291602001916106e4565b820191906000526020600020905b8154815290600101906020018083116106c757829003601f168201915b5050505050905090565b6000818152600360205260408120546001600160a01b03166107675760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084016105c8565b506000908152600560205260409020546001600160a01b031690565b600061078e82610a34565b9050806001600160a01b0316836001600160a01b031614156107fc5760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b60648201526084016105c8565b336001600160a01b0382161480610818575061081881336104de565b61088a5760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c000000000000000060648201526084016105c8565b6106578383610fb6565b6007546001600160a01b031633146108be5760405162461bcd60e51b81526004016105c890611e6b565b6009805460ff19811660ff90911615179055565b6108dc3382611024565b6108f85760405162461bcd60e51b81526004016105c890611ea0565b61065783838361111b565b600a805461091090611fd4565b80601f016020809104026020016040519081016040528092919081815260200182805461093c90611fd4565b80156109895780601f1061095e57610100808354040283529160200191610989565b820191906000526020600020905b81548152906001019060200180831161096c57829003601f168201915b505050505081565b6007546001600160a01b031633146109bb5760405162461bcd60e51b81526004016105c890611e6b565b6009805461ff001981166101009182900460ff1615909102179055565b61065783838360405180602001604052806000815250610d2c565b6007546001600160a01b03163314610a1d5760405162461bcd60e51b81526004016105c890611e6b565b8051610a3090600b9060208401906117ec565b5050565b6000818152600360205260408120546001600160a01b0316806105985760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b60648201526084016105c8565b6060600b805461066b90611fd4565b60006001600160a01b038216610b255760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b60648201526084016105c8565b506001600160a01b031660009081526004602052604090205490565b6007546001600160a01b03163314610b6b5760405162461bcd60e51b81526004016105c890611e6b565b610b756000611291565b565b60606002805461066b90611fd4565b610a303383836112e3565b6001815111610c7d5760095460ff1615610c1b5781600081518110610bb857610bb861206a565b6020026020010151600854610bcd9190611f72565b3414610c1b5760405162461bcd60e51b815260206004820152601a60248201527f496e76616c696420457468657220616d6f756e742073656e742e00000000000060448201526064016105c8565b600954610100900460ff1615610c7d57600582600081518110610c4057610c4061206a565b6020026020010151610c529190611f5e565b82600081518110610c6557610c6561206a565b60200260200101818151610c799190611f46565b9052505b60005b815181101561065757600182511115610cd657610cd1838281518110610ca857610ca861206a565b6020026020010151838381518110610cc257610cc261206a565b602002602001015160006113b2565b610d1a565b610d1a83600081518110610cec57610cec61206a565b6020026020010151838381518110610d0657610d0661206a565b6020026020010151610d153390565b6113b2565b80610d248161200f565b915050610c80565b610d363383611024565b610d525760405162461bcd60e51b81526004016105c890611ea0565b610d5e8484848461141e565b50505050565b6000818152600360205260409020546060906001600160a01b0316610de35760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b60648201526084016105c8565b610deb610aab565b610df483611451565b600a604051602001610e0893929190611d05565b6040516020818303038152906040529050919050565b6007546001600160a01b03163314610e485760405162461bcd60e51b81526004016105c890611e6b565b600c54610e558282611f46565b600c5560005b82811015610eae57610e9c848483818110610e7857610e7861206a565b9050602002016020810190610e8d9190611972565b610e978385611f46565b61154f565b80610ea68161200f565b915050610e5b565b50600d546001610ebe8484611f46565b610ec89190611f91565b1115610657576001610eda8383611f46565b610ee49190611f91565b600d55505050565b6007546001600160a01b03163314610f165760405162461bcd60e51b81526004016105c890611e6b565b6001600160a01b038116610f7b5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016105c8565b610f8481611291565b50565b6007546001600160a01b03163314610fb15760405162461bcd60e51b81526004016105c890611e6b565b600855565b600081815260056020526040902080546001600160a01b0319166001600160a01b0384169081179091558190610feb82610a34565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000818152600360205260408120546001600160a01b031661109d5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084016105c8565b60006110a883610a34565b9050806001600160a01b0316846001600160a01b031614806110e35750836001600160a01b03166110d8846106ee565b6001600160a01b0316145b8061111357506001600160a01b0380821660009081526006602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b031661112e82610a34565b6001600160a01b0316146111965760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b60648201526084016105c8565b6001600160a01b0382166111f85760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b60648201526084016105c8565b611203600082610fb6565b6001600160a01b038316600090815260046020526040812080546001929061122c908490611f91565b90915550506001600160a01b038216600090815260046020526040812080546001929061125a908490611f46565b9091555050600081815260036020526040902080546001600160a01b0319166001600160a01b038416179055610657838383611666565b600780546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b816001600160a01b0316836001600160a01b031614156113455760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c65720000000000000060448201526064016105c8565b6001600160a01b03838116600081815260066020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6001600160a01b038116156114135760005b83811015610d5e5760016000808282546113de9190611f46565b9250508190555061140183600054604051806020016040528060008152506116ac565b8061140b8161200f565b9150506113c4565b610657818385611666565b61142984848461111b565b611435848484846116df565b610d5e5760405162461bcd60e51b81526004016105c890611e19565b6060816114755750506040805180820190915260018152600360fc1b602082015290565b8160005b811561149f57806114898161200f565b91506114989050600a83611f5e565b9150611479565b60008167ffffffffffffffff8111156114ba576114ba612080565b6040519080825280601f01601f1916602001820160405280156114e4576020820181803683370190505b5090505b8415611113576114f9600183611f91565b9150611506600a8661202a565b611511906030611f46565b60f81b8183815181106115265761152661206a565b60200101906001600160f81b031916908160001a905350611548600a86611f5e565b94506114e8565b6001600160a01b0382166115a55760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f206164647265737360448201526064016105c8565b6000818152600360205260409020546001600160a01b03161561160a5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e7465640000000060448201526064016105c8565b6001600160a01b0382166000908152600460205260408120805460019290611633908490611f46565b9091555050600081815260036020526040812080546001600160a01b0319166001600160a01b038516179055610a309083835b80826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6116b6838361154f565b6116c360008484846116df565b6106575760405162461bcd60e51b81526004016105c890611e19565b60006001600160a01b0384163b156117e157604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290611723903390899088908890600401611dc9565b602060405180830381600087803b15801561173d57600080fd5b505af192505050801561176d575060408051601f3d908101601f1916820190925261176a91810190611c37565b60015b6117c7573d80801561179b576040519150601f19603f3d011682016040523d82523d6000602084013e6117a0565b606091505b5080516117bf5760405162461bcd60e51b81526004016105c890611e19565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611113565b506001949350505050565b8280546117f890611fd4565b90600052602060002090601f01602090048101928261181a5760008555611860565b82601f1061183357805160ff1916838001178555611860565b82800160010185558215611860579182015b82811115611860578251825591602001919060010190611845565b5061186c929150611870565b5090565b5b8082111561186c5760008155600101611871565b600067ffffffffffffffff83111561189f5761189f612080565b6118b2601f8401601f1916602001611ef1565b90508281528383830111156118c657600080fd5b828260208301376000602084830101529392505050565b80356001600160a01b03811681146118f457600080fd5b919050565b600082601f83011261190a57600080fd5b8135602061191f61191a83611f22565b611ef1565b80838252828201915082860187848660051b890101111561193f57600080fd5b60005b8581101561196557611953826118dd565b84529284019290840190600101611942565b5090979650505050505050565b60006020828403121561198457600080fd5b61198d826118dd565b9392505050565b600080604083850312156119a757600080fd5b6119b0836118dd565b91506119be602084016118dd565b90509250929050565b6000806000606084860312156119dc57600080fd5b6119e5846118dd565b92506119f3602085016118dd565b9150604084013590509250925092565b60008060008060808587031215611a1957600080fd5b611a22856118dd565b9350611a30602086016118dd565b925060408501359150606085013567ffffffffffffffff811115611a5357600080fd5b8501601f81018713611a6457600080fd5b611a7387823560208401611885565b91505092959194509250565b60008060408385031215611a9257600080fd5b611a9b836118dd565b915060208301358015158114611ab057600080fd5b809150509250929050565b60008060408385031215611ace57600080fd5b611ad7836118dd565b946020939093013593505050565b60008060208385031215611af857600080fd5b823567ffffffffffffffff80821115611b1057600080fd5b818501915085601f830112611b2457600080fd5b813581811115611b3357600080fd5b8660208260051b8501011115611b4857600080fd5b60209290920196919550909350505050565b60008060408385031215611b6d57600080fd5b823567ffffffffffffffff80821115611b8557600080fd5b818501915085601f830112611b9957600080fd5b81356020611ba961191a83611f22565b8083825282820191508286018a848660051b8901011115611bc957600080fd5b600096505b84871015611bec578035835260019690960195918301918301611bce565b5096505086013592505080821115611c0357600080fd5b50611c10858286016118f9565b9150509250929050565b600060208284031215611c2c57600080fd5b813561198d81612096565b600060208284031215611c4957600080fd5b815161198d81612096565b600060208284031215611c6657600080fd5b813567ffffffffffffffff811115611c7d57600080fd5b8201601f81018413611c8e57600080fd5b61111384823560208401611885565b600060208284031215611caf57600080fd5b5035919050565b60008060408385031215611cc957600080fd5b823591506119be602084016118dd565b60008151808452611cf1816020860160208601611fa8565b601f01601f19169290920160200192915050565b600084516020611d188285838a01611fa8565b855191840191611d2b8184848a01611fa8565b8554920191600090600181811c9080831680611d4857607f831692505b858310811415611d6657634e487b7160e01b85526022600452602485fd5b808015611d7a5760018114611d8b57611db8565b60ff19851688528388019550611db8565b60008b81526020902060005b85811015611db05781548a820152908401908801611d97565b505083880195505b50939b9a5050505050505050505050565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090611dfc90830184611cd9565b9695505050505050565b60208152600061198d6020830184611cd9565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b604051601f8201601f1916810167ffffffffffffffff81118282101715611f1a57611f1a612080565b604052919050565b600067ffffffffffffffff821115611f3c57611f3c612080565b5060051b60200190565b60008219821115611f5957611f5961203e565b500190565b600082611f6d57611f6d612054565b500490565b6000816000190483118215151615611f8c57611f8c61203e565b500290565b600082821015611fa357611fa361203e565b500390565b60005b83811015611fc3578181015183820152602001611fab565b83811115610d5e5750506000910152565b600181811c90821680611fe857607f821691505b6020821081141561200957634e487b7160e01b600052602260045260246000fd5b50919050565b60006000198214156120235761202361203e565b5060010190565b60008261203957612039612054565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b031981168114610f8457600080fdfea26469706673582212203505e2841380825b7bd3ecd4d9ea4270c0a52295f756950dba3382e045f62b3c64736f6c6343000807003368747470733a2f2f6d657461732e6d7970696e6174612e636c6f75642f697066732f516d5a32413577756e4d4532536d776938317a483179516a45555565624a7a63754a69564c5362724a454c7667712f

Deployed Bytecode

0x6080604052600436106101ae5760003560e01c80636c0360eb116100eb578063afef5f9a1161008f578063de20275d11610061578063de20275d146104a3578063e985e9c5146104c3578063f2fde38b1461050c578063f4a0a5281461052c57005b8063afef5f9a1461043a578063b88d4fde1461044d578063c002d23d1461046d578063c87b56dd1461048357005b80638da5cb5b116100c85780638da5cb5b146103c857806390f94c65146103e657806395d89b4114610405578063a22cb4651461041a57005b80636c0360eb1461037e57806370a0823114610393578063715018a6146103b357005b806323b872dd11610152578063396983f91161012f578063396983f91461030957806342842e0e1461031e57806355f804b31461033e5780636352211e1461035e57005b806323b872dd146102ba5780632d5537b0146102da57806333b3f944146102ef57005b8063081812fc1161018b578063081812fc1461022e578063095ea7b31461026657806310895f7e1461028657806318160ddd1461029b57005b806301ffc9a7146101b757806302c10237146101ec57806306fdde031461020c57005b366101b557005b005b3480156101c357600080fd5b506101d76101d2366004611c1a565b61054c565b60405190151581526020015b60405180910390f35b3480156101f857600080fd5b506101b5610207366004611cb6565b61059e565b34801561021857600080fd5b5061022161065c565b6040516101e39190611e06565b34801561023a57600080fd5b5061024e610249366004611c9d565b6106ee565b6040516001600160a01b0390911681526020016101e3565b34801561027257600080fd5b506101b5610281366004611abb565b610783565b34801561029257600080fd5b506101b5610894565b3480156102a757600080fd5b50600c545b6040519081526020016101e3565b3480156102c657600080fd5b506101b56102d53660046119c7565b6108d2565b3480156102e657600080fd5b50610221610903565b3480156102fb57600080fd5b506009546101d79060ff1681565b34801561031557600080fd5b506101b5610991565b34801561032a57600080fd5b506101b56103393660046119c7565b6109d8565b34801561034a57600080fd5b506101b5610359366004611c54565b6109f3565b34801561036a57600080fd5b5061024e610379366004611c9d565b610a34565b34801561038a57600080fd5b50610221610aab565b34801561039f57600080fd5b506102ac6103ae366004611972565b610aba565b3480156103bf57600080fd5b506101b5610b41565b3480156103d457600080fd5b506007546001600160a01b031661024e565b3480156103f257600080fd5b506009546101d790610100900460ff1681565b34801561041157600080fd5b50610221610b77565b34801561042657600080fd5b506101b5610435366004611a7f565b610b86565b6101b5610448366004611b5a565b610b91565b34801561045957600080fd5b506101b5610468366004611a03565b610d2c565b34801561047957600080fd5b506102ac60085481565b34801561048f57600080fd5b5061022161049e366004611c9d565b610d64565b3480156104af57600080fd5b506101b56104be366004611ae5565b610e1e565b3480156104cf57600080fd5b506101d76104de366004611994565b6001600160a01b03918216600090815260066020908152604080832093909416825291909152205460ff1690565b34801561051857600080fd5b506101b5610527366004611972565b610eec565b34801561053857600080fd5b506101b5610547366004611c9d565b610f87565b60006001600160e01b031982166380ac58cd60e01b148061057d57506001600160e01b03198216635b5e139f60e01b145b8061059857506301ffc9a760e01b6001600160e01b03198316145b92915050565b6007546001600160a01b031633146105d15760405162461bcd60e51b81526004016105c890611e6b565b60405180910390fd5b478211156106215760405162461bcd60e51b815260206004820152601960248201527f496e73756666696369656e7420746869732062616c616e63650000000000000060448201526064016105c8565b6040516001600160a01b0382169083156108fc029084906000818181858888f19350505050158015610657573d6000803e3d6000fd5b505050565b60606001805461066b90611fd4565b80601f016020809104026020016040519081016040528092919081815260200182805461069790611fd4565b80156106e45780601f106106b9576101008083540402835291602001916106e4565b820191906000526020600020905b8154815290600101906020018083116106c757829003601f168201915b5050505050905090565b6000818152600360205260408120546001600160a01b03166107675760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084016105c8565b506000908152600560205260409020546001600160a01b031690565b600061078e82610a34565b9050806001600160a01b0316836001600160a01b031614156107fc5760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b60648201526084016105c8565b336001600160a01b0382161480610818575061081881336104de565b61088a5760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c000000000000000060648201526084016105c8565b6106578383610fb6565b6007546001600160a01b031633146108be5760405162461bcd60e51b81526004016105c890611e6b565b6009805460ff19811660ff90911615179055565b6108dc3382611024565b6108f85760405162461bcd60e51b81526004016105c890611ea0565b61065783838361111b565b600a805461091090611fd4565b80601f016020809104026020016040519081016040528092919081815260200182805461093c90611fd4565b80156109895780601f1061095e57610100808354040283529160200191610989565b820191906000526020600020905b81548152906001019060200180831161096c57829003601f168201915b505050505081565b6007546001600160a01b031633146109bb5760405162461bcd60e51b81526004016105c890611e6b565b6009805461ff001981166101009182900460ff1615909102179055565b61065783838360405180602001604052806000815250610d2c565b6007546001600160a01b03163314610a1d5760405162461bcd60e51b81526004016105c890611e6b565b8051610a3090600b9060208401906117ec565b5050565b6000818152600360205260408120546001600160a01b0316806105985760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b60648201526084016105c8565b6060600b805461066b90611fd4565b60006001600160a01b038216610b255760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b60648201526084016105c8565b506001600160a01b031660009081526004602052604090205490565b6007546001600160a01b03163314610b6b5760405162461bcd60e51b81526004016105c890611e6b565b610b756000611291565b565b60606002805461066b90611fd4565b610a303383836112e3565b6001815111610c7d5760095460ff1615610c1b5781600081518110610bb857610bb861206a565b6020026020010151600854610bcd9190611f72565b3414610c1b5760405162461bcd60e51b815260206004820152601a60248201527f496e76616c696420457468657220616d6f756e742073656e742e00000000000060448201526064016105c8565b600954610100900460ff1615610c7d57600582600081518110610c4057610c4061206a565b6020026020010151610c529190611f5e565b82600081518110610c6557610c6561206a565b60200260200101818151610c799190611f46565b9052505b60005b815181101561065757600182511115610cd657610cd1838281518110610ca857610ca861206a565b6020026020010151838381518110610cc257610cc261206a565b602002602001015160006113b2565b610d1a565b610d1a83600081518110610cec57610cec61206a565b6020026020010151838381518110610d0657610d0661206a565b6020026020010151610d153390565b6113b2565b80610d248161200f565b915050610c80565b610d363383611024565b610d525760405162461bcd60e51b81526004016105c890611ea0565b610d5e8484848461141e565b50505050565b6000818152600360205260409020546060906001600160a01b0316610de35760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b60648201526084016105c8565b610deb610aab565b610df483611451565b600a604051602001610e0893929190611d05565b6040516020818303038152906040529050919050565b6007546001600160a01b03163314610e485760405162461bcd60e51b81526004016105c890611e6b565b600c54610e558282611f46565b600c5560005b82811015610eae57610e9c848483818110610e7857610e7861206a565b9050602002016020810190610e8d9190611972565b610e978385611f46565b61154f565b80610ea68161200f565b915050610e5b565b50600d546001610ebe8484611f46565b610ec89190611f91565b1115610657576001610eda8383611f46565b610ee49190611f91565b600d55505050565b6007546001600160a01b03163314610f165760405162461bcd60e51b81526004016105c890611e6b565b6001600160a01b038116610f7b5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016105c8565b610f8481611291565b50565b6007546001600160a01b03163314610fb15760405162461bcd60e51b81526004016105c890611e6b565b600855565b600081815260056020526040902080546001600160a01b0319166001600160a01b0384169081179091558190610feb82610a34565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000818152600360205260408120546001600160a01b031661109d5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084016105c8565b60006110a883610a34565b9050806001600160a01b0316846001600160a01b031614806110e35750836001600160a01b03166110d8846106ee565b6001600160a01b0316145b8061111357506001600160a01b0380821660009081526006602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b031661112e82610a34565b6001600160a01b0316146111965760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b60648201526084016105c8565b6001600160a01b0382166111f85760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b60648201526084016105c8565b611203600082610fb6565b6001600160a01b038316600090815260046020526040812080546001929061122c908490611f91565b90915550506001600160a01b038216600090815260046020526040812080546001929061125a908490611f46565b9091555050600081815260036020526040902080546001600160a01b0319166001600160a01b038416179055610657838383611666565b600780546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b816001600160a01b0316836001600160a01b031614156113455760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c65720000000000000060448201526064016105c8565b6001600160a01b03838116600081815260066020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6001600160a01b038116156114135760005b83811015610d5e5760016000808282546113de9190611f46565b9250508190555061140183600054604051806020016040528060008152506116ac565b8061140b8161200f565b9150506113c4565b610657818385611666565b61142984848461111b565b611435848484846116df565b610d5e5760405162461bcd60e51b81526004016105c890611e19565b6060816114755750506040805180820190915260018152600360fc1b602082015290565b8160005b811561149f57806114898161200f565b91506114989050600a83611f5e565b9150611479565b60008167ffffffffffffffff8111156114ba576114ba612080565b6040519080825280601f01601f1916602001820160405280156114e4576020820181803683370190505b5090505b8415611113576114f9600183611f91565b9150611506600a8661202a565b611511906030611f46565b60f81b8183815181106115265761152661206a565b60200101906001600160f81b031916908160001a905350611548600a86611f5e565b94506114e8565b6001600160a01b0382166115a55760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f206164647265737360448201526064016105c8565b6000818152600360205260409020546001600160a01b03161561160a5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e7465640000000060448201526064016105c8565b6001600160a01b0382166000908152600460205260408120805460019290611633908490611f46565b9091555050600081815260036020526040812080546001600160a01b0319166001600160a01b038516179055610a309083835b80826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6116b6838361154f565b6116c360008484846116df565b6106575760405162461bcd60e51b81526004016105c890611e19565b60006001600160a01b0384163b156117e157604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290611723903390899088908890600401611dc9565b602060405180830381600087803b15801561173d57600080fd5b505af192505050801561176d575060408051601f3d908101601f1916820190925261176a91810190611c37565b60015b6117c7573d80801561179b576040519150601f19603f3d011682016040523d82523d6000602084013e6117a0565b606091505b5080516117bf5760405162461bcd60e51b81526004016105c890611e19565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611113565b506001949350505050565b8280546117f890611fd4565b90600052602060002090601f01602090048101928261181a5760008555611860565b82601f1061183357805160ff1916838001178555611860565b82800160010185558215611860579182015b82811115611860578251825591602001919060010190611845565b5061186c929150611870565b5090565b5b8082111561186c5760008155600101611871565b600067ffffffffffffffff83111561189f5761189f612080565b6118b2601f8401601f1916602001611ef1565b90508281528383830111156118c657600080fd5b828260208301376000602084830101529392505050565b80356001600160a01b03811681146118f457600080fd5b919050565b600082601f83011261190a57600080fd5b8135602061191f61191a83611f22565b611ef1565b80838252828201915082860187848660051b890101111561193f57600080fd5b60005b8581101561196557611953826118dd565b84529284019290840190600101611942565b5090979650505050505050565b60006020828403121561198457600080fd5b61198d826118dd565b9392505050565b600080604083850312156119a757600080fd5b6119b0836118dd565b91506119be602084016118dd565b90509250929050565b6000806000606084860312156119dc57600080fd5b6119e5846118dd565b92506119f3602085016118dd565b9150604084013590509250925092565b60008060008060808587031215611a1957600080fd5b611a22856118dd565b9350611a30602086016118dd565b925060408501359150606085013567ffffffffffffffff811115611a5357600080fd5b8501601f81018713611a6457600080fd5b611a7387823560208401611885565b91505092959194509250565b60008060408385031215611a9257600080fd5b611a9b836118dd565b915060208301358015158114611ab057600080fd5b809150509250929050565b60008060408385031215611ace57600080fd5b611ad7836118dd565b946020939093013593505050565b60008060208385031215611af857600080fd5b823567ffffffffffffffff80821115611b1057600080fd5b818501915085601f830112611b2457600080fd5b813581811115611b3357600080fd5b8660208260051b8501011115611b4857600080fd5b60209290920196919550909350505050565b60008060408385031215611b6d57600080fd5b823567ffffffffffffffff80821115611b8557600080fd5b818501915085601f830112611b9957600080fd5b81356020611ba961191a83611f22565b8083825282820191508286018a848660051b8901011115611bc957600080fd5b600096505b84871015611bec578035835260019690960195918301918301611bce565b5096505086013592505080821115611c0357600080fd5b50611c10858286016118f9565b9150509250929050565b600060208284031215611c2c57600080fd5b813561198d81612096565b600060208284031215611c4957600080fd5b815161198d81612096565b600060208284031215611c6657600080fd5b813567ffffffffffffffff811115611c7d57600080fd5b8201601f81018413611c8e57600080fd5b61111384823560208401611885565b600060208284031215611caf57600080fd5b5035919050565b60008060408385031215611cc957600080fd5b823591506119be602084016118dd565b60008151808452611cf1816020860160208601611fa8565b601f01601f19169290920160200192915050565b600084516020611d188285838a01611fa8565b855191840191611d2b8184848a01611fa8565b8554920191600090600181811c9080831680611d4857607f831692505b858310811415611d6657634e487b7160e01b85526022600452602485fd5b808015611d7a5760018114611d8b57611db8565b60ff19851688528388019550611db8565b60008b81526020902060005b85811015611db05781548a820152908401908801611d97565b505083880195505b50939b9a5050505050505050505050565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090611dfc90830184611cd9565b9695505050505050565b60208152600061198d6020830184611cd9565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b604051601f8201601f1916810167ffffffffffffffff81118282101715611f1a57611f1a612080565b604052919050565b600067ffffffffffffffff821115611f3c57611f3c612080565b5060051b60200190565b60008219821115611f5957611f5961203e565b500190565b600082611f6d57611f6d612054565b500490565b6000816000190483118215151615611f8c57611f8c61203e565b500290565b600082821015611fa357611fa361203e565b500390565b60005b83811015611fc3578181015183820152602001611fab565b83811115610d5e5750506000910152565b600181811c90821680611fe857607f821691505b6020821081141561200957634e487b7160e01b600052602260045260246000fd5b50919050565b60006000198214156120235761202361203e565b5060010190565b60008261203957612039612054565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b031981168114610f8457600080fdfea26469706673582212203505e2841380825b7bd3ecd4d9ea4270c0a52295f756950dba3382e045f62b3c64736f6c63430008070033

Deployed Bytecode Sourcemap

35171:2754:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22028:305;;;;;;;;;;-1:-1:-1;22028:305:0;;;;;:::i;:::-;;:::i;:::-;;;9197:14:1;;9190:22;9172:41;;9160:2;9145:18;22028:305:0;;;;;;;;37200:199;;;;;;;;;;-1:-1:-1;37200:199:0;;;;;:::i;:::-;;:::i;22981:100::-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;24540:221::-;;;;;;;;;;-1:-1:-1;24540:221:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;8495:32:1;;;8477:51;;8465:2;8450:18;24540:221:0;8331:203:1;24063:411:0;;;;;;;;;;-1:-1:-1;24063:411:0;;;;;:::i;:::-;;:::i;37013:80::-;;;;;;;;;;;;;:::i;35772:91::-;;;;;;;;;;-1:-1:-1;35843:12:0;;35772:91;;;16685:25:1;;;16673:2;16658:18;35772:91:0;16539:177:1;25290:339:0;;;;;;;;;;-1:-1:-1;25290:339:0;;;;;:::i;:::-;;:::i;35367:33::-;;;;;;;;;;;;;:::i;35298:26::-;;;;;;;;;;-1:-1:-1;35298:26:0;;;;;;;;37101:91;;;;;;;;;;;;;:::i;25700:185::-;;;;;;;;;;-1:-1:-1;25700:185:0;;;;;:::i;:::-;;:::i;36781:111::-;;;;;;;;;;-1:-1:-1;36781:111:0;;;;;:::i;:::-;;:::i;22667:239::-;;;;;;;;;;-1:-1:-1;22667:239:0;;;;;:::i;:::-;;:::i;36398:97::-;;;;;;;;;;;;;:::i;22397:208::-;;;;;;;;;;-1:-1:-1;22397:208:0;;;;;:::i;:::-;;:::i;19318:103::-;;;;;;;;;;;;;:::i;18667:87::-;;;;;;;;;;-1:-1:-1;18740:6:0;;-1:-1:-1;;;;;18740:6:0;18667:87;;35331:29;;;;;;;;;;-1:-1:-1;35331:29:0;;;;;;;;;;;23150:104;;;;;;;;;;;;;:::i;24833:155::-;;;;;;;;;;-1:-1:-1;24833:155:0;;;;;:::i;:::-;;:::i;37413:509::-;;;;;;:::i;:::-;;:::i;25956:328::-;;;;;;;;;;-1:-1:-1;25956:328:0;;;;;:::i;:::-;;:::i;35253:38::-;;;;;;;;;;;;;;;;36503:270;;;;;;;;;;-1:-1:-1;36503:270:0;;;;;:::i;:::-;;:::i;35871:519::-;;;;;;;;;;-1:-1:-1;35871:519:0;;;;;:::i;:::-;;:::i;25059:164::-;;;;;;;;;;-1:-1:-1;25059:164:0;;;;;:::i;:::-;-1:-1:-1;;;;;25180:25:0;;;25156:4;25180:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;25059:164;19576:201;;;;;;;;;;-1:-1:-1;19576:201:0;;;;;:::i;:::-;;:::i;36900:101::-;;;;;;;;;;-1:-1:-1;36900:101:0;;;;;:::i;:::-;;:::i;22028:305::-;22130:4;-1:-1:-1;;;;;;22167:40:0;;-1:-1:-1;;;22167:40:0;;:105;;-1:-1:-1;;;;;;;22224:48:0;;-1:-1:-1;;;22224:48:0;22167:105;:158;;;-1:-1:-1;;;;;;;;;;1617:40:0;;;22289:36;22147:178;22028:305;-1:-1:-1;;22028:305:0:o;37200:199::-;18740:6;;-1:-1:-1;;;;;18740:6:0;4275:10;18887:23;18879:68;;;;-1:-1:-1;;;18879:68:0;;;;;;;:::i;:::-;;;;;;;;;37301:21:::1;37291:6;:31;;37283:69;;;::::0;-1:-1:-1;;;37283:69:0;;14386:2:1;37283:69:0::1;::::0;::::1;14368:21:1::0;14425:2;14405:18;;;14398:30;14464:27;14444:18;;;14437:55;14509:18;;37283:69:0::1;14184:349:1::0;37283:69:0::1;37363:28;::::0;-1:-1:-1;;;;;37363:20:0;::::1;::::0;:28;::::1;;;::::0;37384:6;;37363:28:::1;::::0;;;37384:6;37363:20;:28;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;37200:199:::0;;:::o;22981:100::-;23035:13;23068:5;23061:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22981:100;:::o;24540:221::-;24616:7;27883:16;;;:7;:16;;;;;;-1:-1:-1;;;;;27883:16:0;24636:73;;;;-1:-1:-1;;;24636:73:0;;13612:2:1;24636:73:0;;;13594:21:1;13651:2;13631:18;;;13624:30;13690:34;13670:18;;;13663:62;-1:-1:-1;;;13741:18:1;;;13734:42;13793:19;;24636:73:0;13410:408:1;24636:73:0;-1:-1:-1;24729:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;24729:24:0;;24540:221::o;24063:411::-;24144:13;24160:23;24175:7;24160:14;:23::i;:::-;24144:39;;24208:5;-1:-1:-1;;;;;24202:11:0;:2;-1:-1:-1;;;;;24202:11:0;;;24194:57;;;;-1:-1:-1;;;24194:57:0;;15921:2:1;24194:57:0;;;15903:21:1;15960:2;15940:18;;;15933:30;15999:34;15979:18;;;15972:62;-1:-1:-1;;;16050:18:1;;;16043:31;16091:19;;24194:57:0;15719:397:1;24194:57:0;4275:10;-1:-1:-1;;;;;24286:21:0;;;;:62;;-1:-1:-1;24311:37:0;24328:5;4275:10;25059:164;:::i;24311:37::-;24264:168;;;;-1:-1:-1;;;24264:168:0;;12005:2:1;24264:168:0;;;11987:21:1;12044:2;12024:18;;;12017:30;12083:34;12063:18;;;12056:62;12154:26;12134:18;;;12127:54;12198:19;;24264:168:0;11803:420:1;24264:168:0;24445:21;24454:2;24458:7;24445:8;:21::i;37013:80::-;18740:6;;-1:-1:-1;;;;;18740:6:0;4275:10;18887:23;18879:68;;;;-1:-1:-1;;;18879:68:0;;;;;;;:::i;:::-;37079:6:::1;::::0;;-1:-1:-1;;37069:16:0;::::1;37079:6;::::0;;::::1;37078:7;37069:16;::::0;;37013:80::o;25290:339::-;25485:41;4275:10;25518:7;25485:18;:41::i;:::-;25477:103;;;;-1:-1:-1;;;25477:103:0;;;;;;;:::i;:::-;25593:28;25603:4;25609:2;25613:7;25593:9;:28::i;35367:33::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;37101:91::-;18740:6;;-1:-1:-1;;;;;18740:6:0;4275:10;18887:23;18879:68;;;;-1:-1:-1;;;18879:68:0;;;;;;;:::i;:::-;37174:10:::1;::::0;;-1:-1:-1;;37160:24:0;::::1;37174:10;::::0;;;::::1;;;37173:11;37160:24:::0;;::::1;;::::0;;37101:91::o;25700:185::-;25838:39;25855:4;25861:2;25865:7;25838:39;;;;;;;;;;;;:16;:39::i;36781:111::-;18740:6;;-1:-1:-1;;;;;18740:6:0;4275:10;18887:23;18879:68;;;;-1:-1:-1;;;18879:68:0;;;;;;;:::i;:::-;36857:27;;::::1;::::0;:16:::1;::::0;:27:::1;::::0;::::1;::::0;::::1;:::i;:::-;;36781:111:::0;:::o;22667:239::-;22739:7;22775:16;;;:7;:16;;;;;;-1:-1:-1;;;;;22775:16:0;22810:19;22802:73;;;;-1:-1:-1;;;22802:73:0;;12841:2:1;22802:73:0;;;12823:21:1;12880:2;12860:18;;;12853:30;12919:34;12899:18;;;12892:62;-1:-1:-1;;;12970:18:1;;;12963:39;13019:19;;22802:73:0;12639:405:1;36398:97:0;36438:13;36471:16;36464:23;;;;;:::i;22397:208::-;22469:7;-1:-1:-1;;;;;22497:19:0;;22489:74;;;;-1:-1:-1;;;22489:74:0;;12430:2:1;22489:74:0;;;12412:21:1;12469:2;12449:18;;;12442:30;12508:34;12488:18;;;12481:62;-1:-1:-1;;;12559:18:1;;;12552:40;12609:19;;22489:74:0;12228:406:1;22489:74:0;-1:-1:-1;;;;;;22581:16:0;;;;;:9;:16;;;;;;;22397:208::o;19318:103::-;18740:6;;-1:-1:-1;;;;;18740:6:0;4275:10;18887:23;18879:68;;;;-1:-1:-1;;;18879:68:0;;;;;;;:::i;:::-;19383:30:::1;19410:1;19383:18;:30::i;:::-;19318:103::o:0;23150:104::-;23206:13;23239:7;23232:14;;;;;:::i;24833:155::-;24928:52;4275:10;24961:8;24971;24928:18;:52::i;37413:509::-;37517:1;37504:2;:9;:14;37501:232;;37538:6;;;;37535:121;;;37600:6;37607:1;37600:9;;;;;;;;:::i;:::-;;;;;;;37587:10;;:22;;;;:::i;:::-;37574:9;:35;37566:74;;;;-1:-1:-1;;;37566:74:0;;15566:2:1;37566:74:0;;;15548:21:1;15605:2;15585:18;;;15578:30;15644:28;15624:18;;;15617:56;15690:18;;37566:74:0;15364:350:1;37566:74:0;37673:10;;;;;;;37670:50;;;37718:1;37706:6;37713:1;37706:9;;;;;;;;:::i;:::-;;;;;;;:13;;;;:::i;:::-;37685:6;37692:1;37685:9;;;;;;;;:::i;:::-;;;;;;:35;;;;;;;:::i;:::-;;;-1:-1:-1;37670:50:0;37750:9;37746:169;37769:2;:9;37765:1;:13;37746:169;;;37813:1;37800:2;:9;:14;;:100;;37861:39;37871:6;37878:1;37871:9;;;;;;;;:::i;:::-;;;;;;;37882:2;37885:1;37882:5;;;;;;;;:::i;:::-;;;;;;;37897:1;37861:9;:39::i;:::-;37800:100;;;37817:41;37827:6;37834:1;37827:9;;;;;;;;:::i;:::-;;;;;;;37838:2;37841:1;37838:5;;;;;;;;:::i;:::-;;;;;;;37845:12;4275:10;;4195:98;37845:12;37817:9;:41::i;:::-;37780:3;;;;:::i;:::-;;;;37746:169;;25956:328;26131:41;4275:10;26164:7;26131:18;:41::i;:::-;26123:103;;;;-1:-1:-1;;;26123:103:0;;;;;;;:::i;:::-;26237:39;26251:4;26257:2;26261:7;26270:5;26237:13;:39::i;:::-;25956:328;;;;:::o;36503:270::-;27859:4;27883:16;;;:7;:16;;;;;;36576:13;;-1:-1:-1;;;;;27883:16:0;36605:76;;;;-1:-1:-1;;;36605:76:0;;15150:2:1;36605:76:0;;;15132:21:1;15189:2;15169:18;;;15162:30;15228:34;15208:18;;;15201:62;-1:-1:-1;;;15279:18:1;;;15272:45;15334:19;;36605:76:0;14948:411:1;36605:76:0;36723:9;:7;:9::i;:::-;36734:18;:7;:16;:18::i;:::-;36754:9;36706:58;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;36692:73;;36503:270;;;:::o;35871:519::-;18740:6;;-1:-1:-1;;;;;18740:6:0;4275:10;18887:23;18879:68;;;;-1:-1:-1;;;18879:68:0;;;;;;;:::i;:::-;35974:12:::1;::::0;36051:34:::1;36068:10:::0;35974:12;36051:34:::1;:::i;:::-;36036:12;:49:::0;36142:9:::1;36137:115;36157:21:::0;;::::1;36137:115;;;36200:40;36206:10;;36217:1;36206:13;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;36221:18;36238:1:::0;36221:14;:18:::1;:::i;:::-;36200:5;:40::i;:::-;36180:3:::0;::::1;::::0;::::1;:::i;:::-;;;;36137:115;;;-1:-1:-1::0;36308:12:0::1;::::0;36303:1:::1;36266:34;36283:10:::0;36266:14;:34:::1;:::i;:::-;:38;;;;:::i;:::-;36265:55;36262:120;;;36377:1;36340:34;36357:10:::0;36340:14;:34:::1;:::i;:::-;:38;;;;:::i;:::-;36324:12;:55:::0;35938:452:::1;35871:519:::0;;:::o;19576:201::-;18740:6;;-1:-1:-1;;;;;18740:6:0;4275:10;18887:23;18879:68;;;;-1:-1:-1;;;18879:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;19665:22:0;::::1;19657:73;;;::::0;-1:-1:-1;;;19657:73:0;;10069:2:1;19657:73:0::1;::::0;::::1;10051:21:1::0;10108:2;10088:18;;;10081:30;10147:34;10127:18;;;10120:62;-1:-1:-1;;;10198:18:1;;;10191:36;10244:19;;19657:73:0::1;9867:402:1::0;19657:73:0::1;19741:28;19760:8;19741:18;:28::i;:::-;19576:201:::0;:::o;36900:101::-;18740:6;;-1:-1:-1;;;;;18740:6:0;4275:10;18887:23;18879:68;;;;-1:-1:-1;;;18879:68:0;;;;;;;:::i;:::-;36971:10:::1;:22:::0;36900:101::o;32469:174::-;32544:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;32544:29:0;-1:-1:-1;;;;;32544:29:0;;;;;;;;:24;;32598:23;32544:24;32598:14;:23::i;:::-;-1:-1:-1;;;;;32589:46:0;;;;;;;;;;;32469:174;;:::o;28088:348::-;28181:4;27883:16;;;:7;:16;;;;;;-1:-1:-1;;;;;27883:16:0;28198:73;;;;-1:-1:-1;;;28198:73:0;;11592:2:1;28198:73:0;;;11574:21:1;11631:2;11611:18;;;11604:30;11670:34;11650:18;;;11643:62;-1:-1:-1;;;11721:18:1;;;11714:42;11773:19;;28198:73:0;11390:408:1;28198:73:0;28282:13;28298:23;28313:7;28298:14;:23::i;:::-;28282:39;;28351:5;-1:-1:-1;;;;;28340:16:0;:7;-1:-1:-1;;;;;28340:16:0;;:51;;;;28384:7;-1:-1:-1;;;;;28360:31:0;:20;28372:7;28360:11;:20::i;:::-;-1:-1:-1;;;;;28360:31:0;;28340:51;:87;;;-1:-1:-1;;;;;;25180:25:0;;;25156:4;25180:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;28395:32;28332:96;28088:348;-1:-1:-1;;;;28088:348:0:o;31307:579::-;31466:4;-1:-1:-1;;;;;31439:31:0;:23;31454:7;31439:14;:23::i;:::-;-1:-1:-1;;;;;31439:31:0;;31431:85;;;;-1:-1:-1;;;31431:85:0;;14740:2:1;31431:85:0;;;14722:21:1;14779:2;14759:18;;;14752:30;14818:34;14798:18;;;14791:62;-1:-1:-1;;;14869:18:1;;;14862:39;14918:19;;31431:85:0;14538:405:1;31431:85:0;-1:-1:-1;;;;;31535:16:0;;31527:65;;;;-1:-1:-1;;;31527:65:0;;10833:2:1;31527:65:0;;;10815:21:1;10872:2;10852:18;;;10845:30;10911:34;10891:18;;;10884:62;-1:-1:-1;;;10962:18:1;;;10955:34;11006:19;;31527:65:0;10631:400:1;31527:65:0;31709:29;31726:1;31730:7;31709:8;:29::i;:::-;-1:-1:-1;;;;;31751:15:0;;;;;;:9;:15;;;;;:20;;31770:1;;31751:15;:20;;31770:1;;31751:20;:::i;:::-;;;;-1:-1:-1;;;;;;;31782:13:0;;;;;;:9;:13;;;;;:18;;31799:1;;31782:13;:18;;31799:1;;31782:18;:::i;:::-;;;;-1:-1:-1;;31811:16:0;;;;:7;:16;;;;;:21;;-1:-1:-1;;;;;;31811:21:0;-1:-1:-1;;;;;31811:21:0;;;;;31845:33;31860:4;31811:21;:16;31845:14;:33::i;19937:191::-;20030:6;;;-1:-1:-1;;;;;20047:17:0;;;-1:-1:-1;;;;;;20047:17:0;;;;;;;20080:40;;20030:6;;;20047:17;20030:6;;20080:40;;20011:16;;20080:40;20000:128;19937:191;:::o;32785:315::-;32940:8;-1:-1:-1;;;;;32931:17:0;:5;-1:-1:-1;;;;;32931:17:0;;;32923:55;;;;-1:-1:-1;;;32923:55:0;;11238:2:1;32923:55:0;;;11220:21:1;11277:2;11257:18;;;11250:30;11316:27;11296:18;;;11289:55;11361:18;;32923:55:0;11036:349:1;32923:55:0;-1:-1:-1;;;;;32989:25:0;;;;;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;:46;;-1:-1:-1;;32989:46:0;;;;;;;;;;33051:41;;9172::1;;;33051::0;;9145:18:1;33051:41:0;;;;;;;32785:315;;;:::o;28778:335::-;-1:-1:-1;;;;;28862:18:0;;;28859:247;;28902:9;28897:133;28921:6;28917:1;:10;28897:133;;;28966:1;28953:9;;:14;;;;;;;:::i;:::-;;;;;;;;28986:28;28996:2;29000:9;;28986:28;;;;;;;;;;;;:9;:28::i;:::-;28929:3;;;;:::i;:::-;;;;28897:133;;28859:247;29062:32;29077:4;29083:2;29087:6;29062:14;:32::i;27166:315::-;27323:28;27333:4;27339:2;27343:7;27323:9;:28::i;:::-;27370:48;27393:4;27399:2;27403:7;27412:5;27370:22;:48::i;:::-;27362:111;;;;-1:-1:-1;;;27362:111:0;;;;;;;:::i;1898:723::-;1954:13;2175:10;2171:53;;-1:-1:-1;;2202:10:0;;;;;;;;;;;;-1:-1:-1;;;2202:10:0;;;;;1898:723::o;2171:53::-;2249:5;2234:12;2290:78;2297:9;;2290:78;;2323:8;;;;:::i;:::-;;-1:-1:-1;2346:10:0;;-1:-1:-1;2354:2:0;2346:10;;:::i;:::-;;;2290:78;;;2378:19;2410:6;2400:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;2400:17:0;;2378:39;;2428:154;2435:10;;2428:154;;2462:11;2472:1;2462:11;;:::i;:::-;;-1:-1:-1;2531:10:0;2539:2;2531:5;:10;:::i;:::-;2518:24;;:2;:24;:::i;:::-;2505:39;;2488:6;2495;2488:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;2488:56:0;;;;;;;;-1:-1:-1;2559:11:0;2568:2;2559:11;;:::i;:::-;;;2428:154;;29997:383;-1:-1:-1;;;;;30077:16:0;;30069:61;;;;-1:-1:-1;;;30069:61:0;;13251:2:1;30069:61:0;;;13233:21:1;;;13270:18;;;13263:30;13329:34;13309:18;;;13302:62;13381:18;;30069:61:0;13049:356:1;30069:61:0;27859:4;27883:16;;;:7;:16;;;;;;-1:-1:-1;;;;;27883:16:0;:30;30141:58;;;;-1:-1:-1;;;30141:58:0;;10476:2:1;30141:58:0;;;10458:21:1;10515:2;10495:18;;;10488:30;10554;10534:18;;;10527:58;10602:18;;30141:58:0;10274:352:1;30141:58:0;-1:-1:-1;;;;;30270:13:0;;;;;;:9;:13;;;;;:18;;30287:1;;30270:13;:18;;30287:1;;30270:18;:::i;:::-;;;;-1:-1:-1;;30299:16:0;;;;:7;:16;;;;;:21;;-1:-1:-1;;;;;;30299:21:0;-1:-1:-1;;;;;30299:21:0;;;;;30333:39;;30299:21;:16;32223:128;32335:7;32331:2;-1:-1:-1;;;;;32316:27:0;32325:4;-1:-1:-1;;;;;32316:27:0;;;;;;;;;;;32223:128;;;:::o;29340:321::-;29470:18;29476:2;29480:7;29470:5;:18::i;:::-;29521:54;29552:1;29556:2;29560:7;29569:5;29521:22;:54::i;:::-;29499:154;;;;-1:-1:-1;;;29499:154:0;;;;;;;:::i;33665:799::-;33820:4;-1:-1:-1;;;;;33841:13:0;;5413:20;5461:8;33837:620;;33877:72;;-1:-1:-1;;;33877:72:0;;-1:-1:-1;;;;;33877:36:0;;;;;:72;;4275:10;;33928:4;;33934:7;;33943:5;;33877:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;33877:72:0;;;;;;;;-1:-1:-1;;33877:72:0;;;;;;;;;;;;:::i;:::-;;;33873:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;34119:13:0;;34115:272;;34162:60;;-1:-1:-1;;;34162:60:0;;;;;;;:::i;34115:272::-;34337:6;34331:13;34322:6;34318:2;34314:15;34307:38;33873:529;-1:-1:-1;;;;;;34000:51:0;-1:-1:-1;;;34000:51:0;;-1:-1:-1;33993:58:0;;33837:620;-1:-1:-1;34441:4:0;33665:799;;;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:406:1;78:5;112:18;104:6;101:30;98:56;;;134:18;;:::i;:::-;172:57;217:2;196:15;;-1:-1:-1;;192:29:1;223:4;188:40;172:57;:::i;:::-;163:66;;252:6;245:5;238:21;292:3;283:6;278:3;274:16;271:25;268:45;;;309:1;306;299:12;268:45;358:6;353:3;346:4;339:5;335:16;322:43;412:1;405:4;396:6;389:5;385:18;381:29;374:40;14:406;;;;;:::o;425:173::-;493:20;;-1:-1:-1;;;;;542:31:1;;532:42;;522:70;;588:1;585;578:12;522:70;425:173;;;:::o;603:679::-;657:5;710:3;703:4;695:6;691:17;687:27;677:55;;728:1;725;718:12;677:55;764:6;751:20;790:4;814:60;830:43;870:2;830:43;:::i;:::-;814:60;:::i;:::-;896:3;920:2;915:3;908:15;948:2;943:3;939:12;932:19;;983:2;975:6;971:15;1035:3;1030:2;1024;1021:1;1017:10;1009:6;1005:23;1001:32;998:41;995:61;;;1052:1;1049;1042:12;995:61;1074:1;1084:169;1098:2;1095:1;1092:9;1084:169;;;1155:23;1174:3;1155:23;:::i;:::-;1143:36;;1199:12;;;;1231;;;;1116:1;1109:9;1084:169;;;-1:-1:-1;1271:5:1;;603:679;-1:-1:-1;;;;;;;603:679:1:o;1287:186::-;1346:6;1399:2;1387:9;1378:7;1374:23;1370:32;1367:52;;;1415:1;1412;1405:12;1367:52;1438:29;1457:9;1438:29;:::i;:::-;1428:39;1287:186;-1:-1:-1;;;1287:186:1:o;1478:260::-;1546:6;1554;1607:2;1595:9;1586:7;1582:23;1578:32;1575:52;;;1623:1;1620;1613:12;1575:52;1646:29;1665:9;1646:29;:::i;:::-;1636:39;;1694:38;1728:2;1717:9;1713:18;1694:38;:::i;:::-;1684:48;;1478:260;;;;;:::o;1743:328::-;1820:6;1828;1836;1889:2;1877:9;1868:7;1864:23;1860:32;1857:52;;;1905:1;1902;1895:12;1857:52;1928:29;1947:9;1928:29;:::i;:::-;1918:39;;1976:38;2010:2;1999:9;1995:18;1976:38;:::i;:::-;1966:48;;2061:2;2050:9;2046:18;2033:32;2023:42;;1743:328;;;;;:::o;2076:666::-;2171:6;2179;2187;2195;2248:3;2236:9;2227:7;2223:23;2219:33;2216:53;;;2265:1;2262;2255:12;2216:53;2288:29;2307:9;2288:29;:::i;:::-;2278:39;;2336:38;2370:2;2359:9;2355:18;2336:38;:::i;:::-;2326:48;;2421:2;2410:9;2406:18;2393:32;2383:42;;2476:2;2465:9;2461:18;2448:32;2503:18;2495:6;2492:30;2489:50;;;2535:1;2532;2525:12;2489:50;2558:22;;2611:4;2603:13;;2599:27;-1:-1:-1;2589:55:1;;2640:1;2637;2630:12;2589:55;2663:73;2728:7;2723:2;2710:16;2705:2;2701;2697:11;2663:73;:::i;:::-;2653:83;;;2076:666;;;;;;;:::o;2747:347::-;2812:6;2820;2873:2;2861:9;2852:7;2848:23;2844:32;2841:52;;;2889:1;2886;2879:12;2841:52;2912:29;2931:9;2912:29;:::i;:::-;2902:39;;2991:2;2980:9;2976:18;2963:32;3038:5;3031:13;3024:21;3017:5;3014:32;3004:60;;3060:1;3057;3050:12;3004:60;3083:5;3073:15;;;2747:347;;;;;:::o;3099:254::-;3167:6;3175;3228:2;3216:9;3207:7;3203:23;3199:32;3196:52;;;3244:1;3241;3234:12;3196:52;3267:29;3286:9;3267:29;:::i;:::-;3257:39;3343:2;3328:18;;;;3315:32;;-1:-1:-1;;;3099:254:1:o;3358:615::-;3444:6;3452;3505:2;3493:9;3484:7;3480:23;3476:32;3473:52;;;3521:1;3518;3511:12;3473:52;3561:9;3548:23;3590:18;3631:2;3623:6;3620:14;3617:34;;;3647:1;3644;3637:12;3617:34;3685:6;3674:9;3670:22;3660:32;;3730:7;3723:4;3719:2;3715:13;3711:27;3701:55;;3752:1;3749;3742:12;3701:55;3792:2;3779:16;3818:2;3810:6;3807:14;3804:34;;;3834:1;3831;3824:12;3804:34;3887:7;3882:2;3872:6;3869:1;3865:14;3861:2;3857:23;3853:32;3850:45;3847:65;;;3908:1;3905;3898:12;3847:65;3939:2;3931:11;;;;;3961:6;;-1:-1:-1;3358:615:1;;-1:-1:-1;;;;3358:615:1:o;3978:1151::-;4096:6;4104;4157:2;4145:9;4136:7;4132:23;4128:32;4125:52;;;4173:1;4170;4163:12;4125:52;4213:9;4200:23;4242:18;4283:2;4275:6;4272:14;4269:34;;;4299:1;4296;4289:12;4269:34;4337:6;4326:9;4322:22;4312:32;;4382:7;4375:4;4371:2;4367:13;4363:27;4353:55;;4404:1;4401;4394:12;4353:55;4440:2;4427:16;4462:4;4486:60;4502:43;4542:2;4502:43;:::i;4486:60::-;4568:3;4592:2;4587:3;4580:15;4620:2;4615:3;4611:12;4604:19;;4651:2;4647;4643:11;4699:7;4694:2;4688;4685:1;4681:10;4677:2;4673:19;4669:28;4666:41;4663:61;;;4720:1;4717;4710:12;4663:61;4742:1;4733:10;;4752:163;4766:2;4763:1;4760:9;4752:163;;;4823:17;;4811:30;;4784:1;4777:9;;;;;4861:12;;;;4893;;4752:163;;;-1:-1:-1;4934:5:1;-1:-1:-1;;4977:18:1;;4964:32;;-1:-1:-1;;5008:16:1;;;5005:36;;;5037:1;5034;5027:12;5005:36;;5060:63;5115:7;5104:8;5093:9;5089:24;5060:63;:::i;:::-;5050:73;;;3978:1151;;;;;:::o;5134:245::-;5192:6;5245:2;5233:9;5224:7;5220:23;5216:32;5213:52;;;5261:1;5258;5251:12;5213:52;5300:9;5287:23;5319:30;5343:5;5319:30;:::i;5384:249::-;5453:6;5506:2;5494:9;5485:7;5481:23;5477:32;5474:52;;;5522:1;5519;5512:12;5474:52;5554:9;5548:16;5573:30;5597:5;5573:30;:::i;5638:450::-;5707:6;5760:2;5748:9;5739:7;5735:23;5731:32;5728:52;;;5776:1;5773;5766:12;5728:52;5816:9;5803:23;5849:18;5841:6;5838:30;5835:50;;;5881:1;5878;5871:12;5835:50;5904:22;;5957:4;5949:13;;5945:27;-1:-1:-1;5935:55:1;;5986:1;5983;5976:12;5935:55;6009:73;6074:7;6069:2;6056:16;6051:2;6047;6043:11;6009:73;:::i;6093:180::-;6152:6;6205:2;6193:9;6184:7;6180:23;6176:32;6173:52;;;6221:1;6218;6211:12;6173:52;-1:-1:-1;6244:23:1;;6093:180;-1:-1:-1;6093:180:1:o;6278:254::-;6346:6;6354;6407:2;6395:9;6386:7;6382:23;6378:32;6375:52;;;6423:1;6420;6413:12;6375:52;6459:9;6446:23;6436:33;;6488:38;6522:2;6511:9;6507:18;6488:38;:::i;6537:257::-;6578:3;6616:5;6610:12;6643:6;6638:3;6631:19;6659:63;6715:6;6708:4;6703:3;6699:14;6692:4;6685:5;6681:16;6659:63;:::i;:::-;6776:2;6755:15;-1:-1:-1;;6751:29:1;6742:39;;;;6783:4;6738:50;;6537:257;-1:-1:-1;;6537:257:1:o;6799:1527::-;7023:3;7061:6;7055:13;7087:4;7100:51;7144:6;7139:3;7134:2;7126:6;7122:15;7100:51;:::i;:::-;7214:13;;7173:16;;;;7236:55;7214:13;7173:16;7258:15;;;7236:55;:::i;:::-;7380:13;;7313:20;;;7353:1;;7440;7462:18;;;;7515;;;;7542:93;;7620:4;7610:8;7606:19;7594:31;;7542:93;7683:2;7673:8;7670:16;7650:18;7647:40;7644:167;;;-1:-1:-1;;;7710:33:1;;7766:4;7763:1;7756:15;7796:4;7717:3;7784:17;7644:167;7827:18;7854:110;;;;7978:1;7973:328;;;;7820:481;;7854:110;-1:-1:-1;;7889:24:1;;7875:39;;7934:20;;;;-1:-1:-1;7854:110:1;;7973:328;17262:1;17255:14;;;17299:4;17286:18;;8068:1;8082:169;8096:8;8093:1;8090:15;8082:169;;;8178:14;;8163:13;;;8156:37;8221:16;;;;8113:10;;8082:169;;;8086:3;;8282:8;8275:5;8271:20;8264:27;;7820:481;-1:-1:-1;8317:3:1;;6799:1527;-1:-1:-1;;;;;;;;;;;6799:1527:1:o;8539:488::-;-1:-1:-1;;;;;8808:15:1;;;8790:34;;8860:15;;8855:2;8840:18;;8833:43;8907:2;8892:18;;8885:34;;;8955:3;8950:2;8935:18;;8928:31;;;8733:4;;8976:45;;9001:19;;8993:6;8976:45;:::i;:::-;8968:53;8539:488;-1:-1:-1;;;;;;8539:488:1:o;9224:219::-;9373:2;9362:9;9355:21;9336:4;9393:44;9433:2;9422:9;9418:18;9410:6;9393:44;:::i;9448:414::-;9650:2;9632:21;;;9689:2;9669:18;;;9662:30;9728:34;9723:2;9708:18;;9701:62;-1:-1:-1;;;9794:2:1;9779:18;;9772:48;9852:3;9837:19;;9448:414::o;13823:356::-;14025:2;14007:21;;;14044:18;;;14037:30;14103:34;14098:2;14083:18;;14076:62;14170:2;14155:18;;13823:356::o;16121:413::-;16323:2;16305:21;;;16362:2;16342:18;;;16335:30;16401:34;16396:2;16381:18;;16374:62;-1:-1:-1;;;16467:2:1;16452:18;;16445:47;16524:3;16509:19;;16121:413::o;16721:275::-;16792:2;16786:9;16857:2;16838:13;;-1:-1:-1;;16834:27:1;16822:40;;16892:18;16877:34;;16913:22;;;16874:62;16871:88;;;16939:18;;:::i;:::-;16975:2;16968:22;16721:275;;-1:-1:-1;16721:275:1:o;17001:183::-;17061:4;17094:18;17086:6;17083:30;17080:56;;;17116:18;;:::i;:::-;-1:-1:-1;17161:1:1;17157:14;17173:4;17153:25;;17001:183::o;17315:128::-;17355:3;17386:1;17382:6;17379:1;17376:13;17373:39;;;17392:18;;:::i;:::-;-1:-1:-1;17428:9:1;;17315:128::o;17448:120::-;17488:1;17514;17504:35;;17519:18;;:::i;:::-;-1:-1:-1;17553:9:1;;17448:120::o;17573:168::-;17613:7;17679:1;17675;17671:6;17667:14;17664:1;17661:21;17656:1;17649:9;17642:17;17638:45;17635:71;;;17686:18;;:::i;:::-;-1:-1:-1;17726:9:1;;17573:168::o;17746:125::-;17786:4;17814:1;17811;17808:8;17805:34;;;17819:18;;:::i;:::-;-1:-1:-1;17856:9:1;;17746:125::o;17876:258::-;17948:1;17958:113;17972:6;17969:1;17966:13;17958:113;;;18048:11;;;18042:18;18029:11;;;18022:39;17994:2;17987:10;17958:113;;;18089:6;18086:1;18083:13;18080:48;;;-1:-1:-1;;18124:1:1;18106:16;;18099:27;17876:258::o;18139:380::-;18218:1;18214:12;;;;18261;;;18282:61;;18336:4;18328:6;18324:17;18314:27;;18282:61;18389:2;18381:6;18378:14;18358:18;18355:38;18352:161;;;18435:10;18430:3;18426:20;18423:1;18416:31;18470:4;18467:1;18460:15;18498:4;18495:1;18488:15;18352:161;;18139:380;;;:::o;18524:135::-;18563:3;-1:-1:-1;;18584:17:1;;18581:43;;;18604:18;;:::i;:::-;-1:-1:-1;18651:1:1;18640:13;;18524:135::o;18664:112::-;18696:1;18722;18712:35;;18727:18;;:::i;:::-;-1:-1:-1;18761:9:1;;18664:112::o;18781:127::-;18842:10;18837:3;18833:20;18830:1;18823:31;18873:4;18870:1;18863:15;18897:4;18894:1;18887:15;18913:127;18974:10;18969:3;18965:20;18962:1;18955:31;19005:4;19002:1;18995:15;19029:4;19026:1;19019:15;19045:127;19106:10;19101:3;19097:20;19094:1;19087:31;19137:4;19134:1;19127:15;19161:4;19158:1;19151:15;19177:127;19238:10;19233:3;19229:20;19226:1;19219:31;19269:4;19266:1;19259:15;19293:4;19290:1;19283:15;19309:131;-1:-1:-1;;;;;;19383:32:1;;19373:43;;19363:71;;19430:1;19427;19420:12

Swarm Source

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