ETH Price: $3,481.62 (+4.43%)
Gas: 5.62 Gwei

Token

LavaLamp (LavaLamp)
 

Overview

Max Total Supply

2,222 LavaLamp

Holders

547

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A

Other Info

Filtered by Token Holder
hirtme.eth
Balance
2 LavaLamp
0xbfcc73dc4b03f0febb5ce1d53e5e410a3ee8cfc1
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:
LavaLamp

Compiler Version
v0.8.19+commit.7dd6d404

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.19;


contract OperatorFilterer {
    error OperatorNotAllowed(address operator);

    IOperatorFilterRegistry constant operatorFilterRegistry =
        IOperatorFilterRegistry(0x000000000000AAeB6D7670E522A718067333cd4E);

    constructor(address subscriptionOrRegistrantToCopy, bool subscribe) {
        // If an inheriting token contract is deployed to a network without the registry deployed, the modifier
        // will not revert, but the contract will need to be registered with the registry once it is deployed in
        // order for the modifier to filter addresses.
        if (address(operatorFilterRegistry).code.length > 0) {
            if (subscribe) {
                operatorFilterRegistry.registerAndSubscribe(address(this), subscriptionOrRegistrantToCopy);
            } else {
                if (subscriptionOrRegistrantToCopy != address(0)) {
                    operatorFilterRegistry.registerAndCopyEntries(address(this), subscriptionOrRegistrantToCopy);
                } else {
                    operatorFilterRegistry.register(address(this));
                }
            }
        }
    }

    modifier onlyAllowedOperator() virtual {
        // Check registry code length to facilitate testing in environments without a deployed registry.
        if (address(operatorFilterRegistry).code.length > 0) {
            if (!operatorFilterRegistry.isOperatorAllowed(address(this), msg.sender)) {
                revert OperatorNotAllowed(msg.sender);
            }
        }
        _;
    }
}

contract DefaultOperatorFilterer is OperatorFilterer {
    address constant DEFAULT_SUBSCRIPTION = address(0x3cc6CddA760b79bAfa08dF41ECFA224f810dCeB6);

    constructor() OperatorFilterer(DEFAULT_SUBSCRIPTION, true) {}
}

library EnumerableSet {
    // To implement this library for multiple types with as little code
    // repetition as possible, we write it in terms of a generic Set type with
    // bytes32 values.
    // The Set implementation uses private functions, and user-facing
    // implementations (such as AddressSet) are just wrappers around the
    // underlying Set.
    // This means that we can only create new EnumerableSets for types that fit
    // in bytes32.

    struct Set {
        // Storage of set values
        bytes32[] _values;
        // Position of the value in the `values` array, plus 1 because index 0
        // means a value is not in the set.
        mapping(bytes32 => uint256) _indexes;
    }

    /**
     * @dev Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function _add(Set storage set, bytes32 value) private returns (bool) {
        if (!_contains(set, value)) {
            set._values.push(value);
            // The value is stored at length-1, but we add 1 to all indexes
            // and use 0 as a sentinel value
            set._indexes[value] = set._values.length;
            return true;
        } else {
            return false;
        }
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function _remove(Set storage set, bytes32 value) private returns (bool) {
        // We read and store the value's index to prevent multiple reads from the same storage slot
        uint256 valueIndex = set._indexes[value];

        if (valueIndex != 0) {
            // Equivalent to contains(set, value)
            // To delete an element from the _values array in O(1), we swap the element to delete with the last one in
            // the array, and then remove the last element (sometimes called as 'swap and pop').
            // This modifies the order of the array, as noted in {at}.

            uint256 toDeleteIndex = valueIndex - 1;
            uint256 lastIndex = set._values.length - 1;

            if (lastIndex != toDeleteIndex) {
                bytes32 lastValue = set._values[lastIndex];

                // Move the last value to the index where the value to delete is
                set._values[toDeleteIndex] = lastValue;
                // Update the index for the moved value
                set._indexes[lastValue] = valueIndex; // Replace lastValue's index to valueIndex
            }

            // Delete the slot where the moved value was stored
            set._values.pop();

            // Delete the index for the deleted slot
            delete set._indexes[value];

            return true;
        } else {
            return false;
        }
    }

    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function _contains(Set storage set, bytes32 value) private view returns (bool) {
        return set._indexes[value] != 0;
    }

    /**
     * @dev Returns the number of values on the set. O(1).
     */
    function _length(Set storage set) private view returns (uint256) {
        return set._values.length;
    }

    /**
     * @dev Returns the value stored at position `index` in the set. O(1).
     *
     * Note that there are no guarantees on the ordering of values inside the
     * array, and it may change when more values are added or removed.
     *
     * Requirements:
     *
     * - `index` must be strictly less than {length}.
     */
    function _at(Set storage set, uint256 index) private view returns (bytes32) {
        return set._values[index];
    }

    /**
     * @dev Return the entire set in an array
     *
     * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed
     * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that
     * this function has an unbounded cost, and using it as part of a state-changing function may render the function
     * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.
     */
    function _values(Set storage set) private view returns (bytes32[] memory) {
        return set._values;
    }

    // Bytes32Set

    struct Bytes32Set {
        Set _inner;
    }

    /**
     * @dev Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function add(Bytes32Set storage set, bytes32 value) internal returns (bool) {
        return _add(set._inner, value);
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function remove(Bytes32Set storage set, bytes32 value) internal returns (bool) {
        return _remove(set._inner, value);
    }

    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function contains(Bytes32Set storage set, bytes32 value) internal view returns (bool) {
        return _contains(set._inner, value);
    }

    /**
     * @dev Returns the number of values in the set. O(1).
     */
    function length(Bytes32Set storage set) internal view returns (uint256) {
        return _length(set._inner);
    }

    /**
     * @dev Returns the value stored at position `index` in the set. O(1).
     *
     * Note that there are no guarantees on the ordering of values inside the
     * array, and it may change when more values are added or removed.
     *
     * Requirements:
     *
     * - `index` must be strictly less than {length}.
     */
    function at(Bytes32Set storage set, uint256 index) internal view returns (bytes32) {
        return _at(set._inner, index);
    }

    /**
     * @dev Return the entire set in an array
     *
     * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed
     * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that
     * this function has an unbounded cost, and using it as part of a state-changing function may render the function
     * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.
     */
    function values(Bytes32Set storage set) internal view returns (bytes32[] memory) {
        bytes32[] memory store = _values(set._inner);
        bytes32[] memory result;

        /// @solidity memory-safe-assembly
        assembly {
            result := store
        }

        return result;
    }

    // AddressSet

    struct AddressSet {
        Set _inner;
    }

    /**
     * @dev Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function add(AddressSet storage set, address value) internal returns (bool) {
        return _add(set._inner, bytes32(uint256(uint160(value))));
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function remove(AddressSet storage set, address value) internal returns (bool) {
        return _remove(set._inner, bytes32(uint256(uint160(value))));
    }

    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function contains(AddressSet storage set, address value) internal view returns (bool) {
        return _contains(set._inner, bytes32(uint256(uint160(value))));
    }

    /**
     * @dev Returns the number of values in the set. O(1).
     */
    function length(AddressSet storage set) internal view returns (uint256) {
        return _length(set._inner);
    }

    /**
     * @dev Returns the value stored at position `index` in the set. O(1).
     *
     * Note that there are no guarantees on the ordering of values inside the
     * array, and it may change when more values are added or removed.
     *
     * Requirements:
     *
     * - `index` must be strictly less than {length}.
     */
    function at(AddressSet storage set, uint256 index) internal view returns (address) {
        return address(uint160(uint256(_at(set._inner, index))));
    }

    /**
     * @dev Return the entire set in an array
     *
     * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed
     * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that
     * this function has an unbounded cost, and using it as part of a state-changing function may render the function
     * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.
     */
    function values(AddressSet storage set) internal view returns (address[] memory) {
        bytes32[] memory store = _values(set._inner);
        address[] memory result;

        /// @solidity memory-safe-assembly
        assembly {
            result := store
        }

        return result;
    }

    // UintSet

    struct UintSet {
        Set _inner;
    }

    /**
     * @dev Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function add(UintSet storage set, uint256 value) internal returns (bool) {
        return _add(set._inner, bytes32(value));
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function remove(UintSet storage set, uint256 value) internal returns (bool) {
        return _remove(set._inner, bytes32(value));
    }

    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function contains(UintSet storage set, uint256 value) internal view returns (bool) {
        return _contains(set._inner, bytes32(value));
    }

    /**
     * @dev Returns the number of values in the set. O(1).
     */
    function length(UintSet storage set) internal view returns (uint256) {
        return _length(set._inner);
    }

    /**
     * @dev Returns the value stored at position `index` in the set. O(1).
     *
     * Note that there are no guarantees on the ordering of values inside the
     * array, and it may change when more values are added or removed.
     *
     * Requirements:
     *
     * - `index` must be strictly less than {length}.
     */
    function at(UintSet storage set, uint256 index) internal view returns (uint256) {
        return uint256(_at(set._inner, index));
    }

    /**
     * @dev Return the entire set in an array
     *
     * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed
     * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that
     * this function has an unbounded cost, and using it as part of a state-changing function may render the function
     * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.
     */
    function values(UintSet storage set) internal view returns (uint256[] memory) {
        bytes32[] memory store = _values(set._inner);
        uint256[] memory result;

        /// @solidity memory-safe-assembly
        assembly {
            result := store
        }

        return result;
    }
}

interface IOperatorFilterRegistry {
    function isOperatorAllowed(address registrant, address operator) external returns (bool);
    function register(address registrant) external;
    function registerAndSubscribe(address registrant, address subscription) external;
    function registerAndCopyEntries(address registrant, address registrantToCopy) external;
    function updateOperator(address registrant, address operator, bool filtered) external;
    function updateOperators(address registrant, address[] calldata operators, bool filtered) external;
    function updateCodeHash(address registrant, bytes32 codehash, bool filtered) external;
    function updateCodeHashes(address registrant, bytes32[] calldata codeHashes, bool filtered) external;
    function subscribe(address registrant, address registrantToSubscribe) external;
    function unsubscribe(address registrant, bool copyExistingEntries) external;
    function subscriptionOf(address addr) external returns (address registrant);
    function subscribers(address registrant) external returns (address[] memory);
    function subscriberAt(address registrant, uint256 index) external returns (address);
    function copyEntriesOf(address registrant, address registrantToCopy) external;
    function isOperatorFiltered(address registrant, address operator) external returns (bool);
    function isCodeHashOfFiltered(address registrant, address operatorWithCode) external returns (bool);
    function isCodeHashFiltered(address registrant, bytes32 codeHash) external returns (bool);
    function filteredOperators(address addr) external returns (address[] memory);
    function filteredCodeHashes(address addr) external returns (bytes32[] memory);
    function filteredOperatorAt(address registrant, uint256 index) external returns (address);
    function filteredCodeHashAt(address registrant, uint256 index) external returns (bytes32);
    function isRegistered(address addr) external returns (bool);
    function codeHashOf(address addr) external returns (bytes32);
}

interface IERC721A {
    /**
     * The caller must own the token or be an approved operator.
     */
    error ApprovalCallerNotOwnerNorApproved();

    /**
     * The token does not exist.
     */
    error ApprovalQueryForNonexistentToken();

    /**
     * Cannot query the balance for the zero address.
     */
    error BalanceQueryForZeroAddress();

    /**
     * Cannot mint to the zero address.
     */
    error MintToZeroAddress();

    /**
     * The quantity of tokens minted must be more than zero.
     */
    error MintZeroQuantity();

    /**
     * The token does not exist.
     */
    error OwnerQueryForNonexistentToken();

    /**
     * The caller must own the token or be an approved operator.
     */
    error TransferCallerNotOwnerNorApproved();

    /**
     * The token must be owned by `from`.
     */
    error TransferFromIncorrectOwner();

    /**
     * Cannot safely transfer to a contract that does not implement the
     * ERC721Receiver interface.
     */
    error TransferToNonERC721ReceiverImplementer();

    /**
     * Cannot transfer to the zero address.
     */
    error TransferToZeroAddress();

    /**
     * The token does not exist.
     */
    error URIQueryForNonexistentToken();

    /**
     * The `quantity` minted with ERC2309 exceeds the safety limit.
     */
    error MintERC2309QuantityExceedsLimit();

    /**
     * The `extraData` cannot be set on an unintialized ownership slot.
     */
    error OwnershipNotInitializedForExtraData();

    // =============================================================
    //                            STRUCTS
    // =============================================================

    struct TokenOwnership {
        // The address of the owner.
        address addr;
        // Stores the start time of ownership with minimal overhead for tokenomics.
        uint64 startTimestamp;
        // Whether the token has been burned.
        bool burned;
        // Arbitrary data similar to `startTimestamp` that can be set via {_extraData}.
        uint24 extraData;
    }

    // =============================================================
    //                         TOKEN COUNTERS
    // =============================================================

    /**
     * @dev Returns the total number of tokens in existence.
     * Burned tokens will reduce the count.
     * To get the total number of tokens minted, please see {_totalMinted}.
     */
    function totalSupply() external view returns (uint256);

    // =============================================================
    //                            IERC165
    // =============================================================

    /**
     * @dev Returns true if this contract implements the interface defined by
     * `interfaceId`. See the corresponding
     * [EIP section](https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified)
     * to learn more about how these ids are created.
     *
     * This function call must use less than 30000 gas.
     */
    function supportsInterface(bytes4 interfaceId) external view returns (bool);

    // =============================================================
    //                            IERC721
    // =============================================================

    /**
     * @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,
        bytes calldata data
    ) external payable;

    /**
     * @dev Equivalent to `safeTransferFrom(from, to, tokenId, '')`.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external payable;

    /**
     * @dev Transfers `tokenId` 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 payable;

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

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

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

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

    // =============================================================
    //                        IERC721Metadata
    // =============================================================

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

    // =============================================================
    //                           IERC2309
    // =============================================================

    /**
     * @dev Emitted when tokens in `fromTokenId` to `toTokenId`
     * (inclusive) is transferred from `from` to `to`, as defined in the
     * [ERC2309](https://eips.ethereum.org/EIPS/eip-2309) standard.
     *
     * See {_mintERC2309} for more details.
     */
    event ConsecutiveTransfer(uint256 indexed fromTokenId, uint256 toTokenId, address indexed from, address indexed to);
}

library segments {

    // TODO -- Change metadata if blob - implement hue value - implement burned - implement type (palette or blob)
    function getMetadata(uint tokenId, string memory hue) internal pure returns (string memory) {

        string memory json;

            json = string(abi.encodePacked(
            '{"name": "LavaLamp #',
            uint2str(tokenId),
            '", "description": "We all live in different blobs.", "attributes":[{"trait_type": "HUE", "value": ',
            hue,
            '}], "image": "data:image/svg+xml;base64,',
            Base64.encode(bytes(renderSvg(hue))),
            '"}'
        ));
        

        return string(abi.encodePacked(
            "data:application/json;base64,",
            Base64.encode(bytes(json))
        ));
    }

    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 renderSvg(string memory hue) internal pure returns (string memory svg) {
        svg = '<svg version="1.1"  xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"  xmlns:a="http://ns.adobe.com/AdobeSVGViewerExtensions/3.0/"  x="0px" y="0px" width="600px" height="600px" viewBox="0 0 600 600"  enable-background="new 0 0 600 600" xml:space="preserve">';
        svg = string(abi.encodePacked(svg,'<defs><style> :root{--hue: ', hue));

        svg = string(abi.encodePacked(svg,'; --hueComplement: calc(var(--hue) + 180); --hueRightAnalogous: calc(var(--hue) + 30); --hueLeftAnalogous: calc(var(--hue) - 30); --accentV1: hsl(var(--hueRightAnalogous) 50% 50%); --accentV2: hsl(var(--hueLeftAnalogous) 50% 50%); } body { background-color:#000; overflow: hidden; } @keyframes updown { 0% { transform: translateY(0) scale(0.2); } 50% { transform: translateY(-100px) scale(0.1); } 100% { transform: translateY(0) scale(0.2); } } .blob { transform-origin: 50% 70%; animation-name: updown; animation-duration: 30s; animation-iteration-count: infinite; animation-direction: alternate; } .blob2 { transform-origin: 50% 30%; animation-duration: 40s; } .blob3{ transform-origin: 50% 45%; animation-duration: 18s; } .blob4{ transform-origin: 50% 55%; animation-duration: 24s; } </style> <linearGradient id="a" y1="1" xmlns="http://www.w3.org/2000/svg"> <stop stop-color="var(--accentV1)" offset="0"/> <stop stop-color="var(--accentV2)" offset="1"/> </linearGradient> <filter id="d"> <feGaussianBlur in="SourceGraphic" result="blur" stdDeviation="8"/> <feColorMatrix in="blur" mode="matrix" result="cm" values="1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 21 -9"/> </filter> <radialGradient id="g" cx="300" cy="300" r="350" gradientUnits="userSpaceOnUse"> <stop stop-color="#471A19" offset=".071429"/> <stop stop-color="#290F0E" offset=".3107"/> <stop stop-color="#120706" offset=".553"/> <stop stop-color="#050202" offset=".7828"/> <stop offset=".9847"/> </radialGradient> <clipPath id="f"> <path id="e" d="m262 174h60l33.5 182.3s2.7 12.8 2.5 22.8h-131s-0.7-9.3 0-18c0.6-8.2 35-187.1 35-187.1z"/> </clipPath> <linearGradient id="b" x1="292" x2="292" y1="135" y2="174" gradientUnits="userSpaceOnUse"> <stop offset=".015306"/> <stop stop-color="#050202" offset=".233"/> <stop stop-color="#120706" offset=".4808"/> <stop stop-color="#290F0E" offset=".7421"/> <stop stop-color="#471A19" offset="1"/> </linearGradient> <linearGradient id="c" x1="292.38" x2="292.38" y1="470" y2="379" gradientUnits="userSpaceOnUse"> <stop offset=".005102"/> <stop stop-color="#050202" offset=".2251"/> <stop stop-color="#120706" offset=".4754"/> <stop stop-color="#290F0E" offset=".7394"/> <stop stop-color="#471A19" offset="1"/> </linearGradient> </defs> <rect width="600" height="600" fill="url(#g)"/> <use fill="var(--accentV1)" opacity=".1" xlink:href="#e"/> <polygon points="269 135 262 174 322 174 316 135" fill="url(#b)"/> <path d="m226.8 379c2.6 43 23.9 54.6 28.3 60.2 3.3 5.4-10 30.8-10 30.8h95.5s-16.5-25.1-14.5-30.8 26-15.2 32-60.2h-131.3z" fill="url(#c)"/> <rect y="470" width="600" height="130"/> <g clip-path="url(#f)" fill="url(#a)" filter="url(#d)"> <path fill="url(#a)" class="blob" d="M337,323.5Q240,407,165,323.5Q90,240,165,161.5Q240,83,337,161.5Q434,240,337,323.5Z" /> <path fill="url(#a)" class="blob blob2" d="M324,343.5Q240,447,154.5,343.5Q69,240,154.5,147Q240,54,324,147Q408,240,324,343.5Z" /> <path fill="url(#a)" class="blob blob3" d="M324,343.5Q240,447,154.5,343.5Q69,240,154.5,147Q240,54,324,147Q408,240,324,343.5Z" /> <path fill="url(#a)" class="blob blob4" d="M395,324.5Q338,409,234,420Q130,431,81,335.5Q32,240,83,148.5Q134,57,237.5,60.5Q341,64,396.5,152Q452,240,395,324.5Z" /> <path d="m354 381.2c6.8 3.4 5.4 7.4-5.6 10.4-10.7 3.1-31.1 5.1-54.4 8.4s-43.7 0.8-54.4-2.4c-11-3.4-12.4-7.6-5.6-13.8 6.8-7 18.9-14.6 29.6-17.4 11-3.3 20.6-1.8 30.4-1.4s19.4 5.1 30.4 8.3c10.7 3.5 22.8 5.3 29.6 7.9z"/> </g> </svg>')); 
        
        return string(abi.encodePacked(svg));
    }
}

abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

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

abstract contract Ownable is Context {
    address private _owner;

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

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

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

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

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

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

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

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

interface ERC721A__IERC721Receiver {
    function onERC721Received(
        address operator,
        address from,
        uint256 tokenId,
        bytes calldata data
    ) external returns (bytes4);
}

contract ERC721A is IERC721A {
    // Bypass for a `--via-ir` bug (https://github.com/chiru-labs/ERC721A/pull/364).
    struct TokenApprovalRef {
        address value;
    }

    // =============================================================
    //                           CONSTANTS
    // =============================================================

    // Mask of an entry in packed address data.
    uint256 private constant _BITMASK_ADDRESS_DATA_ENTRY = (1 << 64) - 1;

    // The bit position of `numberMinted` in packed address data.
    uint256 private constant _BITPOS_NUMBER_MINTED = 64;

    // The bit position of `numberBurned` in packed address data.
    uint256 private constant _BITPOS_NUMBER_BURNED = 128;

    // The bit position of `aux` in packed address data.
    uint256 private constant _BITPOS_AUX = 192;

    // Mask of all 256 bits in packed address data except the 64 bits for `aux`.
    uint256 private constant _BITMASK_AUX_COMPLEMENT = (1 << 192) - 1;

    // The bit position of `startTimestamp` in packed ownership.
    uint256 private constant _BITPOS_START_TIMESTAMP = 160;

    // The bit mask of the `burned` bit in packed ownership.
    uint256 private constant _BITMASK_BURNED = 1 << 224;

    // The bit position of the `nextInitialized` bit in packed ownership.
    uint256 private constant _BITPOS_NEXT_INITIALIZED = 225;

    // The bit mask of the `nextInitialized` bit in packed ownership.
    uint256 private constant _BITMASK_NEXT_INITIALIZED = 1 << 225;

    // The bit position of `extraData` in packed ownership.
    uint256 private constant _BITPOS_EXTRA_DATA = 232;

    // Mask of all 256 bits in a packed ownership except the 24 bits for `extraData`.
    uint256 private constant _BITMASK_EXTRA_DATA_COMPLEMENT = (1 << 232) - 1;

    // The mask of the lower 160 bits for addresses.
    uint256 private constant _BITMASK_ADDRESS = (1 << 160) - 1;

    // The maximum `quantity` that can be minted with {_mintERC2309}.
    // This limit is to prevent overflows on the address data entries.
    // For a limit of 5000, a total of 3.689e15 calls to {_mintERC2309}
    // is required to cause an overflow, which is unrealistic.
    uint256 private constant _MAX_MINT_ERC2309_QUANTITY_LIMIT = 5000;

    // The `Transfer` event signature is given by:
    // `keccak256(bytes("Transfer(address,address,uint256)"))`.
    bytes32 private constant _TRANSFER_EVENT_SIGNATURE =
        0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef;

    // =============================================================
    //                            STORAGE
    // =============================================================

    // The next token ID to be minted.
    uint256 private _currentIndex;

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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

    // Mapping from token ID to ownership details
    // An empty struct value does not necessarily mean the token is unowned.
    // See {_packedOwnershipOf} implementation for details.
    //
    // Bits Layout:
    // - [0..159]   `addr`
    // - [160..223] `startTimestamp`
    // - [224]      `burned`
    // - [225]      `nextInitialized`
    // - [232..255] `extraData`
    mapping(uint256 => uint256) private _packedOwnerships;

    // Mapping owner address to address data.
    //
    // Bits Layout:
    // - [0..63]    `balance`
    // - [64..127]  `numberMinted`
    // - [128..191] `numberBurned`
    // - [192..255] `aux`
    mapping(address => uint256) private _packedAddressData;

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

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

    // =============================================================
    //                          CONSTRUCTOR
    // =============================================================

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

    // =============================================================
    //                   TOKEN COUNTING OPERATIONS
    // =============================================================

    /**
     * @dev Returns the starting token ID.
     * To change the starting token ID, please override this function.
     */
    function _startTokenId() internal view virtual returns (uint256) {
        return 1;
    }

    /**
     * @dev Returns the next token ID to be minted.
     */
    function _nextTokenId() internal view virtual returns (uint256) {
        return _currentIndex;
    }

    /**
     * @dev Returns the total number of tokens in existence.
     * Burned tokens will reduce the count.
     * To get the total number of tokens minted, please see {_totalMinted}.
     */
    function totalSupply() public view virtual override returns (uint256) {
        // Counter underflow is impossible as _burnCounter cannot be incremented
        // more than `_currentIndex - _startTokenId()` times.
        unchecked {
            return _currentIndex - _burnCounter - _startTokenId();
        }
    }

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

    /**
     * @dev Returns the total number of tokens burned.
     */
    function _totalBurned() internal view virtual returns (uint256) {
        return _burnCounter;
    }

    // =============================================================
    //                    ADDRESS DATA OPERATIONS
    // =============================================================

    /**
     * @dev Returns the number of tokens in `owner`'s account.
     */
    function balanceOf(address owner) public view virtual override returns (uint256) {
        if (owner == address(0)) revert BalanceQueryForZeroAddress();
        return _packedAddressData[owner] & _BITMASK_ADDRESS_DATA_ENTRY;
    }

    /**
     * Returns the number of tokens minted by `owner`.
     */
    function _numberMinted(address owner) internal view returns (uint256) {
        return (_packedAddressData[owner] >> _BITPOS_NUMBER_MINTED) & _BITMASK_ADDRESS_DATA_ENTRY;
    }

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

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

    /**
     * Sets the auxiliary data for `owner`. (e.g. number of whitelist mint slots used).
     * If there are multiple variables, please pack them into a uint64.
     */
    function _setAux(address owner, uint64 aux) internal virtual {
        uint256 packed = _packedAddressData[owner];
        uint256 auxCasted;
        // Cast `aux` with assembly to avoid redundant masking.
        assembly {
            auxCasted := aux
        }
        packed = (packed & _BITMASK_AUX_COMPLEMENT) | (auxCasted << _BITPOS_AUX);
        _packedAddressData[owner] = packed;
    }

    // =============================================================
    //                            IERC165
    // =============================================================

    /**
     * @dev Returns true if this contract implements the interface defined by
     * `interfaceId`. See the corresponding
     * [EIP section](https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified)
     * to learn more about how these ids are created.
     *
     * This function call must use less than 30000 gas.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        // The interface IDs are constants representing the first 4 bytes
        // of the XOR of all function selectors in the interface.
        // See: [ERC165](https://eips.ethereum.org/EIPS/eip-165)
        // (e.g. `bytes4(i.functionA.selector ^ i.functionB.selector ^ ...)`)
        return
            interfaceId == 0x01ffc9a7 || // ERC165 interface ID for ERC165.
            interfaceId == 0x80ac58cd || // ERC165 interface ID for ERC721.
            interfaceId == 0x5b5e139f; // ERC165 interface ID for ERC721Metadata.
    }

    // =============================================================
    //                        IERC721Metadata
    // =============================================================

    /**
     * @dev Returns the token collection name.
     */
    function name() public view virtual override returns (string memory) {
        return _name;
    }

    /**
     * @dev Returns the token collection symbol.
     */
    function symbol() public view virtual override returns (string memory) {
        return _symbol;
    }

    /**
     * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token.
     */
    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        if (!_exists(tokenId)) revert URIQueryForNonexistentToken();

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

    /**
     * @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, it can be overridden in child contracts.
     */
    function _baseURI() internal view virtual returns (string memory) {
        return '';
    }

    // =============================================================
    //                     OWNERSHIPS OPERATIONS
    // =============================================================

    /**
     * @dev Returns the owner of the `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function ownerOf(uint256 tokenId) public view virtual override returns (address) {
        return address(uint160(_packedOwnershipOf(tokenId)));
    }

    /**
     * @dev Gas spent here starts off proportional to the maximum mint batch size.
     * It gradually moves to O(1) as tokens get transferred around over time.
     */
    function _ownershipOf(uint256 tokenId) internal view virtual returns (TokenOwnership memory) {
        return _unpackedOwnership(_packedOwnershipOf(tokenId));
    }

    /**
     * @dev Returns the unpacked `TokenOwnership` struct at `index`.
     */
    function _ownershipAt(uint256 index) internal view virtual returns (TokenOwnership memory) {
        return _unpackedOwnership(_packedOwnerships[index]);
    }

    /**
     * @dev Initializes the ownership slot minted at `index` for efficiency purposes.
     */
    function _initializeOwnershipAt(uint256 index) internal virtual {
        if (_packedOwnerships[index] == 0) {
            _packedOwnerships[index] = _packedOwnershipOf(index);
        }
    }

    /**
     * Returns the packed ownership data of `tokenId`.
     */
    function _packedOwnershipOf(uint256 tokenId) private view returns (uint256) {
        uint256 curr = tokenId;

        unchecked {
            if (_startTokenId() <= curr)
                if (curr < _currentIndex) {
                    uint256 packed = _packedOwnerships[curr];
                    // If not burned.
                    if (packed & _BITMASK_BURNED == 0) {
                        // Invariant:
                        // There will always be an initialized ownership slot
                        // (i.e. `ownership.addr != address(0) && ownership.burned == false`)
                        // before an unintialized ownership slot
                        // (i.e. `ownership.addr == address(0) && ownership.burned == false`)
                        // Hence, `curr` will not underflow.
                        //
                        // We can directly compare the packed value.
                        // If the address is zero, packed will be zero.
                        while (packed == 0) {
                            packed = _packedOwnerships[--curr];
                        }
                        return packed;
                    }
                }
        }
        revert OwnerQueryForNonexistentToken();
    }

    /**
     * @dev Returns the unpacked `TokenOwnership` struct from `packed`.
     */
    function _unpackedOwnership(uint256 packed) private pure returns (TokenOwnership memory ownership) {
        ownership.addr = address(uint160(packed));
        ownership.startTimestamp = uint64(packed >> _BITPOS_START_TIMESTAMP);
        ownership.burned = packed & _BITMASK_BURNED != 0;
        ownership.extraData = uint24(packed >> _BITPOS_EXTRA_DATA);
    }

    /**
     * @dev Packs ownership data into a single uint256.
     */
    function _packOwnershipData(address owner, uint256 flags) private view returns (uint256 result) {
        assembly {
            // Mask `owner` to the lower 160 bits, in case the upper bits somehow aren't clean.
            owner := and(owner, _BITMASK_ADDRESS)
            // `owner | (block.timestamp << _BITPOS_START_TIMESTAMP) | flags`.
            result := or(owner, or(shl(_BITPOS_START_TIMESTAMP, timestamp()), flags))
        }
    }

    /**
     * @dev Returns the `nextInitialized` flag set if `quantity` equals 1.
     */
    function _nextInitializedFlag(uint256 quantity) private pure returns (uint256 result) {
        // For branchless setting of the `nextInitialized` flag.
        assembly {
            // `(quantity == 1) << _BITPOS_NEXT_INITIALIZED`.
            result := shl(_BITPOS_NEXT_INITIALIZED, eq(quantity, 1))
        }
    }

    // =============================================================
    //                      APPROVAL OPERATIONS
    // =============================================================

    /**
     * @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) public payable virtual override {
        address owner = ownerOf(tokenId);

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

        _tokenApprovals[tokenId].value = to;
        emit Approval(owner, to, tokenId);
    }

    /**
     * @dev Returns the account approved for `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function getApproved(uint256 tokenId) public view virtual override returns (address) {
        if (!_exists(tokenId)) revert ApprovalQueryForNonexistentToken();

        return _tokenApprovals[tokenId].value;
    }

    /**
     * @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) public virtual override {
        _operatorApprovals[_msgSenderERC721A()][operator] = approved;
        emit ApprovalForAll(_msgSenderERC721A(), operator, approved);
    }

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

    /**
     * @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. See {_mint}.
     */
    function _exists(uint256 tokenId) internal view virtual returns (bool) {
        return
            _startTokenId() <= tokenId &&
            tokenId < _currentIndex && // If within bounds,
            _packedOwnerships[tokenId] & _BITMASK_BURNED == 0; // and not burned.
    }

    /**
     * @dev Returns whether `msgSender` is equal to `approvedAddress` or `owner`.
     */
    function _isSenderApprovedOrOwner(
        address approvedAddress,
        address owner,
        address msgSender
    ) private pure returns (bool result) {
        assembly {
            // Mask `owner` to the lower 160 bits, in case the upper bits somehow aren't clean.
            owner := and(owner, _BITMASK_ADDRESS)
            // Mask `msgSender` to the lower 160 bits, in case the upper bits somehow aren't clean.
            msgSender := and(msgSender, _BITMASK_ADDRESS)
            // `msgSender == owner || msgSender == approvedAddress`.
            result := or(eq(msgSender, owner), eq(msgSender, approvedAddress))
        }
    }

    /**
     * @dev Returns the storage slot and value for the approved address of `tokenId`.
     */
    function _getApprovedSlotAndAddress(uint256 tokenId)
        private
        view
        returns (uint256 approvedAddressSlot, address approvedAddress)
    {
        TokenApprovalRef storage tokenApproval = _tokenApprovals[tokenId];
        // The following is equivalent to `approvedAddress = _tokenApprovals[tokenId].value`.
        assembly {
            approvedAddressSlot := tokenApproval.slot
            approvedAddress := sload(approvedAddressSlot)
        }
    }

    // =============================================================
    //                      TRANSFER OPERATIONS
    // =============================================================

    /**
     * @dev Transfers `tokenId` from `from` to `to`.
     *
     * 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
    ) public payable virtual override {
        uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId);

        if (address(uint160(prevOwnershipPacked)) != from) revert TransferFromIncorrectOwner();

        (uint256 approvedAddressSlot, address approvedAddress) = _getApprovedSlotAndAddress(tokenId);

        // The nested ifs save around 20+ gas over a compound boolean condition.
        if (!_isSenderApprovedOrOwner(approvedAddress, from, _msgSenderERC721A()))
            if (!isApprovedForAll(from, _msgSenderERC721A())) revert TransferCallerNotOwnerNorApproved();

        if (to == address(0)) revert TransferToZeroAddress();

        _beforeTokenTransfers(from, to, tokenId, 1);

        // Clear approvals from the previous owner.
        assembly {
            if approvedAddress {
                // This is equivalent to `delete _tokenApprovals[tokenId]`.
                sstore(approvedAddressSlot, 0)
            }
        }

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

            // Updates:
            // - `address` to the next owner.
            // - `startTimestamp` to the timestamp of transfering.
            // - `burned` to `false`.
            // - `nextInitialized` to `true`.
            _packedOwnerships[tokenId] = _packOwnershipData(
                to,
                _BITMASK_NEXT_INITIALIZED | _nextExtraData(from, to, prevOwnershipPacked)
            );

            // If the next slot may not have been initialized (i.e. `nextInitialized == false`) .
            if (prevOwnershipPacked & _BITMASK_NEXT_INITIALIZED == 0) {
                uint256 nextTokenId = tokenId + 1;
                // If the next slot's address is zero and not burned (i.e. packed value is zero).
                if (_packedOwnerships[nextTokenId] == 0) {
                    // If the next slot is within bounds.
                    if (nextTokenId != _currentIndex) {
                        // Initialize the next slot to maintain correctness for `ownerOf(tokenId + 1)`.
                        _packedOwnerships[nextTokenId] = prevOwnershipPacked;
                    }
                }
            }
        }

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

    /**
     * @dev Equivalent to `safeTransferFrom(from, to, tokenId, '')`.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public payable virtual override {
        safeTransferFrom(from, to, tokenId, '');
    }

    /**
     * @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 memory _data
    ) public payable virtual override {
        transferFrom(from, to, tokenId);
        if (to.code.length != 0)
            if (!_checkContractOnERC721Received(from, to, tokenId, _data)) {
                revert TransferToNonERC721ReceiverImplementer();
            }
    }

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

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

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

    // =============================================================
    //                        MINT OPERATIONS
    // =============================================================

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

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

        // Overflows are incredibly unrealistic.
        // `balance` and `numberMinted` have a maximum limit of 2**64.
        // `tokenId` has a maximum limit of 2**256.
        unchecked {
            // Updates:
            // - `balance += quantity`.
            // - `numberMinted += quantity`.
            //
            // We can directly add to the `balance` and `numberMinted`.
            _packedAddressData[to] += quantity * ((1 << _BITPOS_NUMBER_MINTED) | 1);

            // Updates:
            // - `address` to the owner.
            // - `startTimestamp` to the timestamp of minting.
            // - `burned` to `false`.
            // - `nextInitialized` to `quantity == 1`.
            _packedOwnerships[startTokenId] = _packOwnershipData(
                to,
                _nextInitializedFlag(quantity) | _nextExtraData(address(0), to, 0)
            );

            uint256 toMasked;
            uint256 end = startTokenId + quantity;

            // Use assembly to loop and emit the `Transfer` event for gas savings.
            // The duplicated `log4` removes an extra check and reduces stack juggling.
            // The assembly, together with the surrounding Solidity code, have been
            // delicately arranged to nudge the compiler into producing optimized opcodes.
            assembly {
                // Mask `to` to the lower 160 bits, in case the upper bits somehow aren't clean.
                toMasked := and(to, _BITMASK_ADDRESS)
                // Emit the `Transfer` event.
                log4(
                    0, // Start of data (0, since no data).
                    0, // End of data (0, since no data).
                    _TRANSFER_EVENT_SIGNATURE, // Signature.
                    0, // `address(0)`.
                    toMasked, // `to`.
                    startTokenId // `tokenId`.
                )

                // The `iszero(eq(,))` check ensures that large values of `quantity`
                // that overflows uint256 will make the loop run out of gas.
                // The compiler will optimize the `iszero` away for performance.
                for {
                    let tokenId := add(startTokenId, 1)
                } iszero(eq(tokenId, end)) {
                    tokenId := add(tokenId, 1)
                } {
                    // Emit the `Transfer` event. Similar to above.
                    log4(0, 0, _TRANSFER_EVENT_SIGNATURE, 0, toMasked, tokenId)
                }
            }
            if (toMasked == 0) revert MintToZeroAddress();

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

    /**
     * @dev Mints `quantity` tokens and transfers them to `to`.
     *
     * This function is intended for efficient minting only during contract creation.
     *
     * It emits only one {ConsecutiveTransfer} as defined in
     * [ERC2309](https://eips.ethereum.org/EIPS/eip-2309),
     * instead of a sequence of {Transfer} event(s).
     *
     * Calling this function outside of contract creation WILL make your contract
     * non-compliant with the ERC721 standard.
     * For full ERC721 compliance, substituting ERC721 {Transfer} event(s) with the ERC2309
     * {ConsecutiveTransfer} event is only permissible during contract creation.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `quantity` must be greater than 0.
     *
     * Emits a {ConsecutiveTransfer} event.
     */
    function _mintERC2309(address to, uint256 quantity) internal virtual {
        uint256 startTokenId = _currentIndex;
        if (to == address(0)) revert MintToZeroAddress();
        if (quantity == 0) revert MintZeroQuantity();
        if (quantity > _MAX_MINT_ERC2309_QUANTITY_LIMIT) revert MintERC2309QuantityExceedsLimit();

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

        // Overflows are unrealistic due to the above check for `quantity` to be below the limit.
        unchecked {
            // Updates:
            // - `balance += quantity`.
            // - `numberMinted += quantity`.
            //
            // We can directly add to the `balance` and `numberMinted`.
            _packedAddressData[to] += quantity * ((1 << _BITPOS_NUMBER_MINTED) | 1);

            // Updates:
            // - `address` to the owner.
            // - `startTimestamp` to the timestamp of minting.
            // - `burned` to `false`.
            // - `nextInitialized` to `quantity == 1`.
            _packedOwnerships[startTokenId] = _packOwnershipData(
                to,
                _nextInitializedFlag(quantity) | _nextExtraData(address(0), to, 0)
            );

            emit ConsecutiveTransfer(startTokenId, startTokenId + quantity - 1, address(0), to);

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

    /**
     * @dev Safely mints `quantity` tokens and transfers them to `to`.
     *
     * Requirements:
     *
     * - If `to` refers to a smart contract, it must implement
     * {IERC721Receiver-onERC721Received}, which is called for each safe transfer.
     * - `quantity` must be greater than 0.
     *
     * See {_mint}.
     *
     * Emits a {Transfer} event for each mint.
     */
    function _safeMint(
        address to,
        uint256 quantity,
        bytes memory _data
    ) internal virtual {
        _mint(to, quantity);

        unchecked {
            if (to.code.length != 0) {
                uint256 end = _currentIndex;
                uint256 index = end - quantity;
                do {
                    if (!_checkContractOnERC721Received(address(0), to, index++, _data)) {
                        revert TransferToNonERC721ReceiverImplementer();
                    }
                } while (index < end);
                // Reentrancy protection.
                if (_currentIndex != end) revert();
            }
        }
    }

    /**
     * @dev Equivalent to `_safeMint(to, quantity, '')`.
     */
    function _safeMint(address to, uint256 quantity) internal virtual {
        _safeMint(to, quantity, '');
    }

    // =============================================================
    //                        BURN OPERATIONS
    // =============================================================

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

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

        address from = address(uint160(prevOwnershipPacked));

        (uint256 approvedAddressSlot, address approvedAddress) = _getApprovedSlotAndAddress(tokenId);

        if (approvalCheck) {
            // The nested ifs save around 20+ gas over a compound boolean condition.
            if (!_isSenderApprovedOrOwner(approvedAddress, from, _msgSenderERC721A()))
                if (!isApprovedForAll(from, _msgSenderERC721A())) revert TransferCallerNotOwnerNorApproved();
        }

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

        // Clear approvals from the previous owner.
        assembly {
            if approvedAddress {
                // This is equivalent to `delete _tokenApprovals[tokenId]`.
                sstore(approvedAddressSlot, 0)
            }
        }

        // Underflow of the sender's balance is impossible because we check for
        // ownership above and the recipient's balance can't realistically overflow.
        // Counter overflow is incredibly unrealistic as `tokenId` would have to be 2**256.
        unchecked {
            // Updates:
            // - `balance -= 1`.
            // - `numberBurned += 1`.
            //
            // We can directly decrement the balance, and increment the number burned.
            // This is equivalent to `packed -= 1; packed += 1 << _BITPOS_NUMBER_BURNED;`.
            _packedAddressData[from] += (1 << _BITPOS_NUMBER_BURNED) - 1;

            // Updates:
            // - `address` to the last owner.
            // - `startTimestamp` to the timestamp of burning.
            // - `burned` to `true`.
            // - `nextInitialized` to `true`.
            _packedOwnerships[tokenId] = _packOwnershipData(
                from,
                (_BITMASK_BURNED | _BITMASK_NEXT_INITIALIZED) | _nextExtraData(from, address(0), prevOwnershipPacked)
            );

            // If the next slot may not have been initialized (i.e. `nextInitialized == false`) .
            if (prevOwnershipPacked & _BITMASK_NEXT_INITIALIZED == 0) {
                uint256 nextTokenId = tokenId + 1;
                // If the next slot's address is zero and not burned (i.e. packed value is zero).
                if (_packedOwnerships[nextTokenId] == 0) {
                    // If the next slot is within bounds.
                    if (nextTokenId != _currentIndex) {
                        // Initialize the next slot to maintain correctness for `ownerOf(tokenId + 1)`.
                        _packedOwnerships[nextTokenId] = prevOwnershipPacked;
                    }
                }
            }
        }

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

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

    // =============================================================
    //                     EXTRA DATA OPERATIONS
    // =============================================================

    /**
     * @dev Directly sets the extra data for the ownership data `index`.
     */
    function _setExtraDataAt(uint256 index, uint24 extraData) internal virtual {
        uint256 packed = _packedOwnerships[index];
        if (packed == 0) revert OwnershipNotInitializedForExtraData();
        uint256 extraDataCasted;
        // Cast `extraData` with assembly to avoid redundant masking.
        assembly {
            extraDataCasted := extraData
        }
        packed = (packed & _BITMASK_EXTRA_DATA_COMPLEMENT) | (extraDataCasted << _BITPOS_EXTRA_DATA);
        _packedOwnerships[index] = packed;
    }

    /**
     * @dev Called during each token transfer to set the 24bit `extraData` field.
     * Intended to be overridden by the cosumer contract.
     *
     * `previousExtraData` - the value of `extraData` before transfer.
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, `from`'s `tokenId` will be
     * transferred to `to`.
     * - When `from` is zero, `tokenId` will be minted for `to`.
     * - When `to` is zero, `tokenId` will be burned by `from`.
     * - `from` and `to` are never both zero.
     */
    function _extraData(
        address from,
        address to,
        uint24 previousExtraData
    ) internal view virtual returns (uint24) {}

    /**
     * @dev Returns the next extra data for the packed ownership data.
     * The returned result is shifted into position.
     */
    function _nextExtraData(
        address from,
        address to,
        uint256 prevOwnershipPacked
    ) private view returns (uint256) {
        uint24 extraData = uint24(prevOwnershipPacked >> _BITPOS_EXTRA_DATA);
        return uint256(_extraData(from, to, extraData)) << _BITPOS_EXTRA_DATA;
    }

    // =============================================================
    //                       OTHER OPERATIONS
    // =============================================================

    /**
     * @dev Returns the message sender (defaults to `msg.sender`).
     *
     * If you are writing GSN compatible contracts, you need to override this function.
     */
    function _msgSenderERC721A() internal view virtual returns (address) {
        return msg.sender;
    }

    /**
     * @dev Converts a uint256 to its ASCII string decimal representation.
     */
    function _toString(uint256 value) internal pure virtual returns (string memory str) {
        assembly {
            // The maximum value of a uint256 contains 78 digits (1 byte per digit), but
            // we allocate 0xa0 bytes to keep the free memory pointer 32-byte word aligned.
            // We will need 1 word for the trailing zeros padding, 1 word for the length,
            // and 3 words for a maximum of 78 digits. Total: 5 * 0x20 = 0xa0.
            let m := add(mload(0x40), 0xa0)
            // Update the free memory pointer to allocate.
            mstore(0x40, m)
            // Assign the `str` to the end.
            str := sub(m, 0x20)
            // Zeroize the slot after the string.
            mstore(str, 0)

            // Cache the end of the memory to calculate the length later.
            let end := str

            // We write the string from rightmost digit to leftmost digit.
            // The following is essentially a do-while loop that also handles the zero case.
            // prettier-ignore
            for { let temp := value } 1 {} {
                str := sub(str, 1)
                // Write the character to the pointer.
                // The ASCII index of the '0' character is 48.
                mstore8(str, add(48, mod(temp, 10)))
                // Keep dividing `temp` until zero.
                temp := div(temp, 10)
                // prettier-ignore
                if iszero(temp) { break }
            }

            let length := sub(end, str)
            // Move the pointer 32 bytes leftwards to make room for the length.
            str := sub(str, 0x20)
            // Store the length.
            mstore(str, length)
        }
    }
}

library Base64 {
    /**
     * @dev Base64 Encoding/Decoding Table
     */
    string internal constant _TABLE = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";

    /**
     * @dev Converts a `bytes` to its Bytes64 `string` representation.
     */
    function encode(bytes memory data) internal pure returns (string memory) {
        /**
         * Inspired by Brecht Devos (Brechtpd) implementation - MIT licence
         * https://github.com/Brechtpd/base64/blob/e78d9fd951e7b0977ddca77d92dc85183770daf4/base64.sol
         */
        if (data.length == 0) return "";

        // Loads the table into memory
        string memory table = _TABLE;

        // Encoding takes 3 bytes chunks of binary data from `bytes` data parameter
        // and split into 4 numbers of 6 bits.
        // The final Base64 length should be `bytes` data length multiplied by 4/3 rounded up
        // - `data.length + 2`  -> Round up
        // - `/ 3`              -> Number of 3-bytes chunks
        // - `4 *`              -> 4 characters for each chunk
        string memory result = new string(4 * ((data.length + 2) / 3));

        /// @solidity memory-safe-assembly
        assembly {
            // Prepare the lookup table (skip the first "length" byte)
            let tablePtr := add(table, 1)

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

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

            } {
                // Advance 3 bytes
                dataPtr := add(dataPtr, 3)
                let input := mload(dataPtr)

                // To write each character, shift the 3 bytes (18 bits) chunk
                // 4 times in blocks of 6 bits for each character (18, 12, 6, 0)
                // and apply logical AND with 0x3F which is the number of
                // the previous character in the ASCII table prior to the Base64 Table
                // The result is then added to the table to get the character to write,
                // and finally write it in the result pointer but with a left shift
                // of 256 (1 byte) - 8 (1 ASCII char) = 248 bits

                mstore8(resultPtr, mload(add(tablePtr, and(shr(18, input), 0x3F))))
                resultPtr := add(resultPtr, 1) // Advance

                mstore8(resultPtr, mload(add(tablePtr, and(shr(12, input), 0x3F))))
                resultPtr := add(resultPtr, 1) // Advance

                mstore8(resultPtr, mload(add(tablePtr, and(shr(6, input), 0x3F))))
                resultPtr := add(resultPtr, 1) // Advance

                mstore8(resultPtr, mload(add(tablePtr, and(input, 0x3F))))
                resultPtr := add(resultPtr, 1) // Advance
            }

            // When data `bytes` is not exactly 3 bytes long
            // it is padded with `=` characters at the end
            switch mod(mload(data), 3)
            case 1 {
                mstore8(sub(resultPtr, 1), 0x3d)
                mstore8(sub(resultPtr, 2), 0x3d)
            }
            case 2 {
                mstore8(sub(resultPtr, 1), 0x3d)
            }
        }

        return result;
    }
}

/// @title EIP-721 Metadata Update Extension
interface IERC4906 is IERC721A {
    /// @dev This event emits when the metadata of a token is changed.
    /// Third-party platforms such as NFT marketplaces can listen to
    /// the event and auto-update the tokens in their apps.
    event MetadataUpdate(uint256 _tokenId);
}

contract LavaLamp is ERC721A, Ownable, DefaultOperatorFilterer, IERC4906 {

    mapping(uint => string) public hueValues;
    mapping(uint => bool) public isBurned;
    mapping(uint => bool) public isBlob;

    uint public maxWalletFree = 5;

    uint public MAX_SUPPLY = 2222;

    mapping(address => uint) public mintedPerAcc;

    enum Step {
        Before,
        PublicSale
    }

    Step public sellingStep;

    function mintForOwner() public onlyOwner{
        for (uint i = 0; i < 30; i++) {
            createNFT(_nextTokenId() + i); // init values
        }
        _mint(msg.sender, 30);
    }

    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 str2num(string memory numString) public pure returns(uint) {
        uint  val=0;
        bytes   memory stringBytes = bytes(numString);
        for (uint  i =  0; i<stringBytes.length; i++) {
            uint exp = stringBytes.length - i;
            bytes1 ival = stringBytes[i];
            uint8 uval = uint8(ival);
           uint jval = uval - uint(0x30);
   
           val +=  (uint(jval) * (10**(exp-1))); 
        }
      return val;
    }

    function changeMaxTxFree(uint newValue) public onlyOwner{
        maxWalletFree = newValue;
    }

    function createNFT(uint _ID) internal {       
        uint uintValue = uint(keccak256(abi.encodePacked(block.timestamp, msg.sender, _ID))) % 1001;
        string memory hue = uint2str(uintValue);
        hueValues[_ID] = hue;
    }

    constructor() ERC721A("LavaLamp", "LavaLamp") {}

    function mint(uint quantity) public {
        if(sellingStep != Step.PublicSale) revert("Public Mint not live.");
        if(mintedPerAcc[msg.sender] + quantity > maxWalletFree) revert("Max exceeded");
        if(totalSupply() + quantity > MAX_SUPPLY) revert("Max supply exceeded");
        require(tx.origin == msg.sender, "Not the same caller");
        for (uint i = 0; i < quantity; i++) {
            createNFT(_nextTokenId() + i); // init values
        }
        _mint(msg.sender, quantity);
        mintedPerAcc[msg.sender] += quantity;
    }

    function transferFrom(address from, address to, uint256 tokenId) public override(ERC721A, IERC721A) onlyAllowedOperator payable {
        super.transferFrom(from, to, tokenId);
    }

    function safeTransferFrom(address from, address to, uint256 tokenId) public override(ERC721A, IERC721A) onlyAllowedOperator payable {
        super.safeTransferFrom(from, to, tokenId);
    }

    function safeTransferFrom(address from, address to, uint256 tokenId, bytes memory data)
        public
        override(ERC721A, IERC721A)
        onlyAllowedOperator
        payable
    {
        super.safeTransferFrom(from, to, tokenId, data);
    }

    function setStep(uint _step) external onlyOwner {
        sellingStep = Step(_step);
    }

    function tokenURI(uint256 tokenId) public view virtual override(ERC721A, IERC721A) returns (string memory) {
        return segments.getMetadata(tokenId, hueValues[tokenId]);
    }

    function withdraw() external onlyOwner {
        require(payable(msg.sender).send(address(this).balance));
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintERC2309QuantityExceedsLimit","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[{"internalType":"address","name":"operator","type":"address"}],"name":"OperatorNotAllowed","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"OwnershipNotInitializedForExtraData","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"inputs":[],"name":"URIQueryForNonexistentToken","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"fromTokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"toTokenId","type":"uint256"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"}],"name":"ConsecutiveTransfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"MetadataUpdate","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":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"newValue","type":"uint256"}],"name":"changeMaxTxFree","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"hueValues","outputs":[{"internalType":"string","name":"","type":"string"}],"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":"uint256","name":"","type":"uint256"}],"name":"isBlob","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"isBurned","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxWalletFree","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"mintForOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"mintedPerAcc","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"payable","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":"payable","type":"function"},{"inputs":[],"name":"sellingStep","outputs":[{"internalType":"enum LavaLamp.Step","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_step","type":"uint256"}],"name":"setStep","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"numString","type":"string"}],"name":"str2num","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040526005600c556108ae600d553480156200001c57600080fd5b50733cc6cdda760b79bafa08df41ecfa224f810dceb660016040518060400160405280600881526020016704c6176614c616d760c41b8152506040518060400160405280600881526020016704c6176614c616d760c41b8152508160029081620000879190620002ed565b506003620000968282620002ed565b5050600160005550620000a933620001f6565b6daaeb6d7670e522a718067333cd4e3b15620001ee5780156200013c57604051633e9f1edf60e11b81523060048201526001600160a01b03831660248201526daaeb6d7670e522a718067333cd4e90637d3e3dbe906044015b600060405180830381600087803b1580156200011d57600080fd5b505af115801562000132573d6000803e3d6000fd5b50505050620001ee565b6001600160a01b038216156200018d5760405163a0af290360e01b81523060048201526001600160a01b03831660248201526daaeb6d7670e522a718067333cd4e9063a0af29039060440162000102565b604051632210724360e11b81523060048201526daaeb6d7670e522a718067333cd4e90634420e48690602401600060405180830381600087803b158015620001d457600080fd5b505af1158015620001e9573d6000803e3d6000fd5b505050505b5050620003b9565b600880546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b634e487b7160e01b600052604160045260246000fd5b600181811c908216806200027357607f821691505b6020821081036200029457634e487b7160e01b600052602260045260246000fd5b50919050565b601f821115620002e857600081815260208120601f850160051c81016020861015620002c35750805b601f850160051c820191505b81811015620002e457828155600101620002cf565b5050505b505050565b81516001600160401b0381111562000309576200030962000248565b62000321816200031a84546200025e565b846200029a565b602080601f831160018114620003595760008415620003405750858301515b600019600386901b1c1916600185901b178555620002e4565b600085815260208120601f198616915b828110156200038a5788860151825594840194600190910190840162000369565b5085821015620003a95787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b61347580620003c96000396000f3fe6080604052600436106101cd5760003560e01c80638da5cb5b116100f7578063b88d4fde11610095578063db44fe0711610064578063db44fe07146104fc578063e985e9c51461052c578063f2fde38b1461054c578063f8dcbddb1461056c57600080fd5b8063b88d4fde14610475578063c87b56dd14610488578063cad45358146104a8578063cbccefb2146104d557600080fd5b8063a0712d68116100d1578063a0712d68146103f5578063a22cb46514610415578063af351ba814610435578063af4e39ca1461045557600080fd5b80638da5cb5b146103a257806395d89b41146103c05780639aeecf1b146103d557600080fd5b806332cb6b0c1161016f5780636352211e1161013e5780636352211e1461033857806370a0823114610358578063715018a614610378578063865540e21461038d57600080fd5b806332cb6b0c146102ca5780633ccfd60b146102e057806342842e0e146102f55780635c4191351461030857600080fd5b8063095ea7b3116101ab578063095ea7b3146102615780630bc7a2de1461027657806318160ddd1461029a57806323b872dd146102b757600080fd5b806301ffc9a7146101d257806306fdde0314610207578063081812fc14610229575b600080fd5b3480156101de57600080fd5b506101f26101ed3660046119e3565b61058c565b60405190151581526020015b60405180910390f35b34801561021357600080fd5b5061021c6105de565b6040516101fe9190611a50565b34801561023557600080fd5b50610249610244366004611a63565b610670565b6040516001600160a01b0390911681526020016101fe565b61027461026f366004611a98565b6106b4565b005b34801561028257600080fd5b5061028c600c5481565b6040519081526020016101fe565b3480156102a657600080fd5b50600154600054036000190161028c565b6102746102c5366004611ac2565b610754565b3480156102d657600080fd5b5061028c600d5481565b3480156102ec57600080fd5b50610274610812565b610274610303366004611ac2565b610840565b34801561031457600080fd5b506101f2610323366004611a63565b600b6020526000908152604090205460ff1681565b34801561034457600080fd5b50610249610353366004611a63565b6108f4565b34801561036457600080fd5b5061028c610373366004611afe565b6108ff565b34801561038457600080fd5b5061027461094e565b34801561039957600080fd5b50610274610960565b3480156103ae57600080fd5b506008546001600160a01b0316610249565b3480156103cc57600080fd5b5061021c6109ae565b3480156103e157600080fd5b5061028c6103f0366004611ba5565b6109bd565b34801561040157600080fd5b50610274610410366004611a63565b610a61565b34801561042157600080fd5b50610274610430366004611bfc565b610c1a565b34801561044157600080fd5b50610274610450366004611a63565b610c86565b34801561046157600080fd5b5061021c610470366004611a63565b610c93565b610274610483366004611c33565b610d2d565b34801561049457600080fd5b5061021c6104a3366004611a63565b610de8565b3480156104b457600080fd5b5061028c6104c3366004611afe565b600e6020526000908152604090205481565b3480156104e157600080fd5b50600f546104ef9060ff1681565b6040516101fe9190611cc5565b34801561050857600080fd5b506101f2610517366004611a63565b600a6020526000908152604090205460ff1681565b34801561053857600080fd5b506101f2610547366004611ced565b610e8f565b34801561055857600080fd5b50610274610567366004611afe565b610ebd565b34801561057857600080fd5b50610274610587366004611a63565b610f36565b60006301ffc9a760e01b6001600160e01b0319831614806105bd57506380ac58cd60e01b6001600160e01b03198316145b806105d85750635b5e139f60e01b6001600160e01b03198316145b92915050565b6060600280546105ed90611d20565b80601f016020809104026020016040519081016040528092919081815260200182805461061990611d20565b80156106665780601f1061063b57610100808354040283529160200191610666565b820191906000526020600020905b81548152906001019060200180831161064957829003601f168201915b5050505050905090565b600061067b82610f73565b610698576040516333d1c03960e21b815260040160405180910390fd5b506000908152600660205260409020546001600160a01b031690565b60006106bf826108f4565b9050336001600160a01b038216146106f8576106db8133610e8f565b6106f8576040516367d9dca160e11b815260040160405180910390fd5b60008281526006602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b6daaeb6d7670e522a718067333cd4e3b1561080257604051633185c44d60e21b81523060048201523360248201526daaeb6d7670e522a718067333cd4e9063c6171134906044016020604051808303816000875af11580156107ba573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107de9190611d5a565b61080257604051633b79c77360e21b81523360048201526024015b60405180910390fd5b61080d838383610fa8565b505050565b61081a611141565b60405133904780156108fc02916000818181858888f1935050505061083e57600080fd5b565b6daaeb6d7670e522a718067333cd4e3b156108e957604051633185c44d60e21b81523060048201523360248201526daaeb6d7670e522a718067333cd4e9063c6171134906044016020604051808303816000875af11580156108a6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108ca9190611d5a565b6108e957604051633b79c77360e21b81523360048201526024016107f9565b61080d83838361119b565b60006105d8826111b6565b60006001600160a01b038216610928576040516323d3ad8160e21b815260040160405180910390fd5b506001600160a01b031660009081526005602052604090205467ffffffffffffffff1690565b610956611141565b61083e600061122c565b610968611141565b60005b601e8110156109a2576109908161098160005490565b61098b9190611d8d565b61127e565b8061099a81611da0565b91505061096b565b5061083e33601e6112fe565b6060600380546105ed90611d20565b60008082815b8151811015610a585760008183516109db9190611db9565b905060008383815181106109f1576109f1611dcc565b01602001516001600160f81b03198116915060f81c6000610a13603083611db9565b9050610a20600185611db9565b610a2b90600a611ec6565b610a359082611ed2565b610a3f9088611d8d565b9650505050508080610a5090611da0565b9150506109c3565b50909392505050565b6001600f5460ff166001811115610a7a57610a7a611caf565b14610abf5760405162461bcd60e51b8152602060048201526015602482015274283ab13634b19026b4b73a103737ba103634bb329760591b60448201526064016107f9565b600c54336000908152600e6020526040902054610add908390611d8d565b1115610b1a5760405162461bcd60e51b815260206004820152600c60248201526b13585e08195e18d95959195960a21b60448201526064016107f9565b600d546001546000548391900360001901610b359190611d8d565b1115610b795760405162461bcd60e51b815260206004820152601360248201527213585e081cdd5c1c1b1e48195e18d959591959606a1b60448201526064016107f9565b323314610bbe5760405162461bcd60e51b81526020600482015260136024820152722737ba103a34329039b0b6b29031b0b63632b960691b60448201526064016107f9565b60005b81811015610be857610bd68161098160005490565b80610be081611da0565b915050610bc1565b50610bf333826112fe565b336000908152600e602052604081208054839290610c12908490611d8d565b909155505050565b3360008181526007602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b610c8e611141565b600c55565b60096020526000908152604090208054610cac90611d20565b80601f0160208091040260200160405190810160405280929190818152602001828054610cd890611d20565b8015610d255780601f10610cfa57610100808354040283529160200191610d25565b820191906000526020600020905b815481529060010190602001808311610d0857829003601f168201915b505050505081565b6daaeb6d7670e522a718067333cd4e3b15610dd657604051633185c44d60e21b81523060048201523360248201526daaeb6d7670e522a718067333cd4e9063c6171134906044016020604051808303816000875af1158015610d93573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610db79190611d5a565b610dd657604051633b79c77360e21b81523360048201526024016107f9565b610de2848484846113fc565b50505050565b60606105d882600960008581526020019081526020016000208054610e0c90611d20565b80601f0160208091040260200160405190810160405280929190818152602001828054610e3890611d20565b8015610e855780601f10610e5a57610100808354040283529160200191610e85565b820191906000526020600020905b815481529060010190602001808311610e6857829003601f168201915b5050505050611440565b6001600160a01b03918216600090815260076020908152604080832093909416825291909152205460ff1690565b610ec5611141565b6001600160a01b038116610f2a5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016107f9565b610f338161122c565b50565b610f3e611141565b806001811115610f5057610f50611caf565b600f805460ff191660018381811115610f6b57610f6b611caf565b021790555050565b600081600111158015610f87575060005482105b80156105d8575050600090815260046020526040902054600160e01b161590565b6000610fb3826111b6565b9050836001600160a01b0316816001600160a01b031614610fe65760405162a1148160e81b815260040160405180910390fd5b60008281526006602052604090208054338082146001600160a01b03881690911417611033576110168633610e8f565b61103357604051632ce44b5f60e11b815260040160405180910390fd5b6001600160a01b03851661105a57604051633a954ecd60e21b815260040160405180910390fd5b801561106557600082555b6001600160a01b038681166000908152600560205260408082208054600019019055918716808252919020805460010190554260a01b17600160e11b17600085815260046020526040812091909155600160e11b841690036110f7576001840160008181526004602052604081205490036110f55760005481146110f55760008181526004602052604090208490555b505b83856001600160a01b0316876001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45b505050505050565b6008546001600160a01b0316331461083e5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016107f9565b61080d83838360405180602001604052806000815250610d2d565b60008180600111611213576000548110156112135760008181526004602052604081205490600160e01b82169003611211575b8060000361120a5750600019016000818152600460205260409020546111e9565b9392505050565b505b604051636f96cda160e11b815260040160405180910390fd5b600880546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b604080514260208201526bffffffffffffffffffffffff193360601b1691810191909152605481018290526000906103e9906074016040516020818303038152906040528051906020012060001c6112d69190611eff565b905060006112e3826114b2565b6000848152600960205260409020909150610de28282611f59565b60008054908290036113235760405163b562e8dd60e01b815260040160405180910390fd5b6001600160a01b03831660008181526005602090815260408083208054680100000000000000018802019055848352600490915281206001851460e11b4260a01b178317905582840190839083907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8180a4600183015b8181146113d257808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a460010161139a565b50816000036113f357604051622e076360e81b815260040160405180910390fd5b60005550505050565b611407848484610754565b6001600160a01b0383163b15610de257611423848484846115de565b610de2576040516368d2bf6b60e11b815260040160405180910390fd5b60608061144c846116ca565b8361145e611459866117ed565b61187a565b60405160200161147093929190612019565b604051602081830303815290604052905061148a8161187a565b60405160200161149a9190612148565b60405160208183030381529060405291505092915050565b6060816000036114d95750506040805180820190915260018152600360fc1b602082015290565b8160005b811561150357806114ed81611da0565b91506114fc9050600a8361218d565b91506114dd565b60008167ffffffffffffffff81111561151e5761151e611b19565b6040519080825280601f01601f191660200182016040528015611548576020820181803683370190505b509050815b85156115d55761155e600182611db9565b9050600061156d600a8861218d565b61157890600a611ed2565b6115829088611db9565b61158d9060306121a1565b905060008160f81b9050808484815181106115aa576115aa611dcc565b60200101906001600160f81b031916908160001a9053506115cc600a8961218d565b9750505061154d565b50949350505050565b604051630a85bd0160e11b81526000906001600160a01b0385169063150b7a02906116139033908990889088906004016121ba565b6020604051808303816000875af192505050801561164e575060408051601f3d908101601f1916820190925261164b918101906121f7565b60015b6116ac573d80801561167c576040519150601f19603f3d011682016040523d82523d6000602084013e611681565b606091505b5080516000036116a4576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490505b949350505050565b6060816000036116f15750506040805180820190915260018152600360fc1b602082015290565b8160005b811561171b578061170581611da0565b91506117149050600a8361218d565b91506116f5565b60008167ffffffffffffffff81111561173657611736611b19565b6040519080825280601f01601f191660200182016040528015611760576020820181803683370190505b509050815b85156115d557611776600182611db9565b90506000611785600a8861218d565b61179090600a611ed2565b61179a9088611db9565b6117a59060306121a1565b905060008160f81b9050808484815181106117c2576117c2611dcc565b60200101906001600160f81b031916908160001a9053506117e4600a8961218d565b97505050611765565b606060405180610140016040528061011d81526020016132e361011d913990508082604051602001611820929190612214565b604051602081830303815290604052905080604051602001611842919061226c565b60405160208183030381529060405290508060405160200161186491906132c6565b6040516020818303038152906040529050919050565b6060815160000361189957505060408051602081019091526000815290565b600060405180606001604052806040815260200161340060409139905060006003845160026118c89190611d8d565b6118d2919061218d565b6118dd906004611ed2565b67ffffffffffffffff8111156118f5576118f5611b19565b6040519080825280601f01601f19166020018201604052801561191f576020820181803683370190505b509050600182016020820185865187015b8082101561198b576003820191508151603f8160121c168501518453600184019350603f81600c1c168501518453600184019350603f8160061c168501518453600184019350603f8116850151845350600183019250611930565b50506003865106600181146119a757600281146119ba576119c2565b603d6001830353603d60028303536119c2565b603d60018303535b509195945050505050565b6001600160e01b031981168114610f3357600080fd5b6000602082840312156119f557600080fd5b813561120a816119cd565b60005b83811015611a1b578181015183820152602001611a03565b50506000910152565b60008151808452611a3c816020860160208601611a00565b601f01601f19169290920160200192915050565b60208152600061120a6020830184611a24565b600060208284031215611a7557600080fd5b5035919050565b80356001600160a01b0381168114611a9357600080fd5b919050565b60008060408385031215611aab57600080fd5b611ab483611a7c565b946020939093013593505050565b600080600060608486031215611ad757600080fd5b611ae084611a7c565b9250611aee60208501611a7c565b9150604084013590509250925092565b600060208284031215611b1057600080fd5b61120a82611a7c565b634e487b7160e01b600052604160045260246000fd5b600067ffffffffffffffff80841115611b4a57611b4a611b19565b604051601f8501601f19908116603f01168101908282118183101715611b7257611b72611b19565b81604052809350858152868686011115611b8b57600080fd5b858560208301376000602087830101525050509392505050565b600060208284031215611bb757600080fd5b813567ffffffffffffffff811115611bce57600080fd5b8201601f81018413611bdf57600080fd5b6116c284823560208401611b2f565b8015158114610f3357600080fd5b60008060408385031215611c0f57600080fd5b611c1883611a7c565b91506020830135611c2881611bee565b809150509250929050565b60008060008060808587031215611c4957600080fd5b611c5285611a7c565b9350611c6060208601611a7c565b925060408501359150606085013567ffffffffffffffff811115611c8357600080fd5b8501601f81018713611c9457600080fd5b611ca387823560208401611b2f565b91505092959194509250565b634e487b7160e01b600052602160045260246000fd5b6020810160028310611ce757634e487b7160e01b600052602160045260246000fd5b91905290565b60008060408385031215611d0057600080fd5b611d0983611a7c565b9150611d1760208401611a7c565b90509250929050565b600181811c90821680611d3457607f821691505b602082108103611d5457634e487b7160e01b600052602260045260246000fd5b50919050565b600060208284031215611d6c57600080fd5b815161120a81611bee565b634e487b7160e01b600052601160045260246000fd5b808201808211156105d8576105d8611d77565b600060018201611db257611db2611d77565b5060010190565b818103818111156105d8576105d8611d77565b634e487b7160e01b600052603260045260246000fd5b600181815b80851115611e1d578160001904821115611e0357611e03611d77565b80851615611e1057918102915b93841c9390800290611de7565b509250929050565b600082611e34575060016105d8565b81611e41575060006105d8565b8160018114611e575760028114611e6157611e7d565b60019150506105d8565b60ff841115611e7257611e72611d77565b50506001821b6105d8565b5060208310610133831016604e8410600b8410161715611ea0575081810a6105d8565b611eaa8383611de2565b8060001904821115611ebe57611ebe611d77565b029392505050565b600061120a8383611e25565b80820281158282048414176105d8576105d8611d77565b634e487b7160e01b600052601260045260246000fd5b600082611f0e57611f0e611ee9565b500690565b601f82111561080d57600081815260208120601f850160051c81016020861015611f3a5750805b601f850160051c820191505b8181101561113957828155600101611f46565b815167ffffffffffffffff811115611f7357611f73611b19565b611f8781611f818454611d20565b84611f13565b602080601f831160018114611fbc5760008415611fa45750858301515b600019600386901b1c1916600185901b178555611139565b600085815260208120601f198616915b82811015611feb57888601518255948401946001909101908401611fcc565b50858210156120095787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b737b226e616d65223a20224c6176614c616d70202360601b81528351600090612049816014850160208901611a00565b7f222c20226465736372697074696f6e223a2022576520616c6c206c69766520696014918401918201527f6e20646966666572656e7420626c6f62732e222c20226174747269627574657360348201527f223a5b7b2274726169745f74797065223a2022485545222c202276616c75652260548201526101d160f51b607482015284516120dd816076840160208901611a00565b7f7d5d2c2022696d616765223a2022646174613a696d6167652f7376672b786d6c60769290910191820152670ed8985cd94d8d0b60c21b6096820152835161212c81609e840160208801611a00565b61227d60f01b609e929091019182015260a00195945050505050565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c00000081526000825161218081601d850160208701611a00565b91909101601d0192915050565b60008261219c5761219c611ee9565b500490565b60ff81811683821601908111156105d8576105d8611d77565b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906121ed90830184611a24565b9695505050505050565b60006020828403121561220957600080fd5b815161120a816119cd565b60008351612226818460208801611a00565b7f3c646566733e3c7374796c653e203a726f6f747b2d2d6875653a200000000000908301908152835161226081601b840160208801611a00565b01601b01949350505050565b6000825161227e818460208701611a00565b7f3b202d2d687565436f6d706c656d656e743a2063616c6328766172282d2d68759201918252507f6529202b20313830293b202d2d6875655269676874416e616c6f676f75733a2060208201527f63616c6328766172282d2d68756529202b203330293b202d2d6875654c65667460408201527f416e616c6f676f75733a2063616c6328766172282d2d68756529202d2033302960608201527f3b202d2d616363656e7456313a2068736c28766172282d2d687565526967687460808201527f416e616c6f676f7573292035302520353025293b202d2d616363656e7456323a60a08201527f2068736c28766172282d2d6875654c656674416e616c6f676f7573292035302560c08201527f20353025293b207d20626f6479207b206261636b67726f756e642d636f6c6f7260e08201527f3a233030303b206f766572666c6f773a2068696464656e3b207d20406b6579666101008201527f72616d6573207570646f776e207b203025207b207472616e73666f726d3a20746101208201527f72616e736c61746559283029207363616c6528302e32293b207d20353025207b6101408201527f207472616e73666f726d3a207472616e736c61746559282d31303070782920736101608201527f63616c6528302e31293b207d2031303025207b207472616e73666f726d3a20746101808201527f72616e736c61746559283029207363616c6528302e32293b207d207d202e626c6101a08201527f6f62207b207472616e73666f726d2d6f726967696e3a20353025203730253b206101c08201527f616e696d6174696f6e2d6e616d653a207570646f776e3b20616e696d6174696f6101e08201527f6e2d6475726174696f6e3a203330733b20616e696d6174696f6e2d69746572616102008201527f74696f6e2d636f756e743a20696e66696e6974653b20616e696d6174696f6e2d6102208201527f646972656374696f6e3a20616c7465726e6174653b207d202e626c6f6232207b6102408201527f207472616e73666f726d2d6f726967696e3a20353025203330253b20616e696d6102608201527f6174696f6e2d6475726174696f6e3a203430733b207d202e626c6f62337b20746102808201527f72616e73666f726d2d6f726967696e3a20353025203435253b20616e696d61746102a08201527f696f6e2d6475726174696f6e3a203138733b207d202e626c6f62347b207472616102c08201527f6e73666f726d2d6f726967696e3a20353025203535253b20616e696d6174696f6102e08201527f6e2d6475726174696f6e3a203234733b207d203c2f7374796c653e203c6c696e6103008201527f6561724772616469656e742069643d2261222079313d22312220786d6c6e733d6103208201527f22687474703a2f2f7777772e77332e6f72672f323030302f737667223e203c736103408201527f746f702073746f702d636f6c6f723d22766172282d2d616363656e74563129226103608201527f206f66667365743d2230222f3e203c73746f702073746f702d636f6c6f723d226103808201527f766172282d2d616363656e7456322922206f66667365743d2231222f3e203c2f6103a08201527f6c696e6561724772616469656e743e203c66696c7465722069643d2264223e206103c08201527f3c6665476175737369616e426c757220696e3d22536f757263654772617068696103e08201527f632220726573756c743d22626c75722220737464446576696174696f6e3d22386104008201527f222f3e203c6665436f6c6f724d617472697820696e3d22626c757222206d6f646104208201527f653d226d61747269782220726573756c743d22636d222076616c7565733d22316104408201527f20302030203020302030203120302030203020302030203120302030203020306104608201527f2030203231202d39222f3e203c2f66696c7465723e203c72616469616c4772616104808201527f6469656e742069643d2267222063783d22333030222063793d223330302220726104a08201527f3d2233353022206772616469656e74556e6974733d227573657253706163654f6104c08201527f6e557365223e203c73746f702073746f702d636f6c6f723d22233437314131396104e08201527f22206f66667365743d222e303731343239222f3e203c73746f702073746f702d6105008201527f636f6c6f723d222332393046304522206f66667365743d222e33313037222f3e6105208201527f203c73746f702073746f702d636f6c6f723d222331323037303622206f6666736105408201527f65743d222e353533222f3e203c73746f702073746f702d636f6c6f723d2223306105608201527f353032303222206f66667365743d222e37383238222f3e203c73746f70206f666105808201527f667365743d222e39383437222f3e203c2f72616469616c4772616469656e743e6105a08201527f203c636c6970506174682069643d2266223e203c706174682069643d226522206105c08201527f643d226d323632203137346836306c33332e35203138322e3373322e372031326105e08201527f2e3820322e352032322e38682d313331732d302e372d392e3320302d313863306106008201527f2e362d382e322033352d3138372e312033352d3138372e317a222f3e203c2f636106208201527f6c6970506174683e203c6c696e6561724772616469656e742069643d226222206106408201527f78313d22323932222078323d22323932222079313d22313335222079323d22316106608201527f373422206772616469656e74556e6974733d227573657253706163654f6e55736106808201527f65223e203c73746f70206f66667365743d222e303135333036222f3e203c73746106a08201527f6f702073746f702d636f6c6f723d222330353032303222206f66667365743d226106c08201527f2e323333222f3e203c73746f702073746f702d636f6c6f723d222331323037306106e08201527f3622206f66667365743d222e34383038222f3e203c73746f702073746f702d636107008201527f6f6c6f723d222332393046304522206f66667365743d222e37343231222f3e206107208201527f3c73746f702073746f702d636f6c6f723d222334373141313922206f666673656107408201527f743d2231222f3e203c2f6c696e6561724772616469656e743e203c6c696e65616107608201527f724772616469656e742069643d2263222078313d223239322e3338222078323d6107808201527f223239322e3338222079313d22343730222079323d22333739222067726164696107a08201527f656e74556e6974733d227573657253706163654f6e557365223e203c73746f706107c08201527f206f66667365743d222e303035313032222f3e203c73746f702073746f702d636107e08201527f6f6c6f723d222330353032303222206f66667365743d222e32323531222f3e206108008201527f3c73746f702073746f702d636f6c6f723d222331323037303622206f666673656108208201527f743d222e34373534222f3e203c73746f702073746f702d636f6c6f723d2223326108408201527f393046304522206f66667365743d222e37333934222f3e203c73746f702073746108608201527f6f702d636f6c6f723d222334373141313922206f66667365743d2231222f3e206108808201527f3c2f6c696e6561724772616469656e743e203c2f646566733e203c72656374206108a08201527f77696474683d2236303022206865696768743d22363030222066696c6c3d22756108c08201527f726c28236729222f3e203c7573652066696c6c3d22766172282d2d616363656e6108e08201527f7456312922206f7061636974793d222e312220786c696e6b3a687265663d22236109008201527f65222f3e203c706f6c79676f6e20706f696e74733d22323639203133352032366109208201527f322031373420333232203137342033313620313335222066696c6c3d2275726c6109408201527f28236229222f3e203c7061746820643d226d3232362e382033373963322e36206109608201527f34332032332e392035342e362032382e332036302e3220332e3320352e342d316109808201527f302033302e382d31302033302e386839352e35732d31362e352d32352e312d316109a08201527f342e352d33302e382032362d31352e322033322d36302e32682d3133312e337a6109c08201527f222066696c6c3d2275726c28236329222f3e203c7265637420793d22343730226109e08201527f2077696474683d2236303022206865696768743d22313330222f3e203c672063610a008201527f6c69702d706174683d2275726c28236629222066696c6c3d2275726c28236129610a208201527f222066696c7465723d2275726c28236429223e203c706174682066696c6c3d22610a408201527f75726c282361292220636c6173733d22626c6f622220643d224d3333372c3332610a608201527f332e35513234302c3430372c3136352c3332332e355139302c3234302c313635610a808201527f2c3136312e35513234302c38332c3333372c3136312e35513433342c3234302c610aa08201527f3333372c3332332e355a22202f3e203c706174682066696c6c3d2275726c2823610ac08201527f61292220636c6173733d22626c6f6220626c6f62322220643d224d3332342c33610ae08201527f34332e35513234302c3434372c3135342e352c3334332e355136392c3234302c610b008201527f3135342e352c313437513234302c35342c3332342c313437513430382c323430610b208201527f2c3332342c3334332e355a22202f3e203c706174682066696c6c3d2275726c28610b408201527f2361292220636c6173733d22626c6f6220626c6f62332220643d224d3332342c610b608201527f3334332e35513234302c3434372c3135342e352c3334332e355136392c323430610b808201527f2c3135342e352c313437513234302c35342c3332342c313437513430382c3234610ba08201527f302c3332342c3334332e355a22202f3e203c706174682066696c6c3d2275726c610bc08201527f282361292220636c6173733d22626c6f6220626c6f62342220643d224d333935610be08201527f2c3332342e35513333382c3430392c3233342c343230513133302c3433312c38610c008201527f312c3333352e355133322c3234302c38332c3134382e35513133342c35372c32610c208201527f33372e352c36302e35513334312c36342c3339362e352c313532513435322c32610c408201527f34302c3339352c3332342e355a22202f3e203c7061746820643d226d33353420610c608201527f3338312e3263362e3820332e3420352e3420372e342d352e362031302e342d31610c808201527f302e3720332e312d33312e3120352e312d35342e3420382e34732d34332e3720610ca08201527f302e382d35342e342d322e34632d31312d332e342d31322e342d372e362d352e610cc08201527f362d31332e3820362e382d372031382e392d31342e362032392e362d31372e34610ce08201527f2031312d332e332032302e362d312e382033302e342d312e347331392e342035610d008201527f2e312033302e3420382e336331302e3720332e352032322e3820352e33203239610d2082015275171b101b971cbd11179f101e17b39f101e17b9bb339f60511b610d40820152610d5601919050565b600082516132d8818460208701611a00565b919091019291505056fe3c7376672076657273696f6e3d22312e31222020786d6c6e733d22687474703a2f2f7777772e77332e6f72672f323030302f7376672220786d6c6e733a786c696e6b3d22687474703a2f2f7777772e77332e6f72672f313939392f786c696e6b222020786d6c6e733a613d22687474703a2f2f6e732e61646f62652e636f6d2f41646f6265535647566965776572457874656e73696f6e732f332e302f222020783d223070782220793d22307078222077696474683d22363030707822206865696768743d223630307078222076696577426f783d223020302036303020363030222020656e61626c652d6261636b67726f756e643d226e65772030203020363030203630302220786d6c3a73706163653d227072657365727665223e4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2fa26469706673582212201d6a3e372bfa43d0976c6f10f7cd6b4d44bc68f7272ff171873c3c57b80a126964736f6c63430008130033

Deployed Bytecode

0x6080604052600436106101cd5760003560e01c80638da5cb5b116100f7578063b88d4fde11610095578063db44fe0711610064578063db44fe07146104fc578063e985e9c51461052c578063f2fde38b1461054c578063f8dcbddb1461056c57600080fd5b8063b88d4fde14610475578063c87b56dd14610488578063cad45358146104a8578063cbccefb2146104d557600080fd5b8063a0712d68116100d1578063a0712d68146103f5578063a22cb46514610415578063af351ba814610435578063af4e39ca1461045557600080fd5b80638da5cb5b146103a257806395d89b41146103c05780639aeecf1b146103d557600080fd5b806332cb6b0c1161016f5780636352211e1161013e5780636352211e1461033857806370a0823114610358578063715018a614610378578063865540e21461038d57600080fd5b806332cb6b0c146102ca5780633ccfd60b146102e057806342842e0e146102f55780635c4191351461030857600080fd5b8063095ea7b3116101ab578063095ea7b3146102615780630bc7a2de1461027657806318160ddd1461029a57806323b872dd146102b757600080fd5b806301ffc9a7146101d257806306fdde0314610207578063081812fc14610229575b600080fd5b3480156101de57600080fd5b506101f26101ed3660046119e3565b61058c565b60405190151581526020015b60405180910390f35b34801561021357600080fd5b5061021c6105de565b6040516101fe9190611a50565b34801561023557600080fd5b50610249610244366004611a63565b610670565b6040516001600160a01b0390911681526020016101fe565b61027461026f366004611a98565b6106b4565b005b34801561028257600080fd5b5061028c600c5481565b6040519081526020016101fe565b3480156102a657600080fd5b50600154600054036000190161028c565b6102746102c5366004611ac2565b610754565b3480156102d657600080fd5b5061028c600d5481565b3480156102ec57600080fd5b50610274610812565b610274610303366004611ac2565b610840565b34801561031457600080fd5b506101f2610323366004611a63565b600b6020526000908152604090205460ff1681565b34801561034457600080fd5b50610249610353366004611a63565b6108f4565b34801561036457600080fd5b5061028c610373366004611afe565b6108ff565b34801561038457600080fd5b5061027461094e565b34801561039957600080fd5b50610274610960565b3480156103ae57600080fd5b506008546001600160a01b0316610249565b3480156103cc57600080fd5b5061021c6109ae565b3480156103e157600080fd5b5061028c6103f0366004611ba5565b6109bd565b34801561040157600080fd5b50610274610410366004611a63565b610a61565b34801561042157600080fd5b50610274610430366004611bfc565b610c1a565b34801561044157600080fd5b50610274610450366004611a63565b610c86565b34801561046157600080fd5b5061021c610470366004611a63565b610c93565b610274610483366004611c33565b610d2d565b34801561049457600080fd5b5061021c6104a3366004611a63565b610de8565b3480156104b457600080fd5b5061028c6104c3366004611afe565b600e6020526000908152604090205481565b3480156104e157600080fd5b50600f546104ef9060ff1681565b6040516101fe9190611cc5565b34801561050857600080fd5b506101f2610517366004611a63565b600a6020526000908152604090205460ff1681565b34801561053857600080fd5b506101f2610547366004611ced565b610e8f565b34801561055857600080fd5b50610274610567366004611afe565b610ebd565b34801561057857600080fd5b50610274610587366004611a63565b610f36565b60006301ffc9a760e01b6001600160e01b0319831614806105bd57506380ac58cd60e01b6001600160e01b03198316145b806105d85750635b5e139f60e01b6001600160e01b03198316145b92915050565b6060600280546105ed90611d20565b80601f016020809104026020016040519081016040528092919081815260200182805461061990611d20565b80156106665780601f1061063b57610100808354040283529160200191610666565b820191906000526020600020905b81548152906001019060200180831161064957829003601f168201915b5050505050905090565b600061067b82610f73565b610698576040516333d1c03960e21b815260040160405180910390fd5b506000908152600660205260409020546001600160a01b031690565b60006106bf826108f4565b9050336001600160a01b038216146106f8576106db8133610e8f565b6106f8576040516367d9dca160e11b815260040160405180910390fd5b60008281526006602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b6daaeb6d7670e522a718067333cd4e3b1561080257604051633185c44d60e21b81523060048201523360248201526daaeb6d7670e522a718067333cd4e9063c6171134906044016020604051808303816000875af11580156107ba573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107de9190611d5a565b61080257604051633b79c77360e21b81523360048201526024015b60405180910390fd5b61080d838383610fa8565b505050565b61081a611141565b60405133904780156108fc02916000818181858888f1935050505061083e57600080fd5b565b6daaeb6d7670e522a718067333cd4e3b156108e957604051633185c44d60e21b81523060048201523360248201526daaeb6d7670e522a718067333cd4e9063c6171134906044016020604051808303816000875af11580156108a6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108ca9190611d5a565b6108e957604051633b79c77360e21b81523360048201526024016107f9565b61080d83838361119b565b60006105d8826111b6565b60006001600160a01b038216610928576040516323d3ad8160e21b815260040160405180910390fd5b506001600160a01b031660009081526005602052604090205467ffffffffffffffff1690565b610956611141565b61083e600061122c565b610968611141565b60005b601e8110156109a2576109908161098160005490565b61098b9190611d8d565b61127e565b8061099a81611da0565b91505061096b565b5061083e33601e6112fe565b6060600380546105ed90611d20565b60008082815b8151811015610a585760008183516109db9190611db9565b905060008383815181106109f1576109f1611dcc565b01602001516001600160f81b03198116915060f81c6000610a13603083611db9565b9050610a20600185611db9565b610a2b90600a611ec6565b610a359082611ed2565b610a3f9088611d8d565b9650505050508080610a5090611da0565b9150506109c3565b50909392505050565b6001600f5460ff166001811115610a7a57610a7a611caf565b14610abf5760405162461bcd60e51b8152602060048201526015602482015274283ab13634b19026b4b73a103737ba103634bb329760591b60448201526064016107f9565b600c54336000908152600e6020526040902054610add908390611d8d565b1115610b1a5760405162461bcd60e51b815260206004820152600c60248201526b13585e08195e18d95959195960a21b60448201526064016107f9565b600d546001546000548391900360001901610b359190611d8d565b1115610b795760405162461bcd60e51b815260206004820152601360248201527213585e081cdd5c1c1b1e48195e18d959591959606a1b60448201526064016107f9565b323314610bbe5760405162461bcd60e51b81526020600482015260136024820152722737ba103a34329039b0b6b29031b0b63632b960691b60448201526064016107f9565b60005b81811015610be857610bd68161098160005490565b80610be081611da0565b915050610bc1565b50610bf333826112fe565b336000908152600e602052604081208054839290610c12908490611d8d565b909155505050565b3360008181526007602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b610c8e611141565b600c55565b60096020526000908152604090208054610cac90611d20565b80601f0160208091040260200160405190810160405280929190818152602001828054610cd890611d20565b8015610d255780601f10610cfa57610100808354040283529160200191610d25565b820191906000526020600020905b815481529060010190602001808311610d0857829003601f168201915b505050505081565b6daaeb6d7670e522a718067333cd4e3b15610dd657604051633185c44d60e21b81523060048201523360248201526daaeb6d7670e522a718067333cd4e9063c6171134906044016020604051808303816000875af1158015610d93573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610db79190611d5a565b610dd657604051633b79c77360e21b81523360048201526024016107f9565b610de2848484846113fc565b50505050565b60606105d882600960008581526020019081526020016000208054610e0c90611d20565b80601f0160208091040260200160405190810160405280929190818152602001828054610e3890611d20565b8015610e855780601f10610e5a57610100808354040283529160200191610e85565b820191906000526020600020905b815481529060010190602001808311610e6857829003601f168201915b5050505050611440565b6001600160a01b03918216600090815260076020908152604080832093909416825291909152205460ff1690565b610ec5611141565b6001600160a01b038116610f2a5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016107f9565b610f338161122c565b50565b610f3e611141565b806001811115610f5057610f50611caf565b600f805460ff191660018381811115610f6b57610f6b611caf565b021790555050565b600081600111158015610f87575060005482105b80156105d8575050600090815260046020526040902054600160e01b161590565b6000610fb3826111b6565b9050836001600160a01b0316816001600160a01b031614610fe65760405162a1148160e81b815260040160405180910390fd5b60008281526006602052604090208054338082146001600160a01b03881690911417611033576110168633610e8f565b61103357604051632ce44b5f60e11b815260040160405180910390fd5b6001600160a01b03851661105a57604051633a954ecd60e21b815260040160405180910390fd5b801561106557600082555b6001600160a01b038681166000908152600560205260408082208054600019019055918716808252919020805460010190554260a01b17600160e11b17600085815260046020526040812091909155600160e11b841690036110f7576001840160008181526004602052604081205490036110f55760005481146110f55760008181526004602052604090208490555b505b83856001600160a01b0316876001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45b505050505050565b6008546001600160a01b0316331461083e5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016107f9565b61080d83838360405180602001604052806000815250610d2d565b60008180600111611213576000548110156112135760008181526004602052604081205490600160e01b82169003611211575b8060000361120a5750600019016000818152600460205260409020546111e9565b9392505050565b505b604051636f96cda160e11b815260040160405180910390fd5b600880546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b604080514260208201526bffffffffffffffffffffffff193360601b1691810191909152605481018290526000906103e9906074016040516020818303038152906040528051906020012060001c6112d69190611eff565b905060006112e3826114b2565b6000848152600960205260409020909150610de28282611f59565b60008054908290036113235760405163b562e8dd60e01b815260040160405180910390fd5b6001600160a01b03831660008181526005602090815260408083208054680100000000000000018802019055848352600490915281206001851460e11b4260a01b178317905582840190839083907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8180a4600183015b8181146113d257808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a460010161139a565b50816000036113f357604051622e076360e81b815260040160405180910390fd5b60005550505050565b611407848484610754565b6001600160a01b0383163b15610de257611423848484846115de565b610de2576040516368d2bf6b60e11b815260040160405180910390fd5b60608061144c846116ca565b8361145e611459866117ed565b61187a565b60405160200161147093929190612019565b604051602081830303815290604052905061148a8161187a565b60405160200161149a9190612148565b60405160208183030381529060405291505092915050565b6060816000036114d95750506040805180820190915260018152600360fc1b602082015290565b8160005b811561150357806114ed81611da0565b91506114fc9050600a8361218d565b91506114dd565b60008167ffffffffffffffff81111561151e5761151e611b19565b6040519080825280601f01601f191660200182016040528015611548576020820181803683370190505b509050815b85156115d55761155e600182611db9565b9050600061156d600a8861218d565b61157890600a611ed2565b6115829088611db9565b61158d9060306121a1565b905060008160f81b9050808484815181106115aa576115aa611dcc565b60200101906001600160f81b031916908160001a9053506115cc600a8961218d565b9750505061154d565b50949350505050565b604051630a85bd0160e11b81526000906001600160a01b0385169063150b7a02906116139033908990889088906004016121ba565b6020604051808303816000875af192505050801561164e575060408051601f3d908101601f1916820190925261164b918101906121f7565b60015b6116ac573d80801561167c576040519150601f19603f3d011682016040523d82523d6000602084013e611681565b606091505b5080516000036116a4576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490505b949350505050565b6060816000036116f15750506040805180820190915260018152600360fc1b602082015290565b8160005b811561171b578061170581611da0565b91506117149050600a8361218d565b91506116f5565b60008167ffffffffffffffff81111561173657611736611b19565b6040519080825280601f01601f191660200182016040528015611760576020820181803683370190505b509050815b85156115d557611776600182611db9565b90506000611785600a8861218d565b61179090600a611ed2565b61179a9088611db9565b6117a59060306121a1565b905060008160f81b9050808484815181106117c2576117c2611dcc565b60200101906001600160f81b031916908160001a9053506117e4600a8961218d565b97505050611765565b606060405180610140016040528061011d81526020016132e361011d913990508082604051602001611820929190612214565b604051602081830303815290604052905080604051602001611842919061226c565b60405160208183030381529060405290508060405160200161186491906132c6565b6040516020818303038152906040529050919050565b6060815160000361189957505060408051602081019091526000815290565b600060405180606001604052806040815260200161340060409139905060006003845160026118c89190611d8d565b6118d2919061218d565b6118dd906004611ed2565b67ffffffffffffffff8111156118f5576118f5611b19565b6040519080825280601f01601f19166020018201604052801561191f576020820181803683370190505b509050600182016020820185865187015b8082101561198b576003820191508151603f8160121c168501518453600184019350603f81600c1c168501518453600184019350603f8160061c168501518453600184019350603f8116850151845350600183019250611930565b50506003865106600181146119a757600281146119ba576119c2565b603d6001830353603d60028303536119c2565b603d60018303535b509195945050505050565b6001600160e01b031981168114610f3357600080fd5b6000602082840312156119f557600080fd5b813561120a816119cd565b60005b83811015611a1b578181015183820152602001611a03565b50506000910152565b60008151808452611a3c816020860160208601611a00565b601f01601f19169290920160200192915050565b60208152600061120a6020830184611a24565b600060208284031215611a7557600080fd5b5035919050565b80356001600160a01b0381168114611a9357600080fd5b919050565b60008060408385031215611aab57600080fd5b611ab483611a7c565b946020939093013593505050565b600080600060608486031215611ad757600080fd5b611ae084611a7c565b9250611aee60208501611a7c565b9150604084013590509250925092565b600060208284031215611b1057600080fd5b61120a82611a7c565b634e487b7160e01b600052604160045260246000fd5b600067ffffffffffffffff80841115611b4a57611b4a611b19565b604051601f8501601f19908116603f01168101908282118183101715611b7257611b72611b19565b81604052809350858152868686011115611b8b57600080fd5b858560208301376000602087830101525050509392505050565b600060208284031215611bb757600080fd5b813567ffffffffffffffff811115611bce57600080fd5b8201601f81018413611bdf57600080fd5b6116c284823560208401611b2f565b8015158114610f3357600080fd5b60008060408385031215611c0f57600080fd5b611c1883611a7c565b91506020830135611c2881611bee565b809150509250929050565b60008060008060808587031215611c4957600080fd5b611c5285611a7c565b9350611c6060208601611a7c565b925060408501359150606085013567ffffffffffffffff811115611c8357600080fd5b8501601f81018713611c9457600080fd5b611ca387823560208401611b2f565b91505092959194509250565b634e487b7160e01b600052602160045260246000fd5b6020810160028310611ce757634e487b7160e01b600052602160045260246000fd5b91905290565b60008060408385031215611d0057600080fd5b611d0983611a7c565b9150611d1760208401611a7c565b90509250929050565b600181811c90821680611d3457607f821691505b602082108103611d5457634e487b7160e01b600052602260045260246000fd5b50919050565b600060208284031215611d6c57600080fd5b815161120a81611bee565b634e487b7160e01b600052601160045260246000fd5b808201808211156105d8576105d8611d77565b600060018201611db257611db2611d77565b5060010190565b818103818111156105d8576105d8611d77565b634e487b7160e01b600052603260045260246000fd5b600181815b80851115611e1d578160001904821115611e0357611e03611d77565b80851615611e1057918102915b93841c9390800290611de7565b509250929050565b600082611e34575060016105d8565b81611e41575060006105d8565b8160018114611e575760028114611e6157611e7d565b60019150506105d8565b60ff841115611e7257611e72611d77565b50506001821b6105d8565b5060208310610133831016604e8410600b8410161715611ea0575081810a6105d8565b611eaa8383611de2565b8060001904821115611ebe57611ebe611d77565b029392505050565b600061120a8383611e25565b80820281158282048414176105d8576105d8611d77565b634e487b7160e01b600052601260045260246000fd5b600082611f0e57611f0e611ee9565b500690565b601f82111561080d57600081815260208120601f850160051c81016020861015611f3a5750805b601f850160051c820191505b8181101561113957828155600101611f46565b815167ffffffffffffffff811115611f7357611f73611b19565b611f8781611f818454611d20565b84611f13565b602080601f831160018114611fbc5760008415611fa45750858301515b600019600386901b1c1916600185901b178555611139565b600085815260208120601f198616915b82811015611feb57888601518255948401946001909101908401611fcc565b50858210156120095787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b737b226e616d65223a20224c6176614c616d70202360601b81528351600090612049816014850160208901611a00565b7f222c20226465736372697074696f6e223a2022576520616c6c206c69766520696014918401918201527f6e20646966666572656e7420626c6f62732e222c20226174747269627574657360348201527f223a5b7b2274726169745f74797065223a2022485545222c202276616c75652260548201526101d160f51b607482015284516120dd816076840160208901611a00565b7f7d5d2c2022696d616765223a2022646174613a696d6167652f7376672b786d6c60769290910191820152670ed8985cd94d8d0b60c21b6096820152835161212c81609e840160208801611a00565b61227d60f01b609e929091019182015260a00195945050505050565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c00000081526000825161218081601d850160208701611a00565b91909101601d0192915050565b60008261219c5761219c611ee9565b500490565b60ff81811683821601908111156105d8576105d8611d77565b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906121ed90830184611a24565b9695505050505050565b60006020828403121561220957600080fd5b815161120a816119cd565b60008351612226818460208801611a00565b7f3c646566733e3c7374796c653e203a726f6f747b2d2d6875653a200000000000908301908152835161226081601b840160208801611a00565b01601b01949350505050565b6000825161227e818460208701611a00565b7f3b202d2d687565436f6d706c656d656e743a2063616c6328766172282d2d68759201918252507f6529202b20313830293b202d2d6875655269676874416e616c6f676f75733a2060208201527f63616c6328766172282d2d68756529202b203330293b202d2d6875654c65667460408201527f416e616c6f676f75733a2063616c6328766172282d2d68756529202d2033302960608201527f3b202d2d616363656e7456313a2068736c28766172282d2d687565526967687460808201527f416e616c6f676f7573292035302520353025293b202d2d616363656e7456323a60a08201527f2068736c28766172282d2d6875654c656674416e616c6f676f7573292035302560c08201527f20353025293b207d20626f6479207b206261636b67726f756e642d636f6c6f7260e08201527f3a233030303b206f766572666c6f773a2068696464656e3b207d20406b6579666101008201527f72616d6573207570646f776e207b203025207b207472616e73666f726d3a20746101208201527f72616e736c61746559283029207363616c6528302e32293b207d20353025207b6101408201527f207472616e73666f726d3a207472616e736c61746559282d31303070782920736101608201527f63616c6528302e31293b207d2031303025207b207472616e73666f726d3a20746101808201527f72616e736c61746559283029207363616c6528302e32293b207d207d202e626c6101a08201527f6f62207b207472616e73666f726d2d6f726967696e3a20353025203730253b206101c08201527f616e696d6174696f6e2d6e616d653a207570646f776e3b20616e696d6174696f6101e08201527f6e2d6475726174696f6e3a203330733b20616e696d6174696f6e2d69746572616102008201527f74696f6e2d636f756e743a20696e66696e6974653b20616e696d6174696f6e2d6102208201527f646972656374696f6e3a20616c7465726e6174653b207d202e626c6f6232207b6102408201527f207472616e73666f726d2d6f726967696e3a20353025203330253b20616e696d6102608201527f6174696f6e2d6475726174696f6e3a203430733b207d202e626c6f62337b20746102808201527f72616e73666f726d2d6f726967696e3a20353025203435253b20616e696d61746102a08201527f696f6e2d6475726174696f6e3a203138733b207d202e626c6f62347b207472616102c08201527f6e73666f726d2d6f726967696e3a20353025203535253b20616e696d6174696f6102e08201527f6e2d6475726174696f6e3a203234733b207d203c2f7374796c653e203c6c696e6103008201527f6561724772616469656e742069643d2261222079313d22312220786d6c6e733d6103208201527f22687474703a2f2f7777772e77332e6f72672f323030302f737667223e203c736103408201527f746f702073746f702d636f6c6f723d22766172282d2d616363656e74563129226103608201527f206f66667365743d2230222f3e203c73746f702073746f702d636f6c6f723d226103808201527f766172282d2d616363656e7456322922206f66667365743d2231222f3e203c2f6103a08201527f6c696e6561724772616469656e743e203c66696c7465722069643d2264223e206103c08201527f3c6665476175737369616e426c757220696e3d22536f757263654772617068696103e08201527f632220726573756c743d22626c75722220737464446576696174696f6e3d22386104008201527f222f3e203c6665436f6c6f724d617472697820696e3d22626c757222206d6f646104208201527f653d226d61747269782220726573756c743d22636d222076616c7565733d22316104408201527f20302030203020302030203120302030203020302030203120302030203020306104608201527f2030203231202d39222f3e203c2f66696c7465723e203c72616469616c4772616104808201527f6469656e742069643d2267222063783d22333030222063793d223330302220726104a08201527f3d2233353022206772616469656e74556e6974733d227573657253706163654f6104c08201527f6e557365223e203c73746f702073746f702d636f6c6f723d22233437314131396104e08201527f22206f66667365743d222e303731343239222f3e203c73746f702073746f702d6105008201527f636f6c6f723d222332393046304522206f66667365743d222e33313037222f3e6105208201527f203c73746f702073746f702d636f6c6f723d222331323037303622206f6666736105408201527f65743d222e353533222f3e203c73746f702073746f702d636f6c6f723d2223306105608201527f353032303222206f66667365743d222e37383238222f3e203c73746f70206f666105808201527f667365743d222e39383437222f3e203c2f72616469616c4772616469656e743e6105a08201527f203c636c6970506174682069643d2266223e203c706174682069643d226522206105c08201527f643d226d323632203137346836306c33332e35203138322e3373322e372031326105e08201527f2e3820322e352032322e38682d313331732d302e372d392e3320302d313863306106008201527f2e362d382e322033352d3138372e312033352d3138372e317a222f3e203c2f636106208201527f6c6970506174683e203c6c696e6561724772616469656e742069643d226222206106408201527f78313d22323932222078323d22323932222079313d22313335222079323d22316106608201527f373422206772616469656e74556e6974733d227573657253706163654f6e55736106808201527f65223e203c73746f70206f66667365743d222e303135333036222f3e203c73746106a08201527f6f702073746f702d636f6c6f723d222330353032303222206f66667365743d226106c08201527f2e323333222f3e203c73746f702073746f702d636f6c6f723d222331323037306106e08201527f3622206f66667365743d222e34383038222f3e203c73746f702073746f702d636107008201527f6f6c6f723d222332393046304522206f66667365743d222e37343231222f3e206107208201527f3c73746f702073746f702d636f6c6f723d222334373141313922206f666673656107408201527f743d2231222f3e203c2f6c696e6561724772616469656e743e203c6c696e65616107608201527f724772616469656e742069643d2263222078313d223239322e3338222078323d6107808201527f223239322e3338222079313d22343730222079323d22333739222067726164696107a08201527f656e74556e6974733d227573657253706163654f6e557365223e203c73746f706107c08201527f206f66667365743d222e303035313032222f3e203c73746f702073746f702d636107e08201527f6f6c6f723d222330353032303222206f66667365743d222e32323531222f3e206108008201527f3c73746f702073746f702d636f6c6f723d222331323037303622206f666673656108208201527f743d222e34373534222f3e203c73746f702073746f702d636f6c6f723d2223326108408201527f393046304522206f66667365743d222e37333934222f3e203c73746f702073746108608201527f6f702d636f6c6f723d222334373141313922206f66667365743d2231222f3e206108808201527f3c2f6c696e6561724772616469656e743e203c2f646566733e203c72656374206108a08201527f77696474683d2236303022206865696768743d22363030222066696c6c3d22756108c08201527f726c28236729222f3e203c7573652066696c6c3d22766172282d2d616363656e6108e08201527f7456312922206f7061636974793d222e312220786c696e6b3a687265663d22236109008201527f65222f3e203c706f6c79676f6e20706f696e74733d22323639203133352032366109208201527f322031373420333232203137342033313620313335222066696c6c3d2275726c6109408201527f28236229222f3e203c7061746820643d226d3232362e382033373963322e36206109608201527f34332032332e392035342e362032382e332036302e3220332e3320352e342d316109808201527f302033302e382d31302033302e386839352e35732d31362e352d32352e312d316109a08201527f342e352d33302e382032362d31352e322033322d36302e32682d3133312e337a6109c08201527f222066696c6c3d2275726c28236329222f3e203c7265637420793d22343730226109e08201527f2077696474683d2236303022206865696768743d22313330222f3e203c672063610a008201527f6c69702d706174683d2275726c28236629222066696c6c3d2275726c28236129610a208201527f222066696c7465723d2275726c28236429223e203c706174682066696c6c3d22610a408201527f75726c282361292220636c6173733d22626c6f622220643d224d3333372c3332610a608201527f332e35513234302c3430372c3136352c3332332e355139302c3234302c313635610a808201527f2c3136312e35513234302c38332c3333372c3136312e35513433342c3234302c610aa08201527f3333372c3332332e355a22202f3e203c706174682066696c6c3d2275726c2823610ac08201527f61292220636c6173733d22626c6f6220626c6f62322220643d224d3332342c33610ae08201527f34332e35513234302c3434372c3135342e352c3334332e355136392c3234302c610b008201527f3135342e352c313437513234302c35342c3332342c313437513430382c323430610b208201527f2c3332342c3334332e355a22202f3e203c706174682066696c6c3d2275726c28610b408201527f2361292220636c6173733d22626c6f6220626c6f62332220643d224d3332342c610b608201527f3334332e35513234302c3434372c3135342e352c3334332e355136392c323430610b808201527f2c3135342e352c313437513234302c35342c3332342c313437513430382c3234610ba08201527f302c3332342c3334332e355a22202f3e203c706174682066696c6c3d2275726c610bc08201527f282361292220636c6173733d22626c6f6220626c6f62342220643d224d333935610be08201527f2c3332342e35513333382c3430392c3233342c343230513133302c3433312c38610c008201527f312c3333352e355133322c3234302c38332c3134382e35513133342c35372c32610c208201527f33372e352c36302e35513334312c36342c3339362e352c313532513435322c32610c408201527f34302c3339352c3332342e355a22202f3e203c7061746820643d226d33353420610c608201527f3338312e3263362e3820332e3420352e3420372e342d352e362031302e342d31610c808201527f302e3720332e312d33312e3120352e312d35342e3420382e34732d34332e3720610ca08201527f302e382d35342e342d322e34632d31312d332e342d31322e342d372e362d352e610cc08201527f362d31332e3820362e382d372031382e392d31342e362032392e362d31372e34610ce08201527f2031312d332e332032302e362d312e382033302e342d312e347331392e342035610d008201527f2e312033302e3420382e336331302e3720332e352032322e3820352e33203239610d2082015275171b101b971cbd11179f101e17b39f101e17b9bb339f60511b610d40820152610d5601919050565b600082516132d8818460208701611a00565b919091019291505056fe3c7376672076657273696f6e3d22312e31222020786d6c6e733d22687474703a2f2f7777772e77332e6f72672f323030302f7376672220786d6c6e733a786c696e6b3d22687474703a2f2f7777772e77332e6f72672f313939392f786c696e6b222020786d6c6e733a613d22687474703a2f2f6e732e61646f62652e636f6d2f41646f6265535647566965776572457874656e73696f6e732f332e302f222020783d223070782220793d22307078222077696474683d22363030707822206865696768743d223630307078222076696577426f783d223020302036303020363030222020656e61626c652d6261636b67726f756e643d226e65772030203020363030203630302220786d6c3a73706163653d227072657365727665223e4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2fa26469706673582212201d6a3e372bfa43d0976c6f10f7cd6b4d44bc68f7272ff171873c3c57b80a126964736f6c63430008130033

Deployed Bytecode Sourcemap

77867:3759:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41116:639;;;;;;;;;;-1:-1:-1;41116:639:0;;;;;:::i;:::-;;:::i;:::-;;;565:14:1;;558:22;540:41;;528:2;513:18;41116:639:0;;;;;;;;42018:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;48509:218::-;;;;;;;;;;-1:-1:-1;48509:218:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;1697:32:1;;;1679:51;;1667:2;1652:18;48509:218:0;1533:203:1;47942:408:0;;;;;;:::i;:::-;;:::i;:::-;;78084:29;;;;;;;;;;;;;;;;;;;2324:25:1;;;2312:2;2297:18;78084:29:0;2178:177:1;37769:323:0;;;;;;;;;;-1:-1:-1;37368:1:0;38043:12;37830:7;38027:13;:28;-1:-1:-1;;38027:46:0;37769:323;;80561:184;;;;;;:::i;:::-;;:::i;78122:29::-;;;;;;;;;;;;;;;;81509:114;;;;;;;;;;;;;:::i;80753:192::-;;;;;;:::i;:::-;;:::i;78040:35::-;;;;;;;;;;-1:-1:-1;78040:35:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;43411:152;;;;;;;;;;-1:-1:-1;43411:152:0;;;;;:::i;:::-;;:::i;38953:233::-;;;;;;;;;;-1:-1:-1;38953:233:0;;;;;:::i;:::-;;:::i;31605:103::-;;;;;;;;;;;;;:::i;78308:191::-;;;;;;;;;;;;;:::i;30957:87::-;;;;;;;;;;-1:-1:-1;31030:6:0;;-1:-1:-1;;;;;31030:6:0;30957:87;;42194:104;;;;;;;;;;;;;:::i;79108:470::-;;;;;;;;;;-1:-1:-1;79108:470:0;;;;;:::i;:::-;;:::i;79993:560::-;;;;;;;;;;-1:-1:-1;79993:560:0;;;;;:::i;:::-;;:::i;49067:234::-;;;;;;;;;;-1:-1:-1;49067:234:0;;;;;:::i;:::-;;:::i;79586:99::-;;;;;;;;;;-1:-1:-1;79586:99:0;;;;;:::i;:::-;;:::i;77949:40::-;;;;;;;;;;-1:-1:-1;77949:40:0;;;;;:::i;:::-;;:::i;80953:258::-;;;;;;:::i;:::-;;:::i;81319:182::-;;;;;;;;;;-1:-1:-1;81319:182:0;;;;;:::i;:::-;;:::i;78160:44::-;;;;;;;;;;-1:-1:-1;78160:44:0;;;;;:::i;:::-;;;;;;;;;;;;;;78276:23;;;;;;;;;;-1:-1:-1;78276:23:0;;;;;;;;;;;;;;;:::i;77996:37::-;;;;;;;;;;-1:-1:-1;77996:37:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;49458:164;;;;;;;;;;-1:-1:-1;49458:164:0;;;;;:::i;:::-;;:::i;31863:201::-;;;;;;;;;;-1:-1:-1;31863:201:0;;;;;:::i;:::-;;:::i;81219:92::-;;;;;;;;;;-1:-1:-1;81219:92:0;;;;;:::i;:::-;;:::i;41116:639::-;41201:4;-1:-1:-1;;;;;;;;;41525:25:0;;;;:102;;-1:-1:-1;;;;;;;;;;41602:25:0;;;41525:102;:179;;;-1:-1:-1;;;;;;;;;;41679:25:0;;;41525:179;41505:199;41116:639;-1:-1:-1;;41116:639:0:o;42018:100::-;42072:13;42105:5;42098:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42018:100;:::o;48509:218::-;48585:7;48610:16;48618:7;48610;:16::i;:::-;48605:64;;48635:34;;-1:-1:-1;;;48635:34:0;;;;;;;;;;;48605:64;-1:-1:-1;48689:24:0;;;;:15;:24;;;;;:30;-1:-1:-1;;;;;48689:30:0;;48509:218::o;47942:408::-;48031:13;48047:16;48055:7;48047;:16::i;:::-;48031:32;-1:-1:-1;72275:10:0;-1:-1:-1;;;;;48080:28:0;;;48076:175;;48128:44;48145:5;72275:10;49458:164;:::i;48128:44::-;48123:128;;48200:35;;-1:-1:-1;;;48200:35:0;;;;;;;;;;;48123:128;48263:24;;;;:15;:24;;;;;;:35;;-1:-1:-1;;;;;;48263:35:0;-1:-1:-1;;;;;48263:35:0;;;;;;;;;48314:28;;48263:24;;48314:28;;;;;;;48020:330;47942:408;;:::o;80561:184::-;238:42;1366:43;:47;1362:225;;1435:67;;-1:-1:-1;;;1435:67:0;;1484:4;1435:67;;;6560:34:1;1491:10:0;6610:18:1;;;6603:43;238:42:0;;1435:40;;6495:18:1;;1435:67:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;1430:146;;1530:30;;-1:-1:-1;;;1530:30:0;;1549:10;1530:30;;;1679:51:1;1652:18;;1530:30:0;;;;;;;;1430:146;80700:37:::1;80719:4;80725:2;80729:7;80700:18;:37::i;:::-;80561:184:::0;;;:::o;81509:114::-;30843:13;:11;:13::i;:::-;81567:47:::1;::::0;81575:10:::1;::::0;81592:21:::1;81567:47:::0;::::1;;;::::0;::::1;::::0;;;81592:21;81575:10;81567:47;::::1;;;;;;81559:56;;;::::0;::::1;;81509:114::o:0;80753:192::-;238:42;1366:43;:47;1362:225;;1435:67;;-1:-1:-1;;;1435:67:0;;1484:4;1435:67;;;6560:34:1;1491:10:0;6610:18:1;;;6603:43;238:42:0;;1435:40;;6495:18:1;;1435:67:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;1430:146;;1530:30;;-1:-1:-1;;;1530:30:0;;1549:10;1530:30;;;1679:51:1;1652:18;;1530:30:0;1533:203:1;1430:146:0;80896:41:::1;80919:4;80925:2;80929:7;80896:22;:41::i;43411:152::-:0;43483:7;43526:27;43545:7;43526:18;:27::i;38953:233::-;39025:7;-1:-1:-1;;;;;39049:19:0;;39045:60;;39077:28;;-1:-1:-1;;;39077:28:0;;;;;;;;;;;39045:60;-1:-1:-1;;;;;;39123:25:0;;;;;:18;:25;;;;;;33112:13;39123:55;;38953:233::o;31605:103::-;30843:13;:11;:13::i;:::-;31670:30:::1;31697:1;31670:18;:30::i;78308:191::-:0;30843:13;:11;:13::i;:::-;78364:6:::1;78359:101;78380:2;78376:1;:6;78359:101;;;78404:29;78431:1;78414:14;37511:7:::0;37538:13;;37456:103;78414:14:::1;:18;;;;:::i;:::-;78404:9;:29::i;:::-;78384:3:::0;::::1;::::0;::::1;:::i;:::-;;;;78359:101;;;;78470:21;78476:10;78488:2;78470:5;:21::i;42194:104::-:0;42250:13;42283:7;42276:14;;;;;:::i;79108:470::-;79170:4;;79244:9;79170:4;79265:287;79286:11;:18;79284:1;:20;79265:287;;;79326:8;79358:1;79337:11;:18;:22;;;;:::i;:::-;79326:33;;79374:11;79388;79400:1;79388:14;;;;;;;;:::i;:::-;;;;;-1:-1:-1;;;;;;79388:14:0;;;-1:-1:-1;79388:14:0;;79417:10;79467:17;79479:4;79388:14;79467:17;:::i;:::-;79455:29;-1:-1:-1;79531:5:0;79535:1;79531:3;:5;:::i;:::-;79526:11;;:2;:11;:::i;:::-;79512:26;;79517:4;79512:26;:::i;:::-;79503:36;;;;:::i;:::-;;;79311:241;;;;79306:3;;;;;:::i;:::-;;;;79265:287;;;-1:-1:-1;79567:3:0;;79108:470;-1:-1:-1;;;79108:470:0:o;79993:560::-;80058:15;80043:11;;;;;:30;;;;;;;:::i;:::-;;80040:66;;80075:31;;-1:-1:-1;;;80075:31:0;;9323:2:1;80075:31:0;;;9305:21:1;9362:2;9342:18;;;9335:30;-1:-1:-1;;;9381:18:1;;;9374:51;9442:18;;80075:31:0;9121:345:1;80040:66:0;80158:13;;80133:10;80120:24;;;;:12;:24;;;;;;:35;;80147:8;;80120:35;:::i;:::-;:51;80117:78;;;80173:22;;-1:-1:-1;;;80173:22:0;;9673:2:1;80173:22:0;;;9655:21:1;9712:2;9692:18;;;9685:30;-1:-1:-1;;;9731:18:1;;;9724:42;9783:18;;80173:22:0;9471:336:1;80117:78:0;80236:10;;37368:1;38043:12;37830:7;38027:13;80225:8;;38027:28;;-1:-1:-1;;38027:46:0;80209:24;;;;:::i;:::-;:37;80206:71;;;80248:29;;-1:-1:-1;;;80248:29:0;;10014:2:1;80248:29:0;;;9996:21:1;10053:2;10033:18;;;10026:30;-1:-1:-1;;;10072:18:1;;;10065:49;10131:18;;80248:29:0;9812:343:1;80206:71:0;80296:9;80309:10;80296:23;80288:55;;;;-1:-1:-1;;;80288:55:0;;10362:2:1;80288:55:0;;;10344:21:1;10401:2;10381:18;;;10374:30;-1:-1:-1;;;10420:18:1;;;10413:49;10479:18;;80288:55:0;10160:343:1;80288:55:0;80359:6;80354:107;80375:8;80371:1;:12;80354:107;;;80405:29;80432:1;80415:14;37511:7;37538:13;;37456:103;80405:29;80385:3;;;;:::i;:::-;;;;80354:107;;;;80471:27;80477:10;80489:8;80471:5;:27::i;:::-;80522:10;80509:24;;;;:12;:24;;;;;:36;;80537:8;;80509:24;:36;;80537:8;;80509:36;:::i;:::-;;;;-1:-1:-1;;;79993:560:0:o;49067:234::-;72275:10;49162:39;;;;:18;:39;;;;;;;;-1:-1:-1;;;;;49162:49:0;;;;;;;;;;;;:60;;-1:-1:-1;;49162:60:0;;;;;;;;;;49238:55;;540:41:1;;;49162:49:0;;72275:10;49238:55;;513:18:1;49238:55:0;;;;;;;49067:234;;:::o;79586:99::-;30843:13;:11;:13::i;:::-;79653::::1;:24:::0;79586:99::o;77949:40::-;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;80953:258::-;238:42;1366:43;:47;1362:225;;1435:67;;-1:-1:-1;;;1435:67:0;;1484:4;1435:67;;;6560:34:1;1491:10:0;6610:18:1;;;6603:43;238:42:0;;1435:40;;6495:18:1;;1435:67:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;1430:146;;1530:30;;-1:-1:-1;;;1530:30:0;;1549:10;1530:30;;;1679:51:1;1652:18;;1530:30:0;1533:203:1;1430:146:0;81156:47:::1;81179:4;81185:2;81189:7;81198:4;81156:22;:47::i;:::-;80953:258:::0;;;;:::o;81319:182::-;81411:13;81444:49;81465:7;81474:9;:18;81484:7;81474:18;;;;;;;;;;;81444:49;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:20;:49::i;49458:164::-;-1:-1:-1;;;;;49579:25:0;;;49555:4;49579:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;49458:164::o;31863:201::-;30843:13;:11;:13::i;:::-;-1:-1:-1;;;;;31952:22:0;::::1;31944:73;;;::::0;-1:-1:-1;;;31944:73:0;;10710:2:1;31944:73:0::1;::::0;::::1;10692:21:1::0;10749:2;10729:18;;;10722:30;10788:34;10768:18;;;10761:62;-1:-1:-1;;;10839:18:1;;;10832:36;10885:19;;31944:73:0::1;10508:402:1::0;31944:73:0::1;32028:28;32047:8;32028:18;:28::i;:::-;31863:201:::0;:::o;81219:92::-;30843:13;:11;:13::i;:::-;81297:5:::1;81292:11;;;;;;;;:::i;:::-;81278;:25:::0;;-1:-1:-1;;81278:25:0::1;::::0;;;;::::1;;;;;;:::i;:::-;;;;;;81219:92:::0;:::o;49880:282::-;49945:4;50001:7;37368:1;49982:26;;:66;;;;;50035:13;;50025:7;:23;49982:66;:153;;;;-1:-1:-1;;50086:26:0;;;;:17;:26;;;;;;-1:-1:-1;;;50086:44:0;:49;;49880:282::o;52148:2825::-;52290:27;52320;52339:7;52320:18;:27::i;:::-;52290:57;;52405:4;-1:-1:-1;;;;;52364:45:0;52380:19;-1:-1:-1;;;;;52364:45:0;;52360:86;;52418:28;;-1:-1:-1;;;52418:28:0;;;;;;;;;;;52360:86;52460:27;51256:24;;;:15;:24;;;;;51484:26;;72275:10;50881:30;;;-1:-1:-1;;;;;50574:28:0;;50859:20;;;50856:56;52646:180;;52739:43;52756:4;72275:10;49458:164;:::i;52739:43::-;52734:92;;52791:35;;-1:-1:-1;;;52791:35:0;;;;;;;;;;;52734:92;-1:-1:-1;;;;;52843:16:0;;52839:52;;52868:23;;-1:-1:-1;;;52868:23:0;;;;;;;;;;;52839:52;53040:15;53037:160;;;53180:1;53159:19;53152:30;53037:160;-1:-1:-1;;;;;53577:24:0;;;;;;;:18;:24;;;;;;53575:26;;-1:-1:-1;;53575:26:0;;;53646:22;;;;;;;;;53644:24;;-1:-1:-1;53644:24:0;;;46800:11;46775:23;46771:41;46758:63;-1:-1:-1;;;46758:63:0;53939:26;;;;:17;:26;;;;;:175;;;;-1:-1:-1;;;54234:47:0;;:52;;54230:627;;54339:1;54329:11;;54307:19;54462:30;;;:17;:30;;;;;;:35;;54458:384;;54600:13;;54585:11;:28;54581:242;;54747:30;;;;:17;:30;;;;;:52;;;54581:242;54288:569;54230:627;54904:7;54900:2;-1:-1:-1;;;;;54885:27:0;54894:4;-1:-1:-1;;;;;54885:27:0;;;;;;;;;;;54923:42;52279:2694;;;52148:2825;;;:::o;31122:132::-;31030:6;;-1:-1:-1;;;;;31030:6:0;72275:10;31186:23;31178:68;;;;-1:-1:-1;;;31178:68:0;;11117:2:1;31178:68:0;;;11099:21:1;;;11136:18;;;11129:30;11195:34;11175:18;;;11168:62;11247:18;;31178:68:0;10915:356:1;55069:193:0;55215:39;55232:4;55238:2;55242:7;55215:39;;;;;;;;;;;;:16;:39::i;44566:1275::-;44633:7;44668;;37368:1;44717:23;44713:1061;;44770:13;;44763:4;:20;44759:1015;;;44808:14;44825:23;;;:17;:23;;;;;;;-1:-1:-1;;;44914:24:0;;:29;;44910:845;;45579:113;45586:6;45596:1;45586:11;45579:113;;-1:-1:-1;;;45657:6:0;45639:25;;;;:17;:25;;;;;;45579:113;;;45725:6;44566:1275;-1:-1:-1;;;44566:1275:0:o;44910:845::-;44785:989;44759:1015;45802:31;;-1:-1:-1;;;45802:31:0;;;;;;;;;;;32224:191;32317:6;;;-1:-1:-1;;;;;32334:17:0;;;-1:-1:-1;;;;;;32334:17:0;;;;;;;32367:40;;32317:6;;;32334:17;32317:6;;32367:40;;32298:16;;32367:40;32287:128;32224:191;:::o;79693:236::-;79781:50;;;79798:15;79781:50;;;11461:19:1;-1:-1:-1;;79815:10:0;11518:2:1;11514:15;11510:53;11496:12;;;11489:75;;;;11580:12;;;11573:28;;;79749:14:0;;79836:4;;11617:12:1;;79781:50:0;;;;;;;;;;;;79771:61;;;;;;79766:67;;:74;;;;:::i;:::-;79749:91;;79851:17;79871:19;79880:9;79871:8;:19::i;:::-;79901:14;;;;:9;:14;;;;;79851:39;;-1:-1:-1;79901:20:0;79851:39;79901:14;:20;:::i;59529:2966::-;59602:20;59625:13;;;59653;;;59649:44;;59675:18;;-1:-1:-1;;;59675:18:0;;;;;;;;;;;59649:44;-1:-1:-1;;;;;60181:22:0;;;;;;:18;:22;;;;33250:2;60181:22;;;:71;;60219:32;60207:45;;60181:71;;;60495:31;;;:17;:31;;;;;-1:-1:-1;47231:15:0;;47205:24;47201:46;46800:11;46775:23;46771:41;46768:52;46758:63;;60495:173;;60730:23;;;;60495:31;;60181:22;;61495:25;60181:22;;61348:335;62009:1;61995:12;61991:20;61949:346;62050:3;62041:7;62038:16;61949:346;;62268:7;62258:8;62255:1;62228:25;62225:1;62222;62217:59;62103:1;62090:15;61949:346;;;61953:77;62328:8;62340:1;62328:13;62324:45;;62350:19;;-1:-1:-1;;;62350:19:0;;;;;;;;;;;62324:45;62386:13;:19;-1:-1:-1;80561:184:0;;;:::o;55860:407::-;56035:31;56048:4;56054:2;56058:7;56035:12;:31::i;:::-;-1:-1:-1;;;;;56081:14:0;;;:19;56077:183;;56120:56;56151:4;56157:2;56161:7;56170:5;56120:30;:56::i;:::-;56115:145;;56204:40;;-1:-1:-1;;;56204:40:0;;;;;;;;;;;24857:671;24934:13;24962:18;25079:17;25088:7;25079:8;:17::i;:::-;25226:3;25301:36;25321:14;25331:3;25321:9;:14::i;:::-;25301:13;:36::i;:::-;25011:356;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;24997:371;;25482:26;25502:4;25482:13;:26::i;:::-;25405:114;;;;;;;;:::i;:::-;;;;;;;;;;;;;25391:129;;;24857:671;;;;:::o;78507:593::-;78573:27;78617:2;78623:1;78617:7;78613:50;;-1:-1:-1;;78641:10:0;;;;;;;;;;;;-1:-1:-1;;;78641:10:0;;;;;78507:593::o;78613:50::-;78682:2;78673:6;78714:69;78721:6;;78714:69;;78744:5;;;;:::i;:::-;;-1:-1:-1;78764:7:0;;-1:-1:-1;78769:2:0;78764:7;;:::i;:::-;;;78714:69;;;78793:17;78823:3;78813:14;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;78813:14:0;-1:-1:-1;78793:34:0;-1:-1:-1;78847:3:0;78861:202;78868:7;;78861:202;;78896:5;78900:1;78896;:5;:::i;:::-;78892:9;-1:-1:-1;78916:10:0;78947:7;78952:2;78947;:7;:::i;:::-;78946:14;;78958:2;78946:14;:::i;:::-;78941:19;;:2;:19;:::i;:::-;78930:31;;:2;:31;:::i;:::-;78916:46;;78977:9;78996:4;78989:12;;78977:24;;79026:2;79016:4;79021:1;79016:7;;;;;;;;:::i;:::-;;;;:12;-1:-1:-1;;;;;79016:12:0;;;;;;;;-1:-1:-1;79043:8:0;79049:2;79043:8;;:::i;:::-;;;78877:186;;78861:202;;;-1:-1:-1;79087:4:0;78507:593;-1:-1:-1;;;;78507:593:0:o;58351:716::-;58535:88;;-1:-1:-1;;;58535:88:0;;58514:4;;-1:-1:-1;;;;;58535:45:0;;;;;:88;;72275:10;;58602:4;;58608:7;;58617:5;;58535:88;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;58535:88:0;;;;;;;;-1:-1:-1;;58535:88:0;;;;;;;;;;;;:::i;:::-;;;58531:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58818:6;:13;58835:1;58818:18;58814:235;;58864:40;;-1:-1:-1;;;58864:40:0;;;;;;;;;;;58814:235;59007:6;59001:13;58992:6;58988:2;58984:15;58977:38;58531:529;-1:-1:-1;;;;;;58694:64:0;-1:-1:-1;;;58694:64:0;;-1:-1:-1;58531:529:0;58351:716;;;;;;:::o;25536:593::-;25602:27;25646:2;25652:1;25646:7;25642:50;;-1:-1:-1;;25670:10:0;;;;;;;;;;;;-1:-1:-1;;;25670:10:0;;;;;25536:593::o;25642:50::-;25711:2;25702:6;25743:69;25750:6;;25743:69;;25773:5;;;;:::i;:::-;;-1:-1:-1;25793:7:0;;-1:-1:-1;25798:2:0;25793:7;;:::i;:::-;;;25743:69;;;25822:17;25852:3;25842:14;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;25842:14:0;-1:-1:-1;25822:34:0;-1:-1:-1;25876:3:0;25890:202;25897:7;;25890:202;;25925:5;25929:1;25925;:5;:::i;:::-;25921:9;-1:-1:-1;25945:10:0;25976:7;25981:2;25976;:7;:::i;:::-;25975:14;;25987:2;25975:14;:::i;:::-;25970:19;;:2;:19;:::i;:::-;25959:31;;:2;:31;:::i;:::-;25945:46;;26006:9;26025:4;26018:12;;26006:24;;26055:2;26045:4;26050:1;26045:7;;;;;;;;:::i;:::-;;;;:12;-1:-1:-1;;;;;26045:12:0;;;;;;;;-1:-1:-1;26072:8:0;26078:2;26072:8;;:::i;:::-;;;25906:186;;25890:202;;26137:3996;26198:17;26228:293;;;;;;;;;;;;;;;;;;;26562:3;26597;26545:56;;;;;;;;;:::i;:::-;;;;;;;;;;;;;26532:70;;26645:3;26628:3438;;;;;;;;:::i;:::-;;;;;;;;;;;;;26615:3452;;30120:3;30103:21;;;;;;;;:::i;:::-;;;;;;;;;;;;;30089:36;;26137:3996;;;:::o;74430:3097::-;74488:13;74725:4;:11;74740:1;74725:16;74721:31;;-1:-1:-1;;74743:9:0;;;;;;;;;-1:-1:-1;74743:9:0;;;74430:3097::o;74721:31::-;74805:19;74827:6;;;;;;;;;;;;;;;;;74805:28;;75244:20;75303:1;75284:4;:11;75298:1;75284:15;;;;:::i;:::-;75283:21;;;;:::i;:::-;75278:27;;:1;:27;:::i;:::-;75267:39;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;75267:39:0;;75244:62;;75486:1;75479:5;75475:13;75590:2;75582:6;75578:15;75701:4;75753;75747:11;75741:4;75737:22;75663:1432;75787:6;75778:7;75775:19;75663:1432;;;75893:1;75884:7;75880:15;75869:26;;75932:7;75926:14;76585:4;76577:5;76573:2;76569:14;76565:25;76555:8;76551:40;76545:47;76534:9;76526:67;76639:1;76628:9;76624:17;76611:30;;76731:4;76723:5;76719:2;76715:14;76711:25;76701:8;76697:40;76691:47;76680:9;76672:67;76785:1;76774:9;76770:17;76757:30;;76876:4;76868:5;76865:1;76861:13;76857:24;76847:8;76843:39;76837:46;76826:9;76818:66;76930:1;76919:9;76915:17;76902:30;;77013:4;77006:5;77002:16;76992:8;76988:31;76982:38;76971:9;76963:58;;77067:1;77056:9;77052:17;77039:30;;75663:1432;;;75667:107;;77257:1;77250:4;77244:11;77240:19;77278:1;77273:123;;;;77415:1;77410:73;;;;77233:250;;77273:123;77326:4;77322:1;77311:9;77307:17;77299:32;77376:4;77372:1;77361:9;77357:17;77349:32;77273:123;;77410:73;77463:4;77459:1;77448:9;77444:17;77436:32;77233:250;-1:-1:-1;77513:6:0;;74430:3097;-1:-1:-1;;;;;74430:3097:0:o;14:131:1:-;-1:-1:-1;;;;;;88:32:1;;78:43;;68:71;;135:1;132;125:12;150:245;208:6;261:2;249:9;240:7;236:23;232:32;229:52;;;277:1;274;267:12;229:52;316:9;303:23;335:30;359:5;335:30;:::i;592:250::-;677:1;687:113;701:6;698:1;695:13;687:113;;;777:11;;;771:18;758:11;;;751:39;723:2;716:10;687:113;;;-1:-1:-1;;834:1:1;816:16;;809:27;592:250::o;847:271::-;889:3;927:5;921:12;954:6;949:3;942:19;970:76;1039:6;1032:4;1027:3;1023:14;1016:4;1009:5;1005:16;970:76;:::i;:::-;1100:2;1079:15;-1:-1:-1;;1075:29:1;1066:39;;;;1107:4;1062:50;;847:271;-1:-1:-1;;847:271:1:o;1123:220::-;1272:2;1261:9;1254:21;1235:4;1292:45;1333:2;1322:9;1318:18;1310:6;1292:45;:::i;1348:180::-;1407:6;1460:2;1448:9;1439:7;1435:23;1431:32;1428:52;;;1476:1;1473;1466:12;1428:52;-1:-1:-1;1499:23:1;;1348:180;-1:-1:-1;1348:180:1:o;1741:173::-;1809:20;;-1:-1:-1;;;;;1858:31:1;;1848:42;;1838:70;;1904:1;1901;1894:12;1838:70;1741:173;;;:::o;1919:254::-;1987:6;1995;2048:2;2036:9;2027:7;2023:23;2019:32;2016:52;;;2064:1;2061;2054:12;2016:52;2087:29;2106:9;2087:29;:::i;:::-;2077:39;2163:2;2148:18;;;;2135:32;;-1:-1:-1;;;1919:254:1:o;2360:328::-;2437:6;2445;2453;2506:2;2494:9;2485:7;2481:23;2477:32;2474:52;;;2522:1;2519;2512:12;2474:52;2545:29;2564:9;2545:29;:::i;:::-;2535:39;;2593:38;2627:2;2616:9;2612:18;2593:38;:::i;:::-;2583:48;;2678:2;2667:9;2663:18;2650:32;2640:42;;2360:328;;;;;:::o;2693:186::-;2752:6;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;2884:127::-;2945:10;2940:3;2936:20;2933:1;2926:31;2976:4;2973:1;2966:15;3000:4;2997:1;2990:15;3016:632;3081:5;3111:18;3152:2;3144:6;3141:14;3138:40;;;3158:18;;:::i;:::-;3233:2;3227:9;3201:2;3287:15;;-1:-1:-1;;3283:24:1;;;3309:2;3279:33;3275:42;3263:55;;;3333:18;;;3353:22;;;3330:46;3327:72;;;3379:18;;:::i;:::-;3419:10;3415:2;3408:22;3448:6;3439:15;;3478:6;3470;3463:22;3518:3;3509:6;3504:3;3500:16;3497:25;3494:45;;;3535:1;3532;3525:12;3494:45;3585:6;3580:3;3573:4;3565:6;3561:17;3548:44;3640:1;3633:4;3624:6;3616;3612:19;3608:30;3601:41;;;;3016:632;;;;;:::o;3653:451::-;3722:6;3775:2;3763:9;3754:7;3750:23;3746:32;3743:52;;;3791:1;3788;3781:12;3743:52;3831:9;3818:23;3864:18;3856:6;3853:30;3850:50;;;3896:1;3893;3886:12;3850:50;3919:22;;3972:4;3964:13;;3960:27;-1:-1:-1;3950:55:1;;4001:1;3998;3991:12;3950:55;4024:74;4090:7;4085:2;4072:16;4067:2;4063;4059:11;4024:74;:::i;4109:118::-;4195:5;4188:13;4181:21;4174:5;4171:32;4161:60;;4217:1;4214;4207:12;4232:315;4297:6;4305;4358:2;4346:9;4337:7;4333:23;4329:32;4326:52;;;4374:1;4371;4364:12;4326:52;4397:29;4416:9;4397:29;:::i;:::-;4387:39;;4476:2;4465:9;4461:18;4448:32;4489:28;4511:5;4489:28;:::i;:::-;4536:5;4526:15;;;4232:315;;;;;:::o;4552:667::-;4647:6;4655;4663;4671;4724:3;4712:9;4703:7;4699:23;4695:33;4692:53;;;4741:1;4738;4731:12;4692:53;4764:29;4783:9;4764:29;:::i;:::-;4754:39;;4812:38;4846:2;4835:9;4831:18;4812:38;:::i;:::-;4802:48;;4897:2;4886:9;4882:18;4869:32;4859:42;;4952:2;4941:9;4937:18;4924:32;4979:18;4971:6;4968:30;4965:50;;;5011:1;5008;5001:12;4965:50;5034:22;;5087:4;5079:13;;5075:27;-1:-1:-1;5065:55:1;;5116:1;5113;5106:12;5065:55;5139:74;5205:7;5200:2;5187:16;5182:2;5178;5174:11;5139:74;:::i;:::-;5129:84;;;4552:667;;;;;;;:::o;5224:127::-;5285:10;5280:3;5276:20;5273:1;5266:31;5316:4;5313:1;5306:15;5340:4;5337:1;5330:15;5356:337;5497:2;5482:18;;5530:1;5519:13;;5509:144;;5575:10;5570:3;5566:20;5563:1;5556:31;5610:4;5607:1;5600:15;5638:4;5635:1;5628:15;5509:144;5662:25;;;5356:337;:::o;5698:260::-;5766:6;5774;5827:2;5815:9;5806:7;5802:23;5798:32;5795:52;;;5843:1;5840;5833:12;5795:52;5866:29;5885:9;5866:29;:::i;:::-;5856:39;;5914:38;5948:2;5937:9;5933:18;5914:38;:::i;:::-;5904:48;;5698:260;;;;;:::o;5963:380::-;6042:1;6038:12;;;;6085;;;6106:61;;6160:4;6152:6;6148:17;6138:27;;6106:61;6213:2;6205:6;6202:14;6182:18;6179:38;6176:161;;6259:10;6254:3;6250:20;6247:1;6240:31;6294:4;6291:1;6284:15;6322:4;6319:1;6312:15;6176:161;;5963:380;;;:::o;6657:245::-;6724:6;6777:2;6765:9;6756:7;6752:23;6748:32;6745:52;;;6793:1;6790;6783:12;6745:52;6825:9;6819:16;6844:28;6866:5;6844:28;:::i;6907:127::-;6968:10;6963:3;6959:20;6956:1;6949:31;6999:4;6996:1;6989:15;7023:4;7020:1;7013:15;7039:125;7104:9;;;7125:10;;;7122:36;;;7138:18;;:::i;7169:135::-;7208:3;7229:17;;;7226:43;;7249:18;;:::i;:::-;-1:-1:-1;7296:1:1;7285:13;;7169:135::o;7309:128::-;7376:9;;;7397:11;;;7394:37;;;7411:18;;:::i;7442:127::-;7503:10;7498:3;7494:20;7491:1;7484:31;7534:4;7531:1;7524:15;7558:4;7555:1;7548:15;7574:422;7663:1;7706:5;7663:1;7720:270;7741:7;7731:8;7728:21;7720:270;;;7800:4;7796:1;7792:6;7788:17;7782:4;7779:27;7776:53;;;7809:18;;:::i;:::-;7859:7;7849:8;7845:22;7842:55;;;7879:16;;;;7842:55;7958:22;;;;7918:15;;;;7720:270;;;7724:3;7574:422;;;;;:::o;8001:806::-;8050:5;8080:8;8070:80;;-1:-1:-1;8121:1:1;8135:5;;8070:80;8169:4;8159:76;;-1:-1:-1;8206:1:1;8220:5;;8159:76;8251:4;8269:1;8264:59;;;;8337:1;8332:130;;;;8244:218;;8264:59;8294:1;8285:10;;8308:5;;;8332:130;8369:3;8359:8;8356:17;8353:43;;;8376:18;;:::i;:::-;-1:-1:-1;;8432:1:1;8418:16;;8447:5;;8244:218;;8546:2;8536:8;8533:16;8527:3;8521:4;8518:13;8514:36;8508:2;8498:8;8495:16;8490:2;8484:4;8481:12;8477:35;8474:77;8471:159;;;-1:-1:-1;8583:19:1;;;8615:5;;8471:159;8662:34;8687:8;8681:4;8662:34;:::i;:::-;8732:6;8728:1;8724:6;8720:19;8711:7;8708:32;8705:58;;;8743:18;;:::i;:::-;8781:20;;8001:806;-1:-1:-1;;;8001:806:1:o;8812:131::-;8872:5;8901:36;8928:8;8922:4;8901:36;:::i;8948:168::-;9021:9;;;9052;;9069:15;;;9063:22;;9049:37;9039:71;;9090:18;;:::i;11640:127::-;11701:10;11696:3;11692:20;11689:1;11682:31;11732:4;11729:1;11722:15;11756:4;11753:1;11746:15;11772:112;11804:1;11830;11820:35;;11835:18;;:::i;:::-;-1:-1:-1;11869:9:1;;11772:112::o;12015:545::-;12117:2;12112:3;12109:11;12106:448;;;12153:1;12178:5;12174:2;12167:17;12223:4;12219:2;12209:19;12293:2;12281:10;12277:19;12274:1;12270:27;12264:4;12260:38;12329:4;12317:10;12314:20;12311:47;;;-1:-1:-1;12352:4:1;12311:47;12407:2;12402:3;12398:12;12395:1;12391:20;12385:4;12381:31;12371:41;;12462:82;12480:2;12473:5;12470:13;12462:82;;;12525:17;;;12506:1;12495:13;12462:82;;12736:1352;12862:3;12856:10;12889:18;12881:6;12878:30;12875:56;;;12911:18;;:::i;:::-;12940:97;13030:6;12990:38;13022:4;13016:11;12990:38;:::i;:::-;12984:4;12940:97;:::i;:::-;13092:4;;13156:2;13145:14;;13173:1;13168:663;;;;13875:1;13892:6;13889:89;;;-1:-1:-1;13944:19:1;;;13938:26;13889:89;-1:-1:-1;;12693:1:1;12689:11;;;12685:24;12681:29;12671:40;12717:1;12713:11;;;12668:57;13991:81;;13138:944;;13168:663;11962:1;11955:14;;;11999:4;11986:18;;-1:-1:-1;;13204:20:1;;;13322:236;13336:7;13333:1;13330:14;13322:236;;;13425:19;;;13419:26;13404:42;;13517:27;;;;13485:1;13473:14;;;;13352:19;;13322:236;;;13326:3;13586:6;13577:7;13574:19;13571:201;;;13647:19;;;13641:26;-1:-1:-1;;13730:1:1;13726:14;;;13742:3;13722:24;13718:37;13714:42;13699:58;13684:74;;13571:201;-1:-1:-1;;;;;13818:1:1;13802:14;;;13798:22;13785:36;;-1:-1:-1;12736:1352:1:o;14093:1728::-;-1:-1:-1;;;14742:64:1;;14829:13;;14724:3;;14851:75;14829:13;14914:2;14905:12;;14898:4;14886:17;;14851:75;:::i;:::-;14990:66;14985:2;14945:16;;;14977:11;;;14970:87;15086:66;15081:2;15073:11;;15066:87;15182:66;15177:2;15169:11;;15162:87;-1:-1:-1;;;15273:3:1;15265:12;;15258:26;15309:13;;15331:77;15309:13;15393:3;15385:12;;15378:4;15366:17;;15331:77;:::i;:::-;15474:66;15468:3;15427:17;;;;15460:12;;;15453:88;-1:-1:-1;;;15565:3:1;15557:12;;15550:32;15607:13;;15629:77;15607:13;15691:3;15683:12;;15676:4;15664:17;;15629:77;:::i;:::-;-1:-1:-1;;;15766:3:1;15725:17;;;;15758:12;;;15751:36;15811:3;15803:12;;14093:1728;-1:-1:-1;;;;;14093:1728:1:o;15826:461::-;16088:31;16083:3;16076:44;16058:3;16149:6;16143:13;16165:75;16233:6;16228:2;16223:3;16219:12;16212:4;16204:6;16200:17;16165:75;:::i;:::-;16260:16;;;;16278:2;16256:25;;15826:461;-1:-1:-1;;15826:461:1:o;16292:120::-;16332:1;16358;16348:35;;16363:18;;:::i;:::-;-1:-1:-1;16397:9:1;;16292:120::o;16417:148::-;16505:4;16484:12;;;16498;;;16480:31;;16523:13;;16520:39;;;16539:18;;:::i;16570:489::-;-1:-1:-1;;;;;16839:15:1;;;16821:34;;16891:15;;16886:2;16871:18;;16864:43;16938:2;16923:18;;16916:34;;;16986:3;16981:2;16966:18;;16959:31;;;16764:4;;17007:46;;17033:19;;17025:6;17007:46;:::i;:::-;16999:54;16570:489;-1:-1:-1;;;;;;16570:489:1:o;17064:249::-;17133:6;17186:2;17174:9;17165:7;17161:23;17157:32;17154:52;;;17202:1;17199;17192:12;17154:52;17234:9;17228:16;17253:30;17277:5;17253:30;:::i;17318:668::-;17598:3;17636:6;17630:13;17652:66;17711:6;17706:3;17699:4;17691:6;17687:17;17652:66;:::i;:::-;17779:29;17740:16;;;17765:44;;;17834:13;;17856:79;17834:13;17921:2;17910:14;;17903:4;17891:17;;17856:79;:::i;:::-;17955:20;17977:2;17951:29;;17318:668;-1:-1:-1;;;;17318:668:1:o;17991:9709::-;18223:3;18261:6;18255:13;18277:66;18336:6;18331:3;18324:4;18316:6;18312:17;18277:66;:::i;:::-;18404:34;18365:16;;18390:49;;;-1:-1:-1;18473:34:1;18466:4;18455:16;;18448:60;18540:34;18535:2;18524:14;;18517:58;18607:34;18602:2;18591:14;;18584:58;18675:34;18669:3;18658:15;;18651:59;18743:34;18737:3;18726:15;;18719:59;18811:34;18805:3;18794:15;;18787:59;18879:34;18873:3;18862:15;;18855:59;18947:34;18941:3;18930:15;;18923:59;19015:34;19009:3;18998:15;;18991:59;19083:34;19077:3;19066:15;;19059:59;19151:34;19145:3;19134:15;;19127:59;19219:34;19213:3;19202:15;;19195:59;19287:34;19281:3;19270:15;;19263:59;19355:34;19349:3;19338:15;;19331:59;19423:34;19417:3;19406:15;;19399:59;19491:34;19485:3;19474:15;;19467:59;19559:34;19553:3;19542:15;;19535:59;19627:34;19621:3;19610:15;;19603:59;19695:34;19689:3;19678:15;;19671:59;19763:34;19757:3;19746:15;;19739:59;19831:34;19825:3;19814:15;;19807:59;19899:34;19893:3;19882:15;;19875:59;19967:34;19961:3;19950:15;;19943:59;20035:34;20029:3;20018:15;;20011:59;20103:66;20097:3;20086:15;;20079:91;20203:66;20197:3;20186:15;;20179:91;20303:66;20297:3;20286:15;;20279:91;20403:66;20397:3;20386:15;;20379:91;20503:66;20497:3;20486:15;;20479:91;20603:66;20597:3;20586:15;;20579:91;20703:66;20697:3;20686:15;;20679:91;20804:66;20797:4;20786:16;;20779:92;20905:66;20898:4;20887:16;;20880:92;21006:66;20999:4;20988:16;;20981:92;21107:34;21100:4;21089:16;;21082:60;21176:66;21169:4;21158:16;;21151:92;21277:66;21270:4;21259:16;;21252:92;21378:66;21371:4;21360:16;;21353:92;21479:66;21472:4;21461:16;;21454:92;21580:66;21573:4;21562:16;;21555:92;21681:66;21674:4;21663:16;;21656:92;21782:66;21775:4;21764:16;;21757:92;21883:66;21876:4;21865:16;;21858:92;21984:66;21977:4;21966:16;;21959:92;22085:66;22078:4;22067:16;;22060:92;22186:66;22179:4;22168:16;;22161:92;22287:66;22280:4;22269:16;;22262:92;22388:34;22381:4;22370:16;;22363:60;22457:66;22450:4;22439:16;;22432:92;22558:66;22551:4;22540:16;;22533:92;22659:66;22652:4;22641:16;;22634:92;22760:66;22753:4;22742:16;;22735:92;22861:66;22854:4;22843:16;;22836:92;22962:66;22955:4;22944:16;;22937:92;23063:66;23056:4;23045:16;;23038:92;23164:66;23157:4;23146:16;;23139:92;23265:66;23258:4;23247:16;;23240:92;23366:66;23359:4;23348:16;;23341:92;23467:66;23460:4;23449:16;;23442:92;23568:66;23561:4;23550:16;;23543:92;23669:66;23662:4;23651:16;;23644:92;23770:66;23763:4;23752:16;;23745:92;23871:66;23864:4;23853:16;;23846:92;23972:66;23965:4;23954:16;;23947:92;24073:66;24066:4;24055:16;;24048:92;24174:66;24167:4;24156:16;;24149:92;24275:66;24268:4;24257:16;;24250:92;24376:66;24369:4;24358:16;;24351:92;24477:34;24470:4;24459:16;;24452:60;24546:66;24539:4;24528:16;;24521:92;24647:66;24640:4;24629:16;;24622:92;24748:66;24741:4;24730:16;;24723:92;24849:66;24842:4;24831:16;;24824:92;24950:66;24943:4;24932:16;;24925:92;25051:66;25044:4;25033:16;;25026:92;25152:34;25145:4;25134:16;;25127:60;25221:34;25214:4;25203:16;;25196:60;25290:34;25283:4;25272:16;;25265:60;25359:66;25352:4;25341:16;;25334:92;25460:66;25453:4;25442:16;;25435:92;25561:66;25554:4;25543:16;;25536:92;25662:66;25655:4;25644:16;;25637:92;25763:66;25756:4;25745:16;;25738:92;25864:34;25857:4;25846:16;;25839:60;25933:34;25926:4;25915:16;;25908:60;26002:66;25995:4;25984:16;;25977:92;26103:66;26096:4;26085:16;;26078:92;26204:34;26197:4;26186:16;;26179:60;26273:34;26266:4;26255:16;;26248:60;26342:66;26335:4;26324:16;;26317:92;26443:66;26436:4;26425:16;;26418:92;26544:34;26537:4;26526:16;;26519:60;26613:34;26606:4;26595:16;;26588:60;26682:66;26675:4;26664:16;;26657:92;26783:66;26776:4;26765:16;;26758:92;26884:34;26877:4;26866:16;;26859:60;26953:34;26946:4;26935:16;;26928:60;27022:34;27015:4;27004:16;;26997:60;27091:66;27084:4;27073:16;;27066:92;27192:34;27185:4;27174:16;;27167:60;27261:34;27254:4;27243:16;;27236:60;27330:34;27323:4;27312:16;;27305:60;27399:34;27392:4;27381:16;;27374:60;27468:34;27461:4;27450:16;;27443:60;27537:34;27530:4;27519:16;;27512:60;-1:-1:-1;;;27599:4:1;27588:16;;27581:81;27689:4;27678:16;;17991:9709;-1:-1:-1;17991:9709:1:o;27705:289::-;27836:3;27874:6;27868:13;27890:66;27949:6;27944:3;27937:4;27929:6;27925:17;27890:66;:::i;:::-;27972:16;;;;;27705:289;-1:-1:-1;;27705:289:1:o

Swarm Source

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