ETH Price: $3,383.26 (+4.58%)
Gas: 4 Gwei

Token

Palettes (Palettes)
 

Overview

Max Total Supply

1,223 Palettes

Holders

107

Total Transfers

-

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
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:
Palettes

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-01
*/

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

    function boolToString(bool _b) public pure returns (string memory) {
            if (_b) {
                return '"True"';
            } else {
                return '"False"';
            }
    }
    // TODO -- Change metadata if blob - implement hue value - implement burned - implement type (palette or blob)
    function getMetadata(uint tokenId, string memory hue, bool isBurned, bool isBlob) internal pure returns (string memory) {

        string memory json;

            json = string(abi.encodePacked(
            '{"name": "Palettes ',
            uint2str(tokenId),
            '", "description": "Nous vivons tous dans des couleurs differentes.", "attributes":[{"trait_type": "HUE", "value": ',
            hue,
            '},{"trait_type": "Burned", "value": ', boolToString(isBurned),'},{"trait_type": "Blob", "value": ', boolToString(isBlob),'}], "image": "data:image/svg+xml;base64,',
            Base64.encode(bytes(renderSvg(hue, isBurned, isBlob))),
            '"}'
        ));
        

        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 getRandom(string memory hue) public pure returns (string memory) {
        uint256 randomNumber = uint256(keccak256(abi.encodePacked(hue)));
        uint256 index = randomNumber % 4; // Generate a random index from 0 to 3
        uint16[4] memory possibleValues = [0, 90, 180, 270];
        return uint2str(possibleValues[index]);
    }

    function renderSvg(string memory hue, bool isBurned, bool isBlob) internal pure returns (string memory svg) {
        svg = '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 601 601" class="rotated" style="background-color:black; overflow: hidden;">';
        svg = string(abi.encodePacked(svg,'<defs><style> :root{--hue: ', hue));

        if(!isBlob){
            if(!isBurned){
                svg = string(abi.encodePacked(svg,'; --hueComplement: calc(var(--hue) + 180); --hueRightAnalogous: calc(var(--hue) + 30); --hueLeftAnalogous: calc(var(--hue) - 30); --hueRightAnalogous2: calc(var(--hue) + 60); --hueLeftAnalogous2: calc(var(--hue) - 60); --hueRightAnalogous3: calc(var(--hue) + 80); --hueLeftAnalogous3: calc(var(--hue) - 80); --accentV1: hsl(var(--hueRightAnalogous) 50% 50%); --accentV2: hsl(var(--hueLeftAnalogous) 50% 50%); --accentV3: hsl(var(--hueRightAnalogous2) 50% 50%); --accentV4: hsl(var(--hueLeftAnalogous2) 50% 50%); --accentV5: hsl(var(--hueRightAnalogous3) 50% 50%); } .cls-2{fill: var(--accentV1);} .cls-3{fill: var(--accentV2);} .cls-4{fill: var(--accentV3);} .cls-5{fill: var(--accentV4);} .cls-6{fill: var(--accentV5);} ')); 
            } else {
                svg = string(abi.encodePacked(svg,';} .cls-2{fill: gray; opacity: 0.33; } .cls-3{fill: gray; opacity: 0.53; } .cls-4{fill: gray; opacity: 0.73;  } .cls-5{fill: gray; opacity: 0.40;  } .cls-6{fill: gray; opacity: 0.63; } ')); 
            }
            svg = string(abi.encodePacked(svg, '.rotated{ transform: rotate(',getRandom(hue) , 'deg);}'));
            svg = string(abi.encodePacked(svg, ' </style> </defs> ', ' <g id="Calque_2" data-name="Calque 2"> <rect class="cls-1" x="0.5" y="0.5" width="600" height="600" /> </g> <g id="Calque_1" data-name="Calque 1"> <rect class="cls-2" x="60.36" y="60.38" width="73.26" height="73.26" /> <rect class="cls-3" x="141.76" y="60.38" width="73.26" height="73.26" /> <rect class="cls-4" x="223.16" y="60.38" width="73.26" height="73.26" /> <rect class="cls-5" x="304.56" y="60.38" width="73.26" height="73.26" /> <rect class="cls-2" x="385.95" y="60.38" width="73.26" height="73.26" /> <rect class="cls-6" x="467.35" y="60.38" width="73.26" height="73.26" /> <rect class="cls-3" x="60.39" y="141.78" width="73.26" height="73.26" /> <rect class="cls-5" x="141.79" y="141.78" width="73.26" height="73.26" /> <rect class="cls-6" x="223.19" y="141.78" width="73.26" height="73.26" /> <rect class="cls-2" x="304.58" y="141.78" width="73.26" height="73.26" /> <rect class="cls-3" x="385.98" y="141.78" width="73.26" height="73.26" /> <rect class="cls-2" x="467.38" y="141.78" width="73.26" height="73.26" /> <rect class="cls-6" x="60.38" y="223.17" width="73.26" height="73.26" /> <rect class="cls-4" x="141.78" y="223.17" width="73.26" height="73.26" /> <rect class="cls-2" x="223.17" y="223.17" width="73.26" height="73.26" /> <rect class="cls-4" x="304.57" y="223.17" width="73.26" height="73.26" /> <rect class="cls-5" x="385.97" y="223.17" width="73.26" height="73.26" /> <rect class="cls-3" x="467.36" y="223.17" width="73.26" height="73.26" /> <rect class="cls-6" x="60.41" y="304.56" width="73.26" height="73.26" /> <rect class="cls-5" x="141.8" y="304.56" width="73.26" height="73.26" /> <rect class="cls-4" x="223.2" y="304.56" width="73.26" height="73.26" /> <rect class="cls-5" x="304.6" y="304.56" width="73.26" height="73.26" /> <rect class="cls-6" x="385.99" y="304.56" width="73.26" height="73.26" /> <rect class="cls-2" x="467.39" y="304.56" width="73.26" height="73.26" /> <rect class="cls-4" x="60.35" y="385.96" width="73.26" height="73.26" /> <rect class="cls-3" x="141.75" y="385.96" width="73.26" height="73.26" /> <rect class="cls-6" x="223.14" y="385.96" width="73.26" height="73.26" /> <rect class="cls-4" x="304.54" y="385.96" width="73.26" height="73.26" /> <rect class="cls-5" x="385.94" y="385.96" width="73.26" height="73.26" /> <rect class="cls-3" x="467.34" y="385.96" width="73.26" height="73.26" /> <rect class="cls-4" x="60.38" y="467.36" width="73.26" height="73.26" /> <rect class="cls-6" x="141.78" y="467.36" width="73.26" height="73.26" /> <rect class="cls-5" x="223.17" y="467.36" width="73.26" height="73.26" /> <rect class="cls-3" x="304.57" y="467.36" width="73.26" height="73.26" /> <rect class="cls-6" x="385.97" y="467.36" width="73.26" height="73.26" /> <rect class="cls-5" x="467.36" y="467.36" width="73.26" height="73.26" /> </g> </svg>'));
        } else{
            // Is a blob
            svg = string(abi.encodePacked(svg,'; --hueComplement: calc(var(--hue) + 180); --accentV1: hsl(var(--hue) 50% 50%); --accentV2: hsl(var(--hueComplement) 50% 50%); --scaleFactor: calc(0.5 + var(--hue) / 100); } svg { transform-origin: 50% 50%; animation: move 36s linear infinite; } @keyframes move { 0% { transform: scale(1) rotate(0); } 100% { transform: scale(1) rotate(360deg); } } </style> <linearGradient id="sw-gradient" x1="0" x2="1" y1="1" y2="0"> <stop id="stop1" stop-color="var(--accentV1)" offset="0%"/> <stop id="stop2" stop-color="var(--accentV2)" offset="100%"/> </linearGradient> </defs> <filter id="shadow" transform="rotate(var(--hue))"> <feDropShadow dx="0" dy="0" stdDeviation="20" flood-color="gray"/> </filter> <path fill="url(#sw-gradient)" filter="url(#shadow)"> <animate attributeName="d" dur="36s" repeatCount="indefinite" values="M431.3 121.9c22 40.1 11.3 97.5 13.3 146.9 2 49.5 16.6 91.1 4.3 121.8-12.2 30.6-51.3 50.4-88.5 55.1-37.1 4.7-72.4-5.7-108.8-17.1-36.5-11.3-74.1-23.7-104-52-29.9-28.2-52-72.4-48.4-115.4 3.5-43 32.7-84.8 70.5-122.2 37.7-37.3 84-70.2 134.5-75.1 50.4-5 105.1 17.9 127.1 58z; M404.4 176.7c20.9 16.4 20.8 58.8 38.8 106.2 18.1 47.4 54.4 99.7 40.9 123.6-13.5 23.9-76.7 19.3-131.6 40.4-54.8 21-101.2 67.7-150.5 71.7-49.4 4.1-101.7-34.5-107.8-81.9C88 389.2 128 333 144.2 278c16.2-55.1 8.5-108.8 30.5-125 22-16.1 73.7 5.5 120.4 11.3 46.7 5.9 88.5-3.9 109.3 12.4z; M431.3 121.9c22 40.1 11.3 97.5 13.3 146.9 2 49.5 16.6 91.1 4.3 121.8-12.2 30.6-51.3 50.4-88.5 55.1-37.1 4.7-72.4-5.7-108.8-17.1-36.5-11.3-74.1-23.7-104-52-29.9-28.2-52-72.4-48.4-115.4 3.5-43 32.7-84.8 70.5-122.2 37.7-37.3 84-70.2 134.5-75.1 50.4-5 105.1 17.9 127.1 58z; "/> </path> </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;
    }
}

interface IERC721AQueryable is IERC721A {
    function tokensOfOwner(address owner) external view returns (uint256[] memory);
}

abstract contract ERC721AQueryable is ERC721A, IERC721AQueryable {
    function tokensOfOwner(address owner) external view virtual override returns (uint256[] memory) {
        unchecked {
            uint256 tokenIdsIdx;
            address currOwnershipAddr;
            uint256 tokenIdsLength = balanceOf(owner);
            uint256[] memory tokenIds = new uint256[](tokenIdsLength);
            TokenOwnership memory ownership;
            for (uint256 i = _startTokenId(); tokenIdsIdx != tokenIdsLength; ++i) {
                ownership = _ownershipAt(i);
                if (ownership.burned) {
                    continue;
                }
                if (ownership.addr != address(0)) {
                    currOwnershipAddr = ownership.addr;
                }
                if (currOwnershipAddr == owner) {
                    tokenIds[tokenIdsIdx++] = i;
                }
            }
            return tokenIds;
        }
    }
}

/// @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 Palettes is ERC721A, Ownable, DefaultOperatorFilterer, ERC721AQueryable, IERC4906 {

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

    uint public maxTxFree = 20;

    enum Step {
        Before,
        PublicSale
    }

    Step public sellingStep;
    
    uint public price = 0.003 ether;

    function mintForOwner() public onlyOwner{
        _mint(msg.sender, 1);
    }

    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);
    }

    // Get a pseudo random number
    function random(uint input, uint min, uint max) internal pure returns (uint) {
        uint randRange = max - min;
        return max - (uint(keccak256(abi.encodePacked(input + 2023))) % randRange) - 1;
    }

    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{
        maxTxFree = 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;
    }

    // Will burn two nfts to create a new blob
    function createBlob(uint _ID1, uint _ID2) public {
        // Check if sender has the two IDs
        require(msg.sender == ownerOf(_ID1) && msg.sender == ownerOf(_ID2), "Sender does not own both NFTs");
        
        // Check if both are not burned
        require(!isBurned[_ID1] && !isBurned[_ID2], "Both NFTs have already been burned");
        
        // Check if both are not blobs
        require(!isBlob[_ID1] && !isBlob[_ID2], "Both NFTs are already blobs");

        // Calculate the hue value for the new blob

        uint hue1 = str2num(hueValues[_ID1]);
        uint hue2 = str2num(hueValues[_ID2]);
        uint newHue = (hue1 + hue2) / 2;
        string memory hueString = uint2str(newHue);

        // Mark both NFTs as burned
        isBurned[_ID1] = true;
        isBurned[_ID2] = true;

        // Mark the new NFT as a blob in the mapping
        isBlob[_nextTokenId()] = true;
        hueValues[_nextTokenId()] = hueString;

        // Mint a new NFT representing the blob
        _mint(msg.sender, 1);
        emit MetadataUpdate(_ID1);
        emit MetadataUpdate(_ID2);
    }

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

    function mint(uint quantity) public payable {
        if(sellingStep != Step.PublicSale) revert("Public Mint not live.");
        if(totalSupply() > 1000){
            require(msg.value >= quantity * price, "not enough eth");
        } else {
            require(quantity <= maxTxFree, "Max exceeded free per tx");
        }
        require(tx.origin == msg.sender, "Not the same caller");
        for (uint i = 0; i < quantity; i++) {
            createNFT(_nextTokenId()); // init values
            _mint(msg.sender, 1);
        }
    }

    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 currentState() external view returns (Step, uint) {
        return (sellingStep, price);
    }

    function changePrice(uint256 new_price) external onlyOwner{
        price = new_price;
    }

    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], isBurned[tokenId], isBlob[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":[{"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":"new_price","type":"uint256"}],"name":"changePrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_ID1","type":"uint256"},{"internalType":"uint256","name":"_ID2","type":"uint256"}],"name":"createBlob","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"currentState","outputs":[{"internalType":"enum Palettes.Step","name":"","type":"uint8"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"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":"maxTxFree","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"mintForOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"price","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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 Palettes.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":[{"internalType":"address","name":"owner","type":"address"}],"name":"tokensOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"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"}]

60806040526014600c55660aa87bee538000600e553480156200002157600080fd5b50733cc6cdda760b79bafa08df41ecfa224f810dceb660016040518060400160405280600881526020016750616c657474657360c01b8152506040518060400160405280600881526020016750616c657474657360c01b81525081600290816200008c9190620002f2565b5060036200009b8282620002f2565b5050600160005550620000ae33620001fb565b6daaeb6d7670e522a718067333cd4e3b15620001f35780156200014157604051633e9f1edf60e11b81523060048201526001600160a01b03831660248201526daaeb6d7670e522a718067333cd4e90637d3e3dbe906044015b600060405180830381600087803b1580156200012257600080fd5b505af115801562000137573d6000803e3d6000fd5b50505050620001f3565b6001600160a01b03821615620001925760405163a0af290360e01b81523060048201526001600160a01b03831660248201526daaeb6d7670e522a718067333cd4e9063a0af29039060440162000107565b604051632210724360e11b81523060048201526daaeb6d7670e522a718067333cd4e90634420e48690602401600060405180830381600087803b158015620001d957600080fd5b505af1158015620001ee573d6000803e3d6000fd5b505050505b5050620003be565b600880546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b634e487b7160e01b600052604160045260246000fd5b600181811c908216806200027857607f821691505b6020821081036200029957634e487b7160e01b600052602260045260246000fd5b50919050565b601f821115620002ed57600081815260208120601f850160051c81016020861015620002c85750805b601f850160051c820191505b81811015620002e957828155600101620002d4565b5050505b505050565b81516001600160401b038111156200030e576200030e6200024d565b62000326816200031f845462000263565b846200029f565b602080601f8311600181146200035e5760008415620003455750858301515b600019600386901b1c1916600185901b178555620002e9565b600085815260208120601f198616915b828110156200038f578886015182559484019460019091019084016200036e565b5085821015620003ae5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b61455d80620003ce6000396000f3fe6080604052600436106101ee5760003560e01c80638da5cb5b1161010d578063af4e39ca116100a0578063db44fe071161006f578063db44fe0714610558578063e985e9c514610588578063f2fde38b146105a8578063f8dcbddb146105c8578063fb1a0e83146105e857600080fd5b8063af4e39ca146104de578063b88d4fde146104fe578063c87b56dd14610511578063cbccefb21461053157600080fd5b8063a0712d68116100dc578063a0712d681461046b578063a22cb4651461047e578063a2b40d191461049e578063af351ba8146104be57600080fd5b80638da5cb5b1461040257806395d89b41146104205780639aeecf1b14610435578063a035b1fe1461045557600080fd5b806342842e0e1161018557806370a082311161015457806370a082311461038b578063715018a6146103ab5780638462151c146103c0578063865540e2146103ed57600080fd5b806342842e0e14610312578063503ec933146103255780635c4191351461033b5780636352211e1461036b57600080fd5b80630c3f6acf116101c15780630c3f6acf1461029757806318160ddd146102c357806323b872dd146102ea5780633ccfd60b146102fd57600080fd5b806301ffc9a7146101f357806306fdde0314610228578063081812fc1461024a578063095ea7b314610282575b600080fd5b3480156101ff57600080fd5b5061021361020e3660046120db565b610608565b60405190151581526020015b60405180910390f35b34801561023457600080fd5b5061023d61065a565b60405161021f9190612148565b34801561025657600080fd5b5061026a61026536600461215b565b6106ec565b6040516001600160a01b03909116815260200161021f565b61029561029036600461218b565b610730565b005b3480156102a357600080fd5b506102b5600d54600e5460ff90911691565b60405161021f9291906121ed565b3480156102cf57600080fd5b5060015460005403600019015b60405190815260200161021f565b6102956102f8366004612208565b6107d0565b34801561030957600080fd5b5061029561088e565b610295610320366004612208565b6108bc565b34801561033157600080fd5b506102dc600c5481565b34801561034757600080fd5b5061021361035636600461215b565b600b6020526000908152604090205460ff1681565b34801561037757600080fd5b5061026a61038636600461215b565b610970565b34801561039757600080fd5b506102dc6103a6366004612244565b61097b565b3480156103b757600080fd5b506102956109ca565b3480156103cc57600080fd5b506103e06103db366004612244565b6109dc565b60405161021f919061225f565b3480156103f957600080fd5b50610295610ae5565b34801561040e57600080fd5b506008546001600160a01b031661026a565b34801561042c57600080fd5b5061023d610af8565b34801561044157600080fd5b506102dc610450366004612323565b610b07565b34801561046157600080fd5b506102dc600e5481565b61029561047936600461215b565b610bab565b34801561048a57600080fd5b5061029561049936600461237a565b610d45565b3480156104aa57600080fd5b506102956104b936600461215b565b610db1565b3480156104ca57600080fd5b506102956104d936600461215b565b610dbe565b3480156104ea57600080fd5b5061023d6104f936600461215b565b610dcb565b61029561050c3660046123b1565b610e65565b34801561051d57600080fd5b5061023d61052c36600461215b565b610f20565b34801561053d57600080fd5b50600d5461054b9060ff1681565b60405161021f919061242d565b34801561056457600080fd5b5061021361057336600461215b565b600a6020526000908152604090205460ff1681565b34801561059457600080fd5b506102136105a336600461243b565b610fea565b3480156105b457600080fd5b506102956105c3366004612244565b611018565b3480156105d457600080fd5b506102956105e336600461215b565b611091565b3480156105f457600080fd5b5061029561060336600461246e565b6110ce565b60006301ffc9a760e01b6001600160e01b03198316148061063957506380ac58cd60e01b6001600160e01b03198316145b806106545750635b5e139f60e01b6001600160e01b03198316145b92915050565b60606002805461066990612490565b80601f016020809104026020016040519081016040528092919081815260200182805461069590612490565b80156106e25780601f106106b7576101008083540402835291602001916106e2565b820191906000526020600020905b8154815290600101906020018083116106c557829003601f168201915b5050505050905090565b60006106f78261144d565b610714576040516333d1c03960e21b815260040160405180910390fd5b506000908152600660205260409020546001600160a01b031690565b600061073b82610970565b9050336001600160a01b03821614610774576107578133610fea565b610774576040516367d9dca160e11b815260040160405180910390fd5b60008281526006602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b6daaeb6d7670e522a718067333cd4e3b1561087e57604051633185c44d60e21b81523060048201523360248201526daaeb6d7670e522a718067333cd4e9063c6171134906044016020604051808303816000875af1158015610836573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061085a91906124ca565b61087e57604051633b79c77360e21b81523360048201526024015b60405180910390fd5b610889838383611482565b505050565b61089661161b565b60405133904780156108fc02916000818181858888f193505050506108ba57600080fd5b565b6daaeb6d7670e522a718067333cd4e3b1561096557604051633185c44d60e21b81523060048201523360248201526daaeb6d7670e522a718067333cd4e9063c6171134906044016020604051808303816000875af1158015610922573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061094691906124ca565b61096557604051633b79c77360e21b8152336004820152602401610875565b610889838383611675565b600061065482611690565b60006001600160a01b0382166109a4576040516323d3ad8160e21b815260040160405180910390fd5b506001600160a01b031660009081526005602052604090205467ffffffffffffffff1690565b6109d261161b565b6108ba6000611706565b606060008060006109ec8561097b565b905060008167ffffffffffffffff811115610a0957610a09612297565b604051908082528060200260200182016040528015610a32578160200160208202803683370190505b509050610a5f60408051608081018252600080825260208201819052918101829052606081019190915290565b60015b838614610ad957610a7281611758565b91508160400151610ad15781516001600160a01b031615610a9257815194505b876001600160a01b0316856001600160a01b031603610ad15780838780600101985081518110610ac457610ac46124e7565b6020026020010181815250505b600101610a62565b50909695505050505050565b610aed61161b565b6108ba3360016117d7565b60606003805461066990612490565b60008082815b8151811015610ba2576000818351610b259190612513565b90506000838381518110610b3b57610b3b6124e7565b01602001516001600160f81b03198116915060f81c6000610b5d603083612513565b9050610b6a600185612513565b610b7590600a61260a565b610b7f9082612616565b610b89908861262d565b9650505050508080610b9a90612640565b915050610b0d565b50909392505050565b6001600d5460ff166001811115610bc457610bc46121b5565b14610c095760405162461bcd60e51b8152602060048201526015602482015274283ab13634b19026b4b73a103737ba103634bb329760591b6044820152606401610875565b6001546000546103e8919003600019011115610c7157600e54610c2c9082612616565b341015610c6c5760405162461bcd60e51b815260206004820152600e60248201526d0dcdee840cadcdeeaced040cae8d60931b6044820152606401610875565b610cc3565b600c54811115610cc35760405162461bcd60e51b815260206004820152601860248201527f4d617820657863656564656420667265652070657220747800000000000000006044820152606401610875565b323314610d085760405162461bcd60e51b81526020600482015260136024820152722737ba103a34329039b0b6b29031b0b63632b960691b6044820152606401610875565b60005b81811015610d4157610d24610d1f60005490565b6118d5565b610d2f3360016117d7565b80610d3981612640565b915050610d0b565b5050565b3360008181526007602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b610db961161b565b600e55565b610dc661161b565b600c55565b60096020526000908152604090208054610de490612490565b80601f0160208091040260200160405190810160405280929190818152602001828054610e1090612490565b8015610e5d5780601f10610e3257610100808354040283529160200191610e5d565b820191906000526020600020905b815481529060010190602001808311610e4057829003601f168201915b505050505081565b6daaeb6d7670e522a718067333cd4e3b15610f0e57604051633185c44d60e21b81523060048201523360248201526daaeb6d7670e522a718067333cd4e9063c6171134906044016020604051808303816000875af1158015610ecb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610eef91906124ca565b610f0e57604051633b79c77360e21b8152336004820152602401610875565b610f1a84848484611955565b50505050565b606061065482600960008581526020019081526020016000208054610f4490612490565b80601f0160208091040260200160405190810160405280929190818152602001828054610f7090612490565b8015610fbd5780601f10610f9257610100808354040283529160200191610fbd565b820191906000526020600020905b815481529060010190602001808311610fa057829003601f168201915b5050506000878152600a6020908152604080832054600b9092529091205460ff9182169350169050611999565b6001600160a01b03918216600090815260076020908152604080832093909416825291909152205460ff1690565b61102061161b565b6001600160a01b0381166110855760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610875565b61108e81611706565b50565b61109961161b565b8060018111156110ab576110ab6121b5565b600d805460ff1916600183818111156110c6576110c66121b5565b021790555050565b6110d782610970565b6001600160a01b0316336001600160a01b031614801561111057506110fb81610970565b6001600160a01b0316336001600160a01b0316145b61115c5760405162461bcd60e51b815260206004820152601d60248201527f53656e64657220646f6573206e6f74206f776e20626f7468204e4654730000006044820152606401610875565b6000828152600a602052604090205460ff1615801561118a57506000818152600a602052604090205460ff16155b6111e15760405162461bcd60e51b815260206004820152602260248201527f426f7468204e465473206861766520616c7265616479206265656e206275726e604482015261195960f21b6064820152608401610875565b6000828152600b602052604090205460ff1615801561120f57506000818152600b602052604090205460ff16155b61125b5760405162461bcd60e51b815260206004820152601b60248201527f426f7468204e4654732061726520616c726561647920626c6f627300000000006044820152606401610875565b600082815260096020526040812080546112fc919061127990612490565b80601f01602080910402602001604051908101604052809291908181526020018280546112a590612490565b80156112f25780601f106112c7576101008083540402835291602001916112f2565b820191906000526020600020905b8154815290600101906020018083116112d557829003601f168201915b5050505050610b07565b9050600061132160096000858152602001908152602001600020805461127990612490565b905060006002611331838561262d565b61133b919061266f565b9050600061134882611a24565b6000878152600a6020526040808220805460ff19908116600190811790925589845291832080549092168117909155919250600b9061138660005490565b815260200190815260200160002060006101000a81548160ff02191690831515021790555080600960006113b960005490565b815260200190815260200160002090816113d391906126c9565b506113df3360016117d7565b6040518681527ff8e1a15aba9398e019f0b49df1a4fde98ee17ae345cb5f6b5e2c27f5033e8ce79060200160405180910390a16040518581527ff8e1a15aba9398e019f0b49df1a4fde98ee17ae345cb5f6b5e2c27f5033e8ce79060200160405180910390a1505050505050565b600081600111158015611461575060005482105b8015610654575050600090815260046020526040902054600160e01b161590565b600061148d82611690565b9050836001600160a01b0316816001600160a01b0316146114c05760405162a1148160e81b815260040160405180910390fd5b60008281526006602052604090208054338082146001600160a01b0388169091141761150d576114f08633610fea565b61150d57604051632ce44b5f60e11b815260040160405180910390fd5b6001600160a01b03851661153457604051633a954ecd60e21b815260040160405180910390fd5b801561153f57600082555b6001600160a01b038681166000908152600560205260408082208054600019019055918716808252919020805460010190554260a01b17600160e11b17600085815260046020526040812091909155600160e11b841690036115d1576001840160008181526004602052604081205490036115cf5760005481146115cf5760008181526004602052604090208490555b505b83856001600160a01b0316876001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45b505050505050565b6008546001600160a01b031633146108ba5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610875565b61088983838360405180602001604052806000815250610e65565b600081806001116116ed576000548110156116ed5760008181526004602052604081205490600160e01b821690036116eb575b806000036116e45750600019016000818152600460205260409020546116c3565b9392505050565b505b604051636f96cda160e11b815260040160405180910390fd5b600880546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60408051608081018252600080825260208201819052918101829052606081019190915260008281526004602052604090205461065490604080516080810182526001600160a01b038316815260a083901c67ffffffffffffffff166020820152600160e01b831615159181019190915260e89190911c606082015290565b60008054908290036117fc5760405163b562e8dd60e01b815260040160405180910390fd5b6001600160a01b03831660008181526005602090815260408083208054680100000000000000018802019055848352600490915281206001851460e11b4260a01b178317905582840190839083907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8180a4600183015b8181146118ab57808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600101611873565b50816000036118cc57604051622e076360e81b815260040160405180910390fd5b60005550505050565b604080514260208201526bffffffffffffffffffffffff193360601b1691810191909152605481018290526000906103e9906074016040516020818303038152906040528051906020012060001c61192d9190612789565b9050600061193a82611a24565b6000848152600960205260409020909150610f1a82826126c9565b6119608484846107d0565b6001600160a01b0383163b15610f1a5761197c84848484611b50565b610f1a576040516368d2bf6b60e11b815260040160405180910390fd5b6060806119a586611c38565b856119af86611d5b565b6119b886611d5b565b6119cb6119c68a8a8a611dad565b611ee1565b6040516020016119df9594939291906127b9565b60405160208183030381529060405290506119f981611ee1565b604051602001611a099190612981565b6040516020818303038152906040529150505b949350505050565b606081600003611a4b5750506040805180820190915260018152600360fc1b602082015290565b8160005b8115611a755780611a5f81612640565b9150611a6e9050600a8361266f565b9150611a4f565b60008167ffffffffffffffff811115611a9057611a90612297565b6040519080825280601f01601f191660200182016040528015611aba576020820181803683370190505b509050815b8515611b4757611ad0600182612513565b90506000611adf600a8861266f565b611aea90600a612616565b611af49088612513565b611aff9060306129c6565b905060008160f81b905080848481518110611b1c57611b1c6124e7565b60200101906001600160f81b031916908160001a905350611b3e600a8961266f565b97505050611abf565b50949350505050565b604051630a85bd0160e11b81526000906001600160a01b0385169063150b7a0290611b859033908990889088906004016129df565b6020604051808303816000875af1925050508015611bc0575060408051601f3d908101601f19168201909252611bbd91810190612a1c565b60015b611c1e573d808015611bee576040519150601f19603f3d011682016040523d82523d6000602084013e611bf3565b606091505b508051600003611c16576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611a1c565b606081600003611c5f5750506040805180820190915260018152600360fc1b602082015290565b8160005b8115611c895780611c7381612640565b9150611c829050600a8361266f565b9150611c63565b60008167ffffffffffffffff811115611ca457611ca4612297565b6040519080825280601f01601f191660200182016040528015611cce576020820181803683370190505b509050815b8515611b4757611ce4600182612513565b90506000611cf3600a8861266f565b611cfe90600a612616565b611d089088612513565b611d139060306129c6565b905060008160f81b905080848481518110611d3057611d306124e7565b60200101906001600160f81b031916908160001a905350611d52600a8961266f565b97505050611cd3565b60608115611d85575050604080518082019091526006815265112a393ab29160d11b602082015290565b5050604080518082019091526007815266112330b639b29160c91b602082015290565b919050565b60606040518060a00160405280608081526020016144686080913990508084604051602001611ddd929190612a39565b604051602081830303815290604052905081611e955782611e1f5780604051602001611e099190612a91565b6040516020818303038152906040529050611e42565b80604051602001611e309190612e1a565b60405160208183030381529060405290505b80611e4c85612034565b604051602001611e5d929190612f19565b604051602081830303815290604052905080604051602001611e7f9190612f84565b6040516020818303038152906040529050611eb8565b80604051602001611ea69190613c4b565b60405160208183030381529060405290505b80604051602001611ec9919061444b565b60405160208183030381529060405290509392505050565b60608151600003611f0057505060408051602081019091526000815290565b60006040518060600160405280604081526020016144e86040913990506000600384516002611f2f919061262d565b611f39919061266f565b611f44906004612616565b67ffffffffffffffff811115611f5c57611f5c612297565b6040519080825280601f01601f191660200182016040528015611f86576020820181803683370190505b509050600182016020820185865187015b80821015611ff2576003820191508151603f8160121c168501518453600184019350603f81600c1c168501518453600184019350603f8160061c168501518453600184019350603f8116850151845350600183019250611f97565b505060038651066001811461200e576002811461202157612029565b603d6001830353603d6002830353612029565b603d60018303535b509195945050505050565b6060600082604051602001612049919061444b565b60408051601f19818403018152919052805160209091012090506000612070600483612789565b6040805160808101825260008152605a602082015260b49181019190915261010e60608201529091506120bc8183600481106120ae576120ae6124e7565b602002015161ffff16611c38565b95945050505050565b6001600160e01b03198116811461108e57600080fd5b6000602082840312156120ed57600080fd5b81356116e4816120c5565b60005b838110156121135781810151838201526020016120fb565b50506000910152565b600081518084526121348160208601602086016120f8565b601f01601f19169290920160200192915050565b6020815260006116e4602083018461211c565b60006020828403121561216d57600080fd5b5035919050565b80356001600160a01b0381168114611da857600080fd5b6000806040838503121561219e57600080fd5b6121a783612174565b946020939093013593505050565b634e487b7160e01b600052602160045260246000fd5b600281106121e957634e487b7160e01b600052602160045260246000fd5b9052565b604081016121fb82856121cb565b8260208301529392505050565b60008060006060848603121561221d57600080fd5b61222684612174565b925061223460208501612174565b9150604084013590509250925092565b60006020828403121561225657600080fd5b6116e482612174565b6020808252825182820181905260009190848201906040850190845b81811015610ad95783518352928401929184019160010161227b565b634e487b7160e01b600052604160045260246000fd5b600067ffffffffffffffff808411156122c8576122c8612297565b604051601f8501601f19908116603f011681019082821181831017156122f0576122f0612297565b8160405280935085815286868601111561230957600080fd5b858560208301376000602087830101525050509392505050565b60006020828403121561233557600080fd5b813567ffffffffffffffff81111561234c57600080fd5b8201601f8101841361235d57600080fd5b611a1c848235602084016122ad565b801515811461108e57600080fd5b6000806040838503121561238d57600080fd5b61239683612174565b915060208301356123a68161236c565b809150509250929050565b600080600080608085870312156123c757600080fd5b6123d085612174565b93506123de60208601612174565b925060408501359150606085013567ffffffffffffffff81111561240157600080fd5b8501601f8101871361241257600080fd5b612421878235602084016122ad565b91505092959194509250565b6020810161065482846121cb565b6000806040838503121561244e57600080fd5b61245783612174565b915061246560208401612174565b90509250929050565b6000806040838503121561248157600080fd5b50508035926020909101359150565b600181811c908216806124a457607f821691505b6020821081036124c457634e487b7160e01b600052602260045260246000fd5b50919050565b6000602082840312156124dc57600080fd5b81516116e48161236c565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b81810381811115610654576106546124fd565b600181815b80851115612561578160001904821115612547576125476124fd565b8085161561255457918102915b93841c939080029061252b565b509250929050565b60008261257857506001610654565b8161258557506000610654565b816001811461259b57600281146125a5576125c1565b6001915050610654565b60ff8411156125b6576125b66124fd565b50506001821b610654565b5060208310610133831016604e8410600b84101617156125e4575081810a610654565b6125ee8383612526565b8060001904821115612602576126026124fd565b029392505050565b60006116e48383612569565b8082028115828204841417610654576106546124fd565b80820180821115610654576106546124fd565b600060018201612652576126526124fd565b5060010190565b634e487b7160e01b600052601260045260246000fd5b60008261267e5761267e612659565b500490565b601f82111561088957600081815260208120601f850160051c810160208610156126aa5750805b601f850160051c820191505b81811015611613578281556001016126b6565b815167ffffffffffffffff8111156126e3576126e3612297565b6126f7816126f18454612490565b84612683565b602080601f83116001811461272c57600084156127145750858301515b600019600386901b1c1916600185901b178555611613565b600085815260208120601f198616915b8281101561275b5788860151825594840194600190910190840161273c565b50858210156127795787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60008261279857612798612659565b500690565b600081516127af8185602086016120f8565b9290920192915050565b7203d913730b6b2911d10112830b632ba3a32b99606d1b815285516000906127e8816013850160208b016120f8565b7f222c20226465736372697074696f6e223a20224e6f7573207669766f6e7320746013918401918201527f6f75732064616e732064657320636f756c6575727320646966666572656e746560338201527f732e222c202261747472696275746573223a5b7b2274726169745f747970652260538201527101d1011242aa2911610113b30b63ab2911d160751b6073820152865161288c816085840160208b016120f8565b7f7d2c7b2274726169745f74797065223a20224275726e6564222c202276616c756085929091019182015263032911d160e51b60a582015285516128d78160a9840160208a016120f8565b61297461296661296061292661292060a9868801017f7d2c7b2274726169745f74797065223a2022426c6f62222c202276616c75652281526101d160f51b602082015260220190565b8a61279d565b7f7d5d2c2022696d616765223a2022646174613a696d6167652f7376672b786d6c8152670ed8985cd94d8d0b60c21b602082015260280190565b8761279d565b61227d60f01b815260020190565b9998505050505050505050565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c0000008152600082516129b981601d8501602087016120f8565b91909101601d0192915050565b60ff8181168382160190811115610654576106546124fd565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090612a129083018461211c565b9695505050505050565b600060208284031215612a2e57600080fd5b81516116e4816120c5565b60008351612a4b8184602088016120f8565b7f3c646566733e3c7374796c653e203a726f6f747b2d2d6875653a2000000000009083019081528351612a8581601b8401602088016120f8565b01601b01949350505050565b60008251612aa38184602087016120f8565b7f3b202d2d687565436f6d706c656d656e743a2063616c6328766172282d2d68759201918252507f6529202b20313830293b202d2d6875655269676874416e616c6f676f75733a2060208201527f63616c6328766172282d2d68756529202b203330293b202d2d6875654c65667460408201527f416e616c6f676f75733a2063616c6328766172282d2d68756529202d2033302960608201527f3b202d2d6875655269676874416e616c6f676f7573323a2063616c632876617260808201527f282d2d68756529202b203630293b202d2d6875654c656674416e616c6f676f7560a08201527f73323a2063616c6328766172282d2d68756529202d203630293b202d2d68756560c08201527f5269676874416e616c6f676f7573333a2063616c6328766172282d2d6875652960e08201527f202b203830293b202d2d6875654c656674416e616c6f676f7573333a2063616c6101008201527f6328766172282d2d68756529202d203830293b202d2d616363656e7456313a206101208201527f68736c28766172282d2d6875655269676874416e616c6f676f757329203530256101408201527f20353025293b202d2d616363656e7456323a2068736c28766172282d2d6875656101608201527f4c656674416e616c6f676f7573292035302520353025293b202d2d616363656e6101808201527f7456333a2068736c28766172282d2d6875655269676874416e616c6f676f75736101a08201527f32292035302520353025293b202d2d616363656e7456343a2068736c287661726101c08201527f282d2d6875654c656674416e616c6f676f757332292035302520353025293b206101e08201527f2d2d616363656e7456353a2068736c28766172282d2d6875655269676874416e6102008201527f616c6f676f757333292035302520353025293b207d202e636c732d327b66696c6102208201527f6c3a20766172282d2d616363656e745631293b7d202e636c732d337b66696c6c6102408201527f3a20766172282d2d616363656e745632293b7d202e636c732d347b66696c6c3a6102608201527f20766172282d2d616363656e745633293b7d202e636c732d357b66696c6c3a206102808201527f766172282d2d616363656e745634293b7d202e636c732d367b66696c6c3a20766102a082015270030b9141696b0b1b1b2b73a2b1a949dbe9607d1b6102c08201526102d101919050565b60008251612e2c8184602087016120f8565b7f3b7d202e636c732d327b66696c6c3a20677261793b206f7061636974793a20309201918252507f2e33333b207d202e636c732d337b66696c6c3a20677261793b206f706163697460208201527f793a20302e35333b207d202e636c732d347b66696c6c3a20677261793b206f7060408201527f61636974793a20302e37333b20207d202e636c732d357b66696c6c3a2067726160608201527f793b206f7061636974793a20302e34303b20207d202e636c732d367b66696c6c60808201527f3a20677261793b206f7061636974793a20302e36333b207d200000000000000060a082015260b901919050565b60008351612f2b8184602088016120f8565b7f2e726f74617465647b207472616e73666f726d3a20726f7461746528000000009083019081528351612f6581601c8401602088016120f8565b65646567293b7d60d01b601c9290910191820152602201949350505050565b60008251612f968184602087016120f8565b710101e17b9ba3cb6329f101e17b232b3399f160751b9201918252507f203c672069643d2243616c7175655f322220646174612d6e616d653d2243616c60128201527f7175652032223e203c7265637420636c6173733d22636c732d312220783d223060328201527f2e352220793d22302e35222077696474683d2236303022206865696768743d2260528201527f36303022202f3e203c2f673e203c672069643d2243616c7175655f312220646160728201527f74612d6e616d653d2243616c7175652031223e203c7265637420636c6173733d60928201527f22636c732d322220783d2236302e33362220793d2236302e333822207769647460b28201527f683d2237332e323622206865696768743d2237332e323622202f3e203c72656360d282018190527f7420636c6173733d22636c732d332220783d223134312e37362220793d22363060f28301527f2e3338222077696474683d2237332e323622206865696768743d2237332e32366101128301527f22202f3e203c7265637420636c6173733d22636c732d342220783d223232332e6101328301527f31362220793d2236302e3338222077696474683d2237332e32362220686569676101528301527f68743d2237332e323622202f3e203c7265637420636c6173733d22636c732d356101728301527f2220783d223330342e35362220793d2236302e3338222077696474683d2237336101928301527f2e323622206865696768743d2237332e323622202f3e203c7265637420636c616101b283018190527f73733d22636c732d322220783d223338352e39352220793d2236302e333822206101d28401527f77696474683d2237332e323622206865696768743d2237332e323622202f3e206101f284018190527f3c7265637420636c6173733d22636c732d362220783d223436372e33352220796102128501527f3d2236302e3338222077696474683d2237332e323622206865696768743d22376102328501527f332e323622202f3e203c7265637420636c6173733d22636c732d332220783d226102528501527f36302e33392220793d223134312e3738222077696474683d2237332e323622206102728501527f6865696768743d2237332e323622202f3e203c7265637420636c6173733d226361029285018190527f6c732d352220783d223134312e37392220793d223134312e37382220776964746102b28601526102d28501939093527f7420636c6173733d22636c732d362220783d223232332e31392220793d2231346102f28501527f312e3738222077696474683d2237332e323622206865696768743d2237332e326103128501527f3622202f3e203c7265637420636c6173733d22636c732d322220783d223330346103328501527f2e35382220793d223134312e3738222077696474683d2237332e3236222068656103528501527f696768743d2237332e323622202f3e203c7265637420636c6173733d22636c736103728501527f2d332220783d223338352e39382220793d223134312e3738222077696474683d6103928501527f2237332e323622206865696768743d2237332e323622202f3e203c72656374206103b285018190527f636c6173733d22636c732d322220783d223436372e33382220793d223134312e6103d28601527f3738222077696474683d2237332e323622206865696768743d2237332e3236226103f28601527f202f3e203c7265637420636c6173733d22636c732d362220783d2236302e33386104128601527f2220793d223232332e3137222077696474683d2237332e3236222068656967686104328601527f743d2237332e323622202f3e203c7265637420636c6173733d22636c732d34226104528601527f20783d223134312e37382220793d223232332e3137222077696474683d22373361047286015261049285018390527f73733d22636c732d322220783d223232332e31372220793d223232332e3137226104b28601527f2077696474683d2237332e323622206865696768743d2237332e323622202f3e6104d28601527f203c7265637420636c6173733d22636c732d342220783d223330342e353722206104f28601527f793d223232332e3137222077696474683d2237332e323622206865696768743d6105128601527f2237332e323622202f3e203c7265637420636c6173733d22636c732d352220786105328601527f3d223338352e39372220793d223232332e3137222077696474683d2237332e326105528601527f3622206865696768743d2237332e323622202f3e203c7265637420636c6173736105728601527f3d22636c732d332220783d223436372e33362220793d223232332e31372220776105928601527f696474683d2237332e323622206865696768743d2237332e323622202f3e203c6105b28601527f7265637420636c6173733d22636c732d362220783d2236302e34312220793d226105d28601527f3330342e3536222077696474683d2237332e323622206865696768743d2237336105f28601527f2e323622202f3e203c7265637420636c6173733d22636c732d352220783d22316106128601527f34312e382220793d223330342e3536222077696474683d2237332e32362220686106328601527f65696768743d2237332e323622202f3e203c7265637420636c6173733d22636c6106528601527f732d342220783d223232332e322220793d223330342e3536222077696474683d6106728601526106928501527f636c6173733d22636c732d352220783d223330342e362220793d223330342e356106b28501527f36222077696474683d2237332e323622206865696768743d2237332e323622206106d285018190527f2f3e203c7265637420636c6173733d22636c732d362220783d223338352e39396106f28601527f2220793d223330342e3536222077696474683d2237332e3236222068656967686107128601527f743d2237332e323622202f3e203c7265637420636c6173733d22636c732d32226107328601527f20783d223436372e33392220793d223330342e3536222077696474683d2237336107528601526107728501929092527f73733d22636c732d342220783d2236302e33352220793d223338352e393622206107928501526107b28401527f3c7265637420636c6173733d22636c732d332220783d223134312e37352220796107d28401527f3d223338352e3936222077696474683d2237332e323622206865696768743d226107f28401527f37332e323622202f3e203c7265637420636c6173733d22636c732d362220783d6108128401527f223232332e31342220793d223338352e3936222077696474683d2237332e32366108328401527f22206865696768743d2237332e323622202f3e203c7265637420636c6173733d6108528401527f22636c732d342220783d223330342e35342220793d223338352e3936222077696108728401527f6474683d2237332e323622206865696768743d2237332e323622202f3e203c726108928401527f65637420636c6173733d22636c732d352220783d223338352e39342220793d226108b28401527f3338352e3936222077696474683d2237332e323622206865696768743d2237336108d28401527f2e323622202f3e203c7265637420636c6173733d22636c732d332220783d22346108f28401527f36372e33342220793d223338352e3936222077696474683d2237332e323622206109128401526109328301919091527f6c732d342220783d2236302e33382220793d223436372e3336222077696474686109528301527f3d2237332e323622206865696768743d2237332e323622202f3e203c726563746109728301527f20636c6173733d22636c732d362220783d223134312e37382220793d223436376109928301527f2e3336222077696474683d2237332e323622206865696768743d2237332e32366109b28301527f22202f3e203c7265637420636c6173733d22636c732d352220783d223232332e6109d28301527f31372220793d223436372e3336222077696474683d2237332e323622206865696109f28301527f6768743d2237332e323622202f3e203c7265637420636c6173733d22636c732d610a128301527f332220783d223330342e35372220793d223436372e3336222077696474683d22610a328301527f37332e323622206865696768743d2237332e323622202f3e203c726563742063610a528301527f6c6173733d22636c732d362220783d223338352e39372220793d223436372e33610a72830152610a928201527f2f3e203c7265637420636c6173733d22636c732d352220783d223436372e3336610ab28201527f2220793d223436372e3336222077696474683d2237332e323622206865696768610ad28201527f743d2237332e323622202f3e203c2f673e203c2f7376673e0000000000000000610af2820152610b0a01919050565b60008251613c5d8184602087016120f8565b7f3b202d2d687565436f6d706c656d656e743a2063616c6328766172282d2d68759201918252507f6529202b20313830293b202d2d616363656e7456313a2068736c28766172282d60208201527f2d687565292035302520353025293b202d2d616363656e7456323a2068736c2860408201527f766172282d2d687565436f6d706c656d656e74292035302520353025293b202d60608201527f2d7363616c65466163746f723a2063616c6328302e35202b20766172282d2d6860808201527f756529202f20313030293b207d20737667207b207472616e73666f726d2d6f7260a08201527f6967696e3a20353025203530253b20616e696d6174696f6e3a206d6f7665203360c08201527f3673206c696e65617220696e66696e6974653b207d20406b65796672616d657360e08201527f206d6f7665207b203025207b207472616e73666f726d3a207363616c652831296101008201527f20726f746174652830293b207d2031303025207b207472616e73666f726d3a206101208201527f7363616c6528312920726f7461746528333630646567293b207d207d203c2f736101408201527f74796c653e203c6c696e6561724772616469656e742069643d2273772d6772616101608201527f6469656e74222078313d2230222078323d2231222079313d2231222079323d226101808201527f30223e203c73746f702069643d2273746f7031222073746f702d636f6c6f723d6101a08201527f22766172282d2d616363656e7456312922206f66667365743d223025222f3e206101c08201527f3c73746f702069643d2273746f7032222073746f702d636f6c6f723d227661726101e08201527f282d2d616363656e7456322922206f66667365743d2231303025222f3e203c2f6102008201527f6c696e6561724772616469656e743e203c2f646566733e203c66696c746572206102208201527f69643d22736861646f7722207472616e73666f726d3d22726f746174652876616102408201527f72282d2d6875652929223e203c666544726f70536861646f772064783d2230226102608201527f2064793d22302220737464446576696174696f6e3d2232302220666c6f6f642d6102808201527f636f6c6f723d2267726179222f3e203c2f66696c7465723e203c7061746820666102a08201527f696c6c3d2275726c282373772d6772616469656e7429222066696c7465723d226102c08201527f75726c2823736861646f7729223e203c616e696d6174652061747472696275746102e08201527f654e616d653d226422206475723d223336732220726570656174436f756e743d6103008201527f22696e646566696e697465222076616c7565733d224d3433312e33203132312e6103208201527f396332322034302e312031312e332039372e352031332e33203134362e3920326103408201527f2034392e352031362e362039312e3120342e33203132312e382d31322e3220336103608201527f302e362d35312e332035302e342d38382e352035352e312d33372e3120342e376103808201527f2d37322e342d352e372d3130382e382d31372e312d33362e352d31312e332d376103a08201527f342e312d32332e372d3130342d35322d32392e392d32382e322d35322d37322e6103c08201527f342d34382e342d3131352e3420332e352d34332033322e372d38342e382037306103e08201527f2e352d3132322e322033372e372d33372e332038342d37302e32203133342e356104008201527f2d37352e312035302e342d35203130352e312031372e39203132372e312035386104208201527f7a3b204d3430342e34203137362e376332302e392031362e342032302e3820356104408201527f382e382033382e38203130362e322031382e312034372e342035342e342039396104608201527f2e372034302e39203132332e362d31332e352032332e392d37362e372031392e6104808201527f332d3133312e362034302e342d35342e382032312d3130312e322036372e372d6104a08201527f3135302e352037312e372d34392e3420342e312d3130312e372d33342e352d316104c08201527f30372e382d38312e39433838203338392e322031323820333333203134342e326104e08201527f203237386331362e322d35352e3120382e352d3130382e382033302e352d31326105008201527f352032322d31362e312037332e3720352e35203132302e342031312e332034366105208201527f2e3720352e392038382e352d332e39203130392e332031322e347a3b204d34336105408201527f312e33203132312e396332322034302e312031312e332039372e352031332e336105608201527f203134362e3920322034392e352031362e362039312e3120342e33203132312e6105808201527f382d31322e322033302e362d35312e332035302e342d38382e352035352e312d6105a08201527f33372e3120342e372d37322e342d352e372d3130382e382d31372e312d33362e6105c08201527f352d31312e332d37342e312d32332e372d3130342d35322d32392e392d32382e6105e08201527f322d35322d37322e342d34382e342d3131352e3420332e352d34332033322e376106008201527f2d38342e382037302e352d3132322e322033372e372d33372e332038342d37306106208201527f2e32203133342e352d37352e312035302e342d35203130352e312031372e39206106408201527f3132372e312035387a3b20222f3e203c2f706174683e203c2f7376673e00000061066082015261067d01919050565b6000825161445d8184602087016120f8565b919091019291505056fe3c73766720786d6c6e733d22687474703a2f2f7777772e77332e6f72672f323030302f737667222076696577426f783d2230203020363031203630312220636c6173733d22726f746174656422207374796c653d226261636b67726f756e642d636f6c6f723a626c61636b3b206f766572666c6f773a2068696464656e3b223e4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2fa26469706673582212202de7eedc9b50efd1d049d9d4a3efe61cefca7eee0ed53e55307406eca0e014b364736f6c63430008130033

Deployed Bytecode

0x6080604052600436106101ee5760003560e01c80638da5cb5b1161010d578063af4e39ca116100a0578063db44fe071161006f578063db44fe0714610558578063e985e9c514610588578063f2fde38b146105a8578063f8dcbddb146105c8578063fb1a0e83146105e857600080fd5b8063af4e39ca146104de578063b88d4fde146104fe578063c87b56dd14610511578063cbccefb21461053157600080fd5b8063a0712d68116100dc578063a0712d681461046b578063a22cb4651461047e578063a2b40d191461049e578063af351ba8146104be57600080fd5b80638da5cb5b1461040257806395d89b41146104205780639aeecf1b14610435578063a035b1fe1461045557600080fd5b806342842e0e1161018557806370a082311161015457806370a082311461038b578063715018a6146103ab5780638462151c146103c0578063865540e2146103ed57600080fd5b806342842e0e14610312578063503ec933146103255780635c4191351461033b5780636352211e1461036b57600080fd5b80630c3f6acf116101c15780630c3f6acf1461029757806318160ddd146102c357806323b872dd146102ea5780633ccfd60b146102fd57600080fd5b806301ffc9a7146101f357806306fdde0314610228578063081812fc1461024a578063095ea7b314610282575b600080fd5b3480156101ff57600080fd5b5061021361020e3660046120db565b610608565b60405190151581526020015b60405180910390f35b34801561023457600080fd5b5061023d61065a565b60405161021f9190612148565b34801561025657600080fd5b5061026a61026536600461215b565b6106ec565b6040516001600160a01b03909116815260200161021f565b61029561029036600461218b565b610730565b005b3480156102a357600080fd5b506102b5600d54600e5460ff90911691565b60405161021f9291906121ed565b3480156102cf57600080fd5b5060015460005403600019015b60405190815260200161021f565b6102956102f8366004612208565b6107d0565b34801561030957600080fd5b5061029561088e565b610295610320366004612208565b6108bc565b34801561033157600080fd5b506102dc600c5481565b34801561034757600080fd5b5061021361035636600461215b565b600b6020526000908152604090205460ff1681565b34801561037757600080fd5b5061026a61038636600461215b565b610970565b34801561039757600080fd5b506102dc6103a6366004612244565b61097b565b3480156103b757600080fd5b506102956109ca565b3480156103cc57600080fd5b506103e06103db366004612244565b6109dc565b60405161021f919061225f565b3480156103f957600080fd5b50610295610ae5565b34801561040e57600080fd5b506008546001600160a01b031661026a565b34801561042c57600080fd5b5061023d610af8565b34801561044157600080fd5b506102dc610450366004612323565b610b07565b34801561046157600080fd5b506102dc600e5481565b61029561047936600461215b565b610bab565b34801561048a57600080fd5b5061029561049936600461237a565b610d45565b3480156104aa57600080fd5b506102956104b936600461215b565b610db1565b3480156104ca57600080fd5b506102956104d936600461215b565b610dbe565b3480156104ea57600080fd5b5061023d6104f936600461215b565b610dcb565b61029561050c3660046123b1565b610e65565b34801561051d57600080fd5b5061023d61052c36600461215b565b610f20565b34801561053d57600080fd5b50600d5461054b9060ff1681565b60405161021f919061242d565b34801561056457600080fd5b5061021361057336600461215b565b600a6020526000908152604090205460ff1681565b34801561059457600080fd5b506102136105a336600461243b565b610fea565b3480156105b457600080fd5b506102956105c3366004612244565b611018565b3480156105d457600080fd5b506102956105e336600461215b565b611091565b3480156105f457600080fd5b5061029561060336600461246e565b6110ce565b60006301ffc9a760e01b6001600160e01b03198316148061063957506380ac58cd60e01b6001600160e01b03198316145b806106545750635b5e139f60e01b6001600160e01b03198316145b92915050565b60606002805461066990612490565b80601f016020809104026020016040519081016040528092919081815260200182805461069590612490565b80156106e25780601f106106b7576101008083540402835291602001916106e2565b820191906000526020600020905b8154815290600101906020018083116106c557829003601f168201915b5050505050905090565b60006106f78261144d565b610714576040516333d1c03960e21b815260040160405180910390fd5b506000908152600660205260409020546001600160a01b031690565b600061073b82610970565b9050336001600160a01b03821614610774576107578133610fea565b610774576040516367d9dca160e11b815260040160405180910390fd5b60008281526006602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b6daaeb6d7670e522a718067333cd4e3b1561087e57604051633185c44d60e21b81523060048201523360248201526daaeb6d7670e522a718067333cd4e9063c6171134906044016020604051808303816000875af1158015610836573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061085a91906124ca565b61087e57604051633b79c77360e21b81523360048201526024015b60405180910390fd5b610889838383611482565b505050565b61089661161b565b60405133904780156108fc02916000818181858888f193505050506108ba57600080fd5b565b6daaeb6d7670e522a718067333cd4e3b1561096557604051633185c44d60e21b81523060048201523360248201526daaeb6d7670e522a718067333cd4e9063c6171134906044016020604051808303816000875af1158015610922573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061094691906124ca565b61096557604051633b79c77360e21b8152336004820152602401610875565b610889838383611675565b600061065482611690565b60006001600160a01b0382166109a4576040516323d3ad8160e21b815260040160405180910390fd5b506001600160a01b031660009081526005602052604090205467ffffffffffffffff1690565b6109d261161b565b6108ba6000611706565b606060008060006109ec8561097b565b905060008167ffffffffffffffff811115610a0957610a09612297565b604051908082528060200260200182016040528015610a32578160200160208202803683370190505b509050610a5f60408051608081018252600080825260208201819052918101829052606081019190915290565b60015b838614610ad957610a7281611758565b91508160400151610ad15781516001600160a01b031615610a9257815194505b876001600160a01b0316856001600160a01b031603610ad15780838780600101985081518110610ac457610ac46124e7565b6020026020010181815250505b600101610a62565b50909695505050505050565b610aed61161b565b6108ba3360016117d7565b60606003805461066990612490565b60008082815b8151811015610ba2576000818351610b259190612513565b90506000838381518110610b3b57610b3b6124e7565b01602001516001600160f81b03198116915060f81c6000610b5d603083612513565b9050610b6a600185612513565b610b7590600a61260a565b610b7f9082612616565b610b89908861262d565b9650505050508080610b9a90612640565b915050610b0d565b50909392505050565b6001600d5460ff166001811115610bc457610bc46121b5565b14610c095760405162461bcd60e51b8152602060048201526015602482015274283ab13634b19026b4b73a103737ba103634bb329760591b6044820152606401610875565b6001546000546103e8919003600019011115610c7157600e54610c2c9082612616565b341015610c6c5760405162461bcd60e51b815260206004820152600e60248201526d0dcdee840cadcdeeaced040cae8d60931b6044820152606401610875565b610cc3565b600c54811115610cc35760405162461bcd60e51b815260206004820152601860248201527f4d617820657863656564656420667265652070657220747800000000000000006044820152606401610875565b323314610d085760405162461bcd60e51b81526020600482015260136024820152722737ba103a34329039b0b6b29031b0b63632b960691b6044820152606401610875565b60005b81811015610d4157610d24610d1f60005490565b6118d5565b610d2f3360016117d7565b80610d3981612640565b915050610d0b565b5050565b3360008181526007602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b610db961161b565b600e55565b610dc661161b565b600c55565b60096020526000908152604090208054610de490612490565b80601f0160208091040260200160405190810160405280929190818152602001828054610e1090612490565b8015610e5d5780601f10610e3257610100808354040283529160200191610e5d565b820191906000526020600020905b815481529060010190602001808311610e4057829003601f168201915b505050505081565b6daaeb6d7670e522a718067333cd4e3b15610f0e57604051633185c44d60e21b81523060048201523360248201526daaeb6d7670e522a718067333cd4e9063c6171134906044016020604051808303816000875af1158015610ecb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610eef91906124ca565b610f0e57604051633b79c77360e21b8152336004820152602401610875565b610f1a84848484611955565b50505050565b606061065482600960008581526020019081526020016000208054610f4490612490565b80601f0160208091040260200160405190810160405280929190818152602001828054610f7090612490565b8015610fbd5780601f10610f9257610100808354040283529160200191610fbd565b820191906000526020600020905b815481529060010190602001808311610fa057829003601f168201915b5050506000878152600a6020908152604080832054600b9092529091205460ff9182169350169050611999565b6001600160a01b03918216600090815260076020908152604080832093909416825291909152205460ff1690565b61102061161b565b6001600160a01b0381166110855760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610875565b61108e81611706565b50565b61109961161b565b8060018111156110ab576110ab6121b5565b600d805460ff1916600183818111156110c6576110c66121b5565b021790555050565b6110d782610970565b6001600160a01b0316336001600160a01b031614801561111057506110fb81610970565b6001600160a01b0316336001600160a01b0316145b61115c5760405162461bcd60e51b815260206004820152601d60248201527f53656e64657220646f6573206e6f74206f776e20626f7468204e4654730000006044820152606401610875565b6000828152600a602052604090205460ff1615801561118a57506000818152600a602052604090205460ff16155b6111e15760405162461bcd60e51b815260206004820152602260248201527f426f7468204e465473206861766520616c7265616479206265656e206275726e604482015261195960f21b6064820152608401610875565b6000828152600b602052604090205460ff1615801561120f57506000818152600b602052604090205460ff16155b61125b5760405162461bcd60e51b815260206004820152601b60248201527f426f7468204e4654732061726520616c726561647920626c6f627300000000006044820152606401610875565b600082815260096020526040812080546112fc919061127990612490565b80601f01602080910402602001604051908101604052809291908181526020018280546112a590612490565b80156112f25780601f106112c7576101008083540402835291602001916112f2565b820191906000526020600020905b8154815290600101906020018083116112d557829003601f168201915b5050505050610b07565b9050600061132160096000858152602001908152602001600020805461127990612490565b905060006002611331838561262d565b61133b919061266f565b9050600061134882611a24565b6000878152600a6020526040808220805460ff19908116600190811790925589845291832080549092168117909155919250600b9061138660005490565b815260200190815260200160002060006101000a81548160ff02191690831515021790555080600960006113b960005490565b815260200190815260200160002090816113d391906126c9565b506113df3360016117d7565b6040518681527ff8e1a15aba9398e019f0b49df1a4fde98ee17ae345cb5f6b5e2c27f5033e8ce79060200160405180910390a16040518581527ff8e1a15aba9398e019f0b49df1a4fde98ee17ae345cb5f6b5e2c27f5033e8ce79060200160405180910390a1505050505050565b600081600111158015611461575060005482105b8015610654575050600090815260046020526040902054600160e01b161590565b600061148d82611690565b9050836001600160a01b0316816001600160a01b0316146114c05760405162a1148160e81b815260040160405180910390fd5b60008281526006602052604090208054338082146001600160a01b0388169091141761150d576114f08633610fea565b61150d57604051632ce44b5f60e11b815260040160405180910390fd5b6001600160a01b03851661153457604051633a954ecd60e21b815260040160405180910390fd5b801561153f57600082555b6001600160a01b038681166000908152600560205260408082208054600019019055918716808252919020805460010190554260a01b17600160e11b17600085815260046020526040812091909155600160e11b841690036115d1576001840160008181526004602052604081205490036115cf5760005481146115cf5760008181526004602052604090208490555b505b83856001600160a01b0316876001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45b505050505050565b6008546001600160a01b031633146108ba5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610875565b61088983838360405180602001604052806000815250610e65565b600081806001116116ed576000548110156116ed5760008181526004602052604081205490600160e01b821690036116eb575b806000036116e45750600019016000818152600460205260409020546116c3565b9392505050565b505b604051636f96cda160e11b815260040160405180910390fd5b600880546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60408051608081018252600080825260208201819052918101829052606081019190915260008281526004602052604090205461065490604080516080810182526001600160a01b038316815260a083901c67ffffffffffffffff166020820152600160e01b831615159181019190915260e89190911c606082015290565b60008054908290036117fc5760405163b562e8dd60e01b815260040160405180910390fd5b6001600160a01b03831660008181526005602090815260408083208054680100000000000000018802019055848352600490915281206001851460e11b4260a01b178317905582840190839083907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8180a4600183015b8181146118ab57808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600101611873565b50816000036118cc57604051622e076360e81b815260040160405180910390fd5b60005550505050565b604080514260208201526bffffffffffffffffffffffff193360601b1691810191909152605481018290526000906103e9906074016040516020818303038152906040528051906020012060001c61192d9190612789565b9050600061193a82611a24565b6000848152600960205260409020909150610f1a82826126c9565b6119608484846107d0565b6001600160a01b0383163b15610f1a5761197c84848484611b50565b610f1a576040516368d2bf6b60e11b815260040160405180910390fd5b6060806119a586611c38565b856119af86611d5b565b6119b886611d5b565b6119cb6119c68a8a8a611dad565b611ee1565b6040516020016119df9594939291906127b9565b60405160208183030381529060405290506119f981611ee1565b604051602001611a099190612981565b6040516020818303038152906040529150505b949350505050565b606081600003611a4b5750506040805180820190915260018152600360fc1b602082015290565b8160005b8115611a755780611a5f81612640565b9150611a6e9050600a8361266f565b9150611a4f565b60008167ffffffffffffffff811115611a9057611a90612297565b6040519080825280601f01601f191660200182016040528015611aba576020820181803683370190505b509050815b8515611b4757611ad0600182612513565b90506000611adf600a8861266f565b611aea90600a612616565b611af49088612513565b611aff9060306129c6565b905060008160f81b905080848481518110611b1c57611b1c6124e7565b60200101906001600160f81b031916908160001a905350611b3e600a8961266f565b97505050611abf565b50949350505050565b604051630a85bd0160e11b81526000906001600160a01b0385169063150b7a0290611b859033908990889088906004016129df565b6020604051808303816000875af1925050508015611bc0575060408051601f3d908101601f19168201909252611bbd91810190612a1c565b60015b611c1e573d808015611bee576040519150601f19603f3d011682016040523d82523d6000602084013e611bf3565b606091505b508051600003611c16576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611a1c565b606081600003611c5f5750506040805180820190915260018152600360fc1b602082015290565b8160005b8115611c895780611c7381612640565b9150611c829050600a8361266f565b9150611c63565b60008167ffffffffffffffff811115611ca457611ca4612297565b6040519080825280601f01601f191660200182016040528015611cce576020820181803683370190505b509050815b8515611b4757611ce4600182612513565b90506000611cf3600a8861266f565b611cfe90600a612616565b611d089088612513565b611d139060306129c6565b905060008160f81b905080848481518110611d3057611d306124e7565b60200101906001600160f81b031916908160001a905350611d52600a8961266f565b97505050611cd3565b60608115611d85575050604080518082019091526006815265112a393ab29160d11b602082015290565b5050604080518082019091526007815266112330b639b29160c91b602082015290565b919050565b60606040518060a00160405280608081526020016144686080913990508084604051602001611ddd929190612a39565b604051602081830303815290604052905081611e955782611e1f5780604051602001611e099190612a91565b6040516020818303038152906040529050611e42565b80604051602001611e309190612e1a565b60405160208183030381529060405290505b80611e4c85612034565b604051602001611e5d929190612f19565b604051602081830303815290604052905080604051602001611e7f9190612f84565b6040516020818303038152906040529050611eb8565b80604051602001611ea69190613c4b565b60405160208183030381529060405290505b80604051602001611ec9919061444b565b60405160208183030381529060405290509392505050565b60608151600003611f0057505060408051602081019091526000815290565b60006040518060600160405280604081526020016144e86040913990506000600384516002611f2f919061262d565b611f39919061266f565b611f44906004612616565b67ffffffffffffffff811115611f5c57611f5c612297565b6040519080825280601f01601f191660200182016040528015611f86576020820181803683370190505b509050600182016020820185865187015b80821015611ff2576003820191508151603f8160121c168501518453600184019350603f81600c1c168501518453600184019350603f8160061c168501518453600184019350603f8116850151845350600183019250611f97565b505060038651066001811461200e576002811461202157612029565b603d6001830353603d6002830353612029565b603d60018303535b509195945050505050565b6060600082604051602001612049919061444b565b60408051601f19818403018152919052805160209091012090506000612070600483612789565b6040805160808101825260008152605a602082015260b49181019190915261010e60608201529091506120bc8183600481106120ae576120ae6124e7565b602002015161ffff16611c38565b95945050505050565b6001600160e01b03198116811461108e57600080fd5b6000602082840312156120ed57600080fd5b81356116e4816120c5565b60005b838110156121135781810151838201526020016120fb565b50506000910152565b600081518084526121348160208601602086016120f8565b601f01601f19169290920160200192915050565b6020815260006116e4602083018461211c565b60006020828403121561216d57600080fd5b5035919050565b80356001600160a01b0381168114611da857600080fd5b6000806040838503121561219e57600080fd5b6121a783612174565b946020939093013593505050565b634e487b7160e01b600052602160045260246000fd5b600281106121e957634e487b7160e01b600052602160045260246000fd5b9052565b604081016121fb82856121cb565b8260208301529392505050565b60008060006060848603121561221d57600080fd5b61222684612174565b925061223460208501612174565b9150604084013590509250925092565b60006020828403121561225657600080fd5b6116e482612174565b6020808252825182820181905260009190848201906040850190845b81811015610ad95783518352928401929184019160010161227b565b634e487b7160e01b600052604160045260246000fd5b600067ffffffffffffffff808411156122c8576122c8612297565b604051601f8501601f19908116603f011681019082821181831017156122f0576122f0612297565b8160405280935085815286868601111561230957600080fd5b858560208301376000602087830101525050509392505050565b60006020828403121561233557600080fd5b813567ffffffffffffffff81111561234c57600080fd5b8201601f8101841361235d57600080fd5b611a1c848235602084016122ad565b801515811461108e57600080fd5b6000806040838503121561238d57600080fd5b61239683612174565b915060208301356123a68161236c565b809150509250929050565b600080600080608085870312156123c757600080fd5b6123d085612174565b93506123de60208601612174565b925060408501359150606085013567ffffffffffffffff81111561240157600080fd5b8501601f8101871361241257600080fd5b612421878235602084016122ad565b91505092959194509250565b6020810161065482846121cb565b6000806040838503121561244e57600080fd5b61245783612174565b915061246560208401612174565b90509250929050565b6000806040838503121561248157600080fd5b50508035926020909101359150565b600181811c908216806124a457607f821691505b6020821081036124c457634e487b7160e01b600052602260045260246000fd5b50919050565b6000602082840312156124dc57600080fd5b81516116e48161236c565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b81810381811115610654576106546124fd565b600181815b80851115612561578160001904821115612547576125476124fd565b8085161561255457918102915b93841c939080029061252b565b509250929050565b60008261257857506001610654565b8161258557506000610654565b816001811461259b57600281146125a5576125c1565b6001915050610654565b60ff8411156125b6576125b66124fd565b50506001821b610654565b5060208310610133831016604e8410600b84101617156125e4575081810a610654565b6125ee8383612526565b8060001904821115612602576126026124fd565b029392505050565b60006116e48383612569565b8082028115828204841417610654576106546124fd565b80820180821115610654576106546124fd565b600060018201612652576126526124fd565b5060010190565b634e487b7160e01b600052601260045260246000fd5b60008261267e5761267e612659565b500490565b601f82111561088957600081815260208120601f850160051c810160208610156126aa5750805b601f850160051c820191505b81811015611613578281556001016126b6565b815167ffffffffffffffff8111156126e3576126e3612297565b6126f7816126f18454612490565b84612683565b602080601f83116001811461272c57600084156127145750858301515b600019600386901b1c1916600185901b178555611613565b600085815260208120601f198616915b8281101561275b5788860151825594840194600190910190840161273c565b50858210156127795787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60008261279857612798612659565b500690565b600081516127af8185602086016120f8565b9290920192915050565b7203d913730b6b2911d10112830b632ba3a32b99606d1b815285516000906127e8816013850160208b016120f8565b7f222c20226465736372697074696f6e223a20224e6f7573207669766f6e7320746013918401918201527f6f75732064616e732064657320636f756c6575727320646966666572656e746560338201527f732e222c202261747472696275746573223a5b7b2274726169745f747970652260538201527101d1011242aa2911610113b30b63ab2911d160751b6073820152865161288c816085840160208b016120f8565b7f7d2c7b2274726169745f74797065223a20224275726e6564222c202276616c756085929091019182015263032911d160e51b60a582015285516128d78160a9840160208a016120f8565b61297461296661296061292661292060a9868801017f7d2c7b2274726169745f74797065223a2022426c6f62222c202276616c75652281526101d160f51b602082015260220190565b8a61279d565b7f7d5d2c2022696d616765223a2022646174613a696d6167652f7376672b786d6c8152670ed8985cd94d8d0b60c21b602082015260280190565b8761279d565b61227d60f01b815260020190565b9998505050505050505050565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c0000008152600082516129b981601d8501602087016120f8565b91909101601d0192915050565b60ff8181168382160190811115610654576106546124fd565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090612a129083018461211c565b9695505050505050565b600060208284031215612a2e57600080fd5b81516116e4816120c5565b60008351612a4b8184602088016120f8565b7f3c646566733e3c7374796c653e203a726f6f747b2d2d6875653a2000000000009083019081528351612a8581601b8401602088016120f8565b01601b01949350505050565b60008251612aa38184602087016120f8565b7f3b202d2d687565436f6d706c656d656e743a2063616c6328766172282d2d68759201918252507f6529202b20313830293b202d2d6875655269676874416e616c6f676f75733a2060208201527f63616c6328766172282d2d68756529202b203330293b202d2d6875654c65667460408201527f416e616c6f676f75733a2063616c6328766172282d2d68756529202d2033302960608201527f3b202d2d6875655269676874416e616c6f676f7573323a2063616c632876617260808201527f282d2d68756529202b203630293b202d2d6875654c656674416e616c6f676f7560a08201527f73323a2063616c6328766172282d2d68756529202d203630293b202d2d68756560c08201527f5269676874416e616c6f676f7573333a2063616c6328766172282d2d6875652960e08201527f202b203830293b202d2d6875654c656674416e616c6f676f7573333a2063616c6101008201527f6328766172282d2d68756529202d203830293b202d2d616363656e7456313a206101208201527f68736c28766172282d2d6875655269676874416e616c6f676f757329203530256101408201527f20353025293b202d2d616363656e7456323a2068736c28766172282d2d6875656101608201527f4c656674416e616c6f676f7573292035302520353025293b202d2d616363656e6101808201527f7456333a2068736c28766172282d2d6875655269676874416e616c6f676f75736101a08201527f32292035302520353025293b202d2d616363656e7456343a2068736c287661726101c08201527f282d2d6875654c656674416e616c6f676f757332292035302520353025293b206101e08201527f2d2d616363656e7456353a2068736c28766172282d2d6875655269676874416e6102008201527f616c6f676f757333292035302520353025293b207d202e636c732d327b66696c6102208201527f6c3a20766172282d2d616363656e745631293b7d202e636c732d337b66696c6c6102408201527f3a20766172282d2d616363656e745632293b7d202e636c732d347b66696c6c3a6102608201527f20766172282d2d616363656e745633293b7d202e636c732d357b66696c6c3a206102808201527f766172282d2d616363656e745634293b7d202e636c732d367b66696c6c3a20766102a082015270030b9141696b0b1b1b2b73a2b1a949dbe9607d1b6102c08201526102d101919050565b60008251612e2c8184602087016120f8565b7f3b7d202e636c732d327b66696c6c3a20677261793b206f7061636974793a20309201918252507f2e33333b207d202e636c732d337b66696c6c3a20677261793b206f706163697460208201527f793a20302e35333b207d202e636c732d347b66696c6c3a20677261793b206f7060408201527f61636974793a20302e37333b20207d202e636c732d357b66696c6c3a2067726160608201527f793b206f7061636974793a20302e34303b20207d202e636c732d367b66696c6c60808201527f3a20677261793b206f7061636974793a20302e36333b207d200000000000000060a082015260b901919050565b60008351612f2b8184602088016120f8565b7f2e726f74617465647b207472616e73666f726d3a20726f7461746528000000009083019081528351612f6581601c8401602088016120f8565b65646567293b7d60d01b601c9290910191820152602201949350505050565b60008251612f968184602087016120f8565b710101e17b9ba3cb6329f101e17b232b3399f160751b9201918252507f203c672069643d2243616c7175655f322220646174612d6e616d653d2243616c60128201527f7175652032223e203c7265637420636c6173733d22636c732d312220783d223060328201527f2e352220793d22302e35222077696474683d2236303022206865696768743d2260528201527f36303022202f3e203c2f673e203c672069643d2243616c7175655f312220646160728201527f74612d6e616d653d2243616c7175652031223e203c7265637420636c6173733d60928201527f22636c732d322220783d2236302e33362220793d2236302e333822207769647460b28201527f683d2237332e323622206865696768743d2237332e323622202f3e203c72656360d282018190527f7420636c6173733d22636c732d332220783d223134312e37362220793d22363060f28301527f2e3338222077696474683d2237332e323622206865696768743d2237332e32366101128301527f22202f3e203c7265637420636c6173733d22636c732d342220783d223232332e6101328301527f31362220793d2236302e3338222077696474683d2237332e32362220686569676101528301527f68743d2237332e323622202f3e203c7265637420636c6173733d22636c732d356101728301527f2220783d223330342e35362220793d2236302e3338222077696474683d2237336101928301527f2e323622206865696768743d2237332e323622202f3e203c7265637420636c616101b283018190527f73733d22636c732d322220783d223338352e39352220793d2236302e333822206101d28401527f77696474683d2237332e323622206865696768743d2237332e323622202f3e206101f284018190527f3c7265637420636c6173733d22636c732d362220783d223436372e33352220796102128501527f3d2236302e3338222077696474683d2237332e323622206865696768743d22376102328501527f332e323622202f3e203c7265637420636c6173733d22636c732d332220783d226102528501527f36302e33392220793d223134312e3738222077696474683d2237332e323622206102728501527f6865696768743d2237332e323622202f3e203c7265637420636c6173733d226361029285018190527f6c732d352220783d223134312e37392220793d223134312e37382220776964746102b28601526102d28501939093527f7420636c6173733d22636c732d362220783d223232332e31392220793d2231346102f28501527f312e3738222077696474683d2237332e323622206865696768743d2237332e326103128501527f3622202f3e203c7265637420636c6173733d22636c732d322220783d223330346103328501527f2e35382220793d223134312e3738222077696474683d2237332e3236222068656103528501527f696768743d2237332e323622202f3e203c7265637420636c6173733d22636c736103728501527f2d332220783d223338352e39382220793d223134312e3738222077696474683d6103928501527f2237332e323622206865696768743d2237332e323622202f3e203c72656374206103b285018190527f636c6173733d22636c732d322220783d223436372e33382220793d223134312e6103d28601527f3738222077696474683d2237332e323622206865696768743d2237332e3236226103f28601527f202f3e203c7265637420636c6173733d22636c732d362220783d2236302e33386104128601527f2220793d223232332e3137222077696474683d2237332e3236222068656967686104328601527f743d2237332e323622202f3e203c7265637420636c6173733d22636c732d34226104528601527f20783d223134312e37382220793d223232332e3137222077696474683d22373361047286015261049285018390527f73733d22636c732d322220783d223232332e31372220793d223232332e3137226104b28601527f2077696474683d2237332e323622206865696768743d2237332e323622202f3e6104d28601527f203c7265637420636c6173733d22636c732d342220783d223330342e353722206104f28601527f793d223232332e3137222077696474683d2237332e323622206865696768743d6105128601527f2237332e323622202f3e203c7265637420636c6173733d22636c732d352220786105328601527f3d223338352e39372220793d223232332e3137222077696474683d2237332e326105528601527f3622206865696768743d2237332e323622202f3e203c7265637420636c6173736105728601527f3d22636c732d332220783d223436372e33362220793d223232332e31372220776105928601527f696474683d2237332e323622206865696768743d2237332e323622202f3e203c6105b28601527f7265637420636c6173733d22636c732d362220783d2236302e34312220793d226105d28601527f3330342e3536222077696474683d2237332e323622206865696768743d2237336105f28601527f2e323622202f3e203c7265637420636c6173733d22636c732d352220783d22316106128601527f34312e382220793d223330342e3536222077696474683d2237332e32362220686106328601527f65696768743d2237332e323622202f3e203c7265637420636c6173733d22636c6106528601527f732d342220783d223232332e322220793d223330342e3536222077696474683d6106728601526106928501527f636c6173733d22636c732d352220783d223330342e362220793d223330342e356106b28501527f36222077696474683d2237332e323622206865696768743d2237332e323622206106d285018190527f2f3e203c7265637420636c6173733d22636c732d362220783d223338352e39396106f28601527f2220793d223330342e3536222077696474683d2237332e3236222068656967686107128601527f743d2237332e323622202f3e203c7265637420636c6173733d22636c732d32226107328601527f20783d223436372e33392220793d223330342e3536222077696474683d2237336107528601526107728501929092527f73733d22636c732d342220783d2236302e33352220793d223338352e393622206107928501526107b28401527f3c7265637420636c6173733d22636c732d332220783d223134312e37352220796107d28401527f3d223338352e3936222077696474683d2237332e323622206865696768743d226107f28401527f37332e323622202f3e203c7265637420636c6173733d22636c732d362220783d6108128401527f223232332e31342220793d223338352e3936222077696474683d2237332e32366108328401527f22206865696768743d2237332e323622202f3e203c7265637420636c6173733d6108528401527f22636c732d342220783d223330342e35342220793d223338352e3936222077696108728401527f6474683d2237332e323622206865696768743d2237332e323622202f3e203c726108928401527f65637420636c6173733d22636c732d352220783d223338352e39342220793d226108b28401527f3338352e3936222077696474683d2237332e323622206865696768743d2237336108d28401527f2e323622202f3e203c7265637420636c6173733d22636c732d332220783d22346108f28401527f36372e33342220793d223338352e3936222077696474683d2237332e323622206109128401526109328301919091527f6c732d342220783d2236302e33382220793d223436372e3336222077696474686109528301527f3d2237332e323622206865696768743d2237332e323622202f3e203c726563746109728301527f20636c6173733d22636c732d362220783d223134312e37382220793d223436376109928301527f2e3336222077696474683d2237332e323622206865696768743d2237332e32366109b28301527f22202f3e203c7265637420636c6173733d22636c732d352220783d223232332e6109d28301527f31372220793d223436372e3336222077696474683d2237332e323622206865696109f28301527f6768743d2237332e323622202f3e203c7265637420636c6173733d22636c732d610a128301527f332220783d223330342e35372220793d223436372e3336222077696474683d22610a328301527f37332e323622206865696768743d2237332e323622202f3e203c726563742063610a528301527f6c6173733d22636c732d362220783d223338352e39372220793d223436372e33610a72830152610a928201527f2f3e203c7265637420636c6173733d22636c732d352220783d223436372e3336610ab28201527f2220793d223436372e3336222077696474683d2237332e323622206865696768610ad28201527f743d2237332e323622202f3e203c2f673e203c2f7376673e0000000000000000610af2820152610b0a01919050565b60008251613c5d8184602087016120f8565b7f3b202d2d687565436f6d706c656d656e743a2063616c6328766172282d2d68759201918252507f6529202b20313830293b202d2d616363656e7456313a2068736c28766172282d60208201527f2d687565292035302520353025293b202d2d616363656e7456323a2068736c2860408201527f766172282d2d687565436f6d706c656d656e74292035302520353025293b202d60608201527f2d7363616c65466163746f723a2063616c6328302e35202b20766172282d2d6860808201527f756529202f20313030293b207d20737667207b207472616e73666f726d2d6f7260a08201527f6967696e3a20353025203530253b20616e696d6174696f6e3a206d6f7665203360c08201527f3673206c696e65617220696e66696e6974653b207d20406b65796672616d657360e08201527f206d6f7665207b203025207b207472616e73666f726d3a207363616c652831296101008201527f20726f746174652830293b207d2031303025207b207472616e73666f726d3a206101208201527f7363616c6528312920726f7461746528333630646567293b207d207d203c2f736101408201527f74796c653e203c6c696e6561724772616469656e742069643d2273772d6772616101608201527f6469656e74222078313d2230222078323d2231222079313d2231222079323d226101808201527f30223e203c73746f702069643d2273746f7031222073746f702d636f6c6f723d6101a08201527f22766172282d2d616363656e7456312922206f66667365743d223025222f3e206101c08201527f3c73746f702069643d2273746f7032222073746f702d636f6c6f723d227661726101e08201527f282d2d616363656e7456322922206f66667365743d2231303025222f3e203c2f6102008201527f6c696e6561724772616469656e743e203c2f646566733e203c66696c746572206102208201527f69643d22736861646f7722207472616e73666f726d3d22726f746174652876616102408201527f72282d2d6875652929223e203c666544726f70536861646f772064783d2230226102608201527f2064793d22302220737464446576696174696f6e3d2232302220666c6f6f642d6102808201527f636f6c6f723d2267726179222f3e203c2f66696c7465723e203c7061746820666102a08201527f696c6c3d2275726c282373772d6772616469656e7429222066696c7465723d226102c08201527f75726c2823736861646f7729223e203c616e696d6174652061747472696275746102e08201527f654e616d653d226422206475723d223336732220726570656174436f756e743d6103008201527f22696e646566696e697465222076616c7565733d224d3433312e33203132312e6103208201527f396332322034302e312031312e332039372e352031332e33203134362e3920326103408201527f2034392e352031362e362039312e3120342e33203132312e382d31322e3220336103608201527f302e362d35312e332035302e342d38382e352035352e312d33372e3120342e376103808201527f2d37322e342d352e372d3130382e382d31372e312d33362e352d31312e332d376103a08201527f342e312d32332e372d3130342d35322d32392e392d32382e322d35322d37322e6103c08201527f342d34382e342d3131352e3420332e352d34332033322e372d38342e382037306103e08201527f2e352d3132322e322033372e372d33372e332038342d37302e32203133342e356104008201527f2d37352e312035302e342d35203130352e312031372e39203132372e312035386104208201527f7a3b204d3430342e34203137362e376332302e392031362e342032302e3820356104408201527f382e382033382e38203130362e322031382e312034372e342035342e342039396104608201527f2e372034302e39203132332e362d31332e352032332e392d37362e372031392e6104808201527f332d3133312e362034302e342d35342e382032312d3130312e322036372e372d6104a08201527f3135302e352037312e372d34392e3420342e312d3130312e372d33342e352d316104c08201527f30372e382d38312e39433838203338392e322031323820333333203134342e326104e08201527f203237386331362e322d35352e3120382e352d3130382e382033302e352d31326105008201527f352032322d31362e312037332e3720352e35203132302e342031312e332034366105208201527f2e3720352e392038382e352d332e39203130392e332031322e347a3b204d34336105408201527f312e33203132312e396332322034302e312031312e332039372e352031332e336105608201527f203134362e3920322034392e352031362e362039312e3120342e33203132312e6105808201527f382d31322e322033302e362d35312e332035302e342d38382e352035352e312d6105a08201527f33372e3120342e372d37322e342d352e372d3130382e382d31372e312d33362e6105c08201527f352d31312e332d37342e312d32332e372d3130342d35322d32392e392d32382e6105e08201527f322d35322d37322e342d34382e342d3131352e3420332e352d34332033322e376106008201527f2d38342e382037302e352d3132322e322033372e372d33372e332038342d37306106208201527f2e32203133342e352d37352e312035302e342d35203130352e312031372e39206106408201527f3132372e312035387a3b20222f3e203c2f706174683e203c2f7376673e00000061066082015261067d01919050565b6000825161445d8184602087016120f8565b919091019291505056fe3c73766720786d6c6e733d22687474703a2f2f7777772e77332e6f72672f323030302f737667222076696577426f783d2230203020363031203630312220636c6173733d22726f746174656422207374796c653d226261636b67726f756e642d636f6c6f723a626c61636b3b206f766572666c6f773a2068696464656e3b223e4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2fa26469706673582212202de7eedc9b50efd1d049d9d4a3efe61cefca7eee0ed53e55307406eca0e014b364736f6c63430008130033

Deployed Bytecode Sourcemap

81999:5296:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44136:639;;;;;;;;;;-1:-1:-1;44136:639:0;;;;;:::i;:::-;;:::i;:::-;;;565:14:1;;558:22;540:41;;528:2;513:18;44136:639:0;;;;;;;;45038:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;51529:218::-;;;;;;;;;;-1:-1:-1;51529:218:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;1719:32:1;;;1701:51;;1689:2;1674:18;51529:218:0;1555:203:1;50962:408:0;;;;;;:::i;:::-;;:::i;:::-;;86637:105;;;;;;;;;;;;86715:11;;86728:5;;86715:11;;;;;86637:105;;;;;;;;;:::i;40789:323::-;;;;;;;;;;-1:-1:-1;40388:1:0;41063:12;40850:7;41047:13;:28;-1:-1:-1;;41047:46:0;40789:323;;;2989:25:1;;;2977:2;2962:18;40789:323:0;2843:177:1;85979:184:0;;;;;;:::i;:::-;;:::i;87178:114::-;;;;;;;;;;;;;:::i;86171:192::-;;;;;;:::i;:::-;;:::i;82234:26::-;;;;;;;;;;;;;;;;82190:35;;;;;;;;;;-1:-1:-1;82190:35:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;46431:152;;;;;;;;;;-1:-1:-1;46431:152:0;;;;;:::i;:::-;;:::i;41973:233::-;;;;;;;;;;-1:-1:-1;41973:233:0;;;;;:::i;:::-;;:::i;34625:103::-;;;;;;;;;;;;;:::i;80759:900::-;;;;;;;;;;-1:-1:-1;80759:900:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;82408:79::-;;;;;;;;;;;;;:::i;33977:87::-;;;;;;;;;;-1:-1:-1;34050:6:0;;-1:-1:-1;;;;;34050:6:0;33977:87;;45214:104;;;;;;;;;;;;;:::i;83350:470::-;;;;;;;;;;-1:-1:-1;83350:470:0;;;;;:::i;:::-;;:::i;82368:31::-;;;;;;;;;;;;;;;;85420:551;;;;;;:::i;:::-;;:::i;52087:234::-;;;;;;;;;;-1:-1:-1;52087:234:0;;;;;:::i;:::-;;:::i;86750:94::-;;;;;;;;;;-1:-1:-1;86750:94:0;;;;;:::i;:::-;;:::i;83828:95::-;;;;;;;;;;-1:-1:-1;83828:95:0;;;;;:::i;:::-;;:::i;82099:40::-;;;;;;;;;;-1:-1:-1;82099:40:0;;;;;:::i;:::-;;:::i;86371:258::-;;;;;;:::i;:::-;;:::i;86952:218::-;;;;;;;;;;-1:-1:-1;86952:218:0;;;;;:::i;:::-;;:::i;82332:23::-;;;;;;;;;;-1:-1:-1;82332:23:0;;;;;;;;;;;;;;;:::i;82146:37::-;;;;;;;;;;-1:-1:-1;82146:37:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;52478:164;;;;;;;;;;-1:-1:-1;52478:164:0;;;;;:::i;:::-;;:::i;34883:201::-;;;;;;;;;;-1:-1:-1;34883:201:0;;;;;:::i;:::-;;:::i;86852:92::-;;;;;;;;;;-1:-1:-1;86852:92:0;;;;;:::i;:::-;;:::i;84223:1133::-;;;;;;;;;;-1:-1:-1;84223:1133:0;;;;;:::i;:::-;;:::i;44136:639::-;44221:4;-1:-1:-1;;;;;;;;;44545:25:0;;;;:102;;-1:-1:-1;;;;;;;;;;44622:25:0;;;44545:102;:179;;;-1:-1:-1;;;;;;;;;;44699:25:0;;;44545:179;44525:199;44136:639;-1:-1:-1;;44136:639:0:o;45038:100::-;45092:13;45125:5;45118:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45038:100;:::o;51529:218::-;51605:7;51630:16;51638:7;51630;:16::i;:::-;51625:64;;51655:34;;-1:-1:-1;;;51655:34:0;;;;;;;;;;;51625:64;-1:-1:-1;51709:24:0;;;;:15;:24;;;;;:30;-1:-1:-1;;;;;51709:30:0;;51529:218::o;50962:408::-;51051:13;51067:16;51075:7;51067;:16::i;:::-;51051:32;-1:-1:-1;75295:10:0;-1:-1:-1;;;;;51100:28:0;;;51096:175;;51148:44;51165:5;75295:10;52478:164;:::i;51148:44::-;51143:128;;51220:35;;-1:-1:-1;;;51220:35:0;;;;;;;;;;;51143:128;51283:24;;;;:15;:24;;;;;;:35;;-1:-1:-1;;;;;;51283:35:0;-1:-1:-1;;;;;51283:35:0;;;;;;;;;51334:28;;51283:24;;51334:28;;;;;;;51040:330;50962:408;;:::o;85979:184::-;238:42;1366:43;:47;1362:225;;1435:67;;-1:-1:-1;;;1435:67:0;;1484:4;1435:67;;;7844:34:1;1491:10:0;7894:18:1;;;7887:43;238:42:0;;1435:40;;7779:18:1;;1435:67:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;1430:146;;1530:30;;-1:-1:-1;;;1530:30:0;;1549:10;1530:30;;;1701:51:1;1674:18;;1530:30:0;;;;;;;;1430:146;86118:37:::1;86137:4;86143:2;86147:7;86118:18;:37::i;:::-;85979:184:::0;;;:::o;87178:114::-;33863:13;:11;:13::i;:::-;87236:47:::1;::::0;87244:10:::1;::::0;87261:21:::1;87236:47:::0;::::1;;;::::0;::::1;::::0;;;87261:21;87244:10;87236:47;::::1;;;;;;87228:56;;;::::0;::::1;;87178:114::o:0;86171:192::-;238:42;1366:43;:47;1362:225;;1435:67;;-1:-1:-1;;;1435:67:0;;1484:4;1435:67;;;7844:34:1;1491:10:0;7894:18:1;;;7887:43;238:42:0;;1435:40;;7779:18:1;;1435:67:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;1430:146;;1530:30;;-1:-1:-1;;;1530:30:0;;1549:10;1530:30;;;1701:51:1;1674:18;;1530:30:0;1555:203:1;1430:146:0;86314:41:::1;86337:4;86343:2;86347:7;86314:22;:41::i;46431:152::-:0;46503:7;46546:27;46565:7;46546:18;:27::i;41973:233::-;42045:7;-1:-1:-1;;;;;42069:19:0;;42065:60;;42097:28;;-1:-1:-1;;;42097:28:0;;;;;;;;;;;42065:60;-1:-1:-1;;;;;;42143:25:0;;;;;:18;:25;;;;;;36132:13;42143:55;;41973:233::o;34625:103::-;33863:13;:11;:13::i;:::-;34690:30:::1;34717:1;34690:18;:30::i;80759:900::-:0;80837:16;80891:19;80925:25;80965:22;80990:16;81000:5;80990:9;:16::i;:::-;80965:41;;81021:25;81063:14;81049:29;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;81049:29:0;;81021:57;;81093:31;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;81093:31:0;40388:1;81139:472;81188:14;81173:11;:29;81139:472;;81240:15;81253:1;81240:12;:15::i;:::-;81228:27;;81278:9;:16;;;81319:8;81274:73;81369:14;;-1:-1:-1;;;;;81369:28:0;;81365:111;;81442:14;;;-1:-1:-1;81365:111:0;81519:5;-1:-1:-1;;;;;81498:26:0;:17;-1:-1:-1;;;;;81498:26:0;;81494:102;;81575:1;81549:8;81558:13;;;;;;81549:23;;;;;;;;:::i;:::-;;;;;;:27;;;;;81494:102;81204:3;;81139:472;;;-1:-1:-1;81632:8:0;;80759:900;-1:-1:-1;;;;;;80759:900:0:o;82408:79::-;33863:13;:11;:13::i;:::-;82459:20:::1;82465:10;82477:1;82459:5;:20::i;45214:104::-:0;45270:13;45303:7;45296:14;;;;;:::i;83350:470::-;83412:4;;83486:9;83412:4;83507:287;83528:11;:18;83526:1;:20;83507:287;;;83568:8;83600:1;83579:11;:18;:22;;;;:::i;:::-;83568:33;;83616:11;83630;83642:1;83630:14;;;;;;;;:::i;:::-;;;;;-1:-1:-1;;;;;;83630:14:0;;;-1:-1:-1;83630:14:0;;83659:10;83709:17;83721:4;83630:14;83709:17;:::i;:::-;83697:29;-1:-1:-1;83773:5:0;83777:1;83773:3;:5;:::i;:::-;83768:11;;:2;:11;:::i;:::-;83754:26;;83759:4;83754:26;:::i;:::-;83745:36;;;;:::i;:::-;;;83553:241;;;;83548:3;;;;;:::i;:::-;;;;83507:287;;;-1:-1:-1;83809:3:0;;83350:470;-1:-1:-1;;;83350:470:0:o;85420:551::-;85493:15;85478:11;;;;;:30;;;;;;;:::i;:::-;;85475:66;;85510:31;;-1:-1:-1;;;85510:31:0;;10607:2:1;85510:31:0;;;10589:21:1;10646:2;10626:18;;;10619:30;-1:-1:-1;;;10665:18:1;;;10658:51;10726:18;;85510:31:0;10405:345:1;85475:66:0;40388:1;41063:12;40850:7;41047:13;85571:4;;41047:28;;-1:-1:-1;;41047:46:0;85555:20;85552:198;;;85623:5;;85612:16;;:8;:16;:::i;:::-;85599:9;:29;;85591:56;;;;-1:-1:-1;;;85591:56:0;;10957:2:1;85591:56:0;;;10939:21:1;10996:2;10976:18;;;10969:30;-1:-1:-1;;;11015:18:1;;;11008:44;11069:18;;85591:56:0;10755:338:1;85591:56:0;85552:198;;;85700:9;;85688:8;:21;;85680:58;;;;-1:-1:-1;;;85680:58:0;;11300:2:1;85680:58:0;;;11282:21:1;11339:2;11319:18;;;11312:30;11378:26;11358:18;;;11351:54;11422:18;;85680:58:0;11098:348:1;85680:58:0;85768:9;85781:10;85768:23;85760:55;;;;-1:-1:-1;;;85760:55:0;;11653:2:1;85760:55:0;;;11635:21:1;11692:2;11672:18;;;11665:30;-1:-1:-1;;;11711:18:1;;;11704:49;11770:18;;85760:55:0;11451:343:1;85760:55:0;85831:6;85826:138;85847:8;85843:1;:12;85826:138;;;85877:25;85887:14;40531:7;40558:13;;40476:103;85887:14;85877:9;:25::i;:::-;85932:20;85938:10;85950:1;85932:5;:20::i;:::-;85857:3;;;;:::i;:::-;;;;85826:138;;;;85420:551;:::o;52087:234::-;75295:10;52182:39;;;;:18;:39;;;;;;;;-1:-1:-1;;;;;52182:49:0;;;;;;;;;;;;:60;;-1:-1:-1;;52182:60:0;;;;;;;;;;52258:55;;540:41:1;;;52182:49:0;;75295:10;52258:55;;513:18:1;52258:55:0;;;;;;;52087:234;;:::o;86750:94::-;33863:13;:11;:13::i;:::-;86819:5:::1;:17:::0;86750:94::o;83828:95::-;33863:13;:11;:13::i;:::-;83895:9:::1;:20:::0;83828:95::o;82099:40::-;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;86371:258::-;238:42;1366:43;:47;1362:225;;1435:67;;-1:-1:-1;;;1435:67:0;;1484:4;1435:67;;;7844:34:1;1491:10:0;7894:18:1;;;7887:43;238:42:0;;1435:40;;7779:18:1;;1435:67:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;1430:146;;1530:30;;-1:-1:-1;;;1530:30:0;;1549:10;1530:30;;;1701:51:1;1674:18;;1530:30:0;1555:203:1;1430:146:0;86574:47:::1;86597:4;86603:2;86607:7;86616:4;86574:22;:47::i;:::-;86371:258:::0;;;;:::o;86952:218::-;87044:13;87077:85;87098:7;87107:9;:18;87117:7;87107:18;;;;;;;;;;;87077:85;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;87127:17:0;;;;:8;:17;;;;;;;;;87146:6;:15;;;;;;;87127:17;;;;;-1:-1:-1;87146:15:0;;-1:-1:-1;87077:20:0;:85::i;52478:164::-;-1:-1:-1;;;;;52599:25:0;;;52575:4;52599:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;52478:164::o;34883:201::-;33863:13;:11;:13::i;:::-;-1:-1:-1;;;;;34972:22:0;::::1;34964:73;;;::::0;-1:-1:-1;;;34964:73:0;;12001:2:1;34964:73:0::1;::::0;::::1;11983:21:1::0;12040:2;12020:18;;;12013:30;12079:34;12059:18;;;12052:62;-1:-1:-1;;;12130:18:1;;;12123:36;12176:19;;34964:73:0::1;11799:402:1::0;34964:73:0::1;35048:28;35067:8;35048:18;:28::i;:::-;34883:201:::0;:::o;86852:92::-;33863:13;:11;:13::i;:::-;86930:5:::1;86925:11;;;;;;;;:::i;:::-;86911;:25:::0;;-1:-1:-1;;86911:25:0::1;::::0;;;;::::1;;;;;;:::i;:::-;;;;;;86852:92:::0;:::o;84223:1133::-;84349:13;84357:4;84349:7;:13::i;:::-;-1:-1:-1;;;;;84335:27:0;:10;-1:-1:-1;;;;;84335:27:0;;:58;;;;;84380:13;84388:4;84380:7;:13::i;:::-;-1:-1:-1;;;;;84366:27:0;:10;-1:-1:-1;;;;;84366:27:0;;84335:58;84327:100;;;;-1:-1:-1;;;84327:100:0;;12408:2:1;84327:100:0;;;12390:21:1;12447:2;12427:18;;;12420:30;12486:31;12466:18;;;12459:59;12535:18;;84327:100:0;12206:353:1;84327:100:0;84498:14;;;;:8;:14;;;;;;;;84497:15;:34;;;;-1:-1:-1;84517:14:0;;;;:8;:14;;;;;;;;84516:15;84497:34;84489:81;;;;-1:-1:-1;;;84489:81:0;;12766:2:1;84489:81:0;;;12748:21:1;12805:2;12785:18;;;12778:30;12844:34;12824:18;;;12817:62;-1:-1:-1;;;12895:18:1;;;12888:32;12937:19;;84489:81:0;12564:398:1;84489:81:0;84640:12;;;;:6;:12;;;;;;;;84639:13;:30;;;;-1:-1:-1;84657:12:0;;;;:6;:12;;;;;;;;84656:13;84639:30;84631:70;;;;-1:-1:-1;;;84631:70:0;;13169:2:1;84631:70:0;;;13151:21:1;13208:2;13188:18;;;13181:30;13247:29;13227:18;;;13220:57;13294:18;;84631:70:0;12967:351:1;84631:70:0;84769:9;84789:15;;;:9;:15;;;;;84781:24;;;;84789:15;84781:24;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:7;:24::i;:::-;84769:36;;84816:9;84828:24;84836:9;:15;84846:4;84836:15;;;;;;;;;;;84828:24;;;;;:::i;:::-;84816:36;-1:-1:-1;84863:11:0;84893:1;84878:11;84816:36;84878:4;:11;:::i;:::-;84877:17;;;;:::i;:::-;84863:31;;84905:23;84931:16;84940:6;84931:8;:16::i;:::-;84997:14;;;;:8;:14;;;;;;:21;;-1:-1:-1;;84997:21:0;;;85014:4;84997:21;;;;;;85029:14;;;;;;:21;;;;;;;;;;84905:42;;-1:-1:-1;85117:6:0;;85124:14;40531:7;40558:13;;40476:103;85124:14;85117:22;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;85185:9;85157;:25;85167:14;40531:7;40558:13;;40476:103;85167:14;85157:25;;;;;;;;;;;:37;;;;;;:::i;:::-;;85256:20;85262:10;85274:1;85256:5;:20::i;:::-;85292;;2989:25:1;;;85292:20:0;;2977:2:1;2962:18;85292:20:0;;;;;;;85328;;2989:25:1;;;85328:20:0;;2977:2:1;2962:18;85328:20:0;;;;;;;84272:1084;;;;84223:1133;;:::o;52900:282::-;52965:4;53021:7;40388:1;53002:26;;:66;;;;;53055:13;;53045:7;:23;53002:66;:153;;;;-1:-1:-1;;53106:26:0;;;;:17;:26;;;;;;-1:-1:-1;;;53106:44:0;:49;;52900:282::o;55168:2825::-;55310:27;55340;55359:7;55340:18;:27::i;:::-;55310:57;;55425:4;-1:-1:-1;;;;;55384:45:0;55400:19;-1:-1:-1;;;;;55384:45:0;;55380:86;;55438:28;;-1:-1:-1;;;55438:28:0;;;;;;;;;;;55380:86;55480:27;54276:24;;;:15;:24;;;;;54504:26;;75295:10;53901:30;;;-1:-1:-1;;;;;53594:28:0;;53879:20;;;53876:56;55666:180;;55759:43;55776:4;75295:10;52478:164;:::i;55759:43::-;55754:92;;55811:35;;-1:-1:-1;;;55811:35:0;;;;;;;;;;;55754:92;-1:-1:-1;;;;;55863:16:0;;55859:52;;55888:23;;-1:-1:-1;;;55888:23:0;;;;;;;;;;;55859:52;56060:15;56057:160;;;56200:1;56179:19;56172:30;56057:160;-1:-1:-1;;;;;56597:24:0;;;;;;;:18;:24;;;;;;56595:26;;-1:-1:-1;;56595:26:0;;;56666:22;;;;;;;;;56664:24;;-1:-1:-1;56664:24:0;;;49820:11;49795:23;49791:41;49778:63;-1:-1:-1;;;49778:63:0;56959:26;;;;:17;:26;;;;;:175;;;;-1:-1:-1;;;57254:47:0;;:52;;57250:627;;57359:1;57349:11;;57327:19;57482:30;;;:17;:30;;;;;;:35;;57478:384;;57620:13;;57605:11;:28;57601:242;;57767:30;;;;:17;:30;;;;;:52;;;57601:242;57308:569;57250:627;57924:7;57920:2;-1:-1:-1;;;;;57905:27:0;57914:4;-1:-1:-1;;;;;57905:27:0;;;;;;;;;;;57943:42;55299:2694;;;55168:2825;;;:::o;34142:132::-;34050:6;;-1:-1:-1;;;;;34050:6:0;75295:10;34206:23;34198:68;;;;-1:-1:-1;;;34198:68:0;;15986:2:1;34198:68:0;;;15968:21:1;;;16005:18;;;15998:30;16064:34;16044:18;;;16037:62;16116:18;;34198:68:0;15784:356:1;58089:193:0;58235:39;58252:4;58258:2;58262:7;58235:39;;;;;;;;;;;;:16;:39::i;47586:1275::-;47653:7;47688;;40388:1;47737:23;47733:1061;;47790:13;;47783:4;:20;47779:1015;;;47828:14;47845:23;;;:17;:23;;;;;;;-1:-1:-1;;;47934:24:0;;:29;;47930:845;;48599:113;48606:6;48616:1;48606:11;48599:113;;-1:-1:-1;;;48677:6:0;48659:25;;;;:17;:25;;;;;;48599:113;;;48745:6;47586:1275;-1:-1:-1;;;47586:1275:0:o;47930:845::-;47805:989;47779:1015;48822:31;;-1:-1:-1;;;48822:31:0;;;;;;;;;;;35244:191;35337:6;;;-1:-1:-1;;;;;35354:17:0;;;-1:-1:-1;;;;;;35354:17:0;;;;;;;35387:40;;35337:6;;;35354:17;35337:6;;35387:40;;35318:16;;35387:40;35307:128;35244:191;:::o;47034:161::-;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47162:24:0;;;;:17;:24;;;;;;47143:44;;-1:-1:-1;;;;;;;;;;;;;49070:41:0;;;;36791:3;49156:33;;;49122:68;;-1:-1:-1;;;49122:68:0;-1:-1:-1;;;49220:24:0;;:29;;-1:-1:-1;;;49201:48:0;;;;37312:3;49289:28;;;;-1:-1:-1;;;49260:58:0;-1:-1:-1;48960:366:0;62549:2966;62622:20;62645:13;;;62673;;;62669:44;;62695:18;;-1:-1:-1;;;62695:18:0;;;;;;;;;;;62669:44;-1:-1:-1;;;;;63201:22:0;;;;;;:18;:22;;;;36270:2;63201:22;;;:71;;63239:32;63227:45;;63201:71;;;63515:31;;;:17;:31;;;;;-1:-1:-1;50251:15:0;;50225:24;50221:46;49820:11;49795:23;49791:41;49788:52;49778:63;;63515:173;;63750:23;;;;63515:31;;63201:22;;64515:25;63201:22;;64368:335;65029:1;65015:12;65011:20;64969:346;65070:3;65061:7;65058:16;64969:346;;65288:7;65278:8;65275:1;65248:25;65245:1;65242;65237:59;65123:1;65110:15;64969:346;;;64973:77;65348:8;65360:1;65348:13;65344:45;;65370:19;;-1:-1:-1;;;65370:19:0;;;;;;;;;;;65344:45;65406:13;:19;-1:-1:-1;85979:184:0;;;:::o;83931:236::-;84019:50;;;84036:15;84019:50;;;16330:19:1;-1:-1:-1;;84053:10:0;16387:2:1;16383:15;16379:53;16365:12;;;16358:75;;;;16449:12;;;16442:28;;;83987:14:0;;84074:4;;16486:12:1;;84019:50:0;;;;;;;;;;;;84009:61;;;;;;84004:67;;:74;;;;:::i;:::-;83987:91;;84089:17;84109:19;84118:9;84109:8;:19::i;:::-;84139:14;;;;:9;:14;;;;;84089:39;;-1:-1:-1;84139:20:0;84089:39;84139:14;:20;:::i;58880:407::-;59055:31;59068:4;59074:2;59078:7;59055:12;:31::i;:::-;-1:-1:-1;;;;;59101:14:0;;;:19;59097:183;;59140:56;59171:4;59177:2;59181:7;59190:5;59140:30;:56::i;:::-;59135:145;;59224:40;;-1:-1:-1;;;59224:40:0;;;;;;;;;;;25067:854;25172:13;25200:18;25316:17;25325:7;25316:8;:17::i;:::-;25479:3;25537:22;25550:8;25537:12;:22::i;:::-;25598:20;25611:6;25598:12;:20::i;:::-;25676:54;25696:32;25706:3;25711:8;25721:6;25696:9;:32::i;:::-;25676:13;:54::i;:::-;25249:511;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;25235:526;;25875:26;25895:4;25875:13;:26::i;:::-;25798:114;;;;;;;;:::i;:::-;;;;;;;;;;;;;25784:129;;;25067:854;;;;;;;:::o;82495:593::-;82561:27;82605:2;82611:1;82605:7;82601:50;;-1:-1:-1;;82629:10:0;;;;;;;;;;;;-1:-1:-1;;;82629:10:0;;;;;82495:593::o;82601:50::-;82670:2;82661:6;82702:69;82709:6;;82702:69;;82732:5;;;;:::i;:::-;;-1:-1:-1;82752:7:0;;-1:-1:-1;82757:2:0;82752:7;;:::i;:::-;;;82702:69;;;82781:17;82811:3;82801:14;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;82801:14:0;-1:-1:-1;82781:34:0;-1:-1:-1;82835:3:0;82849:202;82856:7;;82849:202;;82884:5;82888:1;82884;:5;:::i;:::-;82880:9;-1:-1:-1;82904:10:0;82935:7;82940:2;82935;:7;:::i;:::-;82934:14;;82946:2;82934:14;:::i;:::-;82929:19;;:2;:19;:::i;:::-;82918:31;;:2;:31;:::i;:::-;82904:46;;82965:9;82984:4;82977:12;;82965:24;;83014:2;83004:4;83009:1;83004:7;;;;;;;;:::i;:::-;;;;:12;-1:-1:-1;;;;;83004:12:0;;;;;;;;-1:-1:-1;83031:8:0;83037:2;83031:8;;:::i;:::-;;;82865:186;;82849:202;;;-1:-1:-1;83075:4:0;82495:593;-1:-1:-1;;;;82495:593:0:o;61371:716::-;61555:88;;-1:-1:-1;;;61555:88:0;;61534:4;;-1:-1:-1;;;;;61555:45:0;;;;;:88;;75295:10;;61622:4;;61628:7;;61637:5;;61555:88;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;61555:88:0;;;;;;;;-1:-1:-1;;61555:88:0;;;;;;;;;;;;:::i;:::-;;;61551:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;61838:6;:13;61855:1;61838:18;61834:235;;61884:40;;-1:-1:-1;;;61884:40:0;;;;;;;;;;;61834:235;62027:6;62021:13;62012:6;62008:2;62004:15;61997:38;61551:529;-1:-1:-1;;;;;;61714:64:0;-1:-1:-1;;;61714:64:0;;-1:-1:-1;61707:71:0;;25929:593;25995:27;26039:2;26045:1;26039:7;26035:50;;-1:-1:-1;;26063:10:0;;;;;;;;;;;;-1:-1:-1;;;26063:10:0;;;;;25929:593::o;26035:50::-;26104:2;26095:6;26136:69;26143:6;;26136:69;;26166:5;;;;:::i;:::-;;-1:-1:-1;26186:7:0;;-1:-1:-1;26191:2:0;26186:7;;:::i;:::-;;;26136:69;;;26215:17;26245:3;26235:14;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;26235:14:0;-1:-1:-1;26215:34:0;-1:-1:-1;26269:3:0;26283:202;26290:7;;26283:202;;26318:5;26322:1;26318;:5;:::i;:::-;26314:9;-1:-1:-1;26338:10:0;26369:7;26374:2;26369;:7;:::i;:::-;26368:14;;26380:2;26368:14;:::i;:::-;26363:19;;:2;:19;:::i;:::-;26352:31;;:2;:31;:::i;:::-;26338:46;;26399:9;26418:4;26411:12;;26399:24;;26448:2;26438:4;26443:1;26438:7;;;;;;;;:::i;:::-;;;;:12;-1:-1:-1;;;;;26438:12:0;;;;;;;;-1:-1:-1;26465:8:0;26471:2;26465:8;;:::i;:::-;;;26299:186;;26283:202;;24741:204;24793:13;24827:2;24823:115;;;-1:-1:-1;;24850:15:0;;;;;;;;;;;;-1:-1:-1;;;24850:15:0;;;;;24741:204::o;24823:115::-;-1:-1:-1;;24906:16:0;;;;;;;;;;;;-1:-1:-1;;;24906:16:0;;;;;24741:204::o;24823:115::-;24741:204;;;:::o;26888:6265::-;26977:17;27007:136;;;;;;;;;;;;;;;;;;;27184:3;27219;27167:56;;;;;;;;;:::i;:::-;;;;;;;;;;;;;27154:70;;27241:6;27237:5860;;27267:8;27263:1073;;27325:3;27308:745;;;;;;;;:::i;:::-;;;;;;;;;;;;;27295:759;;27263:1073;;;28126:3;28109:209;;;;;;;;:::i;:::-;;;;;;;;;;;;;28096:223;;27263:1073;28380:3;28416:14;28426:3;28416:9;:14::i;:::-;28363:79;;;;;;;;;:::i;:::-;;;;;;;;;;;;;28350:93;;28488:3;28471:2855;;;;;;;;:::i;:::-;;;;;;;;;;;;;28458:2869;;27237:5860;;;31415:3;31398:1685;;;;;;;;:::i;:::-;;;;;;;;;;;;;31385:1699;;27237:5860;33140:3;33123:21;;;;;;;;:::i;:::-;;;;;;;;;;;;;33109:36;;26888:6265;;;;;:::o;77450:3097::-;77508:13;77745:4;:11;77760:1;77745:16;77741:31;;-1:-1:-1;;77763:9:0;;;;;;;;;-1:-1:-1;77763:9:0;;;77450:3097::o;77741:31::-;77825:19;77847:6;;;;;;;;;;;;;;;;;77825:28;;78264:20;78323:1;78304:4;:11;78318:1;78304:15;;;;:::i;:::-;78303:21;;;;:::i;:::-;78298:27;;:1;:27;:::i;:::-;78287:39;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;78287:39:0;;78264:62;;78506:1;78499:5;78495:13;78610:2;78602:6;78598:15;78721:4;78773;78767:11;78761:4;78757:22;78683:1432;78807:6;78798:7;78795:19;78683:1432;;;78913:1;78904:7;78900:15;78889:26;;78952:7;78946:14;79605:4;79597:5;79593:2;79589:14;79585:25;79575:8;79571:40;79565:47;79554:9;79546:67;79659:1;79648:9;79644:17;79631:30;;79751:4;79743:5;79739:2;79735:14;79731:25;79721:8;79717:40;79711:47;79700:9;79692:67;79805:1;79794:9;79790:17;79777:30;;79896:4;79888:5;79885:1;79881:13;79877:24;79867:8;79863:39;79857:46;79846:9;79838:66;79950:1;79939:9;79935:17;79922:30;;80033:4;80026:5;80022:16;80012:8;80008:31;80002:38;79991:9;79983:58;;80087:1;80076:9;80072:17;80059:30;;78683:1432;;;78687:107;;80277:1;80270:4;80264:11;80260:19;80298:1;80293:123;;;;80435:1;80430:73;;;;80253:250;;80293:123;80346:4;80342:1;80331:9;80327:17;80319:32;80396:4;80392:1;80381:9;80377:17;80369:32;80293:123;;80430:73;80483:4;80479:1;80468:9;80464:17;80456:32;80253:250;-1:-1:-1;80533:6:0;;77450:3097;-1:-1:-1;;;;;77450:3097:0:o;26530:350::-;26589:13;26615:20;26673:3;26656:21;;;;;;;;:::i;:::-;;;;-1:-1:-1;;26656:21:0;;;;;;;;;26646:32;;26656:21;26646:32;;;;;-1:-1:-1;26638:41:0;26706:16;26721:1;26646:32;26706:16;:::i;:::-;26772:51;;;;;;;;:31;:51;;26810:2;26772:51;;;;26814:3;26772:51;;;;;;;26819:3;26772:51;;;;26690:32;;-1:-1:-1;26841:31:0;26772:51;26690:32;26850:21;;;;;;;:::i;:::-;;;;;26841:31;;:8;:31::i;:::-;26834:38;26530:350;-1:-1:-1;;;;;26530:350: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:282::-;900:3;938:5;932:12;965:6;960:3;953:19;981:76;1050:6;1043:4;1038:3;1034:14;1027:4;1020:5;1016:16;981:76;:::i;:::-;1111:2;1090:15;-1:-1:-1;;1086:29:1;1077:39;;;;1118:4;1073:50;;847:282;-1:-1:-1;;847:282:1:o;1134:231::-;1283:2;1272:9;1265:21;1246:4;1303:56;1355:2;1344:9;1340:18;1332:6;1303:56;:::i;1370:180::-;1429:6;1482:2;1470:9;1461:7;1457:23;1453:32;1450:52;;;1498:1;1495;1488:12;1450:52;-1:-1:-1;1521:23:1;;1370:180;-1:-1:-1;1370:180:1:o;1763:173::-;1831:20;;-1:-1:-1;;;;;1880:31:1;;1870:42;;1860:70;;1926:1;1923;1916:12;1941:254;2009:6;2017;2070:2;2058:9;2049:7;2045:23;2041:32;2038:52;;;2086:1;2083;2076:12;2038:52;2109:29;2128:9;2109:29;:::i;:::-;2099:39;2185:2;2170:18;;;;2157:32;;-1:-1:-1;;;1941:254:1:o;2200:127::-;2261:10;2256:3;2252:20;2249:1;2242:31;2292:4;2289:1;2282:15;2316:4;2313:1;2306:15;2332:232;2408:1;2401:5;2398:12;2388:143;;2453:10;2448:3;2444:20;2441:1;2434:31;2488:4;2485:1;2478:15;2516:4;2513:1;2506:15;2388:143;2540:18;;2332:232::o;2569:269::-;2738:2;2723:18;;2750:39;2727:9;2771:6;2750:39;:::i;:::-;2825:6;2820:2;2809:9;2805:18;2798:34;2569:269;;;;;:::o;3025:328::-;3102:6;3110;3118;3171:2;3159:9;3150:7;3146:23;3142:32;3139:52;;;3187:1;3184;3177:12;3139:52;3210:29;3229:9;3210:29;:::i;:::-;3200:39;;3258:38;3292:2;3281:9;3277:18;3258:38;:::i;:::-;3248:48;;3343:2;3332:9;3328:18;3315:32;3305:42;;3025:328;;;;;:::o;3358:186::-;3417:6;3470:2;3458:9;3449:7;3445:23;3441:32;3438:52;;;3486:1;3483;3476:12;3438:52;3509:29;3528:9;3509:29;:::i;3549:632::-;3720:2;3772:21;;;3842:13;;3745:18;;;3864:22;;;3691:4;;3720:2;3943:15;;;;3917:2;3902:18;;;3691:4;3986:169;4000:6;3997:1;3994:13;3986:169;;;4061:13;;4049:26;;4130:15;;;;4095:12;;;;4022:1;4015:9;3986:169;;4186:127;4247:10;4242:3;4238:20;4235:1;4228:31;4278:4;4275:1;4268:15;4302:4;4299:1;4292:15;4318:632;4383:5;4413:18;4454:2;4446:6;4443:14;4440:40;;;4460:18;;:::i;:::-;4535:2;4529:9;4503:2;4589:15;;-1:-1:-1;;4585:24:1;;;4611:2;4581:33;4577:42;4565:55;;;4635:18;;;4655:22;;;4632:46;4629:72;;;4681:18;;:::i;:::-;4721:10;4717:2;4710:22;4750:6;4741:15;;4780:6;4772;4765:22;4820:3;4811:6;4806:3;4802:16;4799:25;4796:45;;;4837:1;4834;4827:12;4796:45;4887:6;4882:3;4875:4;4867:6;4863:17;4850:44;4942:1;4935:4;4926:6;4918;4914:19;4910:30;4903:41;;;;4318:632;;;;;:::o;4955:451::-;5024:6;5077:2;5065:9;5056:7;5052:23;5048:32;5045:52;;;5093:1;5090;5083:12;5045:52;5133:9;5120:23;5166:18;5158:6;5155:30;5152:50;;;5198:1;5195;5188:12;5152:50;5221:22;;5274:4;5266:13;;5262:27;-1:-1:-1;5252:55:1;;5303:1;5300;5293:12;5252:55;5326:74;5392:7;5387:2;5374:16;5369:2;5365;5361:11;5326:74;:::i;5411:118::-;5497:5;5490:13;5483:21;5476:5;5473:32;5463:60;;5519:1;5516;5509:12;5534:315;5599:6;5607;5660:2;5648:9;5639:7;5635:23;5631:32;5628:52;;;5676:1;5673;5666:12;5628:52;5699:29;5718:9;5699:29;:::i;:::-;5689:39;;5778:2;5767:9;5763:18;5750:32;5791:28;5813:5;5791:28;:::i;:::-;5838:5;5828:15;;;5534:315;;;;;:::o;5854:667::-;5949:6;5957;5965;5973;6026:3;6014:9;6005:7;6001:23;5997:33;5994:53;;;6043:1;6040;6033:12;5994:53;6066:29;6085:9;6066:29;:::i;:::-;6056:39;;6114:38;6148:2;6137:9;6133:18;6114:38;:::i;:::-;6104:48;;6199:2;6188:9;6184:18;6171:32;6161:42;;6254:2;6243:9;6239:18;6226:32;6281:18;6273:6;6270:30;6267:50;;;6313:1;6310;6303:12;6267:50;6336:22;;6389:4;6381:13;;6377:27;-1:-1:-1;6367:55:1;;6418:1;6415;6408:12;6367:55;6441:74;6507:7;6502:2;6489:16;6484:2;6480;6476:11;6441:74;:::i;:::-;6431:84;;;5854:667;;;;;;;:::o;6526:198::-;6667:2;6652:18;;6679:39;6656:9;6700:6;6679:39;:::i;6729:260::-;6797:6;6805;6858:2;6846:9;6837:7;6833:23;6829:32;6826:52;;;6874:1;6871;6864:12;6826:52;6897:29;6916:9;6897:29;:::i;:::-;6887:39;;6945:38;6979:2;6968:9;6964:18;6945:38;:::i;:::-;6935:48;;6729:260;;;;;:::o;6994:248::-;7062:6;7070;7123:2;7111:9;7102:7;7098:23;7094:32;7091:52;;;7139:1;7136;7129:12;7091:52;-1:-1:-1;;7162:23:1;;;7232:2;7217:18;;;7204:32;;-1:-1:-1;6994:248:1:o;7247:380::-;7326:1;7322:12;;;;7369;;;7390:61;;7444:4;7436:6;7432:17;7422:27;;7390:61;7497:2;7489:6;7486:14;7466:18;7463:38;7460:161;;7543:10;7538:3;7534:20;7531:1;7524:31;7578:4;7575:1;7568:15;7606:4;7603:1;7596:15;7460:161;;7247:380;;;:::o;7941:245::-;8008:6;8061:2;8049:9;8040:7;8036:23;8032:32;8029:52;;;8077:1;8074;8067:12;8029:52;8109:9;8103:16;8128:28;8150:5;8128:28;:::i;8191:127::-;8252:10;8247:3;8243:20;8240:1;8233:31;8283:4;8280:1;8273:15;8307:4;8304:1;8297:15;8323:127;8384:10;8379:3;8375:20;8372:1;8365:31;8415:4;8412:1;8405:15;8439:4;8436:1;8429:15;8455:128;8522:9;;;8543:11;;;8540:37;;;8557:18;;:::i;8588:422::-;8677:1;8720:5;8677:1;8734:270;8755:7;8745:8;8742:21;8734:270;;;8814:4;8810:1;8806:6;8802:17;8796:4;8793:27;8790:53;;;8823:18;;:::i;:::-;8873:7;8863:8;8859:22;8856:55;;;8893:16;;;;8856:55;8972:22;;;;8932:15;;;;8734:270;;;8738:3;8588:422;;;;;:::o;9015:806::-;9064:5;9094:8;9084:80;;-1:-1:-1;9135:1:1;9149:5;;9084:80;9183:4;9173:76;;-1:-1:-1;9220:1:1;9234:5;;9173:76;9265:4;9283:1;9278:59;;;;9351:1;9346:130;;;;9258:218;;9278:59;9308:1;9299:10;;9322:5;;;9346:130;9383:3;9373:8;9370:17;9367:43;;;9390:18;;:::i;:::-;-1:-1:-1;;9446:1:1;9432:16;;9461:5;;9258:218;;9560:2;9550:8;9547:16;9541:3;9535:4;9532:13;9528:36;9522:2;9512:8;9509:16;9504:2;9498:4;9495:12;9491:35;9488:77;9485:159;;;-1:-1:-1;9597:19:1;;;9629:5;;9485:159;9676:34;9701:8;9695:4;9676:34;:::i;:::-;9746:6;9742:1;9738:6;9734:19;9725:7;9722:32;9719:58;;;9757:18;;:::i;:::-;9795:20;;9015:806;-1:-1:-1;;;9015:806:1:o;9826:131::-;9886:5;9915:36;9942:8;9936:4;9915:36;:::i;9962:168::-;10035:9;;;10066;;10083:15;;;10077:22;;10063:37;10053:71;;10104:18;;:::i;10135:125::-;10200:9;;;10221:10;;;10218:36;;;10234:18;;:::i;10265:135::-;10304:3;10325:17;;;10322:43;;10345:18;;:::i;:::-;-1:-1:-1;10392:1:1;10381:13;;10265:135::o;13323:127::-;13384:10;13379:3;13375:20;13372:1;13365:31;13415:4;13412:1;13405:15;13439:4;13436:1;13429:15;13455:120;13495:1;13521;13511:35;;13526:18;;:::i;:::-;-1:-1:-1;13560:9:1;;13455:120::o;13706:545::-;13808:2;13803:3;13800:11;13797:448;;;13844:1;13869:5;13865:2;13858:17;13914:4;13910:2;13900:19;13984:2;13972:10;13968:19;13965:1;13961:27;13955:4;13951:38;14020:4;14008:10;14005:20;14002:47;;;-1:-1:-1;14043:4:1;14002:47;14098:2;14093:3;14089:12;14086:1;14082:20;14076:4;14072:31;14062:41;;14153:82;14171:2;14164:5;14161:13;14153:82;;;14216:17;;;14197:1;14186:13;14153:82;;14427:1352;14553:3;14547:10;14580:18;14572:6;14569:30;14566:56;;;14602:18;;:::i;:::-;14631:97;14721:6;14681:38;14713:4;14707:11;14681:38;:::i;:::-;14675:4;14631:97;:::i;:::-;14783:4;;14847:2;14836:14;;14864:1;14859:663;;;;15566:1;15583:6;15580:89;;;-1:-1:-1;15635:19:1;;;15629:26;15580:89;-1:-1:-1;;14384:1:1;14380:11;;;14376:24;14372:29;14362:40;14408:1;14404:11;;;14359:57;15682:81;;14829:944;;14859:663;13653:1;13646:14;;;13690:4;13677:18;;-1:-1:-1;;14895:20:1;;;15013:236;15027:7;15024:1;15021:14;15013:236;;;15116:19;;;15110:26;15095:42;;15208:27;;;;15176:1;15164:14;;;;15043:19;;15013:236;;;15017:3;15277:6;15268:7;15265:19;15262:201;;;15338:19;;;15332:26;-1:-1:-1;;15421:1:1;15417:14;;;15433:3;15413:24;15409:37;15405:42;15390:58;15375:74;;15262:201;-1:-1:-1;;;;;15509:1:1;15493:14;;;15489:22;15476:36;;-1:-1:-1;14427:1352:1:o;16509:112::-;16541:1;16567;16557:35;;16572:18;;:::i;:::-;-1:-1:-1;16606:9:1;;16509:112::o;16626:198::-;16668:3;16706:5;16700:12;16721:65;16779:6;16774:3;16767:4;16760:5;16756:16;16721:65;:::i;:::-;16802:16;;;;;16626:198;-1:-1:-1;;16626:198:1:o;17401:2128::-;-1:-1:-1;;;18348:63:1;;18434:13;;18330:3;;18456:75;18434:13;18519:2;18510:12;;18503:4;18491:17;;18456:75;:::i;:::-;18595:66;18590:2;18550:16;;;18582:11;;;18575:87;18691:34;18686:2;18678:11;;18671:55;18755:66;18750:2;18742:11;;18735:87;-1:-1:-1;;;18846:3:1;18838:12;;18831:70;18926:13;;18948:77;18926:13;19010:3;19002:12;;18995:4;18983:17;;18948:77;:::i;:::-;19091:66;19085:3;19044:17;;;;19077:12;;;19070:88;-1:-1:-1;;;19182:3:1;19174:12;;19167:42;19234:13;;19256:77;19234:13;19318:3;19310:12;;19303:4;19291:17;;19256:77;:::i;:::-;19349:174;19379:143;19405:116;19435:85;19461:58;19514:3;19503:8;19499:2;19495:17;19491:27;16906:66;16894:79;;-1:-1:-1;;;16998:2:1;16989:12;;16982:26;17033:2;17024:12;;16829:213;19461:58;19453:6;19435:85;:::i;:::-;17124:66;17112:79;;-1:-1:-1;;;17216:2:1;17207:12;;17200:32;17257:2;17248:12;;17047:219;19405:116;19397:6;19379:143;:::i;:::-;-1:-1:-1;;;17336:27:1;;17388:1;17379:11;;17271:125;19349:174;19342:181;17401:2128;-1:-1:-1;;;;;;;;;17401:2128:1:o;19534:461::-;19796:31;19791:3;19784:44;19766:3;19857:6;19851:13;19873:75;19941:6;19936:2;19931:3;19927:12;19920:4;19912:6;19908:17;19873:75;:::i;:::-;19968:16;;;;19986:2;19964:25;;19534:461;-1:-1:-1;;19534:461:1:o;20000:148::-;20088:4;20067:12;;;20081;;;20063:31;;20106:13;;20103:39;;;20122:18;;:::i;20153:500::-;-1:-1:-1;;;;;20422:15:1;;;20404:34;;20474:15;;20469:2;20454:18;;20447:43;20521:2;20506:18;;20499:34;;;20569:3;20564:2;20549:18;;20542:31;;;20347:4;;20590:57;;20627:19;;20619:6;20590:57;:::i;:::-;20582:65;20153:500;-1:-1:-1;;;;;;20153:500:1:o;20658:249::-;20727:6;20780:2;20768:9;20759:7;20755:23;20751:32;20748:52;;;20796:1;20793;20786:12;20748:52;20828:9;20822:16;20847:30;20871:5;20847:30;:::i;20912:668::-;21192:3;21230:6;21224:13;21246:66;21305:6;21300:3;21293:4;21285:6;21281:17;21246:66;:::i;:::-;21373:29;21334:16;;;21359:44;;;21428:13;;21450:79;21428:13;21515:2;21504:14;;21497:4;21485:17;;21450:79;:::i;:::-;21549:20;21571:2;21545:29;;20912:668;-1:-1:-1;;;;20912:668:1:o;21585:1965::-;21817:3;21855:6;21849:13;21871:66;21930:6;21925:3;21918:4;21910:6;21906:17;21871:66;:::i;:::-;21998:34;21959:16;;21984:49;;;-1:-1:-1;22067:34:1;22060:4;22049:16;;22042:60;22134:34;22129:2;22118:14;;22111:58;22201:34;22196:2;22185:14;;22178:58;22269:34;22263:3;22252:15;;22245:59;22337:34;22331:3;22320:15;;22313:59;22405:34;22399:3;22388:15;;22381:59;22473:34;22467:3;22456:15;;22449:59;22541:34;22535:3;22524:15;;22517:59;22609:34;22603:3;22592:15;;22585:59;22677:34;22671:3;22660:15;;22653:59;22745:34;22739:3;22728:15;;22721:59;22813:34;22807:3;22796:15;;22789:59;22881:34;22875:3;22864:15;;22857:59;22949:34;22943:3;22932:15;;22925:59;23017:34;23011:3;23000:15;;22993:59;23085:34;23079:3;23068:15;;23061:59;23153:34;23147:3;23136:15;;23129:59;23221:34;23215:3;23204:15;;23197:59;23289:34;23283:3;23272:15;;23265:59;23357:34;23351:3;23340:15;;23333:59;23425:34;23419:3;23408:15;;23401:59;-1:-1:-1;;;23487:3:1;23476:15;;23469:44;23540:3;23529:15;;21585:1965;-1:-1:-1;21585:1965:1:o;23555:817::-;23787:3;23825:6;23819:13;23841:66;23900:6;23895:3;23888:4;23880:6;23876:17;23841:66;:::i;:::-;23968:34;23929:16;;23954:49;;;-1:-1:-1;24037:34:1;24030:4;24019:16;;24012:60;24104:34;24099:2;24088:14;;24081:58;24171:34;24166:2;24155:14;;24148:58;24239:34;24233:3;24222:15;;24215:59;24307:27;24301:3;24290:15;;24283:52;24362:3;24351:15;;23555:817;-1:-1:-1;23555:817:1:o;24377:829::-;24758:3;24796:6;24790:13;24812:66;24871:6;24866:3;24859:4;24851:6;24847:17;24812:66;:::i;:::-;24939:30;24900:16;;;24925:45;;;24995:13;;25017:79;24995:13;25082:2;25071:14;;25064:4;25052:17;;25017:79;:::i;:::-;-1:-1:-1;;;25159:2:1;25115:20;;;;25151:11;;;25144:29;25197:2;25189:11;;24377:829;-1:-1:-1;;;;24377:829:1:o;25211:9105::-;25544:3;25582:6;25576:13;25598:66;25657:6;25652:3;25645:4;25637:6;25633:17;25598:66;:::i;:::-;-1:-1:-1;;;25686:16:1;;25711:35;;;-1:-1:-1;25778:66:1;25773:2;25762:14;;25755:90;25877:66;25872:2;25861:14;;25854:90;25976:66;25971:2;25960:14;;25953:90;26076:66;26070:3;26059:15;;26052:91;26176:66;26170:3;26159:15;;26152:91;26276:66;26270:3;26259:15;;26252:91;26362:66;26455:3;26444:15;;26437:27;;;26497:66;26491:3;26480:15;;26473:91;26597:66;26591:3;26580:15;;26573:91;26697:66;26691:3;26680:15;;26673:91;26797:66;26791:3;26780:15;;26773:91;26897:66;26891:3;26880:15;;26873:91;26997:66;26991:3;26980:15;;26973:91;27083:66;27176:3;27165:15;;27158:27;;;27218:66;27212:3;27201:15;;27194:91;27304:66;27397:3;27386:15;;27379:27;;;27439:66;27433:3;27422:15;;27415:91;27539:66;27533:3;27522:15;;27515:91;27639:66;27633:3;27622:15;;27615:91;27739:66;27733:3;27722:15;;27715:91;27825:66;27918:3;27907:15;;27900:27;;;27960:66;27954:3;27943:15;;27936:91;28054:3;28043:15;;28036:27;;;;28096:66;28090:3;28079:15;;28072:91;28196:66;28190:3;28179:15;;28172:91;28296:66;28290:3;28279:15;;28272:91;28396:66;28390:3;28379:15;;28372:91;28496:66;28490:3;28479:15;;28472:91;28596:66;28590:3;28579:15;;28572:91;28682:66;28775:3;28764:15;;28757:27;;;28817:66;28811:3;28800:15;;28793:91;28918:66;28911:4;28900:16;;28893:92;29019:66;29012:4;29001:16;;28994:92;29120:66;29113:4;29102:16;;29095:92;29221:66;29214:4;29203:16;;29196:92;29322:66;29315:4;29304:16;;29297:92;29416:4;29405:16;;29398:28;;;29460:66;29453:4;29442:16;;29435:92;29561:66;29554:4;29543:16;;29536:92;29662:66;29655:4;29644:16;;29637:92;29763:66;29756:4;29745:16;;29738:92;29864:66;29857:4;29846:16;;29839:92;29965:66;29958:4;29947:16;;29940:92;30066:66;30059:4;30048:16;;30041:92;30167:66;30160:4;30149:16;;30142:92;30268:66;30261:4;30250:16;;30243:92;30369:66;30362:4;30351:16;;30344:92;30470:66;30463:4;30452:16;;30445:92;30571:66;30564:4;30553:16;;30546:92;30672:66;30665:4;30654:16;;30647:92;30773:66;30766:4;30755:16;;30748:92;30874:66;30867:4;30856:16;;30849:92;30968:4;30957:16;;30950:28;31012:66;31005:4;30994:16;;30987:92;31098:66;31191:4;31180:16;;31173:28;;;31235:66;31228:4;31217:16;;31210:92;31336:66;31329:4;31318:16;;31311:92;31437:66;31430:4;31419:16;;31412:92;31538:66;31531:4;31520:16;;31513:92;31632:4;31621:16;;31614:28;;;;31676:66;31669:4;31658:16;;31651:92;31770:4;31759:16;;31752:28;31814:66;31807:4;31796:16;;31789:92;31915:66;31908:4;31897:16;;31890:92;32016:66;32009:4;31998:16;;31991:92;32117:66;32110:4;32099:16;;32092:92;32218:66;32211:4;32200:16;;32193:92;32319:66;32312:4;32301:16;;32294:92;32420:66;32413:4;32402:16;;32395:92;32521:66;32514:4;32503:16;;32496:92;32622:66;32615:4;32604:16;;32597:92;32723:66;32716:4;32705:16;;32698:92;32824:66;32817:4;32806:16;;32799:92;32918:4;32907:16;;32900:28;;;;32962:66;32955:4;32944:16;;32937:92;33063:66;33056:4;33045:16;;33038:92;33164:66;33157:4;33146:16;;33139:92;33265:66;33258:4;33247:16;;33240:92;33366:66;33359:4;33348:16;;33341:92;33467:66;33460:4;33449:16;;33442:92;33568:66;33561:4;33550:16;;33543:92;33669:66;33662:4;33651:16;;33644:92;33770:66;33763:4;33752:16;;33745:92;33871:66;33864:4;33853:16;;33846:92;33965:4;33954:16;;33947:28;34009:66;34002:4;33991:16;;33984:92;34110:66;34103:4;34092:16;;34085:92;34211:66;34204:4;34193:16;;34186:92;34305:4;34294:16;;25211:9105;-1:-1:-1;25211:9105:1:o;34321:4453::-;34553:3;34591:6;34585:13;34607:66;34666:6;34661:3;34654:4;34646:6;34642:17;34607:66;:::i;:::-;34734:34;34695:16;;34720:49;;;-1:-1:-1;34803:34:1;34796:4;34785:16;;34778:60;34870:34;34865:2;34854:14;;34847:58;34937:34;34932:2;34921:14;;34914:58;35005:34;34999:3;34988:15;;34981:59;35073:34;35067:3;35056:15;;35049:59;35141:34;35135:3;35124:15;;35117:59;35209:34;35203:3;35192:15;;35185:59;35277:34;35271:3;35260:15;;35253:59;35345:34;35339:3;35328:15;;35321:59;35413:34;35407:3;35396:15;;35389:59;35481:66;35475:3;35464:15;;35457:91;35581:66;35575:3;35564:15;;35557:91;35681:66;35675:3;35664:15;;35657:91;35781:66;35775:3;35764:15;;35757:91;35881:66;35875:3;35864:15;;35857:91;35981:66;35975:3;35964:15;;35957:91;36081:34;36075:3;36064:15;;36057:59;36149:66;36143:3;36132:15;;36125:91;36249:66;36243:3;36232:15;;36225:91;36349:66;36343:3;36332:15;;36325:91;36449:66;36443:3;36432:15;;36425:91;36549:66;36543:3;36532:15;;36525:91;36649:66;36643:3;36632:15;;36625:91;36749:66;36743:3;36732:15;;36725:91;36849:66;36843:3;36832:15;;36825:91;36949:34;36943:3;36932:15;;36925:59;37017:34;37011:3;37000:15;;36993:59;37085:34;37079:3;37068:15;;37061:59;37153:34;37147:3;37136:15;;37129:59;37221:34;37215:3;37204:15;;37197:59;37289:34;37283:3;37272:15;;37265:59;37358:34;37351:4;37340:16;;37333:60;37427:34;37420:4;37409:16;;37402:60;37496:34;37489:4;37478:16;;37471:60;37565:34;37558:4;37547:16;;37540:60;37634:34;37627:4;37616:16;;37609:60;37703:34;37696:4;37685:16;;37678:60;37772:34;37765:4;37754:16;;37747:60;37841:34;37834:4;37823:16;;37816:60;37910:34;37903:4;37892:16;;37885:60;37979:34;37972:4;37961:16;;37954:60;38048:34;38041:4;38030:16;;38023:60;38117:34;38110:4;38099:16;;38092:60;38186:34;38179:4;38168:16;;38161:60;38255:34;38248:4;38237:16;;38230:60;38324:34;38317:4;38306:16;;38299:60;38393:34;38386:4;38375:16;;38368:60;38462:34;38455:4;38444:16;;38437:60;38531:34;38524:4;38513:16;;38506:60;38600:34;38593:4;38582:16;;38575:60;38669:66;38662:4;38651:16;;38644:92;38763:4;38752:16;;34321:4453;-1:-1:-1;34321:4453:1:o;38779:289::-;38910:3;38948:6;38942:13;38964:66;39023:6;39018:3;39011:4;39003:6;38999:17;38964:66;:::i;:::-;39046:16;;;;;38779:289;-1:-1:-1;;38779:289:1:o

Swarm Source

ipfs://2de7eedc9b50efd1d049d9d4a3efe61cefca7eee0ed53e55307406eca0e014b3
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.