ETH Price: $2,483.40 (-1.20%)

Token

OGenerator (OG)
 

Overview

Max Total Supply

0 OG

Holders

11

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
lakoubay.eth
Balance
1 OG
0xF1db8A2623193757317639d0532daA5e3C8EA20c
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:
OG

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

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

/*
________    ________                                   __                
\_____  \  /  _____/  ____   ____   ________________ _/  |_  ___________ 
 /   |   \/   \  ____/ __ \ /    \_/ __ \_  __ \__  \\   __\/  _ \_  __ \
/    |    \    \_\  \  ___/|   |  \  ___/|  | \// __ \|  | (  <_> )  | \/
\_______  /\______  /\___  >___|  /\___  >__|  (____  /__|  \____/|__|   
        \/        \/     \/     \/     \/           \/                   

OGenerator.xyz
by Damjanski + Steve Snygin
*/


pragma solidity ^0.8.0;



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

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

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

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

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

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


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

pragma solidity ^0.8.0;

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

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

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


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

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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


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

pragma solidity ^0.8.0;

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

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


// OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721Receiver.sol)

pragma solidity ^0.8.0;

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

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


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

pragma solidity ^0.8.0;

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

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


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

pragma solidity ^0.8.0;


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

// File: IERC2981.sol

pragma solidity ^0.8.0;



///
/// @dev Interface for the NFT Royalty Standard
///
interface IERC2981 is IERC165 {
    /// ERC165 bytes to add to interface array - set in parent contract
    /// implementing this standard
    ///
    /// bytes4(keccak256("royaltyInfo(uint256,uint256)")) == 0x2a55205a
    /// bytes4 private constant _INTERFACE_ID_ERC2981 = 0x2a55205a;
    /// _registerInterface(_INTERFACE_ID_ERC2981);

    /// @notice Called with the sale price to determine how much royalty
    //          is owed and to whom.
    /// @param _tokenId - the NFT asset queried for royalty information
    /// @param _salePrice - the sale price of the NFT asset specified by _tokenId
    /// @return receiver - address of who should be sent the royalty payment
    /// @return royaltyAmount - the royalty payment amount for _salePrice
    function royaltyInfo(
        uint256 _tokenId,
        uint256 _salePrice
    ) external view returns (
        address receiver,
        uint256 royaltyAmount
    );

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


// OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721.sol)

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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

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

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

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

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


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

pragma solidity ^0.8.0;


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

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

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

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


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

pragma solidity ^0.8.0;








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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

    bool public mintingActive;

   

    // 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 'data:application/json;base64,';
    }

    /**
     * @dev See {IERC721-approve}.
     */
    function approve(address to, uint256 tokenId) public virtual override {
        address owner = ERC721.ownerOf(tokenId);
        require(to != owner, "ERC721: approval to current owner");

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

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

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

    /**
     * @dev See {IERC721-transferFrom}.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        //solhint-disable-next-line max-line-length
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved");

        _transfer(from, to, tokenId);
    }

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

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) public virtual override {
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved");
        _safeTransfer(from, to, tokenId, _data);
    }

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
     * are aware of the ERC721 protocol to prevent tokens from being forever locked.
     *
     * `_data` is additional data, it has no specified format and it is sent in call to `to`.
     *
     * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g.
     * implement alternative mechanisms to perform token transfer, such as signature-based.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function _safeTransfer(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) internal virtual {
        _transfer(from, to, tokenId);
        require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer");
    }

    /**
     * @dev Returns whether `tokenId` exists.
     *
     * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}.
     *
     * Tokens start existing when they are minted (`_mint`),
     * and stop existing when they are burned (`_burn`).
     */
    function _exists(uint256 tokenId) internal view virtual returns (bool) {
        return _owners[tokenId] != address(0);
    }

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

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

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



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

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

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

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

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

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

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

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

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

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

        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 {}
}




library Base64 {
    string internal constant TABLE_ENCODE = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';
    bytes  internal constant TABLE_DECODE = hex"0000000000000000000000000000000000000000000000000000000000000000"
                                            hex"00000000000000000000003e0000003f3435363738393a3b3c3d000000000000"
                                            hex"00000102030405060708090a0b0c0d0e0f101112131415161718190000000000"
                                            hex"001a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132330000000000";

    function encode(bytes memory data) internal pure returns (string memory) {
        if (data.length == 0) return '';

        // load the table into memory
        string memory table = TABLE_ENCODE;

        // multiply by 4/3 rounded up
        uint256 encodedLen = 4 * ((data.length + 2) / 3);

        // add some extra buffer at the end required for the writing
        string memory result = new string(encodedLen + 32);

        assembly {
            // set the actual output length
            mstore(result, encodedLen)

            // prepare the lookup table
            let tablePtr := add(table, 1)

            // input ptr
            let dataPtr := data
            let endPtr := add(dataPtr, mload(data))

            // result ptr, jump over length
            let resultPtr := add(result, 32)

            // run over the input, 3 bytes at a time
            for {} lt(dataPtr, endPtr) {}
            {
                // read 3 bytes
                dataPtr := add(dataPtr, 3)
                let input := mload(dataPtr)

                // write 4 characters
                mstore8(resultPtr, mload(add(tablePtr, and(shr(18, input), 0x3F))))
                resultPtr := add(resultPtr, 1)
                mstore8(resultPtr, mload(add(tablePtr, and(shr(12, input), 0x3F))))
                resultPtr := add(resultPtr, 1)
                mstore8(resultPtr, mload(add(tablePtr, and(shr( 6, input), 0x3F))))
                resultPtr := add(resultPtr, 1)
                mstore8(resultPtr, mload(add(tablePtr, and(        input,  0x3F))))
                resultPtr := add(resultPtr, 1)
            }

            // padding with '='
            switch mod(mload(data), 3)
            case 1 { mstore(sub(resultPtr, 2), shl(240, 0x3d3d)) }
            case 2 { mstore(sub(resultPtr, 1), shl(248, 0x3d)) }
        }

        return result;
    }

    function decode(string memory _data) internal pure returns (bytes memory) {
        bytes memory data = bytes(_data);

        if (data.length == 0) return new bytes(0);
        require(data.length % 4 == 0, "invalid base64 decoder input");

        // load the table into memory
        bytes memory table = TABLE_DECODE;

        // every 4 characters represent 3 bytes
        uint256 decodedLen = (data.length / 4) * 3;

        // add some extra buffer at the end required for the writing
        bytes memory result = new bytes(decodedLen + 32);

        assembly {
            // padding with '='
            let lastBytes := mload(add(data, mload(data)))
            if eq(and(lastBytes, 0xFF), 0x3d) {
                decodedLen := sub(decodedLen, 1)
                if eq(and(lastBytes, 0xFFFF), 0x3d3d) {
                    decodedLen := sub(decodedLen, 1)
                }
            }

            // set the actual output length
            mstore(result, decodedLen)

            // prepare the lookup table
            let tablePtr := add(table, 1)

            // input ptr
            let dataPtr := data
            let endPtr := add(dataPtr, mload(data))

            // result ptr, jump over length
            let resultPtr := add(result, 32)

            // run over the input, 4 characters at a time
            for {} lt(dataPtr, endPtr) {}
            {
               // read 4 characters
               dataPtr := add(dataPtr, 4)
               let input := mload(dataPtr)

               // write 3 bytes
               let output := add(
                   add(
                       shl(18, and(mload(add(tablePtr, and(shr(24, input), 0xFF))), 0xFF)),
                       shl(12, and(mload(add(tablePtr, and(shr(16, input), 0xFF))), 0xFF))),
                   add(
                       shl( 6, and(mload(add(tablePtr, and(shr( 8, input), 0xFF))), 0xFF)),
                               and(mload(add(tablePtr, and(        input , 0xFF))), 0xFF)
                    )
                )
                mstore(resultPtr, shl(232, output))
                resultPtr := add(resultPtr, 3)
            }
        }

        return result;
    }
}


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


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

pragma solidity ^0.8.0;


/**
 * @dev ERC721 token with storage based token URI management.
 */
abstract contract ERC721URIStorage is ERC721 {
    using Strings for uint256;

    // Optional mapping for token URIs
    mapping(uint256 => uint256) private _ogs;

    mapping(uint256 => uint256) private _mintingYear;

    /**
     * @dev See {IERC721Metadata-tokenURI}.
     */


    function uint2str(uint _i) internal pure returns (string memory _uintAsString) {
        if (_i == 0) {
            return "0";
        }
        uint j = _i;
        uint len;
        while (j != 0) {
            len++;
            j /= 10;
        }
        bytes memory bstr = new bytes(len);
        uint k = len;
        while (_i != 0) {
            k = k-1;
            uint8 temp = (48 + uint8(_i - _i / 10 * 10));
            bytes1 b1 = bytes1(temp);
            bstr[k] = b1;
            _i /= 10;
        }
        return string(bstr);
    }
    
    function concatenate(string memory a,string memory b) public pure returns (string memory){
        return string(abi.encodePacked(a,'',b));
    }

    function makeArt(uint256 numberOs, uint256 yearMinted) public view virtual returns (string memory){
        uint256 yearAdjust;
        uint256 yearMult;
        yearAdjust = getCurrentYear() - yearMinted;
        if (numberOs + yearAdjust == 0 || numberOs + yearAdjust == 1 || numberOs + yearAdjust == 2 || numberOs + yearAdjust == 3) {
            return "<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 350 350'><style>.base { fill: black; font-family: sans-serif; font-size: 32px; text-decoration: line-through; }</style><rect width='100%' height='100%' fill='white' /><text x='10' y='35' class='base'>OG</text></svg>";
        }
        if (numberOs + yearAdjust == 4) {
            return "<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 350 350'><style>.base { fill: black; font-family: sans-serif; font-size: 32px; }</style><rect width='100%' height='100%' fill='white' /><text x='10' y='35' class='base'>OG</text></svg>";
        }
        uint score = getCurrentYear() - (yearMinted - numberOs) -3;
        yearMult = score / 100;
        string[30] memory OGArray;
        for (uint256 z = 0; z < 30; z++) {            
            OGArray[z] = "";
        }
        uint rowCounter = 0;
        rowCounter = ((score + 1) / (13 * (1 + yearMult)));
        string memory finalString;
        uint charCounter = 0;

        for (uint256 i = 0; i < score; i++) {            
            OGArray[(i / (13 * (1 + yearMult)))] = concatenate(OGArray[(i / (13 * (1 + yearMult)))], "O");
            if (i + 1 == score) {
                OGArray[((i + 1) / (13 * (1 + yearMult)))] = concatenate(OGArray[((i + 1) / (13 * (1 + yearMult)))], "G");
            }
            charCounter = charCounter + 1;
        }

        string memory texts;
        for (uint256 i = 0; i <= rowCounter; i++) {
            texts = concatenate(texts, '<text x="10" y="');
            texts = concatenate(texts,  uint2str(35+((i*30)/(yearMult+1))));
            texts = concatenate(texts,  '" class="base">');
            texts = concatenate(texts,  OGArray[i]);
            texts = concatenate(texts,  "</text>");
        }

        finalString = "<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 350 350'><style>.base { fill: black; font-family: sans-serif; font-size: ";
        finalString = concatenate(finalString, uint2str(32/(1 + yearMult)));
        finalString = concatenate(finalString, "px;}</style><rect width='100%' height='100%' fill='white' />");
        texts = concatenate(texts, "G");
        finalString = concatenate(finalString, texts);
        finalString = concatenate(finalString, "</svg>");

        return (finalString);
    }


    function leapYearsBefore(uint year) public pure returns (uint) {
        year -= 1;
        return year / 4 - year / 100 + year / 400;
    }

    function isLeapYear(uint16 year) public pure returns (bool) {
        if (year % 4 != 0) {
            return false;
        }
        if (year % 100 != 0) {
            return true;
        }
        if (year % 400 != 0) {
            return false;
        }
        return true;
        }
    

    function timestamp2year(uint timestamp) public pure returns (uint16) {
        uint secondsAccountedFor = 0;
        uint YEAR_IN_SECONDS = 31536000;
        uint LEAP_YEAR_IN_SECONDS = 31622400;
        uint16 ORIGIN_YEAR = 1970;
        uint16 year;
        uint numLeapYears;
        year = uint16(ORIGIN_YEAR + timestamp / YEAR_IN_SECONDS);
        numLeapYears = leapYearsBefore(year) - leapYearsBefore(ORIGIN_YEAR);
        secondsAccountedFor += LEAP_YEAR_IN_SECONDS * numLeapYears;
        secondsAccountedFor += YEAR_IN_SECONDS * (year - ORIGIN_YEAR - numLeapYears);
        while (secondsAccountedFor > timestamp) {
            if (isLeapYear(uint16(year - 1))) {
                secondsAccountedFor -= LEAP_YEAR_IN_SECONDS;
            }
            else {
                secondsAccountedFor -= YEAR_IN_SECONDS;
            }
            year -= 1;
        }
        return year;
    }

    function getCurrentYear() public view virtual returns (uint256){
        return(timestamp2year(block.timestamp));
    }

    struct JsonInfo {
        string json;
        string artData;
    }

    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        require(_exists(tokenId), "ERC721URIStorage: URI query for nonexistent token");
        // If there is no base URI, return the token URI.
        JsonInfo memory jsonSlot;
        jsonSlot.artData = makeArt(_ogs[tokenId], _mintingYear[tokenId]);
        jsonSlot.json = string(abi.encodePacked(
            '{"description":"This OG Badge NFT shows how many years this person has been involved in art and technology. It is fully stored and rendered on chain.","external_url":"http://ogenerator.xyz", '
            '"name": "OG Badge ',
            uint2str(tokenId),'",',
            '"image": "data:image/svg+xml;base64,'));
        jsonSlot.json = Base64.encode(
            bytes(
                string(
                    abi.encodePacked(
                        jsonSlot.json,
                        Base64.encode(bytes(jsonSlot.artData)),'",',
                        '"attributes":[',
                        '{"Trait_type":"Property_1","value":"',
                        uint2str(_mintingYear[tokenId]-_ogs[tokenId]),
                        '"}',
                        ']}'
                    )
                )
            )
        );
        return string(abi.encodePacked(_baseURI(), jsonSlot.json));
    }

    /**
     * @dev Sets `_tokenURI` as the tokenURI of `tokenId`.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */

    function _setOGs(uint256 tokenId, uint256 _ogsPassed) internal virtual {
        require(_exists(tokenId), "ERC721URIStorage: URI set of nonexistent token");
        _ogs[tokenId] = _ogsPassed;
    }

    function _setMintingYear(uint256 tokenId, uint256 _whenMinted) internal virtual {
        require(_exists(tokenId), "ERC721URIStorage: URI set of nonexistent token");
        _mintingYear[tokenId] = _whenMinted;
    }

    /**
     * @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 override {
        super._burn(tokenId);
    }
}

// File: Token.sol

pragma solidity ^0.8.0;



/**
 * @title Sample NFT contract
 * @dev Extends ERC-721 NFT contract and implements ERC-2981
 */

contract OG is Ownable, ERC721URIStorage {

    // Keep a mapping of token ids and corresponding IPFS hashes
    mapping(string => uint8) hashes;
    // Maximum amounts of mintable tokens
    uint256 public constant MAX_SUPPLY = 10;
    // Address of the royalties recipient
    address private _royaltiesReceiver;
    // Percentage of each sale to pay as royalties
    uint256 public constant royaltiesPercentage = 10;

    mapping (address => uint) public artBalance;

    uint256 private totalSupply;
 
    // Events
    event Mint(uint256 tokenId, address recipient);

constructor(address initialRoyaltiesReceiver) ERC721("OGenerator", "OG") {
        _royaltiesReceiver = initialRoyaltiesReceiver;
    }

    /** Overrides ERC-721's _baseURI function */
    function _baseURI() internal pure override returns (string memory) {
        return 'data:application/json;base64,';
    }

    function _beforeTokenTransfer(address from, address to, uint256 amount)
    internal override(ERC721) {
        super._beforeTokenTransfer(from, to, amount);
    }

    function _burn(uint256 tokenId)
    internal override(ERC721URIStorage) {
        super._burn(tokenId);
    }

    /// @notice Getter function for _royaltiesReceiver
    /// @return the address of the royalties recipient
    function royaltiesReceiver() external view returns(address) {
        return _royaltiesReceiver;
    }

    /// @notice Changes the royalties' recipient address (in case rights are
    ///         transferred for instance)
    /// @param newRoyaltiesReceiver - address of the new royalties recipient
    function setRoyaltiesReceiver(address newRoyaltiesReceiver)
    external onlyOwner {
        require(newRoyaltiesReceiver != _royaltiesReceiver); // dev: Same address
        _royaltiesReceiver = newRoyaltiesReceiver;
    }

    /// @notice Returns a token's URI
    /// @dev See {IERC721Metadata-tokenURI}.
    /// @param tokenId - the id of the token whose URI to return
    /// @return a string containing an URI pointing to the token's ressource
    function tokenURI(uint256 tokenId)
    public view override(ERC721URIStorage)
    returns (string memory) {
        return super.tokenURI(tokenId);
    }

    /// @notice Informs callers that this contract supports ERC2981
    function supportsInterface(bytes4 interfaceId)
    public view override(ERC721)
    returns (bool) {
        return interfaceId == type(IERC2981).interfaceId ||
        super.supportsInterface(interfaceId);
    }

    /// @notice Returns all the tokens owned by an address
    /// @param _owner - the address to query
    /// @return ownerTokens - an array containing the ids of all tokens
    ///         owned by the address

    /// @notice Called with the sale price to determine how much royalty
    //          is owed and to whom.
    /// @param _tokenId - the NFT asset queried for royalty information
    /// @param _salePrice - sale price of the NFT asset specified by _tokenId
    /// @return receiver - address of who should be sent the royalty payment
    /// @return royaltyAmount - the royalty payment amount for _value sale price
    function royaltyInfo(uint256 _tokenId, uint256 _salePrice) external view
    returns (address receiver, uint256 royaltyAmount) {
        uint256 _royalties = (_salePrice * royaltiesPercentage) / 100;
        return (_royaltiesReceiver, _royalties);
    }

    function mint(uint256 noYears, uint256 mintingYear) external payable {
        require(mintingActive || msg.sender == owner(), "Minting is paused");
        require(msg.value >= 10000000000000000 wei, "You must pay at least 0.01 Eth per art");
        _safeMint(msg.sender, totalSupply+1);
        _setOGs(totalSupply+1, noYears);
        _setMintingYear(totalSupply+1, mintingYear);
        totalSupply += 1;
        artBalance[msg.sender] += 1;
    }


    function setMintingActive(bool isMintingActive) public onlyOwner {
        mintingActive = isMintingActive;
    }

    function withdraw(uint amount) onlyOwner public returns(bool) {
        require(amount <= address(this).balance);
        address someone = msg.sender;
        payable(someone).transfer(amount);
        return true;
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"initialRoyaltiesReceiver","type":"address"}],"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":false,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"address","name":"recipient","type":"address"}],"name":"Mint","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"MAX_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"artBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"a","type":"string"},{"internalType":"string","name":"b","type":"string"}],"name":"concatenate","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getCurrentYear","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"year","type":"uint16"}],"name":"isLeapYear","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"year","type":"uint256"}],"name":"leapYearsBefore","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"numberOs","type":"uint256"},{"internalType":"uint256","name":"yearMinted","type":"uint256"}],"name":"makeArt","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"noYears","type":"uint256"},{"internalType":"uint256","name":"mintingYear","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"mintingActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"royaltiesPercentage","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"royaltiesReceiver","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"uint256","name":"_salePrice","type":"uint256"}],"name":"royaltyInfo","outputs":[{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint256","name":"royaltyAmount","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":"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":"bool","name":"isMintingActive","type":"bool"}],"name":"setMintingActive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newRoyaltiesReceiver","type":"address"}],"name":"setRoyaltiesReceiver","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":"timestamp","type":"uint256"}],"name":"timestamp2year","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdraw","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"}]

60806040523480156200001157600080fd5b5060405162002e8338038062002e838339810160408190526200003491620001db565b6040518060400160405280600a81526020016927a3b2b732b930ba37b960b11b815250604051806040016040528060028152602001614f4760f01b8152506200008c62000086620000e160201b60201c565b620000e5565b8151620000a190600190602085019062000135565b508051620000b790600290602084019062000135565b5050600b80546001600160a01b0319166001600160a01b039390931692909217909155506200024a565b3390565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b82805462000143906200020d565b90600052602060002090601f016020900481019282620001675760008555620001b2565b82601f106200018257805160ff1916838001178555620001b2565b82800160010185558215620001b2579182015b82811115620001b257825182559160200191906001019062000195565b50620001c0929150620001c4565b5090565b5b80821115620001c05760008155600101620001c5565b600060208284031215620001ee57600080fd5b81516001600160a01b03811681146200020657600080fd5b9392505050565b600181811c908216806200022257607f821691505b602082108114156200024457634e487b7160e01b600052602260045260246000fd5b50919050565b612c29806200025a6000396000f3fe6080604052600436106101e35760003560e01c80638da5cb5b11610102578063b88d4fde11610095578063d04ef28511610064578063d04ef28514610576578063d2ee73c714610596578063e985e9c5146105c3578063f2fde38b1461060c57600080fd5b8063b88d4fde14610521578063c87b56dd14610541578063cafa8dfe14610365578063ce41607a1461056157600080fd5b8063a3a51bd5116100d1578063a3a51bd5146104a3578063a6f0e577146104c1578063b1999937146104e1578063b51437151461050157600080fd5b80638da5cb5b1461041d578063928c092c1461043b57806395d89b411461046e578063a22cb4651461048357600080fd5b80632e1a7d4d1161017a57806342842e0e1161014957806342842e0e146103a85780636352211e146103c857806370a08231146103e8578063715018a61461040857600080fd5b80632e1a7d4d1461032b57806331f9c9191461034b57806332cb6b0c1461036557806341cf2b171461038857600080fd5b80631b2ef1ca116101b65780631b2ef1ca1461029957806323b872dd146102ac578063266001d3146102cc5780632a55205a146102ec57600080fd5b806301ffc9a7146101e857806306fdde031461021d578063081812fc1461023f578063095ea7b314610277575b600080fd5b3480156101f457600080fd5b50610208610203366004612266565b61062c565b60405190151581526020015b60405180910390f35b34801561022957600080fd5b50610232610657565b604051610214919061260c565b34801561024b57600080fd5b5061025f61025a366004612328565b6106e9565b6040516001600160a01b039091168152602001610214565b34801561028357600080fd5b50610297610292366004612221565b610776565b005b6102976102a7366004612341565b61088c565b3480156102b857600080fd5b506102976102c736600461213f565b6109d6565b3480156102d857600080fd5b506102326102e73660046122a0565b610a07565b3480156102f857600080fd5b5061030c610307366004612341565b610a33565b604080516001600160a01b039093168352602083019190915201610214565b34801561033757600080fd5b50610208610346366004612328565b610a65565b34801561035757600080fd5b506003546102089060ff1681565b34801561037157600080fd5b5061037a600a81565b604051908152602001610214565b34801561039457600080fd5b506102326103a3366004612341565b610ad8565b3480156103b457600080fd5b506102976103c336600461213f565b610f93565b3480156103d457600080fd5b5061025f6103e3366004612328565b610fae565b3480156103f457600080fd5b5061037a6104033660046120f1565b611025565b34801561041457600080fd5b506102976110ac565b34801561042957600080fd5b506000546001600160a01b031661025f565b34801561044757600080fd5b5061045b610456366004612328565b6110e2565b60405161ffff9091168152602001610214565b34801561047a57600080fd5b506102326111d0565b34801561048f57600080fd5b5061029761049e3660046121f7565b6111df565b3480156104af57600080fd5b50600b546001600160a01b031661025f565b3480156104cd57600080fd5b506102086104dc366004612304565b6111ee565b3480156104ed57600080fd5b5061037a6104fc366004612328565b61124d565b34801561050d57600080fd5b5061029761051c3660046120f1565b611292565b34801561052d57600080fd5b5061029761053c36600461217b565b6112f9565b34801561054d57600080fd5b5061023261055c366004612328565b611331565b34801561056d57600080fd5b5061037a61133c565b34801561058257600080fd5b5061029761059136600461224b565b611350565b3480156105a257600080fd5b5061037a6105b13660046120f1565b600c6020526000908152604090205481565b3480156105cf57600080fd5b506102086105de36600461210c565b6001600160a01b03918216600090815260076020908152604080832093909416825291909152205460ff1690565b34801561061857600080fd5b506102976106273660046120f1565b61138d565b60006001600160e01b0319821663152a902d60e11b1480610651575061065182611428565b92915050565b6060600180546106669061281b565b80601f01602080910402602001604051908101604052809291908181526020018280546106929061281b565b80156106df5780601f106106b4576101008083540402835291602001916106df565b820191906000526020600020905b8154815290600101906020018083116106c257829003601f168201915b5050505050905090565b60006106f482611478565b61075a5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600660205260409020546001600160a01b031690565b600061078182610fae565b9050806001600160a01b0316836001600160a01b031614156107ef5760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610751565b336001600160a01b038216148061080b575061080b81336105de565b61087d5760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610751565b6108878383611495565b505050565b60035460ff16806108a757506000546001600160a01b031633145b6108e75760405162461bcd60e51b8152602060048201526011602482015270135a5b9d1a5b99c81a5cc81c185d5cd959607a1b6044820152606401610751565b662386f26fc1000034101561094d5760405162461bcd60e51b815260206004820152602660248201527f596f75206d75737420706179206174206c6561737420302e3031204574682070604482015265195c88185c9d60d21b6064820152608401610751565b61096533600d5460016109609190612745565b611503565b61097d600d5460016109779190612745565b8361151d565b610995600d54600161098f9190612745565b82611554565b6001600d60008282546109a89190612745565b9091555050336000908152600c602052604081208054600192906109cd908490612745565b90915550505050565b6109e0338261158b565b6109fc5760405162461bcd60e51b8152600401610751906126f4565b610887838383611675565b60608282604051602001610a1c92919061238f565b604051602081830303815290604052905092915050565b600080806064610a44600a86612796565b610a4e9190612782565b600b546001600160a01b0316969095509350505050565b600080546001600160a01b03163314610a905760405162461bcd60e51b8152600401610751906126bf565b47821115610a9d57600080fd5b6040513390819084156108fc029085906000818181858888f19350505050158015610acc573d6000803e3d6000fd5b5060019150505b919050565b606060008083610ae661133c565b610af091906127d8565b9150610afc8286612745565b1580610b115750610b0d8286612745565b6001145b80610b255750610b218286612745565b6002145b80610b395750610b358286612745565b6003145b15610b635760405180610140016040528061010c8152602001612aac61010c913992505050610651565b610b6d8286612745565b60041415610b985760405180610120016040528060ed815260200161290160ed913992505050610651565b60006003610ba687876127d8565b610bae61133c565b610bb891906127d8565b610bc291906127d8565b9050610bcf606482612782565b9150610bd9612005565b60005b601e811015610c1e57604051806020016040528060008152508282601e8110610c0757610c076128be565b602002015280610c1681612856565b915050610bdc565b506000610c2c846001612745565b610c3790600d612796565b610c42846001612745565b610c4c9190612782565b905060606000805b85811015610dc057610cb485610c6b896001612745565b610c7690600d612796565b610c809084612782565b601e8110610c9057610c906128be565b6020020151604051806040016040528060018152602001604f60f81b815250610a07565b85610cc0896001612745565b610ccb90600d612796565b610cd59084612782565b601e8110610ce557610ce56128be565b602002015285610cf6826001612745565b1415610da157610d5f85610d0b896001612745565b610d1690600d612796565b610d21846001612745565b610d2b9190612782565b601e8110610d3b57610d3b6128be565b6020020151604051806040016040528060018152602001604760f81b815250610a07565b85610d6b896001612745565b610d7690600d612796565b610d81846001612745565b610d8b9190612782565b601e8110610d9b57610d9b6128be565b60200201525b610dac826001612745565b915080610db881612856565b915050610c54565b50606060005b848111610ecc57610dff826040518060400160405280601081526020016f1e3a32bc3a103c1e91189811103c9e9160811b815250610a07565b9150610e38826102e7610e138b6001612745565b610e1e85601e612796565b610e289190612782565b610e33906023612745565b611815565b9150610e6b826040518060400160405280600f81526020016e111031b630b9b99e913130b9b2911f60891b815250610a07565b9150610e8d828783601e8110610e8357610e836128be565b6020020151610a07565b9150610eb882604051806040016040528060078152602001661e17ba32bc3a1f60c91b815250610a07565b915080610ec481612856565b915050610dc6565b506040518060a00160405280607e81526020016129ee607e91399250610f05836102e7610efa8a6001612745565b610e33906020612782565b9250610f29836040518060600160405280603c8152602001612bb8603c9139610a07565b9250610f4e81604051806040016040528060018152602001604760f81b815250610a07565b9050610f5a8382610a07565b9250610f8483604051806040016040528060068152602001651e17b9bb339f60d11b815250610a07565b9b9a5050505050505050505050565b610887838383604051806020016040528060008152506112f9565b6000818152600460205260408120546001600160a01b0316806106515760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401610751565b60006001600160a01b0382166110905760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401610751565b506001600160a01b031660009081526005602052604090205490565b6000546001600160a01b031633146110d65760405162461bcd60e51b8152600401610751906126bf565b6110e0600061193e565b565b6000806301e133806301e285006107b283806110fe8589612782565b61110c9061ffff8516612745565b915061111b8361ffff1661124d565b6111288361ffff1661124d565b61113291906127d8565b905061113e8185612796565b6111489087612745565b95508061115584846127b5565b61ffff1661116391906127d8565b61116d9086612796565b6111779087612745565b95505b878611156111c5576111906104dc6001846127b5565b156111a65761119f84876127d8565b95506111b3565b6111b085876127d8565b95505b6111be6001836127b5565b915061117a565b509695505050505050565b6060600280546106669061281b565b6111ea33838361198e565b5050565b60006111fb600483612871565b61ffff161561120c57506000919050565b611217606483612871565b61ffff161561122857506001919050565b61123461019083612871565b61ffff161561124557506000919050565b506001919050565b600061125a6001836127d8565b915061126861019083612782565b611273606484612782565b61127e600485612782565b61128891906127d8565b6106519190612745565b6000546001600160a01b031633146112bc5760405162461bcd60e51b8152600401610751906126bf565b600b546001600160a01b03828116911614156112d757600080fd5b600b80546001600160a01b0319166001600160a01b0392909216919091179055565b611303338361158b565b61131f5760405162461bcd60e51b8152600401610751906126f4565b61132b84848484611a5d565b50505050565b606061065182611a90565b6000611347426110e2565b61ffff16905090565b6000546001600160a01b0316331461137a5760405162461bcd60e51b8152600401610751906126bf565b6003805460ff1916911515919091179055565b6000546001600160a01b031633146113b75760405162461bcd60e51b8152600401610751906126bf565b6001600160a01b03811661141c5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610751565b6114258161193e565b50565b60006001600160e01b031982166380ac58cd60e01b148061145957506001600160e01b03198216635b5e139f60e01b145b8061065157506301ffc9a760e01b6001600160e01b0319831614610651565b6000908152600460205260409020546001600160a01b0316151590565b600081815260066020526040902080546001600160a01b0319166001600160a01b03841690811790915581906114ca82610fae565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6111ea828260405180602001604052806000815250611c2c565b61152682611478565b6115425760405162461bcd60e51b815260040161075190612671565b60009182526008602052604090912055565b61155d82611478565b6115795760405162461bcd60e51b815260040161075190612671565b60009182526009602052604090912055565b600061159682611478565b6115f75760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610751565b600061160283610fae565b9050806001600160a01b0316846001600160a01b0316148061163d5750836001600160a01b0316611632846106e9565b6001600160a01b0316145b8061166d57506001600160a01b0380821660009081526007602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b031661168882610fae565b6001600160a01b0316146116f05760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b6064820152608401610751565b6001600160a01b0382166117525760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610751565b61175d600082611495565b6001600160a01b03831660009081526005602052604081208054600192906117869084906127d8565b90915550506001600160a01b03821660009081526005602052604081208054600192906117b4908490612745565b909155505060008181526004602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b6060816118395750506040805180820190915260018152600360fc1b602082015290565b8160005b8115611863578061184d81612856565b915061185c9050600a83612782565b915061183d565b60008167ffffffffffffffff81111561187e5761187e6128d4565b6040519080825280601f01601f1916602001820160405280156118a8576020820181803683370190505b509050815b8515611935576118be6001826127d8565b905060006118cd600a88612782565b6118d890600a612796565b6118e290886127d8565b6118ed90603061275d565b905060008160f81b90508084848151811061190a5761190a6128be565b60200101906001600160f81b031916908160001a90535061192c600a89612782565b975050506118ad565b50949350505050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b816001600160a01b0316836001600160a01b031614156119f05760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610751565b6001600160a01b03838116600081815260076020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b611a68848484611675565b611a7484848484611c5f565b61132b5760405162461bcd60e51b81526004016107519061261f565b6060611a9b82611478565b611b015760405162461bcd60e51b815260206004820152603160248201527f45524337323155524953746f726167653a2055524920717565727920666f72206044820152703737b732bc34b9ba32b73a103a37b5b2b760791b6064820152608401610751565b6040805180820190915260608082526020820152600083815260086020908152604080832054600990925290912054611b3a9190610ad8565b6020820152611b4883611815565b604051602001611b589190612473565b60408051601f198184030181529190528082526020820151611bcc9190611b7e90611d6c565b600086815260086020908152604080832054600990925290912054611ba691610e33916127d8565b604051602001611bb8939291906123be565b604051602081830303815290604052611d6c565b815260408051808201909152601d81527f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c00000060208201528151604051611c1592919060200161238f565b604051602081830303815290604052915050919050565b611c368383611ed2565b611c436000848484611c5f565b6108875760405162461bcd60e51b81526004016107519061261f565b60006001600160a01b0384163b15611d6157604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290611ca39033908990889088906004016125cf565b602060405180830381600087803b158015611cbd57600080fd5b505af1925050508015611ced575060408051601f3d908101601f19168201909252611cea91810190612283565b60015b611d47573d808015611d1b576040519150601f19603f3d011682016040523d82523d6000602084013e611d20565b606091505b508051611d3f5760405162461bcd60e51b81526004016107519061261f565b805181602001fd5b6001600160e01b031916630a85bd0160e11b14905061166d565b506001949350505050565b6060815160001415611d8c57505060408051602081019091526000815290565b6000604051806060016040528060408152602001612a6c6040913990506000600384516002611dbb9190612745565b611dc59190612782565b611dd0906004612796565b90506000611ddf826020612745565b67ffffffffffffffff811115611df757611df76128d4565b6040519080825280601f01601f191660200182016040528015611e21576020820181803683370190505b509050818152600183018586518101602084015b81831015611e8d576003830192508251603f8160121c168501518253600182019150603f81600c1c168501518253600182019150603f8160061c168501518253600182019150603f8116850151825350600101611e35565b600389510660018114611ea75760028114611eb857611ec4565b613d3d60f01b600119830152611ec4565b603d60f81b6000198301525b509398975050505050505050565b6001600160a01b038216611f285760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610751565b611f3181611478565b15611f7e5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610751565b6001600160a01b0382166000908152600560205260408120805460019290611fa7908490612745565b909155505060008181526004602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b604051806103c00160405280601e905b60608152602001906001900390816120155790505090565b600067ffffffffffffffff80841115612048576120486128d4565b604051601f8501601f19908116603f01168101908282118183101715612070576120706128d4565b8160405280935085815286868601111561208957600080fd5b858560208301376000602087830101525050509392505050565b80356001600160a01b0381168114610ad357600080fd5b80358015158114610ad357600080fd5b600082601f8301126120db57600080fd5b6120ea8383356020850161202d565b9392505050565b60006020828403121561210357600080fd5b6120ea826120a3565b6000806040838503121561211f57600080fd5b612128836120a3565b9150612136602084016120a3565b90509250929050565b60008060006060848603121561215457600080fd5b61215d846120a3565b925061216b602085016120a3565b9150604084013590509250925092565b6000806000806080858703121561219157600080fd5b61219a856120a3565b93506121a8602086016120a3565b925060408501359150606085013567ffffffffffffffff8111156121cb57600080fd5b8501601f810187136121dc57600080fd5b6121eb8782356020840161202d565b91505092959194509250565b6000806040838503121561220a57600080fd5b612213836120a3565b9150612136602084016120ba565b6000806040838503121561223457600080fd5b61223d836120a3565b946020939093013593505050565b60006020828403121561225d57600080fd5b6120ea826120ba565b60006020828403121561227857600080fd5b81356120ea816128ea565b60006020828403121561229557600080fd5b81516120ea816128ea565b600080604083850312156122b357600080fd5b823567ffffffffffffffff808211156122cb57600080fd5b6122d7868387016120ca565b935060208501359150808211156122ed57600080fd5b506122fa858286016120ca565b9150509250929050565b60006020828403121561231657600080fd5b813561ffff811681146120ea57600080fd5b60006020828403121561233a57600080fd5b5035919050565b6000806040838503121561235457600080fd5b50508035926020909101359150565b6000815180845261237b8160208601602086016127ef565b601f01601f19169290920160200192915050565b600083516123a18184602088016127ef565b8351908301906123b58183602088016127ef565b01949350505050565b600084516123d08184602089016127ef565b8451908301906123e48183602089016127ef565b61088b60f21b91019081526d2261747472696275746573223a5b60901b60028201527f7b2254726169745f74797065223a2250726f70657274795f31222c2276616c7560108201526332911d1160e11b6030820152835161244c8160348401602088016127ef565b61227d60f01b60349290910191820152615d7d60f01b603682015260380195945050505050565b7f7b226465736372697074696f6e223a2254686973204f47204261646765204e4681527f542073686f777320686f77206d616e792079656172732074686973207065727360208201527f6f6e20686173206265656e20696e766f6c76656420696e2061727420616e642060408201527f746563686e6f6c6f67792e2049742069732066756c6c792073746f726564206160608201527f6e642072656e6465726564206f6e20636861696e2e222c2265787465726e616c60808201527f5f75726c223a22687474703a2f2f6f67656e657261746f722e78797a222c202260a08201527003730b6b2911d101127a3902130b233b29607d1b60c0820152600082516125838160d18501602087016127ef565b61088b60f21b60d19390910192830152507f22696d616765223a2022646174613a696d6167652f7376672b786d6c3b62617360d382015263194d8d0b60e21b60f382015260f701919050565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061260290830184612363565b9695505050505050565b6020815260006120ea6020830184612363565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6020808252602e908201527f45524337323155524953746f726167653a2055524920736574206f66206e6f6e60408201526d32bc34b9ba32b73a103a37b5b2b760911b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b6000821982111561275857612758612892565b500190565b600060ff821660ff84168060ff0382111561277a5761277a612892565b019392505050565b600082612791576127916128a8565b500490565b60008160001904831182151516156127b0576127b0612892565b500290565b600061ffff838116908316818110156127d0576127d0612892565b039392505050565b6000828210156127ea576127ea612892565b500390565b60005b8381101561280a5781810151838201526020016127f2565b8381111561132b5750506000910152565b600181811c9082168061282f57607f821691505b6020821081141561285057634e487b7160e01b600052602260045260246000fd5b50919050565b600060001982141561286a5761286a612892565b5060010190565b600061ffff80841680612886576128866128a8565b92169190910692915050565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b03198116811461142557600080fdfe3c73766720786d6c6e733d27687474703a2f2f7777772e77332e6f72672f323030302f737667272076696577426f783d273020302033353020333530273e3c7374796c653e2e62617365207b2066696c6c3a20626c61636b3b20666f6e742d66616d696c793a2073616e732d73657269663b20666f6e742d73697a653a20333270783b207d3c2f7374796c653e3c726563742077696474683d273130302527206865696768743d2731303025272066696c6c3d27776869746527202f3e3c7465787420783d2731302720793d2733352720636c6173733d2762617365273e4f473c2f746578743e3c2f7376673e3c73766720786d6c6e733d27687474703a2f2f7777772e77332e6f72672f323030302f737667272076696577426f783d273020302033353020333530273e3c7374796c653e2e62617365207b2066696c6c3a20626c61636b3b20666f6e742d66616d696c793a2073616e732d73657269663b20666f6e742d73697a653a204142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2f3c73766720786d6c6e733d27687474703a2f2f7777772e77332e6f72672f323030302f737667272076696577426f783d273020302033353020333530273e3c7374796c653e2e62617365207b2066696c6c3a20626c61636b3b20666f6e742d66616d696c793a2073616e732d73657269663b20666f6e742d73697a653a20333270783b20746578742d6465636f726174696f6e3a206c696e652d7468726f7567683b207d3c2f7374796c653e3c726563742077696474683d273130302527206865696768743d2731303025272066696c6c3d27776869746527202f3e3c7465787420783d2731302720793d2733352720636c6173733d2762617365273e4f473c2f746578743e3c2f7376673e70783b7d3c2f7374796c653e3c726563742077696474683d273130302527206865696768743d2731303025272066696c6c3d27776869746527202f3ea264697066735822122083bfecd6d19059bb23693c14071527d4476211b3913f2accb1f8c29e4a388d0764736f6c63430008070033000000000000000000000000ef8d44e54d8be26a55a2b13e1e055019182b3824

Deployed Bytecode

0x6080604052600436106101e35760003560e01c80638da5cb5b11610102578063b88d4fde11610095578063d04ef28511610064578063d04ef28514610576578063d2ee73c714610596578063e985e9c5146105c3578063f2fde38b1461060c57600080fd5b8063b88d4fde14610521578063c87b56dd14610541578063cafa8dfe14610365578063ce41607a1461056157600080fd5b8063a3a51bd5116100d1578063a3a51bd5146104a3578063a6f0e577146104c1578063b1999937146104e1578063b51437151461050157600080fd5b80638da5cb5b1461041d578063928c092c1461043b57806395d89b411461046e578063a22cb4651461048357600080fd5b80632e1a7d4d1161017a57806342842e0e1161014957806342842e0e146103a85780636352211e146103c857806370a08231146103e8578063715018a61461040857600080fd5b80632e1a7d4d1461032b57806331f9c9191461034b57806332cb6b0c1461036557806341cf2b171461038857600080fd5b80631b2ef1ca116101b65780631b2ef1ca1461029957806323b872dd146102ac578063266001d3146102cc5780632a55205a146102ec57600080fd5b806301ffc9a7146101e857806306fdde031461021d578063081812fc1461023f578063095ea7b314610277575b600080fd5b3480156101f457600080fd5b50610208610203366004612266565b61062c565b60405190151581526020015b60405180910390f35b34801561022957600080fd5b50610232610657565b604051610214919061260c565b34801561024b57600080fd5b5061025f61025a366004612328565b6106e9565b6040516001600160a01b039091168152602001610214565b34801561028357600080fd5b50610297610292366004612221565b610776565b005b6102976102a7366004612341565b61088c565b3480156102b857600080fd5b506102976102c736600461213f565b6109d6565b3480156102d857600080fd5b506102326102e73660046122a0565b610a07565b3480156102f857600080fd5b5061030c610307366004612341565b610a33565b604080516001600160a01b039093168352602083019190915201610214565b34801561033757600080fd5b50610208610346366004612328565b610a65565b34801561035757600080fd5b506003546102089060ff1681565b34801561037157600080fd5b5061037a600a81565b604051908152602001610214565b34801561039457600080fd5b506102326103a3366004612341565b610ad8565b3480156103b457600080fd5b506102976103c336600461213f565b610f93565b3480156103d457600080fd5b5061025f6103e3366004612328565b610fae565b3480156103f457600080fd5b5061037a6104033660046120f1565b611025565b34801561041457600080fd5b506102976110ac565b34801561042957600080fd5b506000546001600160a01b031661025f565b34801561044757600080fd5b5061045b610456366004612328565b6110e2565b60405161ffff9091168152602001610214565b34801561047a57600080fd5b506102326111d0565b34801561048f57600080fd5b5061029761049e3660046121f7565b6111df565b3480156104af57600080fd5b50600b546001600160a01b031661025f565b3480156104cd57600080fd5b506102086104dc366004612304565b6111ee565b3480156104ed57600080fd5b5061037a6104fc366004612328565b61124d565b34801561050d57600080fd5b5061029761051c3660046120f1565b611292565b34801561052d57600080fd5b5061029761053c36600461217b565b6112f9565b34801561054d57600080fd5b5061023261055c366004612328565b611331565b34801561056d57600080fd5b5061037a61133c565b34801561058257600080fd5b5061029761059136600461224b565b611350565b3480156105a257600080fd5b5061037a6105b13660046120f1565b600c6020526000908152604090205481565b3480156105cf57600080fd5b506102086105de36600461210c565b6001600160a01b03918216600090815260076020908152604080832093909416825291909152205460ff1690565b34801561061857600080fd5b506102976106273660046120f1565b61138d565b60006001600160e01b0319821663152a902d60e11b1480610651575061065182611428565b92915050565b6060600180546106669061281b565b80601f01602080910402602001604051908101604052809291908181526020018280546106929061281b565b80156106df5780601f106106b4576101008083540402835291602001916106df565b820191906000526020600020905b8154815290600101906020018083116106c257829003601f168201915b5050505050905090565b60006106f482611478565b61075a5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600660205260409020546001600160a01b031690565b600061078182610fae565b9050806001600160a01b0316836001600160a01b031614156107ef5760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610751565b336001600160a01b038216148061080b575061080b81336105de565b61087d5760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610751565b6108878383611495565b505050565b60035460ff16806108a757506000546001600160a01b031633145b6108e75760405162461bcd60e51b8152602060048201526011602482015270135a5b9d1a5b99c81a5cc81c185d5cd959607a1b6044820152606401610751565b662386f26fc1000034101561094d5760405162461bcd60e51b815260206004820152602660248201527f596f75206d75737420706179206174206c6561737420302e3031204574682070604482015265195c88185c9d60d21b6064820152608401610751565b61096533600d5460016109609190612745565b611503565b61097d600d5460016109779190612745565b8361151d565b610995600d54600161098f9190612745565b82611554565b6001600d60008282546109a89190612745565b9091555050336000908152600c602052604081208054600192906109cd908490612745565b90915550505050565b6109e0338261158b565b6109fc5760405162461bcd60e51b8152600401610751906126f4565b610887838383611675565b60608282604051602001610a1c92919061238f565b604051602081830303815290604052905092915050565b600080806064610a44600a86612796565b610a4e9190612782565b600b546001600160a01b0316969095509350505050565b600080546001600160a01b03163314610a905760405162461bcd60e51b8152600401610751906126bf565b47821115610a9d57600080fd5b6040513390819084156108fc029085906000818181858888f19350505050158015610acc573d6000803e3d6000fd5b5060019150505b919050565b606060008083610ae661133c565b610af091906127d8565b9150610afc8286612745565b1580610b115750610b0d8286612745565b6001145b80610b255750610b218286612745565b6002145b80610b395750610b358286612745565b6003145b15610b635760405180610140016040528061010c8152602001612aac61010c913992505050610651565b610b6d8286612745565b60041415610b985760405180610120016040528060ed815260200161290160ed913992505050610651565b60006003610ba687876127d8565b610bae61133c565b610bb891906127d8565b610bc291906127d8565b9050610bcf606482612782565b9150610bd9612005565b60005b601e811015610c1e57604051806020016040528060008152508282601e8110610c0757610c076128be565b602002015280610c1681612856565b915050610bdc565b506000610c2c846001612745565b610c3790600d612796565b610c42846001612745565b610c4c9190612782565b905060606000805b85811015610dc057610cb485610c6b896001612745565b610c7690600d612796565b610c809084612782565b601e8110610c9057610c906128be565b6020020151604051806040016040528060018152602001604f60f81b815250610a07565b85610cc0896001612745565b610ccb90600d612796565b610cd59084612782565b601e8110610ce557610ce56128be565b602002015285610cf6826001612745565b1415610da157610d5f85610d0b896001612745565b610d1690600d612796565b610d21846001612745565b610d2b9190612782565b601e8110610d3b57610d3b6128be565b6020020151604051806040016040528060018152602001604760f81b815250610a07565b85610d6b896001612745565b610d7690600d612796565b610d81846001612745565b610d8b9190612782565b601e8110610d9b57610d9b6128be565b60200201525b610dac826001612745565b915080610db881612856565b915050610c54565b50606060005b848111610ecc57610dff826040518060400160405280601081526020016f1e3a32bc3a103c1e91189811103c9e9160811b815250610a07565b9150610e38826102e7610e138b6001612745565b610e1e85601e612796565b610e289190612782565b610e33906023612745565b611815565b9150610e6b826040518060400160405280600f81526020016e111031b630b9b99e913130b9b2911f60891b815250610a07565b9150610e8d828783601e8110610e8357610e836128be565b6020020151610a07565b9150610eb882604051806040016040528060078152602001661e17ba32bc3a1f60c91b815250610a07565b915080610ec481612856565b915050610dc6565b506040518060a00160405280607e81526020016129ee607e91399250610f05836102e7610efa8a6001612745565b610e33906020612782565b9250610f29836040518060600160405280603c8152602001612bb8603c9139610a07565b9250610f4e81604051806040016040528060018152602001604760f81b815250610a07565b9050610f5a8382610a07565b9250610f8483604051806040016040528060068152602001651e17b9bb339f60d11b815250610a07565b9b9a5050505050505050505050565b610887838383604051806020016040528060008152506112f9565b6000818152600460205260408120546001600160a01b0316806106515760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401610751565b60006001600160a01b0382166110905760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401610751565b506001600160a01b031660009081526005602052604090205490565b6000546001600160a01b031633146110d65760405162461bcd60e51b8152600401610751906126bf565b6110e0600061193e565b565b6000806301e133806301e285006107b283806110fe8589612782565b61110c9061ffff8516612745565b915061111b8361ffff1661124d565b6111288361ffff1661124d565b61113291906127d8565b905061113e8185612796565b6111489087612745565b95508061115584846127b5565b61ffff1661116391906127d8565b61116d9086612796565b6111779087612745565b95505b878611156111c5576111906104dc6001846127b5565b156111a65761119f84876127d8565b95506111b3565b6111b085876127d8565b95505b6111be6001836127b5565b915061117a565b509695505050505050565b6060600280546106669061281b565b6111ea33838361198e565b5050565b60006111fb600483612871565b61ffff161561120c57506000919050565b611217606483612871565b61ffff161561122857506001919050565b61123461019083612871565b61ffff161561124557506000919050565b506001919050565b600061125a6001836127d8565b915061126861019083612782565b611273606484612782565b61127e600485612782565b61128891906127d8565b6106519190612745565b6000546001600160a01b031633146112bc5760405162461bcd60e51b8152600401610751906126bf565b600b546001600160a01b03828116911614156112d757600080fd5b600b80546001600160a01b0319166001600160a01b0392909216919091179055565b611303338361158b565b61131f5760405162461bcd60e51b8152600401610751906126f4565b61132b84848484611a5d565b50505050565b606061065182611a90565b6000611347426110e2565b61ffff16905090565b6000546001600160a01b0316331461137a5760405162461bcd60e51b8152600401610751906126bf565b6003805460ff1916911515919091179055565b6000546001600160a01b031633146113b75760405162461bcd60e51b8152600401610751906126bf565b6001600160a01b03811661141c5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610751565b6114258161193e565b50565b60006001600160e01b031982166380ac58cd60e01b148061145957506001600160e01b03198216635b5e139f60e01b145b8061065157506301ffc9a760e01b6001600160e01b0319831614610651565b6000908152600460205260409020546001600160a01b0316151590565b600081815260066020526040902080546001600160a01b0319166001600160a01b03841690811790915581906114ca82610fae565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6111ea828260405180602001604052806000815250611c2c565b61152682611478565b6115425760405162461bcd60e51b815260040161075190612671565b60009182526008602052604090912055565b61155d82611478565b6115795760405162461bcd60e51b815260040161075190612671565b60009182526009602052604090912055565b600061159682611478565b6115f75760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610751565b600061160283610fae565b9050806001600160a01b0316846001600160a01b0316148061163d5750836001600160a01b0316611632846106e9565b6001600160a01b0316145b8061166d57506001600160a01b0380821660009081526007602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b031661168882610fae565b6001600160a01b0316146116f05760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b6064820152608401610751565b6001600160a01b0382166117525760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610751565b61175d600082611495565b6001600160a01b03831660009081526005602052604081208054600192906117869084906127d8565b90915550506001600160a01b03821660009081526005602052604081208054600192906117b4908490612745565b909155505060008181526004602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b6060816118395750506040805180820190915260018152600360fc1b602082015290565b8160005b8115611863578061184d81612856565b915061185c9050600a83612782565b915061183d565b60008167ffffffffffffffff81111561187e5761187e6128d4565b6040519080825280601f01601f1916602001820160405280156118a8576020820181803683370190505b509050815b8515611935576118be6001826127d8565b905060006118cd600a88612782565b6118d890600a612796565b6118e290886127d8565b6118ed90603061275d565b905060008160f81b90508084848151811061190a5761190a6128be565b60200101906001600160f81b031916908160001a90535061192c600a89612782565b975050506118ad565b50949350505050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b816001600160a01b0316836001600160a01b031614156119f05760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610751565b6001600160a01b03838116600081815260076020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b611a68848484611675565b611a7484848484611c5f565b61132b5760405162461bcd60e51b81526004016107519061261f565b6060611a9b82611478565b611b015760405162461bcd60e51b815260206004820152603160248201527f45524337323155524953746f726167653a2055524920717565727920666f72206044820152703737b732bc34b9ba32b73a103a37b5b2b760791b6064820152608401610751565b6040805180820190915260608082526020820152600083815260086020908152604080832054600990925290912054611b3a9190610ad8565b6020820152611b4883611815565b604051602001611b589190612473565b60408051601f198184030181529190528082526020820151611bcc9190611b7e90611d6c565b600086815260086020908152604080832054600990925290912054611ba691610e33916127d8565b604051602001611bb8939291906123be565b604051602081830303815290604052611d6c565b815260408051808201909152601d81527f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c00000060208201528151604051611c1592919060200161238f565b604051602081830303815290604052915050919050565b611c368383611ed2565b611c436000848484611c5f565b6108875760405162461bcd60e51b81526004016107519061261f565b60006001600160a01b0384163b15611d6157604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290611ca39033908990889088906004016125cf565b602060405180830381600087803b158015611cbd57600080fd5b505af1925050508015611ced575060408051601f3d908101601f19168201909252611cea91810190612283565b60015b611d47573d808015611d1b576040519150601f19603f3d011682016040523d82523d6000602084013e611d20565b606091505b508051611d3f5760405162461bcd60e51b81526004016107519061261f565b805181602001fd5b6001600160e01b031916630a85bd0160e11b14905061166d565b506001949350505050565b6060815160001415611d8c57505060408051602081019091526000815290565b6000604051806060016040528060408152602001612a6c6040913990506000600384516002611dbb9190612745565b611dc59190612782565b611dd0906004612796565b90506000611ddf826020612745565b67ffffffffffffffff811115611df757611df76128d4565b6040519080825280601f01601f191660200182016040528015611e21576020820181803683370190505b509050818152600183018586518101602084015b81831015611e8d576003830192508251603f8160121c168501518253600182019150603f81600c1c168501518253600182019150603f8160061c168501518253600182019150603f8116850151825350600101611e35565b600389510660018114611ea75760028114611eb857611ec4565b613d3d60f01b600119830152611ec4565b603d60f81b6000198301525b509398975050505050505050565b6001600160a01b038216611f285760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610751565b611f3181611478565b15611f7e5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610751565b6001600160a01b0382166000908152600560205260408120805460019290611fa7908490612745565b909155505060008181526004602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b604051806103c00160405280601e905b60608152602001906001900390816120155790505090565b600067ffffffffffffffff80841115612048576120486128d4565b604051601f8501601f19908116603f01168101908282118183101715612070576120706128d4565b8160405280935085815286868601111561208957600080fd5b858560208301376000602087830101525050509392505050565b80356001600160a01b0381168114610ad357600080fd5b80358015158114610ad357600080fd5b600082601f8301126120db57600080fd5b6120ea8383356020850161202d565b9392505050565b60006020828403121561210357600080fd5b6120ea826120a3565b6000806040838503121561211f57600080fd5b612128836120a3565b9150612136602084016120a3565b90509250929050565b60008060006060848603121561215457600080fd5b61215d846120a3565b925061216b602085016120a3565b9150604084013590509250925092565b6000806000806080858703121561219157600080fd5b61219a856120a3565b93506121a8602086016120a3565b925060408501359150606085013567ffffffffffffffff8111156121cb57600080fd5b8501601f810187136121dc57600080fd5b6121eb8782356020840161202d565b91505092959194509250565b6000806040838503121561220a57600080fd5b612213836120a3565b9150612136602084016120ba565b6000806040838503121561223457600080fd5b61223d836120a3565b946020939093013593505050565b60006020828403121561225d57600080fd5b6120ea826120ba565b60006020828403121561227857600080fd5b81356120ea816128ea565b60006020828403121561229557600080fd5b81516120ea816128ea565b600080604083850312156122b357600080fd5b823567ffffffffffffffff808211156122cb57600080fd5b6122d7868387016120ca565b935060208501359150808211156122ed57600080fd5b506122fa858286016120ca565b9150509250929050565b60006020828403121561231657600080fd5b813561ffff811681146120ea57600080fd5b60006020828403121561233a57600080fd5b5035919050565b6000806040838503121561235457600080fd5b50508035926020909101359150565b6000815180845261237b8160208601602086016127ef565b601f01601f19169290920160200192915050565b600083516123a18184602088016127ef565b8351908301906123b58183602088016127ef565b01949350505050565b600084516123d08184602089016127ef565b8451908301906123e48183602089016127ef565b61088b60f21b91019081526d2261747472696275746573223a5b60901b60028201527f7b2254726169745f74797065223a2250726f70657274795f31222c2276616c7560108201526332911d1160e11b6030820152835161244c8160348401602088016127ef565b61227d60f01b60349290910191820152615d7d60f01b603682015260380195945050505050565b7f7b226465736372697074696f6e223a2254686973204f47204261646765204e4681527f542073686f777320686f77206d616e792079656172732074686973207065727360208201527f6f6e20686173206265656e20696e766f6c76656420696e2061727420616e642060408201527f746563686e6f6c6f67792e2049742069732066756c6c792073746f726564206160608201527f6e642072656e6465726564206f6e20636861696e2e222c2265787465726e616c60808201527f5f75726c223a22687474703a2f2f6f67656e657261746f722e78797a222c202260a08201527003730b6b2911d101127a3902130b233b29607d1b60c0820152600082516125838160d18501602087016127ef565b61088b60f21b60d19390910192830152507f22696d616765223a2022646174613a696d6167652f7376672b786d6c3b62617360d382015263194d8d0b60e21b60f382015260f701919050565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061260290830184612363565b9695505050505050565b6020815260006120ea6020830184612363565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6020808252602e908201527f45524337323155524953746f726167653a2055524920736574206f66206e6f6e60408201526d32bc34b9ba32b73a103a37b5b2b760911b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b6000821982111561275857612758612892565b500190565b600060ff821660ff84168060ff0382111561277a5761277a612892565b019392505050565b600082612791576127916128a8565b500490565b60008160001904831182151516156127b0576127b0612892565b500290565b600061ffff838116908316818110156127d0576127d0612892565b039392505050565b6000828210156127ea576127ea612892565b500390565b60005b8381101561280a5781810151838201526020016127f2565b8381111561132b5750506000910152565b600181811c9082168061282f57607f821691505b6020821081141561285057634e487b7160e01b600052602260045260246000fd5b50919050565b600060001982141561286a5761286a612892565b5060010190565b600061ffff80841680612886576128866128a8565b92169190910692915050565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b03198116811461142557600080fdfe3c73766720786d6c6e733d27687474703a2f2f7777772e77332e6f72672f323030302f737667272076696577426f783d273020302033353020333530273e3c7374796c653e2e62617365207b2066696c6c3a20626c61636b3b20666f6e742d66616d696c793a2073616e732d73657269663b20666f6e742d73697a653a20333270783b207d3c2f7374796c653e3c726563742077696474683d273130302527206865696768743d2731303025272066696c6c3d27776869746527202f3e3c7465787420783d2731302720793d2733352720636c6173733d2762617365273e4f473c2f746578743e3c2f7376673e3c73766720786d6c6e733d27687474703a2f2f7777772e77332e6f72672f323030302f737667272076696577426f783d273020302033353020333530273e3c7374796c653e2e62617365207b2066696c6c3a20626c61636b3b20666f6e742d66616d696c793a2073616e732d73657269663b20666f6e742d73697a653a204142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2f3c73766720786d6c6e733d27687474703a2f2f7777772e77332e6f72672f323030302f737667272076696577426f783d273020302033353020333530273e3c7374796c653e2e62617365207b2066696c6c3a20626c61636b3b20666f6e742d66616d696c793a2073616e732d73657269663b20666f6e742d73697a653a20333270783b20746578742d6465636f726174696f6e3a206c696e652d7468726f7567683b207d3c2f7374796c653e3c726563742077696474683d273130302527206865696768743d2731303025272066696c6c3d27776869746527202f3e3c7465787420783d2731302720793d2733352720636c6173733d2762617365273e4f473c2f746578743e3c2f7376673e70783b7d3c2f7374796c653e3c726563742077696474683d273130302527206865696768743d2731303025272066696c6c3d27776869746527202f3ea264697066735822122083bfecd6d19059bb23693c14071527d4476211b3913f2accb1f8c29e4a388d0764736f6c63430008070033

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

000000000000000000000000ef8d44e54d8be26a55a2b13e1e055019182b3824

-----Decoded View---------------
Arg [0] : initialRoyaltiesReceiver (address): 0xef8d44E54d8bE26A55a2B13e1E055019182B3824

-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 000000000000000000000000ef8d44e54d8be26a55a2b13e1e055019182b3824


Deployed Bytecode Sourcemap

50546:4289:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52879:217;;;;;;;;;;-1:-1:-1;52879:217:0;;;;;:::i;:::-;;:::i;:::-;;;10519:14:1;;10512:22;10494:41;;10482:2;10467:18;52879:217:0;;;;;;;;26203:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;27791:221::-;;;;;;;;;;-1:-1:-1;27791:221:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;9538:32:1;;;9520:51;;9508:2;9493:18;27791:221:0;9374:203:1;27314:411:0;;;;;;;;;;-1:-1:-1;27314:411:0;;;;;:::i;:::-;;:::i;:::-;;54013:460;;;;;;:::i;:::-;;:::i;28541:339::-;;;;;;;;;;-1:-1:-1;28541:339:0;;;;;:::i;:::-;;:::i;43655:147::-;;;;;;;;;;-1:-1:-1;43655:147:0;;;;;:::i;:::-;;:::i;53747:258::-;;;;;;;;;;-1:-1:-1;53747:258:0;;;;;:::i;:::-;;:::i;:::-;;;;-1:-1:-1;;;;;10267:32:1;;;10249:51;;10331:2;10316:18;;10309:34;;;;10222:18;53747:258:0;10075:274:1;54606:226:0;;;;;;;;;;-1:-1:-1;54606:226:0;;;;;:::i;:::-;;:::i;24469:25::-;;;;;;;;;;-1:-1:-1;24469:25:0;;;;;;;;50743:39;;;;;;;;;;;;50780:2;50743:39;;;;;18661:25:1;;;18649:2;18634:18;50743:39:0;18515:177:1;43810:2696:0;;;;;;;;;;-1:-1:-1;43810:2696:0;;;;;:::i;:::-;;:::i;28951:185::-;;;;;;;;;;-1:-1:-1;28951:185:0;;;;;:::i;:::-;;:::i;25890:239::-;;;;;;;;;;-1:-1:-1;25890:239:0;;;;;:::i;:::-;;:::i;25620:208::-;;;;;;;;;;-1:-1:-1;25620:208:0;;;;;:::i;:::-;;:::i;5131:103::-;;;;;;;;;;;;;:::i;4480:87::-;;;;;;;;;;-1:-1:-1;4526:7:0;4553:6;-1:-1:-1;;;;;4553:6:0;4480:87;;46982:918;;;;;;;;;;-1:-1:-1;46982:918:0;;;;;:::i;:::-;;:::i;:::-;;;18496:6:1;18484:19;;;18466:38;;18454:2;18439:18;46982:918:0;18322:188:1;26372:104:0;;;;;;;;;;;;;:::i;28084:155::-;;;;;;;;;;-1:-1:-1;28084:155:0;;;;;:::i;:::-;;:::i;51870:104::-;;;;;;;;;;-1:-1:-1;51948:18:0;;-1:-1:-1;;;;;51948:18:0;51870:104;;46667:301;;;;;;;;;;-1:-1:-1;46667:301:0;;;;;:::i;:::-;;:::i;46516:143::-;;;;;;;;;;-1:-1:-1;46516:143:0;;;;;:::i;:::-;;:::i;52181:227::-;;;;;;;;;;-1:-1:-1;52181:227:0;;;;;:::i;:::-;;:::i;29207:328::-;;;;;;;;;;-1:-1:-1;29207:328:0;;;;;:::i;:::-;;:::i;52645:157::-;;;;;;;;;;-1:-1:-1;52645:157:0;;;;;:::i;:::-;;:::i;47908:121::-;;;;;;;;;;;;;:::i;54483:115::-;;;;;;;;;;-1:-1:-1;54483:115:0;;;;;:::i;:::-;;:::i;50982:43::-;;;;;;;;;;-1:-1:-1;50982:43:0;;;;;:::i;:::-;;;;;;;;;;;;;;28310:164;;;;;;;;;;-1:-1:-1;28310:164:0;;;;;:::i;:::-;-1:-1:-1;;;;;28431:25:0;;;28407:4;28431:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;28310:164;5389:201;;;;;;;;;;-1:-1:-1;5389:201:0;;;;;:::i;:::-;;:::i;52879:217::-;52974:4;-1:-1:-1;;;;;;52998:41:0;;-1:-1:-1;;;52998:41:0;;:90;;;53052:36;53076:11;53052:23;:36::i;:::-;52991:97;52879:217;-1:-1:-1;;52879:217:0:o;26203:100::-;26257:13;26290:5;26283:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26203:100;:::o;27791:221::-;27867:7;27895:16;27903:7;27895;:16::i;:::-;27887:73;;;;-1:-1:-1;;;27887:73:0;;16174:2:1;27887:73:0;;;16156:21:1;16213:2;16193:18;;;16186:30;16252:34;16232:18;;;16225:62;-1:-1:-1;;;16303:18:1;;;16296:42;16355:19;;27887:73:0;;;;;;;;;-1:-1:-1;27980:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;27980:24:0;;27791:221::o;27314:411::-;27395:13;27411:23;27426:7;27411:14;:23::i;:::-;27395:39;;27459:5;-1:-1:-1;;;;;27453:11:0;:2;-1:-1:-1;;;;;27453:11:0;;;27445:57;;;;-1:-1:-1;;;27445:57:0;;17358:2:1;27445:57:0;;;17340:21:1;17397:2;17377:18;;;17370:30;17436:34;17416:18;;;17409:62;-1:-1:-1;;;17487:18:1;;;17480:31;17528:19;;27445:57:0;17156:397:1;27445:57:0;3284:10;-1:-1:-1;;;;;27537:21:0;;;;:62;;-1:-1:-1;27562:37:0;27579:5;3284:10;28310:164;:::i;27562:37::-;27515:168;;;;-1:-1:-1;;;27515:168:0;;13734:2:1;27515:168:0;;;13716:21:1;13773:2;13753:18;;;13746:30;13812:34;13792:18;;;13785:62;13883:26;13863:18;;;13856:54;13927:19;;27515:168:0;13532:420:1;27515:168:0;27696:21;27705:2;27709:7;27696:8;:21::i;:::-;27384:341;27314:411;;:::o;54013:460::-;54101:13;;;;;:38;;-1:-1:-1;4526:7:0;4553:6;-1:-1:-1;;;;;4553:6:0;54118:10;:21;54101:38;54093:68;;;;-1:-1:-1;;;54093:68:0;;18178:2:1;54093:68:0;;;18160:21:1;18217:2;18197:18;;;18190:30;-1:-1:-1;;;18236:18:1;;;18229:47;18293:18;;54093:68:0;17976:341:1;54093:68:0;54193:21;54180:9;:34;;54172:85;;;;-1:-1:-1;;;54172:85:0;;12155:2:1;54172:85:0;;;12137:21:1;12194:2;12174:18;;;12167:30;12233:34;12213:18;;;12206:62;-1:-1:-1;;;12284:18:1;;;12277:36;12330:19;;54172:85:0;11953:402:1;54172:85:0;54268:36;54278:10;54290:11;;54302:1;54290:13;;;;:::i;:::-;54268:9;:36::i;:::-;54315:31;54323:11;;54335:1;54323:13;;;;:::i;:::-;54338:7;54315;:31::i;:::-;54357:43;54373:11;;54385:1;54373:13;;;;:::i;:::-;54388:11;54357:15;:43::i;:::-;54426:1;54411:11;;:16;;;;;;;:::i;:::-;;;;-1:-1:-1;;54449:10:0;54438:22;;;;:10;:22;;;;;:27;;54464:1;;54438:22;:27;;54464:1;;54438:27;:::i;:::-;;;;-1:-1:-1;;;;54013:460:0:o;28541:339::-;28736:41;3284:10;28769:7;28736:18;:41::i;:::-;28728:103;;;;-1:-1:-1;;;28728:103:0;;;;;;;:::i;:::-;28844:28;28854:4;28860:2;28864:7;28844:9;:28::i;43655:147::-;43730:13;43786:1;43791;43769:24;;;;;;;;;:::i;:::-;;;;;;;;;;;;;43755:39;;43655:147;;;;:::o;53747:258::-;53834:16;;;53944:3;53908:32;50971:2;53908:10;:32;:::i;:::-;53907:40;;;;:::i;:::-;53966:18;;-1:-1:-1;;;;;53966:18:0;;53886:61;;-1:-1:-1;53747:258:0;-1:-1:-1;;;;53747:258:0:o;54606:226::-;54662:4;4553:6;;-1:-1:-1;;;;;4553:6:0;3284:10;4700:23;4692:68;;;;-1:-1:-1;;;4692:68:0;;;;;;;:::i;:::-;54697:21:::1;54687:6;:31;;54679:40;;;::::0;::::1;;54769:33;::::0;54748:10:::1;::::0;;;54769:33;::::1;;;::::0;54795:6;;54730:15:::1;54769:33:::0;54730:15;54769:33;54795:6;54748:10;54769:33;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;54820:4;54813:11;;;4771:1;54606:226:::0;;;:::o;43810:2696::-;43894:13;43919:18;43948:16;44007:10;43988:16;:14;:16::i;:::-;:29;;;;:::i;:::-;43975:42;-1:-1:-1;44032:21:0;43975:42;44032:8;:21;:::i;:::-;:26;;:56;;-1:-1:-1;44062:21:0;44073:10;44062:8;:21;:::i;:::-;44087:1;44062:26;44032:56;:86;;;-1:-1:-1;44092:21:0;44103:10;44092:8;:21;:::i;:::-;44117:1;44092:26;44032:86;:116;;;-1:-1:-1;44122:21:0;44133:10;44122:8;:21;:::i;:::-;44147:1;44122:26;44032:116;44028:426;;;44165:277;;;;;;;;;;;;;;;;;;;;;;;44028:426;44468:21;44479:10;44468:8;:21;:::i;:::-;44493:1;44468:26;44464:305;;;44511:246;;;;;;;;;;;;;;;;;;;;;;;44464:305;44779:10;44836:1;44812:21;44825:8;44812:10;:21;:::i;:::-;44792:16;:14;:16::i;:::-;:42;;;;:::i;:::-;:45;;;;:::i;:::-;44779:58;-1:-1:-1;44859:11:0;44867:3;44779:58;44859:11;:::i;:::-;44848:22;;44881:25;;:::i;:::-;44922:9;44917:87;44941:2;44937:1;:6;44917:87;;;44977:15;;;;;;;;;;;;:7;44985:1;44977:10;;;;;;;:::i;:::-;;;;:15;44945:3;;;;:::i;:::-;;;;44917:87;;;-1:-1:-1;45014:15:0;45079:12;45083:8;45079:1;:12;:::i;:::-;45073:19;;:2;:19;:::i;:::-;45059:9;:5;45067:1;45059:9;:::i;:::-;45058:35;;;;:::i;:::-;45044:50;;45105:25;45141:16;45179:9;45174:386;45198:5;45194:1;:9;45174:386;;;45276:54;45288:7;45308:12;45312:8;45308:1;:12;:::i;:::-;45302:19;;:2;:19;:::i;:::-;45297:25;;:1;:25;:::i;:::-;45288:36;;;;;;;:::i;:::-;;;;;45276:54;;;;;;;;;;;;;-1:-1:-1;;;45276:54:0;;;:11;:54::i;:::-;45237:7;45257:12;45261:8;45257:1;:12;:::i;:::-;45251:19;;:2;:19;:::i;:::-;45246:25;;:1;:25;:::i;:::-;45237:36;;;;;;;:::i;:::-;;;;:93;45358:5;45349;:1;45353;45349:5;:::i;:::-;:14;45345:160;;;45429:60;45441:7;45467:12;45471:8;45467:1;:12;:::i;:::-;45461:19;;:2;:19;:::i;:::-;45451:5;:1;45455;45451:5;:::i;:::-;45450:31;;;;:::i;:::-;45441:42;;;;;;;:::i;:::-;;;;;45429:60;;;;;;;;;;;;;-1:-1:-1;;;45429:60:0;;;:11;:60::i;:::-;45384:7;45410:12;45414:8;45410:1;:12;:::i;:::-;45404:19;;:2;:19;:::i;:::-;45394:5;:1;45398;45394:5;:::i;:::-;45393:31;;;;:::i;:::-;45384:42;;;;;;;:::i;:::-;;;;:105;45345:160;45533:15;:11;45547:1;45533:15;:::i;:::-;45519:29;-1:-1:-1;45205:3:0;;;;:::i;:::-;;;;45174:386;;;;45572:19;45607:9;45602:361;45627:10;45622:1;:15;45602:361;;45667:38;45679:5;45667:38;;;;;;;;;;;;;-1:-1:-1;;;45667:38:0;;;:11;:38::i;:::-;45659:46;-1:-1:-1;45728:55:0;45659:46;45748:34;45769:10;:8;45778:1;45769:10;:::i;:::-;45762:4;:1;45764:2;45762:4;:::i;:::-;45761:19;;;;:::i;:::-;45757:24;;:2;:24;:::i;:::-;45748:8;:34::i;45728:55::-;45720:63;;45806:38;45818:5;45806:38;;;;;;;;;;;;;-1:-1:-1;;;45806:38:0;;;:11;:38::i;:::-;45798:46;;45867:31;45879:5;45887:7;45895:1;45887:10;;;;;;;:::i;:::-;;;;;45867:11;:31::i;:::-;45859:39;;45921:30;45933:5;45921:30;;;;;;;;;;;;;-1:-1:-1;;;45921:30:0;;;:11;:30::i;:::-;45913:38;-1:-1:-1;45639:3:0;;;;:::i;:::-;;;;45602:361;;;;45975:142;;;;;;;;;;;;;;;;;;-1:-1:-1;46142:53:0;45975:142;46167:27;46180:12;46184:8;46180:1;:12;:::i;:::-;46176:17;;:2;:17;:::i;46142:53::-;46128:67;;46220:88;46232:11;46220:88;;;;;;;;;;;;;;;;;:11;:88::i;:::-;46206:102;;46327:23;46339:5;46327:23;;;;;;;;;;;;;-1:-1:-1;;;46327:23:0;;;:11;:23::i;:::-;46319:31;;46375;46387:11;46400:5;46375:11;:31::i;:::-;46361:45;;46431:34;46443:11;46431:34;;;;;;;;;;;;;-1:-1:-1;;;46431:34:0;;;:11;:34::i;:::-;46417:48;43810:2696;-1:-1:-1;;;;;;;;;;;43810:2696:0:o;28951:185::-;29089:39;29106:4;29112:2;29116:7;29089:39;;;;;;;;;;;;:16;:39::i;25890:239::-;25962:7;25998:16;;;:7;:16;;;;;;-1:-1:-1;;;;;25998:16:0;26033:19;26025:73;;;;-1:-1:-1;;;26025:73:0;;14570:2:1;26025:73:0;;;14552:21:1;14609:2;14589:18;;;14582:30;14648:34;14628:18;;;14621:62;-1:-1:-1;;;14699:18:1;;;14692:39;14748:19;;26025:73:0;14368:405:1;25620:208:0;25692:7;-1:-1:-1;;;;;25720:19:0;;25712:74;;;;-1:-1:-1;;;25712:74:0;;14159:2:1;25712:74:0;;;14141:21:1;14198:2;14178:18;;;14171:30;14237:34;14217:18;;;14210:62;-1:-1:-1;;;14288:18:1;;;14281:40;14338:19;;25712:74:0;13957:406:1;25712:74:0;-1:-1:-1;;;;;;25804:16:0;;;;;:9;:16;;;;;;;25620:208::o;5131:103::-;4526:7;4553:6;-1:-1:-1;;;;;4553:6:0;3284:10;4700:23;4692:68;;;;-1:-1:-1;;;4692:68:0;;;;;;;:::i;:::-;5196:30:::1;5223:1;5196:18;:30::i;:::-;5131:103::o:0;46982:918::-;47043:6;;47124:8;47171;47211:4;47043:6;;47304:27;47124:8;47304:9;:27;:::i;:::-;47290:41;;;;;;:::i;:::-;47276:56;;47382:28;47398:11;47382:28;;:15;:28::i;:::-;47358:21;47374:4;47358:21;;:15;:21::i;:::-;:52;;;;:::i;:::-;47343:67;-1:-1:-1;47444:35:0;47343:67;47444:20;:35;:::i;:::-;47421:58;;;;:::i;:::-;;-1:-1:-1;47553:12:0;47532:18;47539:11;47532:4;:18;:::i;:::-;:33;;;;;;:::i;:::-;47513:53;;:15;:53;:::i;:::-;47490:76;;;;:::i;:::-;;;47577:294;47606:9;47584:19;:31;47577:294;;;47636:28;47654:8;47661:1;47654:4;:8;:::i;47636:28::-;47632:204;;;47685:43;47708:20;47685:43;;:::i;:::-;;;47632:204;;;47782:38;47805:15;47782:38;;:::i;:::-;;;47632:204;47850:9;47858:1;47850:9;;:::i;:::-;;;47577:294;;;-1:-1:-1;47888:4:0;46982:918;-1:-1:-1;;;;;;46982:918:0:o;26372:104::-;26428:13;26461:7;26454:14;;;;;:::i;28084:155::-;28179:52;3284:10;28212:8;28222;28179:18;:52::i;:::-;28084:155;;:::o;46667:301::-;46721:4;46742:8;46749:1;46742:4;:8;:::i;:::-;:13;;;46738:58;;-1:-1:-1;46779:5:0;;46667:301;-1:-1:-1;46667:301:0:o;46738:58::-;46810:10;46817:3;46810:4;:10;:::i;:::-;:15;;;46806:59;;-1:-1:-1;46849:4:0;;46667:301;-1:-1:-1;46667:301:0:o;46806:59::-;46879:10;46886:3;46879:4;:10;:::i;:::-;:15;;;46875:60;;-1:-1:-1;46918:5:0;;46667:301;-1:-1:-1;46667:301:0:o;46875:60::-;-1:-1:-1;46952:4:0;;46667:301;-1:-1:-1;46667:301:0:o;46516:143::-;46573:4;46590:9;46598:1;46590:9;;:::i;:::-;;-1:-1:-1;46641:10:0;46648:3;46590:9;46641:10;:::i;:::-;46628;46635:3;46628:4;:10;:::i;:::-;46617:8;46624:1;46617:4;:8;:::i;:::-;:21;;;;:::i;:::-;:34;;;;:::i;52181:227::-;4526:7;4553:6;-1:-1:-1;;;;;4553:6:0;3284:10;4700:23;4692:68;;;;-1:-1:-1;;;4692:68:0;;;;;;;:::i;:::-;52308:18:::1;::::0;-1:-1:-1;;;;;52284:42:0;;::::1;52308:18:::0;::::1;52284:42;;52276:51;;;::::0;::::1;;52359:18;:41:::0;;-1:-1:-1;;;;;;52359:41:0::1;-1:-1:-1::0;;;;;52359:41:0;;;::::1;::::0;;;::::1;::::0;;52181:227::o;29207:328::-;29382:41;3284:10;29415:7;29382:18;:41::i;:::-;29374:103;;;;-1:-1:-1;;;29374:103:0;;;;;;;:::i;:::-;29488:39;29502:4;29508:2;29512:7;29521:5;29488:13;:39::i;:::-;29207:328;;;;:::o;52645:157::-;52738:13;52771:23;52786:7;52771:14;:23::i;47908:121::-;47963:7;47989:31;48004:15;47989:14;:31::i;:::-;47982:39;;;;47908:121;:::o;54483:115::-;4526:7;4553:6;-1:-1:-1;;;;;4553:6:0;3284:10;4700:23;4692:68;;;;-1:-1:-1;;;4692:68:0;;;;;;;:::i;:::-;54559:13:::1;:31:::0;;-1:-1:-1;;54559:31:0::1;::::0;::::1;;::::0;;;::::1;::::0;;54483:115::o;5389:201::-;4526:7;4553:6;-1:-1:-1;;;;;4553:6:0;3284:10;4700:23;4692:68;;;;-1:-1:-1;;;4692:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;5478:22:0;::::1;5470:73;;;::::0;-1:-1:-1;;;5470:73:0;;11391:2:1;5470:73:0::1;::::0;::::1;11373:21:1::0;11430:2;11410:18;;;11403:30;11469:34;11449:18;;;11442:62;-1:-1:-1;;;11520:18:1;;;11513:36;11566:19;;5470:73:0::1;11189:402:1::0;5470:73:0::1;5554:28;5573:8;5554:18;:28::i;:::-;5389:201:::0;:::o;25251:305::-;25353:4;-1:-1:-1;;;;;;25390:40:0;;-1:-1:-1;;;25390:40:0;;:105;;-1:-1:-1;;;;;;;25447:48:0;;-1:-1:-1;;;25447:48:0;25390:105;:158;;;-1:-1:-1;;;;;;;;;;17021:40:0;;;25512:36;16912:157;31045:127;31110:4;31134:16;;;:7;:16;;;;;;-1:-1:-1;;;;;31134:16:0;:30;;;31045:127::o;35031:174::-;35106:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;35106:29:0;-1:-1:-1;;;;;35106:29:0;;;;;;;;:24;;35160:23;35106:24;35160:14;:23::i;:::-;-1:-1:-1;;;;;35151:46:0;;;;;;;;;;;35031:174;;:::o;32029:110::-;32105:26;32115:2;32119:7;32105:26;;;;;;;;;;;;:9;:26::i;49625:202::-;49715:16;49723:7;49715;:16::i;:::-;49707:75;;;;-1:-1:-1;;;49707:75:0;;;;;;;:::i;:::-;49793:13;;;;:4;:13;;;;;;:26;49625:202::o;49835:220::-;49934:16;49942:7;49934;:16::i;:::-;49926:75;;;;-1:-1:-1;;;49926:75:0;;;;;;;:::i;:::-;50012:21;;;;:12;:21;;;;;;:35;49835:220::o;31339:348::-;31432:4;31457:16;31465:7;31457;:16::i;:::-;31449:73;;;;-1:-1:-1;;;31449:73:0;;13321:2:1;31449:73:0;;;13303:21:1;13360:2;13340:18;;;13333:30;13399:34;13379:18;;;13372:62;-1:-1:-1;;;13450:18:1;;;13443:42;13502:19;;31449:73:0;13119:408:1;31449:73:0;31533:13;31549:23;31564:7;31549:14;:23::i;:::-;31533:39;;31602:5;-1:-1:-1;;;;;31591:16:0;:7;-1:-1:-1;;;;;31591:16:0;;:51;;;;31635:7;-1:-1:-1;;;;;31611:31:0;:20;31623:7;31611:11;:20::i;:::-;-1:-1:-1;;;;;31611:31:0;;31591:51;:87;;;-1:-1:-1;;;;;;28431:25:0;;;28407:4;28431:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;31646:32;31583:96;31339:348;-1:-1:-1;;;;31339:348:0:o;34335:578::-;34494:4;-1:-1:-1;;;;;34467:31:0;:23;34482:7;34467:14;:23::i;:::-;-1:-1:-1;;;;;34467:31:0;;34459:85;;;;-1:-1:-1;;;34459:85:0;;16948:2:1;34459:85:0;;;16930:21:1;16987:2;16967:18;;;16960:30;17026:34;17006:18;;;16999:62;-1:-1:-1;;;17077:18:1;;;17070:39;17126:19;;34459:85:0;16746:405:1;34459:85:0;-1:-1:-1;;;;;34563:16:0;;34555:65;;;;-1:-1:-1;;;34555:65:0;;12562:2:1;34555:65:0;;;12544:21:1;12601:2;12581:18;;;12574:30;12640:34;12620:18;;;12613:62;-1:-1:-1;;;12691:18:1;;;12684:34;12735:19;;34555:65:0;12360:400:1;34555:65:0;34737:29;34754:1;34758:7;34737:8;:29::i;:::-;-1:-1:-1;;;;;34779:15:0;;;;;;:9;:15;;;;;:20;;34798:1;;34779:15;:20;;34798:1;;34779:20;:::i;:::-;;;;-1:-1:-1;;;;;;;34810:13:0;;;;;;:9;:13;;;;;:18;;34827:1;;34810:13;:18;;34827:1;;34810:18;:::i;:::-;;;;-1:-1:-1;;34839:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;34839:21:0;-1:-1:-1;;;;;34839:21:0;;;;;;;;;34878:27;;34839:16;;34878:27;;;;;;;34335:578;;;:::o;43070:573::-;43120:27;43164:7;43160:50;;-1:-1:-1;;43188:10:0;;;;;;;;;;;;-1:-1:-1;;;43188:10:0;;;;;43070:573::o;43160:50::-;43229:2;43220:6;43261:69;43268:6;;43261:69;;43291:5;;;;:::i;:::-;;-1:-1:-1;43311:7:0;;-1:-1:-1;43316:2:0;43311:7;;:::i;:::-;;;43261:69;;;43340:17;43370:3;43360:14;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;43360:14:0;-1:-1:-1;43340:34:0;-1:-1:-1;43394:3:0;43408:198;43415:7;;43408:198;;43443:3;43445:1;43443;:3;:::i;:::-;43439:7;-1:-1:-1;43461:10:0;43491:7;43496:2;43491;:7;:::i;:::-;:12;;43501:2;43491:12;:::i;:::-;43486:17;;:2;:17;:::i;:::-;43475:29;;:2;:29;:::i;:::-;43461:44;;43520:9;43539:4;43532:12;;43520:24;;43569:2;43559:4;43564:1;43559:7;;;;;;;;:::i;:::-;;;;:12;-1:-1:-1;;;;;43559:12:0;;;;;;;;-1:-1:-1;43586:8:0;43592:2;43586:8;;:::i;:::-;;;43424:182;;43408:198;;;-1:-1:-1;43630:4:0;43070:573;-1:-1:-1;;;;43070:573:0:o;5750:191::-;5824:16;5843:6;;-1:-1:-1;;;;;5860:17:0;;;-1:-1:-1;;;;;;5860:17:0;;;;;;5893:40;;5843:6;;;;;;;5893:40;;5824:16;5893:40;5813:128;5750:191;:::o;35347:315::-;35502:8;-1:-1:-1;;;;;35493:17:0;:5;-1:-1:-1;;;;;35493:17:0;;;35485:55;;;;-1:-1:-1;;;35485:55:0;;12967:2:1;35485:55:0;;;12949:21:1;13006:2;12986:18;;;12979:30;13045:27;13025:18;;;13018:55;13090:18;;35485:55:0;12765:349:1;35485:55:0;-1:-1:-1;;;;;35551:25:0;;;;;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;:46;;-1:-1:-1;;35551:46:0;;;;;;;;;;35613:41;;10494::1;;;35613::0;;10467:18:1;35613:41:0;;;;;;;35347:315;;;:::o;30417:::-;30574:28;30584:4;30590:2;30594:7;30574:9;:28::i;:::-;30621:48;30644:4;30650:2;30654:7;30663:5;30621:22;:48::i;:::-;30613:111;;;;-1:-1:-1;;;30613:111:0;;;;;;;:::i;48116:1351::-;48189:13;48223:16;48231:7;48223;:16::i;:::-;48215:78;;;;-1:-1:-1;;;48215:78:0;;15756:2:1;48215:78:0;;;15738:21:1;15795:2;15775:18;;;15768:30;15834:34;15814:18;;;15807:62;-1:-1:-1;;;15885:18:1;;;15878:47;15942:19;;48215:78:0;15554:413:1;48215:78:0;-1:-1:-1;;;;;;;;;;;;;;;;;48425:13:0;;;;:4;:13;;;;;;;;;48440:12;:21;;;;;;;48417:45;;48425:13;48417:7;:45::i;:::-;48398:16;;;:64;48769:17;48778:7;48769:8;:17::i;:::-;48496:349;;;;;;;;:::i;:::-;;;;-1:-1:-1;;48496:349:0;;;;;;;;;48473:373;;;48496:349;49057:16;;;48873:517;;48496:349;49037:38;;:13;:38::i;:::-;49246:13;;;;:4;:13;;;;;;;;;49224:12;:21;;;;;;;49215:45;;49224:35;;;:::i;49215:45::-;48954:391;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;48873:13;:517::i;:::-;48857:533;;51410:38;;;;;;;;;;;;;;;;;49444:13;;49415:43;;;;;49444:13;49415:43;;;:::i;:::-;;;;;;;;;;;;;49401:58;;;48116:1351;;;:::o;32366:321::-;32496:18;32502:2;32506:7;32496:5;:18::i;:::-;32547:54;32578:1;32582:2;32586:7;32595:5;32547:22;:54::i;:::-;32525:154;;;;-1:-1:-1;;;32525:154:0;;;;;;;:::i;36227:799::-;36382:4;-1:-1:-1;;;;;36403:13:0;;7091:20;7139:8;36399:620;;36439:72;;-1:-1:-1;;;36439:72:0;;-1:-1:-1;;;;;36439:36:0;;;;;:72;;3284:10;;36490:4;;36496:7;;36505:5;;36439:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;36439:72:0;;;;;;;;-1:-1:-1;;36439:72:0;;;;;;;;;;;;:::i;:::-;;;36435:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;36681:13:0;;36677:272;;36724:60;;-1:-1:-1;;;36724:60:0;;;;;;;:::i;36677:272::-;36899:6;36893:13;36884:6;36880:2;36876:15;36869:38;36435:529;-1:-1:-1;;;;;;36562:51:0;-1:-1:-1;;;36562:51:0;;-1:-1:-1;36555:58:0;;36399:620;-1:-1:-1;37003:4:0;36227:799;;;;;;:::o;38335:1912::-;38393:13;38423:4;:11;38438:1;38423:16;38419:31;;;-1:-1:-1;;38441:9:0;;;;;;;;;-1:-1:-1;38441:9:0;;;38335:1912::o;38419:31::-;38502:19;38524:12;;;;;;;;;;;;;;;;;38502:34;;38588:18;38634:1;38615:4;:11;38629:1;38615:15;;;;:::i;:::-;38614:21;;;;:::i;:::-;38609:27;;:1;:27;:::i;:::-;38588:48;-1:-1:-1;38719:20:0;38753:15;38588:48;38766:2;38753:15;:::i;:::-;38742:27;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;38742:27:0;;38719:50;;38866:10;38858:6;38851:26;38961:1;38954:5;38950:13;39020:4;39071;39065:11;39056:7;39052:25;39167:2;39159:6;39155:15;39240:754;39259:6;39250:7;39247:19;39240:754;;;39359:1;39350:7;39346:15;39335:26;;39398:7;39392:14;39524:4;39516:5;39512:2;39508:14;39504:25;39494:8;39490:40;39484:47;39473:9;39465:67;39578:1;39567:9;39563:17;39550:30;;39657:4;39649:5;39645:2;39641:14;39637:25;39627:8;39623:40;39617:47;39606:9;39598:67;39711:1;39700:9;39696:17;39683:30;;39790:4;39782:5;39779:1;39774:14;39770:25;39760:8;39756:40;39750:47;39739:9;39731:67;39844:1;39833:9;39829:17;39816:30;;39923:4;39915:5;39903:25;39893:8;39889:40;39883:47;39872:9;39864:67;-1:-1:-1;39977:1:0;39962:17;39240:754;;;40067:1;40060:4;40054:11;40050:19;40088:1;40083:54;;;;40156:1;40151:52;;;;40043:160;;40083:54;-1:-1:-1;;;;;40099:17:0;;40092:43;40083:54;;40151:52;-1:-1:-1;;;;;40167:17:0;;40160:41;40043:160;-1:-1:-1;40233:6:0;;38335:1912;-1:-1:-1;;;;;;;;38335:1912:0:o;33027:382::-;-1:-1:-1;;;;;33107:16:0;;33099:61;;;;-1:-1:-1;;;33099:61:0;;15395:2:1;33099:61:0;;;15377:21:1;;;15414:18;;;15407:30;15473:34;15453:18;;;15446:62;15525:18;;33099:61:0;15193:356:1;33099:61:0;33180:16;33188:7;33180;:16::i;:::-;33179:17;33171:58;;;;-1:-1:-1;;;33171:58:0;;11798:2:1;33171:58:0;;;11780:21:1;11837:2;11817:18;;;11810:30;11876;11856:18;;;11849:58;11924:18;;33171:58:0;11596:352:1;33171:58:0;-1:-1:-1;;;;;33300:13:0;;;;;;:9;:13;;;;;:18;;33317:1;;33300:13;:18;;33317:1;;33300:18;:::i;:::-;;;;-1:-1:-1;;33329:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;33329:21:0;-1:-1:-1;;;;;33329:21:0;;;;;;;;33368:33;;33329:16;;;33368:33;;33329:16;;33368:33;33027:382;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;14:631:1:-;78:5;108:18;149:2;141:6;138:14;135:40;;;155:18;;:::i;:::-;230:2;224:9;198:2;284:15;;-1:-1:-1;;280:24:1;;;306:2;276:33;272:42;260:55;;;330:18;;;350:22;;;327:46;324:72;;;376:18;;:::i;:::-;416:10;412:2;405:22;445:6;436:15;;475:6;467;460:22;515:3;506:6;501:3;497:16;494:25;491:45;;;532:1;529;522:12;491:45;582:6;577:3;570:4;562:6;558:17;545:44;637:1;630:4;621:6;613;609:19;605:30;598:41;;;;14:631;;;;;:::o;650:173::-;718:20;;-1:-1:-1;;;;;767:31:1;;757:42;;747:70;;813:1;810;803:12;828:160;893:20;;949:13;;942:21;932:32;;922:60;;978:1;975;968:12;993:221;1036:5;1089:3;1082:4;1074:6;1070:17;1066:27;1056:55;;1107:1;1104;1097:12;1056:55;1129:79;1204:3;1195:6;1182:20;1175:4;1167:6;1163:17;1129:79;:::i;:::-;1120:88;993:221;-1:-1:-1;;;993:221:1:o;1219:186::-;1278:6;1331:2;1319:9;1310:7;1306:23;1302:32;1299:52;;;1347:1;1344;1337:12;1299:52;1370:29;1389:9;1370:29;:::i;1410:260::-;1478:6;1486;1539:2;1527:9;1518:7;1514:23;1510:32;1507:52;;;1555:1;1552;1545:12;1507:52;1578:29;1597:9;1578:29;:::i;:::-;1568:39;;1626:38;1660:2;1649:9;1645:18;1626:38;:::i;:::-;1616:48;;1410:260;;;;;:::o;1675:328::-;1752:6;1760;1768;1821:2;1809:9;1800:7;1796:23;1792:32;1789:52;;;1837:1;1834;1827:12;1789:52;1860:29;1879:9;1860:29;:::i;:::-;1850:39;;1908:38;1942:2;1931:9;1927:18;1908:38;:::i;:::-;1898:48;;1993:2;1982:9;1978:18;1965:32;1955:42;;1675:328;;;;;:::o;2008:666::-;2103:6;2111;2119;2127;2180:3;2168:9;2159:7;2155:23;2151:33;2148:53;;;2197:1;2194;2187:12;2148:53;2220:29;2239:9;2220:29;:::i;:::-;2210:39;;2268:38;2302:2;2291:9;2287:18;2268:38;:::i;:::-;2258:48;;2353:2;2342:9;2338:18;2325:32;2315:42;;2408:2;2397:9;2393:18;2380:32;2435:18;2427:6;2424:30;2421:50;;;2467:1;2464;2457:12;2421:50;2490:22;;2543:4;2535:13;;2531:27;-1:-1:-1;2521:55:1;;2572:1;2569;2562:12;2521:55;2595:73;2660:7;2655:2;2642:16;2637:2;2633;2629:11;2595:73;:::i;:::-;2585:83;;;2008:666;;;;;;;:::o;2679:254::-;2744:6;2752;2805:2;2793:9;2784:7;2780:23;2776:32;2773:52;;;2821:1;2818;2811:12;2773:52;2844:29;2863:9;2844:29;:::i;:::-;2834:39;;2892:35;2923:2;2912:9;2908:18;2892:35;:::i;2938:254::-;3006:6;3014;3067:2;3055:9;3046:7;3042:23;3038:32;3035:52;;;3083:1;3080;3073:12;3035:52;3106:29;3125:9;3106:29;:::i;:::-;3096:39;3182:2;3167:18;;;;3154:32;;-1:-1:-1;;;2938:254:1:o;3197:180::-;3253:6;3306:2;3294:9;3285:7;3281:23;3277:32;3274:52;;;3322:1;3319;3312:12;3274:52;3345:26;3361:9;3345:26;:::i;3382:245::-;3440:6;3493:2;3481:9;3472:7;3468:23;3464:32;3461:52;;;3509:1;3506;3499:12;3461:52;3548:9;3535:23;3567:30;3591:5;3567:30;:::i;3632:249::-;3701:6;3754:2;3742:9;3733:7;3729:23;3725:32;3722:52;;;3770:1;3767;3760:12;3722:52;3802:9;3796:16;3821:30;3845:5;3821:30;:::i;3886:543::-;3974:6;3982;4035:2;4023:9;4014:7;4010:23;4006:32;4003:52;;;4051:1;4048;4041:12;4003:52;4091:9;4078:23;4120:18;4161:2;4153:6;4150:14;4147:34;;;4177:1;4174;4167:12;4147:34;4200:50;4242:7;4233:6;4222:9;4218:22;4200:50;:::i;:::-;4190:60;;4303:2;4292:9;4288:18;4275:32;4259:48;;4332:2;4322:8;4319:16;4316:36;;;4348:1;4345;4338:12;4316:36;;4371:52;4415:7;4404:8;4393:9;4389:24;4371:52;:::i;:::-;4361:62;;;3886:543;;;;;:::o;4434:272::-;4492:6;4545:2;4533:9;4524:7;4520:23;4516:32;4513:52;;;4561:1;4558;4551:12;4513:52;4600:9;4587:23;4650:6;4643:5;4639:18;4632:5;4629:29;4619:57;;4672:1;4669;4662:12;4711:180;4770:6;4823:2;4811:9;4802:7;4798:23;4794:32;4791:52;;;4839:1;4836;4829:12;4791:52;-1:-1:-1;4862:23:1;;4711:180;-1:-1:-1;4711:180:1:o;4896:248::-;4964:6;4972;5025:2;5013:9;5004:7;5000:23;4996:32;4993:52;;;5041:1;5038;5031:12;4993:52;-1:-1:-1;;5064:23:1;;;5134:2;5119:18;;;5106:32;;-1:-1:-1;4896:248:1:o;5149:257::-;5190:3;5228:5;5222:12;5255:6;5250:3;5243:19;5271:63;5327:6;5320:4;5315:3;5311:14;5304:4;5297:5;5293:16;5271:63;:::i;:::-;5388:2;5367:15;-1:-1:-1;;5363:29:1;5354:39;;;;5395:4;5350:50;;5149:257;-1:-1:-1;;5149:257:1:o;5411:470::-;5590:3;5628:6;5622:13;5644:53;5690:6;5685:3;5678:4;5670:6;5666:17;5644:53;:::i;:::-;5760:13;;5719:16;;;;5782:57;5760:13;5719:16;5816:4;5804:17;;5782:57;:::i;:::-;5855:20;;5411:470;-1:-1:-1;;;;5411:470:1:o;5886:1548::-;6618:3;6656:6;6650:13;6672:53;6718:6;6713:3;6706:4;6698:6;6694:17;6672:53;:::i;:::-;6788:13;;6747:16;;;;6810:57;6788:13;6747:16;6844:4;6832:17;;6810:57;:::i;:::-;-1:-1:-1;;;6889:20:1;;6918:29;;;-1:-1:-1;;;6974:1:1;6963:13;;6956:63;7051:66;7046:2;7035:14;;7028:90;-1:-1:-1;;;7145:2:1;7134:14;;7127:44;7196:13;;7218:66;7196:13;7270:2;7259:14;;7252:4;7240:17;;7218:66;:::i;:::-;-1:-1:-1;;;7347:2:1;7303:20;;;;7339:11;;;7332:35;-1:-1:-1;;;7391:2:1;7383:11;;7376:25;7425:2;7417:11;;5886:1548;-1:-1:-1;;;;;5886:1548:1:o;8015:1354::-;8479:66;8474:3;8467:79;8576:34;8571:2;8566:3;8562:12;8555:56;8641:34;8636:2;8631:3;8627:12;8620:56;8706:34;8701:2;8696:3;8692:12;8685:56;8772:66;8766:3;8761;8757:13;8750:89;8870:66;8864:3;8859;8855:13;8848:89;8977:36;8972:3;8968:46;8962:3;8957;8953:13;8946:69;8449:3;9044:6;9038:13;9060:61;9114:6;9108:3;9103;9099:13;9094:2;9086:6;9082:15;9060:61;:::i;:::-;-1:-1:-1;;;9180:3:1;9140:16;;;;9172:12;;;9165:36;-1:-1:-1;9231:66:1;9225:3;9217:12;;9210:88;-1:-1:-1;;;9322:3:1;9314:12;;9307:28;9359:3;9351:12;;8015:1354;-1:-1:-1;8015:1354:1:o;9582:488::-;-1:-1:-1;;;;;9851:15:1;;;9833:34;;9903:15;;9898:2;9883:18;;9876:43;9950:2;9935:18;;9928:34;;;9998:3;9993:2;9978:18;;9971:31;;;9776:4;;10019:45;;10044:19;;10036:6;10019:45;:::i;:::-;10011:53;9582:488;-1:-1:-1;;;;;;9582:488:1:o;10546:219::-;10695:2;10684:9;10677:21;10658:4;10715:44;10755:2;10744:9;10740:18;10732:6;10715:44;:::i;10770:414::-;10972:2;10954:21;;;11011:2;10991:18;;;10984:30;11050:34;11045:2;11030:18;;11023:62;-1:-1:-1;;;11116:2:1;11101:18;;11094:48;11174:3;11159:19;;10770:414::o;14778:410::-;14980:2;14962:21;;;15019:2;14999:18;;;14992:30;15058:34;15053:2;15038:18;;15031:62;-1:-1:-1;;;15124:2:1;15109:18;;15102:44;15178:3;15163:19;;14778:410::o;16385:356::-;16587:2;16569:21;;;16606:18;;;16599:30;16665:34;16660:2;16645:18;;16638:62;16732:2;16717:18;;16385:356::o;17558:413::-;17760:2;17742:21;;;17799:2;17779:18;;;17772:30;17838:34;17833:2;17818:18;;17811:62;-1:-1:-1;;;17904:2:1;17889:18;;17882:47;17961:3;17946:19;;17558:413::o;18697:128::-;18737:3;18768:1;18764:6;18761:1;18758:13;18755:39;;;18774:18;;:::i;:::-;-1:-1:-1;18810:9:1;;18697:128::o;18830:204::-;18868:3;18904:4;18901:1;18897:12;18936:4;18933:1;18929:12;18971:3;18965:4;18961:14;18956:3;18953:23;18950:49;;;18979:18;;:::i;:::-;19015:13;;18830:204;-1:-1:-1;;;18830:204:1:o;19039:120::-;19079:1;19105;19095:35;;19110:18;;:::i;:::-;-1:-1:-1;19144:9:1;;19039:120::o;19164:168::-;19204:7;19270:1;19266;19262:6;19258:14;19255:1;19252:21;19247:1;19240:9;19233:17;19229:45;19226:71;;;19277:18;;:::i;:::-;-1:-1:-1;19317:9:1;;19164:168::o;19337:217::-;19376:4;19405:6;19461:10;;;;19431;;19483:12;;;19480:38;;;19498:18;;:::i;:::-;19535:13;;19337:217;-1:-1:-1;;;19337:217:1:o;19559:125::-;19599:4;19627:1;19624;19621:8;19618:34;;;19632:18;;:::i;:::-;-1:-1:-1;19669:9:1;;19559:125::o;19689:258::-;19761:1;19771:113;19785:6;19782:1;19779:13;19771:113;;;19861:11;;;19855:18;19842:11;;;19835:39;19807:2;19800:10;19771:113;;;19902:6;19899:1;19896:13;19893:48;;;-1:-1:-1;;19937:1:1;19919:16;;19912:27;19689:258::o;19952:380::-;20031:1;20027:12;;;;20074;;;20095:61;;20149:4;20141:6;20137:17;20127:27;;20095:61;20202:2;20194:6;20191:14;20171:18;20168:38;20165:161;;;20248:10;20243:3;20239:20;20236:1;20229:31;20283:4;20280:1;20273:15;20311:4;20308:1;20301:15;20165:161;;19952:380;;;:::o;20337:135::-;20376:3;-1:-1:-1;;20397:17:1;;20394:43;;;20417:18;;:::i;:::-;-1:-1:-1;20464:1:1;20453:13;;20337:135::o;20477:179::-;20508:1;20534:6;20567:2;20564:1;20560:10;20589:3;20579:37;;20596:18;;:::i;:::-;20634:10;;20630:20;;;;;20477:179;-1:-1:-1;;20477:179:1:o;20661:127::-;20722:10;20717:3;20713:20;20710:1;20703:31;20753:4;20750:1;20743:15;20777:4;20774:1;20767:15;20793:127;20854:10;20849:3;20845:20;20842:1;20835:31;20885:4;20882:1;20875:15;20909:4;20906:1;20899:15;20925:127;20986:10;20981:3;20977:20;20974:1;20967:31;21017:4;21014:1;21007:15;21041:4;21038:1;21031:15;21057:127;21118:10;21113:3;21109:20;21106:1;21099:31;21149:4;21146:1;21139:15;21173:4;21170:1;21163:15;21189:131;-1:-1:-1;;;;;;21263:32:1;;21253:43;;21243:71;;21310:1;21307;21300:12

Swarm Source

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